ZGlmZiAtLWdpdCBhL01ha2VmaWxlIGIvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTMzOThkYwotLS0gL2Rldi9udWxsCisrKyBiL01ha2VmaWxlCkBAIC0wLDAgKzEsMTAzIEBACisjCisjICAgIENvcHlyaWdodCAoYykgMjAxMC0yMDEyIE5lc3QgTGFicywgSW5jLgorIyAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyAgICBUaGlzIGRvY3VtZW50IGlzIHRoZSBwcm9wZXJ0eSBvZiBOZXN0LiBJdCBpcyBjb25zaWRlcmVkCisjICAgIGNvbmZpZGVudGlhbCBhbmQgcHJvcHJpZXRhcnkgaW5mb3JtYXRpb24uCisjCisjICAgIFRoaXMgZG9jdW1lbnQgbWF5IG5vdCBiZSByZXByb2R1Y2VkIG9yIHRyYW5zbWl0dGVkIGluIGFueSBmb3JtLAorIyAgICBpbiB3aG9sZSBvciBpbiBwYXJ0LCB3aXRob3V0IHRoZSBleHByZXNzIHdyaXR0ZW4gcGVybWlzc2lvbiBvZgorIyAgICBOZXN0LgorIworIyAgICBEZXNjcmlwdGlvbjoKKyMgICAgICBUaGlzIGZpbGUgaXMgdGhlIG1ha2VmaWxlIGZvciB0aGUgemxpYiBjb21wcmVzc2lvbiBsaWJyYXJ5LgorIworCitCdWlsZENvbmZpZ1NwZWNpYWxpemVkCTo9IE5vCitCdWlsZFByb2R1Y3RTcGVjaWFsaXplZAk6PSBZZXMKKworaW5jbHVkZSBwcmUubWFrCisKK1BhY2thZ2VOYW1lCQk6PSB6bGliCisKK1BhY2thZ2VFeHRlbnNpb24JOj0gdGFyLmJ6MgorUGFja2FnZVNlcGFyYXRvcgk6PSAtCisKK1BhY2thZ2VQYXRjaEFyZ3MJOj0KKworUGFja2FnZUFyY2hpdmUJCTo9ICQoUGFja2FnZU5hbWUpLiQoUGFja2FnZUV4dGVuc2lvbikKK1BhY2thZ2VTb3VyY2VEaXIJOj0gJChQYWNrYWdlTmFtZSkkKFBhY2thZ2VTZXBhcmF0b3IpJChQYWNrYWdlVmVyc2lvbikKKworUGFja2FnZUJ1aWxkTWFrZWZpbGUJPSAkKGNhbGwgR2VuZXJhdGVCdWlsZFBhdGhzLE1ha2VmaWxlKQorCitQYWNrYWdlUmVzdWx0UGF0aAk9ICQoY2FsbCBHZW5lcmF0ZVJlc3VsdFBhdGhzLCx1c3IpCisKK0NsZWFuUGF0aHMJCSs9ICQoUGFja2FnZUxpY2Vuc2VGaWxlKQorCithbGw6ICQoUGFja2FnZURlZmF1bHRHb2FsKQorCisjIEdlbmVyYXRlIHRoZSBwYWNrYWdlIGxpY2Vuc2UgY29udGVudHMuCisKKyQoUGFja2FnZVNvdXJjZURpcikvemxpYi5oOiBzb3VyY2UKKworJChQYWNrYWdlTGljZW5zZUZpbGUpOiAkKFBhY2thZ2VTb3VyY2VEaXIpL3psaWIuaAorCSQoVmVyYm9zZSkkKFNFRCkgLW4gLWUgJy9eXC9cKiB6bGliXC5oLywvXCpcLyQkL3s7cDsvXCpcLyQkL3E7fScgPCAkPCA+ICRACisKKyMgRXh0cmFjdCB0aGUgc291cmNlIGZyb20gdGhlIGFyY2hpdmUgYW5kIGFwcGx5IHBhdGNoZXMsIGlmIGFueS4KKworJChQYWNrYWdlU291cmNlRGlyKTogJChQYWNrYWdlQXJjaGl2ZSkgJChQYWNrYWdlUGF0Y2hQYXRocykKKwkkKGV4cGFuZC1hbmQtcGF0Y2gtcGFja2FnZSkKKworIyBQcmVwYXJlIHRoZSBzb3VyY2VzLgorCisuUEhPTlk6IHNvdXJjZQorc291cmNlOiB8ICQoUGFja2FnZVNvdXJjZURpcikKKworIyBQYXRjaCB0aGUgc291cmNlcywgaWYgbmVjZXNzYXJ5LgorCisuUEhPTlk6IHBhdGNoCitwYXRjaDogc291cmNlCisKKyQoUGFja2FnZUJ1aWxkTWFrZWZpbGUpOiB8ICQoUGFja2FnZVNvdXJjZURpcikgJChCdWlsZERpcmVjdG9yeSkKKwkkKFZlcmJvc2UpY2QgJChCdWlsZERpcmVjdG9yeSkgJiYgXAorCUNDPSIkKENDKSAkKENQUE9QVEZMQUdTKSIgQVI9JChBUikgTk09JChOTSkgUkFOTElCPSQoUkFOTElCKSBcCisJSU5TVEFMTD0iJChJTlNUQUxMKSAkKElOU1RBTExGTEFHUykiIFwKKwkkKENVUkRJUikvJChQYWNrYWdlU291cmNlRGlyKS9jb25maWd1cmUgIFwKKwkkKFpsaWJUYXJnZXRDb25maWdPcHRpb25zKSBcCisJLS1wcmVmaXg9JChQYWNrYWdlUmVzdWx0UGF0aCkgXAorCS0tc2hhcmVkCisKKyMgQ29uZmlndXJlIHRoZSBzb3VyY2UgZm9yIGJ1aWxkaW5nLgorCisuUEhPTlk6IGNvbmZpZ3VyZQorY29uZmlndXJlOiBzb3VyY2UgJChQYWNrYWdlQnVpbGRNYWtlZmlsZSkKKworIyBCdWlsZCB0aGUgc291cmNlLgorIworIyBXZSBoYXZlIHRvIHVuc2V0IE1BS0VGTEFHUyBzaW5jZSB0aGV5IGNvbmZ1c2UgdGhlIHBhY2thZ2UgYnVpbGQgb3RoZXJ3aXNlLgorCisuUEhPTlk6IGJ1aWxkCitidWlsZDogY29uZmlndXJlCisJJChWZXJib3NlKXVuc2V0IE1BS0VGTEFHUyAmJiBcCisJJChNQUtFKSAkKEpPQlNGTEFHKSAtQyAkKEJ1aWxkRGlyZWN0b3J5KSBcCisJcHJlZml4PSQoUGFja2FnZVJlc3VsdFBhdGgpIFwKKwlhbGwKKworIyBTdGFnZSB0aGUgYnVpbGQgdG8gYSB0ZW1wb3JhcnkgaW5zdGFsbGF0aW9uIGFyZWEuCisjCisjIFdlIGhhdmUgdG8gdW5zZXQgTUFLRUZMQUdTIHNpbmNlIHRoZXkgY29uZnVzZSB0aGUgcGFja2FnZSBidWlsZCBvdGhlcndpc2UuCisKKy5QSE9OWTogc3RhZ2UKK3N0YWdlOiBidWlsZCB8ICQoUmVzdWx0RGlyZWN0b3J5KQorCSQoVmVyYm9zZSl1bnNldCBNQUtFRkxBR1MgJiYgXAorCSQoTUFLRSkgJChKT0JTRkxBRykgLUMgJChCdWlsZERpcmVjdG9yeSkgXAorCUlOU1RBTEw9IiQoSU5TVEFMTCkgJChJTlNUQUxMRkxBR1MpIiBcCisJcHJlZml4PSQoUGFja2FnZVJlc3VsdFBhdGgpIFwKKwlpbnN0YWxsCisKK2NsZWFuOgorCSQoVmVyYm9zZSkkKFJNKSAkKFJNRkxBR1MpIC1yICQoUGFja2FnZVNvdXJjZURpcikKKwkkKFZlcmJvc2UpJChSTSkgJChSTUZMQUdTKSAtciAkKEJ1aWxkRGlyZWN0b3J5KQorCSQoVmVyYm9zZSkkKFJNKSAkKFJNRkxBR1MpIC1yICQoUmVzdWx0RGlyZWN0b3J5KQorCitpbmNsdWRlIHBvc3QubWFrCmRpZmYgLS1naXQgYS96bGliLTEuMi42L0NNYWtlTGlzdHMudHh0IGIvemxpYi0xLjIuNi9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTU2ZmY2Ci0tLSAvZGV2L251bGwKKysrIGIvemxpYi0xLjIuNi9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDE5OSBAQAorY21ha2VfbWluaW11bV9yZXF1aXJlZChWRVJTSU9OIDIuNC40KQorc2V0KENNQUtFX0FMTE9XX0xPT1NFX0xPT1BfQ09OU1RSVUNUUyBPTikKKworcHJvamVjdCh6bGliIEMpCisKK2lmKE5PVCBERUZJTkVEIEJVSUxEX1NIQVJFRF9MSUJTKQorICAgIG9wdGlvbihCVUlMRF9TSEFSRURfTElCUyAiQnVpbGQgYSBzaGFyZWQgbGlicmFyeSBmb3JtIG9mIHpsaWIiIE9OKQorZW5kaWYoKQorCitpbmNsdWRlKENoZWNrVHlwZVNpemUpCitpbmNsdWRlKENoZWNrRnVuY3Rpb25FeGlzdHMpCitpbmNsdWRlKENoZWNrSW5jbHVkZUZpbGUpCitpbmNsdWRlKENoZWNrQ1NvdXJjZUNvbXBpbGVzKQorZW5hYmxlX3Rlc3RpbmcoKQorCitjaGVja19pbmNsdWRlX2ZpbGUoc3lzL3R5cGVzLmggSEFWRV9TWVNfVFlQRVNfSCkKK2NoZWNrX2luY2x1ZGVfZmlsZShzdGRpbnQuaCAgICBIQVZFX1NURElOVF9IKQorY2hlY2tfaW5jbHVkZV9maWxlKHN0ZGRlZi5oICAgIEhBVkVfU1REREVGX0gpCisKKyMKKyMgQ2hlY2sgdG8gc2VlIGlmIHdlIGhhdmUgbGFyZ2UgZmlsZSBzdXBwb3J0CisjCitzZXQoQ01BS0VfUkVRVUlSRURfREVGSU5JVElPTlMgLURfTEFSR0VGSUxFNjRfU09VUkNFPTEpCisjIFdlIGFkZCB0aGVzZSBvdGhlciBkZWZpbml0aW9ucyBoZXJlIGJlY2F1c2UgQ2hlY2tUeXBlU2l6ZS5jbWFrZQorIyBpbiBDTWFrZSAyLjQueCBkb2VzIG5vdCBhdXRvbWF0aWNhbGx5IGRvIHNvIGFuZCB3ZSB3YW50CisjIGNvbXBhdGliaWxpdHkgd2l0aCBDTWFrZSAyLjQueC4KK2lmKEhBVkVfU1lTX1RZUEVTX0gpCisgICAgbGlzdChBUFBFTkQgQ01BS0VfUkVRVUlSRURfREVGSU5JVElPTlMgLURIQVZFX1NZU19UWVBFU19IKQorZW5kaWYoKQoraWYoSEFWRV9TVERJTlRfSCkKKyAgICBsaXN0KEFQUEVORCBDTUFLRV9SRVFVSVJFRF9ERUZJTklUSU9OUyAtREhBVkVfU1RESU5UX0gpCitlbmRpZigpCitpZihIQVZFX1NURERFRl9IKQorICAgIGxpc3QoQVBQRU5EIENNQUtFX1JFUVVJUkVEX0RFRklOSVRJT05TIC1ESEFWRV9TVERERUZfSCkKK2VuZGlmKCkKK2NoZWNrX3R5cGVfc2l6ZShvZmY2NF90IE9GRjY0X1QpCitpZihIQVZFX09GRjY0X1QpCisgICBhZGRfZGVmaW5pdGlvbnMoLURfTEFSR0VGSUxFNjRfU09VUkNFPTEpCitlbmRpZigpCitzZXQoQ01BS0VfUkVRVUlSRURfREVGSU5JVElPTlMpICMgY2xlYXIgdmFyaWFibGUKKworIworIyBDaGVjayBmb3IgZnNlZWtvCisjCitjaGVja19mdW5jdGlvbl9leGlzdHMoZnNlZWtvIEhBVkVfRlNFRUtPKQoraWYoTk9UIEhBVkVfRlNFRUtPKQorICAgIGFkZF9kZWZpbml0aW9ucygtRE5PX0ZTRUVLTykKK2VuZGlmKCkKKworIworIyBDaGVjayBmb3IgdW5pc3RkLmgKKyMKK2NoZWNrX2luY2x1ZGVfZmlsZSh1bmlzdGQuaCBaX0hBVkVfVU5JU1REX0gpCisKK2lmKE1TVkMpCisgICAgc2V0KENNQUtFX0RFQlVHX1BPU1RGSVggImQiKQorICAgIGFkZF9kZWZpbml0aW9ucygtRF9DUlRfU0VDVVJFX05PX0RFUFJFQ0FURSkKKyAgICBhZGRfZGVmaW5pdGlvbnMoLURfQ1JUX05PTlNURENfTk9fREVQUkVDQVRFKQorZW5kaWYoKQorCitpZihOT1QgQ01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSIFNUUkVRVUFMIENNQUtFX0NVUlJFTlRfQklOQVJZX0RJUikKKyAgICAjIElmIHdlJ3JlIGRvaW5nIGFuIG91dCBvZiBzb3VyY2UgYnVpbGQgYW5kIHRoZSB1c2VyIGhhcyBhIHpjb25mLmgKKyAgICAjIGluIHRoZWlyIHNvdXJjZSB0cmVlLi4uCisgICAgaWYoRVhJU1RTICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS96Y29uZi5oKQorICAgICAgICBtZXNzYWdlKEZBVEFMX0VSUk9SCisgICAgICAgICAgICAiWW91IG11c3QgcmVtb3ZlICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS96Y29uZi5oICIKKyAgICAgICAgICAgICJmcm9tIHRoZSBzb3VyY2UgdHJlZS4gIFRoaXMgZmlsZSBpcyBpbmNsdWRlZCB3aXRoIHpsaWIgIgorICAgICAgICAgICAgImJ1dCBDTWFrZSBnZW5lcmF0ZXMgdGhpcyBmaWxlIGZvciB5b3UgYXV0b21hdGljYWxseSAiCisgICAgICAgICAgICAiaW4gdGhlIGJ1aWxkIGRpcmVjdG9yeS4iKQorICBlbmRpZigpCitlbmRpZigpCisKK2NvbmZpZ3VyZV9maWxlKCR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS96Y29uZi5oLmNtYWtlaW4KKyAgICAgICAgICAgICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS96Y29uZi5oIEBPTkxZKQoraW5jbHVkZV9kaXJlY3Rvcmllcygke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0pCisKKworIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgemxpYgorIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworc2V0KFpMSUJfUFVCTElDX0hEUlMKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vemNvbmYuaAorICAgIHpsaWIuaAorKQorc2V0KFpMSUJfUFJJVkFURV9IRFJTCisgICAgY3JjMzIuaAorICAgIGRlZmxhdGUuaAorICAgIGd6Z3V0cy5oCisgICAgaW5mZmFzdC5oCisgICAgaW5mZml4ZWQuaAorICAgIGluZmxhdGUuaAorICAgIGluZnRyZWVzLmgKKyAgICB0cmVlcy5oCisgICAgenV0aWwuaAorKQorc2V0KFpMSUJfU1JDUworICAgIGFkbGVyMzIuYworICAgIGNvbXByZXNzLmMKKyAgICBjcmMzMi5jCisgICAgZGVmbGF0ZS5jCisgICAgZ3pjbG9zZS5jCisgICAgZ3psaWIuYworICAgIGd6cmVhZC5jCisgICAgZ3p3cml0ZS5jCisgICAgaW5mbGF0ZS5jCisgICAgaW5mYmFjay5jCisgICAgaW5mdHJlZXMuYworICAgIGluZmZhc3QuYworICAgIHRyZWVzLmMKKyAgICB1bmNvbXByLmMKKyAgICB6dXRpbC5jCispCisKK2lmKE5PVCBNSU5HVykKKyAgICBzZXQoWkxJQl9TUkNTICR7WkxJQl9TUkNTfQorICAgICAgICB3aW4zMi96bGliMS5yYyAjIElmIHByZXNlbnQgd2lsbCBvdmVycmlkZSBjdXN0b20gYnVpbGQgcnVsZSBiZWxvdy4KKyAgICApCitlbmRpZigpCisKKyMgcGFyc2UgdGhlIGZ1bGwgdmVyc2lvbiBudW1iZXIgZnJvbSB6bGliLmggYW5kIGluY2x1ZGUgaW4gWkxJQl9GVUxMX1ZFUlNJT04KK2ZpbGUoUkVBRCAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vemxpYi5oIF96bGliX2hfY29udGVudHMpCitzdHJpbmcoUkVHRVggUkVQTEFDRSAiLiojZGVmaW5lWyBcdF0rWkxJQl9WRVJTSU9OWyBcdF0rXCIoWzAtOUEtWmEtei5dKylcIi4qIgorICAgICJcXDEiIFpMSUJfRlVMTF9WRVJTSU9OICR7X3psaWJfaF9jb250ZW50c30pCisKK2lmKE1JTkdXKQorICAgICMgVGhpcyBnZXRzIHVzIERMTCByZXNvdXJjZSBpbmZvcm1hdGlvbiB3aGVuIGNvbXBpbGluZyBvbiBNaW5HVy4KKyAgICBpZihOT1QgQ01BS0VfUkNfQ09NUElMRVIpCisgICAgICAgIFNFVChDTUFLRV9SQ19DT01QSUxFUiB3aW5kcmVzLmV4ZSkKKyAgICBlbmRpZigpCisKKyAgICBhZGRfY3VzdG9tX2NvbW1hbmQoT1VUUFVUICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS96bGliMXJjLm9iagorICAgICAgICAgICAgICAgICAgICAgICBDT01NQU5EICR7Q01BS0VfUkNfQ09NUElMRVJ9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLUQgR0NDX1dJTkRSRVMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtSSAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtSSAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtbyAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vemxpYjFyYy5vYmoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtaSAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vd2luMzIvemxpYjEucmMpCisgICAgc2V0KFpMSUJfU1JDUyAke1pMSUJfU1JDU30gJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3psaWIxcmMub2JqKQorZW5kaWYoTUlOR1cpCisKK2FkZF9saWJyYXJ5KHpsaWIgJHtaTElCX1NSQ1N9ICR7WkxJQl9QVUJMSUNfSERSU30gJHtaTElCX1BSSVZBVEVfSERSU30pCitzZXRfdGFyZ2V0X3Byb3BlcnRpZXMoemxpYiBQUk9QRVJUSUVTIERFRklORV9TWU1CT0wgWkxJQl9ETEwpCisKK3NldF90YXJnZXRfcHJvcGVydGllcyh6bGliIFBST1BFUlRJRVMgU09WRVJTSU9OIDEpCisKK2lmKE5PVCBDWUdXSU4pCisgICAgIyBUaGlzIHByb3BlcnR5IGNhdXNlcyBzaGFyZWQgbGlicmFyaWVzIG9uIExpbnV4IHRvIGhhdmUgdGhlIGZ1bGwgdmVyc2lvbgorICAgICMgZW5jb2RlZCBpbnRvIHRoZWlyIGZpbmFsIGZpbGVuYW1lLiAgV2UgZGlzYWJsZSB0aGlzIG9uIEN5Z3dpbiBiZWNhdXNlCisgICAgIyBpdCBjYXVzZXMgY3lnei0ke1pMSUJfRlVMTF9WRVJTSU9OfS5kbGwgdG8gYmUgY3JlYXRlZCB3aGVuIGN5Z3ouZGxsCisgICAgIyBzZWVtcyB0byBiZSB0aGUgZGVmYXVsdC4KKyAgICAjCisgICAgIyBUaGlzIGhhcyBubyBlZmZlY3Qgd2l0aCBNU1ZDLCBvbiB0aGF0IHBsYXRmb3JtIHRoZSB2ZXJzaW9uIGluZm8gZm9yCisgICAgIyB0aGUgRExMIGNvbWVzIGZyb20gdGhlIHJlc291cmNlIGZpbGUgd2luMzIvemxpYjEucmMKKyAgICBzZXRfdGFyZ2V0X3Byb3BlcnRpZXMoemxpYiBQUk9QRVJUSUVTIFZFUlNJT04gJHtaTElCX0ZVTExfVkVSU0lPTn0pCitlbmRpZigpCisKK2lmKFVOSVgpCisgICAgIyBPbiB1bml4LWxpa2UgcGxhdGZvcm1zIHRoZSBsaWJyYXJ5IGlzIGFsbW9zdCBhbHdheXMgY2FsbGVkIGxpYnoKKyAgIHNldF90YXJnZXRfcHJvcGVydGllcyh6bGliIFBST1BFUlRJRVMgT1VUUFVUX05BTUUgeikKK2Vsc2VpZihCVUlMRF9TSEFSRURfTElCUyBBTkQgV0lOMzIpCisgICAgIyBDcmVhdGVzIHpsaWIxLmRsbCB3aGVuIGJ1aWxkaW5nIHNoYXJlZCBsaWJyYXJ5IHZlcnNpb24KKyAgICBzZXRfdGFyZ2V0X3Byb3BlcnRpZXMoemxpYiBQUk9QRVJUSUVTIFNVRkZJWCAiMS5kbGwiKQorZW5kaWYoKQorCitpZihOT1QgU0tJUF9JTlNUQUxMX0xJQlJBUklFUyBBTkQgTk9UIFNLSVBfSU5TVEFMTF9BTEwgKQorICAgIGluc3RhbGwoVEFSR0VUUyB6bGliCisgICAgICAgIFJVTlRJTUUgREVTVElOQVRJT04gYmluCisgICAgICAgIEFSQ0hJVkUgREVTVElOQVRJT04gbGliCisgICAgICAgIExJQlJBUlkgREVTVElOQVRJT04gbGliICkKK2VuZGlmKCkKK2lmKE5PVCBTS0lQX0lOU1RBTExfSEVBREVSUyBBTkQgTk9UIFNLSVBfSU5TVEFMTF9BTEwgKQorICAgIGluc3RhbGwoRklMRVMgJHtaTElCX1BVQkxJQ19IRFJTfSBERVNUSU5BVElPTiBpbmNsdWRlKQorZW5kaWYoKQoraWYoTk9UIFNLSVBfSU5TVEFMTF9GSUxFUyBBTkQgTk9UIFNLSVBfSU5TVEFMTF9BTEwgKQorICAgIGluc3RhbGwoRklMRVMgemxpYi4zIERFU1RJTkFUSU9OIHNoYXJlL21hbi9tYW4zKQorZW5kaWYoKQorCisjPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBFeGFtcGxlIGJpbmFyaWVzCisjPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCithZGRfZXhlY3V0YWJsZShleGFtcGxlIHRlc3QvZXhhbXBsZS5jKQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKGV4YW1wbGUgemxpYikKK2FkZF90ZXN0KGV4YW1wbGUgZXhhbXBsZSkKKworYWRkX2V4ZWN1dGFibGUobWluaWd6aXAgdGVzdC9taW5pZ3ppcC5jKQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKG1pbmlnemlwIHpsaWIpCisKK2lmKEhBVkVfT0ZGNjRfVCkKKyAgICBhZGRfZXhlY3V0YWJsZShleGFtcGxlNjQgdGVzdC9leGFtcGxlLmMpCisgICAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKGV4YW1wbGU2NCB6bGliKQorICAgIHNldF90YXJnZXRfcHJvcGVydGllcyhleGFtcGxlNjQgUFJPUEVSVElFUyBDT01QSUxFX0ZMQUdTICItRF9GSUxFX09GRlNFVF9CSVRTPTY0IikKKyAgICBhZGRfdGVzdChleGFtcGxlNjQgZXhhbXBsZTY0KQorCisgICAgYWRkX2V4ZWN1dGFibGUobWluaWd6aXA2NCB0ZXN0L21pbmlnemlwLmMpCisgICAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKG1pbmlnemlwNjQgemxpYikKKyAgICBzZXRfdGFyZ2V0X3Byb3BlcnRpZXMobWluaWd6aXA2NCBQUk9QRVJUSUVTIENPTVBJTEVfRkxBR1MgIi1EX0ZJTEVfT0ZGU0VUX0JJVFM9NjQiKQorZW5kaWYoKQpkaWZmIC0tZ2l0IGEvemxpYi0xLjIuNi9DaGFuZ2VMb2cgYi96bGliLTEuMi42L0NoYW5nZUxvZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmE1ZDQ0Ci0tLSAvZGV2L251bGwKKysrIGIvemxpYi0xLjIuNi9DaGFuZ2VMb2cKQEAgLTAsMCArMSwxMzQ3IEBACisKKyAgICAgICAgICAgICAgICBDaGFuZ2VMb2cgZmlsZSBmb3IgemxpYgorCitDaGFuZ2VzIGluIDEuMi42ICgyOSBKYW4gMjAxMikKKy0gVXBkYXRlIHRoZSBQYXNjYWwgaW50ZXJmYWNlIGluIGNvbnRyaWIvcGFzY2FsCistIEZpeCBmdW5jdGlvbiBudW1iZXJzIGZvciBnemdldGNfIGluIHpsaWJ2Yy5kZWYgZmlsZXMKKy0gRml4IGNvbmZpZ3VyZS5hYyBmb3IgY29udHJpYi9taW5pemlwIFtTY2hpZmZlcl0KKy0gRml4IGxhcmdlLWVudHJ5IGRldGVjdGlvbiBpbiBtaW5pemlwIG9uIDY0LWJpdCBzeXN0ZW1zIFtTY2hpZmZlcl0KKy0gSGF2ZSAuL2NvbmZpZ3VyZSB1c2UgdGhlIGNvbXBpbGVyIHJldHVybiBjb2RlIGZvciBlcnJvciBpbmRpY2F0aW9uCistIEZpeCBDTWFrZUxpc3RzLnR4dCBmb3IgY3Jvc3MgY29tcGlsYXRpb24gW01jQ2x1cmVdCistIEZpeCBjb250cmliL21pbml6aXAvemlwLmMgZm9yIDY0LWJpdCBhcmNoaXRlY3R1cmVzIFtEYWxzbmVzXQorLSBGaXggY29tcGlsYXRpb24gb2YgY29udHJpYi9taW5pemlwIG9uIEZyZWVCU0QgW01hcnF1ZXpdCistIENvcnJlY3Qgc3VnZ2VzdGVkIHVzYWdlcyBpbiB3aW4zMi9NYWtlZmlsZS5tc2MgW1NoYWNoYXIsIEhvcnZhdGhdCistIEluY2x1ZGUgaW8uaCBmb3IgVHVyYm8gQyAvIEJvcmxhbmQgQyBvbiBhbGwgcGxhdGZvcm1zIFtUcnV0YV0KKy0gTWFrZSB2ZXJzaW9uIGV4cGxpY2l0IGluIGNvbnRyaWIvbWluaXppcC9jb25maWd1cmUuYWMgW0Jvc21hbnNdCistIEF2b2lkIHdhcm5pbmcgZm9yIG5vIGVuY3J5cHRpb24gaW4gY29udHJpYi9taW5pemlwL3ppcC5jIFtWb2xsYW50XQorLSBNaW5vciBjbGVhbnVwIHVwIGNvbnRyaWIvbWluaXppcC91bnppcC5jIFtWb2xsYW50XQorLSBGaXggYnVnIHdoZW4gY29tcGlsaW5nIG1pbml6aXAgd2l0aCBDKysgW1ZvbGxhbnRdCistIFByb3RlY3QgZm9yIGxvbmcgbmFtZSBhbmQgZXh0cmEgZmllbGRzIGluIGNvbnRyaWIvbWluaXppcCBbVm9sbGFudF0KKy0gQXZvaWQgc29tZSB3YXJuaW5ncyBpbiBjb250cmliL21pbml6aXAgW1ZvbGxhbnRdCistIEFkZCAtSS4uLy4uIC1MLi4vLi4gdG8gQ0ZMQUdTIGZvciBtaW5pemlwIGFuZCBtaW5pdW56aXAKKy0gQWRkIG1pc3NpbmcgbGlicyB0byBtaW5pemlwIGxpbmtlciBjb21tYW5kCistIEFkZCBzdXBwb3J0IGZvciBWUEFUSCBidWlsZHMgaW4gY29udHJpYi9taW5pemlwCistIEFkZCBhbiAtLWVuYWJsZS1kZW1vcyBvcHRpb24gdG8gY29udHJpYi9taW5pemlwL2NvbmZpZ3VyZQorLSBBZGQgdGhlIGdlbmVyYXRpb24gb2YgY29uZmlndXJlLmxvZyBieSAuL2NvbmZpZ3VyZQorLSBFeGl0IHdoZW4gcmVxdWlyZWQgcGFyYW1ldGVycyBub3QgcHJvdmlkZWQgdG8gd2luMzIvTWFrZWZpbGUuZ2NjCistIEhhdmUgZ3pwdXRjIHJldHVybiB0aGUgY2hhcmFjdGVyIHdyaXR0ZW4gaW5zdGVhZCBvZiB0aGUgYXJndW1lbnQKKy0gVXNlIHRoZSAtbSBvcHRpb24gb24gbGRjb25maWcgZm9yIEJTRCBzeXN0ZW1zIFtUb2JpYXNdCistIENvcnJlY3QgaW4gemxpYi5tYXAgd2hlbiBkZWZsYXRlUmVzZXRLZWVwIHdhcyBhZGRlZAorCitDaGFuZ2VzIGluIDEuMi41LjMgKDE1IEphbiAyMDEyKQorLSBSZXN0b3JlIGd6Z2V0YyBmdW5jdGlvbiBmb3IgYmluYXJ5IGNvbXBhdGliaWxpdHkKKy0gRG8gbm90IHVzZSBfbHNlZWtpNjQgdW5kZXIgQm9ybGFuZCBDKysgW1RydXRhXQorLSBVcGRhdGUgd2luMzIvTWFrZWZpbGUubXNjIHRvIGJ1aWxkIHRlc3QvKi5jIFtUcnV0YV0KKy0gUmVtb3ZlIG9sZC92aXN1YWxjNiBnaXZlbiBDTWFrZWZpbGUgYW5kIG90aGVyIGFsdGVybmF0aXZlcworLSBVcGRhdGUgQVM0MDAgYnVpbGQgZmlsZXMgYW5kIGRvY3VtZW50YXRpb24gW01vbm5lcmF0XQorLSBVcGRhdGUgd2luMzIvTWFrZWZpbGUuZ2NjIHRvIGJ1aWxkIHRlc3QvKi5jIFtUcnV0YV0KKy0gUGVybWl0IHN0cm9uZ2VyIGZsdXNoZXMgYWZ0ZXIgWl9CTE9DSyBmbHVzaGVzCistIEF2b2lkIGV4dHJhbmVvdXMgZW1wdHkgYmxvY2tzIHdoZW4gZG9pbmcgZW1wdHkgZmx1c2hlcworLSBQZXJtaXQgWl9OVUxMIGFyZ3VtZW50cyB0byBkZWZsYXRlUGVuZGluZworLSBBbGxvdyBkZWZsYXRlUHJpbWUoKSB0byBpbnNlcnQgYml0cyBpbiB0aGUgbWlkZGxlIG9mIGEgc3RyZWFtCistIFJlbW92ZSBzZWNvbmQgZW1wdHkgc3RhdGljIGJsb2NrIGZvciBaX1BBUlRJQUxfRkxVU0gKKy0gV3JpdGUgb3V0IGFsbCBvZiB0aGUgYXZhaWxhYmxlIGJpdHMgd2hlbiB1c2luZyBaX0JMT0NLCistIEluc2VydCB0aGUgZmlyc3QgdHdvIHN0cmluZ3MgaW4gdGhlIGhhc2ggdGFibGUgYWZ0ZXIgYSBmbHVzaAorCitDaGFuZ2VzIGluIDEuMi41LjIgKDE3IERlYyAyMDExKQorLSBmaXggbGQgZXJyb3I6IHVuYWJsZSB0byBmaW5kIHZlcnNpb24gZGVwZW5kZW5jeSAnWkxJQl8xLjIuNScKKy0gdXNlIHJlbGF0aXZlIHN5bWxpbmtzIGZvciBzaGFyZWQgbGlicworLSBBdm9pZCBzZWFyY2hpbmcgcGFzdCB3aW5kb3cgZm9yIFpfUkxFIHN0cmF0ZWd5CistIEFzc3VyZSB0aGF0IGhpZ2gtd2F0ZXIgbWFyayBpbml0aWFsaXphdGlvbiBpcyBhbHdheXMgYXBwbGllZCBpbiBkZWZsYXRlCistIEFkZCBhc3NlcnRpb25zIHRvIGZpbGxfd2luZG93KCkgaW4gZGVmbGF0ZS5jIHRvIG1hdGNoIGNvbW1lbnRzCistIFVwZGF0ZSBweXRob24gbGluayBpbiBSRUFETUUKKy0gQ29ycmVjdCBzcGVsbGluZyBlcnJvciBpbiBnenJlYWQuYworLSBGaXggYnVnIGluIGd6Z2V0cygpIGZvciBhIGNvbmNhdGVuYXRlZCBlbXB0eSBnemlwIHN0cmVhbQorLSBDb3JyZWN0IGVycm9yIGluIGNvbW1lbnQgZm9yIGd6X21ha2UoKQorLSBDaGFuZ2UgZ3pyZWFkKCkgYW5kIHJlbGF0ZWQgdG8gaWdub3JlIGp1bmsgYWZ0ZXIgZ3ppcCBzdHJlYW1zCistIEFsbG93IGd6cmVhZCgpIGFuZCByZWxhdGVkIHRvIGNvbnRpbnVlIGFmdGVyIGd6Y2xlYXJlcnIoKQorLSBBbGxvdyBnenJld2luZCgpIGFuZCBnenNlZWsoKSBhZnRlciBhIHByZW1hdHVyZSBlbmQtb2YtZmlsZQorLSBTaW1wbGlmeSBnenNlZWsoKSBub3cgdGhhdCByYXcgYWZ0ZXIgZ3ppcCBpcyBpZ25vcmVkCistIENoYW5nZSBnemdldGMoKSB0byBhIG1hY3JvIGZvciBzcGVlZCAofjQwJSBzcGVlZHVwIGluIHRlc3RpbmcpCistIEZpeCBnemNsb3NlKCkgdG8gcmV0dXJuIHRoZSBhY3R1YWwgZXJyb3IgbGFzdCBlbmNvdW50ZXJlZAorLSBBbHdheXMgYWRkIGxhcmdlIGZpbGUgc3VwcG9ydCBmb3Igd2luZG93cworLSBJbmNsdWRlIHpjb25mLmggZm9yIHdpbmRvd3MgbGFyZ2UgZmlsZSBzdXBwb3J0CistIEluY2x1ZGUgemNvbmYuaC5jbWFrZWluIGZvciB3aW5kb3dzIGxhcmdlIGZpbGUgc3VwcG9ydAorLSBVcGRhdGUgemNvbmYuaC5jbWFrZWluIG9uIG1ha2UgZGlzdGNsZWFuCistIE1lcmdlIHZlc3RpZ2lhbCB2c25wcmludGYgZGV0ZXJtaW5hdGlvbiBmcm9tIHp1dGlsLmggdG8gZ3pndXRzLmgKKy0gQ2xhcmlmeSBob3cgZ3pvcGVuKCkgYXBwZW5kcyBpbiB6bGliLmggY29tbWVudHMKKy0gQ29ycmVjdCBkb2N1bWVudGF0aW9uIG9mIGd6ZGlyZWN0KCkgc2luY2UganVuayBhdCBlbmQgbm93IGlnbm9yZWQKKy0gQWRkIGEgdHJhbnNwYXJlbnQgd3JpdGUgbW9kZSB0byBnem9wZW4oKSB3aGVuICdUJyBpcyBpbiB0aGUgbW9kZQorLSBVcGRhdGUgcHl0aG9uIGxpbmsgaW4gemxpYiBtYW4gcGFnZQorLSBHZXQgaW5mZml4ZWQuaCBhbmQgTUFLRUZJWEVEIHJlc3VsdCB0byBtYXRjaAorLSBBZGQgYSAuL2NvbmZpZyAtLXNvbG8gb3B0aW9uIHRvIG1ha2UgemxpYiBzdWJzZXQgd2l0aCBubyBsaWJhcnkgdXNlCistIEFkZCB1bmRvY3VtZW50ZWQgaW5mbGF0ZVJlc2V0S2VlcCgpIGZ1bmN0aW9uIGZvciBDQUIgZmlsZSBkZWNvZGluZworLSBBZGQgLS1jb3ZlciBvcHRpb24gdG8gLi9jb25maWd1cmUgZm9yIGdjYyBjb3ZlcmFnZSB0ZXN0aW5nCistIEFkZCAjZGVmaW5lIFpMSUJfQ09OU1Qgb3B0aW9uIHRvIHVzZSBjb25zdCBpbiB0aGUgel9zdHJlYW0gaW50ZXJmYWNlCistIEFkZCBjb21tZW50IHRvIGd6ZG9wZW4oKSBpbiB6bGliLmggdG8gdXNlIGR1cCgpIHdoZW4gdXNpbmcgZmlsZW5vKCkKKy0gTm90ZSBiZWhhdmlvciBvZiB1bmNvbXByZXNzKCkgdG8gcHJvdmlkZSBhcyBtdWNoIGRhdGEgYXMgaXQgY2FuCistIEFkZCBmaWxlcyBpbiBjb250cmliL21pbml6aXAgdG8gYWlkIGluIGJ1aWxkaW5nIGxpYm1pbml6aXAKKy0gU3BsaXQgb2ZmIEFSIG9wdGlvbnMgaW4gTWFrZWZpbGUuaW4gYW5kIGNvbmZpZ3VyZQorLSBDaGFuZ2UgT04gbWFjcm8gdG8gWl9BUkcgdG8gYXZvaWQgYXBwbGljYXRpb24gY29uZmxpY3RzCistIEZhY2lsaXRhdGUgY29tcGlsYXRpb24gd2l0aCBCb3JsYW5kIEMrKyBmb3IgcHJhZ21hcyBhbmQgdnNucHJpbnRmCistIEluY2x1ZGUgaW8uaCBmb3IgVHVyYm8gQyAvIEJvcmxhbmQgQysrCistIE1vdmUgZXhhbXBsZS5jIGFuZCBtaW5pZ3ppcC5jIHRvIHRlc3QvCistIFNpbXBsaWZ5IGluY29tcGxldGUgY29kZSB0YWJsZSBmaWxsaW5nIGluIGluZmxhdGVfdGFibGUoKQorLSBSZW1vdmUgY29kZSBmcm9tIGluZmxhdGUuYyBhbmQgaW5mYmFjay5jIHRoYXQgaXMgaW1wb3NzaWJsZSB0byBleGVjdXRlCistIFRlc3QgdGhlIGluZmxhdGUgY29kZSB3aXRoIGZ1bGwgY292ZXJhZ2UKKy0gQWxsb3cgZGVmbGF0ZVNldERpY3Rpb25hcnksIGluZmxhdGVTZXREaWN0aW9uYXJ5IGF0IGFueSB0aW1lIChpbiByYXcpCistIEFkZCBkZWZsYXRlUmVzZXRLZWVwIGFuZCBmaXggaW5mbGF0ZVJlc2V0S2VlcCB0byByZXRhaW4gZGljdGlvbmFyeQorLSBGaXggZ3p3cml0ZS5jIHRvIGFjY29tbW9kYXRlIHJlZHVjZWQgbWVtb3J5IHpsaWIgY29tcGlsYXRpb24KKy0gSGF2ZSBpbmZsYXRlKCkgd2l0aCBaX0ZJTklTSCBhdm9pZCB0aGUgYWxsb2NhdGlvbiBvZiBhIHdpbmRvdworLSBEbyBub3Qgc2V0IHN0cm0tPmFkbGVyIHdoZW4gZG9pbmcgcmF3IGluZmxhdGUKKy0gRml4IGd6ZW9mKCkgdG8gYmVoYXZlIGp1c3QgbGlrZSBmZW9mKCkgd2hlbiByZWFkIGlzIG5vdCBwYXN0IGVuZCBvZiBmaWxlCistIEZpeCBidWcgaW4gZ3pyZWFkLmMgd2hlbiBlbmQtb2YtZmlsZSBpcyByZWFjaGVkCistIEF2b2lkIHVzZSBvZiBaX0JVRl9FUlJPUiBpbiBneiogZnVuY3Rpb25zIGV4Y2VwdCBmb3IgcHJlbWF0dXJlIEVPRgorLSBEb2N1bWVudCBnenJlYWQoKSBjYXBhYmlsaXR5IHRvIHJlYWQgY29uY3VycmVudGx5IHdyaXR0ZW4gZmlsZXMKKy0gUmVtb3ZlIGhhcmQtY29kaW5nIG9mIHJlc291cmNlIGNvbXBpbGVyIGluIENNYWtlTGlzdHMudHh0IFtCbGFtbW9dCisKK0NoYW5nZXMgaW4gMS4yLjUuMSAoMTAgU2VwIDIwMTEpCistIFVwZGF0ZSBGQVEgZW50cnkgb24gc2hhcmVkIGJ1aWxkcyAoIzEzKQorLSBBdm9pZCBzeW1ib2xpYyBhcmd1bWVudCB0byBjaG1vZCBpbiBNYWtlZmlsZS5pbgorLSBGaXggYnVnIGFuZCBhZGQgY29uc3RzIGluIGNvbnRyaWIvcHVmZiBbT2Jlcmh1bWVyXQorLSBVcGRhdGUgY29udHJpYi9wdWZmL3plcm9zLnJhdyB0ZXN0IGZpbGUgdG8gaGF2ZSBhbGwgYmxvY2sgdHlwZXMKKy0gQWRkIGZ1bGwgY292ZXJhZ2UgdGVzdCBmb3IgcHVmZiBpbiBjb250cmliL3B1ZmYvTWFrZWZpbGUKKy0gRml4IHN0YXRpYy1vbmx5LWJ1aWxkIGluc3RhbGwgaW4gTWFrZWZpbGUuaW4KKy0gRml4IGJ1ZyBpbiB1bnpHZXRDdXJyZW50RmlsZUluZm8oKSBpbiBjb250cmliL21pbml6aXAgW0t1bm9dCistIEFkZCBsaWJ6LmEgZGVwZW5kZW5jeSB0byBzaGFyZWQgaW4gTWFrZWZpbGUuaW4gZm9yIHBhcmFsbGVsIGJ1aWxkcworLSBTcGVsbCBvdXQgIm51bWJlciIgKGluc3RlYWQgb2YgIm5iIikgaW4gemxpYi5oIGZvciB0b3RhbF9pbiwgdG90YWxfb3V0CistIFJlcGxhY2UgJCguLi4pIHdpdGggYC4uLmAgaW4gY29uZmlndXJlIGZvciBub24tYmFzaCBzaCBbQm93bGVyXQorLSBBZGQgZGFyd2luKiB0byBEYXJ3aW4qIGFuZCBzb2xhcmlzKiB0byBTdW5PU1wgNSogaW4gY29uZmlndXJlIFtHcm9mZmVuXQorLSBBZGQgc29sYXJpcyogdG8gTGludXgqIGluIGNvbmZpZ3VyZSB0byBhbGxvdyBnY2MgdXNlIFtHcm9mZmVuXQorLSBBZGQgKmJzZCogdG8gTGludXgqIGNhc2UgaW4gY29uZmlndXJlIFtCYXItTGV2XQorLSBBZGQgaW5mZmFzdC5vYmogdG8gZGVwZW5kZW5jaWVzIGluIHdpbjMyL01ha2VmaWxlLm1zYworLSBDb3JyZWN0IHNwZWxsaW5nIGVycm9yIGluIGRlZmxhdGUuaCBbS29obGVyXQorLSBDaGFuZ2UgbGliemRsbC5hIGFnYWluIHRvIGxpYnouZGxsLmEgKCEpIGluIHdpbjMyL01ha2VmaWxlLmdjYworLSBBZGQgdGVzdCB0byBjb25maWd1cmUgZm9yIEdOVSBDIGxvb2tpbmcgZm9yIGdjYyBpbiBvdXRwdXQgb2YgJGNjIC12CistIEFkZCB6bGliLnBjIGdlbmVyYXRpb24gdG8gd2luMzIvTWFrZWZpbGUuZ2NjIFtXZWlnZWx0XQorLSBGaXggYnVnIGluIHpsaWIuaCBmb3IgX0ZJTEVfT0ZGU0VUX0JJVFMgc2V0IGFuZCBfTEFSR0VGSUxFNjRfU09VUkNFIG5vdAorLSBBZGQgY29tbWVudCBpbiB6bGliLmggdGhhdCBhZGxlcjMyX2NvbWJpbmUgd2l0aCBsZW4yIDwgMCBtYWtlcyBubyBzZW5zZQorLSBNYWtlIE5PX0RJVklERSBvcHRpb24gaW4gYWRsZXIzMi5jIG11Y2ggZmFzdGVyICh0aGFua3MgdG8gSm9obiBSZWlzZXIpCistIE1ha2Ugc3Ryb25nZXIgdGVzdCBpbiB6Y29uZi5oIHRvIGluY2x1ZGUgdW5pc3RkLmggZm9yIExGUworLSBBcHBseSBEYXJ3aW4gcGF0Y2hlcyBmb3IgNjQtYml0IGZpbGUgb2Zmc2V0cyB0byBjb250cmliL21pbml6aXAgW1NsYWNrXQorLSBGaXggemxpYi5oIExGUyBzdXBwb3J0IHdoZW4gWl9QUkVGSVggdXNlZAorLSBBZGQgdXBkYXRlZCBhczQwMCBzdXBwb3J0IChyZW1vdmVkIGZyb20gb2xkKSBbTW9ubmVyYXRdCistIEF2b2lkIGRlZmxhdGUgc2Vuc2l0aXZpdHkgdG8gdm9sYXRpbGUgaW5wdXQgZGF0YQorLSBBdm9pZCBkaXZpc2lvbiBpbiBhZGxlcjMyX2NvbWJpbmUgZm9yIE5PX0RJVklERQorLSBDbGFyaWZ5IHRoZSB1c2Ugb2YgWl9GSU5JU0ggd2l0aCBkZWZsYXRlQm91bmQoKSBhbW91bnQgb2Ygc3BhY2UKKy0gU2V0IGJpbmFyeSBmb3Igb3V0cHV0IGZpbGUgaW4gcHVmZi5jCistIFVzZSB1NCB0eXBlIGZvciBjcmNfdGFibGUgdG8gYXZvaWQgY29udmVyc2lvbiB3YXJuaW5ncworLSBBcHBseSBjYXN0cyBpbiB6bGliLmggdG8gYXZvaWQgY29udmVyc2lvbiB3YXJuaW5ncworLSBBZGQgT0YgdG8gcHJvdG90eXBlcyBmb3IgYWRsZXIzMl9jb21iaW5lXyBhbmQgY3JjMzJfY29tYmluZV8gW01pbGxlcl0KKy0gSW1wcm92ZSBpbmZsYXRlU3luYygpIGRvY3VtZW50YXRpb24gdG8gbm90ZSBpbmRldGVybWluYW5jeQorLSBBZGQgZGVmbGF0ZVBlbmRpbmcoKSBmdW5jdGlvbiB0byByZXR1cm4gdGhlIGFtb3VudCBvZiBwZW5kaW5nIG91dHB1dAorLSBDb3JyZWN0IHRoZSBzcGVsbGluZyBvZiAic3BlY2lmaWNhdGlvbiIgaW4gRkFRIFtSYW5kZXJzLVBlaHJzb25dCistIEFkZCBhIGNoZWNrIGluIGNvbmZpZ3VyZSBmb3Igc3RkYXJnLmgsIHVzZSBmb3IgZ3pwcmludGYoKQorLSBDaGVjayB0aGF0IHBvaW50ZXJzIGZpdCBpbiBpbnRzIHdoZW4gZ3pwcmludCgpIGNvbXBpbGVkIG9sZCBzdHlsZQorLSBBZGQgZHVtbXkgbmFtZSBiZWZvcmUgJChTSEFSRURMSUJWKSBpbiBNYWtlZmlsZSBbQmFyLUxldiwgQm93bGVyXQorLSBEZWxldGUgbGluZSBpbiBjb25maWd1cmUgdGhhdCBhZGRzIC1MLiBsaWJ6LmEgdG8gTERGTEFHUyBbV2VpZ2VsdF0KKy0gQWRkIGRlYnVnIHJlY29yZHMgaW4gYXNzbWVibGVyIGNvZGUgW0xvbmRlcl0KKy0gVXBkYXRlIFJGQyByZWZlcmVuY2VzIHRvIHVzZSBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC8uLi4gW0xpXQorLSBBZGQgLS1hcmNocyBvcHRpb24sIHVzZSBvZiBsaWJ0b29sIHRvIGNvbmZpZ3VyZSBmb3IgTWFjIE9TIFggW0JvcnN0ZWxdCisKK0NoYW5nZXMgaW4gMS4yLjUgKDE5IEFwciAyMDEwKQorLSBEaXNhYmxlIHZpc2liaWxpdHkgYXR0cmlidXRlIGluIHdpbjMyL01ha2VmaWxlLmdjYyBbQmFyLUxldl0KKy0gRGVmYXVsdCB0byBsaWJkaXIgYXMgc2hhcmVkbGliZGlyIGluIGNvbmZpZ3VyZSBbTmllZGVyXQorLSBVcGRhdGUgY29weXJpZ2h0IGRhdGVzIG9uIG1vZGlmaWVkIHNvdXJjZSBmaWxlcworLSBVcGRhdGUgdHJlZXMuYyB0byBiZSBhYmxlIHRvIGdlbmVyYXRlIG1vZGlmaWVkIHRyZWVzLmgKKy0gRXhpdCBjb25maWd1cmUgZm9yIE1pbkdXLCBzdWdnZXN0aW5nIHdpbjMyL01ha2VmaWxlLmdjYworLSBDaGVjayBmb3IgTlVMTCBwYXRoIGluIGd6X29wZW4gW0hvbXVybHVdCisKK0NoYW5nZXMgaW4gMS4yLjQuNSAoMTggQXByIDIwMTApCistIFNldCBzaGFyZWRsaWJkaXIgaW4gY29uZmlndXJlIFtUb3Jva10KKy0gU2V0IExERkxBR1MgaW4gTWFrZWZpbGUuaW4gW0Jhci1MZXZdCistIEF2b2lkIG1rZGlyIG9ianMgcmFjZSBjb25kaXRpb24gaW4gTWFrZWZpbGUuaW4gW0Jvd2xlcl0KKy0gQWRkIFpMSUJfSU5URVJOQUwgaW4gZnJvbnQgb2YgaW50ZXJuYWwgaW50ZXItbW9kdWxlIGZ1bmN0aW9ucyBhbmQgYXJyYXlzCistIERlZmluZSBaTElCX0lOVEVSTkFMIHRvIGhpZGUgaW50ZXJuYWwgZnVuY3Rpb25zIGFuZCBhcnJheXMgZm9yIEdOVSBDCistIERvbid0IHVzZSBoaWRkZW4gYXR0cmlidXRlIHdoZW4gaXQgaXMgYSB3YXJuaW5nIGdlbmVyYXRvciAoZS5nLiBTb2xhcmlzKQorCitDaGFuZ2VzIGluIDEuMi40LjQgKDE4IEFwciAyMDEwKQorLSBGaXggQ1JPU1NfUFJFRklYIGV4ZWN1dGFibGUgdGVzdGluZywgQ0hPU1QgZXh0cmFjdCwgbWluZ3cqIFtUb3Jva10KKy0gVW5kZWZpbmUgX0xBUkdFRklMRTY0X1NPVVJDRSBpbiB6Y29uZi5oIGlmIGl0IGlzIHplcm8sIGJ1dCBub3QgaWYgZW1wdHkKKy0gVHJ5IHRvIHVzZSBiYXNoIG9yIGtzaCByZWdhcmRsZXNzIG9mIGZ1bmN0aW9uYWxpdHkgb2YgL2Jpbi9zaAorLSBGaXggY29uZmlndXJlIGluY29tcGF0aWJpbGl0eSB3aXRoIE5ldEJTRCBzaAorLSBSZW1vdmUgYXR0ZW1wdCB0byBydW4gdW5kZXIgYmFzaCBvciBrc2ggc2luY2UgaGF2ZSBiZXR0ZXIgTmV0QlNEIGZpeAorLSBGaXggd2luMzIvTWFrZWZpbGUuZ2NjIGZvciBNaW5HVyBbQmFyLUxldl0KKy0gQWRkIGRpYWdub3N0aWMgbWVzc2FnZXMgd2hlbiB1c2luZyBDUk9TU19QUkVGSVggaW4gY29uZmlndXJlCistIEFkZGVkIC0tc2hhcmVkbGliZGlyIG9wdGlvbiB0byBjb25maWd1cmUgW1dlaWdlbHRdCistIFVzZSBoaWRkZW4gdmlzaWJpbGl0eSBhdHRyaWJ1dGUgd2hlbiBhdmFpbGFibGUgW0ZyeXNpbmdlcl0KKworQ2hhbmdlcyBpbiAxLjIuNC4zICgxMCBBcHIgMjAxMCkKKy0gT25seSB1c2UgQ1JPU1NfUFJFRklYIGluIGNvbmZpZ3VyZSBmb3IgYXIgYW5kIHJhbmxpYiBpZiB0aGV5IGV4aXN0CistIFVzZSBDUk9TU19QUkVGSVggZm9yIG5tIFtCYXItTGV2XQorLSBBc3N1bWUgX0xBUkdFRklMRTY0X1NPVVJDRSBkZWZpbmVkIGlzIGVxdWl2YWxlbnQgdG8gdHJ1ZQorLSBBdm9pZCB1c2Ugb2YgdW5kZWZpbmVkIHN5bWJvbHMgaW4gI2lmIHdpdGggJiYgYW5kIHx8CistIE1ha2UgKjY0IHByb3RvdHlwZXMgaW4gZ3pndXRzLmggY29uc2lzdGVudCB3aXRoIGZ1bmN0aW9ucworLSBBZGQgLXNoYXJlZCBsb2FkIG9wdGlvbiBmb3IgTWluR1cgaW4gY29uZmlndXJlIFtCb3dsZXJdCistIE1vdmUgel9vZmY2NF90IHRvIHB1YmxpYyBpbnRlcmZhY2UsIHVzZSBpbnN0ZWFkIG9mIG9mZjY0X3QKKy0gUmVtb3ZlICEgZnJvbSBzaGVsbCB0ZXN0IGluIGNvbmZpZ3VyZSAobm90IHBvcnRhYmxlIHRvIFNvbGFyaXMpCistIENoYW5nZSArMCBtYWNybyB0ZXN0cyB0byAtMCBmb3IgcG9zc2libHkgaW5jcmVhc2VkIHBvcnRhYmlsaXR5CisKK0NoYW5nZXMgaW4gMS4yLjQuMiAoOSBBcHIgMjAxMCkKKy0gQWRkIGNvbnNpc3RlbnQgY2FycmlhZ2UgcmV0dXJucyB0byByZWFkbWUudHh0J3MgaW4gbWFzbXg4NiBhbmQgbWFzbXg2NAorLSBSZWFsbHkgcHJvdmlkZSBwcm90b3R5cGVzIGZvciAqNjQgZnVuY3Rpb25zIHdoZW4gYnVpbGRpbmcgd2l0aG91dCBMRlMKKy0gT25seSBkZWZpbmUgdW5saW5rKCkgaW4gbWluaWd6aXAuYyBpZiB1bmlzdGQuaCBub3QgaW5jbHVkZWQKKy0gVXBkYXRlIFJFQURNRSB0byBwb2ludCB0byBjb250cmliL3ZzdHVkaW8gcHJvamVjdCBmaWxlcworLSBNb3ZlIHByb2plY3RzL3ZjNiB0byBvbGQvIGFuZCByZW1vdmUgcHJvamVjdHMvCistIEluY2x1ZGUgc3RkbGliLmggaW4gbWluaWd6aXAuYyBmb3Igc2V0bW9kZSgpIGRlZmluaXRpb24gdW5kZXIgV2luQ0UKKy0gQ2xlYW4gdXAgYXNzZW1ibGVyIGJ1aWxkcyBpbiB3aW4zMi9NYWtlZmlsZS5tc2MgW1Jvd2VdCistIEluY2x1ZGUgc3lzL3R5cGVzLmggZm9yIE1pY3Jvc29mdCBmb3Igb2ZmX3QgZGVmaW5pdGlvbgorLSBGaXggbWVtb3J5IGxlYWsgb24gZXJyb3IgaW4gZ3pfb3BlbigpCistIFN5bWJvbGl6ZSBubSBhcyAkTk0gaW4gY29uZmlndXJlIFtXZWlnZWx0XQorLSBVc2UgVEVTVF9MRFNIQVJFRCBpbnN0ZWFkIG9mIExEU0hBUkVEIHRvIGxpbmsgdGVzdCBwcm9ncmFtcyBbV2VpZ2VsdF0KKy0gQWRkICswIHRvIF9GSUxFX09GRlNFVF9CSVRTIGFuZCBfTEZTNjRfTEFSR0VGSUxFIGluIGNhc2Ugbm90IGRlZmluZWQKKy0gRml4IGJ1ZyBpbiBnemVvZigpIHRvIHRha2UgaW50byBhY2NvdW50IHVudXNlZCBpbnB1dCBkYXRhCistIEF2b2lkIGluaXRpYWxpemF0aW9uIG9mIHN0cnVjdHVyZXMgd2l0aCB2YXJpYWJsZXMgaW4gcHVmZi5jCistIFVwZGF0ZWQgd2luMzIvUkVBRE1FLVdJTjMyLnR4dCBbUm93ZV0KKworQ2hhbmdlcyBpbiAxLjIuNC4xICgyOCBNYXIgMjAxMCkKKy0gUmVtb3ZlIHRoZSB1c2Ugb2YgW2Etel0gY29uc3RydWN0cyBmb3Igc2VkIGluIGNvbmZpZ3VyZSBbZ2VudG9vIDMxMDIyNV0KKy0gUmVtb3ZlICQoU0hBUkVETElCKSBmcm9tIExJQlMgaW4gTWFrZWZpbGUuaW4gW0NyZWVjaF0KKy0gUmVzdG9yZSAiZm9yIGRlYnVnZ2luZyIgY29tbWVudCBvbiBzcHJpbnRmKCkgaW4gZ3psaWIuYworLSBSZW1vdmUgZmRvcGVuIGZvciBNVlMgZnJvbSBnemd1dHMuaAorLSBQdXQgbmV3IFJFQURNRS1XSU4zMi50eHQgaW4gd2luMzIgW1Jvd2VdCistIEFkZCBjaGVjayBmb3Igc2hlbGwgdG8gY29uZmlndXJlIGFuZCBpbnZva2UgYW5vdGhlciBzaGVsbCBpZiBuZWVkZWQKKy0gRml4IGJpZyBmYXQgc3RpbmtpbmcgYnVnIGluIGd6c2VlaygpIG9uIHVuY29tcHJlc3NlZCBmaWxlcworLSBSZW1vdmUgdmVzdGlnaWFsIEZfT1BFTjY0IGRlZmluZSBpbiB6dXRpbC5oCistIFNldCBhbmQgY2hlY2sgdGhlIHZhbHVlIG9mIF9MQVJHRUZJTEVfU09VUkNFIGFuZCBfTEFSR0VGSUxFNjRfU09VUkNFCistIEF2b2lkIGVycm9ycyBvbiBub24tTEZTIHN5c3RlbXMgd2hlbiBhcHBsaWNhdGlvbnMgZGVmaW5lIExGUyBtYWNyb3MKKy0gU2V0IEVYRSB0byAiLmV4ZSIgaW4gY29uZmlndXJlIGZvciBNSU5HVyBbS2FobGVdCistIE1hdGNoIGNyYzMyKCkgaW4gY3JjMzIuYyBleGFjdGx5IHRvIHRoZSBwcm90b3R5cGUgaW4gemxpYi5oIFtTaGVycmlsbF0KKy0gQWRkIHByZWZpeCBmb3IgY3Jvc3MtY29tcGlsYXRpb24gaW4gd2luMzIvbWFrZWZpbGUuZ2NjIFtCYXItTGV2XQorLSBBZGQgRExMIGluc3RhbGwgaW4gd2luMzIvbWFrZWZpbGUuZ2NjIFtCYXItTGV2XQorLSBBbGxvdyBMaW51eCogb3IgbGludXgqIGZyb20gdW5hbWUgaW4gY29uZmlndXJlIFtCYXItTGV2XQorLSBBbGxvdyBsZGNvbmZpZyB0byBiZSByZWRlZmluZWQgaW4gY29uZmlndXJlIGFuZCBNYWtlZmlsZS5pbiBbQmFyLUxldl0KKy0gQWRkIGNyb3NzLWNvbXBpbGF0aW9uIHByZWZpeGVzIHRvIGNvbmZpZ3VyZSBbQmFyLUxldl0KKy0gTWF0Y2ggdHlwZSBleGFjdGx5IGluIGd6X2xvYWQoKSBpbnZvY2F0aW9uIGluIGd6cmVhZC5jCistIE1hdGNoIHR5cGUgZXhhY3RseSBvZiB6Y2FsbG9jKCkgaW4genV0aWwuYyB0byB6bGliLmggYWxsb2NfZnVuYworLSBQcm92aWRlIHByb3RvdHlwZXMgZm9yICo2NCBmdW5jdGlvbnMgd2hlbiBidWlsZGluZyB6bGliIHdpdGhvdXQgTEZTCistIERvbid0IHVzZSAtbGMgd2hlbiBsaW5raW5nIHNoYXJlZCBsaWJyYXJ5IG9uIE1pbkdXCistIFJlbW92ZSBlcnJuby5oIGNoZWNrIGluIGNvbmZpZ3VyZSBhbmQgdmVzdGlnaWFsIGVycm5vIGNvZGUgaW4genV0aWwuaAorCitDaGFuZ2VzIGluIDEuMi40ICgxNCBNYXIgMjAxMCkKKy0gRml4IFZFUjMgZXh0cmFjdGlvbiBpbiBjb25maWd1cmUgZm9yIG5vIGZvdXJ0aCBzdWJ2ZXJzaW9uCistIFVwZGF0ZSB6bGliLjMsIGFkZCBkb2NzIHRvIE1ha2VmaWxlLmluIHRvIG1ha2UgLnBkZiBvdXQgb2YgaXQKKy0gQWRkIHpsaWIuMy5wZGYgdG8gZGlzdHJpYnV0aW9uCistIERvbid0IHNldCBlcnJvciBjb2RlIGluIGd6ZXJyb3IoKSBpZiBwYXNzZWQgcG9pbnRlciBpcyBOVUxMCistIEFwcGx5IGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBmaXhlcyB0byBDTWFrZUxpc3RzLnR4dCBbTG93bWFuXQorLSBNb3ZlICNjbWFrZWRlZmluZSdzIHRvIGEgbmV3IHpjb25mLmluLmNtYWtlaW4KKy0gUmVzdG9yZSB6Y29uZi5oIGZvciBidWlsZHMgdGhhdCBkb24ndCB1c2UgY29uZmlndXJlIG9yIGNtYWtlCistIEFkZCBkaXN0Y2xlYW4gdG8gZHVtbXkgTWFrZWZpbGUgZm9yIGNvbnZlbmllbmNlCistIFVwZGF0ZSBhbmQgaW1wcm92ZSBJTkRFWCwgUkVBRE1FLCBhbmQgRkFRCistIFVwZGF0ZSBDTWFrZUxpc3RzLnR4dCBmb3IgdGhlIHJldHVybiBvZiB6Y29uZi5oIFtMb3dtYW5dCistIFVwZGF0ZSBjb250cmliL3ZzdHVkaW8vdmM5IGFuZCB2YzEwIFtWb2xsYW50XQorLSBDaGFuZ2UgbGliei5kbGwuYSBiYWNrIHRvIGxpYnpkbGwuYSBpbiB3aW4zMi9NYWtlZmlsZS5nY2MKKy0gQXBwbHkgbGljZW5zZSBhbmQgcmVhZG1lIGNoYW5nZXMgdG8gY29udHJpYi9hc202ODYgW1JhaXRlcl0KKy0gQ2hlY2sgZmlsZSBuYW1lIGxlbmd0aHMgYW5kIGFkZCAtYyBvcHRpb24gaW4gbWluaWd6aXAuYyBbTGldCistIFVwZGF0ZSBjb250cmliL2FtZDY0IGFuZCBjb250cmliL21hc214ODYvIFtWb2xsYW50XQorLSBBdm9pZCB1c2Ugb2YgImVvZiIgcGFyYW1ldGVyIGluIHRyZWVzLmMgdG8gbm90IHNoYWRvdyBsaWJyYXJ5IHZhcmlhYmxlCistIFVwZGF0ZSBtYWtlX3Ztcy5jb20gZm9yIHJlbW92YWwgb2YgemxpYmRlZnMuaCBbWmluc2VyXQorLSBVcGRhdGUgYXNzZW1ibGVyIGNvZGUgYW5kIHZzdHVkaW8gcHJvamVjdHMgaW4gY29udHJpYiBbVm9sbGFudF0KKy0gUmVtb3ZlIG91dGRhdGVkIGFzc2VtYmxlciBjb2RlIGNvbnRyaWIvbWFzbTY4NiBhbmQgY29udHJpYi9hc201ODYKKy0gUmVtb3ZlIG9sZCB2YzcgYW5kIHZjOCBmcm9tIGNvbnRyaWIvdnN0dWRpbworLSBVcGRhdGUgd2luMzIvTWFrZWZpbGUubXNjLCBhZGQgWkxJQl9WRVJfU1VCUkVWSVNJT04gW1Jvd2VdCistIEZpeCBtZW1vcnkgbGVha3MgaW4gZ3pjbG9zZV9yKCkgYW5kIGd6Y2xvc2VfdygpLCBmaWxlIGxlYWsgaW4gZ3pfb3BlbigpCistIEFkZCBjb250cmliL2djY19ndm1hdDY0IGZvciBsb25nZXN0X21hdGNoIGFuZCBpbmZsYXRlX2Zhc3QgW1ZvbGxhbnRdCistIFJlbW92ZSAqNjQgZnVuY3Rpb25zIGZyb20gd2luMzIvemxpYi5kZWYgKHRoZXkncmUgbm90IDY0LWJpdCB5ZXQpCistIEZpeCBidWcgaW4gdm9pZC1yZXR1cm5pbmcgdnNwcmludGYoKSBjYXNlIGluIGd6d3JpdGUuYworLSBGaXggbmFtZSBjaGFuZ2UgZnJvbSBpbmZsYXRlLmggaW4gY29udHJpYi9pbmZsYXRlODYvaW5mZmFzODYuYworLSBDaGVjayBpZiB0ZW1wb3JhcnkgZmlsZSBleGlzdHMgYmVmb3JlIHJlbW92aW5nIGluIG1ha2Vfdm1zLmNvbSBbWmluc2VyXQorLSBGaXggbWFrZSBpbnN0YWxsIGFuZCB1bmluc3RhbGwgZm9yIC0tc3RhdGljIG9wdGlvbgorLSBGaXggdXNhZ2Ugb2YgX01TQ19WRVIgaW4gZ3pndXRzLmggYW5kIHp1dGlsLmggW1RydXRhXQorLSBVcGRhdGUgcmVhZG1lLnR4dCBpbiBjb250cmliL21hc214NjQgYW5kIG1hc214ODYgdG8gYXNzZW1ibGUKKworQ2hhbmdlcyBpbiAxLjIuMy45ICgyMSBGZWIgMjAxMCkKKy0gRXhwdW5nZSBnemlvLmMKKy0gTW92ZSBhczQwMCBidWlsZCBpbmZvcm1hdGlvbiB0byBvbGQKKy0gRml4IHVwZGF0ZXMgaW4gY29udHJpYi9taW5pemlwIGFuZCBjb250cmliL3ZzdHVkaW8KKy0gQWRkIGNvbnN0IHRvIHZzbnByaW50ZiB0ZXN0IGluIGNvbmZpZ3VyZSB0byBhdm9pZCB3YXJuaW5ncyBbV2VpZ2VsdF0KKy0gRGVsZXRlIHpjb25mLmggKG1hZGUgYnkgY29uZmlndXJlKSBbV2VpZ2VsdF0KKy0gQ2hhbmdlIHpjb25mLmluLmggdG8gemNvbmYuaC5pbiBwZXIgY29udmVudGlvbiBbV2VpZ2VsdF0KKy0gQ2hlY2sgZm9yIE5VTEwgYnVmIGluIGd6Z2V0cygpCistIFJldHVybiBlbXB0eSBzdHJpbmcgZm9yIGd6Z2V0cygpIHdpdGggbGVuID09IDEgKGxpa2UgZmdldHMoKSkKKy0gRml4IGRlc2NyaXB0aW9uIG9mIGd6Z2V0cygpIGluIHpsaWIuaCBmb3IgZW5kLW9mLWZpbGUsIE5VTEwgcmV0dXJuCistIFVwZGF0ZSBtaW5pemlwIHRvIDEuMSBbVm9sbGFudF0KKy0gQXZvaWQgTVNWQyBsb3NzIG9mIGRhdGEgd2FybmluZ3MgaW4gZ3pyZWFkLmMsIGd6d3JpdGUuYworLSBOb3RlIGluIHpsaWIuaCB0aGF0IGd6ZXJyb3IoKSBzaG91bGQgYmUgdXNlZCB0byBkaXN0aW5ndWlzaCBmcm9tIEVPRgorLSBSZW1vdmUgdXNlIG9mIHNucHJpbnRmKCkgZnJvbSBnemxpYi5jCistIEZpeCBidWcgaW4gZ3pzZWVrKCkKKy0gVXBkYXRlIGNvbnRyaWIvdnN0dWRpbywgYWRkaW5nIHZjOSBhbmQgdmMxMCBbS3VubywgVm9sbGFudF0KKy0gRml4IHpjb25mLmggZ2VuZXJhdGlvbiBpbiBDTWFrZUxpc3RzLnR4dCBbTG93bWFuXQorLSBJbXByb3ZlIGNvbW1lbnRzIGluIHpjb25mLmggd2hlcmUgbW9kaWZpZWQgYnkgY29uZmlndXJlCisKK0NoYW5nZXMgaW4gMS4yLjMuOCAoMTMgRmViIDIwMTApCistIENsZWFuIHVwIHRleHQgZmlsZXMgKHRhYnMsIHRyYWlsaW5nIHdoaXRlc3BhY2UsIGV0Yy4pIFtPYmVyaHVtZXJdCistIFVzZSB6X29mZjY0X3QgaW4gZ3pfemVybygpIGFuZCBnel9za2lwKCkgdG8gbWF0Y2ggc3RhdGUtPnNraXAKKy0gQXZvaWQgY29tcGFyaXNvbiBwcm9ibGVtIHdoZW4gc2l6ZW9mKGludCkgPT0gc2l6ZW9mKHpfb2ZmNjRfdCkKKy0gUmV2ZXJ0IHRvIE1ha2VmaWxlLmluIGZyb20gMS4yLjMuNiAobGl2ZSB3aXRoIHRoZSBjbHV0dGVyKQorLSBGaXggbWlzc2luZyBlcnJvciByZXR1cm4gaW4gZ3pmbHVzaCgpLCBhZGQgemxpYi5oIG5vdGUKKy0gQWRkICo2NCBmdW5jdGlvbnMgdG8gemxpYi5tYXAgW0xldmluXQorLSBGaXggc2lnbmVkL3Vuc2lnbmVkIGNvbXBhcmlzb24gaW4gZ3pfY29tcCgpCistIFVzZSBTRkxBR1Mgd2hlbiB0ZXN0aW5nIHNoYXJlZCBsaW5raW5nIGluIGNvbmZpZ3VyZQorLSBBZGQgLS02NCBvcHRpb24gdG8gLi9jb25maWd1cmUgdG8gdXNlIC1tNjQgd2l0aCBnY2MKKy0gRml4IC4vY29uZmlndXJlIC0taGVscCB0byBjb3JyZWN0bHkgbmFtZSBvcHRpb25zCistIEhhdmUgbWFrZSBmYWlsIGlmIGEgdGVzdCBmYWlscyBbTGV2aW5dCistIEF2b2lkIGJ1ZmZlciBvdmVycnVuIGluIGNvbnRyaWIvbWFzbXg2NC9ndm1hdDY0LmFzbSBbU2ltcHNvbl0KKy0gUmVtb3ZlIGFzc2VtYmxlciBvYmplY3QgZmlsZXMgZnJvbSBjb250cmliCisKK0NoYW5nZXMgaW4gMS4yLjMuNyAoMjQgSmFuIDIwMTApCistIEFsd2F5cyBnem9wZW4oKSB3aXRoIE9fTEFSR0VGSUxFIGlmIGF2YWlsYWJsZQorLSBGaXggZ3pkaXJlY3QoKSB0byB3b3JrIGltbWVkaWF0ZWx5IGFmdGVyIGd6b3BlbigpIG9yIGd6ZG9wZW4oKQorLSBNYWtlIGd6ZGlyZWN0KCkgbW9yZSBwcmVjaXNlIHdoZW4gdGhlIHN0YXRlIGNoYW5nZXMgd2hpbGUgcmVhZGluZworLSBJbXByb3ZlIHpsaWIuaCBkb2N1bWVudGF0aW9uIGluIG1hbnkgcGxhY2VzCistIENhdGNoIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUgaW4gZ3pfb3BlbigpCistIENvbXBsZXRlIGNsb3NlIG9wZXJhdGlvbiBpZiBzZWVrIGZvcndhcmQgaW4gZ3pjbG9zZV93KCkgZmFpbHMKKy0gUmV0dXJuIFpfRVJSTk8gZnJvbSBnemNsb3NlX3IoKSBpZiBjbG9zZSgpIGZhaWxzCistIFJldHVybiBaX1NUUkVBTV9FUlJPUiBpbnN0ZWFkIG9mIEVPRiBmb3IgZ3pjbG9zZSgpIGJlaW5nIHBhc3NlZCBOVUxMCistIFJldHVybiB6ZXJvIGZvciBnendyaXRlKCkgZXJyb3JzIHRvIG1hdGNoIHpsaWIuaCBkZXNjcmlwdGlvbgorLSBSZXR1cm4gLTEgb24gZ3pwdXRzKCkgZXJyb3IgdG8gbWF0Y2ggemxpYi5oIGRlc2NyaXB0aW9uCistIEFkZCB6Y29uZi5pbi5oIHRvIGFsbG93IHJlY292ZXJ5IGZyb20gY29uZmlndXJlIG1vZGlmaWNhdGlvbiBbV2VpZ2VsdF0KKy0gRml4IHN0YXRpYyBsaWJyYXJ5IHBlcm1pc3Npb25zIGluIE1ha2VmaWxlLmluIFtXZWlnZWx0XQorLSBBdm9pZCB3YXJuaW5ncyBpbiBjb25maWd1cmUgdGVzdHMgdGhhdCBoaWRlIGZ1bmN0aW9uYWxpdHkgW1dlaWdlbHRdCistIEFkZCAqQlNEIGFuZCBEcmFnb25GbHkgdG8gTGludXggY2FzZSBpbiBjb25maWd1cmUgW2dlbnRvbyAxMjM1NzFdCistIENoYW5nZSBsaWJ6ZGxsLmEgdG8gbGliei5kbGwuYSBpbiB3aW4zMi9NYWtlZmlsZS5nY2MgW2dlbnRvbyAyODgyMTJdCistIEF2b2lkIGFjY2VzcyBvZiB1bmluaXRpYWxpemVkIGRhdGEgZm9yIGZpcnN0IGluZmxhdGVSZXNldDIgY2FsbCBbR29tZXNdCistIEtlZXAgb2JqZWN0IGZpbGVzIGluIHN1YmRpcmVjdG9yaWVzIHRvIHJlZHVjZSB0aGUgY2x1dHRlciBzb21ld2hhdAorLSBSZW1vdmUgZGVmYXVsdCBNYWtlZmlsZSBhbmQgemxpYmRlZnMuaCwgYWRkIGR1bW15IE1ha2VmaWxlCistIEFkZCBuZXcgZXh0ZXJuYWwgZnVuY3Rpb25zIHRvIFpfUFJFRklYLCByZW1vdmUgZHVwbGljYXRlcywgel96XyAtPiB6XworLSBSZW1vdmUgemxpYmRlZnMuaCBjb21wbGV0ZWx5IC0tIG1vZGlmeSB6Y29uZi5oIGluc3RlYWQKKworQ2hhbmdlcyBpbiAxLjIuMy42ICgxNyBKYW4gMjAxMCkKKy0gQXZvaWQgdm9pZCAqIGFyaXRobWV0aWMgaW4gZ3pyZWFkLmMgYW5kIGd6d3JpdGUuYworLSBNYWtlIGNvbXBpbGVycyBoYXBwaWVyIHdpdGggY29uc3QgY2hhciAqIGZvciBnel9lcnJvciBtZXNzYWdlCistIEF2b2lkIHVudXNlZCBwYXJhbWV0ZXIgd2FybmluZyBpbiBpbmZsYXRlLmMKKy0gQXZvaWQgc2lnbmVkLXVuc2lnbmVkIGNvbXBhcmlzb24gd2FybmluZyBpbiBpbmZsYXRlLmMKKy0gSW5kZW50ICNwcmFnbWEncyBmb3IgdHJhZGl0aW9uYWwgQworLSBGaXggdXNhZ2Ugb2Ygc3Ryd2luZXJyb3IoKSBpbiBnbGliLmMsIGNoYW5nZSB0byBnel9zdHJ3aW5lcnJvcigpCistIENvcnJlY3QgZW1haWwgYWRkcmVzcyBpbiBjb25maWd1cmUgZm9yIHN5c3RlbSBvcHRpb25zCistIFVwZGF0ZSBtYWtlX3Ztcy5jb20gYW5kIGFkZCBtYWtlX3Ztcy5jb20gdG8gY29udHJpYi9taW5pemlwIFtaaW5zZXJdCistIFVwZGF0ZSB6bGliLm1hcCBbQnJvd25dCistIEZpeCBNYWtlZmlsZS5pbiBmb3IgU29sYXJpcyAxMCBtYWtlIG9mIGV4YW1wbGU2NCBhbmQgbWluaXppcDY0IFtUb3Jva10KKy0gQXBwbHkgdmFyaW91cyBmaXhlcyB0byBDTWFrZUxpc3RzLnR4dCBbTG93bWFuXQorLSBBZGQgY2hlY2tzIG9uIGxlbiBpbiBnenJlYWQoKSBhbmQgZ3p3cml0ZSgpCistIEFkZCBlcnJvciBtZXNzYWdlIGZvciBubyBtb3JlIHJvb20gZm9yIGd6dW5nZXRjKCkKKy0gUmVtb3ZlIHpsaWIgdmVyc2lvbiBjaGVjayBpbiBnendyaXRlKCkKKy0gRGVmZXIgY29tcHJlc3Npb24gb2YgZ3pwcmludGYoKSByZXN1bHQgdW50aWwgbmVlZCB0bworLSBVc2Ugc25wcmludGYoKSBpbiBnemRvcGVuKCkgaWYgYXZhaWxhYmxlCistIFJlbW92ZSBVU0VfTU1BUCBjb25maWd1cmF0aW9uIGRldGVybWluYXRpb24gKG9ubHkgdXNlZCBieSBtaW5pZ3ppcCkKKy0gUmVtb3ZlIGV4YW1wbGVzL3BpZ3ouYyAoYXZhaWxhYmxlIHNlcGFyYXRlbHkpCistIFVwZGF0ZSBleGFtcGxlcy9ndW4uYyB0byAxLjYKKworQ2hhbmdlcyBpbiAxLjIuMy41ICg4IEphbiAyMDEwKQorLSBBZGQgc3BhY2UgYWZ0ZXIgI2lmIGluIHp1dGlsLmggZm9yIHNvbWUgY29tcGlsZXJzCistIEZpeCByZWxhdGl2ZWx5IGhhcm1sZXNzIGJ1ZyBpbiBkZWZsYXRlX2Zhc3QoKSBbRXhhcmV2c2t5XQorLSBGaXggc2FtZSBwcm9ibGVtIGluIGRlZmxhdGVfc2xvdygpCistIEFkZCAkKFNIQVJFRExJQlYpIHRvIExJQlMgaW4gTWFrZWZpbGUuaW4gW0Jyb3duXQorLSBBZGQgZGVmbGF0ZV9ybGUoKSBmb3IgZmFzdGVyIFpfUkxFIHN0cmF0ZWd5IHJ1bi1sZW5ndGggZW5jb2RpbmcKKy0gQWRkIGRlZmxhdGVfaHVmZigpIGZvciBmYXN0ZXIgWl9IVUZGTUFOX09OTFkgZW5jb2RpbmcKKy0gQ2hhbmdlIG5hbWUgb2YgIndyaXRlIiB2YXJpYWJsZSBpbiBpbmZmYXN0LmMgdG8gYXZvaWQgbGlicmFyeSBjb2xsaXNpb25zCistIEZpeCBwcmVtYXR1cmUgRU9GIGZyb20gZ3pyZWFkKCkgaW4gZ3ppby5jIFtCcm93bl0KKy0gVXNlIHpsaWIgaGVhZGVyIHdpbmRvdyBzaXplIGlmIHdpbmRvd0JpdHMgaXMgMCBpbiBpbmZsYXRlSW5pdDIoKQorLSBSZW1vdmUgY29tcHJlc3NCb3VuZCgpIGNhbGwgaW4gZGVmbGF0ZS5jIHRvIGF2b2lkIGxpbmtpbmcgY29tcHJlc3MubworLSBSZXBsYWNlIHVzZSBvZiBlcnJubyBpbiBneiogd2l0aCBmdW5jdGlvbnMsIHN1cHBvcnQgV2luQ0UgW0FsdmVzXQorLSBQcm92aWRlIGFsdGVybmF0aXZlIHRvIHBlcnJvcigpIGluIG1pbmlnemlwLmMgZm9yIFdpbkNFIFtBbHZlc10KKy0gRG9uJ3QgdXNlIF92c25wcmludGYgb24gbGF0ZXIgdmVyc2lvbnMgb2YgTVNWQyBbTG93bWFuXQorLSBBZGQgQ01ha2UgYnVpbGQgc2NyaXB0IGFuZCBpbnB1dCBmaWxlIFtMb3dtYW5dCistIFVwZGF0ZSBjb250cmliL21pbml6aXAgdG8gMS4xIFtTdmVuc3NvbiwgVm9sbGFudF0KKy0gTW92ZWQgbmludGVuZG9kcyBkaXJlY3RvcnkgZnJvbSBjb250cmliIHRvIC4KKy0gUmVwbGFjZSBnemlvLmMgd2l0aCBhIG5ldyBzZXQgb2Ygcm91dGluZXMgd2l0aCB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5CistIEFkZCBnemJ1ZmZlcigpLCBnem9mZnNldCgpLCBnemNsb3NlX3IoKSwgZ3pjbG9zZV93KCkgYXMgcGFydCBvZiBhYm92ZQorLSBVcGRhdGUgY29udHJpYi9taW5pemlwIHRvIDEuMWIKKy0gQ2hhbmdlIGd6ZW9mKCkgdG8gcmV0dXJuIDAgb24gZXJyb3IgaW5zdGVhZCBvZiAtMSB0byBhZ3JlZSB3aXRoIHpsaWIuaAorCitDaGFuZ2VzIGluIDEuMi4zLjQgKDIxIERlYyAyMDA5KQorLSBVc2Ugb2xkIHNjaG9vbCAuU1VGRklYRVMgaW4gTWFrZWZpbGUuaW4gZm9yIEZyZWVCU0QgY29tcGF0aWJpbGl0eQorLSBVcGRhdGUgY29tbWVudHMgaW4gY29uZmlndXJlIGFuZCBNYWtlZmlsZS5pbiBmb3IgZGVmYXVsdCAtLXNoYXJlZAorLSBGaXggdGVzdCAteidzIGluIGNvbmZpZ3VyZSBbTWFycXVlc3NdCistIEJ1aWxkIGV4YW1wbGVzaCBhbmQgbWluaWd6aXBzaCB3aGVuIG5vdCB0ZXN0aW5nCistIENoYW5nZSBOVUxMJ3MgdG8gWl9OVUxMJ3MgaW4gZGVmbGF0ZS5jIGFuZCBpbiBjb21tZW50cyBpbiB6bGliLmgKKy0gSW1wb3J0IExERkxBR1MgZnJvbSB0aGUgZW52aXJvbm1lbnQgaW4gY29uZmlndXJlCistIEZpeCBjb25maWd1cmUgdG8gcG9wdWxhdGUgU0ZMQUdTIHdpdGggZGlzY292ZXJlZCBDRkxBR1Mgb3B0aW9ucworLSBBZGFwdCBtYWtlX3Ztcy5jb20gdG8gdGhlIG5ldyBNYWtlZmlsZS5pbiBbWmluc2VyXQorLSBBZGQgemxpYjJhbnNpIHNjcmlwdCBmb3IgQysrIGNvbXBpbGF0aW9uIFtNYXJxdWVzc10KKy0gQWRkIF9GSUxFX09GRlNFVF9CSVRTPTY0IHRlc3QgdG8gbWFrZSB0ZXN0ICh3aGVuIGFwcGxpY2FibGUpCistIEFkZCBBTUQ2NCBhc3NlbWJsZXIgY29kZSBmb3IgbG9uZ2VzdCBtYXRjaCB0byBjb250cmliIFtUZXRlcmluXQorLSBJbmNsdWRlIG9wdGlvbnMgZnJvbSAkU0ZMQUdTIHdoZW4gZG9pbmcgJExEU0hBUkVECistIFNpbXBsaWZ5IDY0LWJpdCBmaWxlIHN1cHBvcnQgYnkgaW50cm9kdWNpbmcgel9vZmY2NF90IHR5cGUKKy0gTWFrZSBzaGFyZWQgb2JqZWN0IGZpbGVzIGluIG9ianMgZGlyZWN0b3J5IHRvIHdvcmsgYXJvdW5kIG9sZCBTdW4gY2MKKy0gVXNlIG9ubHkgdGhyZWUtcGFydCB2ZXJzaW9uIG51bWJlciBmb3IgRGFyd2luIHNoYXJlZCBjb21waWxlcworLSBBZGQgcmMgb3B0aW9uIHRvIGFyIGluIE1ha2VmaWxlLmluIGZvciB3aGVuIC4vY29uZmlndXJlIG5vdCBydW4KKy0gQWRkIC1XSSwtcnBhdGgsLiB0byBMREZMQUdTIGZvciBPU0YgMSBWNCoKKy0gU2V0IExEX0xJQlJBUllOMzJfUEFUSCBmb3IgU0dJIElSSVggc2hhcmVkIGNvbXBpbGUKKy0gUHJvdGVjdCBhZ2FpbnN0IF9GSUxFX09GRlNFVF9CSVRTIGJlaW5nIGRlZmluZWQgd2hlbiBjb21waWxpbmcgemxpYgorLSBSZW5hbWUgTWFrZWZpbGUuaW4gdGFyZ2V0cyBhbGxzdGF0aWMgdG8gc3RhdGljIGFuZCBhbGxzaGFyZWQgdG8gc2hhcmVkCistIEZpeCBzdGF0aWMgYW5kIHNoYXJlZCBNYWtlZmlsZS5pbiB0YXJnZXRzIHRvIGJlIGluZGVwZW5kZW50CistIENvcnJlY3QgZXJyb3IgcmV0dXJuIGJ1ZyBpbiBnel9vcGVuKCkgYnkgc2V0dGluZyBzdGF0ZSBbQnJvd25dCistIFB1dCBzcGFjZXMgYmVmb3JlIDs7J3MgaW4gY29uZmlndXJlIGZvciBiZXR0ZXIgc2ggY29tcGF0aWJpbGl0eQorLSBBZGQgcGlnei5jIChwYXJhbGxlbCBpbXBsZW1lbnRhdGlvbiBvZiBnemlwKSB0byBleGFtcGxlcy8KKy0gQ29ycmVjdCBjb25zdGFudCBpbiBjcmMzMi5jIHRvIFVMIFtMZXZlbnRoYWxdCistIFJlamVjdCBuZWdhdGl2ZSBsZW5ndGhzIGluIGNyYzMyX2NvbWJpbmUoKQorLSBBZGQgaW5mbGF0ZVJlc2V0MigpIGZ1bmN0aW9uIHRvIHdvcmsgbGlrZSBpbmZsYXRlRW5kKCkvaW5mbGF0ZUluaXQyKCkKKy0gSW5jbHVkZSBzeXMvdHlwZXMuaCBmb3IgX0xBUkdFRklMRTY0X1NPVVJDRSBbQnJvd25dCistIENvcnJlY3QgdHlwbyBpbiBkb2MvYWxnb3JpdGhtLnR4dCBbSmFuaWtdCistIEZpeCBidWcgaW4gYWRsZXIzMl9jb21iaW5lKCkgW1podV0KKy0gQ2F0Y2ggbWlzc2luZy1lbmQtb2YtYmxvY2stY29kZSBlcnJvciBpbiBhbGwgaW5mbGF0ZXMgYW5kIGluIHB1ZmYKKyAgICBBc3N1cmVzIHRoYXQgcmFuZG9tIGlucHV0IHRvIGluZmxhdGUgZXZlbnR1YWxseSByZXN1bHRzIGluIGFuIGVycm9yCistIEFkZGVkIGVub3VnaC5jIChjYWxjdWxhdGlvbiBvZiBFTk9VR0ggZm9yIGluZnRyZWVzLmgpIHRvIGV4YW1wbGVzLworLSBVcGRhdGUgRU5PVUdIIGFuZCBpdHMgdXNhZ2UgdG8gcmVmbGVjdCBkaXNjb3ZlcmVkIGJvdW5kcworLSBGaXggZ3plcnJvcigpIGVycm9yIHJlcG9ydCBvbiBlbXB0eSBpbnB1dCBmaWxlIFtCcm93bl0KKy0gQWRkIHVzaCBjYXN0cyBpbiB0cmVlcy5jIHRvIGF2b2lkIHBlZGFudGljIHJ1bnRpbWUgZXJyb3JzCistIEZpeCB0eXBvIGluIHpsaWIuaCB1bmNvbXByZXNzKCkgZGVzY3JpcHRpb24gW1JlaXNzXQorLSBDb3JyZWN0IGluZmxhdGUoKSBjb21tZW50cyB3aXRoIHJlZ2FyZCB0byBhdXRvbWF0aWMgaGVhZGVyIGRldGVjdGlvbgorLSBSZW1vdmUgZGVwcmVjYXRpb24gY29tbWVudCBvbiBaX1BBUlRJQUxfRkxVU0ggKGl0IHN0YXlzKQorLSBQdXQgbmV3IHZlcnNpb24gb2YgZ3psb2cgKDIuMCkgaW4gZXhhbXBsZXMgd2l0aCBpbnRlcnJ1cHRpb24gcmVjb3ZlcnkKKy0gQWRkIHB1ZmYgY29tcGlsZSBvcHRpb24gdG8gcGVybWl0IGludmFsaWQgZGlzdGFuY2UtdG9vLWZhciBzdHJlYW1zCistIEFkZCBwdWZmIFRFU1QgY29tbWFuZCBvcHRpb25zLCBhYmlsaXR5IHRvIHJlYWQgcGlwZWQgaW5wdXQKKy0gUHJvdG90eXBlIHRoZSAqNjQgZnVuY3Rpb25zIGluIHpsaWIuaCB3aGVuIF9GSUxFX09GRlNFVF9CSVRTID09IDY0LCBidXQKKyAgX0xBUkdFRklMRTY0X1NPVVJDRSBub3QgZGVmaW5lZAorLSBGaXggWl9GVUxMX0ZMVVNIIHRvIHRydWx5IGVyYXNlIHRoZSBwYXN0IGJ5IHJlc2V0dGluZyBzLT5zdHJzdGFydAorLSBGaXggZGVmbGF0ZVNldERpY3Rpb25hcnkoKSB0byB1c2UgYWxsIDMySyBmb3Igb3V0cHV0IGNvbnNpc3RlbmN5CistIFJlbW92ZSBleHRyYW5lb3VzICNkZWZpbmUgTUlOX0xPT0tBSEVBRCBpbiBkZWZsYXRlLmMgKGluIGRlZmxhdGUuaCkKKy0gQ2xlYXIgYnl0ZXMgYWZ0ZXIgZGVmbGF0ZSBsb29rYWhlYWQgdG8gYXZvaWQgdXNlIG9mIHVuaW5pdGlhbGl6ZWQgZGF0YQorLSBDaGFuZ2UgYSBsaW1pdCBpbiBpbmZ0cmVlcy5jIHRvIGJlIG1vcmUgdHJhbnNwYXJlbnQgdG8gQ292ZXJpdHkgUHJldmVudAorLSBVcGRhdGUgd2luMzIvemxpYi5kZWYgd2l0aCBleHBvcnRlZCBzeW1ib2xzIGZyb20gemxpYi5oCistIENvcnJlY3Qgc3BlbGxpbmcgZXJyb3JzIGluIHpsaWIuaCBbV2lsbGVtLCBTb2JyYWRvXQorLSBBbGxvdyBaX0JMT0NLIGZvciBkZWZsYXRlKCkgdG8gZm9yY2UgYSBuZXcgYmxvY2sKKy0gQWxsb3cgbmVnYXRpdmUgYml0cyBpbiBpbmZsYXRlUHJpbWUoKSB0byBkZWxldGUgZXhpc3RpbmcgYml0IGJ1ZmZlcgorLSBBZGQgWl9UUkVFUyBmbHVzaCBvcHRpb24gdG8gaW5mbGF0ZSgpIHRvIHJldHVybiBhdCBlbmQgb2YgdHJlZXMKKy0gQWRkIGluZmxhdGVNYXJrKCkgdG8gcmV0dXJuIGN1cnJlbnQgc3RhdGUgaW5mb3JtYXRpb24gZm9yIHJhbmRvbSBhY2Nlc3MKKy0gQWRkIE1ha2VmaWxlIGZvciBOaW50ZW5kb0RTIHRvIGNvbnRyaWIgW0Nvc3RhXQorLSBBZGQgLXcgaW4gY29uZmlndXJlIGNvbXBpbGUgdGVzdHMgdG8gYXZvaWQgc3B1cmlvdXMgd2FybmluZ3MgW0JldWNsZXJdCistIEZpeCB0eXBvcyBpbiB6bGliLmggY29tbWVudHMgZm9yIGRlZmxhdGVTZXREaWN0aW9uYXJ5KCkKKy0gRml4IEVPRiBkZXRlY3Rpb24gaW4gdHJhbnNwYXJlbnQgZ3pyZWFkKCkgW01haWVyXQorCitDaGFuZ2VzIGluIDEuMi4zLjMgKDIgT2N0b2JlciAyMDA2KQorLSBNYWtlIC0tc2hhcmVkIHRoZSBkZWZhdWx0IGZvciBjb25maWd1cmUsIGFkZCBhIC0tc3RhdGljIG9wdGlvbgorLSBBZGQgY29tcGlsZSBvcHRpb24gdG8gcGVybWl0IGludmFsaWQgZGlzdGFuY2UtdG9vLWZhciBzdHJlYW1zCistIEFkZCBpbmZsYXRlVW5kZXJtaW5lKCkgZnVuY3Rpb24gd2hpY2ggaXMgcmVxdWlyZWQgdG8gZW5hYmxlIGFib3ZlCistIFJlbW92ZSB1c2Ugb2YgInRoaXMiIHZhcmlhYmxlIG5hbWUgZm9yIEMrKyBjb21wYXRpYmlsaXR5IFtNYXJxdWVzc10KKy0gQWRkIHRlc3Rpbmcgb2Ygc2hhcmVkIGxpYnJhcnkgaW4gbWFrZSB0ZXN0LCBpZiBzaGFyZWQgbGlicmFyeSBidWlsdAorLSBVc2UgZnRlbGxvKCkgYW5kIGZzZWVrbygpIGlmIGF2YWlsYWJsZSBpbnN0ZWFkIG9mIGZ0ZWxsKCkgYW5kIGZzZWVrKCkKKy0gUHJvdmlkZSB0d28gdmVyc2lvbnMgb2YgYWxsIGZ1bmN0aW9ucyB0aGF0IHVzZSB0aGUgel9vZmZfdCB0eXBlIGZvcgorICBiaW5hcnkgY29tcGF0aWJpbGl0eSAtLSBhIG5vcm1hbCB2ZXJzaW9uIGFuZCBhIDY0LWJpdCBvZmZzZXQgdmVyc2lvbiwKKyAgcGVyIHRoZSBMYXJnZSBGaWxlIFN1cHBvcnQgRXh0ZW5zaW9uIHdoZW4gX0xBUkdFRklMRTY0X1NPVVJDRSBpcworICBkZWZpbmVkOyB1c2UgdGhlIDY0LWJpdCB2ZXJzaW9ucyBieSBkZWZhdWx0IHdoZW4gX0ZJTEVfT0ZGU0VUX0JJVFMKKyAgaXMgZGVmaW5lZCB0byBiZSA2NAorLSBBZGQgYSAtLXVuYW1lPSBvcHRpb24gdG8gY29uZmlndXJlIHRvIHBlcmhhcHMgaGVscCB3aXRoIGNyb3NzLWNvbXBpbGluZworCitDaGFuZ2VzIGluIDEuMi4zLjIgKDMgU2VwdGVtYmVyIDIwMDYpCistIFR1cm4gb2ZmIHNpbGx5IEJvcmxhbmQgd2FybmluZ3MgW0hheV0KKy0gVXNlIG9mZjY0X3QgYW5kIGRlZmluZSBfTEFSR0VGSUxFNjRfU09VUkNFIHdoZW4gcHJlc2VudAorLSBGaXggbWlzc2luZyBkZXBlbmRlbmN5IG9uIGluZmZpeGVkLmggaW4gTWFrZWZpbGUuaW4KKy0gUmlnIGNvbmZpZ3VyZSAtLXNoYXJlZCB0byBidWlsZCBib3RoIHNoYXJlZCBhbmQgc3RhdGljIFtUZXJlZGVzYWksIFRydXRhXQorLSBSZW1vdmUgemNvbmYuaW4uaCBhbmQgaW5zdGVhZCBjcmVhdGUgYSBuZXcgemxpYmRlZnMuaCBmaWxlCistIEZpeCBjb250cmliL21pbml6aXAvdW56aXAuYyBub24tZW5jcnlwdGVkIGFmdGVyIGVuY3J5cHRlZCBbVm9sbGFudF0KKy0gQWRkIHRyZWVidWlsZC54bWwgKHNlZSBodHRwOi8vdHJlZWJ1aWxkLm1ldHV4LmRlLykgW1dlaWdlbHRdCisKK0NoYW5nZXMgaW4gMS4yLjMuMSAoMTYgQXVndXN0IDIwMDYpCistIEFkZCB3YXRjb20gZGlyZWN0b3J5IHdpdGggT3BlbldhdGNvbSBtYWtlIGZpbGVzIFtEYW5pZWxdCistIFJlbW92ZSAjdW5kZWYgb2YgRkFSIGluIHpjb25mLmluLmggZm9yIE1WUyBbRmVkdGtlXQorLSBVcGRhdGUgbWFrZV92bXMuY29tIFtaaW5zZXJdCistIFVzZSAtZlBJQyBmb3Igc2hhcmVkIGJ1aWxkIGluIGNvbmZpZ3VyZSBbVGVyZWRlc2FpLCBOaWNob2xzb25dCistIFVzZSBvbmx5IG1ham9yIHZlcnNpb24gbnVtYmVyIGZvciBsaWJ6LnNvIG9uIElSSVggYW5kIE9TRjEgW1JlaW5ob2xkdHNlbl0KKy0gVXNlIGZkb3BlbigpIChub3QgX2Zkb3BlbigpKSBmb3IgSW50ZXJpeCBpbiB6dXRpbC5oIFtCimNrXQorLSBBZGQgc29tZSBGQVEgZW50cmllcyBhYm91dCB0aGUgY29udHJpYiBkaXJlY3RvcnkKKy0gVXBkYXRlIHRoZSBNVlMgcXVlc3Rpb24gaW4gdGhlIEZBUQorLSBBdm9pZCBleHRyYW5lb3VzIHJlYWRzIGFmdGVyIEVPRiBpbiBnemlvLmMgW0Jyb3duXQorLSBDb3JyZWN0IHNwZWxsaW5nIG9mICJzdWNjZXNzZnVsbHkiIGluIGd6aW8uYyBbUmFuZGVycy1QZWhyc29uXQorLSBBZGQgY29tbWVudHMgdG8gemxpYi5oIGFib3V0IGd6ZXJyb3IoKSB1c2FnZSBbQnJvd25dCistIFNldCBleHRyYSBmbGFncyBpbiBnemlwIGhlYWRlciBpbiBnem9wZW4oKSBsaWtlIGRlZmxhdGUoKSBkb2VzCistIE1ha2UgY29uZmlndXJlIG9wdGlvbnMgbW9yZSBjb21wYXRpYmxlIHdpdGggZG91YmxlLWRhc2ggY29udmVudGlvbnMKKyAgW1dlaWdlbHRdCistIENsZWFuIHVwIGNvbXBpbGF0aW9uIHVuZGVyIFNvbGFyaXMgU3VuU3R1ZGlvIGNjIFtSb3dlLCBSZWluaG9sZHRzZW5dCistIEZpeCB1bmluc3RhbGwgdGFyZ2V0IGluIE1ha2VmaWxlLmluIFtUcnV0YV0KKy0gQWRkIHBrZ2NvbmZpZyBzdXBwb3J0IFtXZWlnZWx0XQorLSBVc2UgJChERVNURElSKSBtYWNybyBpbiBNYWtlZmlsZS5pbiBbUmVpbmhvbGR0c2VuLCBXZWlnZWx0XQorLSBSZXBsYWNlIHNldF9kYXRhX3R5cGUoKSB3aXRoIGEgbW9yZSBhY2N1cmF0ZSBkZXRlY3RfZGF0YV90eXBlKCkgaW4KKyAgdHJlZXMuYywgYWNjb3JkaW5nIHRvIHRoZSB0eHR2c2Jpbi50eHQgZG9jdW1lbnQgW1RydXRhXQorLSBTd2FwIHRoZSBvcmRlciBvZiAjaW5jbHVkZSA8c3RkaW8uaD4gYW5kICNpbmNsdWRlICJ6bGliLmgiIGluCisgIGd6aW8uYywgZXhhbXBsZS5jIGFuZCBtaW5pZ3ppcC5jIFtUcnV0YV0KKy0gU2h1dCB1cCBhbm5veWluZyBWUzIwMDUgd2FybmluZ3MgYWJvdXQgc3RhbmRhcmQgQyBkZXByZWNhdGlvbiBbUm93ZSwKKyAgVHJ1dGFdICh3aGVyZT8pCistIEZpeCB0YXJnZXQgImNsZWFuIiBmcm9tIHdpbjMyL01ha2VmaWxlLmJvciBbVHJ1dGFdCistIENyZWF0ZSAucGRiIGFuZCAubWFuaWZlc3QgZmlsZXMgaW4gd2luMzIvbWFrZWZpbGUubXNjIFtaaWVnbGVyLCBSb3dlXQorLSBVcGRhdGUgemxpYiB3d3cgaG9tZSBhZGRyZXNzIGluIHdpbjMyL0RMTF9GQVEudHh0IFtUcnV0YV0KKy0gVXBkYXRlIGNvbnRyaWIvbWFzbXg4Ni9pbmZmYXMzMi5hc20gZm9yIFZTMjAwNSBbVm9sbGFudCwgVmFuIFdhc3NlbmhvdmVdCistIEVuYWJsZSBicm93c2UgaW5mbyBpbiB0aGUgIkRlYnVnIiBhbmQgIkFTTSBEZWJ1ZyIgY29uZmlndXJhdGlvbnMgaW4KKyAgdGhlIFZpc3VhbCBDKysgNiBwcm9qZWN0LCBhbmQgc2V0IChub24tQVNNKSAiRGVidWciIGFzIGRlZmF1bHQgW1RydXRhXQorLSBBZGQgcGtnY29uZmlnIHN1cHBvcnQgW1dlaWdlbHRdCistIEFkZCBaTElCX1ZFUl9NQUpPUiwgWkxJQl9WRVJfTUlOT1IgYW5kIFpMSUJfVkVSX1JFVklTSU9OIGluIHpsaWIuaCwKKyAgZm9yIHVzZSBpbiB3aW4zMi96bGliMS5yYyBbUG9sdXNoaW4sIFJvd2UsIFRydXRhXQorLSBBZGQgYSBkb2N1bWVudCB0aGF0IGV4cGxhaW5zIHRoZSBuZXcgdGV4dCBkZXRlY3Rpb24gc2NoZW1lIHRvCisgIGRvYy90eHR2c2Jpbi50eHQgW1RydXRhXQorLSBBZGQgcmZjMTk1MC50eHQsIHJmYzE5NTEudHh0IGFuZCByZmMxOTUyLnR4dCB0byBkb2MvIFtUcnV0YV0KKy0gTW92ZSBhbGdvcml0aG0udHh0IGludG8gZG9jLyBbVHJ1dGFdCistIFN5bmNocm9uaXplIEZBUSB3aXRoIHdlYnNpdGUKKy0gRml4IGNvbXByZXNzQm91bmQoKSwgd2FzIGxvdyBmb3Igc29tZSBwYXRob2xvZ2ljYWwgY2FzZXMgW0ZlYXJubGV5XQorLSBUYWtlIGludG8gYWNjb3VudCB3cmFwcGVyIHZhcmlhdGlvbnMgaW4gZGVmbGF0ZUJvdW5kKCkKKy0gU2V0IGV4YW1wbGVzL3pwaXBlLmMgaW5wdXQgYW5kIG91dHB1dCB0byBiaW5hcnkgbW9kZSBmb3IgV2luZG93cworLSBVcGRhdGUgZXhhbXBsZXMvemxpYl9ob3cuaHRtbCB3aXRoIG5ldyB6cGlwZS5jIChhbHNvIHdlYiBzaXRlKQorLSBGaXggc29tZSB3YXJuaW5ncyBpbiBleGFtcGxlcy9nemxvZy5jIGFuZCBleGFtcGxlcy96cmFuLmMgKGl0IHNlZW1zCisgIHRoYXQgZ2NjIGJlY2FtZSBwaWNraWVyIGluIDQuMCkKKy0gQWRkIHpsaWIubWFwIGZvciBMaW51eDogIkFsbCBzeW1ib2xzIGZyb20gemxpYi0xLjEuNCByZW1haW4KKyAgdW4tdmVyc2lvbmVkLCB0aGUgcGF0Y2ggYWRkcyB2ZXJzaW9uaW5nIG9ubHkgZm9yIHN5bWJvbHMgaW50cm9kdWNlZCBpbgorICB6bGliLTEuMi4wIG9yIGxhdGVyLiAgSXQgYWxzbyBkZWNsYXJlcyBhcyBsb2NhbCB0aG9zZSBzeW1ib2xzIHdoaWNoIGFyZQorICBub3QgZGVzaWduZWQgdG8gYmUgZXhwb3J0ZWQuIiBbTGV2aW5dCistIFVwZGF0ZSBaX1BSRUZJWCBsaXN0IGluIHpjb25mLmluLmgsIGFkZCAtLXpwcmVmaXggb3B0aW9uIHRvIGNvbmZpZ3VyZQorLSBEbyBub3QgaW5pdGlhbGl6ZSBnbG9iYWwgc3RhdGljIGJ5IGRlZmF1bHQgaW4gdHJlZXMuYywgYWRkIGEgcmVzcG9uc2UKKyAgTk9fSU5JVF9HTE9CQUxfUE9JTlRFUlMgdG8gaW5pdGlhbGl6ZSB0aGVtIGlmIG5lZWRlZCBbTWFycXVlc3NdCistIERvbid0IHVzZSBzdHJlcnJvcigpIGluIGd6aW8uYyB1bmRlciBXaW5DRSBbWWFraW1vdl0KKy0gRG9uJ3QgdXNlIGVycm5vLmggaW4genV0aWwuaCB1bmRlciBXaW5DRSBbWWFraW1vdl0KKy0gTW92ZSBhcmd1bWVudHMgZm9yIEFSIHRvIGl0cyB1c2FnZSB0byBhbGxvdyByZXBsYWNpbmcgYXIgW01hcm90XQorLSBBZGQgSEFWRV9WSVNJQklMSVRZX1BSQUdNQSBpbiB6Y29uZi5pbi5oIGZvciBNb3ppbGxhIFtSYW5kZXJzLVBlaHJzb25dCistIEltcHJvdmUgaW5mbGF0ZUluaXQoKSBhbmQgaW5mbGF0ZUluaXQyKCkgZG9jdW1lbnRhdGlvbgorLSBGaXggc3RydWN0dXJlIHNpemUgY29tbWVudCBpbiBpbmZsYXRlLmgKKy0gQ2hhbmdlIGNvbmZpZ3VyZSBoZWxwIG9wdGlvbiBmcm9tIC0taCogdG8gLS1oZWxwIFtTYW50b3NdCisKK0NoYW5nZXMgaW4gMS4yLjMgKDE4IEp1bHkgMjAwNSkKKy0gQXBwbHkgc2VjdXJpdHkgdnVsbmVyYWJpbGl0eSBmaXhlcyB0byBjb250cmliL2luZmJhY2s5IGFzIHdlbGwKKy0gQ2xlYW4gdXAgc29tZSB0ZXh0IGZpbGVzIChjYXJyaWFnZSByZXR1cm5zLCB0cmFpbGluZyBzcGFjZSkKKy0gVXBkYXRlIHRlc3R6bGliLCB2c3R1ZGlvLCBtYXNteDY0LCBhbmQgbWFzbXg4NiBpbiBjb250cmliIFtWb2xsYW50XQorCitDaGFuZ2VzIGluIDEuMi4yLjQgKDExIEp1bHkgMjAwNSkKKy0gQWRkIGluZmxhdGVQcmltZSgpIGZ1bmN0aW9uIGZvciBzdGFydGluZyBpbmZsYXRpb24gYXQgYml0IGJvdW5kYXJ5CistIEF2b2lkIHNvbWUgVmlzdWFsIEMgd2FybmluZ3MgaW4gZGVmbGF0ZS5jCistIEF2b2lkIG1vcmUgc2lsbHkgVmlzdWFsIEMgd2FybmluZ3MgaW4gaW5mbGF0ZS5jIGFuZCBpbmZ0cmVlcy5jIGZvciA2NC1iaXQKKyAgY29tcGlsZQorLSBGaXggc29tZSBzcGVsbGluZyBlcnJvcnMgaW4gY29tbWVudHMgW0JldHRzXQorLSBDb3JyZWN0IGluZmxhdGVJbml0MigpIGVycm9yIHJldHVybiBkb2N1bWVudGF0aW9uIGluIHpsaWIuaAorLSBBZGQgenJhbi5jIGV4YW1wbGUgb2YgY29tcHJlc3NlZCBkYXRhIHJhbmRvbSBhY2Nlc3MgdG8gZXhhbXBsZXMKKyAgZGlyZWN0b3J5LCBzaG93cyB1c2Ugb2YgaW5mbGF0ZVByaW1lKCkKKy0gRml4IGNhc3QgZm9yIGFzc2lnbm1lbnRzIHRvIHN0cm0tPnN0YXRlIGluIGluZmxhdGUuYyBhbmQgaW5mYmFjay5jCistIEZpeCB6bGliQ29tcGlsZUZsYWdzKCkgaW4genV0aWwuYyB0byB1c2UgMUwgZm9yIGxvbmcgc2hpZnRzIFtPYmVyaHVtZXJdCistIE1vdmUgZGVjbGFyYXRpb25zIG9mIGdmMiBmdW5jdGlvbnMgdG8gcmlnaHQgcGxhY2UgaW4gY3JjMzIuYyBbT2Jlcmh1bWVyXQorLSBBZGQgY2FzdCBpbiB0cmVlcy5jIHQgYXZvaWQgYSB3YXJuaW5nIFtPYmVyaHVtZXJdCistIEF2b2lkIHNvbWUgd2FybmluZ3MgaW4gZml0YmxrLmMsIGd1bi5jLCBnempvaW4uYyBpbiBleGFtcGxlcyBbT2Jlcmh1bWVyXQorLSBVcGRhdGUgbWFrZV92bXMuY29tIFtaaW5zZXJdCistIEluaXRpYWxpemUgc3RhdGUtPndyaXRlIGluIGluZmxhdGVSZXNldCgpIHNpbmNlIGNvcGllZCBpbiBpbmZsYXRlX2Zhc3QoKQorLSBCZSBtb3JlIHN0cmljdCBvbiBpbmNvbXBsZXRlIGNvZGUgc2V0cyBpbiBpbmZsYXRlX3RhYmxlKCkgYW5kIGluY3JlYXNlCisgIEVOT1VHSCBhbmQgTUFYRCAtLSB0aGlzIHJlcGFpcnMgYSBwb3NzaWJsZSBzZWN1cml0eSB2dWxuZXJhYmlsaXR5IGZvcgorICBpbnZhbGlkIGluZmxhdGUgaW5wdXQuICBUaGFua3MgdG8gVGF2aXMgT3JtYW5keSBhbmQgTWFya3VzIE9iZXJodW1lciBmb3IKKyAgZGlzY292ZXJpbmcgdGhlIHZ1bG5lcmFiaWxpdHkgYW5kIHByb3ZpZGluZyB0ZXN0IGNhc2VzLgorLSBBZGQgaWE2NCBzdXBwb3J0IHRvIGNvbmZpZ3VyZSBmb3IgSFAtVVggW1NtaXRoXQorLSBBZGQgZXJyb3IgcmV0dXJuIHRvIGd6cmVhZCgpIGZvciBmb3JtYXQgb3IgaS9vIGVycm9yIFtMZXZpbl0KKy0gVXNlIG1hbGxvYy5oIGZvciBPUy8yIFtOZWNhc2VrXQorCitDaGFuZ2VzIGluIDEuMi4yLjMgKDI3IE1heSAyMDA1KQorLSBSZXBsYWNlIDFVIGNvbnN0YW50cyBpbiBpbmZsYXRlLmMgYW5kIGluZnRyZWVzLmMgZm9yIDY0LWJpdCBjb21waWxlCistIFR5cGVjYXN0IGZyZWFkKCkgcmV0dXJuIHZhbHVlcyBpbiBnemlvLmMgW1ZvbGxhbnRdCistIFJlbW92ZSB0cmFpbGluZyBzcGFjZSBpbiBtaW5pZ3ppcC5jIG91dG1vZGUgKFZDKysgY2FuJ3QgZGVhbCB3aXRoIGl0KQorLSBGaXggY3JjIGNoZWNrIGJ1ZyBpbiBnenJlYWQoKSBhZnRlciBnenVuZ2V0YygpIFtIZWluZXJdCistIEFkZCB0aGUgZGVmbGF0ZVR1bmUoKSBmdW5jdGlvbiB0byBhZGp1c3QgaW50ZXJuYWwgY29tcHJlc3Npb24gcGFyYW1ldGVycworLSBBZGQgYSBmYXN0IGd6aXAgZGVjb21wcmVzc29yLCBndW4uYywgdG8gZXhhbXBsZXMgKHVzZSBvZiBpbmZsYXRlQmFjaykKKy0gUmVtb3ZlIGFuIGluY29ycmVjdCBhc3NlcnRpb24gaW4gZXhhbXBsZXMvenBpcGUuYworLSBBZGQgQysrIHdyYXBwZXIgaW4gaW5mYmFjazkuaCBbRG9uYWlzXQorLSBGaXggYnVnIGluIGluZmxhdGVDb3B5KCkgd2hlbiBkZWNvZGluZyBmaXhlZCBjb2RlcworLSBOb3RlIGluIHpsaWIuaCBob3cgbXVjaCBkZWZsYXRlU2V0RGljdGlvbmFyeSgpIGFjdHVhbGx5IHVzZXMKKy0gUmVtb3ZlIFVTRV9ESUNUX0hFQUQgaW4gZGVmbGF0ZS5jICh3b3VsZCBtZXNzIHVwIGluZmxhdGUgaWYgdXNlZCkKKy0gQWRkIF9XSU4zMl9XQ0UgdG8gZGVmaW5lIFdJTjMyIGluIHpjb25mLmluLmggW1NwZW5jZXJdCistIERvbid0IGluY2x1ZGUgc3RkZXJyLmggb3IgZXJybm8uaCBmb3IgX1dJTjMyX1dDRSBpbiB6dXRpbC5oIFtTcGVuY2VyXQorLSBBZGQgZ3pkaXJlY3QoKSBmdW5jdGlvbiB0byBpbmRpY2F0ZSB0cmFuc3BhcmVudCByZWFkcworLSBVcGRhdGUgY29udHJpYi9taW5pemlwIFtWb2xsYW50XQorLSBGaXggY29tcGlsYXRpb24gb2YgZGVmbGF0ZS5jIHdoZW4gYm90aCBBU01WIGFuZCBGQVNURVNUIFtPYmVyaHVtZXJdCistIEFkZCBjYXN0cyBpbiBjcmMzMi5jIHRvIGF2b2lkIHdhcm5pbmdzIFtPYmVyaHVtZXJdCistIEFkZCBjb250cmliL21hc214NjQgW1ZvbGxhbnRdCistIFVwZGF0ZSBjb250cmliL2FzbTU4NiwgYXNtNjg2LCBtYXNteDg2LCB0ZXN0emxpYiwgdnN0dWRpbyBbVm9sbGFudF0KKworQ2hhbmdlcyBpbiAxLjIuMi4yICgzMCBEZWNlbWJlciAyMDA0KQorLSBSZXBsYWNlIHN0cnVjdHVyZSBhc3NpZ25tZW50cyBpbiBkZWZsYXRlLmMgYW5kIGluZmxhdGUuYyB3aXRoIHptZW1jcHkgdG8KKyAgYXZvaWQgaW1wbGljaXQgbWVtY3B5IGNhbGxzIChwb3J0YWJpbGl0eSBmb3Igbm8tbGlicmFyeSBjb21waWxhdGlvbikKKy0gSW5jcmVhc2Ugc3ByaW50ZigpIGJ1ZmZlciBzaXplIGluIGd6ZG9wZW4oKSB0byBhbGxvdyBmb3IgbGFyZ2UgbnVtYmVycworLSBBZGQgSU5GTEFURV9TVFJJQ1QgdG8gY2hlY2sgZGlzdGFuY2VzIGFnYWluc3QgemxpYiBoZWFkZXIKKy0gSW1wcm92ZSBXaW5DRSBlcnJubyBoYW5kbGluZyBhbmQgY29tbWVudHMgW0NoYW5nXQorLSBSZW1vdmUgY29tbWVudCBhYm91dCBubyBnemlwIGhlYWRlciBwcm9jZXNzaW5nIGluIEZBUQorLSBBZGQgWl9GSVhFRCBzdHJhdGVneSBvcHRpb24gdG8gZGVmbGF0ZUluaXQyKCkgdG8gZm9yY2UgZml4ZWQgdHJlZXMKKy0gQWRkIHVwZGF0ZWQgbWFrZV92bXMuY29tIFtDb2dobGFuXSwgdXBkYXRlIFJFQURNRQorLSBDcmVhdGUgYSBuZXcgImV4YW1wbGVzIiBkaXJlY3RvcnksIG1vdmUgZ3phcHBlbmQuYyB0aGVyZSwgYWRkIHpwaXBlLmMsCisgIGZpdGJsay5jLCBnemxvZy5bY2hdLCBnempvaW4uYywgYW5kIHpsaWJfaG93Lmh0bWwuCistIEFkZCBGQVEgZW50cnkgYW5kIGNvbW1lbnRzIGluIGRlZmxhdGUuYyBvbiB1bmluaXRpYWxpemVkIG1lbW9yeSBhY2Nlc3MKKy0gQWRkIFNvbGFyaXMgOSBtYWtlIG9wdGlvbnMgaW4gY29uZmlndXJlIFtHaWxiZXJ0XQorLSBBbGxvdyBzdHJlcnJvcigpIHVzYWdlIGluIGd6aW8uYyBmb3IgU1REQworLSBGaXggRGVjb21wcmVzc0J1ZiBpbiBjb250cmliL2RlbHBoaS9aTGliLnBhcyBbTWFuQ2hlc1Rlcl0KKy0gVXBkYXRlIGNvbnRyaWIvbWFzbXg4Ni9pbmZmYXMzMi5hc20gYW5kIGd2bWF0MzIuYXNtIFtWb2xsYW50XQorLSBVc2Ugel9vZmZfdCBmb3IgYWRsZXIzMl9jb21iaW5lKCkgYW5kIGNyYzMyX2NvbWJpbmUoKSBsZW5ndGhzCistIE1ha2UgYWRsZXIzMigpIG11Y2ggZmFzdGVyIGZvciBzbWFsbCBsZW4KKy0gVXNlIE9TX0NPREUgaW4gZGVmbGF0ZSgpIGRlZmF1bHQgZ3ppcCBoZWFkZXIKKworQ2hhbmdlcyBpbiAxLjIuMi4xICgzMSBPY3RvYmVyIDIwMDQpCistIEFsbG93IGluZmxhdGVTZXREaWN0aW9uYXJ5KCkgY2FsbCBmb3IgcmF3IGluZmxhdGUKKy0gRml4IGluZmxhdGUgaGVhZGVyIGNyYyBjaGVjayBidWcgZm9yIGZpbGUgbmFtZXMgYW5kIGNvbW1lbnRzCistIEFkZCBkZWZsYXRlU2V0SGVhZGVyKCkgYW5kIGd6X2hlYWRlciBzdHJ1Y3R1cmUgZm9yIGN1c3RvbSBnemlwIGhlYWRlcnMKKy0gQWRkIGluZmxhdGVHZXRoZWFkZXIoKSB0byByZXRyaWV2ZSBnemlwIGhlYWRlcnMKKy0gQWRkIGNyYzMyX2NvbWJpbmUoKSBhbmQgYWRsZXIzMl9jb21iaW5lKCkgZnVuY3Rpb25zCistIEFkZCBhbGxvY19mdW5jLCBmcmVlX2Z1bmMsIGluX2Z1bmMsIG91dF9mdW5jIHRvIFpfUFJFRklYIGxpc3QKKy0gVXNlIHpzdHJlYW1wIGNvbnNpc3RlbnRseSBpbiB6bGliLmggKGluZmxhdGVfYmFjayBmdW5jdGlvbnMpCistIFJlbW92ZSBHVU5aSVAgY29uZGl0aW9uIGZyb20gZGVmaW5pdGlvbiBvZiBpbmZsYXRlX21vZGUgaW4gaW5mbGF0ZS5oCisgIGFuZCBpbiBjb250cmliL2luZmxhdGU4Ni9pbmZmYXN0LlMgW1RydXRhLCBBbmRlcnNvbl0KKy0gQWRkIHN1cHBvcnQgZm9yIEFNRDY0IGluIGNvbnRyaWIvaW5mbGF0ZTg2L2luZmZhczg2LmMgW0FuZGVyc29uXQorLSBVcGRhdGUgcHJvamVjdHMvUkVBRE1FLnByb2plY3RzIGFuZCBwcm9qZWN0cy92aXN1YWxjNiBbVHJ1dGFdCistIFVwZGF0ZSB3aW4zMi9ETExfRkFRLnR4dCBbVHJ1dGFdCistIEF2b2lkIHdhcm5pbmcgdW5kZXIgTk9fR1pDT01QUkVTUyBpbiBnemlvLmM7IGZpeCB0eXBvIFtUcnV0YV0KKy0gRGVwcmVjYXRlIFpfQVNDSUk7IHVzZSBaX1RFWFQgaW5zdGVhZCBbVHJ1dGFdCistIFVzZSBhIG5ldyBhbGdvcml0aG0gZm9yIHNldHRpbmcgc3RybS0+ZGF0YV90eXBlIGluIHRyZWVzLmMgW1RydXRhXQorLSBEbyBub3QgZGVmaW5lIGFuIGV4aXQoKSBwcm90b3R5cGUgaW4genV0aWwuYyB1bmxlc3MgREVCVUcgZGVmaW5lZAorLSBSZW1vdmUgcHJvdG90eXBlIG9mIGV4aXQoKSBmcm9tIHp1dGlsLmMsIGV4YW1wbGUuYywgbWluaWd6aXAuYyBbVHJ1dGFdCistIEFkZCBjb21tZW50IGluIHpsaWIuaCBmb3IgWl9OT19GTFVTSCBwYXJhbWV0ZXIgdG8gZGVmbGF0ZSgpCistIEZpeCBEYXJ3aW4gYnVpbGQgdmVyc2lvbiBpZGVudGlmaWNhdGlvbiBbUGV0ZXJzb25dCisKK0NoYW5nZXMgaW4gMS4yLjIgKDMgT2N0b2JlciAyMDA0KQorLSBVcGRhdGUgemxpYi5oIGNvbW1lbnRzIG9uIGd6aXAgaW4tbWVtb3J5IHByb2Nlc3NpbmcKKy0gU2V0IGFkbGVyIHRvIDEgaW4gaW5mbGF0ZVJlc2V0KCkgdG8gc3VwcG9ydCBKYXZhIHRlc3Qgc3VpdGUgW1dhbGxlc10KKy0gQWRkIGNvbnRyaWIvZG90emxpYiBbUmF2bl0KKy0gVXBkYXRlIHdpbjMyL0RMTF9GQVEudHh0IFtUcnV0YV0KKy0gVXBkYXRlIGNvbnRyaWIvbWluaXppcCBbVm9sbGFudF0KKy0gTW92ZSBjb250cmliL3Zpc3VhbC1iYXNpYy50eHQgdG8gb2xkLyBbVHJ1dGFdCistIEZpeCBhc3NlbWJsZXIgYnVpbGRzIGluIHByb2plY3RzL3Zpc3VhbGM2LyBbVHJ1dGFdCisKK0NoYW5nZXMgaW4gMS4yLjEuMiAoOSBTZXB0ZW1iZXIgMjAwNCkKKy0gVXBkYXRlIElOREVYIGZpbGUKKy0gRml4IHRyZWVzLmMgdG8gdXBkYXRlIHN0cm0tPmRhdGFfdHlwZSAobm8gb25lIGV2ZXIgbm90aWNlZCEpCistIEZpeCBidWcgaW4gZXJyb3IgY2FzZSBpbiBpbmZsYXRlLmMsIGluZmJhY2suYywgYW5kIGluZmJhY2s5LmMgW0Jyb3duXQorLSBBZGQgInZvbGF0aWxlIiB0byBjcmMgdGFibGUgZmxhZyBkZWNsYXJhdGlvbiAoZm9yIERZTkFNSUNfQ1JDX1RBQkxFKQorLSBBZGQgbGltaXRlZCBtdWx0aXRhc2tpbmcgcHJvdGVjdGlvbiB0byBEWU5BTUlDX0NSQ19UQUJMRQorLSBBZGQgTk9fdnNucHJpbnRmIGZvciBWTVMgaW4genV0aWwuaCBbTW96aWxsYV0KKy0gRG9uJ3QgZGVjbGFyZSBzdHJlcnJvcigpIHVuZGVyIFZNUyBbTW96aWxsYV0KKy0gQWRkIGNvbW1lbnQgdG8gRFlOQU1JQ19DUkNfVEFCTEUgdG8gdXNlIGdldF9jcmNfdGFibGUoKSB0byBpbml0aWFsaXplCistIFVwZGF0ZSBjb250cmliL2FkYSBbQW5pc2lta292XQorLSBVcGRhdGUgY29udHJpYi9taW5pemlwIFtWb2xsYW50XQorLSBGaXggY29uZmlndXJlIHRvIG5vdCBoYXJkY29kZSBkaXJlY3RvcmllcyBmb3IgRGFyd2luIFtQZXRlcnNvbl0KKy0gRml4IGd6aW8uYyB0byBub3QgcmV0dXJuIGVycm9yIG9uIGVtcHR5IGZpbGVzIFtCcm93bl0KKy0gRml4IGluZGVudGF0aW9uOyB1cGRhdGUgdmVyc2lvbiBpbiBjb250cmliL2RlbHBoaS9aTGliLnBhcyBhbmQKKyAgY29udHJpYi9wYXNjYWwvemxpYnBhcy5wYXMgW1RydXRhXQorLSBVcGRhdGUgbWthc20uYmF0IGluIGNvbnRyaWIvbWFzbXg4NiBbVHJ1dGFdCistIFVwZGF0ZSBjb250cmliL3VudGd6IFtUcnV0YV0KKy0gQWRkIHByb2plY3RzL1JFQURNRS5wcm9qZWN0cyBbVHJ1dGFdCistIEFkZCBwcm9qZWN0IGZvciBNUyBWaXN1YWwgQysrIDYuMCBpbiBwcm9qZWN0cy92aXN1YWxjNiBbQ2FkaWV1eCwgVHJ1dGFdCistIFVwZGF0ZSB3aW4zMi9ETExfRkFRLnR4dCBbVHJ1dGFdCistIFVwZGF0ZSBsaXN0IG9mIFpfUFJFRklYIHN5bWJvbHMgaW4gemNvbmYuaCBbUmFuZGVycy1QZWhyc29uLCBUcnV0YV0KKy0gUmVtb3ZlIGFuIHVubmVjZXNzYXJ5IGFzc2lnbm1lbnQgdG8gY3VyciBpbiBpbmZ0cmVlcy5jIFtUcnV0YV0KKy0gQWRkIE9TLzIgdG8gZXhlIGJ1aWxkcyBpbiBjb25maWd1cmUgW1BvbHRvcmFrXQorLSBSZW1vdmUgZXJyIGR1bW15IHBhcmFtZXRlciBpbiB6bGliLmggW0tpZW50emxlXQorCitDaGFuZ2VzIGluIDEuMi4xLjEgKDkgSmFudWFyeSAyMDA0KQorLSBVcGRhdGUgZW1haWwgYWRkcmVzcyBpbiBSRUFETUUKKy0gU2V2ZXJhbCBGQVEgdXBkYXRlcworLSBGaXggYSBiaWcgZmF0IGJ1ZyBpbiBpbmZ0cmVlcy5jIHRoYXQgcHJldmVudGVkIGRlY29kaW5nIHZhbGlkCisgIGR5bmFtaWMgYmxvY2tzIHdpdGggb25seSBsaXRlcmFscyBhbmQgbm8gZGlzdGFuY2UgY29kZXMgLS0KKyAgVGhhbmtzIHRvICJIb3QgRW11IiBmb3IgdGhlIGJ1ZyByZXBvcnQgYW5kIHNhbXBsZSBmaWxlCistIEFkZCBhIG5vdGUgdG8gcHVmZi5jIG9uIG5vIGRpc3RhbmNlIGNvZGVzIGNhc2UuCisKK0NoYW5nZXMgaW4gMS4yLjEgKDE3IE5vdmVtYmVyIDIwMDMpCistIFJlbW92ZSBhIHRhYiBpbiBjb250cmliL2d6YXBwZW5kL2d6YXBwZW5kLmMKKy0gVXBkYXRlIHNvbWUgaW50ZXJmYWNlcyBpbiBjb250cmliIGZvciBuZXcgemxpYiBmdW5jdGlvbnMKKy0gVXBkYXRlIHpsaWIgdmVyc2lvbiBudW1iZXIgaW4gc29tZSBjb250cmliIGVudHJpZXMKKy0gQWRkIFdpbmRvd3MgQ0UgZGVmaW5pdGlvbiBmb3IgcHRyZGlmZl90IGluIHp1dGlsLmggW01haSwgVHJ1dGFdCistIFN1cHBvcnQgc2hhcmVkIGxpYnJhcmllcyBvbiBIdXJkIGFuZCBLRnJlZUJTRCBbQnJvd25dCistIEZpeCBlcnJvciBpbiBOT19ESVZJREUgb3B0aW9uIG9mIGFkbGVyMzIuYworCitDaGFuZ2VzIGluIDEuMi4wLjggKDQgTm92ZW1iZXIgMjAwMykKKy0gVXBkYXRlIHZlcnNpb24gaW4gY29udHJpYi9kZWxwaGkvWkxpYi5wYXMgYW5kIGNvbnRyaWIvcGFzY2FsL3psaWJwYXMucGFzCistIEFkZCBleHBlcmltZW50YWwgTk9fRElWSURFICNkZWZpbmUgaW4gYWRsZXIzMi5jCisgICAgLSBQb3NzaWJseSBmYXN0ZXIgb24gc29tZSBwcm9jZXNzb3JzIChsZXQgbWUga25vdyBpZiBpdCBpcykKKy0gQ29ycmVjdCBaX0JMT0NLIHRvIG5vdCByZXR1cm4gb24gZmlyc3QgaW5mbGF0ZSBjYWxsIGlmIG5vIHdyYXAKKy0gRml4IHN0cm0tPmRhdGFfdHlwZSBvbiBpbmZsYXRlKCkgcmV0dXJuIHRvIGNvcnJlY3RseSBpbmRpY2F0ZSBFT0IKKy0gQWRkIGRlZmxhdGVQcmltZSgpIGZ1bmN0aW9uIGZvciBhcHBlbmRpbmcgaW4gdGhlIG1pZGRsZSBvZiBhIGJ5dGUKKy0gQWRkIGNvbnRyaWIvZ3phcHBlbmQgZm9yIGFuIGV4YW1wbGUgb2YgYXBwZW5kaW5nIHRvIGEgc3RyZWFtCistIFVwZGF0ZSB3aW4zMi9ETExfRkFRLnR4dCBbVHJ1dGFdCistIERlbGV0ZSBUdXJibyBDIGNvbW1lbnQgaW4gUkVBRE1FIFtUcnV0YV0KKy0gSW1wcm92ZSBzb21lIGluZGVudGF0aW9uIGluIHpjb25mLmggW1RydXRhXQorLSBGaXggaW5maW5pdGUgbG9vcCBvbiBiYWQgaW5wdXQgaW4gY29uZmlndXJlIHNjcmlwdCBbQ2h1cmNoXQorLSBGaXggZ3plb2YoKSBmb3IgY29uY2F0ZW5hdGVkIGd6aXAgZmlsZXMgW0pvaG5zb25dCistIEFkZCBleGFtcGxlIHRvIGNvbnRyaWIvdmlzdWFsLWJhc2ljLnR4dCBbTWljaGFlbCBCLl0KKy0gQWRkIC1wIHRvIG1rZGlyJ3MgaW4gTWFrZWZpbGUuaW4gW3ZkYV0KKy0gRml4IGNvbmZpZ3VyZSB0byBwcm9wZXJseSBkZXRlY3QgcHJlc2VuY2Ugb3IgbGFjayBvZiBwcmludGYgZnVuY3Rpb25zCistIEFkZCBBUzQwMCBzdXBwb3J0IFtNb25uZXJhdF0KKy0gQWRkIGEgbGl0dGxlIEN5Z3dpbiBzdXBwb3J0IFtXaWxzb25dCisKK0NoYW5nZXMgaW4gMS4yLjAuNyAoMjEgU2VwdGVtYmVyIDIwMDMpCistIENvcnJlY3Qgc29tZSBkZWJ1ZyBmb3JtYXRzIGluIGNvbnRyaWIvaW5mYmFjazkKKy0gQ2FzdCBhIHR5cGUgaW4gYSBkZWJ1ZyBzdGF0ZW1lbnQgaW4gdHJlZXMuYworLSBDaGFuZ2Ugc2VhcmNoIGFuZCByZXBsYWNlIGRlbGltaXRlciBpbiBjb25maWd1cmUgZnJvbSAlIHRvICMgW0JlZWJlXQorLSBVcGRhdGUgY29udHJpYi91bnRneiB0byAwLjIgd2l0aCB2YXJpb3VzIGZpeGVzIFtUcnV0YV0KKy0gQWRkIGJ1aWxkIHN1cHBvcnQgZm9yIEFtaWdhIFtOaWtsXQorLSBSZW1vdmUgc29tZSBkaXJlY3RvcmllcyBpbiBvbGQgdGhhdCBoYXZlIGJlZW4gdXBkYXRlZCB0byAxLjIKKy0gQWRkIGR5bGliIGJ1aWxkaW5nIGZvciBNYWMgT1MgWCBpbiBjb25maWd1cmUgYW5kIE1ha2VmaWxlLmluCistIFJlbW92ZSBvbGQgZGlzdHJpYnV0aW9uIHN0dWZmIGZyb20gTWFrZWZpbGUKKy0gVXBkYXRlIFJFQURNRSB0byBwb2ludCB0byBETExfRkFRLnR4dCwgYW5kIGFkZCBjb21tZW50IG9uIE1hYyBPUyBYCistIFVwZGF0ZSBsaW5rcyBpbiBSRUFETUUKKworQ2hhbmdlcyBpbiAxLjIuMC42ICgxMyBTZXB0ZW1iZXIgMjAwMykKKy0gTWlub3IgRkFRIHVwZGF0ZXMKKy0gVXBkYXRlIGNvbnRyaWIvbWluaXppcCB0byAxLjAwIFtWb2xsYW50XQorLSBSZW1vdmUgdGVzdCBvZiBneiBmdW5jdGlvbnMgaW4gZXhhbXBsZS5jIHdoZW4gR1pfQ09NUFJFU1MgZGVmaW5lZCBbVHJ1dGFdCistIFVwZGF0ZSBQT1NUSU5DIGNvbW1lbnQgZm9yIDY4MDYwIFtOaWtsXQorLSBBZGQgY29udHJpYi9pbmZiYWNrOSB3aXRoIGRlZmxhdGU2NCBkZWNvZGluZyAodW5zdXBwb3J0ZWQpCistIEZvciBNVlMgZGVmaW5lIE5PX3ZzbnByaW50ZiBhbmQgdW5kZWZpbmUgRkFSIFt2YW4gQnVyaWtdCistIEFkZCBwcmFnbWEgZm9yIGZkb3BlbiBvbiBNVlMgW3ZhbiBCdXJpa10KKworQ2hhbmdlcyBpbiAxLjIuMC41ICg4IFNlcHRlbWJlciAyMDAzKQorLSBBZGQgT0YgdG8gaW5mbGF0ZUJhY2tFbmQoKSBkZWNsYXJhdGlvbiBpbiB6bGliLmgKKy0gUmVtZW1iZXIgc3RhcnQgd2hlbiB1c2luZyBnemRvcGVuIGluIHRoZSBtaWRkbGUgb2YgYSBmaWxlCistIFVzZSBpbnRlcm5hbCBvZmZfdCBjb3VudGVycyBpbiBneiogZnVuY3Rpb25zIHRvIHByb3Blcmx5IGhhbmRsZSBzZWVrcworLSBQZXJmb3JtIG1vcmUgcmlnb3JvdXMgY2hlY2sgZm9yIGRpc3RhbmNlLXRvby1mYXIgaW4gaW5mZmFzdC5jCistIEFkZCBaX0JMT0NLIGZsdXNoIG9wdGlvbiB0byByZXR1cm4gZnJvbSBpbmZsYXRlIGF0IGJsb2NrIGJvdW5kYXJ5CistIFNldCBzdHJtLT5kYXRhX3R5cGUgb24gcmV0dXJuIGZyb20gaW5mbGF0ZQorICAgIC0gSW5kaWNhdGUgYml0cyB1bnVzZWQsIGlmIGF0IGJsb2NrIGJvdW5kYXJ5LCBhbmQgaWYgaW4gbGFzdCBibG9jaworLSBSZXBsYWNlIHNpemVfdCB3aXRoIHB0cmRpZmZfdCBpbiBjcmMzMi5jLCBhbmQgY2hlY2sgZm9yIGNvcnJlY3Qgc2l6ZQorLSBBZGQgY29uZGl0aW9uIHNvIG9sZCBOT19ERUZMQVRFIGRlZmluZSBzdGlsbCB3b3JrcyBmb3IgY29tcGF0aWJpbGl0eQorLSBGQVEgdXBkYXRlIHJlZ2FyZGluZyB0aGUgV2luZG93cyBETEwgW1RydXRhXQorLSBJTkRFWCB1cGRhdGU6IGFkZCBxbnggZW50cnksIHJlbW92ZSBhaXggZW50cnkgW1RydXRhXQorLSBJbnN0YWxsIHpsaWIuMyBpbnRvIG1hbmRpciBbV2lsc29uXQorLSBNb3ZlIGNvbnRyaWIvemxpYl9kbGxfRkFRLnR4dCB0byB3aW4zMi9ETExfRkFRLnR4dDsgdXBkYXRlIFtUcnV0YV0KKy0gQWRhcHQgdGhlIHpsaWIgaW50ZXJmYWNlIHRvIHRoZSBuZXcgRExMIGNvbnZlbnRpb24gZ3VpZGVsaW5lcyBbVHJ1dGFdCistIEludHJvZHVjZSBaTElCX1dJTkFQSSBtYWNybyB0byBhbGxvdyB0aGUgZXhwb3J0IG9mIGZ1bmN0aW9ucyB1c2luZworICB0aGUgV0lOQVBJIGNhbGxpbmcgY29udmVudGlvbiwgZm9yIFZpc3VhbCBCYXNpYyBbVm9sbGFudCwgVHJ1dGFdCistIFVwZGF0ZSBtc2RvcyBhbmQgd2luMzIgc2NyaXB0cyBhbmQgbWFrZWZpbGVzIFtUcnV0YV0KKy0gRXhwb3J0IHN5bWJvbHMgYnkgbmFtZSwgbm90IGJ5IG9yZGluYWwsIGluIHdpbjMyL3psaWIuZGVmIFtUcnV0YV0KKy0gQWRkIGNvbnRyaWIvYWRhIFtBbmlzaW1rb3ZdCistIE1vdmUgYXNtIGZpbGVzIGZyb20gY29udHJpYi92c3R1ZGlvL3ZjNzBfMzIgdG8gY29udHJpYi9hc20zODYgW1RydXRhXQorLSBSZW5hbWUgY29udHJpYi9hc20zODYgdG8gY29udHJpYi9tYXNteDg2IFtUcnV0YSwgVm9sbGFudF0KKy0gQWRkIGNvbnRyaWIvbWFzbTY4NiBbVHJ1dGFdCistIEZpeCBvZmZzZXRzIGluIGNvbnRyaWIvaW5mbGF0ZTg2IGFuZCBjb250cmliL21hc214ODYvaW5mZmFzMzIuYXNtCisgIFtUcnV0YSwgVm9sbGFudF0KKy0gVXBkYXRlIGNvbnRyaWIvZGVscGhpOyByZW5hbWUgdG8gY29udHJpYi9wYXNjYWw7IGFkZCBleGFtcGxlIFtUcnV0YV0KKy0gUmVtb3ZlIGNvbnRyaWIvZGVscGhpMjsgYWRkIGEgbmV3IGNvbnRyaWIvZGVscGhpIFtUcnV0YV0KKy0gQXZvaWQgaW5jbHVzaW9uIG9mIHRoZSBub25zdGFuZGFyZCA8bWVtb3J5Lmg+IGluIGNvbnRyaWIvaW9zdHJlYW0sCisgIGFuZCBmaXggc29tZSBtZXRob2QgcHJvdG90eXBlcyBbVHJ1dGFdCistIEZpeCB0aGUgWkNSX1NFRUQyIGNvbnN0YW50IHRvIGF2b2lkIHdhcm5pbmdzIGluIGNvbnRyaWIvbWluaXppcAorICBbVHJ1dGFdCistIEF2b2lkIHRoZSB1c2Ugb2YgYmFja3NsYXNoIChcKSBpbiBjb250cmliL21pbml6aXAgW1ZvbGxhbnRdCistIEZpeCBmaWxlIHRpbWUgaGFuZGxpbmcgaW4gY29udHJpYi91bnRnejsgdXBkYXRlIG1ha2VmaWxlcyBbVHJ1dGFdCistIFVwZGF0ZSBjb250cmliL3ZzdHVkaW8vdmM3MF8zMiB0byBjb21wbHkgd2l0aCB0aGUgbmV3IERMTCBndWlkZWxpbmVzCisgIFtWb2xsYW50XQorLSBSZW1vdmUgY29udHJpYi92c3R1ZGlvL3ZjMTVfMTYgW1ZvbGxhbnRdCistIFJlbmFtZSBjb250cmliL3ZzdHVkaW8vdmM3MF8zMiB0byBjb250cmliL3ZzdHVkaW8vdmM3IFtUcnV0YV0KKy0gVXBkYXRlIFJFQURNRS5jb250cmliIFtUcnV0YV0KKy0gSW52ZXJ0IHRoZSBhc3NpZ25tZW50IG9yZGVyIG9mIG1hdGNoX2hlYWQgYW5kIHMtPnByZXZbLi4uXSBpbgorICBJTlNFUlRfU1RSSU5HIFtUcnV0YV0KKy0gQ29tcGFyZSBUT09fRkFSIHdpdGggMzI3NjcgaW5zdGVhZCBvZiAzMjc2OCwgdG8gYXZvaWQgMTYtYml0IHdhcm5pbmdzCisgIFtUcnV0YV0KKy0gQ29tcGFyZSBmdW5jdGlvbiBwb2ludGVycyB3aXRoIDAsIG5vdCB3aXRoIE5VTEwgb3IgWl9OVUxMIFtUcnV0YV0KKy0gRml4IHByb3RvdHlwZSBvZiBzeW5jc2VhcmNoIGluIGluZmxhdGUuYyBbVHJ1dGFdCistIEludHJvZHVjZSBBU01JTkYgbWFjcm8gdG8gYmUgZW5hYmxlZCB3aGVuIHVzaW5nIGFuIEFTTSBpbXBsZW1lbnRhdGlvbgorICBvZiBpbmZsYXRlX2Zhc3QgW1RydXRhXQorLSBDaGFuZ2UgTk9fREVGTEFURSB0byBOT19HWkNPTVBSRVNTIFtUcnV0YV0KKy0gTW9kaWZ5IHRlc3RfZ3ppbyBpbiBleGFtcGxlLmMgdG8gdGFrZSBhIHNpbmdsZSBmaWxlIG5hbWUgYXMgYQorICBwYXJhbWV0ZXIgW1RydXRhXQorLSBFeGl0IHRoZSBleGFtcGxlLmMgcHJvZ3JhbSBpZiBnem9wZW4gZmFpbHMgW1RydXRhXQorLSBBZGQgdHlwZSBjYXN0cyBhcm91bmQgc3RybGVuIGluIGV4YW1wbGUuYyBbVHJ1dGFdCistIFJlbW92ZSBjYXN0aW5nIHRvIHNpemVvZiBpbiBtaW5pZ3ppcC5jOyBnaXZlIGEgcHJvcGVyIHR5cGUKKyAgdG8gdGhlIHZhcmlhYmxlIGNvbXBhcmVkIHdpdGggU1VGRklYX0xFTiBbVHJ1dGFdCistIFVwZGF0ZSBkZWZpbml0aW9ucyBvZiBTVERDIGFuZCBTVERDOTkgaW4gemNvbmYuaCBbVHJ1dGFdCistIFN5bmNocm9uaXplIHpjb25mLmggd2l0aCB0aGUgbmV3IFdpbmRvd3MgRExMIGludGVyZmFjZSBbVHJ1dGFdCistIFVzZSBTWVMxNkJJVCBpbnN0ZWFkIG9mIF9fMzJCSVRfXyB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuCisgIDE2LSBhbmQgMzItYml0IHBsYXRmb3JtcyBbVHJ1dGFdCistIFVzZSBmYXIgbWVtb3J5IGFsbG9jYXRvcnMgaW4gc21hbGwgMTYtYml0IG1lbW9yeSBtb2RlbHMgZm9yCisgIFR1cmJvIEMgW1RydXRhXQorLSBBZGQgaW5mbyBhYm91dCB0aGUgdXNlIG9mIEFTTVYsIEFTTUlORiBhbmQgWkxJQl9XSU5BUEkgaW4KKyAgemxpYkNvbXBpbGVGbGFncyBbVHJ1dGFdCistIEN5Z3dpbiBoYXMgdnNucHJpbnRmIFtXaWxzb25dCistIEluIFdpbmRvd3MxNiwgT1NfQ09ERSBpcyAwLCBhcyBpbiBNU0RPUyBbVHJ1dGFdCistIEluIEN5Z3dpbiwgT1NfQ09ERSBpcyAzIChVbml4KSwgbm90IDExIChXaW5kb3dzMzIpIFtXaWxzb25dCisKK0NoYW5nZXMgaW4gMS4yLjAuNCAoMTAgQXVndXN0IDIwMDMpCistIE1pbm9yIEZBUSB1cGRhdGVzCistIEJlIG1vcmUgc3RyaWN0IHdoZW4gY2hlY2tpbmcgaW5mbGF0ZUluaXQyJ3Mgd2luZG93Qml0cyBwYXJhbWV0ZXIKKy0gQ2hhbmdlIE5PX0dVTlpJUCBjb21waWxlIG9wdGlvbiB0byBOT19HWklQIHRvIGNvdmVyIGRlZmxhdGUgYXMgd2VsbAorLSBBZGQgZ3ppcCB3cmFwcGVyIG9wdGlvbiB0byBkZWZsYXRlSW5pdDIgdXNpbmcgd2luZG93Qml0cworLSBBZGQgdXBkYXRlZCBRTlggcnVsZSBpbiBjb25maWd1cmUgYW5kIHFueCBkaXJlY3RvcnkgW0Jvbm5lZm95XQorLSBNYWtlIGluZmxhdGUgZGlzdGFuY2UtdG9vLWZhciBjaGVja3MgbW9yZSByaWdvcm91cworLSBDbGVhbiB1cCBGQVIgdXNhZ2UgaW4gaW5mbGF0ZQorLSBBZGQgY2FzdGluZyB0byBzaXplb2YoKSBpbiBnemlvLmMgYW5kIG1pbmlnemlwLmMKKworQ2hhbmdlcyBpbiAxLjIuMC4zICgxOSBKdWx5IDIwMDMpCistIEZpeCBzaWxseSBlcnJvciBpbiBnenVuZ2V0YygpIGltcGxlbWVudGF0aW9uIFtWb2xsYW50XQorLSBVcGRhdGUgY29udHJpYi9taW5pemlwIGFuZCBjb250cmliL3ZzdHVkaW8gW1ZvbGxhbnRdCistIEZpeCBwcmludGYgZm9ybWF0IGluIGV4YW1wbGUuYworLSBDb3JyZWN0IGNkZWNsIHN1cHBvcnQgaW4gemNvbmYuaW4uaCBbQW5pc2lta292XQorLSBNaW5vciBGQVEgdXBkYXRlcworCitDaGFuZ2VzIGluIDEuMi4wLjIgKDEzIEp1bHkgMjAwMykKKy0gQWRkIFpMSUJfVkVSTlVNIGluIHpsaWIuaCBmb3IgbnVtZXJpY2FsIHByZXByb2Nlc3NvciBjb21wYXJpc29ucworLSBBdHRlbXB0IHRvIGF2b2lkIHdhcm5pbmdzIGluIGNyYzMyLmMgZm9yIHBvaW50ZXItaW50IGNvbnZlcnNpb24KKy0gQWRkIEFJWCB0byBjb25maWd1cmUsIHJlbW92ZSBhaXggZGlyZWN0b3J5IFtCYWtrZXJdCistIEFkZCBzb21lIGNhc3RzIHRvIG1pbmlnemlwLmMKKy0gSW1wcm92ZSBjaGVja2luZyBhZnRlciBpbnNlY3VyZSBzcHJpbnRmKCkgb3IgdnNwcmludGYoKSBjYWxscworLSBSZW1vdmUgI2VsaWYncyBmcm9tIGNyYzMyLmMKKy0gQ2hhbmdlIGxlYXZlIGxhYmVsIHRvIGluZl9sZWF2ZSBpbiBpbmZsYXRlLmMgYW5kIGluZmJhY2suYyB0byBhdm9pZAorICBsaWJyYXJ5IGNvbmZsaWN0cworLSBSZW1vdmUgaW5mbGF0ZSBnemlwIGRlY29kaW5nIGJ5IGRlZmF1bHQtLW9ubHkgZW5hYmxlIGd6aXAgZGVjb2RpbmcgYnkKKyAgc3BlY2lhbCByZXF1ZXN0IGZvciBzdHJpY3RlciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5CistIEFkZCB6bGliQ29tcGlsZUZsYWdzKCkgZnVuY3Rpb24gdG8gcmV0dXJuIGNvbXBpbGF0aW9uIGluZm9ybWF0aW9uCistIE1vcmUgdHlwZWNhc3RpbmcgaW4gZGVmbGF0ZS5jIHRvIGF2b2lkIHdhcm5pbmdzCistIFJlbW92ZSBsZWFkaW5nIHVuZGVyc2NvcmUgZnJvbSBfQ2FwaXRhbCAjZGVmaW5lcyBbVHJ1dGFdCistIEZpeCBjb25maWd1cmUgdG8gbGluayBzaGFyZWQgbGlicmFyeSB3aGVuIHRlc3RpbmcKKy0gQWRkIHNvbWUgV2luZG93cyBDRSB0YXJnZXQgYWRqdXN0bWVudHMgW01haV0KKy0gUmVtb3ZlICNkZWZpbmUgWkxJQl9ETEwgaW4gemNvbmYuaCBbVm9sbGFudF0KKy0gQWRkIHpsaWIuMyBbUm9kZ2Vyc10KKy0gVXBkYXRlIFJGQyBVUkwgaW4gZGVmbGF0ZS5jIGFuZCBhbGdvcml0aG0udHh0IFtNYWldCistIEFkZCB6bGliX2RsbF9GQVEudHh0IHRvIGNvbnRyaWIgW1RydXRhXQorLSBBZGQgVUwgdG8gc29tZSBjb25zdGFudHMgW1RydXRhXQorLSBVcGRhdGUgbWluaXppcCBhbmQgdnN0dWRpbyBbVm9sbGFudF0KKy0gUmVtb3ZlIHZlc3RpZ2lhbCBORUVEX0RVTU1ZX1JFVFVSTiBmcm9tIHpjb25mLmluLmgKKy0gRXhwYW5kIHVzZSBvZiBOT19EVU1NWV9ERUNMIHRvIGF2b2lkIGFsbCBkdW1teSBzdHJ1Y3R1cmVzCistIEFkZGVkIGlvc3RyZWFtMyB0byBjb250cmliIFtTY2h3YXJkdF0KKy0gUmVwbGFjZSByZXdpbmQoKSB3aXRoIGZzZWVrKCkgZm9yIFdpbkNFIFtUcnV0YV0KKy0gSW1wcm92ZSBzZXR0aW5nIG9mIHpsaWIgZm9ybWF0IGNvbXByZXNzaW9uIGxldmVsIGZsYWdzCisgICAgLSBSZXBvcnQgMCBmb3IgaHVmZm1hbiBhbmQgcmxlIHN0cmF0ZWdpZXMgYW5kIGZvciBsZXZlbCA9PSAwIG9yIDEKKyAgICAtIFJlcG9ydCAyIG9ubHkgZm9yIGxldmVsID09IDYKKy0gT25seSBkZWFsIHdpdGggNjRLIGxpbWl0IHdoZW4gbmVjZXNzYXJ5IGF0IGNvbXBpbGUgdGltZSBbVHJ1dGFdCistIEFsbG93IFRPT19GQVIgY2hlY2sgdG8gYmUgdHVybmVkIG9mZiBhdCBjb21waWxlIHRpbWUgW1RydXRhXQorLSBBZGQgZ3pjbGVhcmVycigpIGZ1bmN0aW9uIFtTb3V6YV0KKy0gQWRkIGd6dW5nZXRjKCkgZnVuY3Rpb24KKworQ2hhbmdlcyBpbiAxLjIuMC4xICgxNyBNYXJjaCAyMDAzKQorLSBBZGQgWl9STEUgc3RyYXRlZ3kgZm9yIHJ1bi1sZW5ndGggZW5jb2RpbmcgW1RydXRhXQorICAgIC0gV2hlbiBaX1JMRSByZXF1ZXN0ZWQsIHJlc3RyaWN0IG1hdGNoZXMgdG8gZGlzdGFuY2Ugb25lCisgICAgLSBVcGRhdGUgemxpYi5oLCBtaW5pZ3ppcC5jLCBnem9wZW4oKSwgZ3pkb3BlbigpIGZvciBaX1JMRQorLSBDb3JyZWN0IEZBU1RFU1QgY29tcGlsYXRpb24gdG8gYWxsb3cgbGV2ZWwgPT0gMAorLSBDbGVhbiB1cCB3aGF0IGdldHMgY29tcGlsZWQgZm9yIEZBU1RFU1QKKy0gSW5jb3Jwb3JhdGUgY2hhbmdlcyB0byB6Y29uZi5pbi5oIFtWb2xsYW50XQorICAgIC0gUmVmaW5lIGRldGVjdGlvbiBvZiBUdXJibyBDIG5lZWQgZm9yIGR1bW15IHJldHVybnMKKyAgICAtIFJlZmluZSBaTElCX0RMTCBjb21waWxhdGlvbgorICAgIC0gSW5jbHVkZSBhZGRpdGlvbmFsIGhlYWRlciBmaWxlIG9uIFZNUyBmb3Igb2ZmX3QgdHlwZWRlZgorLSBUcnkgdG8gdXNlIF92c25wcmludGYgd2hlcmUgaXQgc3VwcGxhbnRzIHZzcHJpbnRmIFtWb2xsYW50XQorLSBBZGQgc29tZSBjYXN0cyBpbiBpbmZmYXN0LmMKKy0gRW5jaGFuY2UgY29tbWVudHMgaW4gemxpYi5oIG9uIHdoYXQgaGFwcGVucyBpZiBnenByaW50ZigpIHRyaWVzIHRvCisgIHdyaXRlIG1vcmUgdGhhbiA0MDk1IGJ5dGVzIGJlZm9yZSBjb21wcmVzc2lvbgorLSBSZW1vdmUgdW51c2VkIHN0YXRlIGZyb20gaW5mbGF0ZUJhY2tFbmQoKQorLSBSZW1vdmUgZXhpdCgwKSBmcm9tIG1pbmlnemlwLmMsIGV4YW1wbGUuYworLSBHZXQgcmlkIG9mIGFsbCB0aG9zZSBkYXJuIHRhYnMKKy0gQWRkICJjaGVjayIgdGFyZ2V0IHRvIE1ha2VmaWxlLmluIHRoYXQgZG9lcyB0aGUgc2FtZSB0aGluZyBhcyAidGVzdCIKKy0gQWRkICJtb3N0bHljbGVhbiIgYW5kICJtYWludGFpbmVyLWNsZWFuIiB0YXJnZXRzIHRvIE1ha2VmaWxlLmluCistIFVwZGF0ZSBjb250cmliL2luZmxhdGU4NiBbQW5kZXJzb25dCistIFVwZGF0ZSBjb250cmliL3Rlc3R6bGliLCBjb250cmliL3ZzdHVkaW8sIGNvbnRyaWIvbWluaXppcCBbVm9sbGFudF0KKy0gQWRkIG1zZG9zIGFuZCB3aW4zMiBkaXJlY3RvcmllcyB3aXRoIG1ha2VmaWxlcyBbVHJ1dGFdCistIE1vcmUgYWRkaXRpb25zIGFuZCBpbXByb3ZlbWVudHMgdG8gdGhlIEZBUQorCitDaGFuZ2VzIGluIDEuMi4wICg5IE1hcmNoIDIwMDMpCistIE5ldyBhbmQgaW1wcm92ZWQgaW5mbGF0ZSBjb2RlCisgICAgLSBBYm91dCAyMCUgZmFzdGVyCisgICAgLSBEb2VzIG5vdCBhbGxvY2F0ZSAzMksgd2luZG93IHVubGVzcyBhbmQgdW50aWwgbmVlZGVkCisgICAgLSBBdXRvbWF0aWNhbGx5IGRldGVjdHMgYW5kIGRlY29tcHJlc3NlcyBnemlwIHN0cmVhbXMKKyAgICAtIFJhdyBpbmZsYXRlIG5vIGxvbmdlciBuZWVkcyBhbiBleHRyYSBkdW1teSBieXRlIGF0IGVuZAorICAgIC0gQWRkZWQgaW5mbGF0ZUJhY2sgZnVuY3Rpb25zIHVzaW5nIGEgY2FsbGJhY2sgaW50ZXJmYWNlLS1ldmVuIGZhc3RlcgorICAgICAgdGhhbiBpbmZsYXRlLCB1c2VmdWwgZm9yIGZpbGUgdXRpbGl0aWVzIChnemlwLCB6aXApCisgICAgLSBBZGRlZCBpbmZsYXRlQ29weSgpIGZ1bmN0aW9uIHRvIHJlY29yZCBzdGF0ZSBmb3IgcmFuZG9tIGFjY2VzcyBvbgorICAgICAgZXh0ZXJuYWxseSBnZW5lcmF0ZWQgZGVmbGF0ZSBzdHJlYW1zIChlLmcuIGluIGd6aXAgZmlsZXMpCisgICAgLSBNb3JlIHJlYWRhYmxlIGNvZGUgKEkgaG9wZSkKKy0gTmV3IGFuZCBpbXByb3ZlZCBjcmMzMigpCisgICAgLSBBYm91dCA1MCUgZmFzdGVyLCB0aGFua3MgdG8gc3VnZ2VzdGlvbnMgZnJvbSBSb2RuZXkgQnJvd24KKy0gQWRkIGRlZmxhdGVCb3VuZCgpIGFuZCBjb21wcmVzc0JvdW5kKCkgZnVuY3Rpb25zCistIEZpeCBtZW1vcnkgbGVhayBpbiBkZWZsYXRlSW5pdDIoKQorLSBQZXJtaXQgc2V0dGluZyBkaWN0aW9uYXJ5IGZvciByYXcgZGVmbGF0ZSAoZm9yIHBhcmFsbGVsIGRlZmxhdGUpCistIEZpeCBjb25zdCBkZWNsYXJhdGlvbiBmb3IgZ3p3cml0ZSgpCistIENoZWNrIGZvciBzb21lIG1hbGxvYygpIGZhaWx1cmVzIGluIGd6aW8uYworLSBGaXggYnVnIGluIGd6b3BlbigpIG9uIHNpbmdsZS1ieXRlIGZpbGUgMHgxZgorLSBGaXggYnVnIGluIGd6cmVhZCgpIG9uIGNvbmNhdGVuYXRlZCBmaWxlIHdpdGggMHgxZiBhdCBlbmQgb2YgYnVmZmVyCisgIGFuZCBuZXh0IGJ1ZmZlciBkb2Vzbid0IHN0YXJ0IHdpdGggMHg4YgorLSBGaXggdW5jb21wcmVzcygpIHRvIHJldHVybiBaX0RBVEFfRVJST1Igb24gdHJ1bmNhdGVkIGlucHV0CistIEZyZWUgbWVtb3J5IGF0IGVuZCBvZiBleGFtcGxlLmMKKy0gUmVtb3ZlIE1BWCAjZGVmaW5lIGluIHRyZWVzLmMgKGNvbmZsaWN0ZWQgd2l0aCBzb21lIGxpYnJhcmllcykKKy0gRml4IHN0YXRpYyBjb25zdCdzIGluIGRlZmxhdGUuYywgZ3ppby5jLCBhbmQgenV0aWwuW2NoXQorLSBEZWNsYXJlIG1hbGxvYygpIGFuZCBmcmVlKCkgaW4gZ3ppby5jIGlmIFNUREMgbm90IGRlZmluZWQKKy0gVXNlIG1hbGxvYygpIGluc3RlYWQgb2YgY2FsbG9jKCkgaW4genV0aWwuYyBpZiBpbnQgYmlnIGVub3VnaAorLSBEZWZpbmUgU1REQyBmb3IgQUlYCistIEFkZCBhaXgvIHdpdGggYXBwcm9hY2ggZm9yIGNvbXBpbGluZyBzaGFyZWQgbGlicmFyeSBvbiBBSVgKKy0gQWRkIEhQLVVYIHN1cHBvcnQgZm9yIHNoYXJlZCBsaWJyYXJpZXMgaW4gY29uZmlndXJlCistIEFkZCBPcGVuVU5JWCBzdXBwb3J0IGZvciBzaGFyZWQgbGlicmFyaWVzIGluIGNvbmZpZ3VyZQorLSBVc2UgJGNjIGluc3RlYWQgb2YgZ2NjIHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJ5CistIE1ha2UgcHJlZml4IGRpcmVjdG9yeSBpZiBuZWVkZWQgd2hlbiBpbnN0YWxsaW5nCistIENvcnJlY3QgTWFjaW50b3NoIGF2b2lkYW5jZSBvZiB0eXBlZGVmIEJ5dGUgaW4gemNvbmYuaAorLSBDb3JyZWN0IFR1cmJvIEMgbWVtb3J5IGFsbG9jYXRpb24gd2hlbiB1bmRlciBMaW51eAorLSBVc2UgbGliei5hIGluc3RlYWQgb2YgLWx6IGluIE1ha2VmaWxlIChhc3N1cmUgdXNlIG9mIGNvbXBpbGVkIGxpYnJhcnkpCistIFVwZGF0ZSBjb25maWd1cmUgdG8gY2hlY2sgZm9yIHNucHJpbnRmIG9yIHZzbnByaW50ZiBmdW5jdGlvbnMgYW5kIHRoZWlyCisgIHJldHVybiB2YWx1ZSwgd2FybiBkdXJpbmcgbWFrZSBpZiB1c2luZyBhbiBpbnNlY3VyZSBmdW5jdGlvbgorLSBGaXggY29uZmlndXJlIHByb2JsZW0gd2l0aCBjb21waWxlLXRpbWUga25vd2xlZGdlIG9mIEhBVkVfVU5JU1REX0ggdGhhdAorICBpcyBsb3N0IHdoZW4gbGlicmFyeSBpcyB1c2VkLS1yZXNvbHV0aW9uIGlzIHRvIGJ1aWxkIG5ldyB6Y29uZi5oCistIERvY3VtZW50YXRpb24gaW1wcm92ZW1lbnRzIChpbiB6bGliLmgpOgorICAgIC0gRG9jdW1lbnQgcmF3IGRlZmxhdGUgYW5kIGluZmxhdGUKKyAgICAtIFVwZGF0ZSBSRkNzIFVSTAorICAgIC0gUG9pbnQgb3V0IHRoYXQgemxpYiBhbmQgZ3ppcCBmb3JtYXRzIGFyZSBkaWZmZXJlbnQKKyAgICAtIE5vdGUgdGhhdCBaX0JVRl9FUlJPUiBpcyBub3QgZmF0YWwKKyAgICAtIERvY3VtZW50IHN0cmluZyBsaW1pdCBmb3IgZ3pwcmludGYoKSBhbmQgcG9zc2libGUgYnVmZmVyIG92ZXJmbG93CisgICAgLSBOb3RlIHJlcXVpcmVtZW50IG9uIGF2YWlsX291dCB3aGVuIGZsdXNoaW5nCisgICAgLSBOb3RlIHBlcm1pdHRlZCB2YWx1ZXMgb2YgZmx1c2ggcGFyYW1ldGVyIG9mIGluZmxhdGUoKQorLSBBZGQgc29tZSBGQVFzIChhbmQgZXZlbiBhbnN3ZXJzKSB0byB0aGUgRkFRCistIEFkZCBjb250cmliL2luZmxhdGU4Ni8gZm9yIHg4NiBmYXN0ZXIgaW5mbGF0ZQorLSBBZGQgY29udHJpYi9ibGFzdC8gZm9yIFBLV2FyZSBEYXRhIENvbXByZXNzaW9uIExpYnJhcnkgZGVjb21wcmVzc2lvbgorLSBBZGQgY29udHJpYi9wdWZmLyBzaW1wbGUgaW5mbGF0ZSBmb3IgZGVmbGF0ZSBmb3JtYXQgZGVzY3JpcHRpb24KKworQ2hhbmdlcyBpbiAxLjEuNCAoMTEgTWFyY2ggMjAwMikKKy0gWkZSRUUgd2FzIHJlcGVhdGVkIG9uIHNhbWUgYWxsb2NhdGlvbiBvbiBzb21lIGVycm9yIGNvbmRpdGlvbnMuCisgIFRoaXMgY3JlYXRlcyBhIHNlY3VyaXR5IHByb2JsZW0gZGVzY3JpYmVkIGluCisgIGh0dHA6Ly93d3cuemxpYi5vcmcvYWR2aXNvcnktMjAwMi0wMy0xMS50eHQKKy0gUmV0dXJuZWQgaW5jb3JyZWN0IGVycm9yIChaX01FTV9FUlJPUikgb24gc29tZSBpbnZhbGlkIGRhdGEKKy0gQXZvaWQgYWNjZXNzZXMgYmVmb3JlIHdpbmRvdyBmb3IgaW52YWxpZCBkaXN0YW5jZXMgd2l0aCBpbmZsYXRlIHdpbmRvdworICBsZXNzIHRoYW4gMzJLLgorLSBmb3JjZSB3aW5kb3dCaXRzID4gOCB0byBhdm9pZCBhIGJ1ZyBpbiB0aGUgZW5jb2RlciBmb3IgYSB3aW5kb3cgc2l6ZQorICBvZiAyNTYgYnl0ZXMuIChBIGNvbXBsZXRlIGZpeCB3aWxsIGJlIGF2YWlsYWJsZSBpbiAxLjEuNSkuCisKK0NoYW5nZXMgaW4gMS4xLjMgKDkgSnVseSAxOTk4KQorLSBmaXggImFuIGluZmxhdGUgaW5wdXQgYnVmZmVyIGJ1ZyB0aGF0IHNob3dzIHVwIG9uIHJhcmUgYnV0IHBlcnNpc3RlbnQKKyAgb2NjYXNpb25zIiAoTWFyaykKKy0gZml4IGd6cmVhZCBhbmQgZ3p0ZWxsIGZvciBjb25jYXRlbmF0ZWQgLmd6IGZpbGVzIChEaWRpZXIgTGUgQm90bGFuKQorLSBmaXggZ3pzZWVrKC4uLiwgU0VFS19TRVQpIGluIHdyaXRlIG1vZGUKKy0gZml4IGNyYyBjaGVjayBhZnRlciBhIGd6ZWVrIChGcmFuayBGYXViZXJ0KQorLSBmaXggbWluaXVuemlwIHdoZW4gdGhlIGxhc3QgZW50cnkgaW4gYSB6aXAgZmlsZSBpcyBpdHNlbGYgYSB6aXAgZmlsZQorICAoSiBMaWxsZ2UpCistIGFkZCBjb250cmliL2FzbTU4NiBhbmQgY29udHJpYi9hc202ODYgKEJyaWFuIFJhaXRlcikKKyAgU2VlIGh0dHA6Ly93d3cubXVwcGV0bGFicy5jb20vfmJyZWFkYm94L3NvZnR3YXJlL2Fzc2VtYmx5Lmh0bWwKKy0gYWRkIHN1cHBvcnQgZm9yIERlbHBoaSAzIGluIGNvbnRyaWIvZGVscGhpIChCb2IgRGVsbGFjYSkKKy0gYWRkIHN1cHBvcnQgZm9yIEMrK0J1aWxkZXIgMyBhbmQgRGVscGhpIDMgaW4gY29udHJpYi9kZWxwaGkyIChEYXZpZGUgTW9yZXR0aSkKKy0gZG8gbm90IGV4aXQgcHJlbWF0dXJlbHkgaW4gdW50Z3ogaWYgMCBhdCBzdGFydCBvZiBibG9jayAoTWFnbnVzIEhvbG1ncmVuKQorLSB1c2UgbWFjcm8gRVhURVJOIGluc3RlYWQgb2YgZXh0ZXJuIHRvIHN1cHBvcnQgRExMIGZvciBCZU9TIChTYW5kZXIgU3Rva3MpCistIGFkZGVkIGEgRkFRIGZpbGUKKworLSBTdXBwb3J0IGd6ZG9wZW4gb24gTWFjIHdpdGggTWV0cm93ZXJrcyAoSmFzb24gTGluaGFydCkKKy0gRG8gbm90IHJlZGVmaW5lIEJ5dGUgb24gTWFjIChCcmFkIFBldHRpdCAmIEphc29uIExpbmhhcnQpCistIGRlZmluZSBTRUVLX0VORCB0b28gaWYgU0VFS19TRVQgaXMgbm90IGRlZmluZWQgKEFsYmVydCBDaGluLUEtWW91bmcpCistIGF2b2lkIHNvbWUgd2FybmluZ3Mgd2l0aCBCb3JsYW5kIEMgKFRvbSBUYW5uZXIpCistIGZpeCBhIHByb2JsZW0gaW4gY29udHJpYi9taW5pemlwL3ppcC5jIGZvciAxNi1iaXQgTVNET1MgKEdpbGxlcyBWb2xsYW50KQorLSBlbXVsYXRlIHV0aW1lKCkgZm9yIFdJTjMyIGluIGNvbnRyaWIvdW50Z3ogIChHaWxsZXMgVm9sbGFudCkKKy0gYWxsb3cgc2V2ZXJhbCBhcmd1bWVudHMgdG8gY29uZmlndXJlIChUaW0gTW9vbmV5LCBGcm9kbyBMb29pamFhcmQpCistIHVzZSBsaWJkaXIgYW5kIGluY2x1ZGVkaXIgaW4gTWFrZWZpbGUuaW4gKFRpbSBNb29uZXkpCistIHN1cHBvcnQgc2hhcmVkIGxpYnJhcmllcyBvbiBPU0YxIFY0IChUaW0gTW9vbmV5KQorLSByZW1vdmUgc29fbG9jYXRpb25zIGluICJtYWtlIGNsZWFuIiAgKFRpbSBNb29uZXkpCistIGZpeCBtYWtldHJlZS5jIGNvbXBpbGF0aW9uIGVycm9yIChHbGVubiwgTWFyaykKKy0gUHl0aG9uIGludGVyZmFjZSB0byB6bGliIG5vdyBpbiBQeXRob24gMS41IChKZXJlbXkgSHlsdG9uKQorLSBuZXcgTWFrZWZpbGUucmlzY29zIChSaWNoIFdhbGtlcikKKy0gaW5pdGlhbGl6ZSBzdGF0aWMgZGVzY3JpcHRvcnMgaW4gdHJlZXMuYyBmb3IgZW1iZWRkZWQgdGFyZ2V0cyAoTmljayBTbWl0aCkKKy0gdXNlICJmb28tZ3oiIGluIGV4YW1wbGUuYyBmb3IgUklTQ09TIGFuZCBWTVMgKE5pY2sgU21pdGgpCistIGFkZCB0aGUgT1MvMiBmaWxlcyBpbiBNYWtlZmlsZS5pbiB0b28gKEFuZHJldyBaYWJvbG90bnkpCistIGZpeCBmZG9wZW4gYW5kIGhhbGxvYyBtYWNyb3MgZm9yIE1pY3Jvc29mdCBDIDYuMCAoVG9tIExhbmUpCistIGZpeCBtYWtldHJlZS5jIHRvIGFsbG93IGNsZWFuIGNvbXBpbGF0aW9uIG9mIGluZmZpeGVkLmggKE1hcmspCistIGZpeCBwYXJhbWV0ZXIgY2hlY2sgaW4gZGVmbGF0ZUNvcHkgKEd1bnRoZXIgTmlrbCkKKy0gY2xlYW51cCB0cmVlcy5jLCB1c2UgY29tcHJlc3NlZF9sZW4gb25seSBpbiBkZWJ1ZyBtb2RlIChDaHJpc3RpYW4gU3BpZWxlcikKKy0gTWFueSBwb3J0YWJpbGl0eSBwYXRjaGVzIGJ5IENocmlzdGlhbiBTcGllbGVyOgorICAuIHp1dGlsLmMsIHp1dGlsLmg6IGFkZGVkICJjb25zdCIgZm9yIHptZW0qCisgIC4gTWFrZV92bXMuY29tOiBmaXhlZCBzb21lIHR5cG9zCisgIC4gTWFrZV92bXMuY29tOiBtc2Rvcy9NYWtlZmlsZS4qOiByZW1vdmVkIHp1dGlsLmggZnJvbSBzb21lIGRlcGVuZGVuY3kgbGlzdHMKKyAgLiBtc2Rvcy9NYWtlZmlsZS5tc2M6IHJlbW92ZSAiZGVmYXVsdCBydGwgbGluayBsaWJyYXJ5IiBpbmZvIGZyb20gb2JqIGZpbGVzCisgIC4gbXNkb3MvTWFrZWZpbGUuKjogdXNlIG1vZGVsLWRlcGVuZGVudCBuYW1lIGZvciB0aGUgYnVpbHQgemxpYiBsaWJyYXJ5CisgIC4gbXNkb3MvTWFrZWZpbGUuZW14LCBudC9NYWtlZmlsZS5lbXgsIG50L01ha2VmaWxlLmdjYzoKKyAgICAgbmV3IG1ha2VmaWxlcywgZm9yIGVteCAoRE9TL09TMiksIGVteCZyc3hudCBhbmQgbWluZ3czMiAoV2luZG93cyA5eCAvIE5UKQorLSB1c2UgZGVmaW5lIGluc3RlYWQgb2YgdHlwZWRlZiBmb3IgQnl0ZWYgYWxzbyBmb3IgTVNDIHNtYWxsL21lZGl1bSAoVG9tIExhbmUpCistIHJlcGxhY2UgX19mYXIgd2l0aCBfZmFyIGZvciBiZXR0ZXIgcG9ydGFiaWxpdHkgKENocmlzdGlhbiBTcGllbGVyLCBUb20gTGFuZSkKKy0gZml4IHRlc3QgZm9yIGVycm5vLmggaW4gY29uZmlndXJlIChUaW0gTmV3c2hhbSkKKworQ2hhbmdlcyBpbiAxLjEuMiAoMTkgTWFyY2ggOTgpCistIGFkZGVkIGNvbnRyaWIvbWluemlwLCBtaW5pIHppcCBhbmQgdW56aXAgYmFzZWQgb24gemxpYiAoR2lsbGVzIFZvbGxhbnQpCisgIFNlZSBodHRwOi8vd3d3LndpbmltYWdlLmNvbS96TGliRGxsL3VuemlwLmh0bWwKKy0gcHJlaW5pdGlhbGl6ZSB0aGUgaW5mbGF0ZSB0YWJsZXMgZm9yIGZpeGVkIGNvZGVzLCB0byBtYWtlIHRoZSBjb2RlCisgIGNvbXBsZXRlbHkgdGhyZWFkIHNhZmUgKE1hcmspCistIHNvbWUgc2ltcGxpZmljYXRpb25zIGFuZCBzbGlnaHQgc3BlZWQtdXAgdG8gdGhlIGluZmxhdGUgY29kZSAoTWFyaykKKy0gZml4IGd6ZW9mIG9uIG5vbi1jb21wcmVzc2VkIGZpbGVzIChBbGxhbiBTY2hydW0pCistIGFkZCAtc3RkMSBvcHRpb24gaW4gY29uZmlndXJlIGZvciBPU0YxIHRvIGZpeCBnenByaW50ZiAoTWFydGluIE1va3JlanMpCistIHVzZSBkZWZhdWx0IHZhbHVlIG9mIDRLIGZvciBaX0JVRlNJWkUgZm9yIDE2LWJpdCBNU0RPUyAoVGltIFdlZ25lciArIEdsZW5uKQorLSBhZGRlZCBvczIvTWFrZWZpbGUuZGVmIGFuZCBvczIvemxpYi5kZWYgKEFuZHJldyBaYWJvbG90bnkpCistIGFkZCBzaGFyZWQgbGliIHN1cHBvcnQgZm9yIFVOSVhfU1Y0LjJNUCAoTUFUU1VVUkEgVGFrYW5vcmkpCistIGRvIG5vdCB3cmFwIGV4dGVybiAiQyIgYXJvdW5kIHN5c3RlbSBpbmNsdWRlcyAoVG9tIExhbmUpCistIG1lbnRpb24gemxpYiBiaW5kaW5nIGZvciBUQ0wgaW4gUkVBRE1FIChBbmRyZWFzIEt1cHJpZXMpCistIGFkZGVkIGFtaWdhL01ha2VmaWxlLnB1cCBmb3IgQW1pZ2EgcG93ZXJVUCBTQVMvQyBQUEMgKEFuZHJlYXMgS2xlaW5lcnQpCistIGFsbG93ICJtYWtlIGluc3RhbGwgcHJlZml4PS4uLiIgZXZlbiBhZnRlciBjb25maWd1cmUgKEdsZW5uIFJhbmRlcnMtUGVocnNvbikKKy0gYWxsb3cgImNvbmZpZ3VyZSAtLXByZWZpeCAkSE9NRSIgKFRpbSBNb29uZXkpCistIHJlbW92ZSB3YXJuaW5ncyBpbiBleGFtcGxlLmMgYW5kIGd6aW8uYyAoR2xlbm4gUmFuZGVycy1QZWhyc29uKQorLSBtb3ZlIE1ha2VmaWxlLnNhcyB0byBhbWlnYS9NYWtlZmlsZS5zYXMKKworQ2hhbmdlcyBpbiAxLjEuMSAoMjcgRmViIDk4KQorLSBmaXggbWFjcm9zIF90cl90YWxseV8qIGluIGRlZmxhdGUuaCBmb3IgZGVidWcgbW9kZSAgKEdsZW5uIFJhbmRlcnMtUGVocnNvbikKKy0gcmVtb3ZlIGJsb2NrIHRydW5jYXRpb24gaGV1cmlzdGljIHdoaWNoIGhhZCB2ZXJ5IG1hcmdpbmFsIGVmZmVjdCBmb3IgemxpYgorICAoc21hbGxlciBsaXRfYnVmc2l6ZSB0aGFuIGluIGd6aXAgMS4yLjQpIGFuZCBkZWdyYWRlZCBhIGxpdHRsZSB0aGUKKyAgY29tcHJlc3Npb24gcmF0aW8gb24gc29tZSBmaWxlcy4gVGhpcyBhbHNvIGFsbG93cyBpbmxpbmluZyBfdHJfdGFsbHkgZm9yCisgIG1hdGNoZXMgaW4gZGVmbGF0ZV9zbG93LgorLSBhZGRlZCBtc2Rvcy9NYWtlZmlsZS53MzIgZm9yIFdJTjMyIE1pY3Jvc29mdCBWaXN1YWwgQysrIChCb2IgRnJhemllcikKKworQ2hhbmdlcyBpbiAxLjEuMCAoMjQgRmViIDk4KQorLSBkbyBub3QgcmV0dXJuIFNUUkVBTV9FTkQgcHJlbWF0dXJlbHkgaW4gaW5mbGF0ZSAoSm9obiBCb3dsZXIpCistIHJldmVydCB0byB0aGUgemxpYiAxLjAuOCBpbmZsYXRlIHRvIGF2b2lkIHRoZSBnY2MgMi44LjAgYnVnIChKZXJlbXkgQnVobGVyKQorLSBjb21waWxlIHdpdGggLURGQVNURVNUIHRvIGdldCBjb21wcmVzc2lvbiBjb2RlIG9wdGltaXplZCBmb3Igc3BlZWQgb25seQorLSBpbiBtaW5pZ3ppcCwgdHJ5IG1tYXAnaW5nIHRoZSBpbnB1dCBmaWxlIGZpcnN0IChNaWd1ZWwgQWxicmVjaHQpCistIGluY3JlYXNlIHNpemUgb2YgSS9PIGJ1ZmZlcnMgaW4gbWluaWd6aXAuYyBhbmQgZ3ppby5jIChub3QgYSBiaWcgZ2FpbgorICBvbiBTdW4gYnV0IHNpZ25pZmljYW50IG9uIEhQKQorCistIGFkZCBhIHBvaW50ZXIgdG8gZXhwZXJpbWVudGFsIHVuemlwIGxpYnJhcnkgaW4gUkVBRE1FIChHaWxsZXMgVm9sbGFudCkKKy0gaW5pdGlhbGl6ZSB2YXJpYWJsZSBnY2MgaW4gY29uZmlndXJlIChDaHJpcyBIZXJib3J0aCkKKworQ2hhbmdlcyBpbiAxLjAuOSAoMTcgRmViIDE5OTgpCistIGFkZGVkIGd6cHV0cyBhbmQgZ3pnZXRzIGZ1bmN0aW9ucworLSBkbyBub3QgY2xlYXIgZW9mIGZsYWcgaW4gZ3pzZWVrIChNYXJrIERpZWtoYW5zKQorLSBmaXggZ3pzZWVrIGZvciBmaWxlcyBpbiB0cmFuc3BhcmVudCBtb2RlIChNYXJrIERpZWtoYW5zKQorLSBkbyBub3QgYXNzdW1lIHRoYXQgdnNwcmludGYgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gKEplbnMgS3JpbmtlKQorLSByZXBsYWNlIEVYUE9SVCB3aXRoIFpFWFBPUlQgdG8gYXZvaWQgY29uZmxpY3Qgd2l0aCBvdGhlciBwcm9ncmFtcworLSBhZGRlZCBjb21wcmVzczIgaW4gemNvbmYuaCwgemxpYi5kZWYsIHpsaWIuZG50CistIG5ldyBhc20gY29kZSBmcm9tIEdpbGxlcyBWb2xsYW50IGluIGNvbnRyaWIvYXNtMzg2CistIHNpbXBsaWZ5IHRoZSBpbmZsYXRlIGNvZGUgKE1hcmspOgorIC4gUmVwbGFjZSBaQUxMT0MncyBpbiBodWZ0X2J1aWxkKCkgd2l0aCBzaW5nbGUgWkFMTE9DIGluIGluZmxhdGVfYmxvY2tzX25ldygpCisgLiBaQUxMT0MgdGhlIGxlbmd0aCBsaXN0IGluIGluZmxhdGVfdHJlZXNfZml4ZWQoKSBpbnN0ZWFkIG9mIHVzaW5nIHN0YWNrCisgLiBaQUxMT0MgdGhlIHZhbHVlIGFyZWEgZm9yIGh1ZnRfYnVpbGQoKSBpbnN0ZWFkIG9mIHVzaW5nIHN0YWNrCisgLiBTaW1wbGlmeSBaX0ZJTklTSCBjaGVjayBpbiBpbmZsYXRlKCkKKworLSBBdm9pZCBnY2MgMi44LjAgY29tcGFyaXNvbiBidWcgYSBsaXR0bGUgZGlmZmVyZW50bHkgdGhhbiB6bGliIDEuMC44CistIGluIGluZnRyZWVzLmMsIGF2b2lkIGNjIC1PIGJ1ZyBvbiBIUCAoRmFyc2hpZCBFbGFoaSkKKy0gaW4gemNvbmYuaCBtb3ZlIHRoZSBaTElCX0RMTCBzdHVmZiBlYXJsaWVyIHRvIGF2b2lkIHByb2JsZW1zIHdpdGgKKyAgdGhlIGRlY2xhcmF0aW9uIG9mIEZBUiAoR2lsbGVzIFZPbGxhbnQpCistIGluc3RhbGwgbGliei5zbyogd2l0aCBtb2RlIDc1NSAoZXhlY3V0YWJsZSkgaW5zdGVhZCBvZiA2NDQgKE1hcmMgTGVobWFubikKKy0gcmVhZF9idWYgYnVmIHBhcmFtZXRlciBvZiB0eXBlIEJ5dGVmKiBpbnN0ZWFkIG9mIGNoYXJmKgorLSB6bWVtY3B5IHBhcmFtZXRlcnMgYXJlIG9mIHR5cGUgQnl0ZWYqLCBub3QgY2hhcmYqIChKb3NlcGggU3Ryb3V0KQorLSBkbyBub3QgcmVkZWNsYXJlIHVubGluayBpbiBtaW5pZ3ppcC5jIGZvciBXSU4zMiAoSm9obiBCb3dsZXIpCistIGZpeCBjaGVjayBmb3IgcHJlc2VuY2Ugb2YgZGlyZWN0b3JpZXMgaW4gIm1ha2UgaW5zdGFsbCIgKElhbiBXaWxsaXMpCisKK0NoYW5nZXMgaW4gMS4wLjggKDI3IEphbiAxOTk4KQorLSBmaXhlZCBvZmZzZXRzIGluIGNvbnRyaWIvYXNtMzg2L2d2bWF0MzIuYXNtIChHaWxsZXMgVm9sbGFudCkKKy0gZml4IGd6Z2V0YyBhbmQgZ3pwdXRjIGZvciBiaWcgZW5kaWFuIHN5c3RlbXMgKE1hcmt1cyBPYmVyaHVtZXIpCistIGFkZGVkIGNvbXByZXNzMigpIHRvIGFsbG93IHNldHRpbmcgdGhlIGNvbXByZXNzaW9uIGxldmVsCistIGluY2x1ZGUgc3lzL3R5cGVzLmggdG8gZ2V0IG9mZl90IG9uIHNvbWUgc3lzdGVtcyAoTWFyYyBMZWhtYW5uICYgUWluZ0xvbmcpCistIHVzZSBjb25zdGFudCBhcnJheXMgZm9yIHRoZSBzdGF0aWMgdHJlZXMgaW4gdHJlZXMuYyBpbnN0ZWFkIG9mIGNvbXB1dGluZworICB0aGVtIGF0IHJ1biB0aW1lICh0aGFua3MgdG8gS2VuIFJhZWJ1cm4gZm9yIHRoaXMgc3VnZ2VzdGlvbikuIFRvIGNyZWF0ZQorICB0cmVlcy5oLCBjb21waWxlIHdpdGggR0VOX1RSRUVTX0ggYW5kIHJ1biAibWFrZSB0ZXN0Ii4KKy0gY2hlY2sgcmV0dXJuIGNvZGUgb2YgZXhhbXBsZSBpbiAibWFrZSB0ZXN0IiBhbmQgZGlzcGxheSByZXN1bHQKKy0gcGFzcyBtaW5pZ3ppcCBjb21tYW5kIGxpbmUgb3B0aW9ucyB0byBmaWxlX2NvbXByZXNzCistIHNpbXBsaWZ5aW5nIGNvZGUgb2YgaW5mbGF0ZVN5bmMgdG8gYXZvaWQgZ2NjIDIuOCBidWcKKworLSBzdXBwb3J0IENDPSJnY2MgLVdhbGwiIGluIGNvbmZpZ3VyZSAtcyAoUWluZ0xvbmcpCistIGF2b2lkIGEgZmx1c2ggY2F1c2VkIGJ5IGZ0ZWxsIGluIGd6b3BlbiBmb3Igd3JpdGUgbW9kZSAoS2VuIFJhZWJ1cm4pCistIGZpeCB0ZXN0IGZvciBzaGFyZWQgbGlicmFyeSBzdXBwb3J0IHRvIGF2b2lkIGNvbXBpbGVyIHdhcm5pbmdzCistIHpsaWIubGliIC0+IHpsaWIuZGxsIGluIG1zZG9zL3psaWIucmMgKEdpbGxlcyBWb2xsYW50KQorLSBjaGVjayBmb3IgVEFSR0VUX09TX01BQyBpbiBhZGRpdGlvbiB0byBNQUNPUyAoQnJhZCBQZXR0aXQpCistIGRvIG5vdCB1c2UgZmRvcGVuIGZvciBNZXRyb3dlcmtzIG9uIE1hYyAoQnJhZCBQZXR0aXQpKQorLSBhZGQgY2hlY2tzIGZvciBnenB1dGMgYW5kIGd6cHV0YyBpbiBleGFtcGxlLmMKKy0gYXZvaWQgd2FybmluZ3MgaW4gZ3ppby5jIGFuZCBkZWZsYXRlLmMgKEFuZHJlYXMgS2xlaW5lcnQpCistIHVzZSBjb25zdCBmb3IgdGhlIENSQyB0YWJsZSAoS2VuIFJhZWJ1cm4pCistIGZpeGVkICJtYWtlIHVuaW5zdGFsbCIgZm9yIHNoYXJlZCBsaWJyYXJpZXMKKy0gdXNlIFRyYWNldiBpbnN0ZWFkIG9mIFRyYWNlIGluIGluZmJsb2NrLmMKKy0gaW4gZXhhbXBsZS5jIHVzZSBjb3JyZWN0IGNvbXByZXNzZWQgbGVuZ3RoIGZvciB0ZXN0X3N5bmMKKy0gc3VwcHJlc3MgK3Zub2NvbXBhdHdhcm5pbmdzIGluIGNvbmZpZ3VyZSBmb3IgSFBVWCAobm90IGFsd2F5cyBzdXBwb3J0ZWQpCisKK0NoYW5nZXMgaW4gMS4wLjcgKDIwIEphbiAxOTk4KQorLSBmaXggZ3pzZWVrIHdoaWNoIHdhcyBicm9rZW4gaW4gd3JpdGUgbW9kZQorLSByZXR1cm4gZXJyb3IgZm9yIGd6c2VlayB0byBuZWdhdGl2ZSBhYnNvbHV0ZSBwb3NpdGlvbgorLSBmaXggY29uZmlndXJlIGZvciBMaW51eCAoQ2h1bi1DaHVuZyBDaGVuKQorLSBpbmNyZWFzZSBzdGFjayBzcGFjZSBmb3IgTVNDIChUaW0gV2VnbmVyKQorLSBnZXRfY3JjX3RhYmxlIGFuZCBpbmZsYXRlU3luY1BvaW50IGFyZSBFWFBPUlRlZCAoR2lsbGVzIFZvbGxhbnQpCistIGRlZmluZSBFWFBPUlRWQSBmb3IgZ3pwcmludGYgKEdpbGxlcyBWb2xsYW50KQorLSBhZGRlZCBtYW4gcGFnZSB6bGliLjMgKFJpY2sgUm9kZ2VycykKKy0gZm9yIGNvbnRyaWIvdW50Z3osIGZpeCBtYWtlZGlyKCkgYW5kIGltcHJvdmUgTWFrZWZpbGUKKworLSBjaGVjayBnenNlZWsgaW4gd3JpdGUgbW9kZSBpbiBleGFtcGxlLmMKKy0gYWxsb2NhdGUgZXh0cmEgYnVmZmVyIGZvciBzZWVrcyBvbmx5IGlmIGd6c2VlayBpcyBhY3R1YWxseSBjYWxsZWQKKy0gYXZvaWQgc2lnbmVkL3Vuc2lnbmVkIGNvbXBhcmlzb25zIChUaW0gV2VnbmVyLCBHaWxsZXMgVm9sbGFudCkKKy0gYWRkIGluZmxhdGVTeW5jUG9pbnQgaW4gemNvbmYuaAorLSBmaXggbGlzdCBvZiBleHBvcnRlZCBmdW5jdGlvbnMgaW4gbnQvemxpYi5kbnQgYW5kIG1kc29zL3psaWIuZGVmCisKK0NoYW5nZXMgaW4gMS4wLjYgKDE5IEphbiAxOTk4KQorLSBhZGQgZnVuY3Rpb25zIGd6cHJpbnRmLCBnenB1dGMsIGd6Z2V0YywgZ3p0ZWxsLCBnemVvZiwgZ3pzZWVrLCBnenJld2luZCBhbmQKKyAgZ3pzZXRwYXJhbXMgKHRoYW5rcyB0byBSb2xhbmQgR2llcnNpZyBhbmQgS2V2aW4gUnVsYW5kIGZvciBzb21lIG9mIHRoaXMgY29kZSkKKy0gRml4IGEgZGVmbGF0ZSBidWcgb2NjdXJyaW5nIG9ubHkgd2l0aCBjb21wcmVzc2lvbiBsZXZlbCAwICh0aGFua3MgdG8KKyAgQW5keSBCdWNrbGVyIGZvciBmaW5kaW5nIHRoaXMgb25lKS4KKy0gSW4gbWluaWd6aXAsIHBhc3MgdHJhbnNwYXJlbnRseSBhbHNvIHRoZSBmaXJzdCBieXRlIGZvciAuWiBmaWxlcy4KKy0gcmV0dXJuIFpfQlVGX0VSUk9SIGluc3RlYWQgb2YgWl9PSyBpZiBvdXRwdXQgYnVmZmVyIGZ1bGwgaW4gdW5jb21wcmVzcygpCistIGNoZWNrIFpfRklOSVNIIGluIGluZmxhdGUgKHRoYW5rcyB0byBNYXJjIFNjaGx1cGVyKQorLSBJbXBsZW1lbnQgZGVmbGF0ZUNvcHkgKHRoYW5rcyB0byBBZGFtIENvc3RlbGxvKQorLSBtYWtlIHN0YXRpYyBsaWJyYXJpZXMgYnkgZGVmYXVsdCBpbiBjb25maWd1cmUsIGFkZCAtLXNoYXJlZCBvcHRpb24uCistIG1vdmUgTVNET1Mgb3IgV2luZG93cyBzcGVjaWZpYyBmaWxlcyB0byBkaXJlY3RvcnkgbXNkb3MKKy0gc3VwcHJlc3MgdGhlIG5vdGlvbiBvZiBwYXJ0aWFsIGZsdXNoIHRvIHNpbXBsaWZ5IHRoZSBpbnRlcmZhY2UKKyAgKGJ1dCB0aGUgc3ltYm9sIFpfUEFSVElBTF9GTFVTSCBpcyBrZXB0IGZvciBjb21wYXRpYmlsaXR5IHdpdGggMS4wLjQpCistIHN1cHByZXNzIGhpc3RvcnkgYnVmZmVyIHByb3ZpZGVkIGJ5IGFwcGxpY2F0aW9uIHRvIHNpbXBsaWZ5IHRoZSBpbnRlcmZhY2UKKyAgKHRoaXMgZmVhdHVyZSB3YXMgbm90IGltcGxlbWVudGVkIGFueXdheSBpbiAxLjAuNCkKKy0gbmV4dF9pbiBhbmQgYXZhaWxfaW4gbXVzdCBiZSBpbml0aWFsaXplZCBiZWZvcmUgY2FsbGluZyBpbmZsYXRlSW5pdCBvcgorICBpbmZsYXRlSW5pdDIKKy0gYWRkIEVYUE9SVCBpbiBhbGwgZXhwb3J0ZWQgZnVuY3Rpb25zIChmb3IgV2luZG93cyBETEwpCistIGFkZGVkIE1ha2VmaWxlLm50ICh0aGFua3MgdG8gU3RlcGhlbiBXaWxsaWFtcykKKy0gYWRkZWQgdGhlIHVuc3VwcG9ydGVkICJjb250cmliIiBkaXJlY3Rvcnk6CisgICBjb250cmliL2FzbTM4Ni8gYnkgR2lsbGVzIFZvbGxhbnQgPGluZm9Ad2luaW1hZ2UuY29tPgorICAgICAgICAzODYgYXNtIGNvZGUgcmVwbGFjaW5nIGxvbmdlc3RfbWF0Y2goKS4KKyAgIGNvbnRyaWIvaW9zdHJlYW0vIGJ5IEtldmluIFJ1bGFuZCA8a2V2aW5Acm9kaW4ud3VzdGwuZWR1PgorICAgICAgICBBIEMrKyBJL08gc3RyZWFtcyBpbnRlcmZhY2UgdG8gdGhlIHpsaWIgZ3oqIGZ1bmN0aW9ucworICAgY29udHJpYi9pb3N0cmVhbTIvICBieSBUeWdlIEz4dnNldCA8VHlnZS5Mb3ZzZXRAY21yLm5vPgorICAgICAgICBBbm90aGVyIEMrKyBJL08gc3RyZWFtcyBpbnRlcmZhY2UKKyAgIGNvbnRyaWIvdW50Z3ovICBieSAiUGVkcm8gQS4gQXJhbmRhIEd1dGlcaXJyZXoiIDxwYWFnQHRpZC5lcz4KKyAgICAgICAgQSB2ZXJ5IHNpbXBsZSB0YXIuZ3ogZmlsZSBleHRyYWN0b3IgdXNpbmcgemxpYgorICAgY29udHJpYi92aXN1YWwtYmFzaWMudHh0IGJ5IENhcmxvcyBSaW9zIDxjX3Jpb3NAc29uZGEuY2w+CisgICAgICAgIEhvdyB0byB1c2UgY29tcHJlc3MoKSwgdW5jb21wcmVzcygpIGFuZCB0aGUgZ3oqIGZ1bmN0aW9ucyBmcm9tIFZCLgorLSBwYXNzIHBhcmFtcyAtZiAoZmlsdGVyZWQgZGF0YSksIC1oIChodWZmbWFuIG9ubHkpLCAtMSB0byAtOSAoY29tcHJlc3Npb24KKyAgbGV2ZWwpIGluIG1pbmlnemlwICh0aGFua3MgdG8gVG9tIExhbmUpCisKKy0gdXNlIGNvbnN0IGZvciByb21tYWJsZSBjb25zdGFudHMgaW4gZGVmbGF0ZQorLSBhZGRlZCB0ZXN0IGZvciBnenNlZWsgYW5kIGd6dGVsbCBpbiBleGFtcGxlLmMKKy0gYWRkIHVuZG9jdW1lbnRlZCBmdW5jdGlvbiBpbmZsYXRlU3luY1BvaW50KCkgKGhhY2sgZm9yIFBhdWwgTWFja2VycmFzKQorLSBhZGQgdW5kb2N1bWVudGVkIGZ1bmN0aW9uIHpFcnJvciB0byBjb252ZXJ0IGVycm9yIGNvZGUgdG8gc3RyaW5nCisgIChmb3IgVGltIFNtaXRoZXJzKQorLSBBbGxvdyBjb21waWxhdGlvbiBvZiBnemlvIHdpdGggLUROT19ERUZMQVRFIHRvIGF2b2lkIHRoZSBjb21wcmVzc2lvbiBjb2RlLgorLSBVc2UgZGVmYXVsdCBtZW1jcHkgZm9yIFN5bWFudGVjIE1TRE9TIGNvbXBpbGVyLgorLSBBZGQgRVhQT1JUIGtleXdvcmQgZm9yIGNoZWNrX2Z1bmMgKG5lZWRlZCBmb3IgV2luZG93cyBETEwpCistIGFkZCBjdXJyZW50IGRpcmVjdG9yeSB0byBMRF9MSUJSQVJZX1BBVEggZm9yICJtYWtlIHRlc3QiCistIGNyZWF0ZSBhbHNvIGEgbGluayBmb3IgbGliei5zby4xCistIGFkZGVkIHN1cHBvcnQgZm9yIEZVSklUU1UgVVhQL0RTICh0aGFua3MgdG8gVG9zaGlha2kgTm9tdXJhKQorLSB1c2UgJChTSEFSRURMSUIpIGluc3RlYWQgb2YgbGliei5zbyBpbiBNYWtlZmlsZS5pbiAoZm9yIEhQVVgpCistIGFkZGVkIC1zb25hbWUgZm9yIExpbnV4IGluIGNvbmZpZ3VyZSAoQ2h1bi1DaHVuZyBDaGVuLAorLSBhc3NpZ24gbnVtYmVycyB0byB0aGUgZXhwb3J0ZWQgZnVuY3Rpb25zIGluIHpsaWIuZGVmIChmb3IgV2luZG93cyBETEwpCistIGFkZCBhZHZpY2UgaW4gemxpYi5oIGZvciBiZXN0IHVzYWdlIG9mIGRlZmxhdGVTZXREaWN0aW9uYXJ5CistIHdvcmsgYXJvdW5kIGNvbXBpbGVyIGJ1ZyBvbiBBdGFyaSAoY2FzdCBaX05VTEwgaW4gY2FsbCBvZiBzLT5jaGVja2ZuKQorLSBhbGxvdyBjb21waWxhdGlvbiB3aXRoIEFOU0kga2V5d29yZHMgb25seSBlbmFibGVkIGZvciBUdXJib0MgaW4gbGFyZ2UgbW9kZWwKKy0gYXZvaWQgInZlcnNpb25TdHJpbmciWzBdIChCb3JsYW5kIGJ1ZykKKy0gYWRkIE5FRURfRFVNTVlfUkVUVVJOIGZvciBCb3JsYW5kCistIHVzZSB2YXJpYWJsZSB6X3ZlcmJvc2UgZm9yIHRyYWNpbmcgaW4gZGVidWcgbW9kZSAoTC4gUGV0ZXIgRGV1dHNjaCkuCistIGFsbG93IGNvbXBpbGF0aW9uIHdpdGggQ0MKKy0gZGVmaW5lZCBTVERDIGZvciBPUy8yIChEYXZpZCBDaGFybGFwKQorLSBsaW1pdCBleHRlcm5hbCBuYW1lcyB0byA4IGNoYXJzIGZvciBNVlMgKFRob21hcyBMdW5kKQorLSBpbiBtaW5pZ3ppcC5jLCB1c2Ugc3RhdGljIGJ1ZmZlcnMgb25seSBmb3IgMTYtYml0IHN5c3RlbXMKKy0gZml4IHN1ZmZpeCBjaGVjayBmb3IgIm1pbmlnemlwIC1kIGZvby5neiIKKy0gZG8gbm90IHJldHVybiBhbiBlcnJvciBmb3IgdGhlIDJuZCBvZiB0d28gY29uc2VjdXRpdmUgZ3pmbHVzaCgpIChGZWxpeCBMZWUpCistIHVzZSBfZmRvcGVuIGluc3RlYWQgb2YgZmRvcGVuIGZvciBNU0MgPj0gNi4wIChUaG9tYXMgRmFuc2xhdSkKKy0gYWRkZWQgbWFrZWxjYy5iYXQgZm9yIGxjYy13aW4zMiAoVG9tIFN0IERlbmlzKQorLSBpbiBNYWtlZmlsZS5kajIsIHVzZSBjb3B5IGFuZCBkZWwgaW5zdGVhZCBvZiBpbnN0YWxsIGFuZCBybSAoRnJhbmsgRG9uYWhvZSkKKy0gQXZvaWQgZXhwYW5kZWQgJElkJC4gVXNlICJyY3MgLWtiIiBvciAiY3ZzIGFkbWluIC1rYiIgdG8gYXZvaWQgSWQgZXhwYW5zaW9uLgorLSBjaGVjayBmb3IgdW5pc3RkLmggaW4gY29uZmlndXJlIChmb3Igb2ZmX3QpCistIHJlbW92ZSB1c2VsZXNzIGNoZWNrIHBhcmFtZXRlciBpbiBpbmZsYXRlX2Jsb2Nrc19mcmVlCistIGF2b2lkIHVzZWxlc3MgYXNzaWdubWVudCBvZiBzLT5jaGVjayB0byBpdHNlbGYgaW4gaW5mbGF0ZV9ibG9ja3NfbmV3CistIGRvIG5vdCBmbHVzaCB0d2ljZSBpbiBnemNsb3NlICh0aGFua3MgdG8gS2VuIFJhZWJ1cm4pCistIHJlbmFtZSBGT1BFTiBhcyBGX09QRU4gdG8gYXZvaWQgY2xhc2ggd2l0aCAvdXNyL2luY2x1ZGUvc3lzL2ZpbGUuaAorLSB1c2UgTk9fRVJSTk9fSCBpbnN0ZWFkIG9mIGVudW1lcmF0aW9uIG9mIG9wZXJhdGluZyBzeXN0ZW1zIHdpdGggZXJybm8uaAorLSB3b3JrIGFyb3VuZCBidWdneSBmY2xvc2Ugb24gcGlwZXMgZm9yIEhQL1VYCistIHN1cHBvcnQgemxpYiBETEwgd2l0aCBCT1JMQU5EIEMrKyA1LjAgKHRoYW5rcyB0byBHbGVubiBSYW5kZXJzLVBlaHJzb24pCistIGZpeCBjb25maWd1cmUgaWYgQ0MgaXMgYWxyZWFkeSBlcXVhbCB0byBnY2MKKworQ2hhbmdlcyBpbiAxLjAuNSAoMyBKYW4gOTgpCistIEZpeCBpbmZsYXRlIHRvIHRlcm1pbmF0ZSBncmFjZWZ1bGx5IHdoZW4gZmVkIGNvcnJ1cHRlZCBvciBpbnZhbGlkIGRhdGEKKy0gVXNlIGNvbnN0IGZvciByb21tYWJsZSBjb25zdGFudHMgaW4gaW5mbGF0ZQorLSBFbGltaW5hdGUgbWVtb3J5IGxlYWtzIG9uIGVycm9yIGNvbmRpdGlvbnMgaW4gaW5mbGF0ZQorLSBSZW1vdmVkIHNvbWUgdmVzdGlnaWFsIGNvZGUgaW4gaW5mbGF0ZQorLSBVcGRhdGUgd2ViIGFkZHJlc3MgaW4gUkVBRE1FCisKK0NoYW5nZXMgaW4gMS4wLjQgKDI0IEp1bCA5NikKKy0gSW4gdmVyeSByYXJlIGNvbmRpdGlvbnMsIGRlZmxhdGUocywgWl9GSU5JU0gpIGNvdWxkIGZhaWwgdG8gcHJvZHVjZSBhbiBFT0YKKyAgYml0LCBzbyB0aGUgZGVjb21wcmVzc29yIGNvdWxkIGRlY29tcHJlc3MgYWxsIHRoZSBjb3JyZWN0IGRhdGEgYnV0IHdlbnQKKyAgb24gdG8gYXR0ZW1wdCBkZWNvbXByZXNzaW5nIGV4dHJhIGdhcmJhZ2UgZGF0YS4gVGhpcyBhZmZlY3RlZCBtaW5pZ3ppcCB0b28uCistIHpsaWJWZXJzaW9uIGFuZCBnemVycm9yIHJldHVybiBjb25zdCBjaGFyKiAobmVlZGVkIGZvciBETEwpCistIHBvcnQgdG8gUklTQ09TIChubyBmZG9wZW4sIG5vIG11bHRpcGxlIGRvdHMsIG5vIHVubGluaywgbm8gZmlsZW5vKQorLSB1c2Ugel9lcnJvciBvbmx5IGZvciBERUJVRyAoYXZvaWQgcHJvYmxlbSB3aXRoIERMTHMpCisKK0NoYW5nZXMgaW4gMS4wLjMgKDIgSnVsIDk2KQorLSB1c2Ugel9zdHJlYW1wIGluc3RlYWQgb2Ygel9zdHJlYW0gKiwgd2hpY2ggaXMgbm93IGEgZmFyIHBvaW50ZXIgaW4gTVNET1MKKyAgc21hbGwgYW5kIG1lZGl1bSBtb2RlbHM7IHRoaXMgbWFrZXMgdGhlIGxpYnJhcnkgaW5jb21wYXRpYmxlIHdpdGggcHJldmlvdXMKKyAgdmVyc2lvbnMgZm9yIHRoZXNlIG1vZGVscy4gKE5vIGVmZmVjdCBpbiBsYXJnZSBtb2RlbCBvciBvbiBvdGhlciBzeXN0ZW1zLikKKy0gcmV0dXJuIE9LIGluc3RlYWQgb2YgQlVGX0VSUk9SIGlmIHByZXZpb3VzIGRlZmxhdGUgY2FsbCByZXR1cm5lZCB3aXRoCisgIGF2YWlsX291dCBhcyB6ZXJvIGJ1dCB0aGVyZSBpcyBub3RoaW5nIHRvIGRvCistIGFkZGVkIG1lbWNtcCBmb3Igbm9uIFNUREMgY29tcGlsZXJzCistIGRlZmluZSBOT19EVU1NWV9ERUNMIGZvciBtb3JlIE1hYyBjb21waWxlcnMgKC5oIGZpbGVzIG1lcmdlZCBpbmNvcnJlY3RseSkKKy0gZGVmaW5lIF9fMzJCSVRfXyBpZiBfXzM4Nl9fIG9yIGkzODYgaXMgZGVmaW5lZCAocGIuIHdpdGggV2F0Y29tIGFuZCBTQ08pCistIGJldHRlciBjaGVjayBmb3IgMTYtYml0IG1vZGUgTVNDIChhdm9pZHMgcHJvYmxlbSB3aXRoIFN5bWFudGVjKQorCitDaGFuZ2VzIGluIDEuMC4yICgyMyBNYXkgOTYpCistIGFkZGVkIFdpbmRvd3MgRExMIHN1cHBvcnQKKy0gYWRkZWQgYSBmdW5jdGlvbiB6bGliVmVyc2lvbiAoZm9yIHRoZSBETEwgc3VwcG9ydCkKKy0gZml4ZWQgZGVjbGFyYXRpb25zIHVzaW5nIEJ5dGVmIGluIGluZnV0aWwuYyAocGIgd2l0aCBNU0RPUyBtZWRpdW0gbW9kZWwpCistIEJ5dGVmIGlzIGRlZmluZSdzIGluc3RlYWQgb2YgdHlwZWRlZidkIG9ubHkgZm9yIEJvcmxhbmQgQworLSBhdm9pZCByZWFkaW5nIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGluIGV4YW1wbGUuYworLSBtZW50aW9uIGluIFJFQURNRSB0aGF0IHRoZSB6bGliIGZvcm1hdCBpcyBub3cgUkZDMTk1MAorLSB1cGRhdGVkIE1ha2VmaWxlLmRqMgorLSBhZGRlZCBhbGdvcml0aG0uZG9jCisKK0NoYW5nZXMgaW4gMS4wLjEgKDIwIE1heSA5NikgWzEuMCBza2lwcGVkIHRvIGF2b2lkIGNvbmZ1c2lvbl0KKy0gZml4IGFycmF5IG92ZXJsYXkgaW4gZGVmbGF0ZS5jIHdoaWNoIHNvbWV0aW1lcyBjYXVzZWQgYmFkIGNvbXByZXNzZWQgZGF0YQorLSBmaXggaW5mbGF0ZSBidWcgd2l0aCBlbXB0eSBzdG9yZWQgYmxvY2sKKy0gZml4IE1TRE9TIG1lZGl1bSBtb2RlbCB3aGljaCB3YXMgYnJva2VuIGluIDAuOTkKKy0gZml4IGRlZmxhdGVQYXJhbXMoKSB3aGljaCBjb3VsZCBnZW5lcmF0ZWQgYmFkIGNvbXByZXNzZWQgZGF0YS4KKy0gQnl0ZWYgaXMgZGVmaW5lJ2QgaW5zdGVhZCBvZiB0eXBlZGVmJ2VkICh3b3JrIGFyb3VuZCBCb3JsYW5kIGJ1ZykKKy0gYWRkZWQgYW4gSU5ERVggZmlsZQorLSBuZXcgbWFrZWZpbGVzIGZvciBESkdQUCAoTWFrZWZpbGUuZGoyKSwgMzItYml0IEJvcmxhbmQgKE1ha2VmaWxlLmIzMiksCisgIFdhdGNvbSAoTWFrZWZpbGUud2F0KSwgQW1pZ2EgU0FTL0MgKE1ha2VmaWxlLnNhcykKKy0gc3BlZWQgdXAgYWRsZXIzMiBmb3IgbW9kZXJuIG1hY2hpbmVzIHdpdGhvdXQgYXV0by1pbmNyZW1lbnQKKy0gYWRkZWQgLWFuc2kgZm9yIElSSVggaW4gY29uZmlndXJlCistIHN0YXRpY19pbml0X2RvbmUgaW4gdHJlZXMuYyBpcyBhbiBpbnQKKy0gZGVmaW5lIHVubGluayBhcyBkZWxldGUgZm9yIFZNUworLSBmaXggY29uZmlndXJlIGZvciBRTlgKKy0gYWRkIGNvbmZpZ3VyZSBicmFuY2ggZm9yIFNDTyBhbmQgSFBVWAorLSBhdm9pZCBtYW55IHdhcm5pbmdzICh1bnVzZWQgdmFyaWFibGVzLCBkZWFkIGFzc2lnbm1lbnRzLCBldGMuLi4pCistIG5vIGZkb3BlbiBmb3IgQmVPUworLSBmaXggdGhlIFdhdGNvbSBmaXggZm9yIDMyIGJpdCBtb2RlIChkZWZpbmUgRkFSIGFzIGVtcHR5KQorLSByZW1vdmVkIHJlZGVmaW5pdGlvbiBvZiBCeXRlIGZvciBNS1dFUktTCistIHdvcmsgYXJvdW5kIGFuIE1XS0VSS1MgYnVnIChpbmNvcnJlY3QgbWVyZ2Ugb2YgYWxsIC5oIGZpbGVzKQorCitDaGFuZ2VzIGluIDAuOTkgKDI3IEphbiA5NikKKy0gYWxsb3cgcHJlc2V0IGRpY3Rpb25hcnkgc2hhcmVkIGJldHdlZW4gY29tcHJlc3NvciBhbmQgZGVjb21wcmVzc29yCistIGFsbG93IGNvbXByZXNzaW9uIGxldmVsIDAgKG5vIGNvbXByZXNzaW9uKQorLSBhZGQgZGVmbGF0ZVBhcmFtcyBpbiB6bGliLmg6IGFsbG93IGR5bmFtaWMgY2hhbmdlIG9mIGNvbXByZXNzaW9uIGxldmVsCisgIGFuZCBjb21wcmVzc2lvbiBzdHJhdGVneS4KKy0gdGVzdCBsYXJnZSBidWZmZXJzIGFuZCBkZWZsYXRlUGFyYW1zIGluIGV4YW1wbGUuYworLSBhZGQgb3B0aW9uYWwgImNvbmZpZ3VyZSIgdG8gYnVpbGQgemxpYiBhcyBhIHNoYXJlZCBsaWJyYXJ5CistIHN1cHByZXNzIE1ha2VmaWxlLnFueCwgdXNlIGNvbmZpZ3VyZSBpbnN0ZWFkCistIGZpeGVkIGRlZmxhdGUgZm9yIDY0LWJpdCBzeXN0ZW1zIChkZXRlY3RlZCBvbiBDcmF5KQorLSBmaXhlZCBpbmZsYXRlX2Jsb2NrcyBmb3IgNjQtYml0IHN5c3RlbXMgKGRldGVjdGVkIG9uIEFscGhhKQorLSBkZWNsYXJlIFpfREVGTEFURUQgaW4gemxpYi5oIChwb3NzaWJsZSBwYXJhbWV0ZXIgZm9yIGRlZmxhdGVJbml0MikKKy0gYWx3YXlzIHJldHVybiBaX0JVRl9FUlJPUiB3aGVuIGRlZmxhdGUoKSBoYXMgbm90aGluZyB0byBkbworLSBkZWZsYXRlSW5pdCBhbmQgaW5mbGF0ZUluaXQgYXJlIG5vdyBtYWNyb3MgdG8gYWxsb3cgdmVyc2lvbiBjaGVja2luZworLSBwcmVmaXggYWxsIGdsb2JhbCBmdW5jdGlvbnMgYW5kIHR5cGVzIHdpdGggel8gd2l0aCAtRFpfUFJFRklYCistIG1ha2UgZmFsbG9jIGNvbXBsZXRlbHkgcmVlbnRyYW50IChpbmZ0cmVlcy5jKQorLSBmaXhlZCB2ZXJ5IHVubGlrZWx5IHJhY2UgY29uZGl0aW9uIGluIGN0X3N0YXRpY19pbml0CistIGZyZWUgaW4gcmV2ZXJzZSBvcmRlciBvZiBhbGxvY2F0aW9uIHRvIGhlbHAgbWVtb3J5IG1hbmFnZXIKKy0gdXNlIHpsaWItMS4wLyogaW5zdGVhZCBvZiB6bGliLyogaW5zaWRlIHRoZSB0YXIuZ3oKKy0gbWFrZSB6bGliIHdhcm5pbmctZnJlZSB3aXRoICJnY2MgLU8zIC1XYWxsIC1Xd3JpdGUtc3RyaW5ncyAtV3BvaW50ZXItYXJpdGgKKyAgLVdjb252ZXJzaW9uIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVdtaXNzaW5nLXByb3RvdHlwZXMiCistIGFsbG93IGd6cmVhZCBvbiBjb25jYXRlbmF0ZWQgLmd6IGZpbGVzCistIGRlZmxhdGVFbmQgbm93IHJldHVybnMgWl9EQVRBX0VSUk9SIGlmIGl0IHdhcyBwcmVtYXR1cmUKKy0gZGVmbGF0ZSBpcyBmaW5hbGx5ICg/KSBmdWxseSBkZXRlcm1pbmlzdGljIChubyBtYXRjaGVzIGJleW9uZCBlbmQgb2YgaW5wdXQpCistIERvY3VtZW50IFpfU1lOQ19GTFVTSAorLSBhZGQgdW5pbnN0YWxsIGluIE1ha2VmaWxlCistIENoZWNrIGZvciBfX2NwbHVwbHVzIGluIHpsaWIuaAorLSBCZXR0ZXIgdGVzdCBpbiBjdF9hbGlnbiBmb3IgcGFydGlhbCBmbHVzaAorLSBhdm9pZCBoYXJtbGVzcyB3YXJuaW5ncyBmb3IgQm9ybGFuZCBDKysKKy0gaW5pdGlhbGl6ZSBoYXNoX2hlYWQgaW4gZGVmbGF0ZS5jCistIGF2b2lkIHdhcm5pbmcgb24gZmRvcGVuIChnemlvLmMpIGZvciBIUCBjYyAtQWEKKy0gaW5jbHVkZSBzdGRsaWIuaCBmb3IgU1REQyBjb21waWxlcnMKKy0gaW5jbHVkZSBlcnJuby5oIGZvciBDcmF5CistIGlnbm9yZSBlcnJvciBpZiByYW5saWIgZG9lc24ndCBleGlzdAorLSBjYWxsIHJhbmxpYiB0d2ljZSBmb3IgTmVYVFNURVAKKy0gdXNlIGV4ZWNfcHJlZml4IGluc3RlYWQgb2YgcHJlZml4IGZvciBsaWJ6LmEKKy0gcmVuYW1lZCBjdF8qIGFzIF90cl8qIHRvIGF2b2lkIGNvbmZsaWN0IHdpdGggYXBwbGljYXRpb25zCistIGNsZWFyIHotPm1zZyBpbiBpbmZsYXRlSW5pdDIgYmVmb3JlIGFueSBlcnJvciByZXR1cm4KKy0gaW5pdGlhbGl6ZSBvcGFxdWUgaW4gZXhhbXBsZS5jLCBnemlvLmMsIGRlZmxhdGUuYyBhbmQgaW5mbGF0ZS5jCistIGZpeGVkIHR5cG8gaW4gemNvbmYuaCAoX0dOVUNfXyA9PiBfX0dOVUNfXykKKy0gY2hlY2sgZm9yIFdJTjMyIGluIHpjb25mLmggYW5kIHp1dGlsLmMgKGF2b2lkIGZhcm1hbGxvYyBpbiAzMi1iaXQgbW9kZSkKKy0gZml4IHR5cG8gaW4gTWFrZV92bXMuY29tIChmJHRybmxubSAtPiBmJGdldHN5aSkKKy0gaW4gZmNhbGxvYywgbm9ybWFsaXplIHBvaW50ZXIgaWYgc2l6ZSA+IDY1NTIwIGJ5dGVzCistIGRvbid0IHVzZSBzcGVjaWFsIGZjYWxsb2MgZm9yIDMyIGJpdCBCb3JsYW5kIEMrKworLSB1c2UgU1REQyBpbnN0ZWFkIG9mIF9fR08zMl9fIHRvIGF2b2lkIHJlZGVjbGFyaW5nIGV4aXQsIGNhbGxvYywgZXRjLi4uCistIHVzZSBaX0JJTkFSWSBpbnN0ZWFkIG9mIEJJTkFSWQorLSBkb2N1bWVudCB0aGF0IGd6Y2xvc2UgYWZ0ZXIgZ3pkb3BlbiB3aWxsIGNsb3NlIHRoZSBmaWxlCistIGFsbG93ICJhIiBhcyBtb2RlIGluIGd6b3Blbi4KKy0gZml4IGVycm9yIGNoZWNraW5nIGluIGd6cmVhZAorLSBhbGxvdyBza2lwcGluZyAuZ3ogZXh0cmEtZmllbGQgb24gcGlwZXMKKy0gYWRkZWQgcmVmZXJlbmNlIHRvIFBlcmwgaW50ZXJmYWNlIGluIFJFQURNRQorLSBwdXQgdGhlIGNyYyB0YWJsZSBpbiBGQVIgZGF0YSAoSSBkaXNsaWtlIG1vcmUgYW5kIG1vcmUgdGhlIG1lZGl1bSBtb2RlbCA6KQorLSBhZGRlZCBnZXRfY3JjX3RhYmxlCistIGFkZGVkIGEgZGltZW5zaW9uIHRvIGFsbCBhcnJheXMgKEJvcmxhbmQgQyBjYW4ndCBjb3VudCkuCistIHdvcmthcm91bmQgQm9ybGFuZCBDIGJ1ZyBpbiBkZWNsYXJhdGlvbiBvZiBpbmZsYXRlX2NvZGVzX25ldyAmIGluZmxhdGVfZmFzdAorLSBndWFyZCBhZ2FpbnN0IG11bHRpcGxlIGluY2x1c2lvbiBvZiAqLmggKGZvciBwcmVjb21waWxlZCBoZWFkZXIgb24gTWFjKQorLSBXYXRjb20gQyBwcmV0ZW5kcyB0byBiZSBNaWNyb3NvZnQgQyBzbWFsbCBtb2RlbCBldmVuIGluIDMyIGJpdCBtb2RlLgorLSBkb24ndCB1c2UgdW5zaXplZCBhcnJheXMgdG8gYXZvaWQgc2lsbHkgd2FybmluZ3MgYnkgVmlzdWFsIEMrKzoKKyAgICAgd2FybmluZyBDNDc0NjogJ2luZmxhdGVfbWFzaycgOiB1bnNpemVkIGFycmF5IHRyZWF0ZWQgYXMgICdfX2ZhcicKKyAgICAgKHdoYXQncyB3cm9uZyB3aXRoIGZhciBkYXRhIGluIGZhciBtb2RlbD8pLgorLSBkZWZpbmUgZW51bSBvdXQgb2YgaW5mbGF0ZV9ibG9ja3Nfc3RhdGUgdG8gYWxsb3cgY29tcGlsYXRpb24gd2l0aCBDKysKKworQ2hhbmdlcyBpbiAwLjk1ICgxNiBBdWcgOTUpCistIGZpeCBNU0RPUyBzbWFsbCBhbmQgbWVkaXVtIG1vZGVsIChub3cgZWFzaWVyIHRvIGFkYXB0IHRvIGFueSBjb21waWxlcikKKy0gaW5saW5lZCBzZW5kX2JpdHMKKy0gZml4IHRoZSBmaW5hbCAoOi0pIGJ1ZyBmb3IgZGVmbGF0ZSB3aXRoIGZsdXNoIChvdXRwdXQgd2FzIGNvcnJlY3QgYnV0CisgIG5vdCBjb21wbGV0ZWx5IGZsdXNoZWQgaW4gcmFyZSBvY2Nhc2lvbnMpLgorLSBkZWZhdWx0IHdpbmRvdyBzaXplIGlzIHNhbWUgZm9yIGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uCisgIChpdCdzIG5vdyBzdWZmaWNpZW50IHRvIHNldCBNQVhfV0JJVFMgaW4gemNvbmYuaCkuCistIHZvaWRwIC0+IHZvaWRwZiBhbmQgdm9pZG5wIC0+IHZvaWRwIChmb3IgY29uc2lzdGVuY3kgd2l0aCBvdGhlcgorICB0eXBlZGVmcyBhbmQgYmVjYXVzZSB2b2lkbnAgd2FzIG5vdCBuZWFyIGluIGxhcmdlIG1vZGVsKS4KKworQ2hhbmdlcyBpbiAwLjk0ICgxMyBBdWcgOTUpCistIHN1cHBvcnQgTVNET1MgbWVkaXVtIG1vZGVsCistIGZpeCBkZWZsYXRlIHdpdGggZmx1c2ggKGNvdWxkIHNvbWV0aW1lcyBnZW5lcmF0ZSBiYWQgb3V0cHV0KQorLSBmaXggZGVmbGF0ZVJlc2V0ICh6bGliIGhlYWRlciB3YXMgaW5jb3JyZWN0bHkgc3VwcHJlc3NlZCkKKy0gYWRkZWQgc3VwcG9ydCBmb3IgVk1TCistIGFsbG93IGEgY29tcHJlc3Npb24gbGV2ZWwgaW4gZ3pvcGVuKCkKKy0gZ3pmbHVzaCBub3cgY2FsbHMgZmZsdXNoCistIEZvciBkZWZsYXRlIHdpdGggZmx1c2gsIGZsdXNoIGV2ZW4gaWYgbm8gbW9yZSBpbnB1dCBpcyBwcm92aWRlZC4KKy0gcmVuYW1lIGxpYmd6LmEgYXMgbGliei5hCistIGF2b2lkIGNvbXBsZXggZXhwcmVzc2lvbiBpbiBpbmZjb2Rlcy5jIHRyaWdnZXJpbmcgVHVyYm8gQyBidWcKKy0gd29yayBhcm91bmQgYSBwcm9ibGVtIHdpdGggZ2NjIG9uIEFscGhhIChpbiBJTlNFUlRfU1RSSU5HKQorLSBkb24ndCB1c2UgaW5saW5lIGZ1bmN0aW9ucyAocHJvYmxlbSB3aXRoIHNvbWUgZ2NjIHZlcnNpb25zKQorLSBhbGxvdyByZW5hbWluZyBvZiBCeXRlLCB1SW50LCBldGMuLi4gd2l0aCAjZGVmaW5lLgorLSBhdm9pZCB3YXJuaW5nIGFib3V0ICh1bnVzZWQpIHBvaW50ZXIgYmVmb3JlIHN0YXJ0IG9mIGFycmF5IGluIGRlZmxhdGUuYworLSBhdm9pZCB2YXJpb3VzIHdhcm5pbmdzIGluIGd6aW8uYywgZXhhbXBsZS5jLCBpbmZibG9jay5jLCBhZGxlcjMyLmMsIHp1dGlsLmMKKy0gYXZvaWQgcmVzZXJ2ZWQgd29yZCAnbmV3JyBpbiB0cmVlcy5jCisKK0NoYW5nZXMgaW4gMC45MyAoMjUgSnVuZSA5NSkKKy0gdGVtcG9yYXJpbHkgZGlzYWJsZSBpbmxpbmUgZnVuY3Rpb25zCistIG1ha2UgZGVmbGF0ZSBkZXRlcm1pbmlzdGljCistIGdpdmUgZW5vdWdoIGxvb2thaGVhZCBmb3IgUEFSVElBTF9GTFVTSAorLSBTZXQgYmluYXJ5IG1vZGUgZm9yIHN0ZGluL3N0ZG91dCBpbiBtaW5pZ3ppcC5jIGZvciBPUy8yCistIGRvbid0IGV2ZW4gdXNlIHNpZ25lZCBjaGFyIGluIGluZmxhdGUgKG5vdCBwb3J0YWJsZSBlbm91Z2gpCistIGZpeCBpbmZsYXRlIG1lbW9yeSBsZWFrIGZvciBzZWdtZW50ZWQgYXJjaGl0ZWN0dXJlcworCitDaGFuZ2VzIGluIDAuOTIgKDMgTWF5IDk1KQorLSBkb24ndCBhc3N1bWUgdGhhdCBjaGFyIGlzIHNpZ25lZCAocHJvYmxlbSBvbiBTR0kpCistIENsZWFyIGJpdCBidWZmZXIgd2hlbiBzdGFydGluZyBhIHN0b3JlZCBibG9jaworLSBubyBtZW1jcHkgb24gUHlyYW1pZAorLSBzdXBwcmVzc2VkIGluZnRlc3QuYworLSBvcHRpbWl6ZWQgZmlsbF93aW5kb3csIHB1dCBsb25nZXN0X21hdGNoIGlubGluZSBmb3IgZ2NjCistIG9wdGltaXplZCBpbmZsYXRlIG9uIHN0b3JlZCBibG9ja3MuCistIHVudGFiaWZ5IGFsbCBzb3VyY2VzIHRvIHNpbXBsaWZ5IHBhdGNoZXMKKworQ2hhbmdlcyBpbiAwLjkxICgyIE1heSA5NSkKKy0gRGVmYXVsdCBNRU1fTEVWRUwgaXMgOCAobm90IDkgZm9yIFVuaXgpIGFzIGRvY3VtZW50ZWQgaW4gemxpYi5oCistIERvY3VtZW50IHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzIGluIHpjb25mLmgKKy0gYWRkZWQgIm1ha2UgaW5zdGFsbCIKKy0gZml4IHN5bmMgc2VhcmNoIGxvZ2ljIGluIGluZmxhdGVTeW5jCistIGRlZmxhdGUoWl9GVUxMX0ZMVVNIKSBub3cgd29ya3MgZXZlbiBpZiBvdXRwdXQgYnVmZmVyIHRvbyBzaG9ydAorLSBhZnRlciBpbmZsYXRlU3luYywgZG9uJ3Qgc2NhcmUgcGVvcGxlIHdpdGgganVzdCAibG8gd29ybGQiCistIGFkZGVkIHN1cHBvcnQgZm9yIERKR1BQCisKK0NoYW5nZXMgaW4gMC45ICgxIE1heSA5NSkKKy0gZG9uJ3QgYXNzdW1lIHRoYXQgemFsbG9jIGNsZWFycyB0aGUgYWxsb2NhdGVkIG1lbW9yeSAodGhlIFR1cmJvQyBidWcKKyAgd2FzIE1hcmsncyBidWcgYWZ0ZXIgYWxsIDopCistIGxldCBhZ2FpbiBnenJlYWQgY29weSB1bmNvbXByZXNzZWQgZGF0YSB1bmNoYW5nZWQgKHdhcyB3b3JraW5nIGluIDAuNzEpCistIGRlZmxhdGUoWl9GVUxMX0ZMVVNIKSwgaW5mbGF0ZVJlc2V0IGFuZCBpbmZsYXRlU3luYyBhcmUgbm93IGZ1bGx5IGltcGxlbWVudGVkCistIGFkZGVkIGEgdGVzdCBvZiBpbmZsYXRlU3luYyBpbiBleGFtcGxlLmMKKy0gbW92ZWQgTUFYX1dCSVRTIHRvIHpjb25mLmggYmVjYXVzZSB1c2VycyBtaWdodCB3YW50IHRvIGNoYW5nZSB0aGF0LgorLSBkb2N1bWVudCBleHBsaWNpdGx5IHRoYXQgemFsbG9jKDY0Sykgb24gTVNET1MgbXVzdCByZXR1cm4gYSBub3JtYWxpemVkCisgIHBvaW50ZXIgKHplcm8gb2Zmc2V0KQorLSBhZGRlZCBNYWtlZmlsZXMgZm9yIE1pY3Jvc29mdCBDLCBUdXJibyBDLCBCb3JsYW5kIEMrKworLSBmYXN0ZXIgY3JjMzIoKQorCitDaGFuZ2VzIGluIDAuOCAoMjkgQXByaWwgOTUpCistIGFkZGVkIGZhc3QgaW5mbGF0ZSAoaW5mZmFzdC5jKQorLSBkZWZsYXRlKFpfRklOSVNIKSBub3cgcmV0dXJucyBaX1NUUkVBTV9FTkQgd2hlbiBkb25lLiBXYXJuaW5nOiB0aGlzCisgIGlzIGluY29tcGF0aWJsZSB3aXRoIHByZXZpb3VzIHZlcnNpb25zIG9mIHpsaWIgd2hpY2ggcmV0dXJuZWQgWl9PSy4KKy0gd29yayBhcm91bmQgYSBUdXJib0MgY29tcGlsZXIgYnVnIChiYWQgY29kZSBmb3IgYiA8PCAwLCBzZWUgaW5mdXRpbC5oKQorICAoYWN0dWFsbHkgdGhhdCB3YXMgbm90IGEgY29tcGlsZXIgYnVnLCBzZWUgMC44MSBhYm92ZSkKKy0gZ3pyZWFkIG5vIGxvbmdlciByZWFkcyBvbmUgZXh0cmEgYnl0ZSBpbiBjZXJ0YWluIGNhc2VzCistIEluIGd6aW8gZGVzdHJveSgpLCBkb24ndCByZWZlcmVuY2UgYSBmcmVlZCBzdHJ1Y3R1cmUKKy0gYXZvaWQgbWFueSB3YXJuaW5ncyBmb3IgTVNET1MKKy0gYXZvaWQgdGhlIEVSUk9SIHN5bWJvbCB3aGljaCBpcyB1c2VkIGJ5IE1TIFdpbmRvd3MKKworQ2hhbmdlcyBpbiAwLjcxICgxNCBBcHJpbCA5NSkKKy0gRml4ZWQgbW9yZSBNU0RPUyBjb21waWxhdGlvbiBwcm9ibGVtcyA6KCBUaGVyZSBpcyBzdGlsbCBhIGJ1ZyB3aXRoCisgIFR1cmJvQyBsYXJnZSBtb2RlbC4KKworQ2hhbmdlcyBpbiAwLjcgKDE0IEFwcmlsIDk1KQorLSBBZGRlZCBmdWxsIGluZmxhdGUgc3VwcG9ydC4KKy0gU2ltcGxpZmllZCB0aGUgY3JjMzIoKSBpbnRlcmZhY2UuIFRoZSBwcmUtIGFuZCBwb3N0LWNvbmRpdGlvbmluZworICAob25lJ3MgY29tcGxlbWVudCkgaXMgbm93IGRvbmUgaW5zaWRlIGNyYzMyKCkuIFdBUk5JTkc6IHRoaXMgaXMKKyAgaW5jb21wYXRpYmxlIHdpdGggcHJldmlvdXMgdmVyc2lvbnM7IHNlZSB6bGliLmggZm9yIHRoZSBuZXcgdXNhZ2UuCisKK0NoYW5nZXMgaW4gMC42MSAoMTIgQXByaWwgOTUpCistIHdvcmthcm91bmQgZm9yIGEgYnVnIGluIFR1cmJvQy4gZXhhbXBsZSBhbmQgbWluaWd6aXAgbm93IHdvcmsgb24gTVNET1MuCisKK0NoYW5nZXMgaW4gMC42ICgxMSBBcHJpbCA5NSkKKy0gYWRkZWQgbWluaWd6aXAuYworLSBhZGRlZCBnemRvcGVuIHRvIHJlb3BlbiBhIGZpbGUgZGVzY3JpcHRvciBhcyBnekZpbGUKKy0gYWRkZWQgdHJhbnNwYXJlbnQgcmVhZGluZyBvZiBub24tZ3ppcGVkIGZpbGVzIGluIGd6cmVhZC4KKy0gZml4ZWQgYnVnIGluIGd6cmVhZCAoZG9uJ3QgcmVhZCBjcmMgYXMgZGF0YSkKKy0gZml4ZWQgYnVnIGluIGRlc3Ryb3kgKGd6aW8uYykgKGRvbid0IHJldHVybiBaX1NUUkVBTV9FTkQgZm9yIGd6Y2xvc2UpLgorLSBkb24ndCBhbGxvY2F0ZSBiaWcgYXJyYXlzIGluIHRoZSBzdGFjayAoZm9yIE1TRE9TKQorLSBmaXggc29tZSBNU0RPUyBjb21waWxhdGlvbiBwcm9ibGVtcworCitDaGFuZ2VzIGluIDAuNToKKy0gZG8gcmVhbCBjb21wcmVzc2lvbiBpbiBkZWZsYXRlLmMuIFpfUEFSVElBTF9GTFVTSCBpcyBzdXBwb3J0ZWQgYnV0CisgIG5vdCB5ZXQgWl9GVUxMX0ZMVVNILgorLSBzdXBwb3J0IGRlY29tcHJlc3Npb24gYnV0IG9ubHkgaW4gYSBzaW5nbGUgc3RlcCAoZm9yY2VkIFpfRklOSVNIKQorLSBhZGRlZCBvcGFxdWUgb2JqZWN0IGZvciB6YWxsb2MgYW5kIHpmcmVlLgorLSBhZGRlZCBkZWZsYXRlUmVzZXQgYW5kIGluZmxhdGVSZXNldAorLSBhZGRlZCBhIHZhcmlhYmxlIHpsaWJfdmVyc2lvbiBmb3IgY29uc2lzdGVuY3kgY2hlY2tpbmcuCistIHJlbmFtZWQgdGhlICdmaWx0ZXInIHBhcmFtZXRlciBvZiBkZWZsYXRlSW5pdDIgYXMgJ3N0cmF0ZWd5Jy4KKyAgQWRkZWQgWl9GSUxURVJFRCBhbmQgWl9IVUZGTUFOX09OTFkgY29uc3RhbnRzLgorCitDaGFuZ2VzIGluIDAuNDoKKy0gYXZvaWQgInppcCIgZXZlcnl3aGVyZSwgdXNlIHpsaWIgaW5zdGVhZCBvZiB6aXBsaWIuCistIHN1cHByZXNzIFpfQkxPQ0tfRkxVU0gsIGludGVycHJldCBaX1BBUlRJQUxfRkxVU0ggYXMgYmxvY2sgZmx1c2gKKyAgaWYgY29tcHJlc3Npb24gbWV0aG9kID09IDguCistIGFkZGVkIGFkbGVyMzIgYW5kIGNyYzMyCistIHJlbmFtZWQgZGVmbGF0ZU9wdGlvbnMgYXMgZGVmbGF0ZUluaXQyLCBjYWxsIG9uZSBvciB0aGUgb3RoZXIgYnV0IG5vdCBib3RoCistIGFkZGVkIHRoZSBtZXRob2QgcGFyYW1ldGVyIGZvciBkZWZsYXRlSW5pdDIuCistIGFkZGVkIGluZmxhdGVJbml0MgorLSBzaW1wbGllZCBjb25zaWRlcmFibHkgZGVmbGF0ZUluaXQgYW5kIGluZmxhdGVJbml0IGJ5IG5vdCBzdXBwb3J0aW5nCisgIHVzZXItcHJvdmlkZWQgaGlzdG9yeSBidWZmZXIuIFRoaXMgaXMgc3VwcG9ydGVkIG9ubHkgaW4gZGVmbGF0ZUluaXQyCisgIGFuZCBpbmZsYXRlSW5pdDIuCisKK0NoYW5nZXMgaW4gMC4zOgorLSBwcmVmaXggYWxsIG1hY3JvIG5hbWVzIHdpdGggWl8KKy0gdXNlIFpfRklOSVNIIGluc3RlYWQgb2YgZGVmbGF0ZUVuZCB0byBmaW5pc2ggY29tcHJlc3Npb24uCistIGFkZGVkIFpfSFVGRk1BTl9PTkxZCistIGFkZGVkIGd6ZXJyb3IoKQpkaWZmIC0tZ2l0IGEvemxpYi0xLjIuNi9GQVEgYi96bGliLTEuMi42L0ZBUQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWI3Y2Y5Ci0tLSAvZGV2L251bGwKKysrIGIvemxpYi0xLjIuNi9GQVEKQEAgLTAsMCArMSwzNjggQEAKKworICAgICAgICAgICAgICAgIEZyZXF1ZW50bHkgQXNrZWQgUXVlc3Rpb25zIGFib3V0IHpsaWIKKworCitJZiB5b3VyIHF1ZXN0aW9uIGlzIG5vdCB0aGVyZSwgcGxlYXNlIGNoZWNrIHRoZSB6bGliIGhvbWUgcGFnZQoraHR0cDovL3psaWIubmV0LyB3aGljaCBtYXkgaGF2ZSBtb3JlIHJlY2VudCBpbmZvcm1hdGlvbi4KK1RoZSBsYXN0ZXN0IHpsaWIgRkFRIGlzIGF0IGh0dHA6Ly96bGliLm5ldC96bGliX2ZhcS5odG1sCisKKworIDEuIElzIHpsaWIgWTJLLWNvbXBsaWFudD8KKworICAgIFllcy4gemxpYiBkb2Vzbid0IGhhbmRsZSBkYXRlcy4KKworIDIuIFdoZXJlIGNhbiBJIGdldCBhIFdpbmRvd3MgRExMIHZlcnNpb24/CisKKyAgICBUaGUgemxpYiBzb3VyY2VzIGNhbiBiZSBjb21waWxlZCB3aXRob3V0IGNoYW5nZSB0byBwcm9kdWNlIGEgRExMLiAgU2VlIHRoZQorICAgIGZpbGUgd2luMzIvRExMX0ZBUS50eHQgaW4gdGhlIHpsaWIgZGlzdHJpYnV0aW9uLiAgUG9pbnRlcnMgdG8gdGhlCisgICAgcHJlY29tcGlsZWQgRExMIGFyZSBmb3VuZCBpbiB0aGUgemxpYiB3ZWIgc2l0ZSBhdCBodHRwOi8vemxpYi5uZXQvIC4KKworIDMuIFdoZXJlIGNhbiBJIGdldCBhIFZpc3VhbCBCYXNpYyBpbnRlcmZhY2UgdG8gemxpYj8KKworICAgIFNlZQorICAgICAgICAqIGh0dHA6Ly9tYXJrbmVsc29uLnVzLzE5OTcvMDEvMDEvemxpYi1lbmdpbmUvCisgICAgICAgICogd2luMzIvRExMX0ZBUS50eHQgaW4gdGhlIHpsaWIgZGlzdHJpYnV0aW9uCisKKyA0LiBjb21wcmVzcygpIHJldHVybnMgWl9CVUZfRVJST1IuCisKKyAgICBNYWtlIHN1cmUgdGhhdCBiZWZvcmUgdGhlIGNhbGwgb2YgY29tcHJlc3MoKSwgdGhlIGxlbmd0aCBvZiB0aGUgY29tcHJlc3NlZAorICAgIGJ1ZmZlciBpcyBlcXVhbCB0byB0aGUgYXZhaWxhYmxlIHNpemUgb2YgdGhlIGNvbXByZXNzZWQgYnVmZmVyIGFuZCBub3QKKyAgICB6ZXJvLiAgRm9yIFZpc3VhbCBCYXNpYywgY2hlY2sgdGhhdCB0aGlzIHBhcmFtZXRlciBpcyBwYXNzZWQgYnkgcmVmZXJlbmNlCisgICAgKCJhcyBhbnkiKSwgbm90IGJ5IHZhbHVlICgiYXMgbG9uZyIpLgorCisgNS4gZGVmbGF0ZSgpIG9yIGluZmxhdGUoKSByZXR1cm5zIFpfQlVGX0VSUk9SLgorCisgICAgQmVmb3JlIG1ha2luZyB0aGUgY2FsbCwgbWFrZSBzdXJlIHRoYXQgYXZhaWxfaW4gYW5kIGF2YWlsX291dCBhcmUgbm90IHplcm8uCisgICAgV2hlbiBzZXR0aW5nIHRoZSBwYXJhbWV0ZXIgZmx1c2ggZXF1YWwgdG8gWl9GSU5JU0gsIGFsc28gbWFrZSBzdXJlIHRoYXQKKyAgICBhdmFpbF9vdXQgaXMgYmlnIGVub3VnaCB0byBhbGxvdyBwcm9jZXNzaW5nIGFsbCBwZW5kaW5nIGlucHV0LiAgTm90ZSB0aGF0IGEKKyAgICBaX0JVRl9FUlJPUiBpcyBub3QgZmF0YWwtLWFub3RoZXIgY2FsbCB0byBkZWZsYXRlKCkgb3IgaW5mbGF0ZSgpIGNhbiBiZQorICAgIG1hZGUgd2l0aCBtb3JlIGlucHV0IG9yIG91dHB1dCBzcGFjZS4gIEEgWl9CVUZfRVJST1IgbWF5IGluIGZhY3QgYmUKKyAgICB1bmF2b2lkYWJsZSBkZXBlbmRpbmcgb24gaG93IHRoZSBmdW5jdGlvbnMgYXJlIHVzZWQsIHNpbmNlIGl0IGlzIG5vdAorICAgIHBvc3NpYmxlIHRvIHRlbGwgd2hldGhlciBvciBub3QgdGhlcmUgaXMgbW9yZSBvdXRwdXQgcGVuZGluZyB3aGVuCisgICAgc3RybS5hdmFpbF9vdXQgcmV0dXJucyB3aXRoIHplcm8uICBTZWUgaHR0cDovL3psaWIubmV0L3psaWJfaG93Lmh0bWwgZm9yIGEKKyAgICBoZWF2aWx5IGFubm90YXRlZCBleGFtcGxlLgorCisgNi4gV2hlcmUncyB0aGUgemxpYiBkb2N1bWVudGF0aW9uIChtYW4gcGFnZXMsIGV0Yy4pPworCisgICAgSXQncyBpbiB6bGliLmggLiAgRXhhbXBsZXMgb2YgemxpYiB1c2FnZSBhcmUgaW4gdGhlIGZpbGVzIHRlc3QvZXhhbXBsZS5jCisgICAgYW5kIHRlc3QvbWluaWd6aXAuYywgd2l0aCBtb3JlIGluIGV4YW1wbGVzLyAuCisKKyA3LiBXaHkgZG9uJ3QgeW91IHVzZSBHTlUgYXV0b2NvbmYgb3IgbGlidG9vbCBvciAuLi4/CisKKyAgICBCZWNhdXNlIHdlIHdvdWxkIGxpa2UgdG8ga2VlcCB6bGliIGFzIGEgdmVyeSBzbWFsbCBhbmQgc2ltcGxlIHBhY2thZ2UuCisgICAgemxpYiBpcyByYXRoZXIgcG9ydGFibGUgYW5kIGRvZXNuJ3QgbmVlZCBtdWNoIGNvbmZpZ3VyYXRpb24uCisKKyA4LiBJIGZvdW5kIGEgYnVnIGluIHpsaWIuCisKKyAgICBNb3N0IG9mIHRoZSB0aW1lLCBzdWNoIHByb2JsZW1zIGFyZSBkdWUgdG8gYW4gaW5jb3JyZWN0IHVzYWdlIG9mIHpsaWIuCisgICAgUGxlYXNlIHRyeSB0byByZXByb2R1Y2UgdGhlIHByb2JsZW0gd2l0aCBhIHNtYWxsIHByb2dyYW0gYW5kIHNlbmQgdGhlCisgICAgY29ycmVzcG9uZGluZyBzb3VyY2UgdG8gdXMgYXQgemxpYkBnemlwLm9yZyAuICBEbyBub3Qgc2VuZCBtdWx0aS1tZWdhYnl0ZQorICAgIGRhdGEgZmlsZXMgd2l0aG91dCBwcmlvciBhZ3JlZW1lbnQuCisKKyA5LiBXaHkgZG8gSSBnZXQgInVuZGVmaW5lZCByZWZlcmVuY2UgdG8gZ3pwdXRjIj8KKworICAgIElmICJtYWtlIHRlc3QiIHByb2R1Y2VzIHNvbWV0aGluZyBsaWtlCisKKyAgICAgICBleGFtcGxlLm8oLnRleHQrMHgxNTQpOiB1bmRlZmluZWQgcmVmZXJlbmNlIHRvIGBnenB1dGMnCisKKyAgICBjaGVjayB0aGF0IHlvdSBkb24ndCBoYXZlIG9sZCBmaWxlcyBsaWJ6LiogaW4gL3Vzci9saWIsIC91c3IvbG9jYWwvbGliIG9yCisgICAgL3Vzci9YMTFSNi9saWIuIFJlbW92ZSBhbnkgb2xkIHZlcnNpb25zLCB0aGVuIGRvICJtYWtlIGluc3RhbGwiLgorCisxMC4gSSBuZWVkIGEgRGVscGhpIGludGVyZmFjZSB0byB6bGliLgorCisgICAgU2VlIHRoZSBjb250cmliL2RlbHBoaSBkaXJlY3RvcnkgaW4gdGhlIHpsaWIgZGlzdHJpYnV0aW9uLgorCisxMS4gQ2FuIHpsaWIgaGFuZGxlIC56aXAgYXJjaGl2ZXM/CisKKyAgICBOb3QgYnkgaXRzZWxmLCBuby4gIFNlZSB0aGUgZGlyZWN0b3J5IGNvbnRyaWIvbWluaXppcCBpbiB0aGUgemxpYgorICAgIGRpc3RyaWJ1dGlvbi4KKworMTIuIENhbiB6bGliIGhhbmRsZSAuWiBmaWxlcz8KKworICAgIE5vLCBzb3JyeS4gIFlvdSBoYXZlIHRvIHNwYXduIGFuIHVuY29tcHJlc3Mgb3IgZ3VuemlwIHN1YnByb2Nlc3MsIG9yIGFkYXB0CisgICAgdGhlIGNvZGUgb2YgdW5jb21wcmVzcyBvbiB5b3VyIG93bi4KKworMTMuIEhvdyBjYW4gSSBtYWtlIGEgVW5peCBzaGFyZWQgbGlicmFyeT8KKworICAgIEJ5IGRlZmF1bHQgYSBzaGFyZWQgKGFuZCBhIHN0YXRpYykgbGlicmFyeSBpcyBidWlsdCBmb3IgVW5peC4gIFNvOgorCisgICAgbWFrZSBkaXN0Y2xlYW4KKyAgICAuL2NvbmZpZ3VyZQorICAgIG1ha2UKKworMTQuIEhvdyBkbyBJIGluc3RhbGwgYSBzaGFyZWQgemxpYiBsaWJyYXJ5IG9uIFVuaXg/CisKKyAgICBBZnRlciB0aGUgYWJvdmUsIHRoZW46CisKKyAgICBtYWtlIGluc3RhbGwKKworICAgIEhvd2V2ZXIsIG1hbnkgZmxhdm9ycyBvZiBVbml4IGNvbWUgd2l0aCBhIHNoYXJlZCB6bGliIGFscmVhZHkgaW5zdGFsbGVkLgorICAgIEJlZm9yZSBnb2luZyB0byB0aGUgdHJvdWJsZSBvZiBjb21waWxpbmcgYSBzaGFyZWQgdmVyc2lvbiBvZiB6bGliIGFuZAorICAgIHRyeWluZyB0byBpbnN0YWxsIGl0LCB5b3UgbWF5IHdhbnQgdG8gY2hlY2sgaWYgaXQncyBhbHJlYWR5IHRoZXJlISAgSWYgeW91CisgICAgY2FuICNpbmNsdWRlIDx6bGliLmg+LCBpdCdzIHRoZXJlLiAgVGhlIC1seiBvcHRpb24gd2lsbCBwcm9iYWJseSBsaW5rIHRvCisgICAgaXQuICBZb3UgY2FuIGNoZWNrIHRoZSB2ZXJzaW9uIGF0IHRoZSB0b3Agb2YgemxpYi5oIG9yIHdpdGggdGhlCisgICAgWkxJQl9WRVJTSU9OIHN5bWJvbCBkZWZpbmVkIGluIHpsaWIuaCAuCisKKzE1LiBJIGhhdmUgYSBxdWVzdGlvbiBhYm91dCBPdHRvUERGLgorCisgICAgV2UgYXJlIG5vdCB0aGUgYXV0aG9ycyBvZiBPdHRvUERGLiBUaGUgcmVhbCBhdXRob3IgaXMgb24gdGhlIE90dG9QREYgd2ViCisgICAgc2l0ZTogSm9lbCBIYWlubGV5LCBqaGFpbmxleUBteW5ka3J5bWUuY29tLgorCisxNi4gQ2FuIHpsaWIgZGVjb2RlIEZsYXRlIGRhdGEgaW4gYW4gQWRvYmUgUERGIGZpbGU/CisKKyAgICBZZXMuIFNlZSBodHRwOi8vd3d3LnBkZmxpYi5jb20vIC4gVG8gbW9kaWZ5IFBERiBmb3Jtcywgc2VlCisgICAgaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9hY3JvZm9ybXRvb2wvIC4KKworMTcuIFdoeSBhbSBJIGdldHRpbmcgdGhpcyAicmVnaXN0ZXJfZnJhbWVfaW5mbyBub3QgZm91bmQiIGVycm9yIG9uIFNvbGFyaXM/CisKKyAgICBBZnRlciBpbnN0YWxsaW5nIHpsaWIgMS4xLjQgb24gU29sYXJpcyAyLjYsIHJ1bm5pbmcgYXBwbGljYXRpb25zIHVzaW5nIHpsaWIKKyAgICBnZW5lcmF0ZXMgYW4gZXJyb3Igc3VjaCBhczoKKworICAgICAgICBsZC5zby4xOiBycG06IGZhdGFsOiByZWxvY2F0aW9uIGVycm9yOiBmaWxlIC91c3IvbG9jYWwvbGliL2xpYnouc286CisgICAgICAgIHN5bWJvbCBfX3JlZ2lzdGVyX2ZyYW1lX2luZm86IHJlZmVyZW5jZWQgc3ltYm9sIG5vdCBmb3VuZAorCisgICAgVGhlIHN5bWJvbCBfX3JlZ2lzdGVyX2ZyYW1lX2luZm8gaXMgbm90IHBhcnQgb2YgemxpYiwgaXQgaXMgZ2VuZXJhdGVkIGJ5CisgICAgdGhlIEMgY29tcGlsZXIgKGNjIG9yIGdjYykuICBZb3UgbXVzdCByZWNvbXBpbGUgYXBwbGljYXRpb25zIHVzaW5nIHpsaWIKKyAgICB3aGljaCBoYXZlIHRoaXMgcHJvYmxlbS4gIFRoaXMgcHJvYmxlbSBpcyBzcGVjaWZpYyB0byBTb2xhcmlzLiAgU2VlCisgICAgaHR0cDovL3d3dy5zdW5mcmVld2FyZS5jb20gZm9yIFNvbGFyaXMgdmVyc2lvbnMgb2YgemxpYiBhbmQgYXBwbGljYXRpb25zCisgICAgdXNpbmcgemxpYi4KKworMTguIFdoeSBkb2VzIGd6aXAgZ2l2ZSBhbiBlcnJvciBvbiBhIGZpbGUgSSBtYWtlIHdpdGggY29tcHJlc3MvZGVmbGF0ZT8KKworICAgIFRoZSBjb21wcmVzcyBhbmQgZGVmbGF0ZSBmdW5jdGlvbnMgcHJvZHVjZSBkYXRhIGluIHRoZSB6bGliIGZvcm1hdCwgd2hpY2gKKyAgICBpcyBkaWZmZXJlbnQgYW5kIGluY29tcGF0aWJsZSB3aXRoIHRoZSBnemlwIGZvcm1hdC4gIFRoZSBneiogZnVuY3Rpb25zIGluCisgICAgemxpYiBvbiB0aGUgb3RoZXIgaGFuZCB1c2UgdGhlIGd6aXAgZm9ybWF0LiAgQm90aCB0aGUgemxpYiBhbmQgZ3ppcCBmb3JtYXRzCisgICAgdXNlIHRoZSBzYW1lIGNvbXByZXNzZWQgZGF0YSBmb3JtYXQgaW50ZXJuYWxseSwgYnV0IGhhdmUgZGlmZmVyZW50IGhlYWRlcnMKKyAgICBhbmQgdHJhaWxlcnMgYXJvdW5kIHRoZSBjb21wcmVzc2VkIGRhdGEuCisKKzE5LiBPaywgc28gd2h5IGFyZSB0aGVyZSB0d28gZGlmZmVyZW50IGZvcm1hdHM/CisKKyAgICBUaGUgZ3ppcCBmb3JtYXQgd2FzIGRlc2lnbmVkIHRvIHJldGFpbiB0aGUgZGlyZWN0b3J5IGluZm9ybWF0aW9uIGFib3V0IGEKKyAgICBzaW5nbGUgZmlsZSwgc3VjaCBhcyB0aGUgbmFtZSBhbmQgbGFzdCBtb2RpZmljYXRpb24gZGF0ZS4gIFRoZSB6bGliIGZvcm1hdAorICAgIG9uIHRoZSBvdGhlciBoYW5kIHdhcyBkZXNpZ25lZCBmb3IgaW4tbWVtb3J5IGFuZCBjb21tdW5pY2F0aW9uIGNoYW5uZWwKKyAgICBhcHBsaWNhdGlvbnMsIGFuZCBoYXMgYSBtdWNoIG1vcmUgY29tcGFjdCBoZWFkZXIgYW5kIHRyYWlsZXIgYW5kIHVzZXMgYQorICAgIGZhc3RlciBpbnRlZ3JpdHkgY2hlY2sgdGhhbiBnemlwLgorCisyMC4gV2VsbCB0aGF0J3MgbmljZSwgYnV0IGhvdyBkbyBJIG1ha2UgYSBnemlwIGZpbGUgaW4gbWVtb3J5PworCisgICAgWW91IGNhbiByZXF1ZXN0IHRoYXQgZGVmbGF0ZSB3cml0ZSB0aGUgZ3ppcCBmb3JtYXQgaW5zdGVhZCBvZiB0aGUgemxpYgorICAgIGZvcm1hdCB1c2luZyBkZWZsYXRlSW5pdDIoKS4gIFlvdSBjYW4gYWxzbyByZXF1ZXN0IHRoYXQgaW5mbGF0ZSBkZWNvZGUgdGhlCisgICAgZ3ppcCBmb3JtYXQgdXNpbmcgaW5mbGF0ZUluaXQyKCkuICBSZWFkIHpsaWIuaCBmb3IgbW9yZSBkZXRhaWxzLgorCisyMS4gSXMgemxpYiB0aHJlYWQtc2FmZT8KKworICAgIFllcy4gIEhvd2V2ZXIgYW55IGxpYnJhcnkgcm91dGluZXMgdGhhdCB6bGliIHVzZXMgYW5kIGFueSBhcHBsaWNhdGlvbi0KKyAgICBwcm92aWRlZCBtZW1vcnkgYWxsb2NhdGlvbiByb3V0aW5lcyBtdXN0IGFsc28gYmUgdGhyZWFkLXNhZmUuICB6bGliJ3MgZ3oqCisgICAgZnVuY3Rpb25zIHVzZSBzdGRpbyBsaWJyYXJ5IHJvdXRpbmVzLCBhbmQgbW9zdCBvZiB6bGliJ3MgZnVuY3Rpb25zIHVzZSB0aGUKKyAgICBsaWJyYXJ5IG1lbW9yeSBhbGxvY2F0aW9uIHJvdXRpbmVzIGJ5IGRlZmF1bHQuICB6bGliJ3MgKkluaXQqIGZ1bmN0aW9ucworICAgIGFsbG93IGZvciB0aGUgYXBwbGljYXRpb24gdG8gcHJvdmlkZSBjdXN0b20gbWVtb3J5IGFsbG9jYXRpb24gcm91dGluZXMuCisKKyAgICBPZiBjb3Vyc2UsIHlvdSBzaG91bGQgb25seSBvcGVyYXRlIG9uIGFueSBnaXZlbiB6bGliIG9yIGd6aXAgc3RyZWFtIGZyb20gYQorICAgIHNpbmdsZSB0aHJlYWQgYXQgYSB0aW1lLgorCisyMi4gQ2FuIEkgdXNlIHpsaWIgaW4gbXkgY29tbWVyY2lhbCBhcHBsaWNhdGlvbj8KKworICAgIFllcy4gIFBsZWFzZSByZWFkIHRoZSBsaWNlbnNlIGluIHpsaWIuaC4KKworMjMuIElzIHpsaWIgdW5kZXIgdGhlIEdOVSBsaWNlbnNlPworCisgICAgTm8uICBQbGVhc2UgcmVhZCB0aGUgbGljZW5zZSBpbiB6bGliLmguCisKKzI0LiBUaGUgbGljZW5zZSBzYXlzIHRoYXQgYWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSAicGxhaW5seSBtYXJrZWQiLiBTbworICAgIHdoYXQgZXhhY3RseSBkbyBJIG5lZWQgdG8gZG8gdG8gbWVldCB0aGF0IHJlcXVpcmVtZW50PworCisgICAgWW91IG5lZWQgdG8gY2hhbmdlIHRoZSBaTElCX1ZFUlNJT04gYW5kIFpMSUJfVkVSTlVNICNkZWZpbmVzIGluIHpsaWIuaC4gIEluCisgICAgcGFydGljdWxhciwgdGhlIGZpbmFsIHZlcnNpb24gbnVtYmVyIG5lZWRzIHRvIGJlIGNoYW5nZWQgdG8gImYiLCBhbmQgYW4KKyAgICBpZGVudGlmaWNhdGlvbiBzdHJpbmcgc2hvdWxkIGJlIGFwcGVuZGVkIHRvIFpMSUJfVkVSU0lPTi4gIFZlcnNpb24gbnVtYmVycworICAgIHgueC54LmYgYXJlIHJlc2VydmVkIGZvciBtb2RpZmljYXRpb25zIHRvIHpsaWIgYnkgb3RoZXJzIHRoYW4gdGhlIHpsaWIKKyAgICBtYWludGFpbmVycy4gIEZvciBleGFtcGxlLCBpZiB0aGUgdmVyc2lvbiBvZiB0aGUgYmFzZSB6bGliIHlvdSBhcmUgYWx0ZXJpbmcKKyAgICBpcyAiMS4yLjMuNCIsIHRoZW4gaW4gemxpYi5oIHlvdSBzaG91bGQgY2hhbmdlIFpMSUJfVkVSTlVNIHRvIDB4MTIzZiwgYW5kCisgICAgWkxJQl9WRVJTSU9OIHRvIHNvbWV0aGluZyBsaWtlICIxLjIuMy5mLXphY2hhcnktbW9kcy12MyIuICBZb3UgY2FuIGFsc28KKyAgICB1cGRhdGUgdGhlIHZlcnNpb24gc3RyaW5ncyBpbiBkZWZsYXRlLmMgYW5kIGluZnRyZWVzLmMuCisKKyAgICBGb3IgYWx0ZXJlZCBzb3VyY2UgZGlzdHJpYnV0aW9ucywgeW91IHNob3VsZCBhbHNvIG5vdGUgdGhlIG9yaWdpbiBhbmQKKyAgICBuYXR1cmUgb2YgdGhlIGNoYW5nZXMgaW4gemxpYi5oLCBhcyB3ZWxsIGFzIGluIENoYW5nZUxvZyBhbmQgUkVBRE1FLCBhbG9uZworICAgIHdpdGggdGhlIGRhdGVzIG9mIHRoZSBhbHRlcmF0aW9ucy4gIFRoZSBvcmlnaW4gc2hvdWxkIGluY2x1ZGUgYXQgbGVhc3QgeW91cgorICAgIG5hbWUgKG9yIHlvdXIgY29tcGFueSdzIG5hbWUpLCBhbmQgYW4gZW1haWwgYWRkcmVzcyB0byBjb250YWN0IGZvciBoZWxwIG9yCisgICAgaXNzdWVzIHdpdGggdGhlIGxpYnJhcnkuCisKKyAgICBOb3RlIHRoYXQgZGlzdHJpYnV0aW5nIGEgY29tcGlsZWQgemxpYiBsaWJyYXJ5IGFsb25nIHdpdGggemxpYi5oIGFuZAorICAgIHpjb25mLmggaXMgYWxzbyBhIHNvdXJjZSBkaXN0cmlidXRpb24sIGFuZCBzbyB5b3Ugc2hvdWxkIGNoYW5nZQorICAgIFpMSUJfVkVSU0lPTiBhbmQgWkxJQl9WRVJOVU0gYW5kIG5vdGUgdGhlIG9yaWdpbiBhbmQgbmF0dXJlIG9mIHRoZSBjaGFuZ2VzCisgICAgaW4gemxpYi5oIGFzIHlvdSB3b3VsZCBmb3IgYSBmdWxsIHNvdXJjZSBkaXN0cmlidXRpb24uCisKKzI1LiBXaWxsIHpsaWIgd29yayBvbiBhIGJpZy1lbmRpYW4gb3IgbGl0dGxlLWVuZGlhbiBhcmNoaXRlY3R1cmUsIGFuZCBjYW4gSQorICAgIGV4Y2hhbmdlIGNvbXByZXNzZWQgZGF0YSBiZXR3ZWVuIHRoZW0/CisKKyAgICBZZXMgYW5kIHllcy4KKworMjYuIFdpbGwgemxpYiB3b3JrIG9uIGEgNjQtYml0IG1hY2hpbmU/CisKKyAgICBZZXMuICBJdCBoYXMgYmVlbiB0ZXN0ZWQgb24gNjQtYml0IG1hY2hpbmVzLCBhbmQgaGFzIG5vIGRlcGVuZGVuY2Ugb24gYW55CisgICAgZGF0YSB0eXBlcyBiZWluZyBsaW1pdGVkIHRvIDMyLWJpdHMgaW4gbGVuZ3RoLiAgSWYgeW91IGhhdmUgYW55CisgICAgZGlmZmljdWx0aWVzLCBwbGVhc2UgcHJvdmlkZSBhIGNvbXBsZXRlIHByb2JsZW0gcmVwb3J0IHRvIHpsaWJAZ3ppcC5vcmcKKworMjcuIFdpbGwgemxpYiBkZWNvbXByZXNzIGRhdGEgZnJvbSB0aGUgUEtXYXJlIERhdGEgQ29tcHJlc3Npb24gTGlicmFyeT8KKworICAgIE5vLiAgVGhlIFBLV2FyZSBEQ0wgdXNlcyBhIGNvbXBsZXRlbHkgZGlmZmVyZW50IGNvbXByZXNzZWQgZGF0YSBmb3JtYXQgdGhhbgorICAgIGRvZXMgUEtaSVAgYW5kIHpsaWIuICBIb3dldmVyLCB5b3UgY2FuIGxvb2sgaW4gemxpYidzIGNvbnRyaWIvYmxhc3QKKyAgICBkaXJlY3RvcnkgZm9yIGEgcG9zc2libGUgc29sdXRpb24gdG8geW91ciBwcm9ibGVtLgorCisyOC4gQ2FuIEkgYWNjZXNzIGRhdGEgcmFuZG9tbHkgaW4gYSBjb21wcmVzc2VkIHN0cmVhbT8KKworICAgIE5vLCBub3Qgd2l0aG91dCBzb21lIHByZXBhcmF0aW9uLiAgSWYgd2hlbiBjb21wcmVzc2luZyB5b3UgcGVyaW9kaWNhbGx5IHVzZQorICAgIFpfRlVMTF9GTFVTSCwgY2FyZWZ1bGx5IHdyaXRlIGFsbCB0aGUgcGVuZGluZyBkYXRhIGF0IHRob3NlIHBvaW50cywgYW5kCisgICAga2VlcCBhbiBpbmRleCBvZiB0aG9zZSBsb2NhdGlvbnMsIHRoZW4geW91IGNhbiBzdGFydCBkZWNvbXByZXNzaW9uIGF0IHRob3NlCisgICAgcG9pbnRzLiAgWW91IGhhdmUgdG8gYmUgY2FyZWZ1bCB0byBub3QgdXNlIFpfRlVMTF9GTFVTSCB0b28gb2Z0ZW4sIHNpbmNlIGl0CisgICAgY2FuIHNpZ25pZmljYW50bHkgZGVncmFkZSBjb21wcmVzc2lvbi4gIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gc2NhbiBhCisgICAgZGVmbGF0ZSBzdHJlYW0gb25jZSB0byBnZW5lcmF0ZSBhbiBpbmRleCwgYW5kIHRoZW4gdXNlIHRoYXQgaW5kZXggZm9yCisgICAgcmFuZG9tIGFjY2Vzcy4gIFNlZSBleGFtcGxlcy96cmFuLmMgLgorCisyOS4gRG9lcyB6bGliIHdvcmsgb24gTVZTLCBPUy8zOTAsIENJQ1MsIGV0Yy4/CisKKyAgICBJdCBoYXMgaW4gdGhlIHBhc3QsIGJ1dCB3ZSBoYXZlIG5vdCBoZWFyZCBvZiBhbnkgcmVjZW50IGV2aWRlbmNlLiAgVGhlcmUKKyAgICB3ZXJlIHdvcmtpbmcgcG9ydHMgb2YgemxpYiAxLjEuNCB0byBNVlMsIGJ1dCB0aG9zZSBsaW5rcyBubyBsb25nZXIgd29yay4KKyAgICBJZiB5b3Uga25vdyBvZiByZWNlbnQsIHN1Y2Nlc3NmdWwgYXBwbGljYXRpb25zIG9mIHpsaWIgb24gdGhlc2Ugb3BlcmF0aW5nCisgICAgc3lzdGVtcywgcGxlYXNlIGxldCB1cyBrbm93LiAgVGhhbmtzLgorCiszMC4gSXMgdGhlcmUgc29tZSBzaW1wbGVyLCBlYXNpZXIgdG8gcmVhZCB2ZXJzaW9uIG9mIGluZmxhdGUgSSBjYW4gbG9vayBhdCB0bworICAgIHVuZGVyc3RhbmQgdGhlIGRlZmxhdGUgZm9ybWF0PworCisgICAgRmlyc3Qgb2ZmLCB5b3Ugc2hvdWxkIHJlYWQgUkZDIDE5NTEuICBTZWNvbmQsIHllcy4gIExvb2sgaW4gemxpYidzCisgICAgY29udHJpYi9wdWZmIGRpcmVjdG9yeS4KKworMzEuIERvZXMgemxpYiBpbmZyaW5nZSBvbiBhbnkgcGF0ZW50cz8KKworICAgIEFzIGZhciBhcyB3ZSBrbm93LCBuby4gIEluIGZhY3QsIHRoYXQgd2FzIG9yaWdpbmFsbHkgdGhlIHdob2xlIHBvaW50IGJlaGluZAorICAgIHpsaWIuICBMb29rIGhlcmUgZm9yIHNvbWUgbW9yZSBpbmZvcm1hdGlvbjoKKworICAgIGh0dHA6Ly93d3cuZ3ppcC5vcmcvI2ZhcTExCisKKzMyLiBDYW4gemxpYiB3b3JrIHdpdGggZ3JlYXRlciB0aGFuIDQgR0Igb2YgZGF0YT8KKworICAgIFllcy4gIGluZmxhdGUoKSBhbmQgZGVmbGF0ZSgpIHdpbGwgcHJvY2VzcyBhbnkgYW1vdW50IG9mIGRhdGEgY29ycmVjdGx5LgorICAgIEVhY2ggY2FsbCBvZiBpbmZsYXRlKCkgb3IgZGVmbGF0ZSgpIGlzIGxpbWl0ZWQgdG8gaW5wdXQgYW5kIG91dHB1dCBjaHVua3MKKyAgICBvZiB0aGUgbWF4aW11bSB2YWx1ZSB0aGF0IGNhbiBiZSBzdG9yZWQgaW4gdGhlIGNvbXBpbGVyJ3MgInVuc2lnbmVkIGludCIKKyAgICB0eXBlLCBidXQgdGhlcmUgaXMgbm8gbGltaXQgdG8gdGhlIG51bWJlciBvZiBjaHVua3MuICBOb3RlIGhvd2V2ZXIgdGhhdCB0aGUKKyAgICBzdHJtLnRvdGFsX2luIGFuZCBzdHJtX3RvdGFsX291dCBjb3VudGVycyBtYXkgYmUgbGltaXRlZCB0byA0IEdCLiAgVGhlc2UKKyAgICBjb3VudGVycyBhcmUgcHJvdmlkZWQgYXMgYSBjb252ZW5pZW5jZSBhbmQgYXJlIG5vdCB1c2VkIGludGVybmFsbHkgYnkKKyAgICBpbmZsYXRlKCkgb3IgZGVmbGF0ZSgpLiAgVGhlIGFwcGxpY2F0aW9uIGNhbiBlYXNpbHkgc2V0IHVwIGl0cyBvd24gY291bnRlcnMKKyAgICB1cGRhdGVkIGFmdGVyIGVhY2ggY2FsbCBvZiBpbmZsYXRlKCkgb3IgZGVmbGF0ZSgpIHRvIGNvdW50IGJleW9uZCA0IEdCLgorICAgIGNvbXByZXNzKCkgYW5kIHVuY29tcHJlc3MoKSBtYXkgYmUgbGltaXRlZCB0byA0IEdCLCBzaW5jZSB0aGV5IG9wZXJhdGUgaW4gYQorICAgIHNpbmdsZSBjYWxsLiAgZ3pzZWVrKCkgYW5kIGd6dGVsbCgpIG1heSBiZSBsaW1pdGVkIHRvIDQgR0IgZGVwZW5kaW5nIG9uIGhvdworICAgIHpsaWIgaXMgY29tcGlsZWQuICBTZWUgdGhlIHpsaWJDb21waWxlRmxhZ3MoKSBmdW5jdGlvbiBpbiB6bGliLmguCisKKyAgICBUaGUgd29yZCAibWF5IiBhcHBlYXJzIHNldmVyYWwgdGltZXMgYWJvdmUgc2luY2UgdGhlcmUgaXMgYSA0IEdCIGxpbWl0IG9ubHkKKyAgICBpZiB0aGUgY29tcGlsZXIncyAibG9uZyIgdHlwZSBpcyAzMiBiaXRzLiAgSWYgdGhlIGNvbXBpbGVyJ3MgImxvbmciIHR5cGUgaXMKKyAgICA2NCBiaXRzLCB0aGVuIHRoZSBsaW1pdCBpcyAxNiBleGFieXRlcy4KKworMzMuIERvZXMgemxpYiBoYXZlIGFueSBzZWN1cml0eSB2dWxuZXJhYmlsaXRpZXM/CisKKyAgICBUaGUgb25seSBvbmUgdGhhdCB3ZSBhcmUgYXdhcmUgb2YgaXMgcG90ZW50aWFsbHkgaW4gZ3pwcmludGYoKS4gIElmIHpsaWIgaXMKKyAgICBjb21waWxlZCB0byB1c2Ugc3ByaW50ZigpIG9yIHZzcHJpbnRmKCksIHRoZW4gdGhlcmUgaXMgbm8gcHJvdGVjdGlvbgorICAgIGFnYWluc3QgYSBidWZmZXIgb3ZlcmZsb3cgb2YgYW4gOEsgc3RyaW5nIHNwYWNlIChvciBvdGhlciB2YWx1ZSBhcyBzZXQgYnkKKyAgICBnemJ1ZmZlcigpKSwgb3RoZXIgdGhhbiB0aGUgY2FsbGVyIG9mIGd6cHJpbnRmKCkgYXNzdXJpbmcgdGhhdCB0aGUgb3V0cHV0CisgICAgd2lsbCBub3QgZXhjZWVkIDhLLiAgT24gdGhlIG90aGVyIGhhbmQsIGlmIHpsaWIgaXMgY29tcGlsZWQgdG8gdXNlCisgICAgc25wcmludGYoKSBvciB2c25wcmludGYoKSwgd2hpY2ggc2hvdWxkIG5vcm1hbGx5IGJlIHRoZSBjYXNlLCB0aGVuIHRoZXJlIGlzCisgICAgbm8gdnVsbmVyYWJpbGl0eS4gIFRoZSAuL2NvbmZpZ3VyZSBzY3JpcHQgd2lsbCBkaXNwbGF5IHdhcm5pbmdzIGlmIGFuCisgICAgaW5zZWN1cmUgdmFyaWF0aW9uIG9mIHNwcmludGYoKSB3aWxsIGJlIHVzZWQgYnkgZ3pwcmludGYoKS4gIEFsc28gdGhlCisgICAgemxpYkNvbXBpbGVGbGFncygpIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGluZm9ybWF0aW9uIG9uIHdoYXQgdmFyaWFudCBvZgorICAgIHNwcmludGYoKSBpcyB1c2VkIGJ5IGd6cHJpbnRmKCkuCisKKyAgICBJZiB5b3UgZG9uJ3QgaGF2ZSBzbnByaW50ZigpIG9yIHZzbnByaW50ZigpIGFuZCB3b3VsZCBsaWtlIG9uZSwgeW91IGNhbgorICAgIGZpbmQgYSBwb3J0YWJsZSBpbXBsZW1lbnRhdGlvbiBoZXJlOgorCisgICAgICAgIGh0dHA6Ly93d3cuaWpzLnNpL3NvZnR3YXJlL3NucHJpbnRmLworCisgICAgTm90ZSB0aGF0IHlvdSBzaG91bGQgYmUgdXNpbmcgdGhlIG1vc3QgcmVjZW50IHZlcnNpb24gb2YgemxpYi4gIFZlcnNpb25zCisgICAgMS4xLjMgYW5kIGJlZm9yZSB3ZXJlIHN1YmplY3QgdG8gYSBkb3VibGUtZnJlZSB2dWxuZXJhYmlsaXR5LCBhbmQgdmVyc2lvbnMKKyAgICAxLjIuMSBhbmQgMS4yLjIgd2VyZSBzdWJqZWN0IHRvIGFuIGFjY2VzcyBleGNlcHRpb24gd2hlbiBkZWNvbXByZXNzaW5nCisgICAgaW52YWxpZCBjb21wcmVzc2VkIGRhdGEuCisKKzM0LiBJcyB0aGVyZSBhIEphdmEgdmVyc2lvbiBvZiB6bGliPworCisgICAgUHJvYmFibHkgd2hhdCB5b3Ugd2FudCBpcyB0byB1c2UgemxpYiBpbiBKYXZhLiB6bGliIGlzIGFscmVhZHkgaW5jbHVkZWQKKyAgICBhcyBwYXJ0IG9mIHRoZSBKYXZhIFNESyBpbiB0aGUgamF2YS51dGlsLnppcCBwYWNrYWdlLiBJZiB5b3UgcmVhbGx5IHdhbnQKKyAgICBhIHZlcnNpb24gb2YgemxpYiB3cml0dGVuIGluIHRoZSBKYXZhIGxhbmd1YWdlLCBsb29rIG9uIHRoZSB6bGliIGhvbWUKKyAgICBwYWdlIGZvciBsaW5rczogaHR0cDovL3psaWIubmV0LyAuCisKKzM1LiBJIGdldCB0aGlzIG9yIHRoYXQgY29tcGlsZXIgb3Igc291cmNlLWNvZGUgc2Nhbm5lciB3YXJuaW5nIHdoZW4gSSBjcmFuayBpdAorICAgIHVwIHRvIG1heGltYWxseS1wZWRhbnRpYy4gQ2FuJ3QgeW91IGd1eXMgd3JpdGUgcHJvcGVyIGNvZGU/CisKKyAgICBNYW55IHllYXJzIGFnbywgd2UgZ2F2ZSB1cCBhdHRlbXB0aW5nIHRvIGF2b2lkIHdhcm5pbmdzIG9uIGV2ZXJ5IGNvbXBpbGVyCisgICAgaW4gdGhlIHVuaXZlcnNlLiAgSXQganVzdCBnb3QgdG8gYmUgYSB3YXN0ZSBvZiB0aW1lLCBhbmQgc29tZSBjb21waWxlcnMKKyAgICB3ZXJlIGRvd25yaWdodCBzaWxseSBhcyB3ZWxsIGFzIGNvbnRyYWRpY3RlZCBlYWNoIG90aGVyLiAgU28gbm93LCB3ZSBzaW1wbHkKKyAgICBtYWtlIHN1cmUgdGhhdCB0aGUgY29kZSBhbHdheXMgd29ya3MuCisKKzM2LiBWYWxncmluZCAob3Igc29tZSBzaW1pbGFyIG1lbW9yeSBhY2Nlc3MgY2hlY2tlcikgc2F5cyB0aGF0IGRlZmxhdGUgaXMKKyAgICBwZXJmb3JtaW5nIGEgY29uZGl0aW9uYWwganVtcCB0aGF0IGRlcGVuZHMgb24gYW4gdW5pbml0aWFsaXplZCB2YWx1ZS4KKyAgICBJc24ndCB0aGF0IGEgYnVnPworCisgICAgTm8uICBUaGF0IGlzIGludGVudGlvbmFsIGZvciBwZXJmb3JtYW5jZSByZWFzb25zLCBhbmQgdGhlIG91dHB1dCBvZiBkZWZsYXRlCisgICAgaXMgbm90IGFmZmVjdGVkLiAgVGhpcyBvbmx5IHN0YXJ0ZWQgc2hvd2luZyB1cCByZWNlbnRseSBzaW5jZSB6bGliIDEuMi54CisgICAgdXNlcyBtYWxsb2MoKSBieSBkZWZhdWx0IGZvciBhbGxvY2F0aW9ucywgd2hlcmVhcyBlYXJsaWVyIHZlcnNpb25zIHVzZWQKKyAgICBjYWxsb2MoKSwgd2hpY2ggemVyb3Mgb3V0IHRoZSBhbGxvY2F0ZWQgbWVtb3J5LiAgRXZlbiB0aG91Z2ggdGhlIGNvZGUgd2FzCisgICAgY29ycmVjdCwgdmVyc2lvbnMgMS4yLjQgYW5kIGxhdGVyIHdhcyBjaGFuZ2VkIHRvIG5vdCBzdGltdWxhdGUgdGhlc2UKKyAgICBjaGVja2Vycy4KKworMzcuIFdpbGwgemxpYiByZWFkIHRoZSAoaW5zZXJ0IGFueSBhbmNpZW50IG9yIGFyY2FuZSBmb3JtYXQgaGVyZSkgY29tcHJlc3NlZAorICAgIGRhdGEgZm9ybWF0PworCisgICAgUHJvYmFibHkgbm90LiBMb29rIGluIHRoZSBjb21wLmNvbXByZXNzaW9uIEZBUSBmb3IgcG9pbnRlcnMgdG8gdmFyaW91cworICAgIGZvcm1hdHMgYW5kIGFzc29jaWF0ZWQgc29mdHdhcmUuCisKKzM4LiBIb3cgY2FuIEkgZW5jcnlwdC9kZWNyeXB0IHppcCBmaWxlcyB3aXRoIHpsaWI/CisKKyAgICB6bGliIGRvZXNuJ3Qgc3VwcG9ydCBlbmNyeXB0aW9uLiAgVGhlIG9yaWdpbmFsIFBLWklQIGVuY3J5cHRpb24gaXMgdmVyeQorICAgIHdlYWsgYW5kIGNhbiBiZSBicm9rZW4gd2l0aCBmcmVlbHkgYXZhaWxhYmxlIHByb2dyYW1zLiAgVG8gZ2V0IHN0cm9uZworICAgIGVuY3J5cHRpb24sIHVzZSBHbnVQRywgaHR0cDovL3d3dy5nbnVwZy5vcmcvICwgd2hpY2ggYWxyZWFkeSBpbmNsdWRlcyB6bGliCisgICAgY29tcHJlc3Npb24uICBGb3IgUEtaSVAgY29tcGF0aWJsZSAiZW5jcnlwdGlvbiIsIGxvb2sgYXQKKyAgICBodHRwOi8vd3d3LmluZm8temlwLm9yZy8KKworMzkuIFdoYXQncyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSAiZ3ppcCIgYW5kICJkZWZsYXRlIiBIVFRQIDEuMSBlbmNvZGluZ3M/CisKKyAgICAiZ3ppcCIgaXMgdGhlIGd6aXAgZm9ybWF0LCBhbmQgImRlZmxhdGUiIGlzIHRoZSB6bGliIGZvcm1hdC4gIFRoZXkgc2hvdWxkCisgICAgcHJvYmFibHkgaGF2ZSBjYWxsZWQgdGhlIHNlY29uZCBvbmUgInpsaWIiIGluc3RlYWQgdG8gYXZvaWQgY29uZnVzaW9uIHdpdGgKKyAgICB0aGUgcmF3IGRlZmxhdGUgY29tcHJlc3NlZCBkYXRhIGZvcm1hdC4gIFdoaWxlIHRoZSBIVFRQIDEuMSBSRkMgMjYxNgorICAgIGNvcnJlY3RseSBwb2ludHMgdG8gdGhlIHpsaWIgc3BlY2lmaWNhdGlvbiBpbiBSRkMgMTk1MCBmb3IgdGhlICJkZWZsYXRlIgorICAgIHRyYW5zZmVyIGVuY29kaW5nLCB0aGVyZSBoYXZlIGJlZW4gcmVwb3J0cyBvZiBzZXJ2ZXJzIGFuZCBicm93c2VycyB0aGF0CisgICAgaW5jb3JyZWN0bHkgcHJvZHVjZSBvciBleHBlY3QgcmF3IGRlZmxhdGUgZGF0YSBwZXIgdGhlIGRlZmxhdGUKKyAgICBzcGVjaWZpY2F0aW9uIGluIFJGQyAxOTUxLCBtb3N0IG5vdGFibHkgTWljcm9zb2Z0LiAgU28gZXZlbiB0aG91Z2ggdGhlCisgICAgImRlZmxhdGUiIHRyYW5zZmVyIGVuY29kaW5nIHVzaW5nIHRoZSB6bGliIGZvcm1hdCB3b3VsZCBiZSB0aGUgbW9yZQorICAgIGVmZmljaWVudCBhcHByb2FjaCAoYW5kIGluIGZhY3QgZXhhY3RseSB3aGF0IHRoZSB6bGliIGZvcm1hdCB3YXMgZGVzaWduZWQKKyAgICBmb3IpLCB1c2luZyB0aGUgImd6aXAiIHRyYW5zZmVyIGVuY29kaW5nIGlzIHByb2JhYmx5IG1vcmUgcmVsaWFibGUgZHVlIHRvCisgICAgYW4gdW5mb3J0dW5hdGUgY2hvaWNlIG9mIG5hbWUgb24gdGhlIHBhcnQgb2YgdGhlIEhUVFAgMS4xIGF1dGhvcnMuCisKKyAgICBCb3R0b20gbGluZTogdXNlIHRoZSBnemlwIGZvcm1hdCBmb3IgSFRUUCAxLjEgZW5jb2RpbmcuCisKKzQwLiBEb2VzIHpsaWIgc3VwcG9ydCB0aGUgbmV3ICJEZWZsYXRlNjQiIGZvcm1hdCBpbnRyb2R1Y2VkIGJ5IFBLV2FyZT8KKworICAgIE5vLiAgUEtXYXJlIGhhcyBhcHBhcmVudGx5IGRlY2lkZWQgdG8ga2VlcCB0aGF0IGZvcm1hdCBwcm9wcmlldGFyeSwgc2luY2UKKyAgICB0aGV5IGhhdmUgbm90IGRvY3VtZW50ZWQgaXQgYXMgdGhleSBoYXZlIHByZXZpb3VzIGNvbXByZXNzaW9uIGZvcm1hdHMuICBJbgorICAgIGFueSBjYXNlLCB0aGUgY29tcHJlc3Npb24gaW1wcm92ZW1lbnRzIGFyZSBzbyBtb2Rlc3QgY29tcGFyZWQgdG8gb3RoZXIgbW9yZQorICAgIG1vZGVybiBhcHByb2FjaGVzLCB0aGF0IGl0J3Mgbm90IHdvcnRoIHRoZSBlZmZvcnQgdG8gaW1wbGVtZW50LgorCis0MS4gSSdtIGhhdmluZyBhIHByb2JsZW0gd2l0aCB0aGUgemlwIGZ1bmN0aW9ucyBpbiB6bGliLCBjYW4geW91IGhlbHA/CisKKyAgICBUaGVyZSBhcmUgbm8gemlwIGZ1bmN0aW9ucyBpbiB6bGliLiAgWW91IGFyZSBwcm9iYWJseSB1c2luZyBtaW5pemlwIGJ5CisgICAgR2lsZXMgVm9sbGFudCwgd2hpY2ggaXMgZm91bmQgaW4gdGhlIGNvbnRyaWIgZGlyZWN0b3J5IG9mIHpsaWIuICBJdCBpcyBub3QKKyAgICBwYXJ0IG9mIHpsaWIuICBJbiBmYWN0IG5vbmUgb2YgdGhlIHN0dWZmIGluIGNvbnRyaWIgaXMgcGFydCBvZiB6bGliLiAgVGhlCisgICAgZmlsZXMgaW4gdGhlcmUgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHpsaWIgYXV0aG9ycy4gIFlvdSBuZWVkIHRvIGNvbnRhY3QKKyAgICB0aGUgYXV0aG9ycyBvZiB0aGUgcmVzcGVjdGl2ZSBjb250cmlidXRpb24gZm9yIGhlbHAuCisKKzQyLiBUaGUgbWF0Y2guYXNtIGNvZGUgaW4gY29udHJpYiBpcyB1bmRlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisgICAgU2luY2UgaXQncyBwYXJ0IG9mIHpsaWIsIGRvZXNuJ3QgdGhhdCBtZWFuIHRoYXQgYWxsIG9mIHpsaWIgZmFsbHMgdW5kZXIgdGhlCisgICAgR05VIEdQTD8KKworICAgIE5vLiAgVGhlIGZpbGVzIGluIGNvbnRyaWIgYXJlIG5vdCBwYXJ0IG9mIHpsaWIuICBUaGV5IHdlcmUgY29udHJpYnV0ZWQgYnkKKyAgICBvdGhlciBhdXRob3JzIGFuZCBhcmUgcHJvdmlkZWQgYXMgYSBjb252ZW5pZW5jZSB0byB0aGUgdXNlciB3aXRoaW4gdGhlIHpsaWIKKyAgICBkaXN0cmlidXRpb24uICBFYWNoIGl0ZW0gaW4gY29udHJpYiBoYXMgaXRzIG93biBsaWNlbnNlLgorCis0My4gSXMgemxpYiBzdWJqZWN0IHRvIGV4cG9ydCBjb250cm9scz8gIFdoYXQgaXMgaXRzIEVDQ04/CisKKyAgICB6bGliIGlzIG5vdCBzdWJqZWN0IHRvIGV4cG9ydCBjb250cm9scywgYW5kIHNvIGlzIGNsYXNzaWZpZWQgYXMgRUFSOTkuCisKKzQ0LiBDYW4geW91IHBsZWFzZSBzaWduIHRoZXNlIGxlbmd0aHkgbGVnYWwgZG9jdW1lbnRzIGFuZCBmYXggdGhlbSBiYWNrIHRvIHVzCisgICAgc28gdGhhdCB3ZSBjYW4gdXNlIHlvdXIgc29mdHdhcmUgaW4gb3VyIHByb2R1Y3Q/CisKKyAgICBOby4gR28gYXdheS4gU2hvby4KZGlmZiAtLWdpdCBhL3psaWItMS4yLjYvSU5ERVggYi96bGliLTEuMi42L0lOREVYCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0NmY1ZjQKLS0tIC9kZXYvbnVsbAorKysgYi96bGliLTEuMi42L0lOREVYCkBAIC0wLDAgKzEsNjcgQEAKK0NNYWtlTGlzdHMudHh0ICBjbWFrZSBidWlsZCBmaWxlCitDaGFuZ2VMb2cgICAgICAgaGlzdG9yeSBvZiBjaGFuZ2VzCitGQVEgICAgICAgICAgICAgRnJlcXVlbnRseSBBc2tlZCBRdWVzdGlvbnMgYWJvdXQgemxpYgorSU5ERVggICAgICAgICAgIHRoaXMgZmlsZQorTWFrZWZpbGUgICAgICAgIGR1bW15IE1ha2VmaWxlIHRoYXQgdGVsbHMgeW91IHRvIC4vY29uZmlndXJlCitNYWtlZmlsZS5pbiAgICAgdGVtcGxhdGUgZm9yIFVuaXggTWFrZWZpbGUKK1JFQURNRSAgICAgICAgICBndWVzcyB3aGF0Citjb25maWd1cmUgICAgICAgY29uZmlndXJlIHNjcmlwdCBmb3IgVW5peAorbWFrZV92bXMuY29tICAgIG1ha2VmaWxlIGZvciBWTVMKK3Rlc3QvZXhhbXBsZS5jICB6bGliIHVzYWdlcyBleGFtcGxlcyBmb3IgYnVpbGQgdGVzdGluZwordGVzdC9taW5pZ3ppcC5jIG1pbmltYWwgZ3ppcC1saWtlIGZ1bmN0aW9uYWxpdHkgZm9yIGJ1aWxkIHRlc3RpbmcKK3Rlc3QvaW5mY292ZXIuYyBpbmYqLmMgY29kZSBjb3ZlcmFnZSBmb3IgYnVpbGQgY292ZXJhZ2UgdGVzdGluZwordHJlZWJ1aWxkLnhtbCAgIFhNTCBkZXNjcmlwdGlvbiBvZiBzb3VyY2UgZmlsZSBkZXBlbmRlbmNpZXMKK3pjb25mLmguY21ha2VpbiB6Y29uZi5oIHRlbXBsYXRlIGZvciBjbWFrZQoremNvbmYuaC5pbiAgICAgIHpjb25mLmggdGVtcGxhdGUgZm9yIGNvbmZpZ3VyZQoremxpYi4zICAgICAgICAgIE1hbiBwYWdlIGZvciB6bGliCit6bGliLjMucGRmICAgICAgTWFuIHBhZ2UgaW4gUERGIGZvcm1hdAoremxpYi5tYXAgICAgICAgIExpbnV4IHN5bWJvbCBpbmZvcm1hdGlvbgoremxpYi5wYy5pbiAgICAgIFRlbXBsYXRlIGZvciBwa2ctY29uZmlnIGRlc2NyaXB0b3IKK3psaWIyYW5zaSAgICAgICBwZXJsIHNjcmlwdCB0byBjb252ZXJ0IHNvdXJjZSBmaWxlcyBmb3IgQysrIGNvbXBpbGF0aW9uCisKK2FtaWdhLyAgICAgICAgICBtYWtlZmlsZXMgZm9yIEFtaWdhIFNBUyBDCithczQwMC8gICAgICAgICAgbWFrZWZpbGVzIGZvciBBUy80MDAKK2RvYy8gICAgICAgICAgICBkb2N1bWVudGF0aW9uIGZvciBmb3JtYXRzIGFuZCBhbGdvcml0aG1zCittc2Rvcy8gICAgICAgICAgbWFrZWZpbGVzIGZvciBNU0RPUworbmludGVuZG9kcy8gICAgIG1ha2VmaWxlIGZvciBOaW50ZW5kbyBEUworb2xkLyAgICAgICAgICAgIG1ha2VmaWxlcyBmb3IgdmFyaW91cyBhcmNoaXRlY3R1cmVzIGFuZCB6bGliIGRvY3VtZW50YXRpb24KKyAgICAgICAgICAgICAgICBmaWxlcyB0aGF0IGhhdmUgbm90IHlldCBiZWVuIHVwZGF0ZWQgZm9yIHpsaWIgMS4yLngKK3FueC8gICAgICAgICAgICBtYWtlZmlsZXMgZm9yIFFOWAord2F0Y29tLyAgICAgICAgIG1ha2VmaWxlcyBmb3IgT3BlbldhdGNvbQord2luMzIvICAgICAgICAgIG1ha2VmaWxlcyBmb3IgV2luZG93cworCisgICAgICAgICAgICAgICAgemxpYiBwdWJsaWMgaGVhZGVyIGZpbGVzIChyZXF1aXJlZCBmb3IgbGlicmFyeSB1c2UpOgoremNvbmYuaAoremxpYi5oCisKKyAgICAgICAgICAgICAgICBwcml2YXRlIHNvdXJjZSBmaWxlcyB1c2VkIHRvIGJ1aWxkIHRoZSB6bGliIGxpYnJhcnk6CithZGxlcjMyLmMKK2NvbXByZXNzLmMKK2NyYzMyLmMKK2NyYzMyLmgKK2RlZmxhdGUuYworZGVmbGF0ZS5oCitnemNsb3NlLmMKK2d6Z3V0cy5oCitnemxpYi5jCitnenJlYWQuYworZ3p3cml0ZS5jCitpbmZiYWNrLmMKK2luZmZhc3QuYworaW5mZmFzdC5oCitpbmZmaXhlZC5oCitpbmZsYXRlLmMKK2luZmxhdGUuaAoraW5mdHJlZXMuYworaW5mdHJlZXMuaAordHJlZXMuYwordHJlZXMuaAordW5jb21wci5jCit6dXRpbC5jCit6dXRpbC5oCisKKyAgICAgICAgICAgICAgICBzb3VyY2UgZmlsZXMgZm9yIHNhbXBsZSBwcm9ncmFtcworU2VlIGV4YW1wbGVzL1JFQURNRS5leGFtcGxlcworCisgICAgICAgICAgICAgICAgdW5zdXBwb3J0ZWQgY29udHJpYnV0aW9ucyBieSB0aGlyZCBwYXJ0aWVzCitTZWUgY29udHJpYi9SRUFETUUuY29udHJpYgpkaWZmIC0tZ2l0IGEvemxpYi0xLjIuNi9NYWtlZmlsZSBiL3psaWItMS4yLjYvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJiYTg2YwotLS0gL2Rldi9udWxsCisrKyBiL3psaWItMS4yLjYvTWFrZWZpbGUKQEAgLTAsMCArMSw1IEBACithbGw6CisJLUBlY2hvICJQbGVhc2UgdXNlIC4vY29uZmlndXJlIGZpcnN0LiAgVGhhbmsgeW91LiIKKworZGlzdGNsZWFuOgorCW1ha2UgLWYgTWFrZWZpbGUuaW4gZGlzdGNsZWFuCmRpZmYgLS1naXQgYS96bGliLTEuMi42L01ha2VmaWxlLmluIGIvemxpYi0xLjIuNi9NYWtlZmlsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWVhMDdiCi0tLSAvZGV2L251bGwKKysrIGIvemxpYi0xLjIuNi9NYWtlZmlsZS5pbgpAQCAtMCwwICsxLDI4MiBAQAorIyBNYWtlZmlsZSBmb3IgemxpYgorIyBDb3B5cmlnaHQgKEMpIDE5OTUtMjAxMSBKZWFuLWxvdXAgR2FpbGx5LgorIyBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCisKKyMgVG8gY29tcGlsZSBhbmQgdGVzdCwgdHlwZToKKyMgICAgLi9jb25maWd1cmU7IG1ha2UgdGVzdAorIyBOb3JtYWxseSBjb25maWd1cmUgYnVpbGRzIGJvdGggYSBzdGF0aWMgYW5kIGEgc2hhcmVkIGxpYnJhcnkuCisjIElmIHlvdSB3YW50IHRvIGJ1aWxkIGp1c3QgYSBzdGF0aWMgbGlicmFyeSwgdXNlOiAuL2NvbmZpZ3VyZSAtLXN0YXRpYworCisjIFRvIHVzZSB0aGUgYXNtIGNvZGUsIHR5cGU6CisjICAgIGNwIGNvbnRyaWIvYXNtPzg2L21hdGNoLlMgLi9tYXRjaC5TCisjICAgIG1ha2UgTE9DPS1EQVNNViBPQkpBPW1hdGNoLm8KKworIyBUbyBpbnN0YWxsIC91c3IvbG9jYWwvbGliL2xpYnouKiBhbmQgL3Vzci9sb2NhbC9pbmNsdWRlL3psaWIuaCwgdHlwZToKKyMgICAgbWFrZSBpbnN0YWxsCisjIFRvIGluc3RhbGwgaW4gJEhPTUUgaW5zdGVhZCBvZiAvdXNyL2xvY2FsLCB1c2U6CisjICAgIG1ha2UgaW5zdGFsbCBwcmVmaXg9JEhPTUUKKworQ0M9Y2MKK0NGTEFHUz0tTworI0NGTEFHUz0tTyAtRE1BWF9XQklUUz0xNCAtRE1BWF9NRU1fTEVWRUw9NworI0NGTEFHUz0tZyAtRERFQlVHCisjQ0ZMQUdTPS1PMyAtV2FsbCAtV3dyaXRlLXN0cmluZ3MgLVdwb2ludGVyLWFyaXRoIC1XY29udmVyc2lvbiBcCisjICAgICAgICAgICAtV3N0cmljdC1wcm90b3R5cGVzIC1XbWlzc2luZy1wcm90b3R5cGVzCisKK1NGTEFHUz0tTworTERGTEFHUz0KK1RFU1RfTERGTEFHUz0tTC4gbGliei5hCitMRFNIQVJFRD0kKENDKQorQ1BQPSQoQ0MpIC1FCisKK1NUQVRJQ0xJQj1saWJ6LmEKK1NIQVJFRExJQj1saWJ6LnNvCitTSEFSRURMSUJWPWxpYnouc28uMS4yLjYKK1NIQVJFRExJQk09bGliei5zby4xCitMSUJTPSQoU1RBVElDTElCKSAkKFNIQVJFRExJQlYpCisKK0FSPWFyCitBUkZMQUdTPXJjCitSQU5MSUI9cmFubGliCitMRENPTkZJRz1sZGNvbmZpZworTERTSEFSRURMSUJDPS1sYworVEFSPXRhcgorU0hFTEw9L2Jpbi9zaAorRVhFPQorSU5TVEFMTD0vdXNyL2Jpbi9pbnN0YWxsIC1jIC1DCisKK2J1aWxkZGlyID0gLgorc3JjZGlyID0gLgorcHJlZml4ID0gL3Vzci9sb2NhbAorZXhlY19wcmVmaXggPSAke3ByZWZpeH0KK2xpYmRpciA9ICR7ZXhlY19wcmVmaXh9L2xpYgorc2hhcmVkbGliZGlyID0gJHtsaWJkaXJ9CitpbmNsdWRlZGlyID0gJHtwcmVmaXh9L2luY2x1ZGUKK21hbmRpciA9ICR7cHJlZml4fS9zaGFyZS9tYW4KK21hbjNkaXIgPSAke21hbmRpcn0vbWFuMworcGtnY29uZmlnZGlyID0gJHtsaWJkaXJ9L3BrZ2NvbmZpZwordGVtcGZpbGUgOj0gJChzaGVsbCBta3RlbXAgLXUgX19YWFhYWFgpCisKK1ZQQVRIID0gJHtzcmNkaXJ9CisKK09CSlogPSBhZGxlcjMyLm8gY3JjMzIubyBkZWZsYXRlLm8gaW5mYmFjay5vIGluZmZhc3QubyBpbmZsYXRlLm8gaW5mdHJlZXMubyB0cmVlcy5vIHp1dGlsLm8KK09CSkcgPSBjb21wcmVzcy5vIHVuY29tcHIubyBnemNsb3NlLm8gZ3psaWIubyBnenJlYWQubyBnendyaXRlLm8KK09CSkMgPSAkKE9CSlopICQoT0JKRykKKworUElDX09CSlogPSBhZGxlcjMyLmxvIGNyYzMyLmxvIGRlZmxhdGUubG8gaW5mYmFjay5sbyBpbmZmYXN0LmxvIGluZmxhdGUubG8gaW5mdHJlZXMubG8gdHJlZXMubG8genV0aWwubG8KK1BJQ19PQkpHID0gY29tcHJlc3MubG8gdW5jb21wci5sbyBnemNsb3NlLmxvIGd6bGliLmxvIGd6cmVhZC5sbyBnendyaXRlLmxvCitQSUNfT0JKQyA9ICQoUElDX09CSlopICQoUElDX09CSkcpCisKKyMgdG8gdXNlIHRoZSBhc20gY29kZTogbWFrZSBPQkpBPW1hdGNoLm8sIFBJQ19PQkpBPW1hdGNoLmxvCitPQkpBID0KK1BJQ19PQkpBID0KKworT0JKUyA9ICQoT0JKQykgJChPQkpBKQorCitQSUNfT0JKUyA9ICQoUElDX09CSkMpICQoUElDX09CSkEpCisKK2FsbDogc3RhdGljIHNoYXJlZAorCitzdGF0aWM6IGV4YW1wbGUkKEVYRSkgbWluaWd6aXAkKEVYRSkKKworc2hhcmVkOiBleGFtcGxlc2gkKEVYRSkgbWluaWd6aXBzaCQoRVhFKQorCithbGw2NDogZXhhbXBsZTY0JChFWEUpIG1pbmlnemlwNjQkKEVYRSkKKworY2hlY2s6IHRlc3QKKwordGVzdDogYWxsIHRlc3RzdGF0aWMgdGVzdHNoYXJlZAorCit0ZXN0c3RhdGljOiBzdGF0aWMKKwlAaWYgZWNobyBoZWxsbyB3b3JsZCB8IC4vbWluaWd6aXAgfCAuL21pbmlnemlwIC1kICYmIC4vZXhhbXBsZTsgdGhlbiBcCisJICBlY2hvICcJCSoqKiB6bGliIHRlc3QgT0sgKioqJzsgXAorCWVsc2UgXAorCSAgZWNobyAnCQkqKiogemxpYiB0ZXN0IEZBSUxFRCAqKionOyBmYWxzZTsgXAorCWZpCisJLUBybSAtZiBmb28uZ3oKKwordGVzdHNoYXJlZDogc2hhcmVkCisJQExEX0xJQlJBUllfUEFUSD1gcHdkYDokKExEX0xJQlJBUllfUEFUSCkgOyBleHBvcnQgTERfTElCUkFSWV9QQVRIOyBcCisJTERfTElCUkFSWU4zMl9QQVRIPWBwd2RgOiQoTERfTElCUkFSWU4zMl9QQVRIKSA7IGV4cG9ydCBMRF9MSUJSQVJZTjMyX1BBVEg7IFwKKwlEWUxEX0xJQlJBUllfUEFUSD1gcHdkYDokKERZTERfTElCUkFSWV9QQVRIKSA7IGV4cG9ydCBEWUxEX0xJQlJBUllfUEFUSDsgXAorCVNITElCX1BBVEg9YHB3ZGA6JChTSExJQl9QQVRIKSA7IGV4cG9ydCBTSExJQl9QQVRIOyBcCisJaWYgZWNobyBoZWxsbyB3b3JsZCB8IC4vbWluaWd6aXBzaCB8IC4vbWluaWd6aXBzaCAtZCAmJiAuL2V4YW1wbGVzaDsgdGhlbiBcCisJICBlY2hvICcJCSoqKiB6bGliIHNoYXJlZCB0ZXN0IE9LICoqKic7IFwKKwllbHNlIFwKKwkgIGVjaG8gJwkJKioqIHpsaWIgc2hhcmVkIHRlc3QgRkFJTEVEICoqKic7IGZhbHNlOyBcCisJZmkKKwktQHJtIC1mIGZvby5negorCit0ZXN0NjQ6IGFsbDY0CisJQGlmIGVjaG8gaGVsbG8gd29ybGQgfCAuL21pbmlnemlwNjQgfCAuL21pbmlnemlwNjQgLWQgJiYgLi9leGFtcGxlNjQ7IHRoZW4gXAorCSAgZWNobyAnCQkqKiogemxpYiA2NC1iaXQgdGVzdCBPSyAqKionOyBcCisJZWxzZSBcCisJICBlY2hvICcJCSoqKiB6bGliIDY0LWJpdCB0ZXN0IEZBSUxFRCAqKionOyBmYWxzZTsgXAorCWZpCisJLUBybSAtZiBmb28uZ3oKKworaW5mY292ZXIubzogdGVzdC9pbmZjb3Zlci5jICQoc3JjZGlyKS96bGliLmggemNvbmYuaAorCSQoQ0MpICQoQ0ZMQUdTKSAtSS4gLUkkKHNyY2RpcikgLWMgLW8gJEAgdGVzdC9pbmZjb3Zlci5jCisKK2luZmNvdmVyOiBpbmZjb3Zlci5vIGxpYnouYQorCSQoQ0MpICQoQ0ZMQUdTKSAtbyAkQCBpbmZjb3Zlci5vIGxpYnouYQorCitjb3ZlcjogaW5mY292ZXIKKwlybSAtZiAqLmdjZGEKKwkuL2luZmNvdmVyCisJZ2NvdiBpbmYqLmMKKworbGliei5hOiAkKE9CSlMpCisJJChBUikgJChBUkZMQUdTKSAkQCAkKE9CSlMpCisJLUAgKCQoUkFOTElCKSAkQCB8fCB0cnVlKSA+L2Rldi9udWxsIDI+JjEKKworbWF0Y2gubzogbWF0Y2guUworCSQoQ1BQKSBtYXRjaC5TID4gX21hdGNoLnMKKwkkKENDKSAtYyBfbWF0Y2gucworCW12IF9tYXRjaC5vIG1hdGNoLm8KKwlybSAtZiBfbWF0Y2gucworCittYXRjaC5sbzogbWF0Y2guUworCSQoQ1BQKSBtYXRjaC5TID4gX21hdGNoLnMKKwkkKENDKSAtYyAtZlBJQyBfbWF0Y2gucworCW12IF9tYXRjaC5vIG1hdGNoLmxvCisJcm0gLWYgX21hdGNoLnMKKworZXhhbXBsZS5vOiAkKHNyY2RpcikvdGVzdC9leGFtcGxlLmMgJChzcmNkaXIpL3psaWIuaCB6Y29uZi5oCisJJChDQykgJChDRkxBR1MpIC1JLiAtSSQoc3JjZGlyKSAtYyAtbyAkQCAkKHNyY2RpcikvdGVzdC9leGFtcGxlLmMKKworbWluaWd6aXAubzogJChzcmNkaXIpL3Rlc3QvbWluaWd6aXAuYyAkKHNyY2RpcikvemxpYi5oIHpjb25mLmgKKwkkKENDKSAkKENGTEFHUykgLUkuIC1JJChzcmNkaXIpIC1jIC1vICRAICQoc3JjZGlyKS90ZXN0L21pbmlnemlwLmMKKworZXhhbXBsZTY0Lm86ICQoc3JjZGlyKS90ZXN0L2V4YW1wbGUuYyAkKHNyY2RpcikvemxpYi5oIHpjb25mLmgKKwkkKENDKSAkKENGTEFHUykgLUkuIC1JJChzcmNkaXIpIC1EX0ZJTEVfT0ZGU0VUX0JJVFM9NjQgLWMgLW8gJEAgJChzcmNkaXIpL3Rlc3QvZXhhbXBsZS5jCisKK21pbmlnemlwNjQubzogdGVzdC9taW5pZ3ppcC5jICQoc3JjZGlyKS96bGliLmggemNvbmYuaAorCSQoQ0MpICQoQ0ZMQUdTKSAtSS4gLUkkKHNyY2RpcikgLURfRklMRV9PRkZTRVRfQklUUz02NCAtYyAtbyAkQCAkKHNyY2RpcikvdGVzdC9taW5pZ3ppcC5jCisKKy5TVUZGSVhFUzogLmxvCisKKy5jLmxvOgorCS1AbWtkaXIgb2JqcyAyPi9kZXYvbnVsbCB8fCB0ZXN0IC1kIG9ianMKKwkkKENDKSAkKFNGTEFHUykgLURQSUMgLWMgLW8gb2Jqcy8kKi5vICQ8CisJLUBtdiBvYmpzLyQqLm8gJEAKKworcGxhY2VibyAkKFNIQVJFRExJQlYpOiAkKFBJQ19PQkpTKSBsaWJ6LmEKKwkkKExEU0hBUkVEKSAkKFNGTEFHUykgLW8gJEAgJChQSUNfT0JKUykgJChMRFNIQVJFRExJQkMpICQoTERGTEFHUykKKwlybSAtZiAkKFNIQVJFRExJQikgJChTSEFSRURMSUJNKQorCWxuIC1zICRAICQoU0hBUkVETElCKQorCWxuIC1zICRAICQoU0hBUkVETElCTSkKKwktQHJtZGlyIG9ianMKKworZXhhbXBsZSQoRVhFKTogZXhhbXBsZS5vICQoU1RBVElDTElCKQorCSQoQ0MpICQoQ0ZMQUdTKSAtbyAkQCBleGFtcGxlLm8gJChURVNUX0xERkxBR1MpCisKK21pbmlnemlwJChFWEUpOiBtaW5pZ3ppcC5vICQoU1RBVElDTElCKQorCSQoQ0MpICQoQ0ZMQUdTKSAtbyAkQCBtaW5pZ3ppcC5vICQoVEVTVF9MREZMQUdTKQorCitleGFtcGxlc2gkKEVYRSk6IGV4YW1wbGUubyAkKFNIQVJFRExJQlYpCisJJChDQykgJChDRkxBR1MpIC1vICRAIGV4YW1wbGUubyAtTC4gJChTSEFSRURMSUJWKQorCittaW5pZ3ppcHNoJChFWEUpOiBtaW5pZ3ppcC5vICQoU0hBUkVETElCVikKKwkkKENDKSAkKENGTEFHUykgLW8gJEAgbWluaWd6aXAubyAtTC4gJChTSEFSRURMSUJWKQorCitleGFtcGxlNjQkKEVYRSk6IGV4YW1wbGU2NC5vICQoU1RBVElDTElCKQorCSQoQ0MpICQoQ0ZMQUdTKSAtbyAkQCBleGFtcGxlNjQubyAkKFRFU1RfTERGTEFHUykKKworbWluaWd6aXA2NCQoRVhFKTogbWluaWd6aXA2NC5vICQoU1RBVElDTElCKQorCSQoQ0MpICQoQ0ZMQUdTKSAtbyAkQCBtaW5pZ3ppcDY0Lm8gJChURVNUX0xERkxBR1MpCisKK2luc3RhbGwtbGliczogJChMSUJTKQorCUAkKElOU1RBTEwpIC1kICQoREVTVERJUikkKGV4ZWNfcHJlZml4KQorCUAkKElOU1RBTEwpIC1kICQoREVTVERJUikkKGxpYmRpcikKKwlAJChJTlNUQUxMKSAtZCAkKERFU1RESVIpJChzaGFyZWRsaWJkaXIpCisJQCQoSU5TVEFMTCkgLWQgJChERVNURElSKSQobWFuM2RpcikKKwlAJChJTlNUQUxMKSAtZCAkKERFU1RESVIpJChwa2djb25maWdkaXIpCisJQCQoSU5TVEFMTCkgLW0gNjQ0ICQoU1RBVElDTElCKSAkKERFU1RESVIpJChsaWJkaXIpCisJLUAoJChSQU5MSUIpICQoREVTVERJUikkKGxpYmRpcikvbGliei5hIHx8IHRydWUpID4vZGV2L251bGwgMj4mMQorCS1AaWYgdGVzdCAtbiAiJChTSEFSRURMSUJWKSI7IHRoZW4gXAorCSAgJChJTlNUQUxMKSAtbSA3NTUgJChTSEFSRURMSUJWKSAkKERFU1RESVIpJChzaGFyZWRsaWJkaXIpOyBcCisJICBlY2hvICIkKElOU1RBTEwpIC1tIDc1NSAkKFNIQVJFRExJQlYpICQoREVTVERJUikkKHNoYXJlZGxpYmRpcikiOyBcCisJICBsbiAtc2YgJChTSEFSRURMSUJWKSAkKERFU1RESVIpJChzaGFyZWRsaWJkaXIpLyQoU0hBUkVETElCKTsgXAorCSAgbG4gLXNmICQoU0hBUkVETElCVikgJChERVNURElSKSQoc2hhcmVkbGliZGlyKS8kKFNIQVJFRExJQk0pOyBcCisJICAoJChMRENPTkZJRykgfHwgdHJ1ZSkgID4vZGV2L251bGwgMj4mMTsgXAorCWZpCisJQCQoSU5TVEFMTCkgLW0gNjQ0ICQoc3JjZGlyKS96bGliLjMgJChERVNURElSKSQobWFuM2RpcikKKwlAJChJTlNUQUxMKSAtbSA2NDQgemxpYi5wYyAkKERFU1RESVIpJChwa2djb25maWdkaXIpCisjIFRoZSByYW5saWIgaW4gaW5zdGFsbCBpcyBuZWVkZWQgb24gTmVYVFNURVAgd2hpY2ggY2hlY2tzIGZpbGUgdGltZXMKKyMgbGRjb25maWcgaXMgZm9yIExpbnV4CisKK2luc3RhbGw6IGluc3RhbGwtbGlicworCSQoSU5TVEFMTCkgLWQgJChERVNURElSKSQoaW5jbHVkZWRpcikKKwkkKElOU1RBTEwpIC1tIDY0NCAkKHNyY2RpcikvemxpYi5oIHpjb25mLmggJChERVNURElSKSQoaW5jbHVkZWRpcikKKwordW5pbnN0YWxsOgorCWNkICQoREVTVERJUikkKGluY2x1ZGVkaXIpOyBybSAtZiB6bGliLmggemNvbmYuaAorCWNkICQoREVTVERJUikkKGxpYmRpcik7IHJtIC1mIGxpYnouYTsgXAorCWlmIHRlc3QgLW4gIiQoU0hBUkVETElCVikiIC1hIC1mICQoU0hBUkVETElCVik7IHRoZW4gXAorCSAgcm0gLWYgJChTSEFSRURMSUJWKSAkKFNIQVJFRExJQikgJChTSEFSRURMSUJNKTsgXAorCWZpCisJY2QgJChERVNURElSKSQobWFuM2Rpcik7IHJtIC1mIHpsaWIuMworCWNkICQoREVTVERJUikkKHBrZ2NvbmZpZ2Rpcik7IHJtIC1mIHpsaWIucGMKKworZG9jczogemxpYi4zLnBkZgorCit6bGliLjMucGRmOiB6bGliLjMKKwlncm9mZiAtbWFuZG9jIC1mIEggLVQgcHMgemxpYi4zIHwgcHMycGRmIC0gemxpYi4zLnBkZgorCit6Y29uZi5oLmNtYWtlaW46ICQoc3JjZGlyKS96Y29uZi5oLmluCisJLUBlY2hvICIvI2RlZmluZSBaQ09ORl9ILyBhXFxcXFxuI2NtYWtlZGVmaW5lIFpfUFJFRklYXFxcXFxuI2NtYWtlZGVmaW5lIFpfSEFWRV9VTklTVERfSFxuIiA+ICQodGVtcGZpbGUpCisJLUBzZWQgLWYgJCh0ZW1wZmlsZSkgJDwgPiAkQAorCS1AdG91Y2ggLXIgJDwgJEAKKwktQHJtICQodGVtcGZpbGUpCisKK3pjb25mOiAkKHNyY2RpcikvemNvbmYuaC5pbgorCWNwIC1wICQ8IHpjb25mLmgKKworbW9zdGx5Y2xlYW46IGNsZWFuCitjbGVhbjoKKwlybSAtZiAqLm8gKi5sbyAqfiBcCisJICAgZXhhbXBsZSQoRVhFKSBtaW5pZ3ppcCQoRVhFKSBleGFtcGxlc2gkKEVYRSkgbWluaWd6aXBzaCQoRVhFKSBcCisJICAgZXhhbXBsZTY0JChFWEUpIG1pbmlnemlwNjQkKEVYRSkgXAorCSAgIGluZmNvdmVyIFwKKwkgICBsaWJ6LiogZm9vLmd6IHNvX2xvY2F0aW9ucyBcCisJICAgX21hdGNoLnMgbWFrZXRyZWUgY29udHJpYi9pbmZiYWNrOS8qLm8KKwlybSAtcmYgb2JqcworCXJtIC1mICouZ2NkYSAqLmdjbm8gKi5nY292CisJcm0gLWYgY29udHJpYi9pbmZiYWNrOS8qLmdjZGEgY29udHJpYi9pbmZiYWNrOS8qLmdjbm8gY29udHJpYi9pbmZiYWNrOS8qLmdjb3YKKworbWFpbnRhaW5lci1jbGVhbjogZGlzdGNsZWFuCitkaXN0Y2xlYW46IGNsZWFuIHpjb25mIHpjb25mLmguY21ha2VpbiBkb2NzCisJcm0gLWYgTWFrZWZpbGUgemxpYi5wYyBjb25maWd1cmUubG9nCisJLUBybSAtZiAuRFNfU3RvcmUKKwktQHByaW50ZiAnYWxsOlxuXHQtQGVjaG8gIlBsZWFzZSB1c2UgLi9jb25maWd1cmUgZmlyc3QuICBUaGFuayB5b3UuIlxuJyA+IE1ha2VmaWxlCisJLUBwcmludGYgJ1xuZGlzdGNsZWFuOlxuXHRtYWtlIC1mIE1ha2VmaWxlLmluIGRpc3RjbGVhblxuJyA+PiBNYWtlZmlsZQorCS1AdG91Y2ggLXIgTWFrZWZpbGUuaW4gTWFrZWZpbGUKKwordGFnczoKKwlldGFncyAqLltjaF0KKworZGVwZW5kOgorCW1ha2VkZXBlbmQgLS0gJChDRkxBR1MpIC0tICouW2NoXQorCisjIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1ha2UgZGVwZW5kIGRlcGVuZHMgb24gaXQuCisKK2FkbGVyMzIubyB6dXRpbC5vOiB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCitnemNsb3NlLm8gZ3psaWIubyBnenJlYWQubyBnendyaXRlLm86IHpsaWIuaCB6Y29uZi5oIGd6Z3V0cy5oCitjb21wcmVzcy5vIGV4YW1wbGUubyBtaW5pZ3ppcC5vIHVuY29tcHIubzogemxpYi5oIHpjb25mLmgKK2NyYzMyLm86IHp1dGlsLmggemxpYi5oIHpjb25mLmggY3JjMzIuaAorZGVmbGF0ZS5vOiBkZWZsYXRlLmggenV0aWwuaCB6bGliLmggemNvbmYuaAoraW5mYmFjay5vIGluZmxhdGUubzogenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZ0cmVlcy5oIGluZmxhdGUuaCBpbmZmYXN0LmggaW5mZml4ZWQuaAoraW5mZmFzdC5vOiB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZnRyZWVzLmggaW5mbGF0ZS5oIGluZmZhc3QuaAoraW5mdHJlZXMubzogenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZ0cmVlcy5oCit0cmVlcy5vOiBkZWZsYXRlLmggenV0aWwuaCB6bGliLmggemNvbmYuaCB0cmVlcy5oCisKK2FkbGVyMzIubG8genV0aWwubG86IHp1dGlsLmggemxpYi5oIHpjb25mLmgKK2d6Y2xvc2UubG8gZ3psaWIubG8gZ3pyZWFkLmxvIGd6d3JpdGUubG86IHpsaWIuaCB6Y29uZi5oIGd6Z3V0cy5oCitjb21wcmVzcy5sbyBleGFtcGxlLmxvIG1pbmlnemlwLmxvIHVuY29tcHIubG86IHpsaWIuaCB6Y29uZi5oCitjcmMzMi5sbzogenV0aWwuaCB6bGliLmggemNvbmYuaCBjcmMzMi5oCitkZWZsYXRlLmxvOiBkZWZsYXRlLmggenV0aWwuaCB6bGliLmggemNvbmYuaAoraW5mYmFjay5sbyBpbmZsYXRlLmxvOiB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZnRyZWVzLmggaW5mbGF0ZS5oIGluZmZhc3QuaCBpbmZmaXhlZC5oCitpbmZmYXN0LmxvOiB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZnRyZWVzLmggaW5mbGF0ZS5oIGluZmZhc3QuaAoraW5mdHJlZXMubG86IHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mdHJlZXMuaAordHJlZXMubG86IGRlZmxhdGUuaCB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIHRyZWVzLmgKZGlmZiAtLWdpdCBhL3psaWItMS4yLjYvUkVBRE1FIGIvemxpYi0xLjIuNi9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDkwNzBlMgotLS0gL2Rldi9udWxsCisrKyBiL3psaWItMS4yLjYvUkVBRE1FCkBAIC0wLDAgKzEsMTE1IEBACitaTElCIERBVEEgQ09NUFJFU1NJT04gTElCUkFSWQorCit6bGliIDEuMi42IGlzIGEgZ2VuZXJhbCBwdXJwb3NlIGRhdGEgY29tcHJlc3Npb24gbGlicmFyeS4gIEFsbCB0aGUgY29kZSBpcwordGhyZWFkIHNhZmUuICBUaGUgZGF0YSBmb3JtYXQgdXNlZCBieSB0aGUgemxpYiBsaWJyYXJ5IGlzIGRlc2NyaWJlZCBieSBSRkNzCisoUmVxdWVzdCBmb3IgQ29tbWVudHMpIDE5NTAgdG8gMTk1MiBpbiB0aGUgZmlsZXMKK2h0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzE5NTAgKHpsaWIgZm9ybWF0KSwgcmZjMTk1MSAoZGVmbGF0ZSBmb3JtYXQpIGFuZAorcmZjMTk1MiAoZ3ppcCBmb3JtYXQpLgorCitBbGwgZnVuY3Rpb25zIG9mIHRoZSBjb21wcmVzc2lvbiBsaWJyYXJ5IGFyZSBkb2N1bWVudGVkIGluIHRoZSBmaWxlIHpsaWIuaAorKHZvbHVudGVlciB0byB3cml0ZSBtYW4gcGFnZXMgd2VsY29tZSwgY29udGFjdCB6bGliQGd6aXAub3JnKS4gIEEgdXNhZ2UgZXhhbXBsZQorb2YgdGhlIGxpYnJhcnkgaXMgZ2l2ZW4gaW4gdGhlIGZpbGUgdGVzdC9leGFtcGxlLmMgd2hpY2ggYWxzbyB0ZXN0cyB0aGF0Cit0aGUgbGlicmFyeSBpcyB3b3JraW5nIGNvcnJlY3RseS4gIEFub3RoZXIgZXhhbXBsZSBpcyBnaXZlbiBpbiB0aGUgZmlsZQordGVzdC9taW5pZ3ppcC5jLiAgVGhlIGNvbXByZXNzaW9uIGxpYnJhcnkgaXRzZWxmIGlzIGNvbXBvc2VkIG9mIGFsbCBzb3VyY2UKK2ZpbGVzIGluIHRoZSByb290IGRpcmVjdG9yeS4KKworVG8gY29tcGlsZSBhbGwgZmlsZXMgYW5kIHJ1biB0aGUgdGVzdCBwcm9ncmFtLCBmb2xsb3cgdGhlIGluc3RydWN0aW9ucyBnaXZlbiBhdAordGhlIHRvcCBvZiBNYWtlZmlsZS5pbi4gIEluIHNob3J0ICIuL2NvbmZpZ3VyZTsgbWFrZSB0ZXN0IiwgYW5kIGlmIHRoYXQgZ29lcword2VsbCwgIm1ha2UgaW5zdGFsbCIgc2hvdWxkIHdvcmsgZm9yIG1vc3QgZmxhdm9ycyBvZiBVbml4LiAgRm9yIFdpbmRvd3MsIHVzZQorb25lIG9mIHRoZSBzcGVjaWFsIG1ha2VmaWxlcyBpbiB3aW4zMi8gb3IgY29udHJpYi92c3R1ZGlvLyAuICBGb3IgVk1TLCB1c2UKK21ha2Vfdm1zLmNvbS4KKworUXVlc3Rpb25zIGFib3V0IHpsaWIgc2hvdWxkIGJlIHNlbnQgdG8gPHpsaWJAZ3ppcC5vcmc+LCBvciB0byBHaWxsZXMgVm9sbGFudAorPGluZm9Ad2luaW1hZ2UuY29tPiBmb3IgdGhlIFdpbmRvd3MgRExMIHZlcnNpb24uICBUaGUgemxpYiBob21lIHBhZ2UgaXMKK2h0dHA6Ly96bGliLm5ldC8gLiAgQmVmb3JlIHJlcG9ydGluZyBhIHByb2JsZW0sIHBsZWFzZSBjaGVjayB0aGlzIHNpdGUgdG8KK3ZlcmlmeSB0aGF0IHlvdSBoYXZlIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB6bGliOyBvdGhlcndpc2UgZ2V0IHRoZSBsYXRlc3QKK3ZlcnNpb24gYW5kIGNoZWNrIHdoZXRoZXIgdGhlIHByb2JsZW0gc3RpbGwgZXhpc3RzIG9yIG5vdC4KKworUExFQVNFIHJlYWQgdGhlIHpsaWIgRkFRIGh0dHA6Ly96bGliLm5ldC96bGliX2ZhcS5odG1sIGJlZm9yZSBhc2tpbmcgZm9yIGhlbHAuCisKK01hcmsgTmVsc29uIDxtYXJrbkBpZWVlLm9yZz4gd3JvdGUgYW4gYXJ0aWNsZSBhYm91dCB6bGliIGZvciB0aGUgSmFuLiAgMTk5NworaXNzdWUgb2YgRHIuICBEb2JiJ3MgSm91cm5hbDsgYSBjb3B5IG9mIHRoZSBhcnRpY2xlIGlzIGF2YWlsYWJsZSBhdAoraHR0cDovL21hcmtuZWxzb24udXMvMTk5Ny8wMS8wMS96bGliLWVuZ2luZS8gLgorCitUaGUgY2hhbmdlcyBtYWRlIGluIHZlcnNpb24gMS4yLjYgYXJlIGRvY3VtZW50ZWQgaW4gdGhlIGZpbGUgQ2hhbmdlTG9nLgorCitVbnN1cHBvcnRlZCB0aGlyZCBwYXJ0eSBjb250cmlidXRpb25zIGFyZSBwcm92aWRlZCBpbiBkaXJlY3RvcnkgY29udHJpYi8gLgorCit6bGliIGlzIGF2YWlsYWJsZSBpbiBKYXZhIHVzaW5nIHRoZSBqYXZhLnV0aWwuemlwIHBhY2thZ2UsIGRvY3VtZW50ZWQgYXQKK2h0dHA6Ly9qYXZhLnN1bi5jb20vZGV2ZWxvcGVyL3RlY2huaWNhbEFydGljbGVzL1Byb2dyYW1taW5nL2NvbXByZXNzaW9uLyAuCisKK0EgUGVybCBpbnRlcmZhY2UgdG8gemxpYiB3cml0dGVuIGJ5IFBhdWwgTWFycXVlc3MgPHBtcXNAY3Bhbi5vcmc+IGlzIGF2YWlsYWJsZQorYXQgQ1BBTiAoQ29tcHJlaGVuc2l2ZSBQZXJsIEFyY2hpdmUgTmV0d29yaykgc2l0ZXMsIGluY2x1ZGluZworaHR0cDovL3NlYXJjaC5jcGFuLm9yZy9+cG1xcy9JTy1Db21wcmVzcy1abGliLyAuCisKK0EgUHl0aG9uIGludGVyZmFjZSB0byB6bGliIHdyaXR0ZW4gYnkgQS5NLiBLdWNobGluZyA8YW1rQGFtay5jYT4gaXMKK2F2YWlsYWJsZSBpbiBQeXRob24gMS41IGFuZCBsYXRlciB2ZXJzaW9ucywgc2VlCitodHRwOi8vZG9jcy5weXRob24ub3JnL2xpYnJhcnkvemxpYi5odG1sIC4KKworemxpYiBpcyBidWlsdCBpbnRvIHRjbDogaHR0cDovL3dpa2kudGNsLnRrLzQ2MTAgLgorCitBbiBleHBlcmltZW50YWwgcGFja2FnZSB0byByZWFkIGFuZCB3cml0ZSBmaWxlcyBpbiAuemlwIGZvcm1hdCwgd3JpdHRlbiBvbiB0b3AKK29mIHpsaWIgYnkgR2lsbGVzIFZvbGxhbnQgPGluZm9Ad2luaW1hZ2UuY29tPiwgaXMgYXZhaWxhYmxlIGluIHRoZQorY29udHJpYi9taW5pemlwIGRpcmVjdG9yeSBvZiB6bGliLgorCisKK05vdGVzIGZvciBzb21lIHRhcmdldHM6CisKKy0gRm9yIFdpbmRvd3MgRExMIHZlcnNpb25zLCBwbGVhc2Ugc2VlIHdpbjMyL0RMTF9GQVEudHh0CisKKy0gRm9yIDY0LWJpdCBJcml4LCBkZWZsYXRlLmMgbXVzdCBiZSBjb21waWxlZCB3aXRob3V0IGFueSBvcHRpbWl6YXRpb24uIFdpdGgKKyAgLU8sIG9uZSBsaWJwbmcgdGVzdCBmYWlscy4gVGhlIHRlc3Qgd29ya3MgaW4gMzIgYml0IG1vZGUgKHdpdGggdGhlIC1uMzIKKyAgY29tcGlsZXIgZmxhZykuIFRoZSBjb21waWxlciBidWcgaGFzIGJlZW4gcmVwb3J0ZWQgdG8gU0dJLgorCistIHpsaWIgZG9lc24ndCB3b3JrIHdpdGggZ2NjIDIuNi4zIG9uIGEgREVDIDMwMDAvMzAwTFggdW5kZXIgT1NGLzEgMi4xIGl0IHdvcmtzCisgIHdoZW4gY29tcGlsZWQgd2l0aCBjYy4KKworLSBPbiBEaWdpdGFsIFVuaXggNC4wRCAoZm9ybWVseSBPU0YvMSkgb24gQWxwaGFTZXJ2ZXIsIHRoZSBjYyBvcHRpb24gLXN0ZDEgaXMKKyAgbmVjZXNzYXJ5IHRvIGdldCBnenByaW50ZiB3b3JraW5nIGNvcnJlY3RseS4gVGhpcyBpcyBkb25lIGJ5IGNvbmZpZ3VyZS4KKworLSB6bGliIGRvZXNuJ3Qgd29yayBvbiBIUC1VWCA5LjA1IHdpdGggc29tZSB2ZXJzaW9ucyBvZiAvYmluL2NjLiBJdCB3b3JrcyB3aXRoCisgIG90aGVyIGNvbXBpbGVycy4gVXNlICJtYWtlIHRlc3QiIHRvIGNoZWNrIHlvdXIgY29tcGlsZXIuCisKKy0gZ3pkb3BlbiBpcyBub3Qgc3VwcG9ydGVkIG9uIFJJU0NPUyBvciBCRU9TLgorCistIEZvciBQYWxtT3MsIHNlZSBodHRwOi8vcGFsbXpsaWIuc291cmNlZm9yZ2UubmV0LworCisKK0Fja25vd2xlZGdtZW50czoKKworICBUaGUgZGVmbGF0ZSBmb3JtYXQgdXNlZCBieSB6bGliIHdhcyBkZWZpbmVkIGJ5IFBoaWwgS2F0ei4gIFRoZSBkZWZsYXRlIGFuZAorICB6bGliIHNwZWNpZmljYXRpb25zIHdlcmUgd3JpdHRlbiBieSBMLiAgUGV0ZXIgRGV1dHNjaC4gIFRoYW5rcyB0byBhbGwgdGhlCisgIHBlb3BsZSB3aG8gcmVwb3J0ZWQgcHJvYmxlbXMgYW5kIHN1Z2dlc3RlZCB2YXJpb3VzIGltcHJvdmVtZW50cyBpbiB6bGliOyB0aGV5CisgIGFyZSB0b28gbnVtZXJvdXMgdG8gY2l0ZSBoZXJlLgorCitDb3B5cmlnaHQgbm90aWNlOgorCisgKEMpIDE5OTUtMjAxMiBKZWFuLWxvdXAgR2FpbGx5IGFuZCBNYXJrIEFkbGVyCisKKyAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKKyAgd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcworICBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgorCisgIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAorICBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0CisgIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKKworICAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAorICAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQorICAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKKyAgICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KKyAgMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKKyAgICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgorICAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgorCisgIEplYW4tbG91cCBHYWlsbHkgICAgICAgIE1hcmsgQWRsZXIKKyAgamxvdXBAZ3ppcC5vcmcgICAgICAgICAgbWFkbGVyQGFsdW1uaS5jYWx0ZWNoLmVkdQorCitJZiB5b3UgdXNlIHRoZSB6bGliIGxpYnJhcnkgaW4gYSBwcm9kdWN0LCB3ZSB3b3VsZCBhcHByZWNpYXRlICpub3QqIHJlY2VpdmluZworbGVuZ3RoeSBsZWdhbCBkb2N1bWVudHMgdG8gc2lnbi4gIFRoZSBzb3VyY2VzIGFyZSBwcm92aWRlZCBmb3IgZnJlZSBidXQgd2l0aG91dAord2FycmFudHkgb2YgYW55IGtpbmQuICBUaGUgbGlicmFyeSBoYXMgYmVlbiBlbnRpcmVseSB3cml0dGVuIGJ5IEplYW4tbG91cAorR2FpbGx5IGFuZCBNYXJrIEFkbGVyOyBpdCBkb2VzIG5vdCBpbmNsdWRlIHRoaXJkLXBhcnR5IGNvZGUuCisKK0lmIHlvdSByZWRpc3RyaWJ1dGUgbW9kaWZpZWQgc291cmNlcywgd2Ugd291bGQgYXBwcmVjaWF0ZSB0aGF0IHlvdSBpbmNsdWRlIGluCit0aGUgZmlsZSBDaGFuZ2VMb2cgaGlzdG9yeSBpbmZvcm1hdGlvbiBkb2N1bWVudGluZyB5b3VyIGNoYW5nZXMuICBQbGVhc2UgcmVhZAordGhlIEZBUSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgZGlzdHJpYnV0aW9uIG9mIG1vZGlmaWVkIHNvdXJjZSB2ZXJzaW9ucy4KZGlmZiAtLWdpdCBhL3psaWItMS4yLjYvYWRsZXIzMi5jIGIvemxpYi0xLjIuNi9hZGxlcjMyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg2OGYwNwotLS0gL2Rldi9udWxsCisrKyBiL3psaWItMS4yLjYvYWRsZXIzMi5jCkBAIC0wLDAgKzEsMTc5IEBACisvKiBhZGxlcjMyLmMgLS0gY29tcHV0ZSB0aGUgQWRsZXItMzIgY2hlY2tzdW0gb2YgYSBkYXRhIHN0cmVhbQorICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMTEgTWFyayBBZGxlcgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAorICovCisKKy8qIEAoIykgJElkJCAqLworCisjaW5jbHVkZSAienV0aWwuaCIKKworI2RlZmluZSBsb2NhbCBzdGF0aWMKKworbG9jYWwgdUxvbmcgYWRsZXIzMl9jb21iaW5lXyBPRigodUxvbmcgYWRsZXIxLCB1TG9uZyBhZGxlcjIsIHpfb2ZmNjRfdCBsZW4yKSk7CisKKyNkZWZpbmUgQkFTRSA2NTUyMSAgICAgIC8qIGxhcmdlc3QgcHJpbWUgc21hbGxlciB0aGFuIDY1NTM2ICovCisjZGVmaW5lIE5NQVggNTU1MgorLyogTk1BWCBpcyB0aGUgbGFyZ2VzdCBuIHN1Y2ggdGhhdCAyNTVuKG4rMSkvMiArIChuKzEpKEJBU0UtMSkgPD0gMl4zMi0xICovCisKKyNkZWZpbmUgRE8xKGJ1ZixpKSAge2FkbGVyICs9IChidWYpW2ldOyBzdW0yICs9IGFkbGVyO30KKyNkZWZpbmUgRE8yKGJ1ZixpKSAgRE8xKGJ1ZixpKTsgRE8xKGJ1ZixpKzEpOworI2RlZmluZSBETzQoYnVmLGkpICBETzIoYnVmLGkpOyBETzIoYnVmLGkrMik7CisjZGVmaW5lIERPOChidWYsaSkgIERPNChidWYsaSk7IERPNChidWYsaSs0KTsKKyNkZWZpbmUgRE8xNihidWYpICAgRE84KGJ1ZiwwKTsgRE84KGJ1Ziw4KTsKKworLyogdXNlIE5PX0RJVklERSBpZiB5b3VyIHByb2Nlc3NvciBkb2VzIG5vdCBkbyBkaXZpc2lvbiBpbiBoYXJkd2FyZSAtLQorICAgdHJ5IGl0IGJvdGggd2F5cyB0byBzZWUgd2hpY2ggaXMgZmFzdGVyICovCisjaWZkZWYgTk9fRElWSURFCisvKiBub3RlIHRoYXQgdGhpcyBhc3N1bWVzIEJBU0UgaXMgNjU1MjEsIHdoZXJlIDY1NTM2ICUgNjU1MjEgPT0gMTUKKyAgICh0aGFuayB5b3UgdG8gSm9obiBSZWlzZXIgZm9yIHBvaW50aW5nIHRoaXMgb3V0KSAqLworIyAgZGVmaW5lIENIT1AoYSkgXAorICAgIGRvIHsgXAorICAgICAgICB1bnNpZ25lZCBsb25nIHRtcCA9IGEgPj4gMTY7IFwKKyAgICAgICAgYSAmPSAweGZmZmZVTDsgXAorICAgICAgICBhICs9ICh0bXAgPDwgNCkgLSB0bXA7IFwKKyAgICB9IHdoaWxlICgwKQorIyAgZGVmaW5lIE1PRDI4KGEpIFwKKyAgICBkbyB7IFwKKyAgICAgICAgQ0hPUChhKTsgXAorICAgICAgICBpZiAoYSA+PSBCQVNFKSBhIC09IEJBU0U7IFwKKyAgICB9IHdoaWxlICgwKQorIyAgZGVmaW5lIE1PRChhKSBcCisgICAgZG8geyBcCisgICAgICAgIENIT1AoYSk7IFwKKyAgICAgICAgTU9EMjgoYSk7IFwKKyAgICB9IHdoaWxlICgwKQorIyAgZGVmaW5lIE1PRDYzKGEpIFwKKyAgICBkbyB7IC8qIHRoaXMgYXNzdW1lcyBhIGlzIG5vdCBuZWdhdGl2ZSAqLyBcCisgICAgICAgIHpfb2ZmNjRfdCB0bXAgPSBhID4+IDMyOyBcCisgICAgICAgIGEgJj0gMHhmZmZmZmZmZkw7IFwKKyAgICAgICAgYSArPSAodG1wIDw8IDgpIC0gKHRtcCA8PCA1KSArIHRtcDsgXAorICAgICAgICB0bXAgPSBhID4+IDE2OyBcCisgICAgICAgIGEgJj0gMHhmZmZmTDsgXAorICAgICAgICBhICs9ICh0bXAgPDwgNCkgLSB0bXA7IFwKKyAgICAgICAgdG1wID0gYSA+PiAxNjsgXAorICAgICAgICBhICY9IDB4ZmZmZkw7IFwKKyAgICAgICAgYSArPSAodG1wIDw8IDQpIC0gdG1wOyBcCisgICAgICAgIGlmIChhID49IEJBU0UpIGEgLT0gQkFTRTsgXAorICAgIH0gd2hpbGUgKDApCisjZWxzZQorIyAgZGVmaW5lIE1PRChhKSBhICU9IEJBU0UKKyMgIGRlZmluZSBNT0QyOChhKSBhICU9IEJBU0UKKyMgIGRlZmluZSBNT0Q2MyhhKSBhICU9IEJBU0UKKyNlbmRpZgorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCit1TG9uZyBaRVhQT1JUIGFkbGVyMzIoYWRsZXIsIGJ1ZiwgbGVuKQorICAgIHVMb25nIGFkbGVyOworICAgIGNvbnN0IEJ5dGVmICpidWY7CisgICAgdUludCBsZW47Cit7CisgICAgdW5zaWduZWQgbG9uZyBzdW0yOworICAgIHVuc2lnbmVkIG47CisKKyAgICAvKiBzcGxpdCBBZGxlci0zMiBpbnRvIGNvbXBvbmVudCBzdW1zICovCisgICAgc3VtMiA9IChhZGxlciA+PiAxNikgJiAweGZmZmY7CisgICAgYWRsZXIgJj0gMHhmZmZmOworCisgICAgLyogaW4gY2FzZSB1c2VyIGxpa2VzIGRvaW5nIGEgYnl0ZSBhdCBhIHRpbWUsIGtlZXAgaXQgZmFzdCAqLworICAgIGlmIChsZW4gPT0gMSkgeworICAgICAgICBhZGxlciArPSBidWZbMF07CisgICAgICAgIGlmIChhZGxlciA+PSBCQVNFKQorICAgICAgICAgICAgYWRsZXIgLT0gQkFTRTsKKyAgICAgICAgc3VtMiArPSBhZGxlcjsKKyAgICAgICAgaWYgKHN1bTIgPj0gQkFTRSkKKyAgICAgICAgICAgIHN1bTIgLT0gQkFTRTsKKyAgICAgICAgcmV0dXJuIGFkbGVyIHwgKHN1bTIgPDwgMTYpOworICAgIH0KKworICAgIC8qIGluaXRpYWwgQWRsZXItMzIgdmFsdWUgKGRlZmVycmVkIGNoZWNrIGZvciBsZW4gPT0gMSBzcGVlZCkgKi8KKyAgICBpZiAoYnVmID09IFpfTlVMTCkKKyAgICAgICAgcmV0dXJuIDFMOworCisgICAgLyogaW4gY2FzZSBzaG9ydCBsZW5ndGhzIGFyZSBwcm92aWRlZCwga2VlcCBpdCBzb21ld2hhdCBmYXN0ICovCisgICAgaWYgKGxlbiA8IDE2KSB7CisgICAgICAgIHdoaWxlIChsZW4tLSkgeworICAgICAgICAgICAgYWRsZXIgKz0gKmJ1ZisrOworICAgICAgICAgICAgc3VtMiArPSBhZGxlcjsKKyAgICAgICAgfQorICAgICAgICBpZiAoYWRsZXIgPj0gQkFTRSkKKyAgICAgICAgICAgIGFkbGVyIC09IEJBU0U7CisgICAgICAgIE1PRDI4KHN1bTIpOyAgICAgICAgICAgIC8qIG9ubHkgYWRkZWQgc28gbWFueSBCQVNFJ3MgKi8KKyAgICAgICAgcmV0dXJuIGFkbGVyIHwgKHN1bTIgPDwgMTYpOworICAgIH0KKworICAgIC8qIGRvIGxlbmd0aCBOTUFYIGJsb2NrcyAtLSByZXF1aXJlcyBqdXN0IG9uZSBtb2R1bG8gb3BlcmF0aW9uICovCisgICAgd2hpbGUgKGxlbiA+PSBOTUFYKSB7CisgICAgICAgIGxlbiAtPSBOTUFYOworICAgICAgICBuID0gTk1BWCAvIDE2OyAgICAgICAgICAvKiBOTUFYIGlzIGRpdmlzaWJsZSBieSAxNiAqLworICAgICAgICBkbyB7CisgICAgICAgICAgICBETzE2KGJ1Zik7ICAgICAgICAgIC8qIDE2IHN1bXMgdW5yb2xsZWQgKi8KKyAgICAgICAgICAgIGJ1ZiArPSAxNjsKKyAgICAgICAgfSB3aGlsZSAoLS1uKTsKKyAgICAgICAgTU9EKGFkbGVyKTsKKyAgICAgICAgTU9EKHN1bTIpOworICAgIH0KKworICAgIC8qIGRvIHJlbWFpbmluZyBieXRlcyAobGVzcyB0aGFuIE5NQVgsIHN0aWxsIGp1c3Qgb25lIG1vZHVsbykgKi8KKyAgICBpZiAobGVuKSB7ICAgICAgICAgICAgICAgICAgLyogYXZvaWQgbW9kdWxvcyBpZiBub25lIHJlbWFpbmluZyAqLworICAgICAgICB3aGlsZSAobGVuID49IDE2KSB7CisgICAgICAgICAgICBsZW4gLT0gMTY7CisgICAgICAgICAgICBETzE2KGJ1Zik7CisgICAgICAgICAgICBidWYgKz0gMTY7CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUgKGxlbi0tKSB7CisgICAgICAgICAgICBhZGxlciArPSAqYnVmKys7CisgICAgICAgICAgICBzdW0yICs9IGFkbGVyOworICAgICAgICB9CisgICAgICAgIE1PRChhZGxlcik7CisgICAgICAgIE1PRChzdW0yKTsKKyAgICB9CisKKyAgICAvKiByZXR1cm4gcmVjb21iaW5lZCBzdW1zICovCisgICAgcmV0dXJuIGFkbGVyIHwgKHN1bTIgPDwgMTYpOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitsb2NhbCB1TG9uZyBhZGxlcjMyX2NvbWJpbmVfKGFkbGVyMSwgYWRsZXIyLCBsZW4yKQorICAgIHVMb25nIGFkbGVyMTsKKyAgICB1TG9uZyBhZGxlcjI7CisgICAgel9vZmY2NF90IGxlbjI7Cit7CisgICAgdW5zaWduZWQgbG9uZyBzdW0xOworICAgIHVuc2lnbmVkIGxvbmcgc3VtMjsKKyAgICB1bnNpZ25lZCByZW07CisKKyAgICAvKiBmb3IgbmVnYXRpdmUgbGVuLCByZXR1cm4gaW52YWxpZCBhZGxlcjMyIGFzIGEgY2x1ZSBmb3IgZGVidWdnaW5nICovCisgICAgaWYgKGxlbjIgPCAwKQorICAgICAgICByZXR1cm4gMHhmZmZmZmZmZlVMOworCisgICAgLyogdGhlIGRlcml2YXRpb24gb2YgdGhpcyBmb3JtdWxhIGlzIGxlZnQgYXMgYW4gZXhlcmNpc2UgZm9yIHRoZSByZWFkZXIgKi8KKyAgICBNT0Q2MyhsZW4yKTsgICAgICAgICAgICAgICAgLyogYXNzdW1lcyBsZW4yID49IDAgKi8KKyAgICByZW0gPSAodW5zaWduZWQpbGVuMjsKKyAgICBzdW0xID0gYWRsZXIxICYgMHhmZmZmOworICAgIHN1bTIgPSByZW0gKiBzdW0xOworICAgIE1PRChzdW0yKTsKKyAgICBzdW0xICs9IChhZGxlcjIgJiAweGZmZmYpICsgQkFTRSAtIDE7CisgICAgc3VtMiArPSAoKGFkbGVyMSA+PiAxNikgJiAweGZmZmYpICsgKChhZGxlcjIgPj4gMTYpICYgMHhmZmZmKSArIEJBU0UgLSByZW07CisgICAgaWYgKHN1bTEgPj0gQkFTRSkgc3VtMSAtPSBCQVNFOworICAgIGlmIChzdW0xID49IEJBU0UpIHN1bTEgLT0gQkFTRTsKKyAgICBpZiAoc3VtMiA+PSAoQkFTRSA8PCAxKSkgc3VtMiAtPSAoQkFTRSA8PCAxKTsKKyAgICBpZiAoc3VtMiA+PSBCQVNFKSBzdW0yIC09IEJBU0U7CisgICAgcmV0dXJuIHN1bTEgfCAoc3VtMiA8PCAxNik7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK3VMb25nIFpFWFBPUlQgYWRsZXIzMl9jb21iaW5lKGFkbGVyMSwgYWRsZXIyLCBsZW4yKQorICAgIHVMb25nIGFkbGVyMTsKKyAgICB1TG9uZyBhZGxlcjI7CisgICAgel9vZmZfdCBsZW4yOworeworICAgIHJldHVybiBhZGxlcjMyX2NvbWJpbmVfKGFkbGVyMSwgYWRsZXIyLCBsZW4yKTsKK30KKwordUxvbmcgWkVYUE9SVCBhZGxlcjMyX2NvbWJpbmU2NChhZGxlcjEsIGFkbGVyMiwgbGVuMikKKyAgICB1TG9uZyBhZGxlcjE7CisgICAgdUxvbmcgYWRsZXIyOworICAgIHpfb2ZmNjRfdCBsZW4yOworeworICAgIHJldHVybiBhZGxlcjMyX2NvbWJpbmVfKGFkbGVyMSwgYWRsZXIyLCBsZW4yKTsKK30KZGlmZiAtLWdpdCBhL3psaWItMS4yLjYvYW1pZ2EvTWFrZWZpbGUucHVwIGIvemxpYi0xLjIuNi9hbWlnYS9NYWtlZmlsZS5wdXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk0MGMxMgotLS0gL2Rldi9udWxsCisrKyBiL3psaWItMS4yLjYvYW1pZ2EvTWFrZWZpbGUucHVwCkBAIC0wLDAgKzEsNjkgQEAKKyMgQW1pZ2EgcG93ZXJVUCAoVE0pIE1ha2VmaWxlCisjIG1ha2VmaWxlIGZvciBsaWJwbmcgYW5kIFNBUyBDIFY2LjU4LzcuMDAgUFBDIGNvbXBpbGVyCisjIENvcHlyaWdodCAoQykgMTk5OCBieSBBbmRyZWFzIFIuIEtsZWluZXJ0CisKK0xJQk5BTUUJPSBsaWJ6aXAuYQorCitDQwk9IHNjcHBjCitDRkxBR1MJPSBOT1NUS0NISyBOT1NJTlQgT1BUSU1JWkUgT1BUR08gT1BUUEVFUCBPUFRJTkxPQ0FMIE9QVElOTCBcCisJICBPUFRMT09QIE9QVFJERVA9OCBPUFRERVA9OCBPUFRDT01QPTggTk9WRVIKK0FSCT0gcHBjLWFtaWdhb3MtYXIgY3IKK1JBTkxJQgk9IHBwYy1hbWlnYW9zLXJhbmxpYgorTEQJPSBwcGMtYW1pZ2Fvcy1sZCAtcgorTERGTEFHUwk9IC1vCitMRExJQlMJPSBMSUI6c2NwcGMuYSBMSUI6ZW5kLm8KK1JNCT0gZGVsZXRlIHF1aWV0CisKK09CSlMgPSBhZGxlcjMyLm8gY29tcHJlc3MubyBjcmMzMi5vIGd6Y2xvc2UubyBnemxpYi5vIGd6cmVhZC5vIGd6d3JpdGUubyBcCisgICAgICAgdW5jb21wci5vIGRlZmxhdGUubyB0cmVlcy5vIHp1dGlsLm8gaW5mbGF0ZS5vIGluZmJhY2subyBpbmZ0cmVlcy5vIGluZmZhc3QubworCitURVNUX09CSlMgPSBleGFtcGxlLm8gbWluaWd6aXAubworCithbGw6IGV4YW1wbGUgbWluaWd6aXAKKworY2hlY2s6IHRlc3QKK3Rlc3Q6IGFsbAorCWV4YW1wbGUKKwllY2hvIGhlbGxvIHdvcmxkIHwgbWluaWd6aXAgfCBtaW5pZ3ppcCAtZAorCiskKExJQk5BTUUpOiAkKE9CSlMpCisJJChBUikgJEAgJChPQkpTKQorCS0kKFJBTkxJQikgJEAKKworZXhhbXBsZTogZXhhbXBsZS5vICQoTElCTkFNRSkKKwkkKExEKSAkKExERkxBR1MpICRAIExJQjpjX3BwYy5vICRALm8gJChMSUJOQU1FKSAkKExETElCUykKKworbWluaWd6aXA6IG1pbmlnemlwLm8gJChMSUJOQU1FKQorCSQoTEQpICQoTERGTEFHUykgJEAgTElCOmNfcHBjLm8gJEAubyAkKExJQk5BTUUpICQoTERMSUJTKQorCittb3N0bHljbGVhbjogY2xlYW4KK2NsZWFuOgorCSQoUk0pICoubyBleGFtcGxlIG1pbmlnemlwICQoTElCTkFNRSkgZm9vLmd6CisKK3ppcDoKKwl6aXAgLXVsOSB6bGliIFJFQURNRSBDaGFuZ2VMb2cgTWFrZWZpbGUgTWFrZT8/Pz8uPz8/IE1ha2VmaWxlLj8/IFwKKwkgIGRlc2NyaXAubW1zICouW2NoXQorCit0Z3o6CisJY2QgLi47IHRhciBjZnogemxpYi96bGliLnRneiB6bGliL1JFQURNRSB6bGliL0NoYW5nZUxvZyB6bGliL01ha2VmaWxlIFwKKwkgIHpsaWIvTWFrZT8/Pz8uPz8/IHpsaWIvTWFrZWZpbGUuPz8gemxpYi9kZXNjcmlwLm1tcyB6bGliLyouW2NoXQorCisjIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1ha2UgZGVwZW5kIGRlcGVuZHMgb24gaXQuCisKK2FkbGVyMzIubzogemxpYi5oIHpjb25mLmgKK2NvbXByZXNzLm86IHpsaWIuaCB6Y29uZi5oCitjcmMzMi5vOiBjcmMzMi5oIHpsaWIuaCB6Y29uZi5oCitkZWZsYXRlLm86IGRlZmxhdGUuaCB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCitleGFtcGxlLm86IHpsaWIuaCB6Y29uZi5oCitnemNsb3NlLm86IHpsaWIuaCB6Y29uZi5oIGd6Z3V0cy5oCitnemxpYi5vOiB6bGliLmggemNvbmYuaCBnemd1dHMuaAorZ3pyZWFkLm86IHpsaWIuaCB6Y29uZi5oIGd6Z3V0cy5oCitnendyaXRlLm86IHpsaWIuaCB6Y29uZi5oIGd6Z3V0cy5oCitpbmZmYXN0Lm86IHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mdHJlZXMuaCBpbmZsYXRlLmggaW5mZmFzdC5oCitpbmZsYXRlLm86IHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mdHJlZXMuaCBpbmZsYXRlLmggaW5mZmFzdC5oCitpbmZiYWNrLm86IHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mdHJlZXMuaCBpbmZsYXRlLmggaW5mZmFzdC5oCitpbmZ0cmVlcy5vOiB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZnRyZWVzLmgKK21pbmlnemlwLm86IHpsaWIuaCB6Y29uZi5oCit0cmVlcy5vOiBkZWZsYXRlLmggenV0aWwuaCB6bGliLmggemNvbmYuaCB0cmVlcy5oCit1bmNvbXByLm86IHpsaWIuaCB6Y29uZi5oCit6dXRpbC5vOiB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCmRpZmYgLS1naXQgYS96bGliLTEuMi42L2FtaWdhL01ha2VmaWxlLnNhcyBiL3psaWItMS4yLjYvYW1pZ2EvTWFrZWZpbGUuc2FzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0OWUyOTEKLS0tIC9kZXYvbnVsbAorKysgYi96bGliLTEuMi42L2FtaWdhL01ha2VmaWxlLnNhcwpAQCAtMCwwICsxLDY4IEBACisjIFNNYWtlZmlsZSBmb3IgemxpYgorIyBNb2RpZmllZCBmcm9tIHRoZSBzdGFuZGFyZCBVTklYIE1ha2VmaWxlIENvcHlyaWdodCBKZWFuLWxvdXAgR2FpbGx5CisjIE9zbWEgQWh2ZW5sYW1waSA8T3NtYS5BaHZlbmxhbXBpQGh1dC5maT4KKyMgQW1pZ2EsIFNBUy9DIDYuNTYgJiBTbWFrZQorCitDQz1zYworQ0ZMQUdTPU9QVAorI0NGTEFHUz1PUFQgQ1BVPTY4MDMwCisjQ0ZMQUdTPURFQlVHPUxJTkUKK0xERkxBR1M9TElCIHoubGliCisKK1NDT1BUSU9OUz1PUFRTQ0hFRCBPUFRJTkxJTkUgT1BUQUxJQVMgT1BUVElNRSBPUFRJTkxPQ0FMIFNUUk1FUkdFIFwKKyAgICAgICBOT0lDT05TIFBBUk1TPUJPVEggTk9TVEFDS0NIRUNLIFVUSUxMSUIgTk9WRVJTSU9OIEVSUk9SUkVYWCBcCisgICAgICAgREVGPVBPU1RJTkMKKworT0JKUyA9IGFkbGVyMzIubyBjb21wcmVzcy5vIGNyYzMyLm8gZ3pjbG9zZS5vIGd6bGliLm8gZ3pyZWFkLm8gZ3p3cml0ZS5vIFwKKyAgICAgICB1bmNvbXByLm8gZGVmbGF0ZS5vIHRyZWVzLm8genV0aWwubyBpbmZsYXRlLm8gaW5mYmFjay5vIGluZnRyZWVzLm8gaW5mZmFzdC5vCisKK1RFU1RfT0JKUyA9IGV4YW1wbGUubyBtaW5pZ3ppcC5vCisKK2FsbDogU0NPUFRJT05TIGV4YW1wbGUgbWluaWd6aXAKKworY2hlY2s6IHRlc3QKK3Rlc3Q6IGFsbAorCWV4YW1wbGUKKwllY2hvIGhlbGxvIHdvcmxkIHwgbWluaWd6aXAgfCBtaW5pZ3ppcCAtZAorCitpbnN0YWxsOiB6LmxpYgorCWNvcHkgY2xvbmUgemxpYi5oIHpjb25mLmggSU5DTFVERToKKwljb3B5IGNsb25lIHoubGliIExJQjoKKworei5saWI6ICQoT0JKUykKKwlvbWwgei5saWIgciAkKE9CSlMpCisKK2V4YW1wbGU6IGV4YW1wbGUubyB6LmxpYgorCSQoQ0MpICQoQ0ZMQUdTKSBMSU5LIFRPICRAIGV4YW1wbGUubyAkKExERkxBR1MpCisKK21pbmlnemlwOiBtaW5pZ3ppcC5vIHoubGliCisJJChDQykgJChDRkxBR1MpIExJTksgVE8gJEAgbWluaWd6aXAubyAkKExERkxBR1MpCisKK21vc3RseWNsZWFuOiBjbGVhbgorY2xlYW46CisJLWRlbGV0ZSBmb3JjZSBxdWlldCBleGFtcGxlIG1pbmlnemlwICoubyB6LmxpYiBmb28uZ3ogKi5sbmsgU0NPUFRJT05TCisKK1NDT1BUSU9OUzogTWFrZWZpbGUuc2FzCisJY29weSB0byAkQCA8ZnJvbSA8CiskKFNDT1BUSU9OUykKKzwKKworIyBETyBOT1QgREVMRVRFIFRISVMgTElORSAtLSBtYWtlIGRlcGVuZCBkZXBlbmRzIG9uIGl0LgorCithZGxlcjMyLm86IHpsaWIuaCB6Y29uZi5oCitjb21wcmVzcy5vOiB6bGliLmggemNvbmYuaAorY3JjMzIubzogY3JjMzIuaCB6bGliLmggemNvbmYuaAorZGVmbGF0ZS5vOiBkZWZsYXRlLmggenV0aWwuaCB6bGliLmggemNvbmYuaAorZXhhbXBsZS5vOiB6bGliLmggemNvbmYuaAorZ3pjbG9zZS5vOiB6bGliLmggemNvbmYuaCBnemd1dHMuaAorZ3psaWIubzogemxpYi5oIHpjb25mLmggZ3pndXRzLmgKK2d6cmVhZC5vOiB6bGliLmggemNvbmYuaCBnemd1dHMuaAorZ3p3cml0ZS5vOiB6bGliLmggemNvbmYuaCBnemd1dHMuaAoraW5mZmFzdC5vOiB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZnRyZWVzLmggaW5mbGF0ZS5oIGluZmZhc3QuaAoraW5mbGF0ZS5vOiB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZnRyZWVzLmggaW5mbGF0ZS5oIGluZmZhc3QuaAoraW5mYmFjay5vOiB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZnRyZWVzLmggaW5mbGF0ZS5oIGluZmZhc3QuaAoraW5mdHJlZXMubzogenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZ0cmVlcy5oCittaW5pZ3ppcC5vOiB6bGliLmggemNvbmYuaAordHJlZXMubzogZGVmbGF0ZS5oIHp1dGlsLmggemxpYi5oIHpjb25mLmggdHJlZXMuaAordW5jb21wci5vOiB6bGliLmggemNvbmYuaAorenV0aWwubzogenV0aWwuaCB6bGliLmggemNvbmYuaApkaWZmIC0tZ2l0IGEvemxpYi0xLjIuNi9hczQwMC9ibmRzcmMgYi96bGliLTEuMi42L2FzNDAwL2JuZHNyYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDQ4ZGJiCi0tLSAvZGV2L251bGwKKysrIGIvemxpYi0xLjIuNi9hczQwMC9ibmRzcmMKQEAgLTAsMCArMSwyMDYgQEAKK1NUUlBHTUVYUCBQR01MVkwoKkNVUlJFTlQpIFNJR05BVFVSRSgnWkxJQicpCisKKy8qQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAKi8KKy8qICAgVmVyc2lvbiAxLjEuMyBlbnRyeSBwb2ludHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAqTU9EVUxFICAgICAgQURMRVIzMiAgICAgIFpMSUIgICAgICAgICAwMS8wMi8wMSAgMDA6MTU6MDkgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIEVYUE9SVCBTWU1CT0woImFkbGVyMzIiKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICpNT0RVTEUgICAgICBDT01QUkVTUyAgICAgWkxJQiAgICAgICAgIDAxLzAyLzAxICAwMDoxNTowOSAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgRVhQT1JUIFNZTUJPTCgiY29tcHJlc3MiKQorICBFWFBPUlQgU1lNQk9MKCJjb21wcmVzczIiKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICpNT0RVTEUgICAgICBDUkMzMiAgICAgICAgWkxJQiAgICAgICAgIDAxLzAyLzAxICAwMDoxNTowOSAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgRVhQT1JUIFNZTUJPTCgiY3JjMzIiKQorICBFWFBPUlQgU1lNQk9MKCJnZXRfY3JjX3RhYmxlIikKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAqTU9EVUxFICAgICAgREVGTEFURSAgICAgIFpMSUIgICAgICAgICAwMS8wMi8wMSAgMDA6MTU6MDkgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIEVYUE9SVCBTWU1CT0woImRlZmxhdGUiKQorICBFWFBPUlQgU1lNQk9MKCJkZWZsYXRlRW5kIikKKyAgRVhQT1JUIFNZTUJPTCgiZGVmbGF0ZVNldERpY3Rpb25hcnkiKQorICBFWFBPUlQgU1lNQk9MKCJkZWZsYXRlQ29weSIpCisgIEVYUE9SVCBTWU1CT0woImRlZmxhdGVSZXNldCIpCisgIEVYUE9SVCBTWU1CT0woImRlZmxhdGVQYXJhbXMiKQorICBFWFBPUlQgU1lNQk9MKCJkZWZsYXRlUHJpbWUiKQorICBFWFBPUlQgU1lNQk9MKCJkZWZsYXRlSW5pdF8iKQorICBFWFBPUlQgU1lNQk9MKCJkZWZsYXRlSW5pdDJfIikKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAqTU9EVUxFICAgICAgR1pJTyAgICAgICAgIFpMSUIgICAgICAgICAwMS8wMi8wMSAgMDA6MTU6MDkgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIEVYUE9SVCBTWU1CT0woImd6b3BlbiIpCisgIEVYUE9SVCBTWU1CT0woImd6ZG9wZW4iKQorICBFWFBPUlQgU1lNQk9MKCJnenNldHBhcmFtcyIpCisgIEVYUE9SVCBTWU1CT0woImd6cmVhZCIpCisgIEVYUE9SVCBTWU1CT0woImd6d3JpdGUiKQorICBFWFBPUlQgU1lNQk9MKCJnenByaW50ZiIpCisgIEVYUE9SVCBTWU1CT0woImd6cHV0cyIpCisgIEVYUE9SVCBTWU1CT0woImd6Z2V0cyIpCisgIEVYUE9SVCBTWU1CT0woImd6cHV0YyIpCisgIEVYUE9SVCBTWU1CT0woImd6Z2V0YyIpCisgIEVYUE9SVCBTWU1CT0woImd6Zmx1c2giKQorICBFWFBPUlQgU1lNQk9MKCJnenNlZWsiKQorICBFWFBPUlQgU1lNQk9MKCJnenJld2luZCIpCisgIEVYUE9SVCBTWU1CT0woImd6dGVsbCIpCisgIEVYUE9SVCBTWU1CT0woImd6ZW9mIikKKyAgRVhQT1JUIFNZTUJPTCgiZ3pjbG9zZSIpCisgIEVYUE9SVCBTWU1CT0woImd6ZXJyb3IiKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICpNT0RVTEUgICAgICBJTkZMQVRFICAgICAgWkxJQiAgICAgICAgIDAxLzAyLzAxICAwMDoxNTowOSAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgRVhQT1JUIFNZTUJPTCgiaW5mbGF0ZSIpCisgIEVYUE9SVCBTWU1CT0woImluZmxhdGVFbmQiKQorICBFWFBPUlQgU1lNQk9MKCJpbmZsYXRlU2V0RGljdGlvbmFyeSIpCisgIEVYUE9SVCBTWU1CT0woImluZmxhdGVTeW5jIikKKyAgRVhQT1JUIFNZTUJPTCgiaW5mbGF0ZVJlc2V0IikKKyAgRVhQT1JUIFNZTUJPTCgiaW5mbGF0ZUluaXRfIikKKyAgRVhQT1JUIFNZTUJPTCgiaW5mbGF0ZUluaXQyXyIpCisgIEVYUE9SVCBTWU1CT0woImluZmxhdGVTeW5jUG9pbnQiKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICpNT0RVTEUgICAgICBVTkNPTVBSICAgICAgWkxJQiAgICAgICAgIDAxLzAyLzAxICAwMDoxNTowOSAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgRVhQT1JUIFNZTUJPTCgidW5jb21wcmVzcyIpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgKk1PRFVMRSAgICAgIFpVVElMICAgICAgICBaTElCICAgICAgICAgMDEvMDIvMDEgIDAwOjE1OjA5ICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICBFWFBPUlQgU1lNQk9MKCJ6bGliVmVyc2lvbiIpCisgIEVYUE9SVCBTWU1CT0woInpFcnJvciIpCisKKy8qQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAKi8KKy8qICAgVmVyc2lvbiAxLjIuMSBhZGRpdGlvbmFsIGVudHJ5IHBvaW50cy4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAqTU9EVUxFICAgICAgQ09NUFJFU1MgICAgIFpMSUIgICAgICAgICAwMS8wMi8wMSAgMDA6MTU6MDkgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIEVYUE9SVCBTWU1CT0woImNvbXByZXNzQm91bmQiKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICpNT0RVTEUgICAgICBERUZMQVRFICAgICAgWkxJQiAgICAgICAgIDAxLzAyLzAxICAwMDoxNTowOSAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgRVhQT1JUIFNZTUJPTCgiZGVmbGF0ZUJvdW5kIikKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAqTU9EVUxFICAgICAgR1pJTyAgICAgICAgIFpMSUIgICAgICAgICAwMS8wMi8wMSAgMDA6MTU6MDkgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIEVYUE9SVCBTWU1CT0woImd6dW5nZXRjIikKKyAgRVhQT1JUIFNZTUJPTCgiZ3pjbGVhcmVyciIpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgKk1PRFVMRSAgICAgIElORkJBQ0sgICAgICBaTElCICAgICAgICAgMDEvMDIvMDEgIDAwOjE1OjA5ICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICBFWFBPUlQgU1lNQk9MKCJpbmZsYXRlQmFjayIpCisgIEVYUE9SVCBTWU1CT0woImluZmxhdGVCYWNrRW5kIikKKyAgRVhQT1JUIFNZTUJPTCgiaW5mbGF0ZUJhY2tJbml0XyIpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgKk1PRFVMRSAgICAgIElORkxBVEUgICAgICBaTElCICAgICAgICAgMDEvMDIvMDEgIDAwOjE1OjA5ICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICBFWFBPUlQgU1lNQk9MKCJpbmZsYXRlQ29weSIpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgKk1PRFVMRSAgICAgIFpVVElMICAgICAgICBaTElCICAgICAgICAgMDEvMDIvMDEgIDAwOjE1OjA5ICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICBFWFBPUlQgU1lNQk9MKCJ6bGliQ29tcGlsZUZsYWdzIikKKworLypAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAqLworLyogICBWZXJzaW9uIDEuMi41IGFkZGl0aW9uYWwgZW50cnkgcG9pbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAqLworLypAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICpNT0RVTEUgICAgICBBRExFUjMyICAgICAgWkxJQiAgICAgICAgIDAxLzAyLzAxICAwMDoxNTowOSAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgRVhQT1JUIFNZTUJPTCgiYWRsZXIzMl9jb21iaW5lIikKKyAgRVhQT1JUIFNZTUJPTCgiYWRsZXIzMl9jb21iaW5lNjQiKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICpNT0RVTEUgICAgICBDUkMzMiAgICAgICAgWkxJQiAgICAgICAgIDAxLzAyLzAxICAwMDoxNTowOSAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgRVhQT1JUIFNZTUJPTCgiY3JjMzJfY29tYmluZSIpCisgIEVYUE9SVCBTWU1CT0woImNyYzMyX2NvbWJpbmU2NCIpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgKk1PRFVMRSAgICAgIEdaTElCICAgICAgICBaTElCICAgICAgICAgMDEvMDIvMDEgIDAwOjE1OjA5ICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICBFWFBPUlQgU1lNQk9MKCJnemJ1ZmZlciIpCisgIEVYUE9SVCBTWU1CT0woImd6b2Zmc2V0IikKKyAgRVhQT1JUIFNZTUJPTCgiZ3pvZmZzZXQ2NCIpCisgIEVYUE9SVCBTWU1CT0woImd6b3BlbjY0IikKKyAgRVhQT1JUIFNZTUJPTCgiZ3pzZWVrNjQiKQorICBFWFBPUlQgU1lNQk9MKCJnenRlbGw2NCIpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgKk1PRFVMRSAgICAgIEdaUkVBRCAgICAgICBaTElCICAgICAgICAgMDEvMDIvMDEgIDAwOjE1OjA5ICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICBFWFBPUlQgU1lNQk9MKCJnemNsb3NlX3IiKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICpNT0RVTEUgICAgICBHWldSSVRFICAgICAgWkxJQiAgICAgICAgIDAxLzAyLzAxICAwMDoxNTowOSAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgRVhQT1JUIFNZTUJPTCgiZ3pjbG9zZV93IikKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAqTU9EVUxFICAgICAgSU5GTEFURSAgICAgIFpMSUIgICAgICAgICAwMS8wMi8wMSAgMDA6MTU6MDkgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIEVYUE9SVCBTWU1CT0woImluZmxhdGVNYXJrIikKKyAgRVhQT1JUIFNZTUJPTCgiaW5mbGF0ZVByaW1lIikKKyAgRVhQT1JUIFNZTUJPTCgiaW5mbGF0ZVJlc2V0MiIpCisgIEVYUE9SVCBTWU1CT0woImluZmxhdGVVbmRlcm1pbmUiKQorCisvKkBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQCovCisvKiAgIFZlcnNpb24gMS4yLjYgYWRkaXRpb25hbCBlbnRyeSBwb2ludHMuICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKkBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQCovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgKk1PRFVMRSAgICAgIERFRkxBVEUgICAgICBaTElCICAgICAgICAgMDEvMDIvMDEgIDAwOjE1OjA5ICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICBFWFBPUlQgU1lNQk9MKCJkZWZsYXRlUmVzZXRLZWVwIikKKyAgRVhQT1JUIFNZTUJPTCgiZGVmbGF0ZVBlbmRpbmciKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICpNT0RVTEUgICAgICBHWldSSVRFICAgICAgWkxJQiAgICAgICAgIDAxLzAyLzAxICAwMDoxNTowOSAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgRVhQT1JUIFNZTUJPTCgiZ3pnZXRjXyIpCisgIEVYUE9SVCBTWU1CT0woImd6ZmxhZ3MiKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICpNT0RVTEUgICAgICBJTkZMQVRFICAgICAgWkxJQiAgICAgICAgIDAxLzAyLzAxICAwMDoxNTowOSAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgRVhQT1JUIFNZTUJPTCgiaW5mbGF0ZVJlc2V0S2VlcCIpCisKK0VORFBHTUVYUApkaWZmIC0tZ2l0IGEvemxpYi0xLjIuNi9hczQwMC9jb21waWxlLmNscCBiL3psaWItMS4yLjYvYXM0MDAvY29tcGlsZS5jbHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ5NmFkNAotLS0gL2Rldi9udWxsCisrKyBiL3psaWItMS4yLjYvYXM0MDAvY29tcGlsZS5jbHAKQEAgLTAsMCArMSwxMTAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFpMSUIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBDb21waWxlIHNvdXJjZXMgaW50byBtb2R1bGVzIGFuZCBsaW5rIHRoZW0gaW50byBhIHNlcnZpY2UgcHJvZ3JhbS4gICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICAgICAgICAgICBQR00KKworLyogICAgICBDb25maWd1cmF0aW9uIGFkanVzdGFibGUgcGFyYW1ldGVycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgIERDTCAgICAgICAgVkFSKCZTUkNMSUIpIFRZUEUoKkNIQVIpIExFTigxMCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICBWQUxVRSgnWkxJQicpICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSBsaWJyYXJ5LiAqLworICAgICAgICAgICAgIERDTCAgICAgICAgVkFSKCZTUkNGSUxFKSBUWVBFKCpDSEFSKSBMRU4oMTApICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVkFMVUUoJ1NPVVJDRVMnKSAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgbWVtYmVyIGZpbGUuICovCisgICAgICAgICAgICAgRENMICAgICAgICBWQVIoJkNUTEZJTEUpIFRZUEUoKkNIQVIpIExFTigxMCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICBWQUxVRSgnVE9PTFMnKSAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvbnRyb2wgbWVtYmVyIGZpbGUuICovCisKKyAgICAgICAgICAgICBEQ0wgICAgICAgIFZBUigmTU9ETElCKSBUWVBFKCpDSEFSKSBMRU4oMTApICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVkFMVUUoJ1pMSUInKSAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNb2R1bGUgbGlicmFyeS4gKi8KKworICAgICAgICAgICAgIERDTCAgICAgICAgVkFSKCZTUlZMSUIpIFRZUEUoKkNIQVIpIExFTigxMCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICBWQUxVRSgnTEdQTCcpICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNlcnZpY2UgcHJvZ3JhbSBsaWJyYXJ5LiAqLworCisgICAgICAgICAgICAgRENMICAgICAgICBWQVIoJkNGTEFHUykgVFlQRSgqQ0hBUikgKworICAgICAgICAgICAgICAgICAgICAgICAgICBWQUxVRSgnT1BUSU1JWkUoNDApJykgICAgICAgICAgICAgICAgIC8qIENvbXBpbGUgb3B0aW9ucy4gKi8KKworICAgICAgICAgICAgIERDTCAgICAgICAgVkFSKCZUR1RSTFMpIFRZUEUoKkNIQVIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVkFMVUUoJ1Y1UjNNMCcpICAgICAgICAgICAgICAgICAgICAgICAvKiBUYXJnZXQgcmVsZWFzZS4gKi8KKworCisvKiAgICAgIFdvcmtpbmcgc3RvcmFnZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgICAgICAgICAgICAgRENMICAgICAgICBWQVIoJkNNRExFTikgVFlQRSgqREVDKSBMRU4oMTUgNSkgVkFMVUUoMzAwKSAgICAvKiBDb21tYW5kIGxlbmd0aC4gKi8KKyAgICAgICAgICAgICBEQ0wgICAgICAgIFZBUigmQ01EKSBUWVBFKCpDSEFSKSBMRU4oNTEyKQorICAgICAgICAgICAgIERDTCAgICAgICAgVkFSKCZGSVhEQ01EKSBUWVBFKCpDSEFSKSBMRU4oNTEyKQorCisKKy8qICAgICAgQ29tcGlsZSBzb3VyY2VzIGludG8gbW9kdWxlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgICBDSEdWQVIgICAgIFZBUigmRklYRENNRCkgVkFMVUUoJ0NSVENNT0QnICpCQ0FUICZDRkxBR1MgKkJDQVQgICAgICArCisgICAgICAgICAgICAgICAgICAgICAgICAnU1lTSUZDT1BUKCpJRlM2NElPKScgKkJDQVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKworICAgICAgICAgICAgICAgICAgICAgICAgJ0RFRklORSgnJ19MQVJHRUZJTEU2NF9TT1VSQ0UnJycgKkJDQVQgICAgICAgICAgICAgICAgICsKKyAgICAgICAgICAgICAgICAgICAgICAgICcnJ19MRlM2NF9MQVJHRUZJTEU9MScnKSBUR1RSTFMoJyAqVENBVCAmVEdUUkxTICpUQ0FUICArCisgICAgICAgICAgICAgICAgICAgICAgICAnKSBTUkNGSUxFKCcgKlRDQVQgJlNSQ0xJQiAqVENBVCAnLycgKlRDQVQgICAgICAgICAgICAgKworICAgICAgICAgICAgICAgICAgICAgICAgJlNSQ0ZJTEUgKlRDQVQgJykgTU9EVUxFKCcgKlRDQVQgJk1PRExJQiAqVENBVCAnLycpCisKKworICAgICAgICAgICAgIENIR1ZBUiAgICAgVkFSKCZDTUQpIFZBTFVFKCZGSVhEQ01EICpUQ0FUICdBRExFUjMyKScpCisgICAgICAgICAgICAgQ0FMTCAgICAgICBQR00oUUNNREVYQykgUEFSTSgmQ01EICZDTURMRU4pCisKKyAgICAgICAgICAgICBDSEdWQVIgICAgIFZBUigmQ01EKSBWQUxVRSgmRklYRENNRCAqVENBVCAnQ09NUFJFU1MpJykKKyAgICAgICAgICAgICBDQUxMICAgICAgIFBHTShRQ01ERVhDKSBQQVJNKCZDTUQgJkNNRExFTikKKworICAgICAgICAgICAgIENIR1ZBUiAgICAgVkFSKCZDTUQpIFZBTFVFKCZGSVhEQ01EICpUQ0FUICdDUkMzMiknKQorICAgICAgICAgICAgIENBTEwgICAgICAgUEdNKFFDTURFWEMpIFBBUk0oJkNNRCAmQ01ETEVOKQorCisgICAgICAgICAgICAgQ0hHVkFSICAgICBWQVIoJkNNRCkgVkFMVUUoJkZJWERDTUQgKlRDQVQgJ0RFRkxBVEUpJykKKyAgICAgICAgICAgICBDQUxMICAgICAgIFBHTShRQ01ERVhDKSBQQVJNKCZDTUQgJkNNRExFTikKKworICAgICAgICAgICAgIENIR1ZBUiAgICAgVkFSKCZDTUQpIFZBTFVFKCZGSVhEQ01EICpUQ0FUICdHWkNMT1NFKScpCisgICAgICAgICAgICAgQ0FMTCAgICAgICBQR00oUUNNREVYQykgUEFSTSgmQ01EICZDTURMRU4pCisKKyAgICAgICAgICAgICBDSEdWQVIgICAgIFZBUigmQ01EKSBWQUxVRSgmRklYRENNRCAqVENBVCAnR1pMSUIpJykKKyAgICAgICAgICAgICBDQUxMICAgICAgIFBHTShRQ01ERVhDKSBQQVJNKCZDTUQgJkNNRExFTikKKworICAgICAgICAgICAgIENIR1ZBUiAgICAgVkFSKCZDTUQpIFZBTFVFKCZGSVhEQ01EICpUQ0FUICdHWlJFQUQpJykKKyAgICAgICAgICAgICBDQUxMICAgICAgIFBHTShRQ01ERVhDKSBQQVJNKCZDTUQgJkNNRExFTikKKworICAgICAgICAgICAgIENIR1ZBUiAgICAgVkFSKCZDTUQpIFZBTFVFKCZGSVhEQ01EICpUQ0FUICdHWldSSVRFKScpCisgICAgICAgICAgICAgQ0FMTCAgICAgICBQR00oUUNNREVYQykgUEFSTSgmQ01EICZDTURMRU4pCisKKyAgICAgICAgICAgICBDSEdWQVIgICAgIFZBUigmQ01EKSBWQUxVRSgmRklYRENNRCAqVENBVCAnSU5GQkFDSyknKQorICAgICAgICAgICAgIENBTEwgICAgICAgUEdNKFFDTURFWEMpIFBBUk0oJkNNRCAmQ01ETEVOKQorCisgICAgICAgICAgICAgQ0hHVkFSICAgICBWQVIoJkNNRCkgVkFMVUUoJkZJWERDTUQgKlRDQVQgJ0lORkZBU1QpJykKKyAgICAgICAgICAgICBDQUxMICAgICAgIFBHTShRQ01ERVhDKSBQQVJNKCZDTUQgJkNNRExFTikKKworICAgICAgICAgICAgIENIR1ZBUiAgICAgVkFSKCZDTUQpIFZBTFVFKCZGSVhEQ01EICpUQ0FUICdJTkZMQVRFKScpCisgICAgICAgICAgICAgQ0FMTCAgICAgICBQR00oUUNNREVYQykgUEFSTSgmQ01EICZDTURMRU4pCisKKyAgICAgICAgICAgICBDSEdWQVIgICAgIFZBUigmQ01EKSBWQUxVRSgmRklYRENNRCAqVENBVCAnSU5GVFJFRVMpJykKKyAgICAgICAgICAgICBDQUxMICAgICAgIFBHTShRQ01ERVhDKSBQQVJNKCZDTUQgJkNNRExFTikKKworICAgICAgICAgICAgIENIR1ZBUiAgICAgVkFSKCZDTUQpIFZBTFVFKCZGSVhEQ01EICpUQ0FUICdUUkVFUyknKQorICAgICAgICAgICAgIENBTEwgICAgICAgUEdNKFFDTURFWEMpIFBBUk0oJkNNRCAmQ01ETEVOKQorCisgICAgICAgICAgICAgQ0hHVkFSICAgICBWQVIoJkNNRCkgVkFMVUUoJkZJWERDTUQgKlRDQVQgJ1VOQ09NUFIpJykKKyAgICAgICAgICAgICBDQUxMICAgICAgIFBHTShRQ01ERVhDKSBQQVJNKCZDTUQgJkNNRExFTikKKworICAgICAgICAgICAgIENIR1ZBUiAgICAgVkFSKCZDTUQpIFZBTFVFKCZGSVhEQ01EICpUQ0FUICdaVVRJTCknKQorICAgICAgICAgICAgIENBTEwgICAgICAgUEdNKFFDTURFWEMpIFBBUk0oJkNNRCAmQ01ETEVOKQorCisKKy8qICAgICAgTGluayBtb2R1bGVzIGludG8gYSBzZXJ2aWNlIHByb2dyYW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgICBDUlRTUlZQR00gIFNSVlBHTSgmU1JWTElCL1pMSUIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTU9EVUxFKCZNT0RMSUIvQURMRVIzMiAgICAgJk1PRExJQi9DT01QUkVTUyAgICArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmTU9ETElCL0NSQzMyICAgICAgICZNT0RMSUIvREVGTEFURSAgICAgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJk1PRExJQi9HWkNMT1NFICAgICAmTU9ETElCL0daTElCICAgICAgICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZNT0RMSUIvR1pSRUFEICAgICAgJk1PRExJQi9HWldSSVRFICAgICArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmTU9ETElCL0lORkJBQ0sgICAgICZNT0RMSUIvSU5GRkFTVCAgICAgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJk1PRExJQi9JTkZMQVRFICAgICAmTU9ETElCL0lORlRSRUVTICAgICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZNT0RMSUIvVFJFRVMgICAgICAgJk1PRExJQi9VTkNPTVBSICAgICArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmTU9ETElCL1pVVElMKSAgICAgICAgICAgICAgICAgICAgICAgICAgKworICAgICAgICAgICAgICAgICAgICAgICAgICBTUkNGSUxFKCZTUkNMSUIvJkNUTEZJTEUpIFNSQ01CUihCTkRTUkMpICAgICAgICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVEVYVCgnWkxJQiAxLjIuNicpIFRHVFJMUygmVEdUUkxTKQorCisgICAgICAgICAgICAgRU5EUEdNCmRpZmYgLS1naXQgYS96bGliLTEuMi42L2FzNDAwL3JlYWRtZS50eHQgYi96bGliLTEuMi42L2FzNDAwL3JlYWRtZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk3ZmU5OQotLS0gL2Rldi9udWxsCisrKyBiL3psaWItMS4yLjYvYXM0MDAvcmVhZG1lLnR4dApAQCAtMCwwICsxLDExNSBAQAorICAgICAgICBaTElCIHZlcnNpb24gMS4yLjYgZm9yIEFTNDAwIGluc3RhbGxhdGlvbiBpbnN0cnVjdGlvbnMKKworSSkgRnJvbSBhbiBBUzQwMCAqU0FWRiBmaWxlOgorCisxKSAgICAgIFVucGFja2luZyBhcmNoaXZlIHRvIGFuIEFTNDAwIHNhdmUgZmlsZQorCitPbiB0aGUgQVM0MDA6CisKK18gICAgICAgQ3JlYXRlIHRoZSBaTElCIEFTNDAwIGxpYnJhcnk6CisKKyAgICAgICAgQ1JUTElCIExJQihaTElCKSBUWVBFKCpQUk9EKSBURVhUKCdaTElCIGNvbXByZXNzaW9uIEFQSSBsaWJyYXJ5JykKKworXyAgICAgICBDcmVhdGUgYSB3b3JrIHNhdmUgZmlsZSwgZm9yIGV4YW1wbGU6CisKKyAgICAgICAgICAgICAgICBDUlRTQVZGIEZJTEUoWkxJQi9aTElCU0FWRikKKworT24gYSBQQyBjb25uZWN0ZWQgdG8gdGhlIHRhcmdldCBBUzQwMDoKKworXyAgICAgICBVbnBhY2sgdGhlIHNhdmUgZmlsZSBpbWFnZSB0byBhIFBDIGZpbGUgIlpMSUJTQVZGIgorXyAgICAgICBVcGxvYWQgdGhpcyBmaWxlIGludG8gdGhlIHNhdmUgZmlsZSBvbiB0aGUgQVM0MDAsIGZvciBleGFtcGxlCisgICAgICAgICAgICAgICAgdXNpbmcgZnRwIGluIEJJTkFSWSBtb2RlLgorCisKKzIpICAgICAgUG9wdWxhdGluZyB0aGUgWkxJQiBBUzQwMCBzb3VyY2UgbGlicmFyeQorCitPbiB0aGUgQVM0MDA6CisKK18gICAgICAgRXh0cmFjdCB0aGUgc2F2ZWQgb2JqZWN0cyBpbnRvIHRoZSBaTElCIEFTNDAwIGxpYnJhcnkgdXNpbmc6CisKK1JTVE9CSiBPQkooKkFMTCkgU0FWTElCKFpMSUIpIERFVigqU0FWRikgU0FWRihaTElCL1pMSUJTQVZGKSBSU1RMSUIoWkxJQikKKworCiszKSAgICAgIEN1c3RvbWl6ZSBpbnN0YWxsYXRpb246CisKK18gICAgICAgRWRpdCBDTCBtZW1iZXIgWkxJQi9UT09MUyhDT01QSUxFKSBhbmQgY2hhbmdlIHBhcmFtZXRlcnMgaWYgbmVlZGVkLAorICAgICAgICAgICAgICAgIGFjY29yZGluZyB0byB0aGUgY29tbWVudHMuCisKK18gICAgICAgQ29tcGlsZSB0aGlzIG1lbWJlciB3aXRoOgorCisgICAgICAgIENSVENMUEdNIFBHTShaTElCL0NPTVBJTEUpIFNSQ0ZJTEUoWkxJQi9UT09MUykgU1JDTUJSKENPTVBJTEUpCisKKworNCkgICAgICBDb21waWxlIGFuZCBnZW5lcmF0ZSB0aGUgc2VydmljZSBwcm9ncmFtOgorCitfICAgICAgIFRoaXMgY2FuIG5vdyBiZSBkb25lIGJ5IGV4ZWN1dGluZzoKKworICAgICAgICBDQUxMIFBHTShaTElCL0NPTVBJTEUpCisKKworCitJSSkgRnJvbSB0aGUgb3JpZ2luYWwgc291cmNlIGRpc3RyaWJ1dGlvbjoKKworMSkgICAgICBPbiB0aGUgQVM0MDAsIGNyZWF0ZSB0aGUgc291cmNlIGxpYnJhcnk6CisKKyAgICAgICAgQ1JUTElCIExJQihaTElCKSBUWVBFKCpQUk9EKSBURVhUKCdaTElCIGNvbXByZXNzaW9uIEFQSSBsaWJyYXJ5JykKKworMikgICAgICBDcmVhdGUgdGhlIHNvdXJjZSBmaWxlczoKKworICAgICAgICBDUlRTUkNQRiBGSUxFKFpMSUIvU09VUkNFUykgUkNETEVOKDExMikgVEVYVCgnWkxJQiBsaWJyYXJ5IG1vZHVsZXMnKQorICAgICAgICBDUlRTUkNQRiBGSUxFKFpMSUIvSCkgICAgICAgUkNETEVOKDExMikgVEVYVCgnWkxJQiBsaWJyYXJ5IGluY2x1ZGVzJykKKyAgICAgICAgQ1JUU1JDUEYgRklMRShaTElCL1RPT0xTKSAgIFJDRExFTigxMTIpIFRFWFQoJ1pMSUIgbGlicmFyeSBjb250cm9sIHV0aWxpdGllcycpCisKKzMpICAgICAgRnJvbSB0aGUgbWFjaGluZSBob3N0aW5nIHRoZSBkaXN0cmlidXRpb24gZmlsZXMsIHVwbG9hZCB0aGVtICh3aXRoCisgICAgICAgICAgICAgICAgRlRQIGluIHRleHQgbW9kZSwgZm9yIGV4YW1wbGUpIGFjY29yZGluZyB0byB0aGUgZm9sbG93aW5nIHRhYmxlOgorCisgICAgT3JpZ2luYWwgICAgQVM0MDAgICBBUzQwMCAgICBBUzQwMCBBUzQwMAorICAgIGZpbGUgICAgICAgIGZpbGUgICAgbWVtYmVyICAgdHlwZSAgZGVzY3JpcHRpb24KKyAgICAgICAgICAgICAgICBTT1VSQ0VTICAgICAgICAgICAgICAgIE9yaWdpbmFsIFpMSUIgQyBzdWJwcm9ncmFtIHNvdXJjZXMKKyAgICBhZGxlcjMyLmMgICAgICAgICAgIEFETEVSMzIgIEMgICAgIFpMSUIgLSBDb21wdXRlIHRoZSBBZGxlci0zMiBjaGVja3N1bSBvZiBhIGR0YSBzdHJtCisgICAgY29tcHJlc3MuYyAgICAgICAgICBDT01QUkVTUyBDICAgICBaTElCIC0gQ29tcHJlc3MgYSBtZW1vcnkgYnVmZmVyCisgICAgY3JjMzIuYyAgICAgICAgICAgICBDUkMzMiAgICBDICAgICBaTElCIC0gQ29tcHV0ZSB0aGUgQ1JDLTMyIG9mIGEgZGF0YSBzdHJlYW0KKyAgICBkZWZsYXRlLmMgICAgICAgICAgIERFRkxBVEUgIEMgICAgIFpMSUIgLSBDb21wcmVzcyBkYXRhIHVzaW5nIHRoZSBkZWZsYXRpb24gYWxnb3JpdGhtCisgICAgZ3pjbG9zZS5jICAgICAgICAgICBHWkNMT1NFICBDICAgICBaTElCIC0gQ2xvc2UgLmd6IGZpbGVzCisgICAgZ3psaWIuYyAgICAgICAgICAgICBHWkxJQiAgICBDICAgICBaTElCIC0gTWlzY2VsbGFuZW91cyAuZ3ogZmlsZXMgSU8gc3VwcG9ydAorICAgIGd6cmVhZC5jICAgICAgICAgICAgR1pSRUFEICAgQyAgICAgWkxJQiAtIFJlYWQgLmd6IGZpbGVzCisgICAgZ3p3cml0ZS5jICAgICAgICAgICBHWldSSVRFICBDICAgICBaTElCIC0gV3JpdGUgLmd6IGZpbGVzCisgICAgaW5mYmFjay5jICAgICAgICAgICBJTkZCQUNLICBDICAgICBaTElCIC0gSW5mbGF0ZSB1c2luZyBhIGNhbGxiYWNrIGludGVyZmFjZQorICAgIGluZmZhc3QuYyAgICAgICAgICAgSU5GRkFTVCAgQyAgICAgWkxJQiAtIEZhc3QgcHJvYy4gbGl0ZXJhbHMgJiBsZW5ndGgvZGlzdGFuY2UgcGFpcnMKKyAgICBpbmZsYXRlLmMgICAgICAgICAgIElORkxBVEUgIEMgICAgIFpMSUIgLSBJbnRlcmZhY2UgdG8gaW5mbGF0ZSBtb2R1bGVzCisgICAgaW5mdHJlZXMuYyAgICAgICAgICBJTkZUUkVFUyBDICAgICBaTElCIC0gR2VuZXJhdGUgSHVmZm1hbiB0cmVlcyBmb3IgZWZmaWNpZW50IGRlY29kZQorICAgIHRyZWVzLmMgICAgICAgICAgICAgVFJFRVMgICAgQyAgICAgWkxJQiAtIE91dHB1dCBkZWZsYXRlZCBkYXRhIHVzaW5nIEh1ZmZtYW4gY29kaW5nCisgICAgdW5jb21wci5jICAgICAgICAgICBVTkNPTVBSICBDICAgICBaTElCIC0gRGVjb21wcmVzcyBhIG1lbW9yeSBidWZmZXIKKyAgICB6dXRpbC5jICAgICAgICAgICAgIFpVVElMICAgIEMgICAgIFpMSUIgLSBUYXJnZXQgZGVwZW5kZW50IHV0aWxpdHkgZnVuY3Rpb25zCisgICAgICAgICAgICAgICAgSCAgICAgICAgICAgICAgICAgICAgICBPcmlnaW5hbCBaTElCIEMgYW5kIElMRS9SUEcgaW5jbHVkZSBmaWxlcworICAgIGNyYzMyLmggICAgICAgICAgICAgQ1JDMzIgICAgQyAgICAgWkxJQiAtIENSQzMyIHRhYmxlcworICAgIGRlZmxhdGUuaCAgICAgICAgICAgREVGTEFURSAgQyAgICAgWkxJQiAtIEludGVybmFsIGNvbXByZXNzaW9uIHN0YXRlCisgICAgZ3pndXRzLmggICAgICAgICAgICBHWkdVVFMgICBDICAgICBaTElCIC0gRGVmaW5pdGlvbnMgZm9yIHRoZSBnemNsb3NlIG1vZHVsZQorICAgIGluZmZhc3QuaCAgICAgICAgICAgSU5GRkFTVCAgQyAgICAgWkxJQiAtIEhlYWRlciB0byB1c2UgaW5mZmFzdC5jCisgICAgaW5mZml4ZWQuaCAgICAgICAgICBJTkZGSVhFRCBDICAgICBaTElCIC0gVGFibGUgZm9yIGRlY29kaW5nIGZpeGVkIGNvZGVzCisgICAgaW5mbGF0ZS5oICAgICAgICAgICBJTkZMQVRFICBDICAgICBaTElCIC0gSW50ZXJuYWwgaW5mbGF0ZSBzdGF0ZSBkZWZpbml0aW9ucworICAgIGluZnRyZWVzLmggICAgICAgICAgSU5GVFJFRVMgQyAgICAgWkxJQiAtIEhlYWRlciB0byB1c2UgaW5mdHJlZXMuYworICAgIHRyZWVzLmggICAgICAgICAgICAgVFJFRVMgICAgQyAgICAgWkxJQiAtIENyZWF0ZWQgYXV0b21hdGljYWxseSB3aXRoIC1ER0VOX1RSRUVTX0gKKyAgICB6Y29uZi5oICAgICAgICAgICAgIFpDT05GICAgIEMgICAgIFpMSUIgLSBDb21wcmVzc2lvbiBsaWJyYXJ5IGNvbmZpZ3VyYXRpb24KKyAgICB6bGliLmggICAgICAgICAgICAgIFpMSUIgICAgIEMgICAgIFpMSUIgLSBDb21wcmVzc2lvbiBsaWJyYXJ5IEMgdXNlciBpbnRlcmZhY2UKKyAgICBhczQwMC96bGliLmluYyAgICAgIFpMSUIuSU5DIFJQR0xFIFpMSUIgLSBDb21wcmVzc2lvbiBsaWJyYXJ5IElMRSBSUEcgdXNlciBpbnRlcmZhY2UKKyAgICB6dXRpbC5oICAgICAgICAgICAgIFpVVElMICAgIEMgICAgIFpMSUIgLSBJbnRlcm5hbCBpbnRlcmZhY2UgYW5kIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgICAgICAgICBUT09MUyAgICAgICAgICAgICAgICAgIEJ1aWxkaW5nIHNvdXJjZSBzb2Z0d2FyZSAmIEFTLzQwMCBSRUFETUUKKyAgICBhczQwMC9ibmRzcmMgICAgICAgIEJORFNSQyAgICAgICAgIEVudHJ5IHBvaW50IGV4cG9ydGF0aW9uIGxpc3QKKyAgICBhczQwMC9jb21waWxlLmNscCAgIENPTVBJTEUgIENMUCAgIENvbXBpbGUgc291cmNlcyAmIGdlbmVyYXRlIHNlcnZpY2UgcHJvZ3JhbQorICAgIGFzNDAwL3JlYWRtZS50eHQgICAgUkVBRE1FICAgVFhUICAgSW5zdGFsbGF0aW9uIGluc3RydWN0aW9ucworCis0KSAgICAgIENvbnRpbnVlIGFzIGluIEkpMykuCisKKworCisKK05vdGVzOiAgRm9yIEFTNDAwIElMRSBSUEcgcHJvZ3JhbW1lcnMsIGEgL2NvcHkgbWVtYmVyIGRlZmluaW5nIHRoZSBaTElCCisgICAgICAgICAgICAgICAgQVBJIHByb3RvdHlwZXMgZm9yIElMRSBSUEcgY2FuIGJlIGZvdW5kIGluIFpMSUIvSChaTElCLklOQykuCisgICAgICAgICAgICAgICAgUGxlYXNlIHJlYWQgY29tbWVudHMgaW4gdGhpcyBtZW1iZXIgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisKKyAgICAgICAgUmVtZW1iZXIgdGhhdCBtb3N0IGZvcmVpZ24gdGV4dHVhbCBkYXRhIGFyZSBBU0NJSSBjb2RlZDogdGhpcworICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IGhhbmRsZSBjb252ZXJzaW9uIGZyb20vdG8gQVNDSUksIHNvCisgICAgICAgICAgICAgICAgdGV4dCBkYXRhIGNvZGUgY29udmVyc2lvbnMgbXVzdCBiZSBkb25lIGV4cGxpY2l0ZWx5LgorCisgICAgICAgIE1haW5seSBmb3IgdGhlIHJlYXNvbiBhYm92ZSwgYWx3YXlzIG9wZW4gemlwcGVkIGZpbGVzIGluIGJpbmFyeSBtb2RlLgpkaWZmIC0tZ2l0IGEvemxpYi0xLjIuNi9hczQwMC96bGliLmluYyBiL3psaWItMS4yLjYvYXM0MDAvemxpYi5pbmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNlOTA1ZgotLS0gL2Rldi9udWxsCisrKyBiL3psaWItMS4yLjYvYXM0MDAvemxpYi5pbmMKQEAgLTAsMCArMSw0NDcgQEAKKyAgICAgICogIFpMSUIuSU5DIC0gSW50ZXJmYWNlIHRvIHRoZSBnZW5lcmFsIHB1cnBvc2UgY29tcHJlc3Npb24gbGlicmFyeQorICAgICAgKgorICAgICAgKiAgSUxFIFJQRzQwMCB2ZXJzaW9uIGJ5IFBhdHJpY2sgTW9ubmVyYXQsIERBVEFTUEhFUkUuCisgICAgICAqICBWZXJzaW9uIDEuMi42CisgICAgICAqCisgICAgICAqCisgICAgICAqICBXQVJOSU5HOgorICAgICAgKiAgICAgUHJvY2VkdXJlcyBpbmZsYXRlSW5pdCgpLCBpbmZsYXRlSW5pdDIoKSwgZGVmbGF0ZUluaXQoKSwKKyAgICAgICogICAgICAgICBkZWZsYXRlSW5pdDIoKSBhbmQgaW5mbGF0ZUJhY2tJbml0KCkgbmVlZCB0byBiZSBjYWxsZWQgd2l0aAorICAgICAgKiAgICAgICAgIHR3byBhZGRpdGlvbmFsIGFyZ3VtZW50czoKKyAgICAgICogICAgICAgICB0aGUgcGFja2FnZSB2ZXJzaW9uIHN0cmluZyBhbmQgdGhlIHN0cmVhbSBjb250cm9sIHN0cnVjdHVyZS4KKyAgICAgICogICAgICAgICBzaXplLiBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIFJQRyBsYWNrcyBzb21lIG1hY3JvIGZlYXR1cmUuCisgICAgICAqICAgICAgICAgQ2FsbCB0aGVzZSBwcm9jZWR1cmVzIGFzOgorICAgICAgKiAgICAgICAgICAgICBpbmZsYXRlSW5pdCguLi46IFpMSUJfVkVSU0lPTjogJXNpemUoel9zdHJlYW0pKQorICAgICAgKgorICAgICAgL2lmIG5vdCBkZWZpbmVkKFpMSUJfSF8pCisgICAgICAvZGVmaW5lIFpMSUJfSF8KKyAgICAgICoKKyAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50cworICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICoKKyAgICAgICogIFZlcnNpb25pbmcgaW5mb3JtYXRpb24uCisgICAgICAqCisgICAgIEQgWkxJQl9WRVJTSU9OICAgIEMgICAgICAgICAgICAgICAgICAgJzEuMi42JworICAgICBEIFpMSUJfVkVSTlVNICAgICBDICAgICAgICAgICAgICAgICAgIFgnMTI2MCcKKyAgICAgRCBaTElCX1ZFUl9NQUpPUiAgQyAgICAgICAgICAgICAgICAgICAxCisgICAgIEQgWkxJQl9WRVJfTUlOT1IgIEMgICAgICAgICAgICAgICAgICAgMgorICAgICBEIFpMSUJfVkVSX1JFVklTSU9OLi4uCisgICAgIEQgICAgICAgICAgICAgICAgIEMgICAgICAgICAgICAgICAgICAgNgorICAgICBEIFpMSUJfVkVSX1NVQlJFVklTSU9OLi4uCisgICAgIEQgICAgICAgICAgICAgICAgIEMgICAgICAgICAgICAgICAgICAgMAorICAgICAgKgorICAgICAgKiAgT3RoZXIgZXF1YXRlcy4KKyAgICAgICoKKyAgICAgRCBaX05PX0ZMVVNIICAgICAgQyAgICAgICAgICAgICAgICAgICAwCisgICAgIEQgWl9QQVJUSUFMX0ZMVVNILi4uCisgICAgIEQgICAgICAgICAgICAgICAgIEMgICAgICAgICAgICAgICAgICAgMQorICAgICBEIFpfU1lOQ19GTFVTSCAgICBDICAgICAgICAgICAgICAgICAgIDIKKyAgICAgRCBaX0ZVTExfRkxVU0ggICAgQyAgICAgICAgICAgICAgICAgICAzCisgICAgIEQgWl9GSU5JU0ggICAgICAgIEMgICAgICAgICAgICAgICAgICAgNAorICAgICBEIFpfQkxPQ0sgICAgICAgICBDICAgICAgICAgICAgICAgICAgIDUKKyAgICAgRCBaX1RSRUVTICAgICAgICAgQyAgICAgICAgICAgICAgICAgICA2CisgICAgICAqCisgICAgIEQgWl9PSyAgICAgICAgICAgIEMgICAgICAgICAgICAgICAgICAgMAorICAgICBEIFpfU1RSRUFNX0VORCAgICBDICAgICAgICAgICAgICAgICAgIDEKKyAgICAgRCBaX05FRURfRElDVCAgICAgQyAgICAgICAgICAgICAgICAgICAyCisgICAgIEQgWl9FUlJOTyAgICAgICAgIEMgICAgICAgICAgICAgICAgICAgLTEKKyAgICAgRCBaX1NUUkVBTV9FUlJPUiAgQyAgICAgICAgICAgICAgICAgICAtMgorICAgICBEIFpfREFUQV9FUlJPUiAgICBDICAgICAgICAgICAgICAgICAgIC0zCisgICAgIEQgWl9NRU1fRVJST1IgICAgIEMgICAgICAgICAgICAgICAgICAgLTQKKyAgICAgRCBaX0JVRl9FUlJPUiAgICAgQyAgICAgICAgICAgICAgICAgICAtNQorICAgICBEWl9WRVJTSU9OX0VSUk9SICBDICAgICAgICAgICAgICAgICAgIC02CisgICAgICAqCisgICAgIEQgWl9OT19DT01QUkVTU0lPTi4uLgorICAgICBEICAgICAgICAgICAgICAgICBDICAgICAgICAgICAgICAgICAgIDAKKyAgICAgRCBaX0JFU1RfU1BFRUQgICAgQyAgICAgICAgICAgICAgICAgICAxCisgICAgIEQgWl9CRVNUX0NPTVBSRVNTSU9OLi4uCisgICAgIEQgICAgICAgICAgICAgICAgIEMgICAgICAgICAgICAgICAgICAgOQorICAgICBEIFpfREVGQVVMVF9DT01QUkVTU0lPTi4uLgorICAgICBEICAgICAgICAgICAgICAgICBDICAgICAgICAgICAgICAgICAgIC0xCisgICAgICAqCisgICAgIEQgWl9GSUxURVJFRCAgICAgIEMgICAgICAgICAgICAgICAgICAgMQorICAgICBEIFpfSFVGRk1BTl9PTkxZICBDICAgICAgICAgICAgICAgICAgIDIKKyAgICAgRCBaX1JMRSAgICAgICAgICAgQyAgICAgICAgICAgICAgICAgICAzCisgICAgIEQgWl9ERUZBVUxUX1NUUkFURUdZLi4uCisgICAgIEQgICAgICAgICAgICAgICAgIEMgICAgICAgICAgICAgICAgICAgMAorICAgICAgKgorICAgICBEIFpfQklOQVJZICAgICAgICBDICAgICAgICAgICAgICAgICAgIDAKKyAgICAgRCBaX0FTQ0lJICAgICAgICAgQyAgICAgICAgICAgICAgICAgICAxCisgICAgIEQgWl9VTktOT1dOICAgICAgIEMgICAgICAgICAgICAgICAgICAgMgorICAgICAgKgorICAgICBEIFpfREVGTEFURUQgICAgICBDICAgICAgICAgICAgICAgICAgIDgKKyAgICAgICoKKyAgICAgRCBaX05VTEwgICAgICAgICAgQyAgICAgICAgICAgICAgICAgICAwCisgICAgICAqCisgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVzCisgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgKgorICAgICBEIHpfc3RyZWFtcCAgICAgICBTICAgICAgICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJlYW0gc3RydWN0IHB0cgorICAgICBEIGd6RmlsZSAgICAgICAgICBTICAgICAgICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlIHBvaW50ZXIKKyAgICAgRCB6X29mZl90ICAgICAgICAgUyAgICAgICAgICAgICAxMGkgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyZWFtIG9mZnNldHMKKyAgICAgRCB6X29mZjY0X3QgICAgICAgUyAgICAgICAgICAgICAyMGkgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyZWFtIG9mZnNldHMKKyAgICAgICoKKyAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cnVjdHVyZXMKKyAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAqCisgICAgICAqICBUaGUgR1pJUCBlbmNvZGUvZGVjb2RlIHN0cmVhbSBzdXBwb3J0IHN0cnVjdHVyZS4KKyAgICAgICoKKyAgICAgRCB6X3N0cmVhbSAgICAgICAgRFMgICAgICAgICAgICAgICAgICBhbGlnbiBiYXNlZCh6X3N0cmVhbXApCisgICAgIEQgIHpzX25leHRfaW4gICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5leHQgaW5wdXQgYnl0ZQorICAgICBEICB6c19hdmFpbF9pbiAgICAgICAgICAgICAgICAgIDEwVSAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlIGNudCBhdCBuZXh0X2luCisgICAgIEQgIHpzX3RvdGFsX2luICAgICAgICAgICAgICAgICAgMTBVIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRvdGFsIGJ5dGVzIHJlYWQKKyAgICAgRCAgenNfbmV4dF9vdXQgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0IGJ1ZmZlciBwdHIKKyAgICAgRCAgenNfYXZhaWxfb3V0ICAgICAgICAgICAgICAgICAxMFUgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUm9vbSBsZWZ0IEAgbmV4dF9vdXQKKyAgICAgRCAgenNfdG90YWxfb3V0ICAgICAgICAgICAgICAgICAxMFUgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG90YWwgYnl0ZXMgd3JpdHRlbgorICAgICBEICB6c19tc2cgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMYXN0IGVycm1zZyBvciBudWxsCisgICAgIEQgIHpzX3N0YXRlICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVybmFsIHN0YXRlCisgICAgIEQgIHpzX3phbGxvYyAgICAgICAgICAgICAgICAgICAgICAqICAgcHJvY3B0ciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludC4gc3RhdGUgYWxsb2NhdG9yCisgICAgIEQgIHpzX2ZyZWUgICAgICAgICAgICAgICAgICAgICAgICAqICAgcHJvY3B0ciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludC4gc3RhdGUgZGVhbGxvYy4KKyAgICAgRCAgenNfb3BhcXVlICAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpdmF0ZSBhbGxvYy4gZGF0YQorICAgICBEICB6c19kYXRhX3R5cGUgICAgICAgICAgICAgICAgIDEwaSAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU0MvQklOIGJlc3QgZ3Vlc3MKKyAgICAgRCAgenNfYWRsZXIgICAgICAgICAgICAgICAgICAgICAxMHUgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5jb21wci4gYWRsZXIzMiB2YWwKKyAgICAgRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMFUgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQKKyAgICAgRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMFUgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHRyLiBhbGlnbm1lbnQKKyAgICAgICoKKyAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAqICAgICAgICAgICAgICAgICAgICAgVXRpbGl0eSBmdW5jdGlvbiBwcm90b3R5cGVzCisgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgKgorICAgICBEIGNvbXByZXNzICAgICAgICBQUiAgICAgICAgICAgIDEwSSAwIGV4dHByb2MoJ2NvbXByZXNzJykKKyAgICAgRCAgZGVzdCAgICAgICAgICAgICAgICAgICAgICA2NTUzNSAgICBvcHRpb25zKCp2YXJzaXplKSAgICAgICAgICAgICAgICAgICAgRGVzdGluYXRpb24gYnVmZmVyCisgICAgIEQgIGRlc3RMZW4gICAgICAgICAgICAgICAgICAgICAgMTBVIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc3RpbmF0aW9uIGxlbmd0aAorICAgICBEICBzb3VyY2UgICAgICAgICAgICAgICAgICAgIDY1NTM1ICAgIGNvbnN0IG9wdGlvbnMoKnZhcnNpemUpICAgICAgICAgICAgICBTb3VyY2UgYnVmZmVyCisgICAgIEQgIHNvdXJjZUxlbiAgICAgICAgICAgICAgICAgICAgMTB1IDAgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZSBsZW5ndGgKKyAgICAgICoKKyAgICAgRCBjb21wcmVzczIgICAgICAgUFIgICAgICAgICAgICAxMEkgMCBleHRwcm9jKCdjb21wcmVzczInKQorICAgICBEICBkZXN0ICAgICAgICAgICAgICAgICAgICAgIDY1NTM1ICAgIG9wdGlvbnMoKnZhcnNpemUpICAgICAgICAgICAgICAgICAgICBEZXN0aW5hdGlvbiBidWZmZXIKKyAgICAgRCAgZGVzdExlbiAgICAgICAgICAgICAgICAgICAgICAxMFUgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzdGluYXRpb24gbGVuZ3RoCisgICAgIEQgIHNvdXJjZSAgICAgICAgICAgICAgICAgICAgNjU1MzUgICAgY29uc3Qgb3B0aW9ucygqdmFyc2l6ZSkgICAgICAgICAgICAgIFNvdXJjZSBidWZmZXIKKyAgICAgRCAgc291cmNlTGVuICAgICAgICAgICAgICAgICAgICAxMFUgMCB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlIGxlbmd0aAorICAgICBEICBsZXZlbCAgICAgICAgICAgICAgICAgICAgICAgIDEwSSAwIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wcmVzc2lvbiBsZXZlbAorICAgICAgKgorICAgICBEIGNvbXByZXNzQm91bmQgICBQUiAgICAgICAgICAgIDEwVSAwIGV4dHByb2MoJ2NvbXByZXNzQm91bmQnKQorICAgICBEICBzb3VyY2VMZW4gICAgICAgICAgICAgICAgICAgIDEwVSAwIHZhbHVlCisgICAgICAqCisgICAgIEQgdW5jb21wcmVzcyAgICAgIFBSICAgICAgICAgICAgMTBJIDAgZXh0cHJvYygndW5jb21wcmVzcycpCisgICAgIEQgIGRlc3QgICAgICAgICAgICAgICAgICAgICAgNjU1MzUgICAgb3B0aW9ucygqdmFyc2l6ZSkgICAgICAgICAgICAgICAgICAgIERlc3RpbmF0aW9uIGJ1ZmZlcgorICAgICBEICBkZXN0TGVuICAgICAgICAgICAgICAgICAgICAgIDEwVSAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXN0aW5hdGlvbiBsZW5ndGgKKyAgICAgRCAgc291cmNlICAgICAgICAgICAgICAgICAgICA2NTUzNSAgICBjb25zdCBvcHRpb25zKCp2YXJzaXplKSAgICAgICAgICAgICAgU291cmNlIGJ1ZmZlcgorICAgICBEICBzb3VyY2VMZW4gICAgICAgICAgICAgICAgICAgIDEwVSAwIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2UgbGVuZ3RoCisgICAgICAqCisgICAgICAvaWYgbm90IGRlZmluZWQoTEFSR0VfRklMRVMpCisgICAgIEQgZ3pvcGVuICAgICAgICAgIFBSICAgICAgICAgICAgICAgICAgZXh0cHJvYygnZ3pvcGVuJykKKyAgICAgRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWtlKGd6RmlsZSkKKyAgICAgRCAgcGF0aCAgICAgICAgICAgICAgICAgICAgICAgICAgICogICB2YWx1ZSBvcHRpb25zKCpzdHJpbmcpICAgICAgICAgICAgICAgRmlsZSBwYXRobmFtZQorICAgICBEICBtb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIHZhbHVlIG9wdGlvbnMoKnN0cmluZykgICAgICAgICAgICAgICBPcGVuIG1vZGUKKyAgICAgIC9lbHNlCisgICAgIEQgZ3pvcGVuICAgICAgICAgIFBSICAgICAgICAgICAgICAgICAgZXh0cHJvYygnZ3pvcGVuNjQnKQorICAgICBEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpa2UoZ3pGaWxlKQorICAgICBEICBwYXRoICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIHZhbHVlIG9wdGlvbnMoKnN0cmluZykgICAgICAgICAgICAgICBGaWxlIHBhdGhuYW1lCisgICAgIEQgIG1vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgdmFsdWUgb3B0aW9ucygqc3RyaW5nKSAgICAgICAgICAgICAgIE9wZW4gbW9kZQorICAgICAgKgorICAgICBEIGd6b3BlbjY0ICAgICAgICBQUiAgICAgICAgICAgICAgICAgIGV4dHByb2MoJ2d6b3BlbjY0JykKKyAgICAgRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWtlKGd6RmlsZSkKKyAgICAgRCAgcGF0aCAgICAgICAgICAgICAgICAgICAgICAgICAgICogICB2YWx1ZSBvcHRpb25zKCpzdHJpbmcpICAgICAgICAgICAgICAgRmlsZSBwYXRobmFtZQorICAgICBEICBtb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIHZhbHVlIG9wdGlvbnMoKnN0cmluZykgICAgICAgICAgICAgICBPcGVuIG1vZGUKKyAgICAgIC9lbmRpZgorICAgICAgKgorICAgICBEIGd6ZG9wZW4gICAgICAgICBQUiAgICAgICAgICAgICAgICAgIGV4dHByb2MoJ2d6ZG9wZW4nKQorICAgICBEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpa2UoZ3pGaWxlKQorICAgICBEICBmZCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwSSAwIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlIGRlc2NyaXB0b3IKKyAgICAgRCAgbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICogICB2YWx1ZSBvcHRpb25zKCpzdHJpbmcpICAgICAgICAgICAgICAgT3BlbiBtb2RlCisgICAgICAqCisgICAgIEQgZ3pidWZmZXIgICAgICAgIFBSICAgICAgICAgICAgMTBJIDAgZXh0cHJvYygnZ3pidWZmZXInKQorICAgICBEICBmaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIGxpa2UoZ3pGaWxlKSAgICAgICAgICAgICAgICAgICBGaWxlIHBvaW50ZXIKKyAgICAgRCAgc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAxMFUgMCB2YWx1ZQorICAgICAgKgorICAgICBEIGd6c2V0cGFyYW1zICAgICBQUiAgICAgICAgICAgIDEwSSAwIGV4dHByb2MoJ2d6c2V0cGFyYW1zJykKKyAgICAgRCAgZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBsaWtlKGd6RmlsZSkgICAgICAgICAgICAgICAgICAgRmlsZSBwb2ludGVyCisgICAgIEQgIGxldmVsICAgICAgICAgICAgICAgICAgICAgICAgMTBJIDAgdmFsdWUKKyAgICAgRCAgc3RyYXRlZ3kgICAgICAgICAgICAgICAgICAgICAxMEkgMCB2YWx1ZQorICAgICAgKgorICAgICBEIGd6cmVhZCAgICAgICAgICBQUiAgICAgICAgICAgIDEwSSAwIGV4dHByb2MoJ2d6cmVhZCcpCisgICAgIEQgIGZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgbGlrZShnekZpbGUpICAgICAgICAgICAgICAgICAgIEZpbGUgcG9pbnRlcgorICAgICBEICBidWYgICAgICAgICAgICAgICAgICAgICAgIDY1NTM1ICAgIG9wdGlvbnMoKnZhcnNpemUpICAgICAgICAgICAgICAgICAgICBCdWZmZXIKKyAgICAgRCAgbGVuICAgICAgICAgICAgICAgICAgICAgICAgICAxMHUgMCB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVyIGxlbmd0aAorICAgICAgKgorICAgICBEIGd6d3JpdGUgICAgICAgICBQUiAgICAgICAgICAgIDEwSSAwIGV4dHByb2MoJ2d6d3JpdGUnKQorICAgICBEICBmaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIGxpa2UoZ3pGaWxlKSAgICAgICAgICAgICAgICAgICBGaWxlIHBvaW50ZXIKKyAgICAgRCAgYnVmICAgICAgICAgICAgICAgICAgICAgICA2NTUzNSAgICBjb25zdCBvcHRpb25zKCp2YXJzaXplKSAgICAgICAgICAgICAgQnVmZmVyCisgICAgIEQgIGxlbiAgICAgICAgICAgICAgICAgICAgICAgICAgMTB1IDAgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlciBsZW5ndGgKKyAgICAgICoKKyAgICAgRCBnenB1dHMgICAgICAgICAgUFIgICAgICAgICAgICAxMEkgMCBleHRwcm9jKCdnenB1dHMnKQorICAgICBEICBmaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIGxpa2UoZ3pGaWxlKSAgICAgICAgICAgICAgICAgICBGaWxlIHBvaW50ZXIKKyAgICAgRCAgcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICB2YWx1ZSBvcHRpb25zKCpzdHJpbmcpICAgICAgICAgICAgICAgU3RyaW5nIHRvIG91dHB1dAorICAgICAgKgorICAgICBEIGd6Z2V0cyAgICAgICAgICBQUiAgICAgICAgICAgICAgKiAgIGV4dHByb2MoJ2d6Z2V0cycpCisgICAgIEQgIGZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgbGlrZShnekZpbGUpICAgICAgICAgICAgICAgICAgIEZpbGUgcG9pbnRlcgorICAgICBEICBidWYgICAgICAgICAgICAgICAgICAgICAgIDY1NTM1ICAgIG9wdGlvbnMoKnZhcnNpemUpICAgICAgICAgICAgICAgICAgICBSZWFkIGJ1ZmZlcgorICAgICBEICBsZW4gICAgICAgICAgICAgICAgICAgICAgICAgIDEwaSAwIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXIgbGVuZ3RoCisgICAgICAqCisgICAgIEQgZ3pwdXRjICAgICAgICAgIFBSICAgICAgICAgICAgMTBpIDAgZXh0cHJvYygnZ3pwdXRjJykKKyAgICAgRCAgZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBsaWtlKGd6RmlsZSkgICAgICAgICAgICAgICAgICAgRmlsZSBwb2ludGVyCisgICAgIEQgIGMgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTBJIDAgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJhY3RlciB0byB3cml0ZQorICAgICAgKgorICAgICBEIGd6Z2V0YyAgICAgICAgICBQUiAgICAgICAgICAgIDEwaSAwIGV4dHByb2MoJ2d6Z2V0YycpCisgICAgIEQgIGZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgbGlrZShnekZpbGUpICAgICAgICAgICAgICAgICAgIEZpbGUgcG9pbnRlcgorICAgICAgKgorICAgICBEIGd6Z2V0Y18gICAgICAgICBQUiAgICAgICAgICAgIDEwaSAwIGV4dHByb2MoJ2d6Z2V0Y18nKQorICAgICBEICBmaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIGxpa2UoZ3pGaWxlKSAgICAgICAgICAgICAgICAgICBGaWxlIHBvaW50ZXIKKyAgICAgICoKKyAgICAgRCBnenVuZ2V0YyAgICAgICAgUFIgICAgICAgICAgICAxMGkgMCBleHRwcm9jKCdnenVuZ2V0YycpCisgICAgIEQgIGMgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTBJIDAgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJhY3RlciB0byBwdXNoCisgICAgIEQgIGZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgbGlrZShnekZpbGUpICAgICAgICAgICAgICAgICAgIEZpbGUgcG9pbnRlcgorICAgICAgKgorICAgICBEIGd6Zmx1c2ggICAgICAgICBQUiAgICAgICAgICAgIDEwaSAwIGV4dHByb2MoJ2d6Zmx1c2gnKQorICAgICBEICBmaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIGxpa2UoZ3pGaWxlKSAgICAgICAgICAgICAgICAgICBGaWxlIHBvaW50ZXIKKyAgICAgRCAgZmx1c2ggICAgICAgICAgICAgICAgICAgICAgICAxMEkgMCB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSBvZiBmbHVzaAorICAgICAgKgorICAgICAgL2lmIG5vdCBkZWZpbmVkKExBUkdFX0ZJTEVTKQorICAgICBEIGd6c2VlayAgICAgICAgICBQUiAgICAgICAgICAgICAgICAgIGV4dHByb2MoJ2d6c2VlaycpCisgICAgIEQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlrZSh6X29mZl90KQorICAgICBEICBmaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIGxpa2UoZ3pGaWxlKSAgICAgICAgICAgICAgICAgICBGaWxlIHBvaW50ZXIKKyAgICAgRCAgb2Zmc2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBsaWtlKHpfb2ZmX3QpICAgICAgICAgICAgICAgICAgT2Zmc2V0CisgICAgIEQgIHdoZW5jZSAgICAgICAgICAgICAgICAgICAgICAgMTBpIDAgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9yaWdpbgorICAgICAgL2Vsc2UKKyAgICAgRCBnenNlZWsgICAgICAgICAgUFIgICAgICAgICAgICAgICAgICBleHRwcm9jKCdnenNlZWs2NCcpCisgICAgIEQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlrZSh6X29mZl90KQorICAgICBEICBmaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIGxpa2UoZ3pGaWxlKSAgICAgICAgICAgICAgICAgICBGaWxlIHBvaW50ZXIKKyAgICAgRCAgb2Zmc2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBsaWtlKHpfb2ZmX3QpICAgICAgICAgICAgICAgICAgT2Zmc2V0CisgICAgIEQgIHdoZW5jZSAgICAgICAgICAgICAgICAgICAgICAgMTBpIDAgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9yaWdpbgorICAgICAgKgorICAgICBEIGd6c2VlazY0ICAgICAgICBQUiAgICAgICAgICAgICAgICAgIGV4dHByb2MoJ2d6c2VlazY0JykKKyAgICAgRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWtlKHpfb2ZmNjRfdCkKKyAgICAgRCAgZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBsaWtlKGd6RmlsZSkgICAgICAgICAgICAgICAgICAgRmlsZSBwb2ludGVyCisgICAgIEQgIG9mZnNldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgbGlrZSh6X29mZjY0X3QpICAgICAgICAgICAgICAgIE9mZnNldAorICAgICBEICB3aGVuY2UgICAgICAgICAgICAgICAgICAgICAgIDEwaSAwIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcmlnaW4KKyAgICAgIC9lbmRpZgorICAgICAgKgorICAgICBEIGd6cmV3aW5kICAgICAgICBQUiAgICAgICAgICAgIDEwaSAwIGV4dHByb2MoJ2d6cmV3aW5kJykKKyAgICAgRCAgZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBsaWtlKGd6RmlsZSkgICAgICAgICAgICAgICAgICAgRmlsZSBwb2ludGVyCisgICAgICAqCisgICAgICAvaWYgbm90IGRlZmluZWQoTEFSR0VfRklMRVMpCisgICAgIEQgZ3p0ZWxsICAgICAgICAgIFBSICAgICAgICAgICAgICAgICAgZXh0cHJvYygnZ3p0ZWxsJykKKyAgICAgRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWtlKHpfb2ZmX3QpCisgICAgIEQgIGZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgbGlrZShnekZpbGUpICAgICAgICAgICAgICAgICAgIEZpbGUgcG9pbnRlcgorICAgICAgL2Vsc2UKKyAgICAgRCBnenRlbGwgICAgICAgICAgUFIgICAgICAgICAgICAgICAgICBleHRwcm9jKCdnenRlbGw2NCcpCisgICAgIEQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlrZSh6X29mZl90KQorICAgICBEICBmaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIGxpa2UoZ3pGaWxlKSAgICAgICAgICAgICAgICAgICBGaWxlIHBvaW50ZXIKKyAgICAgICoKKyAgICAgRCBnenRlbGw2NCAgICAgICAgUFIgICAgICAgICAgICAgICAgICBleHRwcm9jKCdnenRlbGw2NCcpCisgICAgIEQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlrZSh6X29mZjY0X3QpCisgICAgIEQgIGZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgbGlrZShnekZpbGUpICAgICAgICAgICAgICAgICAgIEZpbGUgcG9pbnRlcgorICAgICAgL2VuZGlmCisgICAgICAqCisgICAgICAvaWYgbm90IGRlZmluZWQoTEFSR0VfRklMRVMpCisgICAgIEQgZ3pvZmZzZXQgICAgICAgIFBSICAgICAgICAgICAgICAgICAgZXh0cHJvYygnZ3pvZmZzZXQnKQorICAgICBEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpa2Uoel9vZmZfdCkKKyAgICAgRCAgZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBsaWtlKGd6RmlsZSkgICAgICAgICAgICAgICAgICAgRmlsZSBwb2ludGVyCisgICAgICAvZWxzZQorICAgICBEIGd6b2Zmc2V0ICAgICAgICBQUiAgICAgICAgICAgICAgICAgIGV4dHByb2MoJ2d6b2Zmc2V0NjQnKQorICAgICBEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpa2Uoel9vZmZfdCkKKyAgICAgRCAgZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBsaWtlKGd6RmlsZSkgICAgICAgICAgICAgICAgICAgRmlsZSBwb2ludGVyCisgICAgICAqCisgICAgIEQgZ3pvZmZzZXQ2NCAgICAgIFBSICAgICAgICAgICAgICAgICAgZXh0cHJvYygnZ3pvZmZzZXQ2NCcpCisgICAgIEQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlrZSh6X29mZjY0X3QpCisgICAgIEQgIGZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgbGlrZShnekZpbGUpICAgICAgICAgICAgICAgICAgIEZpbGUgcG9pbnRlcgorICAgICAgL2VuZGlmCisgICAgICAqCisgICAgIEQgZ3plb2YgICAgICAgICAgIFBSICAgICAgICAgICAgMTBpIDAgZXh0cHJvYygnZ3plb2YnKQorICAgICBEICBmaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIGxpa2UoZ3pGaWxlKSAgICAgICAgICAgICAgICAgICBGaWxlIHBvaW50ZXIKKyAgICAgICoKKyAgICAgRCBnemNsb3NlX3IgICAgICAgUFIgICAgICAgICAgICAxMGkgMCBleHRwcm9jKCdnemNsb3NlX3InKQorICAgICBEICBmaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIGxpa2UoZ3pGaWxlKSAgICAgICAgICAgICAgICAgICBGaWxlIHBvaW50ZXIKKyAgICAgICoKKyAgICAgRCBnemNsb3NlX3cgICAgICAgUFIgICAgICAgICAgICAxMGkgMCBleHRwcm9jKCdnemNsb3NlX3cnKQorICAgICBEICBmaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIGxpa2UoZ3pGaWxlKSAgICAgICAgICAgICAgICAgICBGaWxlIHBvaW50ZXIKKyAgICAgICoKKyAgICAgRCBnemNsb3NlICAgICAgICAgUFIgICAgICAgICAgICAxMGkgMCBleHRwcm9jKCdnemNsb3NlJykKKyAgICAgRCAgZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBsaWtlKGd6RmlsZSkgICAgICAgICAgICAgICAgICAgRmlsZSBwb2ludGVyCisgICAgICAqCisgICAgIEQgZ3plcnJvciAgICAgICAgIFBSICAgICAgICAgICAgICAqICAgZXh0cHJvYygnZ3plcnJvcicpICAgICAgICAgICAgICAgICAgIEVycm9yIHN0cmluZworICAgICBEICBmaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIGxpa2UoZ3pGaWxlKSAgICAgICAgICAgICAgICAgICBGaWxlIHBvaW50ZXIKKyAgICAgRCAgZXJybnVtICAgICAgICAgICAgICAgICAgICAgICAxMEkgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3IgY29kZQorICAgICAgKgorICAgICBEIGd6Y2xlYXJlcnIgICAgICBQUiAgICAgICAgICAgICAgICAgIGV4dHByb2MoJ2d6Y2xlYXJlcnInKQorICAgICBEICBmaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIGxpa2UoZ3pGaWxlKSAgICAgICAgICAgICAgICAgICBGaWxlIHBvaW50ZXIKKyAgICAgICoKKyAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWMgZnVuY3Rpb24gcHJvdG90eXBlcworICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICoKKyAgICAgRCB6bGliVmVyc2lvbiAgICAgUFIgICAgICAgICAgICAgICogICBleHRwcm9jKCd6bGliVmVyc2lvbicpICAgICAgICAgICAgICAgVmVyc2lvbiBzdHJpbmcKKyAgICAgICoKKyAgICAgRCBkZWZsYXRlSW5pdCAgICAgUFIgICAgICAgICAgICAxMEkgMCBleHRwcm9jKCdkZWZsYXRlSW5pdF8nKSAgICAgICAgICAgICAgSW5pdC4gY29tcHJlc3Npb24KKyAgICAgRCAgc3RybSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWtlKHpfc3RyZWFtKSAgICAgICAgICAgICAgICAgICAgICAgQ29tcHJlc3Npb24gc3RyZWFtCisgICAgIEQgIGxldmVsICAgICAgICAgICAgICAgICAgICAgICAgMTBJIDAgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXByZXNzaW9uIGxldmVsCisgICAgIEQgIHZlcnNpb24gICAgICAgICAgICAgICAgICAgICAgICAqICAgdmFsdWUgb3B0aW9ucygqc3RyaW5nKSAgICAgICAgICAgICAgIFZlcnNpb24gc3RyaW5nCisgICAgIEQgIHN0cmVhbV9zaXplICAgICAgICAgICAgICAgICAgMTBpIDAgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmVhbSBzdHJ1Y3QuIHNpemUKKyAgICAgICoKKyAgICAgRCBkZWZsYXRlICAgICAgICAgUFIgICAgICAgICAgICAxMEkgMCBleHRwcm9jKCdkZWZsYXRlJykgICAgICAgICAgICAgICAgICAgQ29tcHJlc3MgZGF0YQorICAgICBEICBzdHJtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpa2Uoel9zdHJlYW0pICAgICAgICAgICAgICAgICAgICAgICBDb21wcmVzc2lvbiBzdHJlYW0KKyAgICAgRCAgZmx1c2ggICAgICAgICAgICAgICAgICAgICAgICAxMEkgMCB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmx1c2ggdHlwZSByZXF1aXJlZAorICAgICAgKgorICAgICBEIGRlZmxhdGVFbmQgICAgICBQUiAgICAgICAgICAgIDEwSSAwIGV4dHByb2MoJ2RlZmxhdGVFbmQnKSAgICAgICAgICAgICAgICBUZXJtaW4uIGNvbXByZXNzaW9uCisgICAgIEQgIHN0cm0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlrZSh6X3N0cmVhbSkgICAgICAgICAgICAgICAgICAgICAgIENvbXByZXNzaW9uIHN0cmVhbQorICAgICAgKgorICAgICBEIGluZmxhdGVJbml0ICAgICBQUiAgICAgICAgICAgIDEwSSAwIGV4dHByb2MoJ2luZmxhdGVJbml0XycpICAgICAgICAgICAgICBJbml0LiBleHBhbnNpb24KKyAgICAgRCAgc3RybSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWtlKHpfc3RyZWFtKSAgICAgICAgICAgICAgICAgICAgICAgRXhwYW5zaW9uIHN0cmVhbQorICAgICBEICB2ZXJzaW9uICAgICAgICAgICAgICAgICAgICAgICAgKiAgIHZhbHVlIG9wdGlvbnMoKnN0cmluZykgICAgICAgICAgICAgICBWZXJzaW9uIHN0cmluZworICAgICBEICBzdHJlYW1fc2l6ZSAgICAgICAgICAgICAgICAgIDEwaSAwIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJlYW0gc3RydWN0LiBzaXplCisgICAgICAqCisgICAgIEQgaW5mbGF0ZSAgICAgICAgIFBSICAgICAgICAgICAgMTBJIDAgZXh0cHJvYygnaW5mbGF0ZScpICAgICAgICAgICAgICAgICAgIEV4cGFuZCBkYXRhCisgICAgIEQgIHN0cm0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlrZSh6X3N0cmVhbSkgICAgICAgICAgICAgICAgICAgICAgIEV4cGFuc2lvbiBzdHJlYW0KKyAgICAgRCAgZmx1c2ggICAgICAgICAgICAgICAgICAgICAgICAxMEkgMCB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmx1c2ggdHlwZSByZXF1aXJlZAorICAgICAgKgorICAgICBEIGluZmxhdGVFbmQgICAgICBQUiAgICAgICAgICAgIDEwSSAwIGV4dHByb2MoJ2luZmxhdGVFbmQnKSAgICAgICAgICAgICAgICBUZXJtaW4uIGV4cGFuc2lvbgorICAgICBEICBzdHJtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpa2Uoel9zdHJlYW0pICAgICAgICAgICAgICAgICAgICAgICBFeHBhbnNpb24gc3RyZWFtCisgICAgICAqCisgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIEFkdmFuY2VkIGZ1bmN0aW9uIHByb3RvdHlwZXMKKyAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAqCisgICAgIEQgZGVmbGF0ZUluaXQyICAgIFBSICAgICAgICAgICAgMTBJIDAgZXh0cHJvYygnZGVmbGF0ZUluaXQyXycpICAgICAgICAgICAgIEluaXQuIGNvbXByZXNzaW9uCisgICAgIEQgIHN0cm0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlrZSh6X3N0cmVhbSkgICAgICAgICAgICAgICAgICAgICAgIENvbXByZXNzaW9uIHN0cmVhbQorICAgICBEICBsZXZlbCAgICAgICAgICAgICAgICAgICAgICAgIDEwSSAwIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wcmVzc2lvbiBsZXZlbAorICAgICBEICBtZXRob2QgICAgICAgICAgICAgICAgICAgICAgIDEwSSAwIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wcmVzc2lvbiBtZXRob2QKKyAgICAgRCAgd2luZG93Qml0cyAgICAgICAgICAgICAgICAgICAxMEkgMCB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nMih3aW5kb3cgc2l6ZSkKKyAgICAgRCAgbWVtTGV2ZWwgICAgICAgICAgICAgICAgICAgICAxMEkgMCB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVtL2NtcHJlc3MgdHJhZGVvZmYKKyAgICAgRCAgc3RyYXRlZ3kgICAgICAgICAgICAgICAgICAgICAxMEkgMCB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcHJlc3Npb24gc3RhdGVneQorICAgICBEICB2ZXJzaW9uICAgICAgICAgICAgICAgICAgICAgICAgKiAgIHZhbHVlIG9wdGlvbnMoKnN0cmluZykgICAgICAgICAgICAgICBWZXJzaW9uIHN0cmluZworICAgICBEICBzdHJlYW1fc2l6ZSAgICAgICAgICAgICAgICAgIDEwaSAwIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJlYW0gc3RydWN0LiBzaXplCisgICAgICAqCisgICAgIEQgZGVmbGF0ZVNldERpY3Rpb25hcnkuLi4KKyAgICAgRCAgICAgICAgICAgICAgICAgUFIgICAgICAgICAgICAxMEkgMCBleHRwcm9jKCdkZWZsYXRlU2V0RGljdGlvbmFyeScpICAgICAgSW5pdC4gZGljdGlvbmFyeQorICAgICBEICBzdHJtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpa2Uoel9zdHJlYW0pICAgICAgICAgICAgICAgICAgICAgICBDb21wcmVzc2lvbiBzdHJlYW0KKyAgICAgRCAgZGljdGlvbmFyeSAgICAgICAgICAgICAgICA2NTUzNSAgICBjb25zdCBvcHRpb25zKCp2YXJzaXplKSAgICAgICAgICAgICAgRGljdGlvbmFyeSBieXRlcworICAgICBEICBkaWN0TGVuZ3RoICAgICAgICAgICAgICAgICAgIDEwVSAwIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaWN0aW9uYXJ5IGxlbmd0aAorICAgICAgKgorICAgICBEIGRlZmxhdGVDb3B5ICAgICBQUiAgICAgICAgICAgIDEwSSAwIGV4dHByb2MoJ2RlZmxhdGVDb3B5JykgICAgICAgICAgICAgICBDb21wcmVzcyBzdHJtIDIgc3RybQorICAgICBEICBkZXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpa2Uoel9zdHJlYW0pICAgICAgICAgICAgICAgICAgICAgICBEZXN0aW5hdGlvbiBzdHJlYW0KKyAgICAgRCAgc291cmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWtlKHpfc3RyZWFtKSAgICAgICAgICAgICAgICAgICAgICAgU291cmNlIHN0cmVhbQorICAgICAgKgorICAgICBEIGRlZmxhdGVSZXNldCAgICBQUiAgICAgICAgICAgIDEwSSAwIGV4dHByb2MoJ2RlZmxhdGVSZXNldCcpICAgICAgICAgICAgICBFbmQgYW5kIGluaXQuIHN0cmVhbQorICAgICBEICBzdHJtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpa2Uoel9zdHJlYW0pICAgICAgICAgICAgICAgICAgICAgICBDb21wcmVzc2lvbiBzdHJlYW0KKyAgICAgICoKKyAgICAgRCBkZWZsYXRlUGFyYW1zICAgUFIgICAgICAgICAgICAxMEkgMCBleHRwcm9jKCdkZWZsYXRlUGFyYW1zJykgICAgICAgICAgICAgQ2hhbmdlIGxldmVsICYgc3RyYXQKKyAgICAgRCAgc3RybSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWtlKHpfc3RyZWFtKSAgICAgICAgICAgICAgICAgICAgICAgQ29tcHJlc3Npb24gc3RyZWFtCisgICAgIEQgIGxldmVsICAgICAgICAgICAgICAgICAgICAgICAgMTBJIDAgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXByZXNzaW9uIGxldmVsCisgICAgIEQgIHN0cmF0ZWd5ICAgICAgICAgICAgICAgICAgICAgMTBJIDAgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXByZXNzaW9uIHN0YXRlZ3kKKyAgICAgICoKKyAgICAgRCBkZWZsYXRlQm91bmQgICAgUFIgICAgICAgICAgICAxMFUgMCBleHRwcm9jKCdkZWZsYXRlQm91bmQnKSAgICAgICAgICAgICAgQ2hhbmdlIGxldmVsICYgc3RyYXQKKyAgICAgRCAgc3RybSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWtlKHpfc3RyZWFtKSAgICAgICAgICAgICAgICAgICAgICAgQ29tcHJlc3Npb24gc3RyZWFtCisgICAgIEQgIHNvdXJjZWxlbiAgICAgICAgICAgICAgICAgICAgMTBVIDAgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXByZXNzaW9uIGxldmVsCisgICAgICAqCisgICAgIEQgZGVmbGF0ZVBlbmRpbmcgIFBSICAgICAgICAgICAgMTBJIDAgZXh0cHJvYygnZGVmbGF0ZVBlbmRpbmcnKSAgICAgICAgICAgIENoYW5nZSBsZXZlbCAmIHN0cmF0CisgICAgIEQgIHN0cm0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlrZSh6X3N0cmVhbSkgICAgICAgICAgICAgICAgICAgICAgIENvbXByZXNzaW9uIHN0cmVhbQorICAgICBEICBwZW5kaW5nICAgICAgICAgICAgICAgICAgICAgIDEwVSAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZW5kaW5nIGJ5dGVzCisgICAgIEQgIGJpdHMgICAgICAgICAgICAgICAgICAgICAgICAgMTBJIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlbmRpbmcgYml0cworICAgICAgKgorICAgICBEIGRlZmxhdGVQcmltZSAgICBQUiAgICAgICAgICAgIDEwSSAwIGV4dHByb2MoJ2RlZmxhdGVQcmltZScpICAgICAgICAgICAgICBDaGFuZ2UgbGV2ZWwgJiBzdHJhdAorICAgICBEICBzdHJtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpa2Uoel9zdHJlYW0pICAgICAgICAgICAgICAgICAgICAgICBDb21wcmVzc2lvbiBzdHJlYW0KKyAgICAgRCAgYml0cyAgICAgICAgICAgICAgICAgICAgICAgICAxMEkgMCB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBvZiBiaXRzIHRvIGluc2VydAorICAgICBEICB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgIDEwSSAwIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXRzIHRvIGluc2VydAorICAgICAgKgorICAgICBEIGluZmxhdGVJbml0MiAgICBQUiAgICAgICAgICAgIDEwSSAwIGV4dHByb2MoJ2luZmxhdGVJbml0Ml8nKSAgICAgICAgICAgICBJbml0LiBleHBhbnNpb24KKyAgICAgRCAgc3RybSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWtlKHpfc3RyZWFtKSAgICAgICAgICAgICAgICAgICAgICAgRXhwYW5zaW9uIHN0cmVhbQorICAgICBEICB3aW5kb3dCaXRzICAgICAgICAgICAgICAgICAgIDEwSSAwIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cyKHdpbmRvdyBzaXplKQorICAgICBEICB2ZXJzaW9uICAgICAgICAgICAgICAgICAgICAgICAgKiAgIHZhbHVlIG9wdGlvbnMoKnN0cmluZykgICAgICAgICAgICAgICBWZXJzaW9uIHN0cmluZworICAgICBEICBzdHJlYW1fc2l6ZSAgICAgICAgICAgICAgICAgIDEwaSAwIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJlYW0gc3RydWN0LiBzaXplCisgICAgICAqCisgICAgIEQgaW5mbGF0ZVNldERpY3Rpb25hcnkuLi4KKyAgICAgRCAgICAgICAgICAgICAgICAgUFIgICAgICAgICAgICAxMEkgMCBleHRwcm9jKCdpbmZsYXRlU2V0RGljdGlvbmFyeScpICAgICAgSW5pdC4gZGljdGlvbmFyeQorICAgICBEICBzdHJtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpa2Uoel9zdHJlYW0pICAgICAgICAgICAgICAgICAgICAgICBFeHBhbnNpb24gc3RyZWFtCisgICAgIEQgIGRpY3Rpb25hcnkgICAgICAgICAgICAgICAgNjU1MzUgICAgY29uc3Qgb3B0aW9ucygqdmFyc2l6ZSkgICAgICAgICAgICAgIERpY3Rpb25hcnkgYnl0ZXMKKyAgICAgRCAgZGljdExlbmd0aCAgICAgICAgICAgICAgICAgICAxMFUgMCB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGljdGlvbmFyeSBsZW5ndGgKKyAgICAgICoKKyAgICAgRCBpbmZsYXRlU3luYyAgICAgUFIgICAgICAgICAgICAxMEkgMCBleHRwcm9jKCdpbmZsYXRlU3luYycpICAgICAgICAgICAgICAgU3luYy4gZXhwYW5zaW9uCisgICAgIEQgIHN0cm0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlrZSh6X3N0cmVhbSkgICAgICAgICAgICAgICAgICAgICAgIEV4cGFuc2lvbiBzdHJlYW0KKyAgICAgICoKKyAgICAgRCBpbmZsYXRlQ29weSAgICAgUFIgICAgICAgICAgICAxMEkgMCBleHRwcm9jKCdpbmZsYXRlQ29weScpCisgICAgIEQgIGRlc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlrZSh6X3N0cmVhbSkgICAgICAgICAgICAgICAgICAgICAgIERlc3RpbmF0aW9uIHN0cmVhbQorICAgICBEICBzb3VyY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpa2Uoel9zdHJlYW0pICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2Ugc3RyZWFtCisgICAgICAqCisgICAgIEQgaW5mbGF0ZVJlc2V0ICAgIFBSICAgICAgICAgICAgMTBJIDAgZXh0cHJvYygnaW5mbGF0ZVJlc2V0JykgICAgICAgICAgICAgIEVuZCBhbmQgaW5pdC4gc3RyZWFtCisgICAgIEQgIHN0cm0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlrZSh6X3N0cmVhbSkgICAgICAgICAgICAgICAgICAgICAgIEV4cGFuc2lvbiBzdHJlYW0KKyAgICAgICoKKyAgICAgRCBpbmZsYXRlUmVzZXQyICAgUFIgICAgICAgICAgICAxMEkgMCBleHRwcm9jKCdpbmZsYXRlUmVzZXQyJykgICAgICAgICAgICAgRW5kIGFuZCBpbml0LiBzdHJlYW0KKyAgICAgRCAgc3RybSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWtlKHpfc3RyZWFtKSAgICAgICAgICAgICAgICAgICAgICAgRXhwYW5zaW9uIHN0cmVhbQorICAgICBEICB3aW5kb3dCaXRzICAgICAgICAgICAgICAgICAgIDEwSSAwIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cyKGJ1ZmZlciBzaXplKQorICAgICAgKgorICAgICBEIGluZmxhdGVQcmltZSAgICBQUiAgICAgICAgICAgIDEwSSAwIGV4dHByb2MoJ2luZmxhdGVQcmltZScpICAgICAgICAgICAgICBJbnNlcnQgYml0cworICAgICBEICBzdHJtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpa2Uoel9zdHJlYW0pICAgICAgICAgICAgICAgICAgICAgICBFeHBhbnNpb24gc3RyZWFtCisgICAgIEQgIGJpdHMgICAgICAgICAgICAgICAgICAgICAgICAgMTBJIDAgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpdCBjb3VudAorICAgICBEICB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgIDEwSSAwIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXRzIHRvIGluc2VydAorICAgICAgKgorICAgICBEIGluZmxhdGVNYXJrICAgICBQUiAgICAgICAgICAgIDEwSSAwIGV4dHByb2MoJ2luZmxhdGVNYXJrJykgICAgICAgICAgICAgICBHZXQgaW5mbGF0ZSBpbmZvCisgICAgIEQgIHN0cm0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlrZSh6X3N0cmVhbSkgICAgICAgICAgICAgICAgICAgICAgIEV4cGFuc2lvbiBzdHJlYW0KKyAgICAgICoKKyAgICAgRCBpbmZsYXRlQmFja0luaXQuLi4KKyAgICAgRCAgICAgICAgICAgICAgICAgUFIgICAgICAgICAgICAxMEkgMCBleHRwcm9jKCdpbmZsYXRlQmFja0luaXRfJykKKyAgICAgRCAgc3RybSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWtlKHpfc3RyZWFtKSAgICAgICAgICAgICAgICAgICAgICAgRXhwYW5zaW9uIHN0cmVhbQorICAgICBEICB3aW5kb3dCaXRzICAgICAgICAgICAgICAgICAgIDEwSSAwIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cyKGJ1ZmZlciBzaXplKQorICAgICBEICB3aW5kb3cgICAgICAgICAgICAgICAgICAgIDY1NTM1ICAgIG9wdGlvbnMoKnZhcnNpemUpICAgICAgICAgICAgICAgICAgICBCdWZmZXIKKyAgICAgRCAgdmVyc2lvbiAgICAgICAgICAgICAgICAgICAgICAgICogICB2YWx1ZSBvcHRpb25zKCpzdHJpbmcpICAgICAgICAgICAgICAgVmVyc2lvbiBzdHJpbmcKKyAgICAgRCAgc3RyZWFtX3NpemUgICAgICAgICAgICAgICAgICAxMGkgMCB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyZWFtIHN0cnVjdC4gc2l6ZQorICAgICAgKgorICAgICBEIGluZmxhdGVCYWNrICAgICBQUiAgICAgICAgICAgIDEwSSAwIGV4dHByb2MoJ2luZmxhdGVCYWNrJykKKyAgICAgRCAgc3RybSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWtlKHpfc3RyZWFtKSAgICAgICAgICAgICAgICAgICAgICAgRXhwYW5zaW9uIHN0cmVhbQorICAgICBEICBpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIHZhbHVlIHByb2NwdHIgICAgICAgICAgICAgICAgICAgICAgICBJbnB1dCBmdW5jdGlvbgorICAgICBEICBpbl9kZXNjICAgICAgICAgICAgICAgICAgICAgICAgKiAgIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnB1dCBkZXNjcmlwdG9yCisgICAgIEQgIG91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgdmFsdWUgcHJvY3B0ciAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dCBmdW5jdGlvbgorICAgICBEICBvdXRfZGVzYyAgICAgICAgICAgICAgICAgICAgICAgKiAgIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdXRwdXQgZGVzY3JpcHRvcgorICAgICAgKgorICAgICBEIGluZmxhdGVCYWNrRW5kICBQUiAgICAgICAgICAgIDEwSSAwIGV4dHByb2MoJ2luZmxhdGVCYWNrRW5kJykKKyAgICAgRCAgc3RybSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWtlKHpfc3RyZWFtKSAgICAgICAgICAgICAgICAgICAgICAgRXhwYW5zaW9uIHN0cmVhbQorICAgICAgKgorICAgICBEIHpsaWJDb21waWxlRmxhZ3MuLi4KKyAgICAgRCAgICAgICAgICAgICAgICAgUFIgICAgICAgICAgICAxMFUgMCBleHRwcm9jKCd6bGliQ29tcGlsZUZsYWdzJykKKyAgICAgICoKKyAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tzdW0gZnVuY3Rpb24gcHJvdG90eXBlcworICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICoKKyAgICAgRCBhZGxlcjMyICAgICAgICAgUFIgICAgICAgICAgICAxMFUgMCBleHRwcm9jKCdhZGxlcjMyJykgICAgICAgICAgICAgICAgICAgTmV3IGNoZWNrc3VtCisgICAgIEQgIGFkbGVyICAgICAgICAgICAgICAgICAgICAgICAgMTBVIDAgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9sZCBjaGVja3N1bQorICAgICBEICBidWYgICAgICAgICAgICAgICAgICAgICAgIDY1NTM1ICAgIGNvbnN0IG9wdGlvbnMoKnZhcnNpemUpICAgICAgICAgICAgICBCeXRlcyB0byBhY2N1bXVsYXRlCisgICAgIEQgIGxlbiAgICAgICAgICAgICAgICAgICAgICAgICAgMTBVIDAgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlciBsZW5ndGgKKyAgICAgICoKKyAgICAgRCBjcmMzMiAgICAgICAgICAgUFIgICAgICAgICAgICAxMFUgMCBleHRwcm9jKCdjcmMzMicpICAgICAgICAgICAgICAgICAgICAgTmV3IGNoZWNrc3VtCisgICAgIEQgIGNyYyAgICAgICAgICAgICAgICAgICAgICAgICAgMTBVIDAgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9sZCBjaGVja3N1bQorICAgICBEICBidWYgICAgICAgICAgICAgICAgICAgICAgIDY1NTM1ICAgIGNvbnN0IG9wdGlvbnMoKnZhcnNpemUpICAgICAgICAgICAgICBCeXRlcyB0byBhY2N1bXVsYXRlCisgICAgIEQgIGxlbiAgICAgICAgICAgICAgICAgICAgICAgICAgMTBVIDAgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlciBsZW5ndGgKKyAgICAgICoKKyAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAqICAgICAgICAgICAgICAgICAgICAgTWlzY2VsbGFuZW91cyBmdW5jdGlvbiBwcm90b3R5cGVzCisgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgKgorICAgICBEIHpFcnJvciAgICAgICAgICBQUiAgICAgICAgICAgICAgKiAgIGV4dHByb2MoJ3pFcnJvcicpICAgICAgICAgICAgICAgICAgICBFcnJvciBzdHJpbmcKKyAgICAgRCAgZXJyICAgICAgICAgICAgICAgICAgICAgICAgICAxMEkgMCB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3IgY29kZQorICAgICAgKgorICAgICBEIGluZmxhdGVTeW5jUG9pbnQuLi4KKyAgICAgRCAgICAgICAgICAgICAgICAgUFIgICAgICAgICAgICAxMEkgMCBleHRwcm9jKCdpbmZsYXRlU3luY1BvaW50JykKKyAgICAgRCAgc3RybSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWtlKHpfc3RyZWFtKSAgICAgICAgICAgICAgICAgICAgICAgRXhwYW5zaW9uIHN0cmVhbQorICAgICAgKgorICAgICBEIGdldF9jcmNfdGFibGUgICBQUiAgICAgICAgICAgICAgKiAgIGV4dHByb2MoJ2dldF9jcmNfdGFibGUnKSAgICAgICAgICAgICBQdHIgdG8gdWxvbmdzCisgICAgICAqCisgICAgIEQgaW5mbGF0ZVVuZGVybWluZS4uLgorICAgICBEICAgICAgICAgICAgICAgICBQUiAgICAgICAgICAgIDEwSSAwIGV4dHByb2MoJ2luZmxhdGVVbmRlcm1pbmUnKQorICAgICBEICBzdHJtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpa2Uoel9zdHJlYW0pICAgICAgICAgICAgICAgICAgICAgICBFeHBhbnNpb24gc3RyZWFtCisgICAgIEQgIGFyZyAgICAgICAgICAgICAgICAgICAgICAgICAgMTBJIDAgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVycm9yIGNvZGUKKyAgICAgICoKKyAgICAgRCBpbmZsYXRlUmVzZXRLZWVwLi4uCisgICAgIEQgICAgICAgICAgICAgICAgIFBSICAgICAgICAgICAgMTBJIDAgZXh0cHJvYygnaW5mbGF0ZVJlc2V0S2VlcCcpICAgICAgICAgIEVuZCBhbmQgaW5pdC4gc3RyZWFtCisgICAgIEQgIHN0cm0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlrZSh6X3N0cmVhbSkgICAgICAgICAgICAgICAgICAgICAgIEV4cGFuc2lvbiBzdHJlYW0KKyAgICAgICoKKyAgICAgRCBkZWZsYXRlUmVzZXRLZWVwLi4uCisgICAgIEQgICAgICAgICAgICAgICAgIFBSICAgICAgICAgICAgMTBJIDAgZXh0cHJvYygnZGVmbGF0ZVJlc2V0S2VlcCcpICAgICAgICAgIEVuZCBhbmQgaW5pdC4gc3RyZWFtCisgICAgIEQgIHN0cm0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlrZSh6X3N0cmVhbSkgICAgICAgICAgICAgICAgICAgICAgIEV4cGFuc2lvbiBzdHJlYW0KKyAgICAgICoKKyAgICAgRCBnemZsYWdzICAgICAgICAgUFIgICAgICAgICAgICAxMFUgMCBleHRwcm9jKCdnemZsYWdzJykKKyAgICAgICoKKyAgICAgIC9lbmRpZgpkaWZmIC0tZ2l0IGEvemxpYi0xLjIuNi9jb21wcmVzcy5jIGIvemxpYi0xLjIuNi9jb21wcmVzcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhNGRmYmUKLS0tIC9kZXYvbnVsbAorKysgYi96bGliLTEuMi42L2NvbXByZXNzLmMKQEAgLTAsMCArMSw4MCBAQAorLyogY29tcHJlc3MuYyAtLSBjb21wcmVzcyBhIG1lbW9yeSBidWZmZXIKKyAqIENvcHlyaWdodCAoQykgMTk5NS0yMDA1IEplYW4tbG91cCBHYWlsbHkuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCisgKi8KKworLyogQCgjKSAkSWQkICovCisKKyNkZWZpbmUgWkxJQl9JTlRFUk5BTAorI2luY2x1ZGUgInpsaWIuaCIKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgIENvbXByZXNzZXMgdGhlIHNvdXJjZSBidWZmZXIgaW50byB0aGUgZGVzdGluYXRpb24gYnVmZmVyLiBUaGUgbGV2ZWwKKyAgIHBhcmFtZXRlciBoYXMgdGhlIHNhbWUgbWVhbmluZyBhcyBpbiBkZWZsYXRlSW5pdC4gIHNvdXJjZUxlbiBpcyB0aGUgYnl0ZQorICAgbGVuZ3RoIG9mIHRoZSBzb3VyY2UgYnVmZmVyLiBVcG9uIGVudHJ5LCBkZXN0TGVuIGlzIHRoZSB0b3RhbCBzaXplIG9mIHRoZQorICAgZGVzdGluYXRpb24gYnVmZmVyLCB3aGljaCBtdXN0IGJlIGF0IGxlYXN0IDAuMSUgbGFyZ2VyIHRoYW4gc291cmNlTGVuIHBsdXMKKyAgIDEyIGJ5dGVzLiBVcG9uIGV4aXQsIGRlc3RMZW4gaXMgdGhlIGFjdHVhbCBzaXplIG9mIHRoZSBjb21wcmVzc2VkIGJ1ZmZlci4KKworICAgICBjb21wcmVzczIgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIFpfTUVNX0VSUk9SIGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoCisgICBtZW1vcnksIFpfQlVGX0VSUk9SIGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoIHJvb20gaW4gdGhlIG91dHB1dCBidWZmZXIsCisgICBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgbGV2ZWwgcGFyYW1ldGVyIGlzIGludmFsaWQuCisqLworaW50IFpFWFBPUlQgY29tcHJlc3MyIChkZXN0LCBkZXN0TGVuLCBzb3VyY2UsIHNvdXJjZUxlbiwgbGV2ZWwpCisgICAgQnl0ZWYgKmRlc3Q7CisgICAgdUxvbmdmICpkZXN0TGVuOworICAgIGNvbnN0IEJ5dGVmICpzb3VyY2U7CisgICAgdUxvbmcgc291cmNlTGVuOworICAgIGludCBsZXZlbDsKK3sKKyAgICB6X3N0cmVhbSBzdHJlYW07CisgICAgaW50IGVycjsKKworICAgIHN0cmVhbS5uZXh0X2luID0gKEJ5dGVmKilzb3VyY2U7CisgICAgc3RyZWFtLmF2YWlsX2luID0gKHVJbnQpc291cmNlTGVuOworI2lmZGVmIE1BWFNFR182NEsKKyAgICAvKiBDaGVjayBmb3Igc291cmNlID4gNjRLIG9uIDE2LWJpdCBtYWNoaW5lOiAqLworICAgIGlmICgodUxvbmcpc3RyZWFtLmF2YWlsX2luICE9IHNvdXJjZUxlbikgcmV0dXJuIFpfQlVGX0VSUk9SOworI2VuZGlmCisgICAgc3RyZWFtLm5leHRfb3V0ID0gZGVzdDsKKyAgICBzdHJlYW0uYXZhaWxfb3V0ID0gKHVJbnQpKmRlc3RMZW47CisgICAgaWYgKCh1TG9uZylzdHJlYW0uYXZhaWxfb3V0ICE9ICpkZXN0TGVuKSByZXR1cm4gWl9CVUZfRVJST1I7CisKKyAgICBzdHJlYW0uemFsbG9jID0gKGFsbG9jX2Z1bmMpMDsKKyAgICBzdHJlYW0uemZyZWUgPSAoZnJlZV9mdW5jKTA7CisgICAgc3RyZWFtLm9wYXF1ZSA9ICh2b2lkcGYpMDsKKworICAgIGVyciA9IGRlZmxhdGVJbml0KCZzdHJlYW0sIGxldmVsKTsKKyAgICBpZiAoZXJyICE9IFpfT0spIHJldHVybiBlcnI7CisKKyAgICBlcnIgPSBkZWZsYXRlKCZzdHJlYW0sIFpfRklOSVNIKTsKKyAgICBpZiAoZXJyICE9IFpfU1RSRUFNX0VORCkgeworICAgICAgICBkZWZsYXRlRW5kKCZzdHJlYW0pOworICAgICAgICByZXR1cm4gZXJyID09IFpfT0sgPyBaX0JVRl9FUlJPUiA6IGVycjsKKyAgICB9CisgICAgKmRlc3RMZW4gPSBzdHJlYW0udG90YWxfb3V0OworCisgICAgZXJyID0gZGVmbGF0ZUVuZCgmc3RyZWFtKTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworaW50IFpFWFBPUlQgY29tcHJlc3MgKGRlc3QsIGRlc3RMZW4sIHNvdXJjZSwgc291cmNlTGVuKQorICAgIEJ5dGVmICpkZXN0OworICAgIHVMb25nZiAqZGVzdExlbjsKKyAgICBjb25zdCBCeXRlZiAqc291cmNlOworICAgIHVMb25nIHNvdXJjZUxlbjsKK3sKKyAgICByZXR1cm4gY29tcHJlc3MyKGRlc3QsIGRlc3RMZW4sIHNvdXJjZSwgc291cmNlTGVuLCBaX0RFRkFVTFRfQ09NUFJFU1NJT04pOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgSWYgdGhlIGRlZmF1bHQgbWVtTGV2ZWwgb3Igd2luZG93Qml0cyBmb3IgZGVmbGF0ZUluaXQoKSBpcyBjaGFuZ2VkLCB0aGVuCisgICB0aGlzIGZ1bmN0aW9uIG5lZWRzIHRvIGJlIHVwZGF0ZWQuCisgKi8KK3VMb25nIFpFWFBPUlQgY29tcHJlc3NCb3VuZCAoc291cmNlTGVuKQorICAgIHVMb25nIHNvdXJjZUxlbjsKK3sKKyAgICByZXR1cm4gc291cmNlTGVuICsgKHNvdXJjZUxlbiA+PiAxMikgKyAoc291cmNlTGVuID4+IDE0KSArCisgICAgICAgICAgIChzb3VyY2VMZW4gPj4gMjUpICsgMTM7Cit9CmRpZmYgLS1naXQgYS96bGliLTEuMi42L2NvbmZpZ3VyZSBiL3psaWItMS4yLjYvY29uZmlndXJlCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjA3ZWU1ZWEKLS0tIC9kZXYvbnVsbAorKysgYi96bGliLTEuMi42L2NvbmZpZ3VyZQpAQCAtMCwwICsxLDczMCBAQAorIyEvYmluL3NoCisjIGNvbmZpZ3VyZSBzY3JpcHQgZm9yIHpsaWIuCisjCisjIE5vcm1hbGx5IGNvbmZpZ3VyZSBidWlsZHMgYm90aCBhIHN0YXRpYyBhbmQgYSBzaGFyZWQgbGlicmFyeS4KKyMgSWYgeW91IHdhbnQgdG8gYnVpbGQganVzdCBhIHN0YXRpYyBsaWJyYXJ5LCB1c2U6IC4vY29uZmlndXJlIC0tc3RhdGljCisjCisjIFRvIGltcG9zZSBzcGVjaWZpYyBjb21waWxlciBvciBmbGFncyBvciBpbnN0YWxsIGRpcmVjdG9yeSwgdXNlIGZvciBleGFtcGxlOgorIyAgICBwcmVmaXg9JEhPTUUgQ0M9Y2MgQ0ZMQUdTPSItTzQiIC4vY29uZmlndXJlCisjIG9yIGZvciBjc2gvdGNzaCB1c2VyczoKKyMgICAgKHNldGVudiBwcmVmaXggJEhPTUU7IHNldGVudiBDQyBjYzsgc2V0ZW52IENGTEFHUyAiLU80IjsgLi9jb25maWd1cmUpCisKKyMgSW5jb3JyZWN0IHNldHRpbmdzIG9mIENDIG9yIENGTEFHUyBtYXkgcHJldmVudCBjcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LgorIyBJZiB5b3UgaGF2ZSBwcm9ibGVtcywgdHJ5IHdpdGhvdXQgZGVmaW5pbmcgQ0MgYW5kIENGTEFHUyBiZWZvcmUgcmVwb3J0aW5nCisjIGFuIGVycm9yLgorCitjb25mZGlyPWBkaXJuYW1lICIkMCJgCitzcmNkaXI9JGNvbmZkaXIKK2J1aWxkZGlyPWBwd2RgCisKK0xPRz0iJGJ1aWxkZGlyL2NvbmZpZ3VyZS5sb2ciCisKK2VjaG8gLS0tLS0tLS0tLS0tLS0tLS0tLS0gPj4gJHtMT0d9CitlY2hvICQwICQqID4+ICR7TE9HfQorZGF0ZSA+PiAke0xPR30KKworaWYgWyAtbiAiJHtDSE9TVH0iIF07IHRoZW4KKyAgICB1bmFtZT0iYGVjaG8gIiR7Q0hPU1R9IiB8IHNlZCAtZSAncy9eW14tXSotXChbXi1dKlwpJC9cMS8nIC1lICdzL15bXi1dKi1bXi1dKi1cKFteLV0qXCkkL1wxLycgLWUgJ3MvXlteLV0qLVteLV0qLVwoW14tXSpcKS0uKiQvXDEvJ2AiCisgICAgQ1JPU1NfUFJFRklYPSIke0NIT1NUfS0iCitmaQorCitTVEFUSUNMSUI9bGliei5hCitWRVI9YHNlZCAtbiAtZSAnL1ZFUlNJT04gIi9zLy4qIlwoLipcKSIuKi9cMS9wJyA8ICRzcmNkaXIvemxpYi5oYAorVkVSMz1gc2VkIC1uIC1lICcvVkVSU0lPTiAiL3MvLioiXChbMC05XSpcXC5bMC05XSpcXC5bMC05XSpcKS4qL1wxL3AnIDwgJHNyY2Rpci96bGliLmhgCitWRVIyPWBzZWQgLW4gLWUgJy9WRVJTSU9OICIvcy8uKiJcKFswLTldKlxcLlswLTldKlwpXFwuLiovXDEvcCcgPCAkc3JjZGlyL3psaWIuaGAKK1ZFUjE9YHNlZCAtbiAtZSAnL1ZFUlNJT04gIi9zLy4qIlwoWzAtOV0qXClcXC4uKi9cMS9wJyA8ICRzcmNkaXIvemxpYi5oYAoraWYgIiR7Q1JPU1NfUFJFRklYfWFyIiAtLXZlcnNpb24gPi9kZXYvbnVsbCAyPi9kZXYvbnVsbCB8fCB0ZXN0ICQ/IC1sdCAxMjY7IHRoZW4KKyAgICBBUj0ke0FSLSIke0NST1NTX1BSRUZJWH1hciJ9CisgICAgdGVzdCAtbiAiJHtDUk9TU19QUkVGSVh9IiAmJiBlY2hvIFVzaW5nICR7QVJ9IHwgdGVlIC1hICR7TE9HfQorZWxzZQorICAgIEFSPSR7QVItImFyIn0KKyAgICB0ZXN0IC1uICIke0NST1NTX1BSRUZJWH0iICYmIGVjaG8gVXNpbmcgJHtBUn0gfCB0ZWUgLWEgJHtMT0d9CitmaQorQVJGTEFHUz0ke0FSRkxBR1MtInJjIn0KK2lmICIke0NST1NTX1BSRUZJWH1yYW5saWIiIC0tdmVyc2lvbiA+L2Rldi9udWxsIDI+L2Rldi9udWxsIHx8IHRlc3QgJD8gLWx0IDEyNjsgdGhlbgorICAgIFJBTkxJQj0ke1JBTkxJQi0iJHtDUk9TU19QUkVGSVh9cmFubGliIn0KKyAgICB0ZXN0IC1uICIke0NST1NTX1BSRUZJWH0iICYmIGVjaG8gVXNpbmcgJHtSQU5MSUJ9IHwgdGVlIC1hICR7TE9HfQorZWxzZQorICAgIFJBTkxJQj0ke1JBTkxJQi0icmFubGliIn0KK2ZpCitpZiAiJHtDUk9TU19QUkVGSVh9bm0iIC0tdmVyc2lvbiA+L2Rldi9udWxsIDI+L2Rldi9udWxsIHx8IHRlc3QgJD8gLWx0IDEyNjsgdGhlbgorICAgIE5NPSR7Tk0tIiR7Q1JPU1NfUFJFRklYfW5tIn0KKyAgICB0ZXN0IC1uICIke0NST1NTX1BSRUZJWH0iICYmIGVjaG8gVXNpbmcgJHtOTX0gfCB0ZWUgLWEgJHtMT0d9CitlbHNlCisgICAgTk09JHtOTS0ibm0ifQorZmkKK0xEQ09ORklHPSR7TERDT05GSUctImxkY29uZmlnIn0KK0xEU0hBUkVETElCQz0iJHtMRFNIQVJFRExJQkMtLWxjfSIKK0FSQ0hTPQorcHJlZml4PSR7cHJlZml4LS91c3IvbG9jYWx9CitleGVjX3ByZWZpeD0ke2V4ZWNfcHJlZml4LScke3ByZWZpeH0nfQorbGliZGlyPSR7bGliZGlyLScke2V4ZWNfcHJlZml4fS9saWInfQorc2hhcmVkbGliZGlyPSR7c2hhcmVkbGliZGlyLScke2xpYmRpcn0nfQoraW5jbHVkZWRpcj0ke2luY2x1ZGVkaXItJyR7cHJlZml4fS9pbmNsdWRlJ30KK21hbmRpcj0ke21hbmRpci0nJHtwcmVmaXh9L3NoYXJlL21hbid9CitzaGFyZWRfZXh0PScuc28nCitzaGFyZWQ9MQorc29sbz0wCitjb3Zlcj0wCit6cHJlZml4PTAKK2J1aWxkNjQ9MAorZ2NjPTAKK29sZF9jYz0iJENDIgorb2xkX2NmbGFncz0iJENGTEFHUyIKK09CSkM9JyQoT0JKWikgJChPQkpHKScKK1BJQ19PQkpDPSckKFBJQ19PQkpaKSAkKFBJQ19PQkpHKScKKword2hpbGUgdGVzdCAkIyAtZ2UgMQorZG8KK2Nhc2UgIiQxIiBpbgorICAgIC1oKiB8IC0taGVscCkKKyAgICAgIGVjaG8gJ3VzYWdlOicgfCB0ZWUgLWEgJHtMT0d9CisgICAgICBlY2hvICcgIGNvbmZpZ3VyZSBbLS16cHJlZml4XSBbLS1wcmVmaXg9UFJFRklYXSAgWy0tZXByZWZpeD1FWFBSRUZJWF0nIHwgdGVlIC1hICR7TE9HfQorICAgICAgZWNobyAnICAgIFstLXN0YXRpY10gWy0tNjRdIFstLWxpYmRpcj1MSUJESVJdIFstLXNoYXJlZGxpYmRpcj1MSUJESVJdJyB8IHRlZSAtYSAke0xPR30KKyAgICAgIGVjaG8gJyAgICBbLS1pbmNsdWRlZGlyPUlOQ0xVREVESVJdIFstLWFyY2hzPSItYXJjaCBpMzg2IC1hcmNoIHg4Nl82NCJdJyB8IHRlZSAtYSAke0xPR30KKyAgICAgICAgZXhpdCAwIDs7CisgICAgLXAqPSogfCAtLXByZWZpeD0qKSBwcmVmaXg9YGVjaG8gJDEgfCBzZWQgJ3MvLio9Ly8nYDsgc2hpZnQgOzsKKyAgICAtZSo9KiB8IC0tZXByZWZpeD0qKSBleGVjX3ByZWZpeD1gZWNobyAkMSB8IHNlZCAncy8uKj0vLydgOyBzaGlmdCA7OworICAgIC1sKj0qIHwgLS1saWJkaXI9KikgbGliZGlyPWBlY2hvICQxIHwgc2VkICdzLy4qPS8vJ2A7IHNoaWZ0IDs7CisgICAgLS1zaGFyZWRsaWJkaXI9Kikgc2hhcmVkbGliZGlyPWBlY2hvICQxIHwgc2VkICdzLy4qPS8vJ2A7IHNoaWZ0IDs7CisgICAgLWkqPSogfCAtLWluY2x1ZGVkaXI9KikgaW5jbHVkZWRpcj1gZWNobyAkMSB8IHNlZCAncy8uKj0vLydgO3NoaWZ0IDs7CisgICAgLXUqPSogfCAtLXVuYW1lPSopIHVuYW1lPWBlY2hvICQxIHwgc2VkICdzLy4qPS8vJ2A7c2hpZnQgOzsKKyAgICAtcCogfCAtLXByZWZpeCkgcHJlZml4PSIkMiI7IHNoaWZ0OyBzaGlmdCA7OworICAgIC1lKiB8IC0tZXByZWZpeCkgZXhlY19wcmVmaXg9IiQyIjsgc2hpZnQ7IHNoaWZ0IDs7CisgICAgLWwqIHwgLS1saWJkaXIpIGxpYmRpcj0iJDIiOyBzaGlmdDsgc2hpZnQgOzsKKyAgICAtaSogfCAtLWluY2x1ZGVkaXIpIGluY2x1ZGVkaXI9IiQyIjsgc2hpZnQ7IHNoaWZ0IDs7CisgICAgLXMqIHwgLS1zaGFyZWQgfCAtLWVuYWJsZS1zaGFyZWQpIHNoYXJlZD0xOyBzaGlmdCA7OworICAgIC10IHwgLS1zdGF0aWMpIHNoYXJlZD0wOyBzaGlmdCA7OworICAgIC0tc29sbykgc29sbz0xOyBzaGlmdCA7OworICAgIC0tY292ZXIpIGNvdmVyPTE7IHNoaWZ0IDs7CisgICAgLXoqIHwgLS16cHJlZml4KSB6cHJlZml4PTE7IHNoaWZ0IDs7CisgICAgLTYqIHwgLS02NCkgYnVpbGQ2ND0xOyBzaGlmdCA7OworICAgIC1hKj0qIHwgLS1hcmNocz0qKSBBUkNIUz1gZWNobyAkMSB8IHNlZCAncy8uKj0vLydgOyBzaGlmdCA7OworICAgIC0tc3lzY29uZmRpcj0qKSBlY2hvICJpZ25vcmVkIG9wdGlvbjogLS1zeXNjb25mZGlyIiB8IHRlZSAtYSAke0xPR307IHNoaWZ0IDs7CisgICAgLS1sb2NhbHN0YXRlZGlyPSopIGVjaG8gImlnbm9yZWQgb3B0aW9uOiAtLWxvY2Fsc3RhdGVkaXIiIHwgdGVlIC1hICR7TE9HfTsgc2hpZnQgOzsKKyAgICAqKSBlY2hvICJ1bmtub3duIG9wdGlvbjogJDEiOyBlY2hvICIkMCAtLWhlbHAgZm9yIGhlbHAiIHwgdGVlIC1hICR7TE9HfTsgZXhpdCAxIDs7CisgICAgZXNhYworZG9uZQorCit0ZXN0PXp0ZXN0JCQKKworc2hvdygpCit7CisgIGNhc2UgIiQqIiBpbgorICAgICokdGVzdC5jKikKKyAgICAgIGVjaG8gPT09ICR0ZXN0LmMgPT09ID4+ICR7TE9HfQorICAgICAgY2F0ICR0ZXN0LmMgPj4gJHtMT0d9CisgICAgICBlY2hvID09PSA+PiAke0xPR307OworICBlc2FjCisgIGVjaG8gJCogPj4gJHtMT0d9Cit9CisKK2NhdCA+ICR0ZXN0LmMgPDxFT0YKKyNlcnJvciBlcnJvcgorRU9GCitpZiAoJENDIC1jICRDRkxBR1MgJHRlc3QuYykgMj4vZGV2L251bGw7IHRoZW4KKyAgdHJ5KCkKKyAgeworICAgIHNob3cgJCoKKyAgICB0ZXN0ICJgKCAkKiApIDI+JjEgfCB0ZWUgLWEgJHtMT0d9YCIgPSAiIgorICB9CisgIGVjaG8gLSB1c2luZyBhbnkgb3V0cHV0IGZyb20gY29tcGlsZXIgdG8gaW5kaWNhdGUgYW4gZXJyb3IgPj4gJHtMT0d9CitlbHNlCisgIHRyeSgpCisgIHsKKyAgICBzaG93ICQqCisgICAgKCAkKiApID4+ICR7TE9HfSAyPiYxCisgICAgcmV0PSQ/CisgICAgaWYgdGVzdCAkcmV0IC1uZSAwOyB0aGVuCisgICAgICBlY2hvICIoZXhpdCBjb2RlICIkcmV0IikiID4+ICR7TE9HfQorICAgIGZpCisgICAgcmV0dXJuICRyZXQKKyAgfQorZmkKKworZWNobyA+PiAke0xPR30KKworY2F0ID4gJHRlc3QuYyA8PEVPRgorZXh0ZXJuIGludCBnZXRjaGFyKCk7CitpbnQgaGVsbG8oKSB7cmV0dXJuIGdldGNoYXIoKTt9CitFT0YKKwordGVzdCAteiAiJENDIiAmJiBlY2hvIENoZWNraW5nIGZvciAke0NST1NTX1BSRUZJWH1nY2MuLi4gfCB0ZWUgLWEgJHtMT0d9CitjYz0ke0NDLSR7Q1JPU1NfUFJFRklYfWdjY30KK2NmbGFncz0ke0NGTEFHUy0iLU8zIn0KKyMgdG8gZm9yY2UgdGhlIGFzbSB2ZXJzaW9uIHVzZTogQ0ZMQUdTPSItTzMgLURBU01WIiAuL2NvbmZpZ3VyZQorY2FzZSAiJGNjIiBpbgorICAqZ2NjKikgZ2NjPTEgOzsKK2VzYWMKK2Nhc2UgYCRjYyAtdiAyPiYxYCBpbgorICAqZ2NjKikgZ2NjPTEgOzsKK2VzYWMKKworc2hvdyAkY2MgLWMgJGNmbGFncyAkdGVzdC5jCitpZiB0ZXN0ICIkZ2NjIiAtZXEgMSAmJiAoJGNjIC1jICRjZmxhZ3MgJHRlc3QuYykgPj4gJHtMT0d9IDI+JjE7IHRoZW4KKyAgZWNobyAuLi4gdXNpbmcgZ2NjID4+ICR7TE9HfQorICBDQz0iJGNjIgorICBDRkxBR1M9IiR7Q0ZMQUdTLS1PM30gJHtBUkNIU30iCisgIFNGTEFHUz0iJHtDRkxBR1MtLU8zfSAtZlBJQyIKKyAgTERGTEFHUz0iJHtMREZMQUdTfSAke0FSQ0hTfSIKKyAgaWYgdGVzdCAkYnVpbGQ2NCAtZXEgMTsgdGhlbgorICAgIENGTEFHUz0iJHtDRkxBR1N9IC1tNjQiCisgICAgU0ZMQUdTPSIke1NGTEFHU30gLW02NCIKKyAgZmkKKyAgaWYgdGVzdCAiJHtaTElCR0NDV0FSTn0iID0gIllFUyI7IHRoZW4KKyAgICBDRkxBR1M9IiR7Q0ZMQUdTfSAtV2FsbCAtV2V4dHJhIC1wZWRhbnRpYyIKKyAgZmkKKyAgaWYgdGVzdCAteiAiJHVuYW1lIjsgdGhlbgorICAgIHVuYW1lPWAodW5hbWUgLXMgfHwgZWNobyB1bmtub3duKSAyPi9kZXYvbnVsbGAKKyAgZmkKKyAgY2FzZSAiJHVuYW1lIiBpbgorICBMaW51eCogfCBsaW51eCogfCBHTlUgfCBHTlUvKiB8IHNvbGFyaXMqKQorICAgICAgICBMRFNIQVJFRD0ke0xEU0hBUkVELSIkY2MgLXNoYXJlZCAtV2wsLXNvbmFtZSxsaWJ6LnNvLjEsLS12ZXJzaW9uLXNjcmlwdCwkc3JjZGlyL3psaWIubWFwIn0gOzsKKyAgKkJTRCB8ICpic2QqIHwgRHJhZ29uRmx5KQorICAgICAgICBMRFNIQVJFRD0ke0xEU0hBUkVELSIkY2MgLXNoYXJlZCAtV2wsLXNvbmFtZSxsaWJ6LnNvLjEsLS12ZXJzaW9uLXNjcmlwdCwkc3JjZGlyL3psaWIubWFwIn0KKyAgICAgICAgTERDT05GSUc9ImxkY29uZmlnIC1tIiA7OworICBDWUdXSU4qIHwgQ3lnd2luKiB8IGN5Z3dpbiogfCBPUy8yKikKKyAgICAgICAgRVhFPScuZXhlJyA7OworICBNSU5HVyogfCBtaW5ndyopCisjIHRlbXBvcmFyeSBieXBhc3MKKyAgICAgICAgcm0gLWYgJHRlc3QuW2NvXSAkdGVzdCAkdGVzdCRzaGFyZWRfZXh0CisgICAgICAgIGVjaG8gIlBsZWFzZSB1c2Ugd2luMzIvTWFrZWZpbGUuZ2NjIGluc3RlYWQuIiB8IHRlZSAtYSAke0xPR30KKyAgICAgICAgZXhpdCAxCisgICAgICAgIExEU0hBUkVEPSR7TERTSEFSRUQtIiRjYyAtc2hhcmVkIn0KKyAgICAgICAgTERTSEFSRURMSUJDPSIiCisgICAgICAgIEVYRT0nLmV4ZScgOzsKKyAgUU5YKikgICMgVGhpcyBpcyBmb3IgUU5YNi4gSSBzdXBwb3NlIHRoYXQgdGhlIFFOWCBydWxlIGJlbG93IGlzIGZvciBRTlgyLFFOWDQKKyAgICAgICAgICMgKGFsYWluLmJvbm5lZm95QGljYnQuY29tKQorICAgICAgICAgICAgICAgICBMRFNIQVJFRD0ke0xEU0hBUkVELSIkY2MgLXNoYXJlZCAtV2wsLWhsaWJ6LnNvLjEifSA7OworICBIUC1VWCopCisgICAgICAgICBMRFNIQVJFRD0ke0xEU0hBUkVELSIkY2MgLXNoYXJlZCAkU0ZMQUdTIn0KKyAgICAgICAgIGNhc2UgYCh1bmFtZSAtbSB8fCBlY2hvIHVua25vd24pIDI+L2Rldi9udWxsYCBpbgorICAgICAgICAgaWE2NCkKKyAgICAgICAgICAgICAgICAgc2hhcmVkX2V4dD0nLnNvJworICAgICAgICAgICAgICAgICBTSEFSRURMSUI9J2xpYnouc28nIDs7CisgICAgICAgICAqKQorICAgICAgICAgICAgICAgICBzaGFyZWRfZXh0PScuc2wnCisgICAgICAgICAgICAgICAgIFNIQVJFRExJQj0nbGliei5zbCcgOzsKKyAgICAgICAgIGVzYWMgOzsKKyAgRGFyd2luKiB8IGRhcndpbiopCisgICAgICAgICAgICAgc2hhcmVkX2V4dD0nLmR5bGliJworICAgICAgICAgICAgIFNIQVJFRExJQj1saWJ6JHNoYXJlZF9leHQKKyAgICAgICAgICAgICBTSEFSRURMSUJWPWxpYnouJFZFUiRzaGFyZWRfZXh0CisgICAgICAgICAgICAgU0hBUkVETElCTT1saWJ6LiRWRVIxJHNoYXJlZF9leHQKKyAgICAgICAgICAgICBMRFNIQVJFRD0ke0xEU0hBUkVELSIkY2MgLWR5bmFtaWNsaWIgLWluc3RhbGxfbmFtZSAkbGliZGlyLyRTSEFSRURMSUJNIC1jb21wYXRpYmlsaXR5X3ZlcnNpb24gJFZFUjEgLWN1cnJlbnRfdmVyc2lvbiAkVkVSMyJ9CisgICAgICAgICAgICAgQVI9Ii91c3IvYmluL2xpYnRvb2wiCisgICAgICAgICAgICAgQVJGTEFHUz0iLW8iIDs7CisgICopICAgICAgICAgICAgIExEU0hBUkVEPSR7TERTSEFSRUQtIiRjYyAtc2hhcmVkIn0gOzsKKyAgZXNhYworZWxzZQorICAjIGZpbmQgc3lzdGVtIG5hbWUgYW5kIGNvcnJlc3BvbmRpbmcgY2Mgb3B0aW9ucworICBDQz0ke0NDLWNjfQorICBnY2M9MAorICBlY2hvIC4uLiB1c2luZyAkQ0MgPj4gJHtMT0d9CisgIGlmIHRlc3QgLXogIiR1bmFtZSI7IHRoZW4KKyAgICB1bmFtZT1gKHVuYW1lIC1zciB8fCBlY2hvIHVua25vd24pIDI+L2Rldi9udWxsYAorICBmaQorICBjYXNlICIkdW5hbWUiIGluCisgIEhQLVVYKikgICAgU0ZMQUdTPSR7Q0ZMQUdTLSItTyAreiJ9CisgICAgICAgICAgICAgQ0ZMQUdTPSR7Q0ZMQUdTLSItTyJ9CisjICAgICAgICAgICAgTERTSEFSRUQ9JHtMRFNIQVJFRC0ibGQgLWIgK3Zub2NvbXBhdHdhcm5pbmdzIn0KKyAgICAgICAgICAgICBMRFNIQVJFRD0ke0xEU0hBUkVELSJsZCAtYiJ9CisgICAgICAgICBjYXNlIGAodW5hbWUgLW0gfHwgZWNobyB1bmtub3duKSAyPi9kZXYvbnVsbGAgaW4KKyAgICAgICAgIGlhNjQpCisgICAgICAgICAgICAgc2hhcmVkX2V4dD0nLnNvJworICAgICAgICAgICAgIFNIQVJFRExJQj0nbGliei5zbycgOzsKKyAgICAgICAgICopCisgICAgICAgICAgICAgc2hhcmVkX2V4dD0nLnNsJworICAgICAgICAgICAgIFNIQVJFRExJQj0nbGliei5zbCcgOzsKKyAgICAgICAgIGVzYWMgOzsKKyAgSVJJWCopICAgICBTRkxBR1M9JHtDRkxBR1MtIi1hbnNpIC1PMiAtcnBhdGggLiJ9CisgICAgICAgICAgICAgQ0ZMQUdTPSR7Q0ZMQUdTLSItYW5zaSAtTzIifQorICAgICAgICAgICAgIExEU0hBUkVEPSR7TERTSEFSRUQtImNjIC1zaGFyZWQgLVdsLC1zb25hbWUsbGliei5zby4xIn0gOzsKKyAgT1NGMVwgVjQqKSBTRkxBR1M9JHtDRkxBR1MtIi1PIC1zdGQxIn0KKyAgICAgICAgICAgICBDRkxBR1M9JHtDRkxBR1MtIi1PIC1zdGQxIn0KKyAgICAgICAgICAgICBMREZMQUdTPSIke0xERkxBR1N9IC1XbCwtcnBhdGgsLiIKKyAgICAgICAgICAgICBMRFNIQVJFRD0ke0xEU0hBUkVELSJjYyAtc2hhcmVkICAtV2wsLXNvbmFtZSxsaWJ6LnNvIC1XbCwtbXN5bSAtV2wsLXJwYXRoLCQobGliZGlyKSAtV2wsLXNldF92ZXJzaW9uLCR7VkVSfToxLjAifSA7OworICBPU0YxKikgICAgIFNGTEFHUz0ke0NGTEFHUy0iLU8gLXN0ZDEifQorICAgICAgICAgICAgIENGTEFHUz0ke0NGTEFHUy0iLU8gLXN0ZDEifQorICAgICAgICAgICAgIExEU0hBUkVEPSR7TERTSEFSRUQtImNjIC1zaGFyZWQgLVdsLC1zb25hbWUsbGliei5zby4xIn0gOzsKKyAgUU5YKikgICAgICBTRkxBR1M9JHtDRkxBR1MtIi00IC1PIn0KKyAgICAgICAgICAgICBDRkxBR1M9JHtDRkxBR1MtIi00IC1PIn0KKyAgICAgICAgICAgICBMRFNIQVJFRD0ke0xEU0hBUkVELSJjYyJ9CisgICAgICAgICAgICAgUkFOTElCPSR7UkFOTElCLSJ0cnVlIn0KKyAgICAgICAgICAgICBBUj0iY2MiCisgICAgICAgICAgICAgQVJGTEFHUz0iLUEiIDs7CisgIFNDT19TVlwgMy4yKikgU0ZMQUdTPSR7Q0ZMQUdTLSItTzMgLWR5IC1LUElDICJ9CisgICAgICAgICAgICAgQ0ZMQUdTPSR7Q0ZMQUdTLSItTzMifQorICAgICAgICAgICAgIExEU0hBUkVEPSR7TERTSEFSRUQtImNjIC1keSAtS1BJQyAtRyJ9IDs7CisgIFN1bk9TXCA1KiB8IHNvbGFyaXMqKQorICAgICAgICAgTERTSEFSRUQ9JHtMRFNIQVJFRC0iY2MgLUcifQorICAgICAgICAgY2FzZSBgKHVuYW1lIC1tIHx8IGVjaG8gdW5rbm93bikgMj4vZGV2L251bGxgIGluCisgICAgICAgICBpODYqKQorICAgICAgICAgICAgIFNGTEFHUz0ke0NGTEFHUy0iLXhwZW50aXVtIC1mYXN0IC1LUElDIC1SLiJ9CisgICAgICAgICAgICAgQ0ZMQUdTPSR7Q0ZMQUdTLSIteHBlbnRpdW0gLWZhc3QifSA7OworICAgICAgICAgKikKKyAgICAgICAgICAgICBTRkxBR1M9JHtDRkxBR1MtIi1mYXN0IC14Y2c5MiAtS1BJQyAtUi4ifQorICAgICAgICAgICAgIENGTEFHUz0ke0NGTEFHUy0iLWZhc3QgLXhjZzkyIn0gOzsKKyAgICAgICAgIGVzYWMgOzsKKyAgU3VuT1NcIDQqKSBTRkxBR1M9JHtDRkxBR1MtIi1PMiAtUElDIn0KKyAgICAgICAgICAgICBDRkxBR1M9JHtDRkxBR1MtIi1PMiJ9CisgICAgICAgICAgICAgTERTSEFSRUQ9JHtMRFNIQVJFRC0ibGQifSA7OworICBTdW5TdHVkaW9cIDkqKSBTRkxBR1M9JHtDRkxBR1MtIi1mYXN0IC14Y29kZT1waWMzMiAteHRhcmdldD11bHRyYTMgLXhhcmNoPXY5YiJ9CisgICAgICAgICAgICAgQ0ZMQUdTPSR7Q0ZMQUdTLSItZmFzdCAteHRhcmdldD11bHRyYTMgLXhhcmNoPXY5YiJ9CisgICAgICAgICAgICAgTERTSEFSRUQ9JHtMRFNIQVJFRC0iY2MgLXhhcmNoPXY5YiJ9IDs7CisgIFVOSVhfU3lzdGVtX1ZcIDQuMi4wKQorICAgICAgICAgICAgIFNGTEFHUz0ke0NGTEFHUy0iLUtQSUMgLU8ifQorICAgICAgICAgICAgIENGTEFHUz0ke0NGTEFHUy0iLU8ifQorICAgICAgICAgICAgIExEU0hBUkVEPSR7TERTSEFSRUQtImNjIC1HIn0gOzsKKyAgVU5JWF9TVlwgNC4yTVApCisgICAgICAgICAgICAgU0ZMQUdTPSR7Q0ZMQUdTLSItS2NvbmZvcm1fcGljIC1PIn0KKyAgICAgICAgICAgICBDRkxBR1M9JHtDRkxBR1MtIi1PIn0KKyAgICAgICAgICAgICBMRFNIQVJFRD0ke0xEU0hBUkVELSJjYyAtRyJ9IDs7CisgIE9wZW5VTklYXCA1KQorICAgICAgICAgICAgIFNGTEFHUz0ke0NGTEFHUy0iLUtQSUMgLU8ifQorICAgICAgICAgICAgIENGTEFHUz0ke0NGTEFHUy0iLU8ifQorICAgICAgICAgICAgIExEU0hBUkVEPSR7TERTSEFSRUQtImNjIC1HIn0gOzsKKyAgQUlYKikgICMgQ291cnRlc3kgb2YgZGJha2tlckBhcnJheWFzb2x1dGlvbnMuY29tCisgICAgICAgICAgICAgU0ZMQUdTPSR7Q0ZMQUdTLSItTyAtcW1heG1lbT04MTkyIn0KKyAgICAgICAgICAgICBDRkxBR1M9JHtDRkxBR1MtIi1PIC1xbWF4bWVtPTgxOTIifQorICAgICAgICAgICAgIExEU0hBUkVEPSR7TERTSEFSRUQtInhsYyAtRyJ9IDs7CisgICMgc2VuZCB3b3JraW5nIG9wdGlvbnMgZm9yIG90aGVyIHN5c3RlbXMgdG8gemxpYkBnemlwLm9yZworICAqKSAgICAgICAgIFNGTEFHUz0ke0NGTEFHUy0iLU8ifQorICAgICAgICAgICAgIENGTEFHUz0ke0NGTEFHUy0iLU8ifQorICAgICAgICAgICAgIExEU0hBUkVEPSR7TERTSEFSRUQtImNjIC1zaGFyZWQifSA7OworICBlc2FjCitmaQorCitTSEFSRURMSUI9JHtTSEFSRURMSUItImxpYnokc2hhcmVkX2V4dCJ9CitTSEFSRURMSUJWPSR7U0hBUkVETElCVi0ibGlieiRzaGFyZWRfZXh0LiRWRVIifQorU0hBUkVETElCTT0ke1NIQVJFRExJQk0tImxpYnokc2hhcmVkX2V4dC4kVkVSMSJ9CisKK2VjaG8gPj4gJHtMT0d9CisKK2lmIHRlc3QgJHNoYXJlZCAtZXEgMTsgdGhlbgorICBlY2hvIENoZWNraW5nIGZvciBzaGFyZWQgbGlicmFyeSBzdXBwb3J0Li4uIHwgdGVlIC1hICR7TE9HfQorICAjIHdlIG11c3QgdGVzdCBpbiB0d28gc3RlcHMgKGNjIHRoZW4gbGQpLCByZXF1aXJlZCBhdCBsZWFzdCBvbiBTdW5PUyA0LngKKyAgaWYgdHJ5ICRDQyAtdyAtYyAkU0ZMQUdTICR0ZXN0LmMgJiYKKyAgICAgdHJ5ICRMRFNIQVJFRCAkU0ZMQUdTIC1vICR0ZXN0JHNoYXJlZF9leHQgJHRlc3QubzsgdGhlbgorICAgIGVjaG8gQnVpbGRpbmcgc2hhcmVkIGxpYnJhcnkgJFNIQVJFRExJQlYgd2l0aCAkQ0MuIHwgdGVlIC1hICR7TE9HfQorICBlbGlmIHRlc3QgLXogIiRvbGRfY2MiIC1hIC16ICIkb2xkX2NmbGFncyI7IHRoZW4KKyAgICBlY2hvIE5vIHNoYXJlZCBsaWJyYXJ5IHN1cHBvcnQuIHwgdGVlIC1hICR7TE9HfQorICAgIHNoYXJlZD0wOworICBlbHNlCisgICAgZWNobyAnTm8gc2hhcmVkIGxpYnJhcnkgc3VwcG9ydDsgdHJ5IHdpdGhvdXQgZGVmaW5pbmcgQ0MgYW5kIENGTEFHUycgfCB0ZWUgLWEgJHtMT0d9CisgICAgc2hhcmVkPTA7CisgIGZpCitmaQoraWYgdGVzdCAkc2hhcmVkIC1lcSAwOyB0aGVuCisgIExEU0hBUkVEPSIkQ0MiCisgIEFMTD0ic3RhdGljIgorICBURVNUPSJhbGwgdGVzdHN0YXRpYyIKKyAgU0hBUkVETElCPSIiCisgIFNIQVJFRExJQlY9IiIKKyAgU0hBUkVETElCTT0iIgorICBlY2hvIEJ1aWxkaW5nIHN0YXRpYyBsaWJyYXJ5ICRTVEFUSUNMSUIgdmVyc2lvbiAkVkVSIHdpdGggJENDLiB8IHRlZSAtYSAke0xPR30KK2Vsc2UKKyAgQUxMPSJzdGF0aWMgc2hhcmVkIgorICBURVNUPSJhbGwgdGVzdHN0YXRpYyB0ZXN0c2hhcmVkIgorZmkKKworQ1BQPSR7Q1BQLSIkQ0MgLUUifQorY2FzZSAkQ0ZMQUdTIGluCisgICpBU01WKikKKyAgICBlY2hvID4+ICR7TE9HfQorICAgIHNob3cgIiROTSAkdGVzdC5vIHwgZ3JlcCBfaGVsbG8iCisgICAgaWYgdGVzdCAiYCROTSAkdGVzdC5vIHwgZ3JlcCBfaGVsbG8gfCB0ZWUgLWEgJHtMT0d9YCIgPSAiIjsgdGhlbgorICAgICAgQ1BQPSIkQ1BQIC1ETk9fVU5ERVJMSU5FIgorICAgICAgZWNobyBDaGVja2luZyBmb3IgdW5kZXJsaW5lIGluIGV4dGVybmFsIG5hbWVzLi4uIE5vLiB8IHRlZSAtYSAke0xPR30KKyAgICBlbHNlCisgICAgICBlY2hvIENoZWNraW5nIGZvciB1bmRlcmxpbmUgaW4gZXh0ZXJuYWwgbmFtZXMuLi4gWWVzLiB8IHRlZSAtYSAke0xPR30KKyAgICBmaSA7OworZXNhYworCitlY2hvID4+ICR7TE9HfQorCitjYXQgPiAkdGVzdC5jIDw8RU9GCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CitvZmY2NF90IGR1bW15ID0gMDsKK0VPRgoraWYgdHJ5ICRDQyAtYyAkQ0ZMQUdTIC1EX0xBUkdFRklMRTY0X1NPVVJDRT0xICR0ZXN0LmM7IHRoZW4KKyAgQ0ZMQUdTPSIke0NGTEFHU30gLURfTEFSR0VGSUxFNjRfU09VUkNFPTEiCisgIFNGTEFHUz0iJHtTRkxBR1N9IC1EX0xBUkdFRklMRTY0X1NPVVJDRT0xIgorICBBTEw9IiR7QUxMfSBhbGw2NCIKKyAgVEVTVD0iJHtURVNUfSB0ZXN0NjQiCisgIGVjaG8gIkNoZWNraW5nIGZvciBvZmY2NF90Li4uIFllcy4iIHwgdGVlIC1hICR7TE9HfQorICBlY2hvICJDaGVja2luZyBmb3IgZnNlZWtvLi4uIFllcy4iIHwgdGVlIC1hICR7TE9HfQorZWxzZQorICBlY2hvICJDaGVja2luZyBmb3Igb2ZmNjRfdC4uLiBOby4iIHwgdGVlIC1hICR7TE9HfQorICBlY2hvID4+ICR7TE9HfQorICBjYXQgPiAkdGVzdC5jIDw8RU9GCisjaW5jbHVkZSA8c3RkaW8uaD4KK2ludCBtYWluKHZvaWQpIHsKKyAgZnNlZWtvKE5VTEwsIDAsIDApOworICByZXR1cm4gMDsKK30KK0VPRgorICBpZiB0cnkgJENDICRDRkxBR1MgLW8gJHRlc3QgJHRlc3QuYzsgdGhlbgorICAgIGVjaG8gIkNoZWNraW5nIGZvciBmc2Vla28uLi4gWWVzLiIgfCB0ZWUgLWEgJHtMT0d9CisgIGVsc2UKKyAgICBDRkxBR1M9IiR7Q0ZMQUdTfSAtRE5PX0ZTRUVLTyIKKyAgICBTRkxBR1M9IiR7U0ZMQUdTfSAtRE5PX0ZTRUVLTyIKKyAgICBlY2hvICJDaGVja2luZyBmb3IgZnNlZWtvLi4uIE5vLiIgfCB0ZWUgLWEgJHtMT0d9CisgIGZpCitmaQorCitjcCAtcCAkc3JjZGlyL3pjb25mLmguaW4gemNvbmYuaAorCitlY2hvID4+ICR7TE9HfQorCitjYXQgPiAkdGVzdC5jIDw8RU9GCisjaW5jbHVkZSA8dW5pc3RkLmg+CitpbnQgbWFpbigpIHsgcmV0dXJuIDA7IH0KK0VPRgoraWYgdHJ5ICRDQyAtYyAkQ0ZMQUdTICR0ZXN0LmM7IHRoZW4KKyAgc2VkIDwgemNvbmYuaCAiL14jaWZkZWYgSEFWRV9VTklTVERfSC4qIG1heSBiZS9zL2RlZiBIQVZFX1VOSVNURF9IXCguKlwpIG1heSBiZS8gMVwxIHdhcy8iID4gemNvbmYudGVtcC5oCisgIG12IHpjb25mLnRlbXAuaCB6Y29uZi5oCisgIGVjaG8gIkNoZWNraW5nIGZvciB1bmlzdGQuaC4uLiBZZXMuIiB8IHRlZSAtYSAke0xPR30KK2Vsc2UKKyAgZWNobyAiQ2hlY2tpbmcgZm9yIHVuaXN0ZC5oLi4uIE5vLiIgfCB0ZWUgLWEgJHtMT0d9CitmaQorCitlY2hvID4+ICR7TE9HfQorCitjYXQgPiAkdGVzdC5jIDw8RU9GCisjaW5jbHVkZSA8c3RkYXJnLmg+CitpbnQgbWFpbigpIHsgcmV0dXJuIDA7IH0KK0VPRgoraWYgdHJ5ICRDQyAtYyAkQ0ZMQUdTICR0ZXN0LmM7IHRoZW4KKyAgc2VkIDwgemNvbmYuaCAiL14jaWZkZWYgSEFWRV9TVERBUkdfSC4qIG1heSBiZS9zL2RlZiBIQVZFX1NUREFSR19IXCguKlwpIG1heSBiZS8gMVwxIHdhcy8iID4gemNvbmYudGVtcC5oCisgIG12IHpjb25mLnRlbXAuaCB6Y29uZi5oCisgIGVjaG8gIkNoZWNraW5nIGZvciBzdGRhcmcuaC4uLiBZZXMuIiB8IHRlZSAtYSAke0xPR30KK2Vsc2UKKyAgZWNobyAiQ2hlY2tpbmcgZm9yIHN0ZGFyZy5oLi4uIE5vLiIgfCB0ZWUgLWEgJHtMT0d9CitmaQorCitpZiB0ZXN0ICR6cHJlZml4IC1lcSAxOyB0aGVuCisgIHNlZCA8IHpjb25mLmggIi8jaWZkZWYgWl9QUkVGSVguKiBtYXkgYmUvcy9kZWYgWl9QUkVGSVhcKC4qXCkgbWF5IGJlLyAxXDEgd2FzLyIgPiB6Y29uZi50ZW1wLmgKKyAgbXYgemNvbmYudGVtcC5oIHpjb25mLmgKKyAgZWNobyA+PiAke0xPR30KKyAgZWNobyAiVXNpbmcgel8gcHJlZml4IG9uIGFsbCBzeW1ib2xzLiIgfCB0ZWUgLWEgJHtMT0d9CitmaQorCitpZiB0ZXN0ICRzb2xvIC1lcSAxOyB0aGVuCisgIHNlZCAnLyNkZWZpbmUgWkNPTkZfSC9hXAorI2RlZmluZSBaX1NPTE8KKworJyA8IHpjb25mLmggPiB6Y29uZi50ZW1wLmgKKyAgbXYgemNvbmYudGVtcC5oIHpjb25mLmgKK09CSkM9JyQoT0JKWiknCitQSUNfT0JKQz0nJChQSUNfT0JKWiknCitmaQorCitpZiB0ZXN0ICRjb3ZlciAtZXEgMTsgdGhlbgorICBDRkxBR1M9IiR7Q0ZMQUdTfSAtZnByb2ZpbGUtYXJjcyAtZnRlc3QtY292ZXJhZ2UiCitmaQorCitlY2hvID4+ICR7TE9HfQorCitjYXQgPiAkdGVzdC5jIDw8RU9GCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlICJ6Y29uZi5oIgoraW50IG1haW4oKQoreworI2lmbmRlZiBTVERDCisgIGNob2tlIG1lCisjZW5kaWYKKyAgcmV0dXJuIDA7Cit9CitFT0YKKworaWYgdHJ5ICRDQyAtYyAkQ0ZMQUdTICR0ZXN0LmM7IHRoZW4KKyAgZWNobyAiQ2hlY2tpbmcgd2hldGhlciB0byB1c2UgdnNbbl1wcmludGYoKSBvciBzW25dcHJpbnRmKCkuLi4gdXNpbmcgdnNbbl1wcmludGYoKS4iIHwgdGVlIC1hICR7TE9HfQorCisgIGVjaG8gPj4gJHtMT0d9CisgIGNhdCA+ICR0ZXN0LmMgPDxFT0YKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgoraW50IG15dGVzdChjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKyAgY2hhciBidWZbMjBdOworICB2YV9saXN0IGFwOworICB2YV9zdGFydChhcCwgZm10KTsKKyAgdnNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGZtdCwgYXApOworICB2YV9lbmQoYXApOworICByZXR1cm4gMDsKK30KK2ludCBtYWluKCkKK3sKKyAgcmV0dXJuIChteXRlc3QoIkhlbGxvJWRcbiIsIDEpKTsKK30KK0VPRgorICBpZiB0cnkgJENDICRDRkxBR1MgLW8gJHRlc3QgJHRlc3QuYzsgdGhlbgorICAgIGVjaG8gIkNoZWNraW5nIGZvciB2c25wcmludGYoKSBpbiBzdGRpby5oLi4uIFllcy4iIHwgdGVlIC1hICR7TE9HfQorCisgICAgZWNobyA+PiAke0xPR30KKyAgICBjYXQgPiR0ZXN0LmMgPDxFT0YKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgoraW50IG15dGVzdChjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKyAgaW50IG47CisgIGNoYXIgYnVmWzIwXTsKKyAgdmFfbGlzdCBhcDsKKyAgdmFfc3RhcnQoYXAsIGZtdCk7CisgIG4gPSB2c25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgZm10LCBhcCk7CisgIHZhX2VuZChhcCk7CisgIHJldHVybiBuOworfQoraW50IG1haW4oKQoreworICByZXR1cm4gKG15dGVzdCgiSGVsbG8lZFxuIiwgMSkpOworfQorRU9GCisKKyAgICBpZiB0cnkgJENDIC1jICRDRkxBR1MgJHRlc3QuYzsgdGhlbgorICAgICAgZWNobyAiQ2hlY2tpbmcgZm9yIHJldHVybiB2YWx1ZSBvZiB2c25wcmludGYoKS4uLiBZZXMuIiB8IHRlZSAtYSAke0xPR30KKyAgICBlbHNlCisgICAgICBDRkxBR1M9IiRDRkxBR1MgLURIQVNfdnNucHJpbnRmX3ZvaWQiCisgICAgICBTRkxBR1M9IiRTRkxBR1MgLURIQVNfdnNucHJpbnRmX3ZvaWQiCisgICAgICBlY2hvICJDaGVja2luZyBmb3IgcmV0dXJuIHZhbHVlIG9mIHZzbnByaW50ZigpLi4uIE5vLiIgfCB0ZWUgLWEgJHtMT0d9CisgICAgICBlY2hvICIgIFdBUk5JTkc6IGFwcGFyZW50bHkgdnNucHJpbnRmKCkgZG9lcyBub3QgcmV0dXJuIGEgdmFsdWUuIHpsaWIiIHwgdGVlIC1hICR7TE9HfQorICAgICAgZWNobyAiICBjYW4gYnVpbGQgYnV0IHdpbGwgYmUgb3BlbiB0byBwb3NzaWJsZSBzdHJpbmctZm9ybWF0IHNlY3VyaXR5IiB8IHRlZSAtYSAke0xPR30KKyAgICAgIGVjaG8gIiAgdnVsbmVyYWJpbGl0aWVzLiIgfCB0ZWUgLWEgJHtMT0d9CisgICAgZmkKKyAgZWxzZQorICAgIENGTEFHUz0iJENGTEFHUyAtRE5PX3ZzbnByaW50ZiIKKyAgICBTRkxBR1M9IiRTRkxBR1MgLUROT192c25wcmludGYiCisgICAgZWNobyAiQ2hlY2tpbmcgZm9yIHZzbnByaW50ZigpIGluIHN0ZGlvLmguLi4gTm8uIiB8IHRlZSAtYSAke0xPR30KKyAgICBlY2hvICIgIFdBUk5JTkc6IHZzbnByaW50ZigpIG5vdCBmb3VuZCwgZmFsbGluZyBiYWNrIHRvIHZzcHJpbnRmKCkuIHpsaWIiIHwgdGVlIC1hICR7TE9HfQorICAgIGVjaG8gIiAgY2FuIGJ1aWxkIGJ1dCB3aWxsIGJlIG9wZW4gdG8gcG9zc2libGUgYnVmZmVyLW92ZXJmbG93IHNlY3VyaXR5IiB8IHRlZSAtYSAke0xPR30KKyAgICBlY2hvICIgIHZ1bG5lcmFiaWxpdGllcy4iIHwgdGVlIC1hICR7TE9HfQorCisgICAgZWNobyA+PiAke0xPR30KKyAgICBjYXQgPiR0ZXN0LmMgPDxFT0YKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgoraW50IG15dGVzdChjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKyAgaW50IG47CisgIGNoYXIgYnVmWzIwXTsKKyAgdmFfbGlzdCBhcDsKKyAgdmFfc3RhcnQoYXAsIGZtdCk7CisgIG4gPSB2c3ByaW50ZihidWYsIGZtdCwgYXApOworICB2YV9lbmQoYXApOworICByZXR1cm4gbjsKK30KK2ludCBtYWluKCkKK3sKKyAgcmV0dXJuIChteXRlc3QoIkhlbGxvJWRcbiIsIDEpKTsKK30KK0VPRgorCisgICAgaWYgdHJ5ICRDQyAtYyAkQ0ZMQUdTICR0ZXN0LmM7IHRoZW4KKyAgICAgIGVjaG8gIkNoZWNraW5nIGZvciByZXR1cm4gdmFsdWUgb2YgdnNwcmludGYoKS4uLiBZZXMuIiB8IHRlZSAtYSAke0xPR30KKyAgICBlbHNlCisgICAgICBDRkxBR1M9IiRDRkxBR1MgLURIQVNfdnNwcmludGZfdm9pZCIKKyAgICAgIFNGTEFHUz0iJFNGTEFHUyAtREhBU192c3ByaW50Zl92b2lkIgorICAgICAgZWNobyAiQ2hlY2tpbmcgZm9yIHJldHVybiB2YWx1ZSBvZiB2c3ByaW50ZigpLi4uIE5vLiIgfCB0ZWUgLWEgJHtMT0d9CisgICAgICBlY2hvICIgIFdBUk5JTkc6IGFwcGFyZW50bHkgdnNwcmludGYoKSBkb2VzIG5vdCByZXR1cm4gYSB2YWx1ZS4gemxpYiIgfCB0ZWUgLWEgJHtMT0d9CisgICAgICBlY2hvICIgIGNhbiBidWlsZCBidXQgd2lsbCBiZSBvcGVuIHRvIHBvc3NpYmxlIHN0cmluZy1mb3JtYXQgc2VjdXJpdHkiIHwgdGVlIC1hICR7TE9HfQorICAgICAgZWNobyAiICB2dWxuZXJhYmlsaXRpZXMuIiB8IHRlZSAtYSAke0xPR30KKyAgICBmaQorICBmaQorZWxzZQorICBlY2hvICJDaGVja2luZyB3aGV0aGVyIHRvIHVzZSB2c1tuXXByaW50ZigpIG9yIHNbbl1wcmludGYoKS4uLiB1c2luZyBzW25dcHJpbnRmKCkuIiB8IHRlZSAtYSAke0xPR30KKworICBlY2hvID4+ICR7TE9HfQorICBjYXQgPiR0ZXN0LmMgPDxFT0YKKyNpbmNsdWRlIDxzdGRpby5oPgoraW50IG15dGVzdCgpCit7CisgIGNoYXIgYnVmWzIwXTsKKyAgc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiVzIiwgImZvbyIpOworICByZXR1cm4gMDsKK30KK2ludCBtYWluKCkKK3sKKyAgcmV0dXJuIChteXRlc3QoKSk7Cit9CitFT0YKKworICBpZiB0cnkgJENDICRDRkxBR1MgLW8gJHRlc3QgJHRlc3QuYzsgdGhlbgorICAgIGVjaG8gIkNoZWNraW5nIGZvciBzbnByaW50ZigpIGluIHN0ZGlvLmguLi4gWWVzLiIgfCB0ZWUgLWEgJHtMT0d9CisKKyAgICBlY2hvID4+ICR7TE9HfQorICAgIGNhdCA+JHRlc3QuYyA8PEVPRgorI2luY2x1ZGUgPHN0ZGlvLmg+CitpbnQgbXl0ZXN0KCkKK3sKKyAgY2hhciBidWZbMjBdOworICByZXR1cm4gc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiVzIiwgImZvbyIpOworfQoraW50IG1haW4oKQoreworICByZXR1cm4gKG15dGVzdCgpKTsKK30KK0VPRgorCisgICAgaWYgdHJ5ICRDQyAtYyAkQ0ZMQUdTICR0ZXN0LmM7IHRoZW4KKyAgICAgIGVjaG8gIkNoZWNraW5nIGZvciByZXR1cm4gdmFsdWUgb2Ygc25wcmludGYoKS4uLiBZZXMuIiB8IHRlZSAtYSAke0xPR30KKyAgICBlbHNlCisgICAgICBDRkxBR1M9IiRDRkxBR1MgLURIQVNfc25wcmludGZfdm9pZCIKKyAgICAgIFNGTEFHUz0iJFNGTEFHUyAtREhBU19zbnByaW50Zl92b2lkIgorICAgICAgZWNobyAiQ2hlY2tpbmcgZm9yIHJldHVybiB2YWx1ZSBvZiBzbnByaW50ZigpLi4uIE5vLiIgfCB0ZWUgLWEgJHtMT0d9CisgICAgICBlY2hvICIgIFdBUk5JTkc6IGFwcGFyZW50bHkgc25wcmludGYoKSBkb2VzIG5vdCByZXR1cm4gYSB2YWx1ZS4gemxpYiIgfCB0ZWUgLWEgJHtMT0d9CisgICAgICBlY2hvICIgIGNhbiBidWlsZCBidXQgd2lsbCBiZSBvcGVuIHRvIHBvc3NpYmxlIHN0cmluZy1mb3JtYXQgc2VjdXJpdHkiIHwgdGVlIC1hICR7TE9HfQorICAgICAgZWNobyAiICB2dWxuZXJhYmlsaXRpZXMuIiB8IHRlZSAtYSAke0xPR30KKyAgICBmaQorICBlbHNlCisgICAgQ0ZMQUdTPSIkQ0ZMQUdTIC1ETk9fc25wcmludGYiCisgICAgU0ZMQUdTPSIkU0ZMQUdTIC1ETk9fc25wcmludGYiCisgICAgZWNobyAiQ2hlY2tpbmcgZm9yIHNucHJpbnRmKCkgaW4gc3RkaW8uaC4uLiBOby4iIHwgdGVlIC1hICR7TE9HfQorICAgIGVjaG8gIiAgV0FSTklORzogc25wcmludGYoKSBub3QgZm91bmQsIGZhbGxpbmcgYmFjayB0byBzcHJpbnRmKCkuIHpsaWIiIHwgdGVlIC1hICR7TE9HfQorICAgIGVjaG8gIiAgY2FuIGJ1aWxkIGJ1dCB3aWxsIGJlIG9wZW4gdG8gcG9zc2libGUgYnVmZmVyLW92ZXJmbG93IHNlY3VyaXR5IiB8IHRlZSAtYSAke0xPR30KKyAgICBlY2hvICIgIHZ1bG5lcmFiaWxpdGllcy4iIHwgdGVlIC1hICR7TE9HfQorCisgICAgZWNobyA+PiAke0xPR30KKyAgICBjYXQgPiR0ZXN0LmMgPDxFT0YKKyNpbmNsdWRlIDxzdGRpby5oPgoraW50IG15dGVzdCgpCit7CisgIGNoYXIgYnVmWzIwXTsKKyAgcmV0dXJuIHNwcmludGYoYnVmLCAiJXMiLCAiZm9vIik7Cit9CitpbnQgbWFpbigpCit7CisgIHJldHVybiAobXl0ZXN0KCkpOworfQorRU9GCisKKyAgICBpZiB0cnkgJENDIC1jICRDRkxBR1MgJHRlc3QuYzsgdGhlbgorICAgICAgZWNobyAiQ2hlY2tpbmcgZm9yIHJldHVybiB2YWx1ZSBvZiBzcHJpbnRmKCkuLi4gWWVzLiIgfCB0ZWUgLWEgJHtMT0d9CisgICAgZWxzZQorICAgICAgQ0ZMQUdTPSIkQ0ZMQUdTIC1ESEFTX3NwcmludGZfdm9pZCIKKyAgICAgIFNGTEFHUz0iJFNGTEFHUyAtREhBU19zcHJpbnRmX3ZvaWQiCisgICAgICBlY2hvICJDaGVja2luZyBmb3IgcmV0dXJuIHZhbHVlIG9mIHNwcmludGYoKS4uLiBOby4iIHwgdGVlIC1hICR7TE9HfQorICAgICAgZWNobyAiICBXQVJOSU5HOiBhcHBhcmVudGx5IHNwcmludGYoKSBkb2VzIG5vdCByZXR1cm4gYSB2YWx1ZS4gemxpYiIgfCB0ZWUgLWEgJHtMT0d9CisgICAgICBlY2hvICIgIGNhbiBidWlsZCBidXQgd2lsbCBiZSBvcGVuIHRvIHBvc3NpYmxlIHN0cmluZy1mb3JtYXQgc2VjdXJpdHkiIHwgdGVlIC1hICR7TE9HfQorICAgICAgZWNobyAiICB2dWxuZXJhYmlsaXRpZXMuIiB8IHRlZSAtYSAke0xPR30KKyAgICBmaQorICBmaQorZmkKKworaWYgdGVzdCAiJGdjYyIgLWVxIDE7IHRoZW4KKyAgZWNobyA+PiAke0xPR30KKyAgY2F0ID4gJHRlc3QuYyA8PEVPRgorI2lmICgoX19HTlVDX18tMCkgKiAxMCArIF9fR05VQ19NSU5PUl9fLTAgPj0gMzMpCisjICBkZWZpbmUgWkxJQl9JTlRFUk5BTCBfX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5ICgiaGlkZGVuIikpKQorI2Vsc2UKKyMgIGRlZmluZSBaTElCX0lOVEVSTkFMCisjZW5kaWYKK2ludCBaTElCX0lOVEVSTkFMIGZvbzsKK2ludCBtYWluKCkKK3sKKyAgcmV0dXJuIDA7Cit9CitFT0YKKyAgaWYgdHJ5ICRDQyAtYyAkQ0ZMQUdTICR0ZXN0LmM7IHRoZW4KKyAgICBlY2hvICJDaGVja2luZyBmb3IgYXR0cmlidXRlKHZpc2liaWxpdHkpIHN1cHBvcnQuLi4gWWVzLiIgfCB0ZWUgLWEgJHtMT0d9CisgIGVsc2UKKyAgICBDRkxBR1M9IiRDRkxBR1MgLUROT19WSVoiCisgICAgU0ZMQUdTPSIkU0ZMQUdTIC1ETk9fVklaIgorICAgIGVjaG8gIkNoZWNraW5nIGZvciBhdHRyaWJ1dGUodmlzaWJpbGl0eSkgc3VwcG9ydC4uLiBOby4iIHwgdGVlIC1hICR7TE9HfQorICBmaQorZmkKKworcm0gLWYgJHRlc3QuW2NvXSAkdGVzdCAkdGVzdCRzaGFyZWRfZXh0ICR0ZXN0Lmdjbm8KKworIyBzaG93IHRoZSByZXN1bHRzIGluIHRoZSBsb2cKK2VjaG8gPj4gJHtMT0d9CitlY2hvIEFMTCA9ICRBTEwgPj4gJHtMT0d9CitlY2hvIEFSID0gJEFSID4+ICR7TE9HfQorZWNobyBBUkZMQUdTID0gJEFSRkxBR1MgPj4gJHtMT0d9CitlY2hvIENDID0gJENDID4+ICR7TE9HfQorZWNobyBDRkxBR1MgPSAkQ0ZMQUdTID4+ICR7TE9HfQorZWNobyBDUFAgPSAkQ1BQID4+ICR7TE9HfQorZWNobyBFWEUgPSAkRVhFID4+ICR7TE9HfQorZWNobyBMRENPTkZJRyA9ICRMRENPTkZJRyA+PiAke0xPR30KK2VjaG8gTERGTEFHUyA9ICRMREZMQUdTID4+ICR7TE9HfQorZWNobyBMRFNIQVJFRCA9ICRMRFNIQVJFRCA+PiAke0xPR30KK2VjaG8gTERTSEFSRURMSUJDID0gJExEU0hBUkVETElCQyA+PiAke0xPR30KK2VjaG8gT0JKQyA9ICRPQkpDID4+ICR7TE9HfQorZWNobyBQSUNfT0JKQyA9ICRQSUNfT0JKQyA+PiAke0xPR30KK2VjaG8gUkFOTElCID0gJFJBTkxJQiA+PiAke0xPR30KK2VjaG8gU0ZMQUdTID0gJFNGTEFHUyA+PiAke0xPR30KK2VjaG8gU0hBUkVETElCID0gJFNIQVJFRExJQiA+PiAke0xPR30KK2VjaG8gU0hBUkVETElCTSA9ICRTSEFSRURMSUJNID4+ICR7TE9HfQorZWNobyBTSEFSRURMSUJWID0gJFNIQVJFRExJQlYgPj4gJHtMT0d9CitlY2hvIFNUQVRJQ0xJQiA9ICRTVEFUSUNMSUIgPj4gJHtMT0d9CitlY2hvIFRFU1QgPSAkVEVTVCA+PiAke0xPR30KK2VjaG8gVkVSID0gJFZFUiA+PiAke0xPR30KK2VjaG8gZXhlY19wcmVmaXggPSAkZXhlY19wcmVmaXggPj4gJHtMT0d9CitlY2hvIGluY2x1ZGVkaXIgPSAkaW5jbHVkZWRpciA+PiAke0xPR30KK2VjaG8gbGliZGlyID0gJGxpYmRpciA+PiAke0xPR30KK2VjaG8gbWFuZGlyID0gJG1hbmRpciA+PiAke0xPR30KK2VjaG8gcHJlZml4ID0gJHByZWZpeCA+PiAke0xPR30KK2VjaG8gc2hhcmVkbGliZGlyID0gJHNoYXJlZGxpYmRpciA+PiAke0xPR30KK2VjaG8gdW5hbWUgPSAkdW5hbWUgPj4gJHtMT0d9CitlY2hvIC0tLS0tLS0tLS0tLS0tLS0tLS0tID4+ICR7TE9HfQorZWNobyA+PiAke0xPR30KK2VjaG8gPj4gJHtMT0d9CisKKyMgdWRwYXRlIE1ha2VmaWxlCitzZWQgPCAkc3JjZGlyL01ha2VmaWxlLmluICIKKy9eQ0MgKj0vcyM9LiojPSRDQyMKKy9eQ0ZMQUdTICo9L3MjPS4qIz0kQ0ZMQUdTIworL15TRkxBR1MgKj0vcyM9LiojPSRTRkxBR1MjCisvXkxERkxBR1MgKj0vcyM9LiojPSRMREZMQUdTIworL15MRFNIQVJFRCAqPS9zIz0uKiM9JExEU0hBUkVEIworL15DUFAgKj0vcyM9LiojPSRDUFAjCisvXlNUQVRJQ0xJQiAqPS9zIz0uKiM9JFNUQVRJQ0xJQiMKKy9eU0hBUkVETElCICo9L3MjPS4qIz0kU0hBUkVETElCIworL15TSEFSRURMSUJWICo9L3MjPS4qIz0kU0hBUkVETElCViMKKy9eU0hBUkVETElCTSAqPS9zIz0uKiM9JFNIQVJFRExJQk0jCisvXkFSICo9L3MjPS4qIz0kQVIjCisvXkFSRkxBR1MgKj0vcyM9LiojPSRBUkZMQUdTIworL15SQU5MSUIgKj0vcyM9LiojPSRSQU5MSUIjCisvXkxEQ09ORklHICo9L3MjPS4qIz0kTERDT05GSUcjCisvXkxEU0hBUkVETElCQyAqPS9zIz0uKiM9JExEU0hBUkVETElCQyMKKy9eRVhFICo9L3MjPS4qIz0kRVhFIworL15wcmVmaXggKj0vcyM9LiojPSRwcmVmaXgjCisvXmV4ZWNfcHJlZml4ICo9L3MjPS4qIz0kZXhlY19wcmVmaXgjCisvXmxpYmRpciAqPS9zIz0uKiM9JGxpYmRpciMKKy9ec2hhcmVkbGliZGlyICo9L3MjPS4qIz0kc2hhcmVkbGliZGlyIworL15pbmNsdWRlZGlyICo9L3MjPS4qIz0kaW5jbHVkZWRpciMKKy9ebWFuZGlyICo9L3MjPS4qIz0kbWFuZGlyIworL15PQkpDICo9L3MjPS4qIz0gJE9CSkMjCisvXlBJQ19PQkpDICo9L3MjPS4qIz0gJFBJQ19PQkpDIworL15hbGw6ICovcyM6LiojOiAkQUxMIworL150ZXN0OiAqL3MjOi4qIzogJFRFU1QjCisvXmJ1aWxkZGlyICo9L3MjPS4qIz0kYnVpbGRkaXIjCisvXnNyY2RpciAqPS9zIz0uKiM9JHNyY2RpciMKKyIgPiBNYWtlZmlsZQorCitzZWQgPCAkc3JjZGlyL3psaWIucGMuaW4gIgorL15DQyAqPS9zIz0uKiM9JENDIworL15DRkxBR1MgKj0vcyM9LiojPSRDRkxBR1MjCisvXkNQUCAqPS9zIz0uKiM9JENQUCMKKy9eTERTSEFSRUQgKj0vcyM9LiojPSRMRFNIQVJFRCMKKy9eU1RBVElDTElCICo9L3MjPS4qIz0kU1RBVElDTElCIworL15TSEFSRURMSUIgKj0vcyM9LiojPSRTSEFSRURMSUIjCisvXlNIQVJFRExJQlYgKj0vcyM9LiojPSRTSEFSRURMSUJWIworL15TSEFSRURMSUJNICo9L3MjPS4qIz0kU0hBUkVETElCTSMKKy9eQVIgKj0vcyM9LiojPSRBUiMKKy9eQVJGTEFHUyAqPS9zIz0uKiM9JEFSRkxBR1MjCisvXlJBTkxJQiAqPS9zIz0uKiM9JFJBTkxJQiMKKy9eRVhFICo9L3MjPS4qIz0kRVhFIworL15wcmVmaXggKj0vcyM9LiojPSRwcmVmaXgjCisvXmV4ZWNfcHJlZml4ICo9L3MjPS4qIz0kZXhlY19wcmVmaXgjCisvXmxpYmRpciAqPS9zIz0uKiM9JGxpYmRpciMKKy9ec2hhcmVkbGliZGlyICo9L3MjPS4qIz0kc2hhcmVkbGliZGlyIworL15pbmNsdWRlZGlyICo9L3MjPS4qIz0kaW5jbHVkZWRpciMKKy9ebWFuZGlyICo9L3MjPS4qIz0kbWFuZGlyIworL15MREZMQUdTICo9L3MjPS4qIz0kTERGTEFHUyMKKy9eYnVpbGRkaXIgKj0vcyM9LiojPSRidWlsZGRpciMKKy9ec3JjZGlyICo9L3MjPS4qIz0kc3JjZGlyIworIiB8IHNlZCAtZSAiCitzL1xAVkVSU0lPTlxALyRWRVIvZzsKKyIgPiB6bGliLnBjCmRpZmYgLS1naXQgYS96bGliLTEuMi42L2NvbnRyaWIvUkVBRE1FLmNvbnRyaWIgYi96bGliLTEuMi42L2NvbnRyaWIvUkVBRE1FLmNvbnRyaWIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQyMjg1ZAotLS0gL2Rldi9udWxsCisrKyBiL3psaWItMS4yLjYvY29udHJpYi9SRUFETUUuY29udHJpYgpAQCAtMCwwICsxLDc3IEBACitBbGwgZmlsZXMgdW5kZXIgdGhpcyBjb250cmliIGRpcmVjdG9yeSBhcmUgVU5TVVBQT1JURUQuIFRoZXJlIHdlcmUKK3Byb3ZpZGVkIGJ5IHVzZXJzIG9mIHpsaWIgYW5kIHdlcmUgbm90IHRlc3RlZCBieSB0aGUgYXV0aG9ycyBvZiB6bGliLgorVXNlIGF0IHlvdXIgb3duIHJpc2suIFBsZWFzZSBjb250YWN0IHRoZSBhdXRob3JzIG9mIHRoZSBjb250cmlidXRpb25zCitmb3IgaGVscCBhYm91dCB0aGVzZSwgbm90IHRoZSB6bGliIGF1dGhvcnMuIFRoYW5rcy4KKworCithZGEvICAgICAgICBieSBEbWl0cml5IEFuaXNpbWtvdiA8YW5pc2lta292QHlhaG9vLmNvbT4KKyAgICAgICAgU3VwcG9ydCBmb3IgQWRhCisgICAgICAgIFNlZSBodHRwOi8vemxpYi1hZGEuc291cmNlZm9yZ2UubmV0LworCithbWQ2NC8gICAgICBieSBNaWtoYWlsIFRldGVyaW4gPG1pQEFMREFOLmFsZ2VicmEuY29tPgorICAgICAgICBhc20gY29kZSBmb3IgQU1ENjQKKyAgICAgICAgU2VlIHBhdGNoIGF0IGh0dHA6Ly93d3cuZnJlZWJzZC5vcmcvY2dpL3F1ZXJ5LXByLmNnaT9wcj1iaW4vOTYzOTMKKworYXNtNjg2LyAgICAgYnkgQnJpYW4gUmFpdGVyIDxicmVhZGJveEBtdXBwZXRsYWJzLmNvbT4KKyAgICAgICAgYXNtIGNvZGUgZm9yIFBlbnRpdW0gYW5kIFBQcm8vUElJLCB1c2luZyB0aGUgQVQmVCAoR05VIGFzKSBzeW50YXgKKyAgICAgICAgU2VlIGh0dHA6Ly93d3cubXVwcGV0bGFicy5jb20vfmJyZWFkYm94L3NvZnR3YXJlL2Fzc2VtYmx5Lmh0bWwKKworYmxhc3QvICAgICAgYnkgTWFyayBBZGxlciA8bWFkbGVyQGFsdW1uaS5jYWx0ZWNoLmVkdT4KKyAgICAgICAgRGVjb21wcmVzc29yIGZvciBvdXRwdXQgb2YgUEtXYXJlIERhdGEgQ29tcHJlc3Npb24gTGlicmFyeSAoRENMKQorCitkZWxwaGkvICAgICBieSBDb3NtaW4gVHJ1dGEgPGNvc21pbnRAY3MudWJiY2x1ai5ybz4KKyAgICAgICAgU3VwcG9ydCBmb3IgRGVscGhpIGFuZCBDKysgQnVpbGRlcgorCitkb3R6bGliLyAgICBieSBIZW5yaWsgUmF2biA8aGVucmlrQHJhdm4uY29tPgorICAgICAgICBTdXBwb3J0IGZvciBNaWNyb3NvZnQgLk5ldCBhbmQgVmlzdWFsIEMrKyAuTmV0CisKK2djY19ndm1hdDY0L2J5IEdpbGxlcyBWb2xsYW50IDxpbmZvQHdpbmltYWdlLmNvbT4KKyAgICAgICAgR0NDIFZlcnNpb24gb2YgeDg2IDY0LWJpdCAoQU1ENjQgYW5kIEludGVsIEVNNjR0KSBjb2RlIGZvciB4NjQKKyAgICAgICAgYXNzZW1ibGVyIHRvIHJlcGxhY2UgbG9uZ2VzdF9tYXRjaCgpIGFuZCBpbmZsYXRlX2Zhc3QoKQorCitpbmZiYWNrOS8gICBieSBNYXJrIEFkbGVyIDxtYWRsZXJAYWx1bW5pLmNhbHRlY2guZWR1PgorICAgICAgICBVbnN1cHBvcnRlZCBkaWZmcyB0byBpbmZiYWNrIHRvIGRlY29kZSB0aGUgZGVmbGF0ZTY0IGZvcm1hdAorCitpbmZsYXRlODYvICBieSBDaHJpcyBBbmRlcnNvbiA8Y2hyaXN0b3BAY2hhcm0ubmV0PgorICAgICAgICBUdW5lZCB4ODYgZ2NjIGFzbSBjb2RlIHRvIHJlcGxhY2UgaW5mbGF0ZV9mYXN0KCkKKworaW9zdHJlYW0vICAgYnkgS2V2aW4gUnVsYW5kIDxrZXZpbkByb2Rpbi53dXN0bC5lZHU+CisgICAgICAgIEEgQysrIEkvTyBzdHJlYW1zIGludGVyZmFjZSB0byB0aGUgemxpYiBneiogZnVuY3Rpb25zCisKK2lvc3RyZWFtMi8gIGJ5IFR5Z2UgTPh2c2V0IDxUeWdlLkxvdnNldEBjbXIubm8+CisgICAgICAgIEFub3RoZXIgQysrIEkvTyBzdHJlYW1zIGludGVyZmFjZQorCitpb3N0cmVhbTMvICBieSBMdWR3aWcgU2Nod2FyZHQgPHNjaHdhcmR0QHN1bi5hYy56YT4KKyAgICAgICAgICAgIGFuZCBLZXZpbiBSdWxhbmQgPGtldmluQHJvZGluLnd1c3RsLmVkdT4KKyAgICAgICAgWWV0IGFub3RoZXIgQysrIEkvTyBzdHJlYW1zIGludGVyZmFjZQorCittYXNteDY0LyAgICBieSBHaWxsZXMgVm9sbGFudCA8aW5mb0B3aW5pbWFnZS5jb20+CisgICAgICAgIHg4NiA2NC1iaXQgKEFNRDY0IGFuZCBJbnRlbCBFTTY0dCkgY29kZSBmb3IgeDY0IGFzc2VtYmxlciB0bworICAgICAgICByZXBsYWNlIGxvbmdlc3RfbWF0Y2goKSBhbmQgaW5mbGF0ZV9mYXN0KCksICBhbHNvIG1hc20geDg2CisgICAgICAgIDY0LWJpdHMgdHJhbnNsYXRpb24gb2YgQ2hyaXMgQW5kZXJzb24gaW5mbGF0ZV9mYXN0KCkKKworbWFzbXg4Ni8gICAgYnkgR2lsbGVzIFZvbGxhbnQgPGluZm9Ad2luaW1hZ2UuY29tPgorICAgICAgICB4ODYgYXNtIGNvZGUgdG8gcmVwbGFjZSBsb25nZXN0X21hdGNoKCkgYW5kIGluZmxhdGVfZmFzdCgpLAorICAgICAgICBmb3IgVmlzdWFsIEMrKyBhbmQgTUFTTSAoMzIgYml0cykuCisgICAgICAgIEJhc2VkIG9uIEJyaWFuIFJhaXRlciAoYXNtNjg2KSBhbmQgQ2hyaXMgQW5kZXJzb24gKGluZmxhdGU4NikKKworbWluaXppcC8gICAgYnkgR2lsbGVzIFZvbGxhbnQgPGluZm9Ad2luaW1hZ2UuY29tPgorICAgICAgICBNaW5pIHppcCBhbmQgdW56aXAgYmFzZWQgb24gemxpYgorICAgICAgICBJbmNsdWRlcyBaaXA2NCBzdXBwb3J0IGJ5IE1hdGhpYXMgU3ZlbnNzb24gPG1hdGhpYXNAcmVzdWx0NDIuY29tPgorICAgICAgICBTZWUgaHR0cDovL3d3dy53aW5pbWFnZS5jb20vekxpYkRsbC91bnppcC5odG1sCisKK3Bhc2NhbC8gICAgIGJ5IEJvYiBEZWxsYWNhIDxib2JkbEB4dHJhLmNvLm56PiBldCBhbC4KKyAgICAgICAgU3VwcG9ydCBmb3IgUGFzY2FsCisKK3B1ZmYvICAgICAgIGJ5IE1hcmsgQWRsZXIgPG1hZGxlckBhbHVtbmkuY2FsdGVjaC5lZHU+CisgICAgICAgIFNtYWxsLCBsb3cgbWVtb3J5IHVzYWdlIGluZmxhdGUuICBBbHNvIHNlcnZlcyB0byBwcm92aWRlIGFuCisgICAgICAgIHVuYW1iaWd1b3VzIGRlc2NyaXB0aW9uIG9mIHRoZSBkZWZsYXRlIGZvcm1hdC4KKwordGVzdHpsaWIvICAgYnkgR2lsbGVzIFZvbGxhbnQgPGluZm9Ad2luaW1hZ2UuY29tPgorICAgICAgICBFeGFtcGxlIG9mIHRoZSB1c2Ugb2YgemxpYgorCit1bnRnei8gICAgICBieSBQZWRybyBBLiBBcmFuZGEgR3V0aWVycmV6IDxwYWFnQHRpZC5lcz4KKyAgICAgICAgQSB2ZXJ5IHNpbXBsZSB0YXIuZ3ogZmlsZSBleHRyYWN0b3IgdXNpbmcgemxpYgorCit2c3R1ZGlvLyAgICBieSBHaWxsZXMgVm9sbGFudCA8aW5mb0B3aW5pbWFnZS5jb20+CisgICAgICAgIEJ1aWxkaW5nIGEgbWluaXppcC1lbmhhbmNlZCB6bGliIHdpdGggTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8KZGlmZiAtLWdpdCBhL3psaWItMS4yLjYvY29udHJpYi9hZGEvYnVmZmVyX2RlbW8uYWRiIGIvemxpYi0xLjIuNi9jb250cmliL2FkYS9idWZmZXJfZGVtby5hZGIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZiODYzOAotLS0gL2Rldi9udWxsCisrKyBiL3psaWItMS4yLjYvY29udHJpYi9hZGEvYnVmZmVyX2RlbW8uYWRiCkBAIC0wLDAgKzEsMTA2IEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSAgWkxpYiBmb3IgQWRhIHRoaWNrIGJpbmRpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgQ29weXJpZ2h0IChDKSAyMDAyLTIwMDQgRG1pdHJpeSBBbmlzaW1rb3YgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgT3BlbiBzb3VyY2UgbGljZW5zZSBpbmZvcm1hdGlvbiBpcyBpbiB0aGUgemxpYi5hZHMgZmlsZS4gIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLQorLS0gICRJZDogYnVmZmVyX2RlbW8uYWRiLHYgMS4zIDIwMDQvMDkvMDYgMDY6NTU6MzUgdmFndWwgRXhwICQKKworLS0gIFRoaXMgZGVtbyBwcm9ncmFtIHByb3ZpZGVkIGJ5IERyIFN0ZXZlIFNhbmd3aW5lIDxzanNAZXNzZXguYWMudWs+CistLQorLS0gIERlbW9uc3RyYXRpb24gb2YgYSBwcm9ibGVtIHdpdGggWmxpYi1BZGEgKGFscmVhZHkgZml4ZWQpIHdoZW4gYSBidWZmZXIKKy0tICBvZiBleGFjdGx5IHRoZSBjb3JyZWN0IHNpemUgaXMgdXNlZCBmb3IgZGVjb21wcmVzc2VkIGRhdGEsIGFuZCB0aGUgbGFzdAorLS0gIGZldyBieXRlcyBwYXNzZWQgaW4gdG8gWmxpYiBhcmUgY2hlY2tzdW0gYnl0ZXMuCisKKy0tICBUaGlzIHByb2dyYW0gY29tcHJlc3NlcyBhIHN0cmluZyBvZiB0ZXh0LCBhbmQgdGhlbiBkZWNvbXByZXNzZXMgdGhlCistLSAgY29tcHJlc3NlZCB0ZXh0IGludG8gYSBidWZmZXIgb2YgdGhlIHNhbWUgc2l6ZSBhcyB0aGUgb3JpZ2luYWwgdGV4dC4KKword2l0aCBBZGEuU3RyZWFtczsgdXNlIEFkYS5TdHJlYW1zOword2l0aCBBZGEuVGV4dF9JTzsKKword2l0aCBaTGliOyB1c2UgWkxpYjsKKworcHJvY2VkdXJlIEJ1ZmZlcl9EZW1vIGlzCisgICBFT0wgIDogQ2hhcmFjdGVyIHJlbmFtZXMgQVNDSUkuTEY7CisgICBUZXh0IDogY29uc3RhbnQgU3RyaW5nCisgICAgIDo9ICJGb3VyIHNjb3JlIGFuZCBzZXZlbiB5ZWFycyBhZ28gb3VyIGZhdGhlcnMgYnJvdWdodCBmb3J0aCwiICYgRU9MICYKKyAgICAgICAgInVwb24gdGhpcyBjb250aW5lbnQsIGEgbmV3IG5hdGlvbiwgY29uY2VpdmVkIGluIGxpYmVydHksIiAmIEVPTCAmCisgICAgICAgICJhbmQgZGVkaWNhdGVkIHRvIHRoZSBwcm9wb3NpdGlvbiB0aGF0IGBhbGwgbWVuIGFyZSBjcmVhdGVkIGVxdWFsJy4iOworCisgICBTb3VyY2UgOiBTdHJlYW1fRWxlbWVudF9BcnJheSAoMSAuLiBUZXh0J0xlbmd0aCk7CisgICBmb3IgU291cmNlJ0FkZHJlc3MgdXNlIFRleHQnQWRkcmVzczsKKworYmVnaW4KKyAgIEFkYS5UZXh0X0lPLlB1dCAoVGV4dCk7CisgICBBZGEuVGV4dF9JTy5OZXdfTGluZTsKKyAgIEFkYS5UZXh0X0lPLlB1dF9MaW5lCisgICAgICgiVW5jb21wcmVzc2VkIHNpemUgOiAiICYgUG9zaXRpdmUnSW1hZ2UgKFRleHQnTGVuZ3RoKSAmICIgYnl0ZXMiKTsKKworICAgZGVjbGFyZQorICAgICAgQ29tcHJlc3NlZF9EYXRhIDogU3RyZWFtX0VsZW1lbnRfQXJyYXkgKDEgLi4gVGV4dCdMZW5ndGgpOworICAgICAgTCAgICAgICAgICAgICAgIDogU3RyZWFtX0VsZW1lbnRfT2Zmc2V0OworICAgYmVnaW4KKyAgICAgIENvbXByZXNzIDogZGVjbGFyZQorICAgICAgICAgQ29tcHJlc3NvciA6IEZpbHRlcl9UeXBlOworICAgICAgICAgSSA6IFN0cmVhbV9FbGVtZW50X09mZnNldDsKKyAgICAgIGJlZ2luCisgICAgICAgICBEZWZsYXRlX0luaXQgKENvbXByZXNzb3IpOworCisgICAgICAgICAtLSAgQ29tcHJlc3MgdGhlIHdob2xlIG9mIFQgYXQgb25jZS4KKworICAgICAgICAgVHJhbnNsYXRlIChDb21wcmVzc29yLCBTb3VyY2UsIEksIENvbXByZXNzZWRfRGF0YSwgTCwgRmluaXNoKTsKKyAgICAgICAgIHByYWdtYSBBc3NlcnQgKEkgPSBTb3VyY2UnTGFzdCk7CisKKyAgICAgICAgIENsb3NlIChDb21wcmVzc29yKTsKKworICAgICAgICAgQWRhLlRleHRfSU8uUHV0X0xpbmUKKyAgICAgICAgICAgKCJDb21wcmVzc2VkIHNpemUgOiAgICIKKyAgICAgICAgICAgICYgU3RyZWFtX0VsZW1lbnRfT2Zmc2V0J0ltYWdlIChMKSAmICIgYnl0ZXMiKTsKKyAgICAgIGVuZCBDb21wcmVzczsKKworICAgICAgLS0gIE5vdyB3ZSBkZWNvbXByZXNzIHRoZSBkYXRhLCBwYXNzaW5nIHNob3J0IGJsb2NrcyBvZiBkYXRhIHRvIFpsaWIKKyAgICAgIC0tICAoYmVjYXVzZSB0aGlzIGRlbW9uc3RyYXRlcyB0aGUgcHJvYmxlbSAtIHRoZSBsYXN0IGJsb2NrIHBhc3NlZCB3aWxsCisgICAgICAtLSAgY29udGFpbiBjaGVja3N1bSBpbmZvcm1hdGlvbiBhbmQgdGhlcmUgd2lsbCBiZSBubyBvdXRwdXQsIG9ubHkgYQorICAgICAgLS0gIGNoZWNrIGluc2lkZSBabGliIHRoYXQgdGhlIGNoZWNrc3VtIGlzIGNvcnJlY3QpLgorCisgICAgICBEZWNvbXByZXNzIDogZGVjbGFyZQorICAgICAgICAgRGVjb21wcmVzc29yIDogRmlsdGVyX1R5cGU7CisKKyAgICAgICAgIFVuY29tcHJlc3NlZF9EYXRhIDogU3RyZWFtX0VsZW1lbnRfQXJyYXkgKDEgLi4gVGV4dCdMZW5ndGgpOworCisgICAgICAgICBCbG9ja19TaXplIDogY29uc3RhbnQgOj0gNDsKKyAgICAgICAgIC0tICBUaGlzIG1ha2VzIHN1cmUgdGhhdCB0aGUgbGFzdCBibG9jayBjb250YWlucworICAgICAgICAgLS0gIG9ubHkgQWRsZXIgY2hlY2tzdW0gZGF0YS4KKworICAgICAgICAgUCA6IFN0cmVhbV9FbGVtZW50X09mZnNldCA6PSBDb21wcmVzc2VkX0RhdGEnRmlyc3QgLSAxOworICAgICAgICAgTyA6IFN0cmVhbV9FbGVtZW50X09mZnNldDsKKyAgICAgIGJlZ2luCisgICAgICAgICBJbmZsYXRlX0luaXQgKERlY29tcHJlc3Nvcik7CisKKyAgICAgICAgIGxvb3AKKyAgICAgICAgICAgIFRyYW5zbGF0ZQorICAgICAgICAgICAgICAoRGVjb21wcmVzc29yLAorICAgICAgICAgICAgICAgQ29tcHJlc3NlZF9EYXRhCisgICAgICAgICAgICAgICAgIChQICsgMSAuLiBTdHJlYW1fRWxlbWVudF9PZmZzZXQnTWluIChQICsgQmxvY2tfU2l6ZSwgTCkpLAorICAgICAgICAgICAgICAgUCwKKyAgICAgICAgICAgICAgIFVuY29tcHJlc3NlZF9EYXRhCisgICAgICAgICAgICAgICAgIChUb3RhbF9PdXQgKERlY29tcHJlc3NvcikgKyAxIC4uIFVuY29tcHJlc3NlZF9EYXRhJ0xhc3QpLAorICAgICAgICAgICAgICAgTywKKyAgICAgICAgICAgICAgIE5vX0ZsdXNoKTsKKworICAgICAgICAgICAgICAgQWRhLlRleHRfSU8uUHV0X0xpbmUKKyAgICAgICAgICAgICAgICAgKCJUb3RhbCBpbiA6ICIgJiBDb3VudCdJbWFnZSAoVG90YWxfSW4gKERlY29tcHJlc3NvcikpICYKKyAgICAgICAgICAgICAgICAgICIsIG91dCA6ICIgJiBDb3VudCdJbWFnZSAoVG90YWxfT3V0IChEZWNvbXByZXNzb3IpKSk7CisKKyAgICAgICAgICAgICAgIGV4aXQgd2hlbiBQID0gTDsKKyAgICAgICAgIGVuZCBsb29wOworCisgICAgICAgICBBZGEuVGV4dF9JTy5OZXdfTGluZTsKKyAgICAgICAgIEFkYS5UZXh0X0lPLlB1dF9MaW5lCisgICAgICAgICAgICgiRGVjb21wcmVzc2VkIHRleHQgbWF0Y2hlcyBvcmlnaW5hbCB0ZXh0IDogIgorICAgICAgICAgICAgICYgQm9vbGVhbidJbWFnZSAoVW5jb21wcmVzc2VkX0RhdGEgPSBTb3VyY2UpKTsKKyAgICAgIGVuZCBEZWNvbXByZXNzOworICAgZW5kOworZW5kIEJ1ZmZlcl9EZW1vOwpkaWZmIC0tZ2l0IGEvemxpYi0xLjIuNi9jb250cmliL2FkYS9tdGVzdC5hZGIgYi96bGliLTEuMi42L2NvbnRyaWIvYWRhL210ZXN0LmFkYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGRmZDA4Ci0tLSAvZGV2L251bGwKKysrIGIvemxpYi0xLjIuNi9jb250cmliL2FkYS9tdGVzdC5hZGIKQEAgLTAsMCArMSwxNTYgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tICBaTGliIGZvciBBZGEgdGhpY2sgYmluZGluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICBDb3B5cmlnaHQgKEMpIDIwMDItMjAwMyBEbWl0cml5IEFuaXNpbWtvdiAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICBPcGVuIHNvdXJjZSBsaWNlbnNlIGluZm9ybWF0aW9uIGlzIGluIHRoZSB6bGliLmFkcyBmaWxlLiAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tICBDb250aW51b3VzIHRlc3QgZm9yIFpMaWIgbXVsdGl0aHJlYWRpbmcuIElmIHRoZSB0ZXN0IHdvdWxkIGZhaWwKKy0tICB3ZSBzaG91bGQgcHJvdmlkZSB0aHJlYWQgc2FmZSBhbGxvY2F0aW9uIHJvdXRpbmVzIGZvciB0aGUgWl9TdHJlYW0uCistLQorLS0gICRJZDogbXRlc3QuYWRiLHYgMS40IDIwMDQvMDcvMjMgMDc6NDk6NTQgdmFndWwgRXhwICQKKword2l0aCBaTGliOword2l0aCBBZGEuU3RyZWFtczsKK3dpdGggQWRhLk51bWVyaWNzLkRpc2NyZXRlX1JhbmRvbTsKK3dpdGggQWRhLlRleHRfSU87Cit3aXRoIEFkYS5FeGNlcHRpb25zOword2l0aCBBZGEuVGFza19JZGVudGlmaWNhdGlvbjsKKworcHJvY2VkdXJlIE1UZXN0IGlzCisgICB1c2UgQWRhLlN0cmVhbXM7CisgICB1c2UgWkxpYjsKKworICAgU3RvcCA6IEJvb2xlYW4gOj0gRmFsc2U7CisKKyAgIHByYWdtYSBBdG9taWMgKFN0b3ApOworCisgICBzdWJ0eXBlIFZpc2libGVfU3ltYm9scyBpcyBTdHJlYW1fRWxlbWVudCByYW5nZSAxNiMyMCMgLi4gMTYjN0UjOworCisgICBwYWNrYWdlIFJhbmRvbV9FbGVtZW50cyBpcworICAgICAgbmV3IEFkYS5OdW1lcmljcy5EaXNjcmV0ZV9SYW5kb20gKFZpc2libGVfU3ltYm9scyk7CisKKyAgIHRhc2sgdHlwZSBUZXN0X1Rhc2s7CisKKyAgIHRhc2sgYm9keSBUZXN0X1Rhc2sgaXMKKyAgICAgIEJ1ZmZlciA6IFN0cmVhbV9FbGVtZW50X0FycmF5ICgxIC4uIDEwMF8wMDApOworICAgICAgR2VuIDogUmFuZG9tX0VsZW1lbnRzLkdlbmVyYXRvcjsKKworICAgICAgQnVmZmVyX0ZpcnN0ICA6IFN0cmVhbV9FbGVtZW50X09mZnNldDsKKyAgICAgIENvbXBhcmVfRmlyc3QgOiBTdHJlYW1fRWxlbWVudF9PZmZzZXQ7CisKKyAgICAgIERlZmxhdGUgOiBGaWx0ZXJfVHlwZTsKKyAgICAgIEluZmxhdGUgOiBGaWx0ZXJfVHlwZTsKKworICAgICAgcHJvY2VkdXJlIEZ1cnRoZXIgKEl0ZW0gOiBpbiBTdHJlYW1fRWxlbWVudF9BcnJheSk7CisKKyAgICAgIHByb2NlZHVyZSBSZWFkX0J1ZmZlcgorICAgICAgICAoSXRlbSA6IG91dCBBZGEuU3RyZWFtcy5TdHJlYW1fRWxlbWVudF9BcnJheTsKKyAgICAgICAgIExhc3QgOiBvdXQgQWRhLlN0cmVhbXMuU3RyZWFtX0VsZW1lbnRfT2Zmc2V0KTsKKworICAgICAgLS0tLS0tLS0tLS0tLQorICAgICAgLS0gRnVydGhlciAtLQorICAgICAgLS0tLS0tLS0tLS0tLQorCisgICAgICBwcm9jZWR1cmUgRnVydGhlciAoSXRlbSA6IGluIFN0cmVhbV9FbGVtZW50X0FycmF5KSBpcworCisgICAgICAgICBwcm9jZWR1cmUgQ29tcGFyZSAoSXRlbSA6IGluIFN0cmVhbV9FbGVtZW50X0FycmF5KTsKKworICAgICAgICAgLS0tLS0tLS0tLS0tLQorICAgICAgICAgLS0gQ29tcGFyZSAtLQorICAgICAgICAgLS0tLS0tLS0tLS0tLQorCisgICAgICAgICBwcm9jZWR1cmUgQ29tcGFyZSAoSXRlbSA6IGluIFN0cmVhbV9FbGVtZW50X0FycmF5KSBpcworICAgICAgICAgICAgTmV4dF9GaXJzdCA6IFN0cmVhbV9FbGVtZW50X09mZnNldCA6PSBDb21wYXJlX0ZpcnN0ICsgSXRlbSdMZW5ndGg7CisgICAgICAgICBiZWdpbgorICAgICAgICAgICAgaWYgQnVmZmVyIChDb21wYXJlX0ZpcnN0IC4uIE5leHRfRmlyc3QgLSAxKSAvPSBJdGVtIHRoZW4KKyAgICAgICAgICAgICAgIHJhaXNlIFByb2dyYW1fRXJyb3I7CisgICAgICAgICAgICBlbmQgaWY7CisKKyAgICAgICAgICAgIENvbXBhcmVfRmlyc3QgOj0gTmV4dF9GaXJzdDsKKyAgICAgICAgIGVuZCBDb21wYXJlOworCisgICAgICAgICBwcm9jZWR1cmUgQ29tcGFyZV9Xcml0ZSBpcyBuZXcgWkxpYi5Xcml0ZSAoV3JpdGUgPT4gQ29tcGFyZSk7CisgICAgICBiZWdpbgorICAgICAgICAgQ29tcGFyZV9Xcml0ZSAoSW5mbGF0ZSwgSXRlbSwgTm9fRmx1c2gpOworICAgICAgZW5kIEZ1cnRoZXI7CisKKyAgICAgIC0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAtLSBSZWFkX0J1ZmZlciAtLQorICAgICAgLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgcHJvY2VkdXJlIFJlYWRfQnVmZmVyCisgICAgICAgIChJdGVtIDogb3V0IEFkYS5TdHJlYW1zLlN0cmVhbV9FbGVtZW50X0FycmF5OworICAgICAgICAgTGFzdCA6IG91dCBBZGEuU3RyZWFtcy5TdHJlYW1fRWxlbWVudF9PZmZzZXQpCisgICAgICBpcworICAgICAgICAgQnVmZl9EaWZmICAgOiBTdHJlYW1fRWxlbWVudF9PZmZzZXQgOj0gQnVmZmVyJ0xhc3QgLSBCdWZmZXJfRmlyc3Q7CisgICAgICAgICBOZXh0X0ZpcnN0IDogU3RyZWFtX0VsZW1lbnRfT2Zmc2V0OworICAgICAgYmVnaW4KKyAgICAgICAgIGlmIEl0ZW0nTGVuZ3RoIDw9IEJ1ZmZfRGlmZiB0aGVuCisgICAgICAgICAgICBMYXN0IDo9IEl0ZW0nTGFzdDsKKworICAgICAgICAgICAgTmV4dF9GaXJzdCA6PSBCdWZmZXJfRmlyc3QgKyBJdGVtJ0xlbmd0aDsKKworICAgICAgICAgICAgSXRlbSA6PSBCdWZmZXIgKEJ1ZmZlcl9GaXJzdCAuLiBOZXh0X0ZpcnN0IC0gMSk7CisKKyAgICAgICAgICAgIEJ1ZmZlcl9GaXJzdCA6PSBOZXh0X0ZpcnN0OworICAgICAgICAgZWxzZQorICAgICAgICAgICAgTGFzdCA6PSBJdGVtJ0ZpcnN0ICsgQnVmZl9EaWZmOworICAgICAgICAgICAgSXRlbSAoSXRlbSdGaXJzdCAuLiBMYXN0KSA6PSBCdWZmZXIgKEJ1ZmZlcl9GaXJzdCAuLiBCdWZmZXInTGFzdCk7CisgICAgICAgICAgICBCdWZmZXJfRmlyc3QgOj0gQnVmZmVyJ0xhc3QgKyAxOworICAgICAgICAgZW5kIGlmOworICAgICAgZW5kIFJlYWRfQnVmZmVyOworCisgICAgICBwcm9jZWR1cmUgVHJhbnNsYXRlIGlzIG5ldyBHZW5lcmljX1RyYW5zbGF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRGF0YV9JbiAgPT4gUmVhZF9CdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhX091dCA9PiBGdXJ0aGVyKTsKKworICAgYmVnaW4KKyAgICAgIFJhbmRvbV9FbGVtZW50cy5SZXNldCAoR2VuKTsKKworICAgICAgQnVmZmVyIDo9IChvdGhlcnMgPT4gMjApOworCisgICAgICBNYWluIDogbG9vcAorICAgICAgICAgZm9yIEogaW4gQnVmZmVyJ1JhbmdlIGxvb3AKKyAgICAgICAgICAgIEJ1ZmZlciAoSikgOj0gUmFuZG9tX0VsZW1lbnRzLlJhbmRvbSAoR2VuKTsKKworICAgICAgICAgICAgRGVmbGF0ZV9Jbml0IChEZWZsYXRlKTsKKyAgICAgICAgICAgIEluZmxhdGVfSW5pdCAoSW5mbGF0ZSk7CisKKyAgICAgICAgICAgIEJ1ZmZlcl9GaXJzdCAgOj0gQnVmZmVyJ0ZpcnN0OworICAgICAgICAgICAgQ29tcGFyZV9GaXJzdCA6PSBCdWZmZXInRmlyc3Q7CisKKyAgICAgICAgICAgIFRyYW5zbGF0ZSAoRGVmbGF0ZSk7CisKKyAgICAgICAgICAgIGlmIENvbXBhcmVfRmlyc3QgLz0gQnVmZmVyJ0xhc3QgKyAxIHRoZW4KKyAgICAgICAgICAgICAgIHJhaXNlIFByb2dyYW1fRXJyb3I7CisgICAgICAgICAgICBlbmQgaWY7CisKKyAgICAgICAgICAgIEFkYS5UZXh0X0lPLlB1dF9MaW5lCisgICAgICAgICAgICAgIChBZGEuVGFza19JZGVudGlmaWNhdGlvbi5JbWFnZQorICAgICAgICAgICAgICAgICAoQWRhLlRhc2tfSWRlbnRpZmljYXRpb24uQ3VycmVudF9UYXNrKQorICAgICAgICAgICAgICAgJiBTdHJlYW1fRWxlbWVudF9PZmZzZXQnSW1hZ2UgKEopCisgICAgICAgICAgICAgICAmIFpMaWIuQ291bnQnSW1hZ2UgKFRvdGFsX091dCAoRGVmbGF0ZSkpKTsKKworICAgICAgICAgICAgQ2xvc2UgKERlZmxhdGUpOworICAgICAgICAgICAgQ2xvc2UgKEluZmxhdGUpOworCisgICAgICAgICAgICBleGl0IE1haW4gd2hlbiBTdG9wOworICAgICAgICAgZW5kIGxvb3A7CisgICAgICBlbmQgbG9vcCBNYWluOworICAgZXhjZXB0aW9uCisgICAgICB3aGVuIEUgOiBvdGhlcnMgPT4KKyAgICAgICAgIEFkYS5UZXh0X0lPLlB1dF9MaW5lIChBZGEuRXhjZXB0aW9ucy5FeGNlcHRpb25fSW5mb3JtYXRpb24gKEUpKTsKKyAgICAgICAgIFN0b3AgOj0gVHJ1ZTsKKyAgIGVuZCBUZXN0X1Rhc2s7CisKKyAgIFRlc3QgOiBhcnJheSAoMSAuLiA0KSBvZiBUZXN0X1Rhc2s7CisKKyAgIHByYWdtYSBVbnJlZmVyZW5jZWQgKFRlc3QpOworCisgICBEdW1teSA6IENoYXJhY3RlcjsKKworYmVnaW4KKyAgIEFkYS5UZXh0X0lPLkdldF9JbW1lZGlhdGUgKER1bW15KTsKKyAgIFN0b3AgOj0gVHJ1ZTsKK2VuZCBNVGVzdDsKZGlmZiAtLWdpdCBhL3psaWItMS4yLjYvY29udHJpYi9hZGEvcmVhZC5hZGIgYi96bGliLTEuMi42L2NvbnRyaWIvYWRhL3JlYWQuYWRiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmMmVmYmYKLS0tIC9kZXYvbnVsbAorKysgYi96bGliLTEuMi42L2NvbnRyaWIvYWRhL3JlYWQuYWRiCkBAIC0wLDAgKzEsMTU2IEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSAgWkxpYiBmb3IgQWRhIHRoaWNrIGJpbmRpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgQ29weXJpZ2h0IChDKSAyMDAyLTIwMDMgRG1pdHJpeSBBbmlzaW1rb3YgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgT3BlbiBzb3VyY2UgbGljZW5zZSBpbmZvcm1hdGlvbiBpcyBpbiB0aGUgemxpYi5hZHMgZmlsZS4gIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0tICAkSWQ6IHJlYWQuYWRiLHYgMS44IDIwMDQvMDUvMzEgMTA6NTM6NDAgdmFndWwgRXhwICQKKworLS0gIFRlc3QvZGVtbyBwcm9ncmFtIGZvciB0aGUgZ2VuZXJpYyByZWFkIGludGVyZmFjZS4KKword2l0aCBBZGEuTnVtZXJpY3MuRGlzY3JldGVfUmFuZG9tOword2l0aCBBZGEuU3RyZWFtczsKK3dpdGggQWRhLlRleHRfSU87CisKK3dpdGggWkxpYjsKKworcHJvY2VkdXJlIFJlYWQgaXMKKworICAgdXNlIEFkYS5TdHJlYW1zOworCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIC0tICBUZXN0IGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyAtLQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgIEZpbGVfU2l6ZSAgIDogU3RyZWFtX0VsZW1lbnRfT2Zmc2V0IDo9IDEwMF8wMDA7CisKKyAgIENvbnRpbnVvdXMgIDogY29uc3RhbnQgQm9vbGVhbiAgICAgICAgICA6PSBGYWxzZTsKKyAgIC0tICBJZiB0aGlzIGNvbnN0YW50IGlzIFRydWUsIHRoZSB0ZXN0IHdvdWxkIGJlIHJlcGVhdGVkIGFnYWluIGFuZCBhZ2FpbiwKKyAgIC0tICB3aXRoIGluY3JlbWVudCBGaWxlX1NpemUgZm9yIGV2ZXJ5IGl0ZXJhdGlvbi4KKworICAgSGVhZGVyICAgICAgOiBjb25zdGFudCBaTGliLkhlYWRlcl9UeXBlIDo9IFpMaWIuRGVmYXVsdDsKKyAgIC0tICBEbyBub3QgdXNlIEhlYWRlciBvdGhlciB0aGFuIERlZmF1bHQgaW4gWkxpYiB2ZXJzaW9ucyAxLjEuNCBhbmQgb2xkZXIuCisKKyAgIEluaXRfUmFuZG9tIDogY29uc3RhbnQgOj0gODsKKyAgIC0tICBXZSBhcmUgdXNpbmcgdGhlIHNhbWUgcmFuZG9tIHNlcXVlbmNlLCBpbiBjYXNlIG9mIHdlIGNhdGNoIGJ1ZywKKyAgIC0tICBzbyB3ZSB3b3VsZCBiZSBhYmxlIHRvIHJlcHJvZHVjZSBpdC4KKworICAgLS0gRW5kIC0tCisKKyAgIFBhY2tfU2l6ZSA6IFN0cmVhbV9FbGVtZW50X09mZnNldDsKKyAgIE9mZnNldCAgICA6IFN0cmVhbV9FbGVtZW50X09mZnNldDsKKworICAgRmlsdGVyICAgICA6IFpMaWIuRmlsdGVyX1R5cGU7CisKKyAgIHN1YnR5cGUgVmlzaWJsZV9TeW1ib2xzCisgICAgICBpcyBTdHJlYW1fRWxlbWVudCByYW5nZSAxNiMyMCMgLi4gMTYjN0UjOworCisgICBwYWNrYWdlIFJhbmRvbV9FbGVtZW50cyBpcyBuZXcKKyAgICAgIEFkYS5OdW1lcmljcy5EaXNjcmV0ZV9SYW5kb20gKFZpc2libGVfU3ltYm9scyk7CisKKyAgIEdlbiA6IFJhbmRvbV9FbGVtZW50cy5HZW5lcmF0b3I7CisgICBQZXJpb2QgIDogY29uc3RhbnQgU3RyZWFtX0VsZW1lbnRfT2Zmc2V0IDo9IDIwMDsKKyAgIC0tICBQZXJpb2QgY29uc3RhbnQgdmFyaWFibGUgZm9yIHJhbmRvbSBnZW5lcmF0b3Igbm90IHRvIGJlIHZlcnkgcmFuZG9tLgorICAgLS0gIEJpZ2dlciBwZXJpb2QsIGhhcmRlciByYW5kb20uCisKKyAgIFJlYWRfQnVmZmVyIDogU3RyZWFtX0VsZW1lbnRfQXJyYXkgKDEgLi4gMjA0OCk7CisgICBSZWFkX0ZpcnN0ICA6IFN0cmVhbV9FbGVtZW50X09mZnNldDsKKyAgIFJlYWRfTGFzdCAgIDogU3RyZWFtX0VsZW1lbnRfT2Zmc2V0OworCisgICBwcm9jZWR1cmUgUmVzZXQ7CisKKyAgIHByb2NlZHVyZSBSZWFkCisgICAgIChJdGVtIDogb3V0IFN0cmVhbV9FbGVtZW50X0FycmF5OworICAgICAgTGFzdCA6IG91dCBTdHJlYW1fRWxlbWVudF9PZmZzZXQpOworICAgLS0gIHRoaXMgcHJvY2VkdXJlIGlzIGZvciBnZW5lcmljIGluc3RhbnRpYXRpb24gb2YKKyAgIC0tICBaTGliLlJlYWQKKyAgIC0tICByZWFkaW5nIGRhdGEgZnJvbSB0aGUgRmlsZV9Jbi4KKworICAgcHJvY2VkdXJlIFJlYWQgaXMgbmV3IFpMaWIuUmVhZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKFJlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVhZF9CdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzdF9GaXJzdCA9PiBSZWFkX0ZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc3RfTGFzdCAgPT4gUmVhZF9MYXN0KTsKKworICAgLS0tLS0tLS0tLQorICAgLS0gUmVhZCAtLQorICAgLS0tLS0tLS0tLQorCisgICBwcm9jZWR1cmUgUmVhZAorICAgICAoSXRlbSA6IG91dCBTdHJlYW1fRWxlbWVudF9BcnJheTsKKyAgICAgIExhc3QgOiBvdXQgU3RyZWFtX0VsZW1lbnRfT2Zmc2V0KSBpcworICAgYmVnaW4KKyAgICAgIExhc3QgOj0gU3RyZWFtX0VsZW1lbnRfT2Zmc2V0J01pbgorICAgICAgICAgICAgICAgKEl0ZW0nTGFzdCwKKyAgICAgICAgICAgICAgICBJdGVtJ0ZpcnN0ICsgRmlsZV9TaXplIC0gT2Zmc2V0KTsKKworICAgICAgZm9yIEogaW4gSXRlbSdGaXJzdCAuLiBMYXN0IGxvb3AKKyAgICAgICAgIGlmIEogPCBJdGVtJ0ZpcnN0ICsgUGVyaW9kIHRoZW4KKyAgICAgICAgICAgIEl0ZW0gKEopIDo9IFJhbmRvbV9FbGVtZW50cy5SYW5kb20gKEdlbik7CisgICAgICAgICBlbHNlCisgICAgICAgICAgICBJdGVtIChKKSA6PSBJdGVtIChKIC0gUGVyaW9kKTsKKyAgICAgICAgIGVuZCBpZjsKKworICAgICAgICAgT2Zmc2V0ICAgOj0gT2Zmc2V0ICsgMTsKKyAgICAgIGVuZCBsb29wOworICAgZW5kIFJlYWQ7CisKKyAgIC0tLS0tLS0tLS0tCisgICAtLSBSZXNldCAtLQorICAgLS0tLS0tLS0tLS0KKworICAgcHJvY2VkdXJlIFJlc2V0IGlzCisgICBiZWdpbgorICAgICAgUmFuZG9tX0VsZW1lbnRzLlJlc2V0IChHZW4sIEluaXRfUmFuZG9tKTsKKyAgICAgIFBhY2tfU2l6ZSA6PSAwOworICAgICAgT2Zmc2V0IDo9IDE7CisgICAgICBSZWFkX0ZpcnN0IDo9IFJlYWRfQnVmZmVyJ0xhc3QgKyAxOworICAgICAgUmVhZF9MYXN0ICA6PSBSZWFkX0J1ZmZlcidMYXN0OworICAgZW5kIFJlc2V0OworCitiZWdpbgorICAgQWRhLlRleHRfSU8uUHV0X0xpbmUgKCJaTGliICIgJiBaTGliLlZlcnNpb24pOworCisgICBsb29wCisgICAgICBmb3IgTGV2ZWwgaW4gWkxpYi5Db21wcmVzc2lvbl9MZXZlbCdSYW5nZSBsb29wCisKKyAgICAgICAgIEFkYS5UZXh0X0lPLlB1dCAoIkxldmVsID0iCisgICAgICAgICAgICAmIFpMaWIuQ29tcHJlc3Npb25fTGV2ZWwnSW1hZ2UgKExldmVsKSk7CisKKyAgICAgICAgIC0tICBEZWZsYXRlIHVzaW5nIGdlbmVyaWMgaW5zdGFudGlhdGlvbi4KKworICAgICAgICAgWkxpYi5EZWZsYXRlX0luaXQKKyAgICAgICAgICAgICAgIChGaWx0ZXIsCisgICAgICAgICAgICAgICAgTGV2ZWwsCisgICAgICAgICAgICAgICAgSGVhZGVyID0+IEhlYWRlcik7CisKKyAgICAgICAgIFJlc2V0OworCisgICAgICAgICBBZGEuVGV4dF9JTy5QdXQKKyAgICAgICAgICAgKFN0cmVhbV9FbGVtZW50X09mZnNldCdJbWFnZSAoRmlsZV9TaXplKSAmICIgLT4iKTsKKworICAgICAgICAgbG9vcAorICAgICAgICAgICAgZGVjbGFyZQorICAgICAgICAgICAgICAgQnVmZmVyIDogU3RyZWFtX0VsZW1lbnRfQXJyYXkgKDEgLi4gMTAyNCk7CisgICAgICAgICAgICAgICBMYXN0ICAgOiBTdHJlYW1fRWxlbWVudF9PZmZzZXQ7CisgICAgICAgICAgICBiZWdpbgorICAgICAgICAgICAgICAgUmVhZCAoRmlsdGVyLCBCdWZmZXIsIExhc3QpOworCisgICAgICAgICAgICAgICBQYWNrX1NpemUgOj0gUGFja19TaXplICsgTGFzdCAtIEJ1ZmZlcidGaXJzdCArIDE7CisKKyAgICAgICAgICAgICAgIGV4aXQgd2hlbiBMYXN0IDwgQnVmZmVyJ0xhc3Q7CisgICAgICAgICAgICBlbmQ7CisgICAgICAgICBlbmQgbG9vcDsKKworICAgICAgICAgQWRhLlRleHRfSU8uUHV0X0xpbmUgKFN0cmVhbV9FbGVtZW50X09mZnNldCdJbWFnZSAoUGFja19TaXplKSk7CisKKyAgICAgICAgIFpMaWIuQ2xvc2UgKEZpbHRlcik7CisgICAgICBlbmQgbG9vcDsKKworICAgICAgZXhpdCB3aGVuIG5vdCBDb250aW51b3VzOworCisgICAgICBGaWxlX1NpemUgOj0gRmlsZV9TaXplICsgMTsKKyAgIGVuZCBsb29wOworZW5kIFJlYWQ7CmRpZmYgLS1naXQgYS96bGliLTEuMi42L2NvbnRyaWIvYWRhL3JlYWRtZS50eHQgYi96bGliLTEuMi42L2NvbnRyaWIvYWRhL3JlYWRtZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U0ZDJjYQotLS0gL2Rldi9udWxsCisrKyBiL3psaWItMS4yLjYvY29udHJpYi9hZGEvcmVhZG1lLnR4dApAQCAtMCwwICsxLDY1IEBACisgICAgICAgICAgICAgICAgICAgICAgICBaTGliIGZvciBBZGEgdGhpY2sgYmluZGluZyAoWkxpYi5BZGEpCisgICAgICAgICAgICAgICAgICAgICAgICBSZWxlYXNlIDEuMworCitaTGliLkFkYSBpcyBhIHRoaWNrIGJpbmRpbmcgaW50ZXJmYWNlIHRvIHRoZSBwb3B1bGFyIFpMaWIgZGF0YQorY29tcHJlc3Npb24gbGlicmFyeSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZ3ppcC5vcmcvemxpYi8uCitJdCBwcm92aWRlcyBBZGEtc3R5bGUgYWNjZXNzIHRvIHRoZSBaTGliIEMgbGlicmFyeS4KKworCisgICAgICAgIEhlcmUgYXJlIHRoZSBtYWluIGNoYW5nZXMgc2luY2UgWkxpYi5BZGEgMS4yOgorCistIEF0dGVuc2lvbjogWkxpYi5SZWFkIGdlbmVyaWMgcm91dGluZSBoYXZlIGEgaW5pdGlhbGl6YXRpb24gcmVxdWlyZW1lbnQKKyAgZm9yIFJlYWRfTGFzdCBwYXJhbWV0ZXIgbm93LiBJdCBpcyBhIGJpdCBpbmNvbXBhcnRpYmxlIHdpdGggcHJldmlvdXMgdmVyc2lvbiwKKyAgYnV0IGV4dGVuZHMgZnVuY3Rpb25hbGl0eSwgd2UgY291bGQgdXNlIG5ldyBwYXJhbWV0ZXJzIEFsbG93X1JlYWRfU29tZSBhbmQKKyAgRmx1c2ggbm93LgorCistIEFkZGVkIElzX09wZW4gcm91dGluZXMgdG8gWkxpYiBhbmQgWkxpYi5TdHJlYW1zIHBhY2thZ2VzLgorCistIEFkZCBwcmFnbWEgQXNzZXJ0IHRvIGNoZWNrIFN0cmVhbV9FbGVtZW50IGlzIDggYml0LgorCistIEZpeCBleHRyYWN0aW9uIHRvIGJ1ZmZlciB3aXRoIGV4YWN0IGtub3duIGRlY29tcHJlc3NlZCBzaXplLiBFcnJvciByZXBvcnRlZCBieQorICBTdGV2ZSBTYW5nd2luZS4KKworLSBGaXggZGVmaW5pdGlvbiBvZiBVTG9uZyAoY2hhbmdlZCB0byB1bnNpZ25lZF9sb25nKSwgZml4IHJlZ3Jlc3Npb24gb24gNjQgYml0cworICBjb21wdXRlcnMuIFBhdGNoIHByb3ZpZGVkIGJ5IFBhc2NhbCBPYnJ5LgorCistIEFkZCBTdGF0dXNfRXJyb3IgZXhjZXB0aW9uIGRlZmluaXRpb24uCisKKy0gQWRkIHByYWdtYSBBc3NlcnRpb24gdGhhdCBBZGEuU3RyZWFtcy5TdHJlYW1fRWxlbWVudCBzaXplIGlzIDggYml0LgorCisKKyAgICAgICAgSG93IHRvIGJ1aWxkIFpMaWIuQWRhIHVuZGVyIEdOQVQKKworWW91IHNob3VsZCBoYXZlIHRoZSBaTGliIGxpYnJhcnkgYWxyZWFkeSBidWlsZCBvbiB5b3VyIGNvbXB1dGVyLCBiZWZvcmUKK2J1aWxkaW5nIFpMaWIuQWRhLiBNYWtlIHRoZSBkaXJlY3Rvcnkgb2YgWkxpYi5BZGEgc291cmNlcyBjdXJyZW50IGFuZAoraXNzdWUgdGhlIGNvbW1hbmQ6CisKKyAgZ25hdG1ha2UgdGVzdCAtbGFyZ3MgLUw8ZGlyZWN0b3J5IHdoZXJlIGxpYnouYSBpcz4gLWx6CisKK09yIHVzZSB0aGUgR05BVCBwcm9qZWN0IGZpbGUgYnVpbGQgZm9yIEdOQVQgMy4xNSBvciBsYXRlcjoKKworICBnbmF0bWFrZSAtUHpsaWIuZ3ByIC1MPGRpcmVjdG9yeSB3aGVyZSBsaWJ6LmEgaXM+CisKKworICAgICAgICBIb3cgdG8gYnVpbGQgWkxpYi5BZGEgdW5kZXIgQW9uaXggT2JqZWN0QWRhIGZvciBXaW4zMiA3LjIuMgorCisxLiBNYWtlIGEgcHJvamVjdCB3aXRoIGFsbCAqLmFkcyBhbmQgKi5hZGIgZmlsZXMgZnJvbSB0aGUgZGlzdHJpYnV0aW9uLgorMi4gQnVpbGQgdGhlIGxpYnouYSBsaWJyYXJ5IGZyb20gdGhlIFpMaWIgQyBzb3VyY2VzLgorMy4gUmVuYW1lIGxpYnouYSB0byB6LmxpYi4KKzQuIEFkZCB0aGUgbGlicmFyeSB6LmxpYiB0byB0aGUgcHJvamVjdC4KKzUuIEFkZCB0aGUgbGliYy5saWIgbGlicmFyeSBmcm9tIHRoZSBPYmplY3RBZGEgZGlzdHJpYnV0aW9uIHRvIHRoZSBwcm9qZWN0LgorNi4gQnVpbGQgdGhlIGV4ZWN1dGFibGUgdXNpbmcgdGVzdC5hZGIgYXMgYSBtYWluIHByb2NlZHVyZS4KKworCisgICAgICAgIEhvdyB0byB1c2UgWkxpYi5BZGEKKworVGhlIHNvdXJjZSBmaWxlcyB0ZXN0LmFkYiBhbmQgcmVhZC5hZGIgYXJlIHNtYWxsIGRlbW8gcHJvZ3JhbXMgdGhhdCBzaG93Cit0aGUgbWFpbiBmdW5jdGlvbmFsaXR5IG9mIFpMaWIuQWRhLgorCitUaGUgcm91dGluZXMgZnJvbSB0aGUgcGFja2FnZSBzcGVjaWZpY2F0aW9ucyBhcmUgY29tbWVudGVkLgorCisKK0hvbWVwYWdlOiBodHRwOi8vemxpYi1hZGEuc291cmNlZm9yZ2UubmV0LworQXV0aG9yOiBEbWl0cml5IEFuaXNpbWtvdiA8YW5pc2lta292QHlhaG9vLmNvbT4KKworQ29udHJpYnV0b3JzOiBQYXNjYWwgT2JyeSA8cGFzY2FsQG9icnkub3JnPiwgU3RldmUgU2FuZ3dpbmUgPHNqc0Blc3NleC5hYy51az4KZGlmZiAtLWdpdCBhL3psaWItMS4yLjYvY29udHJpYi9hZGEvdGVzdC5hZGIgYi96bGliLTEuMi42L2NvbnRyaWIvYWRhL3Rlc3QuYWRiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwNzczYWMKLS0tIC9kZXYvbnVsbAorKysgYi96bGliLTEuMi42L2NvbnRyaWIvYWRhL3Rlc3QuYWRiCkBAIC0wLDAgKzEsNDYzIEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSAgWkxpYiBmb3IgQWRhIHRoaWNrIGJpbmRpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgQ29weXJpZ2h0IChDKSAyMDAyLTIwMDMgRG1pdHJpeSBBbmlzaW1rb3YgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgT3BlbiBzb3VyY2UgbGljZW5zZSBpbmZvcm1hdGlvbiBpcyBpbiB0aGUgemxpYi5hZHMgZmlsZS4gIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0tICAkSWQ6IHRlc3QuYWRiLHYgMS4xNyAyMDAzLzA4LzEyIDEyOjEzOjMwIHZhZ3VsIEV4cCAkCisKKy0tICBUaGUgcHJvZ3JhbSBoYXMgYSBmZXcgYWltcy4KKy0tICAxLiBUZXN0IFpMaWIuQWRhOTUgdGhpY2sgYmluZGluZyBmdW5jdGlvbmFsaXR5LgorLS0gIDIuIFNob3cgdGhlIGV4YW1wbGUgb2YgdXNlIG1haW4gZnVuY3Rpb25hbGl0eSBvZiB0aGUgWkxpYi5BZGE5NSBiaW5kaW5nLgorLS0gIDMuIEJ1aWxkIHRoaXMgcHJvZ3JhbSBhdXRvbWF0aWNhbGx5IGNvbXBpbGUgYWxsIFpMaWIuQWRhOTUgcGFja2FnZXMgdW5kZXIKKy0tICAgICBHTkFUIEFkYTk1IGNvbXBpbGVyLgorCit3aXRoIFpMaWIuU3RyZWFtczsKK3dpdGggQWRhLlN0cmVhbXMuU3RyZWFtX0lPOword2l0aCBBZGEuTnVtZXJpY3MuRGlzY3JldGVfUmFuZG9tOworCit3aXRoIEFkYS5UZXh0X0lPOworCit3aXRoIEFkYS5DYWxlbmRhcjsKKworcHJvY2VkdXJlIFRlc3QgaXMKKworICAgdXNlIEFkYS5TdHJlYW1zOworICAgdXNlIFN0cmVhbV9JTzsKKworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAtLSAgVGVzdCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgLS0KKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICBGaWxlX1NpemUgICA6IENvdW50ICAgOj0gMTAwXzAwMDsKKyAgIENvbnRpbnVvdXMgIDogY29uc3RhbnQgQm9vbGVhbiA6PSBGYWxzZTsKKworICAgSGVhZGVyICAgICAgOiBjb25zdGFudCBaTGliLkhlYWRlcl9UeXBlIDo9IFpMaWIuRGVmYXVsdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAgWkxpYi5Ob25lOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICBaTGliLkF1dG87CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gIFpMaWIuR1ppcDsKKyAgIC0tICBEbyBub3QgdXNlIEhlYWRlciBvdGhlciB0aGVuIERlZmF1bHQgaW4gWkxpYiB2ZXJzaW9ucyAxLjEuNAorICAgLS0gIGFuZCBvbGRlci4KKworICAgU3RyYXRlZ3kgICAgOiBjb25zdGFudCBaTGliLlN0cmF0ZWd5X1R5cGUgOj0gWkxpYi5EZWZhdWx0X1N0cmF0ZWd5OworICAgSW5pdF9SYW5kb20gOiBjb25zdGFudCA6PSAxMDsKKworICAgLS0gRW5kIC0tCisKKyAgIEluX0ZpbGVfTmFtZSAgOiBjb25zdGFudCBTdHJpbmcgOj0gInRlc3R6bGliLmluIjsKKyAgIC0tICBOYW1lIG9mIHRoZSBpbnB1dCBmaWxlCisKKyAgIFpfRmlsZV9OYW1lICAgOiBjb25zdGFudCBTdHJpbmcgOj0gInRlc3R6bGliLnpsYiI7CisgICAtLSAgTmFtZSBvZiB0aGUgY29tcHJlc3NlZCBmaWxlLgorCisgICBPdXRfRmlsZV9OYW1lIDogY29uc3RhbnQgU3RyaW5nIDo9ICJ0ZXN0emxpYi5vdXQiOworICAgLS0gIE5hbWUgb2YgdGhlIGRlY29tcHJlc3NlZCBmaWxlLgorCisgICBGaWxlX0luICAgOiBGaWxlX1R5cGU7CisgICBGaWxlX091dCAgOiBGaWxlX1R5cGU7CisgICBGaWxlX0JhY2sgOiBGaWxlX1R5cGU7CisgICBGaWxlX1ogICAgOiBaTGliLlN0cmVhbXMuU3RyZWFtX1R5cGU7CisKKyAgIEZpbHRlciA6IFpMaWIuRmlsdGVyX1R5cGU7CisKKyAgIFRpbWVfU3RhbXAgOiBBZGEuQ2FsZW5kYXIuVGltZTsKKworICAgcHJvY2VkdXJlIEdlbmVyYXRlX0ZpbGU7CisgICAtLSAgR2VuZXJhdGUgZmlsZSBvZiBzcGV0c2lmaWVkIHNpemUgd2l0aCBzb21lIHJhbmRvbSBkYXRhLgorICAgLS0gIFRoZSByYW5kb20gZGF0YSBpcyByZXBlYXRhYmxlLCBmb3IgdGhlIGdvb2QgY29tcHJlc3Npb24uCisKKyAgIHByb2NlZHVyZSBDb21wYXJlX1N0cmVhbXMKKyAgICAgKExlZnQsIFJpZ2h0IDogaW4gb3V0IFJvb3RfU3RyZWFtX1R5cGUnQ2xhc3MpOworICAgLS0gIFRoZSBwcm9jZWR1cmUgY29tcGVhcmluZyBkYXRhIGluIDIgc3RyZWFtcy4KKyAgIC0tICBJdCBpcyBmb3IgY29tcGFyZSBkYXRhIGJlZm9yZSBhbmQgYWZ0ZXIgY29tcHJlc3Npb24vZGVjb21wcmVzc2lvbi4KKworICAgcHJvY2VkdXJlIENvbXBhcmVfRmlsZXMgKExlZnQsIFJpZ2h0IDogU3RyaW5nKTsKKyAgIC0tICBDb21wYXJlIGZpbGVzLiBCYXNlZCBvbiB0aGUgQ29tcGFyZV9TdHJlYW1zLgorCisgICBwcm9jZWR1cmUgQ29weV9TdHJlYW1zCisgICAgIChTb3VyY2UsIFRhcmdldCA6IGluIG91dCBSb290X1N0cmVhbV9UeXBlJ0NsYXNzOworICAgICAgQnVmZmVyX1NpemUgICAgOiBpbiAgICAgU3RyZWFtX0VsZW1lbnRfT2Zmc2V0IDo9IDEwMjQpOworICAgLS0gIENvcHlpbmcgZGF0YSBmcm9tIG9uZSBzdHJlYW0gdG8gYW5vdGhlci4gSXQgaXMgZm9yIHRlc3Qgc3RyZWFtCisgICAtLSAgaW50ZXJmYWNlIG9mIHRoZSBsaWJyYXJ5LgorCisgICBwcm9jZWR1cmUgRGF0YV9JbgorICAgICAoSXRlbSA6IG91dCBTdHJlYW1fRWxlbWVudF9BcnJheTsKKyAgICAgIExhc3QgOiBvdXQgU3RyZWFtX0VsZW1lbnRfT2Zmc2V0KTsKKyAgIC0tICB0aGlzIHByb2NlZHVyZSBpcyBmb3IgZ2VuZXJpYyBpbnN0YW50aWF0aW9uIG9mCisgICAtLSAgWkxpYi5HZW5lcmljX1RyYW5zbGF0ZS4KKyAgIC0tICByZWFkaW5nIGRhdGEgZnJvbSB0aGUgRmlsZV9Jbi4KKworICAgcHJvY2VkdXJlIERhdGFfT3V0IChJdGVtIDogaW4gU3RyZWFtX0VsZW1lbnRfQXJyYXkpOworICAgLS0gIHRoaXMgcHJvY2VkdXJlIGlzIGZvciBnZW5lcmljIGluc3RhbnRpYXRpb24gb2YKKyAgIC0tICBaTGliLkdlbmVyaWNfVHJhbnNsYXRlLgorICAgLS0gIHdyaXRpbmcgZGF0YSB0byB0aGUgRmlsZV9PdXQuCisKKyAgIHByb2NlZHVyZSBTdGFtcDsKKyAgIC0tICBTdG9yZSB0aGUgdGltZXN0YW1wIHRvIHRoZSBsb2NhbCB2YXJpYWJsZS4KKworICAgcHJvY2VkdXJlIFByaW50X1N0YXRpc3RpYyAoTXNnIDogU3RyaW5nOyBEYXRhX1NpemUgOiBaTGliLkNvdW50KTsKKyAgIC0tICBQcmludCB0aGUgdGltZSBzdGF0aXN0aWMgd2l0aCB0aGUgbWVzc2FnZS4KKworICAgcHJvY2VkdXJlIFRyYW5zbGF0ZSBpcyBuZXcgWkxpYi5HZW5lcmljX1RyYW5zbGF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRGF0YV9JbiAgPT4gRGF0YV9JbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGFfT3V0ID0+IERhdGFfT3V0KTsKKyAgIC0tICBUaGlzIHByb2NlZHVyZSBpcyBtb3ZpbmcgZGF0YSBmcm9tIEZpbGVfSW4gdG8gRmlsZV9PdXQKKyAgIC0tICB3aXRoIGNvbXByZXNzaW9uIG9yIGRlY29tcHJlc3Npb24sIGRlcGVuZCBvbiBpbml0aWFsaXphdGlvbiBvZgorICAgLS0gIEZpbHRlciBwYXJhbWV0ZXIuCisKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIC0tIENvbXBhcmVfRmlsZXMgLS0KKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgcHJvY2VkdXJlIENvbXBhcmVfRmlsZXMgKExlZnQsIFJpZ2h0IDogU3RyaW5nKSBpcworICAgICAgTGVmdF9GaWxlLCBSaWdodF9GaWxlIDogRmlsZV9UeXBlOworICAgYmVnaW4KKyAgICAgIE9wZW4gKExlZnRfRmlsZSwgSW5fRmlsZSwgTGVmdCk7CisgICAgICBPcGVuIChSaWdodF9GaWxlLCBJbl9GaWxlLCBSaWdodCk7CisgICAgICBDb21wYXJlX1N0cmVhbXMgKFN0cmVhbSAoTGVmdF9GaWxlKS5hbGwsIFN0cmVhbSAoUmlnaHRfRmlsZSkuYWxsKTsKKyAgICAgIENsb3NlIChMZWZ0X0ZpbGUpOworICAgICAgQ2xvc2UgKFJpZ2h0X0ZpbGUpOworICAgZW5kIENvbXBhcmVfRmlsZXM7CisKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgLS0gQ29tcGFyZV9TdHJlYW1zIC0tCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgcHJvY2VkdXJlIENvbXBhcmVfU3RyZWFtcworICAgICAoTGVmdCwgUmlnaHQgOiBpbiBvdXQgQWRhLlN0cmVhbXMuUm9vdF9TdHJlYW1fVHlwZSdDbGFzcykKKyAgIGlzCisgICAgICBMZWZ0X0J1ZmZlciwgUmlnaHRfQnVmZmVyIDogU3RyZWFtX0VsZW1lbnRfQXJyYXkgKDAgLi4gMTYjRkZGIyk7CisgICAgICBMZWZ0X0xhc3QsIFJpZ2h0X0xhc3QgOiBTdHJlYW1fRWxlbWVudF9PZmZzZXQ7CisgICBiZWdpbgorICAgICAgbG9vcAorICAgICAgICAgUmVhZCAoTGVmdCwgTGVmdF9CdWZmZXIsIExlZnRfTGFzdCk7CisgICAgICAgICBSZWFkIChSaWdodCwgUmlnaHRfQnVmZmVyLCBSaWdodF9MYXN0KTsKKworICAgICAgICAgaWYgTGVmdF9MYXN0IC89IFJpZ2h0X0xhc3QgdGhlbgorICAgICAgICAgICAgQWRhLlRleHRfSU8uUHV0X0xpbmUgKCJDb21wYXJlIGVycm9yIDoiCisgICAgICAgICAgICAgICYgU3RyZWFtX0VsZW1lbnRfT2Zmc2V0J0ltYWdlIChMZWZ0X0xhc3QpCisgICAgICAgICAgICAgICYgIiAvPSAiCisgICAgICAgICAgICAgICYgU3RyZWFtX0VsZW1lbnRfT2Zmc2V0J0ltYWdlIChSaWdodF9MYXN0KSk7CisKKyAgICAgICAgICAgIHJhaXNlIENvbnN0cmFpbnRfRXJyb3I7CisKKyAgICAgICAgIGVsc2lmIExlZnRfQnVmZmVyICgwIC4uIExlZnRfTGFzdCkKKyAgICAgICAgICAgICAgIC89IFJpZ2h0X0J1ZmZlciAoMCAuLiBSaWdodF9MYXN0KQorICAgICAgICAgdGhlbgorICAgICAgICAgICAgQWRhLlRleHRfSU8uUHV0X0xpbmUgKCJFUlJPUjogSU4gYW5kIE9VVCBmaWxlcyBpcyBub3QgZXF1YWwuIik7CisgICAgICAgICAgICByYWlzZSBDb25zdHJhaW50X0Vycm9yOworCisgICAgICAgICBlbmQgaWY7CisKKyAgICAgICAgIGV4aXQgd2hlbiBMZWZ0X0xhc3QgPCBMZWZ0X0J1ZmZlcidMYXN0OworICAgICAgZW5kIGxvb3A7CisgICBlbmQgQ29tcGFyZV9TdHJlYW1zOworCisgICAtLS0tLS0tLS0tLS0tLS0tLS0KKyAgIC0tIENvcHlfU3RyZWFtcyAtLQorICAgLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgIHByb2NlZHVyZSBDb3B5X1N0cmVhbXMKKyAgICAgKFNvdXJjZSwgVGFyZ2V0IDogaW4gb3V0IEFkYS5TdHJlYW1zLlJvb3RfU3RyZWFtX1R5cGUnQ2xhc3M7CisgICAgICBCdWZmZXJfU2l6ZSAgICA6IGluICAgICBTdHJlYW1fRWxlbWVudF9PZmZzZXQgOj0gMTAyNCkKKyAgIGlzCisgICAgICBCdWZmZXIgOiBTdHJlYW1fRWxlbWVudF9BcnJheSAoMSAuLiBCdWZmZXJfU2l6ZSk7CisgICAgICBMYXN0ICAgOiBTdHJlYW1fRWxlbWVudF9PZmZzZXQ7CisgICBiZWdpbgorICAgICAgbG9vcAorICAgICAgICAgUmVhZCAgKFNvdXJjZSwgQnVmZmVyLCBMYXN0KTsKKyAgICAgICAgIFdyaXRlIChUYXJnZXQsIEJ1ZmZlciAoMSAuLiBMYXN0KSk7CisKKyAgICAgICAgIGV4aXQgd2hlbiBMYXN0IDwgQnVmZmVyJ0xhc3Q7CisgICAgICBlbmQgbG9vcDsKKyAgIGVuZCBDb3B5X1N0cmVhbXM7CisKKyAgIC0tLS0tLS0tLS0tLS0KKyAgIC0tIERhdGFfSW4gLS0KKyAgIC0tLS0tLS0tLS0tLS0KKworICAgcHJvY2VkdXJlIERhdGFfSW4KKyAgICAgKEl0ZW0gOiBvdXQgU3RyZWFtX0VsZW1lbnRfQXJyYXk7CisgICAgICBMYXN0IDogb3V0IFN0cmVhbV9FbGVtZW50X09mZnNldCkgaXMKKyAgIGJlZ2luCisgICAgICBSZWFkIChGaWxlX0luLCBJdGVtLCBMYXN0KTsKKyAgIGVuZCBEYXRhX0luOworCisgICAtLS0tLS0tLS0tLS0tLQorICAgLS0gRGF0YV9PdXQgLS0KKyAgIC0tLS0tLS0tLS0tLS0tCisKKyAgIHByb2NlZHVyZSBEYXRhX091dCAoSXRlbSA6IGluIFN0cmVhbV9FbGVtZW50X0FycmF5KSBpcworICAgYmVnaW4KKyAgICAgIFdyaXRlIChGaWxlX091dCwgSXRlbSk7CisgICBlbmQgRGF0YV9PdXQ7CisKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIC0tIEdlbmVyYXRlX0ZpbGUgLS0KKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgcHJvY2VkdXJlIEdlbmVyYXRlX0ZpbGUgaXMKKyAgICAgIHN1YnR5cGUgVmlzaWJsZV9TeW1ib2xzIGlzIFN0cmVhbV9FbGVtZW50IHJhbmdlIDE2IzIwIyAuLiAxNiM3RSM7CisKKyAgICAgIHBhY2thZ2UgUmFuZG9tX0VsZW1lbnRzIGlzCisgICAgICAgICBuZXcgQWRhLk51bWVyaWNzLkRpc2NyZXRlX1JhbmRvbSAoVmlzaWJsZV9TeW1ib2xzKTsKKworICAgICAgR2VuICAgIDogUmFuZG9tX0VsZW1lbnRzLkdlbmVyYXRvcjsKKyAgICAgIEJ1ZmZlciA6IFN0cmVhbV9FbGVtZW50X0FycmF5IDo9ICgxIC4uIDc3ID0+IDE2IzIwIykgJiAxMDsKKworICAgICAgQnVmZmVyX0NvdW50IDogY29uc3RhbnQgQ291bnQgOj0gRmlsZV9TaXplIC8gQnVmZmVyJ0xlbmd0aDsKKyAgICAgIC0tICBOdW1iZXIgb2Ygc2FtZSBidWZmZXJzIGluIHRoZSBwYWNrZXQuCisKKyAgICAgIERlbnNpdHkgOiBjb25zdGFudCBDb3VudCA6PSAzMDsgLS0gIGZyb20gMCB0byBCdWZmZXInTGVuZ3RoIC0gMjsKKworICAgICAgcHJvY2VkdXJlIEZpbGxfQnVmZmVyIChKLCBEIDogaW4gQ291bnQpOworICAgICAgLS0gIENoYW5nZSB0aGUgcGFydCBvZiB0aGUgYnVmZmVyLgorCisgICAgICAtLS0tLS0tLS0tLS0tLS0tLQorICAgICAgLS0gRmlsbF9CdWZmZXIgLS0KKyAgICAgIC0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgIHByb2NlZHVyZSBGaWxsX0J1ZmZlciAoSiwgRCA6IGluIENvdW50KSBpcworICAgICAgYmVnaW4KKyAgICAgICAgIGZvciBLIGluIDAgLi4gRCBsb29wCisgICAgICAgICAgICBCdWZmZXIKKyAgICAgICAgICAgICAgKFN0cmVhbV9FbGVtZW50X09mZnNldCAoKEogKyBLKSBtb2QgKEJ1ZmZlcidMZW5ndGggLSAxKSArIDEpKQorICAgICAgICAgICAgIDo9IFJhbmRvbV9FbGVtZW50cy5SYW5kb20gKEdlbik7CisKKyAgICAgICAgIGVuZCBsb29wOworICAgICAgZW5kIEZpbGxfQnVmZmVyOworCisgICBiZWdpbgorICAgICAgUmFuZG9tX0VsZW1lbnRzLlJlc2V0IChHZW4sIEluaXRfUmFuZG9tKTsKKworICAgICAgQ3JlYXRlIChGaWxlX0luLCBPdXRfRmlsZSwgSW5fRmlsZV9OYW1lKTsKKworICAgICAgRmlsbF9CdWZmZXIgKDEsIEJ1ZmZlcidMZW5ndGggLSAyKTsKKworICAgICAgZm9yIEogaW4gMSAuLiBCdWZmZXJfQ291bnQgbG9vcAorICAgICAgICAgV3JpdGUgKEZpbGVfSW4sIEJ1ZmZlcik7CisKKyAgICAgICAgIEZpbGxfQnVmZmVyIChKLCBEZW5zaXR5KTsKKyAgICAgIGVuZCBsb29wOworCisgICAgICAtLSAgZmlsbCByZW1haW4gc2l6ZS4KKworICAgICAgV3JpdGUKKyAgICAgICAgKEZpbGVfSW4sCisgICAgICAgICBCdWZmZXIKKyAgICAgICAgICAgKDEgLi4gU3RyZWFtX0VsZW1lbnRfT2Zmc2V0CisgICAgICAgICAgICAgICAgICAgKEZpbGVfU2l6ZSAtIEJ1ZmZlcidMZW5ndGggKiBCdWZmZXJfQ291bnQpKSk7CisKKyAgICAgIEZsdXNoIChGaWxlX0luKTsKKyAgICAgIENsb3NlIChGaWxlX0luKTsKKyAgIGVuZCBHZW5lcmF0ZV9GaWxlOworCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIC0tIFByaW50X1N0YXRpc3RpYyAtLQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgIHByb2NlZHVyZSBQcmludF9TdGF0aXN0aWMgKE1zZyA6IFN0cmluZzsgRGF0YV9TaXplIDogWkxpYi5Db3VudCkgaXMKKyAgICAgIHVzZSBBZGEuQ2FsZW5kYXI7CisgICAgICB1c2UgQWRhLlRleHRfSU87CisKKyAgICAgIHBhY2thZ2UgQ291bnRfSU8gaXMgbmV3IEludGVnZXJfSU8gKFpMaWIuQ291bnQpOworCisgICAgICBDdXJyX0R1ciA6IER1cmF0aW9uIDo9IENsb2NrIC0gVGltZV9TdGFtcDsKKyAgIGJlZ2luCisgICAgICBQdXQgKE1zZyk7CisKKyAgICAgIFNldF9Db2wgKDIwKTsKKyAgICAgIEFkYS5UZXh0X0lPLlB1dCAoInNpemUgPSIpOworCisgICAgICBDb3VudF9JTy5QdXQKKyAgICAgICAgKERhdGFfU2l6ZSwKKyAgICAgICAgIFdpZHRoID0+IFN0cmVhbV9JTy5Db3VudCdJbWFnZSAoRmlsZV9TaXplKSdMZW5ndGgpOworCisgICAgICBQdXRfTGluZSAoIiBkdXJhdGlvbiA9IiAmIER1cmF0aW9uJ0ltYWdlIChDdXJyX0R1cikpOworICAgZW5kIFByaW50X1N0YXRpc3RpYzsKKworICAgLS0tLS0tLS0tLS0KKyAgIC0tIFN0YW1wIC0tCisgICAtLS0tLS0tLS0tLQorCisgICBwcm9jZWR1cmUgU3RhbXAgaXMKKyAgIGJlZ2luCisgICAgICBUaW1lX1N0YW1wIDo9IEFkYS5DYWxlbmRhci5DbG9jazsKKyAgIGVuZCBTdGFtcDsKKworYmVnaW4KKyAgIEFkYS5UZXh0X0lPLlB1dF9MaW5lICgiWkxpYiAiICYgWkxpYi5WZXJzaW9uKTsKKworICAgbG9vcAorICAgICAgR2VuZXJhdGVfRmlsZTsKKworICAgICAgZm9yIExldmVsIGluIFpMaWIuQ29tcHJlc3Npb25fTGV2ZWwnUmFuZ2UgbG9vcAorCisgICAgICAgICBBZGEuVGV4dF9JTy5QdXRfTGluZSAoIkxldmVsID0iCisgICAgICAgICAgICAmIFpMaWIuQ29tcHJlc3Npb25fTGV2ZWwnSW1hZ2UgKExldmVsKSk7CisKKyAgICAgICAgIC0tICBUZXN0IGdlbmVyaWMgaW50ZXJmYWNlLgorICAgICAgICAgT3BlbiAgIChGaWxlX0luLCBJbl9GaWxlLCBJbl9GaWxlX05hbWUpOworICAgICAgICAgQ3JlYXRlIChGaWxlX091dCwgT3V0X0ZpbGUsIFpfRmlsZV9OYW1lKTsKKworICAgICAgICAgU3RhbXA7CisKKyAgICAgICAgIC0tICBEZWZsYXRlIHVzaW5nIGdlbmVyaWMgaW5zdGFudGlhdGlvbi4KKworICAgICAgICAgWkxpYi5EZWZsYXRlX0luaXQKKyAgICAgICAgICAgICAgIChGaWx0ZXIgICA9PiBGaWx0ZXIsCisgICAgICAgICAgICAgICAgTGV2ZWwgICAgPT4gTGV2ZWwsCisgICAgICAgICAgICAgICAgU3RyYXRlZ3kgPT4gU3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgSGVhZGVyICAgPT4gSGVhZGVyKTsKKworICAgICAgICAgVHJhbnNsYXRlIChGaWx0ZXIpOworICAgICAgICAgUHJpbnRfU3RhdGlzdGljICgiR2VuZXJpYyBjb21wcmVzcyIsIFpMaWIuVG90YWxfT3V0IChGaWx0ZXIpKTsKKyAgICAgICAgIFpMaWIuQ2xvc2UgKEZpbHRlcik7CisKKyAgICAgICAgIENsb3NlIChGaWxlX0luKTsKKyAgICAgICAgIENsb3NlIChGaWxlX091dCk7CisKKyAgICAgICAgIE9wZW4gICAoRmlsZV9JbiwgSW5fRmlsZSwgWl9GaWxlX05hbWUpOworICAgICAgICAgQ3JlYXRlIChGaWxlX091dCwgT3V0X0ZpbGUsIE91dF9GaWxlX05hbWUpOworCisgICAgICAgICBTdGFtcDsKKworICAgICAgICAgLS0gIEluZmxhdGUgdXNpbmcgZ2VuZXJpYyBpbnN0YW50aWF0aW9uLgorCisgICAgICAgICBaTGliLkluZmxhdGVfSW5pdCAoRmlsdGVyLCBIZWFkZXIgPT4gSGVhZGVyKTsKKworICAgICAgICAgVHJhbnNsYXRlIChGaWx0ZXIpOworICAgICAgICAgUHJpbnRfU3RhdGlzdGljICgiR2VuZXJpYyBkZWNvbXByZXNzIiwgWkxpYi5Ub3RhbF9PdXQgKEZpbHRlcikpOworCisgICAgICAgICBaTGliLkNsb3NlIChGaWx0ZXIpOworCisgICAgICAgICBDbG9zZSAoRmlsZV9Jbik7CisgICAgICAgICBDbG9zZSAoRmlsZV9PdXQpOworCisgICAgICAgICBDb21wYXJlX0ZpbGVzIChJbl9GaWxlX05hbWUsIE91dF9GaWxlX05hbWUpOworCisgICAgICAgICAtLSAgVGVzdCBzdHJlYW0gaW50ZXJmYWNlLgorCisgICAgICAgICAtLSAgQ29tcHJlc3MgdG8gdGhlIGJhY2sgc3RyZWFtLgorCisgICAgICAgICBPcGVuICAgKEZpbGVfSW4sIEluX0ZpbGUsIEluX0ZpbGVfTmFtZSk7CisgICAgICAgICBDcmVhdGUgKEZpbGVfQmFjaywgT3V0X0ZpbGUsIFpfRmlsZV9OYW1lKTsKKworICAgICAgICAgU3RhbXA7CisKKyAgICAgICAgIFpMaWIuU3RyZWFtcy5DcmVhdGUKKyAgICAgICAgICAgKFN0cmVhbSAgICAgICAgICA9PiBGaWxlX1osCisgICAgICAgICAgICBNb2RlICAgICAgICAgICAgPT4gWkxpYi5TdHJlYW1zLk91dF9TdHJlYW0sCisgICAgICAgICAgICBCYWNrICAgICAgICAgICAgPT4gWkxpYi5TdHJlYW1zLlN0cmVhbV9BY2Nlc3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTdHJlYW0gKEZpbGVfQmFjaykpLAorICAgICAgICAgICAgQmFja19Db21wcmVzc2VkID0+IFRydWUsCisgICAgICAgICAgICBMZXZlbCAgICAgICAgICAgPT4gTGV2ZWwsCisgICAgICAgICAgICBTdHJhdGVneSAgICAgICAgPT4gU3RyYXRlZ3ksCisgICAgICAgICAgICBIZWFkZXIgICAgICAgICAgPT4gSGVhZGVyKTsKKworICAgICAgICAgQ29weV9TdHJlYW1zCisgICAgICAgICAgIChTb3VyY2UgPT4gU3RyZWFtIChGaWxlX0luKS5hbGwsCisgICAgICAgICAgICBUYXJnZXQgPT4gRmlsZV9aKTsKKworICAgICAgICAgLS0gIEZsdXNoaW5nIGludGVybmFsIGJ1ZmZlcnMgdG8gdGhlIGJhY2sgc3RyZWFtLgorCisgICAgICAgICBaTGliLlN0cmVhbXMuRmx1c2ggKEZpbGVfWiwgWkxpYi5GaW5pc2gpOworCisgICAgICAgICBQcmludF9TdGF0aXN0aWMgKCJXcml0ZSBjb21wcmVzcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFpMaWIuU3RyZWFtcy5Xcml0ZV9Ub3RhbF9PdXQgKEZpbGVfWikpOworCisgICAgICAgICBaTGliLlN0cmVhbXMuQ2xvc2UgKEZpbGVfWik7CisKKyAgICAgICAgIENsb3NlIChGaWxlX0luKTsKKyAgICAgICAgIENsb3NlIChGaWxlX0JhY2spOworCisgICAgICAgICAtLSAgQ29tcGFyZSByZWFkaW5nIGZyb20gb3JpZ2luYWwgZmlsZSBhbmQgZnJvbQorICAgICAgICAgLS0gIGRlY29tcHJlc3Npb24gc3RyZWFtLgorCisgICAgICAgICBPcGVuIChGaWxlX0luLCAgIEluX0ZpbGUsIEluX0ZpbGVfTmFtZSk7CisgICAgICAgICBPcGVuIChGaWxlX0JhY2ssIEluX0ZpbGUsIFpfRmlsZV9OYW1lKTsKKworICAgICAgICAgWkxpYi5TdHJlYW1zLkNyZWF0ZQorICAgICAgICAgICAoU3RyZWFtICAgICAgICAgID0+IEZpbGVfWiwKKyAgICAgICAgICAgIE1vZGUgICAgICAgICAgICA9PiBaTGliLlN0cmVhbXMuSW5fU3RyZWFtLAorICAgICAgICAgICAgQmFjayAgICAgICAgICAgID0+IFpMaWIuU3RyZWFtcy5TdHJlYW1fQWNjZXNzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU3RyZWFtIChGaWxlX0JhY2spKSwKKyAgICAgICAgICAgIEJhY2tfQ29tcHJlc3NlZCA9PiBUcnVlLAorICAgICAgICAgICAgSGVhZGVyICAgICAgICAgID0+IEhlYWRlcik7CisKKyAgICAgICAgIFN0YW1wOworICAgICAgICAgQ29tcGFyZV9TdHJlYW1zIChTdHJlYW0gKEZpbGVfSW4pLmFsbCwgRmlsZV9aKTsKKworICAgICAgICAgUHJpbnRfU3RhdGlzdGljICgiUmVhZCBkZWNvbXByZXNzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgWkxpYi5TdHJlYW1zLlJlYWRfVG90YWxfT3V0IChGaWxlX1opKTsKKworICAgICAgICAgWkxpYi5TdHJlYW1zLkNsb3NlIChGaWxlX1opOworICAgICAgICAgQ2xvc2UgKEZpbGVfSW4pOworICAgICAgICAgQ2xvc2UgKEZpbGVfQmFjayk7CisKKyAgICAgICAgIC0tICBDb21wcmVzcyBieSByZWFkaW5nIGZyb20gY29tcHJlc3Npb24gc3RyZWFtLgorCisgICAgICAgICBPcGVuIChGaWxlX0JhY2ssIEluX0ZpbGUsIEluX0ZpbGVfTmFtZSk7CisgICAgICAgICBDcmVhdGUgKEZpbGVfT3V0LCBPdXRfRmlsZSwgWl9GaWxlX05hbWUpOworCisgICAgICAgICBaTGliLlN0cmVhbXMuQ3JlYXRlCisgICAgICAgICAgIChTdHJlYW0gICAgICAgICAgPT4gRmlsZV9aLAorICAgICAgICAgICAgTW9kZSAgICAgICAgICAgID0+IFpMaWIuU3RyZWFtcy5Jbl9TdHJlYW0sCisgICAgICAgICAgICBCYWNrICAgICAgICAgICAgPT4gWkxpYi5TdHJlYW1zLlN0cmVhbV9BY2Nlc3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTdHJlYW0gKEZpbGVfQmFjaykpLAorICAgICAgICAgICAgQmFja19Db21wcmVzc2VkID0+IEZhbHNlLAorICAgICAgICAgICAgTGV2ZWwgICAgICAgICAgID0+IExldmVsLAorICAgICAgICAgICAgU3RyYXRlZ3kgICAgICAgID0+IFN0cmF0ZWd5LAorICAgICAgICAgICAgSGVhZGVyICAgICAgICAgID0+IEhlYWRlcik7CisKKyAgICAgICAgIFN0YW1wOworICAgICAgICAgQ29weV9TdHJlYW1zCisgICAgICAgICAgIChTb3VyY2UgPT4gRmlsZV9aLAorICAgICAgICAgICAgVGFyZ2V0ID0+IFN0cmVhbSAoRmlsZV9PdXQpLmFsbCk7CisKKyAgICAgICAgIFByaW50X1N0YXRpc3RpYyAoIlJlYWQgY29tcHJlc3MiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBaTGliLlN0cmVhbXMuUmVhZF9Ub3RhbF9PdXQgKEZpbGVfWikpOworCisgICAgICAgICBaTGliLlN0cmVhbXMuQ2xvc2UgKEZpbGVfWik7CisKKyAgICAgICAgIENsb3NlIChGaWxlX091dCk7CisgICAgICAgICBDbG9zZSAoRmlsZV9CYWNrKTsKKworICAgICAgICAgLS0gIERlY29tcHJlc3MgdG8gZGVjb21wcmVzc2lvbiBzdHJlYW0uCisKKyAgICAgICAgIE9wZW4gICAoRmlsZV9JbiwgICBJbl9GaWxlLCBaX0ZpbGVfTmFtZSk7CisgICAgICAgICBDcmVhdGUgKEZpbGVfQmFjaywgT3V0X0ZpbGUsIE91dF9GaWxlX05hbWUpOworCisgICAgICAgICBaTGliLlN0cmVhbXMuQ3JlYXRlCisgICAgICAgICAgIChTdHJlYW0gICAgICAgICAgPT4gRmlsZV9aLAorICAgICAgICAgICAgTW9kZSAgICAgICAgICAgID0+IFpMaWIuU3RyZWFtcy5PdXRfU3RyZWFtLAorICAgICAgICAgICAgQmFjayAgICAgICAgICAgID0+IFpMaWIuU3RyZWFtcy5TdHJlYW1fQWNjZXNzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU3RyZWFtIChGaWxlX0JhY2spKSwKKyAgICAgICAgICAgIEJhY2tfQ29tcHJlc3NlZCA9PiBGYWxzZSwKKyAgICAgICAgICAgIEhlYWRlciAgICAgICAgICA9PiBIZWFkZXIpOworCisgICAgICAgICBTdGFtcDsKKworICAgICAgICAgQ29weV9TdHJlYW1zCisgICAgICAgICAgIChTb3VyY2UgPT4gU3RyZWFtIChGaWxlX0luKS5hbGwsCisgICAgICAgICAgICBUYXJnZXQgPT4gRmlsZV9aKTsKKworICAgICAgICAgUHJpbnRfU3RhdGlzdGljICgiV3JpdGUgZGVjb21wcmVzcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFpMaWIuU3RyZWFtcy5Xcml0ZV9Ub3RhbF9PdXQgKEZpbGVfWikpOworCisgICAgICAgICBaTGliLlN0cmVhbXMuQ2xvc2UgKEZpbGVfWik7CisgICAgICAgICBDbG9zZSAoRmlsZV9Jbik7CisgICAgICAgICBDbG9zZSAoRmlsZV9CYWNrKTsKKworICAgICAgICAgQ29tcGFyZV9GaWxlcyAoSW5fRmlsZV9OYW1lLCBPdXRfRmlsZV9OYW1lKTsKKyAgICAgIGVuZCBsb29wOworCisgICAgICBBZGEuVGV4dF9JTy5QdXRfTGluZSAoQ291bnQnSW1hZ2UgKEZpbGVfU2l6ZSkgJiAiIE9rLiIpOworCisgICAgICBleGl0IHdoZW4gbm90IENvbnRpbnVvdXM7CisKKyAgICAgIEZpbGVfU2l6ZSA6PSBGaWxlX1NpemUgKyAxOworICAgZW5kIGxvb3A7CitlbmQgVGVzdDsKZGlmZiAtLWdpdCBhL3psaWItMS4yLjYvY29udHJpYi9hZGEvemxpYi1zdHJlYW1zLmFkYiBiL3psaWItMS4yLjYvY29udHJpYi9hZGEvemxpYi1zdHJlYW1zLmFkYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjQ5N2JhCi0tLSAvZGV2L251bGwKKysrIGIvemxpYi0xLjIuNi9jb250cmliL2FkYS96bGliLXN0cmVhbXMuYWRiCkBAIC0wLDAgKzEsMjI1IEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSAgWkxpYiBmb3IgQWRhIHRoaWNrIGJpbmRpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgQ29weXJpZ2h0IChDKSAyMDAyLTIwMDMgRG1pdHJpeSBBbmlzaW1rb3YgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgT3BlbiBzb3VyY2UgbGljZW5zZSBpbmZvcm1hdGlvbiBpcyBpbiB0aGUgemxpYi5hZHMgZmlsZS4gIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0tICAkSWQ6IHpsaWItc3RyZWFtcy5hZGIsdiAxLjEwIDIwMDQvMDUvMzEgMTA6NTM6NDAgdmFndWwgRXhwICQKKword2l0aCBBZGEuVW5jaGVja2VkX0RlYWxsb2NhdGlvbjsKKworcGFja2FnZSBib2R5IFpMaWIuU3RyZWFtcyBpcworCisgICAtLS0tLS0tLS0tLQorICAgLS0gQ2xvc2UgLS0KKyAgIC0tLS0tLS0tLS0tCisKKyAgIHByb2NlZHVyZSBDbG9zZSAoU3RyZWFtIDogaW4gb3V0IFN0cmVhbV9UeXBlKSBpcworICAgICAgcHJvY2VkdXJlIEZyZWUgaXMgbmV3IEFkYS5VbmNoZWNrZWRfRGVhbGxvY2F0aW9uCisgICAgICAgICAoU3RyZWFtX0VsZW1lbnRfQXJyYXksIEJ1ZmZlcl9BY2Nlc3MpOworICAgYmVnaW4KKyAgICAgIGlmIFN0cmVhbS5Nb2RlID0gT3V0X1N0cmVhbSBvciBTdHJlYW0uTW9kZSA9IER1cGxleCB0aGVuCisgICAgICAgICAtLSAgV2Ugc2hvdWxkIGZsdXNoIHRoZSBkYXRhIHdyaXR0ZW4gYnkgdGhlIHdyaXRlci4KKworICAgICAgICAgRmx1c2ggKFN0cmVhbSwgRmluaXNoKTsKKworICAgICAgICAgQ2xvc2UgKFN0cmVhbS5Xcml0ZXIpOworICAgICAgZW5kIGlmOworCisgICAgICBpZiBTdHJlYW0uTW9kZSA9IEluX1N0cmVhbSBvciBTdHJlYW0uTW9kZSA9IER1cGxleCB0aGVuCisgICAgICAgICBDbG9zZSAoU3RyZWFtLlJlYWRlcik7CisgICAgICAgICBGcmVlIChTdHJlYW0uQnVmZmVyKTsKKyAgICAgIGVuZCBpZjsKKyAgIGVuZCBDbG9zZTsKKworICAgLS0tLS0tLS0tLS0tCisgICAtLSBDcmVhdGUgLS0KKyAgIC0tLS0tLS0tLS0tLQorCisgICBwcm9jZWR1cmUgQ3JlYXRlCisgICAgIChTdHJlYW0gICAgICAgICAgICA6ICAgIG91dCBTdHJlYW1fVHlwZTsKKyAgICAgIE1vZGUgICAgICAgICAgICAgIDogaW4gICAgIFN0cmVhbV9Nb2RlOworICAgICAgQmFjayAgICAgICAgICAgICAgOiBpbiAgICAgU3RyZWFtX0FjY2VzczsKKyAgICAgIEJhY2tfQ29tcHJlc3NlZCAgIDogaW4gICAgIEJvb2xlYW47CisgICAgICBMZXZlbCAgICAgICAgICAgICA6IGluICAgICBDb21wcmVzc2lvbl9MZXZlbCA6PSBEZWZhdWx0X0NvbXByZXNzaW9uOworICAgICAgU3RyYXRlZ3kgICAgICAgICAgOiBpbiAgICAgU3RyYXRlZ3lfVHlwZSAgICAgOj0gRGVmYXVsdF9TdHJhdGVneTsKKyAgICAgIEhlYWRlciAgICAgICAgICAgIDogaW4gICAgIEhlYWRlcl9UeXBlICAgICAgIDo9IERlZmF1bHQ7CisgICAgICBSZWFkX0J1ZmZlcl9TaXplICA6IGluICAgICBBZGEuU3RyZWFtcy5TdHJlYW1fRWxlbWVudF9PZmZzZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo9IERlZmF1bHRfQnVmZmVyX1NpemU7CisgICAgICBXcml0ZV9CdWZmZXJfU2l6ZSA6IGluICAgICBBZGEuU3RyZWFtcy5TdHJlYW1fRWxlbWVudF9PZmZzZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo9IERlZmF1bHRfQnVmZmVyX1NpemUpCisgICBpcworCisgICAgICBzdWJ0eXBlIEJ1ZmZlcl9TdWJ0eXBlIGlzIFN0cmVhbV9FbGVtZW50X0FycmF5ICgxIC4uIFJlYWRfQnVmZmVyX1NpemUpOworCisgICAgICBwcm9jZWR1cmUgSW5pdF9GaWx0ZXIKKyAgICAgICAgIChGaWx0ZXIgICA6IGluIG91dCBGaWx0ZXJfVHlwZTsKKyAgICAgICAgICBDb21wcmVzcyA6IGluICAgICBCb29sZWFuKTsKKworICAgICAgLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgIC0tIEluaXRfRmlsdGVyIC0tCisgICAgICAtLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICBwcm9jZWR1cmUgSW5pdF9GaWx0ZXIKKyAgICAgICAgIChGaWx0ZXIgICA6IGluIG91dCBGaWx0ZXJfVHlwZTsKKyAgICAgICAgICBDb21wcmVzcyA6IGluICAgICBCb29sZWFuKSBpcworICAgICAgYmVnaW4KKyAgICAgICAgIGlmIENvbXByZXNzIHRoZW4KKyAgICAgICAgICAgIERlZmxhdGVfSW5pdAorICAgICAgICAgICAgICAoRmlsdGVyLCBMZXZlbCwgU3RyYXRlZ3ksIEhlYWRlciA9PiBIZWFkZXIpOworICAgICAgICAgZWxzZQorICAgICAgICAgICAgSW5mbGF0ZV9Jbml0IChGaWx0ZXIsIEhlYWRlciA9PiBIZWFkZXIpOworICAgICAgICAgZW5kIGlmOworICAgICAgZW5kIEluaXRfRmlsdGVyOworCisgICBiZWdpbgorICAgICAgU3RyZWFtLkJhY2sgOj0gQmFjazsKKyAgICAgIFN0cmVhbS5Nb2RlIDo9IE1vZGU7CisKKyAgICAgIGlmIE1vZGUgPSBPdXRfU3RyZWFtIG9yIE1vZGUgPSBEdXBsZXggdGhlbgorICAgICAgICAgSW5pdF9GaWx0ZXIgKFN0cmVhbS5Xcml0ZXIsIEJhY2tfQ29tcHJlc3NlZCk7CisgICAgICAgICBTdHJlYW0uQnVmZmVyX1NpemUgOj0gV3JpdGVfQnVmZmVyX1NpemU7CisgICAgICBlbHNlCisgICAgICAgICBTdHJlYW0uQnVmZmVyX1NpemUgOj0gMDsKKyAgICAgIGVuZCBpZjsKKworICAgICAgaWYgTW9kZSA9IEluX1N0cmVhbSBvciBNb2RlID0gRHVwbGV4IHRoZW4KKyAgICAgICAgIEluaXRfRmlsdGVyIChTdHJlYW0uUmVhZGVyLCBub3QgQmFja19Db21wcmVzc2VkKTsKKworICAgICAgICAgU3RyZWFtLkJ1ZmZlciAgICAgOj0gbmV3IEJ1ZmZlcl9TdWJ0eXBlOworICAgICAgICAgU3RyZWFtLlJlc3RfRmlyc3QgOj0gU3RyZWFtLkJ1ZmZlcidMYXN0ICsgMTsKKyAgICAgICAgIFN0cmVhbS5SZXN0X0xhc3QgIDo9IFN0cmVhbS5CdWZmZXInTGFzdDsKKyAgICAgIGVuZCBpZjsKKyAgIGVuZCBDcmVhdGU7CisKKyAgIC0tLS0tLS0tLS0tCisgICAtLSBGbHVzaCAtLQorICAgLS0tLS0tLS0tLS0KKworICAgcHJvY2VkdXJlIEZsdXNoCisgICAgIChTdHJlYW0gOiBpbiBvdXQgU3RyZWFtX1R5cGU7CisgICAgICBNb2RlICAgOiBpbiAgICAgRmx1c2hfTW9kZSA6PSBTeW5jX0ZsdXNoKQorICAgaXMKKyAgICAgIEJ1ZmZlciA6IFN0cmVhbV9FbGVtZW50X0FycmF5ICgxIC4uIFN0cmVhbS5CdWZmZXJfU2l6ZSk7CisgICAgICBMYXN0ICAgOiBTdHJlYW1fRWxlbWVudF9PZmZzZXQ7CisgICBiZWdpbgorICAgICAgbG9vcAorICAgICAgICAgRmx1c2ggKFN0cmVhbS5Xcml0ZXIsIEJ1ZmZlciwgTGFzdCwgTW9kZSk7CisKKyAgICAgICAgIEFkYS5TdHJlYW1zLldyaXRlIChTdHJlYW0uQmFjay5hbGwsIEJ1ZmZlciAoMSAuLiBMYXN0KSk7CisKKyAgICAgICAgIGV4aXQgd2hlbiBMYXN0IDwgQnVmZmVyJ0xhc3Q7CisgICAgICBlbmQgbG9vcDsKKyAgIGVuZCBGbHVzaDsKKworICAgLS0tLS0tLS0tLS0tLQorICAgLS0gSXNfT3BlbiAtLQorICAgLS0tLS0tLS0tLS0tLQorCisgICBmdW5jdGlvbiBJc19PcGVuIChTdHJlYW0gOiBTdHJlYW1fVHlwZSkgcmV0dXJuIEJvb2xlYW4gaXMKKyAgIGJlZ2luCisgICAgICByZXR1cm4gSXNfT3BlbiAoU3RyZWFtLlJlYWRlcikgb3IgZWxzZSBJc19PcGVuIChTdHJlYW0uV3JpdGVyKTsKKyAgIGVuZCBJc19PcGVuOworCisgICAtLS0tLS0tLS0tCisgICAtLSBSZWFkIC0tCisgICAtLS0tLS0tLS0tCisKKyAgIHByb2NlZHVyZSBSZWFkCisgICAgIChTdHJlYW0gOiBpbiBvdXQgU3RyZWFtX1R5cGU7CisgICAgICBJdGVtICAgOiAgICBvdXQgU3RyZWFtX0VsZW1lbnRfQXJyYXk7CisgICAgICBMYXN0ICAgOiAgICBvdXQgU3RyZWFtX0VsZW1lbnRfT2Zmc2V0KQorICAgaXMKKworICAgICAgcHJvY2VkdXJlIFJlYWQKKyAgICAgICAgKEl0ZW0gOiBvdXQgU3RyZWFtX0VsZW1lbnRfQXJyYXk7CisgICAgICAgICBMYXN0IDogb3V0IFN0cmVhbV9FbGVtZW50X09mZnNldCk7CisKKyAgICAgIC0tLS0tLS0tLS0KKyAgICAgIC0tIFJlYWQgLS0KKyAgICAgIC0tLS0tLS0tLS0KKworICAgICAgcHJvY2VkdXJlIFJlYWQKKyAgICAgICAgKEl0ZW0gOiBvdXQgU3RyZWFtX0VsZW1lbnRfQXJyYXk7CisgICAgICAgICBMYXN0IDogb3V0IFN0cmVhbV9FbGVtZW50X09mZnNldCkgaXMKKyAgICAgIGJlZ2luCisgICAgICAgICBBZGEuU3RyZWFtcy5SZWFkIChTdHJlYW0uQmFjay5hbGwsIEl0ZW0sIExhc3QpOworICAgICAgZW5kIFJlYWQ7CisKKyAgICAgIHByb2NlZHVyZSBSZWFkIGlzIG5ldyBaTGliLlJlYWQKKyAgICAgICAgIChSZWFkICAgICAgID0+IFJlYWQsCisgICAgICAgICAgQnVmZmVyICAgICA9PiBTdHJlYW0uQnVmZmVyLmFsbCwKKyAgICAgICAgICBSZXN0X0ZpcnN0ID0+IFN0cmVhbS5SZXN0X0ZpcnN0LAorICAgICAgICAgIFJlc3RfTGFzdCAgPT4gU3RyZWFtLlJlc3RfTGFzdCk7CisKKyAgIGJlZ2luCisgICAgICBSZWFkIChTdHJlYW0uUmVhZGVyLCBJdGVtLCBMYXN0KTsKKyAgIGVuZCBSZWFkOworCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tCisgICAtLSBSZWFkX1RvdGFsX0luIC0tCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgIGZ1bmN0aW9uIFJlYWRfVG90YWxfSW4gKFN0cmVhbSA6IGluIFN0cmVhbV9UeXBlKSByZXR1cm4gQ291bnQgaXMKKyAgIGJlZ2luCisgICAgICByZXR1cm4gVG90YWxfSW4gKFN0cmVhbS5SZWFkZXIpOworICAgZW5kIFJlYWRfVG90YWxfSW47CisKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAtLSBSZWFkX1RvdGFsX091dCAtLQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgZnVuY3Rpb24gUmVhZF9Ub3RhbF9PdXQgKFN0cmVhbSA6IGluIFN0cmVhbV9UeXBlKSByZXR1cm4gQ291bnQgaXMKKyAgIGJlZ2luCisgICAgICByZXR1cm4gVG90YWxfT3V0IChTdHJlYW0uUmVhZGVyKTsKKyAgIGVuZCBSZWFkX1RvdGFsX091dDsKKworICAgLS0tLS0tLS0tLS0KKyAgIC0tIFdyaXRlIC0tCisgICAtLS0tLS0tLS0tLQorCisgICBwcm9jZWR1cmUgV3JpdGUKKyAgICAgKFN0cmVhbSA6IGluIG91dCBTdHJlYW1fVHlwZTsKKyAgICAgIEl0ZW0gICA6IGluICAgICBTdHJlYW1fRWxlbWVudF9BcnJheSkKKyAgIGlzCisKKyAgICAgIHByb2NlZHVyZSBXcml0ZSAoSXRlbSA6IGluIFN0cmVhbV9FbGVtZW50X0FycmF5KTsKKworICAgICAgLS0tLS0tLS0tLS0KKyAgICAgIC0tIFdyaXRlIC0tCisgICAgICAtLS0tLS0tLS0tLQorCisgICAgICBwcm9jZWR1cmUgV3JpdGUgKEl0ZW0gOiBpbiBTdHJlYW1fRWxlbWVudF9BcnJheSkgaXMKKyAgICAgIGJlZ2luCisgICAgICAgICBBZGEuU3RyZWFtcy5Xcml0ZSAoU3RyZWFtLkJhY2suYWxsLCBJdGVtKTsKKyAgICAgIGVuZCBXcml0ZTsKKworICAgICAgcHJvY2VkdXJlIFdyaXRlIGlzIG5ldyBaTGliLldyaXRlCisgICAgICAgICAoV3JpdGUgICAgICAgPT4gV3JpdGUsCisgICAgICAgICAgQnVmZmVyX1NpemUgPT4gU3RyZWFtLkJ1ZmZlcl9TaXplKTsKKworICAgYmVnaW4KKyAgICAgIFdyaXRlIChTdHJlYW0uV3JpdGVyLCBJdGVtLCBOb19GbHVzaCk7CisgICBlbmQgV3JpdGU7CisKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAtLSBXcml0ZV9Ub3RhbF9JbiAtLQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgZnVuY3Rpb24gV3JpdGVfVG90YWxfSW4gKFN0cmVhbSA6IGluIFN0cmVhbV9UeXBlKSByZXR1cm4gQ291bnQgaXMKKyAgIGJlZ2luCisgICAgICByZXR1cm4gVG90YWxfSW4gKFN0cmVhbS5Xcml0ZXIpOworICAgZW5kIFdyaXRlX1RvdGFsX0luOworCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIC0tIFdyaXRlX1RvdGFsX091dCAtLQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgIGZ1bmN0aW9uIFdyaXRlX1RvdGFsX091dCAoU3RyZWFtIDogaW4gU3RyZWFtX1R5cGUpIHJldHVybiBDb3VudCBpcworICAgYmVnaW4KKyAgICAgIHJldHVybiBUb3RhbF9PdXQgKFN0cmVhbS5Xcml0ZXIpOworICAgZW5kIFdyaXRlX1RvdGFsX091dDsKKworZW5kIFpMaWIuU3RyZWFtczsKZGlmZiAtLWdpdCBhL3psaWItMS4yLjYvY29udHJpYi9hZGEvemxpYi1zdHJlYW1zLmFkcyBiL3psaWItMS4yLjYvY29udHJpYi9hZGEvemxpYi1zdHJlYW1zLmFkcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDE5M2M2Ci0tLSAvZGV2L251bGwKKysrIGIvemxpYi0xLjIuNi9jb250cmliL2FkYS96bGliLXN0cmVhbXMuYWRzCkBAIC0wLDAgKzEsMTE0IEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSAgWkxpYiBmb3IgQWRhIHRoaWNrIGJpbmRpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgQ29weXJpZ2h0IChDKSAyMDAyLTIwMDMgRG1pdHJpeSBBbmlzaW1rb3YgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgT3BlbiBzb3VyY2UgbGljZW5zZSBpbmZvcm1hdGlvbiBpcyBpbiB0aGUgemxpYi5hZHMgZmlsZS4gIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0tICAkSWQ6IHpsaWItc3RyZWFtcy5hZHMsdiAxLjEyIDIwMDQvMDUvMzEgMTA6NTM6NDAgdmFndWwgRXhwICQKKworcGFja2FnZSBaTGliLlN0cmVhbXMgaXMKKworICAgdHlwZSBTdHJlYW1fTW9kZSBpcyAoSW5fU3RyZWFtLCBPdXRfU3RyZWFtLCBEdXBsZXgpOworCisgICB0eXBlIFN0cmVhbV9BY2Nlc3MgaXMgYWNjZXNzIGFsbCBBZGEuU3RyZWFtcy5Sb290X1N0cmVhbV9UeXBlJ0NsYXNzOworCisgICB0eXBlIFN0cmVhbV9UeXBlIGlzCisgICAgICBuZXcgQWRhLlN0cmVhbXMuUm9vdF9TdHJlYW1fVHlwZSB3aXRoIHByaXZhdGU7CisKKyAgIHByb2NlZHVyZSBSZWFkCisgICAgIChTdHJlYW0gOiBpbiBvdXQgU3RyZWFtX1R5cGU7CisgICAgICBJdGVtICAgOiAgICBvdXQgQWRhLlN0cmVhbXMuU3RyZWFtX0VsZW1lbnRfQXJyYXk7CisgICAgICBMYXN0ICAgOiAgICBvdXQgQWRhLlN0cmVhbXMuU3RyZWFtX0VsZW1lbnRfT2Zmc2V0KTsKKworICAgcHJvY2VkdXJlIFdyaXRlCisgICAgIChTdHJlYW0gOiBpbiBvdXQgU3RyZWFtX1R5cGU7CisgICAgICBJdGVtICAgOiBpbiAgICAgQWRhLlN0cmVhbXMuU3RyZWFtX0VsZW1lbnRfQXJyYXkpOworCisgICBwcm9jZWR1cmUgRmx1c2gKKyAgICAgKFN0cmVhbSA6IGluIG91dCBTdHJlYW1fVHlwZTsKKyAgICAgIE1vZGUgICA6IGluICAgICBGbHVzaF9Nb2RlIDo9IFN5bmNfRmx1c2gpOworICAgLS0gIEZsdXNoIHRoZSB3cml0dGVuIGRhdGEgdG8gdGhlIGJhY2sgc3RyZWFtLAorICAgLS0gIGFsbCBkYXRhIHBsYWNlZCB0byB0aGUgY29tcHJlc3NvciBpcyBmbHVzaGluZyB0byB0aGUgQmFjayBzdHJlYW0uCisgICAtLSAgU2hvdWxkIG5vdCBiZSB1c2VkIHVudGlsbCBuZWNlc3NhcnksIGJlY291c2UgaXQgaXMgZGVjcmVhc2luZworICAgLS0gIGNvbXByZXNzaW9uLgorCisgICBmdW5jdGlvbiBSZWFkX1RvdGFsX0luIChTdHJlYW0gOiBpbiBTdHJlYW1fVHlwZSkgcmV0dXJuIENvdW50OworICAgcHJhZ21hIElubGluZSAoUmVhZF9Ub3RhbF9Jbik7CisgICAtLSAgUmV0dXJuIHRvdGFsIG51bWJlciBvZiBieXRlcyByZWFkIGZyb20gYmFjayBzdHJlYW0gc28gZmFyLgorCisgICBmdW5jdGlvbiBSZWFkX1RvdGFsX091dCAoU3RyZWFtIDogaW4gU3RyZWFtX1R5cGUpIHJldHVybiBDb3VudDsKKyAgIHByYWdtYSBJbmxpbmUgKFJlYWRfVG90YWxfT3V0KTsKKyAgIC0tICBSZXR1cm4gdG90YWwgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgc28gZmFyLgorCisgICBmdW5jdGlvbiBXcml0ZV9Ub3RhbF9JbiAoU3RyZWFtIDogaW4gU3RyZWFtX1R5cGUpIHJldHVybiBDb3VudDsKKyAgIHByYWdtYSBJbmxpbmUgKFdyaXRlX1RvdGFsX0luKTsKKyAgIC0tICBSZXR1cm4gdG90YWwgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gc28gZmFyLgorCisgICBmdW5jdGlvbiBXcml0ZV9Ub3RhbF9PdXQgKFN0cmVhbSA6IGluIFN0cmVhbV9UeXBlKSByZXR1cm4gQ291bnQ7CisgICBwcmFnbWEgSW5saW5lIChXcml0ZV9Ub3RhbF9PdXQpOworICAgLS0gIFJldHVybiB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiB0byB0aGUgYmFjayBzdHJlYW0uCisKKyAgIHByb2NlZHVyZSBDcmVhdGUKKyAgICAgKFN0cmVhbSAgICAgICAgICAgIDogICAgb3V0IFN0cmVhbV9UeXBlOworICAgICAgTW9kZSAgICAgICAgICAgICAgOiBpbiAgICAgU3RyZWFtX01vZGU7CisgICAgICBCYWNrICAgICAgICAgICAgICA6IGluICAgICBTdHJlYW1fQWNjZXNzOworICAgICAgQmFja19Db21wcmVzc2VkICAgOiBpbiAgICAgQm9vbGVhbjsKKyAgICAgIExldmVsICAgICAgICAgICAgIDogaW4gICAgIENvbXByZXNzaW9uX0xldmVsIDo9IERlZmF1bHRfQ29tcHJlc3Npb247CisgICAgICBTdHJhdGVneSAgICAgICAgICA6IGluICAgICBTdHJhdGVneV9UeXBlICAgICA6PSBEZWZhdWx0X1N0cmF0ZWd5OworICAgICAgSGVhZGVyICAgICAgICAgICAgOiBpbiAgICAgSGVhZGVyX1R5cGUgICAgICAgOj0gRGVmYXVsdDsKKyAgICAgIFJlYWRfQnVmZmVyX1NpemUgIDogaW4gICAgIEFkYS5TdHJlYW1zLlN0cmVhbV9FbGVtZW50X09mZnNldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOj0gRGVmYXVsdF9CdWZmZXJfU2l6ZTsKKyAgICAgIFdyaXRlX0J1ZmZlcl9TaXplIDogaW4gICAgIEFkYS5TdHJlYW1zLlN0cmVhbV9FbGVtZW50X09mZnNldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOj0gRGVmYXVsdF9CdWZmZXJfU2l6ZSk7CisgICAtLSAgQ3JlYXRlIHRoZSBDb21yZXNzaW9uL0RlY29tcHJlc3Npb24gc3RyZWFtLgorICAgLS0gIElmIG1vZGUgaXMgSW5fU3RyZWFtIHRoZW4gV3JpdGUgb3BlcmF0aW9uIGlzIGRpc2FibGVkLgorICAgLS0gIElmIG1vZGUgaXMgT3V0X1N0cmVhbSB0aGVuIFJlYWQgb3BlcmF0aW9uIGlzIGRpc2FibGVkLgorCisgICAtLSAgSWYgQmFja19Db21wcmVzc2VkIGlzIHRydWUgdGhlbgorICAgLS0gIERhdGEgd3JpdHRlbiB0byB0aGUgU3RyZWFtIGlzIGNvbXByZXNzaW5nIHRvIHRoZSBCYWNrIHN0cmVhbQorICAgLS0gIGFuZCBkYXRhIHJlYWQgZnJvbSB0aGUgU3RyZWFtIGlzIGRlY29tcHJlc3NlZCBkYXRhIGZyb20gdGhlIEJhY2sgc3RyZWFtLgorCisgICAtLSAgSWYgQmFja19Db21wcmVzc2VkIGlzIGZhbHNlIHRoZW4KKyAgIC0tICBEYXRhIHdyaXR0ZW4gdG8gdGhlIFN0cmVhbSBpcyBkZWNvbXByZXNzaW5nIHRvIHRoZSBCYWNrIHN0cmVhbQorICAgLS0gIGFuZCBkYXRhIHJlYWQgZnJvbSB0aGUgU3RyZWFtIGlzIGNvbXByZXNzZWQgZGF0YSBmcm9tIHRoZSBCYWNrIHN0cmVhbS4KKworICAgLS0gICEhISBXaGVuIHRoZSBOZWVkX0hlYWRlciBpcyBGYWxzZSBaTGliLUFkYSBpcyB1c2luZyB1bmRvY3VtZW50ZWQKKyAgIC0tICBaTGliIDEuMS40IGZ1bmN0aW9uYWxpdHkgdG8gZG8gbm90IGNyZWF0ZS93YWl0IGZvciBaTGliIGhlYWRlcnMuCisKKyAgIGZ1bmN0aW9uIElzX09wZW4gKFN0cmVhbSA6IFN0cmVhbV9UeXBlKSByZXR1cm4gQm9vbGVhbjsKKworICAgcHJvY2VkdXJlIENsb3NlIChTdHJlYW0gOiBpbiBvdXQgU3RyZWFtX1R5cGUpOworCitwcml2YXRlCisKKyAgIHVzZSBBZGEuU3RyZWFtczsKKworICAgdHlwZSBCdWZmZXJfQWNjZXNzIGlzIGFjY2VzcyBhbGwgU3RyZWFtX0VsZW1lbnRfQXJyYXk7CisKKyAgIHR5cGUgU3RyZWFtX1R5cGUKKyAgICAgaXMgbmV3IFJvb3RfU3RyZWFtX1R5cGUgd2l0aAorICAgcmVjb3JkCisgICAgICBNb2RlICAgICAgIDogU3RyZWFtX01vZGU7CisKKyAgICAgIEJ1ZmZlciAgICAgOiBCdWZmZXJfQWNjZXNzOworICAgICAgUmVzdF9GaXJzdCA6IFN0cmVhbV9FbGVtZW50X09mZnNldDsKKyAgICAgIFJlc3RfTGFzdCAgOiBTdHJlYW1fRWxlbWVudF9PZmZzZXQ7CisgICAgICAtLSAgQnVmZmVyIGZvciBSZWFkIG9wZXJhdGlvbi4KKyAgICAgIC0tICBXZSBuZWVkIHRvIGhhdmUgdGhpcyBidWZmZXIgaW4gdGhlIHJlY29yZAorICAgICAgLS0gIGJlY291c2Ugbm90IGFsbCByZWFkIGRhdGEgZnJvbSBiYWNrIHN0cmVhbQorICAgICAgLS0gIGNvdWxkIGJlIHByb2Nlc3NlZCBkdXJpbmcgdGhlIHJlYWQgb3BlcmF0aW9uLgorCisgICAgICBCdWZmZXJfU2l6ZSA6IFN0cmVhbV9FbGVtZW50X09mZnNldDsKKyAgICAgIC0tICBCdWZmZXIgc2l6ZSBmb3Igd3JpdGUgb3BlcmF0aW9uLgorICAgICAgLS0gIFdlIGRvIG5vdCBuZWVkIHRvIGhhdmUgdGhpcyBidWZmZXIKKyAgICAgIC0tICBpbiB0aGUgcmVjb3JkIGJlY291c2UgYWxsIGRhdGEgY291bGQgYmUKKyAgICAgIC0tICBwcm9jZXNzZWQgaW4gdGhlIHdyaXRlIG9wZXJhdGlvbi4KKworICAgICAgQmFjayAgICAgICA6IFN0cmVhbV9BY2Nlc3M7CisgICAgICBSZWFkZXIgICAgIDogRmlsdGVyX1R5cGU7CisgICAgICBXcml0ZXIgICAgIDogRmlsdGVyX1R5cGU7CisgICBlbmQgcmVjb3JkOworCitlbmQgWkxpYi5TdHJlYW1zOwpkaWZmIC0tZ2l0IGEvemxpYi0xLjIuNi9jb250cmliL2FkYS96bGliLXRoaW4uYWRiIGIvemxpYi0xLjIuNi9jb250cmliL2FkYS96bGliLXRoaW4uYWRiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjYTRhNzEKLS0tIC9kZXYvbnVsbAorKysgYi96bGliLTEuMi42L2NvbnRyaWIvYWRhL3psaWItdGhpbi5hZGIKQEAgLTAsMCArMSwxNDEgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tICBaTGliIGZvciBBZGEgdGhpY2sgYmluZGluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICBDb3B5cmlnaHQgKEMpIDIwMDItMjAwMyBEbWl0cml5IEFuaXNpbWtvdiAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICBPcGVuIHNvdXJjZSBsaWNlbnNlIGluZm9ybWF0aW9uIGlzIGluIHRoZSB6bGliLmFkcyBmaWxlLiAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLS0gICRJZDogemxpYi10aGluLmFkYix2IDEuOCAyMDAzLzEyLzE0IDE4OjI3OjMxIHZhZ3VsIEV4cCAkCisKK3BhY2thZ2UgYm9keSBaTGliLlRoaW4gaXMKKworICAgWkxJQl9WRVJTSU9OICA6IGNvbnN0YW50IENoYXJzX1B0ciA6PSB6bGliVmVyc2lvbjsKKworICAgWl9TdHJlYW1fU2l6ZSA6IGNvbnN0YW50IEludCA6PSBaX1N0cmVhbSdTaXplIC8gU3lzdGVtLlN0b3JhZ2VfVW5pdDsKKworICAgLS0tLS0tLS0tLS0tLS0KKyAgIC0tIEF2YWlsX0luIC0tCisgICAtLS0tLS0tLS0tLS0tLQorCisgICBmdW5jdGlvbiBBdmFpbF9JbiAoU3RybSA6IGluIFpfU3RyZWFtKSByZXR1cm4gVUludCBpcworICAgYmVnaW4KKyAgICAgIHJldHVybiBTdHJtLkF2YWlsX0luOworICAgZW5kIEF2YWlsX0luOworCisgICAtLS0tLS0tLS0tLS0tLS0KKyAgIC0tIEF2YWlsX091dCAtLQorICAgLS0tLS0tLS0tLS0tLS0tCisKKyAgIGZ1bmN0aW9uIEF2YWlsX091dCAoU3RybSA6IGluIFpfU3RyZWFtKSByZXR1cm4gVUludCBpcworICAgYmVnaW4KKyAgICAgIHJldHVybiBTdHJtLkF2YWlsX091dDsKKyAgIGVuZCBBdmFpbF9PdXQ7CisKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLQorICAgLS0gRGVmbGF0ZV9Jbml0IC0tCisgICAtLS0tLS0tLS0tLS0tLS0tLS0KKworICAgZnVuY3Rpb24gRGVmbGF0ZV9Jbml0CisgICAgIChzdHJtICAgICAgIDogWl9TdHJlYW1wOworICAgICAgbGV2ZWwgICAgICA6IEludDsKKyAgICAgIG1ldGhvZCAgICAgOiBJbnQ7CisgICAgICB3aW5kb3dCaXRzIDogSW50OworICAgICAgbWVtTGV2ZWwgICA6IEludDsKKyAgICAgIHN0cmF0ZWd5ICAgOiBJbnQpCisgICAgICByZXR1cm4gICAgICAgSW50IGlzCisgICBiZWdpbgorICAgICAgcmV0dXJuIGRlZmxhdGVJbml0MgorICAgICAgICAgICAgICAgKHN0cm0sCisgICAgICAgICAgICAgICAgbGV2ZWwsCisgICAgICAgICAgICAgICAgbWV0aG9kLAorICAgICAgICAgICAgICAgIHdpbmRvd0JpdHMsCisgICAgICAgICAgICAgICAgbWVtTGV2ZWwsCisgICAgICAgICAgICAgICAgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgWkxJQl9WRVJTSU9OLAorICAgICAgICAgICAgICAgIFpfU3RyZWFtX1NpemUpOworICAgZW5kIERlZmxhdGVfSW5pdDsKKworICAgLS0tLS0tLS0tLS0tLS0tLS0tCisgICAtLSBJbmZsYXRlX0luaXQgLS0KKyAgIC0tLS0tLS0tLS0tLS0tLS0tLQorCisgICBmdW5jdGlvbiBJbmZsYXRlX0luaXQgKHN0cm0gOiBaX1N0cmVhbXA7IHdpbmRvd0JpdHMgOiBJbnQpIHJldHVybiBJbnQgaXMKKyAgIGJlZ2luCisgICAgICByZXR1cm4gaW5mbGF0ZUluaXQyIChzdHJtLCB3aW5kb3dCaXRzLCBaTElCX1ZFUlNJT04sIFpfU3RyZWFtX1NpemUpOworICAgZW5kIEluZmxhdGVfSW5pdDsKKworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAtLSBMYXN0X0Vycm9yX01lc3NhZ2UgLS0KKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICBmdW5jdGlvbiBMYXN0X0Vycm9yX01lc3NhZ2UgKFN0cm0gOiBpbiBaX1N0cmVhbSkgcmV0dXJuIFN0cmluZyBpcworICAgICAgdXNlIEludGVyZmFjZXMuQy5TdHJpbmdzOworICAgYmVnaW4KKyAgICAgIGlmIFN0cm0ubXNnID0gTnVsbF9QdHIgdGhlbgorICAgICAgICAgcmV0dXJuICIiOworICAgICAgZWxzZQorICAgICAgICAgcmV0dXJuIFZhbHVlIChTdHJtLm1zZyk7CisgICAgICBlbmQgaWY7CisgICBlbmQgTGFzdF9FcnJvcl9NZXNzYWdlOworCisgICAtLS0tLS0tLS0tLS0KKyAgIC0tIFNldF9JbiAtLQorICAgLS0tLS0tLS0tLS0tCisKKyAgIHByb2NlZHVyZSBTZXRfSW4KKyAgICAgKFN0cm0gICA6IGluIG91dCBaX1N0cmVhbTsKKyAgICAgIEJ1ZmZlciA6IGluICAgICBWb2lkcDsKKyAgICAgIFNpemUgICA6IGluICAgICBVSW50KSBpcworICAgYmVnaW4KKyAgICAgIFN0cm0uTmV4dF9JbiAgOj0gQnVmZmVyOworICAgICAgU3RybS5BdmFpbF9JbiA6PSBTaXplOworICAgZW5kIFNldF9JbjsKKworICAgLS0tLS0tLS0tLS0tLS0tLS0tCisgICAtLSBTZXRfTWVtX0Z1bmMgLS0KKyAgIC0tLS0tLS0tLS0tLS0tLS0tLQorCisgICBwcm9jZWR1cmUgU2V0X01lbV9GdW5jCisgICAgIChTdHJtICAgOiBpbiBvdXQgWl9TdHJlYW07CisgICAgICBPcGFxdWUgOiBpbiAgICAgVm9pZHA7CisgICAgICBBbGxvYyAgOiBpbiAgICAgYWxsb2NfZnVuYzsKKyAgICAgIEZyZWUgICA6IGluICAgICBmcmVlX2Z1bmMpIGlzCisgICBiZWdpbgorICAgICAgU3RybS5vcGFxdWUgOj0gT3BhcXVlOworICAgICAgU3RybS56YWxsb2MgOj0gQWxsb2M7CisgICAgICBTdHJtLnpmcmVlICA6PSBGcmVlOworICAgZW5kIFNldF9NZW1fRnVuYzsKKworICAgLS0tLS0tLS0tLS0tLQorICAgLS0gU2V0X091dCAtLQorICAgLS0tLS0tLS0tLS0tLQorCisgICBwcm9jZWR1cmUgU2V0X091dAorICAgICAoU3RybSAgIDogaW4gb3V0IFpfU3RyZWFtOworICAgICAgQnVmZmVyIDogaW4gICAgIFZvaWRwOworICAgICAgU2l6ZSAgIDogaW4gICAgIFVJbnQpIGlzCisgICBiZWdpbgorICAgICAgU3RybS5OZXh0X091dCAgOj0gQnVmZmVyOworICAgICAgU3RybS5BdmFpbF9PdXQgOj0gU2l6ZTsKKyAgIGVuZCBTZXRfT3V0OworCisgICAtLS0tLS0tLS0tLS0tLQorICAgLS0gVG90YWxfSW4gLS0KKyAgIC0tLS0tLS0tLS0tLS0tCisKKyAgIGZ1bmN0aW9uIFRvdGFsX0luIChTdHJtIDogaW4gWl9TdHJlYW0pIHJldHVybiBVTG9uZyBpcworICAgYmVnaW4KKyAgICAgIHJldHVybiBTdHJtLlRvdGFsX0luOworICAgZW5kIFRvdGFsX0luOworCisgICAtLS0tLS0tLS0tLS0tLS0KKyAgIC0tIFRvdGFsX091dCAtLQorICAgLS0tLS0tLS0tLS0tLS0tCisKKyAgIGZ1bmN0aW9uIFRvdGFsX091dCAoU3RybSA6IGluIFpfU3RyZWFtKSByZXR1cm4gVUxvbmcgaXMKKyAgIGJlZ2luCisgICAgICByZXR1cm4gU3RybS5Ub3RhbF9PdXQ7CisgICBlbmQgVG90YWxfT3V0OworCitlbmQgWkxpYi5UaGluOwpkaWZmIC0tZ2l0IGEvemxpYi0xLjIuNi9jb250cmliL2FkYS96bGliLXRoaW4uYWRzIGIvemxpYi0xLjIuNi9jb250cmliL2FkYS96bGliLXRoaW4uYWRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0NDA3ZWIKLS0tIC9kZXYvbnVsbAorKysgYi96bGliLTEuMi42L2NvbnRyaWIvYWRhL3psaWItdGhpbi5hZHMKQEAgLTAsMCArMSw0NTAgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tICBaTGliIGZvciBBZGEgdGhpY2sgYmluZGluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICBDb3B5cmlnaHQgKEMpIDIwMDItMjAwMyBEbWl0cml5IEFuaXNpbWtvdiAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICBPcGVuIHNvdXJjZSBsaWNlbnNlIGluZm9ybWF0aW9uIGlzIGluIHRoZSB6bGliLmFkcyBmaWxlLiAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLS0gICRJZDogemxpYi10aGluLmFkcyx2IDEuMTEgMjAwNC8wNy8yMyAwNjozMzoxMSB2YWd1bCBFeHAgJAorCit3aXRoIEludGVyZmFjZXMuQy5TdHJpbmdzOworCit3aXRoIFN5c3RlbTsKKworcHJpdmF0ZSBwYWNrYWdlIFpMaWIuVGhpbiBpcworCisgICAtLSAgRnJvbSB6Y29uZi5oCisKKyAgIE1BWF9NRU1fTEVWRUwgOiBjb25zdGFudCA6PSA5OyAgICAgICAgIC0tICB6Y29uZi5oOjEwNQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gIHpjb25mLmg6MTA1CisgICBNQVhfV0JJVFMgOiBjb25zdGFudCA6PSAxNTsgICAgICAtLSAgemNvbmYuaDoxMTUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICAzMksgTFo3NyB3aW5kb3cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICB6Y29uZi5oOjExNQorICAgU0VFS19TRVQgOiBjb25zdGFudCA6PSA4IzAwMDAjOyAgLS0gIHpjb25mLmg6MjQ0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAgU2VlayBmcm9tIGJlZ2lubmluZyBvZiBmaWxlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gIHpjb25mLmg6MjQ0CisgICBTRUVLX0NVUiA6IGNvbnN0YW50IDo9IDE7ICAgICAgICAtLSAgemNvbmYuaDoyNDUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICBTZWVrIGZyb20gY3VycmVudCBwb3NpdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICB6Y29uZi5oOjI0NQorICAgU0VFS19FTkQgOiBjb25zdGFudCA6PSAyOyAgICAgICAgLS0gIHpjb25mLmg6MjQ2CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAgU2V0IGZpbGUgcG9pbnRlciB0byBFT0YgcGx1cyAib2Zmc2V0IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gIHpjb25mLmg6MjQ2CisKKyAgIHR5cGUgQnl0ZSBpcyBuZXcgSW50ZXJmYWNlcy5DLnVuc2lnbmVkX2NoYXI7IC0tICA4IGJpdHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICB6Y29uZi5oOjIxNAorICAgdHlwZSBVSW50IGlzIG5ldyBJbnRlcmZhY2VzLkMudW5zaWduZWQ7ICAgICAgLS0gIDE2IGJpdHMgb3IgbW9yZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gIHpjb25mLmg6MjE2CisgICB0eXBlIEludCBpcyBuZXcgSW50ZXJmYWNlcy5DLmludDsKKworICAgdHlwZSBVTG9uZyBpcyBuZXcgSW50ZXJmYWNlcy5DLnVuc2lnbmVkX2xvbmc7ICAgICAtLSAgMzIgYml0cyBvciBtb3JlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICB6Y29uZi5oOjIxNworICAgc3VidHlwZSBDaGFyc19QdHIgaXMgSW50ZXJmYWNlcy5DLlN0cmluZ3MuY2hhcnNfcHRyOworCisgICB0eXBlIFVMb25nX0FjY2VzcyBpcyBhY2Nlc3MgVUxvbmc7CisgICB0eXBlIEludF9BY2Nlc3MgaXMgYWNjZXNzIEludDsKKworICAgc3VidHlwZSBWb2lkcCBpcyBTeXN0ZW0uQWRkcmVzczsgICAgICAgICAgICAtLSAgemNvbmYuaDoyMzIKKworICAgc3VidHlwZSBCeXRlX0FjY2VzcyBpcyBWb2lkcDsKKworICAgTnVsIDogY29uc3RhbnQgVm9pZHAgOj0gU3lzdGVtLk51bGxfQWRkcmVzczsKKyAgIC0tICBlbmQgZnJvbSB6Y29uZgorCisgICBaX05PX0ZMVVNIIDogY29uc3RhbnQgOj0gOCMwMDAwIzsgICAtLSAgemxpYi5oOjEyNQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gIHpsaWIuaDoxMjUKKyAgIFpfUEFSVElBTF9GTFVTSCA6IGNvbnN0YW50IDo9IDE7ICAgICAgIC0tICB6bGliLmg6MTI2CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAgd2lsbCBiZSByZW1vdmVkLCB1c2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICBaX1NZTkNfRkxVU0ggaW5zdGVhZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gIHpsaWIuaDoxMjYKKyAgIFpfU1lOQ19GTFVTSCA6IGNvbnN0YW50IDo9IDI7ICAgICAgIC0tICB6bGliLmg6MTI3CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAgemxpYi5oOjEyNworICAgWl9GVUxMX0ZMVVNIIDogY29uc3RhbnQgOj0gMzsgICAgICAgLS0gIHpsaWIuaDoxMjgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICB6bGliLmg6MTI4CisgICBaX0ZJTklTSCA6IGNvbnN0YW50IDo9IDQ7ICAgICAgICAtLSAgemxpYi5oOjEyOQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gIHpsaWIuaDoxMjkKKyAgIFpfT0sgOiBjb25zdGFudCA6PSA4IzAwMDAjOyAgIC0tICB6bGliLmg6MTMyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAgemxpYi5oOjEzMgorICAgWl9TVFJFQU1fRU5EIDogY29uc3RhbnQgOj0gMTsgICAgICAgLS0gIHpsaWIuaDoxMzMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICB6bGliLmg6MTMzCisgICBaX05FRURfRElDVCA6IGNvbnN0YW50IDo9IDI7ICAgICAgICAtLSAgemxpYi5oOjEzNAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gIHpsaWIuaDoxMzQKKyAgIFpfRVJSTk8gOiBjb25zdGFudCA6PSAtMTsgICAgICAgIC0tICB6bGliLmg6MTM1CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAgemxpYi5oOjEzNQorICAgWl9TVFJFQU1fRVJST1IgOiBjb25zdGFudCA6PSAtMjsgICAgICAgLS0gIHpsaWIuaDoxMzYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICB6bGliLmg6MTM2CisgICBaX0RBVEFfRVJST1IgOiBjb25zdGFudCA6PSAtMzsgICAgICAtLSAgemxpYi5oOjEzNworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gIHpsaWIuaDoxMzcKKyAgIFpfTUVNX0VSUk9SIDogY29uc3RhbnQgOj0gLTQ7ICAgICAgIC0tICB6bGliLmg6MTM4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAgemxpYi5oOjEzOAorICAgWl9CVUZfRVJST1IgOiBjb25zdGFudCA6PSAtNTsgICAgICAgLS0gIHpsaWIuaDoxMzkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICB6bGliLmg6MTM5CisgICBaX1ZFUlNJT05fRVJST1IgOiBjb25zdGFudCA6PSAtNjsgICAgICAtLSAgemxpYi5oOjE0MAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gIHpsaWIuaDoxNDAKKyAgIFpfTk9fQ09NUFJFU1NJT04gOiBjb25zdGFudCA6PSA4IzAwMDAjOyAgIC0tICB6bGliLmg6MTQ1CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAgemxpYi5oOjE0NQorICAgWl9CRVNUX1NQRUVEIDogY29uc3RhbnQgOj0gMTsgICAgICAgLS0gIHpsaWIuaDoxNDYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICB6bGliLmg6MTQ2CisgICBaX0JFU1RfQ09NUFJFU1NJT04gOiBjb25zdGFudCA6PSA5OyAgICAgICAtLSAgemxpYi5oOjE0NworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gIHpsaWIuaDoxNDcKKyAgIFpfREVGQVVMVF9DT01QUkVTU0lPTiA6IGNvbnN0YW50IDo9IC0xOyAgICAgIC0tICB6bGliLmg6MTQ4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAgemxpYi5oOjE0OAorICAgWl9GSUxURVJFRCA6IGNvbnN0YW50IDo9IDE7ICAgICAgLS0gIHpsaWIuaDoxNTEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICB6bGliLmg6MTUxCisgICBaX0hVRkZNQU5fT05MWSA6IGNvbnN0YW50IDo9IDI7ICAgICAgICAtLSAgemxpYi5oOjE1MgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gIHpsaWIuaDoxNTIKKyAgIFpfREVGQVVMVF9TVFJBVEVHWSA6IGNvbnN0YW50IDo9IDgjMDAwMCM7IC0tICB6bGliLmg6MTUzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAgemxpYi5oOjE1MworICAgWl9CSU5BUlkgOiBjb25zdGFudCA6PSA4IzAwMDAjOyAgLS0gIHpsaWIuaDoxNTYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICB6bGliLmg6MTU2CisgICBaX0FTQ0lJIDogY29uc3RhbnQgOj0gMTsgICAgICAtLSAgemxpYi5oOjE1NworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gIHpsaWIuaDoxNTcKKyAgIFpfVU5LTk9XTiA6IGNvbnN0YW50IDo9IDI7ICAgICAgIC0tICB6bGliLmg6MTU4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAgemxpYi5oOjE1OAorICAgWl9ERUZMQVRFRCA6IGNvbnN0YW50IDo9IDg7ICAgICAgLS0gIHpsaWIuaDoxNjEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICB6bGliLmg6MTYxCisgICBaX05VTEwgOiBjb25zdGFudCA6PSA4IzAwMDAjOyAtLSAgemxpYi5oOjE2NAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gIGZvciBpbml0aWFsaXppbmcgemFsbG9jLCB6ZnJlZSwgb3BhcXVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAgemxpYi5oOjE2NAorICAgdHlwZSBnekZpbGUgaXMgbmV3IFZvaWRwOyAgICAgICAgICAgICAgICAgIC0tICB6bGliLmg6NjQ2CisKKyAgIHR5cGUgWl9TdHJlYW0gaXMgcHJpdmF0ZTsKKworICAgdHlwZSBaX1N0cmVhbXAgaXMgYWNjZXNzIGFsbCBaX1N0cmVhbTsgICAgIC0tICB6bGliLmg6ODkKKworICAgdHlwZSBhbGxvY19mdW5jIGlzIGFjY2VzcyBmdW5jdGlvbgorICAgICAoT3BhcXVlIDogVm9pZHA7CisgICAgICBJdGVtcyAgOiBVSW50OworICAgICAgU2l6ZSAgIDogVUludCkKKyAgICAgIHJldHVybiBWb2lkcDsgLS0gIHpsaWIuaDo2MworCisgICB0eXBlIGZyZWVfZnVuYyBpcyBhY2Nlc3MgcHJvY2VkdXJlIChvcGFxdWUgOiBWb2lkcDsgYWRkcmVzcyA6IFZvaWRwKTsKKworICAgZnVuY3Rpb24gemxpYlZlcnNpb24gcmV0dXJuIENoYXJzX1B0cjsKKworICAgZnVuY3Rpb24gRGVmbGF0ZSAoc3RybSA6IFpfU3RyZWFtcDsgZmx1c2ggOiBJbnQpIHJldHVybiBJbnQ7CisKKyAgIGZ1bmN0aW9uIERlZmxhdGVFbmQgKHN0cm0gOiBaX1N0cmVhbXApIHJldHVybiBJbnQ7CisKKyAgIGZ1bmN0aW9uIEluZmxhdGUgKHN0cm0gOiBaX1N0cmVhbXA7IGZsdXNoIDogSW50KSByZXR1cm4gSW50OworCisgICBmdW5jdGlvbiBJbmZsYXRlRW5kIChzdHJtIDogWl9TdHJlYW1wKSByZXR1cm4gSW50OworCisgICBmdW5jdGlvbiBkZWZsYXRlU2V0RGljdGlvbmFyeQorICAgICAoc3RybSAgICAgICA6IFpfU3RyZWFtcDsKKyAgICAgIGRpY3Rpb25hcnkgOiBCeXRlX0FjY2VzczsKKyAgICAgIGRpY3RMZW5ndGggOiBVSW50KQorICAgICAgcmV0dXJuICAgICAgIEludDsKKworICAgZnVuY3Rpb24gZGVmbGF0ZUNvcHkgKGRlc3QgOiBaX1N0cmVhbXA7IHNvdXJjZSA6IFpfU3RyZWFtcCkgcmV0dXJuIEludDsKKyAgIC0tICB6bGliLmg6NDc4CisKKyAgIGZ1bmN0aW9uIGRlZmxhdGVSZXNldCAoc3RybSA6IFpfU3RyZWFtcCkgcmV0dXJuIEludDsgLS0gemxpYi5oOjQ5NQorCisgICBmdW5jdGlvbiBkZWZsYXRlUGFyYW1zCisgICAgIChzdHJtICAgICA6IFpfU3RyZWFtcDsKKyAgICAgIGxldmVsICAgIDogSW50OworICAgICAgc3RyYXRlZ3kgOiBJbnQpCisgICAgICByZXR1cm4gICAgIEludDsgICAgICAgLS0gemxpYi5oOjUwNgorCisgICBmdW5jdGlvbiBpbmZsYXRlU2V0RGljdGlvbmFyeQorICAgICAoc3RybSAgICAgICA6IFpfU3RyZWFtcDsKKyAgICAgIGRpY3Rpb25hcnkgOiBCeXRlX0FjY2VzczsKKyAgICAgIGRpY3RMZW5ndGggOiBVSW50KQorICAgICAgcmV0dXJuICAgICAgIEludDsgLS0gIHpsaWIuaDo1NDgKKworICAgZnVuY3Rpb24gaW5mbGF0ZVN5bmMgKHN0cm0gOiBaX1N0cmVhbXApIHJldHVybiBJbnQ7ICAtLSAgemxpYi5oOjU2NQorCisgICBmdW5jdGlvbiBpbmZsYXRlUmVzZXQgKHN0cm0gOiBaX1N0cmVhbXApIHJldHVybiBJbnQ7IC0tICB6bGliLmg6NTgwCisKKyAgIGZ1bmN0aW9uIGNvbXByZXNzCisgICAgIChkZXN0ICAgICAgOiBCeXRlX0FjY2VzczsKKyAgICAgIGRlc3RMZW4gICA6IFVMb25nX0FjY2VzczsKKyAgICAgIHNvdXJjZSAgICA6IEJ5dGVfQWNjZXNzOworICAgICAgc291cmNlTGVuIDogVUxvbmcpCisgICAgICByZXR1cm4gICAgICBJbnQ7ICAgICAgICAgICAtLSB6bGliLmg6NjAxCisKKyAgIGZ1bmN0aW9uIGNvbXByZXNzMgorICAgICAoZGVzdCAgICAgIDogQnl0ZV9BY2Nlc3M7CisgICAgICBkZXN0TGVuICAgOiBVTG9uZ19BY2Nlc3M7CisgICAgICBzb3VyY2UgICAgOiBCeXRlX0FjY2VzczsKKyAgICAgIHNvdXJjZUxlbiA6IFVMb25nOworICAgICAgbGV2ZWwgICAgIDogSW50KQorICAgICAgcmV0dXJuICAgICAgSW50OyAgICAgICAgICAtLSB6bGliLmg6NjE1CisKKyAgIGZ1bmN0aW9uIHVuY29tcHJlc3MKKyAgICAgKGRlc3QgICAgICA6IEJ5dGVfQWNjZXNzOworICAgICAgZGVzdExlbiAgIDogVUxvbmdfQWNjZXNzOworICAgICAgc291cmNlICAgIDogQnl0ZV9BY2Nlc3M7CisgICAgICBzb3VyY2VMZW4gOiBVTG9uZykKKyAgICAgIHJldHVybiAgICAgIEludDsKKworICAgZnVuY3Rpb24gZ3pvcGVuIChwYXRoIDogQ2hhcnNfUHRyOyBtb2RlIDogQ2hhcnNfUHRyKSByZXR1cm4gZ3pGaWxlOworCisgICBmdW5jdGlvbiBnemRvcGVuIChmZCA6IEludDsgbW9kZSA6IENoYXJzX1B0cikgcmV0dXJuIGd6RmlsZTsKKworICAgZnVuY3Rpb24gZ3pzZXRwYXJhbXMKKyAgICAgKGZpbGUgICAgIDogZ3pGaWxlOworICAgICAgbGV2ZWwgICAgOiBJbnQ7CisgICAgICBzdHJhdGVneSA6IEludCkKKyAgICAgIHJldHVybiAgICAgSW50OworCisgICBmdW5jdGlvbiBnenJlYWQKKyAgICAgKGZpbGUgOiBnekZpbGU7CisgICAgICBidWYgIDogVm9pZHA7CisgICAgICBsZW4gIDogVUludCkKKyAgICAgIHJldHVybiBJbnQ7CisKKyAgIGZ1bmN0aW9uIGd6d3JpdGUKKyAgICAgKGZpbGUgOiBpbiBnekZpbGU7CisgICAgICBidWYgIDogaW4gVm9pZHA7CisgICAgICBsZW4gIDogaW4gVUludCkKKyAgICAgIHJldHVybiBJbnQ7CisKKyAgIGZ1bmN0aW9uIGd6cHJpbnRmIChmaWxlIDogaW4gZ3pGaWxlOyBmb3JtYXQgOiBpbiBDaGFyc19QdHIpIHJldHVybiBJbnQ7CisKKyAgIGZ1bmN0aW9uIGd6cHV0cyAoZmlsZSA6IGluIGd6RmlsZTsgcyA6IGluIENoYXJzX1B0cikgcmV0dXJuIEludDsKKworICAgZnVuY3Rpb24gZ3pnZXRzCisgICAgIChmaWxlIDogZ3pGaWxlOworICAgICAgYnVmICA6IENoYXJzX1B0cjsKKyAgICAgIGxlbiAgOiBJbnQpCisgICAgICByZXR1cm4gQ2hhcnNfUHRyOworCisgICBmdW5jdGlvbiBnenB1dGMgKGZpbGUgOiBnekZpbGU7IGNoYXIgOiBJbnQpIHJldHVybiBJbnQ7CisKKyAgIGZ1bmN0aW9uIGd6Z2V0YyAoZmlsZSA6IGd6RmlsZSkgcmV0dXJuIEludDsKKworICAgZnVuY3Rpb24gZ3pmbHVzaCAoZmlsZSA6IGd6RmlsZTsgZmx1c2ggOiBJbnQpIHJldHVybiBJbnQ7CisKKyAgIGZ1bmN0aW9uIGd6c2VlaworICAgICAoZmlsZSAgIDogZ3pGaWxlOworICAgICAgb2Zmc2V0IDogSW50OworICAgICAgd2hlbmNlIDogSW50KQorICAgICAgcmV0dXJuICAgSW50OworCisgICBmdW5jdGlvbiBnenJld2luZCAoZmlsZSA6IGd6RmlsZSkgcmV0dXJuIEludDsKKworICAgZnVuY3Rpb24gZ3p0ZWxsIChmaWxlIDogZ3pGaWxlKSByZXR1cm4gSW50OworCisgICBmdW5jdGlvbiBnemVvZiAoZmlsZSA6IGd6RmlsZSkgcmV0dXJuIEludDsKKworICAgZnVuY3Rpb24gZ3pjbG9zZSAoZmlsZSA6IGd6RmlsZSkgcmV0dXJuIEludDsKKworICAgZnVuY3Rpb24gZ3plcnJvciAoZmlsZSA6IGd6RmlsZTsgZXJybnVtIDogSW50X0FjY2VzcykgcmV0dXJuIENoYXJzX1B0cjsKKworICAgZnVuY3Rpb24gYWRsZXIzMgorICAgICAoYWRsZXIgOiBVTG9uZzsKKyAgICAgIGJ1ZiAgIDogQnl0ZV9BY2Nlc3M7CisgICAgICBsZW4gICA6IFVJbnQpCisgICAgICByZXR1cm4gIFVMb25nOworCisgICBmdW5jdGlvbiBjcmMzMgorICAgICAoY3JjICA6IFVMb25nOworICAgICAgYnVmICA6IEJ5dGVfQWNjZXNzOworICAgICAgbGVuICA6IFVJbnQpCisgICAgICByZXR1cm4gVUxvbmc7CisKKyAgIGZ1bmN0aW9uIGRlZmxhdGVJbml0CisgICAgIChzdHJtICAgICAgICA6IFpfU3RyZWFtcDsKKyAgICAgIGxldmVsICAgICAgIDogSW50OworICAgICAgdmVyc2lvbiAgICAgOiBDaGFyc19QdHI7CisgICAgICBzdHJlYW1fc2l6ZSA6IEludCkKKyAgICAgIHJldHVybiAgICAgICAgSW50OworCisgICBmdW5jdGlvbiBkZWZsYXRlSW5pdDIKKyAgICAgKHN0cm0gICAgICAgIDogWl9TdHJlYW1wOworICAgICAgbGV2ZWwgICAgICAgOiBJbnQ7CisgICAgICBtZXRob2QgICAgICA6IEludDsKKyAgICAgIHdpbmRvd0JpdHMgIDogSW50OworICAgICAgbWVtTGV2ZWwgICAgOiBJbnQ7CisgICAgICBzdHJhdGVneSAgICA6IEludDsKKyAgICAgIHZlcnNpb24gICAgIDogQ2hhcnNfUHRyOworICAgICAgc3RyZWFtX3NpemUgOiBJbnQpCisgICAgICByZXR1cm4gICAgICAgIEludDsKKworICAgZnVuY3Rpb24gRGVmbGF0ZV9Jbml0CisgICAgIChzdHJtICAgICAgIDogWl9TdHJlYW1wOworICAgICAgbGV2ZWwgICAgICA6IEludDsKKyAgICAgIG1ldGhvZCAgICAgOiBJbnQ7CisgICAgICB3aW5kb3dCaXRzIDogSW50OworICAgICAgbWVtTGV2ZWwgICA6IEludDsKKyAgICAgIHN0cmF0ZWd5ICAgOiBJbnQpCisgICAgICByZXR1cm4gICAgICAgSW50OworICAgcHJhZ21hIElubGluZSAoRGVmbGF0ZV9Jbml0KTsKKworICAgZnVuY3Rpb24gaW5mbGF0ZUluaXQKKyAgICAgKHN0cm0gICAgICAgIDogWl9TdHJlYW1wOworICAgICAgdmVyc2lvbiAgICAgOiBDaGFyc19QdHI7CisgICAgICBzdHJlYW1fc2l6ZSA6IEludCkKKyAgICAgIHJldHVybiAgICAgICAgSW50OworCisgICBmdW5jdGlvbiBpbmZsYXRlSW5pdDIKKyAgICAgKHN0cm0gICAgICAgIDogaW4gWl9TdHJlYW1wOworICAgICAgd2luZG93Qml0cyAgOiBpbiBJbnQ7CisgICAgICB2ZXJzaW9uICAgICA6IGluIENoYXJzX1B0cjsKKyAgICAgIHN0cmVhbV9zaXplIDogaW4gSW50KQorICAgICAgcmV0dXJuICAgICAgSW50OworCisgICBmdW5jdGlvbiBpbmZsYXRlQmFja0luaXQKKyAgICAgKHN0cm0gICAgICAgIDogaW4gWl9TdHJlYW1wOworICAgICAgd2luZG93Qml0cyAgOiBpbiBJbnQ7CisgICAgICB3aW5kb3cgICAgICA6IGluIEJ5dGVfQWNjZXNzOworICAgICAgdmVyc2lvbiAgICAgOiBpbiBDaGFyc19QdHI7CisgICAgICBzdHJlYW1fc2l6ZSA6IGluIEludCkKKyAgICAgIHJldHVybiAgICAgIEludDsKKyAgIC0tICBTaXplIG9mIHdpbmRvdyBoYXZlIHRvIGJlIDIqKndpbmRvd0JpdHMuCisKKyAgIGZ1bmN0aW9uIEluZmxhdGVfSW5pdCAoc3RybSA6IFpfU3RyZWFtcDsgd2luZG93Qml0cyA6IEludCkgcmV0dXJuIEludDsKKyAgIHByYWdtYSBJbmxpbmUgKEluZmxhdGVfSW5pdCk7CisKKyAgIGZ1bmN0aW9uIHpFcnJvciAoZXJyIDogSW50KSByZXR1cm4gQ2hhcnNfUHRyOworCisgICBmdW5jdGlvbiBpbmZsYXRlU3luY1BvaW50ICh6IDogWl9TdHJlYW1wKSByZXR1cm4gSW50OworCisgICBmdW5jdGlvbiBnZXRfY3JjX3RhYmxlIHJldHVybiBVTG9uZ19BY2Nlc3M7CisKKyAgIC0tICBJbnRlcmZhY2UgdG8gdGhlIGF2YWlsYWJsZSBmaWVsZHMgb2YgdGhlIHpfc3RyZWFtIHN0cnVjdHVyZS4KKyAgIC0tICBUaGUgYXBwbGljYXRpb24gbXVzdCB1cGRhdGUgbmV4dF9pbiBhbmQgYXZhaWxfaW4gd2hlbiBhdmFpbF9pbiBoYXMKKyAgIC0tICBkcm9wcGVkIHRvIHplcm8uIEl0IG11c3QgdXBkYXRlIG5leHRfb3V0IGFuZCBhdmFpbF9vdXQgd2hlbiBhdmFpbF9vdXQKKyAgIC0tICBoYXMgZHJvcHBlZCB0byB6ZXJvLiBUaGUgYXBwbGljYXRpb24gbXVzdCBpbml0aWFsaXplIHphbGxvYywgemZyZWUgYW5kCisgICAtLSAgb3BhcXVlIGJlZm9yZSBjYWxsaW5nIHRoZSBpbml0IGZ1bmN0aW9uLgorCisgICBwcm9jZWR1cmUgU2V0X0luCisgICAgIChTdHJtICAgOiBpbiBvdXQgWl9TdHJlYW07CisgICAgICBCdWZmZXIgOiBpbiBWb2lkcDsKKyAgICAgIFNpemUgICA6IGluIFVJbnQpOworICAgcHJhZ21hIElubGluZSAoU2V0X0luKTsKKworICAgcHJvY2VkdXJlIFNldF9PdXQKKyAgICAgKFN0cm0gICA6IGluIG91dCBaX1N0cmVhbTsKKyAgICAgIEJ1ZmZlciA6IGluIFZvaWRwOworICAgICAgU2l6ZSAgIDogaW4gVUludCk7CisgICBwcmFnbWEgSW5saW5lIChTZXRfT3V0KTsKKworICAgcHJvY2VkdXJlIFNldF9NZW1fRnVuYworICAgICAoU3RybSAgIDogaW4gb3V0IFpfU3RyZWFtOworICAgICAgT3BhcXVlIDogaW4gVm9pZHA7CisgICAgICBBbGxvYyAgOiBpbiBhbGxvY19mdW5jOworICAgICAgRnJlZSAgIDogaW4gZnJlZV9mdW5jKTsKKyAgIHByYWdtYSBJbmxpbmUgKFNldF9NZW1fRnVuYyk7CisKKyAgIGZ1bmN0aW9uIExhc3RfRXJyb3JfTWVzc2FnZSAoU3RybSA6IGluIFpfU3RyZWFtKSByZXR1cm4gU3RyaW5nOworICAgcHJhZ21hIElubGluZSAoTGFzdF9FcnJvcl9NZXNzYWdlKTsKKworICAgZnVuY3Rpb24gQXZhaWxfT3V0IChTdHJtIDogaW4gWl9TdHJlYW0pIHJldHVybiBVSW50OworICAgcHJhZ21hIElubGluZSAoQXZhaWxfT3V0KTsKKworICAgZnVuY3Rpb24gQXZhaWxfSW4gKFN0cm0gOiBpbiBaX1N0cmVhbSkgcmV0dXJuIFVJbnQ7CisgICBwcmFnbWEgSW5saW5lIChBdmFpbF9Jbik7CisKKyAgIGZ1bmN0aW9uIFRvdGFsX0luIChTdHJtIDogaW4gWl9TdHJlYW0pIHJldHVybiBVTG9uZzsKKyAgIHByYWdtYSBJbmxpbmUgKFRvdGFsX0luKTsKKworICAgZnVuY3Rpb24gVG90YWxfT3V0IChTdHJtIDogaW4gWl9TdHJlYW0pIHJldHVybiBVTG9uZzsKKyAgIHByYWdtYSBJbmxpbmUgKFRvdGFsX091dCk7CisKKyAgIGZ1bmN0aW9uIGluZmxhdGVDb3B5CisgICAgIChkZXN0ICAgOiBpbiBaX1N0cmVhbXA7CisgICAgICBTb3VyY2UgOiBpbiBaX1N0cmVhbXApCisgICAgICByZXR1cm4gSW50OworCisgICBmdW5jdGlvbiBjb21wcmVzc0JvdW5kIChTb3VyY2VfTGVuIDogaW4gVUxvbmcpIHJldHVybiBVTG9uZzsKKworICAgZnVuY3Rpb24gZGVmbGF0ZUJvdW5kCisgICAgIChTdHJtICAgICAgIDogaW4gWl9TdHJlYW1wOworICAgICAgU291cmNlX0xlbiA6IGluIFVMb25nKQorICAgICAgcmV0dXJuICAgICBVTG9uZzsKKworICAgZnVuY3Rpb24gZ3p1bmdldGMgKEMgOiBpbiBJbnQ7IEZpbGUgOiBpbiAgZ3pGaWxlKSByZXR1cm4gSW50OworCisgICBmdW5jdGlvbiB6bGliQ29tcGlsZUZsYWdzIHJldHVybiBVTG9uZzsKKworcHJpdmF0ZQorCisgICB0eXBlIFpfU3RyZWFtIGlzIHJlY29yZCAgICAgICAgICAgIC0tIHpsaWIuaDo2OAorICAgICAgTmV4dF9JbiAgIDogVm9pZHAgICAgICA6PSBOdWw7ICAtLSBuZXh0IGlucHV0IGJ5dGUKKyAgICAgIEF2YWlsX0luICA6IFVJbnQgICAgICAgOj0gMDsgICAgLS0gbnVtYmVyIG9mIGJ5dGVzIGF2YWlsYWJsZSBhdCBuZXh0X2luCisgICAgICBUb3RhbF9JbiAgOiBVTG9uZyAgICAgIDo9IDA7ICAgIC0tIHRvdGFsIG5iIG9mIGlucHV0IGJ5dGVzIHJlYWQgc28gZmFyCisgICAgICBOZXh0X091dCAgOiBWb2lkcCAgICAgIDo9IE51bDsgIC0tIG5leHQgb3V0cHV0IGJ5dGUgc2hvdWxkIGJlIHB1dCB0aGVyZQorICAgICAgQXZhaWxfT3V0IDogVUludCAgICAgICA6PSAwOyAgICAtLSByZW1haW5pbmcgZnJlZSBzcGFjZSBhdCBuZXh0X291dAorICAgICAgVG90YWxfT3V0IDogVUxvbmcgICAgICA6PSAwOyAgICAtLSB0b3RhbCBuYiBvZiBieXRlcyBvdXRwdXQgc28gZmFyCisgICAgICBtc2cgICAgICAgOiBDaGFyc19QdHI7ICAgICAgICAgIC0tIGxhc3QgZXJyb3IgbWVzc2FnZSwgTlVMTCBpZiBubyBlcnJvcgorICAgICAgc3RhdGUgICAgIDogVm9pZHA7ICAgICAgICAgICAgICAtLSBub3QgdmlzaWJsZSBieSBhcHBsaWNhdGlvbnMKKyAgICAgIHphbGxvYyAgICA6IGFsbG9jX2Z1bmMgOj0gbnVsbDsgLS0gdXNlZCB0byBhbGxvY2F0ZSB0aGUgaW50ZXJuYWwgc3RhdGUKKyAgICAgIHpmcmVlICAgICA6IGZyZWVfZnVuYyAgOj0gbnVsbDsgLS0gdXNlZCB0byBmcmVlIHRoZSBpbnRlcm5hbCBzdGF0ZQorICAgICAgb3BhcXVlICAgIDogVm9pZHA7ICAgICAgICAgICAgICAtLSBwcml2YXRlIGRhdGEgb2JqZWN0IHBhc3NlZCB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAgemFsbG9jIGFuZCB6ZnJlZQorICAgICAgZGF0YV90eXBlIDogSW50OyAgICAgICAgICAgICAgICAtLSBiZXN0IGd1ZXNzIGFib3V0IHRoZSBkYXRhIHR5cGU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICBhc2NpaSBvciBiaW5hcnkKKyAgICAgIGFkbGVyICAgICA6IFVMb25nOyAgICAgICAgICAgICAgLS0gYWRsZXIzMiB2YWx1ZSBvZiB0aGUgdW5jb21wcmVzc2VkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICBkYXRhCisgICAgICByZXNlcnZlZCAgOiBVTG9uZzsgICAgICAgICAgICAgIC0tIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlCisgICBlbmQgcmVjb3JkOworCisgICBwcmFnbWEgQ29udmVudGlvbiAoQywgWl9TdHJlYW0pOworCisgICBwcmFnbWEgSW1wb3J0IChDLCB6bGliVmVyc2lvbiwgInpsaWJWZXJzaW9uIik7CisgICBwcmFnbWEgSW1wb3J0IChDLCBEZWZsYXRlLCAiZGVmbGF0ZSIpOworICAgcHJhZ21hIEltcG9ydCAoQywgRGVmbGF0ZUVuZCwgImRlZmxhdGVFbmQiKTsKKyAgIHByYWdtYSBJbXBvcnQgKEMsIEluZmxhdGUsICJpbmZsYXRlIik7CisgICBwcmFnbWEgSW1wb3J0IChDLCBJbmZsYXRlRW5kLCAiaW5mbGF0ZUVuZCIpOworICAgcHJhZ21hIEltcG9ydCAoQywgZGVmbGF0ZVNldERpY3Rpb25hcnksICJkZWZsYXRlU2V0RGljdGlvbmFyeSIpOworICAgcHJhZ21hIEltcG9ydCAoQywgZGVmbGF0ZUNvcHksICJkZWZsYXRlQ29weSIpOworICAgcHJhZ21hIEltcG9ydCAoQywgZGVmbGF0ZVJlc2V0LCAiZGVmbGF0ZVJlc2V0Iik7CisgICBwcmFnbWEgSW1wb3J0IChDLCBkZWZsYXRlUGFyYW1zLCAiZGVmbGF0ZVBhcmFtcyIpOworICAgcHJhZ21hIEltcG9ydCAoQywgaW5mbGF0ZVNldERpY3Rpb25hcnksICJpbmZsYXRlU2V0RGljdGlvbmFyeSIpOworICAgcHJhZ21hIEltcG9ydCAoQywgaW5mbGF0ZVN5bmMsICJpbmZsYXRlU3luYyIpOworICAgcHJhZ21hIEltcG9ydCAoQywgaW5mbGF0ZVJlc2V0LCAiaW5mbGF0ZVJlc2V0Iik7CisgICBwcmFnbWEgSW1wb3J0IChDLCBjb21wcmVzcywgImNvbXByZXNzIik7CisgICBwcmFnbWEgSW1wb3J0IChDLCBjb21wcmVzczIsICJjb21wcmVzczIiKTsKKyAgIHByYWdtYSBJbXBvcnQgKEMsIHVuY29tcHJlc3MsICJ1bmNvbXByZXNzIik7CisgICBwcmFnbWEgSW1wb3J0IChDLCBnem9wZW4sICJnem9wZW4iKTsKKyAgIHByYWdtYSBJbXBvcnQgKEMsIGd6ZG9wZW4sICJnemRvcGVuIik7CisgICBwcmFnbWEgSW1wb3J0IChDLCBnenNldHBhcmFtcywgImd6c2V0cGFyYW1zIik7CisgICBwcmFnbWEgSW1wb3J0IChDLCBnenJlYWQsICJnenJlYWQiKTsKKyAgIHByYWdtYSBJbXBvcnQgKEMsIGd6d3JpdGUsICJnendyaXRlIik7CisgICBwcmFnbWEgSW1wb3J0IChDLCBnenByaW50ZiwgImd6cHJpbnRmIik7CisgICBwcmFnbWEgSW1wb3J0IChDLCBnenB1dHMsICJnenB1dHMiKTsKKyAgIHByYWdtYSBJbXBvcnQgKEMsIGd6Z2V0cywgImd6Z2V0cyIpOworICAgcHJhZ21hIEltcG9ydCAoQywgZ3pwdXRjLCAiZ3pwdXRjIik7CisgICBwcmFnbWEgSW1wb3J0IChDLCBnemdldGMsICJnemdldGMiKTsKKyAgIHByYWdtYSBJbXBvcnQgKEMsIGd6Zmx1c2gsICJnemZsdXNoIik7CisgICBwcmFnbWEgSW1wb3J0IChDLCBnenNlZWssICJnenNlZWsiKTsKKyAgIHByYWdtYSBJbXBvcnQgKEMsIGd6cmV3aW5kLCAiZ3pyZXdpbmQiKTsKKyAgIHByYWdtYSBJbXBvcnQgKEMsIGd6dGVsbCwgImd6dGVsbCIpOworICAgcHJhZ21hIEltcG9ydCAoQywgZ3plb2YsICJnemVvZiIpOworICAgcHJhZ21hIEltcG9ydCAoQywgZ3pjbG9zZSwgImd6Y2xvc2UiKTsKKyAgIHByYWdtYSBJbXBvcnQgKEMsIGd6ZXJyb3IsICJnemVycm9yIik7CisgICBwcmFnbWEgSW1wb3J0IChDLCBhZGxlcjMyLCAiYWRsZXIzMiIpOworICAgcHJhZ21hIEltcG9ydCAoQywgY3JjMzIsICJjcmMzMiIpOworICAgcHJhZ21hIEltcG9ydCAoQywgZGVmbGF0ZUluaXQsICJkZWZsYXRlSW5pdF8iKTsKKyAgIHByYWdtYSBJbXBvcnQgKEMsIGluZmxhdGVJbml0LCAiaW5mbGF0ZUluaXRfIik7CisgICBwcmFnbWEgSW1wb3J0IChDLCBkZWZsYXRlSW5pdDIsICJkZWZsYXRlSW5pdDJfIik7CisgICBwcmFnbWEgSW1wb3J0IChDLCBpbmZsYXRlSW5pdDIsICJpbmZsYXRlSW5pdDJfIik7CisgICBwcmFnbWEgSW1wb3J0IChDLCB6RXJyb3IsICJ6RXJyb3IiKTsKKyAgIHByYWdtYSBJbXBvcnQgKEMsIGluZmxhdGVTeW5jUG9pbnQsICJpbmZsYXRlU3luY1BvaW50Iik7CisgICBwcmFnbWEgSW1wb3J0IChDLCBnZXRfY3JjX3RhYmxlLCAiZ2V0X2NyY190YWJsZSIpOworCisgICAtLSAgc2luY2UgemxpYiAxLjIuMDoKKworICAgcHJhZ21hIEltcG9ydCAoQywgaW5mbGF0ZUNvcHksICJpbmZsYXRlQ29weSIpOworICAgcHJhZ21hIEltcG9ydCAoQywgY29tcHJlc3NCb3VuZCwgImNvbXByZXNzQm91bmQiKTsKKyAgIHByYWdtYSBJbXBvcnQgKEMsIGRlZmxhdGVCb3VuZCwgImRlZmxhdGVCb3VuZCIpOworICAgcHJhZ21hIEltcG9ydCAoQywgZ3p1bmdldGMsICJnenVuZ2V0YyIpOworICAgcHJhZ21hIEltcG9ydCAoQywgemxpYkNvbXBpbGVGbGFncywgInpsaWJDb21waWxlRmxhZ3MiKTsKKworICAgcHJhZ21hIEltcG9ydCAoQywgaW5mbGF0ZUJhY2tJbml0LCAiaW5mbGF0ZUJhY2tJbml0XyIpOworCisgICAtLSAgSSBzdG9wcGVkIGJpbmRpbmcgdGhlIGluZmxhdGVCYWNrIHJvdXRpbmVzLCBiZWNvdXNlIHJlYWxpemUgdGhhdAorICAgLS0gIGl0IGRvZXMgbm90IHN1cHBvcnQgemxpYiBhbmQgZ3ppcCBoZWFkZXJzIGZvciBub3csIGFuZCBoYXZlIG5vCisgICAtLSAgc3ltbWV0cmljIGRlZmxhdGVCYWNrIHJvdXRpbmVzLgorICAgLS0gIFpMaWItQWRhIGlzIHN5bW1ldHJpYyByZWdhcmRpbmcgZGVmbGF0ZS9pbmZsYXRlIGRhdGEgdHJhbnNmb3JtYXRpb24KKyAgIC0tICBhbmQgaGFzIGEgc2ltaWxhciBnZW5lcmljIGNhbGxiYWNrIGludGVyZmFjZSBmb3IgdGhlCisgICAtLSAgZGVmbGF0ZS9pbmZsYXRlIHRyYW5zZm9ybWF0aW9uIGJhc2VkIG9uIHRoZSByZWd1bGFyIERlZmxhdGUvSW5mbGF0ZQorICAgLS0gIHJvdXRpbmVzLgorCisgICAtLSAgcHJhZ21hIEltcG9ydCAoQywgaW5mbGF0ZUJhY2ssICJpbmZsYXRlQmFjayIpOworICAgLS0gIHByYWdtYSBJbXBvcnQgKEMsIGluZmxhdGVCYWNrRW5kLCAiaW5mbGF0ZUJhY2tFbmQiKTsKKworZW5kIFpMaWIuVGhpbjsKZGlmZiAtLWdpdCBhL3psaWItMS4yLjYvY29udHJpYi9hZGEvemxpYi5hZGIgYi96bGliLTEuMi42L2NvbnRyaWIvYWRhL3psaWIuYWRiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiNmZkNjgKLS0tIC9kZXYvbnVsbAorKysgYi96bGliLTEuMi42L2NvbnRyaWIvYWRhL3psaWIuYWRiCkBAIC0wLDAgKzEsNzAxIEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSAgWkxpYiBmb3IgQWRhIHRoaWNrIGJpbmRpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgQ29weXJpZ2h0IChDKSAyMDAyLTIwMDQgRG1pdHJpeSBBbmlzaW1rb3YgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgT3BlbiBzb3VyY2UgbGljZW5zZSBpbmZvcm1hdGlvbiBpcyBpbiB0aGUgemxpYi5hZHMgZmlsZS4gIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0tICAkSWQ6IHpsaWIuYWRiLHYgMS4zMSAyMDA0LzA5LzA2IDA2OjUzOjE5IHZhZ3VsIEV4cCAkCisKK3dpdGggQWRhLkV4Y2VwdGlvbnM7Cit3aXRoIEFkYS5VbmNoZWNrZWRfQ29udmVyc2lvbjsKK3dpdGggQWRhLlVuY2hlY2tlZF9EZWFsbG9jYXRpb247CisKK3dpdGggSW50ZXJmYWNlcy5DLlN0cmluZ3M7CisKK3dpdGggWkxpYi5UaGluOworCitwYWNrYWdlIGJvZHkgWkxpYiBpcworCisgICB1c2UgdHlwZSBUaGluLkludDsKKworICAgdHlwZSBaX1N0cmVhbSBpcyBuZXcgVGhpbi5aX1N0cmVhbTsKKworICAgdHlwZSBSZXR1cm5fQ29kZV9FbnVtIGlzCisgICAgICAoT0ssCisgICAgICAgU1RSRUFNX0VORCwKKyAgICAgICBORUVEX0RJQ1QsCisgICAgICAgRVJSTk8sCisgICAgICAgU1RSRUFNX0VSUk9SLAorICAgICAgIERBVEFfRVJST1IsCisgICAgICAgTUVNX0VSUk9SLAorICAgICAgIEJVRl9FUlJPUiwKKyAgICAgICBWRVJTSU9OX0VSUk9SKTsKKworICAgdHlwZSBGbGF0ZV9TdGVwX0Z1bmN0aW9uIGlzIGFjY2VzcworICAgICBmdW5jdGlvbiAoU3RybSA6IGluIFRoaW4uWl9TdHJlYW1wOyBGbHVzaCA6IGluIFRoaW4uSW50KSByZXR1cm4gVGhpbi5JbnQ7CisgICBwcmFnbWEgQ29udmVudGlvbiAoQywgRmxhdGVfU3RlcF9GdW5jdGlvbik7CisKKyAgIHR5cGUgRmxhdGVfRW5kX0Z1bmN0aW9uIGlzIGFjY2VzcworICAgICAgZnVuY3Rpb24gKEN0cm0gOiBpbiBUaGluLlpfU3RyZWFtcCkgcmV0dXJuIFRoaW4uSW50OworICAgcHJhZ21hIENvbnZlbnRpb24gKEMsIEZsYXRlX0VuZF9GdW5jdGlvbik7CisKKyAgIHR5cGUgRmxhdGVfVHlwZSBpcyByZWNvcmQKKyAgICAgIFN0ZXAgOiBGbGF0ZV9TdGVwX0Z1bmN0aW9uOworICAgICAgRG9uZSA6IEZsYXRlX0VuZF9GdW5jdGlvbjsKKyAgIGVuZCByZWNvcmQ7CisKKyAgIHN1YnR5cGUgRm9vdGVyX0FycmF5IGlzIFN0cmVhbV9FbGVtZW50X0FycmF5ICgxIC4uIDgpOworCisgICBTaW1wbGVfR1ppcF9IZWFkZXIgOiBjb25zdGFudCBTdHJlYW1fRWxlbWVudF9BcnJheSAoMSAuLiAxMCkKKyAgICAgOj0gKDE2IzFmIywgMTYjOGIjLCAgICAgICAgICAgICAgICAgLS0gIE1hZ2ljIGhlYWRlcgorICAgICAgICAgMTYjMDgjLCAgICAgICAgICAgICAgICAgICAgICAgICAtLSAgWl9ERUZMQVRFRAorICAgICAgICAgMTYjMDAjLCAgICAgICAgICAgICAgICAgICAgICAgICAtLSAgRmxhZ3MKKyAgICAgICAgIDE2IzAwIywgMTYjMDAjLCAxNiMwMCMsIDE2IzAwIywgLS0gIFRpbWUKKyAgICAgICAgIDE2IzAwIywgICAgICAgICAgICAgICAgICAgICAgICAgLS0gIFhGbGFncworICAgICAgICAgMTYjMDMjICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAgT1MgY29kZQorICAgICAgICApOworICAgLS0gIFRoZSBzaW1wbGVzdCBnemlwIGhlYWRlciBpcyBub3QgZm9yIGluZm9ybWF0aW9uYWwsIGJ1dCBqdXN0IGZvcgorICAgLS0gIGd6aXAgZm9ybWF0IGNvbXBhdGliaWxpdHkuCisgICAtLSAgTm90ZSB0aGF0IHNvbWUgY29kZSBiZWxvdyBpcyB1c2luZyBhc3N1bXB0aW9uCisgICAtLSAgU2ltcGxlX0daaXBfSGVhZGVyJ0xhc3QgPiBGb290ZXJfQXJyYXknTGFzdCwgc28gZG8gbm90IG1ha2UKKyAgIC0tICBTaW1wbGVfR1ppcF9IZWFkZXInTGFzdCA8PSBGb290ZXJfQXJyYXknTGFzdC4KKworICAgUmV0dXJuX0NvZGUgOiBjb25zdGFudCBhcnJheSAoVGhpbi5JbnQgcmFuZ2UgPD4pIG9mIFJldHVybl9Db2RlX0VudW0KKyAgICAgOj0gKDAgPT4gT0ssCisgICAgICAgICAxID0+IFNUUkVBTV9FTkQsCisgICAgICAgICAyID0+IE5FRURfRElDVCwKKyAgICAgICAgLTEgPT4gRVJSTk8sCisgICAgICAgIC0yID0+IFNUUkVBTV9FUlJPUiwKKyAgICAgICAgLTMgPT4gREFUQV9FUlJPUiwKKyAgICAgICAgLTQgPT4gTUVNX0VSUk9SLAorICAgICAgICAtNSA9PiBCVUZfRVJST1IsCisgICAgICAgIC02ID0+IFZFUlNJT05fRVJST1IpOworCisgICBGbGF0ZSA6IGNvbnN0YW50IGFycmF5IChCb29sZWFuKSBvZiBGbGF0ZV9UeXBlCisgICAgIDo9IChUcnVlICA9PiAoU3RlcCA9PiBUaGluLkRlZmxhdGUnQWNjZXNzLAorICAgICAgICAgICAgICAgICAgIERvbmUgPT4gVGhpbi5EZWZsYXRlRW5kJ0FjY2VzcyksCisgICAgICAgICBGYWxzZSA9PiAoU3RlcCA9PiBUaGluLkluZmxhdGUnQWNjZXNzLAorICAgICAgICAgICAgICAgICAgIERvbmUgPT4gVGhpbi5JbmZsYXRlRW5kJ0FjY2VzcykpOworCisgICBGbHVzaF9GaW5pc2ggOiBjb25zdGFudCBhcnJheSAoQm9vbGVhbikgb2YgRmx1c2hfTW9kZQorICAgICA6PSAoVHJ1ZSA9PiBGaW5pc2gsIEZhbHNlID0+IE5vX0ZsdXNoKTsKKworICAgcHJvY2VkdXJlIFJhaXNlX0Vycm9yIChTdHJlYW0gOiBpbiBaX1N0cmVhbSk7CisgICBwcmFnbWEgSW5saW5lIChSYWlzZV9FcnJvcik7CisKKyAgIHByb2NlZHVyZSBSYWlzZV9FcnJvciAoTWVzc2FnZSA6IGluIFN0cmluZyk7CisgICBwcmFnbWEgSW5saW5lIChSYWlzZV9FcnJvcik7CisKKyAgIHByb2NlZHVyZSBDaGVja19FcnJvciAoU3RyZWFtIDogaW4gWl9TdHJlYW07IENvZGUgOiBpbiBUaGluLkludCk7CisKKyAgIHByb2NlZHVyZSBGcmVlIGlzIG5ldyBBZGEuVW5jaGVja2VkX0RlYWxsb2NhdGlvbgorICAgICAgKFpfU3RyZWFtLCBaX1N0cmVhbV9BY2Nlc3MpOworCisgICBmdW5jdGlvbiBUb19UaGluX0FjY2VzcyBpcyBuZXcgQWRhLlVuY2hlY2tlZF9Db252ZXJzaW9uCisgICAgIChaX1N0cmVhbV9BY2Nlc3MsIFRoaW4uWl9TdHJlYW1wKTsKKworICAgcHJvY2VkdXJlIFRyYW5zbGF0ZV9HWmlwCisgICAgIChGaWx0ZXIgICAgOiBpbiBvdXQgRmlsdGVyX1R5cGU7CisgICAgICBJbl9EYXRhICAgOiBpbiAgICAgQWRhLlN0cmVhbXMuU3RyZWFtX0VsZW1lbnRfQXJyYXk7CisgICAgICBJbl9MYXN0ICAgOiAgICBvdXQgQWRhLlN0cmVhbXMuU3RyZWFtX0VsZW1lbnRfT2Zmc2V0OworICAgICAgT3V0X0RhdGEgIDogICAgb3V0IEFkYS5TdHJlYW1zLlN0cmVhbV9FbGVtZW50X0FycmF5OworICAgICAgT3V0X0xhc3QgIDogICAgb3V0IEFkYS5TdHJlYW1zLlN0cmVhbV9FbGVtZW50X09mZnNldDsKKyAgICAgIEZsdXNoICAgICA6IGluICAgICBGbHVzaF9Nb2RlKTsKKyAgIC0tICBTZXBhcmF0ZSB0cmFuc2xhdGUgcm91dGluZSBmb3IgbWFrZSBnemlwIGhlYWRlci4KKworICAgcHJvY2VkdXJlIFRyYW5zbGF0ZV9BdXRvCisgICAgIChGaWx0ZXIgICAgOiBpbiBvdXQgRmlsdGVyX1R5cGU7CisgICAgICBJbl9EYXRhICAgOiBpbiAgICAgQWRhLlN0cmVhbXMuU3RyZWFtX0VsZW1lbnRfQXJyYXk7CisgICAgICBJbl9MYXN0ICAgOiAgICBvdXQgQWRhLlN0cmVhbXMuU3RyZWFtX0VsZW1lbnRfT2Zmc2V0OworICAgICAgT3V0X0RhdGEgIDogICAgb3V0IEFkYS5TdHJlYW1zLlN0cmVhbV9FbGVtZW50X0FycmF5OworICAgICAgT3V0X0xhc3QgIDogICAgb3V0IEFkYS5TdHJlYW1zLlN0cmVhbV9FbGVtZW50X09mZnNldDsKKyAgICAgIEZsdXNoICAgICA6IGluICAgICBGbHVzaF9Nb2RlKTsKKyAgIC0tICB0cmFuc2xhdGUgcm91dGluZSB3aXRob3V0IGFkZGl0aW9uYWwgaGVhZGVycy4KKworICAgLS0tLS0tLS0tLS0tLS0tLS0KKyAgIC0tIENoZWNrX0Vycm9yIC0tCisgICAtLS0tLS0tLS0tLS0tLS0tLQorCisgICBwcm9jZWR1cmUgQ2hlY2tfRXJyb3IgKFN0cmVhbSA6IGluIFpfU3RyZWFtOyBDb2RlIDogaW4gVGhpbi5JbnQpIGlzCisgICAgICB1c2UgdHlwZSBUaGluLkludDsKKyAgIGJlZ2luCisgICAgICBpZiBDb2RlIC89IFRoaW4uWl9PSyB0aGVuCisgICAgICAgICBSYWlzZV9FcnJvcgorICAgICAgICAgICAgKFJldHVybl9Db2RlX0VudW0nSW1hZ2UgKFJldHVybl9Db2RlIChDb2RlKSkKKyAgICAgICAgICAgICAgJiAiOiAiICYgTGFzdF9FcnJvcl9NZXNzYWdlIChTdHJlYW0pKTsKKyAgICAgIGVuZCBpZjsKKyAgIGVuZCBDaGVja19FcnJvcjsKKworICAgLS0tLS0tLS0tLS0KKyAgIC0tIENsb3NlIC0tCisgICAtLS0tLS0tLS0tLQorCisgICBwcm9jZWR1cmUgQ2xvc2UKKyAgICAgKEZpbHRlciAgICAgICA6IGluIG91dCBGaWx0ZXJfVHlwZTsKKyAgICAgIElnbm9yZV9FcnJvciA6IGluICAgICBCb29sZWFuIDo9IEZhbHNlKQorICAgaXMKKyAgICAgIENvZGUgOiBUaGluLkludDsKKyAgIGJlZ2luCisgICAgICBpZiBub3QgSWdub3JlX0Vycm9yIGFuZCB0aGVuIG5vdCBJc19PcGVuIChGaWx0ZXIpIHRoZW4KKyAgICAgICAgIHJhaXNlIFN0YXR1c19FcnJvcjsKKyAgICAgIGVuZCBpZjsKKworICAgICAgQ29kZSA6PSBGbGF0ZSAoRmlsdGVyLkNvbXByZXNzaW9uKS5Eb25lIChUb19UaGluX0FjY2VzcyAoRmlsdGVyLlN0cm0pKTsKKworICAgICAgaWYgSWdub3JlX0Vycm9yIG9yIGVsc2UgQ29kZSA9IFRoaW4uWl9PSyB0aGVuCisgICAgICAgICBGcmVlIChGaWx0ZXIuU3RybSk7CisgICAgICBlbHNlCisgICAgICAgICBkZWNsYXJlCisgICAgICAgICAgICBFcnJvcl9NZXNzYWdlIDogY29uc3RhbnQgU3RyaW5nCisgICAgICAgICAgICAgIDo9IExhc3RfRXJyb3JfTWVzc2FnZSAoRmlsdGVyLlN0cm0uYWxsKTsKKyAgICAgICAgIGJlZ2luCisgICAgICAgICAgICBGcmVlIChGaWx0ZXIuU3RybSk7CisgICAgICAgICAgICBBZGEuRXhjZXB0aW9ucy5SYWlzZV9FeGNlcHRpb24KKyAgICAgICAgICAgICAgIChaTGliX0Vycm9yJ0lkZW50aXR5LAorICAgICAgICAgICAgICAgIFJldHVybl9Db2RlX0VudW0nSW1hZ2UgKFJldHVybl9Db2RlIChDb2RlKSkKKyAgICAgICAgICAgICAgICAgICYgIjogIiAmIEVycm9yX01lc3NhZ2UpOworICAgICAgICAgZW5kOworICAgICAgZW5kIGlmOworICAgZW5kIENsb3NlOworCisgICAtLS0tLS0tLS0tLQorICAgLS0gQ1JDMzIgLS0KKyAgIC0tLS0tLS0tLS0tCisKKyAgIGZ1bmN0aW9uIENSQzMyCisgICAgIChDUkMgIDogaW4gVW5zaWduZWRfMzI7CisgICAgICBEYXRhIDogaW4gQWRhLlN0cmVhbXMuU3RyZWFtX0VsZW1lbnRfQXJyYXkpCisgICAgICByZXR1cm4gVW5zaWduZWRfMzIKKyAgIGlzCisgICAgICB1c2UgVGhpbjsKKyAgIGJlZ2luCisgICAgICByZXR1cm4gVW5zaWduZWRfMzIgKGNyYzMyIChVTG9uZyAoQ1JDKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEnQWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEnTGVuZ3RoKSk7CisgICBlbmQgQ1JDMzI7CisKKyAgIHByb2NlZHVyZSBDUkMzMgorICAgICAoQ1JDICA6IGluIG91dCBVbnNpZ25lZF8zMjsKKyAgICAgIERhdGEgOiBpbiAgICAgQWRhLlN0cmVhbXMuU3RyZWFtX0VsZW1lbnRfQXJyYXkpIGlzCisgICBiZWdpbgorICAgICAgQ1JDIDo9IENSQzMyIChDUkMsIERhdGEpOworICAgZW5kIENSQzMyOworCisgICAtLS0tLS0tLS0tLS0tLS0tLS0KKyAgIC0tIERlZmxhdGVfSW5pdCAtLQorICAgLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgIHByb2NlZHVyZSBEZWZsYXRlX0luaXQKKyAgICAgKEZpbHRlciAgICAgICA6IGluIG91dCBGaWx0ZXJfVHlwZTsKKyAgICAgIExldmVsICAgICAgICA6IGluICAgICBDb21wcmVzc2lvbl9MZXZlbCAgOj0gRGVmYXVsdF9Db21wcmVzc2lvbjsKKyAgICAgIFN0cmF0ZWd5ICAgICA6IGluICAgICBTdHJhdGVneV9UeXBlICAgICAgOj0gRGVmYXVsdF9TdHJhdGVneTsKKyAgICAgIE1ldGhvZCAgICAgICA6IGluICAgICBDb21wcmVzc2lvbl9NZXRob2QgOj0gRGVmbGF0ZWQ7CisgICAgICBXaW5kb3dfQml0cyAgOiBpbiAgICAgV2luZG93X0JpdHNfVHlwZSAgIDo9IERlZmF1bHRfV2luZG93X0JpdHM7CisgICAgICBNZW1vcnlfTGV2ZWwgOiBpbiAgICAgTWVtb3J5X0xldmVsX1R5cGUgIDo9IERlZmF1bHRfTWVtb3J5X0xldmVsOworICAgICAgSGVhZGVyICAgICAgIDogaW4gICAgIEhlYWRlcl9UeXBlICAgICAgICA6PSBEZWZhdWx0KQorICAgaXMKKyAgICAgIHVzZSB0eXBlIFRoaW4uSW50OworICAgICAgV2luX0JpdHMgOiBUaGluLkludCA6PSBUaGluLkludCAoV2luZG93X0JpdHMpOworICAgYmVnaW4KKyAgICAgIGlmIElzX09wZW4gKEZpbHRlcikgdGhlbgorICAgICAgICAgcmFpc2UgU3RhdHVzX0Vycm9yOworICAgICAgZW5kIGlmOworCisgICAgICAtLSAgV2UgYWxsb3cgWkxpYiB0byBtYWtlIGhlYWRlciBvbmx5IGluIGNhc2Ugb2YgZGVmYXVsdCBoZWFkZXIgdHlwZS4KKyAgICAgIC0tICBPdGhlcndpc2Ugd2Ugd291bGQgZWl0aGVyIGRvIGhlYWRlciBieSBvdXJzZWxmcywgb3IgZG8gbm90IGRvCisgICAgICAtLSAgaGVhZGVyIGF0IGFsbC4KKworICAgICAgaWYgSGVhZGVyID0gTm9uZSBvciBlbHNlIEhlYWRlciA9IEdaaXAgdGhlbgorICAgICAgICAgV2luX0JpdHMgOj0gLVdpbl9CaXRzOworICAgICAgZW5kIGlmOworCisgICAgICAtLSAgRm9yIHRoZSBHWmlwIENSQyBjYWxjdWxhdGlvbiBhbmQgbWFrZSBoZWFkZXJzLgorCisgICAgICBpZiBIZWFkZXIgPSBHWmlwIHRoZW4KKyAgICAgICAgIEZpbHRlci5DUkMgICAgOj0gMDsKKyAgICAgICAgIEZpbHRlci5PZmZzZXQgOj0gU2ltcGxlX0daaXBfSGVhZGVyJ0ZpcnN0OworICAgICAgZWxzZQorICAgICAgICAgRmlsdGVyLk9mZnNldCA6PSBTaW1wbGVfR1ppcF9IZWFkZXInTGFzdCArIDE7CisgICAgICBlbmQgaWY7CisKKyAgICAgIEZpbHRlci5TdHJtICAgICAgICA6PSBuZXcgWl9TdHJlYW07CisgICAgICBGaWx0ZXIuQ29tcHJlc3Npb24gOj0gVHJ1ZTsKKyAgICAgIEZpbHRlci5TdHJlYW1fRW5kICA6PSBGYWxzZTsKKyAgICAgIEZpbHRlci5IZWFkZXIgICAgICA6PSBIZWFkZXI7CisKKyAgICAgIGlmIFRoaW4uRGVmbGF0ZV9Jbml0CisgICAgICAgICAgIChUb19UaGluX0FjY2VzcyAoRmlsdGVyLlN0cm0pLAorICAgICAgICAgICAgTGV2ZWwgICAgICA9PiBUaGluLkludCAoTGV2ZWwpLAorICAgICAgICAgICAgbWV0aG9kICAgICA9PiBUaGluLkludCAoTWV0aG9kKSwKKyAgICAgICAgICAgIHdpbmRvd0JpdHMgPT4gV2luX0JpdHMsCisgICAgICAgICAgICBtZW1MZXZlbCAgID0+IFRoaW4uSW50IChNZW1vcnlfTGV2ZWwpLAorICAgICAgICAgICAgc3RyYXRlZ3kgICA9PiBUaGluLkludCAoU3RyYXRlZ3kpKSAvPSBUaGluLlpfT0sKKyAgICAgIHRoZW4KKyAgICAgICAgIFJhaXNlX0Vycm9yIChGaWx0ZXIuU3RybS5hbGwpOworICAgICAgZW5kIGlmOworICAgZW5kIERlZmxhdGVfSW5pdDsKKworICAgLS0tLS0tLS0tLS0KKyAgIC0tIEZsdXNoIC0tCisgICAtLS0tLS0tLS0tLQorCisgICBwcm9jZWR1cmUgRmx1c2gKKyAgICAgKEZpbHRlciAgICA6IGluIG91dCBGaWx0ZXJfVHlwZTsKKyAgICAgIE91dF9EYXRhICA6ICAgIG91dCBBZGEuU3RyZWFtcy5TdHJlYW1fRWxlbWVudF9BcnJheTsKKyAgICAgIE91dF9MYXN0ICA6ICAgIG91dCBBZGEuU3RyZWFtcy5TdHJlYW1fRWxlbWVudF9PZmZzZXQ7CisgICAgICBGbHVzaCAgICAgOiBpbiAgICAgRmx1c2hfTW9kZSkKKyAgIGlzCisgICAgICBOb19EYXRhIDogU3RyZWFtX0VsZW1lbnRfQXJyYXkgOj0gKDEgLi4gMCA9PiAwKTsKKyAgICAgIExhc3QgICAgOiBTdHJlYW1fRWxlbWVudF9PZmZzZXQ7CisgICBiZWdpbgorICAgICAgVHJhbnNsYXRlIChGaWx0ZXIsIE5vX0RhdGEsIExhc3QsIE91dF9EYXRhLCBPdXRfTGFzdCwgRmx1c2gpOworICAgZW5kIEZsdXNoOworCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgLS0gR2VuZXJpY19UcmFuc2xhdGUgLS0KKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgIHByb2NlZHVyZSBHZW5lcmljX1RyYW5zbGF0ZQorICAgICAoRmlsdGVyICAgICAgICAgIDogaW4gb3V0IFpMaWIuRmlsdGVyX1R5cGU7CisgICAgICBJbl9CdWZmZXJfU2l6ZSAgOiBpbiAgICAgSW50ZWdlciA6PSBEZWZhdWx0X0J1ZmZlcl9TaXplOworICAgICAgT3V0X0J1ZmZlcl9TaXplIDogaW4gICAgIEludGVnZXIgOj0gRGVmYXVsdF9CdWZmZXJfU2l6ZSkKKyAgIGlzCisgICAgICBJbl9CdWZmZXIgIDogU3RyZWFtX0VsZW1lbnRfQXJyYXkKKyAgICAgICAgICAgICAgICAgICAgICgxIC4uIFN0cmVhbV9FbGVtZW50X09mZnNldCAoSW5fQnVmZmVyX1NpemUpKTsKKyAgICAgIE91dF9CdWZmZXIgOiBTdHJlYW1fRWxlbWVudF9BcnJheQorICAgICAgICAgICAgICAgICAgICAgKDEgLi4gU3RyZWFtX0VsZW1lbnRfT2Zmc2V0IChPdXRfQnVmZmVyX1NpemUpKTsKKyAgICAgIExhc3QgICAgICAgOiBTdHJlYW1fRWxlbWVudF9PZmZzZXQ7CisgICAgICBJbl9MYXN0ICAgIDogU3RyZWFtX0VsZW1lbnRfT2Zmc2V0OworICAgICAgSW5fRmlyc3QgICA6IFN0cmVhbV9FbGVtZW50X09mZnNldDsKKyAgICAgIE91dF9MYXN0ICAgOiBTdHJlYW1fRWxlbWVudF9PZmZzZXQ7CisgICBiZWdpbgorICAgICAgTWFpbiA6IGxvb3AKKyAgICAgICAgIERhdGFfSW4gKEluX0J1ZmZlciwgTGFzdCk7CisKKyAgICAgICAgIEluX0ZpcnN0IDo9IEluX0J1ZmZlcidGaXJzdDsKKworICAgICAgICAgbG9vcAorICAgICAgICAgICAgVHJhbnNsYXRlCisgICAgICAgICAgICAgIChGaWx0ZXIgICA9PiBGaWx0ZXIsCisgICAgICAgICAgICAgICBJbl9EYXRhICA9PiBJbl9CdWZmZXIgKEluX0ZpcnN0IC4uIExhc3QpLAorICAgICAgICAgICAgICAgSW5fTGFzdCAgPT4gSW5fTGFzdCwKKyAgICAgICAgICAgICAgIE91dF9EYXRhID0+IE91dF9CdWZmZXIsCisgICAgICAgICAgICAgICBPdXRfTGFzdCA9PiBPdXRfTGFzdCwKKyAgICAgICAgICAgICAgIEZsdXNoICAgID0+IEZsdXNoX0ZpbmlzaCAoTGFzdCA8IEluX0J1ZmZlcidGaXJzdCkpOworCisgICAgICAgICAgICBpZiBPdXRfQnVmZmVyJ0ZpcnN0IDw9IE91dF9MYXN0IHRoZW4KKyAgICAgICAgICAgICAgIERhdGFfT3V0IChPdXRfQnVmZmVyIChPdXRfQnVmZmVyJ0ZpcnN0IC4uIE91dF9MYXN0KSk7CisgICAgICAgICAgICBlbmQgaWY7CisKKyAgICAgICAgICAgIGV4aXQgTWFpbiB3aGVuIFN0cmVhbV9FbmQgKEZpbHRlcik7CisKKyAgICAgICAgICAgIC0tICBUaGUgZW5kIG9mIGluIGJ1ZmZlci4KKworICAgICAgICAgICAgZXhpdCB3aGVuIEluX0xhc3QgPSBMYXN0OworCisgICAgICAgICAgICBJbl9GaXJzdCA6PSBJbl9MYXN0ICsgMTsKKyAgICAgICAgIGVuZCBsb29wOworICAgICAgZW5kIGxvb3AgTWFpbjsKKworICAgZW5kIEdlbmVyaWNfVHJhbnNsYXRlOworCisgICAtLS0tLS0tLS0tLS0tLS0tLS0KKyAgIC0tIEluZmxhdGVfSW5pdCAtLQorICAgLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgIHByb2NlZHVyZSBJbmZsYXRlX0luaXQKKyAgICAgKEZpbHRlciAgICAgIDogaW4gb3V0IEZpbHRlcl9UeXBlOworICAgICAgV2luZG93X0JpdHMgOiBpbiAgICAgV2luZG93X0JpdHNfVHlwZSA6PSBEZWZhdWx0X1dpbmRvd19CaXRzOworICAgICAgSGVhZGVyICAgICAgOiBpbiAgICAgSGVhZGVyX1R5cGUgICAgICA6PSBEZWZhdWx0KQorICAgaXMKKyAgICAgIHVzZSB0eXBlIFRoaW4uSW50OworICAgICAgV2luX0JpdHMgOiBUaGluLkludCA6PSBUaGluLkludCAoV2luZG93X0JpdHMpOworCisgICAgICBwcm9jZWR1cmUgQ2hlY2tfVmVyc2lvbjsKKyAgICAgIC0tICBDaGVjayB0aGUgbGF0ZXN0IGhlYWRlciB0eXBlcyBjb21wYXRpYmlsaXR5LgorCisgICAgICBwcm9jZWR1cmUgQ2hlY2tfVmVyc2lvbiBpcworICAgICAgYmVnaW4KKyAgICAgICAgIGlmIFZlcnNpb24gPD0gIjEuMS40IiB0aGVuCisgICAgICAgICAgICBSYWlzZV9FcnJvcgorICAgICAgICAgICAgICAoIkluZmxhdGUgaGVhZGVyIHR5cGUgIiAmIEhlYWRlcl9UeXBlJ0ltYWdlIChIZWFkZXIpCisgICAgICAgICAgICAgICAmICIgaW5jb21wYXRpYmxlIHdpdGggWkxpYiB2ZXJzaW9uICIgJiBWZXJzaW9uKTsKKyAgICAgICAgIGVuZCBpZjsKKyAgICAgIGVuZCBDaGVja19WZXJzaW9uOworCisgICBiZWdpbgorICAgICAgaWYgSXNfT3BlbiAoRmlsdGVyKSB0aGVuCisgICAgICAgICByYWlzZSBTdGF0dXNfRXJyb3I7CisgICAgICBlbmQgaWY7CisKKyAgICAgIGNhc2UgSGVhZGVyIGlzCisgICAgICAgICB3aGVuIE5vbmUgPT4KKyAgICAgICAgICAgIENoZWNrX1ZlcnNpb247CisKKyAgICAgICAgICAgIC0tICBJbmZsYXRlIGRhdGEgd2l0aG91dCBoZWFkZXJzIGRldGVybWluZWQKKyAgICAgICAgICAgIC0tICBieSBuZWdhdGl2ZSBXaW5fQml0cy4KKworICAgICAgICAgICAgV2luX0JpdHMgOj0gLVdpbl9CaXRzOworICAgICAgICAgd2hlbiBHWmlwID0+CisgICAgICAgICAgICBDaGVja19WZXJzaW9uOworCisgICAgICAgICAgICAtLSAgSW5mbGF0ZSBnemlwIGRhdGEgZGVmaW5lZCBieSBmbGFnIDE2LgorCisgICAgICAgICAgICBXaW5fQml0cyA6PSBXaW5fQml0cyArIDE2OworICAgICAgICAgd2hlbiBBdXRvID0+CisgICAgICAgICAgICBDaGVja19WZXJzaW9uOworCisgICAgICAgICAgICAtLSAgSW5mbGF0ZSB3aXRoIGF1dG9tYXRpYyBkZXRlY3Rpb24KKyAgICAgICAgICAgIC0tICBvZiBnemlwIG9yIG5hdGl2ZSBoZWFkZXIgZGVmaW5lZCBieSBmbGFnIDMyLgorCisgICAgICAgICAgICBXaW5fQml0cyA6PSBXaW5fQml0cyArIDMyOworICAgICAgICAgd2hlbiBEZWZhdWx0ID0+IG51bGw7CisgICAgICBlbmQgY2FzZTsKKworICAgICAgRmlsdGVyLlN0cm0gICAgICAgIDo9IG5ldyBaX1N0cmVhbTsKKyAgICAgIEZpbHRlci5Db21wcmVzc2lvbiA6PSBGYWxzZTsKKyAgICAgIEZpbHRlci5TdHJlYW1fRW5kICA6PSBGYWxzZTsKKyAgICAgIEZpbHRlci5IZWFkZXIgICAgICA6PSBIZWFkZXI7CisKKyAgICAgIGlmIFRoaW4uSW5mbGF0ZV9Jbml0CisgICAgICAgICAoVG9fVGhpbl9BY2Nlc3MgKEZpbHRlci5TdHJtKSwgV2luX0JpdHMpIC89IFRoaW4uWl9PSworICAgICAgdGhlbgorICAgICAgICAgUmFpc2VfRXJyb3IgKEZpbHRlci5TdHJtLmFsbCk7CisgICAgICBlbmQgaWY7CisgICBlbmQgSW5mbGF0ZV9Jbml0OworCisgICAtLS0tLS0tLS0tLS0tCisgICAtLSBJc19PcGVuIC0tCisgICAtLS0tLS0tLS0tLS0tCisKKyAgIGZ1bmN0aW9uIElzX09wZW4gKEZpbHRlciA6IGluIEZpbHRlcl9UeXBlKSByZXR1cm4gQm9vbGVhbiBpcworICAgYmVnaW4KKyAgICAgIHJldHVybiBGaWx0ZXIuU3RybSAvPSBudWxsOworICAgZW5kIElzX09wZW47CisKKyAgIC0tLS0tLS0tLS0tLS0tLS0tCisgICAtLSBSYWlzZV9FcnJvciAtLQorICAgLS0tLS0tLS0tLS0tLS0tLS0KKworICAgcHJvY2VkdXJlIFJhaXNlX0Vycm9yIChNZXNzYWdlIDogaW4gU3RyaW5nKSBpcworICAgYmVnaW4KKyAgICAgIEFkYS5FeGNlcHRpb25zLlJhaXNlX0V4Y2VwdGlvbiAoWkxpYl9FcnJvcidJZGVudGl0eSwgTWVzc2FnZSk7CisgICBlbmQgUmFpc2VfRXJyb3I7CisKKyAgIHByb2NlZHVyZSBSYWlzZV9FcnJvciAoU3RyZWFtIDogaW4gWl9TdHJlYW0pIGlzCisgICBiZWdpbgorICAgICAgUmFpc2VfRXJyb3IgKExhc3RfRXJyb3JfTWVzc2FnZSAoU3RyZWFtKSk7CisgICBlbmQgUmFpc2VfRXJyb3I7CisKKyAgIC0tLS0tLS0tLS0KKyAgIC0tIFJlYWQgLS0KKyAgIC0tLS0tLS0tLS0KKworICAgcHJvY2VkdXJlIFJlYWQKKyAgICAgKEZpbHRlciA6IGluIG91dCBGaWx0ZXJfVHlwZTsKKyAgICAgIEl0ZW0gICA6ICAgIG91dCBBZGEuU3RyZWFtcy5TdHJlYW1fRWxlbWVudF9BcnJheTsKKyAgICAgIExhc3QgICA6ICAgIG91dCBBZGEuU3RyZWFtcy5TdHJlYW1fRWxlbWVudF9PZmZzZXQ7CisgICAgICBGbHVzaCAgOiBpbiAgICAgRmx1c2hfTW9kZSA6PSBOb19GbHVzaCkKKyAgIGlzCisgICAgICBJbl9MYXN0ICAgIDogU3RyZWFtX0VsZW1lbnRfT2Zmc2V0OworICAgICAgSXRlbV9GaXJzdCA6IEFkYS5TdHJlYW1zLlN0cmVhbV9FbGVtZW50X09mZnNldCA6PSBJdGVtJ0ZpcnN0OworICAgICAgVl9GbHVzaCAgICA6IEZsdXNoX01vZGUgOj0gRmx1c2g7CisKKyAgIGJlZ2luCisgICAgICBwcmFnbWEgQXNzZXJ0IChSZXN0X0ZpcnN0IGluIEJ1ZmZlcidGaXJzdCAuLiBCdWZmZXInTGFzdCArIDEpOworICAgICAgcHJhZ21hIEFzc2VydCAoUmVzdF9MYXN0IGluIEJ1ZmZlcidGaXJzdCAtIDEgLi4gQnVmZmVyJ0xhc3QpOworCisgICAgICBsb29wCisgICAgICAgICBpZiBSZXN0X0xhc3QgPSBCdWZmZXInRmlyc3QgLSAxIHRoZW4KKyAgICAgICAgICAgIFZfRmx1c2ggOj0gRmluaXNoOworCisgICAgICAgICBlbHNpZiBSZXN0X0ZpcnN0ID4gUmVzdF9MYXN0IHRoZW4KKyAgICAgICAgICAgIFJlYWQgKEJ1ZmZlciwgUmVzdF9MYXN0KTsKKyAgICAgICAgICAgIFJlc3RfRmlyc3QgOj0gQnVmZmVyJ0ZpcnN0OworCisgICAgICAgICAgICBpZiBSZXN0X0xhc3QgPCBCdWZmZXInRmlyc3QgdGhlbgorICAgICAgICAgICAgICAgVl9GbHVzaCA6PSBGaW5pc2g7CisgICAgICAgICAgICBlbmQgaWY7CisgICAgICAgICBlbmQgaWY7CisKKyAgICAgICAgIFRyYW5zbGF0ZQorICAgICAgICAgICAoRmlsdGVyICAgPT4gRmlsdGVyLAorICAgICAgICAgICAgSW5fRGF0YSAgPT4gQnVmZmVyIChSZXN0X0ZpcnN0IC4uIFJlc3RfTGFzdCksCisgICAgICAgICAgICBJbl9MYXN0ICA9PiBJbl9MYXN0LAorICAgICAgICAgICAgT3V0X0RhdGEgPT4gSXRlbSAoSXRlbV9GaXJzdCAuLiBJdGVtJ0xhc3QpLAorICAgICAgICAgICAgT3V0X0xhc3QgPT4gTGFzdCwKKyAgICAgICAgICAgIEZsdXNoICAgID0+IFZfRmx1c2gpOworCisgICAgICAgICBSZXN0X0ZpcnN0IDo9IEluX0xhc3QgKyAxOworCisgICAgICAgICBleGl0IHdoZW4gU3RyZWFtX0VuZCAoRmlsdGVyKQorICAgICAgICAgICBvciBlbHNlIExhc3QgPSBJdGVtJ0xhc3QKKyAgICAgICAgICAgb3IgZWxzZSAoTGFzdCA+PSBJdGVtJ0ZpcnN0IGFuZCB0aGVuIEFsbG93X1JlYWRfU29tZSk7CisKKyAgICAgICAgIEl0ZW1fRmlyc3QgOj0gTGFzdCArIDE7CisgICAgICBlbmQgbG9vcDsKKyAgIGVuZCBSZWFkOworCisgICAtLS0tLS0tLS0tLS0tLS0tCisgICAtLSBTdHJlYW1fRW5kIC0tCisgICAtLS0tLS0tLS0tLS0tLS0tCisKKyAgIGZ1bmN0aW9uIFN0cmVhbV9FbmQgKEZpbHRlciA6IGluIEZpbHRlcl9UeXBlKSByZXR1cm4gQm9vbGVhbiBpcworICAgYmVnaW4KKyAgICAgIGlmIEZpbHRlci5IZWFkZXIgPSBHWmlwIGFuZCBGaWx0ZXIuQ29tcHJlc3Npb24gdGhlbgorICAgICAgICAgcmV0dXJuIEZpbHRlci5TdHJlYW1fRW5kCisgICAgICAgICAgICBhbmQgdGhlbiBGaWx0ZXIuT2Zmc2V0ID0gRm9vdGVyX0FycmF5J0xhc3QgKyAxOworICAgICAgZWxzZQorICAgICAgICAgcmV0dXJuIEZpbHRlci5TdHJlYW1fRW5kOworICAgICAgZW5kIGlmOworICAgZW5kIFN0cmVhbV9FbmQ7CisKKyAgIC0tLS0tLS0tLS0tLS0tCisgICAtLSBUb3RhbF9JbiAtLQorICAgLS0tLS0tLS0tLS0tLS0KKworICAgZnVuY3Rpb24gVG90YWxfSW4gKEZpbHRlciA6IGluIEZpbHRlcl9UeXBlKSByZXR1cm4gQ291bnQgaXMKKyAgIGJlZ2luCisgICAgICByZXR1cm4gQ291bnQgKFRoaW4uVG90YWxfSW4gKFRvX1RoaW5fQWNjZXNzIChGaWx0ZXIuU3RybSkuYWxsKSk7CisgICBlbmQgVG90YWxfSW47CisKKyAgIC0tLS0tLS0tLS0tLS0tLQorICAgLS0gVG90YWxfT3V0IC0tCisgICAtLS0tLS0tLS0tLS0tLS0KKworICAgZnVuY3Rpb24gVG90YWxfT3V0IChGaWx0ZXIgOiBpbiBGaWx0ZXJfVHlwZSkgcmV0dXJuIENvdW50IGlzCisgICBiZWdpbgorICAgICAgcmV0dXJuIENvdW50IChUaGluLlRvdGFsX091dCAoVG9fVGhpbl9BY2Nlc3MgKEZpbHRlci5TdHJtKS5hbGwpKTsKKyAgIGVuZCBUb3RhbF9PdXQ7CisKKyAgIC0tLS0tLS0tLS0tLS0tLQorICAgLS0gVHJhbnNsYXRlIC0tCisgICAtLS0tLS0tLS0tLS0tLS0KKworICAgcHJvY2VkdXJlIFRyYW5zbGF0ZQorICAgICAoRmlsdGVyICAgIDogaW4gb3V0IEZpbHRlcl9UeXBlOworICAgICAgSW5fRGF0YSAgIDogaW4gICAgIEFkYS5TdHJlYW1zLlN0cmVhbV9FbGVtZW50X0FycmF5OworICAgICAgSW5fTGFzdCAgIDogICAgb3V0IEFkYS5TdHJlYW1zLlN0cmVhbV9FbGVtZW50X09mZnNldDsKKyAgICAgIE91dF9EYXRhICA6ICAgIG91dCBBZGEuU3RyZWFtcy5TdHJlYW1fRWxlbWVudF9BcnJheTsKKyAgICAgIE91dF9MYXN0ICA6ICAgIG91dCBBZGEuU3RyZWFtcy5TdHJlYW1fRWxlbWVudF9PZmZzZXQ7CisgICAgICBGbHVzaCAgICAgOiBpbiAgICAgRmx1c2hfTW9kZSkgaXMKKyAgIGJlZ2luCisgICAgICBpZiBGaWx0ZXIuSGVhZGVyID0gR1ppcCBhbmQgdGhlbiBGaWx0ZXIuQ29tcHJlc3Npb24gdGhlbgorICAgICAgICAgVHJhbnNsYXRlX0daaXAKKyAgICAgICAgICAgKEZpbHRlciAgID0+IEZpbHRlciwKKyAgICAgICAgICAgIEluX0RhdGEgID0+IEluX0RhdGEsCisgICAgICAgICAgICBJbl9MYXN0ICA9PiBJbl9MYXN0LAorICAgICAgICAgICAgT3V0X0RhdGEgPT4gT3V0X0RhdGEsCisgICAgICAgICAgICBPdXRfTGFzdCA9PiBPdXRfTGFzdCwKKyAgICAgICAgICAgIEZsdXNoICAgID0+IEZsdXNoKTsKKyAgICAgIGVsc2UKKyAgICAgICAgIFRyYW5zbGF0ZV9BdXRvCisgICAgICAgICAgIChGaWx0ZXIgICA9PiBGaWx0ZXIsCisgICAgICAgICAgICBJbl9EYXRhICA9PiBJbl9EYXRhLAorICAgICAgICAgICAgSW5fTGFzdCAgPT4gSW5fTGFzdCwKKyAgICAgICAgICAgIE91dF9EYXRhID0+IE91dF9EYXRhLAorICAgICAgICAgICAgT3V0X0xhc3QgPT4gT3V0X0xhc3QsCisgICAgICAgICAgICBGbHVzaCAgICA9PiBGbHVzaCk7CisgICAgICBlbmQgaWY7CisgICBlbmQgVHJhbnNsYXRlOworCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgLS0gVHJhbnNsYXRlX0F1dG8gLS0KKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgIHByb2NlZHVyZSBUcmFuc2xhdGVfQXV0bworICAgICAoRmlsdGVyICAgIDogaW4gb3V0IEZpbHRlcl9UeXBlOworICAgICAgSW5fRGF0YSAgIDogaW4gICAgIEFkYS5TdHJlYW1zLlN0cmVhbV9FbGVtZW50X0FycmF5OworICAgICAgSW5fTGFzdCAgIDogICAgb3V0IEFkYS5TdHJlYW1zLlN0cmVhbV9FbGVtZW50X09mZnNldDsKKyAgICAgIE91dF9EYXRhICA6ICAgIG91dCBBZGEuU3RyZWFtcy5TdHJlYW1fRWxlbWVudF9BcnJheTsKKyAgICAgIE91dF9MYXN0ICA6ICAgIG91dCBBZGEuU3RyZWFtcy5TdHJlYW1fRWxlbWVudF9PZmZzZXQ7CisgICAgICBGbHVzaCAgICAgOiBpbiAgICAgRmx1c2hfTW9kZSkKKyAgIGlzCisgICAgICB1c2UgdHlwZSBUaGluLkludDsKKyAgICAgIENvZGUgOiBUaGluLkludDsKKworICAgYmVnaW4KKyAgICAgIGlmIG5vdCBJc19PcGVuIChGaWx0ZXIpIHRoZW4KKyAgICAgICAgIHJhaXNlIFN0YXR1c19FcnJvcjsKKyAgICAgIGVuZCBpZjsKKworICAgICAgaWYgT3V0X0RhdGEnTGVuZ3RoID0gMCBhbmQgdGhlbiBJbl9EYXRhJ0xlbmd0aCA9IDAgdGhlbgorICAgICAgICAgcmFpc2UgQ29uc3RyYWludF9FcnJvcjsKKyAgICAgIGVuZCBpZjsKKworICAgICAgU2V0X091dCAoRmlsdGVyLlN0cm0uYWxsLCBPdXRfRGF0YSdBZGRyZXNzLCBPdXRfRGF0YSdMZW5ndGgpOworICAgICAgU2V0X0luICAoRmlsdGVyLlN0cm0uYWxsLCBJbl9EYXRhJ0FkZHJlc3MsIEluX0RhdGEnTGVuZ3RoKTsKKworICAgICAgQ29kZSA6PSBGbGF0ZSAoRmlsdGVyLkNvbXByZXNzaW9uKS5TdGVwCisgICAgICAgIChUb19UaGluX0FjY2VzcyAoRmlsdGVyLlN0cm0pLAorICAgICAgICAgVGhpbi5JbnQgKEZsdXNoKSk7CisKKyAgICAgIGlmIENvZGUgPSBUaGluLlpfU1RSRUFNX0VORCB0aGVuCisgICAgICAgICBGaWx0ZXIuU3RyZWFtX0VuZCA6PSBUcnVlOworICAgICAgZWxzZQorICAgICAgICAgQ2hlY2tfRXJyb3IgKEZpbHRlci5TdHJtLmFsbCwgQ29kZSk7CisgICAgICBlbmQgaWY7CisKKyAgICAgIEluX0xhc3QgIDo9IEluX0RhdGEnTGFzdAorICAgICAgICAgLSBTdHJlYW1fRWxlbWVudF9PZmZzZXQgKEF2YWlsX0luIChGaWx0ZXIuU3RybS5hbGwpKTsKKyAgICAgIE91dF9MYXN0IDo9IE91dF9EYXRhJ0xhc3QKKyAgICAgICAgIC0gU3RyZWFtX0VsZW1lbnRfT2Zmc2V0IChBdmFpbF9PdXQgKEZpbHRlci5TdHJtLmFsbCkpOworICAgZW5kIFRyYW5zbGF0ZV9BdXRvOworCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgLS0gVHJhbnNsYXRlX0daaXAgLS0KKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgIHByb2NlZHVyZSBUcmFuc2xhdGVfR1ppcAorICAgICAoRmlsdGVyICAgIDogaW4gb3V0IEZpbHRlcl9UeXBlOworICAgICAgSW5fRGF0YSAgIDogaW4gICAgIEFkYS5TdHJlYW1zLlN0cmVhbV9FbGVtZW50X0FycmF5OworICAgICAgSW5fTGFzdCAgIDogICAgb3V0IEFkYS5TdHJlYW1zLlN0cmVhbV9FbGVtZW50X09mZnNldDsKKyAgICAgIE91dF9EYXRhICA6ICAgIG91dCBBZGEuU3RyZWFtcy5TdHJlYW1fRWxlbWVudF9BcnJheTsKKyAgICAgIE91dF9MYXN0ICA6ICAgIG91dCBBZGEuU3RyZWFtcy5TdHJlYW1fRWxlbWVudF9PZmZzZXQ7CisgICAgICBGbHVzaCAgICAgOiBpbiAgICAgRmx1c2hfTW9kZSkKKyAgIGlzCisgICAgICBPdXRfRmlyc3QgOiBTdHJlYW1fRWxlbWVudF9PZmZzZXQ7CisKKyAgICAgIHByb2NlZHVyZSBBZGRfRGF0YSAoRGF0YSA6IGluIFN0cmVhbV9FbGVtZW50X0FycmF5KTsKKyAgICAgIC0tICBBZGQgZGF0YSB0byBzdHJlYW0gZnJvbSB0aGUgRmlsdGVyLk9mZnNldCB0aWxsIG5lY2Vzc2FyeSwKKyAgICAgIC0tICB1c2VkIGZvciBhZGQgZ3ppcCBoZWFkci9mb290ZXIuCisKKyAgICAgIHByb2NlZHVyZSBQdXRfMzIKKyAgICAgICAgKEl0ZW0gOiBpbiBvdXQgU3RyZWFtX0VsZW1lbnRfQXJyYXk7CisgICAgICAgICBEYXRhIDogaW4gICAgIFVuc2lnbmVkXzMyKTsKKyAgICAgIHByYWdtYSBJbmxpbmUgKFB1dF8zMik7CisKKyAgICAgIC0tLS0tLS0tLS0tLS0tCisgICAgICAtLSBBZGRfRGF0YSAtLQorICAgICAgLS0tLS0tLS0tLS0tLS0KKworICAgICAgcHJvY2VkdXJlIEFkZF9EYXRhIChEYXRhIDogaW4gU3RyZWFtX0VsZW1lbnRfQXJyYXkpIGlzCisgICAgICAgICBEYXRhX0ZpcnN0IDogU3RyZWFtX0VsZW1lbnRfT2Zmc2V0IHJlbmFtZXMgRmlsdGVyLk9mZnNldDsKKyAgICAgICAgIERhdGFfTGFzdCAgOiBTdHJlYW1fRWxlbWVudF9PZmZzZXQ7CisgICAgICAgICBEYXRhX0xlbiAgIDogU3RyZWFtX0VsZW1lbnRfT2Zmc2V0OyAtLSAgLTEKKyAgICAgICAgIE91dF9MZW4gICAgOiBTdHJlYW1fRWxlbWVudF9PZmZzZXQ7IC0tICAtMQorICAgICAgYmVnaW4KKyAgICAgICAgIE91dF9GaXJzdCA6PSBPdXRfTGFzdCArIDE7CisKKyAgICAgICAgIGlmIERhdGFfRmlyc3QgPiBEYXRhJ0xhc3QgdGhlbgorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgZW5kIGlmOworCisgICAgICAgICBEYXRhX0xlbiAgOj0gRGF0YSdMYXN0ICAgICAtIERhdGFfRmlyc3Q7CisgICAgICAgICBPdXRfTGVuICAgOj0gT3V0X0RhdGEnTGFzdCAtIE91dF9GaXJzdDsKKworICAgICAgICAgaWYgRGF0YV9MZW4gPD0gT3V0X0xlbiB0aGVuCisgICAgICAgICAgICBPdXRfTGFzdCAgOj0gT3V0X0ZpcnN0ICArIERhdGFfTGVuOworICAgICAgICAgICAgRGF0YV9MYXN0IDo9IERhdGEnTGFzdDsKKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIE91dF9MYXN0ICA6PSBPdXRfRGF0YSdMYXN0OworICAgICAgICAgICAgRGF0YV9MYXN0IDo9IERhdGFfRmlyc3QgKyBPdXRfTGVuOworICAgICAgICAgZW5kIGlmOworCisgICAgICAgICBPdXRfRGF0YSAoT3V0X0ZpcnN0IC4uIE91dF9MYXN0KSA6PSBEYXRhIChEYXRhX0ZpcnN0IC4uIERhdGFfTGFzdCk7CisKKyAgICAgICAgIERhdGFfRmlyc3QgOj0gRGF0YV9MYXN0ICsgMTsKKyAgICAgICAgIE91dF9GaXJzdCAgOj0gT3V0X0xhc3QgKyAxOworICAgICAgZW5kIEFkZF9EYXRhOworCisgICAgICAtLS0tLS0tLS0tLS0KKyAgICAgIC0tIFB1dF8zMiAtLQorICAgICAgLS0tLS0tLS0tLS0tCisKKyAgICAgIHByb2NlZHVyZSBQdXRfMzIKKyAgICAgICAgKEl0ZW0gOiBpbiBvdXQgU3RyZWFtX0VsZW1lbnRfQXJyYXk7CisgICAgICAgICBEYXRhIDogaW4gICAgIFVuc2lnbmVkXzMyKQorICAgICAgaXMKKyAgICAgICAgIEQgOiBVbnNpZ25lZF8zMiA6PSBEYXRhOworICAgICAgYmVnaW4KKyAgICAgICAgIGZvciBKIGluIEl0ZW0nRmlyc3QgLi4gSXRlbSdGaXJzdCArIDMgbG9vcAorICAgICAgICAgICAgSXRlbSAoSikgOj0gU3RyZWFtX0VsZW1lbnQgKEQgYW5kIDE2I0ZGIyk7CisgICAgICAgICAgICBEIDo9IFNoaWZ0X1JpZ2h0IChELCA4KTsKKyAgICAgICAgIGVuZCBsb29wOworICAgICAgZW5kIFB1dF8zMjsKKworICAgYmVnaW4KKyAgICAgIE91dF9MYXN0IDo9IE91dF9EYXRhJ0ZpcnN0IC0gMTsKKworICAgICAgaWYgbm90IEZpbHRlci5TdHJlYW1fRW5kIHRoZW4KKyAgICAgICAgIEFkZF9EYXRhIChTaW1wbGVfR1ppcF9IZWFkZXIpOworCisgICAgICAgICBUcmFuc2xhdGVfQXV0bworICAgICAgICAgICAoRmlsdGVyICAgPT4gRmlsdGVyLAorICAgICAgICAgICAgSW5fRGF0YSAgPT4gSW5fRGF0YSwKKyAgICAgICAgICAgIEluX0xhc3QgID0+IEluX0xhc3QsCisgICAgICAgICAgICBPdXRfRGF0YSA9PiBPdXRfRGF0YSAoT3V0X0ZpcnN0IC4uIE91dF9EYXRhJ0xhc3QpLAorICAgICAgICAgICAgT3V0X0xhc3QgPT4gT3V0X0xhc3QsCisgICAgICAgICAgICBGbHVzaCAgICA9PiBGbHVzaCk7CisKKyAgICAgICAgIENSQzMyIChGaWx0ZXIuQ1JDLCBJbl9EYXRhIChJbl9EYXRhJ0ZpcnN0IC4uIEluX0xhc3QpKTsKKyAgICAgIGVuZCBpZjsKKworICAgICAgaWYgRmlsdGVyLlN0cmVhbV9FbmQgYW5kIHRoZW4gT3V0X0xhc3QgPD0gT3V0X0RhdGEnTGFzdCB0aGVuCisgICAgICAgICAtLSAgVGhpcyBkZXRlY3Rpb24gbWV0aG9kIHdvdWxkIHdvcmsgb25seSB3aGVuCisgICAgICAgICAtLSAgU2ltcGxlX0daaXBfSGVhZGVyJ0xhc3QgPiBGb290ZXJfQXJyYXknTGFzdAorCisgICAgICAgICBpZiBGaWx0ZXIuT2Zmc2V0ID0gU2ltcGxlX0daaXBfSGVhZGVyJ0xhc3QgKyAxIHRoZW4KKyAgICAgICAgICAgIEZpbHRlci5PZmZzZXQgOj0gRm9vdGVyX0FycmF5J0ZpcnN0OworICAgICAgICAgZW5kIGlmOworCisgICAgICAgICBkZWNsYXJlCisgICAgICAgICAgICBGb290ZXIgOiBGb290ZXJfQXJyYXk7CisgICAgICAgICBiZWdpbgorICAgICAgICAgICAgUHV0XzMyIChGb290ZXIsIEZpbHRlci5DUkMpOworICAgICAgICAgICAgUHV0XzMyIChGb290ZXIgKEZvb3RlcidGaXJzdCArIDQgLi4gRm9vdGVyJ0xhc3QpLAorICAgICAgICAgICAgICAgICAgICBVbnNpZ25lZF8zMiAoVG90YWxfSW4gKEZpbHRlcikpKTsKKyAgICAgICAgICAgIEFkZF9EYXRhIChGb290ZXIpOworICAgICAgICAgZW5kOworICAgICAgZW5kIGlmOworICAgZW5kIFRyYW5zbGF0ZV9HWmlwOworCisgICAtLS0tLS0tLS0tLS0tCisgICAtLSBWZXJzaW9uIC0tCisgICAtLS0tLS0tLS0tLS0tCisKKyAgIGZ1bmN0aW9uIFZlcnNpb24gcmV0dXJuIFN0cmluZyBpcworICAgYmVnaW4KKyAgICAgIHJldHVybiBJbnRlcmZhY2VzLkMuU3RyaW5ncy5WYWx1ZSAoVGhpbi56bGliVmVyc2lvbik7CisgICBlbmQgVmVyc2lvbjsKKworICAgLS0tLS0tLS0tLS0KKyAgIC0tIFdyaXRlIC0tCisgICAtLS0tLS0tLS0tLQorCisgICBwcm9jZWR1cmUgV3JpdGUKKyAgICAgKEZpbHRlciA6IGluIG91dCBGaWx0ZXJfVHlwZTsKKyAgICAgIEl0ZW0gICA6IGluICAgICBBZGEuU3RyZWFtcy5TdHJlYW1fRWxlbWVudF9BcnJheTsKKyAgICAgIEZsdXNoICA6IGluICAgICBGbHVzaF9Nb2RlIDo9IE5vX0ZsdXNoKQorICAgaXMKKyAgICAgIEJ1ZmZlciAgIDogU3RyZWFtX0VsZW1lbnRfQXJyYXkgKDEgLi4gQnVmZmVyX1NpemUpOworICAgICAgSW5fTGFzdCAgOiBTdHJlYW1fRWxlbWVudF9PZmZzZXQ7CisgICAgICBPdXRfTGFzdCA6IFN0cmVhbV9FbGVtZW50X09mZnNldDsKKyAgICAgIEluX0ZpcnN0IDogU3RyZWFtX0VsZW1lbnRfT2Zmc2V0IDo9IEl0ZW0nRmlyc3Q7CisgICBiZWdpbgorICAgICAgaWYgSXRlbSdMZW5ndGggPSAwIGFuZCBGbHVzaCA9IE5vX0ZsdXNoIHRoZW4KKyAgICAgICAgIHJldHVybjsKKyAgICAgIGVuZCBpZjsKKworICAgICAgbG9vcAorICAgICAgICAgVHJhbnNsYXRlCisgICAgICAgICAgIChGaWx0ZXIgICA9PiBGaWx0ZXIsCisgICAgICAgICAgICBJbl9EYXRhICA9PiBJdGVtIChJbl9GaXJzdCAuLiBJdGVtJ0xhc3QpLAorICAgICAgICAgICAgSW5fTGFzdCAgPT4gSW5fTGFzdCwKKyAgICAgICAgICAgIE91dF9EYXRhID0+IEJ1ZmZlciwKKyAgICAgICAgICAgIE91dF9MYXN0ID0+IE91dF9MYXN0LAorICAgICAgICAgICAgRmx1c2ggICAgPT4gRmx1c2gpOworCisgICAgICAgICBpZiBPdXRfTGFzdCA+PSBCdWZmZXInRmlyc3QgdGhlbgorICAgICAgICAgICAgV3JpdGUgKEJ1ZmZlciAoMSAuLiBPdXRfTGFzdCkpOworICAgICAgICAgZW5kIGlmOworCisgICAgICAgICBleGl0IHdoZW4gSW5fTGFzdCA9IEl0ZW0nTGFzdCBvciBTdHJlYW1fRW5kIChGaWx0ZXIpOworCisgICAgICAgICBJbl9GaXJzdCA6PSBJbl9MYXN0ICsgMTsKKyAgICAgIGVuZCBsb29wOworICAgZW5kIFdyaXRlOworCitlbmQgWkxpYjsKZGlmZiAtLWdpdCBhL3psaWItMS4yLjYvY29udHJpYi9hZGEvemxpYi5hZHMgYi96bGliLTEuMi42L2NvbnRyaWIvYWRhL3psaWIuYWRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5ZmZjNDAKLS0tIC9kZXYvbnVsbAorKysgYi96bGliLTEuMi42L2NvbnRyaWIvYWRhL3psaWIuYWRzCkBAIC0wLDAgKzEsMzI4IEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tICAgICAgICAgICAgICAgICAgICAgIFpMaWIgZm9yIEFkYSB0aGljayBiaW5kaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSAyMDAyLTIwMDQgRG1pdHJpeSBBbmlzaW1rb3YgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAgIC0tCistLSAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICAgLS0KKy0tICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgICAtLQorLS0gIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0ICAgICAtLQorLS0gIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICAgICAgIC0tCistLSAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgICAgICAgLS0KKy0tICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICAgLS0KKy0tICBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCAtLQorLS0gIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCBpZiBvdGhlciBmaWxlcyBpbnN0YW50aWF0ZSBnZW5lcmljcyBmcm9tIHRoaXMgICAtLQorLS0gIHVuaXQsIG9yIHlvdSBsaW5rIHRoaXMgdW5pdCB3aXRoIG90aGVyIGZpbGVzIHRvIHByb2R1Y2UgYW4gZXhlY3V0YWJsZSwgIC0tCistLSAgdGhpcyAgdW5pdCAgZG9lcyBub3QgIGJ5IGl0c2VsZiBjYXVzZSAgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHRvIGJlICAgLS0KKy0tICBjb3ZlcmVkIGJ5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gVGhpcyBleGNlcHRpb24gZG9lcyBub3QgICAgICAtLQorLS0gIGhvd2V2ZXIgaW52YWxpZGF0ZSBhbnkgb3RoZXIgcmVhc29ucyB3aHkgdGhlIGV4ZWN1dGFibGUgZmlsZSAgbWlnaHQgYmUgIC0tCistLSAgY292ZXJlZCBieSB0aGUgIEdOVSBQdWJsaWMgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCistLSAgJElkOiB6bGliLmFkcyx2IDEuMjYgMjAwNC8wOS8wNiAwNjo1MzoxOSB2YWd1bCBFeHAgJAorCit3aXRoIEFkYS5TdHJlYW1zOworCit3aXRoIEludGVyZmFjZXM7CisKK3BhY2thZ2UgWkxpYiBpcworCisgICBaTGliX0Vycm9yICAgOiBleGNlcHRpb247CisgICBTdGF0dXNfRXJyb3IgOiBleGNlcHRpb247CisKKyAgIHR5cGUgQ29tcHJlc3Npb25fTGV2ZWwgaXMgbmV3IEludGVnZXIgcmFuZ2UgLTEgLi4gOTsKKworICAgdHlwZSBGbHVzaF9Nb2RlIGlzIHByaXZhdGU7CisKKyAgIHR5cGUgQ29tcHJlc3Npb25fTWV0aG9kIGlzIHByaXZhdGU7CisKKyAgIHR5cGUgV2luZG93X0JpdHNfVHlwZSBpcyBuZXcgSW50ZWdlciByYW5nZSA4IC4uIDE1OworCisgICB0eXBlIE1lbW9yeV9MZXZlbF9UeXBlIGlzIG5ldyBJbnRlZ2VyIHJhbmdlIDEgLi4gOTsKKworICAgdHlwZSBVbnNpZ25lZF8zMiBpcyBuZXcgSW50ZXJmYWNlcy5VbnNpZ25lZF8zMjsKKworICAgdHlwZSBTdHJhdGVneV9UeXBlIGlzIHByaXZhdGU7CisKKyAgIHR5cGUgSGVhZGVyX1R5cGUgaXMgKE5vbmUsIEF1dG8sIERlZmF1bHQsIEdaaXApOworICAgLS0gIEhlYWRlciB0eXBlIHVzYWdlIGhhdmUgYSBzb21lIGxpbWl0YXRpb24gZm9yIGluZmxhdGUuCisgICAtLSAgU2VlIGNvbW1lbnQgZm9yIEluZmxhdGVfSW5pdC4KKworICAgc3VidHlwZSBDb3VudCBpcyBBZGEuU3RyZWFtcy5TdHJlYW1fRWxlbWVudF9Db3VudDsKKworICAgRGVmYXVsdF9NZW1vcnlfTGV2ZWwgOiBjb25zdGFudCBNZW1vcnlfTGV2ZWxfVHlwZSA6PSA4OworICAgRGVmYXVsdF9XaW5kb3dfQml0cyAgOiBjb25zdGFudCBXaW5kb3dfQml0c19UeXBlICA6PSAxNTsKKworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgLS0gQ29tcHJlc3Npb24gbWV0aG9kIGNvbnN0YW50cyAtLQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICBEZWZsYXRlZCA6IGNvbnN0YW50IENvbXByZXNzaW9uX01ldGhvZDsKKyAgIC0tICBPbmx5IG9uZSBtZXRob2QgYWxsb3dlZCBpbiB0aGlzIFpMaWIgdmVyc2lvbgorCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIC0tIENvbXByZXNzaW9uIGxldmVsIGNvbnN0YW50cyAtLQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgIE5vX0NvbXByZXNzaW9uICAgICAgOiBjb25zdGFudCBDb21wcmVzc2lvbl9MZXZlbCA6PSAwOworICAgQmVzdF9TcGVlZCAgICAgICAgICA6IGNvbnN0YW50IENvbXByZXNzaW9uX0xldmVsIDo9IDE7CisgICBCZXN0X0NvbXByZXNzaW9uICAgIDogY29uc3RhbnQgQ29tcHJlc3Npb25fTGV2ZWwgOj0gOTsKKyAgIERlZmF1bHRfQ29tcHJlc3Npb24gOiBjb25zdGFudCBDb21wcmVzc2lvbl9MZXZlbCA6PSAtMTsKKworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIC0tIEZsdXNoIG1vZGUgY29uc3RhbnRzIC0tCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICBOb19GbHVzaCAgICAgIDogY29uc3RhbnQgRmx1c2hfTW9kZTsKKyAgIC0tICBSZWd1bGFyIHdheSBmb3IgY29tcHJlc3Npb24sIG5vIGZsdXNoCisKKyAgIFBhcnRpYWxfRmx1c2ggOiBjb25zdGFudCBGbHVzaF9Nb2RlOworICAgLS0gIFdpbGwgYmUgcmVtb3ZlZCwgdXNlIFpfU1lOQ19GTFVTSCBpbnN0ZWFkCisKKyAgIFN5bmNfRmx1c2ggICAgOiBjb25zdGFudCBGbHVzaF9Nb2RlOworICAgLS0gIEFsbCBwZW5kaW5nIG91dHB1dCBpcyBmbHVzaGVkIHRvIHRoZSBvdXRwdXQgYnVmZmVyIGFuZCB0aGUgb3V0cHV0CisgICAtLSAgaXMgYWxpZ25lZCBvbiBhIGJ5dGUgYm91bmRhcnksIHNvIHRoYXQgdGhlIGRlY29tcHJlc3NvciBjYW4gZ2V0IGFsbAorICAgLS0gIGlucHV0IGRhdGEgYXZhaWxhYmxlIHNvIGZhci4gKEluIHBhcnRpY3VsYXIgYXZhaWxfaW4gaXMgemVybyBhZnRlciB0aGUKKyAgIC0tICBjYWxsIGlmIGVub3VnaCBvdXRwdXQgc3BhY2UgaGFzIGJlZW4gcHJvdmlkZWQgIGJlZm9yZSB0aGUgY2FsbC4pCisgICAtLSAgRmx1c2hpbmcgbWF5IGRlZ3JhZGUgY29tcHJlc3Npb24gZm9yIHNvbWUgY29tcHJlc3Npb24gYWxnb3JpdGhtcyBhbmQgc28KKyAgIC0tICBpdCBzaG91bGQgYmUgdXNlZCBvbmx5IHdoZW4gbmVjZXNzYXJ5LgorCisgICBCbG9ja19GbHVzaCAgIDogY29uc3RhbnQgRmx1c2hfTW9kZTsKKyAgIC0tICBaX0JMT0NLIHJlcXVlc3RzIHRoYXQgaW5mbGF0ZSgpIHN0b3AKKyAgIC0tICBpZiBhbmQgd2hlbiBpdCBnZXQgdG8gdGhlIG5leHQgZGVmbGF0ZSBibG9jayBib3VuZGFyeS4gV2hlbiBkZWNvZGluZyB0aGUKKyAgIC0tICB6bGliIG9yIGd6aXAgZm9ybWF0LCB0aGlzIHdpbGwgY2F1c2UgaW5mbGF0ZSgpIHRvIHJldHVybiBpbW1lZGlhdGVseQorICAgLS0gIGFmdGVyIHRoZSBoZWFkZXIgYW5kIGJlZm9yZSB0aGUgZmlyc3QgYmxvY2suIFdoZW4gZG9pbmcgYSByYXcgaW5mbGF0ZSwKKyAgIC0tICBpbmZsYXRlKCkgd2lsbCBnbyBhaGVhZCBhbmQgcHJvY2VzcyB0aGUgZmlyc3QgYmxvY2ssIGFuZCB3aWxsIHJldHVybgorICAgLS0gIHdoZW4gaXQgZ2V0cyB0byB0aGUgZW5kIG9mIHRoYXQgYmxvY2ssIG9yIHdoZW4gaXQgcnVucyBvdXQgb2YgZGF0YS4KKworICAgRnVsbF9GbHVzaCAgICA6IGNvbnN0YW50IEZsdXNoX01vZGU7CisgICAtLSAgQWxsIG91dHB1dCBpcyBmbHVzaGVkIGFzIHdpdGggU1lOQ19GTFVTSCwgYW5kIHRoZSBjb21wcmVzc2lvbiBzdGF0ZQorICAgLS0gIGlzIHJlc2V0IHNvIHRoYXQgZGVjb21wcmVzc2lvbiBjYW4gcmVzdGFydCBmcm9tIHRoaXMgcG9pbnQgaWYgcHJldmlvdXMKKyAgIC0tICBjb21wcmVzc2VkIGRhdGEgaGFzIGJlZW4gZGFtYWdlZCBvciBpZiByYW5kb20gYWNjZXNzIGlzIGRlc2lyZWQuIFVzaW5nCisgICAtLSAgRnVsbF9GbHVzaCB0b28gb2Z0ZW4gY2FuIHNlcmlvdXNseSBkZWdyYWRlIHRoZSBjb21wcmVzc2lvbi4KKworICAgRmluaXNoICAgICAgICA6IGNvbnN0YW50IEZsdXNoX01vZGU7CisgICAtLSAgSnVzdCBmb3IgdGVsbCB0aGUgY29tcHJlc3NvciB0aGF0IGlucHV0IGRhdGEgaXMgY29tcGxldGUuCisKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgLS0gQ29tcHJlc3Npb24gc3RyYXRlZ3kgY29uc3RhbnRzIC0tCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgLS0gIFJMRSBzdGF0ZWd5IGNvdWxkIGJlIHVzZWQgb25seSBpbiB2ZXJzaW9uIDEuMi4wIGFuZCBsYXRlci4KKworICAgRmlsdGVyZWQgICAgICAgICA6IGNvbnN0YW50IFN0cmF0ZWd5X1R5cGU7CisgICBIdWZmbWFuX09ubHkgICAgIDogY29uc3RhbnQgU3RyYXRlZ3lfVHlwZTsKKyAgIFJMRSAgICAgICAgICAgICAgOiBjb25zdGFudCBTdHJhdGVneV9UeXBlOworICAgRGVmYXVsdF9TdHJhdGVneSA6IGNvbnN0YW50IFN0cmF0ZWd5X1R5cGU7CisKKyAgIERlZmF1bHRfQnVmZmVyX1NpemUgOiBjb25zdGFudCA6PSA0MDk2OworCisgICB0eXBlIEZpbHRlcl9UeXBlIGlzIHRhZ2dlZCBsaW1pdGVkIHByaXZhdGU7CisgICAtLSAgVGhlIGZpbHRlciBpcyBmb3IgY29tcHJlc3Npb24gYW5kIGZvciBkZWNvbXByZXNzaW9uLgorICAgLS0gIFRoZSB1c2FnZSBvZiB0aGUgdHlwZSBpcyBkZXBlbmQgb2YgaXRzIGluaXRpYWxpemF0aW9uLgorCisgICBmdW5jdGlvbiBWZXJzaW9uIHJldHVybiBTdHJpbmc7CisgICBwcmFnbWEgSW5saW5lIChWZXJzaW9uKTsKKyAgIC0tICBSZXR1cm4gc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBaTGliIHZlcnNpb24uCisKKyAgIHByb2NlZHVyZSBEZWZsYXRlX0luaXQKKyAgICAgKEZpbHRlciAgICAgICA6IGluIG91dCBGaWx0ZXJfVHlwZTsKKyAgICAgIExldmVsICAgICAgICA6IGluICAgICBDb21wcmVzc2lvbl9MZXZlbCAgOj0gRGVmYXVsdF9Db21wcmVzc2lvbjsKKyAgICAgIFN0cmF0ZWd5ICAgICA6IGluICAgICBTdHJhdGVneV9UeXBlICAgICAgOj0gRGVmYXVsdF9TdHJhdGVneTsKKyAgICAgIE1ldGhvZCAgICAgICA6IGluICAgICBDb21wcmVzc2lvbl9NZXRob2QgOj0gRGVmbGF0ZWQ7CisgICAgICBXaW5kb3dfQml0cyAgOiBpbiAgICAgV2luZG93X0JpdHNfVHlwZSAgIDo9IERlZmF1bHRfV2luZG93X0JpdHM7CisgICAgICBNZW1vcnlfTGV2ZWwgOiBpbiAgICAgTWVtb3J5X0xldmVsX1R5cGUgIDo9IERlZmF1bHRfTWVtb3J5X0xldmVsOworICAgICAgSGVhZGVyICAgICAgIDogaW4gICAgIEhlYWRlcl9UeXBlICAgICAgICA6PSBEZWZhdWx0KTsKKyAgIC0tICBDb21wcmVzc29yIGluaXRpYWxpemF0aW9uLgorICAgLS0gIFdoZW4gSGVhZGVyIHBhcmFtZXRlciBpcyBBdXRvIG9yIERlZmF1bHQsIHRoZW4gZGVmYXVsdCB6bGliIGhlYWRlcgorICAgLS0gIHdvdWxkIGJlIHByb3ZpZGVkIGZvciBjb21wcmVzc2VkIGRhdGEuCisgICAtLSAgV2hlbiBIZWFkZXIgaXMgR1ppcCwgdGhlbiBnemlwIGhlYWRlciB3b3VsZCBiZSBzZXQgaW5zdGVhZCBvZgorICAgLS0gIGRlZmF1bHQgaGVhZGVyLgorICAgLS0gIFdoZW4gSGVhZGVyIGlzIE5vbmUsIG5vIGhlYWRlciB3b3VsZCBiZSBzZXQgZm9yIGNvbXByZXNzZWQgZGF0YS4KKworICAgcHJvY2VkdXJlIEluZmxhdGVfSW5pdAorICAgICAoRmlsdGVyICAgICAgOiBpbiBvdXQgRmlsdGVyX1R5cGU7CisgICAgICBXaW5kb3dfQml0cyA6IGluICAgICBXaW5kb3dfQml0c19UeXBlIDo9IERlZmF1bHRfV2luZG93X0JpdHM7CisgICAgICBIZWFkZXIgICAgICA6IGluICAgICBIZWFkZXJfVHlwZSAgICAgIDo9IERlZmF1bHQpOworICAgLS0gIERlY29tcHJlc3NvciBpbml0aWFsaXphdGlvbi4KKyAgIC0tICBEZWZhdWx0IGhlYWRlciB0eXBlIG1lYW4gdGhhdCBaTGliIGRlZmF1bHQgaGVhZGVyIGlzIGV4cGVjdGluZyBpbiB0aGUKKyAgIC0tICBpbnB1dCBjb21wcmVzc2VkIHN0cmVhbS4KKyAgIC0tICBIZWFkZXIgdHlwZSBOb25lIG1lYW4gdGhhdCBubyBoZWFkZXIgaXMgZXhwZWN0aW5nIGluIHRoZSBpbnB1dCBzdHJlYW0uCisgICAtLSAgR1ppcCBoZWFkZXIgdHlwZSBtZWFuIHRoYXQgR1ppcCBoZWFkZXIgaXMgZXhwZWN0aW5nIGluIHRoZQorICAgLS0gIGlucHV0IGNvbXByZXNzZWQgc3RyZWFtLgorICAgLS0gIEF1dG8gaGVhZGVyIHR5cGUgbWVhbiB0aGF0IGhlYWRlciB0eXBlIChHWmlwIG9yIE5hdGl2ZSkgd291bGQgYmUKKyAgIC0tICBkZXRlY3RlZCBhdXRvbWF0aWNhbGx5IGluIHRoZSBpbnB1dCBzdHJlYW0uCisgICAtLSAgTm90ZSB0aGF0IGhlYWRlciB0eXBlcyBwYXJhbWV0ZXIgdmFsdWVzIE5vbmUsIEdaaXAgYW5kIEF1dG8gYXJlCisgICAtLSAgc3VwcG9ydGVkIGZvciBpbmZsYXRlIHJvdXRpbmUgb25seSBpbiBaTGliIHZlcnNpb25zIDEuMi4wLjIgYW5kIGxhdGVyLgorICAgLS0gIERlZmxhdGVfSW5pdCBpcyBzdXBwb3J0aW5nIGFsbCBoZWFkZXIgdHlwZXMuCisKKyAgIGZ1bmN0aW9uIElzX09wZW4gKEZpbHRlciA6IGluIEZpbHRlcl9UeXBlKSByZXR1cm4gQm9vbGVhbjsKKyAgIHByYWdtYSBJbmxpbmUgKElzX09wZW4pOworICAgLS0gIElzIHRoZSBmaWx0ZXIgb3BlbmVkIGZvciBjb21wcmVzc2lvbiBvciBkZWNvbXByZXNzaW9uLgorCisgICBwcm9jZWR1cmUgQ2xvc2UKKyAgICAgKEZpbHRlciAgICAgICA6IGluIG91dCBGaWx0ZXJfVHlwZTsKKyAgICAgIElnbm9yZV9FcnJvciA6IGluICAgICBCb29sZWFuIDo9IEZhbHNlKTsKKyAgIC0tICBDbG9zaW5nIHRoZSBjb21wcmVzc2lvbiBvciBkZWNvbXByZXNzb3IuCisgICAtLSAgSWYgc3RyZWFtIGlzIGNsb3NpbmcgYmVmb3JlIHRoZSBjb21wbGV0ZSBhbmQgSWdub3JlX0Vycm9yIGlzIEZhbHNlLAorICAgLS0gIFRoZSBleGNlcHRpb24gd291bGQgYmUgcmFpc2VkLgorCisgICBnZW5lcmljCisgICAgICB3aXRoIHByb2NlZHVyZSBEYXRhX0luCisgICAgICAgIChJdGVtIDogb3V0IEFkYS5TdHJlYW1zLlN0cmVhbV9FbGVtZW50X0FycmF5OworICAgICAgICAgTGFzdCA6IG91dCBBZGEuU3RyZWFtcy5TdHJlYW1fRWxlbWVudF9PZmZzZXQpOworICAgICAgd2l0aCBwcm9jZWR1cmUgRGF0YV9PdXQKKyAgICAgICAgKEl0ZW0gOiBpbiBBZGEuU3RyZWFtcy5TdHJlYW1fRWxlbWVudF9BcnJheSk7CisgICBwcm9jZWR1cmUgR2VuZXJpY19UcmFuc2xhdGUKKyAgICAgKEZpbHRlciAgICAgICAgICA6IGluIG91dCBGaWx0ZXJfVHlwZTsKKyAgICAgIEluX0J1ZmZlcl9TaXplICA6IGluICAgICBJbnRlZ2VyIDo9IERlZmF1bHRfQnVmZmVyX1NpemU7CisgICAgICBPdXRfQnVmZmVyX1NpemUgOiBpbiAgICAgSW50ZWdlciA6PSBEZWZhdWx0X0J1ZmZlcl9TaXplKTsKKyAgIC0tICBDb21wcmVzcy9kZWNvbXByZXNzIGRhdGEgZmV0Y2ggZnJvbSBEYXRhX0luIHJvdXRpbmUgYW5kIHBhc3MgdGhlIHJlc3VsdAorICAgLS0gIHRvIHRoZSBEYXRhX091dCByb3V0aW5lLiBVc2VyIHNob3VsZCBwcm92aWRlIERhdGFfSW4gYW5kIERhdGFfT3V0CisgICAtLSAgZm9yIGNvbXByZXNzaW9uL2RlY29tcHJlc3Npb24gZGF0YSBmbG93LgorICAgLS0gIENvbXByZXNzaW9uIG9yIGRlY29tcHJlc3Npb24gZGVwZW5kIG9uIEZpbHRlciBpbml0aWFsaXphdGlvbi4KKworICAgZnVuY3Rpb24gVG90YWxfSW4gKEZpbHRlciA6IGluIEZpbHRlcl9UeXBlKSByZXR1cm4gQ291bnQ7CisgICBwcmFnbWEgSW5saW5lIChUb3RhbF9Jbik7CisgICAtLSAgUmV0dXJucyB0b3RhbCBudW1iZXIgb2YgaW5wdXQgYnl0ZXMgcmVhZCBzbyBmYXIKKworICAgZnVuY3Rpb24gVG90YWxfT3V0IChGaWx0ZXIgOiBpbiBGaWx0ZXJfVHlwZSkgcmV0dXJuIENvdW50OworICAgcHJhZ21hIElubGluZSAoVG90YWxfT3V0KTsKKyAgIC0tICBSZXR1cm5zIHRvdGFsIG51bWJlciBvZiBieXRlcyBvdXRwdXQgc28gZmFyCisKKyAgIGZ1bmN0aW9uIENSQzMyCisgICAgIChDUkMgICAgOiBpbiBVbnNpZ25lZF8zMjsKKyAgICAgIERhdGEgICA6IGluIEFkYS5TdHJlYW1zLlN0cmVhbV9FbGVtZW50X0FycmF5KQorICAgICAgcmV0dXJuIFVuc2lnbmVkXzMyOworICAgcHJhZ21hIElubGluZSAoQ1JDMzIpOworICAgLS0gIENvbXB1dGUgQ1JDMzIsIGl0IGNvdWxkIGJlIG5lY2Vzc2FyeSBmb3IgbWFrZSBnemlwIGZvcm1hdAorCisgICBwcm9jZWR1cmUgQ1JDMzIKKyAgICAgKENSQyAgOiBpbiBvdXQgVW5zaWduZWRfMzI7CisgICAgICBEYXRhIDogaW4gICAgIEFkYS5TdHJlYW1zLlN0cmVhbV9FbGVtZW50X0FycmF5KTsKKyAgIHByYWdtYSBJbmxpbmUgKENSQzMyKTsKKyAgIC0tICBDb21wdXRlIENSQzMyLCBpdCBjb3VsZCBiZSBuZWNlc3NhcnkgZm9yIG1ha2UgZ3ppcCBmb3JtYXQKKworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgLS0gIEJlbG93IGlzIG1vcmUgY29tcGxleCBsb3cgbGV2ZWwgcm91dGluZXMuICAtLQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICBwcm9jZWR1cmUgVHJhbnNsYXRlCisgICAgIChGaWx0ZXIgICAgOiBpbiBvdXQgRmlsdGVyX1R5cGU7CisgICAgICBJbl9EYXRhICAgOiBpbiAgICAgQWRhLlN0cmVhbXMuU3RyZWFtX0VsZW1lbnRfQXJyYXk7CisgICAgICBJbl9MYXN0ICAgOiAgICBvdXQgQWRhLlN0cmVhbXMuU3RyZWFtX0VsZW1lbnRfT2Zmc2V0OworICAgICAgT3V0X0RhdGEgIDogICAgb3V0IEFkYS5TdHJlYW1zLlN0cmVhbV9FbGVtZW50X0FycmF5OworICAgICAgT3V0X0xhc3QgIDogICAgb3V0IEFkYS5TdHJlYW1zLlN0cmVhbV9FbGVtZW50X09mZnNldDsKKyAgICAgIEZsdXNoICAgICA6IGluICAgICBGbHVzaF9Nb2RlKTsKKyAgIC0tICBDb21wcmVzcy9kZWNvbXByZXNzIHRoZSBJbl9EYXRhIGJ1ZmZlciBhbmQgcGxhY2UgdGhlIHJlc3VsdCBpbnRvCisgICAtLSAgT3V0X0RhdGEuIEluX0xhc3QgaXMgdGhlIGluZGV4IG9mIGxhc3QgZWxlbWVudCBmcm9tIEluX0RhdGEgYWNjZXB0ZWQgYnkKKyAgIC0tICB0aGUgRmlsdGVyLiBPdXRfTGFzdCBpcyB0aGUgbGFzdCBlbGVtZW50IG9mIHRoZSByZWNlaXZlZCBkYXRhIGZyb20KKyAgIC0tICBGaWx0ZXIuIFRvIHRlbGwgdGhlIGZpbHRlciB0aGF0IGluY29taW5nIGRhdGEgYXJlIGNvbXBsZXRlIHB1dCB0aGUKKyAgIC0tICBGbHVzaCBwYXJhbWV0ZXIgdG8gRmluaXNoLgorCisgICBmdW5jdGlvbiBTdHJlYW1fRW5kIChGaWx0ZXIgOiBpbiBGaWx0ZXJfVHlwZSkgcmV0dXJuIEJvb2xlYW47CisgICBwcmFnbWEgSW5saW5lIChTdHJlYW1fRW5kKTsKKyAgIC0tICBSZXR1cm4gdGhlIHRydWUgd2hlbiB0aGUgc3RyZWFtIGlzIGNvbXBsZXRlLgorCisgICBwcm9jZWR1cmUgRmx1c2gKKyAgICAgKEZpbHRlciAgICA6IGluIG91dCBGaWx0ZXJfVHlwZTsKKyAgICAgIE91dF9EYXRhICA6ICAgIG91dCBBZGEuU3RyZWFtcy5TdHJlYW1fRWxlbWVudF9BcnJheTsKKyAgICAgIE91dF9MYXN0ICA6ICAgIG91dCBBZGEuU3RyZWFtcy5TdHJlYW1fRWxlbWVudF9PZmZzZXQ7CisgICAgICBGbHVzaCAgICAgOiBpbiAgICAgRmx1c2hfTW9kZSk7CisgICBwcmFnbWEgSW5saW5lIChGbHVzaCk7CisgICAtLSAgRmx1c2hpbmcgdGhlIGRhdGEgZnJvbSB0aGUgY29tcHJlc3Nvci4KKworICAgZ2VuZXJpYworICAgICAgd2l0aCBwcm9jZWR1cmUgV3JpdGUKKyAgICAgICAgKEl0ZW0gOiBpbiBBZGEuU3RyZWFtcy5TdHJlYW1fRWxlbWVudF9BcnJheSk7CisgICAgICAtLSAgVXNlciBzaG91bGQgcHJvdmlkZSB0aGlzIHJvdXRpbmUgZm9yIGFjY2VwdAorICAgICAgLS0gIGNvbXByZXNzZWQvZGVjb21wcmVzc2VkIGRhdGEuCisKKyAgICAgIEJ1ZmZlcl9TaXplIDogaW4gQWRhLlN0cmVhbXMuU3RyZWFtX0VsZW1lbnRfT2Zmc2V0CisgICAgICAgICA6PSBEZWZhdWx0X0J1ZmZlcl9TaXplOworICAgICAgLS0gIEJ1ZmZlciBzaXplIGZvciBXcml0ZSB1c2VyIHJvdXRpbmUuCisKKyAgIHByb2NlZHVyZSBXcml0ZQorICAgICAoRmlsdGVyICA6IGluIG91dCBGaWx0ZXJfVHlwZTsKKyAgICAgIEl0ZW0gICAgOiBpbiAgICAgQWRhLlN0cmVhbXMuU3RyZWFtX0VsZW1lbnRfQXJyYXk7CisgICAgICBGbHVzaCAgIDogaW4gICAgIEZsdXNoX01vZGUgOj0gTm9fRmx1c2gpOworICAgLS0gIENvbXByZXNzL0RlY29tcHJlc3MgZGF0YSBmcm9tIEl0ZW0gdG8gdGhlIGdlbmVyaWMgcGFyYW1ldGVyIHByb2NlZHVyZQorICAgLS0gIFdyaXRlLiBPdXRwdXQgYnVmZmVyIHNpemUgY291bGQgYmUgc2V0IGluIEJ1ZmZlcl9TaXplIGdlbmVyaWMgcGFyYW1ldGVyLgorCisgICBnZW5lcmljCisgICAgICB3aXRoIHByb2NlZHVyZSBSZWFkCisgICAgICAgIChJdGVtIDogb3V0IEFkYS5TdHJlYW1zLlN0cmVhbV9FbGVtZW50X0FycmF5OworICAgICAgICAgTGFzdCA6IG91dCBBZGEuU3RyZWFtcy5TdHJlYW1fRWxlbWVudF9PZmZzZXQpOworICAgICAgLS0gIFVzZXIgc2hvdWxkIHByb3ZpZGUgZGF0YSBmb3IgY29tcHJlc3Npb24vZGVjb21wcmVzc2lvbgorICAgICAgLS0gIHRocnUgdGhpcyByb3V0aW5lLgorCisgICAgICBCdWZmZXIgOiBpbiBvdXQgQWRhLlN0cmVhbXMuU3RyZWFtX0VsZW1lbnRfQXJyYXk7CisgICAgICAtLSAgQnVmZmVyIGZvciBrZWVwIHJlbWFpbmluZyBkYXRhIGZyb20gdGhlIHByZXZpb3VzCisgICAgICAtLSAgYmFjayByZWFkLgorCisgICAgICBSZXN0X0ZpcnN0LCBSZXN0X0xhc3QgOiBpbiBvdXQgQWRhLlN0cmVhbXMuU3RyZWFtX0VsZW1lbnRfT2Zmc2V0OworICAgICAgLS0gIFJlc3RfRmlyc3QgaGF2ZSB0byBiZSBpbml0aWFsaXplZCB0byBCdWZmZXInTGFzdCArIDEKKyAgICAgIC0tICBSZXN0X0xhc3QgaGF2ZSB0byBiZSBpbml0aWFsaXplZCB0byBCdWZmZXInTGFzdAorICAgICAgLS0gIGJlZm9yZSB1c2FnZS4KKworICAgICAgQWxsb3dfUmVhZF9Tb21lIDogaW4gQm9vbGVhbiA6PSBGYWxzZTsKKyAgICAgIC0tICBJcyBpdCBhbGxvd2VkIHRvIHJldHVybiBMYXN0IDwgSXRlbSdMYXN0IGJlZm9yZSBlbmQgb2YgZGF0YS4KKworICAgcHJvY2VkdXJlIFJlYWQKKyAgICAgKEZpbHRlciA6IGluIG91dCBGaWx0ZXJfVHlwZTsKKyAgICAgIEl0ZW0gICA6ICAgIG91dCBBZGEuU3RyZWFtcy5TdHJlYW1fRWxlbWVudF9BcnJheTsKKyAgICAgIExhc3QgICA6ICAgIG91dCBBZGEuU3RyZWFtcy5TdHJlYW1fRWxlbWVudF9PZmZzZXQ7CisgICAgICBGbHVzaCAgOiBpbiAgICAgRmx1c2hfTW9kZSA6PSBOb19GbHVzaCk7CisgICAtLSAgQ29tcHJlc3MvRGVjb21wcmVzcyBkYXRhIGZyb20gZ2VuZXJpYyBwYXJhbWV0ZXIgcHJvY2VkdXJlIFJlYWQgdG8gdGhlCisgICAtLSAgSXRlbS4gVXNlciBzaG91bGQgcHJvdmlkZSBCdWZmZXIgYW5kIGluaXRpYWxpemVkIFJlc3RfRmlyc3QsIFJlc3RfTGFzdAorICAgLS0gIGluZGljYXRvcnMuIElmIEFsbG93X1JlYWRfU29tZSBpcyBUcnVlLCBSZWFkIHJvdXRpbmVzIGNvdWxkIHJldHVybgorICAgLS0gIExhc3QgPCBJdGVtJ0xhc3Qgb25seSBhdCBlbmQgb2Ygc3RyZWFtLgorCitwcml2YXRlCisKKyAgIHVzZSBBZGEuU3RyZWFtczsKKworICAgcHJhZ21hIEFzc2VydCAoQWRhLlN0cmVhbXMuU3RyZWFtX0VsZW1lbnQnU2l6ZSAgICA9ICAgIDgpOworICAgcHJhZ21hIEFzc2VydCAoQWRhLlN0cmVhbXMuU3RyZWFtX0VsZW1lbnQnTW9kdWx1cyA9IDIqKjgpOworCisgICB0eXBlIEZsdXNoX01vZGUgaXMgbmV3IEludGVnZXIgcmFuZ2UgMCAuLiA1OworCisgICB0eXBlIENvbXByZXNzaW9uX01ldGhvZCBpcyBuZXcgSW50ZWdlciByYW5nZSA4IC4uIDg7CisKKyAgIHR5cGUgU3RyYXRlZ3lfVHlwZSBpcyBuZXcgSW50ZWdlciByYW5nZSAwIC4uIDM7CisKKyAgIE5vX0ZsdXNoICAgICAgOiBjb25zdGFudCBGbHVzaF9Nb2RlIDo9IDA7CisgICBQYXJ0aWFsX0ZsdXNoIDogY29uc3RhbnQgRmx1c2hfTW9kZSA6PSAxOworICAgU3luY19GbHVzaCAgICA6IGNvbnN0YW50IEZsdXNoX01vZGUgOj0gMjsKKyAgIEZ1bGxfRmx1c2ggICAgOiBjb25zdGFudCBGbHVzaF9Nb2RlIDo9IDM7CisgICBGaW5pc2ggICAgICAgIDogY29uc3RhbnQgRmx1c2hfTW9kZSA6PSA0OworICAgQmxvY2tfRmx1c2ggICA6IGNvbnN0YW50IEZsdXNoX01vZGUgOj0gNTsKKworICAgRmlsdGVyZWQgICAgICAgICA6IGNvbnN0YW50IFN0cmF0ZWd5X1R5cGUgOj0gMTsKKyAgIEh1ZmZtYW5fT25seSAgICAgOiBjb25zdGFudCBTdHJhdGVneV9UeXBlIDo9IDI7CisgICBSTEUgICAgICAgICAgICAgIDogY29uc3RhbnQgU3RyYXRlZ3lfVHlwZSA6PSAzOworICAgRGVmYXVsdF9TdHJhdGVneSA6IGNvbnN0YW50IFN0cmF0ZWd5X1R5cGUgOj0gMDsKKworICAgRGVmbGF0ZWQgOiBjb25zdGFudCBDb21wcmVzc2lvbl9NZXRob2QgOj0gODsKKworICAgdHlwZSBaX1N0cmVhbTsKKworICAgdHlwZSBaX1N0cmVhbV9BY2Nlc3MgaXMgYWNjZXNzIGFsbCBaX1N0cmVhbTsKKworICAgdHlwZSBGaWx0ZXJfVHlwZSBpcyB0YWdnZWQgbGltaXRlZCByZWNvcmQKKyAgICAgIFN0cm0gICAgICAgIDogWl9TdHJlYW1fQWNjZXNzOworICAgICAgQ29tcHJlc3Npb24gOiBCb29sZWFuOworICAgICAgU3RyZWFtX0VuZCAgOiBCb29sZWFuOworICAgICAgSGVhZGVyICAgICAgOiBIZWFkZXJfVHlwZTsKKyAgICAgIENSQyAgICAgICAgIDogVW5zaWduZWRfMzI7CisgICAgICBPZmZzZXQgICAgICA6IFN0cmVhbV9FbGVtZW50X09mZnNldDsKKyAgICAgIC0tICBPZmZzZXQgZm9yIGd6aXAgaGVhZGVyL2Zvb3RlciBvdXRwdXQuCisgICBlbmQgcmVjb3JkOworCitlbmQgWkxpYjsKZGlmZiAtLWdpdCBhL3psaWItMS4yLjYvY29udHJpYi9hZGEvemxpYi5ncHIgYi96bGliLTEuMi42L2NvbnRyaWIvYWRhL3psaWIuZ3ByCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5NmIyMmEKLS0tIC9kZXYvbnVsbAorKysgYi96bGliLTEuMi42L2NvbnRyaWIvYWRhL3psaWIuZ3ByCkBAIC0wLDAgKzEsMjAgQEAKK3Byb2plY3QgWmxpYiBpcworCisgICBmb3IgTGFuZ3VhZ2VzIHVzZSAoIkFkYSIpOworICAgZm9yIFNvdXJjZV9EaXJzIHVzZSAoIi4iKTsKKyAgIGZvciBPYmplY3RfRGlyIHVzZSAiLiI7CisgICBmb3IgTWFpbiB1c2UgKCJ0ZXN0LmFkYiIsICJtdGVzdC5hZGIiLCAicmVhZC5hZGIiLCAiYnVmZmVyX2RlbW8iKTsKKworICAgcGFja2FnZSBDb21waWxlciBpcworICAgICAgZm9yIERlZmF1bHRfU3dpdGNoZXMgKCJhZGEiKSB1c2UgKCItZ25hdHdjZmlsb3BydSIsICItZ25hdFZjZGZpbW9yc3QiLCAiLWduYXR5YWJjZWZoaWtsbW5vcHJzdCIpOworICAgZW5kIENvbXBpbGVyOworCisgICBwYWNrYWdlIExpbmtlciBpcworICAgICAgZm9yIERlZmF1bHRfU3dpdGNoZXMgKCJhZGEiKSB1c2UgKCItbHoiKTsKKyAgIGVuZCBMaW5rZXI7CisKKyAgIHBhY2thZ2UgQnVpbGRlciBpcworICAgICAgZm9yIERlZmF1bHRfU3dpdGNoZXMgKCJhZGEiKSB1c2UgKCItcyIsICItZ25hdFEiKTsKKyAgIGVuZCBCdWlsZGVyOworCitlbmQgWmxpYjsKZGlmZiAtLWdpdCBhL3psaWItMS4yLjYvY29udHJpYi9hbWQ2NC9hbWQ2NC1tYXRjaC5TIGIvemxpYi0xLjIuNi9jb250cmliL2FtZDY0L2FtZDY0LW1hdGNoLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFkNGExYwotLS0gL2Rldi9udWxsCisrKyBiL3psaWItMS4yLjYvY29udHJpYi9hbWQ2NC9hbWQ2NC1tYXRjaC5TCkBAIC0wLDAgKzEsNDUyIEBACisvKgorICogbWF0Y2guUyAtLSBvcHRpbWl6ZWQgdmVyc2lvbiBvZiBsb25nZXN0X21hdGNoKCkKKyAqIGJhc2VkIG9uIHRoZSBzaW1pbGFyIHdvcmsgYnkgR2lsbGVzIFZvbGxhbnQsIGFuZCBCcmlhbiBSYWl0ZXIsIHdyaXR0ZW4gMTk5OAorICoKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBCU0QgTGljZW5zZS4gVXNlIGJ5IG93bmVycyBvZiBDaGUgR3VldmFycmEKKyAqIHBhcmFmZXJuYWxpYSBpcyBwcm9oaWJpdGVkLCB3aGVyZSBwb3NzaWJsZSwgYW5kIGhpZ2hseSBkaXNjb3VyYWdlZAorICogZWxzZXdoZXJlLgorICovCisKKyNpZm5kZWYgTk9fVU5ERVJMSU5FCisjCWRlZmluZQltYXRjaF9pbml0CV9tYXRjaF9pbml0CisjCWRlZmluZQlsb25nZXN0X21hdGNoCV9sb25nZXN0X21hdGNoCisjZW5kaWYKKworI2RlZmluZQlzY2FuZW5kCQllYngKKyNkZWZpbmUJc2NhbmVuZHcJYngKKyNkZWZpbmUJY2hhaW5sZW53bWFzawllZHggLyogaGlnaCB3b3JkOiBjdXJyZW50IGNoYWluIGxlbiBsb3cgd29yZDogcy0+d21hc2sgKi8KKyNkZWZpbmUJY3VybWF0Y2gJcnNpCisjZGVmaW5lCWN1cm1hdGNoZAllc2kKKyNkZWZpbmUJd2luZG93YmVzdGxlbglyOAorI2RlZmluZQlzY2FuYWxpZ24JcjkKKyNkZWZpbmUJc2NhbmFsaWduZAlyOWQKKyNkZWZpbmUJd2luZG93CQlyMTAKKyNkZWZpbmUJYmVzdGxlbgkJcjExCisjZGVmaW5lCWJlc3RsZW5kCXIxMWQKKyNkZWZpbmUJc2NhbnN0YXJ0CXIxMmQKKyNkZWZpbmUJc2NhbnN0YXJ0dwlyMTJ3CisjZGVmaW5lIHNjYW4JCXIxMworI2RlZmluZSBuaWNlbWF0Y2gJcjE0ZAorI2RlZmluZQlsaW1pdAkJcjE1CisjZGVmaW5lCWxpbWl0ZAkJcjE1ZAorI2RlZmluZSBwcmV2CQlyY3gKKworLyoKKyAqIFRoZSAyNTggaXMgYSAibWFnaWMgbnVtYmVyLCBub3QgYSBwYXJhbWV0ZXIgLS0gY2hhbmdpbmcgaXQKKyAqIGJyZWFrcyB0aGUgaGVsbCBsb29zZQorICovCisjZGVmaW5lCU1BWF9NQVRDSAkoMjU4KQorI2RlZmluZQlNSU5fTUFUQ0gJKDMpCisjZGVmaW5lCU1JTl9MT09LQUhFQUQJKE1BWF9NQVRDSCArIE1JTl9NQVRDSCArIDEpCisjZGVmaW5lCU1BWF9NQVRDSF84CSgoTUFYX01BVENIICsgNykgJiB+NykKKworLyogc3RhY2sgZnJhbWUgb2Zmc2V0cyAqLworI2RlZmluZQlMb2NhbFZhcnNTaXplCSgxMTIpCisjZGVmaW5lIF9jaGFpbmxlbndtYXNrCSggOC1Mb2NhbFZhcnNTaXplKSglcnNwKQorI2RlZmluZSBfd2luZG93YmVzdGxlbgkoMTYtTG9jYWxWYXJzU2l6ZSkoJXJzcCkKKyNkZWZpbmUgc2F2ZV9yMTQgICAgICAgICgyNC1Mb2NhbFZhcnNTaXplKSglcnNwKQorI2RlZmluZSBzYXZlX3JzaSAgICAgICAgKDMyLUxvY2FsVmFyc1NpemUpKCVyc3ApCisjZGVmaW5lIHNhdmVfcmJ4ICAgICAgICAoNDAtTG9jYWxWYXJzU2l6ZSkoJXJzcCkKKyNkZWZpbmUgc2F2ZV9yMTIgICAgICAgICg1Ni1Mb2NhbFZhcnNTaXplKSglcnNwKQorI2RlZmluZSBzYXZlX3IxMyAgICAgICAgKDY0LUxvY2FsVmFyc1NpemUpKCVyc3ApCisjZGVmaW5lIHNhdmVfcjE1ICAgICAgICAoODAtTG9jYWxWYXJzU2l6ZSkoJXJzcCkKKworCisuZ2xvYmwJbWF0Y2hfaW5pdCwgbG9uZ2VzdF9tYXRjaAorCisvKgorICogT24gQU1ENjQgdGhlIGZpcnN0IGFyZ3VtZW50IG9mIGEgZnVuY3Rpb24gKGluIG91ciBjYXNlIC0tIHRoZSBwb2ludGVyIHRvCisgKiBkZWZsYXRlX3N0YXRlIHN0cnVjdHVyZSkgaXMgcGFzc2VkIGluICVyZGksIGhlbmNlIG91ciBvZmZzZXRzIGJlbG93IGFyZQorICogYWxsIG9mZiBvZiB0aGF0LgorICovCisKKy8qIHlvdSBjYW4gY2hlY2sgdGhlIHN0cnVjdHVyZSBvZmZzZXQgYnkgcnVubmluZworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJkZWZsYXRlLmgiCisKK3ZvaWQgcHJpbnRfZGVwbCgpCit7CitkZWZsYXRlX3N0YXRlIGRzOworZGVmbGF0ZV9zdGF0ZSAqcz0mZHM7CitwcmludGYoInNpemUgcG9pbnRlcj0ldVxuIiwoaW50KXNpemVvZih2b2lkKikpOworCitwcmludGYoIiNkZWZpbmUgZHNXU2l6ZSAgICAgICAgICglM3UpKCUlcmRpKVxuIiwoaW50KSgoKGNoYXIqKSYocy0+d19zaXplKSktKChjaGFyKilzKSkpOworcHJpbnRmKCIjZGVmaW5lIGRzV01hc2sgICAgICAgICAoJTN1KSglJXJkaSlcbiIsKGludCkoKChjaGFyKikmKHMtPndfbWFzaykpLSgoY2hhciopcykpKTsKK3ByaW50ZigiI2RlZmluZSBkc1dpbmRvdyAgICAgICAgKCUzdSkoJSVyZGkpXG4iLChpbnQpKCgoY2hhciopJihzLT53aW5kb3cpKS0oKGNoYXIqKXMpKSk7CitwcmludGYoIiNkZWZpbmUgZHNQcmV2ICAgICAgICAgICglM3UpKCUlcmRpKVxuIiwoaW50KSgoKGNoYXIqKSYocy0+cHJldikpLSgoY2hhciopcykpKTsKK3ByaW50ZigiI2RlZmluZSBkc01hdGNoTGVuICAgICAgKCUzdSkoJSVyZGkpXG4iLChpbnQpKCgoY2hhciopJihzLT5tYXRjaF9sZW5ndGgpKS0oKGNoYXIqKXMpKSk7CitwcmludGYoIiNkZWZpbmUgZHNQcmV2TWF0Y2ggICAgICglM3UpKCUlcmRpKVxuIiwoaW50KSgoKGNoYXIqKSYocy0+cHJldl9tYXRjaCkpLSgoY2hhciopcykpKTsKK3ByaW50ZigiI2RlZmluZSBkc1N0clN0YXJ0ICAgICAgKCUzdSkoJSVyZGkpXG4iLChpbnQpKCgoY2hhciopJihzLT5zdHJzdGFydCkpLSgoY2hhciopcykpKTsKK3ByaW50ZigiI2RlZmluZSBkc01hdGNoU3RhcnQgICAgKCUzdSkoJSVyZGkpXG4iLChpbnQpKCgoY2hhciopJihzLT5tYXRjaF9zdGFydCkpLSgoY2hhciopcykpKTsKK3ByaW50ZigiI2RlZmluZSBkc0xvb2thaGVhZCAgICAgKCUzdSkoJSVyZGkpXG4iLChpbnQpKCgoY2hhciopJihzLT5sb29rYWhlYWQpKS0oKGNoYXIqKXMpKSk7CitwcmludGYoIiNkZWZpbmUgZHNQcmV2TGVuICAgICAgICglM3UpKCUlcmRpKVxuIiwoaW50KSgoKGNoYXIqKSYocy0+cHJldl9sZW5ndGgpKS0oKGNoYXIqKXMpKSk7CitwcmludGYoIiNkZWZpbmUgZHNNYXhDaGFpbkxlbiAgICglM3UpKCUlcmRpKVxuIiwoaW50KSgoKGNoYXIqKSYocy0+bWF4X2NoYWluX2xlbmd0aCkpLSgoY2hhciopcykpKTsKK3ByaW50ZigiI2RlZmluZSBkc0dvb2RNYXRjaCAgICAgKCUzdSkoJSVyZGkpXG4iLChpbnQpKCgoY2hhciopJihzLT5nb29kX21hdGNoKSktKChjaGFyKilzKSkpOworcHJpbnRmKCIjZGVmaW5lIGRzTmljZU1hdGNoICAgICAoJTN1KSglJXJkaSlcbiIsKGludCkoKChjaGFyKikmKHMtPm5pY2VfbWF0Y2gpKS0oKGNoYXIqKXMpKSk7Cit9CisKKyovCisKKworLyoKKyAgdG8gY29tcGlsZSBmb3IgWENvZGUgMy4yIG9uIE1hY09TWCB4ODZfNjQKKyAgLSBydW4gImdjYyAtZyAtYyAtRFhDT0RFX01BQ19YNjRfU1RSVUNUVVJFIGFtZDY0LW1hdGNoLlMiCisgKi8KKworCisjaWZuZGVmIENVUlJFTlRfTElOWF9YQ09ERV9NQUNfWDY0X1NUUlVDVFVSRQorI2RlZmluZSBkc1dTaXplCQkoIDY4KSglcmRpKQorI2RlZmluZSBkc1dNYXNrCQkoIDc2KSglcmRpKQorI2RlZmluZSBkc1dpbmRvdwkoIDgwKSglcmRpKQorI2RlZmluZSBkc1ByZXYJCSggOTYpKCVyZGkpCisjZGVmaW5lIGRzTWF0Y2hMZW4JKDE0NCkoJXJkaSkKKyNkZWZpbmUgZHNQcmV2TWF0Y2gJKDE0OCkoJXJkaSkKKyNkZWZpbmUgZHNTdHJTdGFydAkoMTU2KSglcmRpKQorI2RlZmluZSBkc01hdGNoU3RhcnQJKDE2MCkoJXJkaSkKKyNkZWZpbmUgZHNMb29rYWhlYWQJKDE2NCkoJXJkaSkKKyNkZWZpbmUgZHNQcmV2TGVuCSgxNjgpKCVyZGkpCisjZGVmaW5lIGRzTWF4Q2hhaW5MZW4JKDE3MikoJXJkaSkKKyNkZWZpbmUgZHNHb29kTWF0Y2gJKDE4OCkoJXJkaSkKKyNkZWZpbmUgZHNOaWNlTWF0Y2gJKDE5MikoJXJkaSkKKworI2Vsc2UgCisKKyNpZm5kZWYgU1RSVUNUX09GRlNFVAorIwlkZWZpbmUgU1RSVUNUX09GRlNFVAkoMCkKKyNlbmRpZgorCisKKyNkZWZpbmUgZHNXU2l6ZQkJKCA1NiArIFNUUlVDVF9PRkZTRVQpKCVyZGkpCisjZGVmaW5lIGRzV01hc2sJCSggNjQgKyBTVFJVQ1RfT0ZGU0VUKSglcmRpKQorI2RlZmluZSBkc1dpbmRvdwkoIDcyICsgU1RSVUNUX09GRlNFVCkoJXJkaSkKKyNkZWZpbmUgZHNQcmV2CQkoIDg4ICsgU1RSVUNUX09GRlNFVCkoJXJkaSkKKyNkZWZpbmUgZHNNYXRjaExlbgkoMTM2ICsgU1RSVUNUX09GRlNFVCkoJXJkaSkKKyNkZWZpbmUgZHNQcmV2TWF0Y2gJKDE0MCArIFNUUlVDVF9PRkZTRVQpKCVyZGkpCisjZGVmaW5lIGRzU3RyU3RhcnQJKDE0OCArIFNUUlVDVF9PRkZTRVQpKCVyZGkpCisjZGVmaW5lIGRzTWF0Y2hTdGFydAkoMTUyICsgU1RSVUNUX09GRlNFVCkoJXJkaSkKKyNkZWZpbmUgZHNMb29rYWhlYWQJKDE1NiArIFNUUlVDVF9PRkZTRVQpKCVyZGkpCisjZGVmaW5lIGRzUHJldkxlbgkoMTYwICsgU1RSVUNUX09GRlNFVCkoJXJkaSkKKyNkZWZpbmUgZHNNYXhDaGFpbkxlbgkoMTY0ICsgU1RSVUNUX09GRlNFVCkoJXJkaSkKKyNkZWZpbmUgZHNHb29kTWF0Y2gJKDE4MCArIFNUUlVDVF9PRkZTRVQpKCVyZGkpCisjZGVmaW5lIGRzTmljZU1hdGNoCSgxODQgKyBTVFJVQ1RfT0ZGU0VUKSglcmRpKQorCisjZW5kaWYKKworCisKKworLnRleHQKKworLyogdUludCBsb25nZXN0X21hdGNoKGRlZmxhdGVfc3RhdGUgKmRlZmxhdGVzdGF0ZSwgSVBvcyBjdXJtYXRjaCkgKi8KKworbG9uZ2VzdF9tYXRjaDoKKy8qCisgKiBSZXRyaWV2ZSB0aGUgZnVuY3Rpb24gYXJndW1lbnRzLiAlY3VybWF0Y2ggd2lsbCBob2xkIGN1cl9tYXRjaAorICogdGhyb3VnaG91dCB0aGUgZW50aXJlIGZ1bmN0aW9uIChwYXNzZWQgdmlhIHJzaSBvbiBhbWQ2NCkuCisgKiByZGkgd2lsbCBob2xkIHRoZSBwb2ludGVyIHRvIHRoZSBkZWZsYXRlX3N0YXRlIChmaXJzdCBhcmcgb24gYW1kNjQpCisgKi8KKwkJbW92ICAgICAlcnNpLCBzYXZlX3JzaQorCQltb3YgICAgICVyYngsIHNhdmVfcmJ4CisJCW1vdgklcjEyLCBzYXZlX3IxMgorCQltb3YgICAgICVyMTMsIHNhdmVfcjEzCisJCW1vdiAgICAgJXIxNCwgc2F2ZV9yMTQKKwkJbW92ICAgICAlcjE1LCBzYXZlX3IxNQorCisvKiB1SW50IHdtYXNrID0gcy0+d19tYXNrOwkJCQkJCSovCisvKiB1bnNpZ25lZCBjaGFpbl9sZW5ndGggPSBzLT5tYXhfY2hhaW5fbGVuZ3RoOwkJCQkqLworLyogaWYgKHMtPnByZXZfbGVuZ3RoID49IHMtPmdvb2RfbWF0Y2gpIHsJCQkJKi8KKy8qICAgICBjaGFpbl9sZW5ndGggPj49IDI7CQkJCQkJKi8KKy8qIH0JCQkJCQkJCQkqLworCisJCW1vdmwJZHNQcmV2TGVuLCAlZWF4CisJCW1vdmwJZHNHb29kTWF0Y2gsICVlYngKKwkJY21wbAklZWJ4LCAlZWF4CisJCW1vdmwJZHNXTWFzaywgJWVheAorCQltb3ZsCWRzTWF4Q2hhaW5MZW4sICVjaGFpbmxlbndtYXNrCisJCWpsCUxhc3RNYXRjaEdvb2QKKwkJc2hybAkkMiwgJWNoYWlubGVud21hc2sKK0xhc3RNYXRjaEdvb2Q6CisKKy8qIGNoYWlubGVuIGlzIGRlY3JlbWVudGVkIG9uY2UgYmVmb3JlaGFuZCBzbyB0aGF0IHRoZSBmdW5jdGlvbiBjYW4JKi8KKy8qIHVzZSB0aGUgc2lnbiBmbGFnIGluc3RlYWQgb2YgdGhlIHplcm8gZmxhZyBmb3IgdGhlIGV4aXQgdGVzdC4JKi8KKy8qIEl0IGlzIHRoZW4gc2hpZnRlZCBpbnRvIHRoZSBoaWdoIHdvcmQsIHRvIG1ha2Ugcm9vbSBmb3IgdGhlIHdtYXNrCSovCisvKiB2YWx1ZSwgd2hpY2ggaXQgd2lsbCBhbHdheXMgYWNjb21wYW55LgkJCQkqLworCisJCWRlY2wJJWNoYWlubGVud21hc2sKKwkJc2hsbAkkMTYsICVjaGFpbmxlbndtYXNrCisJCW9ybAklZWF4LCAlY2hhaW5sZW53bWFzaworCisvKiBpZiAoKHVJbnQpbmljZV9tYXRjaCA+IHMtPmxvb2thaGVhZCkgbmljZV9tYXRjaCA9IHMtPmxvb2thaGVhZDsJKi8KKworCQltb3ZsCWRzTmljZU1hdGNoLCAlZWF4CisJCW1vdmwJZHNMb29rYWhlYWQsICVlYngKKwkJY21wbAklZWF4LCAlZWJ4CisJCWpsCUxvb2thaGVhZExlc3MKKwkJbW92bAklZWF4LCAlZWJ4CitMb29rYWhlYWRMZXNzOgltb3ZsCSVlYngsICVuaWNlbWF0Y2gKKworLyogcmVnaXN0ZXIgQnl0ZWYgKnNjYW4gPSBzLT53aW5kb3cgKyBzLT5zdHJzdGFydDsJCQkqLworCisJCW1vdglkc1dpbmRvdywgJXdpbmRvdworCQltb3ZsCWRzU3RyU3RhcnQsICVsaW1pdGQKKwkJbGVhCSglbGltaXQsICV3aW5kb3cpLCAlc2NhbgorCisvKiBEZXRlcm1pbmUgaG93IG1hbnkgYnl0ZXMgdGhlIHNjYW4gcHRyIGlzIG9mZiBmcm9tIGJlaW5nCQkqLworLyogZHdvcmQtYWxpZ25lZC4JCQkJCQkJKi8KKworCQltb3YJJXNjYW4sICVzY2FuYWxpZ24KKwkJbmVnbAklc2NhbmFsaWduZAorCQlhbmRsCSQzLCAlc2NhbmFsaWduZAorCisvKiBJUG9zIGxpbWl0ID0gcy0+c3Ryc3RhcnQgPiAoSVBvcylNQVhfRElTVChzKSA/CQkJKi8KKy8qICAgICBzLT5zdHJzdGFydCAtIChJUG9zKU1BWF9ESVNUKHMpIDogTklMOwkJCQkqLworCisJCW1vdmwJZHNXU2l6ZSwgJWVheAorCQlzdWJsCSRNSU5fTE9PS0FIRUFELCAlZWF4CisJCXhvcmwJJWVjeCwgJWVjeAorCQlzdWJsCSVlYXgsICVsaW1pdGQKKwkJY21vdm5nCSVlY3gsICVsaW1pdGQKKworLyogaW50IGJlc3RfbGVuID0gcy0+cHJldl9sZW5ndGg7CQkJCQkqLworCisJCW1vdmwJZHNQcmV2TGVuLCAlYmVzdGxlbmQKKworLyogU3RvcmUgdGhlIHN1bSBvZiBzLT53aW5kb3cgKyBiZXN0X2xlbiBpbiAld2luZG93YmVzdGxlbiBsb2NhbGx5LCBhbmQgaW4gbWVtb3J5LgkqLworCisJCWxlYQkoJXdpbmRvdywgJWJlc3RsZW4pLCAld2luZG93YmVzdGxlbgorCQltb3YJJXdpbmRvd2Jlc3RsZW4sIF93aW5kb3diZXN0bGVuCisKKy8qIHJlZ2lzdGVyIHVzaCBzY2FuX3N0YXJ0ID0gKih1c2hmKilzY2FuOwkJCQkqLworLyogcmVnaXN0ZXIgdXNoIHNjYW5fZW5kICAgPSAqKHVzaGYqKShzY2FuK2Jlc3RfbGVuLTEpOwkJCSovCisvKiBQb3NmICpwcmV2ID0gcy0+cHJldjsJCQkJCQkqLworCisJCW1vdnp3bAkoJXNjYW4pLCAlc2NhbnN0YXJ0CisJCW1vdnp3bAktMSglc2NhbiwgJWJlc3RsZW4pLCAlc2NhbmVuZAorCQltb3YJZHNQcmV2LCAlcHJldgorCisvKiBKdW1wIGludG8gdGhlIG1haW4gbG9vcC4JCQkJCQkqLworCisJCW1vdmwJJWNoYWlubGVud21hc2ssIF9jaGFpbmxlbndtYXNrCisJCWptcAlMb29wRW50cnkKKworLmJhbGlnbiAxNgorCisvKiBkbyB7CisgKiAgICAgbWF0Y2ggPSBzLT53aW5kb3cgKyBjdXJfbWF0Y2g7CisgKiAgICAgaWYgKCoodXNoZiopKG1hdGNoK2Jlc3RfbGVuLTEpICE9IHNjYW5fZW5kIHx8CisgKiAgICAgICAgICoodXNoZiopbWF0Y2ggIT0gc2Nhbl9zdGFydCkgY29udGludWU7CisgKiAgICAgWy4uLl0KKyAqIH0gd2hpbGUgKChjdXJfbWF0Y2ggPSBwcmV2W2N1cl9tYXRjaCAmIHdtYXNrXSkgPiBsaW1pdAorICogICAgICAgICAgJiYgLS1jaGFpbl9sZW5ndGggIT0gMCk7CisgKgorICogSGVyZSBpcyB0aGUgaW5uZXIgbG9vcCBvZiB0aGUgZnVuY3Rpb24uIFRoZSBmdW5jdGlvbiB3aWxsIHNwZW5kIHRoZQorICogbWFqb3JpdHkgb2YgaXRzIHRpbWUgaW4gdGhpcyBsb29wLCBhbmQgbWFqb3JpdHkgb2YgdGhhdCB0aW1lIHdpbGwKKyAqIGJlIHNwZW50IGluIHRoZSBmaXJzdCB0ZW4gaW5zdHJ1Y3Rpb25zLgorICovCitMb29rdXBMb29wOgorCQlhbmRsCSVjaGFpbmxlbndtYXNrLCAlY3VybWF0Y2hkCisJCW1vdnp3bAkoJXByZXYsICVjdXJtYXRjaCwgMiksICVjdXJtYXRjaGQKKwkJY21wbAklbGltaXRkLCAlY3VybWF0Y2hkCisJCWpiZQlMZWF2ZU5vdworCQlzdWJsCSQweDAwMDEwMDAwLCAlY2hhaW5sZW53bWFzaworCQlqcwlMZWF2ZU5vdworTG9vcEVudHJ5OgljbXB3CS0xKCV3aW5kb3diZXN0bGVuLCAlY3VybWF0Y2gpLCAlc2NhbmVuZHcKKwkJam5lCUxvb2t1cExvb3AKKwkJY21wdwklc2NhbnN0YXJ0dywgKCV3aW5kb3csICVjdXJtYXRjaCkKKwkJam5lCUxvb2t1cExvb3AKKworLyogU3RvcmUgdGhlIGN1cnJlbnQgdmFsdWUgb2YgY2hhaW5sZW4uCQkJCQkqLworCQltb3ZsCSVjaGFpbmxlbndtYXNrLCBfY2hhaW5sZW53bWFzaworCisvKiAlc2NhbiBpcyB0aGUgc3RyaW5nIHVuZGVyIHNjcnV0aW55LCBhbmQgJXByZXYgdG8gdGhlIHN0cmluZyB3ZQkqLworLyogYXJlIGhvcGluZyB0byBtYXRjaCBpdCB1cCB3aXRoLiBJbiBhY3R1YWxpdHksICVlc2kgYW5kICVlZGkgYXJlCSovCisvKiBib3RoIHBvaW50ZWQgKE1BWF9NQVRDSF84IC0gc2NhbmFsaWduKSBieXRlcyBhaGVhZCwgYW5kICVlZHggaXMJKi8KKy8qIGluaXRpYWxpemVkIHRvIC0oTUFYX01BVENIXzggLSBzY2FuYWxpZ24pLgkJCQkqLworCisJCW1vdgkkKC1NQVhfTUFUQ0hfOCksICVyZHgKKwkJbGVhCSglY3VybWF0Y2gsICV3aW5kb3cpLCAld2luZG93YmVzdGxlbgorCQlsZWEJTUFYX01BVENIXzgoJXdpbmRvd2Jlc3RsZW4sICVzY2FuYWxpZ24pLCAld2luZG93YmVzdGxlbgorCQlsZWEJTUFYX01BVENIXzgoJXNjYW4sICVzY2FuYWxpZ24pLCAlcHJldgorCisvKiB0aGUgcHJlZmV0Y2hpbmcgYmVsb3cgbWFrZXMgdmVyeSBsaXR0bGUgZGlmZmVyZW5jZS4uLiAqLworCQlwcmVmZXRjaHQxCSgld2luZG93YmVzdGxlbiwgJXJkeCkKKwkJcHJlZmV0Y2h0MQkoJXByZXYsICVyZHgpCisKKy8qCisgKiBUZXN0IHRoZSBzdHJpbmdzIGZvciBlcXVhbGl0eSwgOCBieXRlcyBhdCBhIHRpbWUuIEF0IHRoZSBlbmQsCisgKiBhZGp1c3QgJXJkeCBzbyB0aGF0IGl0IGlzIG9mZnNldCB0byB0aGUgZXhhY3QgYnl0ZSB0aGF0IG1pc21hdGNoZWQuCisgKgorICogSXQgc2hvdWxkIGJlIGNvbmZlc3NlZCB0aGF0IHRoaXMgbG9vcCB1c3VhbGx5IGRvZXMgbm90IHJlcHJlc2VudAorICogbXVjaCBvZiB0aGUgdG90YWwgcnVubmluZyB0aW1lLiBSZXBsYWNpbmcgaXQgd2l0aCBhIG1vcmUKKyAqIHN0cmFpZ2h0Zm9yd2FyZCAicmVwIGNtcHNiIiB3b3VsZCBub3QgZHJhc3RpY2FsbHkgZGVncmFkZQorICogcGVyZm9ybWFuY2UgLS0gdW5yb2xsaW5nIGl0LCBmb3IgZXhhbXBsZSwgbWFrZXMgbm8gZGlmZmVyZW5jZS4KKyAqLworCisjdW5kZWYgVVNFX1NTRQkvKiB3b3JrcywgYnV0IGlzIDYtNyUgc2xvd2VyLCB0aGFuIG5vbi1TU0UuLi4gKi8KKworTG9vcENtcHM6CisjaWZkZWYgVVNFX1NTRQorCQkvKiBQcmVsb2FkIHRoZSBTU0UgcmVnaXN0ZXJzICovCisJCW1vdmRxdQkgICgld2luZG93YmVzdGxlbiwgJXJkeCksICV4bW0xCisJCW1vdmRxdQkgICglcHJldiwgJXJkeCksICV4bW0yCisJCXBjbXBlcWIJJXhtbTIsICV4bW0xCisJCW1vdmRxdQkxNigld2luZG93YmVzdGxlbiwgJXJkeCksICV4bW0zCisJCW1vdmRxdQkxNiglcHJldiwgJXJkeCksICV4bW00CisJCXBjbXBlcWIJJXhtbTQsICV4bW0zCisJCW1vdmRxdQkzMigld2luZG93YmVzdGxlbiwgJXJkeCksICV4bW01CisJCW1vdmRxdQkzMiglcHJldiwgJXJkeCksICV4bW02CisJCXBjbXBlcWIJJXhtbTYsICV4bW01CisJCW1vdmRxdQk0OCgld2luZG93YmVzdGxlbiwgJXJkeCksICV4bW03CisJCW1vdmRxdQk0OCglcHJldiwgJXJkeCksICV4bW04CisJCXBjbXBlcWIJJXhtbTgsICV4bW03CisKKwkJLyogQ2hlY2sgdGhlIGNvbXBhcmlzaW9ucycgcmVzdWx0cyAqLworCQlwbW92bXNrYiAleG1tMSwgJXJheAorCQlub3R3CSVheAorCQlic2Z3CSVheCwgJWF4CisJCWpueglMZWF2ZUxvb3BDbXBzCisJCQorCQkvKiB0aGlzIGlzIHRoZSBvbmx5IGl0ZXJhdGlvbiBvZiB0aGUgbG9vcCB3aXRoIGEgcG9zc2liaWxpdHkgb2YgaGF2aW5nCisJCSAgIGluY3JlbWVudGVkIHJkeCBieSAweDEwOCAoZWFjaCBsb29wIGl0ZXJhdGlvbiBhZGQgMTYqNCA9IDB4NDAgCisJCSAgIGFuZCAoMHg0MCo0KSs4PTB4MTA4ICovCisJCWFkZAkkOCwgJXJkeAorCQlqeiBMZW5NYXhpbXVtCisJCWFkZAkkOCwgJXJkeAorCisJCQorCQlwbW92bXNrYiAleG1tMywgJXJheAorCQlub3R3CSVheAorCQlic2Z3CSVheCwgJWF4CisJCWpueglMZWF2ZUxvb3BDbXBzCisJCQorCQkKKwkJYWRkCSQxNiwgJXJkeAorCisKKwkJcG1vdm1za2IgJXhtbTUsICVyYXgKKwkJbm90dwklYXgKKwkJYnNmdwklYXgsICVheAorCQlqbnoJTGVhdmVMb29wQ21wcworCQkKKwkJYWRkCSQxNiwgJXJkeAorCisKKwkJcG1vdm1za2IgJXhtbTcsICVyYXgKKwkJbm90dwklYXgKKwkJYnNmdwklYXgsICVheAorCQlqbnoJTGVhdmVMb29wQ21wcworCQkKKwkJYWRkCSQxNiwgJXJkeAorCQkKKwkJam1wCUxvb3BDbXBzCitMZWF2ZUxvb3BDbXBzOglhZGQJJXJheCwgJXJkeAorI2Vsc2UKKwkJbW92CSgld2luZG93YmVzdGxlbiwgJXJkeCksICVyYXgKKwkJeG9yCSglcHJldiwgJXJkeCksICVyYXgKKwkJam56CUxlYXZlTG9vcENtcHMKKwkJCisJCW1vdgk4KCV3aW5kb3diZXN0bGVuLCAlcmR4KSwgJXJheAorCQl4b3IJOCglcHJldiwgJXJkeCksICVyYXgKKwkJam56CUxlYXZlTG9vcENtcHM4CisKKwkJbW92CTE2KCV3aW5kb3diZXN0bGVuLCAlcmR4KSwgJXJheAorCQl4b3IJMTYoJXByZXYsICVyZHgpLCAlcmF4CisJCWpueglMZWF2ZUxvb3BDbXBzMTYKKwkJCQkKKwkJYWRkCSQyNCwgJXJkeAorCQlqbnoJTG9vcENtcHMKKwkJam1wCUxlbk1heGltdW0KKyMJaWYgMAorLyoKKyAqIFRoaXMgdGhyZWUtbGluZXIgaXMgdGFudGFsaXppbmdseSBzaW1wbGUsIGJ1dCBic2YgaXMgYSBzbG93IGluc3RydWN0aW9uLAorICogYW5kIHRoZSBjb21wbGljYXRlZCBhbHRlcm5hdGl2ZSBkb3duIGJlbG93IGlzIHF1aXRlIGEgYml0IGZhc3Rlci4gU2FkLi4uCisgKi8KKworTGVhdmVMb29wQ21wczoJYnNmCSVyYXgsICVyYXggLyogZmluZCB0aGUgZmlyc3Qgbm9uLXplcm8gYml0ICovCisJCXNocmwJJDMsICVlYXggLyogZGl2aWRlIGJ5IDggdG8gZ2V0IHRoZSBieXRlICovCisJCWFkZAklcmF4LCAlcmR4CisjCWVsc2UKK0xlYXZlTG9vcENtcHMxNjoKKwkJYWRkCSQ4LCAlcmR4CitMZWF2ZUxvb3BDbXBzODoKKwkJYWRkCSQ4LCAlcmR4CitMZWF2ZUxvb3BDbXBzOgl0ZXN0bCAgICQweEZGRkZGRkZGLCAlZWF4IC8qIENoZWNrIHRoZSBmaXJzdCA0IGJ5dGVzICovCisJCWpueiAgICAgQ2hlY2sxNgorCQlhZGQgICAgICQ0LCAlcmR4CisJCXNociAgICAgJDMyLCAlcmF4CitDaGVjazE2OiAgICAgICAgdGVzdHcgICAkMHhGRkZGLCAlYXgKKwkJam56ICAgICBMZW5Mb3dlcgorCQlhZGQJJDIsICVyZHgKKwkJc2hybAkkMTYsICVlYXgKK0xlbkxvd2VyOglzdWJiCSQxLCAlYWwKKwkJYWRjCSQwLCAlcmR4CisjCWVuZGlmCisjZW5kaWYKKworLyogQ2FsY3VsYXRlIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoLiBJZiBpdCBpcyBsb25nZXIgdGhhbiBNQVhfTUFUQ0gsCSovCisvKiB0aGVuIGF1dG9tYXRpY2FsbHkgYWNjZXB0IGl0IGFzIHRoZSBiZXN0IHBvc3NpYmxlIG1hdGNoIGFuZCBsZWF2ZS4JKi8KKworCQlsZWEJKCVwcmV2LCAlcmR4KSwgJXJheAorCQlzdWIJJXNjYW4sICVyYXgKKwkJY21wbAkkTUFYX01BVENILCAlZWF4CisJCWpnZQlMZW5NYXhpbXVtCisKKy8qIElmIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoIGlzIG5vdCBsb25nZXIgdGhhbiB0aGUgYmVzdCBtYXRjaCB3ZQkqLworLyogaGF2ZSBzbyBmYXIsIHRoZW4gZm9yZ2V0IGl0IGFuZCByZXR1cm4gdG8gdGhlIGxvb2t1cCBsb29wLgkJKi8KKworCQljbXBsCSViZXN0bGVuZCwgJWVheAorCQlqZwlMb25nZXJNYXRjaAorCQltb3YJX3dpbmRvd2Jlc3RsZW4sICV3aW5kb3diZXN0bGVuCisJCW1vdglkc1ByZXYsICVwcmV2CisJCW1vdmwJX2NoYWlubGVud21hc2ssICVlZHgKKwkJam1wCUxvb2t1cExvb3AKKworLyogICAgICAgICBzLT5tYXRjaF9zdGFydCA9IGN1cl9tYXRjaDsJCQkJCSovCisvKiAgICAgICAgIGJlc3RfbGVuID0gbGVuOwkJCQkJCSovCisvKiAgICAgICAgIGlmIChsZW4gPj0gbmljZV9tYXRjaCkgYnJlYWs7CQkJCSovCisvKiAgICAgICAgIHNjYW5fZW5kID0gKih1c2hmKikoc2NhbitiZXN0X2xlbi0xKTsJCQkqLworCitMb25nZXJNYXRjaDoKKwkJbW92bAklZWF4LCAlYmVzdGxlbmQKKwkJbW92bAklY3VybWF0Y2hkLCBkc01hdGNoU3RhcnQKKwkJY21wbAklbmljZW1hdGNoLCAlZWF4CisJCWpnZQlMZWF2ZU5vdworCisJCWxlYQkoJXdpbmRvdywgJWJlc3RsZW4pLCAld2luZG93YmVzdGxlbgorCQltb3YJJXdpbmRvd2Jlc3RsZW4sIF93aW5kb3diZXN0bGVuCisKKwkJbW92endsCS0xKCVzY2FuLCAlcmF4KSwgJXNjYW5lbmQKKwkJbW92CWRzUHJldiwgJXByZXYKKwkJbW92bAlfY2hhaW5sZW53bWFzaywgJWNoYWlubGVud21hc2sKKwkJam1wCUxvb2t1cExvb3AKKworLyogQWNjZXB0IHRoZSBjdXJyZW50IHN0cmluZywgd2l0aCB0aGUgbWF4aW11bSBwb3NzaWJsZSBsZW5ndGguCQkqLworCitMZW5NYXhpbXVtOgorCQltb3ZsCSRNQVhfTUFUQ0gsICViZXN0bGVuZAorCQltb3ZsCSVjdXJtYXRjaGQsIGRzTWF0Y2hTdGFydAorCisvKiBpZiAoKHVJbnQpYmVzdF9sZW4gPD0gcy0+bG9va2FoZWFkKSByZXR1cm4gKHVJbnQpYmVzdF9sZW47CQkqLworLyogcmV0dXJuIHMtPmxvb2thaGVhZDsJCQkJCQkJKi8KKworTGVhdmVOb3c6CisJCW1vdmwJZHNMb29rYWhlYWQsICVlYXgKKwkJY21wbAklZWF4LCAlYmVzdGxlbmQKKwkJY21vdm5nbAklYmVzdGxlbmQsICVlYXgKK0xvb2thaGVhZFJldDoKKworLyogUmVzdG9yZSB0aGUgcmVnaXN0ZXJzIGFuZCByZXR1cm4gZnJvbSB3aGVuY2Ugd2UgY2FtZS4JCQkqLworCisJbW92CXNhdmVfcnNpLCAlcnNpCisJbW92CXNhdmVfcmJ4LCAlcmJ4CisJbW92CXNhdmVfcjEyLCAlcjEyCisJbW92CXNhdmVfcjEzLCAlcjEzCisJbW92CXNhdmVfcjE0LCAlcjE0CisJbW92CXNhdmVfcjE1LCAlcjE1CisKKwlyZXQKKworbWF0Y2hfaW5pdDoJcmV0CmRpZmYgLS1naXQgYS96bGliLTEuMi42L2NvbnRyaWIvYXNtNjg2L1JFQURNRS42ODYgYi96bGliLTEuMi42L2NvbnRyaWIvYXNtNjg2L1JFQURNRS42ODYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBiZjNiZQotLS0gL2Rldi9udWxsCisrKyBiL3psaWItMS4yLjYvY29udHJpYi9hc202ODYvUkVBRE1FLjY4NgpAQCAtMCwwICsxLDUxIEBACitUaGlzIGlzIGEgcGF0Y2hlZCB2ZXJzaW9uIG9mIHpsaWIsIG1vZGlmaWVkIHRvIHVzZQorUGVudGl1bS1Qcm8tb3B0aW1pemVkIGFzc2VtYmx5IGNvZGUgaW4gdGhlIGRlZmxhdGlvbiBhbGdvcml0aG0uIFRoZQorZmlsZXMgY2hhbmdlZC9hZGRlZCBieSB0aGlzIHBhdGNoIGFyZToKKworUkVBRE1FLjY4NgorbWF0Y2guUworCitUaGUgc3BlZWR1cCB0aGF0IHRoaXMgcGF0Y2ggcHJvdmlkZXMgdmFyaWVzLCBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUKK2NvbXBpbGVyIHVzZWQgdG8gYnVpbGQgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgemxpYiBmYWxscyBhZm91bCBvZiB0aGUKK1BQcm8ncyBzcGVlZCB0cmFwcy4gTXkgb3duIHRlc3RzIHNob3cgYSBzcGVlZHVwIG9mIGFyb3VuZCAxMC0yMCUgYXQKK3RoZSBkZWZhdWx0IGNvbXByZXNzaW9uIGxldmVsLCBhbmQgMjAtMzAlIHVzaW5nIC05LCBhZ2FpbnN0IGEgdmVyc2lvbgorY29tcGlsZWQgdXNpbmcgZ2NjIDIuNy4yLjMuIFlvdXIgbWlsZWFnZSBtYXkgdmFyeS4KKworTm90ZSB0aGF0IHRoaXMgY29kZSBoYXMgYmVlbiB0YWlsb3JlZCBmb3IgdGhlIFBQcm8vUElJIGluIHBhcnRpY3VsYXIsCithbmQgd2lsbCBub3QgcGVyZm9ybSBwYXJ0aWN1YXJseSB3ZWxsIG9uIGEgUGVudGl1bS4KKworSWYgeW91IGFyZSB1c2luZyBhbiBhc3NlbWJsZXIgb3RoZXIgdGhhbiBHTlUgYXMsIHlvdSB3aWxsIGhhdmUgdG8KK3RyYW5zbGF0ZSBtYXRjaC5TIHRvIHVzZSB5b3VyIGFzc2VtYmxlcidzIHN5bnRheC4gKEhhdmUgZnVuLikKKworQnJpYW4gUmFpdGVyCiticmVhZGJveEBtdXBwZXRsYWJzLmNvbQorQXByaWwsIDE5OTgKKworCitBZGRlZCBmb3IgemxpYiAxLjEuMzoKKworVGhlIHBhdGNoZXMgY29tZSBmcm9tCitodHRwOi8vd3d3Lm11cHBldGxhYnMuY29tL35icmVhZGJveC9zb2Z0d2FyZS9hc3NlbWJseS5odG1sCisKK1RvIGNvbXBpbGUgemxpYiB3aXRoIHRoaXMgYXNtIGZpbGUsIGNvcHkgbWF0Y2guUyB0byB0aGUgemxpYiBkaXJlY3RvcnkKK3RoZW4gZG86CisKK0NGTEFHUz0iLU8zIC1EQVNNViIgLi9jb25maWd1cmUKK21ha2UgT0JKQT1tYXRjaC5vCisKKworVXBkYXRlOgorCitJJ3ZlIGJlZW4gaWdub3JpbmcgdGhlc2UgYXNzZW1ibHkgcm91dGluZXMgZm9yIHllYXJzLCBiZWxpZXZpbmcgdGhhdAorZ2NjJ3MgZ2VuZXJhdGVkIGNvZGUgaGFkIGNhdWdodCB1cCB3aXRoIGl0IHNvbWV0aW1lIGFyb3VuZCBnY2MgMi45NQorYW5kIHRoZSBtYWpvciByZWFyY2hpdGVjdGluZyBvZiB0aGUgUGVudGl1bSA0LiBIb3dldmVyLCBJIHJlY2VudGx5CitsZWFybmVkIHRoYXQsIGRlc3BpdGUgd2hhdCBJIGJlbGlldmVkLCB0aGlzIGNvZGUgc3RpbGwgaGFzIHNvbWUgbGlmZQoraW4gaXQuIE9uIHRoZSBQZW50aXVtIDQgYW5kIEFNRDY0IGNoaXBzLCBpdCBjb250aW51ZXMgdG8gcnVuIGFib3V0IDglCitmYXN0ZXIgdGhhbiB0aGUgY29kZSBwcm9kdWNlZCBieSBnY2MgNC4xLgorCitJbiBhY2tub3dsZWRnZW1lbnQgb2YgaXRzIGNvbnRpbnVpbmcgdXNlZnVsbmVzcywgSSd2ZSBhbHRlcmVkIHRoZQorbGljZW5zZSB0byBtYXRjaCB0aGF0IG9mIHRoZSByZXN0IG9mIHpsaWIuIFNoYXJlIGFuZCBFbmpveSEKKworQnJpYW4gUmFpdGVyCiticmVhZGJveEBtdXBwZXRsYWJzLmNvbQorQXByaWwsIDIwMDcKZGlmZiAtLWdpdCBhL3psaWItMS4yLjYvY29udHJpYi9hc202ODYvbWF0Y2guUyBiL3psaWItMS4yLjYvY29udHJpYi9hc202ODYvbWF0Y2guUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTQyMTA5Ci0tLSAvZGV2L251bGwKKysrIGIvemxpYi0xLjIuNi9jb250cmliL2FzbTY4Ni9tYXRjaC5TCkBAIC0wLDAgKzEsMzU3IEBACisvKiBtYXRjaC5TIC0tIHg4NiBhc3NlbWJseSB2ZXJzaW9uIG9mIHRoZSB6bGliIGxvbmdlc3RfbWF0Y2goKSBmdW5jdGlvbi4KKyAqIE9wdGltaXplZCBmb3IgdGhlIEludGVsIDY4NiBjaGlwcyAoUFBybyBhbmQgbGF0ZXIpLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OCwgMjAwNyBCcmlhbiBSYWl0ZXIgPGJyZWFkYm94QG11cHBldGxhYnMuY29tPgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCisgKiB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvciBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKKyAqIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCisgKgorICogUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCisgKiBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0CisgKiBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CisgKgorICogMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKKyAqICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCisgKiAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKKyAqICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCisgKiAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQorICogICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgorICogMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KKyAqLworCisjaWZuZGVmIE5PX1VOREVSTElORQorI2RlZmluZQltYXRjaF9pbml0CV9tYXRjaF9pbml0CisjZGVmaW5lCWxvbmdlc3RfbWF0Y2gJX2xvbmdlc3RfbWF0Y2gKKyNlbmRpZgorCisjZGVmaW5lCU1BWF9NQVRDSAkoMjU4KQorI2RlZmluZQlNSU5fTUFUQ0gJKDMpCisjZGVmaW5lCU1JTl9MT09LQUhFQUQJKE1BWF9NQVRDSCArIE1JTl9NQVRDSCArIDEpCisjZGVmaW5lCU1BWF9NQVRDSF84CSgoTUFYX01BVENIICsgNykgJiB+NykKKworLyogc3RhY2sgZnJhbWUgb2Zmc2V0cyAqLworCisjZGVmaW5lCWNoYWlubGVud21hc2sJCTAJLyogaGlnaCB3b3JkOiBjdXJyZW50IGNoYWluIGxlbgkqLworCQkJCQkvKiBsb3cgd29yZDogcy0+d21hc2sJCSovCisjZGVmaW5lCXdpbmRvdwkJCTQJLyogbG9jYWwgY29weSBvZiBzLT53aW5kb3cJKi8KKyNkZWZpbmUJd2luZG93YmVzdGxlbgkJOAkvKiBzLT53aW5kb3cgKyBiZXN0bGVuCQkqLworI2RlZmluZQlzY2Fuc3RhcnQJCTE2CS8qIGZpcnN0IHR3byBieXRlcyBvZiBzdHJpbmcJKi8KKyNkZWZpbmUJc2NhbmVuZAkJCTEyCS8qIGxhc3QgdHdvIGJ5dGVzIG9mIHN0cmluZwkqLworI2RlZmluZQlzY2FuYWxpZ24JCTIwCS8qIGR3b3JkLW1pc2FsaWdubWVudCBvZiBzdHJpbmcJKi8KKyNkZWZpbmUJbmljZW1hdGNoCQkyNAkvKiBhIGdvb2QgZW5vdWdoIG1hdGNoIHNpemUJKi8KKyNkZWZpbmUJYmVzdGxlbgkJCTI4CS8qIHNpemUgb2YgYmVzdCBtYXRjaCBzbyBmYXIJKi8KKyNkZWZpbmUJc2NhbgkJCTMyCS8qIHB0ciB0byBzdHJpbmcgd2FudGluZyBtYXRjaAkqLworCisjZGVmaW5lCUxvY2FsVmFyc1NpemUJCSgzNikKKy8qCXNhdmVkIGVieAkJMzYgKi8KKy8qCXNhdmVkIGVkaQkJNDAgKi8KKy8qCXNhdmVkIGVzaQkJNDQgKi8KKy8qCXNhdmVkIGVicAkJNDggKi8KKy8qCXJldHVybiBhZGRyZXNzCQk1MiAqLworI2RlZmluZQlkZWZsYXRlc3RhdGUJCTU2CS8qIHRoZSBmdW5jdGlvbiBhcmd1bWVudHMJKi8KKyNkZWZpbmUJY3VybWF0Y2gJCTYwCisKKy8qIEFsbCB0aGUgK3psaWIxMjIyYWRkIG9mZnNldHMgYXJlIGR1ZSB0byB0aGUgYWRkaXRpb24gb2YgZmllbGRzCisgKiAgaW4gemxpYiBpbiB0aGUgZGVmbGF0ZV9zdGF0ZSBzdHJ1Y3R1cmUgc2luY2UgdGhlIGFzbSBjb2RlIHdhcyBmaXJzdCB3cml0dGVuCisgKiAoaWYgeW91IGNvbXBpbGUgd2l0aCB6bGliIDEuMC40IG9yIG9sZGVyLCB1c2UgInpsaWIxMjIyYWRkIGVxdSAoLTQpIikuCisgKiAoaWYgeW91IGNvbXBpbGUgd2l0aCB6bGliIGJldHdlZW4gMS4wLjUgYW5kIDEuMi4yLjEsIHVzZSAiemxpYjEyMjJhZGQgZXF1IDAiKS4KKyAqIGlmIHlvdSBjb21waWxlIHdpdGggemxpYiAxLjIuMi4yIG9yIGxhdGVyICwgdXNlICJ6bGliMTIyMmFkZCBlcXUgOCIpLgorICovCisKKyNkZWZpbmUgemxpYjEyMjJhZGQJCSg4KQorCisjZGVmaW5lCWRzV1NpemUJCQkoMzYremxpYjEyMjJhZGQpCisjZGVmaW5lCWRzV01hc2sJCQkoNDQremxpYjEyMjJhZGQpCisjZGVmaW5lCWRzV2luZG93CQkoNDgremxpYjEyMjJhZGQpCisjZGVmaW5lCWRzUHJldgkJCSg1Nit6bGliMTIyMmFkZCkKKyNkZWZpbmUJZHNNYXRjaExlbgkJKDg4K3psaWIxMjIyYWRkKQorI2RlZmluZQlkc1ByZXZNYXRjaAkJKDkyK3psaWIxMjIyYWRkKQorI2RlZmluZQlkc1N0clN0YXJ0CQkoMTAwK3psaWIxMjIyYWRkKQorI2RlZmluZQlkc01hdGNoU3RhcnQJCSgxMDQremxpYjEyMjJhZGQpCisjZGVmaW5lCWRzTG9va2FoZWFkCQkoMTA4K3psaWIxMjIyYWRkKQorI2RlZmluZQlkc1ByZXZMZW4JCSgxMTIremxpYjEyMjJhZGQpCisjZGVmaW5lCWRzTWF4Q2hhaW5MZW4JCSgxMTYremxpYjEyMjJhZGQpCisjZGVmaW5lCWRzR29vZE1hdGNoCQkoMTMyK3psaWIxMjIyYWRkKQorI2RlZmluZQlkc05pY2VNYXRjaAkJKDEzNit6bGliMTIyMmFkZCkKKworCisuZmlsZSAibWF0Y2guUyIKKworLmdsb2JsCW1hdGNoX2luaXQsIGxvbmdlc3RfbWF0Y2gKKworLnRleHQKKworLyogdUludCBsb25nZXN0X21hdGNoKGRlZmxhdGVfc3RhdGUgKmRlZmxhdGVzdGF0ZSwgSVBvcyBjdXJtYXRjaCkgKi8KKy5jZmlfc2VjdGlvbnMJLmRlYnVnX2ZyYW1lCisKK2xvbmdlc3RfbWF0Y2g6CisKKy5jZmlfc3RhcnRwcm9jCisvKiBTYXZlIHJlZ2lzdGVycyB0aGF0IHRoZSBjb21waWxlciBtYXkgYmUgdXNpbmcsIGFuZCBhZGp1c3QgJWVzcCB0bwkqLworLyogbWFrZSByb29tIGZvciBvdXIgc3RhY2sgZnJhbWUuCQkJCQkqLworCisJCXB1c2hsCSVlYnAKKwkJLmNmaV9kZWZfY2ZhX29mZnNldCA4CisJCS5jZmlfb2Zmc2V0IGVicCwgLTgKKwkJcHVzaGwJJWVkaQorCQkuY2ZpX2RlZl9jZmFfb2Zmc2V0IDEyCisJCXB1c2hsCSVlc2kKKwkJLmNmaV9kZWZfY2ZhX29mZnNldCAxNgorCQlwdXNobAklZWJ4CisJCS5jZmlfZGVmX2NmYV9vZmZzZXQgMjAKKwkJc3VibAkkTG9jYWxWYXJzU2l6ZSwgJWVzcAorCQkuY2ZpX2RlZl9jZmFfb2Zmc2V0IExvY2FsVmFyc1NpemUrMjAKKworLyogUmV0cmlldmUgdGhlIGZ1bmN0aW9uIGFyZ3VtZW50cy4gJWVjeCB3aWxsIGhvbGQgY3VyX21hdGNoCQkqLworLyogdGhyb3VnaG91dCB0aGUgZW50aXJlIGZ1bmN0aW9uLiAlZWR4IHdpbGwgaG9sZCB0aGUgcG9pbnRlciB0byB0aGUJKi8KKy8qIGRlZmxhdGVfc3RhdGUgc3RydWN0dXJlIGR1cmluZyB0aGUgZnVuY3Rpb24ncyBzZXR1cCAoYmVmb3JlCQkqLworLyogZW50ZXJpbmcgdGhlIG1haW4gbG9vcCkuCQkJCQkJKi8KKworCQltb3ZsCWRlZmxhdGVzdGF0ZSglZXNwKSwgJWVkeAorCQltb3ZsCWN1cm1hdGNoKCVlc3ApLCAlZWN4CisKKy8qIHVJbnQgd21hc2sgPSBzLT53X21hc2s7CQkJCQkJKi8KKy8qIHVuc2lnbmVkIGNoYWluX2xlbmd0aCA9IHMtPm1heF9jaGFpbl9sZW5ndGg7CQkJCSovCisvKiBpZiAocy0+cHJldl9sZW5ndGggPj0gcy0+Z29vZF9tYXRjaCkgewkJCQkqLworLyogICAgIGNoYWluX2xlbmd0aCA+Pj0gMjsJCQkJCQkqLworLyogfQkJCQkJCQkJCSovCisgCisJCW1vdmwJZHNQcmV2TGVuKCVlZHgpLCAlZWF4CisJCW1vdmwJZHNHb29kTWF0Y2goJWVkeCksICVlYngKKwkJY21wbAklZWJ4LCAlZWF4CisJCW1vdmwJZHNXTWFzayglZWR4KSwgJWVheAorCQltb3ZsCWRzTWF4Q2hhaW5MZW4oJWVkeCksICVlYngKKwkJamwJTGFzdE1hdGNoR29vZAorCQlzaHJsCSQyLCAlZWJ4CitMYXN0TWF0Y2hHb29kOgorCisvKiBjaGFpbmxlbiBpcyBkZWNyZW1lbnRlZCBvbmNlIGJlZm9yZWhhbmQgc28gdGhhdCB0aGUgZnVuY3Rpb24gY2FuCSovCisvKiB1c2UgdGhlIHNpZ24gZmxhZyBpbnN0ZWFkIG9mIHRoZSB6ZXJvIGZsYWcgZm9yIHRoZSBleGl0IHRlc3QuCSovCisvKiBJdCBpcyB0aGVuIHNoaWZ0ZWQgaW50byB0aGUgaGlnaCB3b3JkLCB0byBtYWtlIHJvb20gZm9yIHRoZSB3bWFzawkqLworLyogdmFsdWUsIHdoaWNoIGl0IHdpbGwgYWx3YXlzIGFjY29tcGFueS4JCQkJKi8KKworCQlkZWNsCSVlYngKKwkJc2hsbAkkMTYsICVlYngKKwkJb3JsCSVlYXgsICVlYngKKwkJbW92bAklZWJ4LCBjaGFpbmxlbndtYXNrKCVlc3ApCisKKy8qIGlmICgodUludCluaWNlX21hdGNoID4gcy0+bG9va2FoZWFkKSBuaWNlX21hdGNoID0gcy0+bG9va2FoZWFkOwkqLworCisJCW1vdmwJZHNOaWNlTWF0Y2goJWVkeCksICVlYXgKKwkJbW92bAlkc0xvb2thaGVhZCglZWR4KSwgJWVieAorCQljbXBsCSVlYXgsICVlYngKKwkJamwJTG9va2FoZWFkTGVzcworCQltb3ZsCSVlYXgsICVlYngKK0xvb2thaGVhZExlc3M6CW1vdmwJJWVieCwgbmljZW1hdGNoKCVlc3ApCisKKy8qIHJlZ2lzdGVyIEJ5dGVmICpzY2FuID0gcy0+d2luZG93ICsgcy0+c3Ryc3RhcnQ7CQkJKi8KKworCQltb3ZsCWRzV2luZG93KCVlZHgpLCAlZXNpCisJCW1vdmwJJWVzaSwgd2luZG93KCVlc3ApCisJCW1vdmwJZHNTdHJTdGFydCglZWR4KSwgJWVicAorCQlsZWEJKCVlc2ksJWVicCksICVlZGkKKwkJbW92bAklZWRpLCBzY2FuKCVlc3ApCisKKy8qIERldGVybWluZSBob3cgbWFueSBieXRlcyB0aGUgc2NhbiBwdHIgaXMgb2ZmIGZyb20gYmVpbmcJCSovCisvKiBkd29yZC1hbGlnbmVkLgkJCQkJCQkqLworCisJCW1vdmwJJWVkaSwgJWVheAorCQluZWdsCSVlYXgKKwkJYW5kbAkkMywgJWVheAorCQltb3ZsCSVlYXgsIHNjYW5hbGlnbiglZXNwKQorCisvKiBJUG9zIGxpbWl0ID0gcy0+c3Ryc3RhcnQgPiAoSVBvcylNQVhfRElTVChzKSA/CQkJKi8KKy8qICAgICBzLT5zdHJzdGFydCAtIChJUG9zKU1BWF9ESVNUKHMpIDogTklMOwkJCQkqLworCisJCW1vdmwJZHNXU2l6ZSglZWR4KSwgJWVheAorCQlzdWJsCSRNSU5fTE9PS0FIRUFELCAlZWF4CisJCXN1YmwJJWVheCwgJWVicAorCQlqZwlMaW1pdFBvc2l0aXZlCisJCXhvcmwJJWVicCwgJWVicAorTGltaXRQb3NpdGl2ZToKKworLyogaW50IGJlc3RfbGVuID0gcy0+cHJldl9sZW5ndGg7CQkJCQkqLworCisJCW1vdmwJZHNQcmV2TGVuKCVlZHgpLCAlZWF4CisJCW1vdmwJJWVheCwgYmVzdGxlbiglZXNwKQorCisvKiBTdG9yZSB0aGUgc3VtIG9mIHMtPndpbmRvdyArIGJlc3RfbGVuIGluICVlc2kgbG9jYWxseSwgYW5kIGluICVlc2kuCSovCisKKwkJYWRkbAklZWF4LCAlZXNpCisJCW1vdmwJJWVzaSwgd2luZG93YmVzdGxlbiglZXNwKQorCisvKiByZWdpc3RlciB1c2ggc2Nhbl9zdGFydCA9ICoodXNoZiopc2NhbjsJCQkJKi8KKy8qIHJlZ2lzdGVyIHVzaCBzY2FuX2VuZCAgID0gKih1c2hmKikoc2NhbitiZXN0X2xlbi0xKTsJCQkqLworLyogUG9zZiAqcHJldiA9IHMtPnByZXY7CQkJCQkJKi8KKworCQltb3Z6d2wJKCVlZGkpLCAlZWJ4CisJCW1vdmwJJWVieCwgc2NhbnN0YXJ0KCVlc3ApCisJCW1vdnp3bAktMSglZWRpLCVlYXgpLCAlZWJ4CisJCW1vdmwJJWVieCwgc2NhbmVuZCglZXNwKQorCQltb3ZsCWRzUHJldiglZWR4KSwgJWVkaQorCisvKiBKdW1wIGludG8gdGhlIG1haW4gbG9vcC4JCQkJCQkqLworCisJCW1vdmwJY2hhaW5sZW53bWFzayglZXNwKSwgJWVkeAorCQlqbXAJTG9vcEVudHJ5CisKKy5iYWxpZ24gMTYKKworLyogZG8geworICogICAgIG1hdGNoID0gcy0+d2luZG93ICsgY3VyX21hdGNoOworICogICAgIGlmICgqKHVzaGYqKShtYXRjaCtiZXN0X2xlbi0xKSAhPSBzY2FuX2VuZCB8fAorICogICAgICAgICAqKHVzaGYqKW1hdGNoICE9IHNjYW5fc3RhcnQpIGNvbnRpbnVlOworICogICAgIFsuLi5dCisgKiB9IHdoaWxlICgoY3VyX21hdGNoID0gcHJldltjdXJfbWF0Y2ggJiB3bWFza10pID4gbGltaXQKKyAqICAgICAgICAgICYmIC0tY2hhaW5fbGVuZ3RoICE9IDApOworICoKKyAqIEhlcmUgaXMgdGhlIGlubmVyIGxvb3Agb2YgdGhlIGZ1bmN0aW9uLiBUaGUgZnVuY3Rpb24gd2lsbCBzcGVuZCB0aGUKKyAqIG1ham9yaXR5IG9mIGl0cyB0aW1lIGluIHRoaXMgbG9vcCwgYW5kIG1ham9yaXR5IG9mIHRoYXQgdGltZSB3aWxsCisgKiBiZSBzcGVudCBpbiB0aGUgZmlyc3QgdGVuIGluc3RydWN0aW9ucy4KKyAqCisgKiBXaXRoaW4gdGhpcyBsb29wOgorICogJWVieCA9IHNjYW5lbmQKKyAqICVlY3ggPSBjdXJtYXRjaAorICogJWVkeCA9IGNoYWlubGVud21hc2sgLSBpLmUuLCAoKGNoYWlubGVuIDw8IDE2KSB8IHdtYXNrKQorICogJWVzaSA9IHdpbmRvd2Jlc3RsZW4gLSBpLmUuLCAod2luZG93ICsgYmVzdGxlbikKKyAqICVlZGkgPSBwcmV2CisgKiAlZWJwID0gbGltaXQKKyAqLworTG9va3VwTG9vcDoKKwkJYW5kbAklZWR4LCAlZWN4CisJCW1vdnp3bAkoJWVkaSwlZWN4LDIpLCAlZWN4CisJCWNtcGwJJWVicCwgJWVjeAorCQlqYmUJTGVhdmVOb3cKKwkJc3VibAkkMHgwMDAxMDAwMCwgJWVkeAorCQlqcwlMZWF2ZU5vdworTG9vcEVudHJ5Ogltb3Z6d2wJLTEoJWVzaSwlZWN4KSwgJWVheAorCQljbXBsCSVlYngsICVlYXgKKwkJam56CUxvb2t1cExvb3AKKwkJbW92bAl3aW5kb3coJWVzcCksICVlYXgKKwkJbW92endsCSglZWF4LCVlY3gpLCAlZWF4CisJCWNtcGwJc2NhbnN0YXJ0KCVlc3ApLCAlZWF4CisJCWpueglMb29rdXBMb29wCisKKy8qIFN0b3JlIHRoZSBjdXJyZW50IHZhbHVlIG9mIGNoYWlubGVuLgkJCQkJKi8KKworCQltb3ZsCSVlZHgsIGNoYWlubGVud21hc2soJWVzcCkKKworLyogUG9pbnQgJWVkaSB0byB0aGUgc3RyaW5nIHVuZGVyIHNjcnV0aW55LCBhbmQgJWVzaSB0byB0aGUgc3RyaW5nIHdlCSovCisvKiBhcmUgaG9waW5nIHRvIG1hdGNoIGl0IHVwIHdpdGguIEluIGFjdHVhbGl0eSwgJWVzaSBhbmQgJWVkaSBhcmUJKi8KKy8qIGJvdGggcG9pbnRlZCAoTUFYX01BVENIXzggLSBzY2FuYWxpZ24pIGJ5dGVzIGFoZWFkLCBhbmQgJWVkeCBpcwkqLworLyogaW5pdGlhbGl6ZWQgdG8gLShNQVhfTUFUQ0hfOCAtIHNjYW5hbGlnbikuCQkJCSovCisKKwkJbW92bAl3aW5kb3coJWVzcCksICVlc2kKKwkJbW92bAlzY2FuKCVlc3ApLCAlZWRpCisJCWFkZGwJJWVjeCwgJWVzaQorCQltb3ZsCXNjYW5hbGlnbiglZXNwKSwgJWVheAorCQltb3ZsCSQoLU1BWF9NQVRDSF84KSwgJWVkeAorCQlsZWEJTUFYX01BVENIXzgoJWVkaSwlZWF4KSwgJWVkaQorCQlsZWEJTUFYX01BVENIXzgoJWVzaSwlZWF4KSwgJWVzaQorCisvKiBUZXN0IHRoZSBzdHJpbmdzIGZvciBlcXVhbGl0eSwgOCBieXRlcyBhdCBhIHRpbWUuIEF0IHRoZSBlbmQsCisgKiBhZGp1c3QgJWVkeCBzbyB0aGF0IGl0IGlzIG9mZnNldCB0byB0aGUgZXhhY3QgYnl0ZSB0aGF0IG1pc21hdGNoZWQuCisgKgorICogV2UgYWxyZWFkeSBrbm93IGF0IHRoaXMgcG9pbnQgdGhhdCB0aGUgZmlyc3QgdGhyZWUgYnl0ZXMgb2YgdGhlCisgKiBzdHJpbmdzIG1hdGNoIGVhY2ggb3RoZXIsIGFuZCB0aGV5IGNhbiBiZSBzYWZlbHkgcGFzc2VkIG92ZXIgYmVmb3JlCisgKiBzdGFydGluZyB0aGUgY29tcGFyZSBsb29wLiBTbyB3aGF0IHRoaXMgY29kZSBkb2VzIGlzIHNraXAgb3ZlciAwLTMKKyAqIGJ5dGVzLCBhcyBtdWNoIGFzIG5lY2Vzc2FyeSBpbiBvcmRlciB0byBkd29yZC1hbGlnbiB0aGUgJWVkaQorICogcG9pbnRlci4gKCVlc2kgd2lsbCBzdGlsbCBiZSBtaXNhbGlnbmVkIHRocmVlIHRpbWVzIG91dCBvZiBmb3VyLikKKyAqCisgKiBJdCBzaG91bGQgYmUgY29uZmVzc2VkIHRoYXQgdGhpcyBsb29wIHVzdWFsbHkgZG9lcyBub3QgcmVwcmVzZW50CisgKiBtdWNoIG9mIHRoZSB0b3RhbCBydW5uaW5nIHRpbWUuIFJlcGxhY2luZyBpdCB3aXRoIGEgbW9yZQorICogc3RyYWlnaHRmb3J3YXJkICJyZXAgY21wc2IiIHdvdWxkIG5vdCBkcmFzdGljYWxseSBkZWdyYWRlCisgKiBwZXJmb3JtYW5jZS4KKyAqLworTG9vcENtcHM6CisJCW1vdmwJKCVlc2ksJWVkeCksICVlYXgKKwkJeG9ybAkoJWVkaSwlZWR4KSwgJWVheAorCQlqbnoJTGVhdmVMb29wQ21wcworCQltb3ZsCTQoJWVzaSwlZWR4KSwgJWVheAorCQl4b3JsCTQoJWVkaSwlZWR4KSwgJWVheAorCQlqbnoJTGVhdmVMb29wQ21wczQKKwkJYWRkbAkkOCwgJWVkeAorCQlqbnoJTG9vcENtcHMKKwkJam1wCUxlbk1heGltdW0KK0xlYXZlTG9vcENtcHM0OglhZGRsCSQ0LCAlZWR4CitMZWF2ZUxvb3BDbXBzOgl0ZXN0bAkkMHgwMDAwRkZGRiwgJWVheAorCQlqbnoJTGVuTG93ZXIKKwkJYWRkbAkkMiwgJWVkeAorCQlzaHJsCSQxNiwgJWVheAorTGVuTG93ZXI6CXN1YmIJJDEsICVhbAorCQlhZGNsCSQwLCAlZWR4CisKKy8qIENhbGN1bGF0ZSB0aGUgbGVuZ3RoIG9mIHRoZSBtYXRjaC4gSWYgaXQgaXMgbG9uZ2VyIHRoYW4gTUFYX01BVENILAkqLworLyogdGhlbiBhdXRvbWF0aWNhbGx5IGFjY2VwdCBpdCBhcyB0aGUgYmVzdCBwb3NzaWJsZSBtYXRjaCBhbmQgbGVhdmUuCSovCisKKwkJbGVhCSglZWRpLCVlZHgpLCAlZWF4CisJCW1vdmwJc2NhbiglZXNwKSwgJWVkaQorCQlzdWJsCSVlZGksICVlYXgKKwkJY21wbAkkTUFYX01BVENILCAlZWF4CisJCWpnZQlMZW5NYXhpbXVtCisKKy8qIElmIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoIGlzIG5vdCBsb25nZXIgdGhhbiB0aGUgYmVzdCBtYXRjaCB3ZQkqLworLyogaGF2ZSBzbyBmYXIsIHRoZW4gZm9yZ2V0IGl0IGFuZCByZXR1cm4gdG8gdGhlIGxvb2t1cCBsb29wLgkJKi8KKworCQltb3ZsCWRlZmxhdGVzdGF0ZSglZXNwKSwgJWVkeAorCQltb3ZsCWJlc3RsZW4oJWVzcCksICVlYngKKwkJY21wbAklZWJ4LCAlZWF4CisJCWpnCUxvbmdlck1hdGNoCisJCW1vdmwJd2luZG93YmVzdGxlbiglZXNwKSwgJWVzaQorCQltb3ZsCWRzUHJldiglZWR4KSwgJWVkaQorCQltb3ZsCXNjYW5lbmQoJWVzcCksICVlYngKKwkJbW92bAljaGFpbmxlbndtYXNrKCVlc3ApLCAlZWR4CisJCWptcAlMb29rdXBMb29wCisKKy8qICAgICAgICAgcy0+bWF0Y2hfc3RhcnQgPSBjdXJfbWF0Y2g7CQkJCQkqLworLyogICAgICAgICBiZXN0X2xlbiA9IGxlbjsJCQkJCQkqLworLyogICAgICAgICBpZiAobGVuID49IG5pY2VfbWF0Y2gpIGJyZWFrOwkJCQkqLworLyogICAgICAgICBzY2FuX2VuZCA9ICoodXNoZiopKHNjYW4rYmVzdF9sZW4tMSk7CQkJKi8KKworTG9uZ2VyTWF0Y2g6CW1vdmwJbmljZW1hdGNoKCVlc3ApLCAlZWJ4CisJCW1vdmwJJWVheCwgYmVzdGxlbiglZXNwKQorCQltb3ZsCSVlY3gsIGRzTWF0Y2hTdGFydCglZWR4KQorCQljbXBsCSVlYngsICVlYXgKKwkJamdlCUxlYXZlTm93CisJCW1vdmwJd2luZG93KCVlc3ApLCAlZXNpCisJCWFkZGwJJWVheCwgJWVzaQorCQltb3ZsCSVlc2ksIHdpbmRvd2Jlc3RsZW4oJWVzcCkKKwkJbW92endsCS0xKCVlZGksJWVheCksICVlYngKKwkJbW92bAlkc1ByZXYoJWVkeCksICVlZGkKKwkJbW92bAklZWJ4LCBzY2FuZW5kKCVlc3ApCisJCW1vdmwJY2hhaW5sZW53bWFzayglZXNwKSwgJWVkeAorCQlqbXAJTG9va3VwTG9vcAorCisvKiBBY2NlcHQgdGhlIGN1cnJlbnQgc3RyaW5nLCB3aXRoIHRoZSBtYXhpbXVtIHBvc3NpYmxlIGxlbmd0aC4JCSovCisKK0xlbk1heGltdW06CW1vdmwJZGVmbGF0ZXN0YXRlKCVlc3ApLCAlZWR4CisJCW1vdmwJJE1BWF9NQVRDSCwgYmVzdGxlbiglZXNwKQorCQltb3ZsCSVlY3gsIGRzTWF0Y2hTdGFydCglZWR4KQorCisvKiBpZiAoKHVJbnQpYmVzdF9sZW4gPD0gcy0+bG9va2FoZWFkKSByZXR1cm4gKHVJbnQpYmVzdF9sZW47CQkqLworLyogcmV0dXJuIHMtPmxvb2thaGVhZDsJCQkJCQkJKi8KKworTGVhdmVOb3c6CisJCW1vdmwJZGVmbGF0ZXN0YXRlKCVlc3ApLCAlZWR4CisJCW1vdmwJYmVzdGxlbiglZXNwKSwgJWVieAorCQltb3ZsCWRzTG9va2FoZWFkKCVlZHgpLCAlZWF4CisJCWNtcGwJJWVheCwgJWVieAorCQlqZwlMb29rYWhlYWRSZXQKKwkJbW92bAklZWJ4LCAlZWF4CitMb29rYWhlYWRSZXQ6CisKKy8qIFJlc3RvcmUgdGhlIHN0YWNrIGFuZCByZXR1cm4gZnJvbSB3aGVuY2Ugd2UgY2FtZS4JCQkqLworCisJCWFkZGwJJExvY2FsVmFyc1NpemUsICVlc3AKKwkJLmNmaV9kZWZfY2ZhX29mZnNldCAyMAorCQlwb3BsCSVlYngKKwkJLmNmaV9kZWZfY2ZhX29mZnNldCAxNgorCQlwb3BsCSVlc2kKKwkJLmNmaV9kZWZfY2ZhX29mZnNldCAxMgorCQlwb3BsCSVlZGkKKwkJLmNmaV9kZWZfY2ZhX29mZnNldCA4CisJCXBvcGwJJWVicAorCQkuY2ZpX2RlZl9jZmFfb2Zmc2V0IDQKKy5jZmlfZW5kcHJvYworbWF0Y2hfaW5pdDoJcmV0CmRpZmYgLS1naXQgYS96bGliLTEuMi42L2NvbnRyaWIvYmxhc3QvTWFrZWZpbGUgYi96bGliLTEuMi42L2NvbnRyaWIvYmxhc3QvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJlODBiYQotLS0gL2Rldi9udWxsCisrKyBiL3psaWItMS4yLjYvY29udHJpYi9ibGFzdC9NYWtlZmlsZQpAQCAtMCwwICsxLDggQEAKK2JsYXN0OiBibGFzdC5jIGJsYXN0LmgKKwljYyAtRFRFU1QgLW8gYmxhc3QgYmxhc3QuYworCit0ZXN0OiBibGFzdAorCWJsYXN0IDwgdGVzdC5wayB8IGNtcCAtIHRlc3QudHh0CisKK2NsZWFuOgorCXJtIC1mIGJsYXN0IGJsYXN0Lm8KZGlmZiAtLWdpdCBhL3psaWItMS4yLjYvY29udHJpYi9ibGFzdC9SRUFETUUgYi96bGliLTEuMi42L2NvbnRyaWIvYmxhc3QvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzYTYwYjMKLS0tIC9kZXYvbnVsbAorKysgYi96bGliLTEuMi42L2NvbnRyaWIvYmxhc3QvUkVBRE1FCkBAIC0wLDAgKzEsNCBAQAorUmVhZCBibGFzdC5oIGZvciBwdXJwb3NlIGFuZCB1c2FnZS4KKworTWFyayBBZGxlcgorbWFkbGVyQGFsdW1uaS5jYWx0ZWNoLmVkdQpkaWZmIC0tZ2l0IGEvemxpYi0xLjIuNi9jb250cmliL2JsYXN0L2JsYXN0LmMgYi96bGliLTEuMi42L2NvbnRyaWIvYmxhc3QvYmxhc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2U2OTdhCi0tLSAvZGV2L251bGwKKysrIGIvemxpYi0xLjIuNi9jb250cmliL2JsYXN0L2JsYXN0LmMKQEAgLTAsMCArMSw0NDQgQEAKKy8qIGJsYXN0LmMKKyAqIENvcHlyaWdodCAoQykgMjAwMyBNYXJrIEFkbGVyCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gYmxhc3QuaAorICogdmVyc2lvbiAxLjEsIDE2IEZlYiAyMDAzCisgKgorICogYmxhc3QuYyBkZWNvbXByZXNzZXMgZGF0YSBjb21wcmVzc2VkIGJ5IHRoZSBQS1dhcmUgQ29tcHJlc3Npb24gTGlicmFyeS4KKyAqIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25hbGl0eSBzaW1pbGFyIHRvIHRoZSBleHBsb2RlKCkgZnVuY3Rpb24gb2YKKyAqIHRoZSBQS1dhcmUgbGlicmFyeSwgaGVuY2UgdGhlIG5hbWUgImJsYXN0Ii4KKyAqCisgKiBUaGlzIGRlY29tcHJlc3NvciBpcyBiYXNlZCBvbiB0aGUgZXhjZWxsZW50IGZvcm1hdCBkZXNjcmlwdGlvbiBwcm92aWRlZCBieQorICogQmVuIFJ1ZGlhay1Hb3VsZCBpbiBjb21wLmNvbXByZXNzaW9uIG9uIEF1Z3VzdCAxMywgMjAwMS4gIEludGVyZXN0aW5nbHksIHRoZQorICogZXhhbXBsZSBCZW4gcHJvdmlkZWQgaW4gdGhlIHBvc3QgaXMgaW5jb3JyZWN0LiAgVGhlIGRpc3RhbmNlIDExMDAwMSBzaG91bGQKKyAqIGluc3RlYWQgYmUgMTExMDAwLiAgV2hlbiBjb3JyZWN0ZWQsIHRoZSBleGFtcGxlIGJ5dGUgc3RyZWFtIGJlY29tZXM6CisgKgorICogICAgMDAgMDQgODIgMjQgMjUgOGYgODAgN2YKKyAqCisgKiB3aGljaCBkZWNvbXByZXNzZXMgdG8gIkFJQUlBSUFJQUlBSUEiICh3aXRob3V0IHRoZSBxdW90ZXMpLgorICovCisKKy8qCisgKiBDaGFuZ2UgaGlzdG9yeToKKyAqCisgKiAxLjAgIDEyIEZlYiAyMDAzICAgICAtIEZpcnN0IHZlcnNpb24KKyAqIDEuMSAgMTYgRmViIDIwMDMgICAgIC0gRml4ZWQgZGlzdGFuY2UgY2hlY2sgZm9yID4gNCBHQiB1bmNvbXByZXNzZWQgZGF0YQorICovCisKKyNpbmNsdWRlIDxzZXRqbXAuaD4gICAgICAgICAgICAgLyogZm9yIHNldGptcCgpLCBsb25nam1wKCksIGFuZCBqbXBfYnVmICovCisjaW5jbHVkZSAiYmxhc3QuaCIgICAgICAgICAgICAgIC8qIHByb3RvdHlwZSBmb3IgYmxhc3QoKSAqLworCisjZGVmaW5lIGxvY2FsIHN0YXRpYyAgICAgICAgICAgIC8qIGZvciBsb2NhbCBmdW5jdGlvbiBkZWZpbml0aW9ucyAqLworI2RlZmluZSBNQVhCSVRTIDEzICAgICAgICAgICAgICAvKiBtYXhpbXVtIGNvZGUgbGVuZ3RoICovCisjZGVmaW5lIE1BWFdJTiA0MDk2ICAgICAgICAgICAgIC8qIG1heGltdW0gd2luZG93IHNpemUgKi8KKworLyogaW5wdXQgYW5kIG91dHB1dCBzdGF0ZSAqLworc3RydWN0IHN0YXRlIHsKKyAgICAvKiBpbnB1dCBzdGF0ZSAqLworICAgIGJsYXN0X2luIGluZnVuOyAgICAgICAgICAgICAvKiBpbnB1dCBmdW5jdGlvbiBwcm92aWRlZCBieSB1c2VyICovCisgICAgdm9pZCAqaW5ob3c7ICAgICAgICAgICAgICAgIC8qIG9wYXF1ZSBpbmZvcm1hdGlvbiBwYXNzZWQgdG8gaW5mdW4oKSAqLworICAgIHVuc2lnbmVkIGNoYXIgKmluOyAgICAgICAgICAvKiBuZXh0IGlucHV0IGxvY2F0aW9uICovCisgICAgdW5zaWduZWQgbGVmdDsgICAgICAgICAgICAgIC8qIGF2YWlsYWJsZSBpbnB1dCBhdCBpbiAqLworICAgIGludCBiaXRidWY7ICAgICAgICAgICAgICAgICAvKiBiaXQgYnVmZmVyICovCisgICAgaW50IGJpdGNudDsgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBiaXRzIGluIGJpdCBidWZmZXIgKi8KKworICAgIC8qIGlucHV0IGxpbWl0IGVycm9yIHJldHVybiBzdGF0ZSBmb3IgYml0cygpIGFuZCBkZWNvZGUoKSAqLworICAgIGptcF9idWYgZW52OworCisgICAgLyogb3V0cHV0IHN0YXRlICovCisgICAgYmxhc3Rfb3V0IG91dGZ1bjsgICAgICAgICAgIC8qIG91dHB1dCBmdW5jdGlvbiBwcm92aWRlZCBieSB1c2VyICovCisgICAgdm9pZCAqb3V0aG93OyAgICAgICAgICAgICAgIC8qIG9wYXF1ZSBpbmZvcm1hdGlvbiBwYXNzZWQgdG8gb3V0ZnVuKCkgKi8KKyAgICB1bnNpZ25lZCBuZXh0OyAgICAgICAgICAgICAgLyogaW5kZXggb2YgbmV4dCB3cml0ZSBsb2NhdGlvbiBpbiBvdXRbXSAqLworICAgIGludCBmaXJzdDsgICAgICAgICAgICAgICAgICAvKiB0cnVlIHRvIGNoZWNrIGRpc3RhbmNlcyAoZm9yIGZpcnN0IDRLKSAqLworICAgIHVuc2lnbmVkIGNoYXIgb3V0W01BWFdJTl07ICAvKiBvdXRwdXQgYnVmZmVyIGFuZCBzbGlkaW5nIHdpbmRvdyAqLworfTsKKworLyoKKyAqIFJldHVybiBuZWVkIGJpdHMgZnJvbSB0aGUgaW5wdXQgc3RyZWFtLiAgVGhpcyBhbHdheXMgbGVhdmVzIGxlc3MgdGhhbgorICogZWlnaHQgYml0cyBpbiB0aGUgYnVmZmVyLiAgYml0cygpIHdvcmtzIHByb3Blcmx5IGZvciBuZWVkID09IDAuCisgKgorICogRm9ybWF0IG5vdGVzOgorICoKKyAqIC0gQml0cyBhcmUgc3RvcmVkIGluIGJ5dGVzIGZyb20gdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdCB0byB0aGUgbW9zdAorICogICBzaWduaWZpY2FudCBiaXQuICBUaGVyZWZvcmUgYml0cyBhcmUgZHJvcHBlZCBmcm9tIHRoZSBib3R0b20gb2YgdGhlIGJpdAorICogICBidWZmZXIsIHVzaW5nIHNoaWZ0IHJpZ2h0LCBhbmQgbmV3IGJ5dGVzIGFyZSBhcHBlbmRlZCB0byB0aGUgdG9wIG9mIHRoZQorICogICBiaXQgYnVmZmVyLCB1c2luZyBzaGlmdCBsZWZ0LgorICovCitsb2NhbCBpbnQgYml0cyhzdHJ1Y3Qgc3RhdGUgKnMsIGludCBuZWVkKQoreworICAgIGludCB2YWw7ICAgICAgICAgICAgLyogYml0IGFjY3VtdWxhdG9yICovCisKKyAgICAvKiBsb2FkIGF0IGxlYXN0IG5lZWQgYml0cyBpbnRvIHZhbCAqLworICAgIHZhbCA9IHMtPmJpdGJ1ZjsKKyAgICB3aGlsZSAocy0+Yml0Y250IDwgbmVlZCkgeworICAgICAgICBpZiAocy0+bGVmdCA9PSAwKSB7CisgICAgICAgICAgICBzLT5sZWZ0ID0gcy0+aW5mdW4ocy0+aW5ob3csICYocy0+aW4pKTsKKyAgICAgICAgICAgIGlmIChzLT5sZWZ0ID09IDApIGxvbmdqbXAocy0+ZW52LCAxKTsgICAgICAgLyogb3V0IG9mIGlucHV0ICovCisgICAgICAgIH0KKyAgICAgICAgdmFsIHw9IChpbnQpKCoocy0+aW4pKyspIDw8IHMtPmJpdGNudDsgICAgICAgICAgLyogbG9hZCBlaWdodCBiaXRzICovCisgICAgICAgIHMtPmxlZnQtLTsKKyAgICAgICAgcy0+Yml0Y250ICs9IDg7CisgICAgfQorCisgICAgLyogZHJvcCBuZWVkIGJpdHMgYW5kIHVwZGF0ZSBidWZmZXIsIGFsd2F5cyB6ZXJvIHRvIHNldmVuIGJpdHMgbGVmdCAqLworICAgIHMtPmJpdGJ1ZiA9IHZhbCA+PiBuZWVkOworICAgIHMtPmJpdGNudCAtPSBuZWVkOworCisgICAgLyogcmV0dXJuIG5lZWQgYml0cywgemVyb2luZyB0aGUgYml0cyBhYm92ZSB0aGF0ICovCisgICAgcmV0dXJuIHZhbCAmICgoMSA8PCBuZWVkKSAtIDEpOworfQorCisvKgorICogSHVmZm1hbiBjb2RlIGRlY29kaW5nIHRhYmxlcy4gIGNvdW50WzEuLk1BWEJJVFNdIGlzIHRoZSBudW1iZXIgb2Ygc3ltYm9scyBvZgorICogZWFjaCBsZW5ndGgsIHdoaWNoIGZvciBhIGNhbm9uaWNhbCBjb2RlIGFyZSBzdGVwcGVkIHRocm91Z2ggaW4gb3JkZXIuCisgKiBzeW1ib2xbXSBhcmUgdGhlIHN5bWJvbCB2YWx1ZXMgaW4gY2Fub25pY2FsIG9yZGVyLCB3aGVyZSB0aGUgbnVtYmVyIG9mCisgKiBlbnRyaWVzIGlzIHRoZSBzdW0gb2YgdGhlIGNvdW50cyBpbiBjb3VudFtdLiAgVGhlIGRlY29kaW5nIHByb2Nlc3MgY2FuIGJlCisgKiBzZWVuIGluIHRoZSBmdW5jdGlvbiBkZWNvZGUoKSBiZWxvdy4KKyAqLworc3RydWN0IGh1ZmZtYW4geworICAgIHNob3J0ICpjb3VudDsgICAgICAgLyogbnVtYmVyIG9mIHN5bWJvbHMgb2YgZWFjaCBsZW5ndGggKi8KKyAgICBzaG9ydCAqc3ltYm9sOyAgICAgIC8qIGNhbm9uaWNhbGx5IG9yZGVyZWQgc3ltYm9scyAqLworfTsKKworLyoKKyAqIERlY29kZSBhIGNvZGUgZnJvbSB0aGUgc3RyZWFtIHMgdXNpbmcgaHVmZm1hbiB0YWJsZSBoLiAgUmV0dXJuIHRoZSBzeW1ib2wgb3IKKyAqIGEgbmVnYXRpdmUgdmFsdWUgaWYgdGhlcmUgaXMgYW4gZXJyb3IuICBJZiBhbGwgb2YgdGhlIGxlbmd0aHMgYXJlIHplcm8sIGkuZS4KKyAqIGFuIGVtcHR5IGNvZGUsIG9yIGlmIHRoZSBjb2RlIGlzIGluY29tcGxldGUgYW5kIGFuIGludmFsaWQgY29kZSBpcyByZWNlaXZlZCwKKyAqIHRoZW4gLTkgaXMgcmV0dXJuZWQgYWZ0ZXIgcmVhZGluZyBNQVhCSVRTIGJpdHMuCisgKgorICogRm9ybWF0IG5vdGVzOgorICoKKyAqIC0gVGhlIGNvZGVzIGFzIHN0b3JlZCBpbiB0aGUgY29tcHJlc3NlZCBkYXRhIGFyZSBiaXQtcmV2ZXJzZWQgcmVsYXRpdmUgdG8KKyAqICAgYSBzaW1wbGUgaW50ZWdlciBvcmRlcmluZyBvZiBjb2RlcyBvZiB0aGUgc2FtZSBsZW5ndGhzLiAgSGVuY2UgYmVsb3cgdGhlCisgKiAgIGJpdHMgYXJlIHB1bGxlZCBmcm9tIHRoZSBjb21wcmVzc2VkIGRhdGEgb25lIGF0IGEgdGltZSBhbmQgdXNlZCB0bworICogICBidWlsZCB0aGUgY29kZSB2YWx1ZSByZXZlcnNlZCBmcm9tIHdoYXQgaXMgaW4gdGhlIHN0cmVhbSBpbiBvcmRlciB0bworICogICBwZXJtaXQgc2ltcGxlIGludGVnZXIgY29tcGFyaXNvbnMgZm9yIGRlY29kaW5nLgorICoKKyAqIC0gVGhlIGZpcnN0IGNvZGUgZm9yIHRoZSBzaG9ydGVzdCBsZW5ndGggaXMgYWxsIG9uZXMuICBTdWJzZXF1ZW50IGNvZGVzIG9mCisgKiAgIHRoZSBzYW1lIGxlbmd0aCBhcmUgc2ltcGx5IGludGVnZXIgZGVjcmVtZW50cyBvZiB0aGUgcHJldmlvdXMgY29kZS4gIFdoZW4KKyAqICAgbW92aW5nIHVwIGEgbGVuZ3RoLCBhIG9uZSBiaXQgaXMgYXBwZW5kZWQgdG8gdGhlIGNvZGUuICBGb3IgYSBjb21wbGV0ZQorICogICBjb2RlLCB0aGUgbGFzdCBjb2RlIG9mIHRoZSBsb25nZXN0IGxlbmd0aCB3aWxsIGJlIGFsbCB6ZXJvcy4gIFRvIHN1cHBvcnQKKyAqICAgdGhpcyBvcmRlcmluZywgdGhlIGJpdHMgcHVsbGVkIGR1cmluZyBkZWNvZGluZyBhcmUgaW52ZXJ0ZWQgdG8gYXBwbHkgdGhlCisgKiAgIG1vcmUgIm5hdHVyYWwiIG9yZGVyaW5nIHN0YXJ0aW5nIHdpdGggYWxsIHplcm9zIGFuZCBpbmNyZW1lbnRpbmcuCisgKi8KK2xvY2FsIGludCBkZWNvZGUoc3RydWN0IHN0YXRlICpzLCBzdHJ1Y3QgaHVmZm1hbiAqaCkKK3sKKyAgICBpbnQgbGVuOyAgICAgICAgICAgIC8qIGN1cnJlbnQgbnVtYmVyIG9mIGJpdHMgaW4gY29kZSAqLworICAgIGludCBjb2RlOyAgICAgICAgICAgLyogbGVuIGJpdHMgYmVpbmcgZGVjb2RlZCAqLworICAgIGludCBmaXJzdDsgICAgICAgICAgLyogZmlyc3QgY29kZSBvZiBsZW5ndGggbGVuICovCisgICAgaW50IGNvdW50OyAgICAgICAgICAvKiBudW1iZXIgb2YgY29kZXMgb2YgbGVuZ3RoIGxlbiAqLworICAgIGludCBpbmRleDsgICAgICAgICAgLyogaW5kZXggb2YgZmlyc3QgY29kZSBvZiBsZW5ndGggbGVuIGluIHN5bWJvbCB0YWJsZSAqLworICAgIGludCBiaXRidWY7ICAgICAgICAgLyogYml0cyBmcm9tIHN0cmVhbSAqLworICAgIGludCBsZWZ0OyAgICAgICAgICAgLyogYml0cyBsZWZ0IGluIG5leHQgb3IgbGVmdCB0byBwcm9jZXNzICovCisgICAgc2hvcnQgKm5leHQ7ICAgICAgICAvKiBuZXh0IG51bWJlciBvZiBjb2RlcyAqLworCisgICAgYml0YnVmID0gcy0+Yml0YnVmOworICAgIGxlZnQgPSBzLT5iaXRjbnQ7CisgICAgY29kZSA9IGZpcnN0ID0gaW5kZXggPSAwOworICAgIGxlbiA9IDE7CisgICAgbmV4dCA9IGgtPmNvdW50ICsgMTsKKyAgICB3aGlsZSAoMSkgeworICAgICAgICB3aGlsZSAobGVmdC0tKSB7CisgICAgICAgICAgICBjb2RlIHw9IChiaXRidWYgJiAxKSBeIDE7ICAgLyogaW52ZXJ0IGNvZGUgKi8KKyAgICAgICAgICAgIGJpdGJ1ZiA+Pj0gMTsKKyAgICAgICAgICAgIGNvdW50ID0gKm5leHQrKzsKKyAgICAgICAgICAgIGlmIChjb2RlIDwgZmlyc3QgKyBjb3VudCkgeyAvKiBpZiBsZW5ndGggbGVuLCByZXR1cm4gc3ltYm9sICovCisgICAgICAgICAgICAgICAgcy0+Yml0YnVmID0gYml0YnVmOworICAgICAgICAgICAgICAgIHMtPmJpdGNudCA9IChzLT5iaXRjbnQgLSBsZW4pICYgNzsKKyAgICAgICAgICAgICAgICByZXR1cm4gaC0+c3ltYm9sW2luZGV4ICsgKGNvZGUgLSBmaXJzdCldOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW5kZXggKz0gY291bnQ7ICAgICAgICAgICAgIC8qIGVsc2UgdXBkYXRlIGZvciBuZXh0IGxlbmd0aCAqLworICAgICAgICAgICAgZmlyc3QgKz0gY291bnQ7CisgICAgICAgICAgICBmaXJzdCA8PD0gMTsKKyAgICAgICAgICAgIGNvZGUgPDw9IDE7CisgICAgICAgICAgICBsZW4rKzsKKyAgICAgICAgfQorICAgICAgICBsZWZ0ID0gKE1BWEJJVFMrMSkgLSBsZW47CisgICAgICAgIGlmIChsZWZ0ID09IDApIGJyZWFrOworICAgICAgICBpZiAocy0+bGVmdCA9PSAwKSB7CisgICAgICAgICAgICBzLT5sZWZ0ID0gcy0+aW5mdW4ocy0+aW5ob3csICYocy0+aW4pKTsKKyAgICAgICAgICAgIGlmIChzLT5sZWZ0ID09IDApIGxvbmdqbXAocy0+ZW52LCAxKTsgICAgICAgLyogb3V0IG9mIGlucHV0ICovCisgICAgICAgIH0KKyAgICAgICAgYml0YnVmID0gKihzLT5pbikrKzsKKyAgICAgICAgcy0+bGVmdC0tOworICAgICAgICBpZiAobGVmdCA+IDgpIGxlZnQgPSA4OworICAgIH0KKyAgICByZXR1cm4gLTk7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByYW4gb3V0IG9mIGNvZGVzICovCit9CisKKy8qCisgKiBHaXZlbiBhIGxpc3Qgb2YgcmVwZWF0ZWQgY29kZSBsZW5ndGhzIHJlcFswLi5uLTFdLCB3aGVyZSBlYWNoIGJ5dGUgaXMgYQorICogY291bnQgKGhpZ2ggZm91ciBiaXRzICsgMSkgYW5kIGEgY29kZSBsZW5ndGggKGxvdyBmb3VyIGJpdHMpLCBnZW5lcmF0ZSB0aGUKKyAqIGxpc3Qgb2YgY29kZSBsZW5ndGhzLiAgVGhpcyBjb21wYWN0aW9uIHJlZHVjZXMgdGhlIHNpemUgb2YgdGhlIG9iamVjdCBjb2RlLgorICogVGhlbiBnaXZlbiB0aGUgbGlzdCBvZiBjb2RlIGxlbmd0aHMgbGVuZ3RoWzAuLm4tMV0gcmVwcmVzZW50aW5nIGEgY2Fub25pY2FsCisgKiBIdWZmbWFuIGNvZGUgZm9yIG4gc3ltYm9scywgY29uc3RydWN0IHRoZSB0YWJsZXMgcmVxdWlyZWQgdG8gZGVjb2RlIHRob3NlCisgKiBjb2Rlcy4gIFRob3NlIHRhYmxlcyBhcmUgdGhlIG51bWJlciBvZiBjb2RlcyBvZiBlYWNoIGxlbmd0aCwgYW5kIHRoZSBzeW1ib2xzCisgKiBzb3J0ZWQgYnkgbGVuZ3RoLCByZXRhaW5pbmcgdGhlaXIgb3JpZ2luYWwgb3JkZXIgd2l0aGluIGVhY2ggbGVuZ3RoLiAgVGhlCisgKiByZXR1cm4gdmFsdWUgaXMgemVybyBmb3IgYSBjb21wbGV0ZSBjb2RlIHNldCwgbmVnYXRpdmUgZm9yIGFuIG92ZXItCisgKiBzdWJzY3JpYmVkIGNvZGUgc2V0LCBhbmQgcG9zaXRpdmUgZm9yIGFuIGluY29tcGxldGUgY29kZSBzZXQuICBUaGUgdGFibGVzCisgKiBjYW4gYmUgdXNlZCBpZiB0aGUgcmV0dXJuIHZhbHVlIGlzIHplcm8gb3IgcG9zaXRpdmUsIGJ1dCB0aGV5IGNhbm5vdCBiZSB1c2VkCisgKiBpZiB0aGUgcmV0dXJuIHZhbHVlIGlzIG5lZ2F0aXZlLiAgSWYgdGhlIHJldHVybiB2YWx1ZSBpcyB6ZXJvLCBpdCBpcyBub3QKKyAqIHBvc3NpYmxlIGZvciBkZWNvZGUoKSB1c2luZyB0aGF0IHRhYmxlIHRvIHJldHVybiBhbiBlcnJvci0tYW55IHN0cmVhbSBvZgorICogZW5vdWdoIGJpdHMgd2lsbCByZXNvbHZlIHRvIGEgc3ltYm9sLiAgSWYgdGhlIHJldHVybiB2YWx1ZSBpcyBwb3NpdGl2ZSwgdGhlbgorICogaXQgaXMgcG9zc2libGUgZm9yIGRlY29kZSgpIHVzaW5nIHRoYXQgdGFibGUgdG8gcmV0dXJuIGFuIGVycm9yIGZvciByZWNlaXZlZAorICogY29kZXMgcGFzdCB0aGUgZW5kIG9mIHRoZSBpbmNvbXBsZXRlIGxlbmd0aHMuCisgKi8KK2xvY2FsIGludCBjb25zdHJ1Y3Qoc3RydWN0IGh1ZmZtYW4gKmgsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlcCwgaW50IG4pCit7CisgICAgaW50IHN5bWJvbDsgICAgICAgICAvKiBjdXJyZW50IHN5bWJvbCB3aGVuIHN0ZXBwaW5nIHRocm91Z2ggbGVuZ3RoW10gKi8KKyAgICBpbnQgbGVuOyAgICAgICAgICAgIC8qIGN1cnJlbnQgbGVuZ3RoIHdoZW4gc3RlcHBpbmcgdGhyb3VnaCBoLT5jb3VudFtdICovCisgICAgaW50IGxlZnQ7ICAgICAgICAgICAvKiBudW1iZXIgb2YgcG9zc2libGUgY29kZXMgbGVmdCBvZiBjdXJyZW50IGxlbmd0aCAqLworICAgIHNob3J0IG9mZnNbTUFYQklUUysxXTsgICAgICAvKiBvZmZzZXRzIGluIHN5bWJvbCB0YWJsZSBmb3IgZWFjaCBsZW5ndGggKi8KKyAgICBzaG9ydCBsZW5ndGhbMjU2XTsgIC8qIGNvZGUgbGVuZ3RocyAqLworCisgICAgLyogY29udmVydCBjb21wYWN0IHJlcGVhdCBjb3VudHMgaW50byBzeW1ib2wgYml0IGxlbmd0aCBsaXN0ICovCisgICAgc3ltYm9sID0gMDsKKyAgICBkbyB7CisgICAgICAgIGxlbiA9ICpyZXArKzsKKyAgICAgICAgbGVmdCA9IChsZW4gPj4gNCkgKyAxOworICAgICAgICBsZW4gJj0gMTU7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGxlbmd0aFtzeW1ib2wrK10gPSBsZW47CisgICAgICAgIH0gd2hpbGUgKC0tbGVmdCk7CisgICAgfSB3aGlsZSAoLS1uKTsKKyAgICBuID0gc3ltYm9sOworCisgICAgLyogY291bnQgbnVtYmVyIG9mIGNvZGVzIG9mIGVhY2ggbGVuZ3RoICovCisgICAgZm9yIChsZW4gPSAwOyBsZW4gPD0gTUFYQklUUzsgbGVuKyspCisgICAgICAgIGgtPmNvdW50W2xlbl0gPSAwOworICAgIGZvciAoc3ltYm9sID0gMDsgc3ltYm9sIDwgbjsgc3ltYm9sKyspCisgICAgICAgIChoLT5jb3VudFtsZW5ndGhbc3ltYm9sXV0pKys7ICAgLyogYXNzdW1lcyBsZW5ndGhzIGFyZSB3aXRoaW4gYm91bmRzICovCisgICAgaWYgKGgtPmNvdW50WzBdID09IG4pICAgICAgICAgICAgICAgLyogbm8gY29kZXMhICovCisgICAgICAgIHJldHVybiAwOyAgICAgICAgICAgICAgICAgICAgICAgLyogY29tcGxldGUsIGJ1dCBkZWNvZGUoKSB3aWxsIGZhaWwgKi8KKworICAgIC8qIGNoZWNrIGZvciBhbiBvdmVyLXN1YnNjcmliZWQgb3IgaW5jb21wbGV0ZSBzZXQgb2YgbGVuZ3RocyAqLworICAgIGxlZnQgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9uZSBwb3NzaWJsZSBjb2RlIG9mIHplcm8gbGVuZ3RoICovCisgICAgZm9yIChsZW4gPSAxOyBsZW4gPD0gTUFYQklUUzsgbGVuKyspIHsKKyAgICAgICAgbGVmdCA8PD0gMTsgICAgICAgICAgICAgICAgICAgICAvKiBvbmUgbW9yZSBiaXQsIGRvdWJsZSBjb2RlcyBsZWZ0ICovCisgICAgICAgIGxlZnQgLT0gaC0+Y291bnRbbGVuXTsgICAgICAgICAgLyogZGVkdWN0IGNvdW50IGZyb20gcG9zc2libGUgY29kZXMgKi8KKyAgICAgICAgaWYgKGxlZnQgPCAwKSByZXR1cm4gbGVmdDsgICAgICAvKiBvdmVyLXN1YnNjcmliZWQtLXJldHVybiBuZWdhdGl2ZSAqLworICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxlZnQgPiAwIG1lYW5zIGluY29tcGxldGUgKi8KKworICAgIC8qIGdlbmVyYXRlIG9mZnNldHMgaW50byBzeW1ib2wgdGFibGUgZm9yIGVhY2ggbGVuZ3RoIGZvciBzb3J0aW5nICovCisgICAgb2Zmc1sxXSA9IDA7CisgICAgZm9yIChsZW4gPSAxOyBsZW4gPCBNQVhCSVRTOyBsZW4rKykKKyAgICAgICAgb2Zmc1tsZW4gKyAxXSA9IG9mZnNbbGVuXSArIGgtPmNvdW50W2xlbl07CisKKyAgICAvKgorICAgICAqIHB1dCBzeW1ib2xzIGluIHRhYmxlIHNvcnRlZCBieSBsZW5ndGgsIGJ5IHN5bWJvbCBvcmRlciB3aXRoaW4gZWFjaAorICAgICAqIGxlbmd0aAorICAgICAqLworICAgIGZvciAoc3ltYm9sID0gMDsgc3ltYm9sIDwgbjsgc3ltYm9sKyspCisgICAgICAgIGlmIChsZW5ndGhbc3ltYm9sXSAhPSAwKQorICAgICAgICAgICAgaC0+c3ltYm9sW29mZnNbbGVuZ3RoW3N5bWJvbF1dKytdID0gc3ltYm9sOworCisgICAgLyogcmV0dXJuIHplcm8gZm9yIGNvbXBsZXRlIHNldCwgcG9zaXRpdmUgZm9yIGluY29tcGxldGUgc2V0ICovCisgICAgcmV0dXJuIGxlZnQ7Cit9CisKKy8qCisgKiBEZWNvZGUgUEtXYXJlIENvbXByZXNzaW9uIExpYnJhcnkgc3RyZWFtLgorICoKKyAqIEZvcm1hdCBub3RlczoKKyAqCisgKiAtIEZpcnN0IGJ5dGUgaXMgMCBpZiBsaXRlcmFscyBhcmUgdW5jb2RlZCBvciAxIGlmIHRoZXkgYXJlIGNvZGVkLiAgU2Vjb25kCisgKiAgIGJ5dGUgaXMgNCwgNSwgb3IgNiBmb3IgdGhlIG51bWJlciBvZiBleHRyYSBiaXRzIGluIHRoZSBkaXN0YW5jZSBjb2RlLgorICogICBUaGlzIGlzIHRoZSBiYXNlLTIgbG9nYXJpdGhtIG9mIHRoZSBkaWN0aW9uYXJ5IHNpemUgbWludXMgc2l4LgorICoKKyAqIC0gQ29tcHJlc3NlZCBkYXRhIGlzIGEgY29tYmluYXRpb24gb2YgbGl0ZXJhbHMgYW5kIGxlbmd0aC9kaXN0YW5jZSBwYWlycworICogICB0ZXJtaW5hdGVkIGJ5IGFuIGVuZCBjb2RlLiAgTGl0ZXJhbHMgYXJlIGVpdGhlciBIdWZmbWFuIGNvZGVkIG9yCisgKiAgIHVuY29kZWQgYnl0ZXMuICBBIGxlbmd0aC9kaXN0YW5jZSBwYWlyIGlzIGEgY29kZWQgbGVuZ3RoIGZvbGxvd2VkIGJ5IGEKKyAqICAgY29kZWQgZGlzdGFuY2UgdG8gcmVwcmVzZW50IGEgc3RyaW5nIHRoYXQgb2NjdXJzIGVhcmxpZXIgaW4gdGhlCisgKiAgIHVuY29tcHJlc3NlZCBkYXRhIHRoYXQgb2NjdXJzIGFnYWluIGF0IHRoZSBjdXJyZW50IGxvY2F0aW9uLgorICoKKyAqIC0gQSBiaXQgcHJlY2VkaW5nIGEgbGl0ZXJhbCBvciBsZW5ndGgvZGlzdGFuY2UgcGFpciBpbmRpY2F0ZXMgd2hpY2ggY29tZXMKKyAqICAgbmV4dCwgMCBmb3IgbGl0ZXJhbHMsIDEgZm9yIGxlbmd0aC9kaXN0YW5jZS4KKyAqCisgKiAtIElmIGxpdGVyYWxzIGFyZSB1bmNvZGVkLCB0aGVuIHRoZSBuZXh0IGVpZ2h0IGJpdHMgYXJlIHRoZSBsaXRlcmFsLCBpbiB0aGUKKyAqICAgbm9ybWFsIGJpdCBvcmRlciBpbiB0aCBzdHJlYW0sIGkuZS4gbm8gYml0LXJldmVyc2FsIGlzIG5lZWRlZC4gU2ltaWxhcmx5LAorICogICBubyBiaXQgcmV2ZXJzYWwgaXMgbmVlZGVkIGZvciBlaXRoZXIgdGhlIGxlbmd0aCBleHRyYSBiaXRzIG9yIHRoZSBkaXN0YW5jZQorICogICBleHRyYSBiaXRzLgorICoKKyAqIC0gTGl0ZXJhbCBieXRlcyBhcmUgc2ltcGx5IHdyaXR0ZW4gdG8gdGhlIG91dHB1dC4gIEEgbGVuZ3RoL2Rpc3RhbmNlIHBhaXIgaXMKKyAqICAgYW4gaW5zdHJ1Y3Rpb24gdG8gY29weSBwcmV2aW91c2x5IHVuY29tcHJlc3NlZCBieXRlcyB0byB0aGUgb3V0cHV0LiAgVGhlCisgKiAgIGNvcHkgaXMgZnJvbSBkaXN0YW5jZSBieXRlcyBiYWNrIGluIHRoZSBvdXRwdXQgc3RyZWFtLCBjb3B5aW5nIGZvciBsZW5ndGgKKyAqICAgYnl0ZXMuCisgKgorICogLSBEaXN0YW5jZXMgcG9pbnRpbmcgYmVmb3JlIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG91dHB1dCBkYXRhIGFyZSBub3QKKyAqICAgcGVybWl0dGVkLgorICoKKyAqIC0gT3ZlcmxhcHBlZCBjb3BpZXMsIHdoZXJlIHRoZSBsZW5ndGggaXMgZ3JlYXRlciB0aGFuIHRoZSBkaXN0YW5jZSwgYXJlCisgKiAgIGFsbG93ZWQgYW5kIGNvbW1vbi4gIEZvciBleGFtcGxlLCBhIGRpc3RhbmNlIG9mIG9uZSBhbmQgYSBsZW5ndGggb2YgNTE4CisgKiAgIHNpbXBseSBjb3BpZXMgdGhlIGxhc3QgYnl0ZSA1MTggdGltZXMuICBBIGRpc3RhbmNlIG9mIGZvdXIgYW5kIGEgbGVuZ3RoIG9mCisgKiAgIHR3ZWx2ZSBjb3BpZXMgdGhlIGxhc3QgZm91ciBieXRlcyB0aHJlZSB0aW1lcy4gIEEgc2ltcGxlIGZvcndhcmQgY29weQorICogICBpZ25vcmluZyB3aGV0aGVyIHRoZSBsZW5ndGggaXMgZ3JlYXRlciB0aGFuIHRoZSBkaXN0YW5jZSBvciBub3QgaW1wbGVtZW50cworICogICB0aGlzIGNvcnJlY3RseS4KKyAqLworbG9jYWwgaW50IGRlY29tcChzdHJ1Y3Qgc3RhdGUgKnMpCit7CisgICAgaW50IGxpdDsgICAgICAgICAgICAvKiB0cnVlIGlmIGxpdGVyYWxzIGFyZSBjb2RlZCAqLworICAgIGludCBkaWN0OyAgICAgICAgICAgLyogbG9nMihkaWN0aW9uYXJ5IHNpemUpIC0gNiAqLworICAgIGludCBzeW1ib2w7ICAgICAgICAgLyogZGVjb2RlZCBzeW1ib2wsIGV4dHJhIGJpdHMgZm9yIGRpc3RhbmNlICovCisgICAgaW50IGxlbjsgICAgICAgICAgICAvKiBsZW5ndGggZm9yIGNvcHkgKi8KKyAgICBpbnQgZGlzdDsgICAgICAgICAgIC8qIGRpc3RhbmNlIGZvciBjb3B5ICovCisgICAgaW50IGNvcHk7ICAgICAgICAgICAvKiBjb3B5IGNvdW50ZXIgKi8KKyAgICB1bnNpZ25lZCBjaGFyICpmcm9tLCAqdG87ICAgLyogY29weSBwb2ludGVycyAqLworICAgIHN0YXRpYyBpbnQgdmlyZ2luID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBidWlsZCB0YWJsZXMgb25jZSAqLworICAgIHN0YXRpYyBzaG9ydCBsaXRjbnRbTUFYQklUUysxXSwgbGl0c3ltWzI1Nl07ICAgICAgICAvKiBsaXRjb2RlIG1lbW9yeSAqLworICAgIHN0YXRpYyBzaG9ydCBsZW5jbnRbTUFYQklUUysxXSwgbGVuc3ltWzE2XTsgICAgICAgICAvKiBsZW5jb2RlIG1lbW9yeSAqLworICAgIHN0YXRpYyBzaG9ydCBkaXN0Y250W01BWEJJVFMrMV0sIGRpc3RzeW1bNjRdOyAgICAgICAvKiBkaXN0Y29kZSBtZW1vcnkgKi8KKyAgICBzdGF0aWMgc3RydWN0IGh1ZmZtYW4gbGl0Y29kZSA9IHtsaXRjbnQsIGxpdHN5bX07ICAgLyogbGVuZ3RoIGNvZGUgKi8KKyAgICBzdGF0aWMgc3RydWN0IGh1ZmZtYW4gbGVuY29kZSA9IHtsZW5jbnQsIGxlbnN5bX07ICAgLyogbGVuZ3RoIGNvZGUgKi8KKyAgICBzdGF0aWMgc3RydWN0IGh1ZmZtYW4gZGlzdGNvZGUgPSB7ZGlzdGNudCwgZGlzdHN5bX07LyogZGlzdGFuY2UgY29kZSAqLworICAgICAgICAvKiBiaXQgbGVuZ3RocyBvZiBsaXRlcmFsIGNvZGVzICovCisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgbGl0bGVuW10gPSB7CisgICAgICAgIDExLCAxMjQsIDgsIDcsIDI4LCA3LCAxODgsIDEzLCA3NiwgNCwgMTAsIDgsIDEyLCAxMCwgMTIsIDEwLCA4LCAyMywgOCwKKyAgICAgICAgOSwgNywgNiwgNywgOCwgNywgNiwgNTUsIDgsIDIzLCAyNCwgMTIsIDExLCA3LCA5LCAxMSwgMTIsIDYsIDcsIDIyLCA1LAorICAgICAgICA3LCAyNCwgNiwgMTEsIDksIDYsIDcsIDIyLCA3LCAxMSwgMzgsIDcsIDksIDgsIDI1LCAxMSwgOCwgMTEsIDksIDEyLAorICAgICAgICA4LCAxMiwgNSwgMzgsIDUsIDM4LCA1LCAxMSwgNywgNSwgNiwgMjEsIDYsIDEwLCA1MywgOCwgNywgMjQsIDEwLCAyNywKKyAgICAgICAgNDQsIDI1MywgMjUzLCAyNTMsIDI1MiwgMjUyLCAyNTIsIDEzLCAxMiwgNDUsIDEyLCA0NSwgMTIsIDYxLCAxMiwgNDUsCisgICAgICAgIDQ0LCAxNzN9OworICAgICAgICAvKiBiaXQgbGVuZ3RocyBvZiBsZW5ndGggY29kZXMgMC4uMTUgKi8KKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBsZW5sZW5bXSA9IHsyLCAzNSwgMzYsIDUzLCAzOCwgMjN9OworICAgICAgICAvKiBiaXQgbGVuZ3RocyBvZiBkaXN0YW5jZSBjb2RlcyAwLi42MyAqLworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGRpc3RsZW5bXSA9IHsyLCAyMCwgNTMsIDIzMCwgMjQ3LCAxNTEsIDI0OH07CisgICAgc3RhdGljIGNvbnN0IHNob3J0IGJhc2VbMTZdID0geyAgICAgLyogYmFzZSBmb3IgbGVuZ3RoIGNvZGVzICovCisgICAgICAgIDMsIDIsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMiwgMTYsIDI0LCA0MCwgNzIsIDEzNiwgMjY0fTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBleHRyYVsxNl0gPSB7ICAgICAvKiBleHRyYSBiaXRzIGZvciBsZW5ndGggY29kZXMgKi8KKyAgICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOH07CisKKyAgICAvKiBzZXQgdXAgZGVjb2RpbmcgdGFibGVzIChvbmNlLS1taWdodCBub3QgYmUgdGhyZWFkLXNhZmUpICovCisgICAgaWYgKHZpcmdpbikgeworICAgICAgICBjb25zdHJ1Y3QoJmxpdGNvZGUsIGxpdGxlbiwgc2l6ZW9mKGxpdGxlbikpOworICAgICAgICBjb25zdHJ1Y3QoJmxlbmNvZGUsIGxlbmxlbiwgc2l6ZW9mKGxlbmxlbikpOworICAgICAgICBjb25zdHJ1Y3QoJmRpc3Rjb2RlLCBkaXN0bGVuLCBzaXplb2YoZGlzdGxlbikpOworICAgICAgICB2aXJnaW4gPSAwOworICAgIH0KKworICAgIC8qIHJlYWQgaGVhZGVyICovCisgICAgbGl0ID0gYml0cyhzLCA4KTsKKyAgICBpZiAobGl0ID4gMSkgcmV0dXJuIC0xOworICAgIGRpY3QgPSBiaXRzKHMsIDgpOworICAgIGlmIChkaWN0IDwgNCB8fCBkaWN0ID4gNikgcmV0dXJuIC0yOworCisgICAgLyogZGVjb2RlIGxpdGVyYWxzIGFuZCBsZW5ndGgvZGlzdGFuY2UgcGFpcnMgKi8KKyAgICBkbyB7CisgICAgICAgIGlmIChiaXRzKHMsIDEpKSB7CisgICAgICAgICAgICAvKiBnZXQgbGVuZ3RoICovCisgICAgICAgICAgICBzeW1ib2wgPSBkZWNvZGUocywgJmxlbmNvZGUpOworICAgICAgICAgICAgbGVuID0gYmFzZVtzeW1ib2xdICsgYml0cyhzLCBleHRyYVtzeW1ib2xdKTsKKyAgICAgICAgICAgIGlmIChsZW4gPT0gNTE5KSBicmVhazsgICAgICAgICAgICAgIC8qIGVuZCBjb2RlICovCisKKyAgICAgICAgICAgIC8qIGdldCBkaXN0YW5jZSAqLworICAgICAgICAgICAgc3ltYm9sID0gbGVuID09IDIgPyAyIDogZGljdDsKKyAgICAgICAgICAgIGRpc3QgPSBkZWNvZGUocywgJmRpc3Rjb2RlKSA8PCBzeW1ib2w7CisgICAgICAgICAgICBkaXN0ICs9IGJpdHMocywgc3ltYm9sKTsKKyAgICAgICAgICAgIGRpc3QrKzsKKyAgICAgICAgICAgIGlmIChzLT5maXJzdCAmJiBkaXN0ID4gcy0+bmV4dCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTM7ICAgICAgICAgICAgICAvKiBkaXN0YW5jZSB0b28gZmFyIGJhY2sgKi8KKworICAgICAgICAgICAgLyogY29weSBsZW5ndGggYnl0ZXMgZnJvbSBkaXN0YW5jZSBieXRlcyBiYWNrICovCisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgdG8gPSBzLT5vdXQgKyBzLT5uZXh0OworICAgICAgICAgICAgICAgIGZyb20gPSB0byAtIGRpc3Q7CisgICAgICAgICAgICAgICAgY29weSA9IE1BWFdJTjsKKyAgICAgICAgICAgICAgICBpZiAocy0+bmV4dCA8IGRpc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgZnJvbSArPSBjb3B5OworICAgICAgICAgICAgICAgICAgICBjb3B5ID0gZGlzdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY29weSAtPSBzLT5uZXh0OworICAgICAgICAgICAgICAgIGlmIChjb3B5ID4gbGVuKSBjb3B5ID0gbGVuOworICAgICAgICAgICAgICAgIGxlbiAtPSBjb3B5OworICAgICAgICAgICAgICAgIHMtPm5leHQgKz0gY29weTsKKyAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgICp0bysrID0gKmZyb20rKzsKKyAgICAgICAgICAgICAgICB9IHdoaWxlICgtLWNvcHkpOworICAgICAgICAgICAgICAgIGlmIChzLT5uZXh0ID09IE1BWFdJTikgeworICAgICAgICAgICAgICAgICAgICBpZiAocy0+b3V0ZnVuKHMtPm91dGhvdywgcy0+b3V0LCBzLT5uZXh0KSkgcmV0dXJuIDE7CisgICAgICAgICAgICAgICAgICAgIHMtPm5leHQgPSAwOworICAgICAgICAgICAgICAgICAgICBzLT5maXJzdCA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSB3aGlsZSAobGVuICE9IDApOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLyogZ2V0IGxpdGVyYWwgYW5kIHdyaXRlIGl0ICovCisgICAgICAgICAgICBzeW1ib2wgPSBsaXQgPyBkZWNvZGUocywgJmxpdGNvZGUpIDogYml0cyhzLCA4KTsKKyAgICAgICAgICAgIHMtPm91dFtzLT5uZXh0KytdID0gc3ltYm9sOworICAgICAgICAgICAgaWYgKHMtPm5leHQgPT0gTUFYV0lOKSB7CisgICAgICAgICAgICAgICAgaWYgKHMtPm91dGZ1bihzLT5vdXRob3csIHMtPm91dCwgcy0+bmV4dCkpIHJldHVybiAxOworICAgICAgICAgICAgICAgIHMtPm5leHQgPSAwOworICAgICAgICAgICAgICAgIHMtPmZpcnN0ID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gd2hpbGUgKDEpOworICAgIHJldHVybiAwOworfQorCisvKiBTZWUgY29tbWVudHMgaW4gYmxhc3QuaCAqLworaW50IGJsYXN0KGJsYXN0X2luIGluZnVuLCB2b2lkICppbmhvdywgYmxhc3Rfb3V0IG91dGZ1biwgdm9pZCAqb3V0aG93KQoreworICAgIHN0cnVjdCBzdGF0ZSBzOyAgICAgICAgICAgICAvKiBpbnB1dC9vdXRwdXQgc3RhdGUgKi8KKyAgICBpbnQgZXJyOyAgICAgICAgICAgICAgICAgICAgLyogcmV0dXJuIHZhbHVlICovCisKKyAgICAvKiBpbml0aWFsaXplIGlucHV0IHN0YXRlICovCisgICAgcy5pbmZ1biA9IGluZnVuOworICAgIHMuaW5ob3cgPSBpbmhvdzsKKyAgICBzLmxlZnQgPSAwOworICAgIHMuYml0YnVmID0gMDsKKyAgICBzLmJpdGNudCA9IDA7CisKKyAgICAvKiBpbml0aWFsaXplIG91dHB1dCBzdGF0ZSAqLworICAgIHMub3V0ZnVuID0gb3V0ZnVuOworICAgIHMub3V0aG93ID0gb3V0aG93OworICAgIHMubmV4dCA9IDA7CisgICAgcy5maXJzdCA9IDE7CisKKyAgICAvKiByZXR1cm4gaWYgYml0cygpIG9yIGRlY29kZSgpIHRyaWVzIHRvIHJlYWQgcGFzdCBhdmFpbGFibGUgaW5wdXQgKi8KKyAgICBpZiAoc2V0am1wKHMuZW52KSAhPSAwKSAgICAgICAgICAgICAvKiBpZiBjYW1lIGJhY2sgaGVyZSB2aWEgbG9uZ2ptcCgpLCAqLworICAgICAgICBlcnIgPSAyOyAgICAgICAgICAgICAgICAgICAgICAgIC8qICB0aGVuIHNraXAgZGVjb21wKCksIHJldHVybiBlcnJvciAqLworICAgIGVsc2UKKyAgICAgICAgZXJyID0gZGVjb21wKCZzKTsgICAgICAgICAgICAgICAvKiBkZWNvbXByZXNzICovCisKKyAgICAvKiB3cml0ZSBhbnkgbGVmdG92ZXIgb3V0cHV0IGFuZCB1cGRhdGUgdGhlIGVycm9yIGNvZGUgaWYgbmVlZGVkICovCisgICAgaWYgKGVyciAhPSAxICYmIHMubmV4dCAmJiBzLm91dGZ1bihzLm91dGhvdywgcy5vdXQsIHMubmV4dCkgJiYgZXJyID09IDApCisgICAgICAgIGVyciA9IDE7CisgICAgcmV0dXJuIGVycjsKK30KKworI2lmZGVmIFRFU1QKKy8qIEV4YW1wbGUgb2YgaG93IHRvIHVzZSBibGFzdCgpICovCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2RlZmluZSBDSFVOSyAxNjM4NAorCitsb2NhbCB1bnNpZ25lZCBpbmYodm9pZCAqaG93LCB1bnNpZ25lZCBjaGFyICoqYnVmKQoreworICAgIHN0YXRpYyB1bnNpZ25lZCBjaGFyIGhvbGRbQ0hVTktdOworCisgICAgKmJ1ZiA9IGhvbGQ7CisgICAgcmV0dXJuIGZyZWFkKGhvbGQsIDEsIENIVU5LLCAoRklMRSAqKWhvdyk7Cit9CisKK2xvY2FsIGludCBvdXRmKHZvaWQgKmhvdywgdW5zaWduZWQgY2hhciAqYnVmLCB1bnNpZ25lZCBsZW4pCit7CisgICAgcmV0dXJuIGZ3cml0ZShidWYsIDEsIGxlbiwgKEZJTEUgKilob3cpICE9IGxlbjsKK30KKworLyogRGVjb21wcmVzcyBhIFBLV2FyZSBDb21wcmVzc2lvbiBMaWJyYXJ5IHN0cmVhbSBmcm9tIHN0ZGluIHRvIHN0ZG91dCAqLworaW50IG1haW4odm9pZCkKK3sKKyAgICBpbnQgcmV0LCBuOworCisgICAgLyogZGVjb21wcmVzcyB0byBzdGRvdXQgKi8KKyAgICByZXQgPSBibGFzdChpbmYsIHN0ZGluLCBvdXRmLCBzdGRvdXQpOworICAgIGlmIChyZXQgIT0gMCkgZnByaW50ZihzdGRlcnIsICJibGFzdCBlcnJvcjogJWRcbiIsIHJldCk7CisKKyAgICAvKiBzZWUgaWYgdGhlcmUgYXJlIGFueSBsZWZ0b3ZlciBieXRlcyAqLworICAgIG4gPSAwOworICAgIHdoaWxlIChnZXRjaGFyKCkgIT0gRU9GKSBuKys7CisgICAgaWYgKG4pIGZwcmludGYoc3RkZXJyLCAiYmxhc3Qgd2FybmluZzogJWQgdW51c2VkIGJ5dGVzIG9mIGlucHV0XG4iLCBuKTsKKworICAgIC8qIHJldHVybiBibGFzdCgpIGVycm9yIGNvZGUgKi8KKyAgICByZXR1cm4gcmV0OworfQorI2VuZGlmCmRpZmYgLS1naXQgYS96bGliLTEuMi42L2NvbnRyaWIvYmxhc3QvYmxhc3QuaCBiL3psaWItMS4yLjYvY29udHJpYi9ibGFzdC9ibGFzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlOWU1NDEKLS0tIC9kZXYvbnVsbAorKysgYi96bGliLTEuMi42L2NvbnRyaWIvYmxhc3QvYmxhc3QuaApAQCAtMCwwICsxLDcxIEBACisvKiBibGFzdC5oIC0tIGludGVyZmFjZSBmb3IgYmxhc3QuYworICBDb3B5cmlnaHQgKEMpIDIwMDMgTWFyayBBZGxlcgorICB2ZXJzaW9uIDEuMSwgMTYgRmViIDIwMDMKKworICBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAorICB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvciBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKKyAgYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KKworICBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKKyAgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAorICBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CisKKyAgMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKKyAgICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKKyAgICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCisgICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCisgIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCisgICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KKyAgMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KKworICBNYXJrIEFkbGVyICAgIG1hZGxlckBhbHVtbmkuY2FsdGVjaC5lZHUKKyAqLworCisKKy8qCisgKiBibGFzdCgpIGRlY29tcHJlc3NlcyB0aGUgUEtXYXJlIERhdGEgQ29tcHJlc3Npb24gTGlicmFyeSAoRENMKSBjb21wcmVzc2VkCisgKiBmb3JtYXQuICBJdCBwcm92aWRlcyB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5IGFzIHRoZSBleHBsb2RlKCkgZnVuY3Rpb24gaW4KKyAqIHRoYXQgbGlicmFyeS4gIChOb3RlOiBQS1dhcmUgb3ZlcnVzZWQgdGhlICJpbXBsb2RlIiB2ZXJiLCBhbmQgdGhlIGZvcm1hdAorICogdXNlZCBieSB0aGVpciBsaWJyYXJ5IGltcGxvZGUoKSBmdW5jdGlvbiBpcyBjb21wbGV0ZWx5IGRpZmZlcmVudCBhbmQKKyAqIGluY29tcGF0aWJsZSB3aXRoIHRoZSBpbXBsb2RlIGNvbXByZXNzaW9uIG1ldGhvZCBzdXBwb3J0ZWQgYnkgUEtaSVAuKQorICovCisKKwordHlwZWRlZiB1bnNpZ25lZCAoKmJsYXN0X2luKSh2b2lkICpob3csIHVuc2lnbmVkIGNoYXIgKipidWYpOwordHlwZWRlZiBpbnQgKCpibGFzdF9vdXQpKHZvaWQgKmhvdywgdW5zaWduZWQgY2hhciAqYnVmLCB1bnNpZ25lZCBsZW4pOworLyogRGVmaW5pdGlvbnMgZm9yIGlucHV0L291dHB1dCBmdW5jdGlvbnMgcGFzc2VkIHRvIGJsYXN0KCkuICBTZWUgYmVsb3cgZm9yCisgKiB3aGF0IHRoZSBwcm92aWRlZCBmdW5jdGlvbnMgbmVlZCB0byBkby4KKyAqLworCisKK2ludCBibGFzdChibGFzdF9pbiBpbmZ1biwgdm9pZCAqaW5ob3csIGJsYXN0X291dCBvdXRmdW4sIHZvaWQgKm91dGhvdyk7CisvKiBEZWNvbXByZXNzIGlucHV0IHRvIG91dHB1dCB1c2luZyB0aGUgcHJvdmlkZWQgaW5mdW4oKSBhbmQgb3V0ZnVuKCkgY2FsbHMuCisgKiBPbiBzdWNjZXNzLCB0aGUgcmV0dXJuIHZhbHVlIG9mIGJsYXN0KCkgaXMgemVyby4gIElmIHRoZXJlIGlzIGFuIGVycm9yIGluCisgKiB0aGUgc291cmNlIGRhdGEsIGkuZS4gaXQgaXMgbm90IGluIHRoZSBwcm9wZXIgZm9ybWF0LCB0aGVuIGEgbmVnYXRpdmUgdmFsdWUKKyAqIGlzIHJldHVybmVkLiAgSWYgdGhlcmUgaXMgbm90IGVub3VnaCBpbnB1dCBhdmFpbGFibGUgb3IgdGhlcmUgaXMgbm90IGVub3VnaAorICogb3V0cHV0IHNwYWNlLCB0aGVuIGEgcG9zaXRpdmUgZXJyb3IgaXMgcmV0dXJuZWQuCisgKgorICogVGhlIGlucHV0IGZ1bmN0aW9uIGlzIGludm9rZWQ6IGxlbiA9IGluZnVuKGhvdywgJmJ1ZiksIHdoZXJlIGJ1ZiBpcyBzZXQgYnkKKyAqIGluZnVuKCkgdG8gcG9pbnQgdG8gdGhlIGlucHV0IGJ1ZmZlciwgYW5kIGluZnVuKCkgcmV0dXJucyB0aGUgbnVtYmVyIG9mCisgKiBhdmFpbGFibGUgYnl0ZXMgdGhlcmUuICBJZiBpbmZ1bigpIHJldHVybnMgemVybywgdGhlbiBibGFzdCgpIHJldHVybnMgd2l0aAorICogYW4gaW5wdXQgZXJyb3IuICAoYmxhc3QoKSBvbmx5IGFza3MgZm9yIGlucHV0IGlmIGl0IG5lZWRzIGl0LikgIGluaG93IGlzIGZvcgorICogdXNlIGJ5IHRoZSBhcHBsaWNhdGlvbiB0byBwYXNzIGFuIGlucHV0IGRlc2NyaXB0b3IgdG8gaW5mdW4oKSwgaWYgZGVzaXJlZC4KKyAqCisgKiBUaGUgb3V0cHV0IGZ1bmN0aW9uIGlzIGludm9rZWQ6IGVyciA9IG91dGZ1bihob3csIGJ1ZiwgbGVuKSwgd2hlcmUgdGhlIGJ5dGVzCisgKiB0byBiZSB3cml0dGVuIGFyZSBidWZbMC4ubGVuLTFdLiAgSWYgZXJyIGlzIG5vdCB6ZXJvLCB0aGVuIGJsYXN0KCkgcmV0dXJucworICogd2l0aCBhbiBvdXRwdXQgZXJyb3IuICBvdXRmdW4oKSBpcyBhbHdheXMgY2FsbGVkIHdpdGggbGVuIDw9IDQwOTYuICBvdXRob3cKKyAqIGlzIGZvciB1c2UgYnkgdGhlIGFwcGxpY2F0aW9uIHRvIHBhc3MgYW4gb3V0cHV0IGRlc2NyaXB0b3IgdG8gb3V0ZnVuKCksIGlmCisgKiBkZXNpcmVkLgorICoKKyAqIFRoZSByZXR1cm4gY29kZXMgYXJlOgorICoKKyAqICAgMjogIHJhbiBvdXQgb2YgaW5wdXQgYmVmb3JlIGNvbXBsZXRpbmcgZGVjb21wcmVzc2lvbgorICogICAxOiAgb3V0cHV0IGVycm9yIGJlZm9yZSBjb21wbGV0aW5nIGRlY29tcHJlc3Npb24KKyAqICAgMDogIHN1Y2Nlc3NmdWwgZGVjb21wcmVzc2lvbgorICogIC0xOiAgbGl0ZXJhbCBmbGFnIG5vdCB6ZXJvIG9yIG9uZQorICogIC0yOiAgZGljdGlvbmFyeSBzaXplIG5vdCBpbiA0Li42CisgKiAgLTM6ICBkaXN0YW5jZSBpcyB0b28gZmFyIGJhY2sKKyAqCisgKiBBdCB0aGUgYm90dG9tIG9mIGJsYXN0LmMgaXMgYW4gZXhhbXBsZSBwcm9ncmFtIHRoYXQgdXNlcyBibGFzdCgpIHRoYXQgY2FuIGJlCisgKiBjb21waWxlZCB0byBwcm9kdWNlIGEgY29tbWFuZC1saW5lIGRlY29tcHJlc3Npb24gZmlsdGVyIGJ5IGRlZmluaW5nIFRFU1QuCisgKi8KZGlmZiAtLWdpdCBhL3psaWItMS4yLjYvY29udHJpYi9ibGFzdC90ZXN0LnBrIGIvemxpYi0xLjIuNi9jb250cmliL2JsYXN0L3Rlc3QucGsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmUxMGIyYgotLS0gL2Rldi9udWxsCisrKyBiL3psaWItMS4yLjYvY29udHJpYi9ibGFzdC90ZXN0LnBrCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3psaWItMS4yLjYvY29udHJpYi9ibGFzdC90ZXN0LnR4dCBiL3psaWItMS4yLjYvY29udHJpYi9ibGFzdC90ZXN0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmRmMWM1Ci0tLSAvZGV2L251bGwKKysrIGIvemxpYi0xLjIuNi9jb250cmliL2JsYXN0L3Rlc3QudHh0CkBAIC0wLDAgKzEgQEAKK0FJQUlBSUFJQUlBSUEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS96bGliLTEuMi42L2NvbnRyaWIvZGVscGhpL1pMaWIucGFzIGIvemxpYi0xLjIuNi9jb250cmliL2RlbHBoaS9aTGliLnBhcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGFmOGJiCi0tLSAvZGV2L251bGwKKysrIGIvemxpYi0xLjIuNi9jb250cmliL2RlbHBoaS9aTGliLnBhcwpAQCAtMCwwICsxLDU1NyBAQAoreyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKip9Cit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KK3sgICAgICAgQm9ybGFuZCBEZWxwaGkgU3VwcGxlbWVudGFsIENvbXBvbmVudHMgICAgICAgICAgfQoreyAgICAgICBaTElCIERhdGEgQ29tcHJlc3Npb24gSW50ZXJmYWNlIFVuaXQgICAgICAgICAgICB9Cit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KK3sgICAgICAgQ29weXJpZ2h0IChjKSAxOTk3LDk5IEJvcmxhbmQgQ29ycG9yYXRpb24gICAgICAgfQoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Cit7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKn0KKworeyBVcGRhdGVkIGZvciB6bGliIDEuMi54IGJ5IENvc21pbiBUcnV0YSA8Y29zbWludEBjcy51YmJjbHVqLnJvPiB9CisKK3VuaXQgWkxpYjsKKworaW50ZXJmYWNlCisKK3VzZXMgU3lzVXRpbHMsIENsYXNzZXM7CisKK3R5cGUKKyAgVEFsbG9jID0gZnVuY3Rpb24gKEFwcERhdGE6IFBvaW50ZXI7IEl0ZW1zLCBTaXplOiBJbnRlZ2VyKTogUG9pbnRlcjsgY2RlY2w7CisgIFRGcmVlID0gcHJvY2VkdXJlIChBcHBEYXRhLCBCbG9jazogUG9pbnRlcik7IGNkZWNsOworCisgIC8vIEludGVybmFsIHN0cnVjdHVyZS4gIElnbm9yZS4KKyAgVFpTdHJlYW1SZWMgPSBwYWNrZWQgcmVjb3JkCisgICAgbmV4dF9pbjogUENoYXI7ICAgICAgIC8vIG5leHQgaW5wdXQgYnl0ZQorICAgIGF2YWlsX2luOiBJbnRlZ2VyOyAgICAvLyBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlIGF0IG5leHRfaW4KKyAgICB0b3RhbF9pbjogTG9uZ2ludDsgICAgLy8gdG90YWwgbmIgb2YgaW5wdXQgYnl0ZXMgcmVhZCBzbyBmYXIKKworICAgIG5leHRfb3V0OiBQQ2hhcjsgICAgICAvLyBuZXh0IG91dHB1dCBieXRlIHNob3VsZCBiZSBwdXQgaGVyZQorICAgIGF2YWlsX291dDogSW50ZWdlcjsgICAvLyByZW1haW5pbmcgZnJlZSBzcGFjZSBhdCBuZXh0X291dAorICAgIHRvdGFsX291dDogTG9uZ2ludDsgICAvLyB0b3RhbCBuYiBvZiBieXRlcyBvdXRwdXQgc28gZmFyCisKKyAgICBtc2c6IFBDaGFyOyAgICAgICAgICAgLy8gbGFzdCBlcnJvciBtZXNzYWdlLCBOVUxMIGlmIG5vIGVycm9yCisgICAgaW50ZXJuYWw6IFBvaW50ZXI7ICAgIC8vIG5vdCB2aXNpYmxlIGJ5IGFwcGxpY2F0aW9ucworCisgICAgemFsbG9jOiBUQWxsb2M7ICAgICAgIC8vIHVzZWQgdG8gYWxsb2NhdGUgdGhlIGludGVybmFsIHN0YXRlCisgICAgemZyZWU6IFRGcmVlOyAgICAgICAgIC8vIHVzZWQgdG8gZnJlZSB0aGUgaW50ZXJuYWwgc3RhdGUKKyAgICBBcHBEYXRhOiBQb2ludGVyOyAgICAgLy8gcHJpdmF0ZSBkYXRhIG9iamVjdCBwYXNzZWQgdG8gemFsbG9jIGFuZCB6ZnJlZQorCisgICAgZGF0YV90eXBlOiBJbnRlZ2VyOyAgIC8vIGJlc3QgZ3Vlc3MgYWJvdXQgdGhlIGRhdGEgdHlwZTogYXNjaWkgb3IgYmluYXJ5CisgICAgYWRsZXI6IExvbmdpbnQ7ICAgICAgIC8vIGFkbGVyMzIgdmFsdWUgb2YgdGhlIHVuY29tcHJlc3NlZCBkYXRhCisgICAgcmVzZXJ2ZWQ6IExvbmdpbnQ7ICAgIC8vIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlCisgIGVuZDsKKworICAvLyBBYnN0cmFjdCBhbmNlc3RvciBjbGFzcworICBUQ3VzdG9tWmxpYlN0cmVhbSA9IGNsYXNzKFRTdHJlYW0pCisgIHByaXZhdGUKKyAgICBGU3RybTogVFN0cmVhbTsKKyAgICBGU3RybVBvczogSW50ZWdlcjsKKyAgICBGT25Qcm9ncmVzczogVE5vdGlmeUV2ZW50OworICAgIEZaUmVjOiBUWlN0cmVhbVJlYzsKKyAgICBGQnVmZmVyOiBhcnJheSBbV29yZF0gb2YgQ2hhcjsKKyAgcHJvdGVjdGVkCisgICAgcHJvY2VkdXJlIFByb2dyZXNzKFNlbmRlcjogVE9iamVjdCk7IGR5bmFtaWM7CisgICAgcHJvcGVydHkgT25Qcm9ncmVzczogVE5vdGlmeUV2ZW50IHJlYWQgRk9uUHJvZ3Jlc3Mgd3JpdGUgRk9uUHJvZ3Jlc3M7CisgICAgY29uc3RydWN0b3IgQ3JlYXRlKFN0cm06IFRTdHJlYW0pOworICBlbmQ7CisKK3sgVENvbXByZXNzaW9uU3RyZWFtIGNvbXByZXNzZXMgZGF0YSBvbiB0aGUgZmx5IGFzIGRhdGEgaXMgd3JpdHRlbiB0byBpdCwgYW5kCisgIHN0b3JlcyB0aGUgY29tcHJlc3NlZCBkYXRhIHRvIGFub3RoZXIgc3RyZWFtLgorCisgIFRDb21wcmVzc2lvblN0cmVhbSBpcyB3cml0ZS1vbmx5IGFuZCBzdHJpY3RseSBzZXF1ZW50aWFsLiBSZWFkaW5nIGZyb20gdGhlCisgIHN0cmVhbSB3aWxsIHJhaXNlIGFuIGV4Y2VwdGlvbi4gVXNpbmcgU2VlayB0byBtb3ZlIHRoZSBzdHJlYW0gcG9pbnRlcgorICB3aWxsIHJhaXNlIGFuIGV4Y2VwdGlvbi4KKworICBPdXRwdXQgZGF0YSBpcyBjYWNoZWQgaW50ZXJuYWxseSwgd3JpdHRlbiB0byB0aGUgb3V0cHV0IHN0cmVhbSBvbmx5IHdoZW4KKyAgdGhlIGludGVybmFsIG91dHB1dCBidWZmZXIgaXMgZnVsbC4gIEFsbCBwZW5kaW5nIG91dHB1dCBkYXRhIGlzIGZsdXNoZWQKKyAgd2hlbiB0aGUgc3RyZWFtIGlzIGRlc3Ryb3llZC4KKworICBUaGUgUG9zaXRpb24gcHJvcGVydHkgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHVuY29tcHJlc3NlZCBieXRlcyBvZgorICBkYXRhIHRoYXQgaGF2ZSBiZWVuIHdyaXR0ZW4gdG8gdGhlIHN0cmVhbSBzbyBmYXIuCisKKyAgQ29tcHJlc3Npb25SYXRlIHJldHVybnMgdGhlIG9uLXRoZS1mbHkgcGVyY2VudGFnZSBieSB3aGljaCB0aGUgb3JpZ2luYWwKKyAgZGF0YSBoYXMgYmVlbiBjb21wcmVzc2VkOiAgKDEgLSAoQ29tcHJlc3NlZEJ5dGVzIC8gVW5jb21wcmVzc2VkQnl0ZXMpKSAqIDEwMAorICBJZiByYXcgZGF0YSBzaXplID0gMTAwIGFuZCBjb21wcmVzc2VkIGRhdGEgc2l6ZSA9IDI1LCB0aGUgQ29tcHJlc3Npb25SYXRlCisgIGlzIDc1JQorCisgIFRoZSBPblByb2dyZXNzIGV2ZW50IGlzIGNhbGxlZCBlYWNoIHRpbWUgdGhlIG91dHB1dCBidWZmZXIgaXMgZmlsbGVkIGFuZAorICB3cml0dGVuIHRvIHRoZSBvdXRwdXQgc3RyZWFtLiAgVGhpcyBpcyB1c2VmdWwgZm9yIHVwZGF0aW5nIGEgcHJvZ3Jlc3MKKyAgaW5kaWNhdG9yIHdoZW4geW91IGFyZSB3cml0aW5nIGEgbGFyZ2UgY2h1bmsgb2YgZGF0YSB0byB0aGUgY29tcHJlc3Npb24KKyAgc3RyZWFtIGluIGEgc2luZ2xlIGNhbGwufQorCisKKyAgVENvbXByZXNzaW9uTGV2ZWwgPSAoY2xOb25lLCBjbEZhc3Rlc3QsIGNsRGVmYXVsdCwgY2xNYXgpOworCisgIFRDb21wcmVzc2lvblN0cmVhbSA9IGNsYXNzKFRDdXN0b21abGliU3RyZWFtKQorICBwcml2YXRlCisgICAgZnVuY3Rpb24gR2V0Q29tcHJlc3Npb25SYXRlOiBTaW5nbGU7CisgIHB1YmxpYworICAgIGNvbnN0cnVjdG9yIENyZWF0ZShDb21wcmVzc2lvbkxldmVsOiBUQ29tcHJlc3Npb25MZXZlbDsgRGVzdDogVFN0cmVhbSk7CisgICAgZGVzdHJ1Y3RvciBEZXN0cm95OyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkKHZhciBCdWZmZXI7IENvdW50OiBMb25naW50KTogTG9uZ2ludDsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gV3JpdGUoY29uc3QgQnVmZmVyOyBDb3VudDogTG9uZ2ludCk6IExvbmdpbnQ7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFNlZWsoT2Zmc2V0OiBMb25naW50OyBPcmlnaW46IFdvcmQpOiBMb25naW50OyBvdmVycmlkZTsKKyAgICBwcm9wZXJ0eSBDb21wcmVzc2lvblJhdGU6IFNpbmdsZSByZWFkIEdldENvbXByZXNzaW9uUmF0ZTsKKyAgICBwcm9wZXJ0eSBPblByb2dyZXNzOworICBlbmQ7CisKK3sgVERlY29tcHJlc3Npb25TdHJlYW0gZGVjb21wcmVzc2VzIGRhdGEgb24gdGhlIGZseSBhcyBkYXRhIGlzIHJlYWQgZnJvbSBpdC4KKworICBDb21wcmVzc2VkIGRhdGEgY29tZXMgZnJvbSBhIHNlcGFyYXRlIHNvdXJjZSBzdHJlYW0uICBURGVjb21wcmVzc2lvblN0cmVhbQorICBpcyByZWFkLW9ubHkgYW5kIHVuaWRpcmVjdGlvbmFsOyB5b3UgY2FuIHNlZWsgZm9yd2FyZCBpbiB0aGUgc3RyZWFtLCBidXQgbm90CisgIGJhY2t3YXJkcy4gIFRoZSBzcGVjaWFsIGNhc2Ugb2Ygc2V0dGluZyB0aGUgc3RyZWFtIHBvc2l0aW9uIHRvIHplcm8gaXMKKyAgYWxsb3dlZC4gIFNlZWtpbmcgZm9yd2FyZCBkZWNvbXByZXNzZXMgZGF0YSB1bnRpbCB0aGUgcmVxdWVzdGVkIHBvc2l0aW9uIGluCisgIHRoZSB1bmNvbXByZXNzZWQgZGF0YSBoYXMgYmVlbiByZWFjaGVkLiAgU2Vla2luZyBiYWNrd2FyZHMsIHNlZWtpbmcgcmVsYXRpdmUKKyAgdG8gdGhlIGVuZCBvZiB0aGUgc3RyZWFtLCByZXF1ZXN0aW5nIHRoZSBzaXplIG9mIHRoZSBzdHJlYW0sIGFuZCB3cml0aW5nIHRvCisgIHRoZSBzdHJlYW0gd2lsbCByYWlzZSBhbiBleGNlcHRpb24uCisKKyAgVGhlIFBvc2l0aW9uIHByb3BlcnR5IHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBvZiB1bmNvbXByZXNzZWQgZGF0YSB0aGF0CisgIGhhdmUgYmVlbiByZWFkIGZyb20gdGhlIHN0cmVhbSBzbyBmYXIuCisKKyAgVGhlIE9uUHJvZ3Jlc3MgZXZlbnQgaXMgY2FsbGVkIGVhY2ggdGltZSB0aGUgaW50ZXJuYWwgaW5wdXQgYnVmZmVyIG9mCisgIGNvbXByZXNzZWQgZGF0YSBpcyBleGhhdXN0ZWQgYW5kIHRoZSBuZXh0IGJsb2NrIGlzIHJlYWQgZnJvbSB0aGUgaW5wdXQgc3RyZWFtLgorICBUaGlzIGlzIHVzZWZ1bCBmb3IgdXBkYXRpbmcgYSBwcm9ncmVzcyBpbmRpY2F0b3Igd2hlbiB5b3UgYXJlIHJlYWRpbmcgYQorICBsYXJnZSBjaHVuayBvZiBkYXRhIGZyb20gdGhlIGRlY29tcHJlc3Npb24gc3RyZWFtIGluIGEgc2luZ2xlIGNhbGwufQorCisgIFREZWNvbXByZXNzaW9uU3RyZWFtID0gY2xhc3MoVEN1c3RvbVpsaWJTdHJlYW0pCisgIHB1YmxpYworICAgIGNvbnN0cnVjdG9yIENyZWF0ZShTb3VyY2U6IFRTdHJlYW0pOworICAgIGRlc3RydWN0b3IgRGVzdHJveTsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gUmVhZCh2YXIgQnVmZmVyOyBDb3VudDogTG9uZ2ludCk6IExvbmdpbnQ7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFdyaXRlKGNvbnN0IEJ1ZmZlcjsgQ291bnQ6IExvbmdpbnQpOiBMb25naW50OyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBTZWVrKE9mZnNldDogTG9uZ2ludDsgT3JpZ2luOiBXb3JkKTogTG9uZ2ludDsgb3ZlcnJpZGU7CisgICAgcHJvcGVydHkgT25Qcm9ncmVzczsKKyAgZW5kOworCisKKworeyBDb21wcmVzc0J1ZiBjb21wcmVzc2VzIGRhdGEsIGJ1ZmZlciB0byBidWZmZXIsIGluIG9uZSBjYWxsLgorICAgSW46IEluQnVmID0gcHRyIHRvIGNvbXByZXNzZWQgZGF0YQorICAgICAgIEluQnl0ZXMgPSBudW1iZXIgb2YgYnl0ZXMgaW4gSW5CdWYKKyAgT3V0OiBPdXRCdWYgPSBwdHIgdG8gbmV3bHkgYWxsb2NhdGVkIGJ1ZmZlciBjb250YWluaW5nIGRlY29tcHJlc3NlZCBkYXRhCisgICAgICAgT3V0Qnl0ZXMgPSBudW1iZXIgb2YgYnl0ZXMgaW4gT3V0QnVmICAgfQorcHJvY2VkdXJlIENvbXByZXNzQnVmKGNvbnN0IEluQnVmOiBQb2ludGVyOyBJbkJ5dGVzOiBJbnRlZ2VyOworICAgICAgICAgICAgICAgICAgICAgIG91dCBPdXRCdWY6IFBvaW50ZXI7IG91dCBPdXRCeXRlczogSW50ZWdlcik7CisKKworeyBEZWNvbXByZXNzQnVmIGRlY29tcHJlc3NlcyBkYXRhLCBidWZmZXIgdG8gYnVmZmVyLCBpbiBvbmUgY2FsbC4KKyAgIEluOiBJbkJ1ZiA9IHB0ciB0byBjb21wcmVzc2VkIGRhdGEKKyAgICAgICBJbkJ5dGVzID0gbnVtYmVyIG9mIGJ5dGVzIGluIEluQnVmCisgICAgICAgT3V0RXN0aW1hdGUgPSB6ZXJvLCBvciBlc3QuIHNpemUgb2YgdGhlIGRlY29tcHJlc3NlZCBkYXRhCisgIE91dDogT3V0QnVmID0gcHRyIHRvIG5ld2x5IGFsbG9jYXRlZCBidWZmZXIgY29udGFpbmluZyBkZWNvbXByZXNzZWQgZGF0YQorICAgICAgIE91dEJ5dGVzID0gbnVtYmVyIG9mIGJ5dGVzIGluIE91dEJ1ZiAgIH0KK3Byb2NlZHVyZSBEZWNvbXByZXNzQnVmKGNvbnN0IEluQnVmOiBQb2ludGVyOyBJbkJ5dGVzOiBJbnRlZ2VyOworIE91dEVzdGltYXRlOiBJbnRlZ2VyOyBvdXQgT3V0QnVmOiBQb2ludGVyOyBvdXQgT3V0Qnl0ZXM6IEludGVnZXIpOworCit7IERlY29tcHJlc3NUb1VzZXJCdWYgZGVjb21wcmVzc2VzIGRhdGEsIGJ1ZmZlciB0byBidWZmZXIsIGluIG9uZSBjYWxsLgorICAgSW46IEluQnVmID0gcHRyIHRvIGNvbXByZXNzZWQgZGF0YQorICAgICAgIEluQnl0ZXMgPSBudW1iZXIgb2YgYnl0ZXMgaW4gSW5CdWYKKyAgT3V0OiBPdXRCdWYgPSBwdHIgdG8gdXNlci1hbGxvY2F0ZWQgYnVmZmVyIHRvIGNvbnRhaW4gZGVjb21wcmVzc2VkIGRhdGEKKyAgICAgICBCdWZTaXplID0gbnVtYmVyIG9mIGJ5dGVzIGluIE91dEJ1ZiAgIH0KK3Byb2NlZHVyZSBEZWNvbXByZXNzVG9Vc2VyQnVmKGNvbnN0IEluQnVmOiBQb2ludGVyOyBJbkJ5dGVzOiBJbnRlZ2VyOworICBjb25zdCBPdXRCdWY6IFBvaW50ZXI7IEJ1ZlNpemU6IEludGVnZXIpOworCitjb25zdAorICB6bGliX3ZlcnNpb24gPSAnMS4yLjYnOworCit0eXBlCisgIEVabGliRXJyb3IgPSBjbGFzcyhFeGNlcHRpb24pOworICBFQ29tcHJlc3Npb25FcnJvciA9IGNsYXNzKEVabGliRXJyb3IpOworICBFRGVjb21wcmVzc2lvbkVycm9yID0gY2xhc3MoRVpsaWJFcnJvcik7CisKK2ltcGxlbWVudGF0aW9uCisKK3VzZXMgWkxpYkNvbnN0OworCitjb25zdAorICBaX05PX0ZMVVNIICAgICAgPSAwOworICBaX1BBUlRJQUxfRkxVU0ggPSAxOworICBaX1NZTkNfRkxVU0ggICAgPSAyOworICBaX0ZVTExfRkxVU0ggICAgPSAzOworICBaX0ZJTklTSCAgICAgICAgPSA0OworCisgIFpfT0sgICAgICAgICAgICA9IDA7CisgIFpfU1RSRUFNX0VORCAgICA9IDE7CisgIFpfTkVFRF9ESUNUICAgICA9IDI7CisgIFpfRVJSTk8gICAgICAgICA9ICgtMSk7CisgIFpfU1RSRUFNX0VSUk9SICA9ICgtMik7CisgIFpfREFUQV9FUlJPUiAgICA9ICgtMyk7CisgIFpfTUVNX0VSUk9SICAgICA9ICgtNCk7CisgIFpfQlVGX0VSUk9SICAgICA9ICgtNSk7CisgIFpfVkVSU0lPTl9FUlJPUiA9ICgtNik7CisKKyAgWl9OT19DT01QUkVTU0lPTiAgICAgICA9ICAgMDsKKyAgWl9CRVNUX1NQRUVEICAgICAgICAgICA9ICAgMTsKKyAgWl9CRVNUX0NPTVBSRVNTSU9OICAgICA9ICAgOTsKKyAgWl9ERUZBVUxUX0NPTVBSRVNTSU9OICA9ICgtMSk7CisKKyAgWl9GSUxURVJFRCAgICAgICAgICAgID0gMTsKKyAgWl9IVUZGTUFOX09OTFkgICAgICAgID0gMjsKKyAgWl9STEUgICAgICAgICAgICAgICAgID0gMzsKKyAgWl9ERUZBVUxUX1NUUkFURUdZICAgID0gMDsKKworICBaX0JJTkFSWSAgID0gMDsKKyAgWl9BU0NJSSAgICA9IDE7CisgIFpfVU5LTk9XTiAgPSAyOworCisgIFpfREVGTEFURUQgPSA4OworCisKK3skTCBhZGxlcjMyLm9ian0KK3skTCBjb21wcmVzcy5vYmp9Cit7JEwgY3JjMzIub2JqfQoreyRMIGRlZmxhdGUub2JqfQoreyRMIGluZmJhY2sub2JqfQoreyRMIGluZmZhc3Qub2JqfQoreyRMIGluZmxhdGUub2JqfQoreyRMIGluZnRyZWVzLm9ian0KK3skTCB0cmVlcy5vYmp9Cit7JEwgdW5jb21wci5vYmp9Cit7JEwgenV0aWwub2JqfQorCitwcm9jZWR1cmUgYWRsZXIzMjsgZXh0ZXJuYWw7Citwcm9jZWR1cmUgY29tcHJlc3NCb3VuZDsgZXh0ZXJuYWw7Citwcm9jZWR1cmUgY3JjMzI7IGV4dGVybmFsOworcHJvY2VkdXJlIGRlZmxhdGVJbml0Ml87IGV4dGVybmFsOworcHJvY2VkdXJlIGRlZmxhdGVQYXJhbXM7IGV4dGVybmFsOworCitmdW5jdGlvbiBfbWFsbG9jKFNpemU6IEludGVnZXIpOiBQb2ludGVyOyBjZGVjbDsKK2JlZ2luCisgIFJlc3VsdCA6PSBBbGxvY01lbShTaXplKTsKK2VuZDsKKworcHJvY2VkdXJlIF9mcmVlKEJsb2NrOiBQb2ludGVyKTsgY2RlY2w7CitiZWdpbgorICBGcmVlTWVtKEJsb2NrKTsKK2VuZDsKKworcHJvY2VkdXJlIF9tZW1zZXQoUDogUG9pbnRlcjsgQjogQnl0ZTsgY291bnQ6IEludGVnZXIpOyBjZGVjbDsKK2JlZ2luCisgIEZpbGxDaGFyKFBeLCBjb3VudCwgQik7CitlbmQ7CisKK3Byb2NlZHVyZSBfbWVtY3B5KGRlc3QsIHNvdXJjZTogUG9pbnRlcjsgY291bnQ6IEludGVnZXIpOyBjZGVjbDsKK2JlZ2luCisgIE1vdmUoc291cmNlXiwgZGVzdF4sIGNvdW50KTsKK2VuZDsKKworCisKKy8vIGRlZmxhdGUgY29tcHJlc3NlcyBkYXRhCitmdW5jdGlvbiBkZWZsYXRlSW5pdF8odmFyIHN0cm06IFRaU3RyZWFtUmVjOyBsZXZlbDogSW50ZWdlcjsgdmVyc2lvbjogUENoYXI7CisgIHJlY3NpemU6IEludGVnZXIpOiBJbnRlZ2VyOyBleHRlcm5hbDsKK2Z1bmN0aW9uIGRlZmxhdGUodmFyIHN0cm06IFRaU3RyZWFtUmVjOyBmbHVzaDogSW50ZWdlcik6IEludGVnZXI7IGV4dGVybmFsOworZnVuY3Rpb24gZGVmbGF0ZUVuZCh2YXIgc3RybTogVFpTdHJlYW1SZWMpOiBJbnRlZ2VyOyBleHRlcm5hbDsKKworLy8gaW5mbGF0ZSBkZWNvbXByZXNzZXMgZGF0YQorZnVuY3Rpb24gaW5mbGF0ZUluaXRfKHZhciBzdHJtOiBUWlN0cmVhbVJlYzsgdmVyc2lvbjogUENoYXI7CisgIHJlY3NpemU6IEludGVnZXIpOiBJbnRlZ2VyOyBleHRlcm5hbDsKK2Z1bmN0aW9uIGluZmxhdGUodmFyIHN0cm06IFRaU3RyZWFtUmVjOyBmbHVzaDogSW50ZWdlcik6IEludGVnZXI7IGV4dGVybmFsOworZnVuY3Rpb24gaW5mbGF0ZUVuZCh2YXIgc3RybTogVFpTdHJlYW1SZWMpOiBJbnRlZ2VyOyBleHRlcm5hbDsKK2Z1bmN0aW9uIGluZmxhdGVSZXNldCh2YXIgc3RybTogVFpTdHJlYW1SZWMpOiBJbnRlZ2VyOyBleHRlcm5hbDsKKworCitmdW5jdGlvbiB6bGliQWxsb2NNZW0oQXBwRGF0YTogUG9pbnRlcjsgSXRlbXMsIFNpemU6IEludGVnZXIpOiBQb2ludGVyOyBjZGVjbDsKK2JlZ2luCisvLyAgR2V0TWVtKFJlc3VsdCwgSXRlbXMqU2l6ZSk7CisgIFJlc3VsdCA6PSBBbGxvY01lbShJdGVtcyAqIFNpemUpOworZW5kOworCitwcm9jZWR1cmUgemxpYkZyZWVNZW0oQXBwRGF0YSwgQmxvY2s6IFBvaW50ZXIpOyBjZGVjbDsKK2JlZ2luCisgIEZyZWVNZW0oQmxvY2spOworZW5kOworCit7ZnVuY3Rpb24gemxpYkNoZWNrKGNvZGU6IEludGVnZXIpOiBJbnRlZ2VyOworYmVnaW4KKyAgUmVzdWx0IDo9IGNvZGU7CisgIGlmIGNvZGUgPCAwIHRoZW4KKyAgICByYWlzZSBFWmxpYkVycm9yLkNyZWF0ZSgnZXJyb3InKTsgICAgLy8hIQorZW5kO30KKworZnVuY3Rpb24gQ0NoZWNrKGNvZGU6IEludGVnZXIpOiBJbnRlZ2VyOworYmVnaW4KKyAgUmVzdWx0IDo9IGNvZGU7CisgIGlmIGNvZGUgPCAwIHRoZW4KKyAgICByYWlzZSBFQ29tcHJlc3Npb25FcnJvci5DcmVhdGUoJ2Vycm9yJyk7IC8vISEKK2VuZDsKKworZnVuY3Rpb24gRENoZWNrKGNvZGU6IEludGVnZXIpOiBJbnRlZ2VyOworYmVnaW4KKyAgUmVzdWx0IDo9IGNvZGU7CisgIGlmIGNvZGUgPCAwIHRoZW4KKyAgICByYWlzZSBFRGVjb21wcmVzc2lvbkVycm9yLkNyZWF0ZSgnZXJyb3InKTsgIC8vISEKK2VuZDsKKworcHJvY2VkdXJlIENvbXByZXNzQnVmKGNvbnN0IEluQnVmOiBQb2ludGVyOyBJbkJ5dGVzOiBJbnRlZ2VyOworICAgICAgICAgICAgICAgICAgICAgIG91dCBPdXRCdWY6IFBvaW50ZXI7IG91dCBPdXRCeXRlczogSW50ZWdlcik7Cit2YXIKKyAgc3RybTogVFpTdHJlYW1SZWM7CisgIFA6IFBvaW50ZXI7CitiZWdpbgorICBGaWxsQ2hhcihzdHJtLCBzaXplb2Yoc3RybSksIDApOworICBzdHJtLnphbGxvYyA6PSB6bGliQWxsb2NNZW07CisgIHN0cm0uemZyZWUgOj0gemxpYkZyZWVNZW07CisgIE91dEJ5dGVzIDo9ICgoSW5CeXRlcyArIChJbkJ5dGVzIGRpdiAxMCkgKyAxMikgKyAyNTUpIGFuZCBub3QgMjU1OworICBHZXRNZW0oT3V0QnVmLCBPdXRCeXRlcyk7CisgIHRyeQorICAgIHN0cm0ubmV4dF9pbiA6PSBJbkJ1ZjsKKyAgICBzdHJtLmF2YWlsX2luIDo9IEluQnl0ZXM7CisgICAgc3RybS5uZXh0X291dCA6PSBPdXRCdWY7CisgICAgc3RybS5hdmFpbF9vdXQgOj0gT3V0Qnl0ZXM7CisgICAgQ0NoZWNrKGRlZmxhdGVJbml0XyhzdHJtLCBaX0JFU1RfQ09NUFJFU1NJT04sIHpsaWJfdmVyc2lvbiwgc2l6ZW9mKHN0cm0pKSk7CisgICAgdHJ5CisgICAgICB3aGlsZSBDQ2hlY2soZGVmbGF0ZShzdHJtLCBaX0ZJTklTSCkpIDw+IFpfU1RSRUFNX0VORCBkbworICAgICAgYmVnaW4KKyAgICAgICAgUCA6PSBPdXRCdWY7CisgICAgICAgIEluYyhPdXRCeXRlcywgMjU2KTsKKyAgICAgICAgUmVhbGxvY01lbShPdXRCdWYsIE91dEJ5dGVzKTsKKyAgICAgICAgc3RybS5uZXh0X291dCA6PSBQQ2hhcihJbnRlZ2VyKE91dEJ1ZikgKyAoSW50ZWdlcihzdHJtLm5leHRfb3V0KSAtIEludGVnZXIoUCkpKTsKKyAgICAgICAgc3RybS5hdmFpbF9vdXQgOj0gMjU2OworICAgICAgZW5kOworICAgIGZpbmFsbHkKKyAgICAgIENDaGVjayhkZWZsYXRlRW5kKHN0cm0pKTsKKyAgICBlbmQ7CisgICAgUmVhbGxvY01lbShPdXRCdWYsIHN0cm0udG90YWxfb3V0KTsKKyAgICBPdXRCeXRlcyA6PSBzdHJtLnRvdGFsX291dDsKKyAgZXhjZXB0CisgICAgRnJlZU1lbShPdXRCdWYpOworICAgIHJhaXNlCisgIGVuZDsKK2VuZDsKKworCitwcm9jZWR1cmUgRGVjb21wcmVzc0J1Zihjb25zdCBJbkJ1ZjogUG9pbnRlcjsgSW5CeXRlczogSW50ZWdlcjsKKyAgT3V0RXN0aW1hdGU6IEludGVnZXI7IG91dCBPdXRCdWY6IFBvaW50ZXI7IG91dCBPdXRCeXRlczogSW50ZWdlcik7Cit2YXIKKyAgc3RybTogVFpTdHJlYW1SZWM7CisgIFA6IFBvaW50ZXI7CisgIEJ1ZkluYzogSW50ZWdlcjsKK2JlZ2luCisgIEZpbGxDaGFyKHN0cm0sIHNpemVvZihzdHJtKSwgMCk7CisgIHN0cm0uemFsbG9jIDo9IHpsaWJBbGxvY01lbTsKKyAgc3RybS56ZnJlZSA6PSB6bGliRnJlZU1lbTsKKyAgQnVmSW5jIDo9IChJbkJ5dGVzICsgMjU1KSBhbmQgbm90IDI1NTsKKyAgaWYgT3V0RXN0aW1hdGUgPSAwIHRoZW4KKyAgICBPdXRCeXRlcyA6PSBCdWZJbmMKKyAgZWxzZQorICAgIE91dEJ5dGVzIDo9IE91dEVzdGltYXRlOworICBHZXRNZW0oT3V0QnVmLCBPdXRCeXRlcyk7CisgIHRyeQorICAgIHN0cm0ubmV4dF9pbiA6PSBJbkJ1ZjsKKyAgICBzdHJtLmF2YWlsX2luIDo9IEluQnl0ZXM7CisgICAgc3RybS5uZXh0X291dCA6PSBPdXRCdWY7CisgICAgc3RybS5hdmFpbF9vdXQgOj0gT3V0Qnl0ZXM7CisgICAgRENoZWNrKGluZmxhdGVJbml0XyhzdHJtLCB6bGliX3ZlcnNpb24sIHNpemVvZihzdHJtKSkpOworICAgIHRyeQorICAgICAgd2hpbGUgRENoZWNrKGluZmxhdGUoc3RybSwgWl9OT19GTFVTSCkpIDw+IFpfU1RSRUFNX0VORCBkbworICAgICAgYmVnaW4KKyAgICAgICAgUCA6PSBPdXRCdWY7CisgICAgICAgIEluYyhPdXRCeXRlcywgQnVmSW5jKTsKKyAgICAgICAgUmVhbGxvY01lbShPdXRCdWYsIE91dEJ5dGVzKTsKKyAgICAgICAgc3RybS5uZXh0X291dCA6PSBQQ2hhcihJbnRlZ2VyKE91dEJ1ZikgKyAoSW50ZWdlcihzdHJtLm5leHRfb3V0KSAtIEludGVnZXIoUCkpKTsKKyAgICAgICAgc3RybS5hdmFpbF9vdXQgOj0gQnVmSW5jOworICAgICAgZW5kOworICAgIGZpbmFsbHkKKyAgICAgIERDaGVjayhpbmZsYXRlRW5kKHN0cm0pKTsKKyAgICBlbmQ7CisgICAgUmVhbGxvY01lbShPdXRCdWYsIHN0cm0udG90YWxfb3V0KTsKKyAgICBPdXRCeXRlcyA6PSBzdHJtLnRvdGFsX291dDsKKyAgZXhjZXB0CisgICAgRnJlZU1lbShPdXRCdWYpOworICAgIHJhaXNlCisgIGVuZDsKK2VuZDsKKworcHJvY2VkdXJlIERlY29tcHJlc3NUb1VzZXJCdWYoY29uc3QgSW5CdWY6IFBvaW50ZXI7IEluQnl0ZXM6IEludGVnZXI7CisgIGNvbnN0IE91dEJ1ZjogUG9pbnRlcjsgQnVmU2l6ZTogSW50ZWdlcik7Cit2YXIKKyAgc3RybTogVFpTdHJlYW1SZWM7CitiZWdpbgorICBGaWxsQ2hhcihzdHJtLCBzaXplb2Yoc3RybSksIDApOworICBzdHJtLnphbGxvYyA6PSB6bGliQWxsb2NNZW07CisgIHN0cm0uemZyZWUgOj0gemxpYkZyZWVNZW07CisgIHN0cm0ubmV4dF9pbiA6PSBJbkJ1ZjsKKyAgc3RybS5hdmFpbF9pbiA6PSBJbkJ5dGVzOworICBzdHJtLm5leHRfb3V0IDo9IE91dEJ1ZjsKKyAgc3RybS5hdmFpbF9vdXQgOj0gQnVmU2l6ZTsKKyAgRENoZWNrKGluZmxhdGVJbml0XyhzdHJtLCB6bGliX3ZlcnNpb24sIHNpemVvZihzdHJtKSkpOworICB0cnkKKyAgICBpZiBEQ2hlY2soaW5mbGF0ZShzdHJtLCBaX0ZJTklTSCkpIDw+IFpfU1RSRUFNX0VORCB0aGVuCisgICAgICByYWlzZSBFWmxpYkVycm9yLkNyZWF0ZVJlcyhAc1RhcmdldEJ1ZmZlclRvb1NtYWxsKTsKKyAgZmluYWxseQorICAgIERDaGVjayhpbmZsYXRlRW5kKHN0cm0pKTsKKyAgZW5kOworZW5kOworCisvLyBUQ3VzdG9tWmxpYlN0cmVhbQorCitjb25zdHJ1Y3RvciBUQ3VzdG9tWkxpYlN0cmVhbS5DcmVhdGUoU3RybTogVFN0cmVhbSk7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlOworICBGU3RybSA6PSBTdHJtOworICBGU3RybVBvcyA6PSBTdHJtLlBvc2l0aW9uOworICBGWlJlYy56YWxsb2MgOj0gemxpYkFsbG9jTWVtOworICBGWlJlYy56ZnJlZSA6PSB6bGliRnJlZU1lbTsKK2VuZDsKKworcHJvY2VkdXJlIFRDdXN0b21aTGliU3RyZWFtLlByb2dyZXNzKFNlbmRlcjogVE9iamVjdCk7CitiZWdpbgorICBpZiBBc3NpZ25lZChGT25Qcm9ncmVzcykgdGhlbiBGT25Qcm9ncmVzcyhTZW5kZXIpOworZW5kOworCisKKy8vIFRDb21wcmVzc2lvblN0cmVhbQorCitjb25zdHJ1Y3RvciBUQ29tcHJlc3Npb25TdHJlYW0uQ3JlYXRlKENvbXByZXNzaW9uTGV2ZWw6IFRDb21wcmVzc2lvbkxldmVsOworICBEZXN0OiBUU3RyZWFtKTsKK2NvbnN0CisgIExldmVsczogYXJyYXkgW1RDb21wcmVzc2lvbkxldmVsXSBvZiBTaG9ydEludCA9CisgICAgKFpfTk9fQ09NUFJFU1NJT04sIFpfQkVTVF9TUEVFRCwgWl9ERUZBVUxUX0NPTVBSRVNTSU9OLCBaX0JFU1RfQ09NUFJFU1NJT04pOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZShEZXN0KTsKKyAgRlpSZWMubmV4dF9vdXQgOj0gRkJ1ZmZlcjsKKyAgRlpSZWMuYXZhaWxfb3V0IDo9IHNpemVvZihGQnVmZmVyKTsKKyAgQ0NoZWNrKGRlZmxhdGVJbml0XyhGWlJlYywgTGV2ZWxzW0NvbXByZXNzaW9uTGV2ZWxdLCB6bGliX3ZlcnNpb24sIHNpemVvZihGWlJlYykpKTsKK2VuZDsKKworZGVzdHJ1Y3RvciBUQ29tcHJlc3Npb25TdHJlYW0uRGVzdHJveTsKK2JlZ2luCisgIEZaUmVjLm5leHRfaW4gOj0gbmlsOworICBGWlJlYy5hdmFpbF9pbiA6PSAwOworICB0cnkKKyAgICBpZiBGU3RybS5Qb3NpdGlvbiA8PiBGU3RybVBvcyB0aGVuIEZTdHJtLlBvc2l0aW9uIDo9IEZTdHJtUG9zOworICAgIHdoaWxlIChDQ2hlY2soZGVmbGF0ZShGWlJlYywgWl9GSU5JU0gpKSA8PiBaX1NUUkVBTV9FTkQpCisgICAgICBhbmQgKEZaUmVjLmF2YWlsX291dCA9IDApIGRvCisgICAgYmVnaW4KKyAgICAgIEZTdHJtLldyaXRlQnVmZmVyKEZCdWZmZXIsIHNpemVvZihGQnVmZmVyKSk7CisgICAgICBGWlJlYy5uZXh0X291dCA6PSBGQnVmZmVyOworICAgICAgRlpSZWMuYXZhaWxfb3V0IDo9IHNpemVvZihGQnVmZmVyKTsKKyAgICBlbmQ7CisgICAgaWYgRlpSZWMuYXZhaWxfb3V0IDwgc2l6ZW9mKEZCdWZmZXIpIHRoZW4KKyAgICAgIEZTdHJtLldyaXRlQnVmZmVyKEZCdWZmZXIsIHNpemVvZihGQnVmZmVyKSAtIEZaUmVjLmF2YWlsX291dCk7CisgIGZpbmFsbHkKKyAgICBkZWZsYXRlRW5kKEZaUmVjKTsKKyAgZW5kOworICBpbmhlcml0ZWQgRGVzdHJveTsKK2VuZDsKKworZnVuY3Rpb24gVENvbXByZXNzaW9uU3RyZWFtLlJlYWQodmFyIEJ1ZmZlcjsgQ291bnQ6IExvbmdpbnQpOiBMb25naW50OworYmVnaW4KKyAgcmFpc2UgRUNvbXByZXNzaW9uRXJyb3IuQ3JlYXRlUmVzKEBzSW52YWxpZFN0cmVhbU9wKTsKK2VuZDsKKworZnVuY3Rpb24gVENvbXByZXNzaW9uU3RyZWFtLldyaXRlKGNvbnN0IEJ1ZmZlcjsgQ291bnQ6IExvbmdpbnQpOiBMb25naW50OworYmVnaW4KKyAgRlpSZWMubmV4dF9pbiA6PSBAQnVmZmVyOworICBGWlJlYy5hdmFpbF9pbiA6PSBDb3VudDsKKyAgaWYgRlN0cm0uUG9zaXRpb24gPD4gRlN0cm1Qb3MgdGhlbiBGU3RybS5Qb3NpdGlvbiA6PSBGU3RybVBvczsKKyAgd2hpbGUgKEZaUmVjLmF2YWlsX2luID4gMCkgZG8KKyAgYmVnaW4KKyAgICBDQ2hlY2soZGVmbGF0ZShGWlJlYywgMCkpOworICAgIGlmIEZaUmVjLmF2YWlsX291dCA9IDAgdGhlbgorICAgIGJlZ2luCisgICAgICBGU3RybS5Xcml0ZUJ1ZmZlcihGQnVmZmVyLCBzaXplb2YoRkJ1ZmZlcikpOworICAgICAgRlpSZWMubmV4dF9vdXQgOj0gRkJ1ZmZlcjsKKyAgICAgIEZaUmVjLmF2YWlsX291dCA6PSBzaXplb2YoRkJ1ZmZlcik7CisgICAgICBGU3RybVBvcyA6PSBGU3RybS5Qb3NpdGlvbjsKKyAgICAgIFByb2dyZXNzKFNlbGYpOworICAgIGVuZDsKKyAgZW5kOworICBSZXN1bHQgOj0gQ291bnQ7CitlbmQ7CisKK2Z1bmN0aW9uIFRDb21wcmVzc2lvblN0cmVhbS5TZWVrKE9mZnNldDogTG9uZ2ludDsgT3JpZ2luOiBXb3JkKTogTG9uZ2ludDsKK2JlZ2luCisgIGlmIChPZmZzZXQgPSAwKSBhbmQgKE9yaWdpbiA9IHNvRnJvbUN1cnJlbnQpIHRoZW4KKyAgICBSZXN1bHQgOj0gRlpSZWMudG90YWxfaW4KKyAgZWxzZQorICAgIHJhaXNlIEVDb21wcmVzc2lvbkVycm9yLkNyZWF0ZVJlcyhAc0ludmFsaWRTdHJlYW1PcCk7CitlbmQ7CisKK2Z1bmN0aW9uIFRDb21wcmVzc2lvblN0cmVhbS5HZXRDb21wcmVzc2lvblJhdGU6IFNpbmdsZTsKK2JlZ2luCisgIGlmIEZaUmVjLnRvdGFsX2luID0gMCB0aGVuCisgICAgUmVzdWx0IDo9IDAKKyAgZWxzZQorICAgIFJlc3VsdCA6PSAoMS4wIC0gKEZaUmVjLnRvdGFsX291dCAvIEZaUmVjLnRvdGFsX2luKSkgKiAxMDAuMDsKK2VuZDsKKworCisvLyBURGVjb21wcmVzc2lvblN0cmVhbQorCitjb25zdHJ1Y3RvciBURGVjb21wcmVzc2lvblN0cmVhbS5DcmVhdGUoU291cmNlOiBUU3RyZWFtKTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGUoU291cmNlKTsKKyAgRlpSZWMubmV4dF9pbiA6PSBGQnVmZmVyOworICBGWlJlYy5hdmFpbF9pbiA6PSAwOworICBEQ2hlY2soaW5mbGF0ZUluaXRfKEZaUmVjLCB6bGliX3ZlcnNpb24sIHNpemVvZihGWlJlYykpKTsKK2VuZDsKKworZGVzdHJ1Y3RvciBURGVjb21wcmVzc2lvblN0cmVhbS5EZXN0cm95OworYmVnaW4KKyAgRlN0cm0uU2VlaygtRlpSZWMuYXZhaWxfaW4sIDEpOworICBpbmZsYXRlRW5kKEZaUmVjKTsKKyAgaW5oZXJpdGVkIERlc3Ryb3k7CitlbmQ7CisKK2Z1bmN0aW9uIFREZWNvbXByZXNzaW9uU3RyZWFtLlJlYWQodmFyIEJ1ZmZlcjsgQ291bnQ6IExvbmdpbnQpOiBMb25naW50OworYmVnaW4KKyAgRlpSZWMubmV4dF9vdXQgOj0gQEJ1ZmZlcjsKKyAgRlpSZWMuYXZhaWxfb3V0IDo9IENvdW50OworICBpZiBGU3RybS5Qb3NpdGlvbiA8PiBGU3RybVBvcyB0aGVuIEZTdHJtLlBvc2l0aW9uIDo9IEZTdHJtUG9zOworICB3aGlsZSAoRlpSZWMuYXZhaWxfb3V0ID4gMCkgZG8KKyAgYmVnaW4KKyAgICBpZiBGWlJlYy5hdmFpbF9pbiA9IDAgdGhlbgorICAgIGJlZ2luCisgICAgICBGWlJlYy5hdmFpbF9pbiA6PSBGU3RybS5SZWFkKEZCdWZmZXIsIHNpemVvZihGQnVmZmVyKSk7CisgICAgICBpZiBGWlJlYy5hdmFpbF9pbiA9IDAgdGhlbgorICAgICAgYmVnaW4KKyAgICAgICAgUmVzdWx0IDo9IENvdW50IC0gRlpSZWMuYXZhaWxfb3V0OworICAgICAgICBFeGl0OworICAgICAgZW5kOworICAgICAgRlpSZWMubmV4dF9pbiA6PSBGQnVmZmVyOworICAgICAgRlN0cm1Qb3MgOj0gRlN0cm0uUG9zaXRpb247CisgICAgICBQcm9ncmVzcyhTZWxmKTsKKyAgICBlbmQ7CisgICAgQ0NoZWNrKGluZmxhdGUoRlpSZWMsIDApKTsKKyAgZW5kOworICBSZXN1bHQgOj0gQ291bnQ7CitlbmQ7CisKK2Z1bmN0aW9uIFREZWNvbXByZXNzaW9uU3RyZWFtLldyaXRlKGNvbnN0IEJ1ZmZlcjsgQ291bnQ6IExvbmdpbnQpOiBMb25naW50OworYmVnaW4KKyAgcmFpc2UgRURlY29tcHJlc3Npb25FcnJvci5DcmVhdGVSZXMoQHNJbnZhbGlkU3RyZWFtT3ApOworZW5kOworCitmdW5jdGlvbiBURGVjb21wcmVzc2lvblN0cmVhbS5TZWVrKE9mZnNldDogTG9uZ2ludDsgT3JpZ2luOiBXb3JkKTogTG9uZ2ludDsKK3ZhcgorICBJOiBJbnRlZ2VyOworICBCdWY6IGFycmF5IFswLi40MDk1XSBvZiBDaGFyOworYmVnaW4KKyAgaWYgKE9mZnNldCA9IDApIGFuZCAoT3JpZ2luID0gc29Gcm9tQmVnaW5uaW5nKSB0aGVuCisgIGJlZ2luCisgICAgRENoZWNrKGluZmxhdGVSZXNldChGWlJlYykpOworICAgIEZaUmVjLm5leHRfaW4gOj0gRkJ1ZmZlcjsKKyAgICBGWlJlYy5hdmFpbF9pbiA6PSAwOworICAgIEZTdHJtLlBvc2l0aW9uIDo9IDA7CisgICAgRlN0cm1Qb3MgOj0gMDsKKyAgZW5kCisgIGVsc2UgaWYgKCAoT2Zmc2V0ID49IDApIGFuZCAoT3JpZ2luID0gc29Gcm9tQ3VycmVudCkpIG9yCisgICAgICAgICAgKCAoKE9mZnNldCAtIEZaUmVjLnRvdGFsX291dCkgPiAwKSBhbmQgKE9yaWdpbiA9IHNvRnJvbUJlZ2lubmluZykpIHRoZW4KKyAgYmVnaW4KKyAgICBpZiBPcmlnaW4gPSBzb0Zyb21CZWdpbm5pbmcgdGhlbiBEZWMoT2Zmc2V0LCBGWlJlYy50b3RhbF9vdXQpOworICAgIGlmIE9mZnNldCA+IDAgdGhlbgorICAgIGJlZ2luCisgICAgICBmb3IgSSA6PSAxIHRvIE9mZnNldCBkaXYgc2l6ZW9mKEJ1ZikgZG8KKyAgICAgICAgUmVhZEJ1ZmZlcihCdWYsIHNpemVvZihCdWYpKTsKKyAgICAgIFJlYWRCdWZmZXIoQnVmLCBPZmZzZXQgbW9kIHNpemVvZihCdWYpKTsKKyAgICBlbmQ7CisgIGVuZAorICBlbHNlCisgICAgcmFpc2UgRURlY29tcHJlc3Npb25FcnJvci5DcmVhdGVSZXMoQHNJbnZhbGlkU3RyZWFtT3ApOworICBSZXN1bHQgOj0gRlpSZWMudG90YWxfb3V0OworZW5kOworCisKK2VuZC4KZGlmZiAtLWdpdCBhL3psaWItMS4yLjYvY29udHJpYi9kZWxwaGkvWkxpYkNvbnN0LnBhcyBiL3psaWItMS4yLjYvY29udHJpYi9kZWxwaGkvWkxpYkNvbnN0LnBhcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGZlMTM2Ci0tLSAvZGV2L251bGwKKysrIGIvemxpYi0xLjIuNi9jb250cmliL2RlbHBoaS9aTGliQ29uc3QucGFzCkBAIC0wLDAgKzEsMTEgQEAKK3VuaXQgWkxpYkNvbnN0OworCitpbnRlcmZhY2UKKworcmVzb3VyY2VzdHJpbmcKKyAgc1RhcmdldEJ1ZmZlclRvb1NtYWxsID0gJ1pMaWIgZXJyb3I6IHRhcmdldCBidWZmZXIgbWF5IGJlIHRvbyBzbWFsbCc7CisgIHNJbnZhbGlkU3RyZWFtT3AgPSAnSW52YWxpZCBzdHJlYW0gb3BlcmF0aW9uJzsKKworaW1wbGVtZW50YXRpb24KKworZW5kLgpkaWZmIC0tZ2l0IGEvemxpYi0xLjIuNi9jb250cmliL2RlbHBoaS9yZWFkbWUudHh0IGIvemxpYi0xLjIuNi9jb250cmliL2RlbHBoaS9yZWFkbWUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkYzlhOGIKLS0tIC9kZXYvbnVsbAorKysgYi96bGliLTEuMi42L2NvbnRyaWIvZGVscGhpL3JlYWRtZS50eHQKQEAgLTAsMCArMSw3NiBAQAorCitPdmVydmlldworPT09PT09PT0KKworVGhpcyBkaXJlY3RvcnkgY29udGFpbnMgYW4gdXBkYXRlIHRvIHRoZSBaTGliIGludGVyZmFjZSB1bml0LAorZGlzdHJpYnV0ZWQgYnkgQm9ybGFuZCBhcyBhIERlbHBoaSBzdXBwbGVtZW50YWwgY29tcG9uZW50LgorCitUaGUgb3JpZ2luYWwgWkxpYiB1bml0IGlzIENvcHlyaWdodCAoYykgMTk5Nyw5OSBCb3JsYW5kIENvcnAuLAorYW5kIGlzIGJhc2VkIG9uIHpsaWIgdmVyc2lvbiAxLjAuNC4gIFRoZXJlIGFyZSBhIHNlcmllcyBvZiBidWdzCithbmQgc2VjdXJpdHkgcHJvYmxlbXMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgb2xkIHpsaWIgdmVyc2lvbiwgYW5kCit3ZSByZWNvbW1lbmQgdGhlIHVzZXJzIHRvIHVwZGF0ZSB0aGVpciBaTGliIHVuaXQuCisKKworU3VtbWFyeSBvZiBtb2RpZmljYXRpb25zCis9PT09PT09PT09PT09PT09PT09PT09PT0KKworLSBJbXByb3ZlZCBtYWtlZmlsZSwgYWRhcHRlZCB0byB6bGliIHZlcnNpb24gMS4yLjEuCisKKy0gU29tZSBmaWVsZCB0eXBlcyBmcm9tIFRaU3RyZWFtUmVjIGFyZSBjaGFuZ2VkIGZyb20gSW50ZWdlciB0bworICBMb25naW50LCBmb3IgY29uc2lzdGVuY3kgd2l0aCB0aGUgemxpYi5oIGhlYWRlciwgYW5kIGZvciA2NC1iaXQKKyAgcmVhZGluZXNzLgorCistIFRoZSB6bGliX3ZlcnNpb24gY29uc3RhbnQgaXMgdXBkYXRlZC4KKworLSBUaGUgbmV3IFpfUkxFIHN0cmF0ZWd5IGhhcyBpdHMgY29ycmVzcG9uZGluZyBzeW1ib2xpYyBjb25zdGFudC4KKworLSBUaGUgYWxsb2NhdGlvbiBhbmQgZGVhbGxvY2F0aW9uIGZ1bmN0aW9ucyBhbmQgZnVuY3Rpb24gdHlwZXMKKyAgKFRBbGxvYywgVEZyZWUsIHpsaWJBbGxvY01lbSBhbmQgemxpYkZyZWVNZW0pIGFyZSBub3cgY2RlY2wsCisgIGFuZCBfbWFsbG9jIGFuZCBfZnJlZSBhcmUgYWRkZWQgYXMgQyBSVEwgc3R1YnMuICBBcyBhIHJlc3VsdCwKKyAgdGhlIG9yaWdpbmFsIEMgc291cmNlcyBvZiB6bGliIGNhbiBiZSBjb21waWxlZCBvdXQgb2YgdGhlIGJveCwKKyAgYW5kIGxpbmtlZCB0byB0aGUgWkxpYiB1bml0LgorCisKK1N1Z2dlc3Rpb25zIGZvciBpbXByb3ZlbWVudHMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworQ3VycmVudGx5LCB0aGUgWkxpYiB1bml0IHByb3ZpZGVzIG9ubHkgYSBsaW1pdGVkIHdyYXBwZXIgYXJvdW5kCit0aGUgemxpYiBsaWJyYXJ5LCBhbmQgbXVjaCBvZiB0aGUgb3JpZ2luYWwgemxpYiBmdW5jdGlvbmFsaXR5IGlzCittaXNzaW5nLiAgSGFuZGxpbmcgY29tcHJlc3NlZCBmaWxlIGZvcm1hdHMgbGlrZSBaSVAvR1pJUCBvciBQTkcKK2Nhbm5vdCBiZSBpbXBsZW1lbnRlZCB3aXRob3V0IGhhdmluZyB0aGlzIGZ1bmN0aW9uYWxpdHkuCitBcHBsaWNhdGlvbnMgdGhhdCBoYW5kbGUgdGhlc2UgZm9ybWF0cyBhcmUgZWl0aGVyIHVzaW5nIHRoZWlyIG93biwKK2R1cGxpY2F0ZWQgY29kZSwgb3Igbm90IHVzaW5nIHRoZSBaTGliIHVuaXQgYXQgYWxsLgorCitIZXJlIGFyZSBhIGZldyBzdWdnZXN0aW9uczoKKworLSBDaGVja3N1bSBjbGFzcyB3cmFwcGVycyBhcm91bmQgYWRsZXIzMigpIGFuZCBjcmMzMigpLCBzaW1pbGFyCisgIHRvIHRoZSBKYXZhIGNsYXNzZXMgdGhhdCBpbXBsZW1lbnQgdGhlIGphdmEudXRpbC56aXAuQ2hlY2tzdW0KKyAgaW50ZXJmYWNlLgorCistIFRoZSBhYmlsaXR5IHRvIHJlYWQgYW5kIHdyaXRlIHJhdyBkZWZsYXRlIHN0cmVhbXMsIHdpdGhvdXQgdGhlCisgIHpsaWIgc3RyZWFtIGhlYWRlciBhbmQgdHJhaWxlci4gIFJhdyBkZWZsYXRlIHN0cmVhbXMgYXJlIHVzZWQKKyAgaW4gdGhlIFpJUCBmaWxlIGZvcm1hdC4KKworLSBUaGUgYWJpbGl0eSB0byByZWFkIGFuZCB3cml0ZSBnemlwIHN0cmVhbXMsIHVzZWQgaW4gdGhlIEdaSVAKKyAgZmlsZSBmb3JtYXQsIGFuZCBub3JtYWxseSBwcm9kdWNlZCBieSB0aGUgZ3ppcCBwcm9ncmFtLgorCistIFRoZSBhYmlsaXR5IHRvIHNlbGVjdCBhIGRpZmZlcmVudCBjb21wcmVzc2lvbiBzdHJhdGVneSwgdXNlZnVsCisgIHRvIFBORyBhbmQgTU5HIGltYWdlIGNvbXByZXNzaW9uLCBhbmQgdG8gbXVsdGltZWRpYSBjb21wcmVzc2lvbgorICBpbiBnZW5lcmFsLiAgQmVzaWRlcyB0aGUgY29tcHJlc3Npb24gbGV2ZWwKKworICAgIFRDb21wcmVzc2lvbkxldmVsID0gKGNsTm9uZSwgY2xGYXN0ZXN0LCBjbERlZmF1bHQsIGNsTWF4KTsKKworICB3aGljaCwgaW4gZmFjdCwgY291bGQgaGF2ZSB1c2VkIHRoZSAneicgcHJlZml4IGFuZCBhdm9pZGVkCisgIFRDb2xvci1saWtlIHN5bWJvbHMKKworICAgIFRDb21wcmVzc2lvbkxldmVsID0gKHpjTm9uZSwgemNGYXN0ZXN0LCB6Y0RlZmF1bHQsIHpjTWF4KTsKKworICB0aGVyZSBjb3VsZCBiZSBhIGNvbXByZXNzaW9uIHN0cmF0ZWd5CisKKyAgICBUQ29tcHJlc3Npb25TdHJhdGVneSA9ICh6c0RlZmF1bHQsIHpzRmlsdGVyZWQsIHpzSHVmZm1hbk9ubHksIHpzUmxlKTsKKworLSBaSVAgYW5kIEdaSVAgc3RyZWFtIGhhbmRsaW5nIHZpYSBUU3RyZWFtcy4KKworCistLQorQ29zbWluIFRydXRhIDxjb3NtaW50QGNzLnViYmNsdWoucm8+CmRpZmYgLS1naXQgYS96bGliLTEuMi42L2NvbnRyaWIvZGVscGhpL3psaWJkMzIubWFrIGIvemxpYi0xLjIuNi9jb250cmliL2RlbHBoaS96bGliZDMyLm1hawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmIwMGI3Ci0tLSAvZGV2L251bGwKKysrIGIvemxpYi0xLjIuNi9jb250cmliL2RlbHBoaS96bGliZDMyLm1hawpAQCAtMCwwICsxLDk5IEBACisjIE1ha2VmaWxlIGZvciB6bGliCisjIEZvciB1c2Ugd2l0aCBEZWxwaGkgYW5kIEMrKyBCdWlsZGVyIHVuZGVyIFdpbjMyCisjIFVwZGF0ZWQgZm9yIHpsaWIgMS4yLnggYnkgQ29zbWluIFRydXRhCisKKyMgLS0tLS0tLS0tLS0tIEJvcmxhbmQgQysrIC0tLS0tLS0tLS0tLQorCisjIFRoaXMgcHJvamVjdCB1c2VzIHRoZSBEZWxwaGkgKGZhc3RjYWxsL3JlZ2lzdGVyKSBjYWxsaW5nIGNvbnZlbnRpb246CitMT0MgPSAtRFpFWFBPUlQ9X19mYXN0Y2FsbCAtRFpFWFBPUlRWQT1fX2NkZWNsCisKK0NDID0gYmNjMzIKK0xEID0gYmNjMzIKK0FSID0gdGxpYgorIyBkbyBub3QgdXNlICItcHIiIGluIENGTEFHUworQ0ZMQUdTID0gLWEgLWQgLWstIC1PMiAkKExPQykKK0xERkxBR1MgPQorCisKKyMgdmFyaWFibGVzCitaTElCX0xJQiA9IHpsaWIubGliCisKK09CSjEgPSBhZGxlcjMyLm9iaiBjb21wcmVzcy5vYmogY3JjMzIub2JqIGRlZmxhdGUub2JqIGd6Y2xvc2Uub2JqIGd6bGliLm9iaiBnenJlYWQub2JqCitPQkoyID0gZ3p3cml0ZS5vYmogaW5mYmFjay5vYmogaW5mZmFzdC5vYmogaW5mbGF0ZS5vYmogaW5mdHJlZXMub2JqIHRyZWVzLm9iaiB1bmNvbXByLm9iaiB6dXRpbC5vYmoKK09CSlAxID0gK2FkbGVyMzIub2JqK2NvbXByZXNzLm9iaitjcmMzMi5vYmorZGVmbGF0ZS5vYmorZ3pjbG9zZS5vYmorZ3psaWIub2JqK2d6cmVhZC5vYmoKK09CSlAyID0gK2d6d3JpdGUub2JqK2luZmJhY2sub2JqK2luZmZhc3Qub2JqK2luZmxhdGUub2JqK2luZnRyZWVzLm9iait0cmVlcy5vYmordW5jb21wci5vYmorenV0aWwub2JqCisKKworIyB0YXJnZXRzCithbGw6ICQoWkxJQl9MSUIpIGV4YW1wbGUuZXhlIG1pbmlnemlwLmV4ZQorCisuYy5vYmo6CisJJChDQykgLWMgJChDRkxBR1MpICQqLmMKKworYWRsZXIzMi5vYmo6IGFkbGVyMzIuYyB6bGliLmggemNvbmYuaAorCitjb21wcmVzcy5vYmo6IGNvbXByZXNzLmMgemxpYi5oIHpjb25mLmgKKworY3JjMzIub2JqOiBjcmMzMi5jIHpsaWIuaCB6Y29uZi5oIGNyYzMyLmgKKworZGVmbGF0ZS5vYmo6IGRlZmxhdGUuYyBkZWZsYXRlLmggenV0aWwuaCB6bGliLmggemNvbmYuaAorCitnemNsb3NlLm9iajogZ3pjbG9zZS5jIHpsaWIuaCB6Y29uZi5oIGd6Z3V0cy5oCisKK2d6bGliLm9iajogZ3psaWIuYyB6bGliLmggemNvbmYuaCBnemd1dHMuaAorCitnenJlYWQub2JqOiBnenJlYWQuYyB6bGliLmggemNvbmYuaCBnemd1dHMuaAorCitnendyaXRlLm9iajogZ3p3cml0ZS5jIHpsaWIuaCB6Y29uZi5oIGd6Z3V0cy5oCisKK2luZmJhY2sub2JqOiBpbmZiYWNrLmMgenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZ0cmVlcy5oIGluZmxhdGUuaCBcCisgaW5mZmFzdC5oIGluZmZpeGVkLmgKKworaW5mZmFzdC5vYmo6IGluZmZhc3QuYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZnRyZWVzLmggaW5mbGF0ZS5oIFwKKyBpbmZmYXN0LmgKKworaW5mbGF0ZS5vYmo6IGluZmxhdGUuYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZnRyZWVzLmggaW5mbGF0ZS5oIFwKKyBpbmZmYXN0LmggaW5mZml4ZWQuaAorCitpbmZ0cmVlcy5vYmo6IGluZnRyZWVzLmMgenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZ0cmVlcy5oCisKK3RyZWVzLm9iajogdHJlZXMuYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGRlZmxhdGUuaCB0cmVlcy5oCisKK3VuY29tcHIub2JqOiB1bmNvbXByLmMgemxpYi5oIHpjb25mLmgKKworenV0aWwub2JqOiB6dXRpbC5jIHp1dGlsLmggemxpYi5oIHpjb25mLmgKKworZXhhbXBsZS5vYmo6IHRlc3QvZXhhbXBsZS5jIHpsaWIuaCB6Y29uZi5oCisKK21pbmlnemlwLm9iajogdGVzdC9taW5pZ3ppcC5jIHpsaWIuaCB6Y29uZi5oCisKKworIyBGb3IgdGhlIHNha2Ugb2YgdGhlIG9sZCBCb3JsYW5kIG1ha2UsCisjIHRoZSBjb21tYW5kIGxpbmUgaXMgY3V0IHRvIGZpdCBpbiB0aGUgTVMtRE9TIDEyOCBieXRlIGxpbWl0OgorJChaTElCX0xJQik6ICQoT0JKMSkgJChPQkoyKQorCS1kZWwgJChaTElCX0xJQikKKwkkKEFSKSAkKFpMSUJfTElCKSAkKE9CSlAxKQorCSQoQVIpICQoWkxJQl9MSUIpICQoT0JKUDIpCisKKworIyB0ZXN0aW5nCit0ZXN0OiBleGFtcGxlLmV4ZSBtaW5pZ3ppcC5leGUKKwlleGFtcGxlCisJZWNobyBoZWxsbyB3b3JsZCB8IG1pbmlnemlwIHwgbWluaWd6aXAgLWQKKworZXhhbXBsZS5leGU6IGV4YW1wbGUub2JqICQoWkxJQl9MSUIpCisJJChMRCkgJChMREZMQUdTKSBleGFtcGxlLm9iaiAkKFpMSUJfTElCKQorCittaW5pZ3ppcC5leGU6IG1pbmlnemlwLm9iaiAkKFpMSUJfTElCKQorCSQoTEQpICQoTERGTEFHUykgbWluaWd6aXAub2JqICQoWkxJQl9MSUIpCisKKworIyBjbGVhbnVwCitjbGVhbjoKKwktZGVsICoub2JqCisJLWRlbCAqLmV4ZQorCS1kZWwgKi5saWIKKwktZGVsICoudGRzCisJLWRlbCB6bGliLmJhaworCS1kZWwgZm9vLmd6CisKZGlmZiAtLWdpdCBhL3psaWItMS4yLjYvY29udHJpYi9kb3R6bGliL0RvdFpMaWIuYnVpbGQgYi96bGliLTEuMi42L2NvbnRyaWIvZG90emxpYi9Eb3RaTGliLmJ1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmOTBkNmIKLS0tIC9kZXYvbnVsbAorKysgYi96bGliLTEuMi42L2NvbnRyaWIvZG90emxpYi9Eb3RaTGliLmJ1aWxkCkBAIC0wLDAgKzEsMzMgQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04IiA/Pg0KKzxwcm9qZWN0IG5hbWU9IkRvdFpMaWIiIGRlZmF1bHQ9ImJ1aWxkIiBiYXNlZGlyPSIuL0RvdFpMaWIiPg0KKwk8ZGVzY3JpcHRpb24+QSAuTmV0IHdyYXBwZXIgbGlicmFyeSBhcm91bmQgWkxpYjEuZGxsPC9kZXNjcmlwdGlvbj4NCisNCisJPHByb3BlcnR5IG5hbWU9Im51bml0LmxvY2F0aW9uIiB2YWx1ZT0iYzovcHJvZ3JhbSBmaWxlcy9OVW5pdCBWMi4xL2JpbiIgLz4NCisJPHByb3BlcnR5IG5hbWU9ImJ1aWxkLnJvb3QiIHZhbHVlPSJiaW4iIC8+DQorDQorCTxwcm9wZXJ0eSBuYW1lPSJkZWJ1ZyIgdmFsdWU9InRydWUiIC8+DQorCTxwcm9wZXJ0eSBuYW1lPSJudW5pdCIgdmFsdWU9InRydWUiIC8+DQorDQorCTxwcm9wZXJ0eSBuYW1lPSJidWlsZC5mb2xkZXIiIHZhbHVlPSIke2J1aWxkLnJvb3R9L2RlYnVnLyIgaWY9IiR7ZGVidWd9IiAvPg0KKwk8cHJvcGVydHkgbmFtZT0iYnVpbGQuZm9sZGVyIiB2YWx1ZT0iJHtidWlsZC5yb290fS9yZWxlYXNlLyIgdW5sZXNzPSIke2RlYnVnfSIgLz4NCisNCisJPHRhcmdldCBuYW1lPSJjbGVhbiIgZGVzY3JpcHRpb249IlJlbW92ZSBhbGwgZ2VuZXJhdGVkIGZpbGVzIj4NCisJCTxkZWxldGUgZGlyPSIke2J1aWxkLnJvb3R9IiBmYWlsb25lcnJvcj0iZmFsc2UiIC8+DQorCTwvdGFyZ2V0Pg0KKw0KKwk8dGFyZ2V0IG5hbWU9ImJ1aWxkIiBkZXNjcmlwdGlvbj0iY29tcGlsZXMgdGhlIHNvdXJjZSBjb2RlIj4NCisNCisJCTxta2RpciBkaXI9IiR7YnVpbGQuZm9sZGVyfSIgLz4NCisJCTxjc2MgdGFyZ2V0PSJsaWJyYXJ5IiBvdXRwdXQ9IiR7YnVpbGQuZm9sZGVyfURvdFpMaWIuZGxsIiBkZWJ1Zz0iJHtkZWJ1Z30iPg0KKwkJCTxyZWZlcmVuY2VzIGJhc2VkaXI9IiR7bnVuaXQubG9jYXRpb259Ij4NCisJCQkJPGluY2x1ZGVzIGlmPSIke251bml0fSIgbmFtZT0ibnVuaXQuZnJhbWV3b3JrLmRsbCIgLz4NCisJCQk8L3JlZmVyZW5jZXM+DQorCQkJPHNvdXJjZXM+DQorCQkJCTxpbmNsdWRlcyBuYW1lPSIqLmNzIiAvPg0KKwkJCQk8ZXhjbHVkZXMgbmFtZT0iVW5pdFRlc3RzLmNzIiB1bmxlc3M9IiR7bnVuaXR9IiAvPg0KKwkJCTwvc291cmNlcz4NCisJCQk8YXJnIHZhbHVlPSIvZDpudW5pdCIgaWY9IiR7bnVuaXR9IiAvPg0KKwkJPC9jc2M+DQorCTwvdGFyZ2V0Pg0KKw0KKzwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS96bGliLTEuMi42L2NvbnRyaWIvZG90emxpYi9Eb3RaTGliLmNobSBiL3psaWItMS4yLjYvY29udHJpYi9kb3R6bGliL0RvdFpMaWIuY2htCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyMTRhNDQKLS0tIC9kZXYvbnVsbAorKysgYi96bGliLTEuMi42L2NvbnRyaWIvZG90emxpYi9Eb3RaTGliLmNobQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS96bGliLTEuMi42L2NvbnRyaWIvZG90emxpYi9Eb3RaTGliLnNsbiBiL3psaWItMS4yLjYvY29udHJpYi9kb3R6bGliL0RvdFpMaWIuc2xuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjNDVjYTAKLS0tIC9kZXYvbnVsbAorKysgYi96bGliLTEuMi42L2NvbnRyaWIvZG90emxpYi9Eb3RaTGliLnNsbgpAQCAtMCwwICsxLDIxIEBACitNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyBTb2x1dGlvbiBGaWxlLCBGb3JtYXQgVmVyc2lvbiA4LjAwDQorUHJvamVjdCgie0ZBRTA0RUMwLTMwMUYtMTFEMy1CRjRCLTAwQzA0Rjc5RUZCQ30iKSA9ICJEb3RaTGliIiwgIkRvdFpMaWJcRG90WkxpYi5jc3Byb2oiLCAie0JCMUVFMEIxLTE4MDgtNDZDQi1CNzg2LTk0OUQ5MTExN0ZDNX0iDQorCVByb2plY3RTZWN0aW9uKFByb2plY3REZXBlbmRlbmNpZXMpID0gcG9zdFByb2plY3QNCisJRW5kUHJvamVjdFNlY3Rpb24NCitFbmRQcm9qZWN0DQorR2xvYmFsDQorCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Db25maWd1cmF0aW9uKSA9IHByZVNvbHV0aW9uDQorCQlEZWJ1ZyA9IERlYnVnDQorCQlSZWxlYXNlID0gUmVsZWFzZQ0KKwlFbmRHbG9iYWxTZWN0aW9uDQorCUdsb2JhbFNlY3Rpb24oUHJvamVjdENvbmZpZ3VyYXRpb24pID0gcG9zdFNvbHV0aW9uDQorCQl7QkIxRUUwQjEtMTgwOC00NkNCLUI3ODYtOTQ5RDkxMTE3RkM1fS5EZWJ1Zy5BY3RpdmVDZmcgPSBEZWJ1Z3wuTkVUDQorCQl7QkIxRUUwQjEtMTgwOC00NkNCLUI3ODYtOTQ5RDkxMTE3RkM1fS5EZWJ1Zy5CdWlsZC4wID0gRGVidWd8Lk5FVA0KKwkJe0JCMUVFMEIxLTE4MDgtNDZDQi1CNzg2LTk0OUQ5MTExN0ZDNX0uUmVsZWFzZS5BY3RpdmVDZmcgPSBSZWxlYXNlfC5ORVQNCisJCXtCQjFFRTBCMS0xODA4LTQ2Q0ItQjc4Ni05NDlEOTExMTdGQzV9LlJlbGVhc2UuQnVpbGQuMCA9IFJlbGVhc2V8Lk5FVA0KKwlFbmRHbG9iYWxTZWN0aW9uDQorCUdsb2JhbFNlY3Rpb24oRXh0ZW5zaWJpbGl0eUdsb2JhbHMpID0gcG9zdFNvbHV0aW9uDQorCUVuZEdsb2JhbFNlY3Rpb24NCisJR2xvYmFsU2VjdGlvbihFeHRlbnNpYmlsaXR5QWRkSW5zKSA9IHBvc3RTb2x1dGlvbg0KKwlFbmRHbG9iYWxTZWN0aW9uDQorRW5kR2xvYmFsDQpkaWZmIC0tZ2l0IGEvemxpYi0xLjIuNi9jb250cmliL2RvdHpsaWIvRG90WkxpYi9Bc3NlbWJseUluZm8uY3MgYi96bGliLTEuMi42L2NvbnRyaWIvZG90emxpYi9Eb3RaTGliL0Fzc2VtYmx5SW5mby5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDkxYmZjCi0tLSAvZGV2L251bGwKKysrIGIvemxpYi0xLjIuNi9jb250cmliL2RvdHpsaWIvRG90WkxpYi9Bc3NlbWJseUluZm8uY3MKQEAgLTAsMCArMSw1OCBAQAordXNpbmcgU3lzdGVtLlJlZmxlY3Rpb247DQordXNpbmcgU3lzdGVtLlJ1bnRpbWUuQ29tcGlsZXJTZXJ2aWNlczsNCisNCisvLw0KKy8vIEdlbmVyYWwgSW5mb3JtYXRpb24gYWJvdXQgYW4gYXNzZW1ibHkgaXMgY29udHJvbGxlZCB0aHJvdWdoIHRoZSBmb2xsb3dpbmcNCisvLyBzZXQgb2YgYXR0cmlidXRlcy4gQ2hhbmdlIHRoZXNlIGF0dHJpYnV0ZSB2YWx1ZXMgdG8gbW9kaWZ5IHRoZSBpbmZvcm1hdGlvbg0KKy8vIGFzc29jaWF0ZWQgd2l0aCBhbiBhc3NlbWJseS4NCisvLw0KK1thc3NlbWJseTogQXNzZW1ibHlUaXRsZSgiRG90WkxpYiIpXQ0KK1thc3NlbWJseTogQXNzZW1ibHlEZXNjcmlwdGlvbigiLk5ldCBiaW5kaW5ncyBmb3IgWkxpYiBjb21wcmVzc2lvbiBkbGwgMS4yLngiKV0NCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29uZmlndXJhdGlvbigiIildDQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbXBhbnkoIkhlbnJpayBSYXZuIildDQorW2Fzc2VtYmx5OiBBc3NlbWJseVByb2R1Y3QoIiIpXQ0KK1thc3NlbWJseTogQXNzZW1ibHlDb3B5cmlnaHQoIihjKSAyMDA0IGJ5IEhlbnJpayBSYXZuIildDQorW2Fzc2VtYmx5OiBBc3NlbWJseVRyYWRlbWFyaygiIildDQorW2Fzc2VtYmx5OiBBc3NlbWJseUN1bHR1cmUoIiIpXQ0KKw0KKy8vDQorLy8gVmVyc2lvbiBpbmZvcm1hdGlvbiBmb3IgYW4gYXNzZW1ibHkgY29uc2lzdHMgb2YgdGhlIGZvbGxvd2luZyBmb3VyIHZhbHVlczoNCisvLw0KKy8vICAgICAgTWFqb3IgVmVyc2lvbg0KKy8vICAgICAgTWlub3IgVmVyc2lvbg0KKy8vICAgICAgQnVpbGQgTnVtYmVyDQorLy8gICAgICBSZXZpc2lvbg0KKy8vDQorLy8gWW91IGNhbiBzcGVjaWZ5IGFsbCB0aGUgdmFsdWVzIG9yIHlvdSBjYW4gZGVmYXVsdCB0aGUgUmV2aXNpb24gYW5kIEJ1aWxkIE51bWJlcnMNCisvLyBieSB1c2luZyB0aGUgJyonIGFzIHNob3duIGJlbG93Og0KKw0KK1thc3NlbWJseTogQXNzZW1ibHlWZXJzaW9uKCIxLjAuKiIpXQ0KKw0KKy8vDQorLy8gSW4gb3JkZXIgdG8gc2lnbiB5b3VyIGFzc2VtYmx5IHlvdSBtdXN0IHNwZWNpZnkgYSBrZXkgdG8gdXNlLiBSZWZlciB0byB0aGUNCisvLyBNaWNyb3NvZnQgLk5FVCBGcmFtZXdvcmsgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBhc3NlbWJseSBzaWduaW5nLg0KKy8vDQorLy8gVXNlIHRoZSBhdHRyaWJ1dGVzIGJlbG93IHRvIGNvbnRyb2wgd2hpY2gga2V5IGlzIHVzZWQgZm9yIHNpZ25pbmcuDQorLy8NCisvLyBOb3RlczoNCisvLyAgICgqKSBJZiBubyBrZXkgaXMgc3BlY2lmaWVkLCB0aGUgYXNzZW1ibHkgaXMgbm90IHNpZ25lZC4NCisvLyAgICgqKSBLZXlOYW1lIHJlZmVycyB0byBhIGtleSB0aGF0IGhhcyBiZWVuIGluc3RhbGxlZCBpbiB0aGUgQ3J5cHRvIFNlcnZpY2UNCisvLyAgICAgICBQcm92aWRlciAoQ1NQKSBvbiB5b3VyIG1hY2hpbmUuIEtleUZpbGUgcmVmZXJzIHRvIGEgZmlsZSB3aGljaCBjb250YWlucw0KKy8vICAgICAgIGEga2V5Lg0KKy8vICAgKCopIElmIHRoZSBLZXlGaWxlIGFuZCB0aGUgS2V5TmFtZSB2YWx1ZXMgYXJlIGJvdGggc3BlY2lmaWVkLCB0aGUNCisvLyAgICAgICBmb2xsb3dpbmcgcHJvY2Vzc2luZyBvY2N1cnM6DQorLy8gICAgICAgKDEpIElmIHRoZSBLZXlOYW1lIGNhbiBiZSBmb3VuZCBpbiB0aGUgQ1NQLCB0aGF0IGtleSBpcyB1c2VkLg0KKy8vICAgICAgICgyKSBJZiB0aGUgS2V5TmFtZSBkb2VzIG5vdCBleGlzdCBhbmQgdGhlIEtleUZpbGUgZG9lcyBleGlzdCwgdGhlIGtleQ0KKy8vICAgICAgICAgICBpbiB0aGUgS2V5RmlsZSBpcyBpbnN0YWxsZWQgaW50byB0aGUgQ1NQIGFuZCB1c2VkLg0KKy8vICAgKCopIEluIG9yZGVyIHRvIGNyZWF0ZSBhIEtleUZpbGUsIHlvdSBjYW4gdXNlIHRoZSBzbi5leGUgKFN0cm9uZyBOYW1lKSB1dGlsaXR5Lg0KKy8vICAgICAgIFdoZW4gc3BlY2lmeWluZyB0aGUgS2V5RmlsZSwgdGhlIGxvY2F0aW9uIG9mIHRoZSBLZXlGaWxlIHNob3VsZCBiZQ0KKy8vICAgICAgIHJlbGF0aXZlIHRvIHRoZSBwcm9qZWN0IG91dHB1dCBkaXJlY3Rvcnkgd2hpY2ggaXMNCisvLyAgICAgICAlUHJvamVjdCBEaXJlY3RvcnklXG9ialw8Y29uZmlndXJhdGlvbj4uIEZvciBleGFtcGxlLCBpZiB5b3VyIEtleUZpbGUgaXMNCisvLyAgICAgICBsb2NhdGVkIGluIHRoZSBwcm9qZWN0IGRpcmVjdG9yeSwgeW91IHdvdWxkIHNwZWNpZnkgdGhlIEFzc2VtYmx5S2V5RmlsZQ0KKy8vICAgICAgIGF0dHJpYnV0ZSBhcyBbYXNzZW1ibHk6IEFzc2VtYmx5S2V5RmlsZSgiLi5cXC4uXFxteWtleS5zbmsiKV0NCisvLyAgICgqKSBEZWxheSBTaWduaW5nIGlzIGFuIGFkdmFuY2VkIG9wdGlvbiAtIHNlZSB0aGUgTWljcm9zb2Z0IC5ORVQgRnJhbWV3b3JrDQorLy8gICAgICAgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGlzLg0KKy8vDQorW2Fzc2VtYmx5OiBBc3NlbWJseURlbGF5U2lnbihmYWxzZSldDQorW2Fzc2VtYmx5OiBBc3NlbWJseUtleUZpbGUoIiIpXQ0KK1thc3NlbWJseTogQXNzZW1ibHlLZXlOYW1lKCIiKV0NCmRpZmYgLS1naXQgYS96bGliLTEuMi42L2NvbnRyaWIvZG90emxpYi9Eb3RaTGliL0NoZWNrc3VtSW1wbC5jcyBiL3psaWItMS4yLjYvY29udHJpYi9kb3R6bGliL0RvdFpMaWIvQ2hlY2tzdW1JbXBsLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4OGIyZmMKLS0tIC9kZXYvbnVsbAorKysgYi96bGliLTEuMi42L2NvbnRyaWIvZG90emxpYi9Eb3RaTGliL0NoZWNrc3VtSW1wbC5jcwpAQCAtMCwwICsxLDIwMiBAQAorLy8NCisvLyCpIENvcHlyaWdodCBIZW5yaWsgUmF2biAyMDA0DQorLy8NCisvLyBVc2UsIG1vZGlmaWNhdGlvbiBhbmQgZGlzdHJpYnV0aW9uIGFyZSBzdWJqZWN0IHRvIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4NCisvLyAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkNCisvLw0KKw0KK3VzaW5nIFN5c3RlbTsNCit1c2luZyBTeXN0ZW0uUnVudGltZS5JbnRlcm9wU2VydmljZXM7DQordXNpbmcgU3lzdGVtLlRleHQ7DQorDQorDQorbmFtZXNwYWNlIERvdFpMaWINCit7DQorICAgICNyZWdpb24gQ2hlY2tzdW1HZW5lcmF0b3JCYXNlDQorICAgIC8vLyA8c3VtbWFyeT4NCisgICAgLy8vIEltcGxlbWVudHMgdGhlIGNvbW1vbiBmdW5jdGlvbmFsaXR5IG5lZWRlZCBmb3IgYWxsIDxzZWUgY3JlZj0iQ2hlY2tzdW1HZW5lcmF0b3IiLz5zDQorICAgIC8vLyA8L3N1bW1hcnk+DQorICAgIC8vLyA8ZXhhbXBsZT48L2V4YW1wbGU+DQorICAgIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDaGVja3N1bUdlbmVyYXRvckJhc2UgOiBDaGVja3N1bUdlbmVyYXRvcg0KKyAgICB7DQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gVGhlIHZhbHVlIG9mIHRoZSBjdXJyZW50IGNoZWNrc3VtDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHJvdGVjdGVkIHVpbnQgX2N1cnJlbnQ7DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gSW5pdGlhbGl6ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIGNoZWNrc3VtIGdlbmVyYXRvciBiYXNlIC0gdGhlIGN1cnJlbnQgY2hlY2tzdW0gaXMNCisgICAgICAgIC8vLyBzZXQgdG8gemVybw0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBDaGVja3N1bUdlbmVyYXRvckJhc2UoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIF9jdXJyZW50ID0gMDsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgY2hlY2tzdW0gZ2VuZXJhdG9yIGJhc2V3aXRoIGEgc3BlY2lmaWVkIHZhbHVlDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJpbml0aWFsVmFsdWUiPlRoZSB2YWx1ZSB0byBzZXQgdGhlIGN1cnJlbnQgY2hlY2tzdW0gdG88L3BhcmFtPg0KKyAgICAgICAgcHVibGljIENoZWNrc3VtR2VuZXJhdG9yQmFzZSh1aW50IGluaXRpYWxWYWx1ZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBfY3VycmVudCA9IGluaXRpYWxWYWx1ZTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBSZXNldHMgdGhlIGN1cnJlbnQgY2hlY2tzdW0gdG8gemVybw0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyB2b2lkIFJlc2V0KCkgeyBfY3VycmVudCA9IDA7IH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBHZXRzIHRoZSBjdXJyZW50IGNoZWNrc3VtIHZhbHVlDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIHVpbnQgVmFsdWUgeyBnZXQgeyByZXR1cm4gX2N1cnJlbnQ7IH0gfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFVwZGF0ZXMgdGhlIGN1cnJlbnQgY2hlY2tzdW0gd2l0aCBwYXJ0IG9mIGFuIGFycmF5IG9mIGJ5dGVzDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJkYXRhIj5UaGUgZGF0YSB0byB1cGRhdGUgdGhlIGNoZWNrc3VtIHdpdGg8L3BhcmFtPg0KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJvZmZzZXQiPldoZXJlIGluIDxjPmRhdGE8L2M+IHRvIHN0YXJ0IHVwZGF0aW5nPC9wYXJhbT4NCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY291bnQiPlRoZSBudW1iZXIgb2YgYnl0ZXMgZnJvbSA8Yz5kYXRhPC9jPiB0byB1c2U8L3BhcmFtPg0KKyAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iQXJndW1lbnRFeGNlcHRpb24iPlRoZSBzdW0gb2Ygb2Zmc2V0IGFuZCBjb3VudCBpcyBsYXJnZXIgdGhhbiB0aGUgbGVuZ3RoIG9mIDxjPmRhdGE8L2M+PC9leGNlcHRpb24+DQorICAgICAgICAvLy8gPGV4Y2VwdGlvbiBjcmVmPSJOdWxsUmVmZXJlbmNlRXhjZXB0aW9uIj48Yz5kYXRhPC9jPiBpcyBhIG51bGwgcmVmZXJlbmNlPC9leGNlcHRpb24+DQorICAgICAgICAvLy8gPGV4Y2VwdGlvbiBjcmVmPSJBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24iPk9mZnNldCBvciBjb3VudCBpcyBuZWdhdGl2ZS48L2V4Y2VwdGlvbj4NCisgICAgICAgIC8vLyA8cmVtYXJrcz5BbGwgdGhlIG90aGVyIDxjPlVwZGF0ZTwvYz4gbWV0aG9kcyBhcmUgaW1wbG1lbmV0ZWQgaW4gdGVybXMgb2YgdGhpcyBvbmUuDQorICAgICAgICAvLy8gVGhpcyBpcyB0aGVyZWZvcmUgdGhlIG9ubHkgbWV0aG9kIGEgZGVyaXZlZCBjbGFzcyBoYXMgdG8gaW1wbGVtZW50PC9yZW1hcmtzPg0KKyAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgVXBkYXRlKGJ5dGVbXSBkYXRhLCBpbnQgb2Zmc2V0LCBpbnQgY291bnQpOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFVwZGF0ZXMgdGhlIGN1cnJlbnQgY2hlY2tzdW0gd2l0aCBhbiBhcnJheSBvZiBieXRlcy4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImRhdGEiPlRoZSBkYXRhIHRvIHVwZGF0ZSB0aGUgY2hlY2tzdW0gd2l0aDwvcGFyYW0+DQorICAgICAgICBwdWJsaWMgdm9pZCBVcGRhdGUoYnl0ZVtdIGRhdGEpDQorICAgICAgICB7DQorICAgICAgICAgICAgVXBkYXRlKGRhdGEsIDAsIGRhdGEuTGVuZ3RoKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBVcGRhdGVzIHRoZSBjdXJyZW50IGNoZWNrc3VtIHdpdGggdGhlIGRhdGEgZnJvbSBhIHN0cmluZw0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZGF0YSI+VGhlIHN0cmluZyB0byB1cGRhdGUgdGhlIGNoZWNrc3VtIHdpdGg8L3BhcmFtPg0KKyAgICAgICAgLy8vIDxyZW1hcmtzPlRoZSBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcgYXJlIGNvbnZlcnRlZCBieSB0aGUgVVRGLTggZW5jb2Rpbmc8L3JlbWFya3M+DQorICAgICAgICBwdWJsaWMgdm9pZCBVcGRhdGUoc3RyaW5nIGRhdGEpDQorICAgICAgICB7DQorCQkJVXBkYXRlKEVuY29kaW5nLlVURjguR2V0Qnl0ZXMoZGF0YSkpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFVwZGF0ZXMgdGhlIGN1cnJlbnQgY2hlY2tzdW0gd2l0aCB0aGUgZGF0YSBmcm9tIGEgc3RyaW5nLCB1c2luZyBhIHNwZWNpZmljIGVuY29kaW5nDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJkYXRhIj5UaGUgc3RyaW5nIHRvIHVwZGF0ZSB0aGUgY2hlY2tzdW0gd2l0aDwvcGFyYW0+DQorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImVuY29kaW5nIj5UaGUgZW5jb2RpbmcgdG8gdXNlPC9wYXJhbT4NCisgICAgICAgIHB1YmxpYyB2b2lkIFVwZGF0ZShzdHJpbmcgZGF0YSwgRW5jb2RpbmcgZW5jb2RpbmcpDQorICAgICAgICB7DQorICAgICAgICAgICAgVXBkYXRlKGVuY29kaW5nLkdldEJ5dGVzKGRhdGEpKTsNCisgICAgICAgIH0NCisNCisgICAgfQ0KKyAgICAjZW5kcmVnaW9uDQorDQorICAgICNyZWdpb24gQ1JDMzINCisgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAvLy8gSW1wbGVtZW50cyBhIENSQzMyIGNoZWNrc3VtIGdlbmVyYXRvcg0KKyAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICBwdWJsaWMgc2VhbGVkIGNsYXNzIENSQzMyQ2hlY2tzdW0gOiBDaGVja3N1bUdlbmVyYXRvckJhc2UNCisgICAgew0KKyAgICAgICAgI3JlZ2lvbiBETEwgaW1wb3J0cw0KKw0KKyAgICAgICAgW0RsbEltcG9ydCgiWkxJQjEuZGxsIiwgQ2FsbGluZ0NvbnZlbnRpb249Q2FsbGluZ0NvbnZlbnRpb24uQ2RlY2wpXQ0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZXh0ZXJuIHVpbnQgY3JjMzIodWludCBjcmMsIGludCBkYXRhLCB1aW50IGxlbmd0aCk7DQorDQorICAgICAgICAjZW5kcmVnaW9uDQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gSW5pdGlhbGl6ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIENSQzMyIGNoZWNrc3VtIGdlbmVyYXRvcg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBDUkMzMkNoZWNrc3VtKCkgOiBiYXNlKCkge30NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgQ1JDMzIgY2hlY2tzdW0gZ2VuZXJhdG9yIHdpdGggYSBzcGVjaWZpZWQgdmFsdWUNCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImluaXRpYWxWYWx1ZSI+VGhlIHZhbHVlIHRvIHNldCB0aGUgY3VycmVudCBjaGVja3N1bSB0bzwvcGFyYW0+DQorICAgICAgICBwdWJsaWMgQ1JDMzJDaGVja3N1bSh1aW50IGluaXRpYWxWYWx1ZSkgOiBiYXNlKGluaXRpYWxWYWx1ZSkge30NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBVcGRhdGVzIHRoZSBjdXJyZW50IGNoZWNrc3VtIHdpdGggcGFydCBvZiBhbiBhcnJheSBvZiBieXRlcw0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZGF0YSI+VGhlIGRhdGEgdG8gdXBkYXRlIHRoZSBjaGVja3N1bSB3aXRoPC9wYXJhbT4NCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ib2Zmc2V0Ij5XaGVyZSBpbiA8Yz5kYXRhPC9jPiB0byBzdGFydCB1cGRhdGluZzwvcGFyYW0+DQorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNvdW50Ij5UaGUgbnVtYmVyIG9mIGJ5dGVzIGZyb20gPGM+ZGF0YTwvYz4gdG8gdXNlPC9wYXJhbT4NCisgICAgICAgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9IkFyZ3VtZW50RXhjZXB0aW9uIj5UaGUgc3VtIG9mIG9mZnNldCBhbmQgY291bnQgaXMgbGFyZ2VyIHRoYW4gdGhlIGxlbmd0aCBvZiA8Yz5kYXRhPC9jPjwvZXhjZXB0aW9uPg0KKyAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iTnVsbFJlZmVyZW5jZUV4Y2VwdGlvbiI+PGM+ZGF0YTwvYz4gaXMgYSBudWxsIHJlZmVyZW5jZTwvZXhjZXB0aW9uPg0KKyAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uIj5PZmZzZXQgb3IgY291bnQgaXMgbmVnYXRpdmUuPC9leGNlcHRpb24+DQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBVcGRhdGUoYnl0ZVtdIGRhdGEsIGludCBvZmZzZXQsIGludCBjb3VudCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBpZiAob2Zmc2V0IDwgMCB8fCBjb3VudCA8IDApIHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oKTsNCisgICAgICAgICAgICBpZiAoKG9mZnNldCtjb3VudCkgPiBkYXRhLkxlbmd0aCkgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCk7DQorICAgICAgICAgICAgR0NIYW5kbGUgaERhdGEgPSBHQ0hhbmRsZS5BbGxvYyhkYXRhLCBHQ0hhbmRsZVR5cGUuUGlubmVkKTsNCisgICAgICAgICAgICB0cnkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIF9jdXJyZW50ID0gY3JjMzIoX2N1cnJlbnQsIGhEYXRhLkFkZHJPZlBpbm5lZE9iamVjdCgpLlRvSW50MzIoKStvZmZzZXQsICh1aW50KWNvdW50KTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZmluYWxseQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgaERhdGEuRnJlZSgpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgfQ0KKyAgICAjZW5kcmVnaW9uDQorDQorICAgICNyZWdpb24gQWRsZXINCisgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAvLy8gSW1wbGVtZW50cyBhIGNoZWNrc3VtIGdlbmVyYXRvciB0aGF0IGNvbXB1dGVzIHRoZSBBZGxlciBjaGVja3N1bSBvbiBkYXRhDQorICAgIC8vLyA8L3N1bW1hcnk+DQorICAgIHB1YmxpYyBzZWFsZWQgY2xhc3MgQWRsZXJDaGVja3N1bSA6IENoZWNrc3VtR2VuZXJhdG9yQmFzZQ0KKyAgICB7DQorICAgICAgICAjcmVnaW9uIERMTCBpbXBvcnRzDQorDQorICAgICAgICBbRGxsSW1wb3J0KCJaTElCMS5kbGwiLCBDYWxsaW5nQ29udmVudGlvbj1DYWxsaW5nQ29udmVudGlvbi5DZGVjbCldDQorICAgICAgICBwcml2YXRlIHN0YXRpYyBleHRlcm4gdWludCBhZGxlcjMyKHVpbnQgYWRsZXIsIGludCBkYXRhLCB1aW50IGxlbmd0aCk7DQorDQorICAgICAgICAjZW5kcmVnaW9uDQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gSW5pdGlhbGl6ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIEFkbGVyIGNoZWNrc3VtIGdlbmVyYXRvcg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBBZGxlckNoZWNrc3VtKCkgOiBiYXNlKCkge30NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgQWRsZXIgY2hlY2tzdW0gZ2VuZXJhdG9yIHdpdGggYSBzcGVjaWZpZWQgdmFsdWUNCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImluaXRpYWxWYWx1ZSI+VGhlIHZhbHVlIHRvIHNldCB0aGUgY3VycmVudCBjaGVja3N1bSB0bzwvcGFyYW0+DQorICAgICAgICBwdWJsaWMgQWRsZXJDaGVja3N1bSh1aW50IGluaXRpYWxWYWx1ZSkgOiBiYXNlKGluaXRpYWxWYWx1ZSkge30NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBVcGRhdGVzIHRoZSBjdXJyZW50IGNoZWNrc3VtIHdpdGggcGFydCBvZiBhbiBhcnJheSBvZiBieXRlcw0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZGF0YSI+VGhlIGRhdGEgdG8gdXBkYXRlIHRoZSBjaGVja3N1bSB3aXRoPC9wYXJhbT4NCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ib2Zmc2V0Ij5XaGVyZSBpbiA8Yz5kYXRhPC9jPiB0byBzdGFydCB1cGRhdGluZzwvcGFyYW0+DQorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNvdW50Ij5UaGUgbnVtYmVyIG9mIGJ5dGVzIGZyb20gPGM+ZGF0YTwvYz4gdG8gdXNlPC9wYXJhbT4NCisgICAgICAgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9IkFyZ3VtZW50RXhjZXB0aW9uIj5UaGUgc3VtIG9mIG9mZnNldCBhbmQgY291bnQgaXMgbGFyZ2VyIHRoYW4gdGhlIGxlbmd0aCBvZiA8Yz5kYXRhPC9jPjwvZXhjZXB0aW9uPg0KKyAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iTnVsbFJlZmVyZW5jZUV4Y2VwdGlvbiI+PGM+ZGF0YTwvYz4gaXMgYSBudWxsIHJlZmVyZW5jZTwvZXhjZXB0aW9uPg0KKyAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uIj5PZmZzZXQgb3IgY291bnQgaXMgbmVnYXRpdmUuPC9leGNlcHRpb24+DQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBVcGRhdGUoYnl0ZVtdIGRhdGEsIGludCBvZmZzZXQsIGludCBjb3VudCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBpZiAob2Zmc2V0IDwgMCB8fCBjb3VudCA8IDApIHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oKTsNCisgICAgICAgICAgICBpZiAoKG9mZnNldCtjb3VudCkgPiBkYXRhLkxlbmd0aCkgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCk7DQorICAgICAgICAgICAgR0NIYW5kbGUgaERhdGEgPSBHQ0hhbmRsZS5BbGxvYyhkYXRhLCBHQ0hhbmRsZVR5cGUuUGlubmVkKTsNCisgICAgICAgICAgICB0cnkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIF9jdXJyZW50ID0gYWRsZXIzMihfY3VycmVudCwgaERhdGEuQWRkck9mUGlubmVkT2JqZWN0KCkuVG9JbnQzMigpK29mZnNldCwgKHVpbnQpY291bnQpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBmaW5hbGx5DQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBoRGF0YS5GcmVlKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICB9DQorICAgICNlbmRyZWdpb24NCisNCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvemxpYi0xLjIuNi9jb250cmliL2RvdHpsaWIvRG90WkxpYi9DaXJjdWxhckJ1ZmZlci5jcyBiL3psaWItMS4yLjYvY29udHJpYi9kb3R6bGliL0RvdFpMaWIvQ2lyY3VsYXJCdWZmZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFjYWIzYQotLS0gL2Rldi9udWxsCisrKyBiL3psaWItMS4yLjYvY29udHJpYi9kb3R6bGliL0RvdFpMaWIvQ2lyY3VsYXJCdWZmZXIuY3MKQEAgLTAsMCArMSw4MyBAQAorLy8NCisvLyCpIENvcHlyaWdodCBIZW5yaWsgUmF2biAyMDA0DQorLy8NCisvLyBVc2UsIG1vZGlmaWNhdGlvbiBhbmQgZGlzdHJpYnV0aW9uIGFyZSBzdWJqZWN0IHRvIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4NCisvLyAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkNCisvLw0KKw0KK3VzaW5nIFN5c3RlbTsNCit1c2luZyBTeXN0ZW0uRGlhZ25vc3RpY3M7DQorDQorbmFtZXNwYWNlIERvdFpMaWINCit7DQorDQorCS8vLyA8c3VtbWFyeT4NCisJLy8vIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBhIGNpcmN1bGFyIGJ1ZmZlcg0KKwkvLy8gPC9zdW1tYXJ5Pg0KKwlpbnRlcm5hbCBjbGFzcyBDaXJjdWxhckJ1ZmZlcg0KKwl7DQorICAgICAgICAjcmVnaW9uIFByaXZhdGUgZGF0YQ0KKyAgICAgICAgcHJpdmF0ZSBpbnQgX2NhcGFjaXR5Ow0KKyAgICAgICAgcHJpdmF0ZSBpbnQgX2hlYWQ7DQorICAgICAgICBwcml2YXRlIGludCBfdGFpbDsNCisgICAgICAgIHByaXZhdGUgaW50IF9zaXplOw0KKyAgICAgICAgcHJpdmF0ZSBieXRlW10gX2J1ZmZlcjsNCisgICAgICAgICNlbmRyZWdpb24NCisNCisgICAgICAgIHB1YmxpYyBDaXJjdWxhckJ1ZmZlcihpbnQgY2FwYWNpdHkpDQorICAgICAgICB7DQorICAgICAgICAgICAgRGVidWcuQXNzZXJ0KCBjYXBhY2l0eSA+IDAgKTsNCisgICAgICAgICAgICBfYnVmZmVyID0gbmV3IGJ5dGVbY2FwYWNpdHldOw0KKyAgICAgICAgICAgIF9jYXBhY2l0eSA9IGNhcGFjaXR5Ow0KKyAgICAgICAgICAgIF9oZWFkID0gMDsNCisgICAgICAgICAgICBfdGFpbCA9IDA7DQorICAgICAgICAgICAgX3NpemUgPSAwOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIGludCBTaXplIHsgZ2V0IHsgcmV0dXJuIF9zaXplOyB9IH0NCisNCisgICAgICAgIHB1YmxpYyBpbnQgUHV0KGJ5dGVbXSBzb3VyY2UsIGludCBvZmZzZXQsIGludCBjb3VudCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBEZWJ1Zy5Bc3NlcnQoIGNvdW50ID4gMCApOw0KKyAgICAgICAgICAgIGludCB0cnVlQ291bnQgPSBNYXRoLk1pbihjb3VudCwgX2NhcGFjaXR5IC0gU2l6ZSk7DQorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0cnVlQ291bnQ7ICsraSkNCisgICAgICAgICAgICAgICAgX2J1ZmZlclsoX3RhaWwraSkgJSBfY2FwYWNpdHldID0gc291cmNlW29mZnNldCtpXTsNCisgICAgICAgICAgICBfdGFpbCArPSB0cnVlQ291bnQ7DQorICAgICAgICAgICAgX3RhaWwgJT0gX2NhcGFjaXR5Ow0KKyAgICAgICAgICAgIF9zaXplICs9IHRydWVDb3VudDsNCisgICAgICAgICAgICByZXR1cm4gdHJ1ZUNvdW50Ow0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIGJvb2wgUHV0KGJ5dGUgYikNCisgICAgICAgIHsNCisgICAgICAgICAgICBpZiAoU2l6ZSA9PSBfY2FwYWNpdHkpIC8vIG5vIHJvb20NCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgICAgIF9idWZmZXJbX3RhaWwrK10gPSBiOw0KKyAgICAgICAgICAgIF90YWlsICU9IF9jYXBhY2l0eTsNCisgICAgICAgICAgICArK19zaXplOw0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIGludCBHZXQoYnl0ZVtdIGRlc3RpbmF0aW9uLCBpbnQgb2Zmc2V0LCBpbnQgY291bnQpDQorICAgICAgICB7DQorICAgICAgICAgICAgaW50IHRydWVDb3VudCA9IE1hdGguTWluKGNvdW50LFNpemUpOw0KKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHJ1ZUNvdW50OyArK2kpDQorICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uW29mZnNldCArIGldID0gX2J1ZmZlclsoX2hlYWQraSkgJSBfY2FwYWNpdHldOw0KKyAgICAgICAgICAgIF9oZWFkICs9IHRydWVDb3VudDsNCisgICAgICAgICAgICBfaGVhZCAlPSBfY2FwYWNpdHk7DQorICAgICAgICAgICAgX3NpemUgLT0gdHJ1ZUNvdW50Ow0KKyAgICAgICAgICAgIHJldHVybiB0cnVlQ291bnQ7DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgaW50IEdldCgpDQorICAgICAgICB7DQorICAgICAgICAgICAgaWYgKFNpemUgPT0gMCkNCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOw0KKw0KKyAgICAgICAgICAgIGludCByZXN1bHQgPSAoaW50KV9idWZmZXJbX2hlYWQrKyAlIF9jYXBhY2l0eV07DQorICAgICAgICAgICAgLS1fc2l6ZTsNCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgfQ0KKw0KKyAgICB9DQorfQ0KZGlmZiAtLWdpdCBhL3psaWItMS4yLjYvY29udHJpYi9kb3R6bGliL0RvdFpMaWIvQ29kZWNCYXNlLmNzIGIvemxpYi0xLjIuNi9jb250cmliL2RvdHpsaWIvRG90WkxpYi9Db2RlY0Jhc2UuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJlNmRhMwotLS0gL2Rldi9udWxsCisrKyBiL3psaWItMS4yLjYvY29udHJpYi9kb3R6bGliL0RvdFpMaWIvQ29kZWNCYXNlLmNzCkBAIC0wLDAgKzEsMTk4IEBACisvLw0KKy8vIKkgQ29weXJpZ2h0IEhlbnJpayBSYXZuIDIwMDQNCisvLw0KKy8vIFVzZSwgbW9kaWZpY2F0aW9uIGFuZCBkaXN0cmlidXRpb24gYXJlIHN1YmplY3QgdG8gdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLg0KKy8vIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQ0KKy8vDQorDQordXNpbmcgU3lzdGVtOw0KK3VzaW5nIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlczsNCisNCituYW1lc3BhY2UgRG90WkxpYg0KK3sNCisJLy8vIDxzdW1tYXJ5Pg0KKwkvLy8gSW1wbGVtZW50cyB0aGUgY29tbW9uIGZ1bmN0aW9uYWxpdHkgbmVlZGVkIGZvciBhbGwgPHNlZSBjcmVmPSJDb2RlYyIvPnMNCisJLy8vIDwvc3VtbWFyeT4NCisJcHVibGljIGFic3RyYWN0IGNsYXNzIENvZGVjQmFzZSA6IENvZGVjLCBJRGlzcG9zYWJsZQ0KKwl7DQorDQorICAgICAgICAjcmVnaW9uIERhdGEgbWVtYmVycw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIEluc3RhbmNlIG9mIHRoZSBpbnRlcm5hbCB6bGliIGJ1ZmZlciBzdHJ1Y3R1cmUgdGhhdCBpcw0KKyAgICAgICAgLy8vIHBhc3NlZCB0byBhbGwgZnVuY3Rpb25zIGluIHRoZSB6bGliIGRsbA0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIGludGVybmFsIFpTdHJlYW0gX3p0cmVhbSA9IG5ldyBaU3RyZWFtKCk7DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gVHJ1ZSBpZiB0aGUgb2JqZWN0IGluc3RhbmNlIGhhcyBiZWVuIGRpc3Bvc2VkLCBmYWxzZSBvdGhlcndpc2UNCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwcm90ZWN0ZWQgYm9vbCBfaXNEaXNwb3NlZCA9IGZhbHNlOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFRoZSBzaXplIG9mIHRoZSBpbnRlcm5hbCBidWZmZXJzDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHJvdGVjdGVkIGNvbnN0IGludCBrQnVmZmVyU2l6ZSA9IDE2Mzg0Ow0KKw0KKyAgICAgICAgcHJpdmF0ZSBieXRlW10gX291dEJ1ZmZlciA9IG5ldyBieXRlW2tCdWZmZXJTaXplXTsNCisgICAgICAgIHByaXZhdGUgYnl0ZVtdIF9pbkJ1ZmZlciA9IG5ldyBieXRlW2tCdWZmZXJTaXplXTsNCisNCisgICAgICAgIHByaXZhdGUgR0NIYW5kbGUgX2hJbnB1dDsNCisgICAgICAgIHByaXZhdGUgR0NIYW5kbGUgX2hPdXRwdXQ7DQorDQorICAgICAgICBwcml2YXRlIHVpbnQgX2NoZWNrc3VtID0gMDsNCisNCisgICAgICAgICNlbmRyZWdpb24NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgPGM+Q29kZUJhc2U8L2M+IGNsYXNzLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisJCXB1YmxpYyBDb2RlY0Jhc2UoKQ0KKwkJew0KKyAgICAgICAgICAgIHRyeQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgX2hJbnB1dCA9IEdDSGFuZGxlLkFsbG9jKF9pbkJ1ZmZlciwgR0NIYW5kbGVUeXBlLlBpbm5lZCk7DQorICAgICAgICAgICAgICAgIF9oT3V0cHV0ID0gR0NIYW5kbGUuQWxsb2MoX291dEJ1ZmZlciwgR0NIYW5kbGVUeXBlLlBpbm5lZCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24pDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBDbGVhblVwKGZhbHNlKTsNCisgICAgICAgICAgICAgICAgdGhyb3c7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKw0KKyAgICAgICAgI3JlZ2lvbiBDb2RlYyBNZW1iZXJzDQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gT2NjdXJzIHdoZW4gbW9yZSBwcm9jZXNzZWQgZGF0YSBhcmUgYXZhaWxhYmxlLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBldmVudCBEYXRhQXZhaWxhYmxlSGFuZGxlciBEYXRhQXZhaWxhYmxlOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIEZpcmVzIHRoZSA8c2VlIGNyZWY9IkRhdGFBdmFpbGFibGUiLz4gZXZlbnQNCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBPbkRhdGFBdmFpbGFibGUoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGlmIChfenRyZWFtLnRvdGFsX291dCA+IDApDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBpZiAoRGF0YUF2YWlsYWJsZSAhPSBudWxsKQ0KKyAgICAgICAgICAgICAgICAgICAgRGF0YUF2YWlsYWJsZSggX291dEJ1ZmZlciwgMCwgKGludClfenRyZWFtLnRvdGFsX291dCk7DQorICAgICAgICAgICAgICAgIHJlc2V0T3V0cHV0KCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIEFkZHMgbW9yZSBkYXRhIHRvIHRoZSBjb2RlYyB0byBiZSBwcm9jZXNzZWQuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJkYXRhIj5CeXRlIGFycmF5IGNvbnRhaW5pbmcgdGhlIGRhdGEgdG8gYmUgYWRkZWQgdG8gdGhlIGNvZGVjPC9wYXJhbT4NCisgICAgICAgIC8vLyA8cmVtYXJrcz5BZGRpbmcgZGF0YSBtYXksIG9yIG1heSBub3QsIHJhaXNlIHRoZSA8Yz5EYXRhQXZhaWxhYmxlPC9jPiBldmVudDwvcmVtYXJrcz4NCisgICAgICAgIHB1YmxpYyB2b2lkIEFkZChieXRlW10gZGF0YSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBBZGQoZGF0YSwwLGRhdGEuTGVuZ3RoKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBBZGRzIG1vcmUgZGF0YSB0byB0aGUgY29kZWMgdG8gYmUgcHJvY2Vzc2VkLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZGF0YSI+Qnl0ZSBhcnJheSBjb250YWluaW5nIHRoZSBkYXRhIHRvIGJlIGFkZGVkIHRvIHRoZSBjb2RlYzwvcGFyYW0+DQorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im9mZnNldCI+VGhlIGluZGV4IG9mIHRoZSBmaXJzdCBieXRlIHRvIGFkZCBmcm9tIDxjPmRhdGE8L2M+PC9wYXJhbT4NCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY291bnQiPlRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gYWRkPC9wYXJhbT4NCisgICAgICAgIC8vLyA8cmVtYXJrcz5BZGRpbmcgZGF0YSBtYXksIG9yIG1heSBub3QsIHJhaXNlIHRoZSA8Yz5EYXRhQXZhaWxhYmxlPC9jPiBldmVudDwvcmVtYXJrcz4NCisgICAgICAgIC8vLyA8cmVtYXJrcz5UaGlzIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgYSBkZXJpdmVkIGNsYXNzPC9yZW1hcmtzPg0KKyAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgQWRkKGJ5dGVbXSBkYXRhLCBpbnQgb2Zmc2V0LCBpbnQgY291bnQpOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIEZpbmlzaGVzIHVwIGFueSBwZW5kaW5nIGRhdGEgdGhhdCBuZWVkcyB0byBiZSBwcm9jZXNzZWQgYW5kIGhhbmRsZWQuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgLy8vIDxyZW1hcmtzPlRoaXMgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSBhIGRlcml2ZWQgY2xhc3M8L3JlbWFya3M+DQorICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBGaW5pc2goKTsNCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBHZXRzIHRoZSBjaGVja3N1bSBvZiB0aGUgZGF0YSB0aGF0IGhhcyBiZWVuIGFkZGVkIHNvIGZhcg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyB1aW50IENoZWNrc3VtIHsgZ2V0IHsgcmV0dXJuIF9jaGVja3N1bTsgfSB9DQorDQorICAgICAgICAjZW5kcmVnaW9uDQorDQorICAgICAgICAjcmVnaW9uIERlc3RydWN0b3IgJiBJRGlzcG9zYWJsZSBzdHVmZg0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIERlc3Ryb3lzIHRoaXMgaW5zdGFuY2UNCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICB+Q29kZWNCYXNlKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBDbGVhblVwKGZhbHNlKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBSZWxlYXNlcyBhbnkgdW5tYW5hZ2VkIHJlc291cmNlcyBhbmQgY2FsbHMgdGhlIDxzZWUgY3JlZj0iQ2xlYW5VcCgpIi8+IG1ldGhvZCBvZiB0aGUgZGVyaXZlZCBjbGFzcw0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyB2b2lkIERpc3Bvc2UoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIENsZWFuVXAodHJ1ZSk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gUGVyZm9ybXMgYW55IGNvZGVjIHNwZWNpZmljIGNsZWFudXANCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICAvLy8gPHJlbWFya3M+VGhpcyBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IGEgZGVyaXZlZCBjbGFzczwvcmVtYXJrcz4NCisgICAgICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIENsZWFuVXAoKTsNCisNCisgICAgICAgIC8vIHBlcmZvcm1zIHRoZSByZWxlYXNlIG9mIHRoZSBoYW5kbGVzIGFuZCBjYWxscyB0aGUgZGVyZWl2ZWQgQ2xlYW5VcCgpDQorICAgICAgICBwcml2YXRlIHZvaWQgQ2xlYW5VcChib29sIGlzRGlzcG9zaW5nKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGlmICghX2lzRGlzcG9zZWQpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBDbGVhblVwKCk7DQorICAgICAgICAgICAgICAgIGlmIChfaElucHV0LklzQWxsb2NhdGVkKQ0KKyAgICAgICAgICAgICAgICAgICAgX2hJbnB1dC5GcmVlKCk7DQorICAgICAgICAgICAgICAgIGlmIChfaE91dHB1dC5Jc0FsbG9jYXRlZCkNCisgICAgICAgICAgICAgICAgICAgIF9oT3V0cHV0LkZyZWUoKTsNCisNCisgICAgICAgICAgICAgICAgX2lzRGlzcG9zZWQgPSB0cnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisNCisgICAgICAgICNlbmRyZWdpb24NCisNCisgICAgICAgICNyZWdpb24gSGVscGVyIG1ldGhvZHMNCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBDb3BpZXMgYSBudW1iZXIgb2YgYnl0ZXMgdG8gdGhlIGludGVybmFsIGNvZGVjIGJ1ZmZlciAtIHJlYWR5IGZvciBwcm9jY2VzaW5nDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJkYXRhIj5UaGUgYnl0ZSBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBkYXRhIHRvIGNvcHk8L3BhcmFtPg0KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJzdGFydEluZGV4Ij5UaGUgaW5kZXggb2YgdGhlIGZpcnN0IGJ5dGUgdG8gY29weTwvcGFyYW0+DQorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNvdW50Ij5UaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGNvcHkgZnJvbSA8Yz5kYXRhPC9jPjwvcGFyYW0+DQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBjb3B5SW5wdXQoYnl0ZVtdIGRhdGEsIGludCBzdGFydEluZGV4LCBpbnQgY291bnQpDQorICAgICAgICB7DQorICAgICAgICAgICAgQXJyYXkuQ29weShkYXRhLCBzdGFydEluZGV4LCBfaW5CdWZmZXIsMCwgY291bnQpOw0KKyAgICAgICAgICAgIF96dHJlYW0ubmV4dF9pbiA9IF9oSW5wdXQuQWRkck9mUGlubmVkT2JqZWN0KCk7DQorICAgICAgICAgICAgX3p0cmVhbS50b3RhbF9pbiA9IDA7DQorICAgICAgICAgICAgX3p0cmVhbS5hdmFpbF9pbiA9ICh1aW50KWNvdW50Ow0KKw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFJlc2V0cyB0aGUgaW50ZXJuYWwgb3V0cHV0IGJ1ZmZlcnMgdG8gYSBrbm93biBzdGF0ZSAtIHJlYWR5IGZvciBwcm9jZXNzaW5nDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgcmVzZXRPdXRwdXQoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIF96dHJlYW0udG90YWxfb3V0ID0gMDsNCisgICAgICAgICAgICBfenRyZWFtLmF2YWlsX291dCA9IGtCdWZmZXJTaXplOw0KKyAgICAgICAgICAgIF96dHJlYW0ubmV4dF9vdXQgPSBfaE91dHB1dC5BZGRyT2ZQaW5uZWRPYmplY3QoKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBVcGRhdGVzIHRoZSBydW5uaW5nIGNoZWNrc3VtIHByb3BlcnR5DQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJuZXdTdW0iPlRoZSBuZXcgY2hlY2tzdW0gdmFsdWU8L3BhcmFtPg0KKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgc2V0Q2hlY2tzdW0odWludCBuZXdTdW0pDQorICAgICAgICB7DQorICAgICAgICAgICAgX2NoZWNrc3VtID0gbmV3U3VtOw0KKyAgICAgICAgfQ0KKyAgICAgICAgI2VuZHJlZ2lvbg0KKw0KKyAgICB9DQorfQ0KZGlmZiAtLWdpdCBhL3psaWItMS4yLjYvY29udHJpYi9kb3R6bGliL0RvdFpMaWIvRGVmbGF0ZXIuY3MgYi96bGliLTEuMi42L2NvbnRyaWIvZG90emxpYi9Eb3RaTGliL0RlZmxhdGVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyNDc3OTIKLS0tIC9kZXYvbnVsbAorKysgYi96bGliLTEuMi42L2NvbnRyaWIvZG90emxpYi9Eb3RaTGliL0RlZmxhdGVyLmNzCkBAIC0wLDAgKzEsMTA2IEBACisvLw0KKy8vIKkgQ29weXJpZ2h0IEhlbnJpayBSYXZuIDIwMDQNCisvLw0KKy8vIFVzZSwgbW9kaWZpY2F0aW9uIGFuZCBkaXN0cmlidXRpb24gYXJlIHN1YmplY3QgdG8gdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLg0KKy8vIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQ0KKy8vDQorDQordXNpbmcgU3lzdGVtOw0KK3VzaW5nIFN5c3RlbS5EaWFnbm9zdGljczsNCit1c2luZyBTeXN0ZW0uUnVudGltZS5JbnRlcm9wU2VydmljZXM7DQorDQorbmFtZXNwYWNlIERvdFpMaWINCit7DQorDQorICAgIC8vLyA8c3VtbWFyeT4NCisgICAgLy8vIEltcGxlbWVudHMgYSBkYXRhIGNvbXByZXNzb3IsIHVzaW5nIHRoZSBkZWZsYXRlIGFsZ29yaXRobSBpbiB0aGUgWkxpYiBkbGwNCisgICAgLy8vIDwvc3VtbWFyeT4NCisJcHVibGljIHNlYWxlZCBjbGFzcyBEZWZsYXRlciA6IENvZGVjQmFzZQ0KKwl7DQorICAgICAgICAjcmVnaW9uIERsbCBpbXBvcnRzDQorICAgICAgICBbRGxsSW1wb3J0KCJaTElCMS5kbGwiLCBDYWxsaW5nQ29udmVudGlvbj1DYWxsaW5nQ29udmVudGlvbi5DZGVjbCwgQ2hhclNldD1DaGFyU2V0LkFuc2kpXQ0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZXh0ZXJuIGludCBkZWZsYXRlSW5pdF8ocmVmIFpTdHJlYW0gc3osIGludCBsZXZlbCwgc3RyaW5nIHZzLCBpbnQgc2l6ZSk7DQorDQorICAgICAgICBbRGxsSW1wb3J0KCJaTElCMS5kbGwiLCBDYWxsaW5nQ29udmVudGlvbj1DYWxsaW5nQ29udmVudGlvbi5DZGVjbCldDQorICAgICAgICBwcml2YXRlIHN0YXRpYyBleHRlcm4gaW50IGRlZmxhdGUocmVmIFpTdHJlYW0gc3osIGludCBmbHVzaCk7DQorDQorICAgICAgICBbRGxsSW1wb3J0KCJaTElCMS5kbGwiLCBDYWxsaW5nQ29udmVudGlvbj1DYWxsaW5nQ29udmVudGlvbi5DZGVjbCldDQorICAgICAgICBwcml2YXRlIHN0YXRpYyBleHRlcm4gaW50IGRlZmxhdGVSZXNldChyZWYgWlN0cmVhbSBzeik7DQorDQorICAgICAgICBbRGxsSW1wb3J0KCJaTElCMS5kbGwiLCBDYWxsaW5nQ29udmVudGlvbj1DYWxsaW5nQ29udmVudGlvbi5DZGVjbCldDQorICAgICAgICBwcml2YXRlIHN0YXRpYyBleHRlcm4gaW50IGRlZmxhdGVFbmQocmVmIFpTdHJlYW0gc3opOw0KKyAgICAgICAgI2VuZHJlZ2lvbg0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIENvbnN0cnVjdHMgYW4gbmV3IGluc3RhbmNlIG9mIHRoZSA8Yz5EZWZsYXRlcjwvYz4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImxldmVsIj5UaGUgY29tcHJlc3Npb24gbGV2ZWwgdG8gdXNlIGZvciB0aGlzIDxjPkRlZmxhdGVyPC9jPjwvcGFyYW0+DQorCQlwdWJsaWMgRGVmbGF0ZXIoQ29tcHJlc3NMZXZlbCBsZXZlbCkgOiBiYXNlKCkNCisJCXsNCisgICAgICAgICAgICBpbnQgcmV0dmFsID0gZGVmbGF0ZUluaXRfKHJlZiBfenRyZWFtLCAoaW50KWxldmVsLCBJbmZvLlZlcnNpb24sIE1hcnNoYWwuU2l6ZU9mKF96dHJlYW0pKTsNCisgICAgICAgICAgICBpZiAocmV0dmFsICE9IDApDQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBaTGliRXhjZXB0aW9uKHJldHZhbCwgIkNvdWxkIG5vdCBpbml0aWFsaXplIGRlZmxhdGVyIik7DQorDQorICAgICAgICAgICAgcmVzZXRPdXRwdXQoKTsNCisJCX0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBBZGRzIG1vcmUgZGF0YSB0byB0aGUgY29kZWMgdG8gYmUgcHJvY2Vzc2VkLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZGF0YSI+Qnl0ZSBhcnJheSBjb250YWluaW5nIHRoZSBkYXRhIHRvIGJlIGFkZGVkIHRvIHRoZSBjb2RlYzwvcGFyYW0+DQorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im9mZnNldCI+VGhlIGluZGV4IG9mIHRoZSBmaXJzdCBieXRlIHRvIGFkZCBmcm9tIDxjPmRhdGE8L2M+PC9wYXJhbT4NCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY291bnQiPlRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gYWRkPC9wYXJhbT4NCisgICAgICAgIC8vLyA8cmVtYXJrcz5BZGRpbmcgZGF0YSBtYXksIG9yIG1heSBub3QsIHJhaXNlIHRoZSA8Yz5EYXRhQXZhaWxhYmxlPC9jPiBldmVudDwvcmVtYXJrcz4NCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIEFkZChieXRlW10gZGF0YSwgaW50IG9mZnNldCwgaW50IGNvdW50KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGlmIChkYXRhID09IG51bGwpIHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24oKTsNCisgICAgICAgICAgICBpZiAob2Zmc2V0IDwgMCB8fCBjb3VudCA8IDApIHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oKTsNCisgICAgICAgICAgICBpZiAoKG9mZnNldCtjb3VudCkgPiBkYXRhLkxlbmd0aCkgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCk7DQorDQorICAgICAgICAgICAgaW50IHRvdGFsID0gY291bnQ7DQorICAgICAgICAgICAgaW50IGlucHV0SW5kZXggPSBvZmZzZXQ7DQorICAgICAgICAgICAgaW50IGVyciA9IDA7DQorDQorICAgICAgICAgICAgd2hpbGUgKGVyciA+PSAwICYmIGlucHV0SW5kZXggPCB0b3RhbCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGNvcHlJbnB1dChkYXRhLCBpbnB1dEluZGV4LCBNYXRoLk1pbih0b3RhbCAtIGlucHV0SW5kZXgsIGtCdWZmZXJTaXplKSk7DQorICAgICAgICAgICAgICAgIHdoaWxlIChlcnIgPj0gMCAmJiBfenRyZWFtLmF2YWlsX2luID4gMCkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgZXJyID0gZGVmbGF0ZShyZWYgX3p0cmVhbSwgKGludClGbHVzaFR5cGVzLk5vbmUpOw0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGVyciA9PSAwKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChfenRyZWFtLmF2YWlsX291dCA9PSAwKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT25EYXRhQXZhaWxhYmxlKCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IGRlZmxhdGUocmVmIF96dHJlYW0sIChpbnQpRmx1c2hUeXBlcy5Ob25lKTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBpbnB1dEluZGV4ICs9IChpbnQpX3p0cmVhbS50b3RhbF9pbjsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBzZXRDaGVja3N1bSggX3p0cmVhbS5hZGxlciApOw0KKyAgICAgICAgfQ0KKw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIEZpbmlzaGVzIHVwIGFueSBwZW5kaW5nIGRhdGEgdGhhdCBuZWVkcyB0byBiZSBwcm9jZXNzZWQgYW5kIGhhbmRsZWQuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgRmluaXNoKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBpbnQgZXJyOw0KKyAgICAgICAgICAgIGRvDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBlcnIgPSBkZWZsYXRlKHJlZiBfenRyZWFtLCAoaW50KUZsdXNoVHlwZXMuRmluaXNoKTsNCisgICAgICAgICAgICAgICAgT25EYXRhQXZhaWxhYmxlKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHdoaWxlIChlcnIgPT0gMCk7DQorICAgICAgICAgICAgc2V0Q2hlY2tzdW0oIF96dHJlYW0uYWRsZXIgKTsNCisgICAgICAgICAgICBkZWZsYXRlUmVzZXQocmVmIF96dHJlYW0pOw0KKyAgICAgICAgICAgIHJlc2V0T3V0cHV0KCk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gQ2xvc2VzIHRoZSBpbnRlcm5hbCB6bGliIGRlZmxhdGUgc3RyZWFtDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHZvaWQgQ2xlYW5VcCgpIHsgZGVmbGF0ZUVuZChyZWYgX3p0cmVhbSk7IH0NCisNCisgICAgfQ0KK30NCmRpZmYgLS1naXQgYS96bGliLTEuMi42L2NvbnRyaWIvZG90emxpYi9Eb3RaTGliL0RvdFpMaWIuY3MgYi96bGliLTEuMi42L2NvbnRyaWIvZG90emxpYi9Eb3RaTGliL0RvdFpMaWIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmUxODRiNAotLS0gL2Rldi9udWxsCisrKyBiL3psaWItMS4yLjYvY29udHJpYi9kb3R6bGliL0RvdFpMaWIvRG90WkxpYi5jcwpAQCAtMCwwICsxLDI4OCBAQAorLy8NCisvLyCpIENvcHlyaWdodCBIZW5yaWsgUmF2biAyMDA0DQorLy8NCisvLyBVc2UsIG1vZGlmaWNhdGlvbiBhbmQgZGlzdHJpYnV0aW9uIGFyZSBzdWJqZWN0IHRvIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4NCisvLyAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkNCisvLw0KKw0KK3VzaW5nIFN5c3RlbTsNCit1c2luZyBTeXN0ZW0uSU87DQordXNpbmcgU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzOw0KK3VzaW5nIFN5c3RlbS5UZXh0Ow0KKw0KKw0KK25hbWVzcGFjZSBEb3RaTGliDQorew0KKw0KKyAgICAjcmVnaW9uIEludGVybmFsIHR5cGVzDQorDQorICAgIC8vLyA8c3VtbWFyeT4NCisgICAgLy8vIERlZmluZXMgY29uc3RhbnRzIGZvciB0aGUgdmFyaW91cyBmbHVzaCB0eXBlcyB1c2VkIHdpdGggemxpYg0KKyAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICBpbnRlcm5hbCBlbnVtIEZsdXNoVHlwZXMNCisgICAgew0KKyAgICAgICAgTm9uZSwgIFBhcnRpYWwsICBTeW5jLCAgRnVsbCwgIEZpbmlzaCwgIEJsb2NrDQorICAgIH0NCisNCisgICAgI3JlZ2lvbiBaU3RyZWFtIHN0cnVjdHVyZQ0KKyAgICAvLyBpbnRlcm5hbCBtYXBwaW5nIG9mIHRoZSB6bGliIHpzdHJlYW0gc3RydWN0dXJlIGZvciBtYXJzaGFsbGluZw0KKyAgICBbU3RydWN0TGF5b3V0QXR0cmlidXRlKExheW91dEtpbmQuU2VxdWVudGlhbCwgUGFjaz00LCBTaXplPTAsIENoYXJTZXQ9Q2hhclNldC5BbnNpKV0NCisgICAgaW50ZXJuYWwgc3RydWN0IFpTdHJlYW0NCisgICAgew0KKyAgICAgICAgcHVibGljIEludFB0ciBuZXh0X2luOw0KKyAgICAgICAgcHVibGljIHVpbnQgYXZhaWxfaW47DQorICAgICAgICBwdWJsaWMgdWludCB0b3RhbF9pbjsNCisNCisgICAgICAgIHB1YmxpYyBJbnRQdHIgbmV4dF9vdXQ7DQorICAgICAgICBwdWJsaWMgdWludCBhdmFpbF9vdXQ7DQorICAgICAgICBwdWJsaWMgdWludCB0b3RhbF9vdXQ7DQorDQorICAgICAgICBbTWFyc2hhbEFzKFVubWFuYWdlZFR5cGUuTFBTdHIpXQ0KKyAgICAgICAgc3RyaW5nIG1zZzsNCisgICAgICAgIHVpbnQgc3RhdGU7DQorDQorICAgICAgICB1aW50IHphbGxvYzsNCisgICAgICAgIHVpbnQgemZyZWU7DQorICAgICAgICB1aW50IG9wYXF1ZTsNCisNCisgICAgICAgIGludCBkYXRhX3R5cGU7DQorICAgICAgICBwdWJsaWMgdWludCBhZGxlcjsNCisgICAgICAgIHVpbnQgcmVzZXJ2ZWQ7DQorICAgIH0NCisNCisgICAgI2VuZHJlZ2lvbg0KKw0KKyAgICAjZW5kcmVnaW9uDQorDQorICAgICNyZWdpb24gUHVibGljIGVudW1zDQorICAgIC8vLyA8c3VtbWFyeT4NCisgICAgLy8vIERlZmluZXMgY29uc3RhbnRzIGZvciB0aGUgYXZhaWxhYmxlIGNvbXByZXNzaW9uIGxldmVscyBpbiB6bGliDQorICAgIC8vLyA8L3N1bW1hcnk+DQorICAgIHB1YmxpYyBlbnVtIENvbXByZXNzTGV2ZWwgOiBpbnQNCisgICAgew0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFRoZSBkZWZhdWx0IGNvbXByZXNzaW9uIGxldmVsIHdpdGggYSByZWFzb25hYmxlIGNvbXByb21pc2UgYmV0d2VlbiBjb21wcmVzc2lvbiBhbmQgc3BlZWQNCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBEZWZhdWx0ID0gLTEsDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gTm8gY29tcHJlc3Npb24gYXQgYWxsLiBUaGUgZGF0YSBhcmUgcGFzc2VkIHN0cmFpZ2h0IHRocm91Z2guDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgTm9uZSA9IDAsDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gVGhlIG1heGltdW0gY29tcHJlc3Npb24gcmF0ZSBhdmFpbGFibGUuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgQmVzdCA9IDksDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gVGhlIGZhc3Rlc3QgYXZhaWxhYmxlIGNvbXByZXNzaW9uIGxldmVsLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIEZhc3Rlc3QgPSAxDQorICAgIH0NCisgICAgI2VuZHJlZ2lvbg0KKw0KKyAgICAjcmVnaW9uIEV4Y2VwdGlvbiBjbGFzc2VzDQorICAgIC8vLyA8c3VtbWFyeT4NCisgICAgLy8vIFRoZSBleGNlcHRpb24gdGhhdCBpcyB0aHJvd24gd2hlbiBhbiBlcnJvciBvY2N1cnMgb24gdGhlIHpsaWIgZGxsDQorICAgIC8vLyA8L3N1bW1hcnk+DQorICAgIHB1YmxpYyBjbGFzcyBaTGliRXhjZXB0aW9uIDogQXBwbGljYXRpb25FeGNlcHRpb24NCisgICAgew0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIEluaXRpYWxpemVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSA8c2VlIGNyZWY9IlpMaWJFeGNlcHRpb24iLz4gY2xhc3Mgd2l0aCBhIHNwZWNpZmllZA0KKyAgICAgICAgLy8vIGVycm9yIG1lc3NhZ2UgYW5kIGVycm9yIGNvZGUNCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImVycm9yQ29kZSI+VGhlIHpsaWIgZXJyb3IgY29kZSB0aGF0IGNhdXNlZCB0aGUgZXhjZXB0aW9uPC9wYXJhbT4NCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibXNnIj5BIG1lc3NhZ2UgdGhhdCAoaG9wZWZ1bGx5KSBkZXNjcmliZXMgdGhlIGVycm9yPC9wYXJhbT4NCisgICAgICAgIHB1YmxpYyBaTGliRXhjZXB0aW9uKGludCBlcnJvckNvZGUsIHN0cmluZyBtc2cpIDogYmFzZShTdHJpbmcuRm9ybWF0KCJaTGliIGVycm9yIHswfSB7MX0iLCBlcnJvckNvZGUsIG1zZykpDQorICAgICAgICB7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gSW5pdGlhbGl6ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIDxzZWUgY3JlZj0iWkxpYkV4Y2VwdGlvbiIvPiBjbGFzcyB3aXRoIGEgc3BlY2lmaWVkDQorICAgICAgICAvLy8gZXJyb3IgY29kZQ0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZXJyb3JDb2RlIj5UaGUgemxpYiBlcnJvciBjb2RlIHRoYXQgY2F1c2VkIHRoZSBleGNlcHRpb248L3BhcmFtPg0KKyAgICAgICAgcHVibGljIFpMaWJFeGNlcHRpb24oaW50IGVycm9yQ29kZSkgOiBiYXNlKFN0cmluZy5Gb3JtYXQoIlpMaWIgZXJyb3IgezB9IiwgZXJyb3JDb2RlKSkNCisgICAgICAgIHsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICAjZW5kcmVnaW9uDQorDQorICAgICNyZWdpb24gSW50ZXJmYWNlcw0KKw0KKyAgICAvLy8gPHN1bW1hcnk+DQorICAgIC8vLyBEZWNsYXJlcyBtZXRob2RzIGFuZCBwcm9wZXJ0aWVzIHRoYXQgZW5hYmxlcyBhIHJ1bm5pbmcgY2hlY2tzdW0gdG8gYmUgY2FsY3VsYXRlZA0KKyAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICBwdWJsaWMgaW50ZXJmYWNlIENoZWNrc3VtR2VuZXJhdG9yDQorICAgIHsNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBHZXRzIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBjaGVja3N1bQ0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHVpbnQgVmFsdWUgeyBnZXQ7IH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBDbGVhcnMgdGhlIGN1cnJlbnQgY2hlY2tzdW0gdG8gMA0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHZvaWQgUmVzZXQoKTsNCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBVcGRhdGVzIHRoZSBjdXJyZW50IGNoZWNrc3VtIHdpdGggYW4gYXJyYXkgb2YgYnl0ZXMNCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImRhdGEiPlRoZSBkYXRhIHRvIHVwZGF0ZSB0aGUgY2hlY2tzdW0gd2l0aDwvcGFyYW0+DQorICAgICAgICB2b2lkIFVwZGF0ZShieXRlW10gZGF0YSk7DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gVXBkYXRlcyB0aGUgY3VycmVudCBjaGVja3N1bSB3aXRoIHBhcnQgb2YgYW4gYXJyYXkgb2YgYnl0ZXMNCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImRhdGEiPlRoZSBkYXRhIHRvIHVwZGF0ZSB0aGUgY2hlY2tzdW0gd2l0aDwvcGFyYW0+DQorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im9mZnNldCI+V2hlcmUgaW4gPGM+ZGF0YTwvYz4gdG8gc3RhcnQgdXBkYXRpbmc8L3BhcmFtPg0KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjb3VudCI+VGhlIG51bWJlciBvZiBieXRlcyBmcm9tIDxjPmRhdGE8L2M+IHRvIHVzZTwvcGFyYW0+DQorICAgICAgICAvLy8gPGV4Y2VwdGlvbiBjcmVmPSJBcmd1bWVudEV4Y2VwdGlvbiI+VGhlIHN1bSBvZiBvZmZzZXQgYW5kIGNvdW50IGlzIGxhcmdlciB0aGFuIHRoZSBsZW5ndGggb2YgPGM+ZGF0YTwvYz48L2V4Y2VwdGlvbj4NCisgICAgICAgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9IkFyZ3VtZW50TnVsbEV4Y2VwdGlvbiI+PGM+ZGF0YTwvYz4gaXMgYSBudWxsIHJlZmVyZW5jZTwvZXhjZXB0aW9uPg0KKyAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uIj5PZmZzZXQgb3IgY291bnQgaXMgbmVnYXRpdmUuPC9leGNlcHRpb24+DQorICAgICAgICB2b2lkIFVwZGF0ZShieXRlW10gZGF0YSwgaW50IG9mZnNldCwgaW50IGNvdW50KTsNCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBVcGRhdGVzIHRoZSBjdXJyZW50IGNoZWNrc3VtIHdpdGggdGhlIGRhdGEgZnJvbSBhIHN0cmluZw0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZGF0YSI+VGhlIHN0cmluZyB0byB1cGRhdGUgdGhlIGNoZWNrc3VtIHdpdGg8L3BhcmFtPg0KKyAgICAgICAgLy8vIDxyZW1hcmtzPlRoZSBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcgYXJlIGNvbnZlcnRlZCBieSB0aGUgVVRGLTggZW5jb2Rpbmc8L3JlbWFya3M+DQorICAgICAgICB2b2lkIFVwZGF0ZShzdHJpbmcgZGF0YSk7DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gVXBkYXRlcyB0aGUgY3VycmVudCBjaGVja3N1bSB3aXRoIHRoZSBkYXRhIGZyb20gYSBzdHJpbmcsIHVzaW5nIGEgc3BlY2lmaWMgZW5jb2RpbmcNCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImRhdGEiPlRoZSBzdHJpbmcgdG8gdXBkYXRlIHRoZSBjaGVja3N1bSB3aXRoPC9wYXJhbT4NCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZW5jb2RpbmciPlRoZSBlbmNvZGluZyB0byB1c2U8L3BhcmFtPg0KKyAgICAgICAgdm9pZCBVcGRhdGUoc3RyaW5nIGRhdGEsIEVuY29kaW5nIGVuY29kaW5nKTsNCisgICAgfQ0KKw0KKw0KKyAgICAvLy8gPHN1bW1hcnk+DQorICAgIC8vLyBSZXByZXNlbnRzIHRoZSBtZXRob2QgdGhhdCB3aWxsIGJlIGNhbGxlZCBmcm9tIGEgY29kZWMgd2hlbiBuZXcgZGF0YQ0KKyAgICAvLy8gYXJlIGF2YWlsYWJsZS4NCisgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgLy8vIDxwYXJhbXJlZiBuYW1lPSJkYXRhIj5UaGUgYnl0ZSBhcnJheSBjb250YWluaW5nIHRoZSBwcm9jZXNzZWQgZGF0YTwvcGFyYW1yZWY+DQorICAgIC8vLyA8cGFyYW1yZWYgbmFtZT0ic3RhcnRJbmRleCI+VGhlIGluZGV4IG9mIHRoZSBmaXJzdCBwcm9jZXNzZWQgYnl0ZSBpbiA8Yz5kYXRhPC9jPjwvcGFyYW1yZWY+DQorICAgIC8vLyA8cGFyYW1yZWYgbmFtZT0iY291bnQiPlRoZSBudW1iZXIgb2YgcHJvY2Vzc2VkIGJ5dGVzIGF2YWlsYWJsZTwvcGFyYW1yZWY+DQorICAgIC8vLyA8cmVtYXJrcz5PbiByZXR1cm4gZnJvbSB0aGlzIG1ldGhvZCwgdGhlIGRhdGEgbWF5IGJlIG92ZXJ3cml0dGVuLCBzbyBncmFiIGl0IHdoaWxlIHlvdSBjYW4uDQorICAgIC8vLyBZb3UgY2Fubm90IGFzc3VtZSB0aGF0IHN0YXJ0SW5kZXggd2lsbCBiZSB6ZXJvLg0KKyAgICAvLy8gPC9yZW1hcmtzPg0KKyAgICBwdWJsaWMgZGVsZWdhdGUgdm9pZCBEYXRhQXZhaWxhYmxlSGFuZGxlcihieXRlW10gZGF0YSwgaW50IHN0YXJ0SW5kZXgsIGludCBjb3VudCk7DQorDQorICAgIC8vLyA8c3VtbWFyeT4NCisgICAgLy8vIERlY2xhcmVzIG1ldGhvZHMgYW5kIGV2ZW50cyBmb3IgaW1wbGVtZW50aW5nIGNvbXByZXNzb3JzL2RlY29tcHJlc3NvcnMNCisgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgcHVibGljIGludGVyZmFjZSBDb2RlYw0KKyAgICB7DQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gT2NjdXJzIHdoZW4gbW9yZSBwcm9jZXNzZWQgZGF0YSBhcmUgYXZhaWxhYmxlLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIGV2ZW50IERhdGFBdmFpbGFibGVIYW5kbGVyIERhdGFBdmFpbGFibGU7DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gQWRkcyBtb3JlIGRhdGEgdG8gdGhlIGNvZGVjIHRvIGJlIHByb2Nlc3NlZC4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImRhdGEiPkJ5dGUgYXJyYXkgY29udGFpbmluZyB0aGUgZGF0YSB0byBiZSBhZGRlZCB0byB0aGUgY29kZWM8L3BhcmFtPg0KKyAgICAgICAgLy8vIDxyZW1hcmtzPkFkZGluZyBkYXRhIG1heSwgb3IgbWF5IG5vdCwgcmFpc2UgdGhlIDxjPkRhdGFBdmFpbGFibGU8L2M+IGV2ZW50PC9yZW1hcmtzPg0KKyAgICAgICAgdm9pZCBBZGQoYnl0ZVtdIGRhdGEpOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIEFkZHMgbW9yZSBkYXRhIHRvIHRoZSBjb2RlYyB0byBiZSBwcm9jZXNzZWQuDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJkYXRhIj5CeXRlIGFycmF5IGNvbnRhaW5pbmcgdGhlIGRhdGEgdG8gYmUgYWRkZWQgdG8gdGhlIGNvZGVjPC9wYXJhbT4NCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ib2Zmc2V0Ij5UaGUgaW5kZXggb2YgdGhlIGZpcnN0IGJ5dGUgdG8gYWRkIGZyb20gPGM+ZGF0YTwvYz48L3BhcmFtPg0KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjb3VudCI+VGhlIG51bWJlciBvZiBieXRlcyB0byBhZGQ8L3BhcmFtPg0KKyAgICAgICAgLy8vIDxyZW1hcmtzPkFkZGluZyBkYXRhIG1heSwgb3IgbWF5IG5vdCwgcmFpc2UgdGhlIDxjPkRhdGFBdmFpbGFibGU8L2M+IGV2ZW50PC9yZW1hcmtzPg0KKyAgICAgICAgdm9pZCBBZGQoYnl0ZVtdIGRhdGEsIGludCBvZmZzZXQsIGludCBjb3VudCk7DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gRmluaXNoZXMgdXAgYW55IHBlbmRpbmcgZGF0YSB0aGF0IG5lZWRzIHRvIGJlIHByb2Nlc3NlZCBhbmQgaGFuZGxlZC4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICB2b2lkIEZpbmlzaCgpOw0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIEdldHMgdGhlIGNoZWNrc3VtIG9mIHRoZSBkYXRhIHRoYXQgaGFzIGJlZW4gYWRkZWQgc28gZmFyDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgdWludCBDaGVja3N1bSB7IGdldDsgfQ0KKw0KKw0KKyAgICB9DQorDQorICAgICNlbmRyZWdpb24NCisNCisgICAgI3JlZ2lvbiBDbGFzc2VzDQorICAgIC8vLyA8c3VtbWFyeT4NCisgICAgLy8vIEVuY2Fwc3VsYXRlcyBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBaTGliIGxpYnJhcnkNCisgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgcHVibGljIGNsYXNzIEluZm8NCisgICAgew0KKyAgICAgICAgI3JlZ2lvbiBETEwgaW1wb3J0cw0KKyAgICAgICAgW0RsbEltcG9ydCgiWkxJQjEuZGxsIiwgQ2FsbGluZ0NvbnZlbnRpb249Q2FsbGluZ0NvbnZlbnRpb24uQ2RlY2wpXQ0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZXh0ZXJuIHVpbnQgemxpYkNvbXBpbGVGbGFncygpOw0KKw0KKyAgICAgICAgW0RsbEltcG9ydCgiWkxJQjEuZGxsIiwgQ2FsbGluZ0NvbnZlbnRpb249Q2FsbGluZ0NvbnZlbnRpb24uQ2RlY2wpXQ0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZXh0ZXJuIHN0cmluZyB6bGliVmVyc2lvbigpOw0KKyAgICAgICAgI2VuZHJlZ2lvbg0KKw0KKyAgICAgICAgI3JlZ2lvbiBQcml2YXRlIHN0dWZmDQorICAgICAgICBwcml2YXRlIHVpbnQgX2ZsYWdzOw0KKw0KKyAgICAgICAgLy8gaGVscGVyIGZ1bmN0aW9uIHRoYXQgdW5wYWNrcyBhIGJpdHNpemUgbWFzaw0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGJpdFNpemUodWludCBiaXRzKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHN3aXRjaCAoYml0cykNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuIDE2Ow0KKyAgICAgICAgICAgICAgICBjYXNlIDE6IHJldHVybiAzMjsNCisgICAgICAgICAgICAgICAgY2FzZSAyOiByZXR1cm4gNjQ7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJldHVybiAtMTsNCisgICAgICAgIH0NCisgICAgICAgICNlbmRyZWdpb24NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBDb25zdHJ1Y3RzIGFuIGluc3RhbmNlIG9mIHRoZSA8Yz5JbmZvPC9jPiBjbGFzcy4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgSW5mbygpDQorICAgICAgICB7DQorICAgICAgICAgICAgX2ZsYWdzID0gemxpYkNvbXBpbGVGbGFncygpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFRydWUgaWYgdGhlIGxpYnJhcnkgaXMgY29tcGlsZWQgd2l0aCBkZWJ1ZyBpbmZvDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIGJvb2wgSGFzRGVidWdJbmZvIHsgZ2V0IHsgcmV0dXJuIDAgIT0gKF9mbGFncyAmIDB4MTAwKTsgfSB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gVHJ1ZSBpZiB0aGUgbGlicmFyeSBpcyBjb21waWxlZCB3aXRoIGFzc2VtYmx5IG9wdGltaXphdGlvbnMNCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgYm9vbCBVc2VzQXNzZW1ibHlDb2RlIHsgZ2V0IHsgcmV0dXJuIDAgIT0gKF9mbGFncyAmIDB4MjAwKTsgfSB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gR2V0cyB0aGUgc2l6ZSBvZiB0aGUgdW5zaWduZWQgaW50IHRoYXQgd2FzIGNvbXBpbGVkIGludG8gWmxpYg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBpbnQgU2l6ZU9mVUludCB7IGdldCB7IHJldHVybiBiaXRTaXplKF9mbGFncyAmIDMpOyB9IH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBHZXRzIHRoZSBzaXplIG9mIHRoZSB1bnNpZ25lZCBsb25nIHRoYXQgd2FzIGNvbXBpbGVkIGludG8gWmxpYg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBpbnQgU2l6ZU9mVUxvbmcgeyBnZXQgeyByZXR1cm4gYml0U2l6ZSgoX2ZsYWdzID4+IDIpICYgMyk7IH0gfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIEdldHMgdGhlIHNpemUgb2YgdGhlIHBvaW50ZXJzIHRoYXQgd2VyZSBjb21waWxlZCBpbnRvIFpsaWINCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgaW50IFNpemVPZlBvaW50ZXIgeyBnZXQgeyByZXR1cm4gYml0U2l6ZSgoX2ZsYWdzID4+IDQpICYgMyk7IH0gfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIEdldHMgdGhlIHNpemUgb2YgdGhlIHpfb2ZmX3QgdHlwZSB0aGF0IHdhcyBjb21waWxlZCBpbnRvIFpsaWINCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgaW50IFNpemVPZk9mZnNldCB7IGdldCB7IHJldHVybiBiaXRTaXplKChfZmxhZ3MgPj4gNikgJiAzKTsgfSB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gR2V0cyB0aGUgdmVyc2lvbiBvZiBaTGliIGFzIGEgc3RyaW5nLCBlLmcuICIxLjIuMSINCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgc3RhdGljIHN0cmluZyBWZXJzaW9uIHsgZ2V0IHsgcmV0dXJuIHpsaWJWZXJzaW9uKCk7IH0gfQ0KKyAgICB9DQorDQorICAgICNlbmRyZWdpb24NCisNCit9DQpkaWZmIC0tZ2l0IGEvemxpYi0xLjIuNi9jb250cmliL2RvdHpsaWIvRG90WkxpYi9Eb3RaTGliLmNzcHJvaiBiL3psaWItMS4yLjYvY29udHJpYi9kb3R6bGliL0RvdFpMaWIvRG90WkxpYi5jc3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFlZWI4NQotLS0gL2Rldi9udWxsCisrKyBiL3psaWItMS4yLjYvY29udHJpYi9kb3R6bGliL0RvdFpMaWIvRG90WkxpYi5jc3Byb2oKQEAgLTAsMCArMSwxNDEgQEAKKzxWaXN1YWxTdHVkaW9Qcm9qZWN0Pg0KKyAgICA8Q1NIQVJQDQorICAgICAgICBQcm9qZWN0VHlwZSA9ICJMb2NhbCINCisgICAgICAgIFByb2R1Y3RWZXJzaW9uID0gIjcuMTAuMzA3NyINCisgICAgICAgIFNjaGVtYVZlcnNpb24gPSAiMi4wIg0KKyAgICAgICAgUHJvamVjdEd1aWQgPSAie0JCMUVFMEIxLTE4MDgtNDZDQi1CNzg2LTk0OUQ5MTExN0ZDNX0iDQorICAgID4NCisgICAgICAgIDxCdWlsZD4NCisgICAgICAgICAgICA8U2V0dGluZ3MNCisgICAgICAgICAgICAgICAgQXBwbGljYXRpb25JY29uID0gIiINCisgICAgICAgICAgICAgICAgQXNzZW1ibHlLZXlDb250YWluZXJOYW1lID0gIiINCisgICAgICAgICAgICAgICAgQXNzZW1ibHlOYW1lID0gIkRvdFpMaWIiDQorICAgICAgICAgICAgICAgIEFzc2VtYmx5T3JpZ2luYXRvcktleUZpbGUgPSAiIg0KKyAgICAgICAgICAgICAgICBEZWZhdWx0Q2xpZW50U2NyaXB0ID0gIkpTY3JpcHQiDQorICAgICAgICAgICAgICAgIERlZmF1bHRIVE1MUGFnZUxheW91dCA9ICJHcmlkIg0KKyAgICAgICAgICAgICAgICBEZWZhdWx0VGFyZ2V0U2NoZW1hID0gIklFNTAiDQorICAgICAgICAgICAgICAgIERlbGF5U2lnbiA9ICJmYWxzZSINCisgICAgICAgICAgICAgICAgT3V0cHV0VHlwZSA9ICJMaWJyYXJ5Ig0KKyAgICAgICAgICAgICAgICBQcmVCdWlsZEV2ZW50ID0gIiINCisgICAgICAgICAgICAgICAgUG9zdEJ1aWxkRXZlbnQgPSAiIg0KKyAgICAgICAgICAgICAgICBSb290TmFtZXNwYWNlID0gIkRvdFpMaWIiDQorICAgICAgICAgICAgICAgIFJ1blBvc3RCdWlsZEV2ZW50ID0gIk9uQnVpbGRTdWNjZXNzIg0KKyAgICAgICAgICAgICAgICBTdGFydHVwT2JqZWN0ID0gIiINCisgICAgICAgICAgICA+DQorICAgICAgICAgICAgICAgIDxDb25maWcNCisgICAgICAgICAgICAgICAgICAgIE5hbWUgPSAiRGVidWciDQorICAgICAgICAgICAgICAgICAgICBBbGxvd1Vuc2FmZUJsb2NrcyA9ICJmYWxzZSINCisgICAgICAgICAgICAgICAgICAgIEJhc2VBZGRyZXNzID0gIjI4NTIxMjY3MiINCisgICAgICAgICAgICAgICAgICAgIENoZWNrRm9yT3ZlcmZsb3dVbmRlcmZsb3cgPSAiZmFsc2UiDQorICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uT3ZlcnJpZGVGaWxlID0gIiINCisgICAgICAgICAgICAgICAgICAgIERlZmluZUNvbnN0YW50cyA9ICJERUJVRztUUkFDRSINCisgICAgICAgICAgICAgICAgICAgIERvY3VtZW50YXRpb25GaWxlID0gImRvY3NcRG90WkxpYi54bWwiDQorICAgICAgICAgICAgICAgICAgICBEZWJ1Z1N5bWJvbHMgPSAidHJ1ZSINCisgICAgICAgICAgICAgICAgICAgIEZpbGVBbGlnbm1lbnQgPSAiNDA5NiINCisgICAgICAgICAgICAgICAgICAgIEluY3JlbWVudGFsQnVpbGQgPSAiZmFsc2UiDQorICAgICAgICAgICAgICAgICAgICBOb1N0ZExpYiA9ICJmYWxzZSINCisgICAgICAgICAgICAgICAgICAgIE5vV2FybiA9ICIxNTkxIg0KKyAgICAgICAgICAgICAgICAgICAgT3B0aW1pemUgPSAiZmFsc2UiDQorICAgICAgICAgICAgICAgICAgICBPdXRwdXRQYXRoID0gImJpblxEZWJ1Z1wiDQorICAgICAgICAgICAgICAgICAgICBSZWdpc3RlckZvckNvbUludGVyb3AgPSAiZmFsc2UiDQorICAgICAgICAgICAgICAgICAgICBSZW1vdmVJbnRlZ2VyQ2hlY2tzID0gImZhbHNlIg0KKyAgICAgICAgICAgICAgICAgICAgVHJlYXRXYXJuaW5nc0FzRXJyb3JzID0gImZhbHNlIg0KKyAgICAgICAgICAgICAgICAgICAgV2FybmluZ0xldmVsID0gIjQiDQorICAgICAgICAgICAgICAgIC8+DQorICAgICAgICAgICAgICAgIDxDb25maWcNCisgICAgICAgICAgICAgICAgICAgIE5hbWUgPSAiUmVsZWFzZSINCisgICAgICAgICAgICAgICAgICAgIEFsbG93VW5zYWZlQmxvY2tzID0gImZhbHNlIg0KKyAgICAgICAgICAgICAgICAgICAgQmFzZUFkZHJlc3MgPSAiMjg1MjEyNjcyIg0KKyAgICAgICAgICAgICAgICAgICAgQ2hlY2tGb3JPdmVyZmxvd1VuZGVyZmxvdyA9ICJmYWxzZSINCisgICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb25PdmVycmlkZUZpbGUgPSAiIg0KKyAgICAgICAgICAgICAgICAgICAgRGVmaW5lQ29uc3RhbnRzID0gIlRSQUNFIg0KKyAgICAgICAgICAgICAgICAgICAgRG9jdW1lbnRhdGlvbkZpbGUgPSAiZG9jc1xEb3RaTGliLnhtbCINCisgICAgICAgICAgICAgICAgICAgIERlYnVnU3ltYm9scyA9ICJmYWxzZSINCisgICAgICAgICAgICAgICAgICAgIEZpbGVBbGlnbm1lbnQgPSAiNDA5NiINCisgICAgICAgICAgICAgICAgICAgIEluY3JlbWVudGFsQnVpbGQgPSAiZmFsc2UiDQorICAgICAgICAgICAgICAgICAgICBOb1N0ZExpYiA9ICJmYWxzZSINCisgICAgICAgICAgICAgICAgICAgIE5vV2FybiA9ICIiDQorICAgICAgICAgICAgICAgICAgICBPcHRpbWl6ZSA9ICJ0cnVlIg0KKyAgICAgICAgICAgICAgICAgICAgT3V0cHV0UGF0aCA9ICJiaW5cUmVsZWFzZVwiDQorICAgICAgICAgICAgICAgICAgICBSZWdpc3RlckZvckNvbUludGVyb3AgPSAiZmFsc2UiDQorICAgICAgICAgICAgICAgICAgICBSZW1vdmVJbnRlZ2VyQ2hlY2tzID0gImZhbHNlIg0KKyAgICAgICAgICAgICAgICAgICAgVHJlYXRXYXJuaW5nc0FzRXJyb3JzID0gImZhbHNlIg0KKyAgICAgICAgICAgICAgICAgICAgV2FybmluZ0xldmVsID0gIjQiDQorICAgICAgICAgICAgICAgIC8+DQorICAgICAgICAgICAgPC9TZXR0aW5ncz4NCisgICAgICAgICAgICA8UmVmZXJlbmNlcz4NCisgICAgICAgICAgICAgICAgPFJlZmVyZW5jZQ0KKyAgICAgICAgICAgICAgICAgICAgTmFtZSA9ICJTeXN0ZW0iDQorICAgICAgICAgICAgICAgICAgICBBc3NlbWJseU5hbWUgPSAiU3lzdGVtIg0KKyAgICAgICAgICAgICAgICAgICAgSGludFBhdGggPSAiQzpcV0lOTlRcTWljcm9zb2Z0Lk5FVFxGcmFtZXdvcmtcdjEuMS40MzIyXFN5c3RlbS5kbGwiDQorICAgICAgICAgICAgICAgIC8+DQorICAgICAgICAgICAgICAgIDxSZWZlcmVuY2UNCisgICAgICAgICAgICAgICAgICAgIE5hbWUgPSAiU3lzdGVtLkRhdGEiDQorICAgICAgICAgICAgICAgICAgICBBc3NlbWJseU5hbWUgPSAiU3lzdGVtLkRhdGEiDQorICAgICAgICAgICAgICAgICAgICBIaW50UGF0aCA9ICJDOlxXSU5OVFxNaWNyb3NvZnQuTkVUXEZyYW1ld29ya1x2MS4xLjQzMjJcU3lzdGVtLkRhdGEuZGxsIg0KKyAgICAgICAgICAgICAgICAvPg0KKyAgICAgICAgICAgICAgICA8UmVmZXJlbmNlDQorICAgICAgICAgICAgICAgICAgICBOYW1lID0gIlN5c3RlbS5YTUwiDQorICAgICAgICAgICAgICAgICAgICBBc3NlbWJseU5hbWUgPSAiU3lzdGVtLlhtbCINCisgICAgICAgICAgICAgICAgICAgIEhpbnRQYXRoID0gIkM6XFdJTk5UXE1pY3Jvc29mdC5ORVRcRnJhbWV3b3JrXHYxLjEuNDMyMlxTeXN0ZW0uWE1MLmRsbCINCisgICAgICAgICAgICAgICAgLz4NCisgICAgICAgICAgICAgICAgPFJlZmVyZW5jZQ0KKyAgICAgICAgICAgICAgICAgICAgTmFtZSA9ICJudW5pdC5mcmFtZXdvcmsiDQorICAgICAgICAgICAgICAgICAgICBBc3NlbWJseU5hbWUgPSAibnVuaXQuZnJhbWV3b3JrIg0KKyAgICAgICAgICAgICAgICAgICAgSGludFBhdGggPSAiRTpcYXBwc1xOVW5pdCBWMi4xXFxiaW5cbnVuaXQuZnJhbWV3b3JrLmRsbCINCisgICAgICAgICAgICAgICAgICAgIEFzc2VtYmx5Rm9sZGVyS2V5ID0gImhrbG1cZG5cbnVuaXQuZnJhbWV3b3JrIg0KKyAgICAgICAgICAgICAgICAvPg0KKyAgICAgICAgICAgIDwvUmVmZXJlbmNlcz4NCisgICAgICAgIDwvQnVpbGQ+DQorICAgICAgICA8RmlsZXM+DQorICAgICAgICAgICAgPEluY2x1ZGU+DQorICAgICAgICAgICAgICAgIDxGaWxlDQorICAgICAgICAgICAgICAgICAgICBSZWxQYXRoID0gIkFzc2VtYmx5SW5mby5jcyINCisgICAgICAgICAgICAgICAgICAgIFN1YlR5cGUgPSAiQ29kZSINCisgICAgICAgICAgICAgICAgICAgIEJ1aWxkQWN0aW9uID0gIkNvbXBpbGUiDQorICAgICAgICAgICAgICAgIC8+DQorICAgICAgICAgICAgICAgIDxGaWxlDQorICAgICAgICAgICAgICAgICAgICBSZWxQYXRoID0gIkNoZWNrc3VtSW1wbC5jcyINCisgICAgICAgICAgICAgICAgICAgIFN1YlR5cGUgPSAiQ29kZSINCisgICAgICAgICAgICAgICAgICAgIEJ1aWxkQWN0aW9uID0gIkNvbXBpbGUiDQorICAgICAgICAgICAgICAgIC8+DQorICAgICAgICAgICAgICAgIDxGaWxlDQorICAgICAgICAgICAgICAgICAgICBSZWxQYXRoID0gIkNpcmN1bGFyQnVmZmVyLmNzIg0KKyAgICAgICAgICAgICAgICAgICAgU3ViVHlwZSA9ICJDb2RlIg0KKyAgICAgICAgICAgICAgICAgICAgQnVpbGRBY3Rpb24gPSAiQ29tcGlsZSINCisgICAgICAgICAgICAgICAgLz4NCisgICAgICAgICAgICAgICAgPEZpbGUNCisgICAgICAgICAgICAgICAgICAgIFJlbFBhdGggPSAiQ29kZWNCYXNlLmNzIg0KKyAgICAgICAgICAgICAgICAgICAgU3ViVHlwZSA9ICJDb2RlIg0KKyAgICAgICAgICAgICAgICAgICAgQnVpbGRBY3Rpb24gPSAiQ29tcGlsZSINCisgICAgICAgICAgICAgICAgLz4NCisgICAgICAgICAgICAgICAgPEZpbGUNCisgICAgICAgICAgICAgICAgICAgIFJlbFBhdGggPSAiRGVmbGF0ZXIuY3MiDQorICAgICAgICAgICAgICAgICAgICBTdWJUeXBlID0gIkNvZGUiDQorICAgICAgICAgICAgICAgICAgICBCdWlsZEFjdGlvbiA9ICJDb21waWxlIg0KKyAgICAgICAgICAgICAgICAvPg0KKyAgICAgICAgICAgICAgICA8RmlsZQ0KKyAgICAgICAgICAgICAgICAgICAgUmVsUGF0aCA9ICJEb3RaTGliLmNzIg0KKyAgICAgICAgICAgICAgICAgICAgU3ViVHlwZSA9ICJDb2RlIg0KKyAgICAgICAgICAgICAgICAgICAgQnVpbGRBY3Rpb24gPSAiQ29tcGlsZSINCisgICAgICAgICAgICAgICAgLz4NCisgICAgICAgICAgICAgICAgPEZpbGUNCisgICAgICAgICAgICAgICAgICAgIFJlbFBhdGggPSAiR1ppcFN0cmVhbS5jcyINCisgICAgICAgICAgICAgICAgICAgIFN1YlR5cGUgPSAiQ29kZSINCisgICAgICAgICAgICAgICAgICAgIEJ1aWxkQWN0aW9uID0gIkNvbXBpbGUiDQorICAgICAgICAgICAgICAgIC8+DQorICAgICAgICAgICAgICAgIDxGaWxlDQorICAgICAgICAgICAgICAgICAgICBSZWxQYXRoID0gIkluZmxhdGVyLmNzIg0KKyAgICAgICAgICAgICAgICAgICAgU3ViVHlwZSA9ICJDb2RlIg0KKyAgICAgICAgICAgICAgICAgICAgQnVpbGRBY3Rpb24gPSAiQ29tcGlsZSINCisgICAgICAgICAgICAgICAgLz4NCisgICAgICAgICAgICAgICAgPEZpbGUNCisgICAgICAgICAgICAgICAgICAgIFJlbFBhdGggPSAiVW5pdFRlc3RzLmNzIg0KKyAgICAgICAgICAgICAgICAgICAgU3ViVHlwZSA9ICJDb2RlIg0KKyAgICAgICAgICAgICAgICAgICAgQnVpbGRBY3Rpb24gPSAiQ29tcGlsZSINCisgICAgICAgICAgICAgICAgLz4NCisgICAgICAgICAgICA8L0luY2x1ZGU+DQorICAgICAgICA8L0ZpbGVzPg0KKyAgICA8L0NTSEFSUD4NCis8L1Zpc3VhbFN0dWRpb1Byb2plY3Q+DQorDQpkaWZmIC0tZ2l0IGEvemxpYi0xLjIuNi9jb250cmliL2RvdHpsaWIvRG90WkxpYi9HWmlwU3RyZWFtLmNzIGIvemxpYi0xLjIuNi9jb250cmliL2RvdHpsaWIvRG90WkxpYi9HWmlwU3RyZWFtLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxNjEzMDAKLS0tIC9kZXYvbnVsbAorKysgYi96bGliLTEuMi42L2NvbnRyaWIvZG90emxpYi9Eb3RaTGliL0daaXBTdHJlYW0uY3MKQEAgLTAsMCArMSwzMDEgQEAKKy8vDQorLy8gqSBDb3B5cmlnaHQgSGVucmlrIFJhdm4gMjAwNA0KKy8vDQorLy8gVXNlLCBtb2RpZmljYXRpb24gYW5kIGRpc3RyaWJ1dGlvbiBhcmUgc3ViamVjdCB0byB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuDQorLy8gKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpDQorLy8NCisNCit1c2luZyBTeXN0ZW07DQordXNpbmcgU3lzdGVtLklPOw0KK3VzaW5nIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlczsNCisNCituYW1lc3BhY2UgRG90WkxpYg0KK3sNCisJLy8vIDxzdW1tYXJ5Pg0KKwkvLy8gSW1wbGVtZW50cyBhIGNvbXByZXNzZWQgPHNlZSBjcmVmPSJTdHJlYW0iLz4sIGluIEdaaXAgKC5neikgZm9ybWF0Lg0KKwkvLy8gPC9zdW1tYXJ5Pg0KKwlwdWJsaWMgY2xhc3MgR1ppcFN0cmVhbSA6IFN0cmVhbSwgSURpc3Bvc2FibGUNCisJew0KKyAgICAgICAgI3JlZ2lvbiBEbGwgSW1wb3J0cw0KKyAgICAgICAgW0RsbEltcG9ydCgiWkxJQjEuZGxsIiwgQ2FsbGluZ0NvbnZlbnRpb249Q2FsbGluZ0NvbnZlbnRpb24uQ2RlY2wsIENoYXJTZXQ9Q2hhclNldC5BbnNpKV0NCisgICAgICAgIHByaXZhdGUgc3RhdGljIGV4dGVybiBJbnRQdHIgZ3pvcGVuKHN0cmluZyBuYW1lLCBzdHJpbmcgbW9kZSk7DQorDQorICAgICAgICBbRGxsSW1wb3J0KCJaTElCMS5kbGwiLCBDYWxsaW5nQ29udmVudGlvbj1DYWxsaW5nQ29udmVudGlvbi5DZGVjbCldDQorICAgICAgICBwcml2YXRlIHN0YXRpYyBleHRlcm4gaW50IGd6Y2xvc2UoSW50UHRyIGd6RmlsZSk7DQorDQorICAgICAgICBbRGxsSW1wb3J0KCJaTElCMS5kbGwiLCBDYWxsaW5nQ29udmVudGlvbj1DYWxsaW5nQ29udmVudGlvbi5DZGVjbCldDQorICAgICAgICBwcml2YXRlIHN0YXRpYyBleHRlcm4gaW50IGd6d3JpdGUoSW50UHRyIGd6RmlsZSwgaW50IGRhdGEsIGludCBsZW5ndGgpOw0KKw0KKyAgICAgICAgW0RsbEltcG9ydCgiWkxJQjEuZGxsIiwgQ2FsbGluZ0NvbnZlbnRpb249Q2FsbGluZ0NvbnZlbnRpb24uQ2RlY2wpXQ0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZXh0ZXJuIGludCBnenJlYWQoSW50UHRyIGd6RmlsZSwgaW50IGRhdGEsIGludCBsZW5ndGgpOw0KKw0KKyAgICAgICAgW0RsbEltcG9ydCgiWkxJQjEuZGxsIiwgQ2FsbGluZ0NvbnZlbnRpb249Q2FsbGluZ0NvbnZlbnRpb24uQ2RlY2wpXQ0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZXh0ZXJuIGludCBnemdldGMoSW50UHRyIGd6RmlsZSk7DQorDQorICAgICAgICBbRGxsSW1wb3J0KCJaTElCMS5kbGwiLCBDYWxsaW5nQ29udmVudGlvbj1DYWxsaW5nQ29udmVudGlvbi5DZGVjbCldDQorICAgICAgICBwcml2YXRlIHN0YXRpYyBleHRlcm4gaW50IGd6cHV0YyhJbnRQdHIgZ3pGaWxlLCBpbnQgYyk7DQorDQorICAgICAgICAjZW5kcmVnaW9uDQorDQorICAgICAgICAjcmVnaW9uIFByaXZhdGUgZGF0YQ0KKyAgICAgICAgcHJpdmF0ZSBJbnRQdHIgX2d6RmlsZTsNCisgICAgICAgIHByaXZhdGUgYm9vbCBfaXNEaXNwb3NlZCA9IGZhbHNlOw0KKyAgICAgICAgcHJpdmF0ZSBib29sIF9pc1dyaXRpbmc7DQorICAgICAgICAjZW5kcmVnaW9uDQorDQorICAgICAgICAjcmVnaW9uIENvbnN0cnVjdG9ycw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIENyZWF0ZXMgYSBuZXcgZmlsZSBhcyBhIHdyaXRlYWJsZSBHWmlwU3RyZWFtDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJmaWxlTmFtZSI+VGhlIG5hbWUgb2YgdGhlIGNvbXByZXNzZWQgZmlsZSB0byBjcmVhdGU8L3BhcmFtPg0KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJsZXZlbCI+VGhlIGNvbXByZXNzaW9uIGxldmVsIHRvIHVzZSB3aGVuIGFkZGluZyBkYXRhPC9wYXJhbT4NCisgICAgICAgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9IlpMaWJFeGNlcHRpb24iPklmIGFuIGVycm9yIG9jY3VycmVkIGluIHRoZSBpbnRlcm5hbCB6bGliIGZ1bmN0aW9uPC9leGNlcHRpb24+DQorCQlwdWJsaWMgR1ppcFN0cmVhbShzdHJpbmcgZmlsZU5hbWUsIENvbXByZXNzTGV2ZWwgbGV2ZWwpDQorCQl7DQorICAgICAgICAgICAgX2lzV3JpdGluZyA9IHRydWU7DQorICAgICAgICAgICAgX2d6RmlsZSA9IGd6b3BlbihmaWxlTmFtZSwgU3RyaW5nLkZvcm1hdCgid2J7MH0iLCAoaW50KWxldmVsKSk7DQorICAgICAgICAgICAgaWYgKF9nekZpbGUgPT0gSW50UHRyLlplcm8pDQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBaTGliRXhjZXB0aW9uKC0xLCAiQ291bGQgbm90IG9wZW4gIiArIGZpbGVOYW1lKTsNCisJCX0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBPcGVucyBhbiBleGlzdGluZyBmaWxlIGFzIGEgcmVhZGFibGUgR1ppcFN0cmVhbQ0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZmlsZU5hbWUiPlRoZSBuYW1lIG9mIHRoZSBmaWxlIHRvIG9wZW48L3BhcmFtPg0KKyAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iWkxpYkV4Y2VwdGlvbiI+SWYgYW4gZXJyb3Igb2NjdXJyZWQgaW4gdGhlIGludGVybmFsIHpsaWIgZnVuY3Rpb248L2V4Y2VwdGlvbj4NCisgICAgICAgIHB1YmxpYyBHWmlwU3RyZWFtKHN0cmluZyBmaWxlTmFtZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBfaXNXcml0aW5nID0gZmFsc2U7DQorICAgICAgICAgICAgX2d6RmlsZSA9IGd6b3BlbihmaWxlTmFtZSwgInJiIik7DQorICAgICAgICAgICAgaWYgKF9nekZpbGUgPT0gSW50UHRyLlplcm8pDQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBaTGliRXhjZXB0aW9uKC0xLCAiQ291bGQgbm90IG9wZW4gIiArIGZpbGVOYW1lKTsNCisNCisgICAgICAgIH0NCisgICAgICAgICNlbmRyZWdpb24NCisNCisgICAgICAgICNyZWdpb24gQWNjZXNzIHByb3BlcnRpZXMNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBSZXR1cm5zIHRydWUgb2YgdGhpcyBzdHJlYW0gY2FuIGJlIHJlYWQgZnJvbSwgZmFsc2Ugb3RoZXJ3aXNlDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgQ2FuUmVhZA0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGdldA0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuICFfaXNXcml0aW5nOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBSZXR1cm5zIGZhbHNlLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIENhblNlZWsNCisgICAgICAgIHsNCisgICAgICAgICAgICBnZXQNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoaXMgdHNyZWFtIGlzIHdyaXRlYWJsZSwgZmFsc2Ugb3RoZXJ3aXNlDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgQ2FuV3JpdGUNCisgICAgICAgIHsNCisgICAgICAgICAgICBnZXQNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHJldHVybiBfaXNXcml0aW5nOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgICNlbmRyZWdpb24NCisNCisgICAgICAgICNyZWdpb24gRGVzdHJ1Y3RvciAmIElEaXNwb3NlIHN0dWZmDQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gRGVzdHJveXMgdGhpcyBpbnN0YW5jZQ0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIH5HWmlwU3RyZWFtKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBjbGVhblVwKGZhbHNlKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBDbG9zZXMgdGhlIGV4dGVybmFsIGZpbGUgaGFuZGxlDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgcHVibGljIHZvaWQgRGlzcG9zZSgpDQorICAgICAgICB7DQorICAgICAgICAgICAgY2xlYW5VcCh0cnVlKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vIERvZXMgdGhlIGFjdHVhbCBjbG9zaW5nIG9mIHRoZSBmaWxlIGhhbmRsZS4NCisgICAgICAgIHByaXZhdGUgdm9pZCBjbGVhblVwKGJvb2wgaXNEaXNwb3NpbmcpDQorICAgICAgICB7DQorICAgICAgICAgICAgaWYgKCFfaXNEaXNwb3NlZCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGd6Y2xvc2UoX2d6RmlsZSk7DQorICAgICAgICAgICAgICAgIF9pc0Rpc3Bvc2VkID0gdHJ1ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICAjZW5kcmVnaW9uDQorDQorICAgICAgICAjcmVnaW9uIEJhc2ljIHJlYWRpbmcgYW5kIHdyaXRpbmcNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBBdHRlbXB0cyB0byByZWFkIGEgbnVtYmVyIG9mIGJ5dGVzIGZyb20gdGhlIHN0cmVhbS4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImJ1ZmZlciI+VGhlIGRlc3RpbmF0aW9uIGRhdGEgYnVmZmVyPC9wYXJhbT4NCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ib2Zmc2V0Ij5UaGUgaW5kZXggb2YgdGhlIGZpcnN0IGRlc3RpbmF0aW9uIGJ5dGUgaW4gPGM+YnVmZmVyPC9jPjwvcGFyYW0+DQorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNvdW50Ij5UaGUgbnVtYmVyIG9mIGJ5dGVzIHJlcXVlc3RlZDwvcGFyYW0+DQorICAgICAgICAvLy8gPHJldHVybnM+VGhlIG51bWJlciBvZiBieXRlcyByZWFkPC9yZXR1cm5zPg0KKyAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iQXJndW1lbnROdWxsRXhjZXB0aW9uIj5JZiA8Yz5idWZmZXI8L2M+IGlzIG51bGw8L2V4Y2VwdGlvbj4NCisgICAgICAgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9IkFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbiI+SWYgPGM+Y291bnQ8L2M+IG9yIDxjPm9mZnNldDwvYz4gYXJlIG5lZ2F0aXZlPC9leGNlcHRpb24+DQorICAgICAgICAvLy8gPGV4Y2VwdGlvbiBjcmVmPSJBcmd1bWVudEV4Y2VwdGlvbiI+SWYgPGM+b2Zmc2V0PC9jPiAgKyA8Yz5jb3VudDwvYz4gaXMgJmd0OyBidWZmZXIuTGVuZ3RoPC9leGNlcHRpb24+DQorICAgICAgICAvLy8gPGV4Y2VwdGlvbiBjcmVmPSJOb3RTdXBwb3J0ZWRFeGNlcHRpb24iPklmIHRoaXMgc3RyZWFtIGlzIG5vdCByZWFkYWJsZS48L2V4Y2VwdGlvbj4NCisgICAgICAgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9Ik9iamVjdERpc3Bvc2VkRXhjZXB0aW9uIj5JZiB0aGlzIHN0cmVhbSBoYXMgYmVlbiBkaXNwb3NlZC48L2V4Y2VwdGlvbj4NCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgUmVhZChieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgY291bnQpDQorICAgICAgICB7DQorICAgICAgICAgICAgaWYgKCFDYW5SZWFkKSB0aHJvdyBuZXcgTm90U3VwcG9ydGVkRXhjZXB0aW9uKCk7DQorICAgICAgICAgICAgaWYgKGJ1ZmZlciA9PSBudWxsKSB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKCk7DQorICAgICAgICAgICAgaWYgKG9mZnNldCA8IDAgfHwgY291bnQgPCAwKSB0aHJvdyBuZXcgQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uKCk7DQorICAgICAgICAgICAgaWYgKChvZmZzZXQrY291bnQpID4gYnVmZmVyLkxlbmd0aCkgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCk7DQorICAgICAgICAgICAgaWYgKF9pc0Rpc3Bvc2VkKSB0aHJvdyBuZXcgT2JqZWN0RGlzcG9zZWRFeGNlcHRpb24oIkdaaXBTdHJlYW0iKTsNCisNCisgICAgICAgICAgICBHQ0hhbmRsZSBoID0gR0NIYW5kbGUuQWxsb2MoYnVmZmVyLCBHQ0hhbmRsZVR5cGUuUGlubmVkKTsNCisgICAgICAgICAgICBpbnQgcmVzdWx0Ow0KKyAgICAgICAgICAgIHRyeQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gZ3pyZWFkKF9nekZpbGUsIGguQWRkck9mUGlubmVkT2JqZWN0KCkuVG9JbnQzMigpICsgb2Zmc2V0LCBjb3VudCk7DQorICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPCAwKQ0KKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGZpbmFsbHkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGguRnJlZSgpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIEF0dGVtcHRzIHRvIHJlYWQgYSBzaW5nbGUgYnl0ZSBmcm9tIHRoZSBzdHJlYW0uDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgLy8vIDxyZXR1cm5zPlRoZSBieXRlIHRoYXQgd2FzIHJlYWQsIG9yIC0xIGluIGNhc2Ugb2YgZXJyb3Igb3IgRW5kLU9mLUZpbGU8L3JldHVybnM+DQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFJlYWRCeXRlKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBpZiAoIUNhblJlYWQpIHRocm93IG5ldyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24oKTsNCisgICAgICAgICAgICBpZiAoX2lzRGlzcG9zZWQpIHRocm93IG5ldyBPYmplY3REaXNwb3NlZEV4Y2VwdGlvbigiR1ppcFN0cmVhbSIpOw0KKyAgICAgICAgICAgIHJldHVybiBnemdldGMoX2d6RmlsZSk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gV3JpdGVzIGEgbnVtYmVyIG9mIGJ5dGVzIHRvIHRoZSBzdHJlYW0NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImJ1ZmZlciI+PC9wYXJhbT4NCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ib2Zmc2V0Ij48L3BhcmFtPg0KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjb3VudCI+PC9wYXJhbT4NCisgICAgICAgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9IkFyZ3VtZW50TnVsbEV4Y2VwdGlvbiI+SWYgPGM+YnVmZmVyPC9jPiBpcyBudWxsPC9leGNlcHRpb24+DQorICAgICAgICAvLy8gPGV4Y2VwdGlvbiBjcmVmPSJBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24iPklmIDxjPmNvdW50PC9jPiBvciA8Yz5vZmZzZXQ8L2M+IGFyZSBuZWdhdGl2ZTwvZXhjZXB0aW9uPg0KKyAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iQXJndW1lbnRFeGNlcHRpb24iPklmIDxjPm9mZnNldDwvYz4gICsgPGM+Y291bnQ8L2M+IGlzICZndDsgYnVmZmVyLkxlbmd0aDwvZXhjZXB0aW9uPg0KKyAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iTm90U3VwcG9ydGVkRXhjZXB0aW9uIj5JZiB0aGlzIHN0cmVhbSBpcyBub3Qgd3JpdGVhYmxlLjwvZXhjZXB0aW9uPg0KKyAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iT2JqZWN0RGlzcG9zZWRFeGNlcHRpb24iPklmIHRoaXMgc3RyZWFtIGhhcyBiZWVuIGRpc3Bvc2VkLjwvZXhjZXB0aW9uPg0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGUoYnl0ZVtdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGNvdW50KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGlmICghQ2FuV3JpdGUpIHRocm93IG5ldyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24oKTsNCisgICAgICAgICAgICBpZiAoYnVmZmVyID09IG51bGwpIHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24oKTsNCisgICAgICAgICAgICBpZiAob2Zmc2V0IDwgMCB8fCBjb3VudCA8IDApIHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oKTsNCisgICAgICAgICAgICBpZiAoKG9mZnNldCtjb3VudCkgPiBidWZmZXIuTGVuZ3RoKSB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oKTsNCisgICAgICAgICAgICBpZiAoX2lzRGlzcG9zZWQpIHRocm93IG5ldyBPYmplY3REaXNwb3NlZEV4Y2VwdGlvbigiR1ppcFN0cmVhbSIpOw0KKw0KKyAgICAgICAgICAgIEdDSGFuZGxlIGggPSBHQ0hhbmRsZS5BbGxvYyhidWZmZXIsIEdDSGFuZGxlVHlwZS5QaW5uZWQpOw0KKyAgICAgICAgICAgIHRyeQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgaW50IHJlc3VsdCA9IGd6d3JpdGUoX2d6RmlsZSwgaC5BZGRyT2ZQaW5uZWRPYmplY3QoKS5Ub0ludDMyKCkgKyBvZmZzZXQsIGNvdW50KTsNCisgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA8IDApDQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZmluYWxseQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgaC5GcmVlKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KKyAgICAgICAgLy8vIFdyaXRlcyBhIHNpbmdsZSBieXRlIHRvIHRoZSBzdHJlYW0NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InZhbHVlIj5UaGUgYnl0ZSB0byBhZGQgdG8gdGhlIHN0cmVhbS48L3BhcmFtPg0KKyAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iTm90U3VwcG9ydGVkRXhjZXB0aW9uIj5JZiB0aGlzIHN0cmVhbSBpcyBub3Qgd3JpdGVhYmxlLjwvZXhjZXB0aW9uPg0KKyAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iT2JqZWN0RGlzcG9zZWRFeGNlcHRpb24iPklmIHRoaXMgc3RyZWFtIGhhcyBiZWVuIGRpc3Bvc2VkLjwvZXhjZXB0aW9uPg0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVCeXRlKGJ5dGUgdmFsdWUpDQorICAgICAgICB7DQorICAgICAgICAgICAgaWYgKCFDYW5Xcml0ZSkgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigpOw0KKyAgICAgICAgICAgIGlmIChfaXNEaXNwb3NlZCkgdGhyb3cgbmV3IE9iamVjdERpc3Bvc2VkRXhjZXB0aW9uKCJHWmlwU3RyZWFtIik7DQorDQorICAgICAgICAgICAgaW50IHJlc3VsdCA9IGd6cHV0YyhfZ3pGaWxlLCAoaW50KXZhbHVlKTsNCisgICAgICAgICAgICBpZiAocmVzdWx0IDwgMCkNCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCk7DQorICAgICAgICB9DQorICAgICAgICAjZW5kcmVnaW9uDQorDQorICAgICAgICAjcmVnaW9uIFBvc2l0aW9uICYgbGVuZ3RoIHN0dWZmDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gTm90IHN1cHBvcnRlZC4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InZhbHVlIj48L3BhcmFtPg0KKyAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iTm90U3VwcG9ydGVkRXhjZXB0aW9uIj5BbHdheXMgdGhyb3duPC9leGNlcHRpb24+DQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBTZXRMZW5ndGgobG9uZyB2YWx1ZSkNCisgICAgICAgIHsNCisgICAgICAgICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkRXhjZXB0aW9uKCk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gIE5vdCBzdXBwcG9ydGVkLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ib2Zmc2V0Ij48L3BhcmFtPg0KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJvcmlnaW4iPjwvcGFyYW0+DQorICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPg0KKyAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iTm90U3VwcG9ydGVkRXhjZXB0aW9uIj5BbHdheXMgdGhyb3duPC9leGNlcHRpb24+DQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgbG9uZyBTZWVrKGxvbmcgb2Zmc2V0LCBTZWVrT3JpZ2luIG9yaWdpbikNCisgICAgICAgIHsNCisgICAgICAgICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkRXhjZXB0aW9uKCk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gRmx1c2hlcyB0aGUgPGM+R1ppcFN0cmVhbTwvYz4uDQorICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICAgICAgLy8vIDxyZW1hcmtzPkluIHRoaXMgaW1wbGVtZW50YXRpb24sIHRoaXMgbWV0aG9kIGRvZXMgbm90aGluZy4gVGhpcyBpcyBiZWNhdXNlIGV4Y2Vzc2l2ZQ0KKyAgICAgICAgLy8vIGZsdXNoaW5nIG1heSBkZWdyYWRlIHRoZSBhY2hpZXZhYmxlIGNvbXByZXNzaW9uIHJhdGVzLjwvcmVtYXJrcz4NCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIEZsdXNoKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICAvLyBsZWZ0IGVtcHR5IG9uIHB1cnBvc2UNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBHZXRzL3NldHMgdGhlIGN1cnJlbnQgcG9zaXRpb24gaW4gdGhlIDxjPkdaaXBTdHJlYW08L2M+LiBOb3Qgc3VwcHBvcnRlZC4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICAvLy8gPHJlbWFya3M+SW4gdGhpcyBpbXBsZW1lbnRhdGlvbiB0aGlzIHByb3BlcnR5IGlzIG5vdCBzdXBwb3J0ZWQ8L3JlbWFya3M+DQorICAgICAgICAvLy8gPGV4Y2VwdGlvbiBjcmVmPSJOb3RTdXBwb3J0ZWRFeGNlcHRpb24iPkFsd2F5cyB0aHJvd248L2V4Y2VwdGlvbj4NCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBsb25nIFBvc2l0aW9uDQorICAgICAgICB7DQorICAgICAgICAgICAgZ2V0DQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkRXhjZXB0aW9uKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHNldA0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBHZXRzIHRoZSBzaXplIG9mIHRoZSBzdHJlYW0uIE5vdCBzdXBwcG9ydGVkLg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIC8vLyA8cmVtYXJrcz5JbiB0aGlzIGltcGxlbWVudGF0aW9uIHRoaXMgcHJvcGVydHkgaXMgbm90IHN1cHBvcnRlZDwvcmVtYXJrcz4NCisgICAgICAgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9Ik5vdFN1cHBvcnRlZEV4Y2VwdGlvbiI+QWx3YXlzIHRocm93bjwvZXhjZXB0aW9uPg0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGxvbmcgTGVuZ3RoDQorICAgICAgICB7DQorICAgICAgICAgICAgZ2V0DQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkRXhjZXB0aW9uKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgI2VuZHJlZ2lvbg0KKyAgICB9DQorfQ0KZGlmZiAtLWdpdCBhL3psaWItMS4yLjYvY29udHJpYi9kb3R6bGliL0RvdFpMaWIvSW5mbGF0ZXIuY3MgYi96bGliLTEuMi42L2NvbnRyaWIvZG90emxpYi9Eb3RaTGliL0luZmxhdGVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlZDU0NTEKLS0tIC9kZXYvbnVsbAorKysgYi96bGliLTEuMi42L2NvbnRyaWIvZG90emxpYi9Eb3RaTGliL0luZmxhdGVyLmNzCkBAIC0wLDAgKzEsMTA1IEBACisvLw0KKy8vIKkgQ29weXJpZ2h0IEhlbnJpayBSYXZuIDIwMDQNCisvLw0KKy8vIFVzZSwgbW9kaWZpY2F0aW9uIGFuZCBkaXN0cmlidXRpb24gYXJlIHN1YmplY3QgdG8gdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLg0KKy8vIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQ0KKy8vDQorDQordXNpbmcgU3lzdGVtOw0KK3VzaW5nIFN5c3RlbS5EaWFnbm9zdGljczsNCit1c2luZyBTeXN0ZW0uUnVudGltZS5JbnRlcm9wU2VydmljZXM7DQorDQorbmFtZXNwYWNlIERvdFpMaWINCit7DQorDQorICAgIC8vLyA8c3VtbWFyeT4NCisgICAgLy8vIEltcGxlbWVudHMgYSBkYXRhIGRlY29tcHJlc3NvciwgdXNpbmcgdGhlIGluZmxhdGUgYWxnb3JpdGhtIGluIHRoZSBaTGliIGRsbA0KKyAgICAvLy8gPC9zdW1tYXJ5Pg0KKyAgICBwdWJsaWMgY2xhc3MgSW5mbGF0ZXIgOiBDb2RlY0Jhc2UNCisJew0KKyAgICAgICAgI3JlZ2lvbiBEbGwgaW1wb3J0cw0KKyAgICAgICAgW0RsbEltcG9ydCgiWkxJQjEuZGxsIiwgQ2FsbGluZ0NvbnZlbnRpb249Q2FsbGluZ0NvbnZlbnRpb24uQ2RlY2wsIENoYXJTZXQ9Q2hhclNldC5BbnNpKV0NCisgICAgICAgIHByaXZhdGUgc3RhdGljIGV4dGVybiBpbnQgaW5mbGF0ZUluaXRfKHJlZiBaU3RyZWFtIHN6LCBzdHJpbmcgdnMsIGludCBzaXplKTsNCisNCisgICAgICAgIFtEbGxJbXBvcnQoIlpMSUIxLmRsbCIsIENhbGxpbmdDb252ZW50aW9uPUNhbGxpbmdDb252ZW50aW9uLkNkZWNsKV0NCisgICAgICAgIHByaXZhdGUgc3RhdGljIGV4dGVybiBpbnQgaW5mbGF0ZShyZWYgWlN0cmVhbSBzeiwgaW50IGZsdXNoKTsNCisNCisgICAgICAgIFtEbGxJbXBvcnQoIlpMSUIxLmRsbCIsIENhbGxpbmdDb252ZW50aW9uPUNhbGxpbmdDb252ZW50aW9uLkNkZWNsKV0NCisgICAgICAgIHByaXZhdGUgc3RhdGljIGV4dGVybiBpbnQgaW5mbGF0ZVJlc2V0KHJlZiBaU3RyZWFtIHN6KTsNCisNCisgICAgICAgIFtEbGxJbXBvcnQoIlpMSUIxLmRsbCIsIENhbGxpbmdDb252ZW50aW9uPUNhbGxpbmdDb252ZW50aW9uLkNkZWNsKV0NCisgICAgICAgIHByaXZhdGUgc3RhdGljIGV4dGVybiBpbnQgaW5mbGF0ZUVuZChyZWYgWlN0cmVhbSBzeik7DQorICAgICAgICAjZW5kcmVnaW9uDQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gQ29uc3RydWN0cyBhbiBuZXcgaW5zdGFuY2Ugb2YgdGhlIDxjPkluZmxhdGVyPC9jPg0KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4NCisgICAgICAgIHB1YmxpYyBJbmZsYXRlcigpIDogYmFzZSgpDQorCQl7DQorICAgICAgICAgICAgaW50IHJldHZhbCA9IGluZmxhdGVJbml0XyhyZWYgX3p0cmVhbSwgSW5mby5WZXJzaW9uLCBNYXJzaGFsLlNpemVPZihfenRyZWFtKSk7DQorICAgICAgICAgICAgaWYgKHJldHZhbCAhPSAwKQ0KKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWkxpYkV4Y2VwdGlvbihyZXR2YWwsICJDb3VsZCBub3QgaW5pdGlhbGl6ZSBpbmZsYXRlciIpOw0KKw0KKyAgICAgICAgICAgIHJlc2V0T3V0cHV0KCk7DQorICAgICAgICB9DQorDQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gQWRkcyBtb3JlIGRhdGEgdG8gdGhlIGNvZGVjIHRvIGJlIHByb2Nlc3NlZC4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImRhdGEiPkJ5dGUgYXJyYXkgY29udGFpbmluZyB0aGUgZGF0YSB0byBiZSBhZGRlZCB0byB0aGUgY29kZWM8L3BhcmFtPg0KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJvZmZzZXQiPlRoZSBpbmRleCBvZiB0aGUgZmlyc3QgYnl0ZSB0byBhZGQgZnJvbSA8Yz5kYXRhPC9jPjwvcGFyYW0+DQorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNvdW50Ij5UaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGFkZDwvcGFyYW0+DQorICAgICAgICAvLy8gPHJlbWFya3M+QWRkaW5nIGRhdGEgbWF5LCBvciBtYXkgbm90LCByYWlzZSB0aGUgPGM+RGF0YUF2YWlsYWJsZTwvYz4gZXZlbnQ8L3JlbWFya3M+DQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBBZGQoYnl0ZVtdIGRhdGEsIGludCBvZmZzZXQsIGludCBjb3VudCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBpZiAoZGF0YSA9PSBudWxsKSB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKCk7DQorICAgICAgICAgICAgaWYgKG9mZnNldCA8IDAgfHwgY291bnQgPCAwKSB0aHJvdyBuZXcgQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uKCk7DQorICAgICAgICAgICAgaWYgKChvZmZzZXQrY291bnQpID4gZGF0YS5MZW5ndGgpIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigpOw0KKw0KKyAgICAgICAgICAgIGludCB0b3RhbCA9IGNvdW50Ow0KKyAgICAgICAgICAgIGludCBpbnB1dEluZGV4ID0gb2Zmc2V0Ow0KKyAgICAgICAgICAgIGludCBlcnIgPSAwOw0KKw0KKyAgICAgICAgICAgIHdoaWxlIChlcnIgPj0gMCAmJiBpbnB1dEluZGV4IDwgdG90YWwpDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBjb3B5SW5wdXQoZGF0YSwgaW5wdXRJbmRleCwgTWF0aC5NaW4odG90YWwgLSBpbnB1dEluZGV4LCBrQnVmZmVyU2l6ZSkpOw0KKyAgICAgICAgICAgICAgICBlcnIgPSBpbmZsYXRlKHJlZiBfenRyZWFtLCAoaW50KUZsdXNoVHlwZXMuTm9uZSk7DQorICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gMCkNCisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChfenRyZWFtLmF2YWlsX291dCA9PSAwKQ0KKyAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIE9uRGF0YUF2YWlsYWJsZSgpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IGluZmxhdGUocmVmIF96dHJlYW0sIChpbnQpRmx1c2hUeXBlcy5Ob25lKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAgICAgaW5wdXRJbmRleCArPSAoaW50KV96dHJlYW0udG90YWxfaW47DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHNldENoZWNrc3VtKCBfenRyZWFtLmFkbGVyICk7DQorICAgICAgICB9DQorDQorDQorICAgICAgICAvLy8gPHN1bW1hcnk+DQorICAgICAgICAvLy8gRmluaXNoZXMgdXAgYW55IHBlbmRpbmcgZGF0YSB0aGF0IG5lZWRzIHRvIGJlIHByb2Nlc3NlZCBhbmQgaGFuZGxlZC4NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBGaW5pc2goKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGludCBlcnI7DQorICAgICAgICAgICAgZG8NCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGVyciA9IGluZmxhdGUocmVmIF96dHJlYW0sIChpbnQpRmx1c2hUeXBlcy5GaW5pc2gpOw0KKyAgICAgICAgICAgICAgICBPbkRhdGFBdmFpbGFibGUoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgd2hpbGUgKGVyciA9PSAwKTsNCisgICAgICAgICAgICBzZXRDaGVja3N1bSggX3p0cmVhbS5hZGxlciApOw0KKyAgICAgICAgICAgIGluZmxhdGVSZXNldChyZWYgX3p0cmVhbSk7DQorICAgICAgICAgICAgcmVzZXRPdXRwdXQoKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vLyA8c3VtbWFyeT4NCisgICAgICAgIC8vLyBDbG9zZXMgdGhlIGludGVybmFsIHpsaWIgaW5mbGF0ZSBzdHJlYW0NCisgICAgICAgIC8vLyA8L3N1bW1hcnk+DQorICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdm9pZCBDbGVhblVwKCkgeyBpbmZsYXRlRW5kKHJlZiBfenRyZWFtKTsgfQ0KKw0KKw0KKwl9DQorfQ0KZGlmZiAtLWdpdCBhL3psaWItMS4yLjYvY29udHJpYi9kb3R6bGliL0RvdFpMaWIvVW5pdFRlc3RzLmNzIGIvemxpYi0xLjIuNi9jb250cmliL2RvdHpsaWIvRG90WkxpYi9Vbml0VGVzdHMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjMzZDlkOQotLS0gL2Rldi9udWxsCisrKyBiL3psaWItMS4yLjYvY29udHJpYi9kb3R6bGliL0RvdFpMaWIvVW5pdFRlc3RzLmNzCkBAIC0wLDAgKzEsMjc0IEBACisvLw0KKy8vIKkgQ29weXJpZ2h0IEhlbnJpayBSYXZuIDIwMDQNCisvLw0KKy8vIFVzZSwgbW9kaWZpY2F0aW9uIGFuZCBkaXN0cmlidXRpb24gYXJlIHN1YmplY3QgdG8gdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLg0KKy8vIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQ0KKy8vDQorDQordXNpbmcgU3lzdGVtOw0KK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9uczsNCit1c2luZyBTeXN0ZW0uSU87DQorDQorLy8gdW5jb21tZW50IHRoZSBkZWZpbmUgYmVsb3cgdG8gaW5jbHVkZSB1bml0IHRlc3RzDQorLy8jZGVmaW5lIG51bml0DQorI2lmIG51bml0DQordXNpbmcgTlVuaXQuRnJhbWV3b3JrOw0KKw0KKy8vIFVuaXQgdGVzdHMgZm9yIHRoZSBEb3RaTGliIGNsYXNzIGxpYnJhcnkNCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorLy8NCisvLyBVc2UgdGhpcyB3aXRoIE5Vbml0IDIgZnJvbSBodHRwOi8vd3d3Lm51bml0Lm9yZw0KKy8vDQorDQorbmFtZXNwYWNlIERvdFpMaWJUZXN0cw0KK3sNCisgICAgdXNpbmcgRG90WkxpYjsNCisNCisgICAgLy8gaGVscGVyIG1ldGhvZHMNCisgICAgaW50ZXJuYWwgY2xhc3MgVXRpbHMNCisgICAgew0KKyAgICAgICAgcHVibGljIHN0YXRpYyBib29sIGJ5dGVBcnJFcXVhbCggYnl0ZVtdIGxocywgYnl0ZVtdIHJocyApDQorICAgICAgICB7DQorICAgICAgICAgICAgaWYgKGxocy5MZW5ndGggIT0gcmhzLkxlbmd0aCkNCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgICAgIGZvciAoaW50IGkgPSBsaHMuTGVuZ3RoLTE7IGkgPj0gMDsgLS1pKQ0KKyAgICAgICAgICAgICAgICBpZiAobGhzW2ldICE9IHJoc1tpXSkNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICAgIH0NCisNCisgICAgfQ0KKw0KKw0KKyAgICBbVGVzdEZpeHR1cmVdDQorICAgIHB1YmxpYyBjbGFzcyBDaXJjQnVmZmVyVGVzdHMNCisgICAgew0KKyAgICAgICAgI3JlZ2lvbiBDaXJjdWxhciBidWZmZXIgdGVzdHMNCisgICAgICAgIFtUZXN0XQ0KKyAgICAgICAgcHVibGljIHZvaWQgU2luZ2xlUHV0R2V0KCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBDaXJjdWxhckJ1ZmZlciBidWYgPSBuZXcgQ2lyY3VsYXJCdWZmZXIoMTApOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggMCwgYnVmLlNpemUgKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIC0xLCBidWYuR2V0KCkgKTsNCisNCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKGJ1Zi5QdXQoIDEgKSk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCAxLCBidWYuU2l6ZSApOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggMSwgYnVmLkdldCgpICk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCAwLCBidWYuU2l6ZSApOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggLTEsIGJ1Zi5HZXQoKSApOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RdDQorICAgICAgICBwdWJsaWMgdm9pZCBCbG9ja1B1dEdldCgpDQorICAgICAgICB7DQorICAgICAgICAgICAgQ2lyY3VsYXJCdWZmZXIgYnVmID0gbmV3IENpcmN1bGFyQnVmZmVyKDEwKTsNCisgICAgICAgICAgICBieXRlW10gYXJyID0gezEsMiwzLDQsNSw2LDcsOCw5LDEwfTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIDEwLCBidWYuUHV0KGFyciwwLDEwKSApOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggMTAsIGJ1Zi5TaXplICk7DQorICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UoIGJ1Zi5QdXQoMTEpICk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCAxLCBidWYuR2V0KCkgKTsNCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKCBidWYuUHV0KDExKSApOw0KKw0KKyAgICAgICAgICAgIGJ5dGVbXSBhcnIyID0gKGJ5dGVbXSlhcnIuQ2xvbmUoKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIDksIGJ1Zi5HZXQoYXJyMiwxLDkpICk7DQorICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZSggVXRpbHMuYnl0ZUFyckVxdWFsKGFycixhcnIyKSApOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgI2VuZHJlZ2lvbg0KKyAgICB9DQorDQorICAgIFtUZXN0Rml4dHVyZV0NCisgICAgcHVibGljIGNsYXNzIENoZWNrc3VtVGVzdHMNCisgICAgew0KKyAgICAgICAgI3JlZ2lvbiBDUkMzMiBUZXN0cw0KKyAgICAgICAgW1Rlc3RdDQorICAgICAgICBwdWJsaWMgdm9pZCBDUkMzMl9OdWxsKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBDUkMzMkNoZWNrc3VtIGNyYzMyID0gbmV3IENSQzMyQ2hlY2tzdW0oKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIDAsIGNyYzMyLlZhbHVlICk7DQorDQorICAgICAgICAgICAgY3JjMzIgPSBuZXcgQ1JDMzJDaGVja3N1bSgxKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIDEsIGNyYzMyLlZhbHVlICk7DQorDQorICAgICAgICAgICAgY3JjMzIgPSBuZXcgQ1JDMzJDaGVja3N1bSg1NTYpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggNTU2LCBjcmMzMi5WYWx1ZSApOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgW1Rlc3RdDQorICAgICAgICBwdWJsaWMgdm9pZCBDUkMzMl9EYXRhKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBDUkMzMkNoZWNrc3VtIGNyYzMyID0gbmV3IENSQzMyQ2hlY2tzdW0oKTsNCisgICAgICAgICAgICBieXRlW10gZGF0YSA9IHsgMSwyLDMsNCw1LDYsNyB9Ow0KKyAgICAgICAgICAgIGNyYzMyLlVwZGF0ZShkYXRhKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIDB4NzBlNDY4ODgsIGNyYzMyLlZhbHVlICApOw0KKw0KKyAgICAgICAgICAgIGNyYzMyID0gbmV3IENSQzMyQ2hlY2tzdW0oKTsNCisgICAgICAgICAgICBjcmMzMi5VcGRhdGUoInBlbmd1aW4iKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIDB4MGU1YzFhMTIwLCBjcmMzMi5WYWx1ZSApOw0KKw0KKyAgICAgICAgICAgIGNyYzMyID0gbmV3IENSQzMyQ2hlY2tzdW0oMSk7DQorICAgICAgICAgICAgY3JjMzIuVXBkYXRlKCJwZW5ndWluIik7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDB4NDNiNmFhOTQsIGNyYzMyLlZhbHVlKTsNCisNCisgICAgICAgIH0NCisgICAgICAgICNlbmRyZWdpb24NCisNCisgICAgICAgICNyZWdpb24gQWRsZXIgdGVzdHMNCisNCisgICAgICAgIFtUZXN0XQ0KKyAgICAgICAgcHVibGljIHZvaWQgQWRsZXJfTnVsbCgpDQorICAgICAgICB7DQorICAgICAgICAgICAgQWRsZXJDaGVja3N1bSBhZGxlciA9IG5ldyBBZGxlckNoZWNrc3VtKCk7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDAsIGFkbGVyLlZhbHVlKTsNCisNCisgICAgICAgICAgICBhZGxlciA9IG5ldyBBZGxlckNoZWNrc3VtKDEpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggMSwgYWRsZXIuVmFsdWUgKTsNCisNCisgICAgICAgICAgICBhZGxlciA9IG5ldyBBZGxlckNoZWNrc3VtKDU1Nik7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCA1NTYsIGFkbGVyLlZhbHVlICk7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdF0NCisgICAgICAgIHB1YmxpYyB2b2lkIEFkbGVyX0RhdGEoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIEFkbGVyQ2hlY2tzdW0gYWRsZXIgPSBuZXcgQWRsZXJDaGVja3N1bSgxKTsNCisgICAgICAgICAgICBieXRlW10gZGF0YSA9IHsgMSwyLDMsNCw1LDYsNyB9Ow0KKyAgICAgICAgICAgIGFkbGVyLlVwZGF0ZShkYXRhKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIDB4NWIwMDFkLCBhZGxlci5WYWx1ZSAgKTsNCisNCisgICAgICAgICAgICBhZGxlciA9IG5ldyBBZGxlckNoZWNrc3VtKCk7DQorICAgICAgICAgICAgYWRsZXIuVXBkYXRlKCJwZW5ndWluIik7DQorICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDB4MGJjZjAyZjYsIGFkbGVyLlZhbHVlICk7DQorDQorICAgICAgICAgICAgYWRsZXIgPSBuZXcgQWRsZXJDaGVja3N1bSgxKTsNCisgICAgICAgICAgICBhZGxlci5VcGRhdGUoInBlbmd1aW4iKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMHgwYmQ2MDJmNywgYWRsZXIuVmFsdWUpOw0KKw0KKyAgICAgICAgfQ0KKyAgICAgICAgI2VuZHJlZ2lvbg0KKyAgICB9DQorDQorICAgIFtUZXN0Rml4dHVyZV0NCisgICAgcHVibGljIGNsYXNzIEluZm9UZXN0cw0KKyAgICB7DQorICAgICAgICAjcmVnaW9uIEluZm8gdGVzdHMNCisgICAgICAgIFtUZXN0XQ0KKyAgICAgICAgcHVibGljIHZvaWQgSW5mb19WZXJzaW9uKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBJbmZvIGluZm8gPSBuZXcgSW5mbygpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiMS4yLjYiLCBJbmZvLlZlcnNpb24pOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgzMiwgaW5mby5TaXplT2ZVSW50KTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMzIsIGluZm8uU2l6ZU9mVUxvbmcpOw0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgzMiwgaW5mby5TaXplT2ZQb2ludGVyKTsNCisgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMzIsIGluZm8uU2l6ZU9mT2Zmc2V0KTsNCisgICAgICAgIH0NCisgICAgICAgICNlbmRyZWdpb24NCisgICAgfQ0KKw0KKyAgICBbVGVzdEZpeHR1cmVdDQorICAgIHB1YmxpYyBjbGFzcyBEZWZsYXRlSW5mbGF0ZVRlc3RzDQorICAgIHsNCisgICAgICAgICNyZWdpb24gRGVmbGF0ZSB0ZXN0cw0KKyAgICAgICAgW1Rlc3RdDQorICAgICAgICBwdWJsaWMgdm9pZCBEZWZsYXRlX0luaXQoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHVzaW5nIChEZWZsYXRlciBkZWYgPSBuZXcgRGVmbGF0ZXIoQ29tcHJlc3NMZXZlbC5EZWZhdWx0KSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHJpdmF0ZSBBcnJheUxpc3QgY29tcHJlc3NlZERhdGEgPSBuZXcgQXJyYXlMaXN0KCk7DQorICAgICAgICBwcml2YXRlIHVpbnQgYWRsZXIxOw0KKw0KKyAgICAgICAgcHJpdmF0ZSBBcnJheUxpc3QgdW5jb21wcmVzc2VkRGF0YSA9IG5ldyBBcnJheUxpc3QoKTsNCisgICAgICAgIHByaXZhdGUgdWludCBhZGxlcjI7DQorDQorICAgICAgICBwdWJsaWMgdm9pZCBDRGF0YUF2YWlsKGJ5dGVbXSBkYXRhLCBpbnQgc3RhcnRJbmRleCwgaW50IGNvdW50KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7ICsraSkNCisgICAgICAgICAgICAgICAgY29tcHJlc3NlZERhdGEuQWRkKGRhdGFbaStzdGFydEluZGV4XSk7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdF0NCisgICAgICAgIHB1YmxpYyB2b2lkIERlZmxhdGVfQ29tcHJlc3MoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGNvbXByZXNzZWREYXRhLkNsZWFyKCk7DQorDQorICAgICAgICAgICAgYnl0ZVtdIHRlc3REYXRhID0gbmV3IGJ5dGVbMzUwMDBdOw0KKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGVzdERhdGEuTGVuZ3RoOyArK2kpDQorICAgICAgICAgICAgICAgIHRlc3REYXRhW2ldID0gNTsNCisNCisgICAgICAgICAgICB1c2luZyAoRGVmbGF0ZXIgZGVmID0gbmV3IERlZmxhdGVyKChDb21wcmVzc0xldmVsKTUpKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgZGVmLkRhdGFBdmFpbGFibGUgKz0gbmV3IERhdGFBdmFpbGFibGVIYW5kbGVyKENEYXRhQXZhaWwpOw0KKyAgICAgICAgICAgICAgICBkZWYuQWRkKHRlc3REYXRhKTsNCisgICAgICAgICAgICAgICAgZGVmLkZpbmlzaCgpOw0KKyAgICAgICAgICAgICAgICBhZGxlcjEgPSBkZWYuQ2hlY2tzdW07DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgI2VuZHJlZ2lvbg0KKw0KKyAgICAgICAgI3JlZ2lvbiBJbmZsYXRlIHRlc3RzDQorICAgICAgICBbVGVzdF0NCisgICAgICAgIHB1YmxpYyB2b2lkIEluZmxhdGVfSW5pdCgpDQorICAgICAgICB7DQorICAgICAgICAgICAgdXNpbmcgKEluZmxhdGVyIGluZiA9IG5ldyBJbmZsYXRlcigpKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICBwcml2YXRlIHZvaWQgRERhdGFBdmFpbChieXRlW10gZGF0YSwgaW50IHN0YXJ0SW5kZXgsIGludCBjb3VudCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyArK2kpDQorICAgICAgICAgICAgICAgIHVuY29tcHJlc3NlZERhdGEuQWRkKGRhdGFbaStzdGFydEluZGV4XSk7DQorICAgICAgICB9DQorDQorICAgICAgICBbVGVzdF0NCisgICAgICAgIHB1YmxpYyB2b2lkIEluZmxhdGVfRXhwYW5kKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICB1bmNvbXByZXNzZWREYXRhLkNsZWFyKCk7DQorDQorICAgICAgICAgICAgdXNpbmcgKEluZmxhdGVyIGluZiA9IG5ldyBJbmZsYXRlcigpKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgaW5mLkRhdGFBdmFpbGFibGUgKz0gbmV3IERhdGFBdmFpbGFibGVIYW5kbGVyKEREYXRhQXZhaWwpOw0KKyAgICAgICAgICAgICAgICBpbmYuQWRkKChieXRlW10pY29tcHJlc3NlZERhdGEuVG9BcnJheSh0eXBlb2YoYnl0ZSkpKTsNCisgICAgICAgICAgICAgICAgaW5mLkZpbmlzaCgpOw0KKyAgICAgICAgICAgICAgICBhZGxlcjIgPSBpbmYuQ2hlY2tzdW07DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCggYWRsZXIxLCBhZGxlcjIgKTsNCisgICAgICAgIH0NCisgICAgICAgICNlbmRyZWdpb24NCisgICAgfQ0KKw0KKyAgICBbVGVzdEZpeHR1cmVdDQorICAgIHB1YmxpYyBjbGFzcyBHWmlwU3RyZWFtVGVzdHMNCisgICAgew0KKyAgICAgICAgI3JlZ2lvbiBHWmlwU3RyZWFtIHRlc3QNCisgICAgICAgIFtUZXN0XQ0KKyAgICAgICAgcHVibGljIHZvaWQgR1ppcFN0cmVhbV9Xcml0ZVJlYWQoKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHVzaW5nIChHWmlwU3RyZWFtIGd6T3V0ID0gbmV3IEdaaXBTdHJlYW0oImd6c3RyZWFtLmd6IiwgQ29tcHJlc3NMZXZlbC5CZXN0KSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIEJpbmFyeVdyaXRlciB3cml0ZXIgPSBuZXcgQmluYXJ5V3JpdGVyKGd6T3V0KTsNCisgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlKCJoaSB0aGVyZSIpOw0KKyAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGUoTWF0aC5QSSk7DQorICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZSg0Mik7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIHVzaW5nIChHWmlwU3RyZWFtIGd6SW4gPSBuZXcgR1ppcFN0cmVhbSgiZ3pzdHJlYW0uZ3oiKSkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIEJpbmFyeVJlYWRlciByZWFkZXIgPSBuZXcgQmluYXJ5UmVhZGVyKGd6SW4pOw0KKyAgICAgICAgICAgICAgICBzdHJpbmcgcyA9IHJlYWRlci5SZWFkU3RyaW5nKCk7DQorICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiaGkgdGhlcmUiLHMpOw0KKyAgICAgICAgICAgICAgICBkb3VibGUgZCA9IHJlYWRlci5SZWFkRG91YmxlKCk7DQorICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChNYXRoLlBJLCBkKTsNCisgICAgICAgICAgICAgICAgaW50IGkgPSByZWFkZXIuUmVhZEludDMyKCk7DQorICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg0MixpKTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICB9DQorICAgICAgICAjZW5kcmVnaW9uDQorCX0NCit9DQorDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvemxpYi0xLjIuNi9jb250cmliL2RvdHpsaWIvTElDRU5TRV8xXzAudHh0IGIvemxpYi0xLjIuNi9jb250cmliL2RvdHpsaWIvTElDRU5TRV8xXzAudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwYWFjMmMKLS0tIC9kZXYvbnVsbAorKysgYi96bGliLTEuMi42L2NvbnRyaWIvZG90emxpYi9MSUNFTlNFXzFfMC50eHQKQEAgLTAsMCArMSwyMyBAQAorQm9vc3QgU29mdHdhcmUgTGljZW5zZSAtIFZlcnNpb24gMS4wIC0gQXVndXN0IDE3dGgsIDIwMDMNCisNCitQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvciBvcmdhbml6YXRpb24NCitvYnRhaW5pbmcgYSBjb3B5IG9mIHRoZSBzb2Z0d2FyZSBhbmQgYWNjb21wYW55aW5nIGRvY3VtZW50YXRpb24gY292ZXJlZCBieQ0KK3RoaXMgbGljZW5zZSAodGhlICJTb2Z0d2FyZSIpIHRvIHVzZSwgcmVwcm9kdWNlLCBkaXNwbGF5LCBkaXN0cmlidXRlLA0KK2V4ZWN1dGUsIGFuZCB0cmFuc21pdCB0aGUgU29mdHdhcmUsIGFuZCB0byBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlDQorU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgdGhpcmQtcGFydGllcyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8NCitkbyBzbywgYWxsIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZzoNCisNCitUaGUgY29weXJpZ2h0IG5vdGljZXMgaW4gdGhlIFNvZnR3YXJlIGFuZCB0aGlzIGVudGlyZSBzdGF0ZW1lbnQsIGluY2x1ZGluZw0KK3RoZSBhYm92ZSBsaWNlbnNlIGdyYW50LCB0aGlzIHJlc3RyaWN0aW9uIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsDQorbXVzdCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgaW4gd2hvbGUgb3IgaW4gcGFydCwgYW5kDQorYWxsIGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFNvZnR3YXJlLCB1bmxlc3Mgc3VjaCBjb3BpZXMgb3IgZGVyaXZhdGl2ZQ0KK3dvcmtzIGFyZSBzb2xlbHkgaW4gdGhlIGZvcm0gb2YgbWFjaGluZS1leGVjdXRhYmxlIG9iamVjdCBjb2RlIGdlbmVyYXRlZCBieQ0KK2Egc291cmNlIGxhbmd1YWdlIHByb2Nlc3Nvci4NCisNCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUg0KK0lNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLA0KK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBUSVRMRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQNCitTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUlMgT1IgQU5ZT05FIERJU1RSSUJVVElORyBUSEUgU09GVFdBUkUgQkUgTElBQkxFDQorRk9SIEFOWSBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsDQorQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSDQorREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3psaWItMS4yLjYvY29udHJpYi9kb3R6bGliL3JlYWRtZS50eHQgYi96bGliLTEuMi42L2NvbnRyaWIvZG90emxpYi9yZWFkbWUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyMzk1NzIKLS0tIC9kZXYvbnVsbAorKysgYi96bGliLTEuMi42L2NvbnRyaWIvZG90emxpYi9yZWFkbWUudHh0CkBAIC0wLDAgKzEsNTggQEAKK1RoaXMgZGlyZWN0b3J5IGNvbnRhaW5zIGEgLk5ldCB3cmFwcGVyIGNsYXNzIGxpYnJhcnkgZm9yIHRoZSBaTGliMS5kbGwNCisNCitUaGUgd3JhcHBlciBpbmNsdWRlcyBzdXBwb3J0IGZvciBpbmZsYXRpbmcvZGVmbGF0aW5nIG1lbW9yeSBidWZmZXJzLA0KKy5OZXQgc3RyZWFtaW5nIHdyYXBwZXJzIGZvciB0aGUgZ3ogc3RyZWFtcyBwYXJ0IG9mIHpsaWIsIGFuZCB3cmFwcGVycw0KK2ZvciB0aGUgY2hlY2tzdW0gcGFydHMgb2YgemxpYi4gU2VlIERvdFpMaWIvVW5pdFRlc3RzLmNzIGZvciBleGFtcGxlcy4NCisNCitEaXJlY3Rvcnkgc3RydWN0dXJlOg0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorTElDRU5TRV8xXzAudHh0ICAgICAgIC0gTGljZW5zZSBmaWxlLg0KK3JlYWRtZS50eHQgICAgICAgICAgICAtIFRoaXMgZmlsZS4NCitEb3RaTGliLmNobSAgICAgICAgICAgLSBDbGFzcyBsaWJyYXJ5IGRvY3VtZW50YXRpb24NCitEb3RaTGliLmJ1aWxkICAgICAgICAgLSBOQW50IGJ1aWxkIGZpbGUNCitEb3RaTGliLnNsbiAgICAgICAgICAgLSBNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyAyMDAzIHNvbHV0aW9uIGZpbGUNCisNCitEb3RaTGliXCouY3MgICAgICAgICAgLSBTb3VyY2UgZmlsZXMgZm9yIHRoZSBjbGFzcyBsaWJyYXJ5DQorDQorVW5pdCB0ZXN0czoNCistLS0tLS0tLS0tLQ0KK1RoZSBmaWxlIERvdFpMaWIvVW5pdFRlc3RzLmNzIGNvbnRhaW5zIHVuaXQgdGVzdHMgZm9yIHVzZSB3aXRoIE5Vbml0IDIuMSBvciBoaWdoZXIuDQorVG8gaW5jbHVkZSB1bml0IHRlc3RzIGluIHRoZSBidWlsZCwgZGVmaW5lIG51bml0IGJlZm9yZSBidWlsZGluZy4NCisNCisNCitCdWlsZCBpbnN0cnVjdGlvbnM6DQorLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KKzEuIFVzaW5nIFZpc3VhbCBTdHVkaW8uTmV0IDIwMDM6DQorICAgT3BlbiBEb3RaTGliLnNsbiBpbiBWUy5OZXQgYW5kIGJ1aWxkIGZyb20gdGhlcmUuIE91dHB1dCBmaWxlIChEb3RaTGliLmRsbCkNCisgICB3aWxsIGJlIGZvdW5kIC4vRG90WkxpYi9iaW4vcmVsZWFzZSBvciAuL0RvdFpMaWIvYmluL2RlYnVnLCBkZXBlbmRpbmcgb24NCisgICB5b3UgYXJlIGJ1aWxkaW5nIHRoZSByZWxlYXNlIG9yIGRlYnVnIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkuIENoZWNrDQorICAgRG90WkxpYi9Vbml0VGVzdHMuY3MgZm9yIGluc3RydWN0aW9ucyBvbiBob3cgdG8gaW5jbHVkZSB1bml0IHRlc3RzIGluIHRoZQ0KKyAgIGJ1aWxkLg0KKw0KKzIuIFVzaW5nIE5BbnQ6DQorICAgT3BlbiBhIGNvbW1hbmQgcHJvbXB0IHdpdGggYWNjZXNzIHRvIHRoZSBidWlsZCBlbnZpcm9ubWVudCBhbmQgcnVuIG5hbnQNCisgICBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgdGhlIERvdFpMaWIuYnVpbGQgZmlsZS4NCisgICBZb3UgY2FuIGRlZmluZSAyIHByb3BlcnRpZXMgb24gdGhlIG5hbnQgY29tbWFuZC1saW5lIHRvIGNvbnRyb2wgdGhlIGJ1aWxkOg0KKyAgIGRlYnVnPXt0cnVlfGZhbHNlfSB0byB0b2dnbGUgYmV0d2VlbiByZWxlYXNlL2RlYnVnIGJ1aWxkcyAoZGVmYXVsdD10cnVlKS4NCisgICBudW5pdD17dHJ1ZXxmYWxzZX0gdG8gaW5jbHVkZSBvciBlc2NsdWRlIHVuaXQgdGVzdHMgKGRlZmF1bHQ9dHJ1ZSkuDQorICAgQWxzbyB0aGUgdGFyZ2V0IGNsZWFuIHdpbGwgcmVtb3ZlIGJpbmFyaWVzLg0KKyAgIE91dHB1dCBmaWxlIChEb3RaTGliLmRsbCkgd2lsbCBiZSBmb3VuZCBpbiBlaXRoZXIgLi9Eb3RaTGliL2Jpbi9yZWxlYXNlDQorICAgb3IgLi9Eb3RaTGliL2Jpbi9kZWJ1ZywgZGVwZW5kaW5nIG9uIHdoZXRoZXIgeW91IGFyZSBidWlsZGluZyB0aGUgcmVsZWFzZQ0KKyAgIG9yIGRlYnVnIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkuDQorDQorICAgRXhhbXBsZXM6DQorICAgICBuYW50IC1EOmRlYnVnPWZhbHNlIC1EOm51bml0PWZhbHNlDQorICAgICAgIHdpbGwgYnVpbGQgYSByZWxlYXNlIG1vZGUgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSB3aXRob3V0IHVuaXQgdGVzdHMuDQorICAgICBuYW50DQorICAgICAgIHdpbGwgYnVpbGQgYSBkZWJ1ZyB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5IHdpdGggdW5pdCB0ZXN0cw0KKyAgICAgbmFudCBjbGVhbg0KKyAgICAgICB3aWxsIHJlbW92ZSBhbGwgcHJldmlvdXNseSBidWlsdCBmaWxlcy4NCisNCisNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCitDb3B5cmlnaHQgKGMpIEhlbnJpayBSYXZuIDIwMDQNCisNCitVc2UsIG1vZGlmaWNhdGlvbiBhbmQgZGlzdHJpYnV0aW9uIGFyZSBzdWJqZWN0IHRvIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4NCisoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkNCmRpZmYgLS1naXQgYS96bGliLTEuMi42L2NvbnRyaWIvZ2NjX2d2bWF0NjQvZ3ZtYXQ2NC5TIGIvemxpYi0xLjIuNi9jb250cmliL2djY19ndm1hdDY0L2d2bWF0NjQuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDg1OGRkCi0tLSAvZGV2L251bGwKKysrIGIvemxpYi0xLjIuNi9jb250cmliL2djY19ndm1hdDY0L2d2bWF0NjQuUwpAQCAtMCwwICsxLDU3NCBAQAorLyoNCis7dUludCBsb25nZXN0X21hdGNoX3g2NCgNCis7ICAgIGRlZmxhdGVfc3RhdGUgKnMsDQorOyAgICBJUG9zIGN1cl9tYXRjaCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjdXJyZW50IG1hdGNoIA0KKw0KKzsgZ3ZtYXQ2NC5TIC0tIEFzbSBwb3J0aW9uIG9mIHRoZSBvcHRpbWl6ZWQgbG9uZ2VzdF9tYXRjaCBmb3IgMzIgYml0cyB4ODZfNjQNCis7ICAoQU1ENjQgb24gQXRobG9uIDY0LCBPcHRlcm9uLCBQaGVub20NCis7ICAgICBhbmQgSW50ZWwgRU02NFQgb24gUGVudGl1bSA0IHdpdGggRU02NFQsIFBlbnRpdW0gRCwgQ29yZSAyIER1bywgQ29yZSBJNS9JNykNCis7IHRoaXMgZmlsZSBpcyB0cmFuc2xhdGlvbiBmcm9tIGd2bWF0NjQuYXNtIHRvIEdDQyA0LnggKGZvciBMaW51eCwgTWFjIFhDb2RlKQ0KKzsgQ29weXJpZ2h0IChDKSAxOTk1LTIwMTAgSmVhbi1sb3VwIEdhaWxseSwgQnJpYW4gUmFpdGVyIGFuZCBHaWxsZXMgVm9sbGFudC4NCis7DQorOyBGaWxlIHdyaXR0ZW4gYnkgR2lsbGVzIFZvbGxhbnQsIGJ5IGNvbnZlcnRpbmcgdG8gYXNzZW1ibHkgdGhlIGxvbmdlc3RfbWF0Y2gNCis7ICBmcm9tIEplYW4tbG91cCBHYWlsbHkgaW4gZGVmbGF0ZS5jIG9mIHpMaWIgYW5kIGluZm9aaXAgemlwLg0KKzsgIGFuZCBieSB0YWtpbmcgaW5zcGlyYXRpb24gb24gYXNtNjg2IHdpdGggbWFzbSwgb3B0aW1pc2VkIGFzc2VtYmx5IGNvZGUNCis7ICAgICAgICBmcm9tIEJyaWFuIFJhaXRlciwgd3JpdHRlbiAxOTk4DQorOw0KKzsgIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkDQorOyAgd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcw0KKzsgIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuDQorOw0KKzsgIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLA0KKzsgIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQNCis7ICBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6DQorOw0KKzsgIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90DQorOyAgICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUNCis7ICAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUNCis7ICAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLg0KKzsgIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlDQorOyAgICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlDQorOyAgMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4NCis7DQorOyAgICAgICAgIGh0dHA6Ly93d3cuemxpYi5uZXQNCis7ICAgICAgICAgaHR0cDovL3d3dy53aW5pbWFnZS5jb20vekxpYkRsbA0KKzsgICAgICAgICBodHRwOi8vd3d3Lm11cHBldGxhYnMuY29tL35icmVhZGJveC9zb2Z0d2FyZS9hc3NlbWJseS5odG1sDQorOw0KKzsgdG8gY29tcGlsZSB0aGlzIGZpbGUgZm9yIHpMaWIsIEkgdXNlIG9wdGlvbjoNCis7ICAgZ2NjIC1jIC1hcmNoIHg4Nl82NCBndm1hdDY0LlMNCisNCisNCis7dUludCBsb25nZXN0X21hdGNoKHMsIGN1cl9tYXRjaCkNCis7ICAgIGRlZmxhdGVfc3RhdGUgKnM7DQorOyAgICBJUG9zIGN1cl9tYXRjaDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGN1cnJlbnQgbWF0Y2ggLw0KKzsNCis7IHdpdGggWENvZGUgZm9yIE1hYywgSSBoYWQgc3RyYW5nZSBlcnJvciB3aXRoIHNvbWUganVtcCBvbiBpbnRlbCBzeW50YXgNCis7IHRoaXMgaXMgd2h5IEJFRk9SRV9KTVAgYW5kIEFGVEVSX0pNUCBhcmUgdXNlZA0KKyAqLw0KKw0KKw0KKyNkZWZpbmUgQkVGT1JFX0pNUCAuYXR0X3N5bnRheA0KKyNkZWZpbmUgQUZURVJfSk1QIC5pbnRlbF9zeW50YXggbm9wcmVmaXgNCisNCisjaWZuZGVmIE5PX1VOREVSTElORQ0KKyMJZGVmaW5lCW1hdGNoX2luaXQJX21hdGNoX2luaXQNCisjCWRlZmluZQlsb25nZXN0X21hdGNoCV9sb25nZXN0X21hdGNoDQorI2VuZGlmDQorDQorLmludGVsX3N5bnRheCBub3ByZWZpeA0KKw0KKy5nbG9ibAltYXRjaF9pbml0LCBsb25nZXN0X21hdGNoDQorLnRleHQNCitsb25nZXN0X21hdGNoOg0KKw0KKw0KKw0KKyNkZWZpbmUgTG9jYWxWYXJzU2l6ZSA5Ng0KKy8qDQorOyByZWdpc3RlciB1c2VkIDogcmF4LHJieCxyY3gscmR4LHJzaSxyZGkscjgscjkscjEwLHIxMSxyMTINCis7IGZyZWUgcmVnaXN0ZXIgOiAgcjE0LHIxNQ0KKzsgcmVnaXN0ZXIgY2FuIGJlIHNhdmVkIDogcnNwDQorKi8NCisNCisjZGVmaW5lIGNoYWlubGVud21hc2sgICAgIChyc3AgKyA4IC0gTG9jYWxWYXJzU2l6ZSkNCisjZGVmaW5lIG5pY2VtYXRjaCAgICAgICAgIChyc3AgKyAxNiAtIExvY2FsVmFyc1NpemUpDQorDQorI2RlZmluZSBzYXZlX3JkaSAgICAgICAgKHJzcCArIDI0IC0gTG9jYWxWYXJzU2l6ZSkNCisjZGVmaW5lIHNhdmVfcnNpICAgICAgICAocnNwICsgMzIgLSBMb2NhbFZhcnNTaXplKQ0KKyNkZWZpbmUgc2F2ZV9yYnggICAgICAgIChyc3AgKyA0MCAtIExvY2FsVmFyc1NpemUpDQorI2RlZmluZSBzYXZlX3JicCAgICAgICAgKHJzcCArIDQ4IC0gTG9jYWxWYXJzU2l6ZSkNCisjZGVmaW5lIHNhdmVfcjEyICAgICAgICAocnNwICsgNTYgLSBMb2NhbFZhcnNTaXplKQ0KKyNkZWZpbmUgc2F2ZV9yMTMgICAgICAgIChyc3AgKyA2NCAtIExvY2FsVmFyc1NpemUpDQorI2RlZmluZSBzYXZlX3IxNCAgICAgICAgKHJzcCArIDcyIC0gTG9jYWxWYXJzU2l6ZSkNCisjZGVmaW5lIHNhdmVfcjE1ICAgICAgICAocnNwICsgODAgLSBMb2NhbFZhcnNTaXplKQ0KKw0KKw0KKy8qDQorOyAgYWxsIHRoZSArNCBvZmZzZXRzIGFyZSBkdWUgdG8gdGhlIGFkZGl0aW9uIG9mIHBlbmRpbmdfYnVmX3NpemUgKGluIHpsaWINCis7ICBpbiB0aGUgZGVmbGF0ZV9zdGF0ZSBzdHJ1Y3R1cmUgc2luY2UgdGhlIGFzbSBjb2RlIHdhcyBmaXJzdCB3cml0dGVuDQorOyAgKGlmIHlvdSBjb21waWxlIHdpdGggemxpYiAxLjAuNCBvciBvbGRlciwgcmVtb3ZlIHRoZSArNCkuDQorOyAgTm90ZSA6IHRoZXNlIHZhbHVlIGFyZSBnb29kIHdpdGggYSA4IGJ5dGVzIGJvdW5kYXJ5IHBhY2sgc3RydWN0dXJlDQorKi8NCisNCisjZGVmaW5lICAgIE1BWF9NQVRDSCAgICAgICAgICAgICAgMjU4DQorI2RlZmluZSAgICBNSU5fTUFUQ0ggICAgICAgICAgICAgIDMNCisjZGVmaW5lICAgIE1JTl9MT09LQUhFQUQgICAgICAgICAgKE1BWF9NQVRDSCtNSU5fTUFUQ0grMSkNCisNCisvKg0KKzs7OyBPZmZzZXRzIGZvciBmaWVsZHMgaW4gdGhlIGRlZmxhdGVfc3RhdGUgc3RydWN0dXJlLiBUaGVzZSBudW1iZXJzDQorOzs7IGFyZSBjYWxjdWxhdGVkIGZyb20gdGhlIGRlZmluaXRpb24gb2YgZGVmbGF0ZV9zdGF0ZSwgd2l0aCB0aGUNCis7OzsgYXNzdW1wdGlvbiB0aGF0IHRoZSBjb21waWxlciB3aWxsIGR3b3JkLWFsaWduIHRoZSBmaWVsZHMuIChUaHVzLA0KKzs7OyBjaGFuZ2luZyB0aGUgZGVmaW5pdGlvbiBvZiBkZWZsYXRlX3N0YXRlIGNvdWxkIGVhc2lseSBjYXVzZSB0aGlzDQorOzs7IHByb2dyYW0gdG8gY3Jhc2ggaG9ycmlibHksIHdpdGhvdXQgc28gbXVjaCBhcyBhIHdhcm5pbmcgYXQNCis7OzsgY29tcGlsZSB0aW1lLiBTaWdoLikNCisNCis7ICBhbGwgdGhlICt6bGliMTIyMmFkZCBvZmZzZXRzIGFyZSBkdWUgdG8gdGhlIGFkZGl0aW9uIG9mIGZpZWxkcw0KKzsgIGluIHpsaWIgaW4gdGhlIGRlZmxhdGVfc3RhdGUgc3RydWN0dXJlIHNpbmNlIHRoZSBhc20gY29kZSB3YXMgZmlyc3Qgd3JpdHRlbg0KKzsgIChpZiB5b3UgY29tcGlsZSB3aXRoIHpsaWIgMS4wLjQgb3Igb2xkZXIsIHVzZSAiemxpYjEyMjJhZGQgZXF1ICgtNCkiKS4NCis7ICAoaWYgeW91IGNvbXBpbGUgd2l0aCB6bGliIGJldHdlZW4gMS4wLjUgYW5kIDEuMi4yLjEsIHVzZSAiemxpYjEyMjJhZGQgZXF1IDAiKS4NCis7ICBpZiB5b3UgY29tcGlsZSB3aXRoIHpsaWIgMS4yLjIuMiBvciBsYXRlciAsIHVzZSAiemxpYjEyMjJhZGQgZXF1IDgiKS4NCisqLw0KKw0KKw0KKw0KKy8qIHlvdSBjYW4gY2hlY2sgdGhlIHN0cnVjdHVyZSBvZmZzZXQgYnkgcnVubmluZw0KKw0KKyNpbmNsdWRlIDxzdGRsaWIuaD4NCisjaW5jbHVkZSA8c3RkaW8uaD4NCisjaW5jbHVkZSAiZGVmbGF0ZS5oIg0KKw0KK3ZvaWQgcHJpbnRfZGVwbCgpDQorew0KK2RlZmxhdGVfc3RhdGUgZHM7DQorZGVmbGF0ZV9zdGF0ZSAqcz0mZHM7DQorcHJpbnRmKCJzaXplIHBvaW50ZXI9JXVcbiIsKGludClzaXplb2Yodm9pZCopKTsNCisNCitwcmludGYoIiNkZWZpbmUgZHNXU2l6ZSAgICAgICAgICV1XG4iLChpbnQpKCgoY2hhciopJihzLT53X3NpemUpKS0oKGNoYXIqKXMpKSk7DQorcHJpbnRmKCIjZGVmaW5lIGRzV01hc2sgICAgICAgICAldVxuIiwoaW50KSgoKGNoYXIqKSYocy0+d19tYXNrKSktKChjaGFyKilzKSkpOw0KK3ByaW50ZigiI2RlZmluZSBkc1dpbmRvdyAgICAgICAgJXVcbiIsKGludCkoKChjaGFyKikmKHMtPndpbmRvdykpLSgoY2hhciopcykpKTsNCitwcmludGYoIiNkZWZpbmUgZHNQcmV2ICAgICAgICAgICV1XG4iLChpbnQpKCgoY2hhciopJihzLT5wcmV2KSktKChjaGFyKilzKSkpOw0KK3ByaW50ZigiI2RlZmluZSBkc01hdGNoTGVuICAgICAgJXVcbiIsKGludCkoKChjaGFyKikmKHMtPm1hdGNoX2xlbmd0aCkpLSgoY2hhciopcykpKTsNCitwcmludGYoIiNkZWZpbmUgZHNQcmV2TWF0Y2ggICAgICV1XG4iLChpbnQpKCgoY2hhciopJihzLT5wcmV2X21hdGNoKSktKChjaGFyKilzKSkpOw0KK3ByaW50ZigiI2RlZmluZSBkc1N0clN0YXJ0ICAgICAgJXVcbiIsKGludCkoKChjaGFyKikmKHMtPnN0cnN0YXJ0KSktKChjaGFyKilzKSkpOw0KK3ByaW50ZigiI2RlZmluZSBkc01hdGNoU3RhcnQgICAgJXVcbiIsKGludCkoKChjaGFyKikmKHMtPm1hdGNoX3N0YXJ0KSktKChjaGFyKilzKSkpOw0KK3ByaW50ZigiI2RlZmluZSBkc0xvb2thaGVhZCAgICAgJXVcbiIsKGludCkoKChjaGFyKikmKHMtPmxvb2thaGVhZCkpLSgoY2hhciopcykpKTsNCitwcmludGYoIiNkZWZpbmUgZHNQcmV2TGVuICAgICAgICV1XG4iLChpbnQpKCgoY2hhciopJihzLT5wcmV2X2xlbmd0aCkpLSgoY2hhciopcykpKTsNCitwcmludGYoIiNkZWZpbmUgZHNNYXhDaGFpbkxlbiAgICV1XG4iLChpbnQpKCgoY2hhciopJihzLT5tYXhfY2hhaW5fbGVuZ3RoKSktKChjaGFyKilzKSkpOw0KK3ByaW50ZigiI2RlZmluZSBkc0dvb2RNYXRjaCAgICAgJXVcbiIsKGludCkoKChjaGFyKikmKHMtPmdvb2RfbWF0Y2gpKS0oKGNoYXIqKXMpKSk7DQorcHJpbnRmKCIjZGVmaW5lIGRzTmljZU1hdGNoICAgICAldVxuIiwoaW50KSgoKGNoYXIqKSYocy0+bmljZV9tYXRjaCkpLSgoY2hhciopcykpKTsNCit9DQorKi8NCisNCisjZGVmaW5lIGRzV1NpemUgICAgICAgICAgNjgNCisjZGVmaW5lIGRzV01hc2sgICAgICAgICAgNzYNCisjZGVmaW5lIGRzV2luZG93ICAgICAgICAgODANCisjZGVmaW5lIGRzUHJldiAgICAgICAgICAgOTYNCisjZGVmaW5lIGRzTWF0Y2hMZW4gICAgICAgMTQ0DQorI2RlZmluZSBkc1ByZXZNYXRjaCAgICAgIDE0OA0KKyNkZWZpbmUgZHNTdHJTdGFydCAgICAgICAxNTYNCisjZGVmaW5lIGRzTWF0Y2hTdGFydCAgICAgMTYwDQorI2RlZmluZSBkc0xvb2thaGVhZCAgICAgIDE2NA0KKyNkZWZpbmUgZHNQcmV2TGVuICAgICAgICAxNjgNCisjZGVmaW5lIGRzTWF4Q2hhaW5MZW4gICAgMTcyDQorI2RlZmluZSBkc0dvb2RNYXRjaCAgICAgIDE4OA0KKyNkZWZpbmUgZHNOaWNlTWF0Y2ggICAgICAxOTINCisNCisjZGVmaW5lIHdpbmRvd19zaXplICAgICAgWyByY3ggKyBkc1dTaXplXQ0KKyNkZWZpbmUgV01hc2sgICAgICAgICAgICBbIHJjeCArIGRzV01hc2tdDQorI2RlZmluZSB3aW5kb3dfYWQgICAgICAgIFsgcmN4ICsgZHNXaW5kb3ddDQorI2RlZmluZSBwcmV2X2FkICAgICAgICAgIFsgcmN4ICsgZHNQcmV2XQ0KKyNkZWZpbmUgc3Ryc3RhcnQgICAgICAgICBbIHJjeCArIGRzU3RyU3RhcnRdDQorI2RlZmluZSBtYXRjaF9zdGFydCAgICAgIFsgcmN4ICsgZHNNYXRjaFN0YXJ0XQ0KKyNkZWZpbmUgTG9va2FoZWFkICAgICAgICBbIHJjeCArIGRzTG9va2FoZWFkXSAvLzsgMGZmZmZmZmZmaCBvbiBpbmZvemlwDQorI2RlZmluZSBwcmV2X2xlbmd0aCAgICAgIFsgcmN4ICsgZHNQcmV2TGVuXQ0KKyNkZWZpbmUgbWF4X2NoYWluX2xlbmd0aCBbIHJjeCArIGRzTWF4Q2hhaW5MZW5dDQorI2RlZmluZSBnb29kX21hdGNoICAgICAgIFsgcmN4ICsgZHNHb29kTWF0Y2hdDQorI2RlZmluZSBuaWNlX21hdGNoICAgICAgIFsgcmN4ICsgZHNOaWNlTWF0Y2hdDQorDQorLyoNCis7IHdpbmRvd3M6DQorOyBwYXJhbWV0ZXIgMSBpbiByY3goZGVmbGF0ZSBzdGF0ZSBzKSwgcGFyYW0gMiBpbiByZHggKGN1ciBtYXRjaCkNCisNCis7IHNlZSBodHRwOi8vd2VibG9ncy5hc3AubmV0L29sZG5ld3RoaW5nL2FyY2hpdmUvMjAwNC8wMS8xNC81ODU3OS5hc3B4IGFuZA0KKzsgaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9saWJyYXJ5L2VuLXVzL2ttYXJjaC9oaC9rbWFyY2gvNjRiaXRBTURfOGU5NTFkZDItZWU3Ny00NzI4LTg3MDItNTVjZTRiNWRkMjRhLnhtbC5hc3ANCis7DQorOyBBbGwgcmVnaXN0ZXJzIG11c3QgYmUgcHJlc2VydmVkIGFjcm9zcyB0aGUgY2FsbCwgZXhjZXB0IGZvcg0KKzsgICByYXgsIHJjeCwgcmR4LCByOCwgcjksIHIxMCwgYW5kIHIxMSwgd2hpY2ggYXJlIHNjcmF0Y2guDQorDQorOw0KKzsgZ2NjIG9uIG1hY29zeC1saW51eDoNCis7IHNlZSBodHRwOi8vd3d3Lng4Ni02NC5vcmcvZG9jdW1lbnRhdGlvbi9hYmktMC45OS5wZGYNCis7IHBhcmFtIDEgaW4gcmRpLCBwYXJhbSAyIGluIHJzaQ0KKzsgcmJ4LCByc3AsIHJicCwgcjEyIHRvIHIxNSBtdXN0IGJlIHByZXNlcnZlZA0KKw0KKzs7OyBTYXZlIHJlZ2lzdGVycyB0aGF0IHRoZSBjb21waWxlciBtYXkgYmUgdXNpbmcsIGFuZCBhZGp1c3QgZXNwIHRvDQorOzs7IG1ha2Ugcm9vbSBmb3Igb3VyIHN0YWNrIGZyYW1lLg0KKw0KKw0KKzs7OyBSZXRyaWV2ZSB0aGUgZnVuY3Rpb24gYXJndW1lbnRzLiByOGQgd2lsbCBob2xkIGN1cl9tYXRjaA0KKzs7OyB0aHJvdWdob3V0IHRoZSBlbnRpcmUgZnVuY3Rpb24uIGVkeCB3aWxsIGhvbGQgdGhlIHBvaW50ZXIgdG8gdGhlDQorOzs7IGRlZmxhdGVfc3RhdGUgc3RydWN0dXJlIGR1cmluZyB0aGUgZnVuY3Rpb24ncyBzZXR1cCAoYmVmb3JlDQorOzs7IGVudGVyaW5nIHRoZSBtYWluIGxvb3AuDQorDQorOyBtczogcGFyYW1ldGVyIDEgaW4gcmN4IChkZWZsYXRlX3N0YXRlKiBzKSwgcGFyYW0gMiBpbiBlZHggLT4gcjggKGN1ciBtYXRjaCkNCis7IG1hYzogcGFyYW0gMSBpbiByZGksIHBhcmFtIDIgcnNpDQorOyB0aGlzIGNsZWFyIGhpZ2ggMzIgYml0cyBvZiByOCwgd2hpY2ggY2FuIGJlIGdhcmJhZ2UgaW4gYm90aCByOCBhbmQgcmR4DQorKi8NCisgICAgICAgIG1vdiBbc2F2ZV9yYnhdLHJieA0KKyAgICAgICAgbW92IFtzYXZlX3JicF0scmJwDQorDQorDQorICAgICAgICBtb3YgcmN4LHJkaQ0KKw0KKyAgICAgICAgbW92IHI4ZCxlc2kNCisNCisNCisgICAgICAgIG1vdiBbc2F2ZV9yMTJdLHIxMg0KKyAgICAgICAgbW92IFtzYXZlX3IxM10scjEzDQorICAgICAgICBtb3YgW3NhdmVfcjE0XSxyMTQNCisgICAgICAgIG1vdiBbc2F2ZV9yMTVdLHIxNQ0KKw0KKw0KKy8vOzs7IHVJbnQgd21hc2sgPSBzLT53X21hc2s7DQorLy87OzsgdW5zaWduZWQgY2hhaW5fbGVuZ3RoID0gcy0+bWF4X2NoYWluX2xlbmd0aDsNCisvLzs7OyBpZiAocy0+cHJldl9sZW5ndGggPj0gcy0+Z29vZF9tYXRjaCkgew0KKy8vOzs7ICAgICBjaGFpbl9sZW5ndGggPj49IDI7DQorLy87OzsgfQ0KKw0KKw0KKyAgICAgICAgbW92IGVkaSwgcHJldl9sZW5ndGgNCisgICAgICAgIG1vdiBlc2ksIGdvb2RfbWF0Y2gNCisgICAgICAgIG1vdiBlYXgsIFdNYXNrDQorICAgICAgICBtb3YgZWJ4LCBtYXhfY2hhaW5fbGVuZ3RoDQorICAgICAgICBjbXAgZWRpLCBlc2kNCisgICAgICAgIGpsICBMYXN0TWF0Y2hHb29kDQorICAgICAgICBzaHIgZWJ4LCAyDQorTGFzdE1hdGNoR29vZDoNCisNCisvLzs7OyBjaGFpbmxlbiBpcyBkZWNyZW1lbnRlZCBvbmNlIGJlZm9yZWhhbmQgc28gdGhhdCB0aGUgZnVuY3Rpb24gY2FuDQorLy87OzsgdXNlIHRoZSBzaWduIGZsYWcgaW5zdGVhZCBvZiB0aGUgemVybyBmbGFnIGZvciB0aGUgZXhpdCB0ZXN0Lg0KKy8vOzs7IEl0IGlzIHRoZW4gc2hpZnRlZCBpbnRvIHRoZSBoaWdoIHdvcmQsIHRvIG1ha2Ugcm9vbSBmb3IgdGhlIHdtYXNrDQorLy87OzsgdmFsdWUsIHdoaWNoIGl0IHdpbGwgYWx3YXlzIGFjY29tcGFueS4NCisNCisgICAgICAgIGRlYyBlYngNCisgICAgICAgIHNobCBlYngsIDE2DQorICAgICAgICBvciAgZWJ4LCBlYXgNCisNCisvLzs7OyBvbiB6bGliIG9ubHkNCisvLzs7OyBpZiAoKHVJbnQpbmljZV9tYXRjaCA+IHMtPmxvb2thaGVhZCkgbmljZV9tYXRjaCA9IHMtPmxvb2thaGVhZDsNCisNCisNCisNCisgICAgICAgIG1vdiBlYXgsIG5pY2VfbWF0Y2gNCisgICAgICAgIG1vdiBbY2hhaW5sZW53bWFza10sIGVieA0KKyAgICAgICAgbW92IHIxMGQsIExvb2thaGVhZA0KKyAgICAgICAgY21wIHIxMGQsIGVheA0KKyAgICAgICAgY21vdm5sIHIxMGQsIGVheA0KKyAgICAgICAgbW92IFtuaWNlbWF0Y2hdLHIxMGQNCisNCisNCisNCisvLzs7OyByZWdpc3RlciBCeXRlZiAqc2NhbiA9IHMtPndpbmRvdyArIHMtPnN0cnN0YXJ0Ow0KKyAgICAgICAgbW92IHIxMCwgd2luZG93X2FkDQorICAgICAgICBtb3YgZWJwLCBzdHJzdGFydA0KKyAgICAgICAgbGVhIHIxMywgW3IxMCArIHJicF0NCisNCisvLzs7OyBEZXRlcm1pbmUgaG93IG1hbnkgYnl0ZXMgdGhlIHNjYW4gcHRyIGlzIG9mZiBmcm9tIGJlaW5nDQorLy87OzsgZHdvcmQtYWxpZ25lZC4NCisNCisgICAgICAgICBtb3YgcjkscjEzDQorICAgICAgICAgbmVnIHIxMw0KKyAgICAgICAgIGFuZCByMTMsMw0KKw0KKy8vOzs7IElQb3MgbGltaXQgPSBzLT5zdHJzdGFydCA+IChJUG9zKU1BWF9ESVNUKHMpID8NCisvLzs7OyAgICAgcy0+c3Ryc3RhcnQgLSAoSVBvcylNQVhfRElTVChzKSA6IE5JTDsNCisNCisNCisgICAgICAgIG1vdiBlYXgsIHdpbmRvd19zaXplDQorICAgICAgICBzdWIgZWF4LCBNSU5fTE9PS0FIRUFEDQorDQorDQorICAgICAgICB4b3IgZWRpLGVkaQ0KKyAgICAgICAgc3ViIGVicCwgZWF4DQorDQorICAgICAgICBtb3YgcjExZCwgcHJldl9sZW5ndGgNCisNCisgICAgICAgIGNtb3ZuZyBlYnAsZWRpDQorDQorLy87OzsgaW50IGJlc3RfbGVuID0gcy0+cHJldl9sZW5ndGg7DQorDQorDQorLy87OzsgU3RvcmUgdGhlIHN1bSBvZiBzLT53aW5kb3cgKyBiZXN0X2xlbiBpbiBlc2kgbG9jYWxseSwgYW5kIGluIGVzaS4NCisNCisgICAgICAgbGVhICByc2ksW3IxMCtyMTFdDQorDQorLy87OzsgcmVnaXN0ZXIgdXNoIHNjYW5fc3RhcnQgPSAqKHVzaGYqKXNjYW47DQorLy87OzsgcmVnaXN0ZXIgdXNoIHNjYW5fZW5kICAgPSAqKHVzaGYqKShzY2FuK2Jlc3RfbGVuLTEpOw0KKy8vOzs7IFBvc2YgKnByZXYgPSBzLT5wcmV2Ow0KKw0KKyAgICAgICAgbW92enggcjEyZCx3b3JkIHB0ciBbcjldDQorICAgICAgICBtb3Z6eCBlYngsIHdvcmQgcHRyIFtyOSArIHIxMSAtIDFdDQorDQorICAgICAgICBtb3YgcmRpLCBwcmV2X2FkDQorDQorLy87OzsgSnVtcCBpbnRvIHRoZSBtYWluIGxvb3AuDQorDQorICAgICAgICBtb3YgZWR4LCBbY2hhaW5sZW53bWFza10NCisNCisgICAgICAgIGNtcCBieCx3b3JkIHB0ciBbcnNpICsgcjggLSAxXQ0KKyAgICAgICAganogIExvb2t1cExvb3BJc1plcm8NCisJCQkJDQorCQkJCQkJDQorCQkJCQkJDQorTG9va3VwTG9vcDE6DQorICAgICAgICBhbmQgcjhkLCBlZHgNCisNCisgICAgICAgIG1vdnp4ICAgcjhkLCB3b3JkIHB0ciBbcmRpICsgcjgqMl0NCisgICAgICAgIGNtcCByOGQsIGVicA0KKyAgICAgICAgamJlIExlYXZlTm93DQorCQkNCisJCQ0KKwkJDQorICAgICAgICBzdWIgZWR4LCAweDAwMDEwMDAwDQorCQlCRUZPUkVfSk1QDQorICAgICAgICBqcyAgTGVhdmVOb3cNCisJCUFGVEVSX0pNUA0KKw0KK0xvb3BFbnRyeTE6DQorICAgICAgICBjbXAgYngsd29yZCBwdHIgW3JzaSArIHI4IC0gMV0NCisJCUJFRk9SRV9KTVANCisgICAgICAgIGp6ICBMb29rdXBMb29wSXNaZXJvDQorCQlBRlRFUl9KTVANCisNCitMb29rdXBMb29wMjoNCisgICAgICAgIGFuZCByOGQsIGVkeA0KKw0KKyAgICAgICAgbW92enggICByOGQsIHdvcmQgcHRyIFtyZGkgKyByOCoyXQ0KKyAgICAgICAgY21wIHI4ZCwgZWJwDQorCQlCRUZPUkVfSk1QDQorICAgICAgICBqYmUgTGVhdmVOb3cNCisJCUFGVEVSX0pNUA0KKyAgICAgICAgc3ViIGVkeCwgMHgwMDAxMDAwMA0KKwkJQkVGT1JFX0pNUA0KKyAgICAgICAganMgIExlYXZlTm93DQorCQlBRlRFUl9KTVANCisNCitMb29wRW50cnkyOg0KKyAgICAgICAgY21wIGJ4LHdvcmQgcHRyIFtyc2kgKyByOCAtIDFdDQorCQlCRUZPUkVfSk1QDQorICAgICAgICBqeiAgTG9va3VwTG9vcElzWmVybw0KKwkJQUZURVJfSk1QDQorDQorTG9va3VwTG9vcDQ6DQorICAgICAgICBhbmQgcjhkLCBlZHgNCisNCisgICAgICAgIG1vdnp4ICAgcjhkLCB3b3JkIHB0ciBbcmRpICsgcjgqMl0NCisgICAgICAgIGNtcCByOGQsIGVicA0KKwkJQkVGT1JFX0pNUA0KKyAgICAgICAgamJlIExlYXZlTm93DQorCQlBRlRFUl9KTVANCisgICAgICAgIHN1YiBlZHgsIDB4MDAwMTAwMDANCisJCUJFRk9SRV9KTVANCisgICAgICAgIGpzICBMZWF2ZU5vdw0KKwkJQUZURVJfSk1QDQorDQorTG9vcEVudHJ5NDoNCisNCisgICAgICAgIGNtcCBieCx3b3JkIHB0ciBbcnNpICsgcjggLSAxXQ0KKwkJQkVGT1JFX0pNUA0KKyAgICAgICAgam56IExvb2t1cExvb3AxDQorICAgICAgICBqbXAgTG9va3VwTG9vcElzWmVybw0KKwkJQUZURVJfSk1QDQorLyoNCis7OzsgZG8gew0KKzs7OyAgICAgbWF0Y2ggPSBzLT53aW5kb3cgKyBjdXJfbWF0Y2g7DQorOzs7ICAgICBpZiAoKih1c2hmKikobWF0Y2grYmVzdF9sZW4tMSkgIT0gc2Nhbl9lbmQgfHwNCis7OzsgICAgICAgICAqKHVzaGYqKW1hdGNoICE9IHNjYW5fc3RhcnQpIGNvbnRpbnVlOw0KKzs7OyAgICAgWy4uLl0NCis7OzsgfSB3aGlsZSAoKGN1cl9tYXRjaCA9IHByZXZbY3VyX21hdGNoICYgd21hc2tdKSA+IGxpbWl0DQorOzs7ICAgICAgICAgICYmIC0tY2hhaW5fbGVuZ3RoICE9IDApOw0KKzs7Ow0KKzs7OyBIZXJlIGlzIHRoZSBpbm5lciBsb29wIG9mIHRoZSBmdW5jdGlvbi4gVGhlIGZ1bmN0aW9uIHdpbGwgc3BlbmQgdGhlDQorOzs7IG1ham9yaXR5IG9mIGl0cyB0aW1lIGluIHRoaXMgbG9vcCwgYW5kIG1ham9yaXR5IG9mIHRoYXQgdGltZSB3aWxsDQorOzs7IGJlIHNwZW50IGluIHRoZSBmaXJzdCB0ZW4gaW5zdHJ1Y3Rpb25zLg0KKzs7Ow0KKzs7OyBXaXRoaW4gdGhpcyBsb29wOg0KKzs7OyBlYnggPSBzY2FuZW5kDQorOzs7IHI4ZCA9IGN1cm1hdGNoDQorOzs7IGVkeCA9IGNoYWlubGVud21hc2sgLSBpLmUuLCAoKGNoYWlubGVuIDw8IDE2KSB8IHdtYXNrKQ0KKzs7OyBlc2kgPSB3aW5kb3diZXN0bGVuIC0gaS5lLiwgKHdpbmRvdyArIGJlc3RsZW4pDQorOzs7IGVkaSA9IHByZXYNCis7OzsgZWJwID0gbGltaXQNCisqLw0KKy5iYWxpZ24gMTYNCitMb29rdXBMb29wOg0KKyAgICAgICAgYW5kIHI4ZCwgZWR4DQorDQorICAgICAgICBtb3Z6eCAgIHI4ZCwgd29yZCBwdHIgW3JkaSArIHI4KjJdDQorICAgICAgICBjbXAgcjhkLCBlYnANCisJCUJFRk9SRV9KTVANCisgICAgICAgIGpiZSBMZWF2ZU5vdw0KKwkJQUZURVJfSk1QDQorICAgICAgICBzdWIgZWR4LCAweDAwMDEwMDAwDQorCQlCRUZPUkVfSk1QDQorICAgICAgICBqcyAgTGVhdmVOb3cNCisJCUFGVEVSX0pNUA0KKw0KK0xvb3BFbnRyeToNCisNCisgICAgICAgIGNtcCBieCx3b3JkIHB0ciBbcnNpICsgcjggLSAxXQ0KKwkJQkVGT1JFX0pNUA0KKyAgICAgICAgam56IExvb2t1cExvb3AxDQorCQlBRlRFUl9KTVANCitMb29rdXBMb29wSXNaZXJvOg0KKyAgICAgICAgY21wICAgICByMTJ3LCB3b3JkIHB0ciBbcjEwICsgcjhdDQorCQlCRUZPUkVfSk1QDQorICAgICAgICBqbnogTG9va3VwTG9vcDENCisJCUFGVEVSX0pNUA0KKw0KKw0KKy8vOzs7IFN0b3JlIHRoZSBjdXJyZW50IHZhbHVlIG9mIGNoYWlubGVuLg0KKyAgICAgICAgbW92IFtjaGFpbmxlbndtYXNrXSwgZWR4DQorLyoNCis7OzsgUG9pbnQgZWRpIHRvIHRoZSBzdHJpbmcgdW5kZXIgc2NydXRpbnksIGFuZCBlc2kgdG8gdGhlIHN0cmluZyB3ZQ0KKzs7OyBhcmUgaG9waW5nIHRvIG1hdGNoIGl0IHVwIHdpdGguIEluIGFjdHVhbGl0eSwgZXNpIGFuZCBlZGkgYXJlDQorOzs7IGJvdGggcG9pbnRlZCAoTUFYX01BVENIXzggLSBzY2FuYWxpZ24pIGJ5dGVzIGFoZWFkLCBhbmQgZWR4IGlzDQorOzs7IGluaXRpYWxpemVkIHRvIC0oTUFYX01BVENIXzggLSBzY2FuYWxpZ24pLg0KKyovDQorICAgICAgICBsZWEgcnNpLFtyOCtyMTBdDQorICAgICAgICBtb3YgcmR4LCAweGZmZmZmZmZmZmZmZmZlZjggLy87IC0oTUFYX01BVENIXzgpDQorICAgICAgICBsZWEgcnNpLCBbcnNpICsgcjEzICsgMHgwMTA4XSAvLztNQVhfTUFUQ0hfOF0NCisgICAgICAgIGxlYSByZGksIFtyOSArIHIxMyArIDB4MDEwOF0gLy87TUFYX01BVENIXzhdDQorDQorICAgICAgICBwcmVmZXRjaHQxIFtyc2krcmR4XQ0KKyAgICAgICAgcHJlZmV0Y2h0MSBbcmRpK3JkeF0NCisNCisvKg0KKzs7OyBUZXN0IHRoZSBzdHJpbmdzIGZvciBlcXVhbGl0eSwgOCBieXRlcyBhdCBhIHRpbWUuIEF0IHRoZSBlbmQsDQorOzs7IGFkanVzdCByZHggc28gdGhhdCBpdCBpcyBvZmZzZXQgdG8gdGhlIGV4YWN0IGJ5dGUgdGhhdCBtaXNtYXRjaGVkLg0KKzs7Ow0KKzs7OyBXZSBhbHJlYWR5IGtub3cgYXQgdGhpcyBwb2ludCB0aGF0IHRoZSBmaXJzdCB0aHJlZSBieXRlcyBvZiB0aGUNCis7Ozsgc3RyaW5ncyBtYXRjaCBlYWNoIG90aGVyLCBhbmQgdGhleSBjYW4gYmUgc2FmZWx5IHBhc3NlZCBvdmVyIGJlZm9yZQ0KKzs7OyBzdGFydGluZyB0aGUgY29tcGFyZSBsb29wLiBTbyB3aGF0IHRoaXMgY29kZSBkb2VzIGlzIHNraXAgb3ZlciAwLTMNCis7OzsgYnl0ZXMsIGFzIG11Y2ggYXMgbmVjZXNzYXJ5IGluIG9yZGVyIHRvIGR3b3JkLWFsaWduIHRoZSBlZGkNCis7OzsgcG9pbnRlci4gKHJzaSB3aWxsIHN0aWxsIGJlIG1pc2FsaWduZWQgdGhyZWUgdGltZXMgb3V0IG9mIGZvdXIuKQ0KKzs7Ow0KKzs7OyBJdCBzaG91bGQgYmUgY29uZmVzc2VkIHRoYXQgdGhpcyBsb29wIHVzdWFsbHkgZG9lcyBub3QgcmVwcmVzZW50DQorOzs7IG11Y2ggb2YgdGhlIHRvdGFsIHJ1bm5pbmcgdGltZS4gUmVwbGFjaW5nIGl0IHdpdGggYSBtb3JlDQorOzs7IHN0cmFpZ2h0Zm9yd2FyZCAicmVwIGNtcHNiIiB3b3VsZCBub3QgZHJhc3RpY2FsbHkgZGVncmFkZQ0KKzs7OyBwZXJmb3JtYW5jZS4NCisqLw0KKw0KK0xvb3BDbXBzOg0KKyAgICAgICAgbW92IHJheCwgW3JzaSArIHJkeF0NCisgICAgICAgIHhvciByYXgsIFtyZGkgKyByZHhdDQorICAgICAgICBqbnogTGVhdmVMb29wQ21wcw0KKw0KKyAgICAgICAgbW92IHJheCwgW3JzaSArIHJkeCArIDhdDQorICAgICAgICB4b3IgcmF4LCBbcmRpICsgcmR4ICsgOF0NCisgICAgICAgIGpueiBMZWF2ZUxvb3BDbXBzOA0KKw0KKw0KKyAgICAgICAgbW92IHJheCwgW3JzaSArIHJkeCArIDgrOF0NCisgICAgICAgIHhvciByYXgsIFtyZGkgKyByZHggKyA4KzhdDQorICAgICAgICBqbnogTGVhdmVMb29wQ21wczE2DQorDQorICAgICAgICBhZGQgcmR4LDgrOCs4DQorDQorCQlCRUZPUkVfSk1QDQorICAgICAgICBqbnogIExvb3BDbXBzDQorICAgICAgICBqbXAgIExlbk1heGltdW0NCisJCUFGVEVSX0pNUA0KKwkJDQorTGVhdmVMb29wQ21wczE2OiBhZGQgcmR4LDgNCitMZWF2ZUxvb3BDbXBzODogYWRkIHJkeCw4DQorTGVhdmVMb29wQ21wczoNCisNCisgICAgICAgIHRlc3QgICAgZWF4LCAweDAwMDBGRkZGDQorICAgICAgICBqbnogTGVuTG93ZXINCisNCisgICAgICAgIHRlc3QgZWF4LDB4ZmZmZmZmZmYNCisNCisgICAgICAgIGpueiBMZW5Mb3dlcjMyDQorDQorICAgICAgICBhZGQgcmR4LDQNCisgICAgICAgIHNociByYXgsMzINCisgICAgICAgIG9yIGF4LGF4DQorCQlCRUZPUkVfSk1QDQorICAgICAgICBqbnogTGVuTG93ZXINCisJCUFGVEVSX0pNUA0KKw0KK0xlbkxvd2VyMzI6DQorICAgICAgICBzaHIgZWF4LDE2DQorICAgICAgICBhZGQgcmR4LDINCisJCQ0KK0xlbkxvd2VyOgkJDQorICAgICAgICBzdWIgYWwsIDENCisgICAgICAgIGFkYyByZHgsIDANCisvLzs7OyBDYWxjdWxhdGUgdGhlIGxlbmd0aCBvZiB0aGUgbWF0Y2guIElmIGl0IGlzIGxvbmdlciB0aGFuIE1BWF9NQVRDSCwNCisvLzs7OyB0aGVuIGF1dG9tYXRpY2FsbHkgYWNjZXB0IGl0IGFzIHRoZSBiZXN0IHBvc3NpYmxlIG1hdGNoIGFuZCBsZWF2ZS4NCisNCisgICAgICAgIGxlYSByYXgsIFtyZGkgKyByZHhdDQorICAgICAgICBzdWIgcmF4LCByOQ0KKyAgICAgICAgY21wIGVheCwgTUFYX01BVENIDQorCQlCRUZPUkVfSk1QDQorICAgICAgICBqZ2UgTGVuTWF4aW11bQ0KKwkJQUZURVJfSk1QDQorLyoNCis7OzsgSWYgdGhlIGxlbmd0aCBvZiB0aGUgbWF0Y2ggaXMgbm90IGxvbmdlciB0aGFuIHRoZSBiZXN0IG1hdGNoIHdlDQorOzs7IGhhdmUgc28gZmFyLCB0aGVuIGZvcmdldCBpdCBhbmQgcmV0dXJuIHRvIHRoZSBsb29rdXAgbG9vcC4NCis7Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCisqLw0KKyAgICAgICAgY21wIGVheCwgcjExZA0KKyAgICAgICAgamcgIExvbmdlck1hdGNoDQorDQorICAgICAgICBsZWEgcnNpLFtyMTArcjExXQ0KKw0KKyAgICAgICAgbW92IHJkaSwgcHJldl9hZA0KKyAgICAgICAgbW92IGVkeCwgW2NoYWlubGVud21hc2tdDQorCQlCRUZPUkVfSk1QDQorICAgICAgICBqbXAgTG9va3VwTG9vcA0KKwkJQUZURVJfSk1QDQorLyoNCis7OzsgICAgICAgICBzLT5tYXRjaF9zdGFydCA9IGN1cl9tYXRjaDsNCis7OzsgICAgICAgICBiZXN0X2xlbiA9IGxlbjsNCis7OzsgICAgICAgICBpZiAobGVuID49IG5pY2VfbWF0Y2gpIGJyZWFrOw0KKzs7OyAgICAgICAgIHNjYW5fZW5kID0gKih1c2hmKikoc2NhbitiZXN0X2xlbi0xKTsNCisqLw0KK0xvbmdlck1hdGNoOg0KKyAgICAgICAgbW92IHIxMWQsIGVheA0KKyAgICAgICAgbW92IG1hdGNoX3N0YXJ0LCByOGQNCisgICAgICAgIGNtcCBlYXgsIFtuaWNlbWF0Y2hdDQorCQlCRUZPUkVfSk1QDQorICAgICAgICBqZ2UgTGVhdmVOb3cNCisJCUFGVEVSX0pNUA0KKw0KKyAgICAgICAgbGVhIHJzaSxbcjEwK3JheF0NCisNCisgICAgICAgIG1vdnp4ICAgZWJ4LCB3b3JkIHB0ciBbcjkgKyByYXggLSAxXQ0KKyAgICAgICAgbW92IHJkaSwgcHJldl9hZA0KKyAgICAgICAgbW92IGVkeCwgW2NoYWlubGVud21hc2tdDQorCQlCRUZPUkVfSk1QDQorICAgICAgICBqbXAgTG9va3VwTG9vcA0KKwkJQUZURVJfSk1QDQorDQorLy87OzsgQWNjZXB0IHRoZSBjdXJyZW50IHN0cmluZywgd2l0aCB0aGUgbWF4aW11bSBwb3NzaWJsZSBsZW5ndGguDQorDQorTGVuTWF4aW11bToNCisgICAgICAgIG1vdiByMTFkLE1BWF9NQVRDSA0KKyAgICAgICAgbW92IG1hdGNoX3N0YXJ0LCByOGQNCisNCisvLzs7OyBpZiAoKHVJbnQpYmVzdF9sZW4gPD0gcy0+bG9va2FoZWFkKSByZXR1cm4gKHVJbnQpYmVzdF9sZW47DQorLy87OzsgcmV0dXJuIHMtPmxvb2thaGVhZDsNCisNCitMZWF2ZU5vdzoNCisgICAgICAgIG1vdiBlYXgsIExvb2thaGVhZA0KKyAgICAgICAgY21wIHIxMWQsIGVheA0KKyAgICAgICAgY21vdm5nIGVheCwgcjExZA0KKw0KKw0KKw0KKy8vOzs7IFJlc3RvcmUgdGhlIHN0YWNrIGFuZCByZXR1cm4gZnJvbSB3aGVuY2Ugd2UgY2FtZS4NCisNCisNCisvLyAgICAgICAgbW92IHJzaSxbc2F2ZV9yc2ldDQorLy8gICAgICAgIG1vdiByZGksW3NhdmVfcmRpXQ0KKyAgICAgICAgbW92IHJieCxbc2F2ZV9yYnhdDQorICAgICAgICBtb3YgcmJwLFtzYXZlX3JicF0NCisgICAgICAgIG1vdiByMTIsW3NhdmVfcjEyXQ0KKyAgICAgICAgbW92IHIxMyxbc2F2ZV9yMTNdDQorICAgICAgICBtb3YgcjE0LFtzYXZlX3IxNF0NCisgICAgICAgIG1vdiByMTUsW3NhdmVfcjE1XQ0KKw0KKw0KKyAgICAgICAgcmV0IDANCisvLzsgcGxlYXNlIGRvbid0IHJlbW92ZSB0aGlzIHN0cmluZyAhDQorLy87IFlvdXIgY2FuIGZyZWVseSB1c2UgZ3ZtYXQ2NCBpbiBhbnkgZnJlZSBvciBjb21tZXJjaWFsIGFwcA0KKy8vOyBidXQgaXQgaXMgZmFyIGJldHRlciBkb24ndCByZW1vdmUgdGhlIHN0cmluZyBpbiB0aGUgYmluYXJ5IQ0KKyAvLyAgIGRiICAgICAwZGgsMGFoLCJhc202ODYgd2l0aCBtYXNtLCBvcHRpbWlzZWQgYXNzZW1ibHkgY29kZSBmcm9tIEJyaWFuIFJhaXRlciwgd3JpdHRlbiAxOTk4LCBjb252ZXJ0ZWQgdG8gYW1kIDY0IGJ5IEdpbGxlcyBWb2xsYW50IDIwMDUiLDBkaCwwYWgsMA0KKw0KKw0KK21hdGNoX2luaXQ6DQorICByZXQgMA0KKw0KKw0KZGlmZiAtLWdpdCBhL3psaWItMS4yLjYvY29udHJpYi9pbmZiYWNrOS9SRUFETUUgYi96bGliLTEuMi42L2NvbnRyaWIvaW5mYmFjazkvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3NWVkMTMKLS0tIC9kZXYvbnVsbAorKysgYi96bGliLTEuMi42L2NvbnRyaWIvaW5mYmFjazkvUkVBRE1FCkBAIC0wLDAgKzEgQEAKK1NlZSBpbmZiYWNrOS5oIGZvciB3aGF0IHRoaXMgaXMgYW5kIGhvdyB0byB1c2UgaXQuCmRpZmYgLS1naXQgYS96bGliLTEuMi42L2NvbnRyaWIvaW5mYmFjazkvaW5mYmFjazkuYyBiL3psaWItMS4yLjYvY29udHJpYi9pbmZiYWNrOS9pbmZiYWNrOS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiYmU5MGMKLS0tIC9kZXYvbnVsbAorKysgYi96bGliLTEuMi42L2NvbnRyaWIvaW5mYmFjazkvaW5mYmFjazkuYwpAQCAtMCwwICsxLDYxNyBAQAorLyogaW5mYmFjazkuYyAtLSBpbmZsYXRlIGRlZmxhdGU2NCBkYXRhIHVzaW5nIGEgY2FsbC1iYWNrIGludGVyZmFjZQorICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDggTWFyayBBZGxlcgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAorICovCisKKyNpbmNsdWRlICJ6dXRpbC5oIgorI2luY2x1ZGUgImluZmJhY2s5LmgiCisjaW5jbHVkZSAiaW5mdHJlZTkuaCIKKyNpbmNsdWRlICJpbmZsYXRlOS5oIgorCisjZGVmaW5lIFdTSVpFIDY1NTM2VUwKKworLyoKKyAgIHN0cm0gcHJvdmlkZXMgbWVtb3J5IGFsbG9jYXRpb24gZnVuY3Rpb25zIGluIHphbGxvYyBhbmQgemZyZWUsIG9yCisgICBaX05VTEwgdG8gdXNlIHRoZSBsaWJyYXJ5IG1lbW9yeSBhbGxvY2F0aW9uIGZ1bmN0aW9ucy4KKworICAgd2luZG93IGlzIGEgdXNlci1zdXBwbGllZCB3aW5kb3cgYW5kIG91dHB1dCBidWZmZXIgdGhhdCBpcyA2NEsgYnl0ZXMuCisgKi8KK2ludCBaRVhQT1JUIGluZmxhdGVCYWNrOUluaXRfKHN0cm0sIHdpbmRvdywgdmVyc2lvbiwgc3RyZWFtX3NpemUpCit6X3N0cmVhbSBGQVIgKnN0cm07Cit1bnNpZ25lZCBjaGFyIEZBUiAqd2luZG93OworY29uc3QgY2hhciAqdmVyc2lvbjsKK2ludCBzdHJlYW1fc2l6ZTsKK3sKKyAgICBzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKnN0YXRlOworCisgICAgaWYgKHZlcnNpb24gPT0gWl9OVUxMIHx8IHZlcnNpb25bMF0gIT0gWkxJQl9WRVJTSU9OWzBdIHx8CisgICAgICAgIHN0cmVhbV9zaXplICE9IChpbnQpKHNpemVvZih6X3N0cmVhbSkpKQorICAgICAgICByZXR1cm4gWl9WRVJTSU9OX0VSUk9SOworICAgIGlmIChzdHJtID09IFpfTlVMTCB8fCB3aW5kb3cgPT0gWl9OVUxMKQorICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisgICAgc3RybS0+bXNnID0gWl9OVUxMOyAgICAgICAgICAgICAgICAgLyogaW4gY2FzZSB3ZSByZXR1cm4gYW4gZXJyb3IgKi8KKyAgICBpZiAoc3RybS0+emFsbG9jID09IChhbGxvY19mdW5jKTApIHsKKyAgICAgICAgc3RybS0+emFsbG9jID0gemNhbGxvYzsKKyAgICAgICAgc3RybS0+b3BhcXVlID0gKHZvaWRwZikwOworICAgIH0KKyAgICBpZiAoc3RybS0+emZyZWUgPT0gKGZyZWVfZnVuYykwKSBzdHJtLT56ZnJlZSA9IHpjZnJlZTsKKyAgICBzdGF0ZSA9IChzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKilaQUxMT0Moc3RybSwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBpbmZsYXRlX3N0YXRlKSk7CisgICAgaWYgKHN0YXRlID09IFpfTlVMTCkgcmV0dXJuIFpfTUVNX0VSUk9SOworICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogYWxsb2NhdGVkXG4iKSk7CisgICAgc3RybS0+c3RhdGUgPSAodm9pZHBmKXN0YXRlOworICAgIHN0YXRlLT53aW5kb3cgPSB3aW5kb3c7CisgICAgcmV0dXJuIFpfT0s7Cit9CisKKy8qCisgICBCdWlsZCBhbmQgb3V0cHV0IGxlbmd0aCBhbmQgZGlzdGFuY2UgZGVjb2RpbmcgdGFibGVzIGZvciBmaXhlZCBjb2RlCisgICBkZWNvZGluZy4KKyAqLworI2lmZGVmIE1BS0VGSVhFRAorI2luY2x1ZGUgPHN0ZGlvLmg+CisKK3ZvaWQgbWFrZWZpeGVkOSh2b2lkKQoreworICAgIHVuc2lnbmVkIHN5bSwgYml0cywgbG93LCBzaXplOworICAgIGNvZGUgKm5leHQsICpsZW5maXgsICpkaXN0Zml4OworICAgIHN0cnVjdCBpbmZsYXRlX3N0YXRlIHN0YXRlOworICAgIGNvZGUgZml4ZWRbNTQ0XTsKKworICAgIC8qIGxpdGVyYWwvbGVuZ3RoIHRhYmxlICovCisgICAgc3ltID0gMDsKKyAgICB3aGlsZSAoc3ltIDwgMTQ0KSBzdGF0ZS5sZW5zW3N5bSsrXSA9IDg7CisgICAgd2hpbGUgKHN5bSA8IDI1Nikgc3RhdGUubGVuc1tzeW0rK10gPSA5OworICAgIHdoaWxlIChzeW0gPCAyODApIHN0YXRlLmxlbnNbc3ltKytdID0gNzsKKyAgICB3aGlsZSAoc3ltIDwgMjg4KSBzdGF0ZS5sZW5zW3N5bSsrXSA9IDg7CisgICAgbmV4dCA9IGZpeGVkOworICAgIGxlbmZpeCA9IG5leHQ7CisgICAgYml0cyA9IDk7CisgICAgaW5mbGF0ZV90YWJsZTkoTEVOUywgc3RhdGUubGVucywgMjg4LCAmKG5leHQpLCAmKGJpdHMpLCBzdGF0ZS53b3JrKTsKKworICAgIC8qIGRpc3RhbmNlIHRhYmxlICovCisgICAgc3ltID0gMDsKKyAgICB3aGlsZSAoc3ltIDwgMzIpIHN0YXRlLmxlbnNbc3ltKytdID0gNTsKKyAgICBkaXN0Zml4ID0gbmV4dDsKKyAgICBiaXRzID0gNTsKKyAgICBpbmZsYXRlX3RhYmxlOShESVNUUywgc3RhdGUubGVucywgMzIsICYobmV4dCksICYoYml0cyksIHN0YXRlLndvcmspOworCisgICAgLyogd3JpdGUgdGFibGVzICovCisgICAgcHV0cygiICAgIC8qIGluZmZpeDkuaCAtLSB0YWJsZSBmb3IgZGVjb2RpbmcgZGVmbGF0ZTY0IGZpeGVkIGNvZGVzIik7CisgICAgcHV0cygiICAgICAqIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IG1ha2VmaXhlZDkoKS4iKTsKKyAgICBwdXRzKCIgICAgICovIik7CisgICAgcHV0cygiIik7CisgICAgcHV0cygiICAgIC8qIFdBUk5JTkc6IHRoaXMgZmlsZSBzaG91bGQgKm5vdCogYmUgdXNlZCBieSBhcHBsaWNhdGlvbnMuIik7CisgICAgcHV0cygiICAgICAgIEl0IGlzIHBhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbGlicmFyeSBhbmQgaXMiKTsKKyAgICBwdXRzKCIgICAgICAgc3ViamVjdCB0byBjaGFuZ2UuIEFwcGxpY2F0aW9ucyBzaG91bGQgb25seSB1c2UgemxpYi5oLiIpOworICAgIHB1dHMoIiAgICAgKi8iKTsKKyAgICBwdXRzKCIiKTsKKyAgICBzaXplID0gMVUgPDwgOTsKKyAgICBwcmludGYoIiAgICBzdGF0aWMgY29uc3QgY29kZSBsZW5maXhbJXVdID0geyIsIHNpemUpOworICAgIGxvdyA9IDA7CisgICAgZm9yICg7OykgeworICAgICAgICBpZiAoKGxvdyAlIDYpID09IDApIHByaW50ZigiXG4gICAgICAgICIpOworICAgICAgICBwcmludGYoInsldSwldSwlZH0iLCBsZW5maXhbbG93XS5vcCwgbGVuZml4W2xvd10uYml0cywKKyAgICAgICAgICAgICAgIGxlbmZpeFtsb3ddLnZhbCk7CisgICAgICAgIGlmICgrK2xvdyA9PSBzaXplKSBicmVhazsKKyAgICAgICAgcHV0Y2hhcignLCcpOworICAgIH0KKyAgICBwdXRzKCJcbiAgICB9OyIpOworICAgIHNpemUgPSAxVSA8PCA1OworICAgIHByaW50ZigiXG4gICAgc3RhdGljIGNvbnN0IGNvZGUgZGlzdGZpeFsldV0gPSB7Iiwgc2l6ZSk7CisgICAgbG93ID0gMDsKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGlmICgobG93ICUgNSkgPT0gMCkgcHJpbnRmKCJcbiAgICAgICAgIik7CisgICAgICAgIHByaW50ZigieyV1LCV1LCVkfSIsIGRpc3RmaXhbbG93XS5vcCwgZGlzdGZpeFtsb3ddLmJpdHMsCisgICAgICAgICAgICAgICBkaXN0Zml4W2xvd10udmFsKTsKKyAgICAgICAgaWYgKCsrbG93ID09IHNpemUpIGJyZWFrOworICAgICAgICBwdXRjaGFyKCcsJyk7CisgICAgfQorICAgIHB1dHMoIlxuICAgIH07Iik7Cit9CisjZW5kaWYgLyogTUFLRUZJWEVEICovCisKKy8qIE1hY3JvcyBmb3IgaW5mbGF0ZUJhY2soKTogKi8KKworLyogQ2xlYXIgdGhlIGlucHV0IGJpdCBhY2N1bXVsYXRvciAqLworI2RlZmluZSBJTklUQklUUygpIFwKKyAgICBkbyB7IFwKKyAgICAgICAgaG9sZCA9IDA7IFwKKyAgICAgICAgYml0cyA9IDA7IFwKKyAgICB9IHdoaWxlICgwKQorCisvKiBBc3N1cmUgdGhhdCBzb21lIGlucHV0IGlzIGF2YWlsYWJsZS4gIElmIGlucHV0IGlzIHJlcXVlc3RlZCwgYnV0IGRlbmllZCwKKyAgIHRoZW4gcmV0dXJuIGEgWl9CVUZfRVJST1IgZnJvbSBpbmZsYXRlQmFjaygpLiAqLworI2RlZmluZSBQVUxMKCkgXAorICAgIGRvIHsgXAorICAgICAgICBpZiAoaGF2ZSA9PSAwKSB7IFwKKyAgICAgICAgICAgIGhhdmUgPSBpbihpbl9kZXNjLCAmbmV4dCk7IFwKKyAgICAgICAgICAgIGlmIChoYXZlID09IDApIHsgXAorICAgICAgICAgICAgICAgIG5leHQgPSBaX05VTEw7IFwKKyAgICAgICAgICAgICAgICByZXQgPSBaX0JVRl9FUlJPUjsgXAorICAgICAgICAgICAgICAgIGdvdG8gaW5mX2xlYXZlOyBcCisgICAgICAgICAgICB9IFwKKyAgICAgICAgfSBcCisgICAgfSB3aGlsZSAoMCkKKworLyogR2V0IGEgYnl0ZSBvZiBpbnB1dCBpbnRvIHRoZSBiaXQgYWNjdW11bGF0b3IsIG9yIHJldHVybiBmcm9tIGluZmxhdGVCYWNrKCkKKyAgIHdpdGggYW4gZXJyb3IgaWYgdGhlcmUgaXMgbm8gaW5wdXQgYXZhaWxhYmxlLiAqLworI2RlZmluZSBQVUxMQllURSgpIFwKKyAgICBkbyB7IFwKKyAgICAgICAgUFVMTCgpOyBcCisgICAgICAgIGhhdmUtLTsgXAorICAgICAgICBob2xkICs9ICh1bnNpZ25lZCBsb25nKSgqbmV4dCsrKSA8PCBiaXRzOyBcCisgICAgICAgIGJpdHMgKz0gODsgXAorICAgIH0gd2hpbGUgKDApCisKKy8qIEFzc3VyZSB0aGF0IHRoZXJlIGFyZSBhdCBsZWFzdCBuIGJpdHMgaW4gdGhlIGJpdCBhY2N1bXVsYXRvci4gIElmIHRoZXJlIGlzCisgICBub3QgZW5vdWdoIGF2YWlsYWJsZSBpbnB1dCB0byBkbyB0aGF0LCB0aGVuIHJldHVybiBmcm9tIGluZmxhdGVCYWNrKCkgd2l0aAorICAgYW4gZXJyb3IuICovCisjZGVmaW5lIE5FRURCSVRTKG4pIFwKKyAgICBkbyB7IFwKKyAgICAgICAgd2hpbGUgKGJpdHMgPCAodW5zaWduZWQpKG4pKSBcCisgICAgICAgICAgICBQVUxMQllURSgpOyBcCisgICAgfSB3aGlsZSAoMCkKKworLyogUmV0dXJuIHRoZSBsb3cgbiBiaXRzIG9mIHRoZSBiaXQgYWNjdW11bGF0b3IgKG4gPD0gMTYpICovCisjZGVmaW5lIEJJVFMobikgXAorICAgICgodW5zaWduZWQpaG9sZCAmICgoMVUgPDwgKG4pKSAtIDEpKQorCisvKiBSZW1vdmUgbiBiaXRzIGZyb20gdGhlIGJpdCBhY2N1bXVsYXRvciAqLworI2RlZmluZSBEUk9QQklUUyhuKSBcCisgICAgZG8geyBcCisgICAgICAgIGhvbGQgPj49IChuKTsgXAorICAgICAgICBiaXRzIC09ICh1bnNpZ25lZCkobik7IFwKKyAgICB9IHdoaWxlICgwKQorCisvKiBSZW1vdmUgemVybyB0byBzZXZlbiBiaXRzIGFzIG5lZWRlZCB0byBnbyB0byBhIGJ5dGUgYm91bmRhcnkgKi8KKyNkZWZpbmUgQllURUJJVFMoKSBcCisgICAgZG8geyBcCisgICAgICAgIGhvbGQgPj49IGJpdHMgJiA3OyBcCisgICAgICAgIGJpdHMgLT0gYml0cyAmIDc7IFwKKyAgICB9IHdoaWxlICgwKQorCisvKiBBc3N1cmUgdGhhdCBzb21lIG91dHB1dCBzcGFjZSBpcyBhdmFpbGFibGUsIGJ5IHdyaXRpbmcgb3V0IHRoZSB3aW5kb3cKKyAgIGlmIGl0J3MgZnVsbC4gIElmIHRoZSB3cml0ZSBmYWlscywgcmV0dXJuIGZyb20gaW5mbGF0ZUJhY2soKSB3aXRoIGEKKyAgIFpfQlVGX0VSUk9SLiAqLworI2RlZmluZSBST09NKCkgXAorICAgIGRvIHsgXAorICAgICAgICBpZiAobGVmdCA9PSAwKSB7IFwKKyAgICAgICAgICAgIHB1dCA9IHdpbmRvdzsgXAorICAgICAgICAgICAgbGVmdCA9IFdTSVpFOyBcCisgICAgICAgICAgICB3cmFwID0gMTsgXAorICAgICAgICAgICAgaWYgKG91dChvdXRfZGVzYywgcHV0LCAodW5zaWduZWQpbGVmdCkpIHsgXAorICAgICAgICAgICAgICAgIHJldCA9IFpfQlVGX0VSUk9SOyBcCisgICAgICAgICAgICAgICAgZ290byBpbmZfbGVhdmU7IFwKKyAgICAgICAgICAgIH0gXAorICAgICAgICB9IFwKKyAgICB9IHdoaWxlICgwKQorCisvKgorICAgc3RybSBwcm92aWRlcyB0aGUgbWVtb3J5IGFsbG9jYXRpb24gZnVuY3Rpb25zIGFuZCB3aW5kb3cgYnVmZmVyIG9uIGlucHV0LAorICAgYW5kIHByb3ZpZGVzIGluZm9ybWF0aW9uIG9uIHRoZSB1bnVzZWQgaW5wdXQgb24gcmV0dXJuLiAgRm9yIFpfREFUQV9FUlJPUgorICAgcmV0dXJucywgc3RybSB3aWxsIGFsc28gcHJvdmlkZSBhbiBlcnJvciBtZXNzYWdlLgorCisgICBpbigpIGFuZCBvdXQoKSBhcmUgdGhlIGNhbGwtYmFjayBpbnB1dCBhbmQgb3V0cHV0IGZ1bmN0aW9ucy4gIFdoZW4KKyAgIGluZmxhdGVCYWNrKCkgbmVlZHMgbW9yZSBpbnB1dCwgaXQgY2FsbHMgaW4oKS4gIFdoZW4gaW5mbGF0ZUJhY2soKSBoYXMKKyAgIGZpbGxlZCB0aGUgd2luZG93IHdpdGggb3V0cHV0LCBvciB3aGVuIGl0IGNvbXBsZXRlcyB3aXRoIGRhdGEgaW4gdGhlCisgICB3aW5kb3csIGl0IGNhbGxzIG91dCgpIHRvIHdyaXRlIG91dCB0aGUgZGF0YS4gIFRoZSBhcHBsaWNhdGlvbiBtdXN0IG5vdAorICAgY2hhbmdlIHRoZSBwcm92aWRlZCBpbnB1dCB1bnRpbCBpbigpIGlzIGNhbGxlZCBhZ2FpbiBvciBpbmZsYXRlQmFjaygpCisgICByZXR1cm5zLiAgVGhlIGFwcGxpY2F0aW9uIG11c3Qgbm90IGNoYW5nZSB0aGUgd2luZG93L291dHB1dCBidWZmZXIgdW50aWwKKyAgIGluZmxhdGVCYWNrKCkgcmV0dXJucy4KKworICAgaW4oKSBhbmQgb3V0KCkgYXJlIGNhbGxlZCB3aXRoIGEgZGVzY3JpcHRvciBwYXJhbWV0ZXIgcHJvdmlkZWQgaW4gdGhlCisgICBpbmZsYXRlQmFjaygpIGNhbGwuICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBzdHJ1Y3R1cmUgdGhhdCBwcm92aWRlcyB0aGUKKyAgIGluZm9ybWF0aW9uIHJlcXVpcmVkIHRvIGRvIHRoZSByZWFkIG9yIHdyaXRlLCBhcyB3ZWxsIGFzIGFjY3VtdWxhdGVkCisgICBpbmZvcm1hdGlvbiBvbiB0aGUgaW5wdXQgYW5kIG91dHB1dCBzdWNoIGFzIHRvdGFscyBhbmQgY2hlY2sgdmFsdWVzLgorCisgICBpbigpIHNob3VsZCByZXR1cm4gemVybyBvbiBmYWlsdXJlLiAgb3V0KCkgc2hvdWxkIHJldHVybiBub24temVybyBvbgorICAgZmFpbHVyZS4gIElmIGVpdGhlciBpbigpIG9yIG91dCgpIGZhaWxzLCB0aGFuIGluZmxhdGVCYWNrKCkgcmV0dXJucyBhCisgICBaX0JVRl9FUlJPUi4gIHN0cm0tPm5leHRfaW4gY2FuIGJlIGNoZWNrZWQgZm9yIFpfTlVMTCB0byBzZWUgd2hldGhlciBpdAorICAgd2FzIGluKCkgb3Igb3V0KCkgdGhhdCBjYXVzZWQgaW4gdGhlIGVycm9yLiAgT3RoZXJ3aXNlLCAgaW5mbGF0ZUJhY2soKQorICAgcmV0dXJucyBaX1NUUkVBTV9FTkQgb24gc3VjY2VzcywgWl9EQVRBX0VSUk9SIGZvciBhbiBkZWZsYXRlIGZvcm1hdAorICAgZXJyb3IsIG9yIFpfTUVNX0VSUk9SIGlmIGl0IGNvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBzdGF0ZS4KKyAgIGluZmxhdGVCYWNrKCkgY2FuIGFsc28gcmV0dXJuIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBpbnB1dCBwYXJhbWV0ZXJzCisgICBhcmUgbm90IGNvcnJlY3QsIGkuZS4gc3RybSBpcyBaX05VTEwgb3IgdGhlIHN0YXRlIHdhcyBub3QgaW5pdGlhbGl6ZWQuCisgKi8KK2ludCBaRVhQT1JUIGluZmxhdGVCYWNrOShzdHJtLCBpbiwgaW5fZGVzYywgb3V0LCBvdXRfZGVzYykKK3pfc3RyZWFtIEZBUiAqc3RybTsKK2luX2Z1bmMgaW47Cit2b2lkIEZBUiAqaW5fZGVzYzsKK291dF9mdW5jIG91dDsKK3ZvaWQgRkFSICpvdXRfZGVzYzsKK3sKKyAgICBzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKnN0YXRlOworICAgIHVuc2lnbmVkIGNoYXIgRkFSICpuZXh0OyAgICAvKiBuZXh0IGlucHV0ICovCisgICAgdW5zaWduZWQgY2hhciBGQVIgKnB1dDsgICAgIC8qIG5leHQgb3V0cHV0ICovCisgICAgdW5zaWduZWQgaGF2ZTsgICAgICAgICAgICAgIC8qIGF2YWlsYWJsZSBpbnB1dCAqLworICAgIHVuc2lnbmVkIGxvbmcgbGVmdDsgICAgICAgICAvKiBhdmFpbGFibGUgb3V0cHV0ICovCisgICAgaW5mbGF0ZV9tb2RlIG1vZGU7ICAgICAgICAgIC8qIGN1cnJlbnQgaW5mbGF0ZSBtb2RlICovCisgICAgaW50IGxhc3RibG9jazsgICAgICAgICAgICAgIC8qIHRydWUgaWYgcHJvY2Vzc2luZyBsYXN0IGJsb2NrICovCisgICAgaW50IHdyYXA7ICAgICAgICAgICAgICAgICAgIC8qIHRydWUgaWYgdGhlIHdpbmRvdyBoYXMgd3JhcHBlZCAqLworICAgIHVuc2lnbmVkIGxvbmcgd3JpdGU7ICAgICAgICAvKiB3aW5kb3cgd3JpdGUgaW5kZXggKi8KKyAgICB1bnNpZ25lZCBjaGFyIEZBUiAqd2luZG93OyAgLyogYWxsb2NhdGVkIHNsaWRpbmcgd2luZG93LCBpZiBuZWVkZWQgKi8KKyAgICB1bnNpZ25lZCBsb25nIGhvbGQ7ICAgICAgICAgLyogYml0IGJ1ZmZlciAqLworICAgIHVuc2lnbmVkIGJpdHM7ICAgICAgICAgICAgICAvKiBiaXRzIGluIGJpdCBidWZmZXIgKi8KKyAgICB1bnNpZ25lZCBleHRyYTsgICAgICAgICAgICAgLyogZXh0cmEgYml0cyBuZWVkZWQgKi8KKyAgICB1bnNpZ25lZCBsb25nIGxlbmd0aDsgICAgICAgLyogbGl0ZXJhbCBvciBsZW5ndGggb2YgZGF0YSB0byBjb3B5ICovCisgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQ7ICAgICAgIC8qIGRpc3RhbmNlIGJhY2sgdG8gY29weSBzdHJpbmcgZnJvbSAqLworICAgIHVuc2lnbmVkIGxvbmcgY29weTsgICAgICAgICAvKiBudW1iZXIgb2Ygc3RvcmVkIG9yIG1hdGNoIGJ5dGVzIHRvIGNvcHkgKi8KKyAgICB1bnNpZ25lZCBjaGFyIEZBUiAqZnJvbTsgICAgLyogd2hlcmUgdG8gY29weSBtYXRjaCBieXRlcyBmcm9tICovCisgICAgY29kZSBjb25zdCBGQVIgKmxlbmNvZGU7ICAgIC8qIHN0YXJ0aW5nIHRhYmxlIGZvciBsZW5ndGgvbGl0ZXJhbCBjb2RlcyAqLworICAgIGNvZGUgY29uc3QgRkFSICpkaXN0Y29kZTsgICAvKiBzdGFydGluZyB0YWJsZSBmb3IgZGlzdGFuY2UgY29kZXMgKi8KKyAgICB1bnNpZ25lZCBsZW5iaXRzOyAgICAgICAgICAgLyogaW5kZXggYml0cyBmb3IgbGVuY29kZSAqLworICAgIHVuc2lnbmVkIGRpc3RiaXRzOyAgICAgICAgICAvKiBpbmRleCBiaXRzIGZvciBkaXN0Y29kZSAqLworICAgIGNvZGUgaGVyZTsgICAgICAgICAgICAgICAgICAvKiBjdXJyZW50IGRlY29kaW5nIHRhYmxlIGVudHJ5ICovCisgICAgY29kZSBsYXN0OyAgICAgICAgICAgICAgICAgIC8qIHBhcmVudCB0YWJsZSBlbnRyeSAqLworICAgIHVuc2lnbmVkIGxlbjsgICAgICAgICAgICAgICAvKiBsZW5ndGggdG8gY29weSBmb3IgcmVwZWF0cywgYml0cyB0byBkcm9wICovCisgICAgaW50IHJldDsgICAgICAgICAgICAgICAgICAgIC8qIHJldHVybiBjb2RlICovCisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IG9yZGVyWzE5XSA9IC8qIHBlcm11dGF0aW9uIG9mIGNvZGUgbGVuZ3RocyAqLworICAgICAgICB7MTYsIDE3LCAxOCwgMCwgOCwgNywgOSwgNiwgMTAsIDUsIDExLCA0LCAxMiwgMywgMTMsIDIsIDE0LCAxLCAxNX07CisjaW5jbHVkZSAiaW5mZml4OS5oIgorCisgICAgLyogQ2hlY2sgdGhhdCB0aGUgc3RybSBleGlzdHMgYW5kIHRoYXQgdGhlIHN0YXRlIHdhcyBpbml0aWFsaXplZCAqLworICAgIGlmIChzdHJtID09IFpfTlVMTCB8fCBzdHJtLT5zdGF0ZSA9PSBaX05VTEwpCisgICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKyAgICBzdGF0ZSA9IChzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKilzdHJtLT5zdGF0ZTsKKworICAgIC8qIFJlc2V0IHRoZSBzdGF0ZSAqLworICAgIHN0cm0tPm1zZyA9IFpfTlVMTDsKKyAgICBtb2RlID0gVFlQRTsKKyAgICBsYXN0YmxvY2sgPSAwOworICAgIHdyaXRlID0gMDsKKyAgICB3cmFwID0gMDsKKyAgICB3aW5kb3cgPSBzdGF0ZS0+d2luZG93OworICAgIG5leHQgPSBzdHJtLT5uZXh0X2luOworICAgIGhhdmUgPSBuZXh0ICE9IFpfTlVMTCA/IHN0cm0tPmF2YWlsX2luIDogMDsKKyAgICBob2xkID0gMDsKKyAgICBiaXRzID0gMDsKKyAgICBwdXQgPSB3aW5kb3c7CisgICAgbGVmdCA9IFdTSVpFOworICAgIGxlbmNvZGUgPSBaX05VTEw7CisgICAgZGlzdGNvZGUgPSBaX05VTEw7CisKKyAgICAvKiBJbmZsYXRlIHVudGlsIGVuZCBvZiBibG9jayBtYXJrZWQgYXMgbGFzdCAqLworICAgIGZvciAoOzspCisgICAgICAgIHN3aXRjaCAobW9kZSkgeworICAgICAgICBjYXNlIFRZUEU6CisgICAgICAgICAgICAvKiBkZXRlcm1pbmUgYW5kIGRpc3BhdGNoIGJsb2NrIHR5cGUgKi8KKyAgICAgICAgICAgIGlmIChsYXN0YmxvY2spIHsKKyAgICAgICAgICAgICAgICBCWVRFQklUUygpOworICAgICAgICAgICAgICAgIG1vZGUgPSBET05FOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTkVFREJJVFMoMyk7CisgICAgICAgICAgICBsYXN0YmxvY2sgPSBCSVRTKDEpOworICAgICAgICAgICAgRFJPUEJJVFMoMSk7CisgICAgICAgICAgICBzd2l0Y2ggKEJJVFMoMikpIHsKKyAgICAgICAgICAgIGNhc2UgMDogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0b3JlZCBibG9jayAqLworICAgICAgICAgICAgICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICAgIHN0b3JlZCBibG9jayVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgbGFzdGJsb2NrID8gIiAobGFzdCkiIDogIiIpKTsKKyAgICAgICAgICAgICAgICBtb2RlID0gU1RPUkVEOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZml4ZWQgYmxvY2sgKi8KKyAgICAgICAgICAgICAgICBsZW5jb2RlID0gbGVuZml4OworICAgICAgICAgICAgICAgIGxlbmJpdHMgPSA5OworICAgICAgICAgICAgICAgIGRpc3Rjb2RlID0gZGlzdGZpeDsKKyAgICAgICAgICAgICAgICBkaXN0Yml0cyA9IDU7CisgICAgICAgICAgICAgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgZml4ZWQgY29kZXMgYmxvY2slc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RibG9jayA/ICIgKGxhc3QpIiA6ICIiKSk7CisgICAgICAgICAgICAgICAgbW9kZSA9IExFTjsgICAgICAgICAgICAgICAgICAgICAvKiBkZWNvZGUgY29kZXMgKi8KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGR5bmFtaWMgYmxvY2sgKi8KKyAgICAgICAgICAgICAgICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6ICAgICBkeW5hbWljIGNvZGVzIGJsb2NrJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBsYXN0YmxvY2sgPyAiIChsYXN0KSIgOiAiIikpOworICAgICAgICAgICAgICAgIG1vZGUgPSBUQUJMRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGJsb2NrIHR5cGUiOworICAgICAgICAgICAgICAgIG1vZGUgPSBCQUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBEUk9QQklUUygyKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgU1RPUkVEOgorICAgICAgICAgICAgLyogZ2V0IGFuZCB2ZXJpZnkgc3RvcmVkIGJsb2NrIGxlbmd0aCAqLworICAgICAgICAgICAgQllURUJJVFMoKTsgICAgICAgICAgICAgICAgICAgICAgICAgLyogZ28gdG8gYnl0ZSBib3VuZGFyeSAqLworICAgICAgICAgICAgTkVFREJJVFMoMzIpOworICAgICAgICAgICAgaWYgKChob2xkICYgMHhmZmZmKSAhPSAoKGhvbGQgPj4gMTYpIF4gMHhmZmZmKSkgeworICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgc3RvcmVkIGJsb2NrIGxlbmd0aHMiOworICAgICAgICAgICAgICAgIG1vZGUgPSBCQUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsZW5ndGggPSAodW5zaWduZWQpaG9sZCAmIDB4ZmZmZjsKKyAgICAgICAgICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgc3RvcmVkIGxlbmd0aCAlbHVcbiIsCisgICAgICAgICAgICAgICAgICAgIGxlbmd0aCkpOworICAgICAgICAgICAgSU5JVEJJVFMoKTsKKworICAgICAgICAgICAgLyogY29weSBzdG9yZWQgYmxvY2sgZnJvbSBpbnB1dCB0byBvdXRwdXQgKi8KKyAgICAgICAgICAgIHdoaWxlIChsZW5ndGggIT0gMCkgeworICAgICAgICAgICAgICAgIGNvcHkgPSBsZW5ndGg7CisgICAgICAgICAgICAgICAgUFVMTCgpOworICAgICAgICAgICAgICAgIFJPT00oKTsKKyAgICAgICAgICAgICAgICBpZiAoY29weSA+IGhhdmUpIGNvcHkgPSBoYXZlOworICAgICAgICAgICAgICAgIGlmIChjb3B5ID4gbGVmdCkgY29weSA9IGxlZnQ7CisgICAgICAgICAgICAgICAgem1lbWNweShwdXQsIG5leHQsIGNvcHkpOworICAgICAgICAgICAgICAgIGhhdmUgLT0gY29weTsKKyAgICAgICAgICAgICAgICBuZXh0ICs9IGNvcHk7CisgICAgICAgICAgICAgICAgbGVmdCAtPSBjb3B5OworICAgICAgICAgICAgICAgIHB1dCArPSBjb3B5OworICAgICAgICAgICAgICAgIGxlbmd0aCAtPSBjb3B5OworICAgICAgICAgICAgfQorICAgICAgICAgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgICBzdG9yZWQgZW5kXG4iKSk7CisgICAgICAgICAgICBtb2RlID0gVFlQRTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgVEFCTEU6CisgICAgICAgICAgICAvKiBnZXQgZHluYW1pYyB0YWJsZSBlbnRyaWVzIGRlc2NyaXB0b3IgKi8KKyAgICAgICAgICAgIE5FRURCSVRTKDE0KTsKKyAgICAgICAgICAgIHN0YXRlLT5ubGVuID0gQklUUyg1KSArIDI1NzsKKyAgICAgICAgICAgIERST1BCSVRTKDUpOworICAgICAgICAgICAgc3RhdGUtPm5kaXN0ID0gQklUUyg1KSArIDE7CisgICAgICAgICAgICBEUk9QQklUUyg1KTsKKyAgICAgICAgICAgIHN0YXRlLT5uY29kZSA9IEJJVFMoNCkgKyA0OworICAgICAgICAgICAgRFJPUEJJVFMoNCk7CisgICAgICAgICAgICBpZiAoc3RhdGUtPm5sZW4gPiAyODYpIHsKKyAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJ0b28gbWFueSBsZW5ndGggc3ltYm9scyI7CisgICAgICAgICAgICAgICAgbW9kZSA9IEJBRDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgdGFibGUgc2l6ZXMgb2tcbiIpKTsKKworICAgICAgICAgICAgLyogZ2V0IGNvZGUgbGVuZ3RoIGNvZGUgbGVuZ3RocyAobm90IGEgdHlwbykgKi8KKyAgICAgICAgICAgIHN0YXRlLT5oYXZlID0gMDsKKyAgICAgICAgICAgIHdoaWxlIChzdGF0ZS0+aGF2ZSA8IHN0YXRlLT5uY29kZSkgeworICAgICAgICAgICAgICAgIE5FRURCSVRTKDMpOworICAgICAgICAgICAgICAgIHN0YXRlLT5sZW5zW29yZGVyW3N0YXRlLT5oYXZlKytdXSA9ICh1bnNpZ25lZCBzaG9ydClCSVRTKDMpOworICAgICAgICAgICAgICAgIERST1BCSVRTKDMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd2hpbGUgKHN0YXRlLT5oYXZlIDwgMTkpCisgICAgICAgICAgICAgICAgc3RhdGUtPmxlbnNbb3JkZXJbc3RhdGUtPmhhdmUrK11dID0gMDsKKyAgICAgICAgICAgIHN0YXRlLT5uZXh0ID0gc3RhdGUtPmNvZGVzOworICAgICAgICAgICAgbGVuY29kZSA9IChjb2RlIGNvbnN0IEZBUiAqKShzdGF0ZS0+bmV4dCk7CisgICAgICAgICAgICBsZW5iaXRzID0gNzsKKyAgICAgICAgICAgIHJldCA9IGluZmxhdGVfdGFibGU5KENPREVTLCBzdGF0ZS0+bGVucywgMTksICYoc3RhdGUtPm5leHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKGxlbmJpdHMpLCBzdGF0ZS0+d29yayk7CisgICAgICAgICAgICBpZiAocmV0KSB7CisgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBjb2RlIGxlbmd0aHMgc2V0IjsKKyAgICAgICAgICAgICAgICBtb2RlID0gQkFEOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgICBjb2RlIGxlbmd0aHMgb2tcbiIpKTsKKworICAgICAgICAgICAgLyogZ2V0IGxlbmd0aCBhbmQgZGlzdGFuY2UgY29kZSBjb2RlIGxlbmd0aHMgKi8KKyAgICAgICAgICAgIHN0YXRlLT5oYXZlID0gMDsKKyAgICAgICAgICAgIHdoaWxlIChzdGF0ZS0+aGF2ZSA8IHN0YXRlLT5ubGVuICsgc3RhdGUtPm5kaXN0KSB7CisgICAgICAgICAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgICAgICAgICBoZXJlID0gbGVuY29kZVtCSVRTKGxlbmJpdHMpXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCh1bnNpZ25lZCkoaGVyZS5iaXRzKSA8PSBiaXRzKSBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgUFVMTEJZVEUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGhlcmUudmFsIDwgMTYpIHsKKyAgICAgICAgICAgICAgICAgICAgTkVFREJJVFMoaGVyZS5iaXRzKTsKKyAgICAgICAgICAgICAgICAgICAgRFJPUEJJVFMoaGVyZS5iaXRzKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUtPmxlbnNbc3RhdGUtPmhhdmUrK10gPSBoZXJlLnZhbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChoZXJlLnZhbCA9PSAxNikgeworICAgICAgICAgICAgICAgICAgICAgICAgTkVFREJJVFMoaGVyZS5iaXRzICsgMik7CisgICAgICAgICAgICAgICAgICAgICAgICBEUk9QQklUUyhoZXJlLmJpdHMpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLT5oYXZlID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGJpdCBsZW5ndGggcmVwZWF0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlID0gQkFEOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gKHVuc2lnbmVkKShzdGF0ZS0+bGVuc1tzdGF0ZS0+aGF2ZSAtIDFdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvcHkgPSAzICsgQklUUygyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIERST1BCSVRTKDIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGhlcmUudmFsID09IDE3KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBORUVEQklUUyhoZXJlLmJpdHMgKyAzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIERST1BCSVRTKGhlcmUuYml0cyk7CisgICAgICAgICAgICAgICAgICAgICAgICBsZW4gPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgY29weSA9IDMgKyBCSVRTKDMpOworICAgICAgICAgICAgICAgICAgICAgICAgRFJPUEJJVFMoMyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBORUVEQklUUyhoZXJlLmJpdHMgKyA3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIERST1BCSVRTKGhlcmUuYml0cyk7CisgICAgICAgICAgICAgICAgICAgICAgICBsZW4gPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgY29weSA9IDExICsgQklUUyg3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIERST1BCSVRTKDcpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS0+aGF2ZSArIGNvcHkgPiBzdGF0ZS0+bmxlbiArIHN0YXRlLT5uZGlzdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBiaXQgbGVuZ3RoIHJlcGVhdCI7CisgICAgICAgICAgICAgICAgICAgICAgICBtb2RlID0gQkFEOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGNvcHktLSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5sZW5zW3N0YXRlLT5oYXZlKytdID0gKHVuc2lnbmVkIHNob3J0KWxlbjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIGhhbmRsZSBlcnJvciBicmVha3MgaW4gd2hpbGUgKi8KKyAgICAgICAgICAgIGlmIChtb2RlID09IEJBRCkgYnJlYWs7CisKKyAgICAgICAgICAgIC8qIGNoZWNrIGZvciBlbmQtb2YtYmxvY2sgY29kZSAoYmV0dGVyIGhhdmUgb25lKSAqLworICAgICAgICAgICAgaWYgKHN0YXRlLT5sZW5zWzI1Nl0gPT0gMCkgeworICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgY29kZSAtLSBtaXNzaW5nIGVuZC1vZi1ibG9jayI7CisgICAgICAgICAgICAgICAgbW9kZSA9IEJBRDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogYnVpbGQgY29kZSB0YWJsZXMgLS0gbm90ZTogZG8gbm90IGNoYW5nZSB0aGUgbGVuYml0cyBvciBkaXN0Yml0cworICAgICAgICAgICAgICAgdmFsdWVzIGhlcmUgKDkgYW5kIDYpIHdpdGhvdXQgcmVhZGluZyB0aGUgY29tbWVudHMgaW4gaW5mdHJlZTkuaAorICAgICAgICAgICAgICAgY29uY2VybmluZyB0aGUgRU5PVUdIIGNvbnN0YW50cywgd2hpY2ggZGVwZW5kIG9uIHRob3NlIHZhbHVlcyAqLworICAgICAgICAgICAgc3RhdGUtPm5leHQgPSBzdGF0ZS0+Y29kZXM7CisgICAgICAgICAgICBsZW5jb2RlID0gKGNvZGUgY29uc3QgRkFSICopKHN0YXRlLT5uZXh0KTsKKyAgICAgICAgICAgIGxlbmJpdHMgPSA5OworICAgICAgICAgICAgcmV0ID0gaW5mbGF0ZV90YWJsZTkoTEVOUywgc3RhdGUtPmxlbnMsIHN0YXRlLT5ubGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYoc3RhdGUtPm5leHQpLCAmKGxlbmJpdHMpLCBzdGF0ZS0+d29yayk7CisgICAgICAgICAgICBpZiAocmV0KSB7CisgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBsaXRlcmFsL2xlbmd0aHMgc2V0IjsKKyAgICAgICAgICAgICAgICBtb2RlID0gQkFEOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGlzdGNvZGUgPSAoY29kZSBjb25zdCBGQVIgKikoc3RhdGUtPm5leHQpOworICAgICAgICAgICAgZGlzdGJpdHMgPSA2OworICAgICAgICAgICAgcmV0ID0gaW5mbGF0ZV90YWJsZTkoRElTVFMsIHN0YXRlLT5sZW5zICsgc3RhdGUtPm5sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPm5kaXN0LCAmKHN0YXRlLT5uZXh0KSwgJihkaXN0Yml0cyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPndvcmspOworICAgICAgICAgICAgaWYgKHJldCkgeworICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgZGlzdGFuY2VzIHNldCI7CisgICAgICAgICAgICAgICAgbW9kZSA9IEJBRDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgY29kZXMgb2tcbiIpKTsKKyAgICAgICAgICAgIG1vZGUgPSBMRU47CisKKyAgICAgICAgY2FzZSBMRU46CisgICAgICAgICAgICAvKiBnZXQgYSBsaXRlcmFsLCBsZW5ndGgsIG9yIGVuZC1vZi1ibG9jayBjb2RlICovCisgICAgICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICAgICAgaGVyZSA9IGxlbmNvZGVbQklUUyhsZW5iaXRzKV07CisgICAgICAgICAgICAgICAgaWYgKCh1bnNpZ25lZCkoaGVyZS5iaXRzKSA8PSBiaXRzKSBicmVhazsKKyAgICAgICAgICAgICAgICBQVUxMQllURSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGhlcmUub3AgJiYgKGhlcmUub3AgJiAweGYwKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgbGFzdCA9IGhlcmU7CisgICAgICAgICAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgICAgICAgICBoZXJlID0gbGVuY29kZVtsYXN0LnZhbCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJJVFMobGFzdC5iaXRzICsgbGFzdC5vcCkgPj4gbGFzdC5iaXRzKV07CisgICAgICAgICAgICAgICAgICAgIGlmICgodW5zaWduZWQpKGxhc3QuYml0cyArIGhlcmUuYml0cykgPD0gYml0cykgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIFBVTExCWVRFKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIERST1BCSVRTKGxhc3QuYml0cyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBEUk9QQklUUyhoZXJlLmJpdHMpOworICAgICAgICAgICAgbGVuZ3RoID0gKHVuc2lnbmVkKWhlcmUudmFsOworCisgICAgICAgICAgICAvKiBwcm9jZXNzIGxpdGVyYWwgKi8KKyAgICAgICAgICAgIGlmIChoZXJlLm9wID09IDApIHsKKyAgICAgICAgICAgICAgICBUcmFjZXZ2KChzdGRlcnIsIGhlcmUudmFsID49IDB4MjAgJiYgaGVyZS52YWwgPCAweDdmID8KKyAgICAgICAgICAgICAgICAgICAgICAgICJpbmZsYXRlOiAgICAgICAgIGxpdGVyYWwgJyVjJ1xuIiA6CisgICAgICAgICAgICAgICAgICAgICAgICAiaW5mbGF0ZTogICAgICAgICBsaXRlcmFsIDB4JTAyeFxuIiwgaGVyZS52YWwpKTsKKyAgICAgICAgICAgICAgICBST09NKCk7CisgICAgICAgICAgICAgICAgKnB1dCsrID0gKHVuc2lnbmVkIGNoYXIpKGxlbmd0aCk7CisgICAgICAgICAgICAgICAgbGVmdC0tOworICAgICAgICAgICAgICAgIG1vZGUgPSBMRU47CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIHByb2Nlc3MgZW5kIG9mIGJsb2NrICovCisgICAgICAgICAgICBpZiAoaGVyZS5vcCAmIDMyKSB7CisgICAgICAgICAgICAgICAgVHJhY2V2digoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgICBlbmQgb2YgYmxvY2tcbiIpKTsKKyAgICAgICAgICAgICAgICBtb2RlID0gVFlQRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogaW52YWxpZCBjb2RlICovCisgICAgICAgICAgICBpZiAoaGVyZS5vcCAmIDY0KSB7CisgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBsaXRlcmFsL2xlbmd0aCBjb2RlIjsKKyAgICAgICAgICAgICAgICBtb2RlID0gQkFEOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBsZW5ndGggY29kZSAtLSBnZXQgZXh0cmEgYml0cywgaWYgYW55ICovCisgICAgICAgICAgICBleHRyYSA9ICh1bnNpZ25lZCkoaGVyZS5vcCkgJiAzMTsKKyAgICAgICAgICAgIGlmIChleHRyYSAhPSAwKSB7CisgICAgICAgICAgICAgICAgTkVFREJJVFMoZXh0cmEpOworICAgICAgICAgICAgICAgIGxlbmd0aCArPSBCSVRTKGV4dHJhKTsKKyAgICAgICAgICAgICAgICBEUk9QQklUUyhleHRyYSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBUcmFjZXZ2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgICAgIGxlbmd0aCAlbHVcbiIsIGxlbmd0aCkpOworCisgICAgICAgICAgICAvKiBnZXQgZGlzdGFuY2UgY29kZSAqLworICAgICAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgICAgIGhlcmUgPSBkaXN0Y29kZVtCSVRTKGRpc3RiaXRzKV07CisgICAgICAgICAgICAgICAgaWYgKCh1bnNpZ25lZCkoaGVyZS5iaXRzKSA8PSBiaXRzKSBicmVhazsKKyAgICAgICAgICAgICAgICBQVUxMQllURSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKChoZXJlLm9wICYgMHhmMCkgPT0gMCkgeworICAgICAgICAgICAgICAgIGxhc3QgPSBoZXJlOworICAgICAgICAgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgICAgICAgICAgaGVyZSA9IGRpc3Rjb2RlW2xhc3QudmFsICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQklUUyhsYXN0LmJpdHMgKyBsYXN0Lm9wKSA+PiBsYXN0LmJpdHMpXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCh1bnNpZ25lZCkobGFzdC5iaXRzICsgaGVyZS5iaXRzKSA8PSBiaXRzKSBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgUFVMTEJZVEUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgRFJPUEJJVFMobGFzdC5iaXRzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIERST1BCSVRTKGhlcmUuYml0cyk7CisgICAgICAgICAgICBpZiAoaGVyZS5vcCAmIDY0KSB7CisgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBkaXN0YW5jZSBjb2RlIjsKKyAgICAgICAgICAgICAgICBtb2RlID0gQkFEOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb2Zmc2V0ID0gKHVuc2lnbmVkKWhlcmUudmFsOworCisgICAgICAgICAgICAvKiBnZXQgZGlzdGFuY2UgZXh0cmEgYml0cywgaWYgYW55ICovCisgICAgICAgICAgICBleHRyYSA9ICh1bnNpZ25lZCkoaGVyZS5vcCkgJiAxNTsKKyAgICAgICAgICAgIGlmIChleHRyYSAhPSAwKSB7CisgICAgICAgICAgICAgICAgTkVFREJJVFMoZXh0cmEpOworICAgICAgICAgICAgICAgIG9mZnNldCArPSBCSVRTKGV4dHJhKTsKKyAgICAgICAgICAgICAgICBEUk9QQklUUyhleHRyYSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAob2Zmc2V0ID4gV1NJWkUgLSAod3JhcCA/IDA6IGxlZnQpKSB7CisgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2siOworICAgICAgICAgICAgICAgIG1vZGUgPSBCQUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBUcmFjZXZ2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgICAgIGRpc3RhbmNlICVsdVxuIiwgb2Zmc2V0KSk7CisKKyAgICAgICAgICAgIC8qIGNvcHkgbWF0Y2ggZnJvbSB3aW5kb3cgdG8gb3V0cHV0ICovCisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgUk9PTSgpOworICAgICAgICAgICAgICAgIGNvcHkgPSBXU0laRSAtIG9mZnNldDsKKyAgICAgICAgICAgICAgICBpZiAoY29weSA8IGxlZnQpIHsKKyAgICAgICAgICAgICAgICAgICAgZnJvbSA9IHB1dCArIGNvcHk7CisgICAgICAgICAgICAgICAgICAgIGNvcHkgPSBsZWZ0IC0gY29weTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGZyb20gPSBwdXQgLSBvZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgIGNvcHkgPSBsZWZ0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoY29weSA+IGxlbmd0aCkgY29weSA9IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBsZW5ndGggLT0gY29weTsKKyAgICAgICAgICAgICAgICBsZWZ0IC09IGNvcHk7CisgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICAqcHV0KysgPSAqZnJvbSsrOworICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tY29weSk7CisgICAgICAgICAgICB9IHdoaWxlIChsZW5ndGggIT0gMCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIERPTkU6CisgICAgICAgICAgICAvKiBpbmZsYXRlIHN0cmVhbSB0ZXJtaW5hdGVkIHByb3Blcmx5IC0tIHdyaXRlIGxlZnRvdmVyIG91dHB1dCAqLworICAgICAgICAgICAgcmV0ID0gWl9TVFJFQU1fRU5EOworICAgICAgICAgICAgaWYgKGxlZnQgPCBXU0laRSkgeworICAgICAgICAgICAgICAgIGlmIChvdXQob3V0X2Rlc2MsIHdpbmRvdywgKHVuc2lnbmVkKShXU0laRSAtIGxlZnQpKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gWl9CVUZfRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBnb3RvIGluZl9sZWF2ZTsKKworICAgICAgICBjYXNlIEJBRDoKKyAgICAgICAgICAgIHJldCA9IFpfREFUQV9FUlJPUjsKKyAgICAgICAgICAgIGdvdG8gaW5mX2xlYXZlOworCisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgIC8qIGNhbid0IGhhcHBlbiwgYnV0IG1ha2VzIGNvbXBpbGVycyBoYXBweSAqLworICAgICAgICAgICAgcmV0ID0gWl9TVFJFQU1fRVJST1I7CisgICAgICAgICAgICBnb3RvIGluZl9sZWF2ZTsKKyAgICAgICAgfQorCisgICAgLyogUmV0dXJuIHVudXNlZCBpbnB1dCAqLworICBpbmZfbGVhdmU6CisgICAgc3RybS0+bmV4dF9pbiA9IG5leHQ7CisgICAgc3RybS0+YXZhaWxfaW4gPSBoYXZlOworICAgIHJldHVybiByZXQ7Cit9CisKK2ludCBaRVhQT1JUIGluZmxhdGVCYWNrOUVuZChzdHJtKQorel9zdHJlYW0gRkFSICpzdHJtOworeworICAgIGlmIChzdHJtID09IFpfTlVMTCB8fCBzdHJtLT5zdGF0ZSA9PSBaX05VTEwgfHwgc3RybS0+emZyZWUgPT0gKGZyZWVfZnVuYykwKQorICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisgICAgWkZSRUUoc3RybSwgc3RybS0+c3RhdGUpOworICAgIHN0cm0tPnN0YXRlID0gWl9OVUxMOworICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogZW5kXG4iKSk7CisgICAgcmV0dXJuIFpfT0s7Cit9CmRpZmYgLS1naXQgYS96bGliLTEuMi42L2NvbnRyaWIvaW5mYmFjazkvaW5mYmFjazkuaCBiL3psaWItMS4yLjYvY29udHJpYi9pbmZiYWNrOS9pbmZiYWNrOS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwNzNjMGEKLS0tIC9kZXYvbnVsbAorKysgYi96bGliLTEuMi42L2NvbnRyaWIvaW5mYmFjazkvaW5mYmFjazkuaApAQCAtMCwwICsxLDM3IEBACisvKiBpbmZiYWNrOS5oIC0tIGhlYWRlciBmb3IgdXNpbmcgaW5mbGF0ZUJhY2s5IGZ1bmN0aW9ucworICogQ29weXJpZ2h0IChDKSAyMDAzIE1hcmsgQWRsZXIKKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKKyAqLworCisvKgorICogVGhpcyBoZWFkZXIgZmlsZSBhbmQgYXNzb2NpYXRlZCBwYXRjaGVzIHByb3ZpZGUgYSBkZWNvZGVyIGZvciBQS1dhcmUncworICogdW5kb2N1bWVudGVkIGRlZmxhdGU2NCBjb21wcmVzc2lvbiBtZXRob2QgKG1ldGhvZCA5KS4gIFVzZSB3aXRoIGluZmJhY2s5LmMsCisgKiBpbmZ0cmVlOS5oLCBpbmZ0cmVlOS5jLCBhbmQgaW5mZml4OS5oLiAgVGhlc2UgcGF0Y2hlcyBhcmUgbm90IHN1cHBvcnRlZC4KKyAqIFRoaXMgc2hvdWxkIGJlIGNvbXBpbGVkIHdpdGggemxpYiwgc2luY2UgaXQgdXNlcyB6dXRpbC5oIGFuZCB6dXRpbC5vLgorICogVGhpcyBjb2RlIGhhcyBub3QgeWV0IGJlZW4gdGVzdGVkIG9uIDE2LWJpdCBhcmNoaXRlY3R1cmVzLiAgU2VlIHRoZQorICogY29tbWVudHMgaW4gemxpYi5oIGZvciBpbmZsYXRlQmFjaygpIHVzYWdlLiAgVGhlc2UgZnVuY3Rpb25zIGFyZSB1c2VkCisgKiBpZGVudGljYWxseSwgZXhjZXB0IHRoYXQgdGhlcmUgaXMgbm8gd2luZG93Qml0cyBwYXJhbWV0ZXIsIGFuZCBhIDY0SworICogd2luZG93IG11c3QgYmUgcHJvdmlkZWQuICBBbHNvIGlmIGludCdzIGFyZSAxNiBiaXRzLCB0aGVuIGEgemVybyBmb3IKKyAqIHRoZSB0aGlyZCBwYXJhbWV0ZXIgb2YgdGhlICJvdXQiIGZ1bmN0aW9uIGFjdHVhbGx5IG1lYW5zIDY1NTM2VUwuCisgKiB6bGliLmggbXVzdCBiZSBpbmNsdWRlZCBiZWZvcmUgdGhpcyBoZWFkZXIgZmlsZS4KKyAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgaW5mbGF0ZUJhY2s5IE9GKCh6X3N0cmVhbSBGQVIgKnN0cm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbl9mdW5jIGluLCB2b2lkIEZBUiAqaW5fZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dF9mdW5jIG91dCwgdm9pZCBGQVIgKm91dF9kZXNjKSk7CitaRVhURVJOIGludCBaRVhQT1JUIGluZmxhdGVCYWNrOUVuZCBPRigoel9zdHJlYW0gRkFSICpzdHJtKSk7CitaRVhURVJOIGludCBaRVhQT1JUIGluZmxhdGVCYWNrOUluaXRfIE9GKCh6X3N0cmVhbSBGQVIgKnN0cm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgRkFSICp3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJlYW1fc2l6ZSkpOworI2RlZmluZSBpbmZsYXRlQmFjazlJbml0KHN0cm0sIHdpbmRvdykgXAorICAgICAgICBpbmZsYXRlQmFjazlJbml0Xygoc3RybSksICh3aW5kb3cpLCBcCisgICAgICAgIFpMSUJfVkVSU0lPTiwgc2l6ZW9mKHpfc3RyZWFtKSkKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL3psaWItMS4yLjYvY29udHJpYi9pbmZiYWNrOS9pbmZmaXg5LmggYi96bGliLTEuMi42L2NvbnRyaWIvaW5mYmFjazkvaW5mZml4OS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlNTY3MWQKLS0tIC9kZXYvbnVsbAorKysgYi96bGliLTEuMi42L2NvbnRyaWIvaW5mYmFjazkvaW5mZml4OS5oCkBAIC0wLDAgKzEsMTA3IEBACisgICAgLyogaW5mZml4OS5oIC0tIHRhYmxlIGZvciBkZWNvZGluZyBkZWZsYXRlNjQgZml4ZWQgY29kZXMKKyAgICAgKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBtYWtlZml4ZWQ5KCkuCisgICAgICovCisKKyAgICAvKiBXQVJOSU5HOiB0aGlzIGZpbGUgc2hvdWxkICpub3QqIGJlIHVzZWQgYnkgYXBwbGljYXRpb25zLgorICAgICAgIEl0IGlzIHBhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbGlicmFyeSBhbmQgaXMKKyAgICAgICBzdWJqZWN0IHRvIGNoYW5nZS4gQXBwbGljYXRpb25zIHNob3VsZCBvbmx5IHVzZSB6bGliLmguCisgICAgICovCisKKyAgICBzdGF0aWMgY29uc3QgY29kZSBsZW5maXhbNTEyXSA9IHsKKyAgICAgICAgezk2LDcsMH0sezAsOCw4MH0sezAsOCwxNn0sezEzMiw4LDExNX0sezEzMCw3LDMxfSx7MCw4LDExMn0sCisgICAgICAgIHswLDgsNDh9LHswLDksMTkyfSx7MTI4LDcsMTB9LHswLDgsOTZ9LHswLDgsMzJ9LHswLDksMTYwfSwKKyAgICAgICAgezAsOCwwfSx7MCw4LDEyOH0sezAsOCw2NH0sezAsOSwyMjR9LHsxMjgsNyw2fSx7MCw4LDg4fSwKKyAgICAgICAgezAsOCwyNH0sezAsOSwxNDR9LHsxMzEsNyw1OX0sezAsOCwxMjB9LHswLDgsNTZ9LHswLDksMjA4fSwKKyAgICAgICAgezEyOSw3LDE3fSx7MCw4LDEwNH0sezAsOCw0MH0sezAsOSwxNzZ9LHswLDgsOH0sezAsOCwxMzZ9LAorICAgICAgICB7MCw4LDcyfSx7MCw5LDI0MH0sezEyOCw3LDR9LHswLDgsODR9LHswLDgsMjB9LHsxMzMsOCwyMjd9LAorICAgICAgICB7MTMxLDcsNDN9LHswLDgsMTE2fSx7MCw4LDUyfSx7MCw5LDIwMH0sezEyOSw3LDEzfSx7MCw4LDEwMH0sCisgICAgICAgIHswLDgsMzZ9LHswLDksMTY4fSx7MCw4LDR9LHswLDgsMTMyfSx7MCw4LDY4fSx7MCw5LDIzMn0sCisgICAgICAgIHsxMjgsNyw4fSx7MCw4LDkyfSx7MCw4LDI4fSx7MCw5LDE1Mn0sezEzMiw3LDgzfSx7MCw4LDEyNH0sCisgICAgICAgIHswLDgsNjB9LHswLDksMjE2fSx7MTMwLDcsMjN9LHswLDgsMTA4fSx7MCw4LDQ0fSx7MCw5LDE4NH0sCisgICAgICAgIHswLDgsMTJ9LHswLDgsMTQwfSx7MCw4LDc2fSx7MCw5LDI0OH0sezEyOCw3LDN9LHswLDgsODJ9LAorICAgICAgICB7MCw4LDE4fSx7MTMzLDgsMTYzfSx7MTMxLDcsMzV9LHswLDgsMTE0fSx7MCw4LDUwfSx7MCw5LDE5Nn0sCisgICAgICAgIHsxMjksNywxMX0sezAsOCw5OH0sezAsOCwzNH0sezAsOSwxNjR9LHswLDgsMn0sezAsOCwxMzB9LAorICAgICAgICB7MCw4LDY2fSx7MCw5LDIyOH0sezEyOCw3LDd9LHswLDgsOTB9LHswLDgsMjZ9LHswLDksMTQ4fSwKKyAgICAgICAgezEzMiw3LDY3fSx7MCw4LDEyMn0sezAsOCw1OH0sezAsOSwyMTJ9LHsxMzAsNywxOX0sezAsOCwxMDZ9LAorICAgICAgICB7MCw4LDQyfSx7MCw5LDE4MH0sezAsOCwxMH0sezAsOCwxMzh9LHswLDgsNzR9LHswLDksMjQ0fSwKKyAgICAgICAgezEyOCw3LDV9LHswLDgsODZ9LHswLDgsMjJ9LHs2NSw4LDB9LHsxMzEsNyw1MX0sezAsOCwxMTh9LAorICAgICAgICB7MCw4LDU0fSx7MCw5LDIwNH0sezEyOSw3LDE1fSx7MCw4LDEwMn0sezAsOCwzOH0sezAsOSwxNzJ9LAorICAgICAgICB7MCw4LDZ9LHswLDgsMTM0fSx7MCw4LDcwfSx7MCw5LDIzNn0sezEyOCw3LDl9LHswLDgsOTR9LAorICAgICAgICB7MCw4LDMwfSx7MCw5LDE1Nn0sezEzMiw3LDk5fSx7MCw4LDEyNn0sezAsOCw2Mn0sezAsOSwyMjB9LAorICAgICAgICB7MTMwLDcsMjd9LHswLDgsMTEwfSx7MCw4LDQ2fSx7MCw5LDE4OH0sezAsOCwxNH0sezAsOCwxNDJ9LAorICAgICAgICB7MCw4LDc4fSx7MCw5LDI1Mn0sezk2LDcsMH0sezAsOCw4MX0sezAsOCwxN30sezEzMyw4LDEzMX0sCisgICAgICAgIHsxMzAsNywzMX0sezAsOCwxMTN9LHswLDgsNDl9LHswLDksMTk0fSx7MTI4LDcsMTB9LHswLDgsOTd9LAorICAgICAgICB7MCw4LDMzfSx7MCw5LDE2Mn0sezAsOCwxfSx7MCw4LDEyOX0sezAsOCw2NX0sezAsOSwyMjZ9LAorICAgICAgICB7MTI4LDcsNn0sezAsOCw4OX0sezAsOCwyNX0sezAsOSwxNDZ9LHsxMzEsNyw1OX0sezAsOCwxMjF9LAorICAgICAgICB7MCw4LDU3fSx7MCw5LDIxMH0sezEyOSw3LDE3fSx7MCw4LDEwNX0sezAsOCw0MX0sezAsOSwxNzh9LAorICAgICAgICB7MCw4LDl9LHswLDgsMTM3fSx7MCw4LDczfSx7MCw5LDI0Mn0sezEyOCw3LDR9LHswLDgsODV9LAorICAgICAgICB7MCw4LDIxfSx7MTQ0LDgsM30sezEzMSw3LDQzfSx7MCw4LDExN30sezAsOCw1M30sezAsOSwyMDJ9LAorICAgICAgICB7MTI5LDcsMTN9LHswLDgsMTAxfSx7MCw4LDM3fSx7MCw5LDE3MH0sezAsOCw1fSx7MCw4LDEzM30sCisgICAgICAgIHswLDgsNjl9LHswLDksMjM0fSx7MTI4LDcsOH0sezAsOCw5M30sezAsOCwyOX0sezAsOSwxNTR9LAorICAgICAgICB7MTMyLDcsODN9LHswLDgsMTI1fSx7MCw4LDYxfSx7MCw5LDIxOH0sezEzMCw3LDIzfSx7MCw4LDEwOX0sCisgICAgICAgIHswLDgsNDV9LHswLDksMTg2fSx7MCw4LDEzfSx7MCw4LDE0MX0sezAsOCw3N30sezAsOSwyNTB9LAorICAgICAgICB7MTI4LDcsM30sezAsOCw4M30sezAsOCwxOX0sezEzMyw4LDE5NX0sezEzMSw3LDM1fSx7MCw4LDExNX0sCisgICAgICAgIHswLDgsNTF9LHswLDksMTk4fSx7MTI5LDcsMTF9LHswLDgsOTl9LHswLDgsMzV9LHswLDksMTY2fSwKKyAgICAgICAgezAsOCwzfSx7MCw4LDEzMX0sezAsOCw2N30sezAsOSwyMzB9LHsxMjgsNyw3fSx7MCw4LDkxfSwKKyAgICAgICAgezAsOCwyN30sezAsOSwxNTB9LHsxMzIsNyw2N30sezAsOCwxMjN9LHswLDgsNTl9LHswLDksMjE0fSwKKyAgICAgICAgezEzMCw3LDE5fSx7MCw4LDEwN30sezAsOCw0M30sezAsOSwxODJ9LHswLDgsMTF9LHswLDgsMTM5fSwKKyAgICAgICAgezAsOCw3NX0sezAsOSwyNDZ9LHsxMjgsNyw1fSx7MCw4LDg3fSx7MCw4LDIzfSx7NzcsOCwwfSwKKyAgICAgICAgezEzMSw3LDUxfSx7MCw4LDExOX0sezAsOCw1NX0sezAsOSwyMDZ9LHsxMjksNywxNX0sezAsOCwxMDN9LAorICAgICAgICB7MCw4LDM5fSx7MCw5LDE3NH0sezAsOCw3fSx7MCw4LDEzNX0sezAsOCw3MX0sezAsOSwyMzh9LAorICAgICAgICB7MTI4LDcsOX0sezAsOCw5NX0sezAsOCwzMX0sezAsOSwxNTh9LHsxMzIsNyw5OX0sezAsOCwxMjd9LAorICAgICAgICB7MCw4LDYzfSx7MCw5LDIyMn0sezEzMCw3LDI3fSx7MCw4LDExMX0sezAsOCw0N30sezAsOSwxOTB9LAorICAgICAgICB7MCw4LDE1fSx7MCw4LDE0M30sezAsOCw3OX0sezAsOSwyNTR9LHs5Niw3LDB9LHswLDgsODB9LAorICAgICAgICB7MCw4LDE2fSx7MTMyLDgsMTE1fSx7MTMwLDcsMzF9LHswLDgsMTEyfSx7MCw4LDQ4fSx7MCw5LDE5M30sCisgICAgICAgIHsxMjgsNywxMH0sezAsOCw5Nn0sezAsOCwzMn0sezAsOSwxNjF9LHswLDgsMH0sezAsOCwxMjh9LAorICAgICAgICB7MCw4LDY0fSx7MCw5LDIyNX0sezEyOCw3LDZ9LHswLDgsODh9LHswLDgsMjR9LHswLDksMTQ1fSwKKyAgICAgICAgezEzMSw3LDU5fSx7MCw4LDEyMH0sezAsOCw1Nn0sezAsOSwyMDl9LHsxMjksNywxN30sezAsOCwxMDR9LAorICAgICAgICB7MCw4LDQwfSx7MCw5LDE3N30sezAsOCw4fSx7MCw4LDEzNn0sezAsOCw3Mn0sezAsOSwyNDF9LAorICAgICAgICB7MTI4LDcsNH0sezAsOCw4NH0sezAsOCwyMH0sezEzMyw4LDIyN30sezEzMSw3LDQzfSx7MCw4LDExNn0sCisgICAgICAgIHswLDgsNTJ9LHswLDksMjAxfSx7MTI5LDcsMTN9LHswLDgsMTAwfSx7MCw4LDM2fSx7MCw5LDE2OX0sCisgICAgICAgIHswLDgsNH0sezAsOCwxMzJ9LHswLDgsNjh9LHswLDksMjMzfSx7MTI4LDcsOH0sezAsOCw5Mn0sCisgICAgICAgIHswLDgsMjh9LHswLDksMTUzfSx7MTMyLDcsODN9LHswLDgsMTI0fSx7MCw4LDYwfSx7MCw5LDIxN30sCisgICAgICAgIHsxMzAsNywyM30sezAsOCwxMDh9LHswLDgsNDR9LHswLDksMTg1fSx7MCw4LDEyfSx7MCw4LDE0MH0sCisgICAgICAgIHswLDgsNzZ9LHswLDksMjQ5fSx7MTI4LDcsM30sezAsOCw4Mn0sezAsOCwxOH0sezEzMyw4LDE2M30sCisgICAgICAgIHsxMzEsNywzNX0sezAsOCwxMTR9LHswLDgsNTB9LHswLDksMTk3fSx7MTI5LDcsMTF9LHswLDgsOTh9LAorICAgICAgICB7MCw4LDM0fSx7MCw5LDE2NX0sezAsOCwyfSx7MCw4LDEzMH0sezAsOCw2Nn0sezAsOSwyMjl9LAorICAgICAgICB7MTI4LDcsN30sezAsOCw5MH0sezAsOCwyNn0sezAsOSwxNDl9LHsxMzIsNyw2N30sezAsOCwxMjJ9LAorICAgICAgICB7MCw4LDU4fSx7MCw5LDIxM30sezEzMCw3LDE5fSx7MCw4LDEwNn0sezAsOCw0Mn0sezAsOSwxODF9LAorICAgICAgICB7MCw4LDEwfSx7MCw4LDEzOH0sezAsOCw3NH0sezAsOSwyNDV9LHsxMjgsNyw1fSx7MCw4LDg2fSwKKyAgICAgICAgezAsOCwyMn0sezY1LDgsMH0sezEzMSw3LDUxfSx7MCw4LDExOH0sezAsOCw1NH0sezAsOSwyMDV9LAorICAgICAgICB7MTI5LDcsMTV9LHswLDgsMTAyfSx7MCw4LDM4fSx7MCw5LDE3M30sezAsOCw2fSx7MCw4LDEzNH0sCisgICAgICAgIHswLDgsNzB9LHswLDksMjM3fSx7MTI4LDcsOX0sezAsOCw5NH0sezAsOCwzMH0sezAsOSwxNTd9LAorICAgICAgICB7MTMyLDcsOTl9LHswLDgsMTI2fSx7MCw4LDYyfSx7MCw5LDIyMX0sezEzMCw3LDI3fSx7MCw4LDExMH0sCisgICAgICAgIHswLDgsNDZ9LHswLDksMTg5fSx7MCw4LDE0fSx7MCw4LDE0Mn0sezAsOCw3OH0sezAsOSwyNTN9LAorICAgICAgICB7OTYsNywwfSx7MCw4LDgxfSx7MCw4LDE3fSx7MTMzLDgsMTMxfSx7MTMwLDcsMzF9LHswLDgsMTEzfSwKKyAgICAgICAgezAsOCw0OX0sezAsOSwxOTV9LHsxMjgsNywxMH0sezAsOCw5N30sezAsOCwzM30sezAsOSwxNjN9LAorICAgICAgICB7MCw4LDF9LHswLDgsMTI5fSx7MCw4LDY1fSx7MCw5LDIyN30sezEyOCw3LDZ9LHswLDgsODl9LAorICAgICAgICB7MCw4LDI1fSx7MCw5LDE0N30sezEzMSw3LDU5fSx7MCw4LDEyMX0sezAsOCw1N30sezAsOSwyMTF9LAorICAgICAgICB7MTI5LDcsMTd9LHswLDgsMTA1fSx7MCw4LDQxfSx7MCw5LDE3OX0sezAsOCw5fSx7MCw4LDEzN30sCisgICAgICAgIHswLDgsNzN9LHswLDksMjQzfSx7MTI4LDcsNH0sezAsOCw4NX0sezAsOCwyMX0sezE0NCw4LDN9LAorICAgICAgICB7MTMxLDcsNDN9LHswLDgsMTE3fSx7MCw4LDUzfSx7MCw5LDIwM30sezEyOSw3LDEzfSx7MCw4LDEwMX0sCisgICAgICAgIHswLDgsMzd9LHswLDksMTcxfSx7MCw4LDV9LHswLDgsMTMzfSx7MCw4LDY5fSx7MCw5LDIzNX0sCisgICAgICAgIHsxMjgsNyw4fSx7MCw4LDkzfSx7MCw4LDI5fSx7MCw5LDE1NX0sezEzMiw3LDgzfSx7MCw4LDEyNX0sCisgICAgICAgIHswLDgsNjF9LHswLDksMjE5fSx7MTMwLDcsMjN9LHswLDgsMTA5fSx7MCw4LDQ1fSx7MCw5LDE4N30sCisgICAgICAgIHswLDgsMTN9LHswLDgsMTQxfSx7MCw4LDc3fSx7MCw5LDI1MX0sezEyOCw3LDN9LHswLDgsODN9LAorICAgICAgICB7MCw4LDE5fSx7MTMzLDgsMTk1fSx7MTMxLDcsMzV9LHswLDgsMTE1fSx7MCw4LDUxfSx7MCw5LDE5OX0sCisgICAgICAgIHsxMjksNywxMX0sezAsOCw5OX0sezAsOCwzNX0sezAsOSwxNjd9LHswLDgsM30sezAsOCwxMzF9LAorICAgICAgICB7MCw4LDY3fSx7MCw5LDIzMX0sezEyOCw3LDd9LHswLDgsOTF9LHswLDgsMjd9LHswLDksMTUxfSwKKyAgICAgICAgezEzMiw3LDY3fSx7MCw4LDEyM30sezAsOCw1OX0sezAsOSwyMTV9LHsxMzAsNywxOX0sezAsOCwxMDd9LAorICAgICAgICB7MCw4LDQzfSx7MCw5LDE4M30sezAsOCwxMX0sezAsOCwxMzl9LHswLDgsNzV9LHswLDksMjQ3fSwKKyAgICAgICAgezEyOCw3LDV9LHswLDgsODd9LHswLDgsMjN9LHs3Nyw4LDB9LHsxMzEsNyw1MX0sezAsOCwxMTl9LAorICAgICAgICB7MCw4LDU1fSx7MCw5LDIwN30sezEyOSw3LDE1fSx7MCw4LDEwM30sezAsOCwzOX0sezAsOSwxNzV9LAorICAgICAgICB7MCw4LDd9LHswLDgsMTM1fSx7MCw4LDcxfSx7MCw5LDIzOX0sezEyOCw3LDl9LHswLDgsOTV9LAorICAgICAgICB7MCw4LDMxfSx7MCw5LDE1OX0sezEzMiw3LDk5fSx7MCw4LDEyN30sezAsOCw2M30sezAsOSwyMjN9LAorICAgICAgICB7MTMwLDcsMjd9LHswLDgsMTExfSx7MCw4LDQ3fSx7MCw5LDE5MX0sezAsOCwxNX0sezAsOCwxNDN9LAorICAgICAgICB7MCw4LDc5fSx7MCw5LDI1NX0KKyAgICB9OworCisgICAgc3RhdGljIGNvbnN0IGNvZGUgZGlzdGZpeFszMl0gPSB7CisgICAgICAgIHsxMjgsNSwxfSx7MTM1LDUsMjU3fSx7MTMxLDUsMTd9LHsxMzksNSw0MDk3fSx7MTI5LDUsNX0sCisgICAgICAgIHsxMzcsNSwxMDI1fSx7MTMzLDUsNjV9LHsxNDEsNSwxNjM4NX0sezEyOCw1LDN9LHsxMzYsNSw1MTN9LAorICAgICAgICB7MTMyLDUsMzN9LHsxNDAsNSw4MTkzfSx7MTMwLDUsOX0sezEzOCw1LDIwNDl9LHsxMzQsNSwxMjl9LAorICAgICAgICB7MTQyLDUsMzI3Njl9LHsxMjgsNSwyfSx7MTM1LDUsMzg1fSx7MTMxLDUsMjV9LHsxMzksNSw2MTQ1fSwKKyAgICAgICAgezEyOSw1LDd9LHsxMzcsNSwxNTM3fSx7MTMzLDUsOTd9LHsxNDEsNSwyNDU3N30sezEyOCw1LDR9LAorICAgICAgICB7MTM2LDUsNzY5fSx7MTMyLDUsNDl9LHsxNDAsNSwxMjI4OX0sezEzMCw1LDEzfSx7MTM4LDUsMzA3M30sCisgICAgICAgIHsxMzQsNSwxOTN9LHsxNDIsNSw0OTE1M30KKyAgICB9OwpkaWZmIC0tZ2l0IGEvemxpYi0xLjIuNi9jb250cmliL2luZmJhY2s5L2luZmxhdGU5LmggYi96bGliLTEuMi42L2NvbnRyaWIvaW5mYmFjazkvaW5mbGF0ZTkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTlhNzkzCi0tLSAvZGV2L251bGwKKysrIGIvemxpYi0xLjIuNi9jb250cmliL2luZmJhY2s5L2luZmxhdGU5LmgKQEAgLTAsMCArMSw0NyBAQAorLyogaW5mbGF0ZTkuaCAtLSBpbnRlcm5hbCBpbmZsYXRlIHN0YXRlIGRlZmluaXRpb24KKyAqIENvcHlyaWdodCAoQykgMTk5NS0yMDAzIE1hcmsgQWRsZXIKKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKKyAqLworCisvKiBXQVJOSU5HOiB0aGlzIGZpbGUgc2hvdWxkICpub3QqIGJlIHVzZWQgYnkgYXBwbGljYXRpb25zLiBJdCBpcworICAgcGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGNvbXByZXNzaW9uIGxpYnJhcnkgYW5kIGlzCisgICBzdWJqZWN0IHRvIGNoYW5nZS4gQXBwbGljYXRpb25zIHNob3VsZCBvbmx5IHVzZSB6bGliLmguCisgKi8KKworLyogUG9zc2libGUgaW5mbGF0ZSBtb2RlcyBiZXR3ZWVuIGluZmxhdGUoKSBjYWxscyAqLwordHlwZWRlZiBlbnVtIHsKKyAgICAgICAgVFlQRSwgICAgICAgLyogaTogd2FpdGluZyBmb3IgdHlwZSBiaXRzLCBpbmNsdWRpbmcgbGFzdC1mbGFnIGJpdCAqLworICAgICAgICBTVE9SRUQsICAgICAvKiBpOiB3YWl0aW5nIGZvciBzdG9yZWQgc2l6ZSAobGVuZ3RoIGFuZCBjb21wbGVtZW50KSAqLworICAgICAgICBUQUJMRSwgICAgICAvKiBpOiB3YWl0aW5nIGZvciBkeW5hbWljIGJsb2NrIHRhYmxlIGxlbmd0aHMgKi8KKyAgICAgICAgICAgIExFTiwgICAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGxlbmd0aC9saXQgY29kZSAqLworICAgIERPTkUsICAgICAgIC8qIGZpbmlzaGVkIGNoZWNrLCBkb25lIC0tIHJlbWFpbiBoZXJlIHVudGlsIHJlc2V0ICovCisgICAgQkFEICAgICAgICAgLyogZ290IGEgZGF0YSBlcnJvciAtLSByZW1haW4gaGVyZSB1bnRpbCByZXNldCAqLworfSBpbmZsYXRlX21vZGU7CisKKy8qCisgICAgU3RhdGUgdHJhbnNpdGlvbnMgYmV0d2VlbiBhYm92ZSBtb2RlcyAtCisKKyAgICAobW9zdCBtb2RlcyBjYW4gZ28gdG8gdGhlIEJBRCBtb2RlIC0tIG5vdCBzaG93biBmb3IgY2xhcml0eSkKKworICAgIFJlYWQgZGVmbGF0ZSBibG9ja3M6CisgICAgICAgICAgICBUWVBFIC0+IFNUT1JFRCBvciBUQUJMRSBvciBMRU4gb3IgRE9ORQorICAgICAgICAgICAgU1RPUkVEIC0+IFRZUEUKKyAgICAgICAgICAgIFRBQkxFIC0+IExFTkxFTlMgLT4gQ09ERUxFTlMgLT4gTEVOCisgICAgUmVhZCBkZWZsYXRlIGNvZGVzOgorICAgICAgICAgICAgICAgIExFTiAtPiBMRU4gb3IgVFlQRQorICovCisKKy8qIHN0YXRlIG1haW50YWluZWQgYmV0d2VlbiBpbmZsYXRlKCkgY2FsbHMuICBBcHByb3hpbWF0ZWx5IDdLIGJ5dGVzLiAqLworc3RydWN0IGluZmxhdGVfc3RhdGUgeworICAgICAgICAvKiBzbGlkaW5nIHdpbmRvdyAqLworICAgIHVuc2lnbmVkIGNoYXIgRkFSICp3aW5kb3c7ICAvKiBhbGxvY2F0ZWQgc2xpZGluZyB3aW5kb3csIGlmIG5lZWRlZCAqLworICAgICAgICAvKiBkeW5hbWljIHRhYmxlIGJ1aWxkaW5nICovCisgICAgdW5zaWduZWQgbmNvZGU7ICAgICAgICAgICAgIC8qIG51bWJlciBvZiBjb2RlIGxlbmd0aCBjb2RlIGxlbmd0aHMgKi8KKyAgICB1bnNpZ25lZCBubGVuOyAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGxlbmd0aCBjb2RlIGxlbmd0aHMgKi8KKyAgICB1bnNpZ25lZCBuZGlzdDsgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGRpc3RhbmNlIGNvZGUgbGVuZ3RocyAqLworICAgIHVuc2lnbmVkIGhhdmU7ICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgY29kZSBsZW5ndGhzIGluIGxlbnNbXSAqLworICAgIGNvZGUgRkFSICpuZXh0OyAgICAgICAgICAgICAvKiBuZXh0IGF2YWlsYWJsZSBzcGFjZSBpbiBjb2Rlc1tdICovCisgICAgdW5zaWduZWQgc2hvcnQgbGVuc1szMjBdOyAgIC8qIHRlbXBvcmFyeSBzdG9yYWdlIGZvciBjb2RlIGxlbmd0aHMgKi8KKyAgICB1bnNpZ25lZCBzaG9ydCB3b3JrWzI4OF07ICAgLyogd29yayBhcmVhIGZvciBjb2RlIHRhYmxlIGJ1aWxkaW5nICovCisgICAgY29kZSBjb2Rlc1tFTk9VR0hdOyAgICAgICAgIC8qIHNwYWNlIGZvciBjb2RlIHRhYmxlcyAqLworfTsKZGlmZiAtLWdpdCBhL3psaWItMS4yLjYvY29udHJpYi9pbmZiYWNrOS9pbmZ0cmVlOS5jIGIvemxpYi0xLjIuNi9jb250cmliL2luZmJhY2s5L2luZnRyZWU5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNlMmExZgotLS0gL2Rldi9udWxsCisrKyBiL3psaWItMS4yLjYvY29udHJpYi9pbmZiYWNrOS9pbmZ0cmVlOS5jCkBAIC0wLDAgKzEsMzI0IEBACisvKiBpbmZ0cmVlOS5jIC0tIGdlbmVyYXRlIEh1ZmZtYW4gdHJlZXMgZm9yIGVmZmljaWVudCBkZWNvZGluZworICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMTIgTWFyayBBZGxlcgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAorICovCisKKyNpbmNsdWRlICJ6dXRpbC5oIgorI2luY2x1ZGUgImluZnRyZWU5LmgiCisKKyNkZWZpbmUgTUFYQklUUyAxNQorCitjb25zdCBjaGFyIGluZmxhdGU5X2NvcHlyaWdodFtdID0KKyAgICIgaW5mbGF0ZTkgMS4yLjYgQ29weXJpZ2h0IDE5OTUtMjAxMiBNYXJrIEFkbGVyICI7CisvKgorICBJZiB5b3UgdXNlIHRoZSB6bGliIGxpYnJhcnkgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpcyB3ZWxjb21lCisgIGluIHRoZSBkb2N1bWVudGF0aW9uIG9mIHlvdXIgcHJvZHVjdC4gSWYgZm9yIHNvbWUgcmVhc29uIHlvdSBjYW5ub3QKKyAgaW5jbHVkZSBzdWNoIGFuIGFja25vd2xlZGdtZW50LCBJIHdvdWxkIGFwcHJlY2lhdGUgdGhhdCB5b3Uga2VlcCB0aGlzCisgIGNvcHlyaWdodCBzdHJpbmcgaW4gdGhlIGV4ZWN1dGFibGUgb2YgeW91ciBwcm9kdWN0LgorICovCisKKy8qCisgICBCdWlsZCBhIHNldCBvZiB0YWJsZXMgdG8gZGVjb2RlIHRoZSBwcm92aWRlZCBjYW5vbmljYWwgSHVmZm1hbiBjb2RlLgorICAgVGhlIGNvZGUgbGVuZ3RocyBhcmUgbGVuc1swLi5jb2Rlcy0xXS4gIFRoZSByZXN1bHQgc3RhcnRzIGF0ICp0YWJsZSwKKyAgIHdob3NlIGluZGljZXMgYXJlIDAuLjJeYml0cy0xLiAgd29yayBpcyBhIHdyaXRhYmxlIGFycmF5IG9mIGF0IGxlYXN0CisgICBsZW5zIHNob3J0cywgd2hpY2ggaXMgdXNlZCBhcyBhIHdvcmsgYXJlYS4gIHR5cGUgaXMgdGhlIHR5cGUgb2YgY29kZQorICAgdG8gYmUgZ2VuZXJhdGVkLCBDT0RFUywgTEVOUywgb3IgRElTVFMuICBPbiByZXR1cm4sIHplcm8gaXMgc3VjY2VzcywKKyAgIC0xIGlzIGFuIGludmFsaWQgY29kZSwgYW5kICsxIG1lYW5zIHRoYXQgRU5PVUdIIGlzbid0IGVub3VnaC4gIHRhYmxlCisgICBvbiByZXR1cm4gcG9pbnRzIHRvIHRoZSBuZXh0IGF2YWlsYWJsZSBlbnRyeSdzIGFkZHJlc3MuICBiaXRzIGlzIHRoZQorICAgcmVxdWVzdGVkIHJvb3QgdGFibGUgaW5kZXggYml0cywgYW5kIG9uIHJldHVybiBpdCBpcyB0aGUgYWN0dWFsIHJvb3QKKyAgIHRhYmxlIGluZGV4IGJpdHMuICBJdCB3aWxsIGRpZmZlciBpZiB0aGUgcmVxdWVzdCBpcyBncmVhdGVyIHRoYW4gdGhlCisgICBsb25nZXN0IGNvZGUgb3IgaWYgaXQgaXMgbGVzcyB0aGFuIHRoZSBzaG9ydGVzdCBjb2RlLgorICovCitpbnQgaW5mbGF0ZV90YWJsZTkodHlwZSwgbGVucywgY29kZXMsIHRhYmxlLCBiaXRzLCB3b3JrKQorY29kZXR5cGUgdHlwZTsKK3Vuc2lnbmVkIHNob3J0IEZBUiAqbGVuczsKK3Vuc2lnbmVkIGNvZGVzOworY29kZSBGQVIgKiBGQVIgKnRhYmxlOwordW5zaWduZWQgRkFSICpiaXRzOwordW5zaWduZWQgc2hvcnQgRkFSICp3b3JrOworeworICAgIHVuc2lnbmVkIGxlbjsgICAgICAgICAgICAgICAvKiBhIGNvZGUncyBsZW5ndGggaW4gYml0cyAqLworICAgIHVuc2lnbmVkIHN5bTsgICAgICAgICAgICAgICAvKiBpbmRleCBvZiBjb2RlIHN5bWJvbHMgKi8KKyAgICB1bnNpZ25lZCBtaW4sIG1heDsgICAgICAgICAgLyogbWluaW11bSBhbmQgbWF4aW11bSBjb2RlIGxlbmd0aHMgKi8KKyAgICB1bnNpZ25lZCByb290OyAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGluZGV4IGJpdHMgZm9yIHJvb3QgdGFibGUgKi8KKyAgICB1bnNpZ25lZCBjdXJyOyAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGluZGV4IGJpdHMgZm9yIGN1cnJlbnQgdGFibGUgKi8KKyAgICB1bnNpZ25lZCBkcm9wOyAgICAgICAgICAgICAgLyogY29kZSBiaXRzIHRvIGRyb3AgZm9yIHN1Yi10YWJsZSAqLworICAgIGludCBsZWZ0OyAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgcHJlZml4IGNvZGVzIGF2YWlsYWJsZSAqLworICAgIHVuc2lnbmVkIHVzZWQ7ICAgICAgICAgICAgICAvKiBjb2RlIGVudHJpZXMgaW4gdGFibGUgdXNlZCAqLworICAgIHVuc2lnbmVkIGh1ZmY7ICAgICAgICAgICAgICAvKiBIdWZmbWFuIGNvZGUgKi8KKyAgICB1bnNpZ25lZCBpbmNyOyAgICAgICAgICAgICAgLyogZm9yIGluY3JlbWVudGluZyBjb2RlLCBpbmRleCAqLworICAgIHVuc2lnbmVkIGZpbGw7ICAgICAgICAgICAgICAvKiBpbmRleCBmb3IgcmVwbGljYXRpbmcgZW50cmllcyAqLworICAgIHVuc2lnbmVkIGxvdzsgICAgICAgICAgICAgICAvKiBsb3cgYml0cyBmb3IgY3VycmVudCByb290IGVudHJ5ICovCisgICAgdW5zaWduZWQgbWFzazsgICAgICAgICAgICAgIC8qIG1hc2sgZm9yIGxvdyByb290IGJpdHMgKi8KKyAgICBjb2RlIHRoaXM7ICAgICAgICAgICAgICAgICAgLyogdGFibGUgZW50cnkgZm9yIGR1cGxpY2F0aW9uICovCisgICAgY29kZSBGQVIgKm5leHQ7ICAgICAgICAgICAgIC8qIG5leHQgYXZhaWxhYmxlIHNwYWNlIGluIHRhYmxlICovCisgICAgY29uc3QgdW5zaWduZWQgc2hvcnQgRkFSICpiYXNlOyAgICAgLyogYmFzZSB2YWx1ZSB0YWJsZSB0byB1c2UgKi8KKyAgICBjb25zdCB1bnNpZ25lZCBzaG9ydCBGQVIgKmV4dHJhOyAgICAvKiBleHRyYSBiaXRzIHRhYmxlIHRvIHVzZSAqLworICAgIGludCBlbmQ7ICAgICAgICAgICAgICAgICAgICAvKiB1c2UgYmFzZSBhbmQgZXh0cmEgZm9yIHN5bWJvbCA+IGVuZCAqLworICAgIHVuc2lnbmVkIHNob3J0IGNvdW50W01BWEJJVFMrMV07ICAgIC8qIG51bWJlciBvZiBjb2RlcyBvZiBlYWNoIGxlbmd0aCAqLworICAgIHVuc2lnbmVkIHNob3J0IG9mZnNbTUFYQklUUysxXTsgICAgIC8qIG9mZnNldHMgaW4gdGFibGUgZm9yIGVhY2ggbGVuZ3RoICovCisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IGxiYXNlWzMxXSA9IHsgLyogTGVuZ3RoIGNvZGVzIDI1Ny4uMjg1IGJhc2UgKi8KKyAgICAgICAgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMywgMTUsIDE3LAorICAgICAgICAxOSwgMjMsIDI3LCAzMSwgMzUsIDQzLCA1MSwgNTksIDY3LCA4MywgOTksIDExNSwKKyAgICAgICAgMTMxLCAxNjMsIDE5NSwgMjI3LCAzLCAwLCAwfTsKKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgbGV4dFszMV0gPSB7IC8qIExlbmd0aCBjb2RlcyAyNTcuLjI4NSBleHRyYSAqLworICAgICAgICAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI5LCAxMjksIDEyOSwgMTI5LAorICAgICAgICAxMzAsIDEzMCwgMTMwLCAxMzAsIDEzMSwgMTMxLCAxMzEsIDEzMSwgMTMyLCAxMzIsIDEzMiwgMTMyLAorICAgICAgICAxMzMsIDEzMywgMTMzLCAxMzMsIDE0NCwgMjAzLCA2OX07CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IGRiYXNlWzMyXSA9IHsgLyogRGlzdGFuY2UgY29kZXMgMC4uMzEgYmFzZSAqLworICAgICAgICAxLCAyLCAzLCA0LCA1LCA3LCA5LCAxMywgMTcsIDI1LCAzMywgNDksCisgICAgICAgIDY1LCA5NywgMTI5LCAxOTMsIDI1NywgMzg1LCA1MTMsIDc2OSwgMTAyNSwgMTUzNywgMjA0OSwgMzA3MywKKyAgICAgICAgNDA5NywgNjE0NSwgODE5MywgMTIyODksIDE2Mzg1LCAyNDU3NywgMzI3NjksIDQ5MTUzfTsKKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgZGV4dFszMl0gPSB7IC8qIERpc3RhbmNlIGNvZGVzIDAuLjMxIGV4dHJhICovCisgICAgICAgIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI5LCAxMjksIDEzMCwgMTMwLCAxMzEsIDEzMSwgMTMyLCAxMzIsCisgICAgICAgIDEzMywgMTMzLCAxMzQsIDEzNCwgMTM1LCAxMzUsIDEzNiwgMTM2LCAxMzcsIDEzNywgMTM4LCAxMzgsCisgICAgICAgIDEzOSwgMTM5LCAxNDAsIDE0MCwgMTQxLCAxNDEsIDE0MiwgMTQyfTsKKworICAgIC8qCisgICAgICAgUHJvY2VzcyBhIHNldCBvZiBjb2RlIGxlbmd0aHMgdG8gY3JlYXRlIGEgY2Fub25pY2FsIEh1ZmZtYW4gY29kZS4gIFRoZQorICAgICAgIGNvZGUgbGVuZ3RocyBhcmUgbGVuc1swLi5jb2Rlcy0xXS4gIEVhY2ggbGVuZ3RoIGNvcnJlc3BvbmRzIHRvIHRoZQorICAgICAgIHN5bWJvbHMgMC4uY29kZXMtMS4gIFRoZSBIdWZmbWFuIGNvZGUgaXMgZ2VuZXJhdGVkIGJ5IGZpcnN0IHNvcnRpbmcgdGhlCisgICAgICAgc3ltYm9scyBieSBsZW5ndGggZnJvbSBzaG9ydCB0byBsb25nLCBhbmQgcmV0YWluaW5nIHRoZSBzeW1ib2wgb3JkZXIKKyAgICAgICBmb3IgY29kZXMgd2l0aCBlcXVhbCBsZW5ndGhzLiAgVGhlbiB0aGUgY29kZSBzdGFydHMgd2l0aCBhbGwgemVybyBiaXRzCisgICAgICAgZm9yIHRoZSBmaXJzdCBjb2RlIG9mIHRoZSBzaG9ydGVzdCBsZW5ndGgsIGFuZCB0aGUgY29kZXMgYXJlIGludGVnZXIKKyAgICAgICBpbmNyZW1lbnRzIGZvciB0aGUgc2FtZSBsZW5ndGgsIGFuZCB6ZXJvcyBhcmUgYXBwZW5kZWQgYXMgdGhlIGxlbmd0aAorICAgICAgIGluY3JlYXNlcy4gIEZvciB0aGUgZGVmbGF0ZSBmb3JtYXQsIHRoZXNlIGJpdHMgYXJlIHN0b3JlZCBiYWNrd2FyZHMKKyAgICAgICBmcm9tIHRoZWlyIG1vcmUgbmF0dXJhbCBpbnRlZ2VyIGluY3JlbWVudCBvcmRlcmluZywgYW5kIHNvIHdoZW4gdGhlCisgICAgICAgZGVjb2RpbmcgdGFibGVzIGFyZSBidWlsdCBpbiB0aGUgbGFyZ2UgbG9vcCBiZWxvdywgdGhlIGludGVnZXIgY29kZXMKKyAgICAgICBhcmUgaW5jcmVtZW50ZWQgYmFja3dhcmRzLgorCisgICAgICAgVGhpcyByb3V0aW5lIGFzc3VtZXMsIGJ1dCBkb2VzIG5vdCBjaGVjaywgdGhhdCBhbGwgb2YgdGhlIGVudHJpZXMgaW4KKyAgICAgICBsZW5zW10gYXJlIGluIHRoZSByYW5nZSAwLi5NQVhCSVRTLiAgVGhlIGNhbGxlciBtdXN0IGFzc3VyZSB0aGlzLgorICAgICAgIDEuLk1BWEJJVFMgaXMgaW50ZXJwcmV0ZWQgYXMgdGhhdCBjb2RlIGxlbmd0aC4gIHplcm8gbWVhbnMgdGhhdCB0aGF0CisgICAgICAgc3ltYm9sIGRvZXMgbm90IG9jY3VyIGluIHRoaXMgY29kZS4KKworICAgICAgIFRoZSBjb2RlcyBhcmUgc29ydGVkIGJ5IGNvbXB1dGluZyBhIGNvdW50IG9mIGNvZGVzIGZvciBlYWNoIGxlbmd0aCwKKyAgICAgICBjcmVhdGluZyBmcm9tIHRoYXQgYSB0YWJsZSBvZiBzdGFydGluZyBpbmRpY2VzIGZvciBlYWNoIGxlbmd0aCBpbiB0aGUKKyAgICAgICBzb3J0ZWQgdGFibGUsIGFuZCB0aGVuIGVudGVyaW5nIHRoZSBzeW1ib2xzIGluIG9yZGVyIGluIHRoZSBzb3J0ZWQKKyAgICAgICB0YWJsZS4gIFRoZSBzb3J0ZWQgdGFibGUgaXMgd29ya1tdLCB3aXRoIHRoYXQgc3BhY2UgYmVpbmcgcHJvdmlkZWQgYnkKKyAgICAgICB0aGUgY2FsbGVyLgorCisgICAgICAgVGhlIGxlbmd0aCBjb3VudHMgYXJlIHVzZWQgZm9yIG90aGVyIHB1cnBvc2VzIGFzIHdlbGwsIGkuZS4gZmluZGluZworICAgICAgIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIGxlbmd0aCBjb2RlcywgZGV0ZXJtaW5pbmcgaWYgdGhlcmUgYXJlIGFueQorICAgICAgIGNvZGVzIGF0IGFsbCwgY2hlY2tpbmcgZm9yIGEgdmFsaWQgc2V0IG9mIGxlbmd0aHMsIGFuZCBsb29raW5nIGFoZWFkCisgICAgICAgYXQgbGVuZ3RoIGNvdW50cyB0byBkZXRlcm1pbmUgc3ViLXRhYmxlIHNpemVzIHdoZW4gYnVpbGRpbmcgdGhlCisgICAgICAgZGVjb2RpbmcgdGFibGVzLgorICAgICAqLworCisgICAgLyogYWNjdW11bGF0ZSBsZW5ndGhzIGZvciBjb2RlcyAoYXNzdW1lcyBsZW5zW10gYWxsIGluIDAuLk1BWEJJVFMpICovCisgICAgZm9yIChsZW4gPSAwOyBsZW4gPD0gTUFYQklUUzsgbGVuKyspCisgICAgICAgIGNvdW50W2xlbl0gPSAwOworICAgIGZvciAoc3ltID0gMDsgc3ltIDwgY29kZXM7IHN5bSsrKQorICAgICAgICBjb3VudFtsZW5zW3N5bV1dKys7CisKKyAgICAvKiBib3VuZCBjb2RlIGxlbmd0aHMsIGZvcmNlIHJvb3QgdG8gYmUgd2l0aGluIGNvZGUgbGVuZ3RocyAqLworICAgIHJvb3QgPSAqYml0czsKKyAgICBmb3IgKG1heCA9IE1BWEJJVFM7IG1heCA+PSAxOyBtYXgtLSkKKyAgICAgICAgaWYgKGNvdW50W21heF0gIT0gMCkgYnJlYWs7CisgICAgaWYgKHJvb3QgPiBtYXgpIHJvb3QgPSBtYXg7CisgICAgaWYgKG1heCA9PSAwKSByZXR1cm4gLTE7ICAgICAgICAgICAgLyogbm8gY29kZXMhICovCisgICAgZm9yIChtaW4gPSAxOyBtaW4gPD0gTUFYQklUUzsgbWluKyspCisgICAgICAgIGlmIChjb3VudFttaW5dICE9IDApIGJyZWFrOworICAgIGlmIChyb290IDwgbWluKSByb290ID0gbWluOworCisgICAgLyogY2hlY2sgZm9yIGFuIG92ZXItc3Vic2NyaWJlZCBvciBpbmNvbXBsZXRlIHNldCBvZiBsZW5ndGhzICovCisgICAgbGVmdCA9IDE7CisgICAgZm9yIChsZW4gPSAxOyBsZW4gPD0gTUFYQklUUzsgbGVuKyspIHsKKyAgICAgICAgbGVmdCA8PD0gMTsKKyAgICAgICAgbGVmdCAtPSBjb3VudFtsZW5dOworICAgICAgICBpZiAobGVmdCA8IDApIHJldHVybiAtMTsgICAgICAgIC8qIG92ZXItc3Vic2NyaWJlZCAqLworICAgIH0KKyAgICBpZiAobGVmdCA+IDAgJiYgKHR5cGUgPT0gQ09ERVMgfHwgbWF4ICE9IDEpKQorICAgICAgICByZXR1cm4gLTE7ICAgICAgICAgICAgICAgICAgICAgIC8qIGluY29tcGxldGUgc2V0ICovCisKKyAgICAvKiBnZW5lcmF0ZSBvZmZzZXRzIGludG8gc3ltYm9sIHRhYmxlIGZvciBlYWNoIGxlbmd0aCBmb3Igc29ydGluZyAqLworICAgIG9mZnNbMV0gPSAwOworICAgIGZvciAobGVuID0gMTsgbGVuIDwgTUFYQklUUzsgbGVuKyspCisgICAgICAgIG9mZnNbbGVuICsgMV0gPSBvZmZzW2xlbl0gKyBjb3VudFtsZW5dOworCisgICAgLyogc29ydCBzeW1ib2xzIGJ5IGxlbmd0aCwgYnkgc3ltYm9sIG9yZGVyIHdpdGhpbiBlYWNoIGxlbmd0aCAqLworICAgIGZvciAoc3ltID0gMDsgc3ltIDwgY29kZXM7IHN5bSsrKQorICAgICAgICBpZiAobGVuc1tzeW1dICE9IDApIHdvcmtbb2Zmc1tsZW5zW3N5bV1dKytdID0gKHVuc2lnbmVkIHNob3J0KXN5bTsKKworICAgIC8qCisgICAgICAgQ3JlYXRlIGFuZCBmaWxsIGluIGRlY29kaW5nIHRhYmxlcy4gIEluIHRoaXMgbG9vcCwgdGhlIHRhYmxlIGJlaW5nCisgICAgICAgZmlsbGVkIGlzIGF0IG5leHQgYW5kIGhhcyBjdXJyIGluZGV4IGJpdHMuICBUaGUgY29kZSBiZWluZyB1c2VkIGlzIGh1ZmYKKyAgICAgICB3aXRoIGxlbmd0aCBsZW4uICBUaGF0IGNvZGUgaXMgY29udmVydGVkIHRvIGFuIGluZGV4IGJ5IGRyb3BwaW5nIGRyb3AKKyAgICAgICBiaXRzIG9mZiBvZiB0aGUgYm90dG9tLiAgRm9yIGNvZGVzIHdoZXJlIGxlbiBpcyBsZXNzIHRoYW4gZHJvcCArIGN1cnIsCisgICAgICAgdGhvc2UgdG9wIGRyb3AgKyBjdXJyIC0gbGVuIGJpdHMgYXJlIGluY3JlbWVudGVkIHRocm91Z2ggYWxsIHZhbHVlcyB0bworICAgICAgIGZpbGwgdGhlIHRhYmxlIHdpdGggcmVwbGljYXRlZCBlbnRyaWVzLgorCisgICAgICAgcm9vdCBpcyB0aGUgbnVtYmVyIG9mIGluZGV4IGJpdHMgZm9yIHRoZSByb290IHRhYmxlLiAgV2hlbiBsZW4gZXhjZWVkcworICAgICAgIHJvb3QsIHN1Yi10YWJsZXMgYXJlIGNyZWF0ZWQgcG9pbnRlZCB0byBieSB0aGUgcm9vdCBlbnRyeSB3aXRoIGFuIGluZGV4CisgICAgICAgb2YgdGhlIGxvdyByb290IGJpdHMgb2YgaHVmZi4gIFRoaXMgaXMgc2F2ZWQgaW4gbG93IHRvIGNoZWNrIGZvciB3aGVuIGEKKyAgICAgICBuZXcgc3ViLXRhYmxlIHNob3VsZCBiZSBzdGFydGVkLiAgZHJvcCBpcyB6ZXJvIHdoZW4gdGhlIHJvb3QgdGFibGUgaXMKKyAgICAgICBiZWluZyBmaWxsZWQsIGFuZCBkcm9wIGlzIHJvb3Qgd2hlbiBzdWItdGFibGVzIGFyZSBiZWluZyBmaWxsZWQuCisKKyAgICAgICBXaGVuIGEgbmV3IHN1Yi10YWJsZSBpcyBuZWVkZWQsIGl0IGlzIG5lY2Vzc2FyeSB0byBsb29rIGFoZWFkIGluIHRoZQorICAgICAgIGNvZGUgbGVuZ3RocyB0byBkZXRlcm1pbmUgd2hhdCBzaXplIHN1Yi10YWJsZSBpcyBuZWVkZWQuICBUaGUgbGVuZ3RoCisgICAgICAgY291bnRzIGFyZSB1c2VkIGZvciB0aGlzLCBhbmQgc28gY291bnRbXSBpcyBkZWNyZW1lbnRlZCBhcyBjb2RlcyBhcmUKKyAgICAgICBlbnRlcmVkIGluIHRoZSB0YWJsZXMuCisKKyAgICAgICB1c2VkIGtlZXBzIHRyYWNrIG9mIGhvdyBtYW55IHRhYmxlIGVudHJpZXMgaGF2ZSBiZWVuIGFsbG9jYXRlZCBmcm9tIHRoZQorICAgICAgIHByb3ZpZGVkICp0YWJsZSBzcGFjZS4gIEl0IGlzIGNoZWNrZWQgZm9yIExFTlMgYW5kIERJU1QgdGFibGVzIGFnYWluc3QKKyAgICAgICB0aGUgY29uc3RhbnRzIEVOT1VHSF9MRU5TIGFuZCBFTk9VR0hfRElTVFMgdG8gZ3VhcmQgYWdhaW5zdCBjaGFuZ2VzIGluCisgICAgICAgdGhlIGluaXRpYWwgcm9vdCB0YWJsZSBzaXplIGNvbnN0YW50cy4gIFNlZSB0aGUgY29tbWVudHMgaW4gaW5mdHJlZTkuaAorICAgICAgIGZvciBtb3JlIGluZm9ybWF0aW9uLgorCisgICAgICAgc3ltIGluY3JlbWVudHMgdGhyb3VnaCBhbGwgc3ltYm9scywgYW5kIHRoZSBsb29wIHRlcm1pbmF0ZXMgd2hlbgorICAgICAgIGFsbCBjb2RlcyBvZiBsZW5ndGggbWF4LCBpLmUuIGFsbCBjb2RlcywgaGF2ZSBiZWVuIHByb2Nlc3NlZC4gIFRoaXMKKyAgICAgICByb3V0aW5lIHBlcm1pdHMgaW5jb21wbGV0ZSBjb2Rlcywgc28gYW5vdGhlciBsb29wIGFmdGVyIHRoaXMgb25lIGZpbGxzCisgICAgICAgaW4gdGhlIHJlc3Qgb2YgdGhlIGRlY29kaW5nIHRhYmxlcyB3aXRoIGludmFsaWQgY29kZSBtYXJrZXJzLgorICAgICAqLworCisgICAgLyogc2V0IHVwIGZvciBjb2RlIHR5cGUgKi8KKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIENPREVTOgorICAgICAgICBiYXNlID0gZXh0cmEgPSB3b3JrOyAgICAvKiBkdW1teSB2YWx1ZS0tbm90IHVzZWQgKi8KKyAgICAgICAgZW5kID0gMTk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTEVOUzoKKyAgICAgICAgYmFzZSA9IGxiYXNlOworICAgICAgICBiYXNlIC09IDI1NzsKKyAgICAgICAgZXh0cmEgPSBsZXh0OworICAgICAgICBleHRyYSAtPSAyNTc7CisgICAgICAgIGVuZCA9IDI1NjsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDogICAgICAgICAgICAvKiBESVNUUyAqLworICAgICAgICBiYXNlID0gZGJhc2U7CisgICAgICAgIGV4dHJhID0gZGV4dDsKKyAgICAgICAgZW5kID0gLTE7CisgICAgfQorCisgICAgLyogaW5pdGlhbGl6ZSBzdGF0ZSBmb3IgbG9vcCAqLworICAgIGh1ZmYgPSAwOyAgICAgICAgICAgICAgICAgICAvKiBzdGFydGluZyBjb2RlICovCisgICAgc3ltID0gMDsgICAgICAgICAgICAgICAgICAgIC8qIHN0YXJ0aW5nIGNvZGUgc3ltYm9sICovCisgICAgbGVuID0gbWluOyAgICAgICAgICAgICAgICAgIC8qIHN0YXJ0aW5nIGNvZGUgbGVuZ3RoICovCisgICAgbmV4dCA9ICp0YWJsZTsgICAgICAgICAgICAgIC8qIGN1cnJlbnQgdGFibGUgdG8gZmlsbCBpbiAqLworICAgIGN1cnIgPSByb290OyAgICAgICAgICAgICAgICAvKiBjdXJyZW50IHRhYmxlIGluZGV4IGJpdHMgKi8KKyAgICBkcm9wID0gMDsgICAgICAgICAgICAgICAgICAgLyogY3VycmVudCBiaXRzIHRvIGRyb3AgZnJvbSBjb2RlIGZvciBpbmRleCAqLworICAgIGxvdyA9ICh1bnNpZ25lZCkoLTEpOyAgICAgICAvKiB0cmlnZ2VyIG5ldyBzdWItdGFibGUgd2hlbiBsZW4gPiByb290ICovCisgICAgdXNlZCA9IDFVIDw8IHJvb3Q7ICAgICAgICAgIC8qIHVzZSByb290IHRhYmxlIGVudHJpZXMgKi8KKyAgICBtYXNrID0gdXNlZCAtIDE7ICAgICAgICAgICAgLyogbWFzayBmb3IgY29tcGFyaW5nIGxvdyAqLworCisgICAgLyogY2hlY2sgYXZhaWxhYmxlIHRhYmxlIHNwYWNlICovCisgICAgaWYgKCh0eXBlID09IExFTlMgJiYgdXNlZCA+PSBFTk9VR0hfTEVOUykgfHwKKyAgICAgICAgKHR5cGUgPT0gRElTVFMgJiYgdXNlZCA+PSBFTk9VR0hfRElTVFMpKQorICAgICAgICByZXR1cm4gMTsKKworICAgIC8qIHByb2Nlc3MgYWxsIGNvZGVzIGFuZCBtYWtlIHRhYmxlIGVudHJpZXMgKi8KKyAgICBmb3IgKDs7KSB7CisgICAgICAgIC8qIGNyZWF0ZSB0YWJsZSBlbnRyeSAqLworICAgICAgICB0aGlzLmJpdHMgPSAodW5zaWduZWQgY2hhcikobGVuIC0gZHJvcCk7CisgICAgICAgIGlmICgoaW50KSh3b3JrW3N5bV0pIDwgZW5kKSB7CisgICAgICAgICAgICB0aGlzLm9wID0gKHVuc2lnbmVkIGNoYXIpMDsKKyAgICAgICAgICAgIHRoaXMudmFsID0gd29ya1tzeW1dOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKChpbnQpKHdvcmtbc3ltXSkgPiBlbmQpIHsKKyAgICAgICAgICAgIHRoaXMub3AgPSAodW5zaWduZWQgY2hhcikoZXh0cmFbd29ya1tzeW1dXSk7CisgICAgICAgICAgICB0aGlzLnZhbCA9IGJhc2Vbd29ya1tzeW1dXTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHRoaXMub3AgPSAodW5zaWduZWQgY2hhcikoMzIgKyA2NCk7ICAgICAgICAgLyogZW5kIG9mIGJsb2NrICovCisgICAgICAgICAgICB0aGlzLnZhbCA9IDA7CisgICAgICAgIH0KKworICAgICAgICAvKiByZXBsaWNhdGUgZm9yIHRob3NlIGluZGljZXMgd2l0aCBsb3cgbGVuIGJpdHMgZXF1YWwgdG8gaHVmZiAqLworICAgICAgICBpbmNyID0gMVUgPDwgKGxlbiAtIGRyb3ApOworICAgICAgICBmaWxsID0gMVUgPDwgY3VycjsKKyAgICAgICAgZG8geworICAgICAgICAgICAgZmlsbCAtPSBpbmNyOworICAgICAgICAgICAgbmV4dFsoaHVmZiA+PiBkcm9wKSArIGZpbGxdID0gdGhpczsKKyAgICAgICAgfSB3aGlsZSAoZmlsbCAhPSAwKTsKKworICAgICAgICAvKiBiYWNrd2FyZHMgaW5jcmVtZW50IHRoZSBsZW4tYml0IGNvZGUgaHVmZiAqLworICAgICAgICBpbmNyID0gMVUgPDwgKGxlbiAtIDEpOworICAgICAgICB3aGlsZSAoaHVmZiAmIGluY3IpCisgICAgICAgICAgICBpbmNyID4+PSAxOworICAgICAgICBpZiAoaW5jciAhPSAwKSB7CisgICAgICAgICAgICBodWZmICY9IGluY3IgLSAxOworICAgICAgICAgICAgaHVmZiArPSBpbmNyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGh1ZmYgPSAwOworCisgICAgICAgIC8qIGdvIHRvIG5leHQgc3ltYm9sLCB1cGRhdGUgY291bnQsIGxlbiAqLworICAgICAgICBzeW0rKzsKKyAgICAgICAgaWYgKC0tKGNvdW50W2xlbl0pID09IDApIHsKKyAgICAgICAgICAgIGlmIChsZW4gPT0gbWF4KSBicmVhazsKKyAgICAgICAgICAgIGxlbiA9IGxlbnNbd29ya1tzeW1dXTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGNyZWF0ZSBuZXcgc3ViLXRhYmxlIGlmIG5lZWRlZCAqLworICAgICAgICBpZiAobGVuID4gcm9vdCAmJiAoaHVmZiAmIG1hc2spICE9IGxvdykgeworICAgICAgICAgICAgLyogaWYgZmlyc3QgdGltZSwgdHJhbnNpdGlvbiB0byBzdWItdGFibGVzICovCisgICAgICAgICAgICBpZiAoZHJvcCA9PSAwKQorICAgICAgICAgICAgICAgIGRyb3AgPSByb290OworCisgICAgICAgICAgICAvKiBpbmNyZW1lbnQgcGFzdCBsYXN0IHRhYmxlICovCisgICAgICAgICAgICBuZXh0ICs9IDFVIDw8IGN1cnI7CisKKyAgICAgICAgICAgIC8qIGRldGVybWluZSBsZW5ndGggb2YgbmV4dCB0YWJsZSAqLworICAgICAgICAgICAgY3VyciA9IGxlbiAtIGRyb3A7CisgICAgICAgICAgICBsZWZ0ID0gKGludCkoMSA8PCBjdXJyKTsKKyAgICAgICAgICAgIHdoaWxlIChjdXJyICsgZHJvcCA8IG1heCkgeworICAgICAgICAgICAgICAgIGxlZnQgLT0gY291bnRbY3VyciArIGRyb3BdOworICAgICAgICAgICAgICAgIGlmIChsZWZ0IDw9IDApIGJyZWFrOworICAgICAgICAgICAgICAgIGN1cnIrKzsKKyAgICAgICAgICAgICAgICBsZWZ0IDw8PSAxOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBjaGVjayBmb3IgZW5vdWdoIHNwYWNlICovCisgICAgICAgICAgICB1c2VkICs9IDFVIDw8IGN1cnI7CisgICAgICAgICAgICBpZiAoKHR5cGUgPT0gTEVOUyAmJiB1c2VkID49IEVOT1VHSF9MRU5TKSB8fAorICAgICAgICAgICAgICAgICh0eXBlID09IERJU1RTICYmIHVzZWQgPj0gRU5PVUdIX0RJU1RTKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKworICAgICAgICAgICAgLyogcG9pbnQgZW50cnkgaW4gcm9vdCB0YWJsZSB0byBzdWItdGFibGUgKi8KKyAgICAgICAgICAgIGxvdyA9IGh1ZmYgJiBtYXNrOworICAgICAgICAgICAgKCp0YWJsZSlbbG93XS5vcCA9ICh1bnNpZ25lZCBjaGFyKWN1cnI7CisgICAgICAgICAgICAoKnRhYmxlKVtsb3ddLmJpdHMgPSAodW5zaWduZWQgY2hhcilyb290OworICAgICAgICAgICAgKCp0YWJsZSlbbG93XS52YWwgPSAodW5zaWduZWQgc2hvcnQpKG5leHQgLSAqdGFibGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgICBGaWxsIGluIHJlc3Qgb2YgdGFibGUgZm9yIGluY29tcGxldGUgY29kZXMuICBUaGlzIGxvb3AgaXMgc2ltaWxhciB0byB0aGUKKyAgICAgICBsb29wIGFib3ZlIGluIGluY3JlbWVudGluZyBodWZmIGZvciB0YWJsZSBpbmRpY2VzLiAgSXQgaXMgYXNzdW1lZCB0aGF0CisgICAgICAgbGVuIGlzIGVxdWFsIHRvIGN1cnIgKyBkcm9wLCBzbyB0aGVyZSBpcyBubyBsb29wIG5lZWRlZCB0byBpbmNyZW1lbnQKKyAgICAgICB0aHJvdWdoIGhpZ2ggaW5kZXggYml0cy4gIFdoZW4gdGhlIGN1cnJlbnQgc3ViLXRhYmxlIGlzIGZpbGxlZCwgdGhlIGxvb3AKKyAgICAgICBkcm9wcyBiYWNrIHRvIHRoZSByb290IHRhYmxlIHRvIGZpbGwgaW4gYW55IHJlbWFpbmluZyBlbnRyaWVzIHRoZXJlLgorICAgICAqLworICAgIHRoaXMub3AgPSAodW5zaWduZWQgY2hhcik2NDsgICAgICAgICAgICAgICAgLyogaW52YWxpZCBjb2RlIG1hcmtlciAqLworICAgIHRoaXMuYml0cyA9ICh1bnNpZ25lZCBjaGFyKShsZW4gLSBkcm9wKTsKKyAgICB0aGlzLnZhbCA9ICh1bnNpZ25lZCBzaG9ydCkwOworICAgIHdoaWxlIChodWZmICE9IDApIHsKKyAgICAgICAgLyogd2hlbiBkb25lIHdpdGggc3ViLXRhYmxlLCBkcm9wIGJhY2sgdG8gcm9vdCB0YWJsZSAqLworICAgICAgICBpZiAoZHJvcCAhPSAwICYmIChodWZmICYgbWFzaykgIT0gbG93KSB7CisgICAgICAgICAgICBkcm9wID0gMDsKKyAgICAgICAgICAgIGxlbiA9IHJvb3Q7CisgICAgICAgICAgICBuZXh0ID0gKnRhYmxlOworICAgICAgICAgICAgY3VyciA9IHJvb3Q7CisgICAgICAgICAgICB0aGlzLmJpdHMgPSAodW5zaWduZWQgY2hhcilsZW47CisgICAgICAgIH0KKworICAgICAgICAvKiBwdXQgaW52YWxpZCBjb2RlIG1hcmtlciBpbiB0YWJsZSAqLworICAgICAgICBuZXh0W2h1ZmYgPj4gZHJvcF0gPSB0aGlzOworCisgICAgICAgIC8qIGJhY2t3YXJkcyBpbmNyZW1lbnQgdGhlIGxlbi1iaXQgY29kZSBodWZmICovCisgICAgICAgIGluY3IgPSAxVSA8PCAobGVuIC0gMSk7CisgICAgICAgIHdoaWxlIChodWZmICYgaW5jcikKKyAgICAgICAgICAgIGluY3IgPj49IDE7CisgICAgICAgIGlmIChpbmNyICE9IDApIHsKKyAgICAgICAgICAgIGh1ZmYgJj0gaW5jciAtIDE7CisgICAgICAgICAgICBodWZmICs9IGluY3I7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgaHVmZiA9IDA7CisgICAgfQorCisgICAgLyogc2V0IHJldHVybiBwYXJhbWV0ZXJzICovCisgICAgKnRhYmxlICs9IHVzZWQ7CisgICAgKmJpdHMgPSByb290OworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvemxpYi0xLjIuNi9jb250cmliL2luZmJhY2s5L2luZnRyZWU5LmggYi96bGliLTEuMi42L2NvbnRyaWIvaW5mYmFjazkvaW5mdHJlZTkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YWIyMWYwCi0tLSAvZGV2L251bGwKKysrIGIvemxpYi0xLjIuNi9jb250cmliL2luZmJhY2s5L2luZnRyZWU5LmgKQEAgLTAsMCArMSw2MSBAQAorLyogaW5mdHJlZTkuaCAtLSBoZWFkZXIgdG8gdXNlIGluZnRyZWU5LmMKKyAqIENvcHlyaWdodCAoQykgMTk5NS0yMDA4IE1hcmsgQWRsZXIKKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKKyAqLworCisvKiBXQVJOSU5HOiB0aGlzIGZpbGUgc2hvdWxkICpub3QqIGJlIHVzZWQgYnkgYXBwbGljYXRpb25zLiBJdCBpcworICAgcGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGNvbXByZXNzaW9uIGxpYnJhcnkgYW5kIGlzCisgICBzdWJqZWN0IHRvIGNoYW5nZS4gQXBwbGljYXRpb25zIHNob3VsZCBvbmx5IHVzZSB6bGliLmguCisgKi8KKworLyogU3RydWN0dXJlIGZvciBkZWNvZGluZyB0YWJsZXMuICBFYWNoIGVudHJ5IHByb3ZpZGVzIGVpdGhlciB0aGUKKyAgIGluZm9ybWF0aW9uIG5lZWRlZCB0byBkbyB0aGUgb3BlcmF0aW9uIHJlcXVlc3RlZCBieSB0aGUgY29kZSB0aGF0CisgICBpbmRleGVkIHRoYXQgdGFibGUgZW50cnksIG9yIGl0IHByb3ZpZGVzIGEgcG9pbnRlciB0byBhbm90aGVyCisgICB0YWJsZSB0aGF0IGluZGV4ZXMgbW9yZSBiaXRzIG9mIHRoZSBjb2RlLiAgb3AgaW5kaWNhdGVzIHdoZXRoZXIKKyAgIHRoZSBlbnRyeSBpcyBhIHBvaW50ZXIgdG8gYW5vdGhlciB0YWJsZSwgYSBsaXRlcmFsLCBhIGxlbmd0aCBvcgorICAgZGlzdGFuY2UsIGFuIGVuZC1vZi1ibG9jaywgb3IgYW4gaW52YWxpZCBjb2RlLiAgRm9yIGEgdGFibGUKKyAgIHBvaW50ZXIsIHRoZSBsb3cgZm91ciBiaXRzIG9mIG9wIGlzIHRoZSBudW1iZXIgb2YgaW5kZXggYml0cyBvZgorICAgdGhhdCB0YWJsZS4gIEZvciBhIGxlbmd0aCBvciBkaXN0YW5jZSwgdGhlIGxvdyBmb3VyIGJpdHMgb2Ygb3AKKyAgIGlzIHRoZSBudW1iZXIgb2YgZXh0cmEgYml0cyB0byBnZXQgYWZ0ZXIgdGhlIGNvZGUuICBiaXRzIGlzCisgICB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhpcyBjb2RlIG9yIHBhcnQgb2YgdGhlIGNvZGUgdG8gZHJvcCBvZmYKKyAgIG9mIHRoZSBiaXQgYnVmZmVyLiAgdmFsIGlzIHRoZSBhY3R1YWwgYnl0ZSB0byBvdXRwdXQgaW4gdGhlIGNhc2UKKyAgIG9mIGEgbGl0ZXJhbCwgdGhlIGJhc2UgbGVuZ3RoIG9yIGRpc3RhbmNlLCBvciB0aGUgb2Zmc2V0IGZyb20KKyAgIHRoZSBjdXJyZW50IHRhYmxlIHRvIHRoZSBuZXh0IHRhYmxlLiAgRWFjaCBlbnRyeSBpcyBmb3VyIGJ5dGVzLiAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVuc2lnbmVkIGNoYXIgb3A7ICAgICAgICAgICAvKiBvcGVyYXRpb24sIGV4dHJhIGJpdHMsIHRhYmxlIGJpdHMgKi8KKyAgICB1bnNpZ25lZCBjaGFyIGJpdHM7ICAgICAgICAgLyogYml0cyBpbiB0aGlzIHBhcnQgb2YgdGhlIGNvZGUgKi8KKyAgICB1bnNpZ25lZCBzaG9ydCB2YWw7ICAgICAgICAgLyogb2Zmc2V0IGluIHRhYmxlIG9yIGNvZGUgdmFsdWUgKi8KK30gY29kZTsKKworLyogb3AgdmFsdWVzIGFzIHNldCBieSBpbmZsYXRlX3RhYmxlKCk6CisgICAgMDAwMDAwMDAgLSBsaXRlcmFsCisgICAgMDAwMHR0dHQgLSB0YWJsZSBsaW5rLCB0dHR0ICE9IDAgaXMgdGhlIG51bWJlciBvZiB0YWJsZSBpbmRleCBiaXRzCisgICAgMTAwZWVlZWUgLSBsZW5ndGggb3IgZGlzdGFuY2UsIGVlZWUgaXMgdGhlIG51bWJlciBvZiBleHRyYSBiaXRzCisgICAgMDExMDAwMDAgLSBlbmQgb2YgYmxvY2sKKyAgICAwMTAwMDAwMCAtIGludmFsaWQgY29kZQorICovCisKKy8qIE1heGltdW0gc2l6ZSBvZiB0aGUgZHluYW1pYyB0YWJsZS4gIFRoZSBtYXhpbXVtIG51bWJlciBvZiBjb2RlIHN0cnVjdHVyZXMgaXMKKyAgIDE0NDYsIHdoaWNoIGlzIHRoZSBzdW0gb2YgODUyIGZvciBsaXRlcmFsL2xlbmd0aCBjb2RlcyBhbmQgNTk0IGZvciBkaXN0YW5jZQorICAgY29kZXMuICBUaGVzZSB2YWx1ZXMgd2VyZSBmb3VuZCBieSBleGhhdXN0aXZlIHNlYXJjaGVzIHVzaW5nIHRoZSBwcm9ncmFtCisgICBleGFtcGxlcy9lbm91Z2guYyBmb3VuZCBpbiB0aGUgemxpYiBkaXN0cmlidHV0aW9uLiAgVGhlIGFyZ3VtZW50cyB0byB0aGF0CisgICBwcm9ncmFtIGFyZSB0aGUgbnVtYmVyIG9mIHN5bWJvbHMsIHRoZSBpbml0aWFsIHJvb3QgdGFibGUgc2l6ZSwgYW5kIHRoZQorICAgbWF4aW11bSBiaXQgbGVuZ3RoIG9mIGEgY29kZS4gICJlbm91Z2ggMjg2IDkgMTUiIGZvciBsaXRlcmFsL2xlbmd0aCBjb2RlcworICAgcmV0dXJucyByZXR1cm5zIDg1MiwgYW5kICJlbm91Z2ggMzIgNiAxNSIgZm9yIGRpc3RhbmNlIGNvZGVzIHJldHVybnMgNTk0LgorICAgVGhlIGluaXRpYWwgcm9vdCB0YWJsZSBzaXplICg5IG9yIDYpIGlzIGZvdW5kIGluIHRoZSBmaWZ0aCBhcmd1bWVudCBvZiB0aGUKKyAgIGluZmxhdGVfdGFibGUoKSBjYWxscyBpbiBpbmZiYWNrOS5jLiAgSWYgdGhlIHJvb3QgdGFibGUgc2l6ZSBpcyBjaGFuZ2VkLAorICAgdGhlbiB0aGVzZSBtYXhpbXVtIHNpemVzIHdvdWxkIGJlIG5lZWQgdG8gYmUgcmVjYWxjdWxhdGVkIGFuZCB1cGRhdGVkLiAqLworI2RlZmluZSBFTk9VR0hfTEVOUyA4NTIKKyNkZWZpbmUgRU5PVUdIX0RJU1RTIDU5NAorI2RlZmluZSBFTk9VR0ggKEVOT1VHSF9MRU5TK0VOT1VHSF9ESVNUUykKKworLyogVHlwZSBvZiBjb2RlIHRvIGJ1aWxkIGZvciBpbmZsYXRlX3RhYmxlOSgpICovCit0eXBlZGVmIGVudW0geworICAgIENPREVTLAorICAgIExFTlMsCisgICAgRElTVFMKK30gY29kZXR5cGU7CisKK2V4dGVybiBpbnQgaW5mbGF0ZV90YWJsZTkgT0YoKGNvZGV0eXBlIHR5cGUsIHVuc2lnbmVkIHNob3J0IEZBUiAqbGVucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY29kZXMsIGNvZGUgRkFSICogRkFSICp0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRkFSICpiaXRzLCB1bnNpZ25lZCBzaG9ydCBGQVIgKndvcmspKTsKZGlmZiAtLWdpdCBhL3psaWItMS4yLjYvY29udHJpYi9pbmZsYXRlODYvaW5mZmFzODYuYyBiL3psaWItMS4yLjYvY29udHJpYi9pbmZsYXRlODYvaW5mZmFzODYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjkyZjY3Ci0tLSAvZGV2L251bGwKKysrIGIvemxpYi0xLjIuNi9jb250cmliL2luZmxhdGU4Ni9pbmZmYXM4Ni5jCkBAIC0wLDAgKzEsMTE1NyBAQAorLyogaW5mZmFzODYuYyBpcyBhIGhhbmQgdHVuZWQgYXNzZW1ibGVyIHZlcnNpb24gb2YKKyAqCisgKiBpbmZmYXN0LmMgLS0gZmFzdCBkZWNvZGluZworICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDMgTWFyayBBZGxlcgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyBDaHJpcyBBbmRlcnNvbiA8Y2hyaXN0b3BAY2hhcm0ubmV0PgorICogUGxlYXNlIHVzZSB0aGUgY29weXJpZ2h0IGNvbmRpdGlvbnMgYWJvdmUuCisgKgorICogRGVjLTI5LTIwMDMgLS0gSSBhZGRlZCBBTUQ2NCBpbmZsYXRlIGFzbSBzdXBwb3J0LiAgVGhpcyB2ZXJzaW9uIGlzIGFsc28KKyAqIHNsaWdodGx5IHF1aWNrZXIgb24geDg2IHN5c3RlbXMgYmVjYXVzZSwgaW5zdGVhZCBvZiB1c2luZyByZXAgbW92c2IgdG8gY29weQorICogZGF0YSwgaXQgdXNlcyByZXAgbW92c3csIHdoaWNoIG1vdmVzIGRhdGEgaW4gMi1ieXRlIGNodW5rcyBpbnN0ZWFkIG9mIHNpbmdsZQorICogYnl0ZXMuICBJJ3ZlIHRlc3RlZCB0aGUgQU1ENjQgY29kZSBvbiBhIEZlZG9yYSBDb3JlIDEgKyB0aGUgeDg2XzY0IHVwZGF0ZXMKKyAqIGZyb20gaHR0cDovL2ZlZG9yYS5saW51eC5kdWtlLmVkdS9mYzFfeDg2XzY0CisgKiB3aGljaCBpcyBydW5uaW5nIG9uIGFuIEF0aGxvbiA2NCAzMDAwKyAvIEdpZ2FieXRlIEdBLUs4VlQ4MDBNIHN5c3RlbSB3aXRoCisgKiAxR0IgcmFtLiAgVGhlIDY0LWJpdCB2ZXJzaW9uIGlzIGFib3V0IDQlIGZhc3RlciB0aGFuIHRoZSAzMi1iaXQgdmVyc2lvbiwKKyAqIHdoZW4gZGVjb21wcmVzc2luZyBtb3ppbGxhLXNvdXJjZS0xLjMudGFyLmd6LgorICoKKyAqIE1hci0xMy0yMDAzIC0tIE1vc3Qgb2YgdGhpcyBpcyBkZXJpdmVkIGZyb20gaW5mZmFzdC5TIHdoaWNoIGlzIGRlcml2ZWQgZnJvbQorICogdGhlIGdjYyAtUyBvdXRwdXQgb2YgemxpYi0xLjIuMC9pbmZmYXN0LmMuICBabGliLTEuMi4wIGlzIGluIGJldGEgcmVsZWFzZSBhdAorICogdGhlIG1vbWVudC4gIEkgaGF2ZSBzdWNjZXNzZnVsbHkgY29tcGlsZWQgYW5kIHRlc3RlZCB0aGlzIGNvZGUgd2l0aCBnY2MyLjk2LAorICogZ2NjMy4yLCBpY2M1LjAsIG1zdmM2LjAuICBJdCBpcyB2ZXJ5IGNsb3NlIHRvIHRoZSBzcGVlZCBvZiBpbmZmYXN0LlMKKyAqIGNvbXBpbGVkIHdpdGggZ2NjIC1ETk9fTU1YLCBidXQgaW5mZmFzdC5TIGlzIHN0aWxsIGZhc3RlciBvbiB0aGUgUDMgd2l0aCBNTVgKKyAqIGVuYWJsZWQuICBJIHdpbGwgYXR0ZW1wdCB0byBtZXJnZSB0aGUgTU1YIGNvZGUgaW50byB0aGlzIHZlcnNpb24uICBOZXdlcgorICogdmVyc2lvbnMgb2YgdGhpcyBhbmQgaW5mZmFzdC5TIGNhbiBiZSBmb3VuZCBhdAorICogaHR0cDovL3d3dy5lZXRiZWV0ZWUuY29tL3psaWIvIGFuZCBodHRwOi8vd3d3LmNoYXJtLm5ldC9+Y2hyaXN0b3AvemxpYi8KKyAqLworCisjaW5jbHVkZSAienV0aWwuaCIKKyNpbmNsdWRlICJpbmZ0cmVlcy5oIgorI2luY2x1ZGUgImluZmxhdGUuaCIKKyNpbmNsdWRlICJpbmZmYXN0LmgiCisKKy8qIE1hcmsgQWRsZXIncyBjb21tZW50cyBmcm9tIGluZmZhc3QuYzogKi8KKworLyoKKyAgIERlY29kZSBsaXRlcmFsLCBsZW5ndGgsIGFuZCBkaXN0YW5jZSBjb2RlcyBhbmQgd3JpdGUgb3V0IHRoZSByZXN1bHRpbmcKKyAgIGxpdGVyYWwgYW5kIG1hdGNoIGJ5dGVzIHVudGlsIGVpdGhlciBub3QgZW5vdWdoIGlucHV0IG9yIG91dHB1dCBpcworICAgYXZhaWxhYmxlLCBhbiBlbmQtb2YtYmxvY2sgaXMgZW5jb3VudGVyZWQsIG9yIGEgZGF0YSBlcnJvciBpcyBlbmNvdW50ZXJlZC4KKyAgIFdoZW4gbGFyZ2UgZW5vdWdoIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVycyBhcmUgc3VwcGxpZWQgdG8gaW5mbGF0ZSgpLCBmb3IKKyAgIGV4YW1wbGUsIGEgMTZLIGlucHV0IGJ1ZmZlciBhbmQgYSA2NEsgb3V0cHV0IGJ1ZmZlciwgbW9yZSB0aGFuIDk1JSBvZiB0aGUKKyAgIGluZmxhdGUgZXhlY3V0aW9uIHRpbWUgaXMgc3BlbnQgaW4gdGhpcyByb3V0aW5lLgorCisgICBFbnRyeSBhc3N1bXB0aW9uczoKKworICAgICAgICBzdGF0ZS0+bW9kZSA9PSBMRU4KKyAgICAgICAgc3RybS0+YXZhaWxfaW4gPj0gNgorICAgICAgICBzdHJtLT5hdmFpbF9vdXQgPj0gMjU4CisgICAgICAgIHN0YXJ0ID49IHN0cm0tPmF2YWlsX291dAorICAgICAgICBzdGF0ZS0+Yml0cyA8IDgKKworICAgT24gcmV0dXJuLCBzdGF0ZS0+bW9kZSBpcyBvbmUgb2Y6CisKKyAgICAgICAgTEVOIC0tIHJhbiBvdXQgb2YgZW5vdWdoIG91dHB1dCBzcGFjZSBvciBlbm91Z2ggYXZhaWxhYmxlIGlucHV0CisgICAgICAgIFRZUEUgLS0gcmVhY2hlZCBlbmQgb2YgYmxvY2sgY29kZSwgaW5mbGF0ZSgpIHRvIGludGVycHJldCBuZXh0IGJsb2NrCisgICAgICAgIEJBRCAtLSBlcnJvciBpbiBibG9jayBkYXRhCisKKyAgIE5vdGVzOgorCisgICAgLSBUaGUgbWF4aW11bSBpbnB1dCBiaXRzIHVzZWQgYnkgYSBsZW5ndGgvZGlzdGFuY2UgcGFpciBpcyAxNSBiaXRzIGZvciB0aGUKKyAgICAgIGxlbmd0aCBjb2RlLCA1IGJpdHMgZm9yIHRoZSBsZW5ndGggZXh0cmEsIDE1IGJpdHMgZm9yIHRoZSBkaXN0YW5jZSBjb2RlLAorICAgICAgYW5kIDEzIGJpdHMgZm9yIHRoZSBkaXN0YW5jZSBleHRyYS4gIFRoaXMgdG90YWxzIDQ4IGJpdHMsIG9yIHNpeCBieXRlcy4KKyAgICAgIFRoZXJlZm9yZSBpZiBzdHJtLT5hdmFpbF9pbiA+PSA2LCB0aGVuIHRoZXJlIGlzIGVub3VnaCBpbnB1dCB0byBhdm9pZAorICAgICAgY2hlY2tpbmcgZm9yIGF2YWlsYWJsZSBpbnB1dCB3aGlsZSBkZWNvZGluZy4KKworICAgIC0gVGhlIG1heGltdW0gYnl0ZXMgdGhhdCBhIHNpbmdsZSBsZW5ndGgvZGlzdGFuY2UgcGFpciBjYW4gb3V0cHV0IGlzIDI1OAorICAgICAgYnl0ZXMsIHdoaWNoIGlzIHRoZSBtYXhpbXVtIGxlbmd0aCB0aGF0IGNhbiBiZSBjb2RlZC4gIGluZmxhdGVfZmFzdCgpCisgICAgICByZXF1aXJlcyBzdHJtLT5hdmFpbF9vdXQgPj0gMjU4IGZvciBlYWNoIGxvb3AgdG8gYXZvaWQgY2hlY2tpbmcgZm9yCisgICAgICBvdXRwdXQgc3BhY2UuCisgKi8KK3ZvaWQgaW5mbGF0ZV9mYXN0KHN0cm0sIHN0YXJ0KQorel9zdHJlYW1wIHN0cm07Cit1bnNpZ25lZCBzdGFydDsgICAgICAgICAvKiBpbmZsYXRlKCkncyBzdGFydGluZyB2YWx1ZSBmb3Igc3RybS0+YXZhaWxfb3V0ICovCit7CisgICAgc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICpzdGF0ZTsKKyAgICBzdHJ1Y3QgaW5mZmFzdF9hciB7CisvKiA2NCAgIDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg4NiAgeDg2XzY0ICovCisvKiBhciBvZmZzZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciAqLworLyogIDAgICAgMCAqLyB2b2lkICplc3A7ICAgICAgICAgICAgICAgIC8qIGVzcCBzYXZlICovCisvKiAgOCAgICA0ICovIHZvaWQgKmVicDsgICAgICAgICAgICAgICAgLyogZWJwIHNhdmUgKi8KKy8qIDE2ICAgIDggKi8gdW5zaWduZWQgY2hhciBGQVIgKmluOyAgICAvKiBlc2kgcnNpICBsb2NhbCBzdHJtLT5uZXh0X2luICovCisvKiAyNCAgIDEyICovIHVuc2lnbmVkIGNoYXIgRkFSICpsYXN0OyAgLyogICAgIHI5ICAgd2hpbGUgaW4gPCBsYXN0ICovCisvKiAzMiAgIDE2ICovIHVuc2lnbmVkIGNoYXIgRkFSICpvdXQ7ICAgLyogZWRpIHJkaSAgbG9jYWwgc3RybS0+bmV4dF9vdXQgKi8KKy8qIDQwICAgMjAgKi8gdW5zaWduZWQgY2hhciBGQVIgKmJlZzsgICAvKiAgICAgICAgICBpbmZsYXRlKCkncyBpbml0IG5leHRfb3V0ICovCisvKiA0OCAgIDI0ICovIHVuc2lnbmVkIGNoYXIgRkFSICplbmQ7ICAgLyogICAgIHIxMCAgd2hpbGUgb3V0IDwgZW5kICovCisvKiA1NiAgIDI4ICovIHVuc2lnbmVkIGNoYXIgRkFSICp3aW5kb3c7LyogICAgICAgICAgc2l6ZSBvZiB3aW5kb3csIHdzaXplIT0wICovCisvKiA2NCAgIDMyICovIGNvZGUgY29uc3QgRkFSICpsY29kZTsgICAgLyogZWJwIHJicCAgbG9jYWwgc3RybS0+bGVuY29kZSAqLworLyogNzIgICAzNiAqLyBjb2RlIGNvbnN0IEZBUiAqZGNvZGU7ICAgIC8qICAgICByMTEgIGxvY2FsIHN0cm0tPmRpc3Rjb2RlICovCisvKiA4MCAgIDQwICovIHVuc2lnbmVkIGxvbmcgaG9sZDsgICAgICAgLyogZWR4IHJkeCAgbG9jYWwgc3RybS0+aG9sZCAqLworLyogODggICA0NCAqLyB1bnNpZ25lZCBiaXRzOyAgICAgICAgICAgIC8qIGVieCByYnggIGxvY2FsIHN0cm0tPmJpdHMgKi8KKy8qIDkyICAgNDggKi8gdW5zaWduZWQgd3NpemU7ICAgICAgICAgICAvKiAgICAgICAgICB3aW5kb3cgc2l6ZSAqLworLyogOTYgICA1MiAqLyB1bnNpZ25lZCB3cml0ZTsgICAgICAgICAgIC8qICAgICAgICAgIHdpbmRvdyB3cml0ZSBpbmRleCAqLworLyoxMDAgICA1NiAqLyB1bnNpZ25lZCBsbWFzazsgICAgICAgICAgIC8qICAgICByMTIgIG1hc2sgZm9yIGxjb2RlICovCisvKjEwNCAgIDYwICovIHVuc2lnbmVkIGRtYXNrOyAgICAgICAgICAgLyogICAgIHIxMyAgbWFzayBmb3IgZGNvZGUgKi8KKy8qMTA4ICAgNjQgKi8gdW5zaWduZWQgbGVuOyAgICAgICAgICAgICAvKiAgICAgcjE0ICBtYXRjaCBsZW5ndGggKi8KKy8qMTEyICAgNjggKi8gdW5zaWduZWQgZGlzdDsgICAgICAgICAgICAvKiAgICAgcjE1ICBtYXRjaCBkaXN0YW5jZSAqLworLyoxMTYgICA3MiAqLyB1bnNpZ25lZCBzdGF0dXM7ICAgICAgICAgIC8qICAgICAgICAgIHNldCB3aGVuIHN0YXRlIGNobmcqLworICAgIH0gYXI7CisKKyNpZiBkZWZpbmVkKCBfX0dOVUNfXyApICYmIGRlZmluZWQoIF9fYW1kNjRfXyApICYmICEgZGVmaW5lZCggX19pMzg2ICkKKyNkZWZpbmUgUEFEX0FWQUlMX0lOIDYKKyNkZWZpbmUgUEFEX0FWQUlMX09VVCAyNTgKKyNlbHNlCisjZGVmaW5lIFBBRF9BVkFJTF9JTiA1CisjZGVmaW5lIFBBRF9BVkFJTF9PVVQgMjU3CisjZW5kaWYKKworICAgIC8qIGNvcHkgc3RhdGUgdG8gbG9jYWwgdmFyaWFibGVzICovCisgICAgc3RhdGUgPSAoc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICopc3RybS0+c3RhdGU7CisgICAgYXIuaW4gPSBzdHJtLT5uZXh0X2luOworICAgIGFyLmxhc3QgPSBhci5pbiArIChzdHJtLT5hdmFpbF9pbiAtIFBBRF9BVkFJTF9JTik7CisgICAgYXIub3V0ID0gc3RybS0+bmV4dF9vdXQ7CisgICAgYXIuYmVnID0gYXIub3V0IC0gKHN0YXJ0IC0gc3RybS0+YXZhaWxfb3V0KTsKKyAgICBhci5lbmQgPSBhci5vdXQgKyAoc3RybS0+YXZhaWxfb3V0IC0gUEFEX0FWQUlMX09VVCk7CisgICAgYXIud3NpemUgPSBzdGF0ZS0+d3NpemU7CisgICAgYXIud3JpdGUgPSBzdGF0ZS0+d25leHQ7CisgICAgYXIud2luZG93ID0gc3RhdGUtPndpbmRvdzsKKyAgICBhci5ob2xkID0gc3RhdGUtPmhvbGQ7CisgICAgYXIuYml0cyA9IHN0YXRlLT5iaXRzOworICAgIGFyLmxjb2RlID0gc3RhdGUtPmxlbmNvZGU7CisgICAgYXIuZGNvZGUgPSBzdGF0ZS0+ZGlzdGNvZGU7CisgICAgYXIubG1hc2sgPSAoMVUgPDwgc3RhdGUtPmxlbmJpdHMpIC0gMTsKKyAgICBhci5kbWFzayA9ICgxVSA8PCBzdGF0ZS0+ZGlzdGJpdHMpIC0gMTsKKworICAgIC8qIGRlY29kZSBsaXRlcmFscyBhbmQgbGVuZ3RoL2Rpc3RhbmNlcyB1bnRpbCBlbmQtb2YtYmxvY2sgb3Igbm90IGVub3VnaAorICAgICAgIGlucHV0IGRhdGEgb3Igb3V0cHV0IHNwYWNlICovCisKKyAgICAvKiBhbGlnbiBpbiBvbiAxLzIgaG9sZCBzaXplIGJvdW5kYXJ5ICovCisgICAgd2hpbGUgKCgodW5zaWduZWQgbG9uZykodm9pZCAqKWFyLmluICYgKHNpemVvZihhci5ob2xkKSAvIDIgLSAxKSkgIT0gMCkgeworICAgICAgICBhci5ob2xkICs9ICh1bnNpZ25lZCBsb25nKSphci5pbisrIDw8IGFyLmJpdHM7CisgICAgICAgIGFyLmJpdHMgKz0gODsKKyAgICB9CisKKyNpZiBkZWZpbmVkKCBfX0dOVUNfXyApICYmIGRlZmluZWQoIF9fYW1kNjRfXyApICYmICEgZGVmaW5lZCggX19pMzg2ICkKKyAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisiICAgICAgICBsZWFxICAgICUwLCAlJXJheFxuIgorIiAgICAgICAgbW92cSAgICAlJXJicCwgOCglJXJheClcbiIgICAgICAgLyogc2F2ZSByZWdzIHJicCBhbmQgcnNwICovCisiICAgICAgICBtb3ZxICAgICUlcnNwLCAoJSVyYXgpXG4iCisiICAgICAgICBtb3ZxICAgICUlcmF4LCAlJXJzcFxuIiAgICAgICAgICAvKiBtYWtlIHJzcCBwb2ludCB0byAmYXIgKi8KKyIgICAgICAgIG1vdnEgICAgMTYoJSVyc3ApLCAlJXJzaVxuIiAgICAgIC8qIHJzaSAgPSBpbiAqLworIiAgICAgICAgbW92cSAgICAzMiglJXJzcCksICUlcmRpXG4iICAgICAgLyogcmRpICA9IG91dCAqLworIiAgICAgICAgbW92cSAgICAyNCglJXJzcCksICUlcjlcbiIgICAgICAgLyogcjkgICA9IGxhc3QgKi8KKyIgICAgICAgIG1vdnEgICAgNDgoJSVyc3ApLCAlJXIxMFxuIiAgICAgIC8qIHIxMCAgPSBlbmQgKi8KKyIgICAgICAgIG1vdnEgICAgNjQoJSVyc3ApLCAlJXJicFxuIiAgICAgIC8qIHJicCAgPSBsY29kZSAqLworIiAgICAgICAgbW92cSAgICA3MiglJXJzcCksICUlcjExXG4iICAgICAgLyogcjExICA9IGRjb2RlICovCisiICAgICAgICBtb3ZxICAgIDgwKCUlcnNwKSwgJSVyZHhcbiIgICAgICAvKiByZHggID0gaG9sZCAqLworIiAgICAgICAgbW92bCAgICA4OCglJXJzcCksICUlZWJ4XG4iICAgICAgLyogZWJ4ICA9IGJpdHMgKi8KKyIgICAgICAgIG1vdmwgICAgMTAwKCUlcnNwKSwgJSVyMTJkXG4iICAgIC8qIHIxMmQgPSBsbWFzayAqLworIiAgICAgICAgbW92bCAgICAxMDQoJSVyc3ApLCAlJXIxM2RcbiIgICAgLyogcjEzZCA9IGRtYXNrICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByMTRkID0gbGVuICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByMTVkID0gZGlzdCAqLworIiAgICAgICAgY2xkXG4iCisiICAgICAgICBjbXBxICAgICUlcmRpLCAlJXIxMFxuIgorIiAgICAgICAgamUgICAgICAuTF9vbmVfdGltZVxuIiAgICAgICAgICAgLyogaWYgb25seSBvbmUgZGVjb2RlIGxlZnQgKi8KKyIgICAgICAgIGNtcHEgICAgJSVyc2ksICUlcjlcbiIKKyIgICAgICAgIGplICAgICAgLkxfb25lX3RpbWVcbiIKKyIgICAgICAgIGptcCAgICAgLkxfZG9fbG9vcFxuIgorCisiLkxfb25lX3RpbWU6XG4iCisiICAgICAgICBtb3ZxICAgICUlcjEyLCAlJXI4XG4iICAgICAgICAgICAvKiByOCA9IGxtYXNrICovCisiICAgICAgICBjbXBiICAgICQzMiwgJSVibFxuIgorIiAgICAgICAgamEgICAgICAuTF9nZXRfbGVuZ3RoX2NvZGVfb25lX3RpbWVcbiIKKworIiAgICAgICAgbG9kc2xcbiIgICAgICAgICAgICAgICAgICAgICAgICAgLyogZWF4ID0gKih1aW50ICopaW4rKyAqLworIiAgICAgICAgbW92YiAgICAlJWJsLCAlJWNsXG4iICAgICAgICAgICAgLyogY2wgPSBiaXRzLCBuZWVkcyBpdCBmb3Igc2hpZnRpbmcgKi8KKyIgICAgICAgIGFkZGIgICAgJDMyLCAlJWJsXG4iICAgICAgICAgICAgIC8qIGJpdHMgKz0gMzIgKi8KKyIgICAgICAgIHNobHEgICAgJSVjbCwgJSVyYXhcbiIKKyIgICAgICAgIG9ycSAgICAgJSVyYXgsICUlcmR4XG4iICAgICAgICAgIC8qIGhvbGQgfD0gKigodWludCAqKWluKSsrIDw8IGJpdHMgKi8KKyIgICAgICAgIGptcCAgICAgLkxfZ2V0X2xlbmd0aF9jb2RlX29uZV90aW1lXG4iCisKKyIuYWxpZ24gMzIsMHg5MFxuIgorIi5MX3doaWxlX3Rlc3Q6XG4iCisiICAgICAgICBjbXBxICAgICUlcmRpLCAlJXIxMFxuIgorIiAgICAgICAgamJlICAgICAuTF9icmVha19sb29wXG4iCisiICAgICAgICBjbXBxICAgICUlcnNpLCAlJXI5XG4iCisiICAgICAgICBqYmUgICAgIC5MX2JyZWFrX2xvb3BcbiIKKworIi5MX2RvX2xvb3A6XG4iCisiICAgICAgICBtb3ZxICAgICUlcjEyLCAlJXI4XG4iICAgICAgICAgICAvKiByOCA9IGxtYXNrICovCisiICAgICAgICBjbXBiICAgICQzMiwgJSVibFxuIgorIiAgICAgICAgamEgICAgICAuTF9nZXRfbGVuZ3RoX2NvZGVcbiIgICAgLyogaWYgKDMyIDwgYml0cykgKi8KKworIiAgICAgICAgbG9kc2xcbiIgICAgICAgICAgICAgICAgICAgICAgICAgLyogZWF4ID0gKih1aW50ICopaW4rKyAqLworIiAgICAgICAgbW92YiAgICAlJWJsLCAlJWNsXG4iICAgICAgICAgICAgLyogY2wgPSBiaXRzLCBuZWVkcyBpdCBmb3Igc2hpZnRpbmcgKi8KKyIgICAgICAgIGFkZGIgICAgJDMyLCAlJWJsXG4iICAgICAgICAgICAgIC8qIGJpdHMgKz0gMzIgKi8KKyIgICAgICAgIHNobHEgICAgJSVjbCwgJSVyYXhcbiIKKyIgICAgICAgIG9ycSAgICAgJSVyYXgsICUlcmR4XG4iICAgICAgICAgIC8qIGhvbGQgfD0gKigodWludCAqKWluKSsrIDw8IGJpdHMgKi8KKworIi5MX2dldF9sZW5ndGhfY29kZTpcbiIKKyIgICAgICAgIGFuZHEgICAgJSVyZHgsICUlcjhcbiIgICAgICAgICAgICAvKiByOCAmPSBob2xkICovCisiICAgICAgICBtb3ZsICAgICglJXJicCwlJXI4LDQpLCAlJWVheFxuIiAgLyogZWF4ID0gbGNvZGVbaG9sZCAmIGxtYXNrXSAqLworCisiICAgICAgICBtb3ZiICAgICUlYWgsICUlY2xcbiIgICAgICAgICAgICAvKiBjbCA9IHRoaXMuYml0cyAqLworIiAgICAgICAgc3ViYiAgICAlJWFoLCAlJWJsXG4iICAgICAgICAgICAgLyogYml0cyAtPSB0aGlzLmJpdHMgKi8KKyIgICAgICAgIHNocnEgICAgJSVjbCwgJSVyZHhcbiIgICAgICAgICAgIC8qIGhvbGQgPj49IHRoaXMuYml0cyAqLworCisiICAgICAgICB0ZXN0YiAgICUlYWwsICUlYWxcbiIKKyIgICAgICAgIGpueiAgICAgLkxfdGVzdF9mb3JfbGVuZ3RoX2Jhc2VcbiIgLyogaWYgKG9wICE9IDApIDQ1LjclICovCisKKyIgICAgICAgIG1vdnEgICAgJSVyMTIsICUlcjhcbiIgICAgICAgICAgICAvKiByOCA9IGxtYXNrICovCisiICAgICAgICBzaHJsICAgICQxNiwgJSVlYXhcbiIgICAgICAgICAgICAvKiBvdXRwdXQgdGhpcy52YWwgY2hhciAqLworIiAgICAgICAgc3Rvc2JcbiIKKworIi5MX2dldF9sZW5ndGhfY29kZV9vbmVfdGltZTpcbiIKKyIgICAgICAgIGFuZHEgICAgJSVyZHgsICUlcjhcbiIgICAgICAgICAgICAvKiByOCAmPSBob2xkICovCisiICAgICAgICBtb3ZsICAgICglJXJicCwlJXI4LDQpLCAlJWVheFxuIiAvKiBlYXggPSBsY29kZVtob2xkICYgbG1hc2tdICovCisKKyIuTF9kb2xlbjpcbiIKKyIgICAgICAgIG1vdmIgICAgJSVhaCwgJSVjbFxuIiAgICAgICAgICAgIC8qIGNsID0gdGhpcy5iaXRzICovCisiICAgICAgICBzdWJiICAgICUlYWgsICUlYmxcbiIgICAgICAgICAgICAvKiBiaXRzIC09IHRoaXMuYml0cyAqLworIiAgICAgICAgc2hycSAgICAlJWNsLCAlJXJkeFxuIiAgICAgICAgICAgLyogaG9sZCA+Pj0gdGhpcy5iaXRzICovCisKKyIgICAgICAgIHRlc3RiICAgJSVhbCwgJSVhbFxuIgorIiAgICAgICAgam56ICAgICAuTF90ZXN0X2Zvcl9sZW5ndGhfYmFzZVxuIiAvKiBpZiAob3AgIT0gMCkgNDUuNyUgKi8KKworIiAgICAgICAgc2hybCAgICAkMTYsICUlZWF4XG4iICAgICAgICAgICAgLyogb3V0cHV0IHRoaXMudmFsIGNoYXIgKi8KKyIgICAgICAgIHN0b3NiXG4iCisiICAgICAgICBqbXAgICAgIC5MX3doaWxlX3Rlc3RcbiIKKworIi5hbGlnbiAzMiwweDkwXG4iCisiLkxfdGVzdF9mb3JfbGVuZ3RoX2Jhc2U6XG4iCisiICAgICAgICBtb3ZsICAgICUlZWF4LCAlJXIxNGRcbiIgICAgICAgICAvKiBsZW4gPSB0aGlzICovCisiICAgICAgICBzaHJsICAgICQxNiwgJSVyMTRkXG4iICAgICAgICAgICAvKiBsZW4gPSB0aGlzLnZhbCAqLworIiAgICAgICAgbW92YiAgICAlJWFsLCAlJWNsXG4iCisKKyIgICAgICAgIHRlc3RiICAgJDE2LCAlJWFsXG4iCisiICAgICAgICBqeiAgICAgIC5MX3Rlc3RfZm9yX3NlY29uZF9sZXZlbF9sZW5ndGhcbiIgLyogaWYgKChvcCAmIDE2KSA9PSAwKSA4JSAqLworIiAgICAgICAgYW5kYiAgICAkMTUsICUlY2xcbiIgICAgICAgICAgICAgLyogb3AgJj0gMTUgKi8KKyIgICAgICAgIGp6ICAgICAgLkxfZGVjb2RlX2Rpc3RhbmNlXG4iICAgIC8qIGlmICghb3ApICovCisKKyIuTF9hZGRfYml0c190b19sZW46XG4iCisiICAgICAgICBzdWJiICAgICUlY2wsICUlYmxcbiIKKyIgICAgICAgIHhvcmwgICAgJSVlYXgsICUlZWF4XG4iCisiICAgICAgICBpbmNsICAgICUlZWF4XG4iCisiICAgICAgICBzaGxsICAgICUlY2wsICUlZWF4XG4iCisiICAgICAgICBkZWNsICAgICUlZWF4XG4iCisiICAgICAgICBhbmRsICAgICUlZWR4LCAlJWVheFxuIiAgICAgICAgICAvKiBlYXggJj0gaG9sZCAqLworIiAgICAgICAgc2hycSAgICAlJWNsLCAlJXJkeFxuIgorIiAgICAgICAgYWRkbCAgICAlJWVheCwgJSVyMTRkXG4iICAgICAgICAgLyogbGVuICs9IGhvbGQgJiBtYXNrW29wXSAqLworCisiLkxfZGVjb2RlX2Rpc3RhbmNlOlxuIgorIiAgICAgICAgbW92cSAgICAlJXIxMywgJSVyOFxuIiAgICAgICAgICAgLyogcjggPSBkbWFzayAqLworIiAgICAgICAgY21wYiAgICAkMzIsICUlYmxcbiIKKyIgICAgICAgIGphICAgICAgLkxfZ2V0X2Rpc3RhbmNlX2NvZGVcbiIgIC8qIGlmICgzMiA8IGJpdHMpICovCisKKyIgICAgICAgIGxvZHNsXG4iICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVheCA9ICoodWludCAqKWluKysgKi8KKyIgICAgICAgIG1vdmIgICAgJSVibCwgJSVjbFxuIiAgICAgICAgICAgIC8qIGNsID0gYml0cywgbmVlZHMgaXQgZm9yIHNoaWZ0aW5nICovCisiICAgICAgICBhZGRiICAgICQzMiwgJSVibFxuIiAgICAgICAgICAgICAvKiBiaXRzICs9IDMyICovCisiICAgICAgICBzaGxxICAgICUlY2wsICUlcmF4XG4iCisiICAgICAgICBvcnEgICAgICUlcmF4LCAlJXJkeFxuIiAgICAgICAgICAvKiBob2xkIHw9ICooKHVpbnQgKilpbikrKyA8PCBiaXRzICovCisKKyIuTF9nZXRfZGlzdGFuY2VfY29kZTpcbiIKKyIgICAgICAgIGFuZHEgICAgJSVyZHgsICUlcjhcbiIgICAgICAgICAgIC8qIHI4ICY9IGhvbGQgKi8KKyIgICAgICAgIG1vdmwgICAgKCUlcjExLCUlcjgsNCksICUlZWF4XG4iIC8qIGVheCA9IGRjb2RlW2hvbGQgJiBkbWFza10gKi8KKworIi5MX2RvZGlzdDpcbiIKKyIgICAgICAgIG1vdmwgICAgJSVlYXgsICUlcjE1ZFxuIiAgICAgICAgIC8qIGRpc3QgPSB0aGlzICovCisiICAgICAgICBzaHJsICAgICQxNiwgJSVyMTVkXG4iICAgICAgICAgICAvKiBkaXN0ID0gdGhpcy52YWwgKi8KKyIgICAgICAgIG1vdmIgICAgJSVhaCwgJSVjbFxuIgorIiAgICAgICAgc3ViYiAgICAlJWFoLCAlJWJsXG4iICAgICAgICAgICAgLyogYml0cyAtPSB0aGlzLmJpdHMgKi8KKyIgICAgICAgIHNocnEgICAgJSVjbCwgJSVyZHhcbiIgICAgICAgICAgIC8qIGhvbGQgPj49IHRoaXMuYml0cyAqLworIiAgICAgICAgbW92YiAgICAlJWFsLCAlJWNsXG4iICAgICAgICAgICAgLyogY2wgPSB0aGlzLm9wICovCisKKyIgICAgICAgIHRlc3RiICAgJDE2LCAlJWFsXG4iICAgICAgICAgICAgIC8qIGlmICgob3AgJiAxNikgPT0gMCkgKi8KKyIgICAgICAgIGp6ICAgICAgLkxfdGVzdF9mb3Jfc2Vjb25kX2xldmVsX2Rpc3RcbiIKKyIgICAgICAgIGFuZGIgICAgJDE1LCAlJWNsXG4iICAgICAgICAgICAgIC8qIG9wICY9IDE1ICovCisiICAgICAgICBqeiAgICAgIC5MX2NoZWNrX2Rpc3Rfb25lXG4iCisKKyIuTF9hZGRfYml0c190b19kaXN0OlxuIgorIiAgICAgICAgc3ViYiAgICAlJWNsLCAlJWJsXG4iCisiICAgICAgICB4b3JsICAgICUlZWF4LCAlJWVheFxuIgorIiAgICAgICAgaW5jbCAgICAlJWVheFxuIgorIiAgICAgICAgc2hsbCAgICAlJWNsLCAlJWVheFxuIgorIiAgICAgICAgZGVjbCAgICAlJWVheFxuIiAgICAgICAgICAgICAgICAgLyogKDEgPDwgb3ApIC0gMSAqLworIiAgICAgICAgYW5kbCAgICAlJWVkeCwgJSVlYXhcbiIgICAgICAgICAgLyogZWF4ICY9IGhvbGQgKi8KKyIgICAgICAgIHNocnEgICAgJSVjbCwgJSVyZHhcbiIKKyIgICAgICAgIGFkZGwgICAgJSVlYXgsICUlcjE1ZFxuIiAgICAgICAgIC8qIGRpc3QgKz0gaG9sZCAmICgoMSA8PCBvcCkgLSAxKSAqLworCisiLkxfY2hlY2tfd2luZG93OlxuIgorIiAgICAgICAgbW92cSAgICAlJXJzaSwgJSVyOFxuIiAgICAgICAgICAgLyogc2F2ZSBpbiBzbyBmcm9tIGNhbiB1c2UgaXQncyByZWcgKi8KKyIgICAgICAgIG1vdnEgICAgJSVyZGksICUlcmF4XG4iCisiICAgICAgICBzdWJxICAgIDQwKCUlcnNwKSwgJSVyYXhcbiIgICAgICAvKiBuYnl0ZXMgPSBvdXQgLSBiZWcgKi8KKworIiAgICAgICAgY21wbCAgICAlJXIxNWQsICUlZWF4XG4iCisiICAgICAgICBqYiAgICAgIC5MX2NsaXBfd2luZG93XG4iICAgICAgICAvKiBpZiAoZGlzdCA+IG5ieXRlcykgNC4yJSAqLworCisiICAgICAgICBtb3ZsICAgICUlcjE0ZCwgJSVlY3hcbiIgICAgICAgICAvKiBlY3ggPSBsZW4gKi8KKyIgICAgICAgIG1vdnEgICAgJSVyZGksICUlcnNpXG4iCisiICAgICAgICBzdWJxICAgICUlcjE1LCAlJXJzaVxuIiAgICAgICAgICAvKiBmcm9tID0gb3V0IC0gZGlzdCAqLworCisiICAgICAgICBzYXJsICAgICUlZWN4XG4iCisiICAgICAgICBqbmMgICAgIC5MX2NvcHlfdHdvXG4iICAgICAgICAgICAvKiBpZiBsZW4gJSAyID09IDAgKi8KKworIiAgICAgICAgcmVwICAgICBtb3Zzd1xuIgorIiAgICAgICAgbW92YiAgICAoJSVyc2kpLCAlJWFsXG4iCisiICAgICAgICBtb3ZiICAgICUlYWwsICglJXJkaSlcbiIKKyIgICAgICAgIGluY3EgICAgJSVyZGlcbiIKKworIiAgICAgICAgbW92cSAgICAlJXI4LCAlJXJzaVxuIiAgICAgICAgICAgLyogbW92ZSBpbiBiYWNrIHRvICVyc2ksIHRvc3MgZnJvbSAqLworIiAgICAgICAgam1wICAgICAuTF93aGlsZV90ZXN0XG4iCisKKyIuTF9jb3B5X3R3bzpcbiIKKyIgICAgICAgIHJlcCAgICAgbW92c3dcbiIKKyIgICAgICAgIG1vdnEgICAgJSVyOCwgJSVyc2lcbiIgICAgICAgICAgIC8qIG1vdmUgaW4gYmFjayB0byAlcnNpLCB0b3NzIGZyb20gKi8KKyIgICAgICAgIGptcCAgICAgLkxfd2hpbGVfdGVzdFxuIgorCisiLmFsaWduIDMyLDB4OTBcbiIKKyIuTF9jaGVja19kaXN0X29uZTpcbiIKKyIgICAgICAgIGNtcGwgICAgJDEsICUlcjE1ZFxuIiAgICAgICAgICAgIC8qIGlmIGRpc3QgMSwgaXMgYSBtZW1zZXQgKi8KKyIgICAgICAgIGpuZSAgICAgLkxfY2hlY2tfd2luZG93XG4iCisiICAgICAgICBjbXBxICAgICUlcmRpLCA0MCglJXJzcClcbiIgICAgICAvKiBpZiBvdXQgPT0gYmVnLCBvdXRzaWRlIHdpbmRvdyAqLworIiAgICAgICAgamUgICAgICAuTF9jaGVja193aW5kb3dcbiIKKworIiAgICAgICAgbW92bCAgICAlJXIxNGQsICUlZWN4XG4iICAgICAgICAgLyogZWN4ID0gbGVuICovCisiICAgICAgICBtb3ZiICAgIC0xKCUlcmRpKSwgJSVhbFxuIgorIiAgICAgICAgbW92YiAgICAlJWFsLCAlJWFoXG4iCisKKyIgICAgICAgIHNhcmwgICAgJSVlY3hcbiIKKyIgICAgICAgIGpuYyAgICAgLkxfc2V0X3R3b1xuIgorIiAgICAgICAgbW92YiAgICAlJWFsLCAoJSVyZGkpXG4iCisiICAgICAgICBpbmNxICAgICUlcmRpXG4iCisKKyIuTF9zZXRfdHdvOlxuIgorIiAgICAgICAgcmVwICAgICBzdG9zd1xuIgorIiAgICAgICAgam1wICAgICAuTF93aGlsZV90ZXN0XG4iCisKKyIuYWxpZ24gMzIsMHg5MFxuIgorIi5MX3Rlc3RfZm9yX3NlY29uZF9sZXZlbF9sZW5ndGg6XG4iCisiICAgICAgICB0ZXN0YiAgICQ2NCwgJSVhbFxuIgorIiAgICAgICAgam56ICAgICAuTF90ZXN0X2Zvcl9lbmRfb2ZfYmxvY2tcbiIgLyogaWYgKChvcCAmIDY0KSAhPSAwKSAqLworCisiICAgICAgICB4b3JsICAgICUlZWF4LCAlJWVheFxuIgorIiAgICAgICAgaW5jbCAgICAlJWVheFxuIgorIiAgICAgICAgc2hsbCAgICAlJWNsLCAlJWVheFxuIgorIiAgICAgICAgZGVjbCAgICAlJWVheFxuIgorIiAgICAgICAgYW5kbCAgICAlJWVkeCwgJSVlYXhcbiIgICAgICAgICAvKiBlYXggJj0gaG9sZCAqLworIiAgICAgICAgYWRkbCAgICAlJXIxNGQsICUlZWF4XG4iICAgICAgICAvKiBlYXggKz0gbGVuICovCisiICAgICAgICBtb3ZsICAgICglJXJicCwlJXJheCw0KSwgJSVlYXhcbiIgLyogZWF4ID0gbGNvZGVbdmFsKyhob2xkJm1hc2tbb3BdKV0qLworIiAgICAgICAgam1wICAgICAuTF9kb2xlblxuIgorCisiLmFsaWduIDMyLDB4OTBcbiIKKyIuTF90ZXN0X2Zvcl9zZWNvbmRfbGV2ZWxfZGlzdDpcbiIKKyIgICAgICAgIHRlc3RiICAgJDY0LCAlJWFsXG4iCisiICAgICAgICBqbnogICAgIC5MX2ludmFsaWRfZGlzdGFuY2VfY29kZVxuIiAvKiBpZiAoKG9wICYgNjQpICE9IDApICovCisKKyIgICAgICAgIHhvcmwgICAgJSVlYXgsICUlZWF4XG4iCisiICAgICAgICBpbmNsICAgICUlZWF4XG4iCisiICAgICAgICBzaGxsICAgICUlY2wsICUlZWF4XG4iCisiICAgICAgICBkZWNsICAgICUlZWF4XG4iCisiICAgICAgICBhbmRsICAgICUlZWR4LCAlJWVheFxuIiAgICAgICAgIC8qIGVheCAmPSBob2xkICovCisiICAgICAgICBhZGRsICAgICUlcjE1ZCwgJSVlYXhcbiIgICAgICAgIC8qIGVheCArPSBkaXN0ICovCisiICAgICAgICBtb3ZsICAgICglJXIxMSwlJXJheCw0KSwgJSVlYXhcbiIgLyogZWF4ID0gZGNvZGVbdmFsKyhob2xkJm1hc2tbb3BdKV0qLworIiAgICAgICAgam1wICAgICAuTF9kb2Rpc3RcbiIKKworIi5hbGlnbiAzMiwweDkwXG4iCisiLkxfY2xpcF93aW5kb3c6XG4iCisiICAgICAgICBtb3ZsICAgICUlZWF4LCAlJWVjeFxuIiAgICAgICAgIC8qIGVjeCA9IG5ieXRlcyAqLworIiAgICAgICAgbW92bCAgICA5MiglJXJzcCksICUlZWF4XG4iICAgICAvKiBlYXggPSB3c2l6ZSwgcHJlcGFyZSBmb3IgZGlzdCBjbXAgKi8KKyIgICAgICAgIG5lZ2wgICAgJSVlY3hcbiIgICAgICAgICAgICAgICAgLyogbmJ5dGVzID0gLW5ieXRlcyAqLworCisiICAgICAgICBjbXBsICAgICUlcjE1ZCwgJSVlYXhcbiIKKyIgICAgICAgIGpiICAgICAgLkxfaW52YWxpZF9kaXN0YW5jZV90b29fZmFyXG4iIC8qIGlmIChkaXN0ID4gd3NpemUpICovCisKKyIgICAgICAgIGFkZGwgICAgJSVyMTVkLCAlJWVjeFxuIiAgICAgICAgIC8qIG5ieXRlcyA9IGRpc3QgLSBuYnl0ZXMgKi8KKyIgICAgICAgIGNtcGwgICAgJDAsIDk2KCUlcnNwKVxuIgorIiAgICAgICAgam5lICAgICAuTF93cmFwX2Fyb3VuZF93aW5kb3dcbiIgLyogaWYgKHdyaXRlICE9IDApICovCisKKyIgICAgICAgIG1vdnEgICAgNTYoJSVyc3ApLCAlJXJzaVxuIiAgICAgLyogZnJvbSAgPSB3aW5kb3cgKi8KKyIgICAgICAgIHN1YmwgICAgJSVlY3gsICUlZWF4XG4iICAgICAgICAgLyogZWF4ICAtPSBuYnl0ZXMgKi8KKyIgICAgICAgIGFkZHEgICAgJSVyYXgsICUlcnNpXG4iICAgICAgICAgLyogZnJvbSArPSB3c2l6ZSAtIG5ieXRlcyAqLworCisiICAgICAgICBtb3ZsICAgICUlcjE0ZCwgJSVlYXhcbiIgICAgICAgIC8qIGVheCA9IGxlbiAqLworIiAgICAgICAgY21wbCAgICAlJWVjeCwgJSVyMTRkXG4iCisiICAgICAgICBqYmUgICAgIC5MX2RvX2NvcHlcbiIgICAgICAgICAgIC8qIGlmIChuYnl0ZXMgPj0gbGVuKSAqLworCisiICAgICAgICBzdWJsICAgICUlZWN4LCAlJWVheFxuIiAgICAgICAgIC8qIGVheCAtPSBuYnl0ZXMgKi8KKyIgICAgICAgIHJlcCAgICAgbW92c2JcbiIKKyIgICAgICAgIG1vdnEgICAgJSVyZGksICUlcnNpXG4iCisiICAgICAgICBzdWJxICAgICUlcjE1LCAlJXJzaVxuIiAgICAgICAgIC8qIGZyb20gPSAmb3V0WyAtZGlzdCBdICovCisiICAgICAgICBqbXAgICAgIC5MX2RvX2NvcHlcbiIKKworIi5hbGlnbiAzMiwweDkwXG4iCisiLkxfd3JhcF9hcm91bmRfd2luZG93OlxuIgorIiAgICAgICAgbW92bCAgICA5NiglJXJzcCksICUlZWF4XG4iICAgICAvKiBlYXggPSB3cml0ZSAqLworIiAgICAgICAgY21wbCAgICAlJWVheCwgJSVlY3hcbiIKKyIgICAgICAgIGpiZSAgICAgLkxfY29udGlndW91c19pbl93aW5kb3dcbiIgLyogaWYgKHdyaXRlID49IG5ieXRlcykgKi8KKworIiAgICAgICAgbW92bCAgICA5MiglJXJzcCksICUlZXNpXG4iICAgICAvKiBmcm9tICA9IHdzaXplICovCisiICAgICAgICBhZGRxICAgIDU2KCUlcnNwKSwgJSVyc2lcbiIgICAgIC8qIGZyb20gKz0gd2luZG93ICovCisiICAgICAgICBhZGRxICAgICUlcmF4LCAlJXJzaVxuIiAgICAgICAgIC8qIGZyb20gKz0gd3JpdGUgKi8KKyIgICAgICAgIHN1YnEgICAgJSVyY3gsICUlcnNpXG4iICAgICAgICAgLyogZnJvbSAtPSBuYnl0ZXMgKi8KKyIgICAgICAgIHN1YmwgICAgJSVlYXgsICUlZWN4XG4iICAgICAgICAgLyogbmJ5dGVzIC09IHdyaXRlICovCisKKyIgICAgICAgIG1vdmwgICAgJSVyMTRkLCAlJWVheFxuIiAgICAgICAgLyogZWF4ID0gbGVuICovCisiICAgICAgICBjbXBsICAgICUlZWN4LCAlJWVheFxuIgorIiAgICAgICAgamJlICAgICAuTF9kb19jb3B5XG4iICAgICAgICAgICAvKiBpZiAobmJ5dGVzID49IGxlbikgKi8KKworIiAgICAgICAgc3VibCAgICAlJWVjeCwgJSVlYXhcbiIgICAgICAgICAvKiBsZW4gLT0gbmJ5dGVzICovCisiICAgICAgICByZXAgICAgIG1vdnNiXG4iCisiICAgICAgICBtb3ZxICAgIDU2KCUlcnNwKSwgJSVyc2lcbiIgICAgIC8qIGZyb20gPSB3aW5kb3cgKi8KKyIgICAgICAgIG1vdmwgICAgOTYoJSVyc3ApLCAlJWVjeFxuIiAgICAgLyogbmJ5dGVzID0gd3JpdGUgKi8KKyIgICAgICAgIGNtcGwgICAgJSVlY3gsICUlZWF4XG4iCisiICAgICAgICBqYmUgICAgIC5MX2RvX2NvcHlcbiIgICAgICAgICAgIC8qIGlmIChuYnl0ZXMgPj0gbGVuKSAqLworCisiICAgICAgICBzdWJsICAgICUlZWN4LCAlJWVheFxuIiAgICAgICAgIC8qIGxlbiAtPSBuYnl0ZXMgKi8KKyIgICAgICAgIHJlcCAgICAgbW92c2JcbiIKKyIgICAgICAgIG1vdnEgICAgJSVyZGksICUlcnNpXG4iCisiICAgICAgICBzdWJxICAgICUlcjE1LCAlJXJzaVxuIiAgICAgICAgIC8qIGZyb20gPSBvdXQgLSBkaXN0ICovCisiICAgICAgICBqbXAgICAgIC5MX2RvX2NvcHlcbiIKKworIi5hbGlnbiAzMiwweDkwXG4iCisiLkxfY29udGlndW91c19pbl93aW5kb3c6XG4iCisiICAgICAgICBtb3ZxICAgIDU2KCUlcnNwKSwgJSVyc2lcbiIgICAgIC8qIHJzaSA9IHdpbmRvdyAqLworIiAgICAgICAgYWRkcSAgICAlJXJheCwgJSVyc2lcbiIKKyIgICAgICAgIHN1YnEgICAgJSVyY3gsICUlcnNpXG4iICAgICAgICAgLyogZnJvbSArPSB3cml0ZSAtIG5ieXRlcyAqLworCisiICAgICAgICBtb3ZsICAgICUlcjE0ZCwgJSVlYXhcbiIgICAgICAgIC8qIGVheCA9IGxlbiAqLworIiAgICAgICAgY21wbCAgICAlJWVjeCwgJSVlYXhcbiIKKyIgICAgICAgIGpiZSAgICAgLkxfZG9fY29weVxuIiAgICAgICAgICAgLyogaWYgKG5ieXRlcyA+PSBsZW4pICovCisKKyIgICAgICAgIHN1YmwgICAgJSVlY3gsICUlZWF4XG4iICAgICAgICAgLyogbGVuIC09IG5ieXRlcyAqLworIiAgICAgICAgcmVwICAgICBtb3ZzYlxuIgorIiAgICAgICAgbW92cSAgICAlJXJkaSwgJSVyc2lcbiIKKyIgICAgICAgIHN1YnEgICAgJSVyMTUsICUlcnNpXG4iICAgICAgICAgLyogZnJvbSA9IG91dCAtIGRpc3QgKi8KKyIgICAgICAgIGptcCAgICAgLkxfZG9fY29weVxuIiAgICAgICAgICAgLyogaWYgKG5ieXRlcyA+PSBsZW4pICovCisKKyIuYWxpZ24gMzIsMHg5MFxuIgorIi5MX2RvX2NvcHk6XG4iCisiICAgICAgICBtb3ZsICAgICUlZWF4LCAlJWVjeFxuIiAgICAgICAgIC8qIGVjeCA9IGxlbiAqLworIiAgICAgICAgcmVwICAgICBtb3ZzYlxuIgorCisiICAgICAgICBtb3ZxICAgICUlcjgsICUlcnNpXG4iICAgICAgICAgIC8qIG1vdmUgaW4gYmFjayB0byAlZXNpLCB0b3NzIGZyb20gKi8KKyIgICAgICAgIGptcCAgICAgLkxfd2hpbGVfdGVzdFxuIgorCisiLkxfdGVzdF9mb3JfZW5kX29mX2Jsb2NrOlxuIgorIiAgICAgICAgdGVzdGIgICAkMzIsICUlYWxcbiIKKyIgICAgICAgIGp6ICAgICAgLkxfaW52YWxpZF9saXRlcmFsX2xlbmd0aF9jb2RlXG4iCisiICAgICAgICBtb3ZsICAgICQxLCAxMTYoJSVyc3ApXG4iCisiICAgICAgICBqbXAgICAgIC5MX2JyZWFrX2xvb3Bfd2l0aF9zdGF0dXNcbiIKKworIi5MX2ludmFsaWRfbGl0ZXJhbF9sZW5ndGhfY29kZTpcbiIKKyIgICAgICAgIG1vdmwgICAgJDIsIDExNiglJXJzcClcbiIKKyIgICAgICAgIGptcCAgICAgLkxfYnJlYWtfbG9vcF93aXRoX3N0YXR1c1xuIgorCisiLkxfaW52YWxpZF9kaXN0YW5jZV9jb2RlOlxuIgorIiAgICAgICAgbW92bCAgICAkMywgMTE2KCUlcnNwKVxuIgorIiAgICAgICAgam1wICAgICAuTF9icmVha19sb29wX3dpdGhfc3RhdHVzXG4iCisKKyIuTF9pbnZhbGlkX2Rpc3RhbmNlX3Rvb19mYXI6XG4iCisiICAgICAgICBtb3ZsICAgICQ0LCAxMTYoJSVyc3ApXG4iCisiICAgICAgICBqbXAgICAgIC5MX2JyZWFrX2xvb3Bfd2l0aF9zdGF0dXNcbiIKKworIi5MX2JyZWFrX2xvb3A6XG4iCisiICAgICAgICBtb3ZsICAgICQwLCAxMTYoJSVyc3ApXG4iCisKKyIuTF9icmVha19sb29wX3dpdGhfc3RhdHVzOlxuIgorLyogcHV0IGluLCBvdXQsIGJpdHMsIGFuZCBob2xkIGJhY2sgaW50byBhciBhbmQgcG9wIGVzcCAqLworIiAgICAgICAgbW92cSAgICAlJXJzaSwgMTYoJSVyc3ApXG4iICAgICAvKiBpbiAqLworIiAgICAgICAgbW92cSAgICAlJXJkaSwgMzIoJSVyc3ApXG4iICAgICAvKiBvdXQgKi8KKyIgICAgICAgIG1vdmwgICAgJSVlYngsIDg4KCUlcnNwKVxuIiAgICAgLyogYml0cyAqLworIiAgICAgICAgbW92cSAgICAlJXJkeCwgODAoJSVyc3ApXG4iICAgICAvKiBob2xkICovCisiICAgICAgICBtb3ZxICAgICglJXJzcCksICUlcmF4XG4iICAgICAgIC8qIHJlc3RvcmUgcmJwIGFuZCByc3AgKi8KKyIgICAgICAgIG1vdnEgICAgOCglJXJzcCksICUlcmJwXG4iCisiICAgICAgICBtb3ZxICAgICUlcmF4LCAlJXJzcFxuIgorICAgICAgICAgIDoKKyAgICAgICAgICA6ICJtIiAoYXIpCisgICAgICAgICAgOiAibWVtb3J5IiwgIiVyYXgiLCAiJXJieCIsICIlcmN4IiwgIiVyZHgiLCAiJXJzaSIsICIlcmRpIiwKKyAgICAgICAgICAgICIlcjgiLCAiJXI5IiwgIiVyMTAiLCAiJXIxMSIsICIlcjEyIiwgIiVyMTMiLCAiJXIxNCIsICIlcjE1IgorICAgICk7CisjZWxpZiAoIGRlZmluZWQoIF9fR05VQ19fICkgfHwgZGVmaW5lZCggX19JQ0MgKSApICYmIGRlZmluZWQoIF9faTM4NiApCisgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAorIiAgICAgICAgbGVhbCAgICAlMCwgJSVlYXhcbiIKKyIgICAgICAgIG1vdmwgICAgJSVlc3AsICglJWVheClcbiIgICAgICAgIC8qIHNhdmUgZXNwLCBlYnAgKi8KKyIgICAgICAgIG1vdmwgICAgJSVlYnAsIDQoJSVlYXgpXG4iCisiICAgICAgICBtb3ZsICAgICUlZWF4LCAlJWVzcFxuIgorIiAgICAgICAgbW92bCAgICA4KCUlZXNwKSwgJSVlc2lcbiIgICAgICAgLyogZXNpID0gaW4gKi8KKyIgICAgICAgIG1vdmwgICAgMTYoJSVlc3ApLCAlJWVkaVxuIiAgICAgIC8qIGVkaSA9IG91dCAqLworIiAgICAgICAgbW92bCAgICA0MCglJWVzcCksICUlZWR4XG4iICAgICAgLyogZWR4ID0gaG9sZCAqLworIiAgICAgICAgbW92bCAgICA0NCglJWVzcCksICUlZWJ4XG4iICAgICAgLyogZWJ4ID0gYml0cyAqLworIiAgICAgICAgbW92bCAgICAzMiglJWVzcCksICUlZWJwXG4iICAgICAgLyogZWJwID0gbGNvZGUgKi8KKworIiAgICAgICAgY2xkXG4iCisiICAgICAgICBqbXAgICAgIC5MX2RvX2xvb3BcbiIKKworIi5hbGlnbiAzMiwweDkwXG4iCisiLkxfd2hpbGVfdGVzdDpcbiIKKyIgICAgICAgIGNtcGwgICAgJSVlZGksIDI0KCUlZXNwKVxuIiAgICAgIC8qIG91dCA8IGVuZCAqLworIiAgICAgICAgamJlICAgICAuTF9icmVha19sb29wXG4iCisiICAgICAgICBjbXBsICAgICUlZXNpLCAxMiglJWVzcClcbiIgICAgICAvKiBpbiA8IGxhc3QgKi8KKyIgICAgICAgIGpiZSAgICAgLkxfYnJlYWtfbG9vcFxuIgorCisiLkxfZG9fbG9vcDpcbiIKKyIgICAgICAgIGNtcGIgICAgJDE1LCAlJWJsXG4iCisiICAgICAgICBqYSAgICAgIC5MX2dldF9sZW5ndGhfY29kZVxuIiAgICAvKiBpZiAoMTUgPCBiaXRzKSAqLworCisiICAgICAgICB4b3JsICAgICUlZWF4LCAlJWVheFxuIgorIiAgICAgICAgbG9kc3dcbiIgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWwgPSAqKHVzaG9ydCAqKWluKysgKi8KKyIgICAgICAgIG1vdmIgICAgJSVibCwgJSVjbFxuIiAgICAgICAgICAgIC8qIGNsID0gYml0cywgbmVlZHMgaXQgZm9yIHNoaWZ0aW5nICovCisiICAgICAgICBhZGRiICAgICQxNiwgJSVibFxuIiAgICAgICAgICAgICAvKiBiaXRzICs9IDE2ICovCisiICAgICAgICBzaGxsICAgICUlY2wsICUlZWF4XG4iCisiICAgICAgICBvcmwgICAgICUlZWF4LCAlJWVkeFxuIiAgICAgICAgLyogaG9sZCB8PSAqKCh1c2hvcnQgKilpbikrKyA8PCBiaXRzICovCisKKyIuTF9nZXRfbGVuZ3RoX2NvZGU6XG4iCisiICAgICAgICBtb3ZsICAgIDU2KCUlZXNwKSwgJSVlYXhcbiIgICAgICAvKiBlYXggPSBsbWFzayAqLworIiAgICAgICAgYW5kbCAgICAlJWVkeCwgJSVlYXhcbiIgICAgICAgICAgLyogZWF4ICY9IGhvbGQgKi8KKyIgICAgICAgIG1vdmwgICAgKCUlZWJwLCUlZWF4LDQpLCAlJWVheFxuIiAvKiBlYXggPSBsY29kZVtob2xkICYgbG1hc2tdICovCisKKyIuTF9kb2xlbjpcbiIKKyIgICAgICAgIG1vdmIgICAgJSVhaCwgJSVjbFxuIiAgICAgICAgICAgIC8qIGNsID0gdGhpcy5iaXRzICovCisiICAgICAgICBzdWJiICAgICUlYWgsICUlYmxcbiIgICAgICAgICAgICAvKiBiaXRzIC09IHRoaXMuYml0cyAqLworIiAgICAgICAgc2hybCAgICAlJWNsLCAlJWVkeFxuIiAgICAgICAgICAgLyogaG9sZCA+Pj0gdGhpcy5iaXRzICovCisKKyIgICAgICAgIHRlc3RiICAgJSVhbCwgJSVhbFxuIgorIiAgICAgICAgam56ICAgICAuTF90ZXN0X2Zvcl9sZW5ndGhfYmFzZVxuIiAvKiBpZiAob3AgIT0gMCkgNDUuNyUgKi8KKworIiAgICAgICAgc2hybCAgICAkMTYsICUlZWF4XG4iICAgICAgICAgICAgLyogb3V0cHV0IHRoaXMudmFsIGNoYXIgKi8KKyIgICAgICAgIHN0b3NiXG4iCisiICAgICAgICBqbXAgICAgIC5MX3doaWxlX3Rlc3RcbiIKKworIi5hbGlnbiAzMiwweDkwXG4iCisiLkxfdGVzdF9mb3JfbGVuZ3RoX2Jhc2U6XG4iCisiICAgICAgICBtb3ZsICAgICUlZWF4LCAlJWVjeFxuIiAgICAgICAgICAvKiBsZW4gPSB0aGlzICovCisiICAgICAgICBzaHJsICAgICQxNiwgJSVlY3hcbiIgICAgICAgICAgICAvKiBsZW4gPSB0aGlzLnZhbCAqLworIiAgICAgICAgbW92bCAgICAlJWVjeCwgNjQoJSVlc3ApXG4iICAgICAgLyogc2F2ZSBsZW4gKi8KKyIgICAgICAgIG1vdmIgICAgJSVhbCwgJSVjbFxuIgorCisiICAgICAgICB0ZXN0YiAgICQxNiwgJSVhbFxuIgorIiAgICAgICAganogICAgICAuTF90ZXN0X2Zvcl9zZWNvbmRfbGV2ZWxfbGVuZ3RoXG4iIC8qIGlmICgob3AgJiAxNikgPT0gMCkgOCUgKi8KKyIgICAgICAgIGFuZGIgICAgJDE1LCAlJWNsXG4iICAgICAgICAgICAgIC8qIG9wICY9IDE1ICovCisiICAgICAgICBqeiAgICAgIC5MX2RlY29kZV9kaXN0YW5jZVxuIiAgICAvKiBpZiAoIW9wKSAqLworIiAgICAgICAgY21wYiAgICAlJWNsLCAlJWJsXG4iCisiICAgICAgICBqYWUgICAgIC5MX2FkZF9iaXRzX3RvX2xlblxuIiAgICAvKiBpZiAob3AgPD0gYml0cykgKi8KKworIiAgICAgICAgbW92YiAgICAlJWNsLCAlJWNoXG4iICAgICAgICAgICAgLyogc3Rhc2ggb3AgaW4gY2gsIGZyZWVpbmcgY2wgKi8KKyIgICAgICAgIHhvcmwgICAgJSVlYXgsICUlZWF4XG4iCisiICAgICAgICBsb2Rzd1xuIiAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbCA9ICoodXNob3J0ICopaW4rKyAqLworIiAgICAgICAgbW92YiAgICAlJWJsLCAlJWNsXG4iICAgICAgICAgICAgLyogY2wgPSBiaXRzLCBuZWVkcyBpdCBmb3Igc2hpZnRpbmcgKi8KKyIgICAgICAgIGFkZGIgICAgJDE2LCAlJWJsXG4iICAgICAgICAgICAgIC8qIGJpdHMgKz0gMTYgKi8KKyIgICAgICAgIHNobGwgICAgJSVjbCwgJSVlYXhcbiIKKyIgICAgICAgIG9ybCAgICAgJSVlYXgsICUlZWR4XG4iICAgICAgICAgLyogaG9sZCB8PSAqKCh1c2hvcnQgKilpbikrKyA8PCBiaXRzICovCisiICAgICAgICBtb3ZiICAgICUlY2gsICUlY2xcbiIgICAgICAgICAgICAvKiBtb3ZlIG9wIGJhY2sgdG8gZWN4ICovCisKKyIuTF9hZGRfYml0c190b19sZW46XG4iCisiICAgICAgICBzdWJiICAgICUlY2wsICUlYmxcbiIKKyIgICAgICAgIHhvcmwgICAgJSVlYXgsICUlZWF4XG4iCisiICAgICAgICBpbmNsICAgICUlZWF4XG4iCisiICAgICAgICBzaGxsICAgICUlY2wsICUlZWF4XG4iCisiICAgICAgICBkZWNsICAgICUlZWF4XG4iCisiICAgICAgICBhbmRsICAgICUlZWR4LCAlJWVheFxuIiAgICAgICAgICAvKiBlYXggJj0gaG9sZCAqLworIiAgICAgICAgc2hybCAgICAlJWNsLCAlJWVkeFxuIgorIiAgICAgICAgYWRkbCAgICAlJWVheCwgNjQoJSVlc3ApXG4iICAgICAgLyogbGVuICs9IGhvbGQgJiBtYXNrW29wXSAqLworCisiLkxfZGVjb2RlX2Rpc3RhbmNlOlxuIgorIiAgICAgICAgY21wYiAgICAkMTUsICUlYmxcbiIKKyIgICAgICAgIGphICAgICAgLkxfZ2V0X2Rpc3RhbmNlX2NvZGVcbiIgIC8qIGlmICgxNSA8IGJpdHMpICovCisKKyIgICAgICAgIHhvcmwgICAgJSVlYXgsICUlZWF4XG4iCisiICAgICAgICBsb2Rzd1xuIiAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbCA9ICoodXNob3J0ICopaW4rKyAqLworIiAgICAgICAgbW92YiAgICAlJWJsLCAlJWNsXG4iICAgICAgICAgICAgLyogY2wgPSBiaXRzLCBuZWVkcyBpdCBmb3Igc2hpZnRpbmcgKi8KKyIgICAgICAgIGFkZGIgICAgJDE2LCAlJWJsXG4iICAgICAgICAgICAgIC8qIGJpdHMgKz0gMTYgKi8KKyIgICAgICAgIHNobGwgICAgJSVjbCwgJSVlYXhcbiIKKyIgICAgICAgIG9ybCAgICAgJSVlYXgsICUlZWR4XG4iICAgICAgICAgLyogaG9sZCB8PSAqKCh1c2hvcnQgKilpbikrKyA8PCBiaXRzICovCisKKyIuTF9nZXRfZGlzdGFuY2VfY29kZTpcbiIKKyIgICAgICAgIG1vdmwgICAgNjAoJSVlc3ApLCAlJWVheFxuIiAgICAgIC8qIGVheCA9IGRtYXNrICovCisiICAgICAgICBtb3ZsICAgIDM2KCUlZXNwKSwgJSVlY3hcbiIgICAgICAvKiBlY3ggPSBkY29kZSAqLworIiAgICAgICAgYW5kbCAgICAlJWVkeCwgJSVlYXhcbiIgICAgICAgICAgLyogZWF4ICY9IGhvbGQgKi8KKyIgICAgICAgIG1vdmwgICAgKCUlZWN4LCUlZWF4LDQpLCAlJWVheFxuIi8qIGVheCA9IGRjb2RlW2hvbGQgJiBkbWFza10gKi8KKworIi5MX2RvZGlzdDpcbiIKKyIgICAgICAgIG1vdmwgICAgJSVlYXgsICUlZWJwXG4iICAgICAgICAgIC8qIGRpc3QgPSB0aGlzICovCisiICAgICAgICBzaHJsICAgICQxNiwgJSVlYnBcbiIgICAgICAgICAgICAvKiBkaXN0ID0gdGhpcy52YWwgKi8KKyIgICAgICAgIG1vdmIgICAgJSVhaCwgJSVjbFxuIgorIiAgICAgICAgc3ViYiAgICAlJWFoLCAlJWJsXG4iICAgICAgICAgICAgLyogYml0cyAtPSB0aGlzLmJpdHMgKi8KKyIgICAgICAgIHNocmwgICAgJSVjbCwgJSVlZHhcbiIgICAgICAgICAgIC8qIGhvbGQgPj49IHRoaXMuYml0cyAqLworIiAgICAgICAgbW92YiAgICAlJWFsLCAlJWNsXG4iICAgICAgICAgICAgLyogY2wgPSB0aGlzLm9wICovCisKKyIgICAgICAgIHRlc3RiICAgJDE2LCAlJWFsXG4iICAgICAgICAgICAgIC8qIGlmICgob3AgJiAxNikgPT0gMCkgKi8KKyIgICAgICAgIGp6ICAgICAgLkxfdGVzdF9mb3Jfc2Vjb25kX2xldmVsX2Rpc3RcbiIKKyIgICAgICAgIGFuZGIgICAgJDE1LCAlJWNsXG4iICAgICAgICAgICAgIC8qIG9wICY9IDE1ICovCisiICAgICAgICBqeiAgICAgIC5MX2NoZWNrX2Rpc3Rfb25lXG4iCisiICAgICAgICBjbXBiICAgICUlY2wsICUlYmxcbiIKKyIgICAgICAgIGphZSAgICAgLkxfYWRkX2JpdHNfdG9fZGlzdFxuIiAgIC8qIGlmIChvcCA8PSBiaXRzKSA5Ny42JSAqLworCisiICAgICAgICBtb3ZiICAgICUlY2wsICUlY2hcbiIgICAgICAgICAgICAvKiBzdGFzaCBvcCBpbiBjaCwgZnJlZWluZyBjbCAqLworIiAgICAgICAgeG9ybCAgICAlJWVheCwgJSVlYXhcbiIKKyIgICAgICAgIGxvZHN3XG4iICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFsID0gKih1c2hvcnQgKilpbisrICovCisiICAgICAgICBtb3ZiICAgICUlYmwsICUlY2xcbiIgICAgICAgICAgICAvKiBjbCA9IGJpdHMsIG5lZWRzIGl0IGZvciBzaGlmdGluZyAqLworIiAgICAgICAgYWRkYiAgICAkMTYsICUlYmxcbiIgICAgICAgICAgICAgLyogYml0cyArPSAxNiAqLworIiAgICAgICAgc2hsbCAgICAlJWNsLCAlJWVheFxuIgorIiAgICAgICAgb3JsICAgICAlJWVheCwgJSVlZHhcbiIgICAgICAgIC8qIGhvbGQgfD0gKigodXNob3J0ICopaW4pKysgPDwgYml0cyAqLworIiAgICAgICAgbW92YiAgICAlJWNoLCAlJWNsXG4iICAgICAgICAgICAgLyogbW92ZSBvcCBiYWNrIHRvIGVjeCAqLworCisiLkxfYWRkX2JpdHNfdG9fZGlzdDpcbiIKKyIgICAgICAgIHN1YmIgICAgJSVjbCwgJSVibFxuIgorIiAgICAgICAgeG9ybCAgICAlJWVheCwgJSVlYXhcbiIKKyIgICAgICAgIGluY2wgICAgJSVlYXhcbiIKKyIgICAgICAgIHNobGwgICAgJSVjbCwgJSVlYXhcbiIKKyIgICAgICAgIGRlY2wgICAgJSVlYXhcbiIgICAgICAgICAgICAgICAgIC8qICgxIDw8IG9wKSAtIDEgKi8KKyIgICAgICAgIGFuZGwgICAgJSVlZHgsICUlZWF4XG4iICAgICAgICAgIC8qIGVheCAmPSBob2xkICovCisiICAgICAgICBzaHJsICAgICUlY2wsICUlZWR4XG4iCisiICAgICAgICBhZGRsICAgICUlZWF4LCAlJWVicFxuIiAgICAgICAgICAvKiBkaXN0ICs9IGhvbGQgJiAoKDEgPDwgb3ApIC0gMSkgKi8KKworIi5MX2NoZWNrX3dpbmRvdzpcbiIKKyIgICAgICAgIG1vdmwgICAgJSVlc2ksIDgoJSVlc3ApXG4iICAgICAgIC8qIHNhdmUgaW4gc28gZnJvbSBjYW4gdXNlIGl0J3MgcmVnICovCisiICAgICAgICBtb3ZsICAgICUlZWRpLCAlJWVheFxuIgorIiAgICAgICAgc3VibCAgICAyMCglJWVzcCksICUlZWF4XG4iICAgICAgLyogbmJ5dGVzID0gb3V0IC0gYmVnICovCisKKyIgICAgICAgIGNtcGwgICAgJSVlYnAsICUlZWF4XG4iCisiICAgICAgICBqYiAgICAgIC5MX2NsaXBfd2luZG93XG4iICAgICAgICAvKiBpZiAoZGlzdCA+IG5ieXRlcykgNC4yJSAqLworCisiICAgICAgICBtb3ZsICAgIDY0KCUlZXNwKSwgJSVlY3hcbiIgICAgICAvKiBlY3ggPSBsZW4gKi8KKyIgICAgICAgIG1vdmwgICAgJSVlZGksICUlZXNpXG4iCisiICAgICAgICBzdWJsICAgICUlZWJwLCAlJWVzaVxuIiAgICAgICAgICAvKiBmcm9tID0gb3V0IC0gZGlzdCAqLworCisiICAgICAgICBzYXJsICAgICUlZWN4XG4iCisiICAgICAgICBqbmMgICAgIC5MX2NvcHlfdHdvXG4iICAgICAgICAgICAvKiBpZiBsZW4gJSAyID09IDAgKi8KKworIiAgICAgICAgcmVwICAgICBtb3Zzd1xuIgorIiAgICAgICAgbW92YiAgICAoJSVlc2kpLCAlJWFsXG4iCisiICAgICAgICBtb3ZiICAgICUlYWwsICglJWVkaSlcbiIKKyIgICAgICAgIGluY2wgICAgJSVlZGlcbiIKKworIiAgICAgICAgbW92bCAgICA4KCUlZXNwKSwgJSVlc2lcbiIgICAgICAgLyogbW92ZSBpbiBiYWNrIHRvICVlc2ksIHRvc3MgZnJvbSAqLworIiAgICAgICAgbW92bCAgICAzMiglJWVzcCksICUlZWJwXG4iICAgICAgLyogZWJwID0gbGNvZGUgKi8KKyIgICAgICAgIGptcCAgICAgLkxfd2hpbGVfdGVzdFxuIgorCisiLkxfY29weV90d286XG4iCisiICAgICAgICByZXAgICAgIG1vdnN3XG4iCisiICAgICAgICBtb3ZsICAgIDgoJSVlc3ApLCAlJWVzaVxuIiAgICAgICAvKiBtb3ZlIGluIGJhY2sgdG8gJWVzaSwgdG9zcyBmcm9tICovCisiICAgICAgICBtb3ZsICAgIDMyKCUlZXNwKSwgJSVlYnBcbiIgICAgICAvKiBlYnAgPSBsY29kZSAqLworIiAgICAgICAgam1wICAgICAuTF93aGlsZV90ZXN0XG4iCisKKyIuYWxpZ24gMzIsMHg5MFxuIgorIi5MX2NoZWNrX2Rpc3Rfb25lOlxuIgorIiAgICAgICAgY21wbCAgICAkMSwgJSVlYnBcbiIgICAgICAgICAgICAvKiBpZiBkaXN0IDEsIGlzIGEgbWVtc2V0ICovCisiICAgICAgICBqbmUgICAgIC5MX2NoZWNrX3dpbmRvd1xuIgorIiAgICAgICAgY21wbCAgICAlJWVkaSwgMjAoJSVlc3ApXG4iCisiICAgICAgICBqZSAgICAgIC5MX2NoZWNrX3dpbmRvd1xuIiAgICAgIC8qIG91dCA9PSBiZWcsIGlmIG91dHNpZGUgd2luZG93ICovCisKKyIgICAgICAgIG1vdmwgICAgNjQoJSVlc3ApLCAlJWVjeFxuIiAgICAgIC8qIGVjeCA9IGxlbiAqLworIiAgICAgICAgbW92YiAgICAtMSglJWVkaSksICUlYWxcbiIKKyIgICAgICAgIG1vdmIgICAgJSVhbCwgJSVhaFxuIgorCisiICAgICAgICBzYXJsICAgICUlZWN4XG4iCisiICAgICAgICBqbmMgICAgIC5MX3NldF90d29cbiIKKyIgICAgICAgIG1vdmIgICAgJSVhbCwgKCUlZWRpKVxuIgorIiAgICAgICAgaW5jbCAgICAlJWVkaVxuIgorCisiLkxfc2V0X3R3bzpcbiIKKyIgICAgICAgIHJlcCAgICAgc3Rvc3dcbiIKKyIgICAgICAgIG1vdmwgICAgMzIoJSVlc3ApLCAlJWVicFxuIiAgICAgIC8qIGVicCA9IGxjb2RlICovCisiICAgICAgICBqbXAgICAgIC5MX3doaWxlX3Rlc3RcbiIKKworIi5hbGlnbiAzMiwweDkwXG4iCisiLkxfdGVzdF9mb3Jfc2Vjb25kX2xldmVsX2xlbmd0aDpcbiIKKyIgICAgICAgIHRlc3RiICAgJDY0LCAlJWFsXG4iCisiICAgICAgICBqbnogICAgIC5MX3Rlc3RfZm9yX2VuZF9vZl9ibG9ja1xuIiAvKiBpZiAoKG9wICYgNjQpICE9IDApICovCisKKyIgICAgICAgIHhvcmwgICAgJSVlYXgsICUlZWF4XG4iCisiICAgICAgICBpbmNsICAgICUlZWF4XG4iCisiICAgICAgICBzaGxsICAgICUlY2wsICUlZWF4XG4iCisiICAgICAgICBkZWNsICAgICUlZWF4XG4iCisiICAgICAgICBhbmRsICAgICUlZWR4LCAlJWVheFxuIiAgICAgICAgIC8qIGVheCAmPSBob2xkICovCisiICAgICAgICBhZGRsICAgIDY0KCUlZXNwKSwgJSVlYXhcbiIgICAgIC8qIGVheCArPSBsZW4gKi8KKyIgICAgICAgIG1vdmwgICAgKCUlZWJwLCUlZWF4LDQpLCAlJWVheFxuIiAvKiBlYXggPSBsY29kZVt2YWwrKGhvbGQmbWFza1tvcF0pXSovCisiICAgICAgICBqbXAgICAgIC5MX2RvbGVuXG4iCisKKyIuYWxpZ24gMzIsMHg5MFxuIgorIi5MX3Rlc3RfZm9yX3NlY29uZF9sZXZlbF9kaXN0OlxuIgorIiAgICAgICAgdGVzdGIgICAkNjQsICUlYWxcbiIKKyIgICAgICAgIGpueiAgICAgLkxfaW52YWxpZF9kaXN0YW5jZV9jb2RlXG4iIC8qIGlmICgob3AgJiA2NCkgIT0gMCkgKi8KKworIiAgICAgICAgeG9ybCAgICAlJWVheCwgJSVlYXhcbiIKKyIgICAgICAgIGluY2wgICAgJSVlYXhcbiIKKyIgICAgICAgIHNobGwgICAgJSVjbCwgJSVlYXhcbiIKKyIgICAgICAgIGRlY2wgICAgJSVlYXhcbiIKKyIgICAgICAgIGFuZGwgICAgJSVlZHgsICUlZWF4XG4iICAgICAgICAgLyogZWF4ICY9IGhvbGQgKi8KKyIgICAgICAgIGFkZGwgICAgJSVlYnAsICUlZWF4XG4iICAgICAgICAgLyogZWF4ICs9IGRpc3QgKi8KKyIgICAgICAgIG1vdmwgICAgMzYoJSVlc3ApLCAlJWVjeFxuIiAgICAgLyogZWN4ID0gZGNvZGUgKi8KKyIgICAgICAgIG1vdmwgICAgKCUlZWN4LCUlZWF4LDQpLCAlJWVheFxuIiAvKiBlYXggPSBkY29kZVt2YWwrKGhvbGQmbWFza1tvcF0pXSovCisiICAgICAgICBqbXAgICAgIC5MX2RvZGlzdFxuIgorCisiLmFsaWduIDMyLDB4OTBcbiIKKyIuTF9jbGlwX3dpbmRvdzpcbiIKKyIgICAgICAgIG1vdmwgICAgJSVlYXgsICUlZWN4XG4iCisiICAgICAgICBtb3ZsICAgIDQ4KCUlZXNwKSwgJSVlYXhcbiIgICAgIC8qIGVheCA9IHdzaXplICovCisiICAgICAgICBuZWdsICAgICUlZWN4XG4iICAgICAgICAgICAgICAgIC8qIG5ieXRlcyA9IC1uYnl0ZXMgKi8KKyIgICAgICAgIG1vdmwgICAgMjgoJSVlc3ApLCAlJWVzaVxuIiAgICAgLyogZnJvbSA9IHdpbmRvdyAqLworCisiICAgICAgICBjbXBsICAgICUlZWJwLCAlJWVheFxuIgorIiAgICAgICAgamIgICAgICAuTF9pbnZhbGlkX2Rpc3RhbmNlX3Rvb19mYXJcbiIgLyogaWYgKGRpc3QgPiB3c2l6ZSkgKi8KKworIiAgICAgICAgYWRkbCAgICAlJWVicCwgJSVlY3hcbiIgICAgICAgICAvKiBuYnl0ZXMgPSBkaXN0IC0gbmJ5dGVzICovCisiICAgICAgICBjbXBsICAgICQwLCA1MiglJWVzcClcbiIKKyIgICAgICAgIGpuZSAgICAgLkxfd3JhcF9hcm91bmRfd2luZG93XG4iIC8qIGlmICh3cml0ZSAhPSAwKSAqLworCisiICAgICAgICBzdWJsICAgICUlZWN4LCAlJWVheFxuIgorIiAgICAgICAgYWRkbCAgICAlJWVheCwgJSVlc2lcbiIgICAgICAgICAvKiBmcm9tICs9IHdzaXplIC0gbmJ5dGVzICovCisKKyIgICAgICAgIG1vdmwgICAgNjQoJSVlc3ApLCAlJWVheFxuIiAgICAgLyogZWF4ID0gbGVuICovCisiICAgICAgICBjbXBsICAgICUlZWN4LCAlJWVheFxuIgorIiAgICAgICAgamJlICAgICAuTF9kb19jb3B5XG4iICAgICAgICAgICAvKiBpZiAobmJ5dGVzID49IGxlbikgKi8KKworIiAgICAgICAgc3VibCAgICAlJWVjeCwgJSVlYXhcbiIgICAgICAgICAvKiBsZW4gLT0gbmJ5dGVzICovCisiICAgICAgICByZXAgICAgIG1vdnNiXG4iCisiICAgICAgICBtb3ZsICAgICUlZWRpLCAlJWVzaVxuIgorIiAgICAgICAgc3VibCAgICAlJWVicCwgJSVlc2lcbiIgICAgICAgICAvKiBmcm9tID0gb3V0IC0gZGlzdCAqLworIiAgICAgICAgam1wICAgICAuTF9kb19jb3B5XG4iCisKKyIuYWxpZ24gMzIsMHg5MFxuIgorIi5MX3dyYXBfYXJvdW5kX3dpbmRvdzpcbiIKKyIgICAgICAgIG1vdmwgICAgNTIoJSVlc3ApLCAlJWVheFxuIiAgICAgLyogZWF4ID0gd3JpdGUgKi8KKyIgICAgICAgIGNtcGwgICAgJSVlYXgsICUlZWN4XG4iCisiICAgICAgICBqYmUgICAgIC5MX2NvbnRpZ3VvdXNfaW5fd2luZG93XG4iIC8qIGlmICh3cml0ZSA+PSBuYnl0ZXMpICovCisKKyIgICAgICAgIGFkZGwgICAgNDgoJSVlc3ApLCAlJWVzaVxuIiAgICAgLyogZnJvbSArPSB3c2l6ZSAqLworIiAgICAgICAgYWRkbCAgICAlJWVheCwgJSVlc2lcbiIgICAgICAgICAvKiBmcm9tICs9IHdyaXRlICovCisiICAgICAgICBzdWJsICAgICUlZWN4LCAlJWVzaVxuIiAgICAgICAgIC8qIGZyb20gLT0gbmJ5dGVzICovCisiICAgICAgICBzdWJsICAgICUlZWF4LCAlJWVjeFxuIiAgICAgICAgIC8qIG5ieXRlcyAtPSB3cml0ZSAqLworCisiICAgICAgICBtb3ZsICAgIDY0KCUlZXNwKSwgJSVlYXhcbiIgICAgIC8qIGVheCA9IGxlbiAqLworIiAgICAgICAgY21wbCAgICAlJWVjeCwgJSVlYXhcbiIKKyIgICAgICAgIGpiZSAgICAgLkxfZG9fY29weVxuIiAgICAgICAgICAgLyogaWYgKG5ieXRlcyA+PSBsZW4pICovCisKKyIgICAgICAgIHN1YmwgICAgJSVlY3gsICUlZWF4XG4iICAgICAgICAgLyogbGVuIC09IG5ieXRlcyAqLworIiAgICAgICAgcmVwICAgICBtb3ZzYlxuIgorIiAgICAgICAgbW92bCAgICAyOCglJWVzcCksICUlZXNpXG4iICAgICAvKiBmcm9tID0gd2luZG93ICovCisiICAgICAgICBtb3ZsICAgIDUyKCUlZXNwKSwgJSVlY3hcbiIgICAgIC8qIG5ieXRlcyA9IHdyaXRlICovCisiICAgICAgICBjbXBsICAgICUlZWN4LCAlJWVheFxuIgorIiAgICAgICAgamJlICAgICAuTF9kb19jb3B5XG4iICAgICAgICAgICAvKiBpZiAobmJ5dGVzID49IGxlbikgKi8KKworIiAgICAgICAgc3VibCAgICAlJWVjeCwgJSVlYXhcbiIgICAgICAgICAvKiBsZW4gLT0gbmJ5dGVzICovCisiICAgICAgICByZXAgICAgIG1vdnNiXG4iCisiICAgICAgICBtb3ZsICAgICUlZWRpLCAlJWVzaVxuIgorIiAgICAgICAgc3VibCAgICAlJWVicCwgJSVlc2lcbiIgICAgICAgICAvKiBmcm9tID0gb3V0IC0gZGlzdCAqLworIiAgICAgICAgam1wICAgICAuTF9kb19jb3B5XG4iCisKKyIuYWxpZ24gMzIsMHg5MFxuIgorIi5MX2NvbnRpZ3VvdXNfaW5fd2luZG93OlxuIgorIiAgICAgICAgYWRkbCAgICAlJWVheCwgJSVlc2lcbiIKKyIgICAgICAgIHN1YmwgICAgJSVlY3gsICUlZXNpXG4iICAgICAgICAgLyogZnJvbSArPSB3cml0ZSAtIG5ieXRlcyAqLworCisiICAgICAgICBtb3ZsICAgIDY0KCUlZXNwKSwgJSVlYXhcbiIgICAgIC8qIGVheCA9IGxlbiAqLworIiAgICAgICAgY21wbCAgICAlJWVjeCwgJSVlYXhcbiIKKyIgICAgICAgIGpiZSAgICAgLkxfZG9fY29weVxuIiAgICAgICAgICAgLyogaWYgKG5ieXRlcyA+PSBsZW4pICovCisKKyIgICAgICAgIHN1YmwgICAgJSVlY3gsICUlZWF4XG4iICAgICAgICAgLyogbGVuIC09IG5ieXRlcyAqLworIiAgICAgICAgcmVwICAgICBtb3ZzYlxuIgorIiAgICAgICAgbW92bCAgICAlJWVkaSwgJSVlc2lcbiIKKyIgICAgICAgIHN1YmwgICAgJSVlYnAsICUlZXNpXG4iICAgICAgICAgLyogZnJvbSA9IG91dCAtIGRpc3QgKi8KKyIgICAgICAgIGptcCAgICAgLkxfZG9fY29weVxuIiAgICAgICAgICAgLyogaWYgKG5ieXRlcyA+PSBsZW4pICovCisKKyIuYWxpZ24gMzIsMHg5MFxuIgorIi5MX2RvX2NvcHk6XG4iCisiICAgICAgICBtb3ZsICAgICUlZWF4LCAlJWVjeFxuIgorIiAgICAgICAgcmVwICAgICBtb3ZzYlxuIgorCisiICAgICAgICBtb3ZsICAgIDgoJSVlc3ApLCAlJWVzaVxuIiAgICAgIC8qIG1vdmUgaW4gYmFjayB0byAlZXNpLCB0b3NzIGZyb20gKi8KKyIgICAgICAgIG1vdmwgICAgMzIoJSVlc3ApLCAlJWVicFxuIiAgICAgLyogZWJwID0gbGNvZGUgKi8KKyIgICAgICAgIGptcCAgICAgLkxfd2hpbGVfdGVzdFxuIgorCisiLkxfdGVzdF9mb3JfZW5kX29mX2Jsb2NrOlxuIgorIiAgICAgICAgdGVzdGIgICAkMzIsICUlYWxcbiIKKyIgICAgICAgIGp6ICAgICAgLkxfaW52YWxpZF9saXRlcmFsX2xlbmd0aF9jb2RlXG4iCisiICAgICAgICBtb3ZsICAgICQxLCA3MiglJWVzcClcbiIKKyIgICAgICAgIGptcCAgICAgLkxfYnJlYWtfbG9vcF93aXRoX3N0YXR1c1xuIgorCisiLkxfaW52YWxpZF9saXRlcmFsX2xlbmd0aF9jb2RlOlxuIgorIiAgICAgICAgbW92bCAgICAkMiwgNzIoJSVlc3ApXG4iCisiICAgICAgICBqbXAgICAgIC5MX2JyZWFrX2xvb3Bfd2l0aF9zdGF0dXNcbiIKKworIi5MX2ludmFsaWRfZGlzdGFuY2VfY29kZTpcbiIKKyIgICAgICAgIG1vdmwgICAgJDMsIDcyKCUlZXNwKVxuIgorIiAgICAgICAgam1wICAgICAuTF9icmVha19sb29wX3dpdGhfc3RhdHVzXG4iCisKKyIuTF9pbnZhbGlkX2Rpc3RhbmNlX3Rvb19mYXI6XG4iCisiICAgICAgICBtb3ZsICAgIDgoJSVlc3ApLCAlJWVzaVxuIgorIiAgICAgICAgbW92bCAgICAkNCwgNzIoJSVlc3ApXG4iCisiICAgICAgICBqbXAgICAgIC5MX2JyZWFrX2xvb3Bfd2l0aF9zdGF0dXNcbiIKKworIi5MX2JyZWFrX2xvb3A6XG4iCisiICAgICAgICBtb3ZsICAgICQwLCA3MiglJWVzcClcbiIKKworIi5MX2JyZWFrX2xvb3Bfd2l0aF9zdGF0dXM6XG4iCisvKiBwdXQgaW4sIG91dCwgYml0cywgYW5kIGhvbGQgYmFjayBpbnRvIGFyIGFuZCBwb3AgZXNwICovCisiICAgICAgICBtb3ZsICAgICUlZXNpLCA4KCUlZXNwKVxuIiAgICAgIC8qIHNhdmUgaW4gKi8KKyIgICAgICAgIG1vdmwgICAgJSVlZGksIDE2KCUlZXNwKVxuIiAgICAgLyogc2F2ZSBvdXQgKi8KKyIgICAgICAgIG1vdmwgICAgJSVlYngsIDQ0KCUlZXNwKVxuIiAgICAgLyogc2F2ZSBiaXRzICovCisiICAgICAgICBtb3ZsICAgICUlZWR4LCA0MCglJWVzcClcbiIgICAgIC8qIHNhdmUgaG9sZCAqLworIiAgICAgICAgbW92bCAgICA0KCUlZXNwKSwgJSVlYnBcbiIgICAgICAvKiByZXN0b3JlIGVzcCwgZWJwICovCisiICAgICAgICBtb3ZsICAgICglJWVzcCksICUlZXNwXG4iCisgICAgICAgICAgOgorICAgICAgICAgIDogIm0iIChhcikKKyAgICAgICAgICA6ICJtZW1vcnkiLCAiJWVheCIsICIlZWJ4IiwgIiVlY3giLCAiJWVkeCIsICIlZXNpIiwgIiVlZGkiCisgICAgKTsKKyNlbGlmIGRlZmluZWQoIF9NU0NfVkVSICkgJiYgISBkZWZpbmVkKCBfTV9BTUQ2NCApCisgICAgX19hc20geworCWxlYQllYXgsIGFyCisJbW92CVtlYXhdLCBlc3AgICAgICAgICAvKiBzYXZlIGVzcCwgZWJwICovCisJbW92CVtlYXgrNF0sIGVicAorCW1vdgllc3AsIGVheAorCW1vdgllc2ksIFtlc3ArOF0gICAgICAgLyogZXNpID0gaW4gKi8KKwltb3YJZWRpLCBbZXNwKzE2XSAgICAgIC8qIGVkaSA9IG91dCAqLworCW1vdgllZHgsIFtlc3ArNDBdICAgICAgLyogZWR4ID0gaG9sZCAqLworCW1vdgllYngsIFtlc3ArNDRdICAgICAgLyogZWJ4ID0gYml0cyAqLworCW1vdgllYnAsIFtlc3ArMzJdICAgICAgLyogZWJwID0gbGNvZGUgKi8KKworCWNsZAorCWptcAlMX2RvX2xvb3AKKworQUxJR04gNAorTF93aGlsZV90ZXN0OgorCWNtcAlbZXNwKzI0XSwgZWRpCisJamJlCUxfYnJlYWtfbG9vcAorCWNtcAlbZXNwKzEyXSwgZXNpCisJamJlCUxfYnJlYWtfbG9vcAorCitMX2RvX2xvb3A6CisJY21wCWJsLCAxNQorCWphCUxfZ2V0X2xlbmd0aF9jb2RlICAgIC8qIGlmICgxNSA8IGJpdHMpICovCisKKwl4b3IJZWF4LCBlYXgKKwlsb2RzdyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbCA9ICoodXNob3J0ICopaW4rKyAqLworCW1vdgljbCwgYmwgICAgICAgICAgICAvKiBjbCA9IGJpdHMsIG5lZWRzIGl0IGZvciBzaGlmdGluZyAqLworCWFkZAlibCwgMTYgICAgICAgICAgICAgLyogYml0cyArPSAxNiAqLworCXNobAllYXgsIGNsCisJb3IJZWR4LCBlYXggICAgICAgIC8qIGhvbGQgfD0gKigodXNob3J0ICopaW4pKysgPDwgYml0cyAqLworCitMX2dldF9sZW5ndGhfY29kZToKKwltb3YJZWF4LCBbZXNwKzU2XSAgICAgIC8qIGVheCA9IGxtYXNrICovCisJYW5kCWVheCwgZWR4ICAgICAgICAgIC8qIGVheCAmPSBob2xkICovCisJbW92CWVheCwgW2VicCtlYXgqNF0gLyogZWF4ID0gbGNvZGVbaG9sZCAmIGxtYXNrXSAqLworCitMX2RvbGVuOgorCW1vdgljbCwgYWggICAgICAgICAgICAvKiBjbCA9IHRoaXMuYml0cyAqLworCXN1YglibCwgYWggICAgICAgICAgICAvKiBiaXRzIC09IHRoaXMuYml0cyAqLworCXNocgllZHgsIGNsICAgICAgICAgICAvKiBob2xkID4+PSB0aGlzLmJpdHMgKi8KKworCXRlc3QJYWwsIGFsCisJam56CUxfdGVzdF9mb3JfbGVuZ3RoX2Jhc2UgLyogaWYgKG9wICE9IDApIDQ1LjclICovCisKKwlzaHIJZWF4LCAxNiAgICAgICAgICAgIC8qIG91dHB1dCB0aGlzLnZhbCBjaGFyICovCisJc3Rvc2IKKwlqbXAJTF93aGlsZV90ZXN0CisKK0FMSUdOIDQKK0xfdGVzdF9mb3JfbGVuZ3RoX2Jhc2U6CisJbW92CWVjeCwgZWF4ICAgICAgICAgIC8qIGxlbiA9IHRoaXMgKi8KKwlzaHIJZWN4LCAxNiAgICAgICAgICAgIC8qIGxlbiA9IHRoaXMudmFsICovCisJbW92CVtlc3ArNjRdLCBlY3ggICAgICAvKiBzYXZlIGxlbiAqLworCW1vdgljbCwgYWwKKworCXRlc3QJYWwsIDE2CisJanoJTF90ZXN0X2Zvcl9zZWNvbmRfbGV2ZWxfbGVuZ3RoIC8qIGlmICgob3AgJiAxNikgPT0gMCkgOCUgKi8KKwlhbmQJY2wsIDE1ICAgICAgICAgICAgIC8qIG9wICY9IDE1ICovCisJanoJTF9kZWNvZGVfZGlzdGFuY2UgICAgLyogaWYgKCFvcCkgKi8KKwljbXAJYmwsIGNsCisJamFlCUxfYWRkX2JpdHNfdG9fbGVuICAgIC8qIGlmIChvcCA8PSBiaXRzKSAqLworCisJbW92CWNoLCBjbCAgICAgICAgICAgIC8qIHN0YXNoIG9wIGluIGNoLCBmcmVlaW5nIGNsICovCisJeG9yCWVheCwgZWF4CisJbG9kc3cgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWwgPSAqKHVzaG9ydCAqKWluKysgKi8KKwltb3YJY2wsIGJsICAgICAgICAgICAgLyogY2wgPSBiaXRzLCBuZWVkcyBpdCBmb3Igc2hpZnRpbmcgKi8KKwlhZGQJYmwsIDE2ICAgICAgICAgICAgIC8qIGJpdHMgKz0gMTYgKi8KKwlzaGwJZWF4LCBjbAorCW9yCWVkeCwgZWF4ICAgICAgICAgLyogaG9sZCB8PSAqKCh1c2hvcnQgKilpbikrKyA8PCBiaXRzICovCisJbW92CWNsLCBjaCAgICAgICAgICAgIC8qIG1vdmUgb3AgYmFjayB0byBlY3ggKi8KKworTF9hZGRfYml0c190b19sZW46CisJc3ViCWJsLCBjbAorCXhvcgllYXgsIGVheAorCWluYwllYXgKKwlzaGwJZWF4LCBjbAorCWRlYwllYXgKKwlhbmQJZWF4LCBlZHggICAgICAgICAgLyogZWF4ICY9IGhvbGQgKi8KKwlzaHIJZWR4LCBjbAorCWFkZAlbZXNwKzY0XSwgZWF4ICAgICAgLyogbGVuICs9IGhvbGQgJiBtYXNrW29wXSAqLworCitMX2RlY29kZV9kaXN0YW5jZToKKwljbXAJYmwsIDE1CisJamEJTF9nZXRfZGlzdGFuY2VfY29kZSAgLyogaWYgKDE1IDwgYml0cykgKi8KKworCXhvcgllYXgsIGVheAorCWxvZHN3ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFsID0gKih1c2hvcnQgKilpbisrICovCisJbW92CWNsLCBibCAgICAgICAgICAgIC8qIGNsID0gYml0cywgbmVlZHMgaXQgZm9yIHNoaWZ0aW5nICovCisJYWRkCWJsLCAxNiAgICAgICAgICAgICAvKiBiaXRzICs9IDE2ICovCisJc2hsCWVheCwgY2wKKwlvcgllZHgsIGVheCAgICAgICAgIC8qIGhvbGQgfD0gKigodXNob3J0ICopaW4pKysgPDwgYml0cyAqLworCitMX2dldF9kaXN0YW5jZV9jb2RlOgorCW1vdgllYXgsIFtlc3ArNjBdICAgICAgLyogZWF4ID0gZG1hc2sgKi8KKwltb3YJZWN4LCBbZXNwKzM2XSAgICAgIC8qIGVjeCA9IGRjb2RlICovCisJYW5kCWVheCwgZWR4ICAgICAgICAgIC8qIGVheCAmPSBob2xkICovCisJbW92CWVheCwgW2VjeCtlYXgqNF0vKiBlYXggPSBkY29kZVtob2xkICYgZG1hc2tdICovCisKK0xfZG9kaXN0OgorCW1vdgllYnAsIGVheCAgICAgICAgICAvKiBkaXN0ID0gdGhpcyAqLworCXNocgllYnAsIDE2ICAgICAgICAgICAgLyogZGlzdCA9IHRoaXMudmFsICovCisJbW92CWNsLCBhaAorCXN1YglibCwgYWggICAgICAgICAgICAvKiBiaXRzIC09IHRoaXMuYml0cyAqLworCXNocgllZHgsIGNsICAgICAgICAgICAvKiBob2xkID4+PSB0aGlzLmJpdHMgKi8KKwltb3YJY2wsIGFsICAgICAgICAgICAgLyogY2wgPSB0aGlzLm9wICovCisKKwl0ZXN0CWFsLCAxNiAgICAgICAgICAgICAvKiBpZiAoKG9wICYgMTYpID09IDApICovCisJanoJTF90ZXN0X2Zvcl9zZWNvbmRfbGV2ZWxfZGlzdAorCWFuZAljbCwgMTUgICAgICAgICAgICAgLyogb3AgJj0gMTUgKi8KKwlqeglMX2NoZWNrX2Rpc3Rfb25lCisJY21wCWJsLCBjbAorCWphZQlMX2FkZF9iaXRzX3RvX2Rpc3QgICAvKiBpZiAob3AgPD0gYml0cykgOTcuNiUgKi8KKworCW1vdgljaCwgY2wgICAgICAgICAgICAvKiBzdGFzaCBvcCBpbiBjaCwgZnJlZWluZyBjbCAqLworCXhvcgllYXgsIGVheAorCWxvZHN3ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFsID0gKih1c2hvcnQgKilpbisrICovCisJbW92CWNsLCBibCAgICAgICAgICAgIC8qIGNsID0gYml0cywgbmVlZHMgaXQgZm9yIHNoaWZ0aW5nICovCisJYWRkCWJsLCAxNiAgICAgICAgICAgICAvKiBiaXRzICs9IDE2ICovCisJc2hsCWVheCwgY2wKKwlvcgllZHgsIGVheCAgICAgICAgLyogaG9sZCB8PSAqKCh1c2hvcnQgKilpbikrKyA8PCBiaXRzICovCisJbW92CWNsLCBjaCAgICAgICAgICAgIC8qIG1vdmUgb3AgYmFjayB0byBlY3ggKi8KKworTF9hZGRfYml0c190b19kaXN0OgorCXN1YglibCwgY2wKKwl4b3IJZWF4LCBlYXgKKwlpbmMJZWF4CisJc2hsCWVheCwgY2wKKwlkZWMJZWF4ICAgICAgICAgICAgICAgICAvKiAoMSA8PCBvcCkgLSAxICovCisJYW5kCWVheCwgZWR4ICAgICAgICAgIC8qIGVheCAmPSBob2xkICovCisJc2hyCWVkeCwgY2wKKwlhZGQJZWJwLCBlYXggICAgICAgICAgLyogZGlzdCArPSBob2xkICYgKCgxIDw8IG9wKSAtIDEpICovCisKK0xfY2hlY2tfd2luZG93OgorCW1vdglbZXNwKzhdLCBlc2kgICAgICAgLyogc2F2ZSBpbiBzbyBmcm9tIGNhbiB1c2UgaXQncyByZWcgKi8KKwltb3YJZWF4LCBlZGkKKwlzdWIJZWF4LCBbZXNwKzIwXSAgICAgIC8qIG5ieXRlcyA9IG91dCAtIGJlZyAqLworCisJY21wCWVheCwgZWJwCisJamIJTF9jbGlwX3dpbmRvdyAgICAgICAgLyogaWYgKGRpc3QgPiBuYnl0ZXMpIDQuMiUgKi8KKworCW1vdgllY3gsIFtlc3ArNjRdICAgICAgLyogZWN4ID0gbGVuICovCisJbW92CWVzaSwgZWRpCisJc3ViCWVzaSwgZWJwICAgICAgICAgIC8qIGZyb20gPSBvdXQgLSBkaXN0ICovCisKKwlzYXIJZWN4LCAxCisJam5jCUxfY29weV90d28KKworCXJlcCAgICAgbW92c3cKKwltb3YJYWwsIFtlc2ldCisJbW92CVtlZGldLCBhbAorCWluYwllZGkKKworCW1vdgllc2ksIFtlc3ArOF0gICAgICAvKiBtb3ZlIGluIGJhY2sgdG8gJWVzaSwgdG9zcyBmcm9tICovCisJbW92CWVicCwgW2VzcCszMl0gICAgIC8qIGVicCA9IGxjb2RlICovCisJam1wCUxfd2hpbGVfdGVzdAorCitMX2NvcHlfdHdvOgorCXJlcCAgICAgbW92c3cKKwltb3YJZXNpLCBbZXNwKzhdICAgICAgLyogbW92ZSBpbiBiYWNrIHRvICVlc2ksIHRvc3MgZnJvbSAqLworCW1vdgllYnAsIFtlc3ArMzJdICAgICAvKiBlYnAgPSBsY29kZSAqLworCWptcAlMX3doaWxlX3Rlc3QKKworQUxJR04gNAorTF9jaGVja19kaXN0X29uZToKKwljbXAJZWJwLCAxICAgICAgICAgICAgLyogaWYgZGlzdCAxLCBpcyBhIG1lbXNldCAqLworCWpuZQlMX2NoZWNrX3dpbmRvdworCWNtcAlbZXNwKzIwXSwgZWRpCisJamUJTF9jaGVja193aW5kb3cgICAgLyogb3V0ID09IGJlZywgaWYgb3V0c2lkZSB3aW5kb3cgKi8KKworCW1vdgllY3gsIFtlc3ArNjRdICAgICAvKiBlY3ggPSBsZW4gKi8KKwltb3YJYWwsIFtlZGktMV0KKwltb3YJYWgsIGFsCisKKwlzYXIJZWN4LCAxCisJam5jCUxfc2V0X3R3bworCW1vdglbZWRpXSwgYWwgICAgICAgICAvKiBtZW1zZXQgb3V0IHdpdGggZnJvbVstMV0gKi8KKwlpbmMJZWRpCisKK0xfc2V0X3R3bzoKKwlyZXAgICAgIHN0b3N3CisJbW92CWVicCwgW2VzcCszMl0gICAgIC8qIGVicCA9IGxjb2RlICovCisJam1wCUxfd2hpbGVfdGVzdAorCitBTElHTiA0CitMX3Rlc3RfZm9yX3NlY29uZF9sZXZlbF9sZW5ndGg6CisJdGVzdAlhbCwgNjQKKwlqbnoJTF90ZXN0X2Zvcl9lbmRfb2ZfYmxvY2sgLyogaWYgKChvcCAmIDY0KSAhPSAwKSAqLworCisJeG9yCWVheCwgZWF4CisJaW5jCWVheAorCXNobAllYXgsIGNsCisJZGVjCWVheAorCWFuZAllYXgsIGVkeCAgICAgICAgIC8qIGVheCAmPSBob2xkICovCisJYWRkCWVheCwgW2VzcCs2NF0gICAgIC8qIGVheCArPSBsZW4gKi8KKwltb3YJZWF4LCBbZWJwK2VheCo0XSAvKiBlYXggPSBsY29kZVt2YWwrKGhvbGQmbWFza1tvcF0pXSovCisJam1wCUxfZG9sZW4KKworQUxJR04gNAorTF90ZXN0X2Zvcl9zZWNvbmRfbGV2ZWxfZGlzdDoKKwl0ZXN0CWFsLCA2NAorCWpueglMX2ludmFsaWRfZGlzdGFuY2VfY29kZSAvKiBpZiAoKG9wICYgNjQpICE9IDApICovCisKKwl4b3IJZWF4LCBlYXgKKwlpbmMJZWF4CisJc2hsCWVheCwgY2wKKwlkZWMJZWF4CisJYW5kCWVheCwgZWR4ICAgICAgICAgLyogZWF4ICY9IGhvbGQgKi8KKwlhZGQJZWF4LCBlYnAgICAgICAgICAvKiBlYXggKz0gZGlzdCAqLworCW1vdgllY3gsIFtlc3ArMzZdICAgICAvKiBlY3ggPSBkY29kZSAqLworCW1vdgllYXgsIFtlY3grZWF4KjRdIC8qIGVheCA9IGRjb2RlW3ZhbCsoaG9sZCZtYXNrW29wXSldKi8KKwlqbXAJTF9kb2Rpc3QKKworQUxJR04gNAorTF9jbGlwX3dpbmRvdzoKKwltb3YJZWN4LCBlYXgKKwltb3YJZWF4LCBbZXNwKzQ4XSAgICAgLyogZWF4ID0gd3NpemUgKi8KKwluZWcJZWN4ICAgICAgICAgICAgICAgIC8qIG5ieXRlcyA9IC1uYnl0ZXMgKi8KKwltb3YJZXNpLCBbZXNwKzI4XSAgICAgLyogZnJvbSA9IHdpbmRvdyAqLworCisJY21wCWVheCwgZWJwCisJamIJTF9pbnZhbGlkX2Rpc3RhbmNlX3Rvb19mYXIgLyogaWYgKGRpc3QgPiB3c2l6ZSkgKi8KKworCWFkZAllY3gsIGVicCAgICAgICAgIC8qIG5ieXRlcyA9IGRpc3QgLSBuYnl0ZXMgKi8KKwljbXAJZHdvcmQgcHRyIFtlc3ArNTJdLCAwCisJam5lCUxfd3JhcF9hcm91bmRfd2luZG93IC8qIGlmICh3cml0ZSAhPSAwKSAqLworCisJc3ViCWVheCwgZWN4CisJYWRkCWVzaSwgZWF4ICAgICAgICAgLyogZnJvbSArPSB3c2l6ZSAtIG5ieXRlcyAqLworCisJbW92CWVheCwgW2VzcCs2NF0gICAgLyogZWF4ID0gbGVuICovCisJY21wCWVheCwgZWN4CisJamJlCUxfZG9fY29weSAgICAgICAgICAvKiBpZiAobmJ5dGVzID49IGxlbikgKi8KKworCXN1YgllYXgsIGVjeCAgICAgICAgIC8qIGxlbiAtPSBuYnl0ZXMgKi8KKwlyZXAgICAgIG1vdnNiCisJbW92CWVzaSwgZWRpCisJc3ViCWVzaSwgZWJwICAgICAgICAgLyogZnJvbSA9IG91dCAtIGRpc3QgKi8KKwlqbXAJTF9kb19jb3B5CisKK0FMSUdOIDQKK0xfd3JhcF9hcm91bmRfd2luZG93OgorCW1vdgllYXgsIFtlc3ArNTJdICAgIC8qIGVheCA9IHdyaXRlICovCisJY21wCWVjeCwgZWF4CisJamJlCUxfY29udGlndW91c19pbl93aW5kb3cgLyogaWYgKHdyaXRlID49IG5ieXRlcykgKi8KKworCWFkZAllc2ksIFtlc3ArNDhdICAgIC8qIGZyb20gKz0gd3NpemUgKi8KKwlhZGQJZXNpLCBlYXggICAgICAgICAvKiBmcm9tICs9IHdyaXRlICovCisJc3ViCWVzaSwgZWN4ICAgICAgICAgLyogZnJvbSAtPSBuYnl0ZXMgKi8KKwlzdWIJZWN4LCBlYXggICAgICAgICAvKiBuYnl0ZXMgLT0gd3JpdGUgKi8KKworCW1vdgllYXgsIFtlc3ArNjRdICAgIC8qIGVheCA9IGxlbiAqLworCWNtcAllYXgsIGVjeAorCWpiZQlMX2RvX2NvcHkgICAgICAgICAgLyogaWYgKG5ieXRlcyA+PSBsZW4pICovCisKKwlzdWIJZWF4LCBlY3ggICAgICAgICAvKiBsZW4gLT0gbmJ5dGVzICovCisJcmVwICAgICBtb3ZzYgorCW1vdgllc2ksIFtlc3ArMjhdICAgICAvKiBmcm9tID0gd2luZG93ICovCisJbW92CWVjeCwgW2VzcCs1Ml0gICAgIC8qIG5ieXRlcyA9IHdyaXRlICovCisJY21wCWVheCwgZWN4CisJamJlCUxfZG9fY29weSAgICAgICAgICAvKiBpZiAobmJ5dGVzID49IGxlbikgKi8KKworCXN1YgllYXgsIGVjeCAgICAgICAgIC8qIGxlbiAtPSBuYnl0ZXMgKi8KKwlyZXAgICAgIG1vdnNiCisJbW92CWVzaSwgZWRpCisJc3ViCWVzaSwgZWJwICAgICAgICAgLyogZnJvbSA9IG91dCAtIGRpc3QgKi8KKwlqbXAJTF9kb19jb3B5CisKK0FMSUdOIDQKK0xfY29udGlndW91c19pbl93aW5kb3c6CisJYWRkCWVzaSwgZWF4CisJc3ViCWVzaSwgZWN4ICAgICAgICAgLyogZnJvbSArPSB3cml0ZSAtIG5ieXRlcyAqLworCisJbW92CWVheCwgW2VzcCs2NF0gICAgLyogZWF4ID0gbGVuICovCisJY21wCWVheCwgZWN4CisJamJlCUxfZG9fY29weSAgICAgICAgICAvKiBpZiAobmJ5dGVzID49IGxlbikgKi8KKworCXN1YgllYXgsIGVjeCAgICAgICAgIC8qIGxlbiAtPSBuYnl0ZXMgKi8KKwlyZXAgICAgIG1vdnNiCisJbW92CWVzaSwgZWRpCisJc3ViCWVzaSwgZWJwICAgICAgICAgLyogZnJvbSA9IG91dCAtIGRpc3QgKi8KKwlqbXAJTF9kb19jb3B5CisKK0FMSUdOIDQKK0xfZG9fY29weToKKwltb3YJZWN4LCBlYXgKKwlyZXAgICAgIG1vdnNiCisKKwltb3YJZXNpLCBbZXNwKzhdICAgICAgLyogbW92ZSBpbiBiYWNrIHRvICVlc2ksIHRvc3MgZnJvbSAqLworCW1vdgllYnAsIFtlc3ArMzJdICAgICAvKiBlYnAgPSBsY29kZSAqLworCWptcAlMX3doaWxlX3Rlc3QKKworTF90ZXN0X2Zvcl9lbmRfb2ZfYmxvY2s6CisJdGVzdAlhbCwgMzIKKwlqeglMX2ludmFsaWRfbGl0ZXJhbF9sZW5ndGhfY29kZQorCW1vdglkd29yZCBwdHIgW2VzcCs3Ml0sIDEKKwlqbXAJTF9icmVha19sb29wX3dpdGhfc3RhdHVzCisKK0xfaW52YWxpZF9saXRlcmFsX2xlbmd0aF9jb2RlOgorCW1vdglkd29yZCBwdHIgW2VzcCs3Ml0sIDIKKwlqbXAJTF9icmVha19sb29wX3dpdGhfc3RhdHVzCisKK0xfaW52YWxpZF9kaXN0YW5jZV9jb2RlOgorCW1vdglkd29yZCBwdHIgW2VzcCs3Ml0sIDMKKwlqbXAJTF9icmVha19sb29wX3dpdGhfc3RhdHVzCisKK0xfaW52YWxpZF9kaXN0YW5jZV90b29fZmFyOgorCW1vdgllc2ksIFtlc3ArNF0KKwltb3YJZHdvcmQgcHRyIFtlc3ArNzJdLCA0CisJam1wCUxfYnJlYWtfbG9vcF93aXRoX3N0YXR1cworCitMX2JyZWFrX2xvb3A6CisJbW92CWR3b3JkIHB0ciBbZXNwKzcyXSwgMAorCitMX2JyZWFrX2xvb3Bfd2l0aF9zdGF0dXM6CisvKiBwdXQgaW4sIG91dCwgYml0cywgYW5kIGhvbGQgYmFjayBpbnRvIGFyIGFuZCBwb3AgZXNwICovCisJbW92CVtlc3ArOF0sIGVzaSAgICAgLyogc2F2ZSBpbiAqLworCW1vdglbZXNwKzE2XSwgZWRpICAgIC8qIHNhdmUgb3V0ICovCisJbW92CVtlc3ArNDRdLCBlYnggICAgLyogc2F2ZSBiaXRzICovCisJbW92CVtlc3ArNDBdLCBlZHggICAgLyogc2F2ZSBob2xkICovCisJbW92CWVicCwgW2VzcCs0XSAgICAgLyogcmVzdG9yZSBlc3AsIGVicCAqLworCW1vdgllc3AsIFtlc3BdCisgICAgfQorI2Vsc2UKKyNlcnJvciAieDg2IGFyY2hpdGVjdHVyZSBub3QgZGVmaW5lZCIKKyNlbmRpZgorCisgICAgaWYgKGFyLnN0YXR1cyA+IDEpIHsKKyAgICAgICAgaWYgKGFyLnN0YXR1cyA9PSAyKQorICAgICAgICAgICAgc3RybS0+bXNnID0gImludmFsaWQgbGl0ZXJhbC9sZW5ndGggY29kZSI7CisgICAgICAgIGVsc2UgaWYgKGFyLnN0YXR1cyA9PSAzKQorICAgICAgICAgICAgc3RybS0+bXNnID0gImludmFsaWQgZGlzdGFuY2UgY29kZSI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHN0cm0tPm1zZyA9ICJpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayI7CisgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOworICAgIH0KKyAgICBlbHNlIGlmICggYXIuc3RhdHVzID09IDEgKSB7CisgICAgICAgIHN0YXRlLT5tb2RlID0gVFlQRTsKKyAgICB9CisKKyAgICAvKiByZXR1cm4gdW51c2VkIGJ5dGVzIChvbiBlbnRyeSwgYml0cyA8IDgsIHNvIGluIHdvbid0IGdvIHRvbyBmYXIgYmFjaykgKi8KKyAgICBhci5sZW4gPSBhci5iaXRzID4+IDM7CisgICAgYXIuaW4gLT0gYXIubGVuOworICAgIGFyLmJpdHMgLT0gYXIubGVuIDw8IDM7CisgICAgYXIuaG9sZCAmPSAoMVUgPDwgYXIuYml0cykgLSAxOworCisgICAgLyogdXBkYXRlIHN0YXRlIGFuZCByZXR1cm4gKi8KKyAgICBzdHJtLT5uZXh0X2luID0gYXIuaW47CisgICAgc3RybS0+bmV4dF9vdXQgPSBhci5vdXQ7CisgICAgc3RybS0+YXZhaWxfaW4gPSAodW5zaWduZWQpKGFyLmluIDwgYXIubGFzdCA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBRF9BVkFJTF9JTiArIChhci5sYXN0IC0gYXIuaW4pIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFEX0FWQUlMX0lOIC0gKGFyLmluIC0gYXIubGFzdCkpOworICAgIHN0cm0tPmF2YWlsX291dCA9ICh1bnNpZ25lZCkoYXIub3V0IDwgYXIuZW5kID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBRF9BVkFJTF9PVVQgKyAoYXIuZW5kIC0gYXIub3V0KSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQURfQVZBSUxfT1VUIC0gKGFyLm91dCAtIGFyLmVuZCkpOworICAgIHN0YXRlLT5ob2xkID0gYXIuaG9sZDsKKyAgICBzdGF0ZS0+Yml0cyA9IGFyLmJpdHM7CisgICAgcmV0dXJuOworfQorCmRpZmYgLS1naXQgYS96bGliLTEuMi42L2NvbnRyaWIvaW5mbGF0ZTg2L2luZmZhc3QuUyBiL3psaWItMS4yLjYvY29udHJpYi9pbmZsYXRlODYvaW5mZmFzdC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyNDVhMjkKLS0tIC9kZXYvbnVsbAorKysgYi96bGliLTEuMi42L2NvbnRyaWIvaW5mbGF0ZTg2L2luZmZhc3QuUwpAQCAtMCwwICsxLDEzNjggQEAKKy8qCisgKiBpbmZmYXN0LlMgaXMgYSBoYW5kIHR1bmVkIGFzc2VtYmxlciB2ZXJzaW9uIG9mOgorICoKKyAqIGluZmZhc3QuYyAtLSBmYXN0IGRlY29kaW5nCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMyBNYXJrIEFkbGVyCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzIENocmlzIEFuZGVyc29uIDxjaHJpc3RvcEBjaGFybS5uZXQ+CisgKiBQbGVhc2UgdXNlIHRoZSBjb3B5cmlnaHQgY29uZGl0aW9ucyBhYm92ZS4KKyAqCisgKiBUaGlzIHZlcnNpb24gKEphbi0yMy0yMDAzKSBvZiBpbmZsYXRlX2Zhc3Qgd2FzIGNvZGVkIGFuZCB0ZXN0ZWQgdW5kZXIKKyAqIEdOVS9MaW51eCBvbiBhIHBlbnRpdW0gMywgdXNpbmcgdGhlIGdjYy0zLjIgY29tcGlsZXIgZGlzdHJpYnV0aW9uLiAgT24gdGhhdAorICogbWFjaGluZSwgSSBmb3VuZCB0aGF0IGd6aXAgc3R5bGUgYXJjaGl2ZXMgZGVjb21wcmVzc2VkIGFib3V0IDIwJSBmYXN0ZXIgdGhhbgorICogdGhlIGdjYy0zLjIgLU8zIC1mb21pdC1mcmFtZS1wb2ludGVyIGNvbXBpbGVkIHZlcnNpb24uICBZb3VyIHJlc3VsdHMgd2lsbAorICogZGVwZW5kIG9uIGhvdyBsYXJnZSBvZiBhIGJ1ZmZlciBpcyB1c2VkIGZvciB6X3N0cmVhbS5uZXh0X2luICYgbmV4dF9vdXQKKyAqICg4Sy0zMksgd29ya2VkIGJlc3QgZm9yIG15IDI1NksgY3B1IGNhY2hlKSBhbmQgaG93IG11Y2ggb3ZlcmhlYWQgdGhlcmUgaXMgaW4KKyAqIHN0cmVhbSBwcm9jZXNzaW5nIEkvTyBhbmQgY3JjMzIvYWRkbGVyMzIuICBJbiBteSBjYXNlLCB0aGlzIHJvdXRpbmUgdXNlZAorICogNzAlIG9mIHRoZSBjcHUgdGltZSBhbmQgY3JjMzIgdXNlZCAyMCUuCisgKgorICogSSBhbSBjb25maWRlbnQgdGhhdCB0aGlzIHZlcnNpb24gd2lsbCB3b3JrIGluIHRoZSBnZW5lcmFsIGNhc2UsIGJ1dCBJIGhhdmUKKyAqIG5vdCB0ZXN0ZWQgYSB3aWRlIHZhcmlldHkgb2YgZGF0YXNldHMgb3IgYSB3aWRlIHZhcmlldHkgb2YgcGxhdGZvcm1zLgorICoKKyAqIEphbi0yNC0yMDAzIC0tIEFkZGVkIC1EVVNFX01NWCBkZWZpbmUgZm9yIHNsaWdodGx5IGZhc3RlciBpbmZsYXRpbmcuCisgKiBJdCBzaG91bGQgYmUgYSBydW50aW1lIGZsYWcgaW5zdGVhZCBvZiBjb21waWxlIHRpbWUgZmxhZy4uLgorICoKKyAqIEphbi0yNi0yMDAzIC0tIEFkZGVkIHJ1bnRpbWUgY2hlY2sgZm9yIE1NWCBzdXBwb3J0IHdpdGggY3B1aWQgaW5zdHJ1Y3Rpb24uCisgKiBXaXRoIC1EVVNFX01NWCwgb25seSBNTVggY29kZSBpcyBjb21waWxlZC4gIFdpdGggLUROT19NTVgsIG9ubHkgbm9uLU1NWCBjb2RlCisgKiBpcyBjb21waWxlZC4gIFdpdGhvdXQgZWl0aGVyIG9wdGlvbiwgcnVudGltZSBkZXRlY3Rpb24gaXMgZW5hYmxlZC4gIFJ1bnRpbWUKKyAqIGRldGVjdGlvbiBzaG91bGQgd29yayBvbiBhbGwgbW9kZXJuIGNwdXMgYW5kIHRoZSByZWNvbWVuZGVkIGFsZ29yaXRobSAoZmxpcAorICogSUQgYml0IG9uIGVmbGFncyBhbmQgdGhlbiB1c2UgdGhlIGNwdWlkIGluc3RydWN0aW9uKSBpcyB1c2VkIGluIG1hbnkKKyAqIG11bHRpbWVkaWEgYXBwbGljYXRpb25zLiAgVGVzdGVkIHVuZGVyIHdpbjJrIHdpdGggZ2NjLTIuOTUgYW5kIGdhcy0yLjEyCisgKiBkaXN0cmlidXRlZCB3aXRoIGN5Z3dpbjMuICBDb21waWxpbmcgd2l0aCBnY2MtMi45NSAtYyBpbmZmYXN0LlMgLW8KKyAqIGluZmZhc3Qub2JqIGdlbmVyYXRlcyBhIENPRkYgb2JqZWN0IHdoaWNoIGNhbiB0aGVuIGJlIGxpbmtlZCB3aXRoIE1TVkMrKworICogY29tcGlsZWQgY29kZS4gIFRlc3RlZCB1bmRlciBGcmVlQlNEIDQuNyB3aXRoIGdjYy0yLjk1LgorICoKKyAqIEphbi0yOC0yMDAzIC0tIFRlc3RlZCBBdGhsb24gWFAuLi4gTU1YIG1vZGUgaXMgc2xvd2VyIHRoYW4gbm8gTU1YIChhbmQKKyAqIHNsb3dlciB0aGFuIGNvbXBpbGVyIGdlbmVyYXRlZCBjb2RlKS4gIEFkanVzdGVkIGNwdWlkIGNoZWNrIHRvIHVzZSB0aGUgTU1YCisgKiBjb2RlIG9ubHkgZm9yIFBlbnRpdW1zIDwgUDQgdW50aWwgSSBoYXZlIG1vcmUgZGF0YSBvbiB0aGUgUDQuICBTcGVlZAorICogaW1wcm92bWVudCBpcyBvbmx5IGFib3V0IDE1JSBvbiB0aGUgQXRobG9uIHdoZW4gY29tcGFyZWQgd2l0aCBjb2RlIGdlbmVyYXRlZAorICogd2l0aCBNU1ZDKysuICBOb3Qgc3VyZSB5ZXQsIGJ1dCBJIHRoaW5rIHRoZSBQNCB3aWxsIGFsc28gYmUgc2xvd2VyIHVzaW5nIHRoZQorICogTU1YIG1vZGUgYmVjYXVzZSBtYW55IG9mIGl0J3MgeDg2IEFMVSBpbnN0cnVjdGlvbnMgZXhlY3V0ZSBpbiAuNSBjeWNsZXMgYW5kCisgKiBoYXZlIGxlc3MgbGF0ZW5jeSB0aGFuIE1NWCBvcHMuICBBZGRlZCBjb2RlIHRvIGJ1ZmZlciB0aGUgbGFzdCAxMSBieXRlcyBvZgorICogdGhlIGlucHV0IHN0cmVhbSBzaW5jZSB0aGUgTU1YIGNvZGUgZ3JhYnMgYml0cyBpbiBjaHVua3Mgb2YgMzIsIHdoaWNoCisgKiBkaWZmZXJzIGZyb20gdGhlIGluZmZhc3QuYyBhbGdvcml0aG0uICBJIGRvbid0IHRoaW5rIHRoZXJlIHdvdWxkIGhhdmUgYmVlbgorICogcmVhZCBvdmVycnVucyB3aGVyZSBhIHBhZ2UgYm91bmRhcnkgd2FzIGNyb3NzZWQgKGEgc2VnZmF1bHQpLCBidXQgdGhlcmUKKyAqIGNvdWxkIGhhdmUgYmVlbiBvdmVycnVucyB3aGVuIG5leHRfaW4gZW5kcyBvbiB1bmFsaWduZWQgbWVtb3J5ICh1bmludGlhbGl6ZWQKKyAqIG1lbW9yeSByZWFkKS4KKyAqCisgKiBNYXItMTMtMjAwMyAtLSBQNCBNTVggaXMgc2xpZ2h0bHkgc2xvd2VyIHRoYW4gUDQgTk9fTU1YLiAgSSBjcmVhdGVkIGEgQworICogdmVyc2lvbiBvZiB0aGUgbm9uLU1NWCBjb2RlIHNvIHRoYXQgaXQgZG9lc24ndCBkZXBlbmQgb24genN0cm0gYW5kIHpzdGF0ZQorICogc3RydWN0dXJlIG9mZnNldHMgd2hpY2ggYXJlIGhhcmQgY29kZWQgaW4gdGhpcyBmaWxlLiAgVGhpcyB3YXMgbGFzdCB0ZXN0ZWQKKyAqIHdpdGggemxpYi0xLjIuMCB3aGljaCBpcyBjdXJyZW50bHkgaW4gYmV0YSB0ZXN0aW5nLCBuZXdlciB2ZXJzaW9ucyBvZiB0aGlzCisgKiBhbmQgaW5mZmFzODYuYyBjYW4gYmUgZm91bmQgYXQgaHR0cDovL3d3dy5lZXRiZWV0ZWUuY29tL3psaWIvIGFuZAorICogaHR0cDovL3d3dy5jaGFybS5uZXQvfmNocmlzdG9wL3psaWIvCisgKi8KKworCisvKgorICogaWYgeW91IGhhdmUgdW5kZXJzY29yZSBsaW5raW5nIHByb2JsZW1zIChfaW5mbGF0ZV9mYXN0IHVuZGVmaW5lZCksIHRyeQorICogdXNpbmcgLURHQVNfQ09GRgorICovCisjaWYgISBkZWZpbmVkKCBHQVNfQ09GRiApICYmICEgZGVmaW5lZCggR0FTX0VMRiApCisKKyNpZiBkZWZpbmVkKCBXSU4zMiApIHx8IGRlZmluZWQoIF9fQ1lHV0lOX18gKQorI2RlZmluZSBHQVNfQ09GRiAvKiB3aW5kb3dzIG9iamVjdCBmb3JtYXQgKi8KKyNlbHNlCisjZGVmaW5lIEdBU19FTEYKKyNlbmRpZgorCisjZW5kaWYgLyogISBHQVNfQ09GRiAmJiAhIEdBU19FTEYgKi8KKworCisjaWYgZGVmaW5lZCggR0FTX0NPRkYgKQorCisvKiBjb2ZmIGV4dGVybmFscyBoYXZlIHVuZGVyc2NvcmVzICovCisjZGVmaW5lIGluZmxhdGVfZmFzdCBfaW5mbGF0ZV9mYXN0CisjZGVmaW5lIGluZmxhdGVfZmFzdF91c2VfbW14IF9pbmZsYXRlX2Zhc3RfdXNlX21teAorCisjZW5kaWYgLyogR0FTX0NPRkYgKi8KKworCisuZmlsZSAiaW5mZmFzdC5TIgorCisuZ2xvYmwgaW5mbGF0ZV9mYXN0CisKKy50ZXh0CisuYWxpZ24gNCwwCisuTF9pbnZhbGlkX2xpdGVyYWxfbGVuZ3RoX2NvZGVfbXNnOgorLnN0cmluZyAiaW52YWxpZCBsaXRlcmFsL2xlbmd0aCBjb2RlIgorCisuYWxpZ24gNCwwCisuTF9pbnZhbGlkX2Rpc3RhbmNlX2NvZGVfbXNnOgorLnN0cmluZyAiaW52YWxpZCBkaXN0YW5jZSBjb2RlIgorCisuYWxpZ24gNCwwCisuTF9pbnZhbGlkX2Rpc3RhbmNlX3Rvb19mYXJfbXNnOgorLnN0cmluZyAiaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2siCisKKyNpZiAhIGRlZmluZWQoIE5PX01NWCApCisuYWxpZ24gNCwwCisuTF9tYXNrOiAvKiBtYXNrW05dID0gKCAxIDw8IE4gKSAtIDEgKi8KKy5sb25nIDAKKy5sb25nIDEKKy5sb25nIDMKKy5sb25nIDcKKy5sb25nIDE1CisubG9uZyAzMQorLmxvbmcgNjMKKy5sb25nIDEyNworLmxvbmcgMjU1CisubG9uZyA1MTEKKy5sb25nIDEwMjMKKy5sb25nIDIwNDcKKy5sb25nIDQwOTUKKy5sb25nIDgxOTEKKy5sb25nIDE2MzgzCisubG9uZyAzMjc2NworLmxvbmcgNjU1MzUKKy5sb25nIDEzMTA3MQorLmxvbmcgMjYyMTQzCisubG9uZyA1MjQyODcKKy5sb25nIDEwNDg1NzUKKy5sb25nIDIwOTcxNTEKKy5sb25nIDQxOTQzMDMKKy5sb25nIDgzODg2MDcKKy5sb25nIDE2Nzc3MjE1CisubG9uZyAzMzU1NDQzMQorLmxvbmcgNjcxMDg4NjMKKy5sb25nIDEzNDIxNzcyNworLmxvbmcgMjY4NDM1NDU1CisubG9uZyA1MzY4NzA5MTEKKy5sb25nIDEwNzM3NDE4MjMKKy5sb25nIDIxNDc0ODM2NDcKKy5sb25nIDQyOTQ5NjcyOTUKKyNlbmRpZiAvKiBOT19NTVggKi8KKworLnRleHQKKworLyoKKyAqIHN0cnVjdCB6X3N0cmVhbSBvZmZzZXRzLCBpbiB6bGliLmgKKyAqLworI2RlZmluZSBuZXh0X2luX3N0cm0gICAwICAgLyogc3RybS0+bmV4dF9pbiAqLworI2RlZmluZSBhdmFpbF9pbl9zdHJtICA0ICAgLyogc3RybS0+YXZhaWxfaW4gKi8KKyNkZWZpbmUgbmV4dF9vdXRfc3RybSAgMTIgIC8qIHN0cm0tPm5leHRfb3V0ICovCisjZGVmaW5lIGF2YWlsX291dF9zdHJtIDE2ICAvKiBzdHJtLT5hdmFpbF9vdXQgKi8KKyNkZWZpbmUgbXNnX3N0cm0gICAgICAgMjQgIC8qIHN0cm0tPm1zZyAqLworI2RlZmluZSBzdGF0ZV9zdHJtICAgICAyOCAgLyogc3RybS0+c3RhdGUgKi8KKworLyoKKyAqIHN0cnVjdCBpbmZsYXRlX3N0YXRlIG9mZnNldHMsIGluIGluZmxhdGUuaAorICovCisjZGVmaW5lIG1vZGVfc3RhdGUgICAgIDAgICAvKiBzdGF0ZS0+bW9kZSAqLworI2RlZmluZSB3c2l6ZV9zdGF0ZSAgICAzMiAgLyogc3RhdGUtPndzaXplICovCisjZGVmaW5lIHdyaXRlX3N0YXRlICAgIDQwICAvKiBzdGF0ZS0+d3JpdGUgKi8KKyNkZWZpbmUgd2luZG93X3N0YXRlICAgNDQgIC8qIHN0YXRlLT53aW5kb3cgKi8KKyNkZWZpbmUgaG9sZF9zdGF0ZSAgICAgNDggIC8qIHN0YXRlLT5ob2xkICovCisjZGVmaW5lIGJpdHNfc3RhdGUgICAgIDUyICAvKiBzdGF0ZS0+Yml0cyAqLworI2RlZmluZSBsZW5jb2RlX3N0YXRlICA2OCAgLyogc3RhdGUtPmxlbmNvZGUgKi8KKyNkZWZpbmUgZGlzdGNvZGVfc3RhdGUgNzIgIC8qIHN0YXRlLT5kaXN0Y29kZSAqLworI2RlZmluZSBsZW5iaXRzX3N0YXRlICA3NiAgLyogc3RhdGUtPmxlbmJpdHMgKi8KKyNkZWZpbmUgZGlzdGJpdHNfc3RhdGUgODAgIC8qIHN0YXRlLT5kaXN0Yml0cyAqLworCisvKgorICogaW5mbGF0ZV9mYXN0J3MgYWN0aXZhdGlvbiByZWNvcmQKKyAqLworI2RlZmluZSBsb2NhbF92YXJfc2l6ZSA2NCAvKiBob3cgbXVjaCBsb2NhbCBzcGFjZSBmb3IgdmFycyAqLworI2RlZmluZSBzdHJtX3NwICAgICAgICA4OCAvKiBmaXJzdCBhcmc6IHpfc3RyZWFtICogKGxvY2FsX3Zhcl9zaXplICsgMjQpICovCisjZGVmaW5lIHN0YXJ0X3NwICAgICAgIDkyIC8qIHNlY29uZCBhcmc6IHVuc2lnbmVkIGludCAobG9jYWxfdmFyX3NpemUgKyAyOCkgKi8KKworLyoKKyAqIG9mZnNldHMgZm9yIGxvY2FsIHZhcnMgb24gc3RhY2sKKyAqLworI2RlZmluZSBvdXQgICAgICAgICAgICA2MCAgLyogdW5zaWduZWQgY2hhciogKi8KKyNkZWZpbmUgd2luZG93ICAgICAgICAgNTYgIC8qIHVuc2lnbmVkIGNoYXIqICovCisjZGVmaW5lIHdzaXplICAgICAgICAgIDUyICAvKiB1bnNpZ25lZCBpbnQgKi8KKyNkZWZpbmUgd3JpdGUgICAgICAgICAgNDggIC8qIHVuc2lnbmVkIGludCAqLworI2RlZmluZSBpbiAgICAgICAgICAgICA0NCAgLyogdW5zaWduZWQgY2hhciogKi8KKyNkZWZpbmUgYmVnICAgICAgICAgICAgNDAgIC8qIHVuc2lnbmVkIGNoYXIqICovCisjZGVmaW5lIGJ1ZiAgICAgICAgICAgIDI4ICAvKiBjaGFyWyAxMiBdICovCisjZGVmaW5lIGxlbiAgICAgICAgICAgIDI0ICAvKiB1bnNpZ25lZCBpbnQgKi8KKyNkZWZpbmUgbGFzdCAgICAgICAgICAgMjAgIC8qIHVuc2lnbmVkIGNoYXIqICovCisjZGVmaW5lIGVuZCAgICAgICAgICAgIDE2ICAvKiB1bnNpZ25lZCBjaGFyKiAqLworI2RlZmluZSBkY29kZSAgICAgICAgICAxMiAgLyogY29kZSogKi8KKyNkZWZpbmUgbGNvZGUgICAgICAgICAgIDggIC8qIGNvZGUqICovCisjZGVmaW5lIGRtYXNrICAgICAgICAgICA0ICAvKiB1bnNpZ25lZCBpbnQgKi8KKyNkZWZpbmUgbG1hc2sgICAgICAgICAgIDAgIC8qIHVuc2lnbmVkIGludCAqLworCisvKgorICogdHlwZWRlZiBlbnVtIGluZmxhdGVfbW9kZSBjb25zdHMsIGluIGluZmxhdGUuaAorICovCisjZGVmaW5lIElORkxBVEVfTU9ERV9UWVBFIDExICAvKiBzdGF0ZS0+bW9kZSBmbGFncyBlbnVtLWVkIGluIGluZmxhdGUuaCAqLworI2RlZmluZSBJTkZMQVRFX01PREVfQkFEICAyNgorCisKKyNpZiAhIGRlZmluZWQoIFVTRV9NTVggKSAmJiAhIGRlZmluZWQoIE5PX01NWCApCisKKyNkZWZpbmUgUlVOX1RJTUVfTU1YCisKKyNkZWZpbmUgQ0hFQ0tfTU1YICAgIDEKKyNkZWZpbmUgRE9fVVNFX01NWCAgIDIKKyNkZWZpbmUgRE9OVF9VU0VfTU1YIDMKKworLmdsb2JsIGluZmxhdGVfZmFzdF91c2VfbW14CisKKy5kYXRhCisKKy5hbGlnbiA0LDAKK2luZmxhdGVfZmFzdF91c2VfbW14OiAvKiBpbnRlZ2VyIGZsYWcgZm9yIHJ1biB0aW1lIGNvbnRyb2wgMT1jaGVjaywyPW1teCwzPW5vICovCisubG9uZyBDSEVDS19NTVgKKworI2lmIGRlZmluZWQoIEdBU19FTEYgKQorLyogZWxmIGluZm8gKi8KKy50eXBlICAgaW5mbGF0ZV9mYXN0X3VzZV9tbXgsQG9iamVjdAorLnNpemUgICBpbmZsYXRlX2Zhc3RfdXNlX21teCw0CisjZW5kaWYKKworI2VuZGlmIC8qIFJVTl9USU1FX01NWCAqLworCisjaWYgZGVmaW5lZCggR0FTX0NPRkYgKQorLyogY29mZiBpbmZvOiBzY2wgMiA9IGV4dGVybiwgdHlwZSAzMiA9IGZ1bmN0aW9uICovCisuZGVmIGluZmxhdGVfZmFzdDsgLnNjbCAyOyAudHlwZSAzMjsgLmVuZGVmCisjZW5kaWYKKworLnRleHQKKworLmFsaWduIDMyLDB4OTAKK2luZmxhdGVfZmFzdDoKKyAgICAgICAgcHVzaGwgICAlZWRpCisgICAgICAgIHB1c2hsICAgJWVzaQorICAgICAgICBwdXNobCAgICVlYnAKKyAgICAgICAgcHVzaGwgICAlZWJ4CisgICAgICAgIHB1c2hmICAgLyogc2F2ZSBlZmxhZ3MgKHN0cm1fc3AsIHN0YXRlX3NwIGFzc3VtZXMgdGhpcyBpcyAzMiBiaXRzKSAqLworICAgICAgICBzdWJsICAgICRsb2NhbF92YXJfc2l6ZSwgJWVzcAorICAgICAgICBjbGQKKworI2RlZmluZSBzdHJtX3IgICVlc2kKKyNkZWZpbmUgc3RhdGVfciAlZWRpCisKKyAgICAgICAgbW92bCAgICBzdHJtX3NwKCVlc3ApLCBzdHJtX3IKKyAgICAgICAgbW92bCAgICBzdGF0ZV9zdHJtKHN0cm1fciksIHN0YXRlX3IKKworICAgICAgICAvKiBpbiA9IHN0cm0tPm5leHRfaW47CisgICAgICAgICAqIG91dCA9IHN0cm0tPm5leHRfb3V0OworICAgICAgICAgKiBsYXN0ID0gaW4gKyBzdHJtLT5hdmFpbF9pbiAtIDExOworICAgICAgICAgKiBiZWcgPSBvdXQgLSAoc3RhcnQgLSBzdHJtLT5hdmFpbF9vdXQpOworICAgICAgICAgKiBlbmQgPSBvdXQgKyAoc3RybS0+YXZhaWxfb3V0IC0gMjU3KTsKKyAgICAgICAgICovCisgICAgICAgIG1vdmwgICAgYXZhaWxfaW5fc3RybShzdHJtX3IpLCAlZWR4CisgICAgICAgIG1vdmwgICAgbmV4dF9pbl9zdHJtKHN0cm1fciksICVlYXgKKworICAgICAgICBhZGRsICAgICVlYXgsICVlZHggICAgICAvKiBhdmFpbF9pbiArPSBuZXh0X2luICovCisgICAgICAgIHN1YmwgICAgJDExLCAlZWR4ICAgICAgIC8qIGF2YWlsX2luIC09IDExICovCisKKyAgICAgICAgbW92bCAgICAlZWF4LCBpbiglZXNwKQorICAgICAgICBtb3ZsICAgICVlZHgsIGxhc3QoJWVzcCkKKworICAgICAgICBtb3ZsICAgIHN0YXJ0X3NwKCVlc3ApLCAlZWJwCisgICAgICAgIG1vdmwgICAgYXZhaWxfb3V0X3N0cm0oc3RybV9yKSwgJWVjeAorICAgICAgICBtb3ZsICAgIG5leHRfb3V0X3N0cm0oc3RybV9yKSwgJWVieAorCisgICAgICAgIHN1YmwgICAgJWVjeCwgJWVicCAgICAgIC8qIHN0YXJ0IC09IGF2YWlsX291dCAqLworICAgICAgICBuZWdsICAgICVlYnAgICAgICAgICAgICAvKiBzdGFydCA9IC1zdGFydCAqLworICAgICAgICBhZGRsICAgICVlYngsICVlYnAgICAgICAvKiBzdGFydCArPSBuZXh0X291dCAqLworCisgICAgICAgIHN1YmwgICAgJDI1NywgJWVjeCAgICAgIC8qIGF2YWlsX291dCAtPSAyNTcgKi8KKyAgICAgICAgYWRkbCAgICAlZWJ4LCAlZWN4ICAgICAgLyogYXZhaWxfb3V0ICs9IG91dCAqLworCisgICAgICAgIG1vdmwgICAgJWVieCwgb3V0KCVlc3ApCisgICAgICAgIG1vdmwgICAgJWVicCwgYmVnKCVlc3ApCisgICAgICAgIG1vdmwgICAgJWVjeCwgZW5kKCVlc3ApCisKKyAgICAgICAgLyogd3NpemUgPSBzdGF0ZS0+d3NpemU7CisgICAgICAgICAqIHdyaXRlID0gc3RhdGUtPndyaXRlOworICAgICAgICAgKiB3aW5kb3cgPSBzdGF0ZS0+d2luZG93OworICAgICAgICAgKiBob2xkID0gc3RhdGUtPmhvbGQ7CisgICAgICAgICAqIGJpdHMgPSBzdGF0ZS0+Yml0czsKKyAgICAgICAgICogbGNvZGUgPSBzdGF0ZS0+bGVuY29kZTsKKyAgICAgICAgICogZGNvZGUgPSBzdGF0ZS0+ZGlzdGNvZGU7CisgICAgICAgICAqIGxtYXNrID0gKCAxIDw8IHN0YXRlLT5sZW5iaXRzICkgLSAxOworICAgICAgICAgKiBkbWFzayA9ICggMSA8PCBzdGF0ZS0+ZGlzdGJpdHMgKSAtIDE7CisgICAgICAgICAqLworCisgICAgICAgIG1vdmwgICAgbGVuY29kZV9zdGF0ZShzdGF0ZV9yKSwgJWVheAorICAgICAgICBtb3ZsICAgIGRpc3Rjb2RlX3N0YXRlKHN0YXRlX3IpLCAlZWN4CisKKyAgICAgICAgbW92bCAgICAlZWF4LCBsY29kZSglZXNwKQorICAgICAgICBtb3ZsICAgICVlY3gsIGRjb2RlKCVlc3ApCisKKyAgICAgICAgbW92bCAgICAkMSwgJWVheAorICAgICAgICBtb3ZsICAgIGxlbmJpdHNfc3RhdGUoc3RhdGVfciksICVlY3gKKyAgICAgICAgc2hsbCAgICAlY2wsICVlYXgKKyAgICAgICAgZGVjbCAgICAlZWF4CisgICAgICAgIG1vdmwgICAgJWVheCwgbG1hc2soJWVzcCkKKworICAgICAgICBtb3ZsICAgICQxLCAlZWF4CisgICAgICAgIG1vdmwgICAgZGlzdGJpdHNfc3RhdGUoc3RhdGVfciksICVlY3gKKyAgICAgICAgc2hsbCAgICAlY2wsICVlYXgKKyAgICAgICAgZGVjbCAgICAlZWF4CisgICAgICAgIG1vdmwgICAgJWVheCwgZG1hc2soJWVzcCkKKworICAgICAgICBtb3ZsICAgIHdzaXplX3N0YXRlKHN0YXRlX3IpLCAlZWF4CisgICAgICAgIG1vdmwgICAgd3JpdGVfc3RhdGUoc3RhdGVfciksICVlY3gKKyAgICAgICAgbW92bCAgICB3aW5kb3dfc3RhdGUoc3RhdGVfciksICVlZHgKKworICAgICAgICBtb3ZsICAgICVlYXgsIHdzaXplKCVlc3ApCisgICAgICAgIG1vdmwgICAgJWVjeCwgd3JpdGUoJWVzcCkKKyAgICAgICAgbW92bCAgICAlZWR4LCB3aW5kb3coJWVzcCkKKworICAgICAgICBtb3ZsICAgIGhvbGRfc3RhdGUoc3RhdGVfciksICVlYnAKKyAgICAgICAgbW92bCAgICBiaXRzX3N0YXRlKHN0YXRlX3IpLCAlZWJ4CisKKyN1bmRlZiBzdHJtX3IKKyN1bmRlZiBzdGF0ZV9yCisKKyNkZWZpbmUgaW5fciAgICAgICAlZXNpCisjZGVmaW5lIGZyb21fciAgICAgJWVzaQorI2RlZmluZSBvdXRfciAgICAgICVlZGkKKworICAgICAgICBtb3ZsICAgIGluKCVlc3ApLCBpbl9yCisgICAgICAgIG1vdmwgICAgbGFzdCglZXNwKSwgJWVjeAorICAgICAgICBjbXBsICAgIGluX3IsICVlY3gKKyAgICAgICAgamEgICAgICAuTF9hbGlnbl9sb25nICAgICAgICAgICAvKiBpZiBpbiA8IGxhc3QgKi8KKworICAgICAgICBhZGRsICAgICQxMSwgJWVjeCAgICAgICAgICAgICAgIC8qIGVjeCA9ICZpblsgYXZhaWxfaW4gXSAqLworICAgICAgICBzdWJsICAgIGluX3IsICVlY3ggICAgICAgICAgICAgIC8qIGVjeCA9IGF2YWlsX2luICovCisgICAgICAgIG1vdmwgICAgJDEyLCAlZWF4CisgICAgICAgIHN1YmwgICAgJWVjeCwgJWVheCAgICAgICAgICAgICAgLyogZWF4ID0gMTIgLSBhdmFpbF9pbiAqLworICAgICAgICBsZWFsICAgIGJ1ZiglZXNwKSwgJWVkaQorICAgICAgICByZXAgICAgIG1vdnNiICAgICAgICAgICAgICAgICAgIC8qIG1lbWNweSggYnVmLCBpbiwgYXZhaWxfaW4gKSAqLworICAgICAgICBtb3ZsICAgICVlYXgsICVlY3gKKyAgICAgICAgeG9ybCAgICAlZWF4LCAlZWF4CisgICAgICAgIHJlcCAgICAgc3Rvc2IgICAgICAgICAvKiBtZW1zZXQoICZidWZbIGF2YWlsX2luIF0sIDAsIDEyIC0gYXZhaWxfaW4gKSAqLworICAgICAgICBsZWFsICAgIGJ1ZiglZXNwKSwgaW5fciAgICAgICAgIC8qIGluID0gYnVmICovCisgICAgICAgIG1vdmwgICAgaW5fciwgbGFzdCglZXNwKSAgICAgICAgLyogbGFzdCA9IGluLCBkbyBqdXN0IG9uZSBpdGVyYXRpb24gKi8KKyAgICAgICAgam1wICAgICAuTF9pc19hbGlnbmVkCisKKyAgICAgICAgLyogYWxpZ24gaW5fciBvbiBsb25nIGJvdW5kYXJ5ICovCisuTF9hbGlnbl9sb25nOgorICAgICAgICB0ZXN0bCAgICQzLCBpbl9yCisgICAgICAgIGp6ICAgICAgLkxfaXNfYWxpZ25lZAorICAgICAgICB4b3JsICAgICVlYXgsICVlYXgKKyAgICAgICAgbW92YiAgICAoaW5fciksICVhbAorICAgICAgICBpbmNsICAgIGluX3IKKyAgICAgICAgbW92bCAgICAlZWJ4LCAlZWN4CisgICAgICAgIGFkZGwgICAgJDgsICVlYngKKyAgICAgICAgc2hsbCAgICAlY2wsICVlYXgKKyAgICAgICAgb3JsICAgICAlZWF4LCAlZWJwCisgICAgICAgIGptcCAgICAgLkxfYWxpZ25fbG9uZworCisuTF9pc19hbGlnbmVkOgorICAgICAgICBtb3ZsICAgIG91dCglZXNwKSwgb3V0X3IKKworI2lmIGRlZmluZWQoIE5PX01NWCApCisgICAgICAgIGptcCAgICAgLkxfZG9fbG9vcAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKCBVU0VfTU1YICkKKyAgICAgICAgam1wICAgICAuTF9pbml0X21teAorI2VuZGlmCisKKy8qKiogUnVudGltZSBNTVggY2hlY2sgKioqLworCisjaWYgZGVmaW5lZCggUlVOX1RJTUVfTU1YICkKKy5MX2NoZWNrX21teDoKKyAgICAgICAgY21wbCAgICAkRE9fVVNFX01NWCwgaW5mbGF0ZV9mYXN0X3VzZV9tbXgKKyAgICAgICAgamUgICAgICAuTF9pbml0X21teAorICAgICAgICBqYSAgICAgIC5MX2RvX2xvb3AgLyogPiAyICovCisKKyAgICAgICAgcHVzaGwgICAlZWF4CisgICAgICAgIHB1c2hsICAgJWVieAorICAgICAgICBwdXNobCAgICVlY3gKKyAgICAgICAgcHVzaGwgICAlZWR4CisgICAgICAgIHB1c2hmCisgICAgICAgIG1vdmwgICAgKCVlc3ApLCAlZWF4ICAgICAgLyogY29weSBlZmxhZ3MgdG8gZWF4ICovCisgICAgICAgIHhvcmwgICAgJDB4MjAwMDAwLCAoJWVzcCkgLyogdHJ5IHRvZ2dsaW5nIElEIGJpdCBvZiBlZmxhZ3MgKGJpdCAyMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB0byBzZWUgaWYgY3B1IHN1cHBvcnRzIGNwdWlkLi4uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogSUQgYml0IG1ldGhvZCBub3Qgc3VwcG9ydGVkIGJ5IE5leEdlbiBidXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBiaW9zIG1heSBsb2FkIGEgY3B1aWQgaW5zdHJ1Y3Rpb24gYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogY3B1aWQgbWF5IGJlIGRpc2FibGVkIG9uIEN5cml4IDUtNng4NiAqLworICAgICAgICBwb3BmCisgICAgICAgIHB1c2hmCisgICAgICAgIHBvcGwgICAgJWVkeCAgICAgICAgICAgICAgLyogY29weSBuZXcgZWZsYWdzIHRvIGVkeCAqLworICAgICAgICB4b3JsICAgICVlYXgsICVlZHggICAgICAgIC8qIHRlc3QgaWYgSUQgYml0IGlzIGZsaXBwZWQgKi8KKyAgICAgICAganogICAgICAuTF9kb250X3VzZV9tbXggICAvKiBub3QgZmxpcHBlZCBpZiB6ZXJvICovCisgICAgICAgIHhvcmwgICAgJWVheCwgJWVheAorICAgICAgICBjcHVpZAorICAgICAgICBjbXBsICAgICQweDc1NmU2NTQ3LCAlZWJ4IC8qIGNoZWNrIGZvciBHZW51aW5lSW50ZWwgaW4gZWJ4LGVjeCxlZHggKi8KKyAgICAgICAgam5lICAgICAuTF9kb250X3VzZV9tbXgKKyAgICAgICAgY21wbCAgICAkMHg2YzY1NzQ2ZSwgJWVjeAorICAgICAgICBqbmUgICAgIC5MX2RvbnRfdXNlX21teAorICAgICAgICBjbXBsICAgICQweDQ5NjU2ZTY5LCAlZWR4CisgICAgICAgIGpuZSAgICAgLkxfZG9udF91c2VfbW14CisgICAgICAgIG1vdmwgICAgJDEsICVlYXgKKyAgICAgICAgY3B1aWQgICAgICAgICAgICAgICAgICAgICAvKiBnZXQgY3B1IGZlYXR1cmVzICovCisgICAgICAgIHNocmwgICAgJDgsICVlYXgKKyAgICAgICAgYW5kbCAgICAkMTUsICVlYXgKKyAgICAgICAgY21wbCAgICAkNiwgJWVheCAgICAgICAgICAvKiBjaGVjayBmb3IgUGVudGl1bSBmYW1pbHksIGlzIDB4ZiBmb3IgUDQgKi8KKyAgICAgICAgam5lICAgICAuTF9kb250X3VzZV9tbXgKKyAgICAgICAgdGVzdGwgICAkMHg4MDAwMDAsICVlZHggICAvKiB0ZXN0IGlmIE1NWCBmZWF0dXJlIGlzIHNldCAoYml0IDIzKSAqLworICAgICAgICBqbnogICAgIC5MX3VzZV9tbXgKKyAgICAgICAgam1wICAgICAuTF9kb250X3VzZV9tbXgKKy5MX3VzZV9tbXg6CisgICAgICAgIG1vdmwgICAgJERPX1VTRV9NTVgsIGluZmxhdGVfZmFzdF91c2VfbW14CisgICAgICAgIGptcCAgICAgLkxfY2hlY2tfbW14X3BvcAorLkxfZG9udF91c2VfbW14OgorICAgICAgICBtb3ZsICAgICRET05UX1VTRV9NTVgsIGluZmxhdGVfZmFzdF91c2VfbW14CisuTF9jaGVja19tbXhfcG9wOgorICAgICAgICBwb3BsICAgICVlZHgKKyAgICAgICAgcG9wbCAgICAlZWN4CisgICAgICAgIHBvcGwgICAgJWVieAorICAgICAgICBwb3BsICAgICVlYXgKKyAgICAgICAgam1wICAgICAuTF9jaGVja19tbXgKKyNlbmRpZgorCisKKy8qKiogTm9uLU1NWCBjb2RlICoqKi8KKworI2lmIGRlZmluZWQgKCBOT19NTVggKSB8fCBkZWZpbmVkKCBSVU5fVElNRV9NTVggKQorCisjZGVmaW5lIGhvbGRfciAgICAgJWVicAorI2RlZmluZSBiaXRzX3IgICAgICVibAorI2RlZmluZSBiaXRzbG9uZ19yICVlYngKKworLmFsaWduIDMyLDB4OTAKKy5MX3doaWxlX3Rlc3Q6CisgICAgICAgIC8qIHdoaWxlIChpbiA8IGxhc3QgJiYgb3V0IDwgZW5kKQorICAgICAgICAgKi8KKyAgICAgICAgY21wbCAgICBvdXRfciwgZW5kKCVlc3ApCisgICAgICAgIGpiZSAgICAgLkxfYnJlYWtfbG9vcCAgICAgICAgICAgLyogaWYgKG91dCA+PSBlbmQpICovCisKKyAgICAgICAgY21wbCAgICBpbl9yLCBsYXN0KCVlc3ApCisgICAgICAgIGpiZSAgICAgLkxfYnJlYWtfbG9vcAorCisuTF9kb19sb29wOgorICAgICAgICAvKiByZWdzOiAlZXNpID0gaW4sICVlYnAgPSBob2xkLCAlYmwgPSBiaXRzLCAlZWRpID0gb3V0CisgICAgICAgICAqCisgICAgICAgICAqIGRvIHsKKyAgICAgICAgICogICBpZiAoYml0cyA8IDE1KSB7CisgICAgICAgICAqICAgICBob2xkIHw9ICooKHVuc2lnbmVkIHNob3J0ICopaW4pKysgPDwgYml0czsKKyAgICAgICAgICogICAgIGJpdHMgKz0gMTYKKyAgICAgICAgICogICB9CisgICAgICAgICAqICAgdGhpcyA9IGxjb2RlW2hvbGQgJiBsbWFza10KKyAgICAgICAgICovCisgICAgICAgIGNtcGIgICAgJDE1LCBiaXRzX3IKKyAgICAgICAgamEgICAgICAuTF9nZXRfbGVuZ3RoX2NvZGUgICAgICAvKiBpZiAoMTUgPCBiaXRzKSAqLworCisgICAgICAgIHhvcmwgICAgJWVheCwgJWVheAorICAgICAgICBsb2RzdyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFsID0gKih1c2hvcnQgKilpbisrICovCisgICAgICAgIG1vdmIgICAgYml0c19yLCAlY2wgICAgICAgICAgICAgLyogY2wgPSBiaXRzLCBuZWVkcyBpdCBmb3Igc2hpZnRpbmcgKi8KKyAgICAgICAgYWRkYiAgICAkMTYsIGJpdHNfciAgICAgICAgICAgICAvKiBiaXRzICs9IDE2ICovCisgICAgICAgIHNobGwgICAgJWNsLCAlZWF4CisgICAgICAgIG9ybCAgICAgJWVheCwgaG9sZF9yICAgICAgICAgICAgLyogaG9sZCB8PSAqKCh1c2hvcnQgKilpbikrKyA8PCBiaXRzICovCisKKy5MX2dldF9sZW5ndGhfY29kZToKKyAgICAgICAgbW92bCAgICBsbWFzayglZXNwKSwgJWVkeCAgICAgICAvKiBlZHggPSBsbWFzayAqLworICAgICAgICBtb3ZsICAgIGxjb2RlKCVlc3ApLCAlZWN4ICAgICAgIC8qIGVjeCA9IGxjb2RlICovCisgICAgICAgIGFuZGwgICAgaG9sZF9yLCAlZWR4ICAgICAgICAgICAgLyogZWR4ICY9IGhvbGQgKi8KKyAgICAgICAgbW92bCAgICAoJWVjeCwlZWR4LDQpLCAlZWF4ICAgICAvKiBlYXggPSBsY29kZVtob2xkICYgbG1hc2tdICovCisKKy5MX2RvbGVuOgorICAgICAgICAvKiByZWdzOiAlZXNpID0gaW4sICVlYnAgPSBob2xkLCAlYmwgPSBiaXRzLCAlZWRpID0gb3V0CisgICAgICAgICAqCisgICAgICAgICAqIGRvbGVuOgorICAgICAgICAgKiAgICBiaXRzIC09IHRoaXMuYml0czsKKyAgICAgICAgICogICAgaG9sZCA+Pj0gdGhpcy5iaXRzCisgICAgICAgICAqLworICAgICAgICBtb3ZiICAgICVhaCwgJWNsICAgICAgICAgICAgICAgIC8qIGNsID0gdGhpcy5iaXRzICovCisgICAgICAgIHN1YmIgICAgJWFoLCBiaXRzX3IgICAgICAgICAgICAgLyogYml0cyAtPSB0aGlzLmJpdHMgKi8KKyAgICAgICAgc2hybCAgICAlY2wsIGhvbGRfciAgICAgICAgICAgICAvKiBob2xkID4+PSB0aGlzLmJpdHMgKi8KKworICAgICAgICAvKiBjaGVjayBpZiBvcCBpcyBhIGxpdGVyYWwKKyAgICAgICAgICogaWYgKG9wID09IDApIHsKKyAgICAgICAgICogICAgUFVQKG91dCkgPSB0aGlzLnZhbDsKKyAgICAgICAgICogIH0KKyAgICAgICAgICovCisgICAgICAgIHRlc3RiICAgJWFsLCAlYWwKKyAgICAgICAgam56ICAgICAuTF90ZXN0X2Zvcl9sZW5ndGhfYmFzZSAvKiBpZiAob3AgIT0gMCkgNDUuNyUgKi8KKworICAgICAgICBzaHJsICAgICQxNiwgJWVheCAgICAgICAgICAgICAgIC8qIG91dHB1dCB0aGlzLnZhbCBjaGFyICovCisgICAgICAgIHN0b3NiCisgICAgICAgIGptcCAgICAgLkxfd2hpbGVfdGVzdAorCisuTF90ZXN0X2Zvcl9sZW5ndGhfYmFzZToKKyAgICAgICAgLyogcmVnczogJWVzaSA9IGluLCAlZWJwID0gaG9sZCwgJWJsID0gYml0cywgJWVkaSA9IG91dCwgJWVkeCA9IGxlbgorICAgICAgICAgKgorICAgICAgICAgKiBlbHNlIGlmIChvcCAmIDE2KSB7CisgICAgICAgICAqICAgbGVuID0gdGhpcy52YWwKKyAgICAgICAgICogICBvcCAmPSAxNQorICAgICAgICAgKiAgIGlmIChvcCkgeworICAgICAgICAgKiAgICAgaWYgKG9wID4gYml0cykgeworICAgICAgICAgKiAgICAgICBob2xkIHw9ICooKHVuc2lnbmVkIHNob3J0ICopaW4pKysgPDwgYml0czsKKyAgICAgICAgICogICAgICAgYml0cyArPSAxNgorICAgICAgICAgKiAgICAgfQorICAgICAgICAgKiAgICAgbGVuICs9IGhvbGQgJiBtYXNrW29wXTsKKyAgICAgICAgICogICAgIGJpdHMgLT0gb3A7CisgICAgICAgICAqICAgICBob2xkID4+PSBvcDsKKyAgICAgICAgICogICB9CisgICAgICAgICAqLworI2RlZmluZSBsZW5fciAlZWR4CisgICAgICAgIG1vdmwgICAgJWVheCwgbGVuX3IgICAgICAgICAgICAgLyogbGVuID0gdGhpcyAqLworICAgICAgICBzaHJsICAgICQxNiwgbGVuX3IgICAgICAgICAgICAgIC8qIGxlbiA9IHRoaXMudmFsICovCisgICAgICAgIG1vdmIgICAgJWFsLCAlY2wKKworICAgICAgICB0ZXN0YiAgICQxNiwgJWFsCisgICAgICAgIGp6ICAgICAgLkxfdGVzdF9mb3Jfc2Vjb25kX2xldmVsX2xlbmd0aCAvKiBpZiAoKG9wICYgMTYpID09IDApIDglICovCisgICAgICAgIGFuZGIgICAgJDE1LCAlY2wgICAgICAgICAgICAgICAgLyogb3AgJj0gMTUgKi8KKyAgICAgICAganogICAgICAuTF9zYXZlX2xlbiAgICAgICAgICAgICAvKiBpZiAoIW9wKSAqLworICAgICAgICBjbXBiICAgICVjbCwgYml0c19yCisgICAgICAgIGphZSAgICAgLkxfYWRkX2JpdHNfdG9fbGVuICAgICAgLyogaWYgKG9wIDw9IGJpdHMpICovCisKKyAgICAgICAgbW92YiAgICAlY2wsICVjaCAgICAgICAgICAgICAgICAvKiBzdGFzaCBvcCBpbiBjaCwgZnJlZWluZyBjbCAqLworICAgICAgICB4b3JsICAgICVlYXgsICVlYXgKKyAgICAgICAgbG9kc3cgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbCA9ICoodXNob3J0ICopaW4rKyAqLworICAgICAgICBtb3ZiICAgIGJpdHNfciwgJWNsICAgICAgICAgICAgIC8qIGNsID0gYml0cywgbmVlZHMgaXQgZm9yIHNoaWZ0aW5nICovCisgICAgICAgIGFkZGIgICAgJDE2LCBiaXRzX3IgICAgICAgICAgICAgLyogYml0cyArPSAxNiAqLworICAgICAgICBzaGxsICAgICVjbCwgJWVheAorICAgICAgICBvcmwgICAgICVlYXgsIGhvbGRfciAgICAgICAgICAgIC8qIGhvbGQgfD0gKigodXNob3J0ICopaW4pKysgPDwgYml0cyAqLworICAgICAgICBtb3ZiICAgICVjaCwgJWNsICAgICAgICAgICAgICAgIC8qIG1vdmUgb3AgYmFjayB0byBlY3ggKi8KKworLkxfYWRkX2JpdHNfdG9fbGVuOgorICAgICAgICBtb3ZsICAgICQxLCAlZWF4CisgICAgICAgIHNobGwgICAgJWNsLCAlZWF4CisgICAgICAgIGRlY2wgICAgJWVheAorICAgICAgICBzdWJiICAgICVjbCwgYml0c19yCisgICAgICAgIGFuZGwgICAgaG9sZF9yLCAlZWF4ICAgICAgICAgICAgLyogZWF4ICY9IGhvbGQgKi8KKyAgICAgICAgc2hybCAgICAlY2wsIGhvbGRfcgorICAgICAgICBhZGRsICAgICVlYXgsIGxlbl9yICAgICAgICAgICAgIC8qIGxlbiArPSBob2xkICYgbWFza1tvcF0gKi8KKworLkxfc2F2ZV9sZW46CisgICAgICAgIG1vdmwgICAgbGVuX3IsIGxlbiglZXNwKSAgICAgICAgLyogc2F2ZSBsZW4gKi8KKyN1bmRlZiAgbGVuX3IKKworLkxfZGVjb2RlX2Rpc3RhbmNlOgorICAgICAgICAvKiByZWdzOiAlZXNpID0gaW4sICVlYnAgPSBob2xkLCAlYmwgPSBiaXRzLCAlZWRpID0gb3V0LCAlZWR4ID0gZGlzdAorICAgICAgICAgKgorICAgICAgICAgKiAgIGlmIChiaXRzIDwgMTUpIHsKKyAgICAgICAgICogICAgIGhvbGQgfD0gKigodW5zaWduZWQgc2hvcnQgKilpbikrKyA8PCBiaXRzOworICAgICAgICAgKiAgICAgYml0cyArPSAxNgorICAgICAgICAgKiAgIH0KKyAgICAgICAgICogICB0aGlzID0gZGNvZGVbaG9sZCAmIGRtYXNrXTsKKyAgICAgICAgICogZG9kaXN0OgorICAgICAgICAgKiAgIGJpdHMgLT0gdGhpcy5iaXRzOworICAgICAgICAgKiAgIGhvbGQgPj49IHRoaXMuYml0czsKKyAgICAgICAgICogICBvcCA9IHRoaXMub3A7CisgICAgICAgICAqLworCisgICAgICAgIGNtcGIgICAgJDE1LCBiaXRzX3IKKyAgICAgICAgamEgICAgICAuTF9nZXRfZGlzdGFuY2VfY29kZSAgICAvKiBpZiAoMTUgPCBiaXRzKSAqLworCisgICAgICAgIHhvcmwgICAgJWVheCwgJWVheAorICAgICAgICBsb2RzdyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFsID0gKih1c2hvcnQgKilpbisrICovCisgICAgICAgIG1vdmIgICAgYml0c19yLCAlY2wgICAgICAgICAgICAgLyogY2wgPSBiaXRzLCBuZWVkcyBpdCBmb3Igc2hpZnRpbmcgKi8KKyAgICAgICAgYWRkYiAgICAkMTYsIGJpdHNfciAgICAgICAgICAgICAvKiBiaXRzICs9IDE2ICovCisgICAgICAgIHNobGwgICAgJWNsLCAlZWF4CisgICAgICAgIG9ybCAgICAgJWVheCwgaG9sZF9yICAgICAgICAgICAgLyogaG9sZCB8PSAqKCh1c2hvcnQgKilpbikrKyA8PCBiaXRzICovCisKKy5MX2dldF9kaXN0YW5jZV9jb2RlOgorICAgICAgICBtb3ZsICAgIGRtYXNrKCVlc3ApLCAlZWR4ICAgICAgIC8qIGVkeCA9IGRtYXNrICovCisgICAgICAgIG1vdmwgICAgZGNvZGUoJWVzcCksICVlY3ggICAgICAgLyogZWN4ID0gZGNvZGUgKi8KKyAgICAgICAgYW5kbCAgICBob2xkX3IsICVlZHggICAgICAgICAgICAvKiBlZHggJj0gaG9sZCAqLworICAgICAgICBtb3ZsICAgICglZWN4LCVlZHgsNCksICVlYXggICAgIC8qIGVheCA9IGRjb2RlW2hvbGQgJiBkbWFza10gKi8KKworI2RlZmluZSBkaXN0X3IgJWVkeAorLkxfZG9kaXN0OgorICAgICAgICBtb3ZsICAgICVlYXgsIGRpc3RfciAgICAgICAgICAgIC8qIGRpc3QgPSB0aGlzICovCisgICAgICAgIHNocmwgICAgJDE2LCBkaXN0X3IgICAgICAgICAgICAgLyogZGlzdCA9IHRoaXMudmFsICovCisgICAgICAgIG1vdmIgICAgJWFoLCAlY2wKKyAgICAgICAgc3ViYiAgICAlYWgsIGJpdHNfciAgICAgICAgICAgICAvKiBiaXRzIC09IHRoaXMuYml0cyAqLworICAgICAgICBzaHJsICAgICVjbCwgaG9sZF9yICAgICAgICAgICAgIC8qIGhvbGQgPj49IHRoaXMuYml0cyAqLworCisgICAgICAgIC8qIGlmIChvcCAmIDE2KSB7CisgICAgICAgICAqICAgZGlzdCA9IHRoaXMudmFsCisgICAgICAgICAqICAgb3AgJj0gMTUKKyAgICAgICAgICogICBpZiAob3AgPiBiaXRzKSB7CisgICAgICAgICAqICAgICBob2xkIHw9ICooKHVuc2lnbmVkIHNob3J0ICopaW4pKysgPDwgYml0czsKKyAgICAgICAgICogICAgIGJpdHMgKz0gMTYKKyAgICAgICAgICogICB9CisgICAgICAgICAqICAgZGlzdCArPSBob2xkICYgbWFza1tvcF07CisgICAgICAgICAqICAgYml0cyAtPSBvcDsKKyAgICAgICAgICogICBob2xkID4+PSBvcDsKKyAgICAgICAgICovCisgICAgICAgIG1vdmIgICAgJWFsLCAlY2wgICAgICAgICAgICAgICAgLyogY2wgPSB0aGlzLm9wICovCisKKyAgICAgICAgdGVzdGIgICAkMTYsICVhbCAgICAgICAgICAgICAgICAvKiBpZiAoKG9wICYgMTYpID09IDApICovCisgICAgICAgIGp6ICAgICAgLkxfdGVzdF9mb3Jfc2Vjb25kX2xldmVsX2Rpc3QKKyAgICAgICAgYW5kYiAgICAkMTUsICVjbCAgICAgICAgICAgICAgICAvKiBvcCAmPSAxNSAqLworICAgICAgICBqeiAgICAgIC5MX2NoZWNrX2Rpc3Rfb25lCisgICAgICAgIGNtcGIgICAgJWNsLCBiaXRzX3IKKyAgICAgICAgamFlICAgICAuTF9hZGRfYml0c190b19kaXN0ICAgICAvKiBpZiAob3AgPD0gYml0cykgOTcuNiUgKi8KKworICAgICAgICBtb3ZiICAgICVjbCwgJWNoICAgICAgICAgICAgICAgIC8qIHN0YXNoIG9wIGluIGNoLCBmcmVlaW5nIGNsICovCisgICAgICAgIHhvcmwgICAgJWVheCwgJWVheAorICAgICAgICBsb2RzdyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFsID0gKih1c2hvcnQgKilpbisrICovCisgICAgICAgIG1vdmIgICAgYml0c19yLCAlY2wgICAgICAgICAgICAgLyogY2wgPSBiaXRzLCBuZWVkcyBpdCBmb3Igc2hpZnRpbmcgKi8KKyAgICAgICAgYWRkYiAgICAkMTYsIGJpdHNfciAgICAgICAgICAgICAvKiBiaXRzICs9IDE2ICovCisgICAgICAgIHNobGwgICAgJWNsLCAlZWF4CisgICAgICAgIG9ybCAgICAgJWVheCwgaG9sZF9yICAgICAgICAgICAgLyogaG9sZCB8PSAqKCh1c2hvcnQgKilpbikrKyA8PCBiaXRzICovCisgICAgICAgIG1vdmIgICAgJWNoLCAlY2wgICAgICAgICAgICAgICAgLyogbW92ZSBvcCBiYWNrIHRvIGVjeCAqLworCisuTF9hZGRfYml0c190b19kaXN0OgorICAgICAgICBtb3ZsICAgICQxLCAlZWF4CisgICAgICAgIHNobGwgICAgJWNsLCAlZWF4CisgICAgICAgIGRlY2wgICAgJWVheCAgICAgICAgICAgICAgICAgICAgLyogKDEgPDwgb3ApIC0gMSAqLworICAgICAgICBzdWJiICAgICVjbCwgYml0c19yCisgICAgICAgIGFuZGwgICAgaG9sZF9yLCAlZWF4ICAgICAgICAgICAgLyogZWF4ICY9IGhvbGQgKi8KKyAgICAgICAgc2hybCAgICAlY2wsIGhvbGRfcgorICAgICAgICBhZGRsICAgICVlYXgsIGRpc3RfciAgICAgICAgICAgIC8qIGRpc3QgKz0gaG9sZCAmICgoMSA8PCBvcCkgLSAxKSAqLworICAgICAgICBqbXAgICAgIC5MX2NoZWNrX3dpbmRvdworCisuTF9jaGVja193aW5kb3c6CisgICAgICAgIC8qIHJlZ3M6ICVlc2kgPSBmcm9tLCAlZWJwID0gaG9sZCwgJWJsID0gYml0cywgJWVkaSA9IG91dCwgJWVkeCA9IGRpc3QKKyAgICAgICAgICogICAgICAgJWVjeCA9IG5ieXRlcworICAgICAgICAgKgorICAgICAgICAgKiBuYnl0ZXMgPSBvdXQgLSBiZWc7CisgICAgICAgICAqIGlmIChkaXN0IDw9IG5ieXRlcykgeworICAgICAgICAgKiAgIGZyb20gPSBvdXQgLSBkaXN0OworICAgICAgICAgKiAgIGRvIHsKKyAgICAgICAgICogICAgIFBVUChvdXQpID0gUFVQKGZyb20pOworICAgICAgICAgKiAgIH0gd2hpbGUgKC0tbGVuID4gMCkgeworICAgICAgICAgKiB9CisgICAgICAgICAqLworCisgICAgICAgIG1vdmwgICAgaW5fciwgaW4oJWVzcCkgICAgICAgICAgLyogc2F2ZSBpbiBzbyBmcm9tIGNhbiB1c2UgaXQncyByZWcgKi8KKyAgICAgICAgbW92bCAgICBvdXRfciwgJWVheAorICAgICAgICBzdWJsICAgIGJlZyglZXNwKSwgJWVheCAgICAgICAgIC8qIG5ieXRlcyA9IG91dCAtIGJlZyAqLworCisgICAgICAgIGNtcGwgICAgZGlzdF9yLCAlZWF4CisgICAgICAgIGpiICAgICAgLkxfY2xpcF93aW5kb3cgICAgICAgICAgLyogaWYgKGRpc3QgPiBuYnl0ZXMpIDQuMiUgKi8KKworICAgICAgICBtb3ZsICAgIGxlbiglZXNwKSwgJWVjeAorICAgICAgICBtb3ZsICAgIG91dF9yLCBmcm9tX3IKKyAgICAgICAgc3VibCAgICBkaXN0X3IsIGZyb21fciAgICAgICAgICAvKiBmcm9tID0gb3V0IC0gZGlzdCAqLworCisgICAgICAgIHN1YmwgICAgJDMsICVlY3gKKyAgICAgICAgbW92YiAgICAoZnJvbV9yKSwgJWFsCisgICAgICAgIG1vdmIgICAgJWFsLCAob3V0X3IpCisgICAgICAgIG1vdmIgICAgMShmcm9tX3IpLCAlYWwKKyAgICAgICAgbW92YiAgICAyKGZyb21fciksICVkbAorICAgICAgICBhZGRsICAgICQzLCBmcm9tX3IKKyAgICAgICAgbW92YiAgICAlYWwsIDEob3V0X3IpCisgICAgICAgIG1vdmIgICAgJWRsLCAyKG91dF9yKQorICAgICAgICBhZGRsICAgICQzLCBvdXRfcgorICAgICAgICByZXAgICAgIG1vdnNiCisKKyAgICAgICAgbW92bCAgICBpbiglZXNwKSwgaW5fciAgICAgICAgICAvKiBtb3ZlIGluIGJhY2sgdG8gJWVzaSwgdG9zcyBmcm9tICovCisgICAgICAgIGptcCAgICAgLkxfd2hpbGVfdGVzdAorCisuYWxpZ24gMTYsMHg5MAorLkxfY2hlY2tfZGlzdF9vbmU6CisgICAgICAgIGNtcGwgICAgJDEsIGRpc3RfcgorICAgICAgICBqbmUgICAgIC5MX2NoZWNrX3dpbmRvdworICAgICAgICBjbXBsICAgIG91dF9yLCBiZWcoJWVzcCkKKyAgICAgICAgamUgICAgICAuTF9jaGVja193aW5kb3cKKworICAgICAgICBkZWNsICAgIG91dF9yCisgICAgICAgIG1vdmwgICAgbGVuKCVlc3ApLCAlZWN4CisgICAgICAgIG1vdmIgICAgKG91dF9yKSwgJWFsCisgICAgICAgIHN1YmwgICAgJDMsICVlY3gKKworICAgICAgICBtb3ZiICAgICVhbCwgMShvdXRfcikKKyAgICAgICAgbW92YiAgICAlYWwsIDIob3V0X3IpCisgICAgICAgIG1vdmIgICAgJWFsLCAzKG91dF9yKQorICAgICAgICBhZGRsICAgICQ0LCBvdXRfcgorICAgICAgICByZXAgICAgIHN0b3NiCisKKyAgICAgICAgam1wICAgICAuTF93aGlsZV90ZXN0CisKKy5hbGlnbiAxNiwweDkwCisuTF90ZXN0X2Zvcl9zZWNvbmRfbGV2ZWxfbGVuZ3RoOgorICAgICAgICAvKiBlbHNlIGlmICgob3AgJiA2NCkgPT0gMCkgeworICAgICAgICAgKiAgIHRoaXMgPSBsY29kZVt0aGlzLnZhbCArIChob2xkICYgbWFza1tvcF0pXTsKKyAgICAgICAgICogfQorICAgICAgICAgKi8KKyAgICAgICAgdGVzdGIgICAkNjQsICVhbAorICAgICAgICBqbnogICAgIC5MX3Rlc3RfZm9yX2VuZF9vZl9ibG9jayAgLyogaWYgKChvcCAmIDY0KSAhPSAwKSAqLworCisgICAgICAgIG1vdmwgICAgJDEsICVlYXgKKyAgICAgICAgc2hsbCAgICAlY2wsICVlYXgKKyAgICAgICAgZGVjbCAgICAlZWF4CisgICAgICAgIGFuZGwgICAgaG9sZF9yLCAlZWF4ICAgICAgICAgICAgLyogZWF4ICY9IGhvbGQgKi8KKyAgICAgICAgYWRkbCAgICAlZWR4LCAlZWF4ICAgICAgICAgICAgICAvKiBlYXggKz0gdGhpcy52YWwgKi8KKyAgICAgICAgbW92bCAgICBsY29kZSglZXNwKSwgJWVkeCAgICAgICAvKiBlZHggPSBsY29kZSAqLworICAgICAgICBtb3ZsICAgICglZWR4LCVlYXgsNCksICVlYXggICAgIC8qIGVheCA9IGxjb2RlW3ZhbCArIChob2xkJm1hc2tbb3BdKV0gKi8KKyAgICAgICAgam1wICAgICAuTF9kb2xlbgorCisuYWxpZ24gMTYsMHg5MAorLkxfdGVzdF9mb3Jfc2Vjb25kX2xldmVsX2Rpc3Q6CisgICAgICAgIC8qIGVsc2UgaWYgKChvcCAmIDY0KSA9PSAwKSB7CisgICAgICAgICAqICAgdGhpcyA9IGRjb2RlW3RoaXMudmFsICsgKGhvbGQgJiBtYXNrW29wXSldOworICAgICAgICAgKiB9CisgICAgICAgICAqLworICAgICAgICB0ZXN0YiAgICQ2NCwgJWFsCisgICAgICAgIGpueiAgICAgLkxfaW52YWxpZF9kaXN0YW5jZV9jb2RlICAvKiBpZiAoKG9wICYgNjQpICE9IDApICovCisKKyAgICAgICAgbW92bCAgICAkMSwgJWVheAorICAgICAgICBzaGxsICAgICVjbCwgJWVheAorICAgICAgICBkZWNsICAgICVlYXgKKyAgICAgICAgYW5kbCAgICBob2xkX3IsICVlYXggICAgICAgICAgICAvKiBlYXggJj0gaG9sZCAqLworICAgICAgICBhZGRsICAgICVlZHgsICVlYXggICAgICAgICAgICAgIC8qIGVheCArPSB0aGlzLnZhbCAqLworICAgICAgICBtb3ZsICAgIGRjb2RlKCVlc3ApLCAlZWR4ICAgICAgIC8qIGVkeCA9IGRjb2RlICovCisgICAgICAgIG1vdmwgICAgKCVlZHgsJWVheCw0KSwgJWVheCAgICAgLyogZWF4ID0gZGNvZGVbdmFsICsgKGhvbGQmbWFza1tvcF0pXSAqLworICAgICAgICBqbXAgICAgIC5MX2RvZGlzdAorCisuYWxpZ24gMTYsMHg5MAorLkxfY2xpcF93aW5kb3c6CisgICAgICAgIC8qIHJlZ3M6ICVlc2kgPSBmcm9tLCAlZWJwID0gaG9sZCwgJWJsID0gYml0cywgJWVkaSA9IG91dCwgJWVkeCA9IGRpc3QKKyAgICAgICAgICogICAgICAgJWVjeCA9IG5ieXRlcworICAgICAgICAgKgorICAgICAgICAgKiBlbHNlIHsKKyAgICAgICAgICogICBpZiAoZGlzdCA+IHdzaXplKSB7CisgICAgICAgICAqICAgICBpbnZhbGlkIGRpc3RhbmNlCisgICAgICAgICAqICAgfQorICAgICAgICAgKiAgIGZyb20gPSB3aW5kb3c7CisgICAgICAgICAqICAgbmJ5dGVzID0gZGlzdCAtIG5ieXRlczsKKyAgICAgICAgICogICBpZiAod3JpdGUgPT0gMCkgeworICAgICAgICAgKiAgICAgZnJvbSArPSB3c2l6ZSAtIG5ieXRlczsKKyAgICAgICAgICovCisjZGVmaW5lIG5ieXRlc19yICVlY3gKKyAgICAgICAgbW92bCAgICAlZWF4LCBuYnl0ZXNfcgorICAgICAgICBtb3ZsICAgIHdzaXplKCVlc3ApLCAlZWF4ICAgICAgIC8qIHByZXBhcmUgZm9yIGRpc3QgY29tcGFyZSAqLworICAgICAgICBuZWdsICAgIG5ieXRlc19yICAgICAgICAgICAgICAgIC8qIG5ieXRlcyA9IC1uYnl0ZXMgKi8KKyAgICAgICAgbW92bCAgICB3aW5kb3coJWVzcCksIGZyb21fciAgICAvKiBmcm9tID0gd2luZG93ICovCisKKyAgICAgICAgY21wbCAgICBkaXN0X3IsICVlYXgKKyAgICAgICAgamIgICAgICAuTF9pbnZhbGlkX2Rpc3RhbmNlX3Rvb19mYXIgLyogaWYgKGRpc3QgPiB3c2l6ZSkgKi8KKworICAgICAgICBhZGRsICAgIGRpc3RfciwgbmJ5dGVzX3IgICAgICAgIC8qIG5ieXRlcyA9IGRpc3QgLSBuYnl0ZXMgKi8KKyAgICAgICAgY21wbCAgICAkMCwgd3JpdGUoJWVzcCkKKyAgICAgICAgam5lICAgICAuTF93cmFwX2Fyb3VuZF93aW5kb3cgICAvKiBpZiAod3JpdGUgIT0gMCkgKi8KKworICAgICAgICBzdWJsICAgIG5ieXRlc19yLCAlZWF4CisgICAgICAgIGFkZGwgICAgJWVheCwgZnJvbV9yICAgICAgICAgICAgLyogZnJvbSArPSB3c2l6ZSAtIG5ieXRlcyAqLworCisgICAgICAgIC8qIHJlZ3M6ICVlc2kgPSBmcm9tLCAlZWJwID0gaG9sZCwgJWJsID0gYml0cywgJWVkaSA9IG91dCwgJWVkeCA9IGRpc3QKKyAgICAgICAgICogICAgICAgJWVjeCA9IG5ieXRlcywgJWVheCA9IGxlbgorICAgICAgICAgKgorICAgICAgICAgKiAgICAgaWYgKG5ieXRlcyA8IGxlbikgeworICAgICAgICAgKiAgICAgICBsZW4gLT0gbmJ5dGVzOworICAgICAgICAgKiAgICAgICBkbyB7CisgICAgICAgICAqICAgICAgICAgUFVQKG91dCkgPSBQVVAoZnJvbSk7CisgICAgICAgICAqICAgICAgIH0gd2hpbGUgKC0tbmJ5dGVzKTsKKyAgICAgICAgICogICAgICAgZnJvbSA9IG91dCAtIGRpc3Q7CisgICAgICAgICAqICAgICB9CisgICAgICAgICAqICAgfQorICAgICAgICAgKi8KKyNkZWZpbmUgbGVuX3IgJWVheAorICAgICAgICBtb3ZsICAgIGxlbiglZXNwKSwgbGVuX3IKKyAgICAgICAgY21wbCAgICBuYnl0ZXNfciwgbGVuX3IKKyAgICAgICAgamJlICAgICAuTF9kb19jb3B5MSAgICAgICAgICAgICAvKiBpZiAobmJ5dGVzID49IGxlbikgKi8KKworICAgICAgICBzdWJsICAgIG5ieXRlc19yLCBsZW5fciAgICAgICAgIC8qIGxlbiAtPSBuYnl0ZXMgKi8KKyAgICAgICAgcmVwICAgICBtb3ZzYgorICAgICAgICBtb3ZsICAgIG91dF9yLCBmcm9tX3IKKyAgICAgICAgc3VibCAgICBkaXN0X3IsIGZyb21fciAgICAgICAgICAvKiBmcm9tID0gb3V0IC0gZGlzdCAqLworICAgICAgICBqbXAgICAgIC5MX2RvX2NvcHkxCisKKyAgICAgICAgY21wbCAgICBuYnl0ZXNfciwgbGVuX3IKKyAgICAgICAgamJlICAgICAuTF9kb19jb3B5MSAgICAgICAgICAgICAvKiBpZiAobmJ5dGVzID49IGxlbikgKi8KKworICAgICAgICBzdWJsICAgIG5ieXRlc19yLCBsZW5fciAgICAgICAgIC8qIGxlbiAtPSBuYnl0ZXMgKi8KKyAgICAgICAgcmVwICAgICBtb3ZzYgorICAgICAgICBtb3ZsICAgIG91dF9yLCBmcm9tX3IKKyAgICAgICAgc3VibCAgICBkaXN0X3IsIGZyb21fciAgICAgICAgICAvKiBmcm9tID0gb3V0IC0gZGlzdCAqLworICAgICAgICBqbXAgICAgIC5MX2RvX2NvcHkxCisKKy5MX3dyYXBfYXJvdW5kX3dpbmRvdzoKKyAgICAgICAgLyogcmVnczogJWVzaSA9IGZyb20sICVlYnAgPSBob2xkLCAlYmwgPSBiaXRzLCAlZWRpID0gb3V0LCAlZWR4ID0gZGlzdAorICAgICAgICAgKiAgICAgICAlZWN4ID0gbmJ5dGVzLCAlZWF4ID0gd3JpdGUsICVlYXggPSBsZW4KKyAgICAgICAgICoKKyAgICAgICAgICogICBlbHNlIGlmICh3cml0ZSA8IG5ieXRlcykgeworICAgICAgICAgKiAgICAgZnJvbSArPSB3c2l6ZSArIHdyaXRlIC0gbmJ5dGVzOworICAgICAgICAgKiAgICAgbmJ5dGVzIC09IHdyaXRlOworICAgICAgICAgKiAgICAgaWYgKG5ieXRlcyA8IGxlbikgeworICAgICAgICAgKiAgICAgICBsZW4gLT0gbmJ5dGVzOworICAgICAgICAgKiAgICAgICBkbyB7CisgICAgICAgICAqICAgICAgICAgUFVQKG91dCkgPSBQVVAoZnJvbSk7CisgICAgICAgICAqICAgICAgIH0gd2hpbGUgKC0tbmJ5dGVzKTsKKyAgICAgICAgICogICAgICAgZnJvbSA9IHdpbmRvdzsKKyAgICAgICAgICogICAgICAgbmJ5dGVzID0gd3JpdGU7CisgICAgICAgICAqICAgICAgIGlmIChuYnl0ZXMgPCBsZW4pIHsKKyAgICAgICAgICogICAgICAgICBsZW4gLT0gbmJ5dGVzOworICAgICAgICAgKiAgICAgICAgIGRvIHsKKyAgICAgICAgICogICAgICAgICAgIFBVUChvdXQpID0gUFVQKGZyb20pOworICAgICAgICAgKiAgICAgICAgIH0gd2hpbGUoLS1uYnl0ZXMpOworICAgICAgICAgKiAgICAgICAgIGZyb20gPSBvdXQgLSBkaXN0OworICAgICAgICAgKiAgICAgICB9CisgICAgICAgICAqICAgICB9CisgICAgICAgICAqICAgfQorICAgICAgICAgKi8KKyNkZWZpbmUgd3JpdGVfciAlZWF4CisgICAgICAgIG1vdmwgICAgd3JpdGUoJWVzcCksIHdyaXRlX3IKKyAgICAgICAgY21wbCAgICB3cml0ZV9yLCBuYnl0ZXNfcgorICAgICAgICBqYmUgICAgIC5MX2NvbnRpZ3VvdXNfaW5fd2luZG93IC8qIGlmICh3cml0ZSA+PSBuYnl0ZXMpICovCisKKyAgICAgICAgYWRkbCAgICB3c2l6ZSglZXNwKSwgZnJvbV9yCisgICAgICAgIGFkZGwgICAgd3JpdGVfciwgZnJvbV9yCisgICAgICAgIHN1YmwgICAgbmJ5dGVzX3IsIGZyb21fciAgICAgICAgLyogZnJvbSArPSB3c2l6ZSArIHdyaXRlIC0gbmJ5dGVzICovCisgICAgICAgIHN1YmwgICAgd3JpdGVfciwgbmJ5dGVzX3IgICAgICAgLyogbmJ5dGVzIC09IHdyaXRlICovCisjdW5kZWYgd3JpdGVfcgorCisgICAgICAgIG1vdmwgICAgbGVuKCVlc3ApLCBsZW5fcgorICAgICAgICBjbXBsICAgIG5ieXRlc19yLCBsZW5fcgorICAgICAgICBqYmUgICAgIC5MX2RvX2NvcHkxICAgICAgICAgICAgIC8qIGlmIChuYnl0ZXMgPj0gbGVuKSAqLworCisgICAgICAgIHN1YmwgICAgbmJ5dGVzX3IsIGxlbl9yICAgICAgICAgLyogbGVuIC09IG5ieXRlcyAqLworICAgICAgICByZXAgICAgIG1vdnNiCisgICAgICAgIG1vdmwgICAgd2luZG93KCVlc3ApLCBmcm9tX3IgICAgLyogZnJvbSA9IHdpbmRvdyAqLworICAgICAgICBtb3ZsICAgIHdyaXRlKCVlc3ApLCBuYnl0ZXNfciAgIC8qIG5ieXRlcyA9IHdyaXRlICovCisgICAgICAgIGNtcGwgICAgbmJ5dGVzX3IsIGxlbl9yCisgICAgICAgIGpiZSAgICAgLkxfZG9fY29weTEgICAgICAgICAgICAgLyogaWYgKG5ieXRlcyA+PSBsZW4pICovCisKKyAgICAgICAgc3VibCAgICBuYnl0ZXNfciwgbGVuX3IgICAgICAgICAvKiBsZW4gLT0gbmJ5dGVzICovCisgICAgICAgIHJlcCAgICAgbW92c2IKKyAgICAgICAgbW92bCAgICBvdXRfciwgZnJvbV9yCisgICAgICAgIHN1YmwgICAgZGlzdF9yLCBmcm9tX3IgICAgICAgICAgLyogZnJvbSA9IG91dCAtIGRpc3QgKi8KKyAgICAgICAgam1wICAgICAuTF9kb19jb3B5MQorCisuTF9jb250aWd1b3VzX2luX3dpbmRvdzoKKyAgICAgICAgLyogcmVnczogJWVzaSA9IGZyb20sICVlYnAgPSBob2xkLCAlYmwgPSBiaXRzLCAlZWRpID0gb3V0LCAlZWR4ID0gZGlzdAorICAgICAgICAgKiAgICAgICAlZWN4ID0gbmJ5dGVzLCAlZWF4ID0gd3JpdGUsICVlYXggPSBsZW4KKyAgICAgICAgICoKKyAgICAgICAgICogICBlbHNlIHsKKyAgICAgICAgICogICAgIGZyb20gKz0gd3JpdGUgLSBuYnl0ZXM7CisgICAgICAgICAqICAgICBpZiAobmJ5dGVzIDwgbGVuKSB7CisgICAgICAgICAqICAgICAgIGxlbiAtPSBuYnl0ZXM7CisgICAgICAgICAqICAgICAgIGRvIHsKKyAgICAgICAgICogICAgICAgICBQVVAob3V0KSA9IFBVUChmcm9tKTsKKyAgICAgICAgICogICAgICAgfSB3aGlsZSAoLS1uYnl0ZXMpOworICAgICAgICAgKiAgICAgICBmcm9tID0gb3V0IC0gZGlzdDsKKyAgICAgICAgICogICAgIH0KKyAgICAgICAgICogICB9CisgICAgICAgICAqLworI2RlZmluZSB3cml0ZV9yICVlYXgKKyAgICAgICAgYWRkbCAgICB3cml0ZV9yLCBmcm9tX3IKKyAgICAgICAgc3VibCAgICBuYnl0ZXNfciwgZnJvbV9yICAgICAgICAvKiBmcm9tICs9IHdyaXRlIC0gbmJ5dGVzICovCisjdW5kZWYgd3JpdGVfcgorCisgICAgICAgIG1vdmwgICAgbGVuKCVlc3ApLCBsZW5fcgorICAgICAgICBjbXBsICAgIG5ieXRlc19yLCBsZW5fcgorICAgICAgICBqYmUgICAgIC5MX2RvX2NvcHkxICAgICAgICAgICAgIC8qIGlmIChuYnl0ZXMgPj0gbGVuKSAqLworCisgICAgICAgIHN1YmwgICAgbmJ5dGVzX3IsIGxlbl9yICAgICAgICAgLyogbGVuIC09IG5ieXRlcyAqLworICAgICAgICByZXAgICAgIG1vdnNiCisgICAgICAgIG1vdmwgICAgb3V0X3IsIGZyb21fcgorICAgICAgICBzdWJsICAgIGRpc3RfciwgZnJvbV9yICAgICAgICAgIC8qIGZyb20gPSBvdXQgLSBkaXN0ICovCisKKy5MX2RvX2NvcHkxOgorICAgICAgICAvKiByZWdzOiAlZXNpID0gZnJvbSwgJWVzaSA9IGluLCAlZWJwID0gaG9sZCwgJWJsID0gYml0cywgJWVkaSA9IG91dAorICAgICAgICAgKiAgICAgICAlZWF4ID0gbGVuCisgICAgICAgICAqCisgICAgICAgICAqICAgICB3aGlsZSAobGVuID4gMCkgeworICAgICAgICAgKiAgICAgICBQVVAob3V0KSA9IFBVUChmcm9tKTsKKyAgICAgICAgICogICAgICAgbGVuLS07CisgICAgICAgICAqICAgICB9CisgICAgICAgICAqICAgfQorICAgICAgICAgKiB9IHdoaWxlIChpbiA8IGxhc3QgJiYgb3V0IDwgZW5kKTsKKyAgICAgICAgICovCisjdW5kZWYgbmJ5dGVzX3IKKyNkZWZpbmUgaW5fciAlZXNpCisgICAgICAgIG1vdmwgICAgbGVuX3IsICVlY3gKKyAgICAgICAgcmVwICAgICBtb3ZzYgorCisgICAgICAgIG1vdmwgICAgaW4oJWVzcCksIGluX3IgICAgICAgICAgLyogbW92ZSBpbiBiYWNrIHRvICVlc2ksIHRvc3MgZnJvbSAqLworICAgICAgICBqbXAgICAgIC5MX3doaWxlX3Rlc3QKKworI3VuZGVmIGxlbl9yCisjdW5kZWYgZGlzdF9yCisKKyNlbmRpZiAvKiBOT19NTVggfHwgUlVOX1RJTUVfTU1YICovCisKKworLyoqKiBNTVggY29kZSAqKiovCisKKyNpZiBkZWZpbmVkKCBVU0VfTU1YICkgfHwgZGVmaW5lZCggUlVOX1RJTUVfTU1YICkKKworLmFsaWduIDMyLDB4OTAKKy5MX2luaXRfbW14OgorICAgICAgICBlbW1zCisKKyN1bmRlZiAgYml0c19yCisjdW5kZWYgIGJpdHNsb25nX3IKKyNkZWZpbmUgYml0c2xvbmdfciAlZWJwCisjZGVmaW5lIGhvbGRfbW0gICAgJW1tMAorICAgICAgICBtb3ZkICAgICVlYnAsIGhvbGRfbW0KKyAgICAgICAgbW92bCAgICAlZWJ4LCBiaXRzbG9uZ19yCisKKyNkZWZpbmUgdXNlZF9tbSAgICVtbTEKKyNkZWZpbmUgZG1hc2syX21tICVtbTIKKyNkZWZpbmUgbG1hc2syX21tICVtbTMKKyNkZWZpbmUgbG1hc2tfbW0gICVtbTQKKyNkZWZpbmUgZG1hc2tfbW0gICVtbTUKKyNkZWZpbmUgdG1wX21tICAgICVtbTYKKworICAgICAgICBtb3ZkICAgIGxtYXNrKCVlc3ApLCBsbWFza19tbQorICAgICAgICBtb3ZxICAgIGxtYXNrX21tLCBsbWFzazJfbW0KKyAgICAgICAgbW92ZCAgICBkbWFzayglZXNwKSwgZG1hc2tfbW0KKyAgICAgICAgbW92cSAgICBkbWFza19tbSwgZG1hc2syX21tCisgICAgICAgIHB4b3IgICAgdXNlZF9tbSwgdXNlZF9tbQorICAgICAgICBtb3ZsICAgIGxjb2RlKCVlc3ApLCAlZWJ4ICAgICAgIC8qIGVieCA9IGxjb2RlICovCisgICAgICAgIGptcCAgICAgLkxfZG9fbG9vcF9tbXgKKworLmFsaWduIDMyLDB4OTAKKy5MX3doaWxlX3Rlc3RfbW14OgorICAgICAgICAvKiB3aGlsZSAoaW4gPCBsYXN0ICYmIG91dCA8IGVuZCkKKyAgICAgICAgICovCisgICAgICAgIGNtcGwgICAgb3V0X3IsIGVuZCglZXNwKQorICAgICAgICBqYmUgICAgIC5MX2JyZWFrX2xvb3AgICAgICAgICAgIC8qIGlmIChvdXQgPj0gZW5kKSAqLworCisgICAgICAgIGNtcGwgICAgaW5fciwgbGFzdCglZXNwKQorICAgICAgICBqYmUgICAgIC5MX2JyZWFrX2xvb3AKKworLkxfZG9fbG9vcF9tbXg6CisgICAgICAgIHBzcmxxICAgdXNlZF9tbSwgaG9sZF9tbSAgICAgICAgLyogaG9sZF9tbSA+Pj0gbGFzdCBiaXQgbGVuZ3RoICovCisKKyAgICAgICAgY21wbCAgICAkMzIsIGJpdHNsb25nX3IKKyAgICAgICAgamEgICAgICAuTF9nZXRfbGVuZ3RoX2NvZGVfbW14ICAvKiBpZiAoMzIgPCBiaXRzKSAqLworCisgICAgICAgIG1vdmQgICAgYml0c2xvbmdfciwgdG1wX21tCisgICAgICAgIG1vdmQgICAgKGluX3IpLCAlbW03CisgICAgICAgIGFkZGwgICAgJDQsIGluX3IKKyAgICAgICAgcHNsbHEgICB0bXBfbW0sICVtbTcKKyAgICAgICAgYWRkbCAgICAkMzIsIGJpdHNsb25nX3IKKyAgICAgICAgcG9yICAgICAlbW03LCBob2xkX21tICAgICAgICAgICAvKiBob2xkX21tIHw9ICooKHVpbnQgKilpbikrKyA8PCBiaXRzICovCisKKy5MX2dldF9sZW5ndGhfY29kZV9tbXg6CisgICAgICAgIHBhbmQgICAgaG9sZF9tbSwgbG1hc2tfbW0KKyAgICAgICAgbW92ZCAgICBsbWFza19tbSwgJWVheAorICAgICAgICBtb3ZxICAgIGxtYXNrMl9tbSwgbG1hc2tfbW0KKyAgICAgICAgbW92bCAgICAoJWVieCwlZWF4LDQpLCAlZWF4ICAgICAvKiBlYXggPSBsY29kZVtob2xkICYgbG1hc2tdICovCisKKy5MX2RvbGVuX21teDoKKyAgICAgICAgbW92emJsICAlYWgsICVlY3ggICAgICAgICAgICAgICAvKiBlY3ggPSB0aGlzLmJpdHMgKi8KKyAgICAgICAgbW92ZCAgICAlZWN4LCB1c2VkX21tCisgICAgICAgIHN1YmwgICAgJWVjeCwgYml0c2xvbmdfciAgICAgICAgLyogYml0cyAtPSB0aGlzLmJpdHMgKi8KKworICAgICAgICB0ZXN0YiAgICVhbCwgJWFsCisgICAgICAgIGpueiAgICAgLkxfdGVzdF9mb3JfbGVuZ3RoX2Jhc2VfbW14IC8qIGlmIChvcCAhPSAwKSA0NS43JSAqLworCisgICAgICAgIHNocmwgICAgJDE2LCAlZWF4ICAgICAgICAgICAgICAgLyogb3V0cHV0IHRoaXMudmFsIGNoYXIgKi8KKyAgICAgICAgc3Rvc2IKKyAgICAgICAgam1wICAgICAuTF93aGlsZV90ZXN0X21teAorCisuTF90ZXN0X2Zvcl9sZW5ndGhfYmFzZV9tbXg6CisjZGVmaW5lIGxlbl9yICAlZWR4CisgICAgICAgIG1vdmwgICAgJWVheCwgbGVuX3IgICAgICAgICAgICAgLyogbGVuID0gdGhpcyAqLworICAgICAgICBzaHJsICAgICQxNiwgbGVuX3IgICAgICAgICAgICAgIC8qIGxlbiA9IHRoaXMudmFsICovCisKKyAgICAgICAgdGVzdGIgICAkMTYsICVhbAorICAgICAgICBqeiAgICAgIC5MX3Rlc3RfZm9yX3NlY29uZF9sZXZlbF9sZW5ndGhfbW14IC8qIGlmICgob3AgJiAxNikgPT0gMCkgOCUgKi8KKyAgICAgICAgYW5kbCAgICAkMTUsICVlYXggICAgICAgICAgICAgICAvKiBvcCAmPSAxNSAqLworICAgICAgICBqeiAgICAgIC5MX2RlY29kZV9kaXN0YW5jZV9tbXggIC8qIGlmICghb3ApICovCisKKyAgICAgICAgcHNybHEgICB1c2VkX21tLCBob2xkX21tICAgICAgICAvKiBob2xkX21tID4+PSBsYXN0IGJpdCBsZW5ndGggKi8KKyAgICAgICAgbW92ZCAgICAlZWF4LCB1c2VkX21tCisgICAgICAgIG1vdmQgICAgaG9sZF9tbSwgJWVjeAorICAgICAgICBzdWJsICAgICVlYXgsIGJpdHNsb25nX3IKKyAgICAgICAgYW5kbCAgICAuTF9tYXNrKCwlZWF4LDQpLCAlZWN4CisgICAgICAgIGFkZGwgICAgJWVjeCwgbGVuX3IgICAgICAgICAgICAgLyogbGVuICs9IGhvbGQgJiBtYXNrW29wXSAqLworCisuTF9kZWNvZGVfZGlzdGFuY2VfbW14OgorICAgICAgICBwc3JscSAgIHVzZWRfbW0sIGhvbGRfbW0gICAgICAgIC8qIGhvbGRfbW0gPj49IGxhc3QgYml0IGxlbmd0aCAqLworCisgICAgICAgIGNtcGwgICAgJDMyLCBiaXRzbG9uZ19yCisgICAgICAgIGphICAgICAgLkxfZ2V0X2Rpc3RfY29kZV9tbXggICAgLyogaWYgKDMyIDwgYml0cykgKi8KKworICAgICAgICBtb3ZkICAgIGJpdHNsb25nX3IsIHRtcF9tbQorICAgICAgICBtb3ZkICAgIChpbl9yKSwgJW1tNworICAgICAgICBhZGRsICAgICQ0LCBpbl9yCisgICAgICAgIHBzbGxxICAgdG1wX21tLCAlbW03CisgICAgICAgIGFkZGwgICAgJDMyLCBiaXRzbG9uZ19yCisgICAgICAgIHBvciAgICAgJW1tNywgaG9sZF9tbSAgICAgICAgICAgLyogaG9sZF9tbSB8PSAqKCh1aW50ICopaW4pKysgPDwgYml0cyAqLworCisuTF9nZXRfZGlzdF9jb2RlX21teDoKKyAgICAgICAgbW92bCAgICBkY29kZSglZXNwKSwgJWVieCAgICAgICAvKiBlYnggPSBkY29kZSAqLworICAgICAgICBwYW5kICAgIGhvbGRfbW0sIGRtYXNrX21tCisgICAgICAgIG1vdmQgICAgZG1hc2tfbW0sICVlYXgKKyAgICAgICAgbW92cSAgICBkbWFzazJfbW0sIGRtYXNrX21tCisgICAgICAgIG1vdmwgICAgKCVlYngsJWVheCw0KSwgJWVheCAgICAgLyogZWF4ID0gZGNvZGVbaG9sZCAmIGxtYXNrXSAqLworCisuTF9kb2Rpc3RfbW14OgorI2RlZmluZSBkaXN0X3IgJWVieAorICAgICAgICBtb3Z6YmwgICVhaCwgJWVjeCAgICAgICAgICAgICAgIC8qIGVjeCA9IHRoaXMuYml0cyAqLworICAgICAgICBtb3ZsICAgICVlYXgsIGRpc3RfcgorICAgICAgICBzaHJsICAgICQxNiwgZGlzdF9yICAgICAgICAgICAgIC8qIGRpc3QgID0gdGhpcy52YWwgKi8KKyAgICAgICAgc3VibCAgICAlZWN4LCBiaXRzbG9uZ19yICAgICAgICAvKiBiaXRzIC09IHRoaXMuYml0cyAqLworICAgICAgICBtb3ZkICAgICVlY3gsIHVzZWRfbW0KKworICAgICAgICB0ZXN0YiAgICQxNiwgJWFsICAgICAgICAgICAgICAgIC8qIGlmICgob3AgJiAxNikgPT0gMCkgKi8KKyAgICAgICAganogICAgICAuTF90ZXN0X2Zvcl9zZWNvbmRfbGV2ZWxfZGlzdF9tbXgKKyAgICAgICAgYW5kbCAgICAkMTUsICVlYXggICAgICAgICAgICAgICAvKiBvcCAmPSAxNSAqLworICAgICAgICBqeiAgICAgIC5MX2NoZWNrX2Rpc3Rfb25lX21teAorCisuTF9hZGRfYml0c190b19kaXN0X21teDoKKyAgICAgICAgcHNybHEgICB1c2VkX21tLCBob2xkX21tICAgICAgICAvKiBob2xkX21tID4+PSBsYXN0IGJpdCBsZW5ndGggKi8KKyAgICAgICAgbW92ZCAgICAlZWF4LCB1c2VkX21tICAgICAgICAgICAvKiBzYXZlIGJpdCBsZW5ndGggb2YgY3VycmVudCBvcCAqLworICAgICAgICBtb3ZkICAgIGhvbGRfbW0sICVlY3ggICAgICAgICAgIC8qIGdldCB0aGUgbmV4dCBiaXRzIG9uIGlucHV0IHN0cmVhbSAqLworICAgICAgICBzdWJsICAgICVlYXgsIGJpdHNsb25nX3IgICAgICAgIC8qIGJpdHMgLT0gb3AgYml0cyAqLworICAgICAgICBhbmRsICAgIC5MX21hc2soLCVlYXgsNCksICVlY3ggIC8qIGVjeCAgID0gaG9sZCAmIG1hc2tbb3BdICovCisgICAgICAgIGFkZGwgICAgJWVjeCwgZGlzdF9yICAgICAgICAgICAgLyogZGlzdCArPSBob2xkICYgbWFza1tvcF0gKi8KKworLkxfY2hlY2tfd2luZG93X21teDoKKyAgICAgICAgbW92bCAgICBpbl9yLCBpbiglZXNwKSAgICAgICAgICAvKiBzYXZlIGluIHNvIGZyb20gY2FuIHVzZSBpdCdzIHJlZyAqLworICAgICAgICBtb3ZsICAgIG91dF9yLCAlZWF4CisgICAgICAgIHN1YmwgICAgYmVnKCVlc3ApLCAlZWF4ICAgICAgICAgLyogbmJ5dGVzID0gb3V0IC0gYmVnICovCisKKyAgICAgICAgY21wbCAgICBkaXN0X3IsICVlYXgKKyAgICAgICAgamIgICAgICAuTF9jbGlwX3dpbmRvd19tbXggICAgICAvKiBpZiAoZGlzdCA+IG5ieXRlcykgNC4yJSAqLworCisgICAgICAgIG1vdmwgICAgbGVuX3IsICVlY3gKKyAgICAgICAgbW92bCAgICBvdXRfciwgZnJvbV9yCisgICAgICAgIHN1YmwgICAgZGlzdF9yLCBmcm9tX3IgICAgICAgICAgLyogZnJvbSA9IG91dCAtIGRpc3QgKi8KKworICAgICAgICBzdWJsICAgICQzLCAlZWN4CisgICAgICAgIG1vdmIgICAgKGZyb21fciksICVhbAorICAgICAgICBtb3ZiICAgICVhbCwgKG91dF9yKQorICAgICAgICBtb3ZiICAgIDEoZnJvbV9yKSwgJWFsCisgICAgICAgIG1vdmIgICAgMihmcm9tX3IpLCAlZGwKKyAgICAgICAgYWRkbCAgICAkMywgZnJvbV9yCisgICAgICAgIG1vdmIgICAgJWFsLCAxKG91dF9yKQorICAgICAgICBtb3ZiICAgICVkbCwgMihvdXRfcikKKyAgICAgICAgYWRkbCAgICAkMywgb3V0X3IKKyAgICAgICAgcmVwICAgICBtb3ZzYgorCisgICAgICAgIG1vdmwgICAgaW4oJWVzcCksIGluX3IgICAgICAgICAgLyogbW92ZSBpbiBiYWNrIHRvICVlc2ksIHRvc3MgZnJvbSAqLworICAgICAgICBtb3ZsICAgIGxjb2RlKCVlc3ApLCAlZWJ4ICAgICAgIC8qIG1vdmUgbGNvZGUgYmFjayB0byAlZWJ4LCB0b3NzIGRpc3QgKi8KKyAgICAgICAgam1wICAgICAuTF93aGlsZV90ZXN0X21teAorCisuYWxpZ24gMTYsMHg5MAorLkxfY2hlY2tfZGlzdF9vbmVfbW14OgorICAgICAgICBjbXBsICAgICQxLCBkaXN0X3IKKyAgICAgICAgam5lICAgICAuTF9jaGVja193aW5kb3dfbW14CisgICAgICAgIGNtcGwgICAgb3V0X3IsIGJlZyglZXNwKQorICAgICAgICBqZSAgICAgIC5MX2NoZWNrX3dpbmRvd19tbXgKKworICAgICAgICBkZWNsICAgIG91dF9yCisgICAgICAgIG1vdmwgICAgbGVuX3IsICVlY3gKKyAgICAgICAgbW92YiAgICAob3V0X3IpLCAlYWwKKyAgICAgICAgc3VibCAgICAkMywgJWVjeAorCisgICAgICAgIG1vdmIgICAgJWFsLCAxKG91dF9yKQorICAgICAgICBtb3ZiICAgICVhbCwgMihvdXRfcikKKyAgICAgICAgbW92YiAgICAlYWwsIDMob3V0X3IpCisgICAgICAgIGFkZGwgICAgJDQsIG91dF9yCisgICAgICAgIHJlcCAgICAgc3Rvc2IKKworICAgICAgICBtb3ZsICAgIGxjb2RlKCVlc3ApLCAlZWJ4ICAgICAgIC8qIG1vdmUgbGNvZGUgYmFjayB0byAlZWJ4LCB0b3NzIGRpc3QgKi8KKyAgICAgICAgam1wICAgICAuTF93aGlsZV90ZXN0X21teAorCisuYWxpZ24gMTYsMHg5MAorLkxfdGVzdF9mb3Jfc2Vjb25kX2xldmVsX2xlbmd0aF9tbXg6CisgICAgICAgIHRlc3RiICAgJDY0LCAlYWwKKyAgICAgICAgam56ICAgICAuTF90ZXN0X2Zvcl9lbmRfb2ZfYmxvY2sgIC8qIGlmICgob3AgJiA2NCkgIT0gMCkgKi8KKworICAgICAgICBhbmRsICAgICQxNSwgJWVheAorICAgICAgICBwc3JscSAgIHVzZWRfbW0sIGhvbGRfbW0gICAgICAgIC8qIGhvbGRfbW0gPj49IGxhc3QgYml0IGxlbmd0aCAqLworICAgICAgICBtb3ZkICAgIGhvbGRfbW0sICVlY3gKKyAgICAgICAgYW5kbCAgICAuTF9tYXNrKCwlZWF4LDQpLCAlZWN4CisgICAgICAgIGFkZGwgICAgbGVuX3IsICVlY3gKKyAgICAgICAgbW92bCAgICAoJWVieCwlZWN4LDQpLCAlZWF4ICAgICAvKiBlYXggPSBsY29kZVtob2xkICYgbG1hc2tdICovCisgICAgICAgIGptcCAgICAgLkxfZG9sZW5fbW14CisKKy5hbGlnbiAxNiwweDkwCisuTF90ZXN0X2Zvcl9zZWNvbmRfbGV2ZWxfZGlzdF9tbXg6CisgICAgICAgIHRlc3RiICAgJDY0LCAlYWwKKyAgICAgICAgam56ICAgICAuTF9pbnZhbGlkX2Rpc3RhbmNlX2NvZGUgIC8qIGlmICgob3AgJiA2NCkgIT0gMCkgKi8KKworICAgICAgICBhbmRsICAgICQxNSwgJWVheAorICAgICAgICBwc3JscSAgIHVzZWRfbW0sIGhvbGRfbW0gICAgICAgIC8qIGhvbGRfbW0gPj49IGxhc3QgYml0IGxlbmd0aCAqLworICAgICAgICBtb3ZkICAgIGhvbGRfbW0sICVlY3gKKyAgICAgICAgYW5kbCAgICAuTF9tYXNrKCwlZWF4LDQpLCAlZWN4CisgICAgICAgIG1vdmwgICAgZGNvZGUoJWVzcCksICVlYXggICAgICAgLyogZWN4ID0gZGNvZGUgKi8KKyAgICAgICAgYWRkbCAgICBkaXN0X3IsICVlY3gKKyAgICAgICAgbW92bCAgICAoJWVheCwlZWN4LDQpLCAlZWF4ICAgICAvKiBlYXggPSBsY29kZVtob2xkICYgbG1hc2tdICovCisgICAgICAgIGptcCAgICAgLkxfZG9kaXN0X21teAorCisuYWxpZ24gMTYsMHg5MAorLkxfY2xpcF93aW5kb3dfbW14OgorI2RlZmluZSBuYnl0ZXNfciAlZWN4CisgICAgICAgIG1vdmwgICAgJWVheCwgbmJ5dGVzX3IKKyAgICAgICAgbW92bCAgICB3c2l6ZSglZXNwKSwgJWVheCAgICAgICAvKiBwcmVwYXJlIGZvciBkaXN0IGNvbXBhcmUgKi8KKyAgICAgICAgbmVnbCAgICBuYnl0ZXNfciAgICAgICAgICAgICAgICAvKiBuYnl0ZXMgPSAtbmJ5dGVzICovCisgICAgICAgIG1vdmwgICAgd2luZG93KCVlc3ApLCBmcm9tX3IgICAgLyogZnJvbSA9IHdpbmRvdyAqLworCisgICAgICAgIGNtcGwgICAgZGlzdF9yLCAlZWF4CisgICAgICAgIGpiICAgICAgLkxfaW52YWxpZF9kaXN0YW5jZV90b29fZmFyIC8qIGlmIChkaXN0ID4gd3NpemUpICovCisKKyAgICAgICAgYWRkbCAgICBkaXN0X3IsIG5ieXRlc19yICAgICAgICAvKiBuYnl0ZXMgPSBkaXN0IC0gbmJ5dGVzICovCisgICAgICAgIGNtcGwgICAgJDAsIHdyaXRlKCVlc3ApCisgICAgICAgIGpuZSAgICAgLkxfd3JhcF9hcm91bmRfd2luZG93X21teCAvKiBpZiAod3JpdGUgIT0gMCkgKi8KKworICAgICAgICBzdWJsICAgIG5ieXRlc19yLCAlZWF4CisgICAgICAgIGFkZGwgICAgJWVheCwgZnJvbV9yICAgICAgICAgICAgLyogZnJvbSArPSB3c2l6ZSAtIG5ieXRlcyAqLworCisgICAgICAgIGNtcGwgICAgbmJ5dGVzX3IsIGxlbl9yCisgICAgICAgIGpiZSAgICAgLkxfZG9fY29weTFfbW14ICAgICAgICAgLyogaWYgKG5ieXRlcyA+PSBsZW4pICovCisKKyAgICAgICAgc3VibCAgICBuYnl0ZXNfciwgbGVuX3IgICAgICAgICAvKiBsZW4gLT0gbmJ5dGVzICovCisgICAgICAgIHJlcCAgICAgbW92c2IKKyAgICAgICAgbW92bCAgICBvdXRfciwgZnJvbV9yCisgICAgICAgIHN1YmwgICAgZGlzdF9yLCBmcm9tX3IgICAgICAgICAgLyogZnJvbSA9IG91dCAtIGRpc3QgKi8KKyAgICAgICAgam1wICAgICAuTF9kb19jb3B5MV9tbXgKKworICAgICAgICBjbXBsICAgIG5ieXRlc19yLCBsZW5fcgorICAgICAgICBqYmUgICAgIC5MX2RvX2NvcHkxX21teCAgICAgICAgIC8qIGlmIChuYnl0ZXMgPj0gbGVuKSAqLworCisgICAgICAgIHN1YmwgICAgbmJ5dGVzX3IsIGxlbl9yICAgICAgICAgLyogbGVuIC09IG5ieXRlcyAqLworICAgICAgICByZXAgICAgIG1vdnNiCisgICAgICAgIG1vdmwgICAgb3V0X3IsIGZyb21fcgorICAgICAgICBzdWJsICAgIGRpc3RfciwgZnJvbV9yICAgICAgICAgIC8qIGZyb20gPSBvdXQgLSBkaXN0ICovCisgICAgICAgIGptcCAgICAgLkxfZG9fY29weTFfbW14CisKKy5MX3dyYXBfYXJvdW5kX3dpbmRvd19tbXg6CisjZGVmaW5lIHdyaXRlX3IgJWVheAorICAgICAgICBtb3ZsICAgIHdyaXRlKCVlc3ApLCB3cml0ZV9yCisgICAgICAgIGNtcGwgICAgd3JpdGVfciwgbmJ5dGVzX3IKKyAgICAgICAgamJlICAgICAuTF9jb250aWd1b3VzX2luX3dpbmRvd19tbXggLyogaWYgKHdyaXRlID49IG5ieXRlcykgKi8KKworICAgICAgICBhZGRsICAgIHdzaXplKCVlc3ApLCBmcm9tX3IKKyAgICAgICAgYWRkbCAgICB3cml0ZV9yLCBmcm9tX3IKKyAgICAgICAgc3VibCAgICBuYnl0ZXNfciwgZnJvbV9yICAgICAgICAvKiBmcm9tICs9IHdzaXplICsgd3JpdGUgLSBuYnl0ZXMgKi8KKyAgICAgICAgc3VibCAgICB3cml0ZV9yLCBuYnl0ZXNfciAgICAgICAvKiBuYnl0ZXMgLT0gd3JpdGUgKi8KKyN1bmRlZiB3cml0ZV9yCisKKyAgICAgICAgY21wbCAgICBuYnl0ZXNfciwgbGVuX3IKKyAgICAgICAgamJlICAgICAuTF9kb19jb3B5MV9tbXggICAgICAgICAvKiBpZiAobmJ5dGVzID49IGxlbikgKi8KKworICAgICAgICBzdWJsICAgIG5ieXRlc19yLCBsZW5fciAgICAgICAgIC8qIGxlbiAtPSBuYnl0ZXMgKi8KKyAgICAgICAgcmVwICAgICBtb3ZzYgorICAgICAgICBtb3ZsICAgIHdpbmRvdyglZXNwKSwgZnJvbV9yICAgIC8qIGZyb20gPSB3aW5kb3cgKi8KKyAgICAgICAgbW92bCAgICB3cml0ZSglZXNwKSwgbmJ5dGVzX3IgICAvKiBuYnl0ZXMgPSB3cml0ZSAqLworICAgICAgICBjbXBsICAgIG5ieXRlc19yLCBsZW5fcgorICAgICAgICBqYmUgICAgIC5MX2RvX2NvcHkxX21teCAgICAgICAgIC8qIGlmIChuYnl0ZXMgPj0gbGVuKSAqLworCisgICAgICAgIHN1YmwgICAgbmJ5dGVzX3IsIGxlbl9yICAgICAgICAgLyogbGVuIC09IG5ieXRlcyAqLworICAgICAgICByZXAgICAgIG1vdnNiCisgICAgICAgIG1vdmwgICAgb3V0X3IsIGZyb21fcgorICAgICAgICBzdWJsICAgIGRpc3RfciwgZnJvbV9yICAgICAgICAgIC8qIGZyb20gPSBvdXQgLSBkaXN0ICovCisgICAgICAgIGptcCAgICAgLkxfZG9fY29weTFfbW14CisKKy5MX2NvbnRpZ3VvdXNfaW5fd2luZG93X21teDoKKyNkZWZpbmUgd3JpdGVfciAlZWF4CisgICAgICAgIGFkZGwgICAgd3JpdGVfciwgZnJvbV9yCisgICAgICAgIHN1YmwgICAgbmJ5dGVzX3IsIGZyb21fciAgICAgICAgLyogZnJvbSArPSB3cml0ZSAtIG5ieXRlcyAqLworI3VuZGVmIHdyaXRlX3IKKworICAgICAgICBjbXBsICAgIG5ieXRlc19yLCBsZW5fcgorICAgICAgICBqYmUgICAgIC5MX2RvX2NvcHkxX21teCAgICAgICAgIC8qIGlmIChuYnl0ZXMgPj0gbGVuKSAqLworCisgICAgICAgIHN1YmwgICAgbmJ5dGVzX3IsIGxlbl9yICAgICAgICAgLyogbGVuIC09IG5ieXRlcyAqLworICAgICAgICByZXAgICAgIG1vdnNiCisgICAgICAgIG1vdmwgICAgb3V0X3IsIGZyb21fcgorICAgICAgICBzdWJsICAgIGRpc3RfciwgZnJvbV9yICAgICAgICAgIC8qIGZyb20gPSBvdXQgLSBkaXN0ICovCisKKy5MX2RvX2NvcHkxX21teDoKKyN1bmRlZiBuYnl0ZXNfcgorI2RlZmluZSBpbl9yICVlc2kKKyAgICAgICAgbW92bCAgICBsZW5fciwgJWVjeAorICAgICAgICByZXAgICAgIG1vdnNiCisKKyAgICAgICAgbW92bCAgICBpbiglZXNwKSwgaW5fciAgICAgICAgICAvKiBtb3ZlIGluIGJhY2sgdG8gJWVzaSwgdG9zcyBmcm9tICovCisgICAgICAgIG1vdmwgICAgbGNvZGUoJWVzcCksICVlYnggICAgICAgLyogbW92ZSBsY29kZSBiYWNrIHRvICVlYngsIHRvc3MgZGlzdCAqLworICAgICAgICBqbXAgICAgIC5MX3doaWxlX3Rlc3RfbW14CisKKyN1bmRlZiBob2xkX3IKKyN1bmRlZiBiaXRzbG9uZ19yCisKKyNlbmRpZiAvKiBVU0VfTU1YIHx8IFJVTl9USU1FX01NWCAqLworCisKKy8qKiogVVNFX01NWCwgTk9fTU1YLCBhbmQgUlVOVElNRV9NTVggZnJvbSBoZXJlIG9uICoqKi8KKworLkxfaW52YWxpZF9kaXN0YW5jZV9jb2RlOgorICAgICAgICAvKiBlbHNlIHsKKyAgICAgICAgICogICBzdHJtLT5tc2cgPSAiaW52YWxpZCBkaXN0YW5jZSBjb2RlIjsKKyAgICAgICAgICogICBzdGF0ZS0+bW9kZSA9IEJBRDsKKyAgICAgICAgICogfQorICAgICAgICAgKi8KKyAgICAgICAgbW92bCAgICAkLkxfaW52YWxpZF9kaXN0YW5jZV9jb2RlX21zZywgJWVjeAorICAgICAgICBtb3ZsICAgICRJTkZMQVRFX01PREVfQkFELCAlZWR4CisgICAgICAgIGptcCAgICAgLkxfdXBkYXRlX3N0cmVhbV9zdGF0ZQorCisuTF90ZXN0X2Zvcl9lbmRfb2ZfYmxvY2s6CisgICAgICAgIC8qIGVsc2UgaWYgKG9wICYgMzIpIHsKKyAgICAgICAgICogICBzdGF0ZS0+bW9kZSA9IFRZUEU7CisgICAgICAgICAqICAgYnJlYWs7CisgICAgICAgICAqIH0KKyAgICAgICAgICovCisgICAgICAgIHRlc3RiICAgJDMyLCAlYWwKKyAgICAgICAganogICAgICAuTF9pbnZhbGlkX2xpdGVyYWxfbGVuZ3RoX2NvZGUgIC8qIGlmICgob3AgJiAzMikgPT0gMCkgKi8KKworICAgICAgICBtb3ZsICAgICQwLCAlZWN4CisgICAgICAgIG1vdmwgICAgJElORkxBVEVfTU9ERV9UWVBFLCAlZWR4CisgICAgICAgIGptcCAgICAgLkxfdXBkYXRlX3N0cmVhbV9zdGF0ZQorCisuTF9pbnZhbGlkX2xpdGVyYWxfbGVuZ3RoX2NvZGU6CisgICAgICAgIC8qIGVsc2UgeworICAgICAgICAgKiAgIHN0cm0tPm1zZyA9ICJpbnZhbGlkIGxpdGVyYWwvbGVuZ3RoIGNvZGUiOworICAgICAgICAgKiAgIHN0YXRlLT5tb2RlID0gQkFEOworICAgICAgICAgKiB9CisgICAgICAgICAqLworICAgICAgICBtb3ZsICAgICQuTF9pbnZhbGlkX2xpdGVyYWxfbGVuZ3RoX2NvZGVfbXNnLCAlZWN4CisgICAgICAgIG1vdmwgICAgJElORkxBVEVfTU9ERV9CQUQsICVlZHgKKyAgICAgICAgam1wICAgICAuTF91cGRhdGVfc3RyZWFtX3N0YXRlCisKKy5MX2ludmFsaWRfZGlzdGFuY2VfdG9vX2ZhcjoKKyAgICAgICAgLyogc3RybS0+bXNnID0gImludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrIjsKKyAgICAgICAgICogc3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgICAqLworICAgICAgICBtb3ZsICAgIGluKCVlc3ApLCBpbl9yICAgICAgICAgIC8qIGZyb21fciBoYXMgaW4ncyByZWcsIHB1dCBpbiBiYWNrICovCisgICAgICAgIG1vdmwgICAgJC5MX2ludmFsaWRfZGlzdGFuY2VfdG9vX2Zhcl9tc2csICVlY3gKKyAgICAgICAgbW92bCAgICAkSU5GTEFURV9NT0RFX0JBRCwgJWVkeAorICAgICAgICBqbXAgICAgIC5MX3VwZGF0ZV9zdHJlYW1fc3RhdGUKKworLkxfdXBkYXRlX3N0cmVhbV9zdGF0ZToKKyAgICAgICAgLyogc2V0IHN0cm0tPm1zZyA9ICVlY3gsIHN0cm0tPnN0YXRlLT5tb2RlID0gJWVkeCAqLworICAgICAgICBtb3ZsICAgIHN0cm1fc3AoJWVzcCksICVlYXgKKyAgICAgICAgdGVzdGwgICAlZWN4LCAlZWN4ICAgICAgICAgICAgICAvKiBpZiAobXNnICE9IE5VTEwpICovCisgICAgICAgIGp6ICAgICAgLkxfc2tpcF9tc2cKKyAgICAgICAgbW92bCAgICAlZWN4LCBtc2dfc3RybSglZWF4KSAgICAvKiBzdHJtLT5tc2cgPSBtc2cgKi8KKy5MX3NraXBfbXNnOgorICAgICAgICBtb3ZsICAgIHN0YXRlX3N0cm0oJWVheCksICVlYXggIC8qIHN0YXRlID0gc3RybS0+c3RhdGUgKi8KKyAgICAgICAgbW92bCAgICAlZWR4LCBtb2RlX3N0YXRlKCVlYXgpICAvKiBzdGF0ZS0+bW9kZSA9IGVkeCAoQkFEIHwgVFlQRSkgKi8KKyAgICAgICAgam1wICAgICAuTF9icmVha19sb29wCisKKy5hbGlnbiAzMiwweDkwCisuTF9icmVha19sb29wOgorCisvKgorICogUmVnczoKKyAqCisgKiBiaXRzID0gJWVicCB3aGVuIG1teCwgYW5kIGluICVlYnggd2hlbiBub24tbW14CisgKiBob2xkID0gJWhvbGRfbW0gd2hlbiBtbXgsIGFuZCBpbiAlZWJwIHdoZW4gbm9uLW1teAorICogaW4gICA9ICVlc2kKKyAqIG91dCAgPSAlZWRpCisgKi8KKworI2lmIGRlZmluZWQoIFVTRV9NTVggKSB8fCBkZWZpbmVkKCBSVU5fVElNRV9NTVggKQorCisjaWYgZGVmaW5lZCggUlVOX1RJTUVfTU1YICkKKworICAgICAgICBjbXBsICAgICRET19VU0VfTU1YLCBpbmZsYXRlX2Zhc3RfdXNlX21teAorICAgICAgICBqbmUgICAgIC5MX3VwZGF0ZV9uZXh0X2luCisKKyNlbmRpZiAvKiBSVU5fVElNRV9NTVggKi8KKworICAgICAgICBtb3ZsICAgICVlYnAsICVlYngKKworLkxfdXBkYXRlX25leHRfaW46CisKKyNlbmRpZgorCisjZGVmaW5lIHN0cm1fciAgJWVheAorI2RlZmluZSBzdGF0ZV9yICVlZHgKKworICAgICAgICAvKiBsZW4gPSBiaXRzID4+IDM7CisgICAgICAgICAqIGluIC09IGxlbjsKKyAgICAgICAgICogYml0cyAtPSBsZW4gPDwgMzsKKyAgICAgICAgICogaG9sZCAmPSAoMVUgPDwgYml0cykgLSAxOworICAgICAgICAgKiBzdGF0ZS0+aG9sZCA9IGhvbGQ7CisgICAgICAgICAqIHN0YXRlLT5iaXRzID0gYml0czsKKyAgICAgICAgICogc3RybS0+bmV4dF9pbiA9IGluOworICAgICAgICAgKiBzdHJtLT5uZXh0X291dCA9IG91dDsKKyAgICAgICAgICovCisgICAgICAgIG1vdmwgICAgc3RybV9zcCglZXNwKSwgc3RybV9yCisgICAgICAgIG1vdmwgICAgJWVieCwgJWVjeAorICAgICAgICBtb3ZsICAgIHN0YXRlX3N0cm0oc3RybV9yKSwgc3RhdGVfcgorICAgICAgICBzaHJsICAgICQzLCAlZWN4CisgICAgICAgIHN1YmwgICAgJWVjeCwgaW5fcgorICAgICAgICBzaGxsICAgICQzLCAlZWN4CisgICAgICAgIHN1YmwgICAgJWVjeCwgJWVieAorICAgICAgICBtb3ZsICAgIG91dF9yLCBuZXh0X291dF9zdHJtKHN0cm1fcikKKyAgICAgICAgbW92bCAgICAlZWJ4LCBiaXRzX3N0YXRlKHN0YXRlX3IpCisgICAgICAgIG1vdmwgICAgJWVieCwgJWVjeAorCisgICAgICAgIGxlYWwgICAgYnVmKCVlc3ApLCAlZWJ4CisgICAgICAgIGNtcGwgICAgJWVieCwgbGFzdCglZXNwKQorICAgICAgICBqbmUgICAgIC5MX2J1Zl9ub3RfdXNlZCAgICAgICAgIC8qIGlmIGJ1ZiAhPSBsYXN0ICovCisKKyAgICAgICAgc3VibCAgICAlZWJ4LCBpbl9yICAgICAgICAgICAgICAvKiBpbiAtPSBidWYgKi8KKyAgICAgICAgbW92bCAgICBuZXh0X2luX3N0cm0oc3RybV9yKSwgJWVieAorICAgICAgICBtb3ZsICAgICVlYngsIGxhc3QoJWVzcCkgICAgICAgIC8qIGxhc3QgPSBzdHJtLT5uZXh0X2luICovCisgICAgICAgIGFkZGwgICAgJWVieCwgaW5fciAgICAgICAgICAgICAgLyogaW4gKz0gc3RybS0+bmV4dF9pbiAqLworICAgICAgICBtb3ZsICAgIGF2YWlsX2luX3N0cm0oc3RybV9yKSwgJWVieAorICAgICAgICBzdWJsICAgICQxMSwgJWVieAorICAgICAgICBhZGRsICAgICVlYngsIGxhc3QoJWVzcCkgICAgLyogbGFzdCA9ICZzdHJtLT5uZXh0X2luWyBhdmFpbF9pbiAtIDExIF0gKi8KKworLkxfYnVmX25vdF91c2VkOgorICAgICAgICBtb3ZsICAgIGluX3IsIG5leHRfaW5fc3RybShzdHJtX3IpCisKKyAgICAgICAgbW92bCAgICAkMSwgJWVieAorICAgICAgICBzaGxsICAgICVjbCwgJWVieAorICAgICAgICBkZWNsICAgICVlYngKKworI2lmIGRlZmluZWQoIFVTRV9NTVggKSB8fCBkZWZpbmVkKCBSVU5fVElNRV9NTVggKQorCisjaWYgZGVmaW5lZCggUlVOX1RJTUVfTU1YICkKKworICAgICAgICBjbXBsICAgICRET19VU0VfTU1YLCBpbmZsYXRlX2Zhc3RfdXNlX21teAorICAgICAgICBqbmUgICAgIC5MX3VwZGF0ZV9ob2xkCisKKyNlbmRpZiAvKiBSVU5fVElNRV9NTVggKi8KKworICAgICAgICBwc3JscSAgIHVzZWRfbW0sIGhvbGRfbW0gICAgICAgIC8qIGhvbGRfbW0gPj49IGxhc3QgYml0IGxlbmd0aCAqLworICAgICAgICBtb3ZkICAgIGhvbGRfbW0sICVlYnAKKworICAgICAgICBlbW1zCisKKy5MX3VwZGF0ZV9ob2xkOgorCisjZW5kaWYgLyogVVNFX01NWCB8fCBSVU5fVElNRV9NTVggKi8KKworICAgICAgICBhbmRsICAgICVlYngsICVlYnAKKyAgICAgICAgbW92bCAgICAlZWJwLCBob2xkX3N0YXRlKHN0YXRlX3IpCisKKyNkZWZpbmUgbGFzdF9yICVlYngKKworICAgICAgICAvKiBzdHJtLT5hdmFpbF9pbiA9IGluIDwgbGFzdCA/IDExICsgKGxhc3QgLSBpbikgOiAxMSAtIChpbiAtIGxhc3QpICovCisgICAgICAgIG1vdmwgICAgbGFzdCglZXNwKSwgbGFzdF9yCisgICAgICAgIGNtcGwgICAgaW5fciwgbGFzdF9yCisgICAgICAgIGpiZSAgICAgLkxfbGFzdF9pc19zbWFsbGVyICAgICAvKiBpZiAoaW4gPj0gbGFzdCkgKi8KKworICAgICAgICBzdWJsICAgIGluX3IsIGxhc3RfciAgICAgICAgICAgLyogbGFzdCAtPSBpbiAqLworICAgICAgICBhZGRsICAgICQxMSwgbGFzdF9yICAgICAgICAgICAgLyogbGFzdCArPSAxMSAqLworICAgICAgICBtb3ZsICAgIGxhc3RfciwgYXZhaWxfaW5fc3RybShzdHJtX3IpCisgICAgICAgIGptcCAgICAgLkxfZml4dXBfb3V0CisuTF9sYXN0X2lzX3NtYWxsZXI6CisgICAgICAgIHN1YmwgICAgbGFzdF9yLCBpbl9yICAgICAgICAgICAvKiBpbiAtPSBsYXN0ICovCisgICAgICAgIG5lZ2wgICAgaW5fciAgICAgICAgICAgICAgICAgICAvKiBpbiA9IC1pbiAqLworICAgICAgICBhZGRsICAgICQxMSwgaW5fciAgICAgICAgICAgICAgLyogaW4gKz0gMTEgKi8KKyAgICAgICAgbW92bCAgICBpbl9yLCBhdmFpbF9pbl9zdHJtKHN0cm1fcikKKworI3VuZGVmIGxhc3RfcgorI2RlZmluZSBlbmRfciAlZWJ4CisKKy5MX2ZpeHVwX291dDoKKyAgICAgICAgLyogc3RybS0+YXZhaWxfb3V0ID0gb3V0IDwgZW5kID8gMjU3ICsgKGVuZCAtIG91dCkgOiAyNTcgLSAob3V0IC0gZW5kKSovCisgICAgICAgIG1vdmwgICAgZW5kKCVlc3ApLCBlbmRfcgorICAgICAgICBjbXBsICAgIG91dF9yLCBlbmRfcgorICAgICAgICBqYmUgICAgIC5MX2VuZF9pc19zbWFsbGVyICAgICAgLyogaWYgKG91dCA+PSBlbmQpICovCisKKyAgICAgICAgc3VibCAgICBvdXRfciwgZW5kX3IgICAgICAgICAgIC8qIGVuZCAtPSBvdXQgKi8KKyAgICAgICAgYWRkbCAgICAkMjU3LCBlbmRfciAgICAgICAgICAgIC8qIGVuZCArPSAyNTcgKi8KKyAgICAgICAgbW92bCAgICBlbmRfciwgYXZhaWxfb3V0X3N0cm0oc3RybV9yKQorICAgICAgICBqbXAgICAgIC5MX2RvbmUKKy5MX2VuZF9pc19zbWFsbGVyOgorICAgICAgICBzdWJsICAgIGVuZF9yLCBvdXRfciAgICAgICAgICAgLyogb3V0IC09IGVuZCAqLworICAgICAgICBuZWdsICAgIG91dF9yICAgICAgICAgICAgICAgICAgLyogb3V0ID0gLW91dCAqLworICAgICAgICBhZGRsICAgICQyNTcsIG91dF9yICAgICAgICAgICAgLyogb3V0ICs9IDI1NyAqLworICAgICAgICBtb3ZsICAgIG91dF9yLCBhdmFpbF9vdXRfc3RybShzdHJtX3IpCisKKyN1bmRlZiBlbmRfcgorI3VuZGVmIHN0cm1fcgorI3VuZGVmIHN0YXRlX3IKKworLkxfZG9uZToKKyAgICAgICAgYWRkbCAgICAkbG9jYWxfdmFyX3NpemUsICVlc3AKKyAgICAgICAgcG9wZgorICAgICAgICBwb3BsICAgICVlYngKKyAgICAgICAgcG9wbCAgICAlZWJwCisgICAgICAgIHBvcGwgICAgJWVzaQorICAgICAgICBwb3BsICAgICVlZGkKKyAgICAgICAgcmV0CisKKyNpZiBkZWZpbmVkKCBHQVNfRUxGICkKKy8qIGVsZiBpbmZvICovCisudHlwZSBpbmZsYXRlX2Zhc3QsQGZ1bmN0aW9uCisuc2l6ZSBpbmZsYXRlX2Zhc3QsLi1pbmZsYXRlX2Zhc3QKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvemxpYi0xLjIuNi9jb250cmliL2lvc3RyZWFtL3Rlc3QuY3BwIGIvemxpYi0xLjIuNi9jb250cmliL2lvc3RyZWFtL3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkMjY1YjMKLS0tIC9kZXYvbnVsbAorKysgYi96bGliLTEuMi42L2NvbnRyaWIvaW9zdHJlYW0vdGVzdC5jcHAKQEAgLTAsMCArMSwyNCBAQAorCisjaW5jbHVkZSAiemZzdHJlYW0uaCIKKworaW50IG1haW4oKSB7CisKKyAgLy8gQ29uc3RydWN0IGEgc3RyZWFtIG9iamVjdCB3aXRoIHRoaXMgZmlsZWJ1ZmZlci4gIEFueXRoaW5nIHNlbnQKKyAgLy8gdG8gdGhpcyBzdHJlYW0gd2lsbCBnbyB0byBzdGFuZGFyZCBvdXQuCisgIGd6b2ZzdHJlYW0gb3MoIDEsIGlvczo6b3V0ICk7CisKKyAgLy8gVGhpcyB0ZXh0IGlzIGdldHRpbmcgY29tcHJlc3NlZCBhbmQgc2VudCB0byBzdGRvdXQuCisgIC8vIFRvIHByb3ZlIHRoaXMsIHJ1biAndGVzdCB8IHpjYXQnLgorICBvcyA8PCAiSGVsbG8sIE1vbW15IiA8PCBlbmRsOworCisgIG9zIDw8IHNldGNvbXByZXNzaW9ubGV2ZWwoIFpfTk9fQ09NUFJFU1NJT04gKTsKKyAgb3MgPDwgImhlbGxvLCBoZWxsbywgaGksIGhvISIgPDwgZW5kbDsKKworICBzZXRjb21wcmVzc2lvbmxldmVsKCBvcywgWl9ERUZBVUxUX0NPTVBSRVNTSU9OICkKKyAgICA8PCAiSSdtIGNvbXByZXNzaW5nIGFnYWluIiA8PCBlbmRsOworCisgIG9zLmNsb3NlKCk7CisKKyAgcmV0dXJuIDA7CisKK30KZGlmZiAtLWdpdCBhL3psaWItMS4yLjYvY29udHJpYi9pb3N0cmVhbS96ZnN0cmVhbS5jcHAgYi96bGliLTEuMi42L2NvbnRyaWIvaW9zdHJlYW0vemZzdHJlYW0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwY2Q4NWYKLS0tIC9kZXYvbnVsbAorKysgYi96bGliLTEuMi42L2NvbnRyaWIvaW9zdHJlYW0vemZzdHJlYW0uY3BwCkBAIC0wLDAgKzEsMzI5IEBACisKKyNpbmNsdWRlICJ6ZnN0cmVhbS5oIgorCitnemZpbGVidWY6Omd6ZmlsZWJ1ZigpIDoKKyAgZmlsZShOVUxMKSwKKyAgbW9kZSgwKSwKKyAgb3duX2ZpbGVfZGVzY3JpcHRvcigwKQoreyB9CisKK2d6ZmlsZWJ1Zjo6fmd6ZmlsZWJ1ZigpIHsKKworICBzeW5jKCk7CisgIGlmICggb3duX2ZpbGVfZGVzY3JpcHRvciApCisgICAgY2xvc2UoKTsKKworfQorCitnemZpbGVidWYgKmd6ZmlsZWJ1Zjo6b3BlbiggY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW9fbW9kZSApIHsKKworICBpZiAoIGlzX29wZW4oKSApCisgICAgcmV0dXJuIE5VTEw7CisKKyAgY2hhciBjaGFyX21vZGVbMTBdOworICBjaGFyICpwID0gY2hhcl9tb2RlOworCisgIGlmICggaW9fbW9kZSAmIGlvczo6aW4gKSB7CisgICAgbW9kZSA9IGlvczo6aW47CisgICAgKnArKyA9ICdyJzsKKyAgfSBlbHNlIGlmICggaW9fbW9kZSAmIGlvczo6YXBwICkgeworICAgIG1vZGUgPSBpb3M6OmFwcDsKKyAgICAqcCsrID0gJ2EnOworICB9IGVsc2UgeworICAgIG1vZGUgPSBpb3M6Om91dDsKKyAgICAqcCsrID0gJ3cnOworICB9CisKKyAgaWYgKCBpb19tb2RlICYgaW9zOjpiaW5hcnkgKSB7CisgICAgbW9kZSB8PSBpb3M6OmJpbmFyeTsKKyAgICAqcCsrID0gJ2InOworICB9CisKKyAgLy8gSGFyZCBjb2RlIHRoZSBjb21wcmVzc2lvbiBsZXZlbAorICBpZiAoIGlvX21vZGUgJiAoaW9zOjpvdXR8aW9zOjphcHAgKSkgeworICAgICpwKysgPSAnOSc7CisgIH0KKworICAvLyBQdXQgdGhlIGVuZC1vZi1zdHJpbmcgaW5kaWNhdG9yCisgICpwID0gJ1wwJzsKKworICBpZiAoIChmaWxlID0gZ3pvcGVuKG5hbWUsIGNoYXJfbW9kZSkpID09IE5VTEwgKQorICAgIHJldHVybiBOVUxMOworCisgIG93bl9maWxlX2Rlc2NyaXB0b3IgPSAxOworCisgIHJldHVybiB0aGlzOworCit9CisKK2d6ZmlsZWJ1ZiAqZ3pmaWxlYnVmOjphdHRhY2goIGludCBmaWxlX2Rlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW9fbW9kZSApIHsKKworICBpZiAoIGlzX29wZW4oKSApCisgICAgcmV0dXJuIE5VTEw7CisKKyAgY2hhciBjaGFyX21vZGVbMTBdOworICBjaGFyICpwID0gY2hhcl9tb2RlOworCisgIGlmICggaW9fbW9kZSAmIGlvczo6aW4gKSB7CisgICAgbW9kZSA9IGlvczo6aW47CisgICAgKnArKyA9ICdyJzsKKyAgfSBlbHNlIGlmICggaW9fbW9kZSAmIGlvczo6YXBwICkgeworICAgIG1vZGUgPSBpb3M6OmFwcDsKKyAgICAqcCsrID0gJ2EnOworICB9IGVsc2UgeworICAgIG1vZGUgPSBpb3M6Om91dDsKKyAgICAqcCsrID0gJ3cnOworICB9CisKKyAgaWYgKCBpb19tb2RlICYgaW9zOjpiaW5hcnkgKSB7CisgICAgbW9kZSB8PSBpb3M6OmJpbmFyeTsKKyAgICAqcCsrID0gJ2InOworICB9CisKKyAgLy8gSGFyZCBjb2RlIHRoZSBjb21wcmVzc2lvbiBsZXZlbAorICBpZiAoIGlvX21vZGUgJiAoaW9zOjpvdXR8aW9zOjphcHAgKSkgeworICAgICpwKysgPSAnOSc7CisgIH0KKworICAvLyBQdXQgdGhlIGVuZC1vZi1zdHJpbmcgaW5kaWNhdG9yCisgICpwID0gJ1wwJzsKKworICBpZiAoIChmaWxlID0gZ3pkb3BlbihmaWxlX2Rlc2NyaXB0b3IsIGNoYXJfbW9kZSkpID09IE5VTEwgKQorICAgIHJldHVybiBOVUxMOworCisgIG93bl9maWxlX2Rlc2NyaXB0b3IgPSAwOworCisgIHJldHVybiB0aGlzOworCit9CisKK2d6ZmlsZWJ1ZiAqZ3pmaWxlYnVmOjpjbG9zZSgpIHsKKworICBpZiAoIGlzX29wZW4oKSApIHsKKworICAgIHN5bmMoKTsKKyAgICBnemNsb3NlKCBmaWxlICk7CisgICAgZmlsZSA9IE5VTEw7CisKKyAgfQorCisgIHJldHVybiB0aGlzOworCit9CisKK2ludCBnemZpbGVidWY6OnNldGNvbXByZXNzaW9ubGV2ZWwoIGludCBjb21wX2xldmVsICkgeworCisgIHJldHVybiBnenNldHBhcmFtcyhmaWxlLCBjb21wX2xldmVsLCAtMik7CisKK30KKworaW50IGd6ZmlsZWJ1Zjo6c2V0Y29tcHJlc3Npb25zdHJhdGVneSggaW50IGNvbXBfc3RyYXRlZ3kgKSB7CisKKyAgcmV0dXJuIGd6c2V0cGFyYW1zKGZpbGUsIC0yLCBjb21wX3N0cmF0ZWd5KTsKKworfQorCisKK3N0cmVhbXBvcyBnemZpbGVidWY6OnNlZWtvZmYoIHN0cmVhbW9mZiBvZmYsIGlvczo6c2Vla19kaXIgZGlyLCBpbnQgd2hpY2ggKSB7CisKKyAgcmV0dXJuIHN0cmVhbXBvcyhFT0YpOworCit9CisKK2ludCBnemZpbGVidWY6OnVuZGVyZmxvdygpIHsKKworICAvLyBJZiB0aGUgZmlsZSBoYXNuJ3QgYmVlbiBvcGVuZWQgZm9yIHJlYWRpbmcsIGVycm9yLgorICBpZiAoICFpc19vcGVuKCkgfHwgIShtb2RlICYgaW9zOjppbikgKQorICAgIHJldHVybiBFT0Y7CisKKyAgLy8gaWYgYSBidWZmZXIgZG9lc24ndCBleGlzdHMsIGFsbG9jYXRlIG9uZS4KKyAgaWYgKCAhYmFzZSgpICkgeworCisgICAgaWYgKCAoYWxsb2NhdGUoKSkgPT0gRU9GICkKKyAgICAgIHJldHVybiBFT0Y7CisgICAgc2V0cCgwLDApOworCisgIH0gZWxzZSB7CisKKyAgICBpZiAoIGluX2F2YWlsKCkgKQorICAgICAgcmV0dXJuICh1bnNpZ25lZCBjaGFyKSAqZ3B0cigpOworCisgICAgaWYgKCBvdXRfd2FpdGluZygpICkgeworICAgICAgaWYgKCBmbHVzaGJ1ZigpID09IEVPRiApCisgICAgICAgIHJldHVybiBFT0Y7CisgICAgfQorCisgIH0KKworICAvLyBBdHRlbXB0IHRvIGZpbGwgdGhlIGJ1ZmZlci4KKworICBpbnQgcmVzdWx0ID0gZmlsbGJ1ZigpOworICBpZiAoIHJlc3VsdCA9PSBFT0YgKSB7CisgICAgLy8gZGlzYWJsZSBnZXQgYXJlYQorICAgIHNldGcoMCwwLDApOworICAgIHJldHVybiBFT0Y7CisgIH0KKworICByZXR1cm4gKHVuc2lnbmVkIGNoYXIpICpncHRyKCk7CisKK30KKworaW50IGd6ZmlsZWJ1Zjo6b3ZlcmZsb3coIGludCBjICkgeworCisgIGlmICggIWlzX29wZW4oKSB8fCAhKG1vZGUgJiBpb3M6Om91dCkgKQorICAgIHJldHVybiBFT0Y7CisKKyAgaWYgKCAhYmFzZSgpICkgeworICAgIGlmICggYWxsb2NhdGUoKSA9PSBFT0YgKQorICAgICAgcmV0dXJuIEVPRjsKKyAgICBzZXRnKDAsMCwwKTsKKyAgfSBlbHNlIHsKKyAgICBpZiAoaW5fYXZhaWwoKSkgeworICAgICAgICByZXR1cm4gRU9GOworICAgIH0KKyAgICBpZiAob3V0X3dhaXRpbmcoKSkgeworICAgICAgaWYgKGZsdXNoYnVmKCkgPT0gRU9GKQorICAgICAgICByZXR1cm4gRU9GOworICAgIH0KKyAgfQorCisgIGludCBibCA9IGJsZW4oKTsKKyAgc2V0cCggYmFzZSgpLCBiYXNlKCkgKyBibCk7CisKKyAgaWYgKCBjICE9IEVPRiApIHsKKworICAgICpwcHRyKCkgPSBjOworICAgIHBidW1wKDEpOworCisgIH0KKworICByZXR1cm4gMDsKKworfQorCitpbnQgZ3pmaWxlYnVmOjpzeW5jKCkgeworCisgIGlmICggIWlzX29wZW4oKSApCisgICAgcmV0dXJuIEVPRjsKKworICBpZiAoIG91dF93YWl0aW5nKCkgKQorICAgIHJldHVybiBmbHVzaGJ1ZigpOworCisgIHJldHVybiAwOworCit9CisKK2ludCBnemZpbGVidWY6OmZsdXNoYnVmKCkgeworCisgIGludCBuOworICBjaGFyICpxOworCisgIHEgPSBwYmFzZSgpOworICBuID0gcHB0cigpIC0gcTsKKworICBpZiAoIGd6d3JpdGUoIGZpbGUsIHEsIG4pIDwgbiApCisgICAgcmV0dXJuIEVPRjsKKworICBzZXRwKDAsMCk7CisKKyAgcmV0dXJuIDA7CisKK30KKworaW50IGd6ZmlsZWJ1Zjo6ZmlsbGJ1ZigpIHsKKworICBpbnQgcmVxdWlyZWQ7CisgIGNoYXIgKnA7CisKKyAgcCA9IGJhc2UoKTsKKworICByZXF1aXJlZCA9IGJsZW4oKTsKKworICBpbnQgdCA9IGd6cmVhZCggZmlsZSwgcCwgcmVxdWlyZWQgKTsKKworICBpZiAoIHQgPD0gMCkgcmV0dXJuIEVPRjsKKworICBzZXRnKCBiYXNlKCksIGJhc2UoKSwgYmFzZSgpK3QpOworCisgIHJldHVybiB0OworCit9CisKK2d6ZmlsZXN0cmVhbV9jb21tb246Omd6ZmlsZXN0cmVhbV9jb21tb24oKSA6CisgIGlvcyggZ3pmaWxlc3RyZWFtX2NvbW1vbjo6cmRidWYoKSApCit7IH0KKworZ3pmaWxlc3RyZWFtX2NvbW1vbjo6fmd6ZmlsZXN0cmVhbV9jb21tb24oKQoreyB9CisKK3ZvaWQgZ3pmaWxlc3RyZWFtX2NvbW1vbjo6YXR0YWNoKCBpbnQgZmQsIGludCBpb19tb2RlICkgeworCisgIGlmICggIWJ1ZmZlci5hdHRhY2goIGZkLCBpb19tb2RlKSApCisgICAgY2xlYXIoIGlvczo6ZmFpbGJpdCB8IGlvczo6YmFkYml0ICk7CisgIGVsc2UKKyAgICBjbGVhcigpOworCit9CisKK3ZvaWQgZ3pmaWxlc3RyZWFtX2NvbW1vbjo6b3BlbiggY29uc3QgY2hhciAqbmFtZSwgaW50IGlvX21vZGUgKSB7CisKKyAgaWYgKCAhYnVmZmVyLm9wZW4oIG5hbWUsIGlvX21vZGUgKSApCisgICAgY2xlYXIoIGlvczo6ZmFpbGJpdCB8IGlvczo6YmFkYml0ICk7CisgIGVsc2UKKyAgICBjbGVhcigpOworCit9CisKK3ZvaWQgZ3pmaWxlc3RyZWFtX2NvbW1vbjo6Y2xvc2UoKSB7CisKKyAgaWYgKCAhYnVmZmVyLmNsb3NlKCkgKQorICAgIGNsZWFyKCBpb3M6OmZhaWxiaXQgfCBpb3M6OmJhZGJpdCApOworCit9CisKK2d6ZmlsZWJ1ZiAqZ3pmaWxlc3RyZWFtX2NvbW1vbjo6cmRidWYoKQoreworICByZXR1cm4gJmJ1ZmZlcjsKK30KKworZ3ppZnN0cmVhbTo6Z3ppZnN0cmVhbSgpIDoKKyAgaW9zKCBnemZpbGVzdHJlYW1fY29tbW9uOjpyZGJ1ZigpICkKK3sKKyAgY2xlYXIoIGlvczo6YmFkYml0ICk7Cit9CisKK2d6aWZzdHJlYW06Omd6aWZzdHJlYW0oIGNvbnN0IGNoYXIgKm5hbWUsIGludCBpb19tb2RlICkgOgorICBpb3MoIGd6ZmlsZXN0cmVhbV9jb21tb246OnJkYnVmKCkgKQoreworICBnemZpbGVzdHJlYW1fY29tbW9uOjpvcGVuKCBuYW1lLCBpb19tb2RlICk7Cit9CisKK2d6aWZzdHJlYW06Omd6aWZzdHJlYW0oIGludCBmZCwgaW50IGlvX21vZGUgKSA6CisgIGlvcyggZ3pmaWxlc3RyZWFtX2NvbW1vbjo6cmRidWYoKSApCit7CisgIGd6ZmlsZXN0cmVhbV9jb21tb246OmF0dGFjaCggZmQsIGlvX21vZGUgKTsKK30KKworZ3ppZnN0cmVhbTo6fmd6aWZzdHJlYW0oKSB7IH0KKworZ3pvZnN0cmVhbTo6Z3pvZnN0cmVhbSgpIDoKKyAgaW9zKCBnemZpbGVzdHJlYW1fY29tbW9uOjpyZGJ1ZigpICkKK3sKKyAgY2xlYXIoIGlvczo6YmFkYml0ICk7Cit9CisKK2d6b2ZzdHJlYW06Omd6b2ZzdHJlYW0oIGNvbnN0IGNoYXIgKm5hbWUsIGludCBpb19tb2RlICkgOgorICBpb3MoIGd6ZmlsZXN0cmVhbV9jb21tb246OnJkYnVmKCkgKQoreworICBnemZpbGVzdHJlYW1fY29tbW9uOjpvcGVuKCBuYW1lLCBpb19tb2RlICk7Cit9CisKK2d6b2ZzdHJlYW06Omd6b2ZzdHJlYW0oIGludCBmZCwgaW50IGlvX21vZGUgKSA6CisgIGlvcyggZ3pmaWxlc3RyZWFtX2NvbW1vbjo6cmRidWYoKSApCit7CisgIGd6ZmlsZXN0cmVhbV9jb21tb246OmF0dGFjaCggZmQsIGlvX21vZGUgKTsKK30KKworZ3pvZnN0cmVhbTo6fmd6b2ZzdHJlYW0oKSB7IH0KZGlmZiAtLWdpdCBhL3psaWItMS4yLjYvY29udHJpYi9pb3N0cmVhbS96ZnN0cmVhbS5oIGIvemxpYi0xLjIuNi9jb250cmliL2lvc3RyZWFtL3pmc3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ3OTA5OAotLS0gL2Rldi9udWxsCisrKyBiL3psaWItMS4yLjYvY29udHJpYi9pb3N0cmVhbS96ZnN0cmVhbS5oCkBAIC0wLDAgKzEsMTI4IEBACisKKyNpZm5kZWYgemZzdHJlYW1faAorI2RlZmluZSB6ZnN0cmVhbV9oCisKKyNpbmNsdWRlIDxmc3RyZWFtLmg+CisjaW5jbHVkZSAiemxpYi5oIgorCitjbGFzcyBnemZpbGVidWYgOiBwdWJsaWMgc3RyZWFtYnVmIHsKKworcHVibGljOgorCisgIGd6ZmlsZWJ1ZiggKTsKKyAgdmlydHVhbCB+Z3pmaWxlYnVmKCk7CisKKyAgZ3pmaWxlYnVmICpvcGVuKCBjb25zdCBjaGFyICpuYW1lLCBpbnQgaW9fbW9kZSApOworICBnemZpbGVidWYgKmF0dGFjaCggaW50IGZpbGVfZGVzY3JpcHRvciwgaW50IGlvX21vZGUgKTsKKyAgZ3pmaWxlYnVmICpjbG9zZSgpOworCisgIGludCBzZXRjb21wcmVzc2lvbmxldmVsKCBpbnQgY29tcF9sZXZlbCApOworICBpbnQgc2V0Y29tcHJlc3Npb25zdHJhdGVneSggaW50IGNvbXBfc3RyYXRlZ3kgKTsKKworICBpbmxpbmUgaW50IGlzX29wZW4oKSBjb25zdCB7IHJldHVybiAoZmlsZSAhPU5VTEwpOyB9CisKKyAgdmlydHVhbCBzdHJlYW1wb3Mgc2Vla29mZiggc3RyZWFtb2ZmLCBpb3M6OnNlZWtfZGlyLCBpbnQgKTsKKworICB2aXJ0dWFsIGludCBzeW5jKCk7CisKK3Byb3RlY3RlZDoKKworICB2aXJ0dWFsIGludCB1bmRlcmZsb3coKTsKKyAgdmlydHVhbCBpbnQgb3ZlcmZsb3coIGludCA9IEVPRiApOworCitwcml2YXRlOgorCisgIGd6RmlsZSBmaWxlOworICBzaG9ydCBtb2RlOworICBzaG9ydCBvd25fZmlsZV9kZXNjcmlwdG9yOworCisgIGludCBmbHVzaGJ1ZigpOworICBpbnQgZmlsbGJ1ZigpOworCit9OworCitjbGFzcyBnemZpbGVzdHJlYW1fY29tbW9uIDogdmlydHVhbCBwdWJsaWMgaW9zIHsKKworICBmcmllbmQgY2xhc3MgZ3ppZnN0cmVhbTsKKyAgZnJpZW5kIGNsYXNzIGd6b2ZzdHJlYW07CisgIGZyaWVuZCBnem9mc3RyZWFtICZzZXRjb21wcmVzc2lvbmxldmVsKCBnem9mc3RyZWFtICYsIGludCApOworICBmcmllbmQgZ3pvZnN0cmVhbSAmc2V0Y29tcHJlc3Npb25zdHJhdGVneSggZ3pvZnN0cmVhbSAmLCBpbnQgKTsKKworcHVibGljOgorICB2aXJ0dWFsIH5nemZpbGVzdHJlYW1fY29tbW9uKCk7CisKKyAgdm9pZCBhdHRhY2goIGludCBmZCwgaW50IGlvX21vZGUgKTsKKyAgdm9pZCBvcGVuKCBjb25zdCBjaGFyICpuYW1lLCBpbnQgaW9fbW9kZSApOworICB2b2lkIGNsb3NlKCk7CisKK3Byb3RlY3RlZDoKKyAgZ3pmaWxlc3RyZWFtX2NvbW1vbigpOworCitwcml2YXRlOgorICBnemZpbGVidWYgKnJkYnVmKCk7CisKKyAgZ3pmaWxlYnVmIGJ1ZmZlcjsKKworfTsKKworY2xhc3MgZ3ppZnN0cmVhbSA6IHB1YmxpYyBnemZpbGVzdHJlYW1fY29tbW9uLCBwdWJsaWMgaXN0cmVhbSB7CisKK3B1YmxpYzoKKworICBnemlmc3RyZWFtKCk7CisgIGd6aWZzdHJlYW0oIGNvbnN0IGNoYXIgKm5hbWUsIGludCBpb19tb2RlID0gaW9zOjppbiApOworICBnemlmc3RyZWFtKCBpbnQgZmQsIGludCBpb19tb2RlID0gaW9zOjppbiApOworCisgIHZpcnR1YWwgfmd6aWZzdHJlYW0oKTsKKworfTsKKworY2xhc3MgZ3pvZnN0cmVhbSA6IHB1YmxpYyBnemZpbGVzdHJlYW1fY29tbW9uLCBwdWJsaWMgb3N0cmVhbSB7CisKK3B1YmxpYzoKKworICBnem9mc3RyZWFtKCk7CisgIGd6b2ZzdHJlYW0oIGNvbnN0IGNoYXIgKm5hbWUsIGludCBpb19tb2RlID0gaW9zOjpvdXQgKTsKKyAgZ3pvZnN0cmVhbSggaW50IGZkLCBpbnQgaW9fbW9kZSA9IGlvczo6b3V0ICk7CisKKyAgdmlydHVhbCB+Z3pvZnN0cmVhbSgpOworCit9OworCit0ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyBnem9tYW5pcCB7CisgIGZyaWVuZCBnem9mc3RyZWFtICZvcGVyYXRvcjw8KGd6b2ZzdHJlYW0gJiwgY29uc3QgZ3pvbWFuaXA8VD4gJik7CitwdWJsaWM6CisgIGd6b21hbmlwKGd6b2ZzdHJlYW0gJigqZikoZ3pvZnN0cmVhbSAmLCBUKSwgVCB2KSA6IGZ1bmMoZiksIHZhbCh2KSB7IH0KK3ByaXZhdGU6CisgIGd6b2ZzdHJlYW0gJigqZnVuYykoZ3pvZnN0cmVhbSAmLCBUKTsKKyAgVCB2YWw7Cit9OworCit0ZW1wbGF0ZTxjbGFzcyBUPiBnem9mc3RyZWFtICZvcGVyYXRvcjw8KGd6b2ZzdHJlYW0gJnMsIGNvbnN0IGd6b21hbmlwPFQ+ICZtKQoreworICByZXR1cm4gKCptLmZ1bmMpKHMsIG0udmFsKTsKK30KKworaW5saW5lIGd6b2ZzdHJlYW0gJnNldGNvbXByZXNzaW9ubGV2ZWwoIGd6b2ZzdHJlYW0gJnMsIGludCBsICkKK3sKKyAgKHMucmRidWYoKSktPnNldGNvbXByZXNzaW9ubGV2ZWwobCk7CisgIHJldHVybiBzOworfQorCitpbmxpbmUgZ3pvZnN0cmVhbSAmc2V0Y29tcHJlc3Npb25zdHJhdGVneSggZ3pvZnN0cmVhbSAmcywgaW50IGwgKQoreworICAocy5yZGJ1ZigpKS0+c2V0Y29tcHJlc3Npb25zdHJhdGVneShsKTsKKyAgcmV0dXJuIHM7Cit9CisKK2lubGluZSBnem9tYW5pcDxpbnQ+IHNldGNvbXByZXNzaW9ubGV2ZWwoaW50IGwpCit7CisgIHJldHVybiBnem9tYW5pcDxpbnQ+KCZzZXRjb21wcmVzc2lvbmxldmVsLGwpOworfQorCitpbmxpbmUgZ3pvbWFuaXA8aW50PiBzZXRjb21wcmVzc2lvbnN0cmF0ZWd5KGludCBsKQoreworICByZXR1cm4gZ3pvbWFuaXA8aW50Pigmc2V0Y29tcHJlc3Npb25zdHJhdGVneSxsKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS96bGliLTEuMi42L2NvbnRyaWIvaW9zdHJlYW0yL3pzdHJlYW0uaCBiL3psaWItMS4yLjYvY29udHJpYi9pb3N0cmVhbTIvenN0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzZDIzMzIKLS0tIC9kZXYvbnVsbAorKysgYi96bGliLTEuMi42L2NvbnRyaWIvaW9zdHJlYW0yL3pzdHJlYW0uaApAQCAtMCwwICsxLDMwNyBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcKKyAqIENocmlzdGlhbiBNaWNoZWxzZW4gUmVzZWFyY2ggQVMKKyAqIEFkdmFuY2VkIENvbXB1dGluZworICogRmFudG9mdHZlZ2VuIDM4LCA1MDM2IEJFUkdFTiwgTm9yd2F5CisgKiBodHRwOi8vd3d3LmNtci5ubworICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgQ2hyaXN0aWFuIE1pY2hlbHNlbiBSZXNlYXJjaCBBUyBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqLworCisjaWZuZGVmIFpTVFJFQU1fX0gKKyNkZWZpbmUgWlNUUkVBTV9fSAorCisvKgorICogenN0cmVhbS5oIC0gQysrIGludGVyZmFjZSB0byB0aGUgJ3psaWInIGdlbmVyYWwgcHVycG9zZSBjb21wcmVzc2lvbiBsaWJyYXJ5CisgKiAkSWQ6IHpzdHJlYW0uaCAxLjEgMTk5Ny0wNi0yNSAxMjowMDo1NiswMiB0eWdlIEV4cCB0eWdlICQKKyAqLworCisjaW5jbHVkZSA8c3Ryc3RyZWFtLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJ6bGliLmgiCisKKyNpZiBkZWZpbmVkKF9XSU4zMikKKyMgICBpbmNsdWRlIDxmY250bC5oPgorIyAgIGluY2x1ZGUgPGlvLmg+CisjICAgZGVmaW5lIFNFVF9CSU5BUllfTU9ERShmaWxlKSBzZXRtb2RlKGZpbGVubyhmaWxlKSwgT19CSU5BUlkpCisjZWxzZQorIyAgIGRlZmluZSBTRVRfQklOQVJZX01PREUoZmlsZSkKKyNlbmRpZgorCitjbGFzcyB6c3RyaW5nbGVuIHsKK3B1YmxpYzoKKyAgICB6c3RyaW5nbGVuKGNsYXNzIGl6c3RyZWFtJik7CisgICAgenN0cmluZ2xlbihjbGFzcyBvenN0cmVhbSYsIGNvbnN0IGNoYXIqKTsKKyAgICBzaXplX3QgdmFsdWUoKSBjb25zdCB7IHJldHVybiB2YWwud29yZDsgfQorcHJpdmF0ZToKKyAgICBzdHJ1Y3QgVmFsIHsgdW5zaWduZWQgY2hhciBieXRlOyBzaXplX3Qgd29yZDsgfSB2YWw7Cit9OworCisvLyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gaXpzdHJlYW0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgaXpzdHJlYW0KK3sKKyAgICBwdWJsaWM6CisgICAgICAgIGl6c3RyZWFtKCkgOiBtX2ZwKDApIHt9CisgICAgICAgIGl6c3RyZWFtKEZJTEUqIGZwKSA6IG1fZnAoMCkgeyBvcGVuKGZwKTsgfQorICAgICAgICBpenN0cmVhbShjb25zdCBjaGFyKiBuYW1lKSA6IG1fZnAoMCkgeyBvcGVuKG5hbWUpOyB9CisgICAgICAgIH5penN0cmVhbSgpIHsgY2xvc2UoKTsgfQorCisgICAgICAgIC8qIE9wZW5zIGEgZ3ppcCAoLmd6KSBmaWxlIGZvciByZWFkaW5nLgorICAgICAgICAgKiBvcGVuKCkgY2FuIGJlIHVzZWQgdG8gcmVhZCBhIGZpbGUgd2hpY2ggaXMgbm90IGluIGd6aXAgZm9ybWF0OworICAgICAgICAgKiBpbiB0aGlzIGNhc2UgcmVhZCgpIHdpbGwgZGlyZWN0bHkgcmVhZCBmcm9tIHRoZSBmaWxlIHdpdGhvdXQKKyAgICAgICAgICogZGVjb21wcmVzc2lvbi4gZXJybm8gY2FuIGJlIGNoZWNrZWQgdG8gZGlzdGluZ3Vpc2ggdHdvIGVycm9yCisgICAgICAgICAqIGNhc2VzIChpZiBlcnJubyBpcyB6ZXJvLCB0aGUgemxpYiBlcnJvciBpcyBaX01FTV9FUlJPUikuCisgICAgICAgICAqLworICAgICAgICB2b2lkIG9wZW4oY29uc3QgY2hhciogbmFtZSkgeworICAgICAgICAgICAgaWYgKG1fZnApIGNsb3NlKCk7CisgICAgICAgICAgICBtX2ZwID0gOjpnem9wZW4obmFtZSwgInJiIik7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIG9wZW4oRklMRSogZnApIHsKKyAgICAgICAgICAgIFNFVF9CSU5BUllfTU9ERShmcCk7CisgICAgICAgICAgICBpZiAobV9mcCkgY2xvc2UoKTsKKyAgICAgICAgICAgIG1fZnAgPSA6Omd6ZG9wZW4oZmlsZW5vKGZwKSwgInJiIik7CisgICAgICAgIH0KKworICAgICAgICAvKiBGbHVzaGVzIGFsbCBwZW5kaW5nIGlucHV0IGlmIG5lY2Vzc2FyeSwgY2xvc2VzIHRoZSBjb21wcmVzc2VkIGZpbGUKKyAgICAgICAgICogYW5kIGRlYWxsb2NhdGVzIGFsbCB0aGUgKGRlKWNvbXByZXNzaW9uIHN0YXRlLiBUaGUgcmV0dXJuIHZhbHVlIGlzCisgICAgICAgICAqIHRoZSB6bGliIGVycm9yIG51bWJlciAoc2VlIGZ1bmN0aW9uIGVycm9yKCkgYmVsb3cpLgorICAgICAgICAgKi8KKyAgICAgICAgaW50IGNsb3NlKCkgeworICAgICAgICAgICAgaW50IHIgPSA6Omd6Y2xvc2UobV9mcCk7CisgICAgICAgICAgICBtX2ZwID0gMDsgcmV0dXJuIHI7CisgICAgICAgIH0KKworICAgICAgICAvKiBCaW5hcnkgcmVhZCB0aGUgZ2l2ZW4gbnVtYmVyIG9mIGJ5dGVzIGZyb20gdGhlIGNvbXByZXNzZWQgZmlsZS4KKyAgICAgICAgICovCisgICAgICAgIGludCByZWFkKHZvaWQqIGJ1Ziwgc2l6ZV90IGxlbikgeworICAgICAgICAgICAgcmV0dXJuIDo6Z3pyZWFkKG1fZnAsIGJ1ZiwgbGVuKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFJldHVybnMgdGhlIGVycm9yIG1lc3NhZ2UgZm9yIHRoZSBsYXN0IGVycm9yIHdoaWNoIG9jY3VycmVkIG9uIHRoZQorICAgICAgICAgKiBnaXZlbiBjb21wcmVzc2VkIGZpbGUuIGVycm51bSBpcyBzZXQgdG8gemxpYiBlcnJvciBudW1iZXIuIElmIGFuCisgICAgICAgICAqIGVycm9yIG9jY3VycmVkIGluIHRoZSBmaWxlIHN5c3RlbSBhbmQgbm90IGluIHRoZSBjb21wcmVzc2lvbiBsaWJyYXJ5LAorICAgICAgICAgKiBlcnJudW0gaXMgc2V0IHRvIFpfRVJSTk8gYW5kIHRoZSBhcHBsaWNhdGlvbiBtYXkgY29uc3VsdCBlcnJubworICAgICAgICAgKiB0byBnZXQgdGhlIGV4YWN0IGVycm9yIGNvZGUuCisgICAgICAgICAqLworICAgICAgICBjb25zdCBjaGFyKiBlcnJvcihpbnQqIGVycm51bSkgeworICAgICAgICAgICAgcmV0dXJuIDo6Z3plcnJvcihtX2ZwLCBlcnJudW0pOworICAgICAgICB9CisKKyAgICAgICAgZ3pGaWxlIGZwKCkgeyByZXR1cm4gbV9mcDsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgZ3pGaWxlIG1fZnA7Cit9OworCisvKgorICogQmluYXJ5IHJlYWQgdGhlIGdpdmVuIChhcnJheSBvZikgb2JqZWN0KHMpIGZyb20gdGhlIGNvbXByZXNzZWQgZmlsZS4KKyAqIElmIHRoZSBpbnB1dCBmaWxlIHdhcyBub3QgaW4gZ3ppcCBmb3JtYXQsIHJlYWQoKSBjb3BpZXMgdGhlIG9iamVjdHMgbnVtYmVyCisgKiBvZiBieXRlcyBpbnRvIHRoZSBidWZmZXIuCisgKiByZXR1cm5zIHRoZSBudW1iZXIgb2YgdW5jb21wcmVzc2VkIGJ5dGVzIGFjdHVhbGx5IHJlYWQKKyAqICgwIGZvciBlbmQgb2YgZmlsZSwgLTEgZm9yIGVycm9yKS4KKyAqLwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIEl0ZW1zPgoraW5saW5lIGludCByZWFkKGl6c3RyZWFtJiB6cywgVCogeCwgSXRlbXMgaXRlbXMpIHsKKyAgICByZXR1cm4gOjpnenJlYWQoenMuZnAoKSwgeCwgaXRlbXMqc2l6ZW9mKFQpKTsKK30KKworLyoKKyAqIEJpbmFyeSBpbnB1dCB3aXRoIHRoZSAnPicgb3BlcmF0b3IuCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBUPgoraW5saW5lIGl6c3RyZWFtJiBvcGVyYXRvcj4oaXpzdHJlYW0mIHpzLCBUJiB4KSB7CisgICAgOjpnenJlYWQoenMuZnAoKSwgJngsIHNpemVvZihUKSk7CisgICAgcmV0dXJuIHpzOworfQorCisKK2lubGluZSB6c3RyaW5nbGVuOjp6c3RyaW5nbGVuKGl6c3RyZWFtJiB6cykgeworICAgIHpzID4gdmFsLmJ5dGU7CisgICAgaWYgKHZhbC5ieXRlID09IDI1NSkgenMgPiB2YWwud29yZDsKKyAgICBlbHNlIHZhbC53b3JkID0gdmFsLmJ5dGU7Cit9CisKKy8qCisgKiBSZWFkIGxlbmd0aCBvZiBzdHJpbmcgKyB0aGUgc3RyaW5nIHdpdGggdGhlICc+JyBvcGVyYXRvci4KKyAqLworaW5saW5lIGl6c3RyZWFtJiBvcGVyYXRvcj4oaXpzdHJlYW0mIHpzLCBjaGFyKiB4KSB7CisgICAgenN0cmluZ2xlbiBsZW4oenMpOworICAgIDo6Z3pyZWFkKHpzLmZwKCksIHgsIGxlbi52YWx1ZSgpKTsKKyAgICB4W2xlbi52YWx1ZSgpXSA9ICdcMCc7CisgICAgcmV0dXJuIHpzOworfQorCitpbmxpbmUgY2hhciogcmVhZF9zdHJpbmcoaXpzdHJlYW0mIHpzKSB7CisgICAgenN0cmluZ2xlbiBsZW4oenMpOworICAgIGNoYXIqIHggPSBuZXcgY2hhcltsZW4udmFsdWUoKSsxXTsKKyAgICA6Omd6cmVhZCh6cy5mcCgpLCB4LCBsZW4udmFsdWUoKSk7CisgICAgeFtsZW4udmFsdWUoKV0gPSAnXDAnOworICAgIHJldHVybiB4OworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBvenN0cmVhbSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBvenN0cmVhbQoreworICAgIHB1YmxpYzoKKyAgICAgICAgb3pzdHJlYW0oKSA6IG1fZnAoMCksIG1fb3MoMCkgeworICAgICAgICB9CisgICAgICAgIG96c3RyZWFtKEZJTEUqIGZwLCBpbnQgbGV2ZWwgPSBaX0RFRkFVTFRfQ09NUFJFU1NJT04pCisgICAgICAgICAgICA6IG1fZnAoMCksIG1fb3MoMCkgeworICAgICAgICAgICAgb3BlbihmcCwgbGV2ZWwpOworICAgICAgICB9CisgICAgICAgIG96c3RyZWFtKGNvbnN0IGNoYXIqIG5hbWUsIGludCBsZXZlbCA9IFpfREVGQVVMVF9DT01QUkVTU0lPTikKKyAgICAgICAgICAgIDogbV9mcCgwKSwgbV9vcygwKSB7CisgICAgICAgICAgICBvcGVuKG5hbWUsIGxldmVsKTsKKyAgICAgICAgfQorICAgICAgICB+b3pzdHJlYW0oKSB7CisgICAgICAgICAgICBjbG9zZSgpOworICAgICAgICB9CisKKyAgICAgICAgLyogT3BlbnMgYSBnemlwICguZ3opIGZpbGUgZm9yIHdyaXRpbmcuCisgICAgICAgICAqIFRoZSBjb21wcmVzc2lvbiBsZXZlbCBwYXJhbWV0ZXIgc2hvdWxkIGJlIGluIDAuLjkKKyAgICAgICAgICogZXJybm8gY2FuIGJlIGNoZWNrZWQgdG8gZGlzdGluZ3Vpc2ggdHdvIGVycm9yIGNhc2VzCisgICAgICAgICAqIChpZiBlcnJubyBpcyB6ZXJvLCB0aGUgemxpYiBlcnJvciBpcyBaX01FTV9FUlJPUikuCisgICAgICAgICAqLworICAgICAgICB2b2lkIG9wZW4oY29uc3QgY2hhciogbmFtZSwgaW50IGxldmVsID0gWl9ERUZBVUxUX0NPTVBSRVNTSU9OKSB7CisgICAgICAgICAgICBjaGFyIG1vZGVbNF0gPSAid2JcMCI7CisgICAgICAgICAgICBpZiAobGV2ZWwgIT0gWl9ERUZBVUxUX0NPTVBSRVNTSU9OKSBtb2RlWzJdID0gJzAnK2xldmVsOworICAgICAgICAgICAgaWYgKG1fZnApIGNsb3NlKCk7CisgICAgICAgICAgICBtX2ZwID0gOjpnem9wZW4obmFtZSwgbW9kZSk7CisgICAgICAgIH0KKworICAgICAgICAvKiBvcGVuIGZyb20gYSBGSUxFIHBvaW50ZXIuCisgICAgICAgICAqLworICAgICAgICB2b2lkIG9wZW4oRklMRSogZnAsIGludCBsZXZlbCA9IFpfREVGQVVMVF9DT01QUkVTU0lPTikgeworICAgICAgICAgICAgU0VUX0JJTkFSWV9NT0RFKGZwKTsKKyAgICAgICAgICAgIGNoYXIgbW9kZVs0XSA9ICJ3YlwwIjsKKyAgICAgICAgICAgIGlmIChsZXZlbCAhPSBaX0RFRkFVTFRfQ09NUFJFU1NJT04pIG1vZGVbMl0gPSAnMCcrbGV2ZWw7CisgICAgICAgICAgICBpZiAobV9mcCkgY2xvc2UoKTsKKyAgICAgICAgICAgIG1fZnAgPSA6Omd6ZG9wZW4oZmlsZW5vKGZwKSwgbW9kZSk7CisgICAgICAgIH0KKworICAgICAgICAvKiBGbHVzaGVzIGFsbCBwZW5kaW5nIG91dHB1dCBpZiBuZWNlc3NhcnksIGNsb3NlcyB0aGUgY29tcHJlc3NlZCBmaWxlCisgICAgICAgICAqIGFuZCBkZWFsbG9jYXRlcyBhbGwgdGhlIChkZSljb21wcmVzc2lvbiBzdGF0ZS4gVGhlIHJldHVybiB2YWx1ZSBpcworICAgICAgICAgKiB0aGUgemxpYiBlcnJvciBudW1iZXIgKHNlZSBmdW5jdGlvbiBlcnJvcigpIGJlbG93KS4KKyAgICAgICAgICovCisgICAgICAgIGludCBjbG9zZSgpIHsKKyAgICAgICAgICAgIGlmIChtX29zKSB7CisgICAgICAgICAgICAgICAgOjpnendyaXRlKG1fZnAsIG1fb3MtPnN0cigpLCBtX29zLT5wY291bnQoKSk7CisgICAgICAgICAgICAgICAgZGVsZXRlW10gbV9vcy0+c3RyKCk7IGRlbGV0ZSBtX29zOyBtX29zID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCByID0gOjpnemNsb3NlKG1fZnApOyBtX2ZwID0gMDsgcmV0dXJuIHI7CisgICAgICAgIH0KKworICAgICAgICAvKiBCaW5hcnkgd3JpdGUgdGhlIGdpdmVuIG51bWJlciBvZiBieXRlcyBpbnRvIHRoZSBjb21wcmVzc2VkIGZpbGUuCisgICAgICAgICAqLworICAgICAgICBpbnQgd3JpdGUoY29uc3Qgdm9pZCogYnVmLCBzaXplX3QgbGVuKSB7CisgICAgICAgICAgICByZXR1cm4gOjpnendyaXRlKG1fZnAsICh2b2lkcCkgYnVmLCBsZW4pOworICAgICAgICB9CisKKyAgICAgICAgLyogRmx1c2hlcyBhbGwgcGVuZGluZyBvdXRwdXQgaW50byB0aGUgY29tcHJlc3NlZCBmaWxlLiBUaGUgcGFyYW1ldGVyCisgICAgICAgICAqIF9mbHVzaCBpcyBhcyBpbiB0aGUgZGVmbGF0ZSgpIGZ1bmN0aW9uLiBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSB6bGliCisgICAgICAgICAqIGVycm9yIG51bWJlciAoc2VlIGZ1bmN0aW9uIGd6ZXJyb3IgYmVsb3cpLiBmbHVzaCgpIHJldHVybnMgWl9PSyBpZgorICAgICAgICAgKiB0aGUgZmx1c2hfIHBhcmFtZXRlciBpcyBaX0ZJTklTSCBhbmQgYWxsIG91dHB1dCBjb3VsZCBiZSBmbHVzaGVkLgorICAgICAgICAgKiBmbHVzaCgpIHNob3VsZCBiZSBjYWxsZWQgb25seSB3aGVuIHN0cmljdGx5IG5lY2Vzc2FyeSBiZWNhdXNlIGl0IGNhbgorICAgICAgICAgKiBkZWdyYWRlIGNvbXByZXNzaW9uLgorICAgICAgICAgKi8KKyAgICAgICAgaW50IGZsdXNoKGludCBfZmx1c2gpIHsKKyAgICAgICAgICAgIG9zX2ZsdXNoKCk7CisgICAgICAgICAgICByZXR1cm4gOjpnemZsdXNoKG1fZnAsIF9mbHVzaCk7CisgICAgICAgIH0KKworICAgICAgICAvKiBSZXR1cm5zIHRoZSBlcnJvciBtZXNzYWdlIGZvciB0aGUgbGFzdCBlcnJvciB3aGljaCBvY2N1cnJlZCBvbiB0aGUKKyAgICAgICAgICogZ2l2ZW4gY29tcHJlc3NlZCBmaWxlLiBlcnJudW0gaXMgc2V0IHRvIHpsaWIgZXJyb3IgbnVtYmVyLiBJZiBhbgorICAgICAgICAgKiBlcnJvciBvY2N1cnJlZCBpbiB0aGUgZmlsZSBzeXN0ZW0gYW5kIG5vdCBpbiB0aGUgY29tcHJlc3Npb24gbGlicmFyeSwKKyAgICAgICAgICogZXJybnVtIGlzIHNldCB0byBaX0VSUk5PIGFuZCB0aGUgYXBwbGljYXRpb24gbWF5IGNvbnN1bHQgZXJybm8KKyAgICAgICAgICogdG8gZ2V0IHRoZSBleGFjdCBlcnJvciBjb2RlLgorICAgICAgICAgKi8KKyAgICAgICAgY29uc3QgY2hhciogZXJyb3IoaW50KiBlcnJudW0pIHsKKyAgICAgICAgICAgIHJldHVybiA6Omd6ZXJyb3IobV9mcCwgZXJybnVtKTsKKyAgICAgICAgfQorCisgICAgICAgIGd6RmlsZSBmcCgpIHsgcmV0dXJuIG1fZnA7IH0KKworICAgICAgICBvc3RyZWFtJiBvcygpIHsKKyAgICAgICAgICAgIGlmIChtX29zID09IDApIG1fb3MgPSBuZXcgb3N0cnN0cmVhbTsKKyAgICAgICAgICAgIHJldHVybiAqbV9vczsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgb3NfZmx1c2goKSB7CisgICAgICAgICAgICBpZiAobV9vcyAmJiBtX29zLT5wY291bnQoKT4wKSB7CisgICAgICAgICAgICAgICAgb3N0cnN0cmVhbSogb3NzID0gbmV3IG9zdHJzdHJlYW07CisgICAgICAgICAgICAgICAgb3NzLT5maWxsKG1fb3MtPmZpbGwoKSk7CisgICAgICAgICAgICAgICAgb3NzLT5mbGFncyhtX29zLT5mbGFncygpKTsKKyAgICAgICAgICAgICAgICBvc3MtPnByZWNpc2lvbihtX29zLT5wcmVjaXNpb24oKSk7CisgICAgICAgICAgICAgICAgb3NzLT53aWR0aChtX29zLT53aWR0aCgpKTsKKyAgICAgICAgICAgICAgICA6Omd6d3JpdGUobV9mcCwgbV9vcy0+c3RyKCksIG1fb3MtPnBjb3VudCgpKTsKKyAgICAgICAgICAgICAgICBkZWxldGVbXSBtX29zLT5zdHIoKTsgZGVsZXRlIG1fb3M7IG1fb3MgPSBvc3M7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIGd6RmlsZSBtX2ZwOworICAgICAgICBvc3Ryc3RyZWFtKiBtX29zOworfTsKKworLyoKKyAqIEJpbmFyeSB3cml0ZSB0aGUgZ2l2ZW4gKGFycmF5IG9mKSBvYmplY3QocykgaW50byB0aGUgY29tcHJlc3NlZCBmaWxlLgorICogcmV0dXJucyB0aGUgbnVtYmVyIG9mIHVuY29tcHJlc3NlZCBieXRlcyBhY3R1YWxseSB3cml0dGVuCisgKiAoMCBpbiBjYXNlIG9mIGVycm9yKS4KKyAqLwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIEl0ZW1zPgoraW5saW5lIGludCB3cml0ZShvenN0cmVhbSYgenMsIGNvbnN0IFQqIHgsIEl0ZW1zIGl0ZW1zKSB7CisgICAgcmV0dXJuIDo6Z3p3cml0ZSh6cy5mcCgpLCAodm9pZHApIHgsIGl0ZW1zKnNpemVvZihUKSk7Cit9CisKKy8qCisgKiBCaW5hcnkgb3V0cHV0IHdpdGggdGhlICc8JyBvcGVyYXRvci4KKyAqLwordGVtcGxhdGUgPGNsYXNzIFQ+CitpbmxpbmUgb3pzdHJlYW0mIG9wZXJhdG9yPChvenN0cmVhbSYgenMsIGNvbnN0IFQmIHgpIHsKKyAgICA6Omd6d3JpdGUoenMuZnAoKSwgKHZvaWRwKSAmeCwgc2l6ZW9mKFQpKTsKKyAgICByZXR1cm4genM7Cit9CisKK2lubGluZSB6c3RyaW5nbGVuOjp6c3RyaW5nbGVuKG96c3RyZWFtJiB6cywgY29uc3QgY2hhciogeCkgeworICAgIHZhbC5ieXRlID0gMjU1OyAgdmFsLndvcmQgPSA6OnN0cmxlbih4KTsKKyAgICBpZiAodmFsLndvcmQgPCAyNTUpIHpzIDwgKHZhbC5ieXRlID0gdmFsLndvcmQpOworICAgIGVsc2UgenMgPCB2YWw7Cit9CisKKy8qCisgKiBXcml0ZSBsZW5ndGggb2Ygc3RyaW5nICsgdGhlIHN0cmluZyB3aXRoIHRoZSAnPCcgb3BlcmF0b3IuCisgKi8KK2lubGluZSBvenN0cmVhbSYgb3BlcmF0b3I8KG96c3RyZWFtJiB6cywgY29uc3QgY2hhciogeCkgeworICAgIHpzdHJpbmdsZW4gbGVuKHpzLCB4KTsKKyAgICA6Omd6d3JpdGUoenMuZnAoKSwgKHZvaWRwKSB4LCBsZW4udmFsdWUoKSk7CisgICAgcmV0dXJuIHpzOworfQorCisjaWZkZWYgX01TQ19WRVIKK2lubGluZSBvenN0cmVhbSYgb3BlcmF0b3I8KG96c3RyZWFtJiB6cywgY2hhciogY29uc3QmIHgpIHsKKyAgICByZXR1cm4genMgPCAoY29uc3QgY2hhciopIHg7Cit9CisjZW5kaWYKKworLyoKKyAqIEFzY2lpIHdyaXRlIHdpdGggdGhlIDw8IG9wZXJhdG9yOworICovCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK2lubGluZSBvc3RyZWFtJiBvcGVyYXRvcjw8KG96c3RyZWFtJiB6cywgY29uc3QgVCYgeCkgeworICAgIHpzLm9zX2ZsdXNoKCk7CisgICAgcmV0dXJuIHpzLm9zKCkgPDwgeDsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS96bGliLTEuMi42L2NvbnRyaWIvaW9zdHJlYW0yL3pzdHJlYW1fdGVzdC5jcHAgYi96bGliLTEuMi42L2NvbnRyaWIvaW9zdHJlYW0yL3pzdHJlYW1fdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI3M2Y2MgotLS0gL2Rldi9udWxsCisrKyBiL3psaWItMS4yLjYvY29udHJpYi9pb3N0cmVhbTIvenN0cmVhbV90ZXN0LmNwcApAQCAtMCwwICsxLDI1IEBACisjaW5jbHVkZSAienN0cmVhbS5oIgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxpb21hbmlwLmg+CisKK3ZvaWQgbWFpbigpIHsKKyAgICBjaGFyIGhbMjU2XSA9ICJIZWxsbyI7CisgICAgY2hhciogZyA9ICJHb29kYnllIjsKKyAgICBvenN0cmVhbSBvdXQoInRlbXAuZ3oiKTsKKyAgICBvdXQgPCAiVGhpcyB3b3JrcyB3ZWxsIiA8IGggPCBnOworICAgIG91dC5jbG9zZSgpOworCisgICAgaXpzdHJlYW0gaW4oInRlbXAuZ3oiKTsgLy8gcmVhZCBpdCBiYWNrCisgICAgY2hhciAqeCA9IHJlYWRfc3RyaW5nKGluKSwgKnkgPSBuZXcgY2hhclsyNTZdLCB6WzI1Nl07CisgICAgaW4gPiB5ID4gejsKKyAgICBpbi5jbG9zZSgpOworICAgIGNvdXQgPDwgeCA8PCBlbmRsIDw8IHkgPDwgZW5kbCA8PCB6IDw8IGVuZGw7CisKKyAgICBvdXQub3BlbigidGVtcC5neiIpOyAvLyB0cnkgYXNjaWkgb3V0cHV0OyB6Y2F0IHRlbXAuZ3ogdG8gc2VlIHRoZSByZXN1bHRzCisgICAgb3V0IDw8IHNldHcoNTApIDw8IHNldGZpbGwoJyMnKSA8PCBzZXRwcmVjaXNpb24oMjApIDw8IHggPDwgZW5kbCA8PCB5IDw8IGVuZGwgPDwgeiA8PCBlbmRsOworICAgIG91dCA8PCB6IDw8IGVuZGwgPDwgeSA8PCBlbmRsIDw8IHggPDwgZW5kbDsKKyAgICBvdXQgPDwgMS4xMjM0NTY3ODkwMTIzNDU2Nzg5IDw8IGVuZGw7CisKKyAgICBkZWxldGVbXSB4OyBkZWxldGVbXSB5OworfQpkaWZmIC0tZ2l0IGEvemxpYi0xLjIuNi9jb250cmliL2lvc3RyZWFtMy9SRUFETUUgYi96bGliLTEuMi42L2NvbnRyaWIvaW9zdHJlYW0zL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2IzMTlhCi0tLSAvZGV2L251bGwKKysrIGIvemxpYi0xLjIuNi9jb250cmliL2lvc3RyZWFtMy9SRUFETUUKQEAgLTAsMCArMSwzNSBAQAorVGhlc2UgY2xhc3NlcyBwcm92aWRlIGEgQysrIHN0cmVhbSBpbnRlcmZhY2UgdG8gdGhlIHpsaWIgbGlicmFyeS4gSXQgYWxsb3dzIHlvdQordG8gZG8gdGhpbmdzIGxpa2U6CisKKyAgZ3pvZnN0cmVhbSBvdXRmKCJibGFoLmd6Iik7CisgIG91dGYgPDwgIlRoZXNlIGdvIGludG8gdGhlIGd6aXAgZmlsZSAiIDw8IDEyMyA8PCBlbmRsOworCitJdCBkb2VzIHRoaXMgYnkgZGVyaXZpbmcgYSBzcGVjaWFsaXplZCBzdHJlYW0gYnVmZmVyIGZvciBnemlwcGVkIGZpbGVzLCB3aGljaCBpcwordGhlIHdheSBTdHJvdXN0cnVwIHdvdWxkIGhhdmUgZG9uZSBpdC4gOi0+CisKK1RoZSBnemlmc3RyZWFtIGFuZCBnem9mc3RyZWFtIGNsYXNzZXMgd2VyZSBvcmlnaW5hbGx5IHdyaXR0ZW4gYnkgS2V2aW4gUnVsYW5kCithbmQgbWFkZSBhdmFpbGFibGUgaW4gdGhlIHpsaWIgY29udHJpYi9pb3N0cmVhbSBkaXJlY3RvcnkuIFRoZSBvbGRlciB2ZXJzaW9uIHN0aWxsCitjb21waWxlcyB1bmRlciBnY2MgMi54eCwgYnV0IG5vdCB1bmRlciBnY2MgMy54eCwgd2hpY2ggc3BhcmtlZCB0aGUgZGV2ZWxvcG1lbnQgb2YKK3RoaXMgdmVyc2lvbi4KKworVGhlIG5ldyBjbGFzc2VzIGFyZSBhcyBzdGFuZGFyZC1jb21wbGlhbnQgYXMgcG9zc2libGUsIGNsb3NlbHkgZm9sbG93aW5nIHRoZQorYXBwcm9hY2ggb2YgdGhlIHN0YW5kYXJkIGxpYnJhcnkncyBmc3RyZWFtIGNsYXNzZXMuIEl0IGNvbXBpbGVzIHVuZGVyIGdjYyB2ZXJzaW9ucworMy4yIGFuZCAzLjMsIGJ1dCBub3QgdW5kZXIgZ2NjIDIueHguIFRoaXMgaXMgbWFpbmx5IGR1ZSB0byBjaGFuZ2VzIGluIHRoZSBzdGFuZGFyZAorbGlicmFyeSBuYW1pbmcgc2NoZW1lLiBUaGUgbmV3IHZlcnNpb24gb2YgZ3ppZnN0cmVhbS9nem9mc3RyZWFtL2d6ZmlsZWJ1ZiBkaWZmZXJzCitmcm9tIHRoZSBwcmV2aW91cyBvbmUgaW4gdGhlIGZvbGxvd2luZyByZXNwZWN0czoKKy0gYWRkZWQgc2hvd21hbnljCistIGFkZGVkIHNldGJ1Ziwgd2l0aCBzdXBwb3J0IGZvciB1bmJ1ZmZlcmVkIG91dHB1dCB2aWEgc2V0YnVmKDAsMCkKKy0gYSBmZXcgYnVnIGZpeGVzIG9mIHN0cmVhbSBiZWhhdmlvcgorLSBnemlwcGVkIG91dHB1dCBmaWxlIG9wZW5lZCB3aXRoIGRlZmF1bHQgY29tcHJlc3Npb24gbGV2ZWwgaW5zdGVhZCBvZiBtYXhpbXVtIGxldmVsCistIHNldGNvbXByZXNzaW9ubGV2ZWwoKS9zdHJhdGVneSgpIG1lbWJlcnMgcmVwbGFjZWQgYnkgc2luZ2xlIHNldGNvbXByZXNzaW9uKCkKKworVGhlIGNvZGUgaXMgcHJvdmlkZWQgImFzIGlzIiwgd2l0aCB0aGUgcGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZQorYW5kIHNlbGwgaXQgZm9yIGFueSBwdXJwb3NlIHdpdGhvdXQgZmVlLgorCitMdWR3aWcgU2Nod2FyZHQKKzxzY2h3YXJkdEBzdW4uYWMuemE+CisKK0RTUCBMYWIKK0VsZWN0cmljYWwgJiBFbGVjdHJvbmljIEVuZ2luZWVyaW5nIERlcGFydG1lbnQKK1VuaXZlcnNpdHkgb2YgU3RlbGxlbmJvc2NoCitTb3V0aCBBZnJpY2EKZGlmZiAtLWdpdCBhL3psaWItMS4yLjYvY29udHJpYi9pb3N0cmVhbTMvVE9ETyBiL3psaWItMS4yLjYvY29udHJpYi9pb3N0cmVhbTMvVE9ETwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDMyZjk3Ci0tLSAvZGV2L251bGwKKysrIGIvemxpYi0xLjIuNi9jb250cmliL2lvc3RyZWFtMy9UT0RPCkBAIC0wLDAgKzEsMTcgQEAKK1Bvc3NpYmxlIHVwZ3JhZGVzIHRvIGd6ZmlsZWJ1ZjoKKworLSBUaGUgYWJpbGl0eSB0byBkbyBwdXRiYWNrIChlLmcuIHB1dGJhY2tmYWlsKQorCistIFRoZSBhYmlsaXR5IHRvIHNlZWsgKHpsaWIgc3VwcG9ydHMgdGhpcywgYnV0IGNvdWxkIGJlIHNsb3cvdHJpY2t5KQorCistIFNpbXVsdGFuZW91cyByZWFkL3dyaXRlIGFjY2VzcyAoZG9lcyBpdCBtYWtlIHNlbnNlPykKKworLSBTdXBwb3J0IGZvciBpb3NfYmFzZTo6YXRlIG9wZW4gbW9kZQorCistIExvY2FsZSBzdXBwb3J0PworCistIENoZWNrIHB1YmxpYyBpbnRlcmZhY2UgdG8gc2VlIHdoaWNoIGNhbGxzIGdpdmUgcHJvYmxlbXMKKyAgKGR1ZSB0byBkZXBlbmRlbmNlIG9uIGxpYnJhcnkgaW50ZXJuYWxzKQorCistIE92ZXJyaWRlIG9wZXJhdG9yPDwob3N0cmVhbSYsIGd6ZmlsZWJ1ZiopIHRvIGFsbG93IGRpcmVjdCBjb3B5aW5nCisgIG9mIHN0cmVhbSBidWZmZXIgdG8gc3RyZWFtICggaS5lLiBvcyA8PCBpcy5yZGJ1ZigpOyApCmRpZmYgLS1naXQgYS96bGliLTEuMi42L2NvbnRyaWIvaW9zdHJlYW0zL3Rlc3QuY2MgYi96bGliLTEuMi42L2NvbnRyaWIvaW9zdHJlYW0zL3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQyMzUzMwotLS0gL2Rldi9udWxsCisrKyBiL3psaWItMS4yLjYvY29udHJpYi9pb3N0cmVhbTMvdGVzdC5jYwpAQCAtMCwwICsxLDUwIEBACisvKgorICogVGVzdCBwcm9ncmFtIGZvciBnemlmc3RyZWFtIGFuZCBnem9mc3RyZWFtCisgKgorICogYnkgTHVkd2lnIFNjaHdhcmR0IDxzY2h3YXJkdEBzdW4uYWMuemE+CisgKiBvcmlnaW5hbCB2ZXJzaW9uIGJ5IEtldmluIFJ1bGFuZCA8a2V2aW5Acm9kaW4ud3VzdGwuZWR1PgorICovCisKKyNpbmNsdWRlICJ6ZnN0cmVhbS5oIgorI2luY2x1ZGUgPGlvc3RyZWFtPiAgICAgIC8vIGZvciBjb3V0CisKK2ludCBtYWluKCkgeworCisgIGd6b2ZzdHJlYW0gb3V0ZjsKKyAgZ3ppZnN0cmVhbSBpbmY7CisgIGNoYXIgYnVmWzgwXTsKKworICBvdXRmLm9wZW4oInRlc3QxLnR4dC5neiIpOworICBvdXRmIDw8ICJUaGUgcXVpY2sgYnJvd24gZm94IHNpZGVzdGVwcGVkIHRoZSBsYXp5IGNhbmluZVxuIgorICAgICAgIDw8IDEuMyA8PCAiXG5QbGFuICIgPDwgOSA8PCBzdGQ6OmVuZGw7CisgIG91dGYuY2xvc2UoKTsKKyAgc3RkOjpjb3V0IDw8ICJXcm90ZSB0aGUgZm9sbG93aW5nIG1lc3NhZ2UgdG8gJ3Rlc3QxLnR4dC5neicgKGNoZWNrIHdpdGggemNhdCBvciB6bGVzcyk6XG4iCisgICAgICAgICAgICA8PCAiVGhlIHF1aWNrIGJyb3duIGZveCBzaWRlc3RlcHBlZCB0aGUgbGF6eSBjYW5pbmVcbiIKKyAgICAgICAgICAgIDw8IDEuMyA8PCAiXG5QbGFuICIgPDwgOSA8PCBzdGQ6OmVuZGw7CisKKyAgc3RkOjpjb3V0IDw8ICJcblJlYWRpbmcgJ3Rlc3QxLnR4dC5neicgKGJ1ZmZlcmVkKSBwcm9kdWNlczpcbiI7CisgIGluZi5vcGVuKCJ0ZXN0MS50eHQuZ3oiKTsKKyAgd2hpbGUgKGluZi5nZXRsaW5lKGJ1Ziw4MCwnXG4nKSkgeworICAgIHN0ZDo6Y291dCA8PCBidWYgPDwgIlx0KCIgPDwgaW5mLnJkYnVmKCktPmluX2F2YWlsKCkgPDwgIiBjaGFycyBsZWZ0IGluIGJ1ZmZlcilcbiI7CisgIH0KKyAgaW5mLmNsb3NlKCk7CisKKyAgb3V0Zi5yZGJ1ZigpLT5wdWJzZXRidWYoMCwwKTsKKyAgb3V0Zi5vcGVuKCJ0ZXN0Mi50eHQuZ3oiKTsKKyAgb3V0ZiA8PCBzZXRjb21wcmVzc2lvbihaX05PX0NPTVBSRVNTSU9OKQorICAgICAgIDw8ICJUaGUgcXVpY2sgYnJvd24gZm94IHNpZGVzdGVwcGVkIHRoZSBsYXp5IGNhbmluZVxuIgorICAgICAgIDw8IDEuMyA8PCAiXG5QbGFuICIgPDwgOSA8PCBzdGQ6OmVuZGw7CisgIG91dGYuY2xvc2UoKTsKKyAgc3RkOjpjb3V0IDw8ICJcbldyb3RlIHRoZSBzYW1lIG1lc3NhZ2UgdG8gJ3Rlc3QyLnR4dC5neicgaW4gdW5jb21wcmVzc2VkIGZvcm0iOworCisgIHN0ZDo6Y291dCA8PCAiXG5SZWFkaW5nICd0ZXN0Mi50eHQuZ3onICh1bmJ1ZmZlcmVkKSBwcm9kdWNlczpcbiI7CisgIGluZi5yZGJ1ZigpLT5wdWJzZXRidWYoMCwwKTsKKyAgaW5mLm9wZW4oInRlc3QyLnR4dC5neiIpOworICB3aGlsZSAoaW5mLmdldGxpbmUoYnVmLDgwLCdcbicpKSB7CisgICAgc3RkOjpjb3V0IDw8IGJ1ZiA8PCAiXHQoIiA8PCBpbmYucmRidWYoKS0+aW5fYXZhaWwoKSA8PCAiIGNoYXJzIGxlZnQgaW4gYnVmZmVyKVxuIjsKKyAgfQorICBpbmYuY2xvc2UoKTsKKworICByZXR1cm4gMDsKKworfQpkaWZmIC0tZ2l0IGEvemxpYi0xLjIuNi9jb250cmliL2lvc3RyZWFtMy96ZnN0cmVhbS5jYyBiL3psaWItMS4yLjYvY29udHJpYi9pb3N0cmVhbTMvemZzdHJlYW0uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRlYjkzMwotLS0gL2Rldi9udWxsCisrKyBiL3psaWItMS4yLjYvY29udHJpYi9pb3N0cmVhbTMvemZzdHJlYW0uY2MKQEAgLTAsMCArMSw0NzkgQEAKKy8qCisgKiBBIEMrKyBJL08gc3RyZWFtcyBpbnRlcmZhY2UgdG8gdGhlIHpsaWIgZ3oqIGZ1bmN0aW9ucworICoKKyAqIGJ5IEx1ZHdpZyBTY2h3YXJkdCA8c2Nod2FyZHRAc3VuLmFjLnphPgorICogb3JpZ2luYWwgdmVyc2lvbiBieSBLZXZpbiBSdWxhbmQgPGtldmluQHJvZGluLnd1c3RsLmVkdT4KKyAqCisgKiBUaGlzIHZlcnNpb24gaXMgc3RhbmRhcmQtY29tcGxpYW50IGFuZCBjb21wYXRpYmxlIHdpdGggZ2NjIDMueC4KKyAqLworCisjaW5jbHVkZSAiemZzdHJlYW0uaCIKKyNpbmNsdWRlIDxjc3RyaW5nPiAgICAgICAgICAvLyBmb3Igc3RyY3B5LCBzdHJjYXQsIHN0cmxlbiAobW9kZSBzdHJpbmdzKQorI2luY2x1ZGUgPGNzdGRpbz4gICAgICAgICAgIC8vIGZvciBCVUZTSVoKKworLy8gSW50ZXJuYWwgYnVmZmVyIHNpemVzIChkZWZhdWx0IGFuZCAidW5idWZmZXJlZCIgdmVyc2lvbnMpCisjZGVmaW5lIEJJR0JVRlNJWkUgQlVGU0laCisjZGVmaW5lIFNNQUxMQlVGU0laRSAxCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8gRGVmYXVsdCBjb25zdHJ1Y3RvcgorZ3pmaWxlYnVmOjpnemZpbGVidWYoKQorOiBmaWxlKE5VTEwpLCBpb19tb2RlKHN0ZDo6aW9zX2Jhc2U6Om9wZW5tb2RlKDApKSwgb3duX2ZkKGZhbHNlKSwKKyAgYnVmZmVyKE5VTEwpLCBidWZmZXJfc2l6ZShCSUdCVUZTSVpFKSwgb3duX2J1ZmZlcih0cnVlKQoreworICAvLyBObyBidWZmZXJzIHRvIHN0YXJ0IHdpdGgKKyAgdGhpcy0+ZGlzYWJsZV9idWZmZXIoKTsKK30KKworLy8gRGVzdHJ1Y3RvcgorZ3pmaWxlYnVmOjp+Z3pmaWxlYnVmKCkKK3sKKyAgLy8gU3luYyBvdXRwdXQgYnVmZmVyIGFuZCBjbG9zZSBvbmx5IGlmIHJlc3BvbnNpYmxlIGZvciBmaWxlCisgIC8vIChpLmUuIGF0dGFjaGVkIHN0cmVhbXMgc2hvdWxkIGJlIGxlZnQgb3BlbiBhdCB0aGlzIHN0YWdlKQorICB0aGlzLT5zeW5jKCk7CisgIGlmIChvd25fZmQpCisgICAgdGhpcy0+Y2xvc2UoKTsKKyAgLy8gTWFrZSBzdXJlIGludGVybmFsIGJ1ZmZlciBpcyBkZWFsbG9jYXRlZAorICB0aGlzLT5kaXNhYmxlX2J1ZmZlcigpOworfQorCisvLyBTZXQgY29tcHJlc3Npb24gbGV2ZWwgYW5kIHN0cmF0ZWd5CitpbnQKK2d6ZmlsZWJ1Zjo6c2V0Y29tcHJlc3Npb24oaW50IGNvbXBfbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb21wX3N0cmF0ZWd5KQoreworICByZXR1cm4gZ3pzZXRwYXJhbXMoZmlsZSwgY29tcF9sZXZlbCwgY29tcF9zdHJhdGVneSk7Cit9CisKKy8vIE9wZW4gZ3ppcHBlZCBmaWxlCitnemZpbGVidWYqCitnemZpbGVidWY6Om9wZW4oY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICBzdGQ6Omlvc19iYXNlOjpvcGVubW9kZSBtb2RlKQoreworICAvLyBGYWlsIGlmIGZpbGUgYWxyZWFkeSBvcGVuCisgIGlmICh0aGlzLT5pc19vcGVuKCkpCisgICAgcmV0dXJuIE5VTEw7CisgIC8vIERvbid0IHN1cHBvcnQgc2ltdWx0YW5lb3VzIHJlYWQvd3JpdGUgYWNjZXNzICh5ZXQpCisgIGlmICgobW9kZSAmIHN0ZDo6aW9zX2Jhc2U6OmluKSAmJiAobW9kZSAmIHN0ZDo6aW9zX2Jhc2U6Om91dCkpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgLy8gQnVpbGQgbW9kZSBzdHJpbmcgZm9yIGd6b3BlbiBhbmQgY2hlY2sgaXQgWzI3LjguMS4zLjJdCisgIGNoYXIgY2hhcl9tb2RlWzZdID0gIlwwXDBcMFwwXDAiOworICBpZiAoIXRoaXMtPm9wZW5fbW9kZShtb2RlLCBjaGFyX21vZGUpKQorICAgIHJldHVybiBOVUxMOworCisgIC8vIEF0dGVtcHQgdG8gb3BlbiBmaWxlCisgIGlmICgoZmlsZSA9IGd6b3BlbihuYW1lLCBjaGFyX21vZGUpKSA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIC8vIE9uIHN1Y2Nlc3MsIGFsbG9jYXRlIGludGVybmFsIGJ1ZmZlciBhbmQgc2V0IGZsYWdzCisgIHRoaXMtPmVuYWJsZV9idWZmZXIoKTsKKyAgaW9fbW9kZSA9IG1vZGU7CisgIG93bl9mZCA9IHRydWU7CisgIHJldHVybiB0aGlzOworfQorCisvLyBBdHRhY2ggdG8gZ3ppcHBlZCBmaWxlCitnemZpbGVidWYqCitnemZpbGVidWY6OmF0dGFjaChpbnQgZmQsCisgICAgICAgICAgICAgICAgICBzdGQ6Omlvc19iYXNlOjpvcGVubW9kZSBtb2RlKQoreworICAvLyBGYWlsIGlmIGZpbGUgYWxyZWFkeSBvcGVuCisgIGlmICh0aGlzLT5pc19vcGVuKCkpCisgICAgcmV0dXJuIE5VTEw7CisgIC8vIERvbid0IHN1cHBvcnQgc2ltdWx0YW5lb3VzIHJlYWQvd3JpdGUgYWNjZXNzICh5ZXQpCisgIGlmICgobW9kZSAmIHN0ZDo6aW9zX2Jhc2U6OmluKSAmJiAobW9kZSAmIHN0ZDo6aW9zX2Jhc2U6Om91dCkpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgLy8gQnVpbGQgbW9kZSBzdHJpbmcgZm9yIGd6ZG9wZW4gYW5kIGNoZWNrIGl0IFsyNy44LjEuMy4yXQorICBjaGFyIGNoYXJfbW9kZVs2XSA9ICJcMFwwXDBcMFwwIjsKKyAgaWYgKCF0aGlzLT5vcGVuX21vZGUobW9kZSwgY2hhcl9tb2RlKSkKKyAgICByZXR1cm4gTlVMTDsKKworICAvLyBBdHRlbXB0IHRvIGF0dGFjaCB0byBmaWxlCisgIGlmICgoZmlsZSA9IGd6ZG9wZW4oZmQsIGNoYXJfbW9kZSkpID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgLy8gT24gc3VjY2VzcywgYWxsb2NhdGUgaW50ZXJuYWwgYnVmZmVyIGFuZCBzZXQgZmxhZ3MKKyAgdGhpcy0+ZW5hYmxlX2J1ZmZlcigpOworICBpb19tb2RlID0gbW9kZTsKKyAgb3duX2ZkID0gZmFsc2U7CisgIHJldHVybiB0aGlzOworfQorCisvLyBDbG9zZSBnemlwcGVkIGZpbGUKK2d6ZmlsZWJ1ZioKK2d6ZmlsZWJ1Zjo6Y2xvc2UoKQoreworICAvLyBGYWlsIGltbWVkaWF0ZWx5IGlmIG5vIGZpbGUgaXMgb3BlbgorICBpZiAoIXRoaXMtPmlzX29wZW4oKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgLy8gQXNzdW1lIHN1Y2Nlc3MKKyAgZ3pmaWxlYnVmKiByZXR2YWwgPSB0aGlzOworICAvLyBBdHRlbXB0IHRvIHN5bmMgYW5kIGNsb3NlIGd6aXBwZWQgZmlsZQorICBpZiAodGhpcy0+c3luYygpID09IC0xKQorICAgIHJldHZhbCA9IE5VTEw7CisgIGlmIChnemNsb3NlKGZpbGUpIDwgMCkKKyAgICByZXR2YWwgPSBOVUxMOworICAvLyBGaWxlIGlzIG5vdyBnb25lIGFueXdheSAocG9zdGNvbmRpdGlvbiBbMjcuOC4xLjMuOF0pCisgIGZpbGUgPSBOVUxMOworICBvd25fZmQgPSBmYWxzZTsKKyAgLy8gRGVzdHJveSBpbnRlcm5hbCBidWZmZXIgaWYgaXQgZXhpc3RzCisgIHRoaXMtPmRpc2FibGVfYnVmZmVyKCk7CisgIHJldHVybiByZXR2YWw7Cit9CisKKy8qICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKi8KKworLy8gQ29udmVydCBpbnQgb3BlbiBtb2RlIHRvIG1vZGUgc3RyaW5nCitib29sCitnemZpbGVidWY6Om9wZW5fbW9kZShzdGQ6Omlvc19iYXNlOjpvcGVubW9kZSBtb2RlLAorICAgICAgICAgICAgICAgICAgICAgY2hhciogY19tb2RlKSBjb25zdAoreworICBib29sIHRlc3RiID0gbW9kZSAmIHN0ZDo6aW9zX2Jhc2U6OmJpbmFyeTsKKyAgYm9vbCB0ZXN0aSA9IG1vZGUgJiBzdGQ6Omlvc19iYXNlOjppbjsKKyAgYm9vbCB0ZXN0byA9IG1vZGUgJiBzdGQ6Omlvc19iYXNlOjpvdXQ7CisgIGJvb2wgdGVzdHQgPSBtb2RlICYgc3RkOjppb3NfYmFzZTo6dHJ1bmM7CisgIGJvb2wgdGVzdGEgPSBtb2RlICYgc3RkOjppb3NfYmFzZTo6YXBwOworCisgIC8vIENoZWNrIGZvciB2YWxpZCBmbGFnIGNvbWJpbmF0aW9ucyAtIHNlZSBbMjcuOC4xLjMuMl0gKFRhYmxlIDkyKQorICAvLyBPcmlnaW5hbCB6ZnN0cmVhbSBoYXJkY29kZWQgdGhlIGNvbXByZXNzaW9uIGxldmVsIHRvIG1heGltdW0gaGVyZS4uLgorICAvLyBEb3VibGUgdGhlIHRpbWUgZm9yIGxlc3MgdGhhbiAxJSBzaXplIGltcHJvdmVtZW50IHNlZW1zCisgIC8vIGV4Y2Vzc2l2ZSB0aG91Z2ggLSBrZWVwaW5nIGl0IGF0IHRoZSBkZWZhdWx0IGxldmVsCisgIC8vIFRvIGNoYW5nZSBiYWNrLCBqdXN0IGFwcGVuZCAiOSIgdG8gdGhlIG5leHQgdGhyZWUgbW9kZSBzdHJpbmdzCisgIGlmICghdGVzdGkgJiYgdGVzdG8gJiYgIXRlc3R0ICYmICF0ZXN0YSkKKyAgICBzdHJjcHkoY19tb2RlLCAidyIpOworICBpZiAoIXRlc3RpICYmIHRlc3RvICYmICF0ZXN0dCAmJiB0ZXN0YSkKKyAgICBzdHJjcHkoY19tb2RlLCAiYSIpOworICBpZiAoIXRlc3RpICYmIHRlc3RvICYmIHRlc3R0ICYmICF0ZXN0YSkKKyAgICBzdHJjcHkoY19tb2RlLCAidyIpOworICBpZiAodGVzdGkgJiYgIXRlc3RvICYmICF0ZXN0dCAmJiAhdGVzdGEpCisgICAgc3RyY3B5KGNfbW9kZSwgInIiKTsKKyAgLy8gTm8gcmVhZC93cml0ZSBtb2RlIHlldAorLy8gIGlmICh0ZXN0aSAmJiB0ZXN0byAmJiAhdGVzdHQgJiYgIXRlc3RhKQorLy8gICAgc3RyY3B5KGNfbW9kZSwgInIrIik7CisvLyAgaWYgKHRlc3RpICYmIHRlc3RvICYmIHRlc3R0ICYmICF0ZXN0YSkKKy8vICAgIHN0cmNweShjX21vZGUsICJ3KyIpOworCisgIC8vIE1vZGUgc3RyaW5nIHNob3VsZCBiZSBlbXB0eSBmb3IgaW52YWxpZCBjb21iaW5hdGlvbiBvZiBmbGFncworICBpZiAoc3RybGVuKGNfbW9kZSkgPT0gMCkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICh0ZXN0YikKKyAgICBzdHJjYXQoY19tb2RlLCAiYiIpOworICByZXR1cm4gdHJ1ZTsKK30KKworLy8gRGV0ZXJtaW5lIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIGludGVybmFsIGdldCBidWZmZXIKK3N0ZDo6c3RyZWFtc2l6ZQorZ3pmaWxlYnVmOjpzaG93bWFueWMoKQoreworICAvLyBDYWxscyB0byB1bmRlcmZsb3cgd2lsbCBmYWlsIGlmIGZpbGUgbm90IG9wZW5lZCBmb3IgcmVhZGluZworICBpZiAoIXRoaXMtPmlzX29wZW4oKSB8fCAhKGlvX21vZGUgJiBzdGQ6Omlvc19iYXNlOjppbikpCisgICAgcmV0dXJuIC0xOworICAvLyBNYWtlIHN1cmUgZ2V0IGFyZWEgaXMgaW4gdXNlCisgIGlmICh0aGlzLT5ncHRyKCkgJiYgKHRoaXMtPmdwdHIoKSA8IHRoaXMtPmVncHRyKCkpKQorICAgIHJldHVybiBzdGQ6OnN0cmVhbXNpemUodGhpcy0+ZWdwdHIoKSAtIHRoaXMtPmdwdHIoKSk7CisgIGVsc2UKKyAgICByZXR1cm4gMDsKK30KKworLy8gRmlsbCBnZXQgYXJlYSBmcm9tIGd6aXBwZWQgZmlsZQorZ3pmaWxlYnVmOjppbnRfdHlwZQorZ3pmaWxlYnVmOjp1bmRlcmZsb3coKQoreworICAvLyBJZiBzb21ldGhpbmcgaXMgbGVmdCBpbiB0aGUgZ2V0IGFyZWEgYnkgY2hhbmNlLCByZXR1cm4gaXQKKyAgLy8gKHRoaXMgc2hvdWxkbid0IG5vcm1hbGx5IGhhcHBlbiwgYXMgdW5kZXJmbG93IGlzIG9ubHkgc3VwcG9zZWQKKyAgLy8gdG8gYmUgY2FsbGVkIHdoZW4gZ3B0ciA+PSBlZ3B0ciwgYnV0IGl0IHNlcnZlcyBhcyBlcnJvciBjaGVjaykKKyAgaWYgKHRoaXMtPmdwdHIoKSAmJiAodGhpcy0+Z3B0cigpIDwgdGhpcy0+ZWdwdHIoKSkpCisgICAgcmV0dXJuIHRyYWl0c190eXBlOjp0b19pbnRfdHlwZSgqKHRoaXMtPmdwdHIoKSkpOworCisgIC8vIElmIHRoZSBmaWxlIGhhc24ndCBiZWVuIG9wZW5lZCBmb3IgcmVhZGluZywgcHJvZHVjZSBlcnJvcgorICBpZiAoIXRoaXMtPmlzX29wZW4oKSB8fCAhKGlvX21vZGUgJiBzdGQ6Omlvc19iYXNlOjppbikpCisgICAgcmV0dXJuIHRyYWl0c190eXBlOjplb2YoKTsKKworICAvLyBBdHRlbXB0IHRvIGZpbGwgaW50ZXJuYWwgYnVmZmVyIGZyb20gZ3ppcHBlZCBmaWxlCisgIC8vIChidWZmZXIgbXVzdCBiZSBndWFyYW50ZWVkIHRvIGV4aXN0Li4uKQorICBpbnQgYnl0ZXNfcmVhZCA9IGd6cmVhZChmaWxlLCBidWZmZXIsIGJ1ZmZlcl9zaXplKTsKKyAgLy8gSW5kaWNhdGVzIGVycm9yIG9yIEVPRgorICBpZiAoYnl0ZXNfcmVhZCA8PSAwKQorICB7CisgICAgLy8gUmVzZXQgZ2V0IGFyZWEKKyAgICB0aGlzLT5zZXRnKGJ1ZmZlciwgYnVmZmVyLCBidWZmZXIpOworICAgIHJldHVybiB0cmFpdHNfdHlwZTo6ZW9mKCk7CisgIH0KKyAgLy8gTWFrZSBhbGwgYnl0ZXMgcmVhZCBmcm9tIGZpbGUgYXZhaWxhYmxlIGFzIGdldCBhcmVhCisgIHRoaXMtPnNldGcoYnVmZmVyLCBidWZmZXIsIGJ1ZmZlciArIGJ5dGVzX3JlYWQpOworCisgIC8vIFJldHVybiBuZXh0IGNoYXJhY3RlciBpbiBnZXQgYXJlYQorICByZXR1cm4gdHJhaXRzX3R5cGU6OnRvX2ludF90eXBlKCoodGhpcy0+Z3B0cigpKSk7Cit9CisKKy8vIFdyaXRlIHB1dCBhcmVhIHRvIGd6aXBwZWQgZmlsZQorZ3pmaWxlYnVmOjppbnRfdHlwZQorZ3pmaWxlYnVmOjpvdmVyZmxvdyhpbnRfdHlwZSBjKQoreworICAvLyBEZXRlcm1pbmUgd2hldGhlciBwdXQgYXJlYSBpcyBpbiB1c2UKKyAgaWYgKHRoaXMtPnBiYXNlKCkpCisgIHsKKyAgICAvLyBEb3VibGUtY2hlY2sgcG9pbnRlciByYW5nZQorICAgIGlmICh0aGlzLT5wcHRyKCkgPiB0aGlzLT5lcHB0cigpIHx8IHRoaXMtPnBwdHIoKSA8IHRoaXMtPnBiYXNlKCkpCisgICAgICByZXR1cm4gdHJhaXRzX3R5cGU6OmVvZigpOworICAgIC8vIEFkZCBleHRyYSBjaGFyYWN0ZXIgdG8gYnVmZmVyIGlmIG5vdCBFT0YKKyAgICBpZiAoIXRyYWl0c190eXBlOjplcV9pbnRfdHlwZShjLCB0cmFpdHNfdHlwZTo6ZW9mKCkpKQorICAgIHsKKyAgICAgICoodGhpcy0+cHB0cigpKSA9IHRyYWl0c190eXBlOjp0b19jaGFyX3R5cGUoYyk7CisgICAgICB0aGlzLT5wYnVtcCgxKTsKKyAgICB9CisgICAgLy8gTnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gd3JpdGUgdG8gZmlsZQorICAgIGludCBieXRlc190b193cml0ZSA9IHRoaXMtPnBwdHIoKSAtIHRoaXMtPnBiYXNlKCk7CisgICAgLy8gT3ZlcmZsb3cgZG9lc24ndCBmYWlsIGlmIG5vdGhpbmcgaXMgdG8gYmUgd3JpdHRlbgorICAgIGlmIChieXRlc190b193cml0ZSA+IDApCisgICAgeworICAgICAgLy8gSWYgdGhlIGZpbGUgaGFzbid0IGJlZW4gb3BlbmVkIGZvciB3cml0aW5nLCBwcm9kdWNlIGVycm9yCisgICAgICBpZiAoIXRoaXMtPmlzX29wZW4oKSB8fCAhKGlvX21vZGUgJiBzdGQ6Omlvc19iYXNlOjpvdXQpKQorICAgICAgICByZXR1cm4gdHJhaXRzX3R5cGU6OmVvZigpOworICAgICAgLy8gSWYgZ3ppcHBlZCBmaWxlIHdvbid0IGFjY2VwdCBhbGwgYnl0ZXMgd3JpdHRlbiB0byBpdCwgZmFpbAorICAgICAgaWYgKGd6d3JpdGUoZmlsZSwgdGhpcy0+cGJhc2UoKSwgYnl0ZXNfdG9fd3JpdGUpICE9IGJ5dGVzX3RvX3dyaXRlKQorICAgICAgICByZXR1cm4gdHJhaXRzX3R5cGU6OmVvZigpOworICAgICAgLy8gUmVzZXQgbmV4dCBwb2ludGVyIHRvIHBvaW50IHRvIHBiYXNlIG9uIHN1Y2Nlc3MKKyAgICAgIHRoaXMtPnBidW1wKC1ieXRlc190b193cml0ZSk7CisgICAgfQorICB9CisgIC8vIFdyaXRlIGV4dHJhIGNoYXJhY3RlciB0byBmaWxlIGlmIG5vdCBFT0YKKyAgZWxzZSBpZiAoIXRyYWl0c190eXBlOjplcV9pbnRfdHlwZShjLCB0cmFpdHNfdHlwZTo6ZW9mKCkpKQorICB7CisgICAgLy8gSWYgdGhlIGZpbGUgaGFzbid0IGJlZW4gb3BlbmVkIGZvciB3cml0aW5nLCBwcm9kdWNlIGVycm9yCisgICAgaWYgKCF0aGlzLT5pc19vcGVuKCkgfHwgIShpb19tb2RlICYgc3RkOjppb3NfYmFzZTo6b3V0KSkKKyAgICAgIHJldHVybiB0cmFpdHNfdHlwZTo6ZW9mKCk7CisgICAgLy8gSW1wcm9tcHR1IGNoYXIgYnVmZmVyIChhbGxvd3MgInVuYnVmZmVyZWQiIG91dHB1dCkKKyAgICBjaGFyX3R5cGUgbGFzdF9jaGFyID0gdHJhaXRzX3R5cGU6OnRvX2NoYXJfdHlwZShjKTsKKyAgICAvLyBJZiBnemlwcGVkIGZpbGUgd29uJ3QgYWNjZXB0IHRoaXMgY2hhcmFjdGVyLCBmYWlsCisgICAgaWYgKGd6d3JpdGUoZmlsZSwgJmxhc3RfY2hhciwgMSkgIT0gMSkKKyAgICAgIHJldHVybiB0cmFpdHNfdHlwZTo6ZW9mKCk7CisgIH0KKworICAvLyBJZiB5b3UgZ290IGhlcmUsIHlvdSBoYXZlIHN1Y2NlZWRlZCAoZXZlbiBpZiBjIHdhcyBFT0YpCisgIC8vIFRoZSByZXR1cm4gdmFsdWUgc2hvdWxkIHRoZXJlZm9yZSBiZSBub24tRU9GCisgIGlmICh0cmFpdHNfdHlwZTo6ZXFfaW50X3R5cGUoYywgdHJhaXRzX3R5cGU6OmVvZigpKSkKKyAgICByZXR1cm4gdHJhaXRzX3R5cGU6Om5vdF9lb2YoYyk7CisgIGVsc2UKKyAgICByZXR1cm4gYzsKK30KKworLy8gQXNzaWduIG5ldyBidWZmZXIKK3N0ZDo6c3RyZWFtYnVmKgorZ3pmaWxlYnVmOjpzZXRidWYoY2hhcl90eXBlKiBwLAorICAgICAgICAgICAgICAgICAgc3RkOjpzdHJlYW1zaXplIG4pCit7CisgIC8vIEZpcnN0IG1ha2Ugc3VyZSBzdHVmZiBpcyBzeW5jJ2VkLCBmb3Igc2FmZXR5CisgIGlmICh0aGlzLT5zeW5jKCkgPT0gLTEpCisgICAgcmV0dXJuIE5VTEw7CisgIC8vIElmIGJ1ZmZlcmluZyBpcyB0dXJuZWQgb2ZmIG9uIHB1cnBvc2UgdmlhIHNldGJ1ZigwLDApLCBzdGlsbCBhbGxvY2F0ZSBvbmUuLi4KKyAgLy8gIlVuYnVmZmVyZWQiIG9ubHkgcmVhbGx5IHJlZmVycyB0byBwdXQgWzI3LjguMS40LjEwXSwgd2hpbGUgZ2V0IG5lZWRzIGF0CisgIC8vIGxlYXN0IGEgYnVmZmVyIG9mIHNpemUgMSAodmVyeSBpbmVmZmljaWVudCB0aG91Z2gsIHRoZXJlZm9yZSBtYWtlIGl0IGJpZ2dlcj8pCisgIC8vIFRoaXMgZm9sbG93cyBmcm9tIFsyNy41LjIuNC4zXS8xMiAoZ3B0ciBuZWVkcyB0byBwb2ludCBhdCBzb21ldGhpbmcsIGl0IHNlZW1zKQorICBpZiAoIXAgfHwgIW4pCisgIHsKKyAgICAvLyBSZXBsYWNlIGV4aXN0aW5nIGJ1ZmZlciAoaWYgYW55KSB3aXRoIHNtYWxsIGludGVybmFsIGJ1ZmZlcgorICAgIHRoaXMtPmRpc2FibGVfYnVmZmVyKCk7CisgICAgYnVmZmVyID0gTlVMTDsKKyAgICBidWZmZXJfc2l6ZSA9IDA7CisgICAgb3duX2J1ZmZlciA9IHRydWU7CisgICAgdGhpcy0+ZW5hYmxlX2J1ZmZlcigpOworICB9CisgIGVsc2UKKyAgeworICAgIC8vIFJlcGxhY2UgZXhpc3RpbmcgYnVmZmVyIChpZiBhbnkpIHdpdGggZXh0ZXJuYWwgYnVmZmVyCisgICAgdGhpcy0+ZGlzYWJsZV9idWZmZXIoKTsKKyAgICBidWZmZXIgPSBwOworICAgIGJ1ZmZlcl9zaXplID0gbjsKKyAgICBvd25fYnVmZmVyID0gZmFsc2U7CisgICAgdGhpcy0+ZW5hYmxlX2J1ZmZlcigpOworICB9CisgIHJldHVybiB0aGlzOworfQorCisvLyBXcml0ZSBwdXQgYXJlYSB0byBnemlwcGVkIGZpbGUgKGkuZS4gZW5zdXJlcyB0aGF0IHB1dCBhcmVhIGlzIGVtcHR5KQoraW50CitnemZpbGVidWY6OnN5bmMoKQoreworICByZXR1cm4gdHJhaXRzX3R5cGU6OmVxX2ludF90eXBlKHRoaXMtPm92ZXJmbG93KCksIHRyYWl0c190eXBlOjplb2YoKSkgPyAtMSA6IDA7Cit9CisKKy8qICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKi8KKworLy8gQWxsb2NhdGUgaW50ZXJuYWwgYnVmZmVyCit2b2lkCitnemZpbGVidWY6OmVuYWJsZV9idWZmZXIoKQoreworICAvLyBJZiBpbnRlcm5hbCBidWZmZXIgcmVxdWlyZWQsIGFsbG9jYXRlIG9uZQorICBpZiAob3duX2J1ZmZlciAmJiAhYnVmZmVyKQorICB7CisgICAgLy8gQ2hlY2sgZm9yIGJ1ZmZlcmVkIHZzLiAidW5idWZmZXJlZCIKKyAgICBpZiAoYnVmZmVyX3NpemUgPiAwKQorICAgIHsKKyAgICAgIC8vIEFsbG9jYXRlIGludGVybmFsIGJ1ZmZlcgorICAgICAgYnVmZmVyID0gbmV3IGNoYXJfdHlwZVtidWZmZXJfc2l6ZV07CisgICAgICAvLyBHZXQgYXJlYSBzdGFydHMgZW1wdHkgYW5kIHdpbGwgYmUgZXhwYW5kZWQgYnkgdW5kZXJmbG93IGFzIG5lZWQgYXJpc2VzCisgICAgICB0aGlzLT5zZXRnKGJ1ZmZlciwgYnVmZmVyLCBidWZmZXIpOworICAgICAgLy8gU2V0dXAgZW50aXJlIGludGVybmFsIGJ1ZmZlciBhcyBwdXQgYXJlYS4KKyAgICAgIC8vIFRoZSBvbmUtcGFzdC1lbmQgcG9pbnRlciBhY3R1YWxseSBwb2ludHMgdG8gdGhlIGxhc3QgZWxlbWVudCBvZiB0aGUgYnVmZmVyLAorICAgICAgLy8gc28gdGhhdCBvdmVyZmxvdyhjKSBjYW4gc2FmZWx5IGFkZCB0aGUgZXh0cmEgY2hhcmFjdGVyIGMgdG8gdGhlIHNlcXVlbmNlLgorICAgICAgLy8gVGhlc2UgcG9pbnRlcnMgcmVtYWluIGluIHBsYWNlIGZvciB0aGUgZHVyYXRpb24gb2YgdGhlIGJ1ZmZlcgorICAgICAgdGhpcy0+c2V0cChidWZmZXIsIGJ1ZmZlciArIGJ1ZmZlcl9zaXplIC0gMSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvLyBFdmVuIGluICJ1bmJ1ZmZlcmVkIiBjYXNlLCAoc21hbGw/KSBnZXQgYnVmZmVyIGlzIHN0aWxsIHJlcXVpcmVkCisgICAgICBidWZmZXJfc2l6ZSA9IFNNQUxMQlVGU0laRTsKKyAgICAgIGJ1ZmZlciA9IG5ldyBjaGFyX3R5cGVbYnVmZmVyX3NpemVdOworICAgICAgdGhpcy0+c2V0ZyhidWZmZXIsIGJ1ZmZlciwgYnVmZmVyKTsKKyAgICAgIC8vICJVbmJ1ZmZlcmVkIiBtZWFucyBubyBwdXQgYnVmZmVyCisgICAgICB0aGlzLT5zZXRwKDAsIDApOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvLyBJZiBidWZmZXIgYWxyZWFkeSBhbGxvY2F0ZWQsIHJlc2V0IGJ1ZmZlciBwb2ludGVycyBqdXN0IHRvIG1ha2Ugc3VyZSBubworICAgIC8vIHN0YWxlIGNoYXJzIGFyZSBseWluZyBhcm91bmQKKyAgICB0aGlzLT5zZXRnKGJ1ZmZlciwgYnVmZmVyLCBidWZmZXIpOworICAgIHRoaXMtPnNldHAoYnVmZmVyLCBidWZmZXIgKyBidWZmZXJfc2l6ZSAtIDEpOworICB9Cit9CisKKy8vIERlc3Ryb3kgaW50ZXJuYWwgYnVmZmVyCit2b2lkCitnemZpbGVidWY6OmRpc2FibGVfYnVmZmVyKCkKK3sKKyAgLy8gSWYgaW50ZXJuYWwgYnVmZmVyIGV4aXN0cywgZGVhbGxvY2F0ZSBpdAorICBpZiAob3duX2J1ZmZlciAmJiBidWZmZXIpCisgIHsKKyAgICAvLyBQcmVzZXJ2ZSB1bmJ1ZmZlcmVkIHN0YXR1cyBieSB6ZXJvaW5nIHNpemUKKyAgICBpZiAoIXRoaXMtPnBiYXNlKCkpCisgICAgICBidWZmZXJfc2l6ZSA9IDA7CisgICAgZGVsZXRlW10gYnVmZmVyOworICAgIGJ1ZmZlciA9IE5VTEw7CisgICAgdGhpcy0+c2V0ZygwLCAwLCAwKTsKKyAgICB0aGlzLT5zZXRwKDAsIDApOworICB9CisgIGVsc2UKKyAgeworICAgIC8vIFJlc2V0IGJ1ZmZlciBwb2ludGVycyB0byBpbml0aWFsIHN0YXRlIGlmIGV4dGVybmFsIGJ1ZmZlciBleGlzdHMKKyAgICB0aGlzLT5zZXRnKGJ1ZmZlciwgYnVmZmVyLCBidWZmZXIpOworICAgIGlmIChidWZmZXIpCisgICAgICB0aGlzLT5zZXRwKGJ1ZmZlciwgYnVmZmVyICsgYnVmZmVyX3NpemUgLSAxKTsKKyAgICBlbHNlCisgICAgICB0aGlzLT5zZXRwKDAsIDApOworICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8gRGVmYXVsdCBjb25zdHJ1Y3RvciBpbml0aWFsaXplcyBzdHJlYW0gYnVmZmVyCitnemlmc3RyZWFtOjpnemlmc3RyZWFtKCkKKzogc3RkOjppc3RyZWFtKE5VTEwpLCBzYigpCit7IHRoaXMtPmluaXQoJnNiKTsgfQorCisvLyBJbml0aWFsaXplIHN0cmVhbSBidWZmZXIgYW5kIG9wZW4gZmlsZQorZ3ppZnN0cmVhbTo6Z3ppZnN0cmVhbShjb25zdCBjaGFyKiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Omlvc19iYXNlOjpvcGVubW9kZSBtb2RlKQorOiBzdGQ6OmlzdHJlYW0oTlVMTCksIHNiKCkKK3sKKyAgdGhpcy0+aW5pdCgmc2IpOworICB0aGlzLT5vcGVuKG5hbWUsIG1vZGUpOworfQorCisvLyBJbml0aWFsaXplIHN0cmVhbSBidWZmZXIgYW5kIGF0dGFjaCB0byBmaWxlCitnemlmc3RyZWFtOjpnemlmc3RyZWFtKGludCBmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjppb3NfYmFzZTo6b3Blbm1vZGUgbW9kZSkKKzogc3RkOjppc3RyZWFtKE5VTEwpLCBzYigpCit7CisgIHRoaXMtPmluaXQoJnNiKTsKKyAgdGhpcy0+YXR0YWNoKGZkLCBtb2RlKTsKK30KKworLy8gT3BlbiBmaWxlIGFuZCBnbyBpbnRvIGZhaWwoKSBzdGF0ZSBpZiB1bnN1Y2Nlc3NmdWwKK3ZvaWQKK2d6aWZzdHJlYW06Om9wZW4oY29uc3QgY2hhciogbmFtZSwKKyAgICAgICAgICAgICAgICAgc3RkOjppb3NfYmFzZTo6b3Blbm1vZGUgbW9kZSkKK3sKKyAgaWYgKCFzYi5vcGVuKG5hbWUsIG1vZGUgfCBzdGQ6Omlvc19iYXNlOjppbikpCisgICAgdGhpcy0+c2V0c3RhdGUoc3RkOjppb3NfYmFzZTo6ZmFpbGJpdCk7CisgIGVsc2UKKyAgICB0aGlzLT5jbGVhcigpOworfQorCisvLyBBdHRhY2ggdG8gZmlsZSBhbmQgZ28gaW50byBmYWlsKCkgc3RhdGUgaWYgdW5zdWNjZXNzZnVsCit2b2lkCitnemlmc3RyZWFtOjphdHRhY2goaW50IGZkLAorICAgICAgICAgICAgICAgICAgIHN0ZDo6aW9zX2Jhc2U6Om9wZW5tb2RlIG1vZGUpCit7CisgIGlmICghc2IuYXR0YWNoKGZkLCBtb2RlIHwgc3RkOjppb3NfYmFzZTo6aW4pKQorICAgIHRoaXMtPnNldHN0YXRlKHN0ZDo6aW9zX2Jhc2U6OmZhaWxiaXQpOworICBlbHNlCisgICAgdGhpcy0+Y2xlYXIoKTsKK30KKworLy8gQ2xvc2UgZmlsZQordm9pZAorZ3ppZnN0cmVhbTo6Y2xvc2UoKQoreworICBpZiAoIXNiLmNsb3NlKCkpCisgICAgdGhpcy0+c2V0c3RhdGUoc3RkOjppb3NfYmFzZTo6ZmFpbGJpdCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8gRGVmYXVsdCBjb25zdHJ1Y3RvciBpbml0aWFsaXplcyBzdHJlYW0gYnVmZmVyCitnem9mc3RyZWFtOjpnem9mc3RyZWFtKCkKKzogc3RkOjpvc3RyZWFtKE5VTEwpLCBzYigpCit7IHRoaXMtPmluaXQoJnNiKTsgfQorCisvLyBJbml0aWFsaXplIHN0cmVhbSBidWZmZXIgYW5kIG9wZW4gZmlsZQorZ3pvZnN0cmVhbTo6Z3pvZnN0cmVhbShjb25zdCBjaGFyKiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Omlvc19iYXNlOjpvcGVubW9kZSBtb2RlKQorOiBzdGQ6Om9zdHJlYW0oTlVMTCksIHNiKCkKK3sKKyAgdGhpcy0+aW5pdCgmc2IpOworICB0aGlzLT5vcGVuKG5hbWUsIG1vZGUpOworfQorCisvLyBJbml0aWFsaXplIHN0cmVhbSBidWZmZXIgYW5kIGF0dGFjaCB0byBmaWxlCitnem9mc3RyZWFtOjpnem9mc3RyZWFtKGludCBmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjppb3NfYmFzZTo6b3Blbm1vZGUgbW9kZSkKKzogc3RkOjpvc3RyZWFtKE5VTEwpLCBzYigpCit7CisgIHRoaXMtPmluaXQoJnNiKTsKKyAgdGhpcy0+YXR0YWNoKGZkLCBtb2RlKTsKK30KKworLy8gT3BlbiBmaWxlIGFuZCBnbyBpbnRvIGZhaWwoKSBzdGF0ZSBpZiB1bnN1Y2Nlc3NmdWwKK3ZvaWQKK2d6b2ZzdHJlYW06Om9wZW4oY29uc3QgY2hhciogbmFtZSwKKyAgICAgICAgICAgICAgICAgc3RkOjppb3NfYmFzZTo6b3Blbm1vZGUgbW9kZSkKK3sKKyAgaWYgKCFzYi5vcGVuKG5hbWUsIG1vZGUgfCBzdGQ6Omlvc19iYXNlOjpvdXQpKQorICAgIHRoaXMtPnNldHN0YXRlKHN0ZDo6aW9zX2Jhc2U6OmZhaWxiaXQpOworICBlbHNlCisgICAgdGhpcy0+Y2xlYXIoKTsKK30KKworLy8gQXR0YWNoIHRvIGZpbGUgYW5kIGdvIGludG8gZmFpbCgpIHN0YXRlIGlmIHVuc3VjY2Vzc2Z1bAordm9pZAorZ3pvZnN0cmVhbTo6YXR0YWNoKGludCBmZCwKKyAgICAgICAgICAgICAgICAgICBzdGQ6Omlvc19iYXNlOjpvcGVubW9kZSBtb2RlKQoreworICBpZiAoIXNiLmF0dGFjaChmZCwgbW9kZSB8IHN0ZDo6aW9zX2Jhc2U6Om91dCkpCisgICAgdGhpcy0+c2V0c3RhdGUoc3RkOjppb3NfYmFzZTo6ZmFpbGJpdCk7CisgIGVsc2UKKyAgICB0aGlzLT5jbGVhcigpOworfQorCisvLyBDbG9zZSBmaWxlCit2b2lkCitnem9mc3RyZWFtOjpjbG9zZSgpCit7CisgIGlmICghc2IuY2xvc2UoKSkKKyAgICB0aGlzLT5zZXRzdGF0ZShzdGQ6Omlvc19iYXNlOjpmYWlsYml0KTsKK30KZGlmZiAtLWdpdCBhL3psaWItMS4yLjYvY29udHJpYi9pb3N0cmVhbTMvemZzdHJlYW0uaCBiL3psaWItMS4yLjYvY29udHJpYi9pb3N0cmVhbTMvemZzdHJlYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTc0NDc5Ci0tLSAvZGV2L251bGwKKysrIGIvemxpYi0xLjIuNi9jb250cmliL2lvc3RyZWFtMy96ZnN0cmVhbS5oCkBAIC0wLDAgKzEsNDY2IEBACisvKgorICogQSBDKysgSS9PIHN0cmVhbXMgaW50ZXJmYWNlIHRvIHRoZSB6bGliIGd6KiBmdW5jdGlvbnMKKyAqCisgKiBieSBMdWR3aWcgU2Nod2FyZHQgPHNjaHdhcmR0QHN1bi5hYy56YT4KKyAqIG9yaWdpbmFsIHZlcnNpb24gYnkgS2V2aW4gUnVsYW5kIDxrZXZpbkByb2Rpbi53dXN0bC5lZHU+CisgKgorICogVGhpcyB2ZXJzaW9uIGlzIHN0YW5kYXJkLWNvbXBsaWFudCBhbmQgY29tcGF0aWJsZSB3aXRoIGdjYyAzLnguCisgKi8KKworI2lmbmRlZiBaRlNUUkVBTV9ICisjZGVmaW5lIFpGU1RSRUFNX0gKKworI2luY2x1ZGUgPGlzdHJlYW0+ICAvLyBub3QgaW9zdHJlYW0sIHNpbmNlIHdlIGRvbid0IG5lZWQgY2luL2NvdXQKKyNpbmNsdWRlIDxvc3RyZWFtPgorI2luY2x1ZGUgInpsaWIuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqICBAYnJpZWYgIEd6aXBwZWQgZmlsZSBzdHJlYW0gYnVmZmVyIGNsYXNzLgorICoKKyAqICBUaGlzIGNsYXNzIGltcGxlbWVudHMgYmFzaWNfZmlsZWJ1ZiBmb3IgZ3ppcHBlZCBmaWxlcy4gSXQgZG9lc24ndCB5ZXQgc3VwcG9ydAorICogIHNlZWtpbmcgKGFsbG93ZWQgYnkgemxpYiBidXQgc2xvdy9saW1pdGVkKSwgcHV0YmFjayBhbmQgcmVhZC93cml0ZSBhY2Nlc3MKKyAqICAodHJpY2t5KS4gT3RoZXJ3aXNlLCBpdCBhdHRlbXB0cyB0byBiZSBhIGRyb3AtaW4gcmVwbGFjZW1lbnQgZm9yIHRoZSBzdGFuZGFyZAorICogIGZpbGUgc3RyZWFtYnVmLgorKi8KK2NsYXNzIGd6ZmlsZWJ1ZiA6IHB1YmxpYyBzdGQ6OnN0cmVhbWJ1ZgoreworcHVibGljOgorICAvLyAgRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgZ3pmaWxlYnVmKCk7CisKKyAgLy8gIERlc3RydWN0b3IuCisgIHZpcnR1YWwKKyAgfmd6ZmlsZWJ1ZigpOworCisgIC8qKgorICAgKiAgQGJyaWVmICBTZXQgY29tcHJlc3Npb24gbGV2ZWwgYW5kIHN0cmF0ZWd5IG9uIHRoZSBmbHkuCisgICAqICBAcGFyYW0gIGNvbXBfbGV2ZWwgIENvbXByZXNzaW9uIGxldmVsIChzZWUgemxpYi5oIGZvciBhbGxvd2VkIHZhbHVlcykKKyAgICogIEBwYXJhbSAgY29tcF9zdHJhdGVneSAgQ29tcHJlc3Npb24gc3RyYXRlZ3kgKHNlZSB6bGliLmggZm9yIGFsbG93ZWQgdmFsdWVzKQorICAgKiAgQHJldHVybiAgWl9PSyBvbiBzdWNjZXNzLCBaX1NUUkVBTV9FUlJPUiBvdGhlcndpc2UuCisgICAqCisgICAqICBVbmZvcnR1bmF0ZWx5LCB0aGVzZSBwYXJhbWV0ZXJzIGNhbm5vdCBiZSBtb2RpZmllZCBzZXBhcmF0ZWx5LCBhcyB0aGUKKyAgICogIHByZXZpb3VzIHpmc3RyZWFtIHZlcnNpb24gYXNzdW1lZC4gU2luY2UgdGhlIHN0cmF0ZWd5IGlzIHNlbGRvbSBjaGFuZ2VkLAorICAgKiAgaXQgY2FuIGRlZmF1bHQgYW5kIHNldGNvbXByZXNzaW9uKGxldmVsKSB0aGVuIGJlY29tZXMgbGlrZSB0aGUgb2xkCisgICAqICBzZXRjb21wcmVzc2lvbmxldmVsKGxldmVsKS4KKyAgKi8KKyAgaW50CisgIHNldGNvbXByZXNzaW9uKGludCBjb21wX2xldmVsLAorICAgICAgICAgICAgICAgICBpbnQgY29tcF9zdHJhdGVneSA9IFpfREVGQVVMVF9TVFJBVEVHWSk7CisKKyAgLyoqCisgICAqICBAYnJpZWYgIENoZWNrIGlmIGZpbGUgaXMgb3Blbi4KKyAgICogIEByZXR1cm4gIFRydWUgaWYgZmlsZSBpcyBvcGVuLgorICAqLworICBib29sCisgIGlzX29wZW4oKSBjb25zdCB7IHJldHVybiAoZmlsZSAhPSBOVUxMKTsgfQorCisgIC8qKgorICAgKiAgQGJyaWVmICBPcGVuIGd6aXBwZWQgZmlsZS4KKyAgICogIEBwYXJhbSAgbmFtZSAgRmlsZSBuYW1lLgorICAgKiAgQHBhcmFtICBtb2RlICBPcGVuIG1vZGUgZmxhZ3MuCisgICAqICBAcmV0dXJuICBAYyB0aGlzIG9uIHN1Y2Nlc3MsIE5VTEwgb24gZmFpbHVyZS4KKyAgKi8KKyAgZ3pmaWxlYnVmKgorICBvcGVuKGNvbnN0IGNoYXIqIG5hbWUsCisgICAgICAgc3RkOjppb3NfYmFzZTo6b3Blbm1vZGUgbW9kZSk7CisKKyAgLyoqCisgICAqICBAYnJpZWYgIEF0dGFjaCB0byBhbHJlYWR5IG9wZW4gZ3ppcHBlZCBmaWxlLgorICAgKiAgQHBhcmFtICBmZCAgRmlsZSBkZXNjcmlwdG9yLgorICAgKiAgQHBhcmFtICBtb2RlICBPcGVuIG1vZGUgZmxhZ3MuCisgICAqICBAcmV0dXJuICBAYyB0aGlzIG9uIHN1Y2Nlc3MsIE5VTEwgb24gZmFpbHVyZS4KKyAgKi8KKyAgZ3pmaWxlYnVmKgorICBhdHRhY2goaW50IGZkLAorICAgICAgICAgc3RkOjppb3NfYmFzZTo6b3Blbm1vZGUgbW9kZSk7CisKKyAgLyoqCisgICAqICBAYnJpZWYgIENsb3NlIGd6aXBwZWQgZmlsZS4KKyAgICogIEByZXR1cm4gIEBjIHRoaXMgb24gc3VjY2VzcywgTlVMTCBvbiBmYWlsdXJlLgorICAqLworICBnemZpbGVidWYqCisgIGNsb3NlKCk7CisKK3Byb3RlY3RlZDoKKyAgLyoqCisgICAqICBAYnJpZWYgIENvbnZlcnQgaW9zIG9wZW4gbW9kZSBpbnQgdG8gbW9kZSBzdHJpbmcgdXNlZCBieSB6bGliLgorICAgKiAgQHJldHVybiAgVHJ1ZSBpZiB2YWxpZCBtb2RlIGZsYWcgY29tYmluYXRpb24uCisgICovCisgIGJvb2wKKyAgb3Blbl9tb2RlKHN0ZDo6aW9zX2Jhc2U6Om9wZW5tb2RlIG1vZGUsCisgICAgICAgICAgICBjaGFyKiBjX21vZGUpIGNvbnN0OworCisgIC8qKgorICAgKiAgQGJyaWVmICBOdW1iZXIgb2YgY2hhcmFjdGVycyBhdmFpbGFibGUgaW4gc3RyZWFtIGJ1ZmZlci4KKyAgICogIEByZXR1cm4gIE51bWJlciBvZiBjaGFyYWN0ZXJzLgorICAgKgorICAgKiAgVGhpcyBpbmRpY2F0ZXMgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gZ2V0IGFyZWEgb2Ygc3RyZWFtIGJ1ZmZlci4KKyAgICogIFRoZXNlIGNoYXJhY3RlcnMgY2FuIGJlIHJlYWQgd2l0aG91dCBhY2Nlc3NpbmcgdGhlIGd6aXBwZWQgZmlsZS4KKyAgKi8KKyAgdmlydHVhbCBzdGQ6OnN0cmVhbXNpemUKKyAgc2hvd21hbnljKCk7CisKKyAgLyoqCisgICAqICBAYnJpZWYgIEZpbGwgZ2V0IGFyZWEgZnJvbSBnemlwcGVkIGZpbGUuCisgICAqICBAcmV0dXJuICBGaXJzdCBjaGFyYWN0ZXIgaW4gZ2V0IGFyZWEgb24gc3VjY2VzcywgRU9GIG9uIGVycm9yLgorICAgKgorICAgKiAgVGhpcyBhY3R1YWxseSByZWFkcyBjaGFyYWN0ZXJzIGZyb20gZ3ppcHBlZCBmaWxlIHRvIHN0cmVhbQorICAgKiAgYnVmZmVyLiBBbHdheXMgYnVmZmVyZWQuCisgICovCisgIHZpcnR1YWwgaW50X3R5cGUKKyAgdW5kZXJmbG93KCk7CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFdyaXRlIHB1dCBhcmVhIHRvIGd6aXBwZWQgZmlsZS4KKyAgICogIEBwYXJhbSAgYyAgRXh0cmEgY2hhcmFjdGVyIHRvIGFkZCB0byBidWZmZXIgY29udGVudHMuCisgICAqICBAcmV0dXJuICBOb24tRU9GIG9uIHN1Y2Nlc3MsIEVPRiBvbiBlcnJvci4KKyAgICoKKyAgICogIFRoaXMgYWN0dWFsbHkgd3JpdGVzIGNoYXJhY3RlcnMgaW4gc3RyZWFtIGJ1ZmZlciB0bworICAgKiAgZ3ppcHBlZCBmaWxlLiBXaXRoIHVuYnVmZmVyZWQgb3V0cHV0IHRoaXMgaXMgZG9uZSBvbmUKKyAgICogIGNoYXJhY3RlciBhdCBhIHRpbWUuCisgICovCisgIHZpcnR1YWwgaW50X3R5cGUKKyAgb3ZlcmZsb3coaW50X3R5cGUgYyA9IHRyYWl0c190eXBlOjplb2YoKSk7CisKKyAgLyoqCisgICAqICBAYnJpZWYgIEluc3RhbGxzIGV4dGVybmFsIHN0cmVhbSBidWZmZXIuCisgICAqICBAcGFyYW0gIHAgIFBvaW50ZXIgdG8gY2hhciBidWZmZXIuCisgICAqICBAcGFyYW0gIG4gIFNpemUgb2YgZXh0ZXJuYWwgYnVmZmVyLgorICAgKiAgQHJldHVybiAgQGMgdGhpcyBvbiBzdWNjZXNzLCBOVUxMIG9uIGZhaWx1cmUuCisgICAqCisgICAqICBDYWxsIHNldGJ1ZigwLDApIHRvIGVuYWJsZSB1bmJ1ZmZlcmVkIG91dHB1dC4KKyAgKi8KKyAgdmlydHVhbCBzdGQ6OnN0cmVhbWJ1ZioKKyAgc2V0YnVmKGNoYXJfdHlwZSogcCwKKyAgICAgICAgIHN0ZDo6c3RyZWFtc2l6ZSBuKTsKKworICAvKioKKyAgICogIEBicmllZiAgRmx1c2ggc3RyZWFtIGJ1ZmZlciB0byBmaWxlLgorICAgKiAgQHJldHVybiAgMCBvbiBzdWNjZXNzLCAtMSBvbiBlcnJvci4KKyAgICoKKyAgICogIFRoaXMgY2FsbHMgdW5kZXJmbG93KEVPRikgdG8gZG8gdGhlIGpvYi4KKyAgKi8KKyAgdmlydHVhbCBpbnQKKyAgc3luYygpOworCisvLworLy8gU29tZSBmdXR1cmUgZW5oYW5jZW1lbnRzCisvLworLy8gIHZpcnR1YWwgaW50X3R5cGUgdWZsb3coKTsKKy8vICB2aXJ0dWFsIGludF90eXBlIHBiYWNrZmFpbChpbnRfdHlwZSBjID0gdHJhaXRzX3R5cGU6OmVvZigpKTsKKy8vICB2aXJ0dWFsIHBvc190eXBlCisvLyAgc2Vla29mZihvZmZfdHlwZSBvZmYsCisvLyAgICAgICAgICBzdGQ6Omlvc19iYXNlOjpzZWVrZGlyIHdheSwKKy8vICAgICAgICAgIHN0ZDo6aW9zX2Jhc2U6Om9wZW5tb2RlIG1vZGUgPSBzdGQ6Omlvc19iYXNlOjppbnxzdGQ6Omlvc19iYXNlOjpvdXQpOworLy8gIHZpcnR1YWwgcG9zX3R5cGUKKy8vICBzZWVrcG9zKHBvc190eXBlIHNwLAorLy8gICAgICAgICAgc3RkOjppb3NfYmFzZTo6b3Blbm1vZGUgbW9kZSA9IHN0ZDo6aW9zX2Jhc2U6OmlufHN0ZDo6aW9zX2Jhc2U6Om91dCk7CisKK3ByaXZhdGU6CisgIC8qKgorICAgKiAgQGJyaWVmICBBbGxvY2F0ZSBpbnRlcm5hbCBidWZmZXIuCisgICAqCisgICAqICBUaGlzIGZ1bmN0aW9uIGlzIHNhZmUgdG8gY2FsbCBtdWx0aXBsZSB0aW1lcy4gSXQgd2lsbCBlbnN1cmUKKyAgICogIHRoYXQgYSBwcm9wZXIgaW50ZXJuYWwgYnVmZmVyIGV4aXN0cyBpZiBpdCBpcyByZXF1aXJlZC4gSWYgdGhlCisgICAqICBidWZmZXIgYWxyZWFkeSBleGlzdHMgb3IgaXMgZXh0ZXJuYWwsIHRoZSBidWZmZXIgcG9pbnRlcnMgd2lsbCBiZQorICAgKiAgcmVzZXQgdG8gdGhlaXIgb3JpZ2luYWwgc3RhdGUuCisgICovCisgIHZvaWQKKyAgZW5hYmxlX2J1ZmZlcigpOworCisgIC8qKgorICAgKiAgQGJyaWVmICBEZXN0cm95IGludGVybmFsIGJ1ZmZlci4KKyAgICoKKyAgICogIFRoaXMgZnVuY3Rpb24gaXMgc2FmZSB0byBjYWxsIG11bHRpcGxlIHRpbWVzLiBJdCB3aWxsIGVuc3VyZQorICAgKiAgdGhhdCB0aGUgaW50ZXJuYWwgYnVmZmVyIGlzIGRlYWxsb2NhdGVkIGlmIGl0IGV4aXN0cy4gSW4gYW55CisgICAqICBjYXNlLCBpdCB3aWxsIGFsc28gcmVzZXQgdGhlIGJ1ZmZlciBwb2ludGVycy4KKyAgKi8KKyAgdm9pZAorICBkaXNhYmxlX2J1ZmZlcigpOworCisgIC8qKgorICAgKiAgVW5kZXJseWluZyBmaWxlIHBvaW50ZXIuCisgICovCisgIGd6RmlsZSBmaWxlOworCisgIC8qKgorICAgKiAgTW9kZSBpbiB3aGljaCBmaWxlIHdhcyBvcGVuZWQuCisgICovCisgIHN0ZDo6aW9zX2Jhc2U6Om9wZW5tb2RlIGlvX21vZGU7CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFRydWUgaWYgdGhpcyBvYmplY3Qgb3ducyBmaWxlIGRlc2NyaXB0b3IuCisgICAqCisgICAqICBUaGlzIG1ha2VzIHRoZSBjbGFzcyByZXNwb25zaWJsZSBmb3IgY2xvc2luZyB0aGUgZmlsZQorICAgKiAgdXBvbiBkZXN0cnVjdGlvbi4KKyAgKi8KKyAgYm9vbCBvd25fZmQ7CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFN0cmVhbSBidWZmZXIuCisgICAqCisgICAqICBGb3Igc2ltcGxpY2l0eSB0aGlzIHJlbWFpbnMgYWxsb2NhdGVkIG9uIHRoZSBmcmVlIHN0b3JlIGZvciB0aGUKKyAgICogIGVudGlyZSBsaWZlIHNwYW4gb2YgdGhlIGd6ZmlsZWJ1ZiBvYmplY3QsIHVubGVzcyByZXBsYWNlZCBieSBzZXRidWYuCisgICovCisgIGNoYXJfdHlwZSogYnVmZmVyOworCisgIC8qKgorICAgKiAgQGJyaWVmICBTdHJlYW0gYnVmZmVyIHNpemUuCisgICAqCisgICAqICBEZWZhdWx0cyB0byBzeXN0ZW0gZGVmYXVsdCBidWZmZXIgc2l6ZSAodHlwaWNhbGx5IDgxOTIgYnl0ZXMpLgorICAgKiAgTW9kaWZpZWQgYnkgc2V0YnVmLgorICAqLworICBzdGQ6OnN0cmVhbXNpemUgYnVmZmVyX3NpemU7CisKKyAgLyoqCisgICAqICBAYnJpZWYgIFRydWUgaWYgdGhpcyBvYmplY3Qgb3ducyBzdHJlYW0gYnVmZmVyLgorICAgKgorICAgKiAgVGhpcyBtYWtlcyB0aGUgY2xhc3MgcmVzcG9uc2libGUgZm9yIGRlbGV0aW5nIHRoZSBidWZmZXIKKyAgICogIHVwb24gZGVzdHJ1Y3Rpb24uCisgICovCisgIGJvb2wgb3duX2J1ZmZlcjsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiAgQGJyaWVmICBHemlwcGVkIGZpbGUgaW5wdXQgc3RyZWFtIGNsYXNzLgorICoKKyAqICBUaGlzIGNsYXNzIGltcGxlbWVudHMgaWZzdHJlYW0gZm9yIGd6aXBwZWQgZmlsZXMuIFNlZWtpbmcgYW5kIHB1dGJhY2sKKyAqICBpcyBub3Qgc3VwcG9ydGVkIHlldC4KKyovCitjbGFzcyBnemlmc3RyZWFtIDogcHVibGljIHN0ZDo6aXN0cmVhbQoreworcHVibGljOgorICAvLyAgRGVmYXVsdCBjb25zdHJ1Y3RvcgorICBnemlmc3RyZWFtKCk7CisKKyAgLyoqCisgICAqICBAYnJpZWYgIENvbnN0cnVjdCBzdHJlYW0gb24gZ3ppcHBlZCBmaWxlIHRvIGJlIG9wZW5lZC4KKyAgICogIEBwYXJhbSAgbmFtZSAgRmlsZSBuYW1lLgorICAgKiAgQHBhcmFtICBtb2RlICBPcGVuIG1vZGUgZmxhZ3MgKGZvcmNlZCB0byBjb250YWluIGlvczo6aW4pLgorICAqLworICBleHBsaWNpdAorICBnemlmc3RyZWFtKGNvbnN0IGNoYXIqIG5hbWUsCisgICAgICAgICAgICAgc3RkOjppb3NfYmFzZTo6b3Blbm1vZGUgbW9kZSA9IHN0ZDo6aW9zX2Jhc2U6OmluKTsKKworICAvKioKKyAgICogIEBicmllZiAgQ29uc3RydWN0IHN0cmVhbSBvbiBhbHJlYWR5IG9wZW4gZ3ppcHBlZCBmaWxlLgorICAgKiAgQHBhcmFtICBmZCAgICBGaWxlIGRlc2NyaXB0b3IuCisgICAqICBAcGFyYW0gIG1vZGUgIE9wZW4gbW9kZSBmbGFncyAoZm9yY2VkIHRvIGNvbnRhaW4gaW9zOjppbikuCisgICovCisgIGV4cGxpY2l0CisgIGd6aWZzdHJlYW0oaW50IGZkLAorICAgICAgICAgICAgIHN0ZDo6aW9zX2Jhc2U6Om9wZW5tb2RlIG1vZGUgPSBzdGQ6Omlvc19iYXNlOjppbik7CisKKyAgLyoqCisgICAqICBPYnRhaW4gdW5kZXJseWluZyBzdHJlYW0gYnVmZmVyLgorICAqLworICBnemZpbGVidWYqCisgIHJkYnVmKCkgY29uc3QKKyAgeyByZXR1cm4gY29uc3RfY2FzdDxnemZpbGVidWYqPigmc2IpOyB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIENoZWNrIGlmIGZpbGUgaXMgb3Blbi4KKyAgICogIEByZXR1cm4gIFRydWUgaWYgZmlsZSBpcyBvcGVuLgorICAqLworICBib29sCisgIGlzX29wZW4oKSB7IHJldHVybiBzYi5pc19vcGVuKCk7IH0KKworICAvKioKKyAgICogIEBicmllZiAgT3BlbiBnemlwcGVkIGZpbGUuCisgICAqICBAcGFyYW0gIG5hbWUgIEZpbGUgbmFtZS4KKyAgICogIEBwYXJhbSAgbW9kZSAgT3BlbiBtb2RlIGZsYWdzIChmb3JjZWQgdG8gY29udGFpbiBpb3M6OmluKS4KKyAgICoKKyAgICogIFN0cmVhbSB3aWxsIGJlIGluIHN0YXRlIGdvb2QoKSBpZiBmaWxlIG9wZW5zIHN1Y2Nlc3NmdWxseTsKKyAgICogIG90aGVyd2lzZSBpbiBzdGF0ZSBmYWlsKCkuIFRoaXMgZGlmZmVycyBmcm9tIHRoZSBiZWhhdmlvciBvZgorICAgKiAgaWZzdHJlYW0sIHdoaWNoIG5ldmVyIHNldHMgdGhlIHN0YXRlIHRvIGdvb2QoKSBhbmQgdGhlcmVmb3JlCisgICAqICB3b24ndCBhbGxvdyB5b3UgdG8gcmV1c2UgdGhlIHN0cmVhbSBmb3IgYSBzZWNvbmQgZmlsZSB1bmxlc3MKKyAgICogIHlvdSBtYW51YWxseSBjbGVhcigpIHRoZSBzdGF0ZS4gVGhlIGNob2ljZSBpcyBhIG1hdHRlciBvZgorICAgKiAgY29udmVuaWVuY2UuCisgICovCisgIHZvaWQKKyAgb3Blbihjb25zdCBjaGFyKiBuYW1lLAorICAgICAgIHN0ZDo6aW9zX2Jhc2U6Om9wZW5tb2RlIG1vZGUgPSBzdGQ6Omlvc19iYXNlOjppbik7CisKKyAgLyoqCisgICAqICBAYnJpZWYgIEF0dGFjaCB0byBhbHJlYWR5IG9wZW4gZ3ppcHBlZCBmaWxlLgorICAgKiAgQHBhcmFtICBmZCAgRmlsZSBkZXNjcmlwdG9yLgorICAgKiAgQHBhcmFtICBtb2RlICBPcGVuIG1vZGUgZmxhZ3MgKGZvcmNlZCB0byBjb250YWluIGlvczo6aW4pLgorICAgKgorICAgKiAgU3RyZWFtIHdpbGwgYmUgaW4gc3RhdGUgZ29vZCgpIGlmIGF0dGFjaCBzdWNjZWVkZWQ7IG90aGVyd2lzZQorICAgKiAgaW4gc3RhdGUgZmFpbCgpLgorICAqLworICB2b2lkCisgIGF0dGFjaChpbnQgZmQsCisgICAgICAgICBzdGQ6Omlvc19iYXNlOjpvcGVubW9kZSBtb2RlID0gc3RkOjppb3NfYmFzZTo6aW4pOworCisgIC8qKgorICAgKiAgQGJyaWVmICBDbG9zZSBnemlwcGVkIGZpbGUuCisgICAqCisgICAqICBTdHJlYW0gd2lsbCBiZSBpbiBzdGF0ZSBmYWlsKCkgaWYgY2xvc2UgZmFpbGVkLgorICAqLworICB2b2lkCisgIGNsb3NlKCk7CisKK3ByaXZhdGU6CisgIC8qKgorICAgKiAgVW5kZXJseWluZyBzdHJlYW0gYnVmZmVyLgorICAqLworICBnemZpbGVidWYgc2I7Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogIEBicmllZiAgR3ppcHBlZCBmaWxlIG91dHB1dCBzdHJlYW0gY2xhc3MuCisgKgorICogIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBvZnN0cmVhbSBmb3IgZ3ppcHBlZCBmaWxlcy4gU2Vla2luZyBhbmQgcHV0YmFjaworICogIGlzIG5vdCBzdXBwb3J0ZWQgeWV0LgorKi8KK2NsYXNzIGd6b2ZzdHJlYW0gOiBwdWJsaWMgc3RkOjpvc3RyZWFtCit7CitwdWJsaWM6CisgIC8vICBEZWZhdWx0IGNvbnN0cnVjdG9yCisgIGd6b2ZzdHJlYW0oKTsKKworICAvKioKKyAgICogIEBicmllZiAgQ29uc3RydWN0IHN0cmVhbSBvbiBnemlwcGVkIGZpbGUgdG8gYmUgb3BlbmVkLgorICAgKiAgQHBhcmFtICBuYW1lICBGaWxlIG5hbWUuCisgICAqICBAcGFyYW0gIG1vZGUgIE9wZW4gbW9kZSBmbGFncyAoZm9yY2VkIHRvIGNvbnRhaW4gaW9zOjpvdXQpLgorICAqLworICBleHBsaWNpdAorICBnem9mc3RyZWFtKGNvbnN0IGNoYXIqIG5hbWUsCisgICAgICAgICAgICAgc3RkOjppb3NfYmFzZTo6b3Blbm1vZGUgbW9kZSA9IHN0ZDo6aW9zX2Jhc2U6Om91dCk7CisKKyAgLyoqCisgICAqICBAYnJpZWYgIENvbnN0cnVjdCBzdHJlYW0gb24gYWxyZWFkeSBvcGVuIGd6aXBwZWQgZmlsZS4KKyAgICogIEBwYXJhbSAgZmQgICAgRmlsZSBkZXNjcmlwdG9yLgorICAgKiAgQHBhcmFtICBtb2RlICBPcGVuIG1vZGUgZmxhZ3MgKGZvcmNlZCB0byBjb250YWluIGlvczo6b3V0KS4KKyAgKi8KKyAgZXhwbGljaXQKKyAgZ3pvZnN0cmVhbShpbnQgZmQsCisgICAgICAgICAgICAgc3RkOjppb3NfYmFzZTo6b3Blbm1vZGUgbW9kZSA9IHN0ZDo6aW9zX2Jhc2U6Om91dCk7CisKKyAgLyoqCisgICAqICBPYnRhaW4gdW5kZXJseWluZyBzdHJlYW0gYnVmZmVyLgorICAqLworICBnemZpbGVidWYqCisgIHJkYnVmKCkgY29uc3QKKyAgeyByZXR1cm4gY29uc3RfY2FzdDxnemZpbGVidWYqPigmc2IpOyB9CisKKyAgLyoqCisgICAqICBAYnJpZWYgIENoZWNrIGlmIGZpbGUgaXMgb3Blbi4KKyAgICogIEByZXR1cm4gIFRydWUgaWYgZmlsZSBpcyBvcGVuLgorICAqLworICBib29sCisgIGlzX29wZW4oKSB7IHJldHVybiBzYi5pc19vcGVuKCk7IH0KKworICAvKioKKyAgICogIEBicmllZiAgT3BlbiBnemlwcGVkIGZpbGUuCisgICAqICBAcGFyYW0gIG5hbWUgIEZpbGUgbmFtZS4KKyAgICogIEBwYXJhbSAgbW9kZSAgT3BlbiBtb2RlIGZsYWdzIChmb3JjZWQgdG8gY29udGFpbiBpb3M6Om91dCkuCisgICAqCisgICAqICBTdHJlYW0gd2lsbCBiZSBpbiBzdGF0ZSBnb29kKCkgaWYgZmlsZSBvcGVucyBzdWNjZXNzZnVsbHk7CisgICAqICBvdGhlcndpc2UgaW4gc3RhdGUgZmFpbCgpLiBUaGlzIGRpZmZlcnMgZnJvbSB0aGUgYmVoYXZpb3Igb2YKKyAgICogIG9mc3RyZWFtLCB3aGljaCBuZXZlciBzZXRzIHRoZSBzdGF0ZSB0byBnb29kKCkgYW5kIHRoZXJlZm9yZQorICAgKiAgd29uJ3QgYWxsb3cgeW91IHRvIHJldXNlIHRoZSBzdHJlYW0gZm9yIGEgc2Vjb25kIGZpbGUgdW5sZXNzCisgICAqICB5b3UgbWFudWFsbHkgY2xlYXIoKSB0aGUgc3RhdGUuIFRoZSBjaG9pY2UgaXMgYSBtYXR0ZXIgb2YKKyAgICogIGNvbnZlbmllbmNlLgorICAqLworICB2b2lkCisgIG9wZW4oY29uc3QgY2hhciogbmFtZSwKKyAgICAgICBzdGQ6Omlvc19iYXNlOjpvcGVubW9kZSBtb2RlID0gc3RkOjppb3NfYmFzZTo6b3V0KTsKKworICAvKioKKyAgICogIEBicmllZiAgQXR0YWNoIHRvIGFscmVhZHkgb3BlbiBnemlwcGVkIGZpbGUuCisgICAqICBAcGFyYW0gIGZkICBGaWxlIGRlc2NyaXB0b3IuCisgICAqICBAcGFyYW0gIG1vZGUgIE9wZW4gbW9kZSBmbGFncyAoZm9yY2VkIHRvIGNvbnRhaW4gaW9zOjpvdXQpLgorICAgKgorICAgKiAgU3RyZWFtIHdpbGwgYmUgaW4gc3RhdGUgZ29vZCgpIGlmIGF0dGFjaCBzdWNjZWVkZWQ7IG90aGVyd2lzZQorICAgKiAgaW4gc3RhdGUgZmFpbCgpLgorICAqLworICB2b2lkCisgIGF0dGFjaChpbnQgZmQsCisgICAgICAgICBzdGQ6Omlvc19iYXNlOjpvcGVubW9kZSBtb2RlID0gc3RkOjppb3NfYmFzZTo6b3V0KTsKKworICAvKioKKyAgICogIEBicmllZiAgQ2xvc2UgZ3ppcHBlZCBmaWxlLgorICAgKgorICAgKiAgU3RyZWFtIHdpbGwgYmUgaW4gc3RhdGUgZmFpbCgpIGlmIGNsb3NlIGZhaWxlZC4KKyAgKi8KKyAgdm9pZAorICBjbG9zZSgpOworCitwcml2YXRlOgorICAvKioKKyAgICogIFVuZGVybHlpbmcgc3RyZWFtIGJ1ZmZlci4KKyAgKi8KKyAgZ3pmaWxlYnVmIHNiOworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqICBAYnJpZWYgIEd6aXBwZWQgZmlsZSBvdXRwdXQgc3RyZWFtIG1hbmlwdWxhdG9yIGNsYXNzLgorICoKKyAqICBUaGlzIGNsYXNzIGRlZmluZXMgYSB0d28tYXJndW1lbnQgbWFuaXB1bGF0b3IgZm9yIGd6b2ZzdHJlYW0uIEl0IGlzIHVzZWQKKyAqICBhcyBiYXNlIGZvciB0aGUgc2V0Y29tcHJlc3Npb24oaW50LGludCkgbWFuaXB1bGF0b3IuCisqLwordGVtcGxhdGU8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgorICBjbGFzcyBnem9tYW5pcDIKKyAgeworICBwdWJsaWM6CisgICAgLy8gQWxsb3dzIGluc2VydG9yIHRvIHBlZWsgYXQgaW50ZXJuYWxzCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFRhLCB0eXBlbmFtZSBUYj4KKyAgICAgIGZyaWVuZCBnem9mc3RyZWFtJgorICAgICAgb3BlcmF0b3I8PChnem9mc3RyZWFtJiwKKyAgICAgICAgICAgICAgICAgY29uc3QgZ3pvbWFuaXAyPFRhLFRiPiYpOworCisgICAgLy8gQ29uc3RydWN0b3IKKyAgICBnem9tYW5pcDIoZ3pvZnN0cmVhbSYgKCpmKShnem9mc3RyZWFtJiwgVDEsIFQyKSwKKyAgICAgICAgICAgICAgVDEgdjEsCisgICAgICAgICAgICAgIFQyIHYyKTsKKyAgcHJpdmF0ZToKKyAgICAvLyBVbmRlcmx5aW5nIG1hbmlwdWxhdG9yIGZ1bmN0aW9uCisgICAgZ3pvZnN0cmVhbSYKKyAgICAoKmZ1bmMpKGd6b2ZzdHJlYW0mLCBUMSwgVDIpOworCisgICAgLy8gQXJndW1lbnRzIGZvciBtYW5pcHVsYXRvciBmdW5jdGlvbgorICAgIFQxIHZhbDE7CisgICAgVDIgdmFsMjsKKyAgfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLyBNYW5pcHVsYXRvciBmdW5jdGlvbiB0aHVua3MgdGhyb3VnaCB0byBzdHJlYW0gYnVmZmVyCitpbmxpbmUgZ3pvZnN0cmVhbSYKK3NldGNvbXByZXNzaW9uKGd6b2ZzdHJlYW0gJmd6cywgaW50IGwsIGludCBzID0gWl9ERUZBVUxUX1NUUkFURUdZKQoreworICAoZ3pzLnJkYnVmKCkpLT5zZXRjb21wcmVzc2lvbihsLCBzKTsKKyAgcmV0dXJuIGd6czsKK30KKworLy8gTWFuaXB1bGF0b3IgY29uc3RydWN0b3Igc3RvcmVzIGFyZ3VtZW50cwordGVtcGxhdGU8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgorICBpbmxpbmUKKyAgZ3pvbWFuaXAyPFQxLFQyPjo6Z3pvbWFuaXAyKGd6b2ZzdHJlYW0gJigqZikoZ3pvZnN0cmVhbSAmLCBUMSwgVDIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVDEgdjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUMiB2MikKKyAgOiBmdW5jKGYpLCB2YWwxKHYxKSwgdmFsMih2MikKKyAgeyB9CisKKy8vIEluc2VydG9yIGFwcGxpZXMgdW5kZXJseWluZyBtYW5pcHVsYXRvciBmdW5jdGlvbiB0byBzdHJlYW0KK3RlbXBsYXRlPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KKyAgaW5saW5lIGd6b2ZzdHJlYW0mCisgIG9wZXJhdG9yPDwoZ3pvZnN0cmVhbSYgcywgY29uc3QgZ3pvbWFuaXAyPFQxLFQyPiYgbSkKKyAgeyByZXR1cm4gKCptLmZ1bmMpKHMsIG0udmFsMSwgbS52YWwyKTsgfQorCisvLyBJbnNlcnQgdGhpcyBvbnRvIHN0cmVhbSB0byBzaW1wbGlmeSBzZXR0aW5nIG9mIGNvbXByZXNzaW9uIGxldmVsCitpbmxpbmUgZ3pvbWFuaXAyPGludCxpbnQ+CitzZXRjb21wcmVzc2lvbihpbnQgbCwgaW50IHMgPSBaX0RFRkFVTFRfU1RSQVRFR1kpCit7IHJldHVybiBnem9tYW5pcDI8aW50LGludD4oJnNldGNvbXByZXNzaW9uLCBsLCBzKTsgfQorCisjZW5kaWYgLy8gWkZTVFJFQU1fSApkaWZmIC0tZ2l0IGEvemxpYi0xLjIuNi9jb250cmliL21hc214NjQvYmxkX21sNjQuYmF0IGIvemxpYi0xLjIuNi9jb250cmliL21hc214NjQvYmxkX21sNjQuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmOTM0M2QKLS0tIC9kZXYvbnVsbAorKysgYi96bGliLTEuMi42L2NvbnRyaWIvbWFzbXg2NC9ibGRfbWw2NC5iYXQKQEAgLTAsMCArMSwyIEBACittbDY0LmV4ZSAvRmxpbmZmYXN4NjQgL2MgL1ppIGluZmZhc3g2NC5hc20NCittbDY0LmV4ZSAvRmxndm1hdDY0ICAgL2MgL1ppIGd2bWF0NjQuYXNtDQpkaWZmIC0tZ2l0IGEvemxpYi0xLjIuNi9jb250cmliL21hc214NjQvZ3ZtYXQ2NC5hc20gYi96bGliLTEuMi42L2NvbnRyaWIvbWFzbXg2NC9ndm1hdDY0LmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODc5YzI4Ci0tLSAvZGV2L251bGwKKysrIGIvemxpYi0xLjIuNi9jb250cmliL21hc214NjQvZ3ZtYXQ2NC5hc20KQEAgLTAsMCArMSw1NTMgQEAKKzt1SW50IGxvbmdlc3RfbWF0Y2hfeDY0KA0KKzsgICAgZGVmbGF0ZV9zdGF0ZSAqcywNCis7ICAgIElQb3MgY3VyX21hdGNoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGN1cnJlbnQgbWF0Y2ggKi8NCisNCis7IGd2bWF0NjQuYXNtIC0tIEFzbSBwb3J0aW9uIG9mIHRoZSBvcHRpbWl6ZWQgbG9uZ2VzdF9tYXRjaCBmb3IgMzIgYml0cyB4ODZfNjQNCis7ICAoQU1ENjQgb24gQXRobG9uIDY0LCBPcHRlcm9uLCBQaGVub20NCis7ICAgICBhbmQgSW50ZWwgRU02NFQgb24gUGVudGl1bSA0IHdpdGggRU02NFQsIFBlbnRpdW0gRCwgQ29yZSAyIER1bywgQ29yZSBJNS9JNykNCis7IENvcHlyaWdodCAoQykgMTk5NS0yMDEwIEplYW4tbG91cCBHYWlsbHksIEJyaWFuIFJhaXRlciBhbmQgR2lsbGVzIFZvbGxhbnQuDQorOw0KKzsgRmlsZSB3cml0dGVuIGJ5IEdpbGxlcyBWb2xsYW50LCBieSBjb252ZXJ0aW5nIHRvIGFzc2VtYmx5IHRoZSBsb25nZXN0X21hdGNoDQorOyAgZnJvbSBKZWFuLWxvdXAgR2FpbGx5IGluIGRlZmxhdGUuYyBvZiB6TGliIGFuZCBpbmZvWmlwIHppcC4NCis7DQorOyAgYW5kIGJ5IHRha2luZyBpbnNwaXJhdGlvbiBvbiBhc202ODYgd2l0aCBtYXNtLCBvcHRpbWlzZWQgYXNzZW1ibHkgY29kZQ0KKzsgICAgICAgIGZyb20gQnJpYW4gUmFpdGVyLCB3cml0dGVuIDE5OTgNCis7DQorOyAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQNCis7ICB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzDQorOyAgYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4NCis7DQorOyAgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsDQorOyAgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdA0KKzsgIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoNCis7DQorOyAgMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QNCis7ICAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQ0KKzsgICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQ0KKzsgICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuDQorOyAgMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUNCis7ICAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUNCis7ICAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLg0KKzsNCis7DQorOw0KKzsgICAgICAgICBodHRwOi8vd3d3LnpsaWIubmV0DQorOyAgICAgICAgIGh0dHA6Ly93d3cud2luaW1hZ2UuY29tL3pMaWJEbGwNCis7ICAgICAgICAgaHR0cDovL3d3dy5tdXBwZXRsYWJzLmNvbS9+YnJlYWRib3gvc29mdHdhcmUvYXNzZW1ibHkuaHRtbA0KKzsNCis7IHRvIGNvbXBpbGUgdGhpcyBmaWxlIGZvciBpbmZvemlwIFppcCwgSSB1c2Ugb3B0aW9uOg0KKzsgICBtbDY0LmV4ZSAvRmxndm1hdDY0IC9jIC9aaSAvRElORk9aSVAgZ3ZtYXQ2NC5hc20NCis7DQorOyB0byBjb21waWxlIHRoaXMgZmlsZSBmb3IgekxpYiwgSSB1c2Ugb3B0aW9uOg0KKzsgICBtbDY0LmV4ZSAvRmxndm1hdDY0IC9jIC9aaSBndm1hdDY0LmFzbQ0KKzsgQmUgY2FycmVmdWxsIHRvIGFkYXB0IHpsaWIxMjIyYWRkIGJlbG93IHRvIHlvdXIgdmVyc2lvbiBvZiB6TGliDQorOyAgIChpZiB5b3UgdXNlIGEgdmVyc2lvbiBvZiB6TGliIGJlZm9yZSAxLjAuNCBvciBhZnRlciAxLjIuMi4yLCBjaGFuZ2UNCis7ICAgIHZhbHVlIG9mIHpsaWIxMjIyYWRkIGxhdGVyKQ0KKzsNCis7IFRoaXMgZmlsZSBjb21waWxlIHdpdGggTWljcm9zb2Z0IE1hY3JvIEFzc2VtYmxlciAoeDY0KSBmb3IgQU1ENjQNCis7DQorOyAgIG1sNjQuZXhlIGlzIGdpdmVuIHdpdGggVmlzdWFsIFN0dWRpbyAyMDA1LzIwMDgvMjAxMCBhbmQgV2luZG93cyBXREsNCis7DQorOyAgICh5b3UgY2FuIGdldCBXaW5kb3dzIFdESyB3aXRoIG1sNjQgZm9yIEFNRDY0IGZyb20NCis7ICAgICAgaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3doZGMvRGV2dG9vbHMvd2RrL2RlZmF1bHQubXNweCBmb3IgbG93IHByaWNlKQ0KKzsNCisNCisNCis7dUludCBsb25nZXN0X21hdGNoKHMsIGN1cl9tYXRjaCkNCis7ICAgIGRlZmxhdGVfc3RhdGUgKnM7DQorOyAgICBJUG9zIGN1cl9tYXRjaDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGN1cnJlbnQgbWF0Y2ggKi8NCisuY29kZQ0KK2xvbmdlc3RfbWF0Y2ggUFJPQw0KKw0KKw0KKztMb2NhbFZhcnNTaXplICAgZXF1IDg4DQorIExvY2FsVmFyc1NpemUgICBlcXUgNzINCisNCis7IHJlZ2lzdGVyIHVzZWQgOiByYXgscmJ4LHJjeCxyZHgscnNpLHJkaSxyOCxyOSxyMTAscjExLHIxMg0KKzsgZnJlZSByZWdpc3RlciA6ICByMTQscjE1DQorOyByZWdpc3RlciBjYW4gYmUgc2F2ZWQgOiByc3ANCisNCisgY2hhaW5sZW53bWFzayAgIGVxdSAgcnNwICsgOCAtIExvY2FsVmFyc1NpemUgICAgOyBoaWdoIHdvcmQ6IGN1cnJlbnQgY2hhaW4gbGVuDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgbG93IHdvcmQ6IHMtPndtYXNrDQorO3dpbmRvdyAgICAgICAgICBlcXUgIHJzcCArIHh4IC0gTG9jYWxWYXJzU2l6ZSAgIDsgbG9jYWwgY29weSBvZiBzLT53aW5kb3cgOyBzdG9yZWQgaW4gcjEwDQorO3dpbmRvd2Jlc3RsZW4gICBlcXUgIHJzcCArIHh4IC0gTG9jYWxWYXJzU2l6ZSAgIDsgcy0+d2luZG93ICsgYmVzdGxlbiAsIHVzZSByMTArcjExDQorO3NjYW5zdGFydCAgICAgICBlcXUgIHJzcCArIHh4IC0gTG9jYWxWYXJzU2l6ZSAgIDsgZmlyc3QgdHdvIGJ5dGVzIG9mIHN0cmluZyA7IHN0b3JlZCBpbiByMTJ3DQorO3NjYW5lbmQgICAgICAgICBlcXUgIHJzcCArIHh4IC0gTG9jYWxWYXJzU2l6ZSAgIDsgbGFzdCB0d28gYnl0ZXMgb2Ygc3RyaW5nIHVzZSBlYngNCis7c2NhbmFsaWduICAgICAgIGVxdSAgcnNwICsgeHggLSBMb2NhbFZhcnNTaXplICAgOyBkd29yZC1taXNhbGlnbm1lbnQgb2Ygc3RyaW5nIHIxMw0KKztiZXN0bGVuICAgICAgICAgZXF1ICByc3AgKyB4eCAtIExvY2FsVmFyc1NpemUgICA7IHNpemUgb2YgYmVzdCBtYXRjaCBzbyBmYXIgLT4gcjExZA0KKztzY2FuICAgICAgICAgICAgZXF1ICByc3AgKyB4eCAtIExvY2FsVmFyc1NpemUgICA7IHB0ciB0byBzdHJpbmcgd2FudGluZyBtYXRjaCAtPiByOQ0KK0lGREVGIElORk9aSVANCitFTFNFDQorIG5pY2VtYXRjaCAgICAgICBlcXUgIChyc3AgKyAxNiAtIExvY2FsVmFyc1NpemUpIDsgYSBnb29kIGVub3VnaCBtYXRjaCBzaXplDQorRU5ESUYNCisNCitzYXZlX3JkaSAgICAgICAgZXF1ICByc3AgKyAyNCAtIExvY2FsVmFyc1NpemUNCitzYXZlX3JzaSAgICAgICAgZXF1ICByc3AgKyAzMiAtIExvY2FsVmFyc1NpemUNCitzYXZlX3JieCAgICAgICAgZXF1ICByc3AgKyA0MCAtIExvY2FsVmFyc1NpemUNCitzYXZlX3JicCAgICAgICAgZXF1ICByc3AgKyA0OCAtIExvY2FsVmFyc1NpemUNCitzYXZlX3IxMiAgICAgICAgZXF1ICByc3AgKyA1NiAtIExvY2FsVmFyc1NpemUNCitzYXZlX3IxMyAgICAgICAgZXF1ICByc3AgKyA2NCAtIExvY2FsVmFyc1NpemUNCis7c2F2ZV9yMTQgICAgICAgIGVxdSAgcnNwICsgNzIgLSBMb2NhbFZhcnNTaXplDQorO3NhdmVfcjE1ICAgICAgICBlcXUgIHJzcCArIDgwIC0gTG9jYWxWYXJzU2l6ZQ0KKw0KKw0KKzsgc3VtbWFyeSBvZiByZWdpc3RlciB1c2FnZQ0KKzsgc2NhbmVuZCAgICAgZWJ4DQorOyBzY2FuZW5kdyAgICBieA0KKzsgY2hhaW5sZW53bWFzayAgIGVkeA0KKzsgY3VybWF0Y2ggICAgcnNpDQorOyBjdXJtYXRjaGQgICBlc2kNCis7IHdpbmRvd2Jlc3RsZW4gICByOA0KKzsgc2NhbmFsaWduICAgcjkNCis7IHNjYW5hbGlnbmQgIHI5ZA0KKzsgd2luZG93ICAgICAgcjEwDQorOyBiZXN0bGVuICAgICByMTENCis7IGJlc3RsZW5kICAgIHIxMWQNCis7IHNjYW5zdGFydCAgIHIxMmQNCis7IHNjYW5zdGFydHcgIHIxMncNCis7IHNjYW4gICAgICAgIHIxMw0KKzsgbmljZW1hdGNoICAgcjE0ZA0KKzsgbGltaXQgICAgICAgcjE1DQorOyBsaW1pdGQgICAgICByMTVkDQorOyBwcmV2ICAgICAgICByY3gNCisNCis7ICBhbGwgdGhlICs0IG9mZnNldHMgYXJlIGR1ZSB0byB0aGUgYWRkaXRpb24gb2YgcGVuZGluZ19idWZfc2l6ZSAoaW4gemxpYg0KKzsgIGluIHRoZSBkZWZsYXRlX3N0YXRlIHN0cnVjdHVyZSBzaW5jZSB0aGUgYXNtIGNvZGUgd2FzIGZpcnN0IHdyaXR0ZW4NCis7ICAoaWYgeW91IGNvbXBpbGUgd2l0aCB6bGliIDEuMC40IG9yIG9sZGVyLCByZW1vdmUgdGhlICs0KS4NCis7ICBOb3RlIDogdGhlc2UgdmFsdWUgYXJlIGdvb2Qgd2l0aCBhIDggYnl0ZXMgYm91bmRhcnkgcGFjayBzdHJ1Y3R1cmUNCisNCisNCisgICAgTUFYX01BVENIICAgICAgICAgICBlcXUgICAgIDI1OA0KKyAgICBNSU5fTUFUQ0ggICAgICAgICAgIGVxdSAgICAgMw0KKyAgICBNSU5fTE9PS0FIRUFEICAgICAgIGVxdSAgICAgKE1BWF9NQVRDSCtNSU5fTUFUQ0grMSkNCisNCisNCis7OzsgT2Zmc2V0cyBmb3IgZmllbGRzIGluIHRoZSBkZWZsYXRlX3N0YXRlIHN0cnVjdHVyZS4gVGhlc2UgbnVtYmVycw0KKzs7OyBhcmUgY2FsY3VsYXRlZCBmcm9tIHRoZSBkZWZpbml0aW9uIG9mIGRlZmxhdGVfc3RhdGUsIHdpdGggdGhlDQorOzs7IGFzc3VtcHRpb24gdGhhdCB0aGUgY29tcGlsZXIgd2lsbCBkd29yZC1hbGlnbiB0aGUgZmllbGRzLiAoVGh1cywNCis7OzsgY2hhbmdpbmcgdGhlIGRlZmluaXRpb24gb2YgZGVmbGF0ZV9zdGF0ZSBjb3VsZCBlYXNpbHkgY2F1c2UgdGhpcw0KKzs7OyBwcm9ncmFtIHRvIGNyYXNoIGhvcnJpYmx5LCB3aXRob3V0IHNvIG11Y2ggYXMgYSB3YXJuaW5nIGF0DQorOzs7IGNvbXBpbGUgdGltZS4gU2lnaC4pDQorDQorOyAgYWxsIHRoZSAremxpYjEyMjJhZGQgb2Zmc2V0cyBhcmUgZHVlIHRvIHRoZSBhZGRpdGlvbiBvZiBmaWVsZHMNCis7ICBpbiB6bGliIGluIHRoZSBkZWZsYXRlX3N0YXRlIHN0cnVjdHVyZSBzaW5jZSB0aGUgYXNtIGNvZGUgd2FzIGZpcnN0IHdyaXR0ZW4NCis7ICAoaWYgeW91IGNvbXBpbGUgd2l0aCB6bGliIDEuMC40IG9yIG9sZGVyLCB1c2UgInpsaWIxMjIyYWRkIGVxdSAoLTQpIikuDQorOyAgKGlmIHlvdSBjb21waWxlIHdpdGggemxpYiBiZXR3ZWVuIDEuMC41IGFuZCAxLjIuMi4xLCB1c2UgInpsaWIxMjIyYWRkIGVxdSAwIikuDQorOyAgaWYgeW91IGNvbXBpbGUgd2l0aCB6bGliIDEuMi4yLjIgb3IgbGF0ZXIgLCB1c2UgInpsaWIxMjIyYWRkIGVxdSA4IikuDQorDQorDQorSUZERUYgSU5GT1pJUA0KKw0KK19EQVRBICAgU0VHTUVOVA0KK0NPTU0gICAgd2luZG93X3NpemU6RFdPUkQNCis7IFdNYXNrIDsgN2ZmZg0KK0NPTU0gICAgd2luZG93OkJZVEU6MDEwMDQwSA0KK0NPTU0gICAgcHJldjpXT1JEOjA4MDAwSA0KKzsgTWF0Y2hMZW4gOiB1bnVzZWQNCis7IFByZXZNYXRjaCA6IHVudXNlZA0KK0NPTU0gICAgc3Ryc3RhcnQ6RFdPUkQNCitDT01NICAgIG1hdGNoX3N0YXJ0OkRXT1JEDQorOyBMb29rYWhlYWQgOiBpZ25vcmUNCitDT01NICAgIHByZXZfbGVuZ3RoOkRXT1JEIDsgUHJldkxlbg0KK0NPTU0gICAgbWF4X2NoYWluX2xlbmd0aDpEV09SRA0KK0NPTU0gICAgZ29vZF9tYXRjaDpEV09SRA0KK0NPTU0gICAgbmljZV9tYXRjaDpEV09SRA0KK3ByZXZfYWQgZXF1IE9GRlNFVCBwcmV2DQord2luZG93X2FkIGVxdSBPRkZTRVQgd2luZG93DQorbmljZW1hdGNoIGVxdSBuaWNlX21hdGNoDQorX0RBVEEgRU5EUw0KK1dNYXNrIGVxdSAwN2ZmZmgNCisNCitFTFNFDQorDQorICBJRk5ERUYgemxpYjEyMjJhZGQNCisgICAgemxpYjEyMjJhZGQgZXF1IDgNCisgIEVORElGDQorZHNXU2l6ZSAgICAgICAgIGVxdSA1Nit6bGliMTIyMmFkZCsoemxpYjEyMjJhZGQvMikNCitkc1dNYXNrICAgICAgICAgZXF1IDY0K3psaWIxMjIyYWRkKyh6bGliMTIyMmFkZC8yKQ0KK2RzV2luZG93ICAgICAgICBlcXUgNzIremxpYjEyMjJhZGQNCitkc1ByZXYgICAgICAgICAgZXF1IDg4K3psaWIxMjIyYWRkDQorZHNNYXRjaExlbiAgICAgIGVxdSAxMjgremxpYjEyMjJhZGQNCitkc1ByZXZNYXRjaCAgICAgZXF1IDEzMit6bGliMTIyMmFkZA0KK2RzU3RyU3RhcnQgICAgICBlcXUgMTQwK3psaWIxMjIyYWRkDQorZHNNYXRjaFN0YXJ0ICAgIGVxdSAxNDQremxpYjEyMjJhZGQNCitkc0xvb2thaGVhZCAgICAgZXF1IDE0OCt6bGliMTIyMmFkZA0KK2RzUHJldkxlbiAgICAgICBlcXUgMTUyK3psaWIxMjIyYWRkDQorZHNNYXhDaGFpbkxlbiAgIGVxdSAxNTYremxpYjEyMjJhZGQNCitkc0dvb2RNYXRjaCAgICAgZXF1IDE3Mit6bGliMTIyMmFkZA0KK2RzTmljZU1hdGNoICAgICBlcXUgMTc2K3psaWIxMjIyYWRkDQorDQord2luZG93X3NpemUgICAgIGVxdSBbIHJjeCArIGRzV1NpemVdDQorV01hc2sgICAgICAgICAgIGVxdSBbIHJjeCArIGRzV01hc2tdDQord2luZG93X2FkICAgICAgIGVxdSBbIHJjeCArIGRzV2luZG93XQ0KK3ByZXZfYWQgICAgICAgICBlcXUgWyByY3ggKyBkc1ByZXZdDQorc3Ryc3RhcnQgICAgICAgIGVxdSBbIHJjeCArIGRzU3RyU3RhcnRdDQorbWF0Y2hfc3RhcnQgICAgIGVxdSBbIHJjeCArIGRzTWF0Y2hTdGFydF0NCitMb29rYWhlYWQgICAgICAgZXF1IFsgcmN4ICsgZHNMb29rYWhlYWRdIDsgMGZmZmZmZmZmaCBvbiBpbmZvemlwDQorcHJldl9sZW5ndGggICAgIGVxdSBbIHJjeCArIGRzUHJldkxlbl0NCittYXhfY2hhaW5fbGVuZ3RoIGVxdSBbIHJjeCArIGRzTWF4Q2hhaW5MZW5dDQorZ29vZF9tYXRjaCAgICAgIGVxdSBbIHJjeCArIGRzR29vZE1hdGNoXQ0KK25pY2VfbWF0Y2ggICAgICBlcXUgWyByY3ggKyBkc05pY2VNYXRjaF0NCitFTkRJRg0KKw0KKzsgcGFyYW1ldGVyIDEgaW4gcjgoZGVmbGF0ZSBzdGF0ZSBzKSwgcGFyYW0gMiBpbiByZHggKGN1ciBtYXRjaCkNCisNCis7IHNlZSBodHRwOi8vd2VibG9ncy5hc3AubmV0L29sZG5ld3RoaW5nL2FyY2hpdmUvMjAwNC8wMS8xNC81ODU3OS5hc3B4IGFuZA0KKzsgaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9saWJyYXJ5L2VuLXVzL2ttYXJjaC9oaC9rbWFyY2gvNjRiaXRBTURfOGU5NTFkZDItZWU3Ny00NzI4LTg3MDItNTVjZTRiNWRkMjRhLnhtbC5hc3ANCis7DQorOyBBbGwgcmVnaXN0ZXJzIG11c3QgYmUgcHJlc2VydmVkIGFjcm9zcyB0aGUgY2FsbCwgZXhjZXB0IGZvcg0KKzsgICByYXgsIHJjeCwgcmR4LCByOCwgcjksIHIxMCwgYW5kIHIxMSwgd2hpY2ggYXJlIHNjcmF0Y2guDQorDQorDQorDQorOzs7IFNhdmUgcmVnaXN0ZXJzIHRoYXQgdGhlIGNvbXBpbGVyIG1heSBiZSB1c2luZywgYW5kIGFkanVzdCBlc3AgdG8NCis7OzsgbWFrZSByb29tIGZvciBvdXIgc3RhY2sgZnJhbWUuDQorDQorDQorOzs7IFJldHJpZXZlIHRoZSBmdW5jdGlvbiBhcmd1bWVudHMuIHI4ZCB3aWxsIGhvbGQgY3VyX21hdGNoDQorOzs7IHRocm91Z2hvdXQgdGhlIGVudGlyZSBmdW5jdGlvbi4gZWR4IHdpbGwgaG9sZCB0aGUgcG9pbnRlciB0byB0aGUNCis7OzsgZGVmbGF0ZV9zdGF0ZSBzdHJ1Y3R1cmUgZHVyaW5nIHRoZSBmdW5jdGlvbidzIHNldHVwIChiZWZvcmUNCis7OzsgZW50ZXJpbmcgdGhlIG1haW4gbG9vcC4NCisNCis7IHBhcmFtZXRlciAxIGluIHJjeCAoZGVmbGF0ZV9zdGF0ZSogcyksIHBhcmFtIDIgaW4gZWR4IC0+IHI4IChjdXIgbWF0Y2gpDQorDQorOyB0aGlzIGNsZWFyIGhpZ2ggMzIgYml0cyBvZiByOCwgd2hpY2ggY2FuIGJlIGdhcmJhZ2UgaW4gYm90aCByOCBhbmQgcmR4DQorDQorICAgICAgICBtb3YgW3NhdmVfcmRpXSxyZGkNCisgICAgICAgIG1vdiBbc2F2ZV9yc2ldLHJzaQ0KKyAgICAgICAgbW92IFtzYXZlX3JieF0scmJ4DQorICAgICAgICBtb3YgW3NhdmVfcmJwXSxyYnANCitJRkRFRiBJTkZPWklQDQorICAgICAgICBtb3YgcjhkLGVjeA0KK0VMU0UNCisgICAgICAgIG1vdiByOGQsZWR4DQorRU5ESUYNCisgICAgICAgIG1vdiBbc2F2ZV9yMTJdLHIxMg0KKyAgICAgICAgbW92IFtzYXZlX3IxM10scjEzDQorOyAgICAgICAgbW92IFtzYXZlX3IxNF0scjE0DQorOyAgICAgICAgbW92IFtzYXZlX3IxNV0scjE1DQorDQorDQorOzs7IHVJbnQgd21hc2sgPSBzLT53X21hc2s7DQorOzs7IHVuc2lnbmVkIGNoYWluX2xlbmd0aCA9IHMtPm1heF9jaGFpbl9sZW5ndGg7DQorOzs7IGlmIChzLT5wcmV2X2xlbmd0aCA+PSBzLT5nb29kX21hdGNoKSB7DQorOzs7ICAgICBjaGFpbl9sZW5ndGggPj49IDI7DQorOzs7IH0NCisNCisgICAgICAgIG1vdiBlZGksIHByZXZfbGVuZ3RoDQorICAgICAgICBtb3YgZXNpLCBnb29kX21hdGNoDQorICAgICAgICBtb3YgZWF4LCBXTWFzaw0KKyAgICAgICAgbW92IGVieCwgbWF4X2NoYWluX2xlbmd0aA0KKyAgICAgICAgY21wIGVkaSwgZXNpDQorICAgICAgICBqbCAgTGFzdE1hdGNoR29vZA0KKyAgICAgICAgc2hyIGVieCwgMg0KK0xhc3RNYXRjaEdvb2Q6DQorDQorOzs7IGNoYWlubGVuIGlzIGRlY3JlbWVudGVkIG9uY2UgYmVmb3JlaGFuZCBzbyB0aGF0IHRoZSBmdW5jdGlvbiBjYW4NCis7OzsgdXNlIHRoZSBzaWduIGZsYWcgaW5zdGVhZCBvZiB0aGUgemVybyBmbGFnIGZvciB0aGUgZXhpdCB0ZXN0Lg0KKzs7OyBJdCBpcyB0aGVuIHNoaWZ0ZWQgaW50byB0aGUgaGlnaCB3b3JkLCB0byBtYWtlIHJvb20gZm9yIHRoZSB3bWFzaw0KKzs7OyB2YWx1ZSwgd2hpY2ggaXQgd2lsbCBhbHdheXMgYWNjb21wYW55Lg0KKw0KKyAgICAgICAgZGVjIGVieA0KKyAgICAgICAgc2hsIGVieCwgMTYNCisgICAgICAgIG9yICBlYngsIGVheA0KKw0KKzs7OyBvbiB6bGliIG9ubHkNCis7OzsgaWYgKCh1SW50KW5pY2VfbWF0Y2ggPiBzLT5sb29rYWhlYWQpIG5pY2VfbWF0Y2ggPSBzLT5sb29rYWhlYWQ7DQorDQorSUZERUYgSU5GT1pJUA0KKyAgICAgICAgbW92IFtjaGFpbmxlbndtYXNrXSwgZWJ4DQorOyBvbiBpbmZvemlwIG5pY2VfbWF0Y2ggPSBbbmljZV9tYXRjaF0NCitFTFNFDQorICAgICAgICBtb3YgZWF4LCBuaWNlX21hdGNoDQorICAgICAgICBtb3YgW2NoYWlubGVud21hc2tdLCBlYngNCisgICAgICAgIG1vdiByMTBkLCBMb29rYWhlYWQNCisgICAgICAgIGNtcCByMTBkLCBlYXgNCisgICAgICAgIGNtb3ZubCByMTBkLCBlYXgNCisgICAgICAgIG1vdiBbbmljZW1hdGNoXSxyMTBkDQorRU5ESUYNCisNCis7OzsgcmVnaXN0ZXIgQnl0ZWYgKnNjYW4gPSBzLT53aW5kb3cgKyBzLT5zdHJzdGFydDsNCisgICAgICAgIG1vdiByMTAsIHdpbmRvd19hZA0KKyAgICAgICAgbW92IGVicCwgc3Ryc3RhcnQNCisgICAgICAgIGxlYSByMTMsIFtyMTAgKyByYnBdDQorDQorOzs7IERldGVybWluZSBob3cgbWFueSBieXRlcyB0aGUgc2NhbiBwdHIgaXMgb2ZmIGZyb20gYmVpbmcNCis7OzsgZHdvcmQtYWxpZ25lZC4NCisNCisgICAgICAgICBtb3YgcjkscjEzDQorICAgICAgICAgbmVnIHIxMw0KKyAgICAgICAgIGFuZCByMTMsMw0KKw0KKzs7OyBJUG9zIGxpbWl0ID0gcy0+c3Ryc3RhcnQgPiAoSVBvcylNQVhfRElTVChzKSA/DQorOzs7ICAgICBzLT5zdHJzdGFydCAtIChJUG9zKU1BWF9ESVNUKHMpIDogTklMOw0KK0lGREVGIElORk9aSVANCisgICAgICAgIG1vdiBlYXgsMDdlZmFoIDsgTUFYX0RJU1QgPSAoV1NJWkUtTUlOX0xPT0tBSEVBRCkgKDB4ODAwMC0oMys4KzEpKQ0KK0VMU0UNCisgICAgICAgIG1vdiBlYXgsIHdpbmRvd19zaXplDQorICAgICAgICBzdWIgZWF4LCBNSU5fTE9PS0FIRUFEDQorRU5ESUYNCisgICAgICAgIHhvciBlZGksZWRpDQorICAgICAgICBzdWIgZWJwLCBlYXgNCisNCisgICAgICAgIG1vdiByMTFkLCBwcmV2X2xlbmd0aA0KKw0KKyAgICAgICAgY21vdm5nIGVicCxlZGkNCisNCis7OzsgaW50IGJlc3RfbGVuID0gcy0+cHJldl9sZW5ndGg7DQorDQorDQorOzs7IFN0b3JlIHRoZSBzdW0gb2Ygcy0+d2luZG93ICsgYmVzdF9sZW4gaW4gZXNpIGxvY2FsbHksIGFuZCBpbiBlc2kuDQorDQorICAgICAgIGxlYSAgcnNpLFtyMTArcjExXQ0KKw0KKzs7OyByZWdpc3RlciB1c2ggc2Nhbl9zdGFydCA9ICoodXNoZiopc2NhbjsNCis7OzsgcmVnaXN0ZXIgdXNoIHNjYW5fZW5kICAgPSAqKHVzaGYqKShzY2FuK2Jlc3RfbGVuLTEpOw0KKzs7OyBQb3NmICpwcmV2ID0gcy0+cHJldjsNCisNCisgICAgICAgIG1vdnp4IHIxMmQsd29yZCBwdHIgW3I5XQ0KKyAgICAgICAgbW92enggZWJ4LCB3b3JkIHB0ciBbcjkgKyByMTEgLSAxXQ0KKw0KKyAgICAgICAgbW92IHJkaSwgcHJldl9hZA0KKw0KKzs7OyBKdW1wIGludG8gdGhlIG1haW4gbG9vcC4NCisNCisgICAgICAgIG1vdiBlZHgsIFtjaGFpbmxlbndtYXNrXQ0KKw0KKyAgICAgICAgY21wIGJ4LHdvcmQgcHRyIFtyc2kgKyByOCAtIDFdDQorICAgICAgICBqeiAgTG9va3VwTG9vcElzWmVybw0KKw0KK0xvb2t1cExvb3AxOg0KKyAgICAgICAgYW5kIHI4ZCwgZWR4DQorDQorICAgICAgICBtb3Z6eCAgIHI4ZCwgd29yZCBwdHIgW3JkaSArIHI4KjJdDQorICAgICAgICBjbXAgcjhkLCBlYnANCisgICAgICAgIGpiZSBMZWF2ZU5vdw0KKyAgICAgICAgc3ViIGVkeCwgMDAwMTAwMDBoDQorICAgICAgICBqcyAgTGVhdmVOb3cNCisNCitMb29wRW50cnkxOg0KKyAgICAgICAgY21wIGJ4LHdvcmQgcHRyIFtyc2kgKyByOCAtIDFdDQorICAgICAgICBqeiAgTG9va3VwTG9vcElzWmVybw0KKw0KK0xvb2t1cExvb3AyOg0KKyAgICAgICAgYW5kIHI4ZCwgZWR4DQorDQorICAgICAgICBtb3Z6eCAgIHI4ZCwgd29yZCBwdHIgW3JkaSArIHI4KjJdDQorICAgICAgICBjbXAgcjhkLCBlYnANCisgICAgICAgIGpiZSBMZWF2ZU5vdw0KKyAgICAgICAgc3ViIGVkeCwgMDAwMTAwMDBoDQorICAgICAgICBqcyAgTGVhdmVOb3cNCisNCitMb29wRW50cnkyOg0KKyAgICAgICAgY21wIGJ4LHdvcmQgcHRyIFtyc2kgKyByOCAtIDFdDQorICAgICAgICBqeiAgTG9va3VwTG9vcElzWmVybw0KKw0KK0xvb2t1cExvb3A0Og0KKyAgICAgICAgYW5kIHI4ZCwgZWR4DQorDQorICAgICAgICBtb3Z6eCAgIHI4ZCwgd29yZCBwdHIgW3JkaSArIHI4KjJdDQorICAgICAgICBjbXAgcjhkLCBlYnANCisgICAgICAgIGpiZSBMZWF2ZU5vdw0KKyAgICAgICAgc3ViIGVkeCwgMDAwMTAwMDBoDQorICAgICAgICBqcyAgTGVhdmVOb3cNCisNCitMb29wRW50cnk0Og0KKw0KKyAgICAgICAgY21wIGJ4LHdvcmQgcHRyIFtyc2kgKyByOCAtIDFdDQorICAgICAgICBqbnogTG9va3VwTG9vcDENCisgICAgICAgIGptcCBMb29rdXBMb29wSXNaZXJvDQorDQorDQorOzs7IGRvIHsNCis7OzsgICAgIG1hdGNoID0gcy0+d2luZG93ICsgY3VyX21hdGNoOw0KKzs7OyAgICAgaWYgKCoodXNoZiopKG1hdGNoK2Jlc3RfbGVuLTEpICE9IHNjYW5fZW5kIHx8DQorOzs7ICAgICAgICAgKih1c2hmKiltYXRjaCAhPSBzY2FuX3N0YXJ0KSBjb250aW51ZTsNCis7OzsgICAgIFsuLi5dDQorOzs7IH0gd2hpbGUgKChjdXJfbWF0Y2ggPSBwcmV2W2N1cl9tYXRjaCAmIHdtYXNrXSkgPiBsaW1pdA0KKzs7OyAgICAgICAgICAmJiAtLWNoYWluX2xlbmd0aCAhPSAwKTsNCis7OzsNCis7OzsgSGVyZSBpcyB0aGUgaW5uZXIgbG9vcCBvZiB0aGUgZnVuY3Rpb24uIFRoZSBmdW5jdGlvbiB3aWxsIHNwZW5kIHRoZQ0KKzs7OyBtYWpvcml0eSBvZiBpdHMgdGltZSBpbiB0aGlzIGxvb3AsIGFuZCBtYWpvcml0eSBvZiB0aGF0IHRpbWUgd2lsbA0KKzs7OyBiZSBzcGVudCBpbiB0aGUgZmlyc3QgdGVuIGluc3RydWN0aW9ucy4NCis7OzsNCis7OzsgV2l0aGluIHRoaXMgbG9vcDoNCis7OzsgZWJ4ID0gc2NhbmVuZA0KKzs7OyByOGQgPSBjdXJtYXRjaA0KKzs7OyBlZHggPSBjaGFpbmxlbndtYXNrIC0gaS5lLiwgKChjaGFpbmxlbiA8PCAxNikgfCB3bWFzaykNCis7OzsgZXNpID0gd2luZG93YmVzdGxlbiAtIGkuZS4sICh3aW5kb3cgKyBiZXN0bGVuKQ0KKzs7OyBlZGkgPSBwcmV2DQorOzs7IGVicCA9IGxpbWl0DQorDQorTG9va3VwTG9vcDoNCisgICAgICAgIGFuZCByOGQsIGVkeA0KKw0KKyAgICAgICAgbW92enggICByOGQsIHdvcmQgcHRyIFtyZGkgKyByOCoyXQ0KKyAgICAgICAgY21wIHI4ZCwgZWJwDQorICAgICAgICBqYmUgTGVhdmVOb3cNCisgICAgICAgIHN1YiBlZHgsIDAwMDEwMDAwaA0KKyAgICAgICAganMgIExlYXZlTm93DQorDQorTG9vcEVudHJ5Og0KKw0KKyAgICAgICAgY21wIGJ4LHdvcmQgcHRyIFtyc2kgKyByOCAtIDFdDQorICAgICAgICBqbnogTG9va3VwTG9vcDENCitMb29rdXBMb29wSXNaZXJvOg0KKyAgICAgICAgY21wICAgICByMTJ3LCB3b3JkIHB0ciBbcjEwICsgcjhdDQorICAgICAgICBqbnogTG9va3VwTG9vcDENCisNCisNCis7OzsgU3RvcmUgdGhlIGN1cnJlbnQgdmFsdWUgb2YgY2hhaW5sZW4uDQorICAgICAgICBtb3YgW2NoYWlubGVud21hc2tdLCBlZHgNCisNCis7OzsgUG9pbnQgZWRpIHRvIHRoZSBzdHJpbmcgdW5kZXIgc2NydXRpbnksIGFuZCBlc2kgdG8gdGhlIHN0cmluZyB3ZQ0KKzs7OyBhcmUgaG9waW5nIHRvIG1hdGNoIGl0IHVwIHdpdGguIEluIGFjdHVhbGl0eSwgZXNpIGFuZCBlZGkgYXJlDQorOzs7IGJvdGggcG9pbnRlZCAoTUFYX01BVENIXzggLSBzY2FuYWxpZ24pIGJ5dGVzIGFoZWFkLCBhbmQgZWR4IGlzDQorOzs7IGluaXRpYWxpemVkIHRvIC0oTUFYX01BVENIXzggLSBzY2FuYWxpZ24pLg0KKw0KKyAgICAgICAgbGVhIHJzaSxbcjgrcjEwXQ0KKyAgICAgICAgbW92IHJkeCwgMGZmZmZmZmZmZmZmZmZlZjhoOyAtKE1BWF9NQVRDSF84KQ0KKyAgICAgICAgbGVhIHJzaSwgW3JzaSArIHIxMyArIDAxMDhoXSA7TUFYX01BVENIXzhdDQorICAgICAgICBsZWEgcmRpLCBbcjkgKyByMTMgKyAwMTA4aF0gO01BWF9NQVRDSF84XQ0KKw0KKyAgICAgICAgcHJlZmV0Y2h0MSBbcnNpK3JkeF0NCisgICAgICAgIHByZWZldGNodDEgW3JkaStyZHhdDQorDQorDQorOzs7IFRlc3QgdGhlIHN0cmluZ3MgZm9yIGVxdWFsaXR5LCA4IGJ5dGVzIGF0IGEgdGltZS4gQXQgdGhlIGVuZCwNCis7OzsgYWRqdXN0IHJkeCBzbyB0aGF0IGl0IGlzIG9mZnNldCB0byB0aGUgZXhhY3QgYnl0ZSB0aGF0IG1pc21hdGNoZWQuDQorOzs7DQorOzs7IFdlIGFscmVhZHkga25vdyBhdCB0aGlzIHBvaW50IHRoYXQgdGhlIGZpcnN0IHRocmVlIGJ5dGVzIG9mIHRoZQ0KKzs7OyBzdHJpbmdzIG1hdGNoIGVhY2ggb3RoZXIsIGFuZCB0aGV5IGNhbiBiZSBzYWZlbHkgcGFzc2VkIG92ZXIgYmVmb3JlDQorOzs7IHN0YXJ0aW5nIHRoZSBjb21wYXJlIGxvb3AuIFNvIHdoYXQgdGhpcyBjb2RlIGRvZXMgaXMgc2tpcCBvdmVyIDAtMw0KKzs7OyBieXRlcywgYXMgbXVjaCBhcyBuZWNlc3NhcnkgaW4gb3JkZXIgdG8gZHdvcmQtYWxpZ24gdGhlIGVkaQ0KKzs7OyBwb2ludGVyLiAocnNpIHdpbGwgc3RpbGwgYmUgbWlzYWxpZ25lZCB0aHJlZSB0aW1lcyBvdXQgb2YgZm91ci4pDQorOzs7DQorOzs7IEl0IHNob3VsZCBiZSBjb25mZXNzZWQgdGhhdCB0aGlzIGxvb3AgdXN1YWxseSBkb2VzIG5vdCByZXByZXNlbnQNCis7OzsgbXVjaCBvZiB0aGUgdG90YWwgcnVubmluZyB0aW1lLiBSZXBsYWNpbmcgaXQgd2l0aCBhIG1vcmUNCis7Ozsgc3RyYWlnaHRmb3J3YXJkICJyZXAgY21wc2IiIHdvdWxkIG5vdCBkcmFzdGljYWxseSBkZWdyYWRlDQorOzs7IHBlcmZvcm1hbmNlLg0KKw0KKw0KK0xvb3BDbXBzOg0KKyAgICAgICAgbW92IHJheCwgW3JzaSArIHJkeF0NCisgICAgICAgIHhvciByYXgsIFtyZGkgKyByZHhdDQorICAgICAgICBqbnogTGVhdmVMb29wQ21wcw0KKw0KKyAgICAgICAgbW92IHJheCwgW3JzaSArIHJkeCArIDhdDQorICAgICAgICB4b3IgcmF4LCBbcmRpICsgcmR4ICsgOF0NCisgICAgICAgIGpueiBMZWF2ZUxvb3BDbXBzOA0KKw0KKw0KKyAgICAgICAgbW92IHJheCwgW3JzaSArIHJkeCArIDgrOF0NCisgICAgICAgIHhvciByYXgsIFtyZGkgKyByZHggKyA4KzhdDQorICAgICAgICBqbnogTGVhdmVMb29wQ21wczE2DQorDQorICAgICAgICBhZGQgcmR4LDgrOCs4DQorDQorICAgICAgICBqbnogc2hvcnQgTG9vcENtcHMNCisgICAgICAgIGptcCBzaG9ydCBMZW5NYXhpbXVtDQorTGVhdmVMb29wQ21wczE2OiBhZGQgcmR4LDgNCitMZWF2ZUxvb3BDbXBzODogYWRkIHJkeCw4DQorTGVhdmVMb29wQ21wczoNCisNCisgICAgICAgIHRlc3QgICAgZWF4LCAwMDAwRkZGRmgNCisgICAgICAgIGpueiBMZW5Mb3dlcg0KKw0KKyAgICAgICAgdGVzdCBlYXgsMGZmZmZmZmZmaA0KKw0KKyAgICAgICAgam56IExlbkxvd2VyMzINCisNCisgICAgICAgIGFkZCByZHgsNA0KKyAgICAgICAgc2hyIHJheCwzMg0KKyAgICAgICAgb3IgYXgsYXgNCisgICAgICAgIGpueiBMZW5Mb3dlcg0KKw0KK0xlbkxvd2VyMzI6DQorICAgICAgICBzaHIgZWF4LDE2DQorICAgICAgICBhZGQgcmR4LDINCitMZW5Mb3dlcjogICBzdWIgYWwsIDENCisgICAgICAgIGFkYyByZHgsIDANCis7OzsgQ2FsY3VsYXRlIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoLiBJZiBpdCBpcyBsb25nZXIgdGhhbiBNQVhfTUFUQ0gsDQorOzs7IHRoZW4gYXV0b21hdGljYWxseSBhY2NlcHQgaXQgYXMgdGhlIGJlc3QgcG9zc2libGUgbWF0Y2ggYW5kIGxlYXZlLg0KKw0KKyAgICAgICAgbGVhIHJheCwgW3JkaSArIHJkeF0NCisgICAgICAgIHN1YiByYXgsIHI5DQorICAgICAgICBjbXAgZWF4LCBNQVhfTUFUQ0gNCisgICAgICAgIGpnZSBMZW5NYXhpbXVtDQorDQorOzs7IElmIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoIGlzIG5vdCBsb25nZXIgdGhhbiB0aGUgYmVzdCBtYXRjaCB3ZQ0KKzs7OyBoYXZlIHNvIGZhciwgdGhlbiBmb3JnZXQgaXQgYW5kIHJldHVybiB0byB0aGUgbG9va3VwIGxvb3AuDQorOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorDQorICAgICAgICBjbXAgZWF4LCByMTFkDQorICAgICAgICBqZyAgTG9uZ2VyTWF0Y2gNCisNCisgICAgICAgIGxlYSByc2ksW3IxMCtyMTFdDQorDQorICAgICAgICBtb3YgcmRpLCBwcmV2X2FkDQorICAgICAgICBtb3YgZWR4LCBbY2hhaW5sZW53bWFza10NCisgICAgICAgIGptcCBMb29rdXBMb29wDQorDQorOzs7ICAgICAgICAgcy0+bWF0Y2hfc3RhcnQgPSBjdXJfbWF0Y2g7DQorOzs7ICAgICAgICAgYmVzdF9sZW4gPSBsZW47DQorOzs7ICAgICAgICAgaWYgKGxlbiA+PSBuaWNlX21hdGNoKSBicmVhazsNCis7OzsgICAgICAgICBzY2FuX2VuZCA9ICoodXNoZiopKHNjYW4rYmVzdF9sZW4tMSk7DQorDQorTG9uZ2VyTWF0Y2g6DQorICAgICAgICBtb3YgcjExZCwgZWF4DQorICAgICAgICBtb3YgbWF0Y2hfc3RhcnQsIHI4ZA0KKyAgICAgICAgY21wIGVheCwgW25pY2VtYXRjaF0NCisgICAgICAgIGpnZSBMZWF2ZU5vdw0KKw0KKyAgICAgICAgbGVhIHJzaSxbcjEwK3JheF0NCisNCisgICAgICAgIG1vdnp4ICAgZWJ4LCB3b3JkIHB0ciBbcjkgKyByYXggLSAxXQ0KKyAgICAgICAgbW92IHJkaSwgcHJldl9hZA0KKyAgICAgICAgbW92IGVkeCwgW2NoYWlubGVud21hc2tdDQorICAgICAgICBqbXAgTG9va3VwTG9vcA0KKw0KKzs7OyBBY2NlcHQgdGhlIGN1cnJlbnQgc3RyaW5nLCB3aXRoIHRoZSBtYXhpbXVtIHBvc3NpYmxlIGxlbmd0aC4NCisNCitMZW5NYXhpbXVtOg0KKyAgICAgICAgbW92IHIxMWQsTUFYX01BVENIDQorICAgICAgICBtb3YgbWF0Y2hfc3RhcnQsIHI4ZA0KKw0KKzs7OyBpZiAoKHVJbnQpYmVzdF9sZW4gPD0gcy0+bG9va2FoZWFkKSByZXR1cm4gKHVJbnQpYmVzdF9sZW47DQorOzs7IHJldHVybiBzLT5sb29rYWhlYWQ7DQorDQorTGVhdmVOb3c6DQorSUZERUYgSU5GT1pJUA0KKyAgICAgICAgbW92IGVheCxyMTFkDQorRUxTRQ0KKyAgICAgICAgbW92IGVheCwgTG9va2FoZWFkDQorICAgICAgICBjbXAgcjExZCwgZWF4DQorICAgICAgICBjbW92bmcgZWF4LCByMTFkDQorRU5ESUYNCisNCis7OzsgUmVzdG9yZSB0aGUgc3RhY2sgYW5kIHJldHVybiBmcm9tIHdoZW5jZSB3ZSBjYW1lLg0KKw0KKw0KKyAgICAgICAgbW92IHJzaSxbc2F2ZV9yc2ldDQorICAgICAgICBtb3YgcmRpLFtzYXZlX3JkaV0NCisgICAgICAgIG1vdiByYngsW3NhdmVfcmJ4XQ0KKyAgICAgICAgbW92IHJicCxbc2F2ZV9yYnBdDQorICAgICAgICBtb3YgcjEyLFtzYXZlX3IxMl0NCisgICAgICAgIG1vdiByMTMsW3NhdmVfcjEzXQ0KKzsgICAgICAgIG1vdiByMTQsW3NhdmVfcjE0XQ0KKzsgICAgICAgIG1vdiByMTUsW3NhdmVfcjE1XQ0KKw0KKw0KKyAgICAgICAgcmV0IDANCis7IHBsZWFzZSBkb24ndCByZW1vdmUgdGhpcyBzdHJpbmcgIQ0KKzsgWW91ciBjYW4gZnJlZWx5IHVzZSBndm1hdDY0IGluIGFueSBmcmVlIG9yIGNvbW1lcmNpYWwgYXBwDQorOyBidXQgaXQgaXMgZmFyIGJldHRlciBkb24ndCByZW1vdmUgdGhlIHN0cmluZyBpbiB0aGUgYmluYXJ5IQ0KKyAgICBkYiAgICAgMGRoLDBhaCwiYXNtNjg2IHdpdGggbWFzbSwgb3B0aW1pc2VkIGFzc2VtYmx5IGNvZGUgZnJvbSBCcmlhbiBSYWl0ZXIsIHdyaXR0ZW4gMTk5OCwgY29udmVydGVkIHRvIGFtZCA2NCBieSBHaWxsZXMgVm9sbGFudCAyMDA1IiwwZGgsMGFoLDANCitsb25nZXN0X21hdGNoICAgRU5EUA0KKw0KK21hdGNoX2luaXQgUFJPQw0KKyAgcmV0IDANCittYXRjaF9pbml0IEVORFANCisNCisNCitFTkQNCmRpZmYgLS1naXQgYS96bGliLTEuMi42L2NvbnRyaWIvbWFzbXg2NC9pbmZmYXM4NjY0LmMgYi96bGliLTEuMi42L2NvbnRyaWIvbWFzbXg2NC9pbmZmYXM4NjY0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThhZjA2ZgotLS0gL2Rldi9udWxsCisrKyBiL3psaWItMS4yLjYvY29udHJpYi9tYXNteDY0L2luZmZhczg2NjQuYwpAQCAtMCwwICsxLDE4NiBAQAorLyogaW5mZmFzODY2NC5jIGlzIGEgaGFuZCB0dW5lZCBhc3NlbWJsZXIgdmVyc2lvbiBvZiBpbmZmYXN0LmMgLSBmYXN0IGRlY29kaW5nDQorICogdmVyc2lvbiBmb3IgQU1ENjQgb24gV2luZG93cyB1c2luZyBNaWNyb3NvZnQgQyBjb21waWxlcg0KKyAqDQorICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDMgTWFyayBBZGxlcg0KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgNCisgKg0KKyAqIENvcHlyaWdodCAoQykgMjAwMyBDaHJpcyBBbmRlcnNvbiA8Y2hyaXN0b3BAY2hhcm0ubmV0Pg0KKyAqIFBsZWFzZSB1c2UgdGhlIGNvcHlyaWdodCBjb25kaXRpb25zIGFib3ZlLg0KKyAqDQorICogMjAwNSAtIEFkYXB0YXRpb24gdG8gTWljcm9zb2Z0IEMgQ29tcGlsZXIgZm9yIEFNRDY0IGJ5IEdpbGxlcyBWb2xsYW50DQorICoNCisgKiBpbmZmYXM4NjY0LmMgY2FsbCBmdW5jdGlvbiBpbmZmYXM4NjY0Zm5jIGluIGluZmZhc3g2NC5hc20NCisgKiAgaW5mZmFzeDY0LmFzbSBpcyBhdXRvbWF0aWNhbGx5IGNvbnZlcnQgZnJvbSBBTUQ2NCBwb3J0aW9uIG9mIGluZmZhczg2LmMNCisgKg0KKyAqIERlYy0yOS0yMDAzIC0tIEkgYWRkZWQgQU1ENjQgaW5mbGF0ZSBhc20gc3VwcG9ydC4gIFRoaXMgdmVyc2lvbiBpcyBhbHNvDQorICogc2xpZ2h0bHkgcXVpY2tlciBvbiB4ODYgc3lzdGVtcyBiZWNhdXNlLCBpbnN0ZWFkIG9mIHVzaW5nIHJlcCBtb3ZzYiB0byBjb3B5DQorICogZGF0YSwgaXQgdXNlcyByZXAgbW92c3csIHdoaWNoIG1vdmVzIGRhdGEgaW4gMi1ieXRlIGNodW5rcyBpbnN0ZWFkIG9mIHNpbmdsZQ0KKyAqIGJ5dGVzLiAgSSd2ZSB0ZXN0ZWQgdGhlIEFNRDY0IGNvZGUgb24gYSBGZWRvcmEgQ29yZSAxICsgdGhlIHg4Nl82NCB1cGRhdGVzDQorICogZnJvbSBodHRwOi8vZmVkb3JhLmxpbnV4LmR1a2UuZWR1L2ZjMV94ODZfNjQNCisgKiB3aGljaCBpcyBydW5uaW5nIG9uIGFuIEF0aGxvbiA2NCAzMDAwKyAvIEdpZ2FieXRlIEdBLUs4VlQ4MDBNIHN5c3RlbSB3aXRoDQorICogMUdCIHJhbS4gIFRoZSA2NC1iaXQgdmVyc2lvbiBpcyBhYm91dCA0JSBmYXN0ZXIgdGhhbiB0aGUgMzItYml0IHZlcnNpb24sDQorICogd2hlbiBkZWNvbXByZXNzaW5nIG1vemlsbGEtc291cmNlLTEuMy50YXIuZ3ouDQorICoNCisgKiBNYXItMTMtMjAwMyAtLSBNb3N0IG9mIHRoaXMgaXMgZGVyaXZlZCBmcm9tIGluZmZhc3QuUyB3aGljaCBpcyBkZXJpdmVkIGZyb20NCisgKiB0aGUgZ2NjIC1TIG91dHB1dCBvZiB6bGliLTEuMi4wL2luZmZhc3QuYy4gIFpsaWItMS4yLjAgaXMgaW4gYmV0YSByZWxlYXNlIGF0DQorICogdGhlIG1vbWVudC4gIEkgaGF2ZSBzdWNjZXNzZnVsbHkgY29tcGlsZWQgYW5kIHRlc3RlZCB0aGlzIGNvZGUgd2l0aCBnY2MyLjk2LA0KKyAqIGdjYzMuMiwgaWNjNS4wLCBtc3ZjNi4wLiAgSXQgaXMgdmVyeSBjbG9zZSB0byB0aGUgc3BlZWQgb2YgaW5mZmFzdC5TDQorICogY29tcGlsZWQgd2l0aCBnY2MgLUROT19NTVgsIGJ1dCBpbmZmYXN0LlMgaXMgc3RpbGwgZmFzdGVyIG9uIHRoZSBQMyB3aXRoIE1NWA0KKyAqIGVuYWJsZWQuICBJIHdpbGwgYXR0ZW1wdCB0byBtZXJnZSB0aGUgTU1YIGNvZGUgaW50byB0aGlzIHZlcnNpb24uICBOZXdlcg0KKyAqIHZlcnNpb25zIG9mIHRoaXMgYW5kIGluZmZhc3QuUyBjYW4gYmUgZm91bmQgYXQNCisgKiBodHRwOi8vd3d3LmVldGJlZXRlZS5jb20vemxpYi8gYW5kIGh0dHA6Ly93d3cuY2hhcm0ubmV0L35jaHJpc3RvcC96bGliLw0KKyAqDQorICovDQorDQorI2luY2x1ZGUgPHN0ZGlvLmg+DQorI2luY2x1ZGUgInp1dGlsLmgiDQorI2luY2x1ZGUgImluZnRyZWVzLmgiDQorI2luY2x1ZGUgImluZmxhdGUuaCINCisjaW5jbHVkZSAiaW5mZmFzdC5oIg0KKw0KKy8qIE1hcmsgQWRsZXIncyBjb21tZW50cyBmcm9tIGluZmZhc3QuYzogKi8NCisNCisvKg0KKyAgIERlY29kZSBsaXRlcmFsLCBsZW5ndGgsIGFuZCBkaXN0YW5jZSBjb2RlcyBhbmQgd3JpdGUgb3V0IHRoZSByZXN1bHRpbmcNCisgICBsaXRlcmFsIGFuZCBtYXRjaCBieXRlcyB1bnRpbCBlaXRoZXIgbm90IGVub3VnaCBpbnB1dCBvciBvdXRwdXQgaXMNCisgICBhdmFpbGFibGUsIGFuIGVuZC1vZi1ibG9jayBpcyBlbmNvdW50ZXJlZCwgb3IgYSBkYXRhIGVycm9yIGlzIGVuY291bnRlcmVkLg0KKyAgIFdoZW4gbGFyZ2UgZW5vdWdoIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVycyBhcmUgc3VwcGxpZWQgdG8gaW5mbGF0ZSgpLCBmb3INCisgICBleGFtcGxlLCBhIDE2SyBpbnB1dCBidWZmZXIgYW5kIGEgNjRLIG91dHB1dCBidWZmZXIsIG1vcmUgdGhhbiA5NSUgb2YgdGhlDQorICAgaW5mbGF0ZSBleGVjdXRpb24gdGltZSBpcyBzcGVudCBpbiB0aGlzIHJvdXRpbmUuDQorDQorICAgRW50cnkgYXNzdW1wdGlvbnM6DQorDQorICAgICAgICBzdGF0ZS0+bW9kZSA9PSBMRU4NCisgICAgICAgIHN0cm0tPmF2YWlsX2luID49IDYNCisgICAgICAgIHN0cm0tPmF2YWlsX291dCA+PSAyNTgNCisgICAgICAgIHN0YXJ0ID49IHN0cm0tPmF2YWlsX291dA0KKyAgICAgICAgc3RhdGUtPmJpdHMgPCA4DQorDQorICAgT24gcmV0dXJuLCBzdGF0ZS0+bW9kZSBpcyBvbmUgb2Y6DQorDQorICAgICAgICBMRU4gLS0gcmFuIG91dCBvZiBlbm91Z2ggb3V0cHV0IHNwYWNlIG9yIGVub3VnaCBhdmFpbGFibGUgaW5wdXQNCisgICAgICAgIFRZUEUgLS0gcmVhY2hlZCBlbmQgb2YgYmxvY2sgY29kZSwgaW5mbGF0ZSgpIHRvIGludGVycHJldCBuZXh0IGJsb2NrDQorICAgICAgICBCQUQgLS0gZXJyb3IgaW4gYmxvY2sgZGF0YQ0KKw0KKyAgIE5vdGVzOg0KKw0KKyAgICAtIFRoZSBtYXhpbXVtIGlucHV0IGJpdHMgdXNlZCBieSBhIGxlbmd0aC9kaXN0YW5jZSBwYWlyIGlzIDE1IGJpdHMgZm9yIHRoZQ0KKyAgICAgIGxlbmd0aCBjb2RlLCA1IGJpdHMgZm9yIHRoZSBsZW5ndGggZXh0cmEsIDE1IGJpdHMgZm9yIHRoZSBkaXN0YW5jZSBjb2RlLA0KKyAgICAgIGFuZCAxMyBiaXRzIGZvciB0aGUgZGlzdGFuY2UgZXh0cmEuICBUaGlzIHRvdGFscyA0OCBiaXRzLCBvciBzaXggYnl0ZXMuDQorICAgICAgVGhlcmVmb3JlIGlmIHN0cm0tPmF2YWlsX2luID49IDYsIHRoZW4gdGhlcmUgaXMgZW5vdWdoIGlucHV0IHRvIGF2b2lkDQorICAgICAgY2hlY2tpbmcgZm9yIGF2YWlsYWJsZSBpbnB1dCB3aGlsZSBkZWNvZGluZy4NCisNCisgICAgLSBUaGUgbWF4aW11bSBieXRlcyB0aGF0IGEgc2luZ2xlIGxlbmd0aC9kaXN0YW5jZSBwYWlyIGNhbiBvdXRwdXQgaXMgMjU4DQorICAgICAgYnl0ZXMsIHdoaWNoIGlzIHRoZSBtYXhpbXVtIGxlbmd0aCB0aGF0IGNhbiBiZSBjb2RlZC4gIGluZmxhdGVfZmFzdCgpDQorICAgICAgcmVxdWlyZXMgc3RybS0+YXZhaWxfb3V0ID49IDI1OCBmb3IgZWFjaCBsb29wIHRvIGF2b2lkIGNoZWNraW5nIGZvcg0KKyAgICAgIG91dHB1dCBzcGFjZS4NCisgKi8NCisNCisNCisNCisgICAgdHlwZWRlZiBzdHJ1Y3QgaW5mZmFzdF9hciB7DQorLyogNjQgICAzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ODYgIHg4Nl82NCAqLw0KKy8qIGFyIG9mZnNldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyICovDQorLyogIDAgICAgMCAqLyB2b2lkICplc3A7ICAgICAgICAgICAgICAgIC8qIGVzcCBzYXZlICovDQorLyogIDggICAgNCAqLyB2b2lkICplYnA7ICAgICAgICAgICAgICAgIC8qIGVicCBzYXZlICovDQorLyogMTYgICAgOCAqLyB1bnNpZ25lZCBjaGFyIEZBUiAqaW47ICAgIC8qIGVzaSByc2kgIGxvY2FsIHN0cm0tPm5leHRfaW4gKi8NCisvKiAyNCAgIDEyICovIHVuc2lnbmVkIGNoYXIgRkFSICpsYXN0OyAgLyogICAgIHI5ICAgd2hpbGUgaW4gPCBsYXN0ICovDQorLyogMzIgICAxNiAqLyB1bnNpZ25lZCBjaGFyIEZBUiAqb3V0OyAgIC8qIGVkaSByZGkgIGxvY2FsIHN0cm0tPm5leHRfb3V0ICovDQorLyogNDAgICAyMCAqLyB1bnNpZ25lZCBjaGFyIEZBUiAqYmVnOyAgIC8qICAgICAgICAgIGluZmxhdGUoKSdzIGluaXQgbmV4dF9vdXQgKi8NCisvKiA0OCAgIDI0ICovIHVuc2lnbmVkIGNoYXIgRkFSICplbmQ7ICAgLyogICAgIHIxMCAgd2hpbGUgb3V0IDwgZW5kICovDQorLyogNTYgICAyOCAqLyB1bnNpZ25lZCBjaGFyIEZBUiAqd2luZG93Oy8qICAgICAgICAgIHNpemUgb2Ygd2luZG93LCB3c2l6ZSE9MCAqLw0KKy8qIDY0ICAgMzIgKi8gY29kZSBjb25zdCBGQVIgKmxjb2RlOyAgICAvKiBlYnAgcmJwICBsb2NhbCBzdHJtLT5sZW5jb2RlICovDQorLyogNzIgICAzNiAqLyBjb2RlIGNvbnN0IEZBUiAqZGNvZGU7ICAgIC8qICAgICByMTEgIGxvY2FsIHN0cm0tPmRpc3Rjb2RlICovDQorLyogODAgICA0MCAqLyBzaXplX3QgLyp1bnNpZ25lZCBsb25nICovaG9sZDsgICAgICAgLyogZWR4IHJkeCAgbG9jYWwgc3RybS0+aG9sZCAqLw0KKy8qIDg4ICAgNDQgKi8gdW5zaWduZWQgYml0czsgICAgICAgICAgICAvKiBlYnggcmJ4ICBsb2NhbCBzdHJtLT5iaXRzICovDQorLyogOTIgICA0OCAqLyB1bnNpZ25lZCB3c2l6ZTsgICAgICAgICAgIC8qICAgICAgICAgIHdpbmRvdyBzaXplICovDQorLyogOTYgICA1MiAqLyB1bnNpZ25lZCB3cml0ZTsgICAgICAgICAgIC8qICAgICAgICAgIHdpbmRvdyB3cml0ZSBpbmRleCAqLw0KKy8qMTAwICAgNTYgKi8gdW5zaWduZWQgbG1hc2s7ICAgICAgICAgICAvKiAgICAgcjEyICBtYXNrIGZvciBsY29kZSAqLw0KKy8qMTA0ICAgNjAgKi8gdW5zaWduZWQgZG1hc2s7ICAgICAgICAgICAvKiAgICAgcjEzICBtYXNrIGZvciBkY29kZSAqLw0KKy8qMTA4ICAgNjQgKi8gdW5zaWduZWQgbGVuOyAgICAgICAgICAgICAvKiAgICAgcjE0ICBtYXRjaCBsZW5ndGggKi8NCisvKjExMiAgIDY4ICovIHVuc2lnbmVkIGRpc3Q7ICAgICAgICAgICAgLyogICAgIHIxNSAgbWF0Y2ggZGlzdGFuY2UgKi8NCisvKjExNiAgIDcyICovIHVuc2lnbmVkIHN0YXR1czsgICAgICAgICAgLyogICAgICAgICAgc2V0IHdoZW4gc3RhdGUgY2huZyovDQorICAgIH0gdHlwZV9hcjsNCisjaWZkZWYgQVNNSU5GDQorDQordm9pZCBpbmZsYXRlX2Zhc3Qoc3RybSwgc3RhcnQpDQorel9zdHJlYW1wIHN0cm07DQordW5zaWduZWQgc3RhcnQ7ICAgICAgICAgLyogaW5mbGF0ZSgpJ3Mgc3RhcnRpbmcgdmFsdWUgZm9yIHN0cm0tPmF2YWlsX291dCAqLw0KK3sNCisgICAgc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICpzdGF0ZTsNCisgICAgdHlwZV9hciBhcjsNCisgICAgdm9pZCBpbmZmYXM4NjY0Zm5jKHN0cnVjdCBpbmZmYXN0X2FyICogcGFyKTsNCisNCisNCisNCisjaWYgKGRlZmluZWQoIF9fR05VQ19fICkgJiYgZGVmaW5lZCggX19hbWQ2NF9fICkgJiYgISBkZWZpbmVkKCBfX2kzODYgKSkgfHwgKGRlZmluZWQoX01TQ19WRVIpICYmIGRlZmluZWQoX01fQU1ENjQpKQ0KKyNkZWZpbmUgUEFEX0FWQUlMX0lOIDYNCisjZGVmaW5lIFBBRF9BVkFJTF9PVVQgMjU4DQorI2Vsc2UNCisjZGVmaW5lIFBBRF9BVkFJTF9JTiA1DQorI2RlZmluZSBQQURfQVZBSUxfT1VUIDI1Nw0KKyNlbmRpZg0KKw0KKyAgICAvKiBjb3B5IHN0YXRlIHRvIGxvY2FsIHZhcmlhYmxlcyAqLw0KKyAgICBzdGF0ZSA9IChzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKilzdHJtLT5zdGF0ZTsNCisNCisgICAgYXIuaW4gPSBzdHJtLT5uZXh0X2luOw0KKyAgICBhci5sYXN0ID0gYXIuaW4gKyAoc3RybS0+YXZhaWxfaW4gLSBQQURfQVZBSUxfSU4pOw0KKyAgICBhci5vdXQgPSBzdHJtLT5uZXh0X291dDsNCisgICAgYXIuYmVnID0gYXIub3V0IC0gKHN0YXJ0IC0gc3RybS0+YXZhaWxfb3V0KTsNCisgICAgYXIuZW5kID0gYXIub3V0ICsgKHN0cm0tPmF2YWlsX291dCAtIFBBRF9BVkFJTF9PVVQpOw0KKyAgICBhci53c2l6ZSA9IHN0YXRlLT53c2l6ZTsNCisgICAgYXIud3JpdGUgPSBzdGF0ZS0+d25leHQ7DQorICAgIGFyLndpbmRvdyA9IHN0YXRlLT53aW5kb3c7DQorICAgIGFyLmhvbGQgPSBzdGF0ZS0+aG9sZDsNCisgICAgYXIuYml0cyA9IHN0YXRlLT5iaXRzOw0KKyAgICBhci5sY29kZSA9IHN0YXRlLT5sZW5jb2RlOw0KKyAgICBhci5kY29kZSA9IHN0YXRlLT5kaXN0Y29kZTsNCisgICAgYXIubG1hc2sgPSAoMVUgPDwgc3RhdGUtPmxlbmJpdHMpIC0gMTsNCisgICAgYXIuZG1hc2sgPSAoMVUgPDwgc3RhdGUtPmRpc3RiaXRzKSAtIDE7DQorDQorICAgIC8qIGRlY29kZSBsaXRlcmFscyBhbmQgbGVuZ3RoL2Rpc3RhbmNlcyB1bnRpbCBlbmQtb2YtYmxvY2sgb3Igbm90IGVub3VnaA0KKyAgICAgICBpbnB1dCBkYXRhIG9yIG91dHB1dCBzcGFjZSAqLw0KKw0KKyAgICAvKiBhbGlnbiBpbiBvbiAxLzIgaG9sZCBzaXplIGJvdW5kYXJ5ICovDQorICAgIHdoaWxlICgoKHNpemVfdCkodm9pZCAqKWFyLmluICYgKHNpemVvZihhci5ob2xkKSAvIDIgLSAxKSkgIT0gMCkgew0KKyAgICAgICAgYXIuaG9sZCArPSAodW5zaWduZWQgbG9uZykqYXIuaW4rKyA8PCBhci5iaXRzOw0KKyAgICAgICAgYXIuYml0cyArPSA4Ow0KKyAgICB9DQorDQorICAgIGluZmZhczg2NjRmbmMoJmFyKTsNCisNCisgICAgaWYgKGFyLnN0YXR1cyA+IDEpIHsNCisgICAgICAgIGlmIChhci5zdGF0dXMgPT0gMikNCisgICAgICAgICAgICBzdHJtLT5tc2cgPSAiaW52YWxpZCBsaXRlcmFsL2xlbmd0aCBjb2RlIjsNCisgICAgICAgIGVsc2UgaWYgKGFyLnN0YXR1cyA9PSAzKQ0KKyAgICAgICAgICAgIHN0cm0tPm1zZyA9ICJpbnZhbGlkIGRpc3RhbmNlIGNvZGUiOw0KKyAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgIHN0cm0tPm1zZyA9ICJpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayI7DQorICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsNCisgICAgfQ0KKyAgICBlbHNlIGlmICggYXIuc3RhdHVzID09IDEgKSB7DQorICAgICAgICBzdGF0ZS0+bW9kZSA9IFRZUEU7DQorICAgIH0NCisNCisgICAgLyogcmV0dXJuIHVudXNlZCBieXRlcyAob24gZW50cnksIGJpdHMgPCA4LCBzbyBpbiB3b24ndCBnbyB0b28gZmFyIGJhY2spICovDQorICAgIGFyLmxlbiA9IGFyLmJpdHMgPj4gMzsNCisgICAgYXIuaW4gLT0gYXIubGVuOw0KKyAgICBhci5iaXRzIC09IGFyLmxlbiA8PCAzOw0KKyAgICBhci5ob2xkICY9ICgxVSA8PCBhci5iaXRzKSAtIDE7DQorDQorICAgIC8qIHVwZGF0ZSBzdGF0ZSBhbmQgcmV0dXJuICovDQorICAgIHN0cm0tPm5leHRfaW4gPSBhci5pbjsNCisgICAgc3RybS0+bmV4dF9vdXQgPSBhci5vdXQ7DQorICAgIHN0cm0tPmF2YWlsX2luID0gKHVuc2lnbmVkKShhci5pbiA8IGFyLmxhc3QgPw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFEX0FWQUlMX0lOICsgKGFyLmxhc3QgLSBhci5pbikgOg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFEX0FWQUlMX0lOIC0gKGFyLmluIC0gYXIubGFzdCkpOw0KKyAgICBzdHJtLT5hdmFpbF9vdXQgPSAodW5zaWduZWQpKGFyLm91dCA8IGFyLmVuZCA/DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFEX0FWQUlMX09VVCArIChhci5lbmQgLSBhci5vdXQpIDoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQURfQVZBSUxfT1VUIC0gKGFyLm91dCAtIGFyLmVuZCkpOw0KKyAgICBzdGF0ZS0+aG9sZCA9ICh1bnNpZ25lZCBsb25nKWFyLmhvbGQ7DQorICAgIHN0YXRlLT5iaXRzID0gYXIuYml0czsNCisgICAgcmV0dXJuOw0KK30NCisNCisjZW5kaWYNCmRpZmYgLS1naXQgYS96bGliLTEuMi42L2NvbnRyaWIvbWFzbXg2NC9pbmZmYXN4NjQuYXNtIGIvemxpYi0xLjIuNi9jb250cmliL21hc214NjQvaW5mZmFzeDY0LmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGE4ZDg5Ci0tLSAvZGV2L251bGwKKysrIGIvemxpYi0xLjIuNi9jb250cmliL21hc214NjQvaW5mZmFzeDY0LmFzbQpAQCAtMCwwICsxLDM5NiBAQAorOyBpbmZmYXN4NjQuYXNtIGlzIGEgaGFuZCB0dW5lZCBhc3NlbWJsZXIgdmVyc2lvbiBvZiBpbmZmYXN0LmMgLSBmYXN0IGRlY29kaW5nDQorOyB2ZXJzaW9uIGZvciBBTUQ2NCBvbiBXaW5kb3dzIHVzaW5nIE1pY3Jvc29mdCBDIGNvbXBpbGVyDQorOw0KKzsgaW5mZmFzeDY0LmFzbSBpcyBhdXRvbWF0aWNhbGx5IGNvbnZlcnQgZnJvbSBBTUQ2NCBwb3J0aW9uIG9mIGluZmZhczg2LmMNCis7IGluZmZhc3g2NC5hc20gaXMgY2FsbGVkIGJ5IGluZmZhczg2NjQuYywgd2hpY2ggY29udGFpbiBtb3JlIGluZm8uDQorDQorDQorOyB0byBjb21waWxlIHRoaXMgZmlsZSwgSSB1c2Ugb3B0aW9uDQorOyAgIG1sNjQuZXhlIC9GbGluZmZhc3g2NCAvYyAvWmkgaW5mZmFzeDY0LmFzbQ0KKzsgICB3aXRoIE1pY3Jvc29mdCBNYWNybyBBc3NlbWJsZXIgKHg2NCkgZm9yIEFNRDY0DQorOw0KKw0KKzsgVGhpcyBmaWxlIGNvbXBpbGUgd2l0aCBNaWNyb3NvZnQgTWFjcm8gQXNzZW1ibGVyICh4NjQpIGZvciBBTUQ2NA0KKzsNCis7ICAgbWw2NC5leGUgaXMgZ2l2ZW4gd2l0aCBWaXN1YWwgU3R1ZGlvIDIwMDUvMjAwOC8yMDEwIGFuZCBXaW5kb3dzIFdESw0KKzsNCis7ICAgKHlvdSBjYW4gZ2V0IFdpbmRvd3MgV0RLIHdpdGggbWw2NCBmb3IgQU1ENjQgZnJvbQ0KKzsgICAgICBodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vd2hkYy9EZXZ0b29scy93ZGsvZGVmYXVsdC5tc3B4IGZvciBsb3cgcHJpY2UpDQorOw0KKw0KKw0KKy5jb2RlDQoraW5mZmFzODY2NGZuYyBQUk9DDQorDQorOyBzZWUgaHR0cDovL3dlYmxvZ3MuYXNwLm5ldC9vbGRuZXd0aGluZy9hcmNoaXZlLzIwMDQvMDEvMTQvNTg1NzkuYXNweCBhbmQNCis7IGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vbGlicmFyeS9lbi11cy9rbWFyY2gvaGgva21hcmNoLzY0Yml0QU1EXzhlOTUxZGQyLWVlNzctNDcyOC04NzAyLTU1Y2U0YjVkZDI0YS54bWwuYXNwDQorOw0KKzsgQWxsIHJlZ2lzdGVycyBtdXN0IGJlIHByZXNlcnZlZCBhY3Jvc3MgdGhlIGNhbGwsIGV4Y2VwdCBmb3INCis7ICAgcmF4LCByY3gsIHJkeCwgcjgsIHItOSwgcjEwLCBhbmQgcjExLCB3aGljaCBhcmUgc2NyYXRjaC4NCisNCisNCisJbW92IFtyc3AtOF0scnNpDQorCW1vdiBbcnNwLTE2XSxyZGkNCisJbW92IFtyc3AtMjRdLHIxMg0KKwltb3YgW3JzcC0zMl0scjEzDQorCW1vdiBbcnNwLTQwXSxyMTQNCisJbW92IFtyc3AtNDhdLHIxNQ0KKwltb3YgW3JzcC01Nl0scmJ4DQorDQorCW1vdiByYXgscmN4DQorDQorCW1vdglbcmF4KzhdLCByYnAgICAgICAgOyAvKiBzYXZlIHJlZ3MgcmJwIGFuZCByc3AgKi8NCisJbW92CVtyYXhdLCByc3ANCisNCisJbW92CXJzcCwgcmF4ICAgICAgICAgIDsgLyogbWFrZSByc3AgcG9pbnQgdG8gJmFyICovDQorDQorCW1vdglyc2ksIFtyc3ArMTZdICAgICAgOyAvKiByc2kgID0gaW4gKi8NCisJbW92CXJkaSwgW3JzcCszMl0gICAgICA7IC8qIHJkaSAgPSBvdXQgKi8NCisJbW92CXI5LCBbcnNwKzI0XSAgICAgICA7IC8qIHI5ICAgPSBsYXN0ICovDQorCW1vdglyMTAsIFtyc3ArNDhdICAgICAgOyAvKiByMTAgID0gZW5kICovDQorCW1vdglyYnAsIFtyc3ArNjRdICAgICAgOyAvKiByYnAgID0gbGNvZGUgKi8NCisJbW92CXIxMSwgW3JzcCs3Ml0gICAgICA7IC8qIHIxMSAgPSBkY29kZSAqLw0KKwltb3YJcmR4LCBbcnNwKzgwXSAgICAgIDsgLyogcmR4ICA9IGhvbGQgKi8NCisJbW92CWVieCwgW3JzcCs4OF0gICAgICA7IC8qIGVieCAgPSBiaXRzICovDQorCW1vdglyMTJkLCBbcnNwKzEwMF0gICAgOyAvKiByMTJkID0gbG1hc2sgKi8NCisJbW92CXIxM2QsIFtyc3ArMTA0XSAgICA7IC8qIHIxM2QgPSBkbWFzayAqLw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgLyogcjE0ZCA9IGxlbiAqLw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgLyogcjE1ZCA9IGRpc3QgKi8NCisNCisNCisJY2xkDQorCWNtcAlyMTAsIHJkaQ0KKwlqZQlMX29uZV90aW1lICAgICAgICAgICA7IC8qIGlmIG9ubHkgb25lIGRlY29kZSBsZWZ0ICovDQorCWNtcAlyOSwgcnNpDQorDQorICAgIGpuZSBMX2RvX2xvb3ANCisNCisNCitMX29uZV90aW1lOg0KKwltb3YJcjgsIHIxMiAgICAgICAgICAgOyAvKiByOCA9IGxtYXNrICovDQorCWNtcAlibCwgMzINCisJamEJTF9nZXRfbGVuZ3RoX2NvZGVfb25lX3RpbWUNCisNCisJbG9kc2QgICAgICAgICAgICAgICAgICAgICAgICAgOyAvKiBlYXggPSAqKHVpbnQgKilpbisrICovDQorCW1vdgljbCwgYmwgICAgICAgICAgICA7IC8qIGNsID0gYml0cywgbmVlZHMgaXQgZm9yIHNoaWZ0aW5nICovDQorCWFkZAlibCwgMzIgICAgICAgICAgICAgOyAvKiBiaXRzICs9IDMyICovDQorCXNobAlyYXgsIGNsDQorCW9yCXJkeCwgcmF4ICAgICAgICAgIDsgLyogaG9sZCB8PSAqKCh1aW50ICopaW4pKysgPDwgYml0cyAqLw0KKwlqbXAJTF9nZXRfbGVuZ3RoX2NvZGVfb25lX3RpbWUNCisNCitBTElHTiA0DQorTF93aGlsZV90ZXN0Og0KKwljbXAJcjEwLCByZGkNCisJamJlCUxfYnJlYWtfbG9vcA0KKwljbXAJcjksIHJzaQ0KKwlqYmUJTF9icmVha19sb29wDQorDQorTF9kb19sb29wOg0KKwltb3YJcjgsIHIxMiAgICAgICAgICAgOyAvKiByOCA9IGxtYXNrICovDQorCWNtcAlibCwgMzINCisJamEJTF9nZXRfbGVuZ3RoX2NvZGUgICAgOyAvKiBpZiAoMzIgPCBiaXRzKSAqLw0KKw0KKwlsb2RzZCAgICAgICAgICAgICAgICAgICAgICAgICA7IC8qIGVheCA9ICoodWludCAqKWluKysgKi8NCisJbW92CWNsLCBibCAgICAgICAgICAgIDsgLyogY2wgPSBiaXRzLCBuZWVkcyBpdCBmb3Igc2hpZnRpbmcgKi8NCisJYWRkCWJsLCAzMiAgICAgICAgICAgICA7IC8qIGJpdHMgKz0gMzIgKi8NCisJc2hsCXJheCwgY2wNCisJb3IJcmR4LCByYXggICAgICAgICAgOyAvKiBob2xkIHw9ICooKHVpbnQgKilpbikrKyA8PCBiaXRzICovDQorDQorTF9nZXRfbGVuZ3RoX2NvZGU6DQorCWFuZAlyOCwgcmR4ICAgICAgICAgICAgOyAvKiByOCAmPSBob2xkICovDQorCW1vdgllYXgsIFtyYnArcjgqNF0gIDsgLyogZWF4ID0gbGNvZGVbaG9sZCAmIGxtYXNrXSAqLw0KKw0KKwltb3YJY2wsIGFoICAgICAgICAgICAgOyAvKiBjbCA9IHRoaXMuYml0cyAqLw0KKwlzdWIJYmwsIGFoICAgICAgICAgICAgOyAvKiBiaXRzIC09IHRoaXMuYml0cyAqLw0KKwlzaHIJcmR4LCBjbCAgICAgICAgICAgOyAvKiBob2xkID4+PSB0aGlzLmJpdHMgKi8NCisNCisJdGVzdAlhbCwgYWwNCisJam56CUxfdGVzdF9mb3JfbGVuZ3RoX2Jhc2UgOyAvKiBpZiAob3AgIT0gMCkgNDUuNyUgKi8NCisNCisJbW92CXI4LCByMTIgICAgICAgICAgICA7IC8qIHI4ID0gbG1hc2sgKi8NCisJc2hyCWVheCwgMTYgICAgICAgICAgICA7IC8qIG91dHB1dCB0aGlzLnZhbCBjaGFyICovDQorCXN0b3NiDQorDQorTF9nZXRfbGVuZ3RoX2NvZGVfb25lX3RpbWU6DQorCWFuZAlyOCwgcmR4ICAgICAgICAgICAgOyAvKiByOCAmPSBob2xkICovDQorCW1vdgllYXgsIFtyYnArcjgqNF0gOyAvKiBlYXggPSBsY29kZVtob2xkICYgbG1hc2tdICovDQorDQorTF9kb2xlbjoNCisJbW92CWNsLCBhaCAgICAgICAgICAgIDsgLyogY2wgPSB0aGlzLmJpdHMgKi8NCisJc3ViCWJsLCBhaCAgICAgICAgICAgIDsgLyogYml0cyAtPSB0aGlzLmJpdHMgKi8NCisJc2hyCXJkeCwgY2wgICAgICAgICAgIDsgLyogaG9sZCA+Pj0gdGhpcy5iaXRzICovDQorDQorCXRlc3QJYWwsIGFsDQorCWpueglMX3Rlc3RfZm9yX2xlbmd0aF9iYXNlIDsgLyogaWYgKG9wICE9IDApIDQ1LjclICovDQorDQorCXNocgllYXgsIDE2ICAgICAgICAgICAgOyAvKiBvdXRwdXQgdGhpcy52YWwgY2hhciAqLw0KKwlzdG9zYg0KKwlqbXAJTF93aGlsZV90ZXN0DQorDQorQUxJR04gNA0KK0xfdGVzdF9mb3JfbGVuZ3RoX2Jhc2U6DQorCW1vdglyMTRkLCBlYXggICAgICAgICA7IC8qIGxlbiA9IHRoaXMgKi8NCisJc2hyCXIxNGQsIDE2ICAgICAgICAgICA7IC8qIGxlbiA9IHRoaXMudmFsICovDQorCW1vdgljbCwgYWwNCisNCisJdGVzdAlhbCwgMTYNCisJanoJTF90ZXN0X2Zvcl9zZWNvbmRfbGV2ZWxfbGVuZ3RoIDsgLyogaWYgKChvcCAmIDE2KSA9PSAwKSA4JSAqLw0KKwlhbmQJY2wsIDE1ICAgICAgICAgICAgIDsgLyogb3AgJj0gMTUgKi8NCisJanoJTF9kZWNvZGVfZGlzdGFuY2UgICAgOyAvKiBpZiAoIW9wKSAqLw0KKw0KK0xfYWRkX2JpdHNfdG9fbGVuOg0KKwlzdWIJYmwsIGNsDQorCXhvcgllYXgsIGVheA0KKwlpbmMJZWF4DQorCXNobAllYXgsIGNsDQorCWRlYwllYXgNCisJYW5kCWVheCwgZWR4ICAgICAgICAgIDsgLyogZWF4ICY9IGhvbGQgKi8NCisJc2hyCXJkeCwgY2wNCisJYWRkCXIxNGQsIGVheCAgICAgICAgIDsgLyogbGVuICs9IGhvbGQgJiBtYXNrW29wXSAqLw0KKw0KK0xfZGVjb2RlX2Rpc3RhbmNlOg0KKwltb3YJcjgsIHIxMyAgICAgICAgICAgOyAvKiByOCA9IGRtYXNrICovDQorCWNtcAlibCwgMzINCisJamEJTF9nZXRfZGlzdGFuY2VfY29kZSAgOyAvKiBpZiAoMzIgPCBiaXRzKSAqLw0KKw0KKwlsb2RzZCAgICAgICAgICAgICAgICAgICAgICAgICA7IC8qIGVheCA9ICoodWludCAqKWluKysgKi8NCisJbW92CWNsLCBibCAgICAgICAgICAgIDsgLyogY2wgPSBiaXRzLCBuZWVkcyBpdCBmb3Igc2hpZnRpbmcgKi8NCisJYWRkCWJsLCAzMiAgICAgICAgICAgICA7IC8qIGJpdHMgKz0gMzIgKi8NCisJc2hsCXJheCwgY2wNCisJb3IJcmR4LCByYXggICAgICAgICAgOyAvKiBob2xkIHw9ICooKHVpbnQgKilpbikrKyA8PCBiaXRzICovDQorDQorTF9nZXRfZGlzdGFuY2VfY29kZToNCisJYW5kCXI4LCByZHggICAgICAgICAgIDsgLyogcjggJj0gaG9sZCAqLw0KKwltb3YJZWF4LCBbcjExK3I4KjRdIDsgLyogZWF4ID0gZGNvZGVbaG9sZCAmIGRtYXNrXSAqLw0KKw0KK0xfZG9kaXN0Og0KKwltb3YJcjE1ZCwgZWF4ICAgICAgICAgOyAvKiBkaXN0ID0gdGhpcyAqLw0KKwlzaHIJcjE1ZCwgMTYgICAgICAgICAgIDsgLyogZGlzdCA9IHRoaXMudmFsICovDQorCW1vdgljbCwgYWgNCisJc3ViCWJsLCBhaCAgICAgICAgICAgIDsgLyogYml0cyAtPSB0aGlzLmJpdHMgKi8NCisJc2hyCXJkeCwgY2wgICAgICAgICAgIDsgLyogaG9sZCA+Pj0gdGhpcy5iaXRzICovDQorCW1vdgljbCwgYWwgICAgICAgICAgICA7IC8qIGNsID0gdGhpcy5vcCAqLw0KKw0KKwl0ZXN0CWFsLCAxNiAgICAgICAgICAgICA7IC8qIGlmICgob3AgJiAxNikgPT0gMCkgKi8NCisJanoJTF90ZXN0X2Zvcl9zZWNvbmRfbGV2ZWxfZGlzdA0KKwlhbmQJY2wsIDE1ICAgICAgICAgICAgIDsgLyogb3AgJj0gMTUgKi8NCisJanoJTF9jaGVja19kaXN0X29uZQ0KKw0KK0xfYWRkX2JpdHNfdG9fZGlzdDoNCisJc3ViCWJsLCBjbA0KKwl4b3IJZWF4LCBlYXgNCisJaW5jCWVheA0KKwlzaGwJZWF4LCBjbA0KKwlkZWMJZWF4ICAgICAgICAgICAgICAgICA7IC8qICgxIDw8IG9wKSAtIDEgKi8NCisJYW5kCWVheCwgZWR4ICAgICAgICAgIDsgLyogZWF4ICY9IGhvbGQgKi8NCisJc2hyCXJkeCwgY2wNCisJYWRkCXIxNWQsIGVheCAgICAgICAgIDsgLyogZGlzdCArPSBob2xkICYgKCgxIDw8IG9wKSAtIDEpICovDQorDQorTF9jaGVja193aW5kb3c6DQorCW1vdglyOCwgcnNpICAgICAgICAgICA7IC8qIHNhdmUgaW4gc28gZnJvbSBjYW4gdXNlIGl0J3MgcmVnICovDQorCW1vdglyYXgsIHJkaQ0KKwlzdWIJcmF4LCBbcnNwKzQwXSAgICAgIDsgLyogbmJ5dGVzID0gb3V0IC0gYmVnICovDQorDQorCWNtcAllYXgsIHIxNWQNCisJamIJTF9jbGlwX3dpbmRvdyAgICAgICAgOyAvKiBpZiAoZGlzdCA+IG5ieXRlcykgNC4yJSAqLw0KKw0KKwltb3YJZWN4LCByMTRkICAgICAgICAgOyAvKiBlY3ggPSBsZW4gKi8NCisJbW92CXJzaSwgcmRpDQorCXN1Yglyc2ksIHIxNSAgICAgICAgICA7IC8qIGZyb20gPSBvdXQgLSBkaXN0ICovDQorDQorCXNhcgllY3gsIDENCisJam5jCUxfY29weV90d28gICAgICAgICAgIDsgLyogaWYgbGVuICUgMiA9PSAwICovDQorDQorCXJlcCAgICAgbW92c3cNCisJbW92CWFsLCBbcnNpXQ0KKwltb3YJW3JkaV0sIGFsDQorCWluYwlyZGkNCisNCisJbW92CXJzaSwgcjggICAgICAgICAgIDsgLyogbW92ZSBpbiBiYWNrIHRvICVyc2ksIHRvc3MgZnJvbSAqLw0KKwlqbXAJTF93aGlsZV90ZXN0DQorDQorTF9jb3B5X3R3bzoNCisJcmVwICAgICBtb3Zzdw0KKwltb3YJcnNpLCByOCAgICAgICAgICAgOyAvKiBtb3ZlIGluIGJhY2sgdG8gJXJzaSwgdG9zcyBmcm9tICovDQorCWptcAlMX3doaWxlX3Rlc3QNCisNCitBTElHTiA0DQorTF9jaGVja19kaXN0X29uZToNCisJY21wCXIxNWQsIDEgICAgICAgICAgICA7IC8qIGlmIGRpc3QgMSwgaXMgYSBtZW1zZXQgKi8NCisJam5lCUxfY2hlY2tfd2luZG93DQorCWNtcAlbcnNwKzQwXSwgcmRpICAgICAgOyAvKiBpZiBvdXQgPT0gYmVnLCBvdXRzaWRlIHdpbmRvdyAqLw0KKwlqZQlMX2NoZWNrX3dpbmRvdw0KKw0KKwltb3YJZWN4LCByMTRkICAgICAgICAgOyAvKiBlY3ggPSBsZW4gKi8NCisJbW92CWFsLCBbcmRpLTFdDQorCW1vdglhaCwgYWwNCisNCisJc2FyCWVjeCwgMQ0KKwlqbmMJTF9zZXRfdHdvDQorCW1vdglbcmRpXSwgYWwNCisJaW5jCXJkaQ0KKw0KK0xfc2V0X3R3bzoNCisJcmVwICAgICBzdG9zdw0KKwlqbXAJTF93aGlsZV90ZXN0DQorDQorQUxJR04gNA0KK0xfdGVzdF9mb3Jfc2Vjb25kX2xldmVsX2xlbmd0aDoNCisJdGVzdAlhbCwgNjQNCisJam56CUxfdGVzdF9mb3JfZW5kX29mX2Jsb2NrIDsgLyogaWYgKChvcCAmIDY0KSAhPSAwKSAqLw0KKw0KKwl4b3IJZWF4LCBlYXgNCisJaW5jCWVheA0KKwlzaGwJZWF4LCBjbA0KKwlkZWMJZWF4DQorCWFuZAllYXgsIGVkeCAgICAgICAgIDsgLyogZWF4ICY9IGhvbGQgKi8NCisJYWRkCWVheCwgcjE0ZCAgICAgICAgOyAvKiBlYXggKz0gbGVuICovDQorCW1vdgllYXgsIFtyYnArcmF4KjRdIDsgLyogZWF4ID0gbGNvZGVbdmFsKyhob2xkJm1hc2tbb3BdKV0qLw0KKwlqbXAJTF9kb2xlbg0KKw0KK0FMSUdOIDQNCitMX3Rlc3RfZm9yX3NlY29uZF9sZXZlbF9kaXN0Og0KKwl0ZXN0CWFsLCA2NA0KKwlqbnoJTF9pbnZhbGlkX2Rpc3RhbmNlX2NvZGUgOyAvKiBpZiAoKG9wICYgNjQpICE9IDApICovDQorDQorCXhvcgllYXgsIGVheA0KKwlpbmMJZWF4DQorCXNobAllYXgsIGNsDQorCWRlYwllYXgNCisJYW5kCWVheCwgZWR4ICAgICAgICAgOyAvKiBlYXggJj0gaG9sZCAqLw0KKwlhZGQJZWF4LCByMTVkICAgICAgICA7IC8qIGVheCArPSBkaXN0ICovDQorCW1vdgllYXgsIFtyMTErcmF4KjRdIDsgLyogZWF4ID0gZGNvZGVbdmFsKyhob2xkJm1hc2tbb3BdKV0qLw0KKwlqbXAJTF9kb2Rpc3QNCisNCitBTElHTiA0DQorTF9jbGlwX3dpbmRvdzoNCisJbW92CWVjeCwgZWF4ICAgICAgICAgOyAvKiBlY3ggPSBuYnl0ZXMgKi8NCisJbW92CWVheCwgW3JzcCs5Ml0gICAgIDsgLyogZWF4ID0gd3NpemUsIHByZXBhcmUgZm9yIGRpc3QgY21wICovDQorCW5lZwllY3ggICAgICAgICAgICAgICAgOyAvKiBuYnl0ZXMgPSAtbmJ5dGVzICovDQorDQorCWNtcAllYXgsIHIxNWQNCisJamIJTF9pbnZhbGlkX2Rpc3RhbmNlX3Rvb19mYXIgOyAvKiBpZiAoZGlzdCA+IHdzaXplKSAqLw0KKw0KKwlhZGQJZWN4LCByMTVkICAgICAgICAgOyAvKiBuYnl0ZXMgPSBkaXN0IC0gbmJ5dGVzICovDQorCWNtcAlkd29yZCBwdHIgW3JzcCs5Nl0sIDANCisJam5lCUxfd3JhcF9hcm91bmRfd2luZG93IDsgLyogaWYgKHdyaXRlICE9IDApICovDQorDQorCW1vdglyc2ksIFtyc3ArNTZdICAgICA7IC8qIGZyb20gID0gd2luZG93ICovDQorCXN1YgllYXgsIGVjeCAgICAgICAgIDsgLyogZWF4ICAtPSBuYnl0ZXMgKi8NCisJYWRkCXJzaSwgcmF4ICAgICAgICAgOyAvKiBmcm9tICs9IHdzaXplIC0gbmJ5dGVzICovDQorDQorCW1vdgllYXgsIHIxNGQgICAgICAgIDsgLyogZWF4ID0gbGVuICovDQorCWNtcAlyMTRkLCBlY3gNCisJamJlCUxfZG9fY29weSAgICAgICAgICAgOyAvKiBpZiAobmJ5dGVzID49IGxlbikgKi8NCisNCisJc3ViCWVheCwgZWN4ICAgICAgICAgOyAvKiBlYXggLT0gbmJ5dGVzICovDQorCXJlcCAgICAgbW92c2INCisJbW92CXJzaSwgcmRpDQorCXN1Yglyc2ksIHIxNSAgICAgICAgIDsgLyogZnJvbSA9ICZvdXRbIC1kaXN0IF0gKi8NCisJam1wCUxfZG9fY29weQ0KKw0KK0FMSUdOIDQNCitMX3dyYXBfYXJvdW5kX3dpbmRvdzoNCisJbW92CWVheCwgW3JzcCs5Nl0gICAgIDsgLyogZWF4ID0gd3JpdGUgKi8NCisJY21wCWVjeCwgZWF4DQorCWpiZQlMX2NvbnRpZ3VvdXNfaW5fd2luZG93IDsgLyogaWYgKHdyaXRlID49IG5ieXRlcykgKi8NCisNCisJbW92CWVzaSwgW3JzcCs5Ml0gICAgIDsgLyogZnJvbSAgPSB3c2l6ZSAqLw0KKwlhZGQJcnNpLCBbcnNwKzU2XSAgICAgOyAvKiBmcm9tICs9IHdpbmRvdyAqLw0KKwlhZGQJcnNpLCByYXggICAgICAgICA7IC8qIGZyb20gKz0gd3JpdGUgKi8NCisJc3ViCXJzaSwgcmN4ICAgICAgICAgOyAvKiBmcm9tIC09IG5ieXRlcyAqLw0KKwlzdWIJZWN4LCBlYXggICAgICAgICA7IC8qIG5ieXRlcyAtPSB3cml0ZSAqLw0KKw0KKwltb3YJZWF4LCByMTRkICAgICAgICA7IC8qIGVheCA9IGxlbiAqLw0KKwljbXAJZWF4LCBlY3gNCisJamJlCUxfZG9fY29weSAgICAgICAgICAgOyAvKiBpZiAobmJ5dGVzID49IGxlbikgKi8NCisNCisJc3ViCWVheCwgZWN4ICAgICAgICAgOyAvKiBsZW4gLT0gbmJ5dGVzICovDQorCXJlcCAgICAgbW92c2INCisJbW92CXJzaSwgW3JzcCs1Nl0gICAgIDsgLyogZnJvbSA9IHdpbmRvdyAqLw0KKwltb3YJZWN4LCBbcnNwKzk2XSAgICAgOyAvKiBuYnl0ZXMgPSB3cml0ZSAqLw0KKwljbXAJZWF4LCBlY3gNCisJamJlCUxfZG9fY29weSAgICAgICAgICAgOyAvKiBpZiAobmJ5dGVzID49IGxlbikgKi8NCisNCisJc3ViCWVheCwgZWN4ICAgICAgICAgOyAvKiBsZW4gLT0gbmJ5dGVzICovDQorCXJlcCAgICAgbW92c2INCisJbW92CXJzaSwgcmRpDQorCXN1Yglyc2ksIHIxNSAgICAgICAgIDsgLyogZnJvbSA9IG91dCAtIGRpc3QgKi8NCisJam1wCUxfZG9fY29weQ0KKw0KK0FMSUdOIDQNCitMX2NvbnRpZ3VvdXNfaW5fd2luZG93Og0KKwltb3YJcnNpLCBbcnNwKzU2XSAgICAgOyAvKiByc2kgPSB3aW5kb3cgKi8NCisJYWRkCXJzaSwgcmF4DQorCXN1Yglyc2ksIHJjeCAgICAgICAgIDsgLyogZnJvbSArPSB3cml0ZSAtIG5ieXRlcyAqLw0KKw0KKwltb3YJZWF4LCByMTRkICAgICAgICA7IC8qIGVheCA9IGxlbiAqLw0KKwljbXAJZWF4LCBlY3gNCisJamJlCUxfZG9fY29weSAgICAgICAgICAgOyAvKiBpZiAobmJ5dGVzID49IGxlbikgKi8NCisNCisJc3ViCWVheCwgZWN4ICAgICAgICAgOyAvKiBsZW4gLT0gbmJ5dGVzICovDQorCXJlcCAgICAgbW92c2INCisJbW92CXJzaSwgcmRpDQorCXN1Yglyc2ksIHIxNSAgICAgICAgIDsgLyogZnJvbSA9IG91dCAtIGRpc3QgKi8NCisJam1wCUxfZG9fY29weSAgICAgICAgICAgOyAvKiBpZiAobmJ5dGVzID49IGxlbikgKi8NCisNCitBTElHTiA0DQorTF9kb19jb3B5Og0KKwltb3YJZWN4LCBlYXggICAgICAgICA7IC8qIGVjeCA9IGxlbiAqLw0KKwlyZXAgICAgIG1vdnNiDQorDQorCW1vdglyc2ksIHI4ICAgICAgICAgIDsgLyogbW92ZSBpbiBiYWNrIHRvICVlc2ksIHRvc3MgZnJvbSAqLw0KKwlqbXAJTF93aGlsZV90ZXN0DQorDQorTF90ZXN0X2Zvcl9lbmRfb2ZfYmxvY2s6DQorCXRlc3QJYWwsIDMyDQorCWp6CUxfaW52YWxpZF9saXRlcmFsX2xlbmd0aF9jb2RlDQorCW1vdglkd29yZCBwdHIgW3JzcCsxMTZdLCAxDQorCWptcAlMX2JyZWFrX2xvb3Bfd2l0aF9zdGF0dXMNCisNCitMX2ludmFsaWRfbGl0ZXJhbF9sZW5ndGhfY29kZToNCisJbW92CWR3b3JkIHB0ciBbcnNwKzExNl0sIDINCisJam1wCUxfYnJlYWtfbG9vcF93aXRoX3N0YXR1cw0KKw0KK0xfaW52YWxpZF9kaXN0YW5jZV9jb2RlOg0KKwltb3YJZHdvcmQgcHRyIFtyc3ArMTE2XSwgMw0KKwlqbXAJTF9icmVha19sb29wX3dpdGhfc3RhdHVzDQorDQorTF9pbnZhbGlkX2Rpc3RhbmNlX3Rvb19mYXI6DQorCW1vdglkd29yZCBwdHIgW3JzcCsxMTZdLCA0DQorCWptcAlMX2JyZWFrX2xvb3Bfd2l0aF9zdGF0dXMNCisNCitMX2JyZWFrX2xvb3A6DQorCW1vdglkd29yZCBwdHIgW3JzcCsxMTZdLCAwDQorDQorTF9icmVha19sb29wX3dpdGhfc3RhdHVzOg0KKzsgLyogcHV0IGluLCBvdXQsIGJpdHMsIGFuZCBob2xkIGJhY2sgaW50byBhciBhbmQgcG9wIGVzcCAqLw0KKwltb3YJW3JzcCsxNl0sIHJzaSAgICAgOyAvKiBpbiAqLw0KKwltb3YJW3JzcCszMl0sIHJkaSAgICAgOyAvKiBvdXQgKi8NCisJbW92CVtyc3ArODhdLCBlYnggICAgIDsgLyogYml0cyAqLw0KKwltb3YJW3JzcCs4MF0sIHJkeCAgICAgOyAvKiBob2xkICovDQorDQorCW1vdglyYXgsIFtyc3BdICAgICAgIDsgLyogcmVzdG9yZSByYnAgYW5kIHJzcCAqLw0KKwltb3YJcmJwLCBbcnNwKzhdDQorCW1vdglyc3AsIHJheA0KKw0KKw0KKw0KKwltb3YgcnNpLFtyc3AtOF0NCisJbW92IHJkaSxbcnNwLTE2XQ0KKwltb3YgcjEyLFtyc3AtMjRdDQorCW1vdiByMTMsW3JzcC0zMl0NCisJbW92IHIxNCxbcnNwLTQwXQ0KKwltb3YgcjE1LFtyc3AtNDhdDQorCW1vdiByYngsW3JzcC01Nl0NCisNCisgICAgcmV0IDANCis7ICAgICAgICAgIDoNCis7ICAgICAgICAgIDogIm0iIChhcikNCis7ICAgICAgICAgIDogIm1lbW9yeSIsICIlcmF4IiwgIiVyYngiLCAiJXJjeCIsICIlcmR4IiwgIiVyc2kiLCAiJXJkaSIsDQorOyAgICAgICAgICAgICIlcjgiLCAiJXI5IiwgIiVyMTAiLCAiJXIxMSIsICIlcjEyIiwgIiVyMTMiLCAiJXIxNCIsICIlcjE1Ig0KKzsgICAgKTsNCisNCitpbmZmYXM4NjY0Zm5jIAlFTkRQDQorO19URVhUCUVORFMNCitFTkQNCmRpZmYgLS1naXQgYS96bGliLTEuMi42L2NvbnRyaWIvbWFzbXg2NC9yZWFkbWUudHh0IGIvemxpYi0xLjIuNi9jb250cmliL21hc214NjQvcmVhZG1lLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGE2NzMzCi0tLSAvZGV2L251bGwKKysrIGIvemxpYi0xLjIuNi9jb250cmliL21hc214NjQvcmVhZG1lLnR4dApAQCAtMCwwICsxLDMxIEBACitTdW1tYXJ5DQorLS0tLS0tLQ0KK1RoaXMgZGlyZWN0b3J5IGNvbnRhaW5zIEFTTSBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIGZ1bmN0aW9ucw0KK2xvbmdlc3RfbWF0Y2goKSBhbmQgaW5mbGF0ZV9mYXN0KCksIGZvciA2NCBiaXRzIHg4NiAoYm90aCBBTUQ2NCBhbmQgSW50ZWwgRU02NHQpLA0KK2ZvciB1c2Ugd2l0aCBNaWNyb3NvZnQgTWFjcm8gQXNzZW1ibGVyICh4NjQpIGZvciBBTUQ2NCBhbmQgTWljcm9zb2Z0IEMrKyA2NCBiaXRzLg0KKw0KK2d2bWF0NjQuYXNtIGlzIHdyaXR0ZW4gYnkgR2lsbGVzIFZvbGxhbnQgKDIwMDUpLCBieSB1c2luZyBCcmlhbiBSYWl0ZXIgNjg2LzMyIGJpdHMNCisgICBhc3NlbWJseSBvcHRpbWl6ZWQgdmVyc2lvbiBmcm9tIEplYW4tbG91cCBHYWlsbHkgb3JpZ2luYWwgbG9uZ2VzdF9tYXRjaCBmdW5jdGlvbg0KKw0KK2luZmZhc3g2NC5hc20gYW5kIGluZmZhczg2NjQuYyB3ZXJlIHdyaXR0ZW4gYnkgQ2hyaXMgQW5kZXJzb24sIGJ5IG9wdGltaXppbmcNCisgICBvcmlnaW5hbCBmdW5jdGlvbiBmcm9tIE1hcmsgQWRsZXINCisNCitVc2UgaW5zdHJ1Y3Rpb25zDQorLS0tLS0tLS0tLS0tLS0tLQ0KK0Fzc2VtYmxlIHRoZSAuYXNtIGZpbGVzIHVzaW5nIE1BU00gYW5kIHB1dCB0aGUgb2JqZWN0IGZpbGVzIGludG8gdGhlIHpsaWIgc291cmNlDQorZGlyZWN0b3J5LiAgWW91IGNhbiBhbHNvIGdldCBvYmplY3QgZmlsZXMgaGVyZToNCisNCisgICAgIGh0dHA6Ly93d3cud2luaW1hZ2UuY29tL3pMaWJEbGwvemxpYjEyNF9tYXNtX29iai56aXANCisNCitkZWZpbmUgQVNNViBhbmQgQVNNSU5GIGluIHlvdXIgcHJvamVjdC4gSW5jbHVkZSBpbmZmYXM4NjY0LmMgaW4geW91ciBzb3VyY2UgdHJlZSwNCithbmQgaW5mZmFzeDY0Lm9iaiBhbmQgZ3ZtYXQ2NC5vYmogYXMgb2JqZWN0IHRvIGxpbmsuDQorDQorDQorQnVpbGQgaW5zdHJ1Y3Rpb25zDQorLS0tLS0tLS0tLS0tLS0tLS0tDQorcnVuIGJsZF82NC5iYXQgd2l0aCBNaWNyb3NvZnQgTWFjcm8gQXNzZW1ibGVyICh4NjQpIGZvciBBTUQ2NCAobWw2NC5leGUpDQorDQorbWw2NC5leGUgaXMgZ2l2ZW4gd2l0aCBWaXN1YWwgU3R1ZGlvIDIwMDUsIFdpbmRvd3MgMjAwMyBzZXJ2ZXIgRERLDQorDQorWW91IGNhbiBnZXQgV2luZG93cyAyMDAzIHNlcnZlciBEREsgd2l0aCBtbDY0IGFuZCBjbCBmb3IgQU1ENjQgZnJvbQ0KKyAgaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3doZGMvZGV2dG9vbHMvZGRrL2RlZmF1bHQubXNweCBmb3IgbG93IHByaWNlKQ0KZGlmZiAtLWdpdCBhL3psaWItMS4yLjYvY29udHJpYi9tYXNteDg2L2JsZF9tbDMyLmJhdCBiL3psaWItMS4yLjYvY29udHJpYi9tYXNteDg2L2JsZF9tbDMyLmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWI4NmJmCi0tLSAvZGV2L251bGwKKysrIGIvemxpYi0xLjIuNi9jb250cmliL21hc214ODYvYmxkX21sMzIuYmF0CkBAIC0wLDAgKzEsMiBAQAorbWwgL2NvZmYgL1ppIC9jIC9GbG1hdGNoNjg2LmxzdCBtYXRjaDY4Ni5hc20NCittbCAvY29mZiAvWmkgL2MgL0ZsaW5mZmFzMzIubHN0IGluZmZhczMyLmFzbQ0KZGlmZiAtLWdpdCBhL3psaWItMS4yLjYvY29udHJpYi9tYXNteDg2L2luZmZhczMyLmFzbSBiL3psaWItMS4yLjYvY29udHJpYi9tYXNteDg2L2luZmZhczMyLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wM2QyMGY4Ci0tLSAvZGV2L251bGwKKysrIGIvemxpYi0xLjIuNi9jb250cmliL21hc214ODYvaW5mZmFzMzIuYXNtCkBAIC0wLDAgKzEsMTA4MCBAQAorOy8qIGluZmZhczMyLmFzbSBpcyBhIGhhbmQgdHVuZWQgYXNzZW1ibGVyIHZlcnNpb24gb2YgaW5mZmFzdC5jIC0tIGZhc3QgZGVjb2RpbmcNCis7ICoNCis7ICogaW5mZmFzMzIuYXNtIGlzIGRlcml2YXRlZCBmcm9tIGluZmZhczg2LmMsIHdpdGggdHJhbnNsYXRpb24gb2YgYXNzZW1ibHkgY29kZQ0KKzsgKg0KKzsgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMyBNYXJrIEFkbGVyDQorOyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgNCis7ICoNCis7ICogQ29weXJpZ2h0IChDKSAyMDAzIENocmlzIEFuZGVyc29uIDxjaHJpc3RvcEBjaGFybS5uZXQ+DQorOyAqIFBsZWFzZSB1c2UgdGhlIGNvcHlyaWdodCBjb25kaXRpb25zIGFib3ZlLg0KKzsgKg0KKzsgKiBNYXItMTMtMjAwMyAtLSBNb3N0IG9mIHRoaXMgaXMgZGVyaXZlZCBmcm9tIGluZmZhc3QuUyB3aGljaCBpcyBkZXJpdmVkIGZyb20NCis7ICogdGhlIGdjYyAtUyBvdXRwdXQgb2YgemxpYi0xLjIuMC9pbmZmYXN0LmMuICBabGliLTEuMi4wIGlzIGluIGJldGEgcmVsZWFzZSBhdA0KKzsgKiB0aGUgbW9tZW50LiAgSSBoYXZlIHN1Y2Nlc3NmdWxseSBjb21waWxlZCBhbmQgdGVzdGVkIHRoaXMgY29kZSB3aXRoIGdjYzIuOTYsDQorOyAqIGdjYzMuMiwgaWNjNS4wLCBtc3ZjNi4wLiAgSXQgaXMgdmVyeSBjbG9zZSB0byB0aGUgc3BlZWQgb2YgaW5mZmFzdC5TDQorOyAqIGNvbXBpbGVkIHdpdGggZ2NjIC1ETk9fTU1YLCBidXQgaW5mZmFzdC5TIGlzIHN0aWxsIGZhc3RlciBvbiB0aGUgUDMgd2l0aCBNTVgNCis7ICogZW5hYmxlZC4gIEkgd2lsbCBhdHRlbXB0IHRvIG1lcmdlIHRoZSBNTVggY29kZSBpbnRvIHRoaXMgdmVyc2lvbi4gIE5ld2VyDQorOyAqIHZlcnNpb25zIG9mIHRoaXMgYW5kIGluZmZhc3QuUyBjYW4gYmUgZm91bmQgYXQNCis7ICogaHR0cDovL3d3dy5lZXRiZWV0ZWUuY29tL3psaWIvIGFuZCBodHRwOi8vd3d3LmNoYXJtLm5ldC9+Y2hyaXN0b3AvemxpYi8NCis7ICoNCis7ICogMjAwNSA6IG1vZGlmaWNhdGlvbiBieSBHaWxsZXMgVm9sbGFudA0KKzsgKi8NCis7IEZvciBWaXN1YWwgQysrIDQueCBhbmQgaGlnaGVyIGFuZCBNTCA2LnggYW5kIGhpZ2hlcg0KKzsgICBtbC5leGUgaXMgaW4gZGlyZWN0b3J5IFxNQVNNNjExQyBvZiBXaW45NSBEREsNCis7ICAgbWwuZXhlIGlzIGFsc28gZGlzdHJpYnV0ZWQgaW4gaHR0cDovL3d3dy5tYXNtMzIuY29tL21hc21kbC5odG0NCis7ICAgIGFuZCBpbiBWQysrMjAwMyB0b29sa2l0IGF0IGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vdmlzdWFsYy92Y3Rvb2xraXQyMDAzLw0KKzsNCis7DQorOyAgIGNvbXBpbGUgd2l0aCBjb21tYW5kIGxpbmUgb3B0aW9uDQorOyAgIG1sICAvY29mZiAvWmkgL2MgL0ZsaW5mZmFzMzIubHN0IGluZmZhczMyLmFzbQ0KKw0KKzsgICBpZiB5b3UgZGVmaW5lIE5PX0daSVAgKHNlZSBpbmZsYXRlLmgpLCBjb21waWxlIHdpdGgNCis7ICAgbWwgIC9jb2ZmIC9aaSAvYyAvRmxpbmZmYXMzMi5sc3QgL0ROT19HVU5aSVAgaW5mZmFzMzIuYXNtDQorDQorDQorOyB6bGliMTIyc3VwIGlzIDAgZm9ydCB6bGliIDEuMi4yLjEgYW5kIGxvd2VyDQorOyB6bGliMTIyc3VwIGlzIDggZm9ydCB6bGliIDEuMi4yLjIgYW5kIG1vcmUgKHdpdGggYWRkaXRpb24gb2YgZG1heCBhbmQgaGVhZA0KKzsgICAgICAgIGluIGluZmxhdGVfc3RhdGUgaW4gaW5mbGF0ZS5oKQ0KK3psaWIxMjIyc3VwICAgICAgZXF1ICAgIDgNCisNCisNCitJRkRFRiBHVU5aSVANCisgIElORkxBVEVfTU9ERV9UWVBFICAgIGVxdSAxMQ0KKyAgSU5GTEFURV9NT0RFX0JBRCAgICAgZXF1IDI2DQorRUxTRQ0KKyAgSUZOREVGIE5PX0dVTlpJUA0KKyAgICBJTkZMQVRFX01PREVfVFlQRSAgICBlcXUgMTENCisgICAgSU5GTEFURV9NT0RFX0JBRCAgICAgZXF1IDI2DQorICBFTFNFDQorICAgIElORkxBVEVfTU9ERV9UWVBFICAgIGVxdSAzDQorICAgIElORkxBVEVfTU9ERV9CQUQgICAgIGVxdSAxNw0KKyAgRU5ESUYNCitFTkRJRg0KKw0KKw0KKzsgNzUgImluZmZhc3QuUyINCis7RklMRSAiaW5mZmFzdC5TIg0KKw0KKzs7O0dMT0JBTCBfaW5mbGF0ZV9mYXN0DQorDQorOzs7U0VDVElPTiAudGV4dA0KKw0KKw0KKw0KKwkuNTg2cA0KKwkubW14DQorDQorCW5hbWUJaW5mbGF0ZV9mYXN0X3g4Ng0KKwkuTU9ERUwJRkxBVA0KKw0KK19EQVRBCQkJc2VnbWVudA0KK2luZmxhdGVfZmFzdF91c2VfbW14Og0KKwlkZAkxDQorDQorDQorX1RFWFQJCQlzZWdtZW50DQorDQorDQorDQorQUxJR04gNA0KKwlkYgknRmFzdCBkZWNvZGluZyBDb2RlIGZyb20gQ2hyaXMgQW5kZXJzb24nDQorCWRiCTANCisNCitBTElHTiA0DQoraW52YWxpZF9saXRlcmFsX2xlbmd0aF9jb2RlX21zZzoNCisJZGIJJ2ludmFsaWQgbGl0ZXJhbC9sZW5ndGggY29kZScNCisJZGIJMA0KKw0KK0FMSUdOIDQNCitpbnZhbGlkX2Rpc3RhbmNlX2NvZGVfbXNnOg0KKwlkYgknaW52YWxpZCBkaXN0YW5jZSBjb2RlJw0KKwlkYgkwDQorDQorQUxJR04gNA0KK2ludmFsaWRfZGlzdGFuY2VfdG9vX2Zhcl9tc2c6DQorCWRiCSdpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjaycNCisJZGIJMA0KKw0KKw0KK0FMSUdOIDQNCitpbmZsYXRlX2Zhc3RfbWFzazoNCitkZAkwDQorZGQJMQ0KK2RkCTMNCitkZAk3DQorZGQJMTUNCitkZAkzMQ0KK2RkCTYzDQorZGQJMTI3DQorZGQJMjU1DQorZGQJNTExDQorZGQJMTAyMw0KK2RkCTIwNDcNCitkZAk0MDk1DQorZGQJODE5MQ0KK2RkCTE2MzgzDQorZGQJMzI3NjcNCitkZAk2NTUzNQ0KK2RkCTEzMTA3MQ0KK2RkCTI2MjE0Mw0KK2RkCTUyNDI4Nw0KK2RkCTEwNDg1NzUNCitkZAkyMDk3MTUxDQorZGQJNDE5NDMwMw0KK2RkCTgzODg2MDcNCitkZAkxNjc3NzIxNQ0KK2RkCTMzNTU0NDMxDQorZGQJNjcxMDg4NjMNCitkZAkxMzQyMTc3MjcNCitkZAkyNjg0MzU0NTUNCitkZAk1MzY4NzA5MTENCitkZAkxMDczNzQxODIzDQorZGQJMjE0NzQ4MzY0Nw0KK2RkCTQyOTQ5NjcyOTUNCisNCisNCittb2RlX3N0YXRlCSBlcXUJMAk7Lyogc3RhdGUtPm1vZGUJKi8NCit3c2l6ZV9zdGF0ZQkgZXF1CSgzMit6bGliMTIyMnN1cCkJOy8qIHN0YXRlLT53c2l6ZSAqLw0KK3dyaXRlX3N0YXRlCSBlcXUJKDM2KzQremxpYjEyMjJzdXApCTsvKiBzdGF0ZS0+d3JpdGUgKi8NCit3aW5kb3dfc3RhdGUJIGVxdQkoNDArNCt6bGliMTIyMnN1cCkJOy8qIHN0YXRlLT53aW5kb3cgKi8NCitob2xkX3N0YXRlCSBlcXUJKDQ0KzQremxpYjEyMjJzdXApCTsvKiBzdGF0ZS0+aG9sZAkqLw0KK2JpdHNfc3RhdGUJIGVxdQkoNDgrNCt6bGliMTIyMnN1cCkJOy8qIHN0YXRlLT5iaXRzCSovDQorbGVuY29kZV9zdGF0ZQkgZXF1CSg2NCs0K3psaWIxMjIyc3VwKQk7Lyogc3RhdGUtPmxlbmNvZGUgKi8NCitkaXN0Y29kZV9zdGF0ZQkgZXF1CSg2OCs0K3psaWIxMjIyc3VwKQk7Lyogc3RhdGUtPmRpc3Rjb2RlICovDQorbGVuYml0c19zdGF0ZQkgZXF1CSg3Mis0K3psaWIxMjIyc3VwKQk7Lyogc3RhdGUtPmxlbmJpdHMgKi8NCitkaXN0Yml0c19zdGF0ZQkgZXF1CSg3Nis0K3psaWIxMjIyc3VwKQk7Lyogc3RhdGUtPmRpc3RiaXRzICovDQorDQorDQorOztTRUNUSU9OIC50ZXh0DQorOyAyMDUgImluZmZhc3QuUyINCis7R0xPQkFMCWluZmxhdGVfZmFzdF91c2VfbW14DQorDQorO1NFQ1RJT04gLmRhdGENCisNCisNCis7IEdMT0JBTCBpbmZsYXRlX2Zhc3RfdXNlX21teDpvYmplY3QNCis7LnNpemUgaW5mbGF0ZV9mYXN0X3VzZV9tbXgsIDQNCis7IDIyNiAiaW5mZmFzdC5TIg0KKztTRUNUSU9OIC50ZXh0DQorDQorQUxJR04gNA0KK19pbmZsYXRlX2Zhc3QgcHJvYyBuZWFyDQorLkZQTyAoMTYsIDQsIDAsIDAsIDEsIDApDQorCXB1c2ggIGVkaQ0KKwlwdXNoICBlc2kNCisJcHVzaCAgZWJwDQorCXB1c2ggIGVieA0KKwlwdXNoZmQNCisJc3ViICBlc3AsNjQNCisJY2xkDQorDQorDQorDQorDQorCW1vdiAgZXNpLCBbZXNwKzg4XQ0KKwltb3YgIGVkaSwgW2VzaSsyOF0NCisNCisNCisNCisNCisNCisNCisNCisJbW92ICBlZHgsIFtlc2krNF0NCisJbW92ICBlYXgsIFtlc2krMF0NCisNCisJYWRkICBlZHgsZWF4DQorCXN1YiAgZWR4LDExDQorDQorCW1vdiAgW2VzcCs0NF0sZWF4DQorCW1vdiAgW2VzcCsyMF0sZWR4DQorDQorCW1vdiAgZWJwLCBbZXNwKzkyXQ0KKwltb3YgIGVjeCwgW2VzaSsxNl0NCisJbW92ICBlYngsIFtlc2krMTJdDQorDQorCXN1YiAgZWJwLGVjeA0KKwluZWcgIGVicA0KKwlhZGQgIGVicCxlYngNCisNCisJc3ViICBlY3gsMjU3DQorCWFkZCAgZWN4LGVieA0KKw0KKwltb3YgIFtlc3ArNjBdLGVieA0KKwltb3YgIFtlc3ArNDBdLGVicA0KKwltb3YgIFtlc3ArMTZdLGVjeA0KKzsgMjg1ICJpbmZmYXN0LlMiDQorCW1vdiAgZWF4LCBbZWRpK2xlbmNvZGVfc3RhdGVdDQorCW1vdiAgZWN4LCBbZWRpK2Rpc3Rjb2RlX3N0YXRlXQ0KKw0KKwltb3YgIFtlc3ArOF0sZWF4DQorCW1vdiAgW2VzcCsxMl0sZWN4DQorDQorCW1vdiAgZWF4LDENCisJbW92ICBlY3gsIFtlZGkrbGVuYml0c19zdGF0ZV0NCisJc2hsICBlYXgsY2wNCisJZGVjICBlYXgNCisJbW92ICBbZXNwKzBdLGVheA0KKw0KKwltb3YgIGVheCwxDQorCW1vdiAgZWN4LCBbZWRpK2Rpc3RiaXRzX3N0YXRlXQ0KKwlzaGwgIGVheCxjbA0KKwlkZWMgIGVheA0KKwltb3YgIFtlc3ArNF0sZWF4DQorDQorCW1vdiAgZWF4LCBbZWRpK3dzaXplX3N0YXRlXQ0KKwltb3YgIGVjeCwgW2VkaSt3cml0ZV9zdGF0ZV0NCisJbW92ICBlZHgsIFtlZGkrd2luZG93X3N0YXRlXQ0KKw0KKwltb3YgIFtlc3ArNTJdLGVheA0KKwltb3YgIFtlc3ArNDhdLGVjeA0KKwltb3YgIFtlc3ArNTZdLGVkeA0KKw0KKwltb3YgIGVicCwgW2VkaStob2xkX3N0YXRlXQ0KKwltb3YgIGVieCwgW2VkaStiaXRzX3N0YXRlXQ0KKzsgMzIxICJpbmZmYXN0LlMiDQorCW1vdiAgZXNpLCBbZXNwKzQ0XQ0KKwltb3YgIGVjeCwgW2VzcCsyMF0NCisJY21wICBlY3gsZXNpDQorCWphICAgTF9hbGlnbl9sb25nDQorDQorCWFkZCAgZWN4LDExDQorCXN1YiAgZWN4LGVzaQ0KKwltb3YgIGVheCwxMg0KKwlzdWIgIGVheCxlY3gNCisJbGVhICBlZGksIFtlc3ArMjhdDQorCXJlcCBtb3ZzYg0KKwltb3YgIGVjeCxlYXgNCisJeG9yICBlYXgsZWF4DQorCXJlcCBzdG9zYg0KKwlsZWEgIGVzaSwgW2VzcCsyOF0NCisJbW92ICBbZXNwKzIwXSxlc2kNCisJam1wICBMX2lzX2FsaWduZWQNCisNCisNCitMX2FsaWduX2xvbmc6DQorCXRlc3QgIGVzaSwzDQorCWp6ICAgTF9pc19hbGlnbmVkDQorCXhvciAgZWF4LGVheA0KKwltb3YgIGFsLCBbZXNpXQ0KKwlpbmMgIGVzaQ0KKwltb3YgIGVjeCxlYngNCisJYWRkICBlYngsOA0KKwlzaGwgIGVheCxjbA0KKwlvciAgZWJwLGVheA0KKwlqbXAgTF9hbGlnbl9sb25nDQorDQorTF9pc19hbGlnbmVkOg0KKwltb3YgIGVkaSwgW2VzcCs2MF0NCis7IDM2NiAiaW5mZmFzdC5TIg0KK0xfY2hlY2tfbW14Og0KKwljbXAgIGR3b3JkIHB0ciBbaW5mbGF0ZV9mYXN0X3VzZV9tbXhdLDINCisJamUgICBMX2luaXRfbW14DQorCWphICAgTF9kb19sb29wDQorDQorCXB1c2ggIGVheA0KKwlwdXNoICBlYngNCisJcHVzaCAgZWN4DQorCXB1c2ggIGVkeA0KKwlwdXNoZmQNCisJbW92ICBlYXgsIFtlc3BdDQorCXhvciAgZHdvcmQgcHRyIFtlc3BdLDAyMDAwMDBoDQorDQorDQorDQorDQorCXBvcGZkDQorCXB1c2hmZA0KKwlwb3AgIGVkeA0KKwl4b3IgIGVkeCxlYXgNCisJanogICBMX2RvbnRfdXNlX21teA0KKwl4b3IgIGVheCxlYXgNCisJY3B1aWQNCisJY21wICBlYngsMDc1NmU2NTQ3aA0KKwlqbmUgIExfZG9udF91c2VfbW14DQorCWNtcCAgZWN4LDA2YzY1NzQ2ZWgNCisJam5lICBMX2RvbnRfdXNlX21teA0KKwljbXAgIGVkeCwwNDk2NTZlNjloDQorCWpuZSAgTF9kb250X3VzZV9tbXgNCisJbW92ICBlYXgsMQ0KKwljcHVpZA0KKwlzaHIgIGVheCw4DQorCWFuZCAgZWF4LDE1DQorCWNtcCAgZWF4LDYNCisJam5lICBMX2RvbnRfdXNlX21teA0KKwl0ZXN0ICBlZHgsMDgwMDAwMGgNCisJam56ICBMX3VzZV9tbXgNCisJam1wICBMX2RvbnRfdXNlX21teA0KK0xfdXNlX21teDoNCisJbW92ICBkd29yZCBwdHIgW2luZmxhdGVfZmFzdF91c2VfbW14XSwyDQorCWptcCAgTF9jaGVja19tbXhfcG9wDQorTF9kb250X3VzZV9tbXg6DQorCW1vdiAgZHdvcmQgcHRyIFtpbmZsYXRlX2Zhc3RfdXNlX21teF0sMw0KK0xfY2hlY2tfbW14X3BvcDoNCisJcG9wICBlZHgNCisJcG9wICBlY3gNCisJcG9wICBlYngNCisJcG9wICBlYXgNCisJam1wICBMX2NoZWNrX21teA0KKzsgNDI2ICJpbmZmYXN0LlMiDQorQUxJR04gNA0KK0xfZG9fbG9vcDoNCis7IDQzNyAiaW5mZmFzdC5TIg0KKwljbXAgIGJsLDE1DQorCWphICAgTF9nZXRfbGVuZ3RoX2NvZGUNCisNCisJeG9yICBlYXgsZWF4DQorCWxvZHN3DQorCW1vdiAgY2wsYmwNCisJYWRkICBibCwxNg0KKwlzaGwgIGVheCxjbA0KKwlvciAgZWJwLGVheA0KKw0KK0xfZ2V0X2xlbmd0aF9jb2RlOg0KKwltb3YgIGVkeCwgW2VzcCswXQ0KKwltb3YgIGVjeCwgW2VzcCs4XQ0KKwlhbmQgIGVkeCxlYnANCisJbW92ICBlYXgsIFtlY3grZWR4KjRdDQorDQorTF9kb2xlbjoNCisNCisNCisNCisNCisNCisNCisJbW92ICBjbCxhaA0KKwlzdWIgIGJsLGFoDQorCXNociAgZWJwLGNsDQorDQorDQorDQorDQorDQorDQorCXRlc3QgIGFsLGFsDQorCWpueiAgIExfdGVzdF9mb3JfbGVuZ3RoX2Jhc2UNCisNCisJc2hyICBlYXgsMTYNCisJc3Rvc2INCisNCitMX3doaWxlX3Rlc3Q6DQorDQorDQorCWNtcCAgW2VzcCsxNl0sZWRpDQorCWpiZSAgTF9icmVha19sb29wDQorDQorCWNtcCAgW2VzcCsyMF0sZXNpDQorCWphICAgTF9kb19sb29wDQorCWptcCAgTF9icmVha19sb29wDQorDQorTF90ZXN0X2Zvcl9sZW5ndGhfYmFzZToNCis7IDUwMiAiaW5mZmFzdC5TIg0KKwltb3YgIGVkeCxlYXgNCisJc2hyICBlZHgsMTYNCisJbW92ICBjbCxhbA0KKw0KKwl0ZXN0ICBhbCwxNg0KKwlqeiAgIExfdGVzdF9mb3Jfc2Vjb25kX2xldmVsX2xlbmd0aA0KKwlhbmQgIGNsLDE1DQorCWp6ICAgTF9zYXZlX2xlbg0KKwljbXAgIGJsLGNsDQorCWphZSAgTF9hZGRfYml0c190b19sZW4NCisNCisJbW92ICBjaCxjbA0KKwl4b3IgIGVheCxlYXgNCisJbG9kc3cNCisJbW92ICBjbCxibA0KKwlhZGQgIGJsLDE2DQorCXNobCAgZWF4LGNsDQorCW9yICBlYnAsZWF4DQorCW1vdiAgY2wsY2gNCisNCitMX2FkZF9iaXRzX3RvX2xlbjoNCisJbW92ICBlYXgsMQ0KKwlzaGwgIGVheCxjbA0KKwlkZWMgIGVheA0KKwlzdWIgIGJsLGNsDQorCWFuZCAgZWF4LGVicA0KKwlzaHIgIGVicCxjbA0KKwlhZGQgIGVkeCxlYXgNCisNCitMX3NhdmVfbGVuOg0KKwltb3YgIFtlc3ArMjRdLGVkeA0KKw0KKw0KK0xfZGVjb2RlX2Rpc3RhbmNlOg0KKzsgNTQ5ICJpbmZmYXN0LlMiDQorCWNtcCAgYmwsMTUNCisJamEgICBMX2dldF9kaXN0YW5jZV9jb2RlDQorDQorCXhvciAgZWF4LGVheA0KKwlsb2Rzdw0KKwltb3YgIGNsLGJsDQorCWFkZCAgYmwsMTYNCisJc2hsICBlYXgsY2wNCisJb3IgIGVicCxlYXgNCisNCitMX2dldF9kaXN0YW5jZV9jb2RlOg0KKwltb3YgIGVkeCwgW2VzcCs0XQ0KKwltb3YgIGVjeCwgW2VzcCsxMl0NCisJYW5kICBlZHgsZWJwDQorCW1vdiAgZWF4LCBbZWN4K2VkeCo0XQ0KKw0KKw0KK0xfZG9kaXN0Og0KKwltb3YgIGVkeCxlYXgNCisJc2hyICBlZHgsMTYNCisJbW92ICBjbCxhaA0KKwlzdWIgIGJsLGFoDQorCXNociAgZWJwLGNsDQorOyA1ODQgImluZmZhc3QuUyINCisJbW92ICBjbCxhbA0KKw0KKwl0ZXN0ICBhbCwxNg0KKwlqeiAgTF90ZXN0X2Zvcl9zZWNvbmRfbGV2ZWxfZGlzdA0KKwlhbmQgIGNsLDE1DQorCWp6ICBMX2NoZWNrX2Rpc3Rfb25lDQorCWNtcCAgYmwsY2wNCisJamFlICBMX2FkZF9iaXRzX3RvX2Rpc3QNCisNCisJbW92ICBjaCxjbA0KKwl4b3IgIGVheCxlYXgNCisJbG9kc3cNCisJbW92ICBjbCxibA0KKwlhZGQgIGJsLDE2DQorCXNobCAgZWF4LGNsDQorCW9yICBlYnAsZWF4DQorCW1vdiAgY2wsY2gNCisNCitMX2FkZF9iaXRzX3RvX2Rpc3Q6DQorCW1vdiAgZWF4LDENCisJc2hsICBlYXgsY2wNCisJZGVjICBlYXgNCisJc3ViICBibCxjbA0KKwlhbmQgIGVheCxlYnANCisJc2hyICBlYnAsY2wNCisJYWRkICBlZHgsZWF4DQorCWptcCAgTF9jaGVja193aW5kb3cNCisNCitMX2NoZWNrX3dpbmRvdzoNCis7IDYyNSAiaW5mZmFzdC5TIg0KKwltb3YgIFtlc3ArNDRdLGVzaQ0KKwltb3YgIGVheCxlZGkNCisJc3ViICBlYXgsIFtlc3ArNDBdDQorDQorCWNtcCAgZWF4LGVkeA0KKwlqYiAgIExfY2xpcF93aW5kb3cNCisNCisJbW92ICBlY3gsIFtlc3ArMjRdDQorCW1vdiAgZXNpLGVkaQ0KKwlzdWIgIGVzaSxlZHgNCisNCisJc3ViICBlY3gsMw0KKwltb3YgIGFsLCBbZXNpXQ0KKwltb3YgIFtlZGldLGFsDQorCW1vdiAgYWwsIFtlc2krMV0NCisJbW92ICBkbCwgW2VzaSsyXQ0KKwlhZGQgIGVzaSwzDQorCW1vdiAgW2VkaSsxXSxhbA0KKwltb3YgIFtlZGkrMl0sZGwNCisJYWRkICBlZGksMw0KKwlyZXAgbW92c2INCisNCisJbW92ICBlc2ksIFtlc3ArNDRdDQorCWptcCAgTF93aGlsZV90ZXN0DQorDQorQUxJR04gNA0KK0xfY2hlY2tfZGlzdF9vbmU6DQorCWNtcCAgZWR4LDENCisJam5lICBMX2NoZWNrX3dpbmRvdw0KKwljbXAgIFtlc3ArNDBdLGVkaQ0KKwlqZSAgTF9jaGVja193aW5kb3cNCisNCisJZGVjICBlZGkNCisJbW92ICBlY3gsIFtlc3ArMjRdDQorCW1vdiAgYWwsIFtlZGldDQorCXN1YiAgZWN4LDMNCisNCisJbW92ICBbZWRpKzFdLGFsDQorCW1vdiAgW2VkaSsyXSxhbA0KKwltb3YgIFtlZGkrM10sYWwNCisJYWRkICBlZGksNA0KKwlyZXAgc3Rvc2INCisNCisJam1wICBMX3doaWxlX3Rlc3QNCisNCitBTElHTiA0DQorTF90ZXN0X2Zvcl9zZWNvbmRfbGV2ZWxfbGVuZ3RoOg0KKw0KKw0KKw0KKw0KKwl0ZXN0ICBhbCw2NA0KKwlqbnogICBMX3Rlc3RfZm9yX2VuZF9vZl9ibG9jaw0KKw0KKwltb3YgIGVheCwxDQorCXNobCAgZWF4LGNsDQorCWRlYyAgZWF4DQorCWFuZCAgZWF4LGVicA0KKwlhZGQgIGVheCxlZHgNCisJbW92ICBlZHgsIFtlc3ArOF0NCisJbW92ICBlYXgsIFtlZHgrZWF4KjRdDQorCWptcCAgTF9kb2xlbg0KKw0KK0FMSUdOIDQNCitMX3Rlc3RfZm9yX3NlY29uZF9sZXZlbF9kaXN0Og0KKw0KKw0KKw0KKw0KKwl0ZXN0ICBhbCw2NA0KKwlqbnogICBMX2ludmFsaWRfZGlzdGFuY2VfY29kZQ0KKw0KKwltb3YgIGVheCwxDQorCXNobCAgZWF4LGNsDQorCWRlYyAgZWF4DQorCWFuZCAgZWF4LGVicA0KKwlhZGQgIGVheCxlZHgNCisJbW92ICBlZHgsIFtlc3ArMTJdDQorCW1vdiAgZWF4LCBbZWR4K2VheCo0XQ0KKwlqbXAgIExfZG9kaXN0DQorDQorQUxJR04gNA0KK0xfY2xpcF93aW5kb3c6DQorOyA3MjEgImluZmZhc3QuUyINCisJbW92ICBlY3gsZWF4DQorCW1vdiAgZWF4LCBbZXNwKzUyXQ0KKwluZWcgIGVjeA0KKwltb3YgIGVzaSwgW2VzcCs1Nl0NCisNCisJY21wICBlYXgsZWR4DQorCWpiICAgTF9pbnZhbGlkX2Rpc3RhbmNlX3Rvb19mYXINCisNCisJYWRkICBlY3gsZWR4DQorCWNtcCAgZHdvcmQgcHRyIFtlc3ArNDhdLDANCisJam5lICBMX3dyYXBfYXJvdW5kX3dpbmRvdw0KKw0KKwlzdWIgIGVheCxlY3gNCisJYWRkICBlc2ksZWF4DQorOyA3NDkgImluZmZhc3QuUyINCisJbW92ICBlYXgsIFtlc3ArMjRdDQorCWNtcCAgZWF4LGVjeA0KKwlqYmUgIExfZG9fY29weTENCisNCisJc3ViICBlYXgsZWN4DQorCXJlcCBtb3ZzYg0KKwltb3YgIGVzaSxlZGkNCisJc3ViICBlc2ksZWR4DQorCWptcCAgTF9kb19jb3B5MQ0KKw0KKwljbXAgIGVheCxlY3gNCisJamJlICBMX2RvX2NvcHkxDQorDQorCXN1YiAgZWF4LGVjeA0KKwlyZXAgbW92c2INCisJbW92ICBlc2ksZWRpDQorCXN1YiAgZXNpLGVkeA0KKwlqbXAgIExfZG9fY29weTENCisNCitMX3dyYXBfYXJvdW5kX3dpbmRvdzoNCis7IDc5MyAiaW5mZmFzdC5TIg0KKwltb3YgIGVheCwgW2VzcCs0OF0NCisJY21wICBlY3gsZWF4DQorCWpiZSAgTF9jb250aWd1b3VzX2luX3dpbmRvdw0KKw0KKwlhZGQgIGVzaSwgW2VzcCs1Ml0NCisJYWRkICBlc2ksZWF4DQorCXN1YiAgZXNpLGVjeA0KKwlzdWIgIGVjeCxlYXgNCisNCisNCisJbW92ICBlYXgsIFtlc3ArMjRdDQorCWNtcCAgZWF4LGVjeA0KKwlqYmUgIExfZG9fY29weTENCisNCisJc3ViICBlYXgsZWN4DQorCXJlcCBtb3ZzYg0KKwltb3YgIGVzaSwgW2VzcCs1Nl0NCisJbW92ICBlY3gsIFtlc3ArNDhdDQorCWNtcCAgZWF4LGVjeA0KKwlqYmUgIExfZG9fY29weTENCisNCisJc3ViICBlYXgsZWN4DQorCXJlcCBtb3ZzYg0KKwltb3YgIGVzaSxlZGkNCisJc3ViICBlc2ksZWR4DQorCWptcCAgTF9kb19jb3B5MQ0KKw0KK0xfY29udGlndW91c19pbl93aW5kb3c6DQorOyA4MzYgImluZmZhc3QuUyINCisJYWRkICBlc2ksZWF4DQorCXN1YiAgZXNpLGVjeA0KKw0KKw0KKwltb3YgIGVheCwgW2VzcCsyNF0NCisJY21wICBlYXgsZWN4DQorCWpiZSAgTF9kb19jb3B5MQ0KKw0KKwlzdWIgIGVheCxlY3gNCisJcmVwIG1vdnNiDQorCW1vdiAgZXNpLGVkaQ0KKwlzdWIgIGVzaSxlZHgNCisNCitMX2RvX2NvcHkxOg0KKzsgODYyICJpbmZmYXN0LlMiDQorCW1vdiAgZWN4LGVheA0KKwlyZXAgbW92c2INCisNCisJbW92ICBlc2ksIFtlc3ArNDRdDQorCWptcCAgTF93aGlsZV90ZXN0DQorOyA4NzggImluZmZhc3QuUyINCitBTElHTiA0DQorTF9pbml0X21teDoNCisJZW1tcw0KKw0KKw0KKw0KKw0KKw0KKwltb3ZkIG1tMCxlYnANCisJbW92ICBlYnAsZWJ4DQorOyA4OTYgImluZmZhc3QuUyINCisJbW92ZCBtbTQsZHdvcmQgcHRyIFtlc3ArMF0NCisJbW92cSBtbTMsbW00DQorCW1vdmQgbW01LGR3b3JkIHB0ciBbZXNwKzRdDQorCW1vdnEgbW0yLG1tNQ0KKwlweG9yIG1tMSxtbTENCisJbW92ICBlYngsIFtlc3ArOF0NCisJam1wICBMX2RvX2xvb3BfbW14DQorDQorQUxJR04gNA0KK0xfZG9fbG9vcF9tbXg6DQorCXBzcmxxIG1tMCxtbTENCisNCisJY21wICBlYnAsMzINCisJamEgIExfZ2V0X2xlbmd0aF9jb2RlX21teA0KKw0KKwltb3ZkIG1tNixlYnANCisJbW92ZCBtbTcsZHdvcmQgcHRyIFtlc2ldDQorCWFkZCAgZXNpLDQNCisJcHNsbHEgbW03LG1tNg0KKwlhZGQgIGVicCwzMg0KKwlwb3IgbW0wLG1tNw0KKw0KK0xfZ2V0X2xlbmd0aF9jb2RlX21teDoNCisJcGFuZCBtbTQsbW0wDQorCW1vdmQgZWF4LG1tNA0KKwltb3ZxIG1tNCxtbTMNCisJbW92ICBlYXgsIFtlYngrZWF4KjRdDQorDQorTF9kb2xlbl9tbXg6DQorCW1vdnp4ICBlY3gsYWgNCisJbW92ZCBtbTEsZWN4DQorCXN1YiAgZWJwLGVjeA0KKw0KKwl0ZXN0ICBhbCxhbA0KKwlqbnogTF90ZXN0X2Zvcl9sZW5ndGhfYmFzZV9tbXgNCisNCisJc2hyICBlYXgsMTYNCisJc3Rvc2INCisNCitMX3doaWxlX3Rlc3RfbW14Og0KKw0KKw0KKwljbXAgIFtlc3ArMTZdLGVkaQ0KKwlqYmUgTF9icmVha19sb29wDQorDQorCWNtcCAgW2VzcCsyMF0sZXNpDQorCWphIExfZG9fbG9vcF9tbXgNCisJam1wIExfYnJlYWtfbG9vcA0KKw0KK0xfdGVzdF9mb3JfbGVuZ3RoX2Jhc2VfbW14Og0KKw0KKwltb3YgIGVkeCxlYXgNCisJc2hyICBlZHgsMTYNCisNCisJdGVzdCAgYWwsMTYNCisJanogIExfdGVzdF9mb3Jfc2Vjb25kX2xldmVsX2xlbmd0aF9tbXgNCisJYW5kICBlYXgsMTUNCisJanogTF9kZWNvZGVfZGlzdGFuY2VfbW14DQorDQorCXBzcmxxIG1tMCxtbTENCisJbW92ZCBtbTEsZWF4DQorCW1vdmQgZWN4LG1tMA0KKwlzdWIgIGVicCxlYXgNCisJYW5kICBlY3gsIFtpbmZsYXRlX2Zhc3RfbWFzaytlYXgqNF0NCisJYWRkICBlZHgsZWN4DQorDQorTF9kZWNvZGVfZGlzdGFuY2VfbW14Og0KKwlwc3JscSBtbTAsbW0xDQorDQorCWNtcCAgZWJwLDMyDQorCWphIExfZ2V0X2Rpc3RfY29kZV9tbXgNCisNCisJbW92ZCBtbTYsZWJwDQorCW1vdmQgbW03LGR3b3JkIHB0ciBbZXNpXQ0KKwlhZGQgIGVzaSw0DQorCXBzbGxxIG1tNyxtbTYNCisJYWRkICBlYnAsMzINCisJcG9yIG1tMCxtbTcNCisNCitMX2dldF9kaXN0X2NvZGVfbW14Og0KKwltb3YgIGVieCwgW2VzcCsxMl0NCisJcGFuZCBtbTUsbW0wDQorCW1vdmQgZWF4LG1tNQ0KKwltb3ZxIG1tNSxtbTINCisJbW92ICBlYXgsIFtlYngrZWF4KjRdDQorDQorTF9kb2Rpc3RfbW14Og0KKw0KKwltb3Z6eCAgZWN4LGFoDQorCW1vdiAgZWJ4LGVheA0KKwlzaHIgIGVieCwxNg0KKwlzdWIgIGVicCxlY3gNCisJbW92ZCBtbTEsZWN4DQorDQorCXRlc3QgIGFsLDE2DQorCWp6IExfdGVzdF9mb3Jfc2Vjb25kX2xldmVsX2Rpc3RfbW14DQorCWFuZCAgZWF4LDE1DQorCWp6IExfY2hlY2tfZGlzdF9vbmVfbW14DQorDQorTF9hZGRfYml0c190b19kaXN0X21teDoNCisJcHNybHEgbW0wLG1tMQ0KKwltb3ZkIG1tMSxlYXgNCisJbW92ZCBlY3gsbW0wDQorCXN1YiAgZWJwLGVheA0KKwlhbmQgIGVjeCwgW2luZmxhdGVfZmFzdF9tYXNrK2VheCo0XQ0KKwlhZGQgIGVieCxlY3gNCisNCitMX2NoZWNrX3dpbmRvd19tbXg6DQorCW1vdiAgW2VzcCs0NF0sZXNpDQorCW1vdiAgZWF4LGVkaQ0KKwlzdWIgIGVheCwgW2VzcCs0MF0NCisNCisJY21wICBlYXgsZWJ4DQorCWpiIExfY2xpcF93aW5kb3dfbW14DQorDQorCW1vdiAgZWN4LGVkeA0KKwltb3YgIGVzaSxlZGkNCisJc3ViICBlc2ksZWJ4DQorDQorCXN1YiAgZWN4LDMNCisJbW92ICBhbCwgW2VzaV0NCisJbW92ICBbZWRpXSxhbA0KKwltb3YgIGFsLCBbZXNpKzFdDQorCW1vdiAgZGwsIFtlc2krMl0NCisJYWRkICBlc2ksMw0KKwltb3YgIFtlZGkrMV0sYWwNCisJbW92ICBbZWRpKzJdLGRsDQorCWFkZCAgZWRpLDMNCisJcmVwIG1vdnNiDQorDQorCW1vdiAgZXNpLCBbZXNwKzQ0XQ0KKwltb3YgIGVieCwgW2VzcCs4XQ0KKwlqbXAgIExfd2hpbGVfdGVzdF9tbXgNCisNCitBTElHTiA0DQorTF9jaGVja19kaXN0X29uZV9tbXg6DQorCWNtcCAgZWJ4LDENCisJam5lICBMX2NoZWNrX3dpbmRvd19tbXgNCisJY21wICBbZXNwKzQwXSxlZGkNCisJamUgICBMX2NoZWNrX3dpbmRvd19tbXgNCisNCisJZGVjICBlZGkNCisJbW92ICBlY3gsZWR4DQorCW1vdiAgYWwsIFtlZGldDQorCXN1YiAgZWN4LDMNCisNCisJbW92ICBbZWRpKzFdLGFsDQorCW1vdiAgW2VkaSsyXSxhbA0KKwltb3YgIFtlZGkrM10sYWwNCisJYWRkICBlZGksNA0KKwlyZXAgc3Rvc2INCisNCisJbW92ICBlYngsIFtlc3ArOF0NCisJam1wICBMX3doaWxlX3Rlc3RfbW14DQorDQorQUxJR04gNA0KK0xfdGVzdF9mb3Jfc2Vjb25kX2xldmVsX2xlbmd0aF9tbXg6DQorCXRlc3QgIGFsLDY0DQorCWpueiBMX3Rlc3RfZm9yX2VuZF9vZl9ibG9jaw0KKw0KKwlhbmQgIGVheCwxNQ0KKwlwc3JscSBtbTAsbW0xDQorCW1vdmQgZWN4LG1tMA0KKwlhbmQgIGVjeCwgW2luZmxhdGVfZmFzdF9tYXNrK2VheCo0XQ0KKwlhZGQgIGVjeCxlZHgNCisJbW92ICBlYXgsIFtlYngrZWN4KjRdDQorCWptcCBMX2RvbGVuX21teA0KKw0KK0FMSUdOIDQNCitMX3Rlc3RfZm9yX3NlY29uZF9sZXZlbF9kaXN0X21teDoNCisJdGVzdCAgYWwsNjQNCisJam56IExfaW52YWxpZF9kaXN0YW5jZV9jb2RlDQorDQorCWFuZCAgZWF4LDE1DQorCXBzcmxxIG1tMCxtbTENCisJbW92ZCBlY3gsbW0wDQorCWFuZCAgZWN4LCBbaW5mbGF0ZV9mYXN0X21hc2srZWF4KjRdDQorCW1vdiAgZWF4LCBbZXNwKzEyXQ0KKwlhZGQgIGVjeCxlYngNCisJbW92ICBlYXgsIFtlYXgrZWN4KjRdDQorCWptcCAgTF9kb2Rpc3RfbW14DQorDQorQUxJR04gNA0KK0xfY2xpcF93aW5kb3dfbW14Og0KKw0KKwltb3YgIGVjeCxlYXgNCisJbW92ICBlYXgsIFtlc3ArNTJdDQorCW5lZyAgZWN4DQorCW1vdiAgZXNpLCBbZXNwKzU2XQ0KKw0KKwljbXAgIGVheCxlYngNCisJamIgIExfaW52YWxpZF9kaXN0YW5jZV90b29fZmFyDQorDQorCWFkZCAgZWN4LGVieA0KKwljbXAgIGR3b3JkIHB0ciBbZXNwKzQ4XSwwDQorCWpuZSAgTF93cmFwX2Fyb3VuZF93aW5kb3dfbW14DQorDQorCXN1YiAgZWF4LGVjeA0KKwlhZGQgIGVzaSxlYXgNCisNCisJY21wICBlZHgsZWN4DQorCWpiZSAgTF9kb19jb3B5MV9tbXgNCisNCisJc3ViICBlZHgsZWN4DQorCXJlcCBtb3ZzYg0KKwltb3YgIGVzaSxlZGkNCisJc3ViICBlc2ksZWJ4DQorCWptcCAgTF9kb19jb3B5MV9tbXgNCisNCisJY21wICBlZHgsZWN4DQorCWpiZSAgTF9kb19jb3B5MV9tbXgNCisNCisJc3ViICBlZHgsZWN4DQorCXJlcCBtb3ZzYg0KKwltb3YgIGVzaSxlZGkNCisJc3ViICBlc2ksZWJ4DQorCWptcCAgTF9kb19jb3B5MV9tbXgNCisNCitMX3dyYXBfYXJvdW5kX3dpbmRvd19tbXg6DQorDQorCW1vdiAgZWF4LCBbZXNwKzQ4XQ0KKwljbXAgIGVjeCxlYXgNCisJamJlICBMX2NvbnRpZ3VvdXNfaW5fd2luZG93X21teA0KKw0KKwlhZGQgIGVzaSwgW2VzcCs1Ml0NCisJYWRkICBlc2ksZWF4DQorCXN1YiAgZXNpLGVjeA0KKwlzdWIgIGVjeCxlYXgNCisNCisNCisJY21wICBlZHgsZWN4DQorCWpiZSAgTF9kb19jb3B5MV9tbXgNCisNCisJc3ViICBlZHgsZWN4DQorCXJlcCBtb3ZzYg0KKwltb3YgIGVzaSwgW2VzcCs1Nl0NCisJbW92ICBlY3gsIFtlc3ArNDhdDQorCWNtcCAgZWR4LGVjeA0KKwlqYmUgIExfZG9fY29weTFfbW14DQorDQorCXN1YiAgZWR4LGVjeA0KKwlyZXAgbW92c2INCisJbW92ICBlc2ksZWRpDQorCXN1YiAgZXNpLGVieA0KKwlqbXAgIExfZG9fY29weTFfbW14DQorDQorTF9jb250aWd1b3VzX2luX3dpbmRvd19tbXg6DQorDQorCWFkZCAgZXNpLGVheA0KKwlzdWIgIGVzaSxlY3gNCisNCisNCisJY21wICBlZHgsZWN4DQorCWpiZSAgTF9kb19jb3B5MV9tbXgNCisNCisJc3ViICBlZHgsZWN4DQorCXJlcCBtb3ZzYg0KKwltb3YgIGVzaSxlZGkNCisJc3ViICBlc2ksZWJ4DQorDQorTF9kb19jb3B5MV9tbXg6DQorDQorDQorCW1vdiAgZWN4LGVkeA0KKwlyZXAgbW92c2INCisNCisJbW92ICBlc2ksIFtlc3ArNDRdDQorCW1vdiAgZWJ4LCBbZXNwKzhdDQorCWptcCAgTF93aGlsZV90ZXN0X21teA0KKzsgMTE3NCAiaW5mZmFzdC5TIg0KK0xfaW52YWxpZF9kaXN0YW5jZV9jb2RlOg0KKw0KKw0KKw0KKw0KKw0KKwltb3YgIGVjeCwgaW52YWxpZF9kaXN0YW5jZV9jb2RlX21zZw0KKwltb3YgIGVkeCxJTkZMQVRFX01PREVfQkFEDQorCWptcCAgTF91cGRhdGVfc3RyZWFtX3N0YXRlDQorDQorTF90ZXN0X2Zvcl9lbmRfb2ZfYmxvY2s6DQorDQorDQorDQorDQorDQorCXRlc3QgIGFsLDMyDQorCWp6ICBMX2ludmFsaWRfbGl0ZXJhbF9sZW5ndGhfY29kZQ0KKw0KKwltb3YgIGVjeCwwDQorCW1vdiAgZWR4LElORkxBVEVfTU9ERV9UWVBFDQorCWptcCAgTF91cGRhdGVfc3RyZWFtX3N0YXRlDQorDQorTF9pbnZhbGlkX2xpdGVyYWxfbGVuZ3RoX2NvZGU6DQorDQorDQorDQorDQorDQorCW1vdiAgZWN4LCBpbnZhbGlkX2xpdGVyYWxfbGVuZ3RoX2NvZGVfbXNnDQorCW1vdiAgZWR4LElORkxBVEVfTU9ERV9CQUQNCisJam1wICBMX3VwZGF0ZV9zdHJlYW1fc3RhdGUNCisNCitMX2ludmFsaWRfZGlzdGFuY2VfdG9vX2ZhcjoNCisNCisNCisNCisJbW92ICBlc2ksIFtlc3ArNDRdDQorCW1vdiAgZWN4LCBpbnZhbGlkX2Rpc3RhbmNlX3Rvb19mYXJfbXNnDQorCW1vdiAgZWR4LElORkxBVEVfTU9ERV9CQUQNCisJam1wICBMX3VwZGF0ZV9zdHJlYW1fc3RhdGUNCisNCitMX3VwZGF0ZV9zdHJlYW1fc3RhdGU6DQorDQorCW1vdiAgZWF4LCBbZXNwKzg4XQ0KKwl0ZXN0ICBlY3gsZWN4DQorCWp6ICBMX3NraXBfbXNnDQorCW1vdiAgW2VheCsyNF0sZWN4DQorTF9za2lwX21zZzoNCisJbW92ICBlYXgsIFtlYXgrMjhdDQorCW1vdiAgW2VheCttb2RlX3N0YXRlXSxlZHgNCisJam1wICBMX2JyZWFrX2xvb3ANCisNCitBTElHTiA0DQorTF9icmVha19sb29wOg0KKzsgMTI0MyAiaW5mZmFzdC5TIg0KKwljbXAgIGR3b3JkIHB0ciBbaW5mbGF0ZV9mYXN0X3VzZV9tbXhdLDINCisJam5lICBMX3VwZGF0ZV9uZXh0X2luDQorDQorDQorDQorCW1vdiAgZWJ4LGVicA0KKw0KK0xfdXBkYXRlX25leHRfaW46DQorOyAxMjY2ICJpbmZmYXN0LlMiDQorCW1vdiAgZWF4LCBbZXNwKzg4XQ0KKwltb3YgIGVjeCxlYngNCisJbW92ICBlZHgsIFtlYXgrMjhdDQorCXNociAgZWN4LDMNCisJc3ViICBlc2ksZWN4DQorCXNobCAgZWN4LDMNCisJc3ViICBlYngsZWN4DQorCW1vdiAgW2VheCsxMl0sZWRpDQorCW1vdiAgW2VkeCtiaXRzX3N0YXRlXSxlYngNCisJbW92ICBlY3gsZWJ4DQorDQorCWxlYSAgZWJ4LCBbZXNwKzI4XQ0KKwljbXAgIFtlc3ArMjBdLGVieA0KKwlqbmUgIExfYnVmX25vdF91c2VkDQorDQorCXN1YiAgZXNpLGVieA0KKwltb3YgIGVieCwgW2VheCswXQ0KKwltb3YgIFtlc3ArMjBdLGVieA0KKwlhZGQgIGVzaSxlYngNCisJbW92ICBlYngsIFtlYXgrNF0NCisJc3ViICBlYngsMTENCisJYWRkICBbZXNwKzIwXSxlYngNCisNCitMX2J1Zl9ub3RfdXNlZDoNCisJbW92ICBbZWF4KzBdLGVzaQ0KKw0KKwltb3YgIGVieCwxDQorCXNobCAgZWJ4LGNsDQorCWRlYyAgZWJ4DQorDQorDQorDQorDQorDQorCWNtcCAgZHdvcmQgcHRyIFtpbmZsYXRlX2Zhc3RfdXNlX21teF0sMg0KKwlqbmUgIExfdXBkYXRlX2hvbGQNCisNCisNCisNCisJcHNybHEgbW0wLG1tMQ0KKwltb3ZkIGVicCxtbTANCisNCisJZW1tcw0KKw0KK0xfdXBkYXRlX2hvbGQ6DQorDQorDQorDQorCWFuZCAgZWJwLGVieA0KKwltb3YgIFtlZHgraG9sZF9zdGF0ZV0sZWJwDQorDQorDQorDQorDQorCW1vdiAgZWJ4LCBbZXNwKzIwXQ0KKwljbXAgIGVieCxlc2kNCisJamJlICBMX2xhc3RfaXNfc21hbGxlcg0KKw0KKwlzdWIgIGVieCxlc2kNCisJYWRkICBlYngsMTENCisJbW92ICBbZWF4KzRdLGVieA0KKwlqbXAgIExfZml4dXBfb3V0DQorTF9sYXN0X2lzX3NtYWxsZXI6DQorCXN1YiAgZXNpLGVieA0KKwluZWcgIGVzaQ0KKwlhZGQgIGVzaSwxMQ0KKwltb3YgIFtlYXgrNF0sZXNpDQorDQorDQorDQorDQorTF9maXh1cF9vdXQ6DQorDQorCW1vdiAgZWJ4LCBbZXNwKzE2XQ0KKwljbXAgIGVieCxlZGkNCisJamJlICBMX2VuZF9pc19zbWFsbGVyDQorDQorCXN1YiAgZWJ4LGVkaQ0KKwlhZGQgIGVieCwyNTcNCisJbW92ICBbZWF4KzE2XSxlYngNCisJam1wICBMX2RvbmUNCitMX2VuZF9pc19zbWFsbGVyOg0KKwlzdWIgIGVkaSxlYngNCisJbmVnICBlZGkNCisJYWRkICBlZGksMjU3DQorCW1vdiAgW2VheCsxNl0sZWRpDQorDQorDQorDQorDQorDQorTF9kb25lOg0KKwlhZGQgIGVzcCw2NA0KKwlwb3BmZA0KKwlwb3AgIGVieA0KKwlwb3AgIGVicA0KKwlwb3AgIGVzaQ0KKwlwb3AgIGVkaQ0KKwlyZXQNCitfaW5mbGF0ZV9mYXN0IGVuZHANCisNCitfVEVYVAllbmRzDQorZW5kDQpkaWZmIC0tZ2l0IGEvemxpYi0xLjIuNi9jb250cmliL21hc214ODYvbWF0Y2g2ODYuYXNtIGIvemxpYi0xLjIuNi9jb250cmliL21hc214ODYvbWF0Y2g2ODYuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiMDkyMTIKLS0tIC9kZXYvbnVsbAorKysgYi96bGliLTEuMi42L2NvbnRyaWIvbWFzbXg4Ni9tYXRjaDY4Ni5hc20KQEAgLTAsMCArMSw0NzkgQEAKKzsgbWF0Y2g2ODYuYXNtIC0tIEFzbSBwb3J0aW9uIG9mIHRoZSBvcHRpbWl6ZWQgbG9uZ2VzdF9tYXRjaCBmb3IgMzIgYml0cyB4ODYNCis7IENvcHlyaWdodCAoQykgMTk5NS0xOTk2IEplYW4tbG91cCBHYWlsbHksIEJyaWFuIFJhaXRlciBhbmQgR2lsbGVzIFZvbGxhbnQuDQorOyBGaWxlIHdyaXR0ZW4gYnkgR2lsbGVzIFZvbGxhbnQsIGJ5IGNvbnZlcnRpbmcgbWF0Y2g2ODYuUyBmcm9tIEJyaWFuIFJhaXRlcg0KKzsgZm9yIE1BU00uIFRoaXMgaXMgYXMgYXNzZW1ibHkgdmVyc2lvbiBvZiBsb25nZXN0X21hdGNoDQorOyAgZnJvbSBKZWFuLWxvdXAgR2FpbGx5IGluIGRlZmxhdGUuYw0KKzsNCis7ICAgICAgICAgaHR0cDovL3d3dy56bGliLm5ldA0KKzsgICAgICAgICBodHRwOi8vd3d3LndpbmltYWdlLmNvbS96TGliRGxsDQorOyAgICAgICAgIGh0dHA6Ly93d3cubXVwcGV0bGFicy5jb20vfmJyZWFkYm94L3NvZnR3YXJlL2Fzc2VtYmx5Lmh0bWwNCis7DQorOyBGb3IgVmlzdWFsIEMrKyA0LnggYW5kIGhpZ2hlciBhbmQgTUwgNi54IGFuZCBoaWdoZXINCis7ICAgbWwuZXhlIGlzIGRpc3RyaWJ1dGVkIGluDQorOyAgaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL2Rvd25sb2Fkcy9kZXRhaWxzLmFzcHg/RmFtaWx5SUQ9N2ExYzlkYTAtMDUxMC00NGEyLWIwNDItN2VmMzcwNTMwYzY0DQorOw0KKzsgdGhpcyBmaWxlIGNvbnRhaW4gdHdvIGltcGxlbWVudGF0aW9uIG9mIGxvbmdlc3RfbWF0Y2gNCis7DQorOyAgdGhpcyBsb25nZXN0X21hdGNoIHdhcyB3cml0dGVuIGJ5IEJyaWFuIHJhaXRlciAoMTk5OCksIG9wdGltaXplZCBmb3IgUGVudGl1bSBQcm8NCis7ICAgKGFuZCB0aGUgZmFzdGVyIGtub3duIHZlcnNpb24gb2YgbWF0Y2hfaW5pdCBvbiBtb2Rlcm4gQ29yZSAyIER1byBhbmQgQU1EIFBoZW5vbSkNCis7DQorOyAgZm9yIHVzaW5nIGFuIGFzc2VtYmx5IHZlcnNpb24gb2YgbG9uZ2VzdF9tYXRjaCwgeW91IG5lZWQgZGVmaW5lIEFTTVYgaW4gcHJvamVjdA0KKzsNCis7ICAgIGNvbXBpbGUgdGhlIGFzbSBmaWxlIHJ1bm5pbmcNCis7ICAgICAgICAgICBtbCAvY29mZiAvWmkgL2MgL0ZsbWF0Y2g2ODYubHN0IG1hdGNoNjg2LmFzbQ0KKzsgICAgYW5kIGRvIG5vdCBpbmNsdWRlIG1hdGNoNjg2Lm9iaiBpbiB5b3VyIHByb2plY3QNCis7DQorOyBub3RlOiBjb250cmliIG9mIHpMaWIgMS4yLjMgYW5kIGVhcmxpZXIgY29udGFpbmVkIGJvdGggYSBkZXByZWNhdGVkIHZlcnNpb24gZm9yDQorOyAgUGVudGl1bSAocHJpb3IgUGVudGl1bSBQcm8pIGFuZCB0aGlzIHZlcnNpb24gZm9yIFBlbnRpdW0gUHJvIGFuZCBtb2Rlcm4gcHJvY2Vzc29yDQorOyAgd2l0aCBhdXRvc2VsZWN0ICh3aXRoIGNwdSBkZXRlY3Rpb24gY29kZSkNCis7ICBpZiB5b3Ugd2FudCBzdXBwb3J0IHRoZSBvbGQgcGVudGl1bSBvcHRpbWl6YXRpb24sIHlvdSBjYW4gc3RpbGwgdXNlIHRoZXNlIHZlcnNpb24NCis7DQorOyB0aGlzIGZpbGUgaXMgbm90IG9wdGltaXplZCBmb3Igb2xkIHBlbnRpdW0sIGJ1dCBpdCBjb21wYXRpYmxlIHdpdGggYWxsIHg4NiAzMiBiaXRzDQorOyBwcm9jZXNzb3IgKHN0YXJ0aW5nIDgwMzg2KQ0KKzsNCis7DQorOyBzZWUgYmVsb3cgOiB6bGliMTIyMmFkZCBtdXN0IGJlIGFkanVzdGVyIGlmIHlvdSB1c2UgYSB6bGliIHZlcnNpb24gPCAxLjIuMi4yDQorDQorO3VJbnQgbG9uZ2VzdF9tYXRjaChzLCBjdXJfbWF0Y2gpDQorOyAgICBkZWZsYXRlX3N0YXRlICpzOw0KKzsgICAgSVBvcyBjdXJfbWF0Y2g7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjdXJyZW50IG1hdGNoICovDQorDQorICAgIE5iU3RhY2sgICAgICAgICBlcXUgICAgIDc2DQorICAgIGN1cl9tYXRjaCAgICAgICBlcXUgICAgIGR3b3JkIHB0cltlc3ArTmJTdGFjay0wXQ0KKyAgICBzdHJfcyAgICAgICAgICAgZXF1ICAgICBkd29yZCBwdHJbZXNwK05iU3RhY2stNF0NCis7IDUgZHdvcmQgb24gdG9wIChyZXQsZWJwLGVzaSxlZGksZWJ4KQ0KKyAgICBhZHJyZXQgICAgICAgICAgZXF1ICAgICBkd29yZCBwdHJbZXNwK05iU3RhY2stOF0NCisgICAgcHVzaGVicCAgICAgICAgIGVxdSAgICAgZHdvcmQgcHRyW2VzcCtOYlN0YWNrLTEyXQ0KKyAgICBwdXNoZWRpICAgICAgICAgZXF1ICAgICBkd29yZCBwdHJbZXNwK05iU3RhY2stMTZdDQorICAgIHB1c2hlc2kgICAgICAgICBlcXUgICAgIGR3b3JkIHB0cltlc3ArTmJTdGFjay0yMF0NCisgICAgcHVzaGVieCAgICAgICAgIGVxdSAgICAgZHdvcmQgcHRyW2VzcCtOYlN0YWNrLTI0XQ0KKw0KKyAgICBjaGFpbl9sZW5ndGggICAgZXF1ICAgICBkd29yZCBwdHIgW2VzcCtOYlN0YWNrLTI4XQ0KKyAgICBsaW1pdCAgICAgICAgICAgZXF1ICAgICBkd29yZCBwdHIgW2VzcCtOYlN0YWNrLTMyXQ0KKyAgICBiZXN0X2xlbiAgICAgICAgZXF1ICAgICBkd29yZCBwdHIgW2VzcCtOYlN0YWNrLTM2XQ0KKyAgICB3aW5kb3cgICAgICAgICAgZXF1ICAgICBkd29yZCBwdHIgW2VzcCtOYlN0YWNrLTQwXQ0KKyAgICBwcmV2ICAgICAgICAgICAgZXF1ICAgICBkd29yZCBwdHIgW2VzcCtOYlN0YWNrLTQ0XQ0KKyAgICBzY2FuX3N0YXJ0ICAgICAgZXF1ICAgICAgd29yZCBwdHIgW2VzcCtOYlN0YWNrLTQ4XQ0KKyAgICB3bWFzayAgICAgICAgICAgZXF1ICAgICBkd29yZCBwdHIgW2VzcCtOYlN0YWNrLTUyXQ0KKyAgICBtYXRjaF9zdGFydF9wdHIgZXF1ICAgICBkd29yZCBwdHIgW2VzcCtOYlN0YWNrLTU2XQ0KKyAgICBuaWNlX21hdGNoICAgICAgZXF1ICAgICBkd29yZCBwdHIgW2VzcCtOYlN0YWNrLTYwXQ0KKyAgICBzY2FuICAgICAgICAgICAgZXF1ICAgICBkd29yZCBwdHIgW2VzcCtOYlN0YWNrLTY0XQ0KKw0KKyAgICB3aW5kb3dsZW4gICAgICAgZXF1ICAgICBkd29yZCBwdHIgW2VzcCtOYlN0YWNrLTY4XQ0KKyAgICBtYXRjaF9zdGFydCAgICAgZXF1ICAgICBkd29yZCBwdHIgW2VzcCtOYlN0YWNrLTcyXQ0KKyAgICBzdHJlbmQgICAgICAgICAgZXF1ICAgICBkd29yZCBwdHIgW2VzcCtOYlN0YWNrLTc2XQ0KKyAgICBOYlN0YWNrQWRkICAgICAgZXF1ICAgICAoTmJTdGFjay0yNCkNCisNCisgICAgLjM4NnANCisNCisgICAgbmFtZSAgICBndm1hdGNoDQorICAgIC5NT0RFTCAgRkxBVA0KKw0KKw0KKw0KKzsgIGFsbCB0aGUgK3psaWIxMjIyYWRkIG9mZnNldHMgYXJlIGR1ZSB0byB0aGUgYWRkaXRpb24gb2YgZmllbGRzDQorOyAgaW4gemxpYiBpbiB0aGUgZGVmbGF0ZV9zdGF0ZSBzdHJ1Y3R1cmUgc2luY2UgdGhlIGFzbSBjb2RlIHdhcyBmaXJzdCB3cml0dGVuDQorOyAgKGlmIHlvdSBjb21waWxlIHdpdGggemxpYiAxLjAuNCBvciBvbGRlciwgdXNlICJ6bGliMTIyMmFkZCBlcXUgKC00KSIpLg0KKzsgIChpZiB5b3UgY29tcGlsZSB3aXRoIHpsaWIgYmV0d2VlbiAxLjAuNSBhbmQgMS4yLjIuMSwgdXNlICJ6bGliMTIyMmFkZCBlcXUgMCIpLg0KKzsgIGlmIHlvdSBjb21waWxlIHdpdGggemxpYiAxLjIuMi4yIG9yIGxhdGVyICwgdXNlICJ6bGliMTIyMmFkZCBlcXUgOCIpLg0KKw0KKyAgICB6bGliMTIyMmFkZCAgICAgICAgIGVxdSAgICAgOA0KKw0KKzsgIE5vdGUgOiB0aGVzZSB2YWx1ZSBhcmUgZ29vZCB3aXRoIGEgOCBieXRlcyBib3VuZGFyeSBwYWNrIHN0cnVjdHVyZQ0KKyAgICBkZXBfY2hhaW5fbGVuZ3RoICAgIGVxdSAgICAgNzRoK3psaWIxMjIyYWRkDQorICAgIGRlcF93aW5kb3cgICAgICAgICAgZXF1ICAgICAzMGgremxpYjEyMjJhZGQNCisgICAgZGVwX3N0cnN0YXJ0ICAgICAgICBlcXUgICAgIDY0aCt6bGliMTIyMmFkZA0KKyAgICBkZXBfcHJldl9sZW5ndGggICAgIGVxdSAgICAgNzBoK3psaWIxMjIyYWRkDQorICAgIGRlcF9uaWNlX21hdGNoICAgICAgZXF1ICAgICA4OGgremxpYjEyMjJhZGQNCisgICAgZGVwX3dfc2l6ZSAgICAgICAgICBlcXUgICAgIDI0aCt6bGliMTIyMmFkZA0KKyAgICBkZXBfcHJldiAgICAgICAgICAgIGVxdSAgICAgMzhoK3psaWIxMjIyYWRkDQorICAgIGRlcF93X21hc2sgICAgICAgICAgZXF1ICAgICAyY2gremxpYjEyMjJhZGQNCisgICAgZGVwX2dvb2RfbWF0Y2ggICAgICBlcXUgICAgIDg0aCt6bGliMTIyMmFkZA0KKyAgICBkZXBfbWF0Y2hfc3RhcnQgICAgIGVxdSAgICAgNjhoK3psaWIxMjIyYWRkDQorICAgIGRlcF9sb29rYWhlYWQgICAgICAgZXF1ICAgICA2Y2gremxpYjEyMjJhZGQNCisNCisNCitfVEVYVCAgICAgICAgICAgICAgICAgICBzZWdtZW50DQorDQorSUZERUYgTk9VTkRFUkxJTkUNCisgICAgICAgICAgICBwdWJsaWMgIGxvbmdlc3RfbWF0Y2gNCisgICAgICAgICAgICBwdWJsaWMgIG1hdGNoX2luaXQNCitFTFNFDQorICAgICAgICAgICAgcHVibGljICBfbG9uZ2VzdF9tYXRjaA0KKyAgICAgICAgICAgIHB1YmxpYyAgX21hdGNoX2luaXQNCitFTkRJRg0KKw0KKyAgICBNQVhfTUFUQ0ggICAgICAgICAgIGVxdSAgICAgMjU4DQorICAgIE1JTl9NQVRDSCAgICAgICAgICAgZXF1ICAgICAzDQorICAgIE1JTl9MT09LQUhFQUQgICAgICAgZXF1ICAgICAoTUFYX01BVENIK01JTl9NQVRDSCsxKQ0KKw0KKw0KKw0KK01BWF9NQVRDSCAgICAgICBlcXUgICAgIDI1OA0KK01JTl9NQVRDSCAgICAgICBlcXUgICAgIDMNCitNSU5fTE9PS0FIRUFEICAgZXF1ICAgICAoTUFYX01BVENIICsgTUlOX01BVENIICsgMSkNCitNQVhfTUFUQ0hfOF8gICAgIGVxdSAgICAgKChNQVhfTUFUQ0ggKyA3KSBBTkQgMEZGRjBoKQ0KKw0KKw0KKzs7OyBzdGFjayBmcmFtZSBvZmZzZXRzDQorDQorY2hhaW5sZW53bWFzayAgIGVxdSAgZXNwICsgMCAgICA7IGhpZ2ggd29yZDogY3VycmVudCBjaGFpbiBsZW4NCisgICAgICAgICAgICAgICAgICAgIDsgbG93IHdvcmQ6IHMtPndtYXNrDQord2luZG93ICAgICAgZXF1ICBlc3AgKyA0ICAgIDsgbG9jYWwgY29weSBvZiBzLT53aW5kb3cNCit3aW5kb3diZXN0bGVuICAgZXF1ICBlc3AgKyA4ICAgIDsgcy0+d2luZG93ICsgYmVzdGxlbg0KK3NjYW5zdGFydCAgIGVxdSAgZXNwICsgMTYgICA7IGZpcnN0IHR3byBieXRlcyBvZiBzdHJpbmcNCitzY2FuZW5kICAgICBlcXUgIGVzcCArIDEyICAgOyBsYXN0IHR3byBieXRlcyBvZiBzdHJpbmcNCitzY2FuYWxpZ24gICBlcXUgIGVzcCArIDIwICAgOyBkd29yZC1taXNhbGlnbm1lbnQgb2Ygc3RyaW5nDQorbmljZW1hdGNoICAgZXF1ICBlc3AgKyAyNCAgIDsgYSBnb29kIGVub3VnaCBtYXRjaCBzaXplDQorYmVzdGxlbiAgICAgZXF1ICBlc3AgKyAyOCAgIDsgc2l6ZSBvZiBiZXN0IG1hdGNoIHNvIGZhcg0KK3NjYW4gICAgICAgIGVxdSAgZXNwICsgMzIgICA7IHB0ciB0byBzdHJpbmcgd2FudGluZyBtYXRjaA0KKw0KK0xvY2FsVmFyc1NpemUgICBlcXUgMzYNCis7ICAgc2F2ZWQgZWJ4ICAgYnl0ZSBlc3AgKyAzNg0KKzsgICBzYXZlZCBlZGkgICBieXRlIGVzcCArIDQwDQorOyAgIHNhdmVkIGVzaSAgIGJ5dGUgZXNwICsgNDQNCis7ICAgc2F2ZWQgZWJwICAgYnl0ZSBlc3AgKyA0OA0KKzsgICByZXR1cm4gYWRkcmVzcyAgYnl0ZSBlc3AgKyA1Mg0KK2RlZmxhdGVzdGF0ZSAgICBlcXUgIGVzcCArIDU2ICAgOyB0aGUgZnVuY3Rpb24gYXJndW1lbnRzDQorY3VybWF0Y2ggICAgZXF1ICBlc3AgKyA2MA0KKw0KKzs7OyBPZmZzZXRzIGZvciBmaWVsZHMgaW4gdGhlIGRlZmxhdGVfc3RhdGUgc3RydWN0dXJlLiBUaGVzZSBudW1iZXJzDQorOzs7IGFyZSBjYWxjdWxhdGVkIGZyb20gdGhlIGRlZmluaXRpb24gb2YgZGVmbGF0ZV9zdGF0ZSwgd2l0aCB0aGUNCis7OzsgYXNzdW1wdGlvbiB0aGF0IHRoZSBjb21waWxlciB3aWxsIGR3b3JkLWFsaWduIHRoZSBmaWVsZHMuIChUaHVzLA0KKzs7OyBjaGFuZ2luZyB0aGUgZGVmaW5pdGlvbiBvZiBkZWZsYXRlX3N0YXRlIGNvdWxkIGVhc2lseSBjYXVzZSB0aGlzDQorOzs7IHByb2dyYW0gdG8gY3Jhc2ggaG9ycmlibHksIHdpdGhvdXQgc28gbXVjaCBhcyBhIHdhcm5pbmcgYXQNCis7OzsgY29tcGlsZSB0aW1lLiBTaWdoLikNCisNCitkc1dTaXplICAgICBlcXUgMzYremxpYjEyMjJhZGQNCitkc1dNYXNrICAgICBlcXUgNDQremxpYjEyMjJhZGQNCitkc1dpbmRvdyAgICBlcXUgNDgremxpYjEyMjJhZGQNCitkc1ByZXYgICAgICBlcXUgNTYremxpYjEyMjJhZGQNCitkc01hdGNoTGVuICBlcXUgODgremxpYjEyMjJhZGQNCitkc1ByZXZNYXRjaCBlcXUgOTIremxpYjEyMjJhZGQNCitkc1N0clN0YXJ0ICBlcXUgMTAwK3psaWIxMjIyYWRkDQorZHNNYXRjaFN0YXJ0ICAgIGVxdSAxMDQremxpYjEyMjJhZGQNCitkc0xvb2thaGVhZCBlcXUgMTA4K3psaWIxMjIyYWRkDQorZHNQcmV2TGVuICAgZXF1IDExMit6bGliMTIyMmFkZA0KK2RzTWF4Q2hhaW5MZW4gICBlcXUgMTE2K3psaWIxMjIyYWRkDQorZHNHb29kTWF0Y2ggZXF1IDEzMit6bGliMTIyMmFkZA0KK2RzTmljZU1hdGNoIGVxdSAxMzYremxpYjEyMjJhZGQNCisNCisNCis7OzsgbWF0Y2g2ODYuYXNtIC0tIFBlbnRpdW0tUHJvLW9wdGltaXplZCB2ZXJzaW9uIG9mIGxvbmdlc3RfbWF0Y2goKQ0KKzs7OyBXcml0dGVuIGZvciB6bGliIDEuMS4yDQorOzs7IENvcHlyaWdodCAoQykgMTk5OCBCcmlhbiBSYWl0ZXIgPGJyZWFkYm94QG11cHBldGxhYnMuY29tPg0KKzs7OyBZb3UgY2FuIGxvb2sgYXQgaHR0cDovL3d3dy5tdXBwZXRsYWJzLmNvbS9+YnJlYWRib3gvc29mdHdhcmUvYXNzZW1ibHkuaHRtbA0KKzs7Ow0KKzs7DQorOzsgIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkDQorOzsgIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMNCis7OyAgYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4NCis7Ow0KKzs7ICBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwNCis7OyAgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdA0KKzs7ICBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6DQorOzsNCis7OyAgMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QNCis7OyAgICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUNCis7OyAgICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlDQorOzsgICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuDQorOzsgIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlDQorOzsgICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZQ0KKzs7ICAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLg0KKzs7DQorDQorO0dMT0JBTCBfbG9uZ2VzdF9tYXRjaCwgX21hdGNoX2luaXQNCisNCisNCis7U0VDVElPTiAgICAudGV4dA0KKw0KKzs7OyB1SW50IGxvbmdlc3RfbWF0Y2goZGVmbGF0ZV9zdGF0ZSAqZGVmbGF0ZXN0YXRlLCBJUG9zIGN1cm1hdGNoKQ0KKw0KKztfbG9uZ2VzdF9tYXRjaDoNCisgICAgSUZERUYgTk9VTkRFUkxJTkUNCisgICAgbG9uZ2VzdF9tYXRjaCAgICAgICBwcm9jIG5lYXINCisgICAgRUxTRQ0KKyAgICBfbG9uZ2VzdF9tYXRjaCAgICAgIHByb2MgbmVhcg0KKyAgICBFTkRJRg0KKy5GUE8gKDksIDQsIDAsIDAsIDEsIDApDQorDQorOzs7IFNhdmUgcmVnaXN0ZXJzIHRoYXQgdGhlIGNvbXBpbGVyIG1heSBiZSB1c2luZywgYW5kIGFkanVzdCBlc3AgdG8NCis7OzsgbWFrZSByb29tIGZvciBvdXIgc3RhY2sgZnJhbWUuDQorDQorICAgICAgICBwdXNoICAgIGVicA0KKyAgICAgICAgcHVzaCAgICBlZGkNCisgICAgICAgIHB1c2ggICAgZXNpDQorICAgICAgICBwdXNoICAgIGVieA0KKyAgICAgICAgc3ViIGVzcCwgTG9jYWxWYXJzU2l6ZQ0KKw0KKzs7OyBSZXRyaWV2ZSB0aGUgZnVuY3Rpb24gYXJndW1lbnRzLiBlY3ggd2lsbCBob2xkIGN1cl9tYXRjaA0KKzs7OyB0aHJvdWdob3V0IHRoZSBlbnRpcmUgZnVuY3Rpb24uIGVkeCB3aWxsIGhvbGQgdGhlIHBvaW50ZXIgdG8gdGhlDQorOzs7IGRlZmxhdGVfc3RhdGUgc3RydWN0dXJlIGR1cmluZyB0aGUgZnVuY3Rpb24ncyBzZXR1cCAoYmVmb3JlDQorOzs7IGVudGVyaW5nIHRoZSBtYWluIGxvb3AuDQorDQorICAgICAgICBtb3YgZWR4LCBbZGVmbGF0ZXN0YXRlXQ0KKyAgICAgICAgbW92IGVjeCwgW2N1cm1hdGNoXQ0KKw0KKzs7OyB1SW50IHdtYXNrID0gcy0+d19tYXNrOw0KKzs7OyB1bnNpZ25lZCBjaGFpbl9sZW5ndGggPSBzLT5tYXhfY2hhaW5fbGVuZ3RoOw0KKzs7OyBpZiAocy0+cHJldl9sZW5ndGggPj0gcy0+Z29vZF9tYXRjaCkgew0KKzs7OyAgICAgY2hhaW5fbGVuZ3RoID4+PSAyOw0KKzs7OyB9DQorDQorICAgICAgICBtb3YgZWF4LCBbZWR4ICsgZHNQcmV2TGVuXQ0KKyAgICAgICAgbW92IGVieCwgW2VkeCArIGRzR29vZE1hdGNoXQ0KKyAgICAgICAgY21wIGVheCwgZWJ4DQorICAgICAgICBtb3YgZWF4LCBbZWR4ICsgZHNXTWFza10NCisgICAgICAgIG1vdiBlYngsIFtlZHggKyBkc01heENoYWluTGVuXQ0KKyAgICAgICAgamwgIExhc3RNYXRjaEdvb2QNCisgICAgICAgIHNociBlYngsIDINCitMYXN0TWF0Y2hHb29kOg0KKw0KKzs7OyBjaGFpbmxlbiBpcyBkZWNyZW1lbnRlZCBvbmNlIGJlZm9yZWhhbmQgc28gdGhhdCB0aGUgZnVuY3Rpb24gY2FuDQorOzs7IHVzZSB0aGUgc2lnbiBmbGFnIGluc3RlYWQgb2YgdGhlIHplcm8gZmxhZyBmb3IgdGhlIGV4aXQgdGVzdC4NCis7OzsgSXQgaXMgdGhlbiBzaGlmdGVkIGludG8gdGhlIGhpZ2ggd29yZCwgdG8gbWFrZSByb29tIGZvciB0aGUgd21hc2sNCis7OzsgdmFsdWUsIHdoaWNoIGl0IHdpbGwgYWx3YXlzIGFjY29tcGFueS4NCisNCisgICAgICAgIGRlYyBlYngNCisgICAgICAgIHNobCBlYngsIDE2DQorICAgICAgICBvciAgZWJ4LCBlYXgNCisgICAgICAgIG1vdiBbY2hhaW5sZW53bWFza10sIGVieA0KKw0KKzs7OyBpZiAoKHVJbnQpbmljZV9tYXRjaCA+IHMtPmxvb2thaGVhZCkgbmljZV9tYXRjaCA9IHMtPmxvb2thaGVhZDsNCisNCisgICAgICAgIG1vdiBlYXgsIFtlZHggKyBkc05pY2VNYXRjaF0NCisgICAgICAgIG1vdiBlYngsIFtlZHggKyBkc0xvb2thaGVhZF0NCisgICAgICAgIGNtcCBlYngsIGVheA0KKyAgICAgICAgamwgIExvb2thaGVhZExlc3MNCisgICAgICAgIG1vdiBlYngsIGVheA0KK0xvb2thaGVhZExlc3M6ICBtb3YgW25pY2VtYXRjaF0sIGVieA0KKw0KKzs7OyByZWdpc3RlciBCeXRlZiAqc2NhbiA9IHMtPndpbmRvdyArIHMtPnN0cnN0YXJ0Ow0KKw0KKyAgICAgICAgbW92IGVzaSwgW2VkeCArIGRzV2luZG93XQ0KKyAgICAgICAgbW92IFt3aW5kb3ddLCBlc2kNCisgICAgICAgIG1vdiBlYnAsIFtlZHggKyBkc1N0clN0YXJ0XQ0KKyAgICAgICAgbGVhIGVkaSwgW2VzaSArIGVicF0NCisgICAgICAgIG1vdiBbc2Nhbl0sIGVkaQ0KKw0KKzs7OyBEZXRlcm1pbmUgaG93IG1hbnkgYnl0ZXMgdGhlIHNjYW4gcHRyIGlzIG9mZiBmcm9tIGJlaW5nDQorOzs7IGR3b3JkLWFsaWduZWQuDQorDQorICAgICAgICBtb3YgZWF4LCBlZGkNCisgICAgICAgIG5lZyBlYXgNCisgICAgICAgIGFuZCBlYXgsIDMNCisgICAgICAgIG1vdiBbc2NhbmFsaWduXSwgZWF4DQorDQorOzs7IElQb3MgbGltaXQgPSBzLT5zdHJzdGFydCA+IChJUG9zKU1BWF9ESVNUKHMpID8NCis7OzsgICAgIHMtPnN0cnN0YXJ0IC0gKElQb3MpTUFYX0RJU1QocykgOiBOSUw7DQorDQorICAgICAgICBtb3YgZWF4LCBbZWR4ICsgZHNXU2l6ZV0NCisgICAgICAgIHN1YiBlYXgsIE1JTl9MT09LQUhFQUQNCisgICAgICAgIHN1YiBlYnAsIGVheA0KKyAgICAgICAgamcgIExpbWl0UG9zaXRpdmUNCisgICAgICAgIHhvciBlYnAsIGVicA0KK0xpbWl0UG9zaXRpdmU6DQorDQorOzs7IGludCBiZXN0X2xlbiA9IHMtPnByZXZfbGVuZ3RoOw0KKw0KKyAgICAgICAgbW92IGVheCwgW2VkeCArIGRzUHJldkxlbl0NCisgICAgICAgIG1vdiBbYmVzdGxlbl0sIGVheA0KKw0KKzs7OyBTdG9yZSB0aGUgc3VtIG9mIHMtPndpbmRvdyArIGJlc3RfbGVuIGluIGVzaSBsb2NhbGx5LCBhbmQgaW4gZXNpLg0KKw0KKyAgICAgICAgYWRkIGVzaSwgZWF4DQorICAgICAgICBtb3YgW3dpbmRvd2Jlc3RsZW5dLCBlc2kNCisNCis7OzsgcmVnaXN0ZXIgdXNoIHNjYW5fc3RhcnQgPSAqKHVzaGYqKXNjYW47DQorOzs7IHJlZ2lzdGVyIHVzaCBzY2FuX2VuZCAgID0gKih1c2hmKikoc2NhbitiZXN0X2xlbi0xKTsNCis7OzsgUG9zZiAqcHJldiA9IHMtPnByZXY7DQorDQorICAgICAgICBtb3Z6eCAgIGVieCwgd29yZCBwdHIgW2VkaV0NCisgICAgICAgIG1vdiBbc2NhbnN0YXJ0XSwgZWJ4DQorICAgICAgICBtb3Z6eCAgIGVieCwgd29yZCBwdHIgW2VkaSArIGVheCAtIDFdDQorICAgICAgICBtb3YgW3NjYW5lbmRdLCBlYngNCisgICAgICAgIG1vdiBlZGksIFtlZHggKyBkc1ByZXZdDQorDQorOzs7IEp1bXAgaW50byB0aGUgbWFpbiBsb29wLg0KKw0KKyAgICAgICAgbW92IGVkeCwgW2NoYWlubGVud21hc2tdDQorICAgICAgICBqbXAgc2hvcnQgTG9vcEVudHJ5DQorDQorYWxpZ24gNA0KKw0KKzs7OyBkbyB7DQorOzs7ICAgICBtYXRjaCA9IHMtPndpbmRvdyArIGN1cl9tYXRjaDsNCis7OzsgICAgIGlmICgqKHVzaGYqKShtYXRjaCtiZXN0X2xlbi0xKSAhPSBzY2FuX2VuZCB8fA0KKzs7OyAgICAgICAgICoodXNoZiopbWF0Y2ggIT0gc2Nhbl9zdGFydCkgY29udGludWU7DQorOzs7ICAgICBbLi4uXQ0KKzs7OyB9IHdoaWxlICgoY3VyX21hdGNoID0gcHJldltjdXJfbWF0Y2ggJiB3bWFza10pID4gbGltaXQNCis7OzsgICAgICAgICAgJiYgLS1jaGFpbl9sZW5ndGggIT0gMCk7DQorOzs7DQorOzs7IEhlcmUgaXMgdGhlIGlubmVyIGxvb3Agb2YgdGhlIGZ1bmN0aW9uLiBUaGUgZnVuY3Rpb24gd2lsbCBzcGVuZCB0aGUNCis7OzsgbWFqb3JpdHkgb2YgaXRzIHRpbWUgaW4gdGhpcyBsb29wLCBhbmQgbWFqb3JpdHkgb2YgdGhhdCB0aW1lIHdpbGwNCis7OzsgYmUgc3BlbnQgaW4gdGhlIGZpcnN0IHRlbiBpbnN0cnVjdGlvbnMuDQorOzs7DQorOzs7IFdpdGhpbiB0aGlzIGxvb3A6DQorOzs7IGVieCA9IHNjYW5lbmQNCis7OzsgZWN4ID0gY3VybWF0Y2gNCis7OzsgZWR4ID0gY2hhaW5sZW53bWFzayAtIGkuZS4sICgoY2hhaW5sZW4gPDwgMTYpIHwgd21hc2spDQorOzs7IGVzaSA9IHdpbmRvd2Jlc3RsZW4gLSBpLmUuLCAod2luZG93ICsgYmVzdGxlbikNCis7OzsgZWRpID0gcHJldg0KKzs7OyBlYnAgPSBsaW1pdA0KKw0KK0xvb2t1cExvb3A6DQorICAgICAgICBhbmQgZWN4LCBlZHgNCisgICAgICAgIG1vdnp4ICAgZWN4LCB3b3JkIHB0ciBbZWRpICsgZWN4KjJdDQorICAgICAgICBjbXAgZWN4LCBlYnANCisgICAgICAgIGpiZSBMZWF2ZU5vdw0KKyAgICAgICAgc3ViIGVkeCwgMDAwMTAwMDBoDQorICAgICAgICBqcyAgTGVhdmVOb3cNCitMb29wRW50cnk6ICBtb3Z6eCAgIGVheCwgd29yZCBwdHIgW2VzaSArIGVjeCAtIDFdDQorICAgICAgICBjbXAgZWF4LCBlYngNCisgICAgICAgIGpueiBMb29rdXBMb29wDQorICAgICAgICBtb3YgZWF4LCBbd2luZG93XQ0KKyAgICAgICAgbW92enggICBlYXgsIHdvcmQgcHRyIFtlYXggKyBlY3hdDQorICAgICAgICBjbXAgZWF4LCBbc2NhbnN0YXJ0XQ0KKyAgICAgICAgam56IExvb2t1cExvb3ANCisNCis7OzsgU3RvcmUgdGhlIGN1cnJlbnQgdmFsdWUgb2YgY2hhaW5sZW4uDQorDQorICAgICAgICBtb3YgW2NoYWlubGVud21hc2tdLCBlZHgNCisNCis7OzsgUG9pbnQgZWRpIHRvIHRoZSBzdHJpbmcgdW5kZXIgc2NydXRpbnksIGFuZCBlc2kgdG8gdGhlIHN0cmluZyB3ZQ0KKzs7OyBhcmUgaG9waW5nIHRvIG1hdGNoIGl0IHVwIHdpdGguIEluIGFjdHVhbGl0eSwgZXNpIGFuZCBlZGkgYXJlDQorOzs7IGJvdGggcG9pbnRlZCAoTUFYX01BVENIXzggLSBzY2FuYWxpZ24pIGJ5dGVzIGFoZWFkLCBhbmQgZWR4IGlzDQorOzs7IGluaXRpYWxpemVkIHRvIC0oTUFYX01BVENIXzggLSBzY2FuYWxpZ24pLg0KKw0KKyAgICAgICAgbW92IGVzaSwgW3dpbmRvd10NCisgICAgICAgIG1vdiBlZGksIFtzY2FuXQ0KKyAgICAgICAgYWRkIGVzaSwgZWN4DQorICAgICAgICBtb3YgZWF4LCBbc2NhbmFsaWduXQ0KKyAgICAgICAgbW92IGVkeCwgMGZmZmZmZWY4aDsgLShNQVhfTUFUQ0hfOCkNCisgICAgICAgIGxlYSBlZGksIFtlZGkgKyBlYXggKyAwMTA4aF0gO01BWF9NQVRDSF84XQ0KKyAgICAgICAgbGVhIGVzaSwgW2VzaSArIGVheCArIDAxMDhoXSA7TUFYX01BVENIXzhdDQorDQorOzs7IFRlc3QgdGhlIHN0cmluZ3MgZm9yIGVxdWFsaXR5LCA4IGJ5dGVzIGF0IGEgdGltZS4gQXQgdGhlIGVuZCwNCis7OzsgYWRqdXN0IGVkeCBzbyB0aGF0IGl0IGlzIG9mZnNldCB0byB0aGUgZXhhY3QgYnl0ZSB0aGF0IG1pc21hdGNoZWQuDQorOzs7DQorOzs7IFdlIGFscmVhZHkga25vdyBhdCB0aGlzIHBvaW50IHRoYXQgdGhlIGZpcnN0IHRocmVlIGJ5dGVzIG9mIHRoZQ0KKzs7OyBzdHJpbmdzIG1hdGNoIGVhY2ggb3RoZXIsIGFuZCB0aGV5IGNhbiBiZSBzYWZlbHkgcGFzc2VkIG92ZXIgYmVmb3JlDQorOzs7IHN0YXJ0aW5nIHRoZSBjb21wYXJlIGxvb3AuIFNvIHdoYXQgdGhpcyBjb2RlIGRvZXMgaXMgc2tpcCBvdmVyIDAtMw0KKzs7OyBieXRlcywgYXMgbXVjaCBhcyBuZWNlc3NhcnkgaW4gb3JkZXIgdG8gZHdvcmQtYWxpZ24gdGhlIGVkaQ0KKzs7OyBwb2ludGVyLiAoZXNpIHdpbGwgc3RpbGwgYmUgbWlzYWxpZ25lZCB0aHJlZSB0aW1lcyBvdXQgb2YgZm91ci4pDQorOzs7DQorOzs7IEl0IHNob3VsZCBiZSBjb25mZXNzZWQgdGhhdCB0aGlzIGxvb3AgdXN1YWxseSBkb2VzIG5vdCByZXByZXNlbnQNCis7OzsgbXVjaCBvZiB0aGUgdG90YWwgcnVubmluZyB0aW1lLiBSZXBsYWNpbmcgaXQgd2l0aCBhIG1vcmUNCis7Ozsgc3RyYWlnaHRmb3J3YXJkICJyZXAgY21wc2IiIHdvdWxkIG5vdCBkcmFzdGljYWxseSBkZWdyYWRlDQorOzs7IHBlcmZvcm1hbmNlLg0KKw0KK0xvb3BDbXBzOg0KKyAgICAgICAgbW92IGVheCwgW2VzaSArIGVkeF0NCisgICAgICAgIHhvciBlYXgsIFtlZGkgKyBlZHhdDQorICAgICAgICBqbnogTGVhdmVMb29wQ21wcw0KKyAgICAgICAgbW92IGVheCwgW2VzaSArIGVkeCArIDRdDQorICAgICAgICB4b3IgZWF4LCBbZWRpICsgZWR4ICsgNF0NCisgICAgICAgIGpueiBMZWF2ZUxvb3BDbXBzNA0KKyAgICAgICAgYWRkIGVkeCwgOA0KKyAgICAgICAgam56IExvb3BDbXBzDQorICAgICAgICBqbXAgc2hvcnQgTGVuTWF4aW11bQ0KK0xlYXZlTG9vcENtcHM0OiBhZGQgZWR4LCA0DQorTGVhdmVMb29wQ21wczogIHRlc3QgICAgZWF4LCAwMDAwRkZGRmgNCisgICAgICAgIGpueiBMZW5Mb3dlcg0KKyAgICAgICAgYWRkIGVkeCwgIDINCisgICAgICAgIHNociBlYXgsIDE2DQorTGVuTG93ZXI6ICAgc3ViIGFsLCAxDQorICAgICAgICBhZGMgZWR4LCAwDQorDQorOzs7IENhbGN1bGF0ZSB0aGUgbGVuZ3RoIG9mIHRoZSBtYXRjaC4gSWYgaXQgaXMgbG9uZ2VyIHRoYW4gTUFYX01BVENILA0KKzs7OyB0aGVuIGF1dG9tYXRpY2FsbHkgYWNjZXB0IGl0IGFzIHRoZSBiZXN0IHBvc3NpYmxlIG1hdGNoIGFuZCBsZWF2ZS4NCisNCisgICAgICAgIGxlYSBlYXgsIFtlZGkgKyBlZHhdDQorICAgICAgICBtb3YgZWRpLCBbc2Nhbl0NCisgICAgICAgIHN1YiBlYXgsIGVkaQ0KKyAgICAgICAgY21wIGVheCwgTUFYX01BVENIDQorICAgICAgICBqZ2UgTGVuTWF4aW11bQ0KKw0KKzs7OyBJZiB0aGUgbGVuZ3RoIG9mIHRoZSBtYXRjaCBpcyBub3QgbG9uZ2VyIHRoYW4gdGhlIGJlc3QgbWF0Y2ggd2UNCis7OzsgaGF2ZSBzbyBmYXIsIHRoZW4gZm9yZ2V0IGl0IGFuZCByZXR1cm4gdG8gdGhlIGxvb2t1cCBsb29wLg0KKw0KKyAgICAgICAgbW92IGVkeCwgW2RlZmxhdGVzdGF0ZV0NCisgICAgICAgIG1vdiBlYngsIFtiZXN0bGVuXQ0KKyAgICAgICAgY21wIGVheCwgZWJ4DQorICAgICAgICBqZyAgTG9uZ2VyTWF0Y2gNCisgICAgICAgIG1vdiBlc2ksIFt3aW5kb3diZXN0bGVuXQ0KKyAgICAgICAgbW92IGVkaSwgW2VkeCArIGRzUHJldl0NCisgICAgICAgIG1vdiBlYngsIFtzY2FuZW5kXQ0KKyAgICAgICAgbW92IGVkeCwgW2NoYWlubGVud21hc2tdDQorICAgICAgICBqbXAgTG9va3VwTG9vcA0KKw0KKzs7OyAgICAgICAgIHMtPm1hdGNoX3N0YXJ0ID0gY3VyX21hdGNoOw0KKzs7OyAgICAgICAgIGJlc3RfbGVuID0gbGVuOw0KKzs7OyAgICAgICAgIGlmIChsZW4gPj0gbmljZV9tYXRjaCkgYnJlYWs7DQorOzs7ICAgICAgICAgc2Nhbl9lbmQgPSAqKHVzaGYqKShzY2FuK2Jlc3RfbGVuLTEpOw0KKw0KK0xvbmdlck1hdGNoOiAgICBtb3YgZWJ4LCBbbmljZW1hdGNoXQ0KKyAgICAgICAgbW92IFtiZXN0bGVuXSwgZWF4DQorICAgICAgICBtb3YgW2VkeCArIGRzTWF0Y2hTdGFydF0sIGVjeA0KKyAgICAgICAgY21wIGVheCwgZWJ4DQorICAgICAgICBqZ2UgTGVhdmVOb3cNCisgICAgICAgIG1vdiBlc2ksIFt3aW5kb3ddDQorICAgICAgICBhZGQgZXNpLCBlYXgNCisgICAgICAgIG1vdiBbd2luZG93YmVzdGxlbl0sIGVzaQ0KKyAgICAgICAgbW92enggICBlYngsIHdvcmQgcHRyIFtlZGkgKyBlYXggLSAxXQ0KKyAgICAgICAgbW92IGVkaSwgW2VkeCArIGRzUHJldl0NCisgICAgICAgIG1vdiBbc2NhbmVuZF0sIGVieA0KKyAgICAgICAgbW92IGVkeCwgW2NoYWlubGVud21hc2tdDQorICAgICAgICBqbXAgTG9va3VwTG9vcA0KKw0KKzs7OyBBY2NlcHQgdGhlIGN1cnJlbnQgc3RyaW5nLCB3aXRoIHRoZSBtYXhpbXVtIHBvc3NpYmxlIGxlbmd0aC4NCisNCitMZW5NYXhpbXVtOiBtb3YgZWR4LCBbZGVmbGF0ZXN0YXRlXQ0KKyAgICAgICAgbW92IGR3b3JkIHB0ciBbYmVzdGxlbl0sIE1BWF9NQVRDSA0KKyAgICAgICAgbW92IFtlZHggKyBkc01hdGNoU3RhcnRdLCBlY3gNCisNCis7OzsgaWYgKCh1SW50KWJlc3RfbGVuIDw9IHMtPmxvb2thaGVhZCkgcmV0dXJuICh1SW50KWJlc3RfbGVuOw0KKzs7OyByZXR1cm4gcy0+bG9va2FoZWFkOw0KKw0KK0xlYXZlTm93Og0KKyAgICAgICAgbW92IGVkeCwgW2RlZmxhdGVzdGF0ZV0NCisgICAgICAgIG1vdiBlYngsIFtiZXN0bGVuXQ0KKyAgICAgICAgbW92IGVheCwgW2VkeCArIGRzTG9va2FoZWFkXQ0KKyAgICAgICAgY21wIGVieCwgZWF4DQorICAgICAgICBqZyAgTG9va2FoZWFkUmV0DQorICAgICAgICBtb3YgZWF4LCBlYngNCitMb29rYWhlYWRSZXQ6DQorDQorOzs7IFJlc3RvcmUgdGhlIHN0YWNrIGFuZCByZXR1cm4gZnJvbSB3aGVuY2Ugd2UgY2FtZS4NCisNCisgICAgICAgIGFkZCBlc3AsIExvY2FsVmFyc1NpemUNCisgICAgICAgIHBvcCBlYngNCisgICAgICAgIHBvcCBlc2kNCisgICAgICAgIHBvcCBlZGkNCisgICAgICAgIHBvcCBlYnANCisNCisgICAgICAgIHJldA0KKzsgcGxlYXNlIGRvbid0IHJlbW92ZSB0aGlzIHN0cmluZyAhDQorOyBZb3VyIGNhbiBmcmVlbHkgdXNlIG1hdGNoNjg2IGluIGFueSBmcmVlIG9yIGNvbW1lcmNpYWwgYXBwIGlmIHlvdSBkb24ndCByZW1vdmUgdGhlIHN0cmluZyBpbiB0aGUgYmluYXJ5IQ0KKyAgICBkYiAgICAgMGRoLDBhaCwiYXNtNjg2IHdpdGggbWFzbSwgb3B0aW1pc2VkIGFzc2VtYmx5IGNvZGUgZnJvbSBCcmlhbiBSYWl0ZXIsIHdyaXR0ZW4gMTk5OCIsMGRoLDBhaA0KKw0KKw0KKyAgICBJRkRFRiBOT1VOREVSTElORQ0KKyAgICBsb25nZXN0X21hdGNoICAgICAgIGVuZHANCisgICAgRUxTRQ0KKyAgICBfbG9uZ2VzdF9tYXRjaCAgICAgIGVuZHANCisgICAgRU5ESUYNCisNCisgICAgSUZERUYgTk9VTkRFUkxJTkUNCisgICAgbWF0Y2hfaW5pdCAgICAgIHByb2MgbmVhcg0KKyAgICAgICAgICAgICAgICAgICAgcmV0DQorICAgIG1hdGNoX2luaXQgICAgICBlbmRwDQorICAgIEVMU0UNCisgICAgX21hdGNoX2luaXQgICAgIHByb2MgbmVhcg0KKyAgICAgICAgICAgICAgICAgICAgcmV0DQorICAgIF9tYXRjaF9pbml0ICAgICBlbmRwDQorICAgIEVORElGDQorDQorDQorX1RFWFQgICBlbmRzDQorZW5kDQpkaWZmIC0tZ2l0IGEvemxpYi0xLjIuNi9jb250cmliL21hc214ODYvcmVhZG1lLnR4dCBiL3psaWItMS4yLjYvY29udHJpYi9tYXNteDg2L3JlYWRtZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI3MWY3MgotLS0gL2Rldi9udWxsCisrKyBiL3psaWItMS4yLjYvY29udHJpYi9tYXNteDg2L3JlYWRtZS50eHQKQEAgLTAsMCArMSwyNyBAQAorDQorU3VtbWFyeQ0KKy0tLS0tLS0NCitUaGlzIGRpcmVjdG9yeSBjb250YWlucyBBU00gaW1wbGVtZW50YXRpb25zIG9mIHRoZSBmdW5jdGlvbnMNCitsb25nZXN0X21hdGNoKCkgYW5kIGluZmxhdGVfZmFzdCgpLg0KKw0KKw0KK1VzZSBpbnN0cnVjdGlvbnMNCistLS0tLS0tLS0tLS0tLS0tDQorQXNzZW1ibGUgdXNpbmcgTUFTTSwgYW5kIGNvcHkgdGhlIG9iamVjdCBmaWxlcyBpbnRvIHRoZSB6bGliIHNvdXJjZQ0KK2RpcmVjdG9yeSwgdGhlbiBydW4gdGhlIGFwcHJvcHJpYXRlIG1ha2VmaWxlLCBhcyBzdWdnZXN0ZWQgYmVsb3cuICBZb3UgY2FuDQorZG9ud2xvYWQgTUFTTSBmcm9tIGhlcmU6DQorDQorICAgIGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9kb3dubG9hZHMvZGV0YWlscy5hc3B4P2Rpc3BsYXlsYW5nPWVuJkZhbWlseUlEPTdhMWM5ZGEwLTA1MTAtNDRhMi1iMDQyLTdlZjM3MDUzMGM2NA0KKw0KK1lvdSBjYW4gYWxzbyBnZXQgb2JqZWN0cyBmaWxlcyBoZXJlOg0KKw0KKyAgICBodHRwOi8vd3d3LndpbmltYWdlLmNvbS96TGliRGxsL3psaWIxMjRfbWFzbV9vYmouemlwDQorDQorQnVpbGQgaW5zdHJ1Y3Rpb25zDQorLS0tLS0tLS0tLS0tLS0tLS0tDQorKiBXaXRoIE1pY3Jvc29mdCBDIGFuZCBNQVNNOg0KK25tYWtlIC1mIHdpbjMyL01ha2VmaWxlLm1zYyBMT0M9Ii1EQVNNViAtREFTTUlORiIgT0JKQT0ibWF0Y2g2ODYub2JqIGluZmZhczMyLm9iaiINCisNCisqIFdpdGggQm9ybGFuZCBDIGFuZCBUQVNNOg0KK21ha2UgLWYgd2luMzIvTWFrZWZpbGUuYm9yIExPQ0FMX1pMSUI9Ii1EQVNNViAtREFTTUlORiIgT0JKQT0ibWF0Y2g2ODYub2JqIGluZmZhczMyLm9iaiIgT0JKUEE9IittYXRjaDY4NmMub2JqK21hdGNoNjg2Lm9iaitpbmZmYXMzMi5vYmoiDQorDQpkaWZmIC0tZ2l0IGEvemxpYi0xLjIuNi9jb250cmliL21pbml6aXAvTWFrZWZpbGUgYi96bGliLTEuMi42L2NvbnRyaWIvbWluaXppcC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGVhYWQyCi0tLSAvZGV2L251bGwKKysrIGIvemxpYi0xLjIuNi9jb250cmliL21pbml6aXAvTWFrZWZpbGUKQEAgLTAsMCArMSwyNSBAQAorQ0M9Y2MKK0NGTEFHUz0tTyAtSS4uLy4uCisKK1VOWl9PQkpTID0gbWluaXVuei5vIHVuemlwLm8gaW9hcGkubyAuLi8uLi9saWJ6LmEKK1pJUF9PQkpTID0gbWluaXppcC5vIHppcC5vICAgaW9hcGkubyAuLi8uLi9saWJ6LmEKKworLmMubzoKKwkkKENDKSAtYyAkKENGTEFHUykgJCouYworCithbGw6IG1pbml1bnogbWluaXppcAorCittaW5pdW56OiAgJChVTlpfT0JKUykKKwkkKENDKSAkKENGTEFHUykgLW8gJEAgJChVTlpfT0JKUykKKworbWluaXppcDogICQoWklQX09CSlMpCisJJChDQykgJChDRkxBR1MpIC1vICRAICQoWklQX09CSlMpCisKK3Rlc3Q6CW1pbml1bnogbWluaXppcAorCS4vbWluaXppcCB0ZXN0IHJlYWRtZS50eHQKKwkuL21pbml1bnogLWwgdGVzdC56aXAKKwltdiByZWFkbWUudHh0IHJlYWRtZS5vbGQKKwkuL21pbml1bnogdGVzdC56aXAKKworY2xlYW46CisJL2Jpbi9ybSAtZiAqLm8gKn4gbWluaXppcCBtaW5pdW56CmRpZmYgLS1naXQgYS96bGliLTEuMi42L2NvbnRyaWIvbWluaXppcC9NYWtlZmlsZS5hbSBiL3psaWItMS4yLjYvY29udHJpYi9taW5pemlwL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjZWQ5MTMKLS0tIC9kZXYvbnVsbAorKysgYi96bGliLTEuMi42L2NvbnRyaWIvbWluaXppcC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDM4IEBACitsaWJfTFRMSUJSQVJJRVMgPSBsaWJtaW5pemlwLmxhCisKK2lmIENPTkRfREVNT1MKK2Jpbl9QUk9HUkFNUyA9IG1pbml1bnppcCBtaW5pemlwCitlbmRpZgorCit6bGliX3RvcF9zcmNkaXIgPSAkKHRvcF9zcmNkaXIpLy4uLy4uCit6bGliX3RvcF9idWlsZGRpciA9ICQodG9wX2J1aWxkZGlyKS8uLi8uLgorCitBTV9DUFBGTEFHUyA9IC1JJCh6bGliX3RvcF9zcmNkaXIpCitBTV9MREZMQUdTID0gLUwkKHpsaWJfdG9wX2J1aWxkZGlyKQorCitsaWJtaW5pemlwX2xhX1NPVVJDRVMgPSBcCisJaW9hcGkuYyBcCisJbXp0b29scy5jIFwKKwl1bnppcC5jIFwKKwl6aXAuYworCitsaWJtaW5pemlwX2xhX0xERkxBR1MgPSAkKEFNX0xERkxBR1MpIC12ZXJzaW9uLWluZm8gMTowOjAgLWx6CisKK21pbml6aXBfaW5jbHVkZWRpciA9ICQoaW5jbHVkZWRpcikvbWluaXppcAorbWluaXppcF9pbmNsdWRlX0hFQURFUlMgPSBcCisJY3J5cHQuaCBcCisJaW9hcGkuaCBcCisJbXp0b29scy5oIFwKKwl1bnppcC5oIFwKKwl6aXAuaAorCitwa2djb25maWdkaXIgPSAkKGxpYmRpcikvcGtnY29uZmlnCitwa2djb25maWdfREFUQSA9IG1pbml6aXAucGMKKworRVhUUkFfUFJPR1JBTVMgPSBtaW5pdW56aXAgbWluaXppcAorCittaW5pdW56aXBfU09VUkNFUyA9IG1pbml1bnouYworbWluaXVuemlwX0xEQUREID0gbGlibWluaXppcC5sYQorCittaW5pemlwX1NPVVJDRVMgPSBtaW5pemlwLmMKK21pbml6aXBfTERBREQgPSBsaWJtaW5pemlwLmxhIC1segpkaWZmIC0tZ2l0IGEvemxpYi0xLjIuNi9jb250cmliL21pbml6aXAvTWluaVppcDY0X0NoYW5nZXMudHh0IGIvemxpYi0xLjIuNi9jb250cmliL21pbml6aXAvTWluaVppcDY0X0NoYW5nZXMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzYTFiZDkKLS0tIC9kZXYvbnVsbAorKysgYi96bGliLTEuMi42L2NvbnRyaWIvbWluaXppcC9NaW5pWmlwNjRfQ2hhbmdlcy50eHQKQEAgLTAsMCArMSw2IEBACisKK01pbmlaaXAgMS4xIHdhcyBkZXJyaXZlZCBmcm9tIE1pbmlaaXAgYXQgdmVyc2lvbiAxLjAxZgorCitDaGFuZ2UgaW4gMS4wIChPa3QgMjAwOSkKKyAtICoqVE9ETyAtIEFkZCBoaXN0b3J5KioKKwpkaWZmIC0tZ2l0IGEvemxpYi0xLjIuNi9jb250cmliL21pbml6aXAvTWluaVppcDY0X2luZm8udHh0IGIvemxpYi0xLjIuNi9jb250cmliL21pbml6aXAvTWluaVppcDY0X2luZm8udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3ZDcxNTIKLS0tIC9kZXYvbnVsbAorKysgYi96bGliLTEuMi42L2NvbnRyaWIvbWluaXppcC9NaW5pWmlwNjRfaW5mby50eHQKQEAgLTAsMCArMSw3NCBAQAorTWluaVppcCAtIENvcHlyaWdodCAoYykgMTk5OC0yMDEwIC0gYnkgR2lsbGVzIFZvbGxhbnQgLSB2ZXJzaW9uIDEuMSA2NCBiaXRzIGZyb20gTWF0aGlhcyBTdmVuc3NvbgorCitJbnRyb2R1Y3Rpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTWluaVppcCAxLjEgaXMgYnVpbHQgZnJvbSBNaW5pWmlwIDEuMCBieSBHaWxsZXMgVm9sbGFudCAoIGh0dHA6Ly93d3cud2luaW1hZ2UuY29tL3pMaWJEbGwvbWluaXppcC5odG1sICkKKworV2hlbiBhZGRpbmcgWklQNjQgc3VwcG9ydCBpbnRvIG1pbml6aXAgaXQgd291bGQgcmVzdWx0IGludG8gcmlzayBvZiBicmVha2luZyBjb21wYXRpYmlsaXR5IHdpdGggbWluaXppcCAxLjAuCitBbGwgcG9zc2libGUgd29yayB3YXMgZG9uZSBmb3IgY29tcGF0aWJpbGl0eS4KKworCitCYWNrZ3JvdW5kCistLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1doZW4gYWRkaW5nIFpJUDY0IHN1cHBvcnQgTWF0aGlhcyBTdmVuc3NvbiBmb3VuZCB0aGF0IEV2ZW4gUm91YXVsdCBoYXZlIGFkZGVkIFpJUDY0IAorc3VwcG9ydCBmb3IgdW56aXAuYyBpbnRvIG1pbml6aXAgZm9yIGEgb3BlbiBzb3VyY2UgcHJvamVjdCBjYWxsZWQgZ2RhbCAoIGh0dHA6Ly93d3cuZ2RhbC5vcmcvICkKKworVGhhdCB3YXMgdXNlZCBhcyBhIHN0YXJ0aW5nIHBvaW50LiBBbmQgYWZ0ZXIgdGhhdCBaSVA2NCBzdXBwb3J0IHdhcyBhZGRlZCB0byB6aXAuYworc29tZSByZWZhY3RvcmluZyBhbmQgY29kZSBjbGVhbnVwIHdhcyBhbHNvIGRvbmUuCisKKworQ2hhbmdlZCBmcm9tIE1pbmlaaXAgMS4wIHRvIE1pbmlaaXAgMS4xCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyogQWRkZWQgWklQNjQgc3VwcG9ydCBmb3IgdW56aXAgKCBieSBFdmVuIFJvdWF1bHQgKQorKiBBZGRlZCBaSVA2NCBzdXBwb3J0IGZvciB6aXAgKCBieSBNYXRoaWFzIFN2ZW5zc29uICkKKyogUmV2ZXJ0ZWQgc29tZSBjaGFuZ2VkIHRoYXQgRXZlbiBSb3VhdWx0IGRpZC4KKyogQnVuY2ggb2YgcGF0Y2hlcyByZWNlaXZlZCBmcm9tIEd1bGxlcyBWb2xsYW50IHRoYXQgaGUgcmVjZWl2ZWQgZm9yIE1pbmlaaXAgZnJvbSB2YXJpb3VzIHVzZXJzLgorKiBBZGRlZCB1bnppcCBwYXRjaCBmb3IgQlpJUCBDb21wcmVzc2lvbiBtZXRob2QgKHBhdGNoIGNyZWF0ZSBieSBEYW5pZWwgQm9yY2EpCisqIEFkZGVkIEJaSVAgQ29tcHJlc3MgbWV0aG9kIGZvciB6aXAKKyogRGlkIHNvbWUgcmVmYWN0b3JpbmcgYW5kIGNvZGUgY2xlYW51cAorCisKK0NyZWRpdHMKKworIEdpbGxlcyBWb2xsYW50ICAgIC0gT3JpZ2luYWwgTWluaVppcCBhdXRob3IKKyBFdmVuIFJvdWF1bHQgICAgICAtIFpJUDY0IHVuemlwIFN1cHBvcnQKKyBEYW5pZWwgQm9yY2EgICAgICAtIEJaaXAgQ29tcHJlc3Npb24gbWV0aG9kIHN1cHBvcnQgaW4gdW56aXAKKyBNYXRoaWFzIFN2ZW5zc29uICAtIFpJUDY0IHppcCBzdXBwb3J0CisgTWF0aGlhcyBTdmVuc3NvbiAgLSBCWmlwIENvbXByZXNzaW9uIG1ldGhvZCBzdXBwb3J0IGluIHppcAorCisgUmVzb3VyY2VzCisKKyBaaXBMYXlvdXQgICBodHRwOi8vcmVzdWx0NDIuY29tL3Byb2plY3RzL1ppcEZpbGVMYXlvdXQKKyAgICAgICAgICAgICBDb21tYW5kIGxpbmUgdG9vbCBmb3IgV2luZG93cyB0aGF0IHNob3dzIHRoZSBsYXlvdXQgYW5kIGluZm9ybWF0aW9uIG9mIHRoZSBoZWFkZXJzIGluIGEgemlwIGFyY2hpdmUuCisgICAgICAgICAgICAgVXNlZCB3aGVuIGRlYnVnZ2luZyBhbmQgdmFsaWRhdGluZyB0aGUgY3JlYXRpb24gb2YgemlwIGZpbGVzIHVzaW5nIE1pbmlaaXA2NAorCisKKyBaSVAgQXBwIE5vdGUgIGh0dHA6Ly93d3cucGt3YXJlLmNvbS9kb2N1bWVudHMvY2FzZXN0dWRpZXMvQVBQTk9URS5UWFQKKyAgICAgICAgICAgICAgIFppcCBGaWxlIHNwZWNpZmljYXRpb24KKworCitOb3Rlcy4KKyAqIFRvIGJlIGFibGUgdG8gdXNlIEJaaXAgY29tcHJlc3Npb24gbWV0aG9kIGluIHppcDY0LmMgb3IgdW56aXA2NC5jIHRoZSBCWklQMiBsaWIgaXMgbmVlZGVkIGFuZCBIQVZFX0JaSVAyIG5lZWQgdG8gYmUgZGVmaW5lZC4KKworTGljZW5zZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgQ29uZGl0aW9uIG9mIHVzZSBhbmQgZGlzdHJpYnV0aW9uIGFyZSB0aGUgc2FtZSB0aGFuIHpsaWIgOgorCisgIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCisgIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKKyAgYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KKworICBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKKyAgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAorICBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CisKKyAgMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKKyAgICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKKyAgICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCisgICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCisgIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCisgICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KKyAgMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCmRpZmYgLS1naXQgYS96bGliLTEuMi42L2NvbnRyaWIvbWluaXppcC9jb25maWd1cmUuYWMgYi96bGliLTEuMi42L2NvbnRyaWIvbWluaXppcC9jb25maWd1cmUuYWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNhZGJiOAotLS0gL2Rldi9udWxsCisrKyBiL3psaWItMS4yLjYvY29udHJpYi9taW5pemlwL2NvbmZpZ3VyZS5hYwpAQCAtMCwwICsxLDIyIEBACisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKi0gQXV0b2NvbmYgLSotCisjIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b2NvbmYgdG8gcHJvZHVjZSBhIGNvbmZpZ3VyZSBzY3JpcHQuCisKK0FDX0lOSVQoW21pbml6aXBdLCBbMS4yLjZdLCBbYnVnemlsbGEucmVkaGF0LmNvbV0pCitBQ19DT05GSUdfU1JDRElSKFttaW5pemlwLmNdKQorQU1fSU5JVF9BVVRPTUFLRShbZm9yZWlnbl0pCitMVF9JTklUCisKK0FDX01TR19DSEVDS0lORyhbd2hldGhlciB0byBidWlsZCBleGFtcGxlIHByb2dyYW1zXSkKK0FDX0FSR19FTkFCTEUoW2RlbW9zXSwgQUNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLWRlbW9zXSwgW2J1aWxkIGV4YW1wbGUgcHJvZ3JhbXNdKSkKK0FNX0NPTkRJVElPTkFMKFtDT05EX0RFTU9TXSwgW3Rlc3QgIiRlbmFibGVfZGVtb3MiID0geWVzXSkKK2lmIHRlc3QgIiRlbmFibGVfZGVtb3MiID0geWVzCit0aGVuCisJQUNfTVNHX1JFU1VMVChbeWVzXSkKK2Vsc2UKKwlBQ19NU0dfUkVTVUxUKFtub10pCitmaQorCitBQ19TVUJTVChbSEFWRV9VTklTVERfSF0sIFswXSkKK0FDX0NIRUNLX0hFQURFUihbdW5pc3RkLmhdLCBbSEFWRV9VTklTVERfSD0xXSwgW10pCitBQ19DT05GSUdfRklMRVMoW01ha2VmaWxlIG1pbml6aXAucGNdKQorQUNfT1VUUFVUCmRpZmYgLS1naXQgYS96bGliLTEuMi42L2NvbnRyaWIvbWluaXppcC9jcnlwdC5oIGIvemxpYi0xLjIuNi9jb250cmliL21pbml6aXAvY3J5cHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDFkMDhkCi0tLSAvZGV2L251bGwKKysrIGIvemxpYi0xLjIuNi9jb250cmliL21pbml6aXAvY3J5cHQuaApAQCAtMCwwICsxLDEzMSBAQAorLyogY3J5cHQuaCAtLSBiYXNlIGNvZGUgZm9yIGNyeXB0L3VuY3J5cHQgWklQZmlsZQorCisKKyAgIFZlcnNpb24gMS4wMWUsIEZlYnJ1YXJ5IDEydGgsIDIwMDUKKworICAgQ29weXJpZ2h0IChDKSAxOTk4LTIwMDUgR2lsbGVzIFZvbGxhbnQKKworICAgVGhpcyBjb2RlIGlzIGEgbW9kaWZpZWQgdmVyc2lvbiBvZiBjcnlwdGluZyBjb2RlIGluIEluZm96aXAgZGlzdHJpYnV0aW9uCisKKyAgIFRoZSBlbmNyeXB0aW9uL2RlY3J5cHRpb24gcGFydHMgb2YgdGhpcyBzb3VyY2UgY29kZSAoYXMgb3Bwb3NlZCB0byB0aGUKKyAgIG5vbi1lY2hvaW5nIHBhc3N3b3JkIHBhcnRzKSB3ZXJlIG9yaWdpbmFsbHkgd3JpdHRlbiBpbiBFdXJvcGUuICBUaGUKKyAgIHdob2xlIHNvdXJjZSBwYWNrYWdlIGNhbiBiZSBmcmVlbHkgZGlzdHJpYnV0ZWQsIGluY2x1ZGluZyBmcm9tIHRoZSBVU0EuCisgICAoUHJpb3IgdG8gSmFudWFyeSAyMDAwLCByZS1leHBvcnQgZnJvbSB0aGUgVVMgd2FzIGEgdmlvbGF0aW9uIG9mIFVTIGxhdy4pCisKKyAgIFRoaXMgZW5jcnlwdGlvbiBjb2RlIGlzIGEgZGlyZWN0IHRyYW5zY3JpcHRpb24gb2YgdGhlIGFsZ29yaXRobSBmcm9tCisgICBSb2dlciBTY2hsYWZseSwgZGVzY3JpYmVkIGJ5IFBoaWwgS2F0eiBpbiB0aGUgZmlsZSBhcHBub3RlLnR4dC4gIFRoaXMKKyAgIGZpbGUgKGFwcG5vdGUudHh0KSBpcyBkaXN0cmlidXRlZCB3aXRoIHRoZSBQS1pJUCBwcm9ncmFtIChldmVuIGluIHRoZQorICAgdmVyc2lvbiB3aXRob3V0IGVuY3J5cHRpb24gY2FwYWJpbGl0aWVzKS4KKworICAgSWYgeW91IGRvbid0IG5lZWQgY3J5cHRpbmcgaW4geW91ciBhcHBsaWNhdGlvbiwganVzdCBkZWZpbmUgc3ltYm9scworICAgTk9DUllQVCBhbmQgTk9VTkNSWVBULgorCisgICBUaGlzIGNvZGUgc3VwcG9ydCB0aGUgIlRyYWRpdGlvbmFsIFBLV0FSRSBFbmNyeXB0aW9uIi4KKworICAgVGhlIG5ldyBBRVMgZW5jcnlwdGlvbiBhZGRlZCBvbiBaaXAgZm9ybWF0IGJ5IFdpbnppcCAoc2VlIHRoZSBwYWdlCisgICBodHRwOi8vd3d3LndpbnppcC5jb20vYWVzX2luZm8uaHRtICkgYW5kIFBLV2FyZSBQS1ppcCA1LnggU3Ryb25nCisgICBFbmNyeXB0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuCisqLworCisjZGVmaW5lIENSQzMyKGMsIGIpICgoKihwY3JjXzMyX3RhYisoKChpbnQpKGMpIF4gKGIpKSAmIDB4ZmYpKSkgXiAoKGMpID4+IDgpKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJldHVybiB0aGUgbmV4dCBieXRlIGluIHRoZSBwc2V1ZG8tcmFuZG9tIHNlcXVlbmNlCisgKi8KK3N0YXRpYyBpbnQgZGVjcnlwdF9ieXRlKHVuc2lnbmVkIGxvbmcqIHBrZXlzLCBjb25zdCB1bnNpZ25lZCBsb25nKiBwY3JjXzMyX3RhYikKK3sKKyAgICB1bnNpZ25lZCB0ZW1wOyAgLyogUE9URU5USUFMIEJVRzogIHRlbXAqKHRlbXBeMSkgbWF5IG92ZXJmbG93IGluIGFuCisgICAgICAgICAgICAgICAgICAgICAqIHVucHJlZGljdGFibGUgbWFubmVyIG9uIDE2LWJpdCBzeXN0ZW1zOyBub3QgYSBwcm9ibGVtCisgICAgICAgICAgICAgICAgICAgICAqIHdpdGggYW55IGtub3duIGNvbXBpbGVyIHNvIGZhciwgdGhvdWdoICovCisKKyAgICB0ZW1wID0gKCh1bnNpZ25lZCkoKihwa2V5cysyKSkgJiAweGZmZmYpIHwgMjsKKyAgICByZXR1cm4gKGludCkoKCh0ZW1wICogKHRlbXAgXiAxKSkgPj4gOCkgJiAweGZmKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBVcGRhdGUgdGhlIGVuY3J5cHRpb24ga2V5cyB3aXRoIHRoZSBuZXh0IGJ5dGUgb2YgcGxhaW4gdGV4dAorICovCitzdGF0aWMgaW50IHVwZGF0ZV9rZXlzKHVuc2lnbmVkIGxvbmcqIHBrZXlzLGNvbnN0IHVuc2lnbmVkIGxvbmcqIHBjcmNfMzJfdGFiLGludCBjKQoreworICAgICgqKHBrZXlzKzApKSA9IENSQzMyKCgqKHBrZXlzKzApKSwgYyk7CisgICAgKCoocGtleXMrMSkpICs9ICgqKHBrZXlzKzApKSAmIDB4ZmY7CisgICAgKCoocGtleXMrMSkpID0gKCoocGtleXMrMSkpICogMTM0Nzc1ODEzTCArIDE7CisgICAgeworICAgICAgcmVnaXN0ZXIgaW50IGtleXNoaWZ0ID0gKGludCkoKCoocGtleXMrMSkpID4+IDI0KTsKKyAgICAgICgqKHBrZXlzKzIpKSA9IENSQzMyKCgqKHBrZXlzKzIpKSwga2V5c2hpZnQpOworICAgIH0KKyAgICByZXR1cm4gYzsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEluaXRpYWxpemUgdGhlIGVuY3J5cHRpb24ga2V5cyBhbmQgdGhlIHJhbmRvbSBoZWFkZXIgYWNjb3JkaW5nIHRvCisgKiB0aGUgZ2l2ZW4gcGFzc3dvcmQuCisgKi8KK3N0YXRpYyB2b2lkIGluaXRfa2V5cyhjb25zdCBjaGFyKiBwYXNzd2QsdW5zaWduZWQgbG9uZyogcGtleXMsY29uc3QgdW5zaWduZWQgbG9uZyogcGNyY18zMl90YWIpCit7CisgICAgKihwa2V5cyswKSA9IDMwNTQxOTg5Nkw7CisgICAgKihwa2V5cysxKSA9IDU5MTc1MTA0OUw7CisgICAgKihwa2V5cysyKSA9IDg3ODA4MjE5Mkw7CisgICAgd2hpbGUgKCpwYXNzd2QgIT0gJ1wwJykgeworICAgICAgICB1cGRhdGVfa2V5cyhwa2V5cyxwY3JjXzMyX3RhYiwoaW50KSpwYXNzd2QpOworICAgICAgICBwYXNzd2QrKzsKKyAgICB9Cit9CisKKyNkZWZpbmUgemRlY29kZShwa2V5cyxwY3JjXzMyX3RhYixjKSBcCisgICAgKHVwZGF0ZV9rZXlzKHBrZXlzLHBjcmNfMzJfdGFiLGMgXj0gZGVjcnlwdF9ieXRlKHBrZXlzLHBjcmNfMzJfdGFiKSkpCisKKyNkZWZpbmUgemVuY29kZShwa2V5cyxwY3JjXzMyX3RhYixjLHQpIFwKKyAgICAodD1kZWNyeXB0X2J5dGUocGtleXMscGNyY18zMl90YWIpLCB1cGRhdGVfa2V5cyhwa2V5cyxwY3JjXzMyX3RhYixjKSwgdF4oYykpCisKKyNpZmRlZiBJTkNMVURFQ1JZUFRJTkdDT0RFX0lGQ1JZUFRBTExPV0VECisKKyNkZWZpbmUgUkFORF9IRUFEX0xFTiAgMTIKKyAgIC8qICJsYXN0IHJlc29ydCIgc291cmNlIGZvciBzZWNvbmQgcGFydCBvZiBjcnlwdCBzZWVkIHBhdHRlcm4gKi8KKyMgIGlmbmRlZiBaQ1JfU0VFRDIKKyMgICAgZGVmaW5lIFpDUl9TRUVEMiAzMTQxNTkyNjU0VUwgICAgIC8qIHVzZSBQSSBhcyBkZWZhdWx0IHBhdHRlcm4gKi8KKyMgIGVuZGlmCisKK3N0YXRpYyBpbnQgY3J5cHRoZWFkKGNvbnN0IGNoYXIqIHBhc3N3ZCwgICAgICAvKiBwYXNzd29yZCBzdHJpbmcgKi8KKyAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIqIGJ1ZiwgICAgICAvKiB3aGVyZSB0byB3cml0ZSBoZWFkZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgIGludCBidWZTaXplLAorICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyogcGtleXMsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBsb25nKiBwY3JjXzMyX3RhYiwKKyAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgY3JjRm9yQ3J5cHRpbmcpCit7CisgICAgaW50IG47ICAgICAgICAgICAgICAgICAgICAgICAvKiBpbmRleCBpbiByYW5kb20gaGVhZGVyICovCisgICAgaW50IHQ7ICAgICAgICAgICAgICAgICAgICAgICAvKiB0ZW1wb3JhcnkgKi8KKyAgICBpbnQgYzsgICAgICAgICAgICAgICAgICAgICAgIC8qIHJhbmRvbSBieXRlICovCisgICAgdW5zaWduZWQgY2hhciBoZWFkZXJbUkFORF9IRUFEX0xFTi0yXTsgLyogcmFuZG9tIGhlYWRlciAqLworICAgIHN0YXRpYyB1bnNpZ25lZCBjYWxscyA9IDA7ICAgLyogZW5zdXJlIGRpZmZlcmVudCByYW5kb20gaGVhZGVyIGVhY2ggdGltZSAqLworCisgICAgaWYgKGJ1ZlNpemU8UkFORF9IRUFEX0xFTikKKyAgICAgIHJldHVybiAwOworCisgICAgLyogRmlyc3QgZ2VuZXJhdGUgUkFORF9IRUFEX0xFTi0yIHJhbmRvbSBieXRlcy4gV2UgZW5jcnlwdCB0aGUKKyAgICAgKiBvdXRwdXQgb2YgcmFuZCgpIHRvIGdldCBsZXNzIHByZWRpY3RhYmlsaXR5LCBzaW5jZSByYW5kKCkgaXMKKyAgICAgKiBvZnRlbiBwb29ybHkgaW1wbGVtZW50ZWQuCisgICAgICovCisgICAgaWYgKCsrY2FsbHMgPT0gMSkKKyAgICB7CisgICAgICAgIHNyYW5kKCh1bnNpZ25lZCkodGltZShOVUxMKSBeIFpDUl9TRUVEMikpOworICAgIH0KKyAgICBpbml0X2tleXMocGFzc3dkLCBwa2V5cywgcGNyY18zMl90YWIpOworICAgIGZvciAobiA9IDA7IG4gPCBSQU5EX0hFQURfTEVOLTI7IG4rKykKKyAgICB7CisgICAgICAgIGMgPSAocmFuZCgpID4+IDcpICYgMHhmZjsKKyAgICAgICAgaGVhZGVyW25dID0gKHVuc2lnbmVkIGNoYXIpemVuY29kZShwa2V5cywgcGNyY18zMl90YWIsIGMsIHQpOworICAgIH0KKyAgICAvKiBFbmNyeXB0IHJhbmRvbSBoZWFkZXIgKGxhc3QgdHdvIGJ5dGVzIGlzIGhpZ2ggd29yZCBvZiBjcmMpICovCisgICAgaW5pdF9rZXlzKHBhc3N3ZCwgcGtleXMsIHBjcmNfMzJfdGFiKTsKKyAgICBmb3IgKG4gPSAwOyBuIDwgUkFORF9IRUFEX0xFTi0yOyBuKyspCisgICAgeworICAgICAgICBidWZbbl0gPSAodW5zaWduZWQgY2hhcil6ZW5jb2RlKHBrZXlzLCBwY3JjXzMyX3RhYiwgaGVhZGVyW25dLCB0KTsKKyAgICB9CisgICAgYnVmW24rK10gPSAodW5zaWduZWQgY2hhcil6ZW5jb2RlKHBrZXlzLCBwY3JjXzMyX3RhYiwgKGludCkoY3JjRm9yQ3J5cHRpbmcgPj4gMTYpICYgMHhmZiwgdCk7CisgICAgYnVmW24rK10gPSAodW5zaWduZWQgY2hhcil6ZW5jb2RlKHBrZXlzLCBwY3JjXzMyX3RhYiwgKGludCkoY3JjRm9yQ3J5cHRpbmcgPj4gMjQpICYgMHhmZiwgdCk7CisgICAgcmV0dXJuIG47Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvemxpYi0xLjIuNi9jb250cmliL21pbml6aXAvaW9hcGkuYyBiL3psaWItMS4yLjYvY29udHJpYi9taW5pemlwL2lvYXBpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y1YzE5MQotLS0gL2Rldi9udWxsCisrKyBiL3psaWItMS4yLjYvY29udHJpYi9taW5pemlwL2lvYXBpLmMKQEAgLTAsMCArMSwyNDcgQEAKKy8qIGlvYXBpLmggLS0gSU8gYmFzZSBmdW5jdGlvbiBoZWFkZXIgZm9yIGNvbXByZXNzL3VuY29tcHJlc3MgLnppcAorICAgcGFydCBvZiB0aGUgTWluaVppcCBwcm9qZWN0IC0gKCBodHRwOi8vd3d3LndpbmltYWdlLmNvbS96TGliRGxsL21pbml6aXAuaHRtbCApCisKKyAgICAgICAgIENvcHlyaWdodCAoQykgMTk5OC0yMDEwIEdpbGxlcyBWb2xsYW50IChtaW5pemlwKSAoIGh0dHA6Ly93d3cud2luaW1hZ2UuY29tL3pMaWJEbGwvbWluaXppcC5odG1sICkKKworICAgICAgICAgTW9kaWZpY2F0aW9ucyBmb3IgWmlwNjQgc3VwcG9ydAorICAgICAgICAgQ29weXJpZ2h0IChDKSAyMDA5LTIwMTAgTWF0aGlhcyBTdmVuc3NvbiAoIGh0dHA6Ly9yZXN1bHQ0Mi5jb20gKQorCisgICAgICAgICBGb3IgbW9yZSBpbmZvIHJlYWQgTWluaVppcF9pbmZvLnR4dAorCisqLworCisjaWYgZGVmaW5lZChfV0lOMzIpICYmICghKGRlZmluZWQoX0NSVF9TRUNVUkVfTk9fV0FSTklOR1MpKSkKKyAgICAgICAgI2RlZmluZSBfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUworI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fQVBQTEVfXykgfHwgZGVmaW5lZChJT0FQSV9OT182NCkKKy8vIEluIGRhcndpbiBhbmQgcGVyaGFwcyBvdGhlciBCU0QgdmFyaWFudHMgb2ZmX3QgaXMgYSA2NCBiaXQgdmFsdWUsIGhlbmNlIG5vIG5lZWQgZm9yIHNwZWNpZmljIDY0IGJpdCBmdW5jdGlvbnMKKyNkZWZpbmUgRk9QRU5fRlVOQyhmaWxlbmFtZSwgbW9kZSkgZm9wZW4oZmlsZW5hbWUsIG1vZGUpCisjZGVmaW5lIEZURUxMT19GVU5DKHN0cmVhbSkgZnRlbGxvKHN0cmVhbSkKKyNkZWZpbmUgRlNFRUtPX0ZVTkMoc3RyZWFtLCBvZmZzZXQsIG9yaWdpbikgZnNlZWtvKHN0cmVhbSwgb2Zmc2V0LCBvcmlnaW4pCisjZWxzZQorI2RlZmluZSBGT1BFTl9GVU5DKGZpbGVuYW1lLCBtb2RlKSBmb3BlbjY0KGZpbGVuYW1lLCBtb2RlKQorI2RlZmluZSBGVEVMTE9fRlVOQyhzdHJlYW0pIGZ0ZWxsbzY0KHN0cmVhbSkKKyNkZWZpbmUgRlNFRUtPX0ZVTkMoc3RyZWFtLCBvZmZzZXQsIG9yaWdpbikgZnNlZWtvNjQoc3RyZWFtLCBvZmZzZXQsIG9yaWdpbikKKyNlbmRpZgorCisKKyNpbmNsdWRlICJpb2FwaS5oIgorCit2b2lkcGYgY2FsbF96b3BlbjY0IChjb25zdCB6bGliX2ZpbGVmdW5jNjRfMzJfZGVmKiBwZmlsZWZ1bmMsY29uc3Qgdm9pZCpmaWxlbmFtZSxpbnQgbW9kZSkKK3sKKyAgICBpZiAocGZpbGVmdW5jLT56ZmlsZV9mdW5jNjQuem9wZW42NF9maWxlICE9IE5VTEwpCisgICAgICAgIHJldHVybiAoKihwZmlsZWZ1bmMtPnpmaWxlX2Z1bmM2NC56b3BlbjY0X2ZpbGUpKSAocGZpbGVmdW5jLT56ZmlsZV9mdW5jNjQub3BhcXVlLGZpbGVuYW1lLG1vZGUpOworICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiAoKihwZmlsZWZ1bmMtPnpvcGVuMzJfZmlsZSkpKHBmaWxlZnVuYy0+emZpbGVfZnVuYzY0Lm9wYXF1ZSwoY29uc3QgY2hhciopZmlsZW5hbWUsbW9kZSk7CisgICAgfQorfQorCitsb25nIGNhbGxfenNlZWs2NCAoY29uc3QgemxpYl9maWxlZnVuYzY0XzMyX2RlZiogcGZpbGVmdW5jLHZvaWRwZiBmaWxlc3RyZWFtLCBaUE9TNjRfVCBvZmZzZXQsIGludCBvcmlnaW4pCit7CisgICAgaWYgKHBmaWxlZnVuYy0+emZpbGVfZnVuYzY0LnpzZWVrNjRfZmlsZSAhPSBOVUxMKQorICAgICAgICByZXR1cm4gKCoocGZpbGVmdW5jLT56ZmlsZV9mdW5jNjQuenNlZWs2NF9maWxlKSkgKHBmaWxlZnVuYy0+emZpbGVfZnVuYzY0Lm9wYXF1ZSxmaWxlc3RyZWFtLG9mZnNldCxvcmlnaW4pOworICAgIGVsc2UKKyAgICB7CisgICAgICAgIHVMb25nIG9mZnNldFRydW5jYXRlZCA9ICh1TG9uZylvZmZzZXQ7CisgICAgICAgIGlmIChvZmZzZXRUcnVuY2F0ZWQgIT0gb2Zmc2V0KQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gKCoocGZpbGVmdW5jLT56c2VlazMyX2ZpbGUpKShwZmlsZWZ1bmMtPnpmaWxlX2Z1bmM2NC5vcGFxdWUsZmlsZXN0cmVhbSxvZmZzZXRUcnVuY2F0ZWQsb3JpZ2luKTsKKyAgICB9Cit9CisKK1pQT1M2NF9UIGNhbGxfenRlbGw2NCAoY29uc3QgemxpYl9maWxlZnVuYzY0XzMyX2RlZiogcGZpbGVmdW5jLHZvaWRwZiBmaWxlc3RyZWFtKQoreworICAgIGlmIChwZmlsZWZ1bmMtPnpmaWxlX2Z1bmM2NC56c2VlazY0X2ZpbGUgIT0gTlVMTCkKKyAgICAgICAgcmV0dXJuICgqKHBmaWxlZnVuYy0+emZpbGVfZnVuYzY0Lnp0ZWxsNjRfZmlsZSkpIChwZmlsZWZ1bmMtPnpmaWxlX2Z1bmM2NC5vcGFxdWUsZmlsZXN0cmVhbSk7CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdUxvbmcgdGVsbF91TG9uZyA9ICgqKHBmaWxlZnVuYy0+enRlbGwzMl9maWxlKSkocGZpbGVmdW5jLT56ZmlsZV9mdW5jNjQub3BhcXVlLGZpbGVzdHJlYW0pOworICAgICAgICBpZiAoKHRlbGxfdUxvbmcpID09IE1BWFUzMikKKyAgICAgICAgICAgIHJldHVybiAoWlBPUzY0X1QpLTE7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiB0ZWxsX3VMb25nOworICAgIH0KK30KKwordm9pZCBmaWxsX3psaWJfZmlsZWZ1bmM2NF8zMl9kZWZfZnJvbV9maWxlZnVuYzMyKHpsaWJfZmlsZWZ1bmM2NF8zMl9kZWYqIHBfZmlsZWZ1bmM2NF8zMixjb25zdCB6bGliX2ZpbGVmdW5jX2RlZiogcF9maWxlZnVuYzMyKQoreworICAgIHBfZmlsZWZ1bmM2NF8zMi0+emZpbGVfZnVuYzY0LnpvcGVuNjRfZmlsZSA9IE5VTEw7CisgICAgcF9maWxlZnVuYzY0XzMyLT56b3BlbjMyX2ZpbGUgPSBwX2ZpbGVmdW5jMzItPnpvcGVuX2ZpbGU7CisgICAgcF9maWxlZnVuYzY0XzMyLT56ZmlsZV9mdW5jNjQuemVycm9yX2ZpbGUgPSBwX2ZpbGVmdW5jMzItPnplcnJvcl9maWxlOworICAgIHBfZmlsZWZ1bmM2NF8zMi0+emZpbGVfZnVuYzY0LnpyZWFkX2ZpbGUgPSBwX2ZpbGVmdW5jMzItPnpyZWFkX2ZpbGU7CisgICAgcF9maWxlZnVuYzY0XzMyLT56ZmlsZV9mdW5jNjQuendyaXRlX2ZpbGUgPSBwX2ZpbGVmdW5jMzItPnp3cml0ZV9maWxlOworICAgIHBfZmlsZWZ1bmM2NF8zMi0+emZpbGVfZnVuYzY0Lnp0ZWxsNjRfZmlsZSA9IE5VTEw7CisgICAgcF9maWxlZnVuYzY0XzMyLT56ZmlsZV9mdW5jNjQuenNlZWs2NF9maWxlID0gTlVMTDsKKyAgICBwX2ZpbGVmdW5jNjRfMzItPnpmaWxlX2Z1bmM2NC56Y2xvc2VfZmlsZSA9IHBfZmlsZWZ1bmMzMi0+emNsb3NlX2ZpbGU7CisgICAgcF9maWxlZnVuYzY0XzMyLT56ZmlsZV9mdW5jNjQuemVycm9yX2ZpbGUgPSBwX2ZpbGVmdW5jMzItPnplcnJvcl9maWxlOworICAgIHBfZmlsZWZ1bmM2NF8zMi0+emZpbGVfZnVuYzY0Lm9wYXF1ZSA9IHBfZmlsZWZ1bmMzMi0+b3BhcXVlOworICAgIHBfZmlsZWZ1bmM2NF8zMi0+enNlZWszMl9maWxlID0gcF9maWxlZnVuYzMyLT56c2Vla19maWxlOworICAgIHBfZmlsZWZ1bmM2NF8zMi0+enRlbGwzMl9maWxlID0gcF9maWxlZnVuYzMyLT56dGVsbF9maWxlOworfQorCisKKworc3RhdGljIHZvaWRwZiAgWkNBTExCQUNLIGZvcGVuX2ZpbGVfZnVuYyBPRigodm9pZHBmIG9wYXF1ZSwgY29uc3QgY2hhciogZmlsZW5hbWUsIGludCBtb2RlKSk7CitzdGF0aWMgdUxvbmcgICBaQ0FMTEJBQ0sgZnJlYWRfZmlsZV9mdW5jIE9GKCh2b2lkcGYgb3BhcXVlLCB2b2lkcGYgc3RyZWFtLCB2b2lkKiBidWYsIHVMb25nIHNpemUpKTsKK3N0YXRpYyB1TG9uZyAgIFpDQUxMQkFDSyBmd3JpdGVfZmlsZV9mdW5jIE9GKCh2b2lkcGYgb3BhcXVlLCB2b2lkcGYgc3RyZWFtLCBjb25zdCB2b2lkKiBidWYsdUxvbmcgc2l6ZSkpOworc3RhdGljIFpQT1M2NF9UIFpDQUxMQkFDSyBmdGVsbDY0X2ZpbGVfZnVuYyBPRigodm9pZHBmIG9wYXF1ZSwgdm9pZHBmIHN0cmVhbSkpOworc3RhdGljIGxvbmcgICAgWkNBTExCQUNLIGZzZWVrNjRfZmlsZV9mdW5jIE9GKCh2b2lkcGYgb3BhcXVlLCB2b2lkcGYgc3RyZWFtLCBaUE9TNjRfVCBvZmZzZXQsIGludCBvcmlnaW4pKTsKK3N0YXRpYyBpbnQgICAgIFpDQUxMQkFDSyBmY2xvc2VfZmlsZV9mdW5jIE9GKCh2b2lkcGYgb3BhcXVlLCB2b2lkcGYgc3RyZWFtKSk7CitzdGF0aWMgaW50ICAgICBaQ0FMTEJBQ0sgZmVycm9yX2ZpbGVfZnVuYyBPRigodm9pZHBmIG9wYXF1ZSwgdm9pZHBmIHN0cmVhbSkpOworCitzdGF0aWMgdm9pZHBmIFpDQUxMQkFDSyBmb3Blbl9maWxlX2Z1bmMgKHZvaWRwZiBvcGFxdWUsIGNvbnN0IGNoYXIqIGZpbGVuYW1lLCBpbnQgbW9kZSkKK3sKKyAgICBGSUxFKiBmaWxlID0gTlVMTDsKKyAgICBjb25zdCBjaGFyKiBtb2RlX2ZvcGVuID0gTlVMTDsKKyAgICBpZiAoKG1vZGUgJiBaTElCX0ZJTEVGVU5DX01PREVfUkVBRFdSSVRFRklMVEVSKT09WkxJQl9GSUxFRlVOQ19NT0RFX1JFQUQpCisgICAgICAgIG1vZGVfZm9wZW4gPSAicmIiOworICAgIGVsc2UKKyAgICBpZiAobW9kZSAmIFpMSUJfRklMRUZVTkNfTU9ERV9FWElTVElORykKKyAgICAgICAgbW9kZV9mb3BlbiA9ICJyK2IiOworICAgIGVsc2UKKyAgICBpZiAobW9kZSAmIFpMSUJfRklMRUZVTkNfTU9ERV9DUkVBVEUpCisgICAgICAgIG1vZGVfZm9wZW4gPSAid2IiOworCisgICAgaWYgKChmaWxlbmFtZSE9TlVMTCkgJiYgKG1vZGVfZm9wZW4gIT0gTlVMTCkpCisgICAgICAgIGZpbGUgPSBmb3BlbihmaWxlbmFtZSwgbW9kZV9mb3Blbik7CisgICAgcmV0dXJuIGZpbGU7Cit9CisKK3N0YXRpYyB2b2lkcGYgWkNBTExCQUNLIGZvcGVuNjRfZmlsZV9mdW5jICh2b2lkcGYgb3BhcXVlLCBjb25zdCB2b2lkKiBmaWxlbmFtZSwgaW50IG1vZGUpCit7CisgICAgRklMRSogZmlsZSA9IE5VTEw7CisgICAgY29uc3QgY2hhciogbW9kZV9mb3BlbiA9IE5VTEw7CisgICAgaWYgKChtb2RlICYgWkxJQl9GSUxFRlVOQ19NT0RFX1JFQURXUklURUZJTFRFUik9PVpMSUJfRklMRUZVTkNfTU9ERV9SRUFEKQorICAgICAgICBtb2RlX2ZvcGVuID0gInJiIjsKKyAgICBlbHNlCisgICAgaWYgKG1vZGUgJiBaTElCX0ZJTEVGVU5DX01PREVfRVhJU1RJTkcpCisgICAgICAgIG1vZGVfZm9wZW4gPSAicitiIjsKKyAgICBlbHNlCisgICAgaWYgKG1vZGUgJiBaTElCX0ZJTEVGVU5DX01PREVfQ1JFQVRFKQorICAgICAgICBtb2RlX2ZvcGVuID0gIndiIjsKKworICAgIGlmICgoZmlsZW5hbWUhPU5VTEwpICYmIChtb2RlX2ZvcGVuICE9IE5VTEwpKQorICAgICAgICBmaWxlID0gRk9QRU5fRlVOQygoY29uc3QgY2hhciopZmlsZW5hbWUsIG1vZGVfZm9wZW4pOworICAgIHJldHVybiBmaWxlOworfQorCisKK3N0YXRpYyB1TG9uZyBaQ0FMTEJBQ0sgZnJlYWRfZmlsZV9mdW5jICh2b2lkcGYgb3BhcXVlLCB2b2lkcGYgc3RyZWFtLCB2b2lkKiBidWYsIHVMb25nIHNpemUpCit7CisgICAgdUxvbmcgcmV0OworICAgIHJldCA9ICh1TG9uZylmcmVhZChidWYsIDEsIChzaXplX3Qpc2l6ZSwgKEZJTEUgKilzdHJlYW0pOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB1TG9uZyBaQ0FMTEJBQ0sgZndyaXRlX2ZpbGVfZnVuYyAodm9pZHBmIG9wYXF1ZSwgdm9pZHBmIHN0cmVhbSwgY29uc3Qgdm9pZCogYnVmLCB1TG9uZyBzaXplKQoreworICAgIHVMb25nIHJldDsKKyAgICByZXQgPSAodUxvbmcpZndyaXRlKGJ1ZiwgMSwgKHNpemVfdClzaXplLCAoRklMRSAqKXN0cmVhbSk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGxvbmcgWkNBTExCQUNLIGZ0ZWxsX2ZpbGVfZnVuYyAodm9pZHBmIG9wYXF1ZSwgdm9pZHBmIHN0cmVhbSkKK3sKKyAgICBsb25nIHJldDsKKyAgICByZXQgPSBmdGVsbCgoRklMRSAqKXN0cmVhbSk7CisgICAgcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgWlBPUzY0X1QgWkNBTExCQUNLIGZ0ZWxsNjRfZmlsZV9mdW5jICh2b2lkcGYgb3BhcXVlLCB2b2lkcGYgc3RyZWFtKQoreworICAgIFpQT1M2NF9UIHJldDsKKyAgICByZXQgPSBGVEVMTE9fRlVOQygoRklMRSAqKXN0cmVhbSk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGxvbmcgWkNBTExCQUNLIGZzZWVrX2ZpbGVfZnVuYyAodm9pZHBmICBvcGFxdWUsIHZvaWRwZiBzdHJlYW0sIHVMb25nIG9mZnNldCwgaW50IG9yaWdpbikKK3sKKyAgICBpbnQgZnNlZWtfb3JpZ2luPTA7CisgICAgbG9uZyByZXQ7CisgICAgc3dpdGNoIChvcmlnaW4pCisgICAgeworICAgIGNhc2UgWkxJQl9GSUxFRlVOQ19TRUVLX0NVUiA6CisgICAgICAgIGZzZWVrX29yaWdpbiA9IFNFRUtfQ1VSOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFpMSUJfRklMRUZVTkNfU0VFS19FTkQgOgorICAgICAgICBmc2Vla19vcmlnaW4gPSBTRUVLX0VORDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBaTElCX0ZJTEVGVU5DX1NFRUtfU0VUIDoKKyAgICAgICAgZnNlZWtfb3JpZ2luID0gU0VFS19TRVQ7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6IHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0ID0gMDsKKyAgICBpZiAoZnNlZWsoKEZJTEUgKilzdHJlYW0sIG9mZnNldCwgZnNlZWtfb3JpZ2luKSAhPSAwKQorICAgICAgICByZXQgPSAtMTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgbG9uZyBaQ0FMTEJBQ0sgZnNlZWs2NF9maWxlX2Z1bmMgKHZvaWRwZiAgb3BhcXVlLCB2b2lkcGYgc3RyZWFtLCBaUE9TNjRfVCBvZmZzZXQsIGludCBvcmlnaW4pCit7CisgICAgaW50IGZzZWVrX29yaWdpbj0wOworICAgIGxvbmcgcmV0OworICAgIHN3aXRjaCAob3JpZ2luKQorICAgIHsKKyAgICBjYXNlIFpMSUJfRklMRUZVTkNfU0VFS19DVVIgOgorICAgICAgICBmc2Vla19vcmlnaW4gPSBTRUVLX0NVUjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBaTElCX0ZJTEVGVU5DX1NFRUtfRU5EIDoKKyAgICAgICAgZnNlZWtfb3JpZ2luID0gU0VFS19FTkQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgWkxJQl9GSUxFRlVOQ19TRUVLX1NFVCA6CisgICAgICAgIGZzZWVrX29yaWdpbiA9IFNFRUtfU0VUOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OiByZXR1cm4gLTE7CisgICAgfQorICAgIHJldCA9IDA7CisKKyAgICBpZihGU0VFS09fRlVOQygoRklMRSAqKXN0cmVhbSwgb2Zmc2V0LCBmc2Vla19vcmlnaW4pICE9IDApCisgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSAtMTsKKworICAgIHJldHVybiByZXQ7Cit9CisKKworc3RhdGljIGludCBaQ0FMTEJBQ0sgZmNsb3NlX2ZpbGVfZnVuYyAodm9pZHBmIG9wYXF1ZSwgdm9pZHBmIHN0cmVhbSkKK3sKKyAgICBpbnQgcmV0OworICAgIHJldCA9IGZjbG9zZSgoRklMRSAqKXN0cmVhbSk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBaQ0FMTEJBQ0sgZmVycm9yX2ZpbGVfZnVuYyAodm9pZHBmIG9wYXF1ZSwgdm9pZHBmIHN0cmVhbSkKK3sKKyAgICBpbnQgcmV0OworICAgIHJldCA9IGZlcnJvcigoRklMRSAqKXN0cmVhbSk7CisgICAgcmV0dXJuIHJldDsKK30KKwordm9pZCBmaWxsX2ZvcGVuX2ZpbGVmdW5jIChwemxpYl9maWxlZnVuY19kZWYpCisgIHpsaWJfZmlsZWZ1bmNfZGVmKiBwemxpYl9maWxlZnVuY19kZWY7Cit7CisgICAgcHpsaWJfZmlsZWZ1bmNfZGVmLT56b3Blbl9maWxlID0gZm9wZW5fZmlsZV9mdW5jOworICAgIHB6bGliX2ZpbGVmdW5jX2RlZi0+enJlYWRfZmlsZSA9IGZyZWFkX2ZpbGVfZnVuYzsKKyAgICBwemxpYl9maWxlZnVuY19kZWYtPnp3cml0ZV9maWxlID0gZndyaXRlX2ZpbGVfZnVuYzsKKyAgICBwemxpYl9maWxlZnVuY19kZWYtPnp0ZWxsX2ZpbGUgPSBmdGVsbF9maWxlX2Z1bmM7CisgICAgcHpsaWJfZmlsZWZ1bmNfZGVmLT56c2Vla19maWxlID0gZnNlZWtfZmlsZV9mdW5jOworICAgIHB6bGliX2ZpbGVmdW5jX2RlZi0+emNsb3NlX2ZpbGUgPSBmY2xvc2VfZmlsZV9mdW5jOworICAgIHB6bGliX2ZpbGVmdW5jX2RlZi0+emVycm9yX2ZpbGUgPSBmZXJyb3JfZmlsZV9mdW5jOworICAgIHB6bGliX2ZpbGVmdW5jX2RlZi0+b3BhcXVlID0gTlVMTDsKK30KKwordm9pZCBmaWxsX2ZvcGVuNjRfZmlsZWZ1bmMgKHpsaWJfZmlsZWZ1bmM2NF9kZWYqICBwemxpYl9maWxlZnVuY19kZWYpCit7CisgICAgcHpsaWJfZmlsZWZ1bmNfZGVmLT56b3BlbjY0X2ZpbGUgPSBmb3BlbjY0X2ZpbGVfZnVuYzsKKyAgICBwemxpYl9maWxlZnVuY19kZWYtPnpyZWFkX2ZpbGUgPSBmcmVhZF9maWxlX2Z1bmM7CisgICAgcHpsaWJfZmlsZWZ1bmNfZGVmLT56d3JpdGVfZmlsZSA9IGZ3cml0ZV9maWxlX2Z1bmM7CisgICAgcHpsaWJfZmlsZWZ1bmNfZGVmLT56dGVsbDY0X2ZpbGUgPSBmdGVsbDY0X2ZpbGVfZnVuYzsKKyAgICBwemxpYl9maWxlZnVuY19kZWYtPnpzZWVrNjRfZmlsZSA9IGZzZWVrNjRfZmlsZV9mdW5jOworICAgIHB6bGliX2ZpbGVmdW5jX2RlZi0+emNsb3NlX2ZpbGUgPSBmY2xvc2VfZmlsZV9mdW5jOworICAgIHB6bGliX2ZpbGVmdW5jX2RlZi0+emVycm9yX2ZpbGUgPSBmZXJyb3JfZmlsZV9mdW5jOworICAgIHB6bGliX2ZpbGVmdW5jX2RlZi0+b3BhcXVlID0gTlVMTDsKK30KZGlmZiAtLWdpdCBhL3psaWItMS4yLjYvY29udHJpYi9taW5pemlwL2lvYXBpLmggYi96bGliLTEuMi42L2NvbnRyaWIvbWluaXppcC9pb2FwaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkY2JkYjAKLS0tIC9kZXYvbnVsbAorKysgYi96bGliLTEuMi42L2NvbnRyaWIvbWluaXppcC9pb2FwaS5oCkBAIC0wLDAgKzEsMjA4IEBACisvKiBpb2FwaS5oIC0tIElPIGJhc2UgZnVuY3Rpb24gaGVhZGVyIGZvciBjb21wcmVzcy91bmNvbXByZXNzIC56aXAKKyAgIHBhcnQgb2YgdGhlIE1pbmlaaXAgcHJvamVjdCAtICggaHR0cDovL3d3dy53aW5pbWFnZS5jb20vekxpYkRsbC9taW5pemlwLmh0bWwgKQorCisgICAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTgtMjAxMCBHaWxsZXMgVm9sbGFudCAobWluaXppcCkgKCBodHRwOi8vd3d3LndpbmltYWdlLmNvbS96TGliRGxsL21pbml6aXAuaHRtbCApCisKKyAgICAgICAgIE1vZGlmaWNhdGlvbnMgZm9yIFppcDY0IHN1cHBvcnQKKyAgICAgICAgIENvcHlyaWdodCAoQykgMjAwOS0yMDEwIE1hdGhpYXMgU3ZlbnNzb24gKCBodHRwOi8vcmVzdWx0NDIuY29tICkKKworICAgICAgICAgRm9yIG1vcmUgaW5mbyByZWFkIE1pbmlaaXBfaW5mby50eHQKKworICAgICAgICAgQ2hhbmdlcworCisgICAgT2N0LTIwMDkgLSBEZWZpbmVkIFpQT1M2NF9UIHRvIGZwb3NfdCBvbiB3aW5kb3dzIGFuZCB1X2ludDY0X3Qgb24gbGludXguIChtaWdodCBuZWVkIHRvIGZpbmQgYSBiZXR0ZXIgd2h5IGZvciB0aGlzKQorICAgIE9jdC0yMDA5IC0gQ2hhbmdlIHRvIGZzZWVrbzY0LCBmdGVsbG82NCBhbmQgZm9wZW42NCBzbyBsYXJnZSBmaWxlcyB3b3VsZCB3b3JrIG9uIGxpbnV4LgorICAgICAgICAgICAgICAgTW9yZSBpZi9kZWYgc2VjdGlvbiBtYXkgYmUgbmVlZGVkIHRvIHN1cHBvcnQgb3RoZXIgcGxhdGZvcm1zCisgICAgT2N0LTIwMDkgLSBEZWZpbmVkIGZ4eHh4NjQgY2FsbHMgdG8gbm9ybWFsIGZvcGVuL2Z0ZWxsL2ZzZWVrIHNvIHRoZXkgd291bGQgY29tcGlsZSBvbiB3aW5kb3dzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAoYnV0IHlvdSBzaG91bGQgdXNlIGlvd2luMzIuYyBmb3Igd2luZG93cyBpbnN0ZWFkKQorCisqLworCisjaWZuZGVmIF9aTElCSU9BUEk2NF9ICisjZGVmaW5lIF9aTElCSU9BUEk2NF9ICisKKyNpZiAoIWRlZmluZWQoX1dJTjMyKSkgJiYgKCFkZWZpbmVkKFdJTjMyKSkgJiYgKCFkZWZpbmVkKF9fQVBQTEVfXykpCisKKyAgLy8gTGludXggbmVlZHMgdGhpcyB0byBzdXBwb3J0IGZpbGUgb3BlcmF0aW9uIG9uIGZpbGVzIGxhcmdlciB0aGVuIDQrR0IKKyAgLy8gQnV0IG1pZ2h0IG5lZWQgYmV0dGVyIGlmL2RlZiB0byBzZWxlY3QganVzdCB0aGUgcGxhdGZvcm1zIHRoYXQgbmVlZHMgdGhlbS4KKworICAgICAgICAjaWZuZGVmIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKKyAgICAgICAgICAgICAgICAjZGVmaW5lIF9fVVNFX0ZJTEVfT0ZGU0VUNjQKKyAgICAgICAgI2VuZGlmCisgICAgICAgICNpZm5kZWYgX19VU0VfTEFSR0VGSUxFNjQKKyAgICAgICAgICAgICAgICAjZGVmaW5lIF9fVVNFX0xBUkdFRklMRTY0CisgICAgICAgICNlbmRpZgorICAgICAgICAjaWZuZGVmIF9MQVJHRUZJTEU2NF9TT1VSQ0UKKyAgICAgICAgICAgICAgICAjZGVmaW5lIF9MQVJHRUZJTEU2NF9TT1VSQ0UKKyAgICAgICAgI2VuZGlmCisgICAgICAgICNpZm5kZWYgX0ZJTEVfT0ZGU0VUX0JJVAorICAgICAgICAgICAgICAgICNkZWZpbmUgX0ZJTEVfT0ZGU0VUX0JJVCA2NAorICAgICAgICAjZW5kaWYKKworI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgInpsaWIuaCIKKworI2lmIGRlZmluZWQoVVNFX0ZJTEUzMkFQSSkKKyNkZWZpbmUgZm9wZW42NCBmb3BlbgorI2RlZmluZSBmdGVsbG82NCBmdGVsbAorI2RlZmluZSBmc2Vla282NCBmc2VlaworI2Vsc2UKKyNpZmRlZiBfX0ZyZWVCU0RfXworI2RlZmluZSBmb3BlbjY0IGZvcGVuCisjZGVmaW5lIGZ0ZWxsbzY0IGZ0ZWxsbworI2RlZmluZSBmc2Vla282NCBmc2Vla28KKyNlbmRpZgorI2lmZGVmIF9NU0NfVkVSCisgI2RlZmluZSBmb3BlbjY0IGZvcGVuCisgI2lmIChfTVNDX1ZFUiA+PSAxNDAwKSAmJiAoIShkZWZpbmVkKE5PX01TQ1ZFUl9GSUxFNjRfRlVOQykpKQorICAjZGVmaW5lIGZ0ZWxsbzY0IF9mdGVsbGk2NAorICAjZGVmaW5lIGZzZWVrbzY0IF9mc2Vla2k2NAorICNlbHNlIC8vIG9sZCBNU0MKKyAgI2RlZmluZSBmdGVsbG82NCBmdGVsbAorICAjZGVmaW5lIGZzZWVrbzY0IGZzZWVrCisgI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorCisvKgorI2lmbmRlZiBaUE9TNjRfVAorICAjaWZkZWYgX1dJTjMyCisgICAgICAgICAgICAgICAgI2RlZmluZSBaUE9TNjRfVCBmcG9zX3QKKyAgI2Vsc2UKKyAgICAjaW5jbHVkZSA8c3RkaW50Lmg+CisgICAgI2RlZmluZSBaUE9TNjRfVCB1aW50NjRfdAorICAjZW5kaWYKKyNlbmRpZgorKi8KKworI2lmZGVmIEhBVkVfTUlOSVpJUDY0X0NPTkZfSAorI2luY2x1ZGUgIm16NjRjb25mLmgiCisjZW5kaWYKKworLyogYSB0eXBlIGNob29zZW4gYnkgREVGSU5FICovCisjaWZkZWYgSEFWRV82NEJJVF9JTlRfQ1VTVE9NCit0eXBlZGVmICA2NEJJVF9JTlRfQ1VTVE9NX1RZUEUgWlBPUzY0X1Q7CisjZWxzZQorI2lmZGVmIEhBU19TVERJTlRfSAorI2luY2x1ZGUgInN0ZGludC5oIgordHlwZWRlZiB1aW50NjRfdCBaUE9TNjRfVDsKKyNlbHNlCisKKy8qIE1heGltdW0gdW5zaWduZWQgMzItYml0IHZhbHVlIHVzZWQgYXMgcGxhY2Vob2xkZXIgZm9yIHppcDY0ICovCisjZGVmaW5lIE1BWFUzMiAweGZmZmZmZmZmCisKKyNpZiBkZWZpbmVkKF9NU0NfVkVSKSB8fCBkZWZpbmVkKF9fQk9STEFORENfXykKK3R5cGVkZWYgdW5zaWduZWQgX19pbnQ2NCBaUE9TNjRfVDsKKyNlbHNlCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQgWlBPUzY0X1Q7CisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKworI2RlZmluZSBaTElCX0ZJTEVGVU5DX1NFRUtfQ1VSICgxKQorI2RlZmluZSBaTElCX0ZJTEVGVU5DX1NFRUtfRU5EICgyKQorI2RlZmluZSBaTElCX0ZJTEVGVU5DX1NFRUtfU0VUICgwKQorCisjZGVmaW5lIFpMSUJfRklMRUZVTkNfTU9ERV9SRUFEICAgICAgKDEpCisjZGVmaW5lIFpMSUJfRklMRUZVTkNfTU9ERV9XUklURSAgICAgKDIpCisjZGVmaW5lIFpMSUJfRklMRUZVTkNfTU9ERV9SRUFEV1JJVEVGSUxURVIgKDMpCisKKyNkZWZpbmUgWkxJQl9GSUxFRlVOQ19NT0RFX0VYSVNUSU5HICg0KQorI2RlZmluZSBaTElCX0ZJTEVGVU5DX01PREVfQ1JFQVRFICAgKDgpCisKKworI2lmbmRlZiBaQ0FMTEJBQ0sKKyAjaWYgKGRlZmluZWQoV0lOMzIpIHx8IGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkIChXSU5ET1dTKSB8fCBkZWZpbmVkIChfV0lORE9XUykpICYmIGRlZmluZWQoQ0FMTEJBQ0spICYmIGRlZmluZWQgKFVTRVdJTkRPV1NfQ0FMTEJBQ0spCisgICAjZGVmaW5lIFpDQUxMQkFDSyBDQUxMQkFDSworICNlbHNlCisgICAjZGVmaW5lIFpDQUxMQkFDSworICNlbmRpZgorI2VuZGlmCisKKworCisKK3R5cGVkZWYgdm9pZHBmICAgKFpDQUxMQkFDSyAqb3Blbl9maWxlX2Z1bmMpICAgICAgT0YoKHZvaWRwZiBvcGFxdWUsIGNvbnN0IGNoYXIqIGZpbGVuYW1lLCBpbnQgbW9kZSkpOwordHlwZWRlZiB1TG9uZyAgICAoWkNBTExCQUNLICpyZWFkX2ZpbGVfZnVuYykgICAgICBPRigodm9pZHBmIG9wYXF1ZSwgdm9pZHBmIHN0cmVhbSwgdm9pZCogYnVmLCB1TG9uZyBzaXplKSk7Cit0eXBlZGVmIHVMb25nICAgIChaQ0FMTEJBQ0sgKndyaXRlX2ZpbGVfZnVuYykgICAgIE9GKCh2b2lkcGYgb3BhcXVlLCB2b2lkcGYgc3RyZWFtLCBjb25zdCB2b2lkKiBidWYsIHVMb25nIHNpemUpKTsKK3R5cGVkZWYgaW50ICAgICAgKFpDQUxMQkFDSyAqY2xvc2VfZmlsZV9mdW5jKSAgICAgT0YoKHZvaWRwZiBvcGFxdWUsIHZvaWRwZiBzdHJlYW0pKTsKK3R5cGVkZWYgaW50ICAgICAgKFpDQUxMQkFDSyAqdGVzdGVycm9yX2ZpbGVfZnVuYykgT0YoKHZvaWRwZiBvcGFxdWUsIHZvaWRwZiBzdHJlYW0pKTsKKwordHlwZWRlZiBsb25nICAgICAoWkNBTExCQUNLICp0ZWxsX2ZpbGVfZnVuYykgICAgICBPRigodm9pZHBmIG9wYXF1ZSwgdm9pZHBmIHN0cmVhbSkpOwordHlwZWRlZiBsb25nICAgICAoWkNBTExCQUNLICpzZWVrX2ZpbGVfZnVuYykgICAgICBPRigodm9pZHBmIG9wYXF1ZSwgdm9pZHBmIHN0cmVhbSwgdUxvbmcgb2Zmc2V0LCBpbnQgb3JpZ2luKSk7CisKKworLyogaGVyZSBpcyB0aGUgIm9sZCIgMzIgYml0cyBzdHJ1Y3R1cmUgc3RydWN0dXJlICovCit0eXBlZGVmIHN0cnVjdCB6bGliX2ZpbGVmdW5jX2RlZl9zCit7CisgICAgb3Blbl9maWxlX2Z1bmMgICAgICB6b3Blbl9maWxlOworICAgIHJlYWRfZmlsZV9mdW5jICAgICAgenJlYWRfZmlsZTsKKyAgICB3cml0ZV9maWxlX2Z1bmMgICAgIHp3cml0ZV9maWxlOworICAgIHRlbGxfZmlsZV9mdW5jICAgICAgenRlbGxfZmlsZTsKKyAgICBzZWVrX2ZpbGVfZnVuYyAgICAgIHpzZWVrX2ZpbGU7CisgICAgY2xvc2VfZmlsZV9mdW5jICAgICB6Y2xvc2VfZmlsZTsKKyAgICB0ZXN0ZXJyb3JfZmlsZV9mdW5jIHplcnJvcl9maWxlOworICAgIHZvaWRwZiAgICAgICAgICAgICAgb3BhcXVlOworfSB6bGliX2ZpbGVmdW5jX2RlZjsKKwordHlwZWRlZiBaUE9TNjRfVCAoWkNBTExCQUNLICp0ZWxsNjRfZmlsZV9mdW5jKSAgICBPRigodm9pZHBmIG9wYXF1ZSwgdm9pZHBmIHN0cmVhbSkpOwordHlwZWRlZiBsb25nICAgICAoWkNBTExCQUNLICpzZWVrNjRfZmlsZV9mdW5jKSAgICBPRigodm9pZHBmIG9wYXF1ZSwgdm9pZHBmIHN0cmVhbSwgWlBPUzY0X1Qgb2Zmc2V0LCBpbnQgb3JpZ2luKSk7Cit0eXBlZGVmIHZvaWRwZiAgIChaQ0FMTEJBQ0sgKm9wZW42NF9maWxlX2Z1bmMpICAgIE9GKCh2b2lkcGYgb3BhcXVlLCBjb25zdCB2b2lkKiBmaWxlbmFtZSwgaW50IG1vZGUpKTsKKwordHlwZWRlZiBzdHJ1Y3QgemxpYl9maWxlZnVuYzY0X2RlZl9zCit7CisgICAgb3BlbjY0X2ZpbGVfZnVuYyAgICB6b3BlbjY0X2ZpbGU7CisgICAgcmVhZF9maWxlX2Z1bmMgICAgICB6cmVhZF9maWxlOworICAgIHdyaXRlX2ZpbGVfZnVuYyAgICAgendyaXRlX2ZpbGU7CisgICAgdGVsbDY0X2ZpbGVfZnVuYyAgICB6dGVsbDY0X2ZpbGU7CisgICAgc2VlazY0X2ZpbGVfZnVuYyAgICB6c2VlazY0X2ZpbGU7CisgICAgY2xvc2VfZmlsZV9mdW5jICAgICB6Y2xvc2VfZmlsZTsKKyAgICB0ZXN0ZXJyb3JfZmlsZV9mdW5jIHplcnJvcl9maWxlOworICAgIHZvaWRwZiAgICAgICAgICAgICAgb3BhcXVlOworfSB6bGliX2ZpbGVmdW5jNjRfZGVmOworCit2b2lkIGZpbGxfZm9wZW42NF9maWxlZnVuYyBPRigoemxpYl9maWxlZnVuYzY0X2RlZiogcHpsaWJfZmlsZWZ1bmNfZGVmKSk7Cit2b2lkIGZpbGxfZm9wZW5fZmlsZWZ1bmMgT0YoKHpsaWJfZmlsZWZ1bmNfZGVmKiBwemxpYl9maWxlZnVuY19kZWYpKTsKKworLyogbm93IGludGVybmFsIGRlZmluaXRpb24sIG9ubHkgZm9yIHppcC5jIGFuZCB1bnppcC5oICovCit0eXBlZGVmIHN0cnVjdCB6bGliX2ZpbGVmdW5jNjRfMzJfZGVmX3MKK3sKKyAgICB6bGliX2ZpbGVmdW5jNjRfZGVmIHpmaWxlX2Z1bmM2NDsKKyAgICBvcGVuX2ZpbGVfZnVuYyAgICAgIHpvcGVuMzJfZmlsZTsKKyAgICB0ZWxsX2ZpbGVfZnVuYyAgICAgIHp0ZWxsMzJfZmlsZTsKKyAgICBzZWVrX2ZpbGVfZnVuYyAgICAgIHpzZWVrMzJfZmlsZTsKK30gemxpYl9maWxlZnVuYzY0XzMyX2RlZjsKKworCisjZGVmaW5lIFpSRUFENjQoZmlsZWZ1bmMsZmlsZXN0cmVhbSxidWYsc2l6ZSkgICAgICgoKigoZmlsZWZ1bmMpLnpmaWxlX2Z1bmM2NC56cmVhZF9maWxlKSkgICAoKGZpbGVmdW5jKS56ZmlsZV9mdW5jNjQub3BhcXVlLGZpbGVzdHJlYW0sYnVmLHNpemUpKQorI2RlZmluZSBaV1JJVEU2NChmaWxlZnVuYyxmaWxlc3RyZWFtLGJ1ZixzaXplKSAgICAoKCooKGZpbGVmdW5jKS56ZmlsZV9mdW5jNjQuendyaXRlX2ZpbGUpKSAgKChmaWxlZnVuYykuemZpbGVfZnVuYzY0Lm9wYXF1ZSxmaWxlc3RyZWFtLGJ1ZixzaXplKSkKKy8vI2RlZmluZSBaVEVMTDY0KGZpbGVmdW5jLGZpbGVzdHJlYW0pICAgICAgICAgICAgKCgqKChmaWxlZnVuYykuenRlbGw2NF9maWxlKSkgKChmaWxlZnVuYykub3BhcXVlLGZpbGVzdHJlYW0pKQorLy8jZGVmaW5lIFpTRUVLNjQoZmlsZWZ1bmMsZmlsZXN0cmVhbSxwb3MsbW9kZSkgICAoKCooKGZpbGVmdW5jKS56c2VlazY0X2ZpbGUpKSAoKGZpbGVmdW5jKS5vcGFxdWUsZmlsZXN0cmVhbSxwb3MsbW9kZSkpCisjZGVmaW5lIFpDTE9TRTY0KGZpbGVmdW5jLGZpbGVzdHJlYW0pICAgICAgICAgICAgICgoKigoZmlsZWZ1bmMpLnpmaWxlX2Z1bmM2NC56Y2xvc2VfZmlsZSkpICAoKGZpbGVmdW5jKS56ZmlsZV9mdW5jNjQub3BhcXVlLGZpbGVzdHJlYW0pKQorI2RlZmluZSBaRVJST1I2NChmaWxlZnVuYyxmaWxlc3RyZWFtKSAgICAgICAgICAgICAoKCooKGZpbGVmdW5jKS56ZmlsZV9mdW5jNjQuemVycm9yX2ZpbGUpKSAgKChmaWxlZnVuYykuemZpbGVfZnVuYzY0Lm9wYXF1ZSxmaWxlc3RyZWFtKSkKKwordm9pZHBmIGNhbGxfem9wZW42NCBPRigoY29uc3QgemxpYl9maWxlZnVuYzY0XzMyX2RlZiogcGZpbGVmdW5jLGNvbnN0IHZvaWQqZmlsZW5hbWUsaW50IG1vZGUpKTsKK2xvbmcgICAgY2FsbF96c2VlazY0IE9GKChjb25zdCB6bGliX2ZpbGVmdW5jNjRfMzJfZGVmKiBwZmlsZWZ1bmMsdm9pZHBmIGZpbGVzdHJlYW0sIFpQT1M2NF9UIG9mZnNldCwgaW50IG9yaWdpbikpOworWlBPUzY0X1QgY2FsbF96dGVsbDY0IE9GKChjb25zdCB6bGliX2ZpbGVmdW5jNjRfMzJfZGVmKiBwZmlsZWZ1bmMsdm9pZHBmIGZpbGVzdHJlYW0pKTsKKwordm9pZCAgICBmaWxsX3psaWJfZmlsZWZ1bmM2NF8zMl9kZWZfZnJvbV9maWxlZnVuYzMyKHpsaWJfZmlsZWZ1bmM2NF8zMl9kZWYqIHBfZmlsZWZ1bmM2NF8zMixjb25zdCB6bGliX2ZpbGVmdW5jX2RlZiogcF9maWxlZnVuYzMyKTsKKworI2RlZmluZSBaT1BFTjY0KGZpbGVmdW5jLGZpbGVuYW1lLG1vZGUpICAgICAgICAgKGNhbGxfem9wZW42NCgoJihmaWxlZnVuYykpLChmaWxlbmFtZSksKG1vZGUpKSkKKyNkZWZpbmUgWlRFTEw2NChmaWxlZnVuYyxmaWxlc3RyZWFtKSAgICAgICAgICAgIChjYWxsX3p0ZWxsNjQoKCYoZmlsZWZ1bmMpKSwoZmlsZXN0cmVhbSkpKQorI2RlZmluZSBaU0VFSzY0KGZpbGVmdW5jLGZpbGVzdHJlYW0scG9zLG1vZGUpICAgKGNhbGxfenNlZWs2NCgoJihmaWxlZnVuYykpLChmaWxlc3RyZWFtKSwocG9zKSwobW9kZSkpKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3psaWItMS4yLjYvY29udHJpYi9taW5pemlwL2lvd2luMzIuYyBiL3psaWItMS4yLjYvY29udHJpYi9taW5pemlwL2lvd2luMzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTJhODgzCi0tLSAvZGV2L251bGwKKysrIGIvemxpYi0xLjIuNi9jb250cmliL21pbml6aXAvaW93aW4zMi5jCkBAIC0wLDAgKzEsMzg5IEBACisvKiBpb3dpbjMyLmMgLS0gSU8gYmFzZSBmdW5jdGlvbiBoZWFkZXIgZm9yIGNvbXByZXNzL3VuY29tcHJlc3MgLnppcAorICAgICBWZXJzaW9uIDEuMSwgRmVicnVhcnkgMTRoLCAyMDEwCisgICAgIHBhcnQgb2YgdGhlIE1pbmlaaXAgcHJvamVjdCAtICggaHR0cDovL3d3dy53aW5pbWFnZS5jb20vekxpYkRsbC9taW5pemlwLmh0bWwgKQorCisgICAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTgtMjAxMCBHaWxsZXMgVm9sbGFudCAobWluaXppcCkgKCBodHRwOi8vd3d3LndpbmltYWdlLmNvbS96TGliRGxsL21pbml6aXAuaHRtbCApCisKKyAgICAgICAgIE1vZGlmaWNhdGlvbnMgZm9yIFppcDY0IHN1cHBvcnQKKyAgICAgICAgIENvcHlyaWdodCAoQykgMjAwOS0yMDEwIE1hdGhpYXMgU3ZlbnNzb24gKCBodHRwOi8vcmVzdWx0NDIuY29tICkKKworICAgICBGb3IgbW9yZSBpbmZvIHJlYWQgTWluaVppcF9pbmZvLnR4dAorCisqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJ6bGliLmgiCisjaW5jbHVkZSAiaW9hcGkuaCIKKyNpbmNsdWRlICJpb3dpbjMyLmgiCisKKyNpZm5kZWYgSU5WQUxJRF9IQU5ETEVfVkFMVUUKKyNkZWZpbmUgSU5WQUxJRF9IQU5ETEVfVkFMVUUgKDB4RkZGRkZGRkYpCisjZW5kaWYKKworI2lmbmRlZiBJTlZBTElEX1NFVF9GSUxFX1BPSU5URVIKKyNkZWZpbmUgSU5WQUxJRF9TRVRfRklMRV9QT0lOVEVSICgoRFdPUkQpLTEpCisjZW5kaWYKKwordm9pZHBmICBaQ0FMTEJBQ0sgd2luMzJfb3Blbl9maWxlX2Z1bmMgIE9GKCh2b2lkcGYgb3BhcXVlLCBjb25zdCBjaGFyKiBmaWxlbmFtZSwgaW50IG1vZGUpKTsKK3VMb25nICAgWkNBTExCQUNLIHdpbjMyX3JlYWRfZmlsZV9mdW5jICBPRigodm9pZHBmIG9wYXF1ZSwgdm9pZHBmIHN0cmVhbSwgdm9pZCogYnVmLCB1TG9uZyBzaXplKSk7Cit1TG9uZyAgIFpDQUxMQkFDSyB3aW4zMl93cml0ZV9maWxlX2Z1bmMgT0YoKHZvaWRwZiBvcGFxdWUsIHZvaWRwZiBzdHJlYW0sIGNvbnN0IHZvaWQqIGJ1ZiwgdUxvbmcgc2l6ZSkpOworWlBPUzY0X1QgWkNBTExCQUNLIHdpbjMyX3RlbGw2NF9maWxlX2Z1bmMgIE9GKCh2b2lkcGYgb3BhcXVlLCB2b2lkcGYgc3RyZWFtKSk7Citsb25nICAgIFpDQUxMQkFDSyB3aW4zMl9zZWVrNjRfZmlsZV9mdW5jICBPRigodm9pZHBmIG9wYXF1ZSwgdm9pZHBmIHN0cmVhbSwgWlBPUzY0X1Qgb2Zmc2V0LCBpbnQgb3JpZ2luKSk7CitpbnQgICAgIFpDQUxMQkFDSyB3aW4zMl9jbG9zZV9maWxlX2Z1bmMgT0YoKHZvaWRwZiBvcGFxdWUsIHZvaWRwZiBzdHJlYW0pKTsKK2ludCAgICAgWkNBTExCQUNLIHdpbjMyX2Vycm9yX2ZpbGVfZnVuYyBPRigodm9pZHBmIG9wYXF1ZSwgdm9pZHBmIHN0cmVhbSkpOworCit0eXBlZGVmIHN0cnVjdAoreworICAgIEhBTkRMRSBoZjsKKyAgICBpbnQgZXJyb3I7Cit9IFdJTjMyRklMRV9JT1dJTjsKKworCitzdGF0aWMgdm9pZCB3aW4zMl90cmFuc2xhdGVfb3Blbl9tb2RlKGludCBtb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCogbHBkd0Rlc2lyZWRBY2Nlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEKiBscGR3Q3JlYXRpb25EaXNwb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQqIGxwZHdTaGFyZU1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEKiBscGR3RmxhZ3NBbmRBdHRyaWJ1dGVzKQoreworICAgICpscGR3RGVzaXJlZEFjY2VzcyA9ICpscGR3U2hhcmVNb2RlID0gKmxwZHdGbGFnc0FuZEF0dHJpYnV0ZXMgPSAqbHBkd0NyZWF0aW9uRGlzcG9zaXRpb24gPSAwOworCisgICAgaWYgKChtb2RlICYgWkxJQl9GSUxFRlVOQ19NT0RFX1JFQURXUklURUZJTFRFUik9PVpMSUJfRklMRUZVTkNfTU9ERV9SRUFEKQorICAgIHsKKyAgICAgICAgKmxwZHdEZXNpcmVkQWNjZXNzID0gR0VORVJJQ19SRUFEOworICAgICAgICAqbHBkd0NyZWF0aW9uRGlzcG9zaXRpb24gPSBPUEVOX0VYSVNUSU5HOworICAgICAgICAqbHBkd1NoYXJlTW9kZSA9IEZJTEVfU0hBUkVfUkVBRDsKKyAgICB9CisgICAgZWxzZSBpZiAobW9kZSAmIFpMSUJfRklMRUZVTkNfTU9ERV9FWElTVElORykKKyAgICB7CisgICAgICAgICpscGR3RGVzaXJlZEFjY2VzcyA9IEdFTkVSSUNfV1JJVEUgfCBHRU5FUklDX1JFQUQ7CisgICAgICAgICpscGR3Q3JlYXRpb25EaXNwb3NpdGlvbiA9IE9QRU5fRVhJU1RJTkc7CisgICAgfQorICAgIGVsc2UgaWYgKG1vZGUgJiBaTElCX0ZJTEVGVU5DX01PREVfQ1JFQVRFKQorICAgIHsKKyAgICAgICAgKmxwZHdEZXNpcmVkQWNjZXNzID0gR0VORVJJQ19XUklURSB8IEdFTkVSSUNfUkVBRDsKKyAgICAgICAgKmxwZHdDcmVhdGlvbkRpc3Bvc2l0aW9uID0gQ1JFQVRFX0FMV0FZUzsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkcGYgd2luMzJfYnVpbGRfaW93aW4oSEFORExFIGhGaWxlKQoreworICAgIHZvaWRwZiByZXQ9TlVMTDsKKworICAgIGlmICgoaEZpbGUgIT0gTlVMTCkgJiYgKGhGaWxlICE9IElOVkFMSURfSEFORExFX1ZBTFVFKSkKKyAgICB7CisgICAgICAgIFdJTjMyRklMRV9JT1dJTiB3MzJmaW93OworICAgICAgICB3MzJmaW93LmhmID0gaEZpbGU7CisgICAgICAgIHczMmZpb3cuZXJyb3IgPSAwOworICAgICAgICByZXQgPSBtYWxsb2Moc2l6ZW9mKFdJTjMyRklMRV9JT1dJTikpOworCisgICAgICAgIGlmIChyZXQ9PU5VTEwpCisgICAgICAgICAgICBDbG9zZUhhbmRsZShoRmlsZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICooKFdJTjMyRklMRV9JT1dJTiopcmV0KSA9IHczMmZpb3c7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK3ZvaWRwZiBaQ0FMTEJBQ0sgd2luMzJfb3BlbjY0X2ZpbGVfZnVuYyAodm9pZHBmIG9wYXF1ZSxjb25zdCB2b2lkKiBmaWxlbmFtZSxpbnQgbW9kZSkKK3sKKyAgICBjb25zdCBjaGFyKiBtb2RlX2ZvcGVuID0gTlVMTDsKKyAgICBEV09SRCBkd0Rlc2lyZWRBY2Nlc3MsZHdDcmVhdGlvbkRpc3Bvc2l0aW9uLGR3U2hhcmVNb2RlLGR3RmxhZ3NBbmRBdHRyaWJ1dGVzIDsKKyAgICBIQU5ETEUgaEZpbGUgPSBOVUxMOworCisgICAgd2luMzJfdHJhbnNsYXRlX29wZW5fbW9kZShtb2RlLCZkd0Rlc2lyZWRBY2Nlc3MsJmR3Q3JlYXRpb25EaXNwb3NpdGlvbiwmZHdTaGFyZU1vZGUsJmR3RmxhZ3NBbmRBdHRyaWJ1dGVzKTsKKworICAgIGlmICgoZmlsZW5hbWUhPU5VTEwpICYmIChkd0Rlc2lyZWRBY2Nlc3MgIT0gMCkpCisgICAgICAgIGhGaWxlID0gQ3JlYXRlRmlsZSgoTFBDVFNUUilmaWxlbmFtZSwgZHdEZXNpcmVkQWNjZXNzLCBkd1NoYXJlTW9kZSwgTlVMTCwgZHdDcmVhdGlvbkRpc3Bvc2l0aW9uLCBkd0ZsYWdzQW5kQXR0cmlidXRlcywgTlVMTCk7CisKKyAgICByZXR1cm4gd2luMzJfYnVpbGRfaW93aW4oaEZpbGUpOworfQorCisKK3ZvaWRwZiBaQ0FMTEJBQ0sgd2luMzJfb3BlbjY0X2ZpbGVfZnVuY0EgKHZvaWRwZiBvcGFxdWUsY29uc3Qgdm9pZCogZmlsZW5hbWUsaW50IG1vZGUpCit7CisgICAgY29uc3QgY2hhciogbW9kZV9mb3BlbiA9IE5VTEw7CisgICAgRFdPUkQgZHdEZXNpcmVkQWNjZXNzLGR3Q3JlYXRpb25EaXNwb3NpdGlvbixkd1NoYXJlTW9kZSxkd0ZsYWdzQW5kQXR0cmlidXRlcyA7CisgICAgSEFORExFIGhGaWxlID0gTlVMTDsKKworICAgIHdpbjMyX3RyYW5zbGF0ZV9vcGVuX21vZGUobW9kZSwmZHdEZXNpcmVkQWNjZXNzLCZkd0NyZWF0aW9uRGlzcG9zaXRpb24sJmR3U2hhcmVNb2RlLCZkd0ZsYWdzQW5kQXR0cmlidXRlcyk7CisKKyAgICBpZiAoKGZpbGVuYW1lIT1OVUxMKSAmJiAoZHdEZXNpcmVkQWNjZXNzICE9IDApKQorICAgICAgICBoRmlsZSA9IENyZWF0ZUZpbGVBKChMUENTVFIpZmlsZW5hbWUsIGR3RGVzaXJlZEFjY2VzcywgZHdTaGFyZU1vZGUsIE5VTEwsIGR3Q3JlYXRpb25EaXNwb3NpdGlvbiwgZHdGbGFnc0FuZEF0dHJpYnV0ZXMsIE5VTEwpOworCisgICAgcmV0dXJuIHdpbjMyX2J1aWxkX2lvd2luKGhGaWxlKTsKK30KKworCit2b2lkcGYgWkNBTExCQUNLIHdpbjMyX29wZW42NF9maWxlX2Z1bmNXICh2b2lkcGYgb3BhcXVlLGNvbnN0IHZvaWQqIGZpbGVuYW1lLGludCBtb2RlKQoreworICAgIGNvbnN0IGNoYXIqIG1vZGVfZm9wZW4gPSBOVUxMOworICAgIERXT1JEIGR3RGVzaXJlZEFjY2Vzcyxkd0NyZWF0aW9uRGlzcG9zaXRpb24sZHdTaGFyZU1vZGUsZHdGbGFnc0FuZEF0dHJpYnV0ZXMgOworICAgIEhBTkRMRSBoRmlsZSA9IE5VTEw7CisKKyAgICB3aW4zMl90cmFuc2xhdGVfb3Blbl9tb2RlKG1vZGUsJmR3RGVzaXJlZEFjY2VzcywmZHdDcmVhdGlvbkRpc3Bvc2l0aW9uLCZkd1NoYXJlTW9kZSwmZHdGbGFnc0FuZEF0dHJpYnV0ZXMpOworCisgICAgaWYgKChmaWxlbmFtZSE9TlVMTCkgJiYgKGR3RGVzaXJlZEFjY2VzcyAhPSAwKSkKKyAgICAgICAgaEZpbGUgPSBDcmVhdGVGaWxlVygoTFBDV1NUUilmaWxlbmFtZSwgZHdEZXNpcmVkQWNjZXNzLCBkd1NoYXJlTW9kZSwgTlVMTCwgZHdDcmVhdGlvbkRpc3Bvc2l0aW9uLCBkd0ZsYWdzQW5kQXR0cmlidXRlcywgTlVMTCk7CisKKyAgICByZXR1cm4gd2luMzJfYnVpbGRfaW93aW4oaEZpbGUpOworfQorCisKK3ZvaWRwZiBaQ0FMTEJBQ0sgd2luMzJfb3Blbl9maWxlX2Z1bmMgKHZvaWRwZiBvcGFxdWUsY29uc3QgY2hhciogZmlsZW5hbWUsaW50IG1vZGUpCit7CisgICAgY29uc3QgY2hhciogbW9kZV9mb3BlbiA9IE5VTEw7CisgICAgRFdPUkQgZHdEZXNpcmVkQWNjZXNzLGR3Q3JlYXRpb25EaXNwb3NpdGlvbixkd1NoYXJlTW9kZSxkd0ZsYWdzQW5kQXR0cmlidXRlcyA7CisgICAgSEFORExFIGhGaWxlID0gTlVMTDsKKworICAgIHdpbjMyX3RyYW5zbGF0ZV9vcGVuX21vZGUobW9kZSwmZHdEZXNpcmVkQWNjZXNzLCZkd0NyZWF0aW9uRGlzcG9zaXRpb24sJmR3U2hhcmVNb2RlLCZkd0ZsYWdzQW5kQXR0cmlidXRlcyk7CisKKyAgICBpZiAoKGZpbGVuYW1lIT1OVUxMKSAmJiAoZHdEZXNpcmVkQWNjZXNzICE9IDApKQorICAgICAgICBoRmlsZSA9IENyZWF0ZUZpbGUoKExQQ1RTVFIpZmlsZW5hbWUsIGR3RGVzaXJlZEFjY2VzcywgZHdTaGFyZU1vZGUsIE5VTEwsIGR3Q3JlYXRpb25EaXNwb3NpdGlvbiwgZHdGbGFnc0FuZEF0dHJpYnV0ZXMsIE5VTEwpOworCisgICAgcmV0dXJuIHdpbjMyX2J1aWxkX2lvd2luKGhGaWxlKTsKK30KKworCit1TG9uZyBaQ0FMTEJBQ0sgd2luMzJfcmVhZF9maWxlX2Z1bmMgKHZvaWRwZiBvcGFxdWUsIHZvaWRwZiBzdHJlYW0sIHZvaWQqIGJ1Zix1TG9uZyBzaXplKQoreworICAgIHVMb25nIHJldD0wOworICAgIEhBTkRMRSBoRmlsZSA9IE5VTEw7CisgICAgaWYgKHN0cmVhbSE9TlVMTCkKKyAgICAgICAgaEZpbGUgPSAoKFdJTjMyRklMRV9JT1dJTiopc3RyZWFtKSAtPiBoZjsKKworICAgIGlmIChoRmlsZSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKCFSZWFkRmlsZShoRmlsZSwgYnVmLCBzaXplLCAmcmV0LCBOVUxMKSkKKyAgICAgICAgeworICAgICAgICAgICAgRFdPUkQgZHdFcnIgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgICAgIGlmIChkd0VyciA9PSBFUlJPUl9IQU5ETEVfRU9GKQorICAgICAgICAgICAgICAgIGR3RXJyID0gMDsKKyAgICAgICAgICAgICgoV0lOMzJGSUxFX0lPV0lOKilzdHJlYW0pIC0+IGVycm9yPShpbnQpZHdFcnI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCisKK3VMb25nIFpDQUxMQkFDSyB3aW4zMl93cml0ZV9maWxlX2Z1bmMgKHZvaWRwZiBvcGFxdWUsdm9pZHBmIHN0cmVhbSxjb25zdCB2b2lkKiBidWYsdUxvbmcgc2l6ZSkKK3sKKyAgICB1TG9uZyByZXQ9MDsKKyAgICBIQU5ETEUgaEZpbGUgPSBOVUxMOworICAgIGlmIChzdHJlYW0hPU5VTEwpCisgICAgICAgIGhGaWxlID0gKChXSU4zMkZJTEVfSU9XSU4qKXN0cmVhbSkgLT4gaGY7CisKKyAgICBpZiAoaEZpbGUgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmICghV3JpdGVGaWxlKGhGaWxlLCBidWYsIHNpemUsICZyZXQsIE5VTEwpKQorICAgICAgICB7CisgICAgICAgICAgICBEV09SRCBkd0VyciA9IEdldExhc3RFcnJvcigpOworICAgICAgICAgICAgaWYgKGR3RXJyID09IEVSUk9SX0hBTkRMRV9FT0YpCisgICAgICAgICAgICAgICAgZHdFcnIgPSAwOworICAgICAgICAgICAgKChXSU4zMkZJTEVfSU9XSU4qKXN0cmVhbSkgLT4gZXJyb3I9KGludClkd0VycjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK2xvbmcgWkNBTExCQUNLIHdpbjMyX3RlbGxfZmlsZV9mdW5jICh2b2lkcGYgb3BhcXVlLHZvaWRwZiBzdHJlYW0pCit7CisgICAgbG9uZyByZXQ9LTE7CisgICAgSEFORExFIGhGaWxlID0gTlVMTDsKKyAgICBpZiAoc3RyZWFtIT1OVUxMKQorICAgICAgICBoRmlsZSA9ICgoV0lOMzJGSUxFX0lPV0lOKilzdHJlYW0pIC0+IGhmOworICAgIGlmIChoRmlsZSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgRFdPUkQgZHdTZXQgPSBTZXRGaWxlUG9pbnRlcihoRmlsZSwgMCwgTlVMTCwgRklMRV9DVVJSRU5UKTsKKyAgICAgICAgaWYgKGR3U2V0ID09IElOVkFMSURfU0VUX0ZJTEVfUE9JTlRFUikKKyAgICAgICAgeworICAgICAgICAgICAgRFdPUkQgZHdFcnIgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgICAgICgoV0lOMzJGSUxFX0lPV0lOKilzdHJlYW0pIC0+IGVycm9yPShpbnQpZHdFcnI7CisgICAgICAgICAgICByZXQgPSAtMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICByZXQ9KGxvbmcpZHdTZXQ7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK1pQT1M2NF9UIFpDQUxMQkFDSyB3aW4zMl90ZWxsNjRfZmlsZV9mdW5jICh2b2lkcGYgb3BhcXVlLCB2b2lkcGYgc3RyZWFtKQoreworICAgIFpQT1M2NF9UIHJldD0gKFpQT1M2NF9UKS0xOworICAgIEhBTkRMRSBoRmlsZSA9IE5VTEw7CisgICAgaWYgKHN0cmVhbSE9TlVMTCkKKyAgICAgICAgaEZpbGUgPSAoKFdJTjMyRklMRV9JT1dJTiopc3RyZWFtKS0+aGY7CisKKyAgICBpZiAoaEZpbGUpCisgICAgeworICAgICAgICBMQVJHRV9JTlRFR0VSIGxpOworICAgICAgICBsaS5RdWFkUGFydCA9IDA7CisgICAgICAgIGxpLnUuTG93UGFydCA9IFNldEZpbGVQb2ludGVyKGhGaWxlLCBsaS51Lkxvd1BhcnQsICZsaS51LkhpZ2hQYXJ0LCBGSUxFX0NVUlJFTlQpOworICAgICAgICBpZiAoIChsaS5Mb3dQYXJ0ID09IDB4RkZGRkZGRkYpICYmIChHZXRMYXN0RXJyb3IoKSAhPSBOT19FUlJPUikpCisgICAgICAgIHsKKyAgICAgICAgICAgIERXT1JEIGR3RXJyID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgICAgICAoKFdJTjMyRklMRV9JT1dJTiopc3RyZWFtKSAtPiBlcnJvcj0oaW50KWR3RXJyOworICAgICAgICAgICAgcmV0ID0gKFpQT1M2NF9UKS0xOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldD1saS5RdWFkUGFydDsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworCitsb25nIFpDQUxMQkFDSyB3aW4zMl9zZWVrX2ZpbGVfZnVuYyAodm9pZHBmIG9wYXF1ZSx2b2lkcGYgc3RyZWFtLHVMb25nIG9mZnNldCxpbnQgb3JpZ2luKQoreworICAgIERXT1JEIGR3TW92ZU1ldGhvZD0weEZGRkZGRkZGOworICAgIEhBTkRMRSBoRmlsZSA9IE5VTEw7CisKKyAgICBsb25nIHJldD0tMTsKKyAgICBpZiAoc3RyZWFtIT1OVUxMKQorICAgICAgICBoRmlsZSA9ICgoV0lOMzJGSUxFX0lPV0lOKilzdHJlYW0pIC0+IGhmOworICAgIHN3aXRjaCAob3JpZ2luKQorICAgIHsKKyAgICBjYXNlIFpMSUJfRklMRUZVTkNfU0VFS19DVVIgOgorICAgICAgICBkd01vdmVNZXRob2QgPSBGSUxFX0NVUlJFTlQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgWkxJQl9GSUxFRlVOQ19TRUVLX0VORCA6CisgICAgICAgIGR3TW92ZU1ldGhvZCA9IEZJTEVfRU5EOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFpMSUJfRklMRUZVTkNfU0VFS19TRVQgOgorICAgICAgICBkd01vdmVNZXRob2QgPSBGSUxFX0JFR0lOOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OiByZXR1cm4gLTE7CisgICAgfQorCisgICAgaWYgKGhGaWxlICE9IE5VTEwpCisgICAgeworICAgICAgICBEV09SRCBkd1NldCA9IFNldEZpbGVQb2ludGVyKGhGaWxlLCBvZmZzZXQsIE5VTEwsIGR3TW92ZU1ldGhvZCk7CisgICAgICAgIGlmIChkd1NldCA9PSBJTlZBTElEX1NFVF9GSUxFX1BPSU5URVIpCisgICAgICAgIHsKKyAgICAgICAgICAgIERXT1JEIGR3RXJyID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgICAgICAoKFdJTjMyRklMRV9JT1dJTiopc3RyZWFtKSAtPiBlcnJvcj0oaW50KWR3RXJyOworICAgICAgICAgICAgcmV0ID0gLTE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0PTA7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK2xvbmcgWkNBTExCQUNLIHdpbjMyX3NlZWs2NF9maWxlX2Z1bmMgKHZvaWRwZiBvcGFxdWUsIHZvaWRwZiBzdHJlYW0sWlBPUzY0X1Qgb2Zmc2V0LGludCBvcmlnaW4pCit7CisgICAgRFdPUkQgZHdNb3ZlTWV0aG9kPTB4RkZGRkZGRkY7CisgICAgSEFORExFIGhGaWxlID0gTlVMTDsKKyAgICBsb25nIHJldD0tMTsKKworICAgIGlmIChzdHJlYW0hPU5VTEwpCisgICAgICAgIGhGaWxlID0gKChXSU4zMkZJTEVfSU9XSU4qKXN0cmVhbSktPmhmOworCisgICAgc3dpdGNoIChvcmlnaW4pCisgICAgeworICAgICAgICBjYXNlIFpMSUJfRklMRUZVTkNfU0VFS19DVVIgOgorICAgICAgICAgICAgZHdNb3ZlTWV0aG9kID0gRklMRV9DVVJSRU5UOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgWkxJQl9GSUxFRlVOQ19TRUVLX0VORCA6CisgICAgICAgICAgICBkd01vdmVNZXRob2QgPSBGSUxFX0VORDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFpMSUJfRklMRUZVTkNfU0VFS19TRVQgOgorICAgICAgICAgICAgZHdNb3ZlTWV0aG9kID0gRklMRV9CRUdJTjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OiByZXR1cm4gLTE7CisgICAgfQorCisgICAgaWYgKGhGaWxlKQorICAgIHsKKyAgICAgICAgTEFSR0VfSU5URUdFUiogbGkgPSAoTEFSR0VfSU5URUdFUiopJm9mZnNldDsKKyAgICAgICAgRFdPUkQgZHdTZXQgPSBTZXRGaWxlUG9pbnRlcihoRmlsZSwgbGktPnUuTG93UGFydCwgJmxpLT51LkhpZ2hQYXJ0LCBkd01vdmVNZXRob2QpOworICAgICAgICBpZiAoZHdTZXQgPT0gSU5WQUxJRF9TRVRfRklMRV9QT0lOVEVSKQorICAgICAgICB7CisgICAgICAgICAgICBEV09SRCBkd0VyciA9IEdldExhc3RFcnJvcigpOworICAgICAgICAgICAgKChXSU4zMkZJTEVfSU9XSU4qKXN0cmVhbSkgLT4gZXJyb3I9KGludClkd0VycjsKKyAgICAgICAgICAgIHJldCA9IC0xOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldD0wOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitpbnQgWkNBTExCQUNLIHdpbjMyX2Nsb3NlX2ZpbGVfZnVuYyAodm9pZHBmIG9wYXF1ZSwgdm9pZHBmIHN0cmVhbSkKK3sKKyAgICBpbnQgcmV0PS0xOworCisgICAgaWYgKHN0cmVhbSE9TlVMTCkKKyAgICB7CisgICAgICAgIEhBTkRMRSBoRmlsZTsKKyAgICAgICAgaEZpbGUgPSAoKFdJTjMyRklMRV9JT1dJTiopc3RyZWFtKSAtPiBoZjsKKyAgICAgICAgaWYgKGhGaWxlICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIENsb3NlSGFuZGxlKGhGaWxlKTsKKyAgICAgICAgICAgIHJldD0wOworICAgICAgICB9CisgICAgICAgIGZyZWUoc3RyZWFtKTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworaW50IFpDQUxMQkFDSyB3aW4zMl9lcnJvcl9maWxlX2Z1bmMgKHZvaWRwZiBvcGFxdWUsdm9pZHBmIHN0cmVhbSkKK3sKKyAgICBpbnQgcmV0PS0xOworICAgIGlmIChzdHJlYW0hPU5VTEwpCisgICAgeworICAgICAgICByZXQgPSAoKFdJTjMyRklMRV9JT1dJTiopc3RyZWFtKSAtPiBlcnJvcjsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKwordm9pZCBmaWxsX3dpbjMyX2ZpbGVmdW5jICh6bGliX2ZpbGVmdW5jX2RlZiogcHpsaWJfZmlsZWZ1bmNfZGVmKQoreworICAgIHB6bGliX2ZpbGVmdW5jX2RlZi0+em9wZW5fZmlsZSA9IHdpbjMyX29wZW5fZmlsZV9mdW5jOworICAgIHB6bGliX2ZpbGVmdW5jX2RlZi0+enJlYWRfZmlsZSA9IHdpbjMyX3JlYWRfZmlsZV9mdW5jOworICAgIHB6bGliX2ZpbGVmdW5jX2RlZi0+endyaXRlX2ZpbGUgPSB3aW4zMl93cml0ZV9maWxlX2Z1bmM7CisgICAgcHpsaWJfZmlsZWZ1bmNfZGVmLT56dGVsbF9maWxlID0gd2luMzJfdGVsbF9maWxlX2Z1bmM7CisgICAgcHpsaWJfZmlsZWZ1bmNfZGVmLT56c2Vla19maWxlID0gd2luMzJfc2Vla19maWxlX2Z1bmM7CisgICAgcHpsaWJfZmlsZWZ1bmNfZGVmLT56Y2xvc2VfZmlsZSA9IHdpbjMyX2Nsb3NlX2ZpbGVfZnVuYzsKKyAgICBwemxpYl9maWxlZnVuY19kZWYtPnplcnJvcl9maWxlID0gd2luMzJfZXJyb3JfZmlsZV9mdW5jOworICAgIHB6bGliX2ZpbGVmdW5jX2RlZi0+b3BhcXVlID0gTlVMTDsKK30KKwordm9pZCBmaWxsX3dpbjMyX2ZpbGVmdW5jNjQoemxpYl9maWxlZnVuYzY0X2RlZiogcHpsaWJfZmlsZWZ1bmNfZGVmKQoreworICAgIHB6bGliX2ZpbGVmdW5jX2RlZi0+em9wZW42NF9maWxlID0gd2luMzJfb3BlbjY0X2ZpbGVfZnVuYzsKKyAgICBwemxpYl9maWxlZnVuY19kZWYtPnpyZWFkX2ZpbGUgPSB3aW4zMl9yZWFkX2ZpbGVfZnVuYzsKKyAgICBwemxpYl9maWxlZnVuY19kZWYtPnp3cml0ZV9maWxlID0gd2luMzJfd3JpdGVfZmlsZV9mdW5jOworICAgIHB6bGliX2ZpbGVmdW5jX2RlZi0+enRlbGw2NF9maWxlID0gd2luMzJfdGVsbDY0X2ZpbGVfZnVuYzsKKyAgICBwemxpYl9maWxlZnVuY19kZWYtPnpzZWVrNjRfZmlsZSA9IHdpbjMyX3NlZWs2NF9maWxlX2Z1bmM7CisgICAgcHpsaWJfZmlsZWZ1bmNfZGVmLT56Y2xvc2VfZmlsZSA9IHdpbjMyX2Nsb3NlX2ZpbGVfZnVuYzsKKyAgICBwemxpYl9maWxlZnVuY19kZWYtPnplcnJvcl9maWxlID0gd2luMzJfZXJyb3JfZmlsZV9mdW5jOworICAgIHB6bGliX2ZpbGVmdW5jX2RlZi0+b3BhcXVlID0gTlVMTDsKK30KKworCit2b2lkIGZpbGxfd2luMzJfZmlsZWZ1bmM2NEEoemxpYl9maWxlZnVuYzY0X2RlZiogcHpsaWJfZmlsZWZ1bmNfZGVmKQoreworICAgIHB6bGliX2ZpbGVmdW5jX2RlZi0+em9wZW42NF9maWxlID0gd2luMzJfb3BlbjY0X2ZpbGVfZnVuY0E7CisgICAgcHpsaWJfZmlsZWZ1bmNfZGVmLT56cmVhZF9maWxlID0gd2luMzJfcmVhZF9maWxlX2Z1bmM7CisgICAgcHpsaWJfZmlsZWZ1bmNfZGVmLT56d3JpdGVfZmlsZSA9IHdpbjMyX3dyaXRlX2ZpbGVfZnVuYzsKKyAgICBwemxpYl9maWxlZnVuY19kZWYtPnp0ZWxsNjRfZmlsZSA9IHdpbjMyX3RlbGw2NF9maWxlX2Z1bmM7CisgICAgcHpsaWJfZmlsZWZ1bmNfZGVmLT56c2VlazY0X2ZpbGUgPSB3aW4zMl9zZWVrNjRfZmlsZV9mdW5jOworICAgIHB6bGliX2ZpbGVmdW5jX2RlZi0+emNsb3NlX2ZpbGUgPSB3aW4zMl9jbG9zZV9maWxlX2Z1bmM7CisgICAgcHpsaWJfZmlsZWZ1bmNfZGVmLT56ZXJyb3JfZmlsZSA9IHdpbjMyX2Vycm9yX2ZpbGVfZnVuYzsKKyAgICBwemxpYl9maWxlZnVuY19kZWYtPm9wYXF1ZSA9IE5VTEw7Cit9CisKKwordm9pZCBmaWxsX3dpbjMyX2ZpbGVmdW5jNjRXKHpsaWJfZmlsZWZ1bmM2NF9kZWYqIHB6bGliX2ZpbGVmdW5jX2RlZikKK3sKKyAgICBwemxpYl9maWxlZnVuY19kZWYtPnpvcGVuNjRfZmlsZSA9IHdpbjMyX29wZW42NF9maWxlX2Z1bmNXOworICAgIHB6bGliX2ZpbGVmdW5jX2RlZi0+enJlYWRfZmlsZSA9IHdpbjMyX3JlYWRfZmlsZV9mdW5jOworICAgIHB6bGliX2ZpbGVmdW5jX2RlZi0+endyaXRlX2ZpbGUgPSB3aW4zMl93cml0ZV9maWxlX2Z1bmM7CisgICAgcHpsaWJfZmlsZWZ1bmNfZGVmLT56dGVsbDY0X2ZpbGUgPSB3aW4zMl90ZWxsNjRfZmlsZV9mdW5jOworICAgIHB6bGliX2ZpbGVmdW5jX2RlZi0+enNlZWs2NF9maWxlID0gd2luMzJfc2VlazY0X2ZpbGVfZnVuYzsKKyAgICBwemxpYl9maWxlZnVuY19kZWYtPnpjbG9zZV9maWxlID0gd2luMzJfY2xvc2VfZmlsZV9mdW5jOworICAgIHB6bGliX2ZpbGVmdW5jX2RlZi0+emVycm9yX2ZpbGUgPSB3aW4zMl9lcnJvcl9maWxlX2Z1bmM7CisgICAgcHpsaWJfZmlsZWZ1bmNfZGVmLT5vcGFxdWUgPSBOVUxMOworfQpkaWZmIC0tZ2l0IGEvemxpYi0xLjIuNi9jb250cmliL21pbml6aXAvaW93aW4zMi5oIGIvemxpYi0xLjIuNi9jb250cmliL21pbml6aXAvaW93aW4zMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjYTA5NjkKLS0tIC9kZXYvbnVsbAorKysgYi96bGliLTEuMi42L2NvbnRyaWIvbWluaXppcC9pb3dpbjMyLmgKQEAgLTAsMCArMSwyOCBAQAorLyogaW93aW4zMi5oIC0tIElPIGJhc2UgZnVuY3Rpb24gaGVhZGVyIGZvciBjb21wcmVzcy91bmNvbXByZXNzIC56aXAKKyAgICAgVmVyc2lvbiAxLjEsIEZlYnJ1YXJ5IDE0aCwgMjAxMAorICAgICBwYXJ0IG9mIHRoZSBNaW5pWmlwIHByb2plY3QgLSAoIGh0dHA6Ly93d3cud2luaW1hZ2UuY29tL3pMaWJEbGwvbWluaXppcC5odG1sICkKKworICAgICAgICAgQ29weXJpZ2h0IChDKSAxOTk4LTIwMTAgR2lsbGVzIFZvbGxhbnQgKG1pbml6aXApICggaHR0cDovL3d3dy53aW5pbWFnZS5jb20vekxpYkRsbC9taW5pemlwLmh0bWwgKQorCisgICAgICAgICBNb2RpZmljYXRpb25zIGZvciBaaXA2NCBzdXBwb3J0CisgICAgICAgICBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMCBNYXRoaWFzIFN2ZW5zc29uICggaHR0cDovL3Jlc3VsdDQyLmNvbSApCisKKyAgICAgICAgIEZvciBtb3JlIGluZm8gcmVhZCBNaW5pWmlwX2luZm8udHh0CisKKyovCisKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCit2b2lkIGZpbGxfd2luMzJfZmlsZWZ1bmMgT0YoKHpsaWJfZmlsZWZ1bmNfZGVmKiBwemxpYl9maWxlZnVuY19kZWYpKTsKK3ZvaWQgZmlsbF93aW4zMl9maWxlZnVuYzY0IE9GKCh6bGliX2ZpbGVmdW5jNjRfZGVmKiBwemxpYl9maWxlZnVuY19kZWYpKTsKK3ZvaWQgZmlsbF93aW4zMl9maWxlZnVuYzY0QSBPRigoemxpYl9maWxlZnVuYzY0X2RlZiogcHpsaWJfZmlsZWZ1bmNfZGVmKSk7Cit2b2lkIGZpbGxfd2luMzJfZmlsZWZ1bmM2NFcgT0YoKHpsaWJfZmlsZWZ1bmM2NF9kZWYqIHB6bGliX2ZpbGVmdW5jX2RlZikpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvemxpYi0xLjIuNi9jb250cmliL21pbml6aXAvbWFrZV92bXMuY29tIGIvemxpYi0xLjIuNi9jb250cmliL21pbml6aXAvbWFrZV92bXMuY29tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhYzEzYTkKLS0tIC9kZXYvbnVsbAorKysgYi96bGliLTEuMi42L2NvbnRyaWIvbWluaXppcC9tYWtlX3Ztcy5jb20KQEAgLTAsMCArMSwyNSBAQAorJCBpZiBmJHNlYXJjaCgiaW9hcGkuaF9vcmlnIikgLmVxcy4gIiIgdGhlbiBjb3B5IGlvYXBpLmggaW9hcGkuaF9vcmlnCiskIG9wZW4vd3JpdGUgemRlZiB2bXNkZWZzLmgKKyQgY29weSBzeXMkaW5wdXQ6IHpkZWYKKyQgZGVjaworI2RlZmluZSB1bml4CisjZGVmaW5lIGZpbGxfemxpYl9maWxlZnVuYzY0XzMyX2RlZl9mcm9tX2ZpbGVmdW5jMzIgZmlsbHpmZnVuYzY0ZnJvbQorI2RlZmluZSBXcml0ZV9aaXA2NEVuZE9mQ2VudHJhbERpcmVjdG9yeUxvY2F0b3IgV3JpdGVfWmlwNjRFb0RMb2NhdG9yCisjZGVmaW5lIFdyaXRlX1ppcDY0RW5kT2ZDZW50cmFsRGlyZWN0b3J5UmVjb3JkIFdyaXRlX1ppcDY0RW9EUmVjb3JkCisjZGVmaW5lIFdyaXRlX0VuZE9mQ2VudHJhbERpcmVjdG9yeVJlY29yZCBXcml0ZV9Fb0RSZWNvcmQKKyQgZW9kCiskIGNsb3NlIHpkZWYKKyQgY29weSB2bXNkZWZzLmgsaW9hcGkuaF9vcmlnIGlvYXBpLmgKKyQgY2MvaW5jbHVkZT1bLS1dL3ByZWZpeD1hbGwgaW9hcGkuYworJCBjYy9pbmNsdWRlPVstLV0vcHJlZml4PWFsbCBtaW5pdW56LmMKKyQgY2MvaW5jbHVkZT1bLS1dL3ByZWZpeD1hbGwgdW56aXAuYworJCBjYy9pbmNsdWRlPVstLV0vcHJlZml4PWFsbCBtaW5pemlwLmMKKyQgY2MvaW5jbHVkZT1bLS1dL3ByZWZpeD1hbGwgemlwLmMKKyQgbGluayBtaW5pdW56LHVuemlwLGlvYXBpLFstLV1saWJ6Lm9sYi9saWIKKyQgbGluayBtaW5pemlwLHppcCxpb2FwaSxbLS1dbGliei5vbGIvbGliCiskIG1jciBbXW1pbml6aXAgdGVzdCBtaW5pemlwX2luZm8udHh0CiskIG1jciBbXW1pbml1bnogLWwgdGVzdC56aXAKKyQgcmVuYW1lIG1pbml6aXBfaW5mby50eHQ7IG1pbml6aXBfaW5mby50eHRfb2xkCiskIG1jciBbXW1pbml1bnogdGVzdC56aXAKKyQgZGVsZXRlIHRlc3QuemlwOyoKKyRleGl0CmRpZmYgLS1naXQgYS96bGliLTEuMi42L2NvbnRyaWIvbWluaXppcC9taW5pdW56LmMgYi96bGliLTEuMi42L2NvbnRyaWIvbWluaXppcC9taW5pdW56LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q2NTQwMQotLS0gL2Rldi9udWxsCisrKyBiL3psaWItMS4yLjYvY29udHJpYi9taW5pemlwL21pbml1bnouYwpAQCAtMCwwICsxLDY2MCBAQAorLyoKKyAgIG1pbml1bnouYworICAgVmVyc2lvbiAxLjEsIEZlYnJ1YXJ5IDE0aCwgMjAxMAorICAgc2FtcGxlIHBhcnQgb2YgdGhlIE1pbmlaaXAgcHJvamVjdCAtICggaHR0cDovL3d3dy53aW5pbWFnZS5jb20vekxpYkRsbC9taW5pemlwLmh0bWwgKQorCisgICAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTgtMjAxMCBHaWxsZXMgVm9sbGFudCAobWluaXppcCkgKCBodHRwOi8vd3d3LndpbmltYWdlLmNvbS96TGliRGxsL21pbml6aXAuaHRtbCApCisKKyAgICAgICAgIE1vZGlmaWNhdGlvbnMgb2YgVW56aXAgZm9yIFppcDY0CisgICAgICAgICBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBFdmVuIFJvdWF1bHQKKworICAgICAgICAgTW9kaWZpY2F0aW9ucyBmb3IgWmlwNjQgc3VwcG9ydCBvbiBib3RoIHppcCBhbmQgdW56aXAKKyAgICAgICAgIENvcHlyaWdodCAoQykgMjAwOS0yMDEwIE1hdGhpYXMgU3ZlbnNzb24gKCBodHRwOi8vcmVzdWx0NDIuY29tICkKKyovCisKKyNpZiAoIWRlZmluZWQoX1dJTjMyKSkgJiYgKCFkZWZpbmVkKFdJTjMyKSkgJiYgKCFkZWZpbmVkKF9fQVBQTEVfXykpCisgICAgICAgICNpZm5kZWYgX19VU0VfRklMRV9PRkZTRVQ2NAorICAgICAgICAgICAgICAgICNkZWZpbmUgX19VU0VfRklMRV9PRkZTRVQ2NAorICAgICAgICAjZW5kaWYKKyAgICAgICAgI2lmbmRlZiBfX1VTRV9MQVJHRUZJTEU2NAorICAgICAgICAgICAgICAgICNkZWZpbmUgX19VU0VfTEFSR0VGSUxFNjQKKyAgICAgICAgI2VuZGlmCisgICAgICAgICNpZm5kZWYgX0xBUkdFRklMRTY0X1NPVVJDRQorICAgICAgICAgICAgICAgICNkZWZpbmUgX0xBUkdFRklMRTY0X1NPVVJDRQorICAgICAgICAjZW5kaWYKKyAgICAgICAgI2lmbmRlZiBfRklMRV9PRkZTRVRfQklUCisgICAgICAgICAgICAgICAgI2RlZmluZSBfRklMRV9PRkZTRVRfQklUIDY0CisgICAgICAgICNlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBfX0FQUExFX18KKy8vIEluIGRhcndpbiBhbmQgcGVyaGFwcyBvdGhlciBCU0QgdmFyaWFudHMgb2ZmX3QgaXMgYSA2NCBiaXQgdmFsdWUsIGhlbmNlIG5vIG5lZWQgZm9yIHNwZWNpZmljIDY0IGJpdCBmdW5jdGlvbnMKKyNkZWZpbmUgRk9QRU5fRlVOQyhmaWxlbmFtZSwgbW9kZSkgZm9wZW4oZmlsZW5hbWUsIG1vZGUpCisjZGVmaW5lIEZURUxMT19GVU5DKHN0cmVhbSkgZnRlbGxvKHN0cmVhbSkKKyNkZWZpbmUgRlNFRUtPX0ZVTkMoc3RyZWFtLCBvZmZzZXQsIG9yaWdpbikgZnNlZWtvKHN0cmVhbSwgb2Zmc2V0LCBvcmlnaW4pCisjZWxzZQorI2RlZmluZSBGT1BFTl9GVU5DKGZpbGVuYW1lLCBtb2RlKSBmb3BlbjY0KGZpbGVuYW1lLCBtb2RlKQorI2RlZmluZSBGVEVMTE9fRlVOQyhzdHJlYW0pIGZ0ZWxsbzY0KHN0cmVhbSkKKyNkZWZpbmUgRlNFRUtPX0ZVTkMoc3RyZWFtLCBvZmZzZXQsIG9yaWdpbikgZnNlZWtvNjQoc3RyZWFtLCBvZmZzZXQsIG9yaWdpbikKKyNlbmRpZgorCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisKKyNpZmRlZiBfV0lOMzIKKyMgaW5jbHVkZSA8ZGlyZWN0Lmg+CisjIGluY2x1ZGUgPGlvLmg+CisjZWxzZQorIyBpbmNsdWRlIDx1bmlzdGQuaD4KKyMgaW5jbHVkZSA8dXRpbWUuaD4KKyNlbmRpZgorCisKKyNpbmNsdWRlICJ1bnppcC5oIgorCisjZGVmaW5lIENBU0VTRU5TSVRJVklUWSAoMCkKKyNkZWZpbmUgV1JJVEVCVUZGRVJTSVpFICg4MTkyKQorI2RlZmluZSBNQVhGSUxFTkFNRSAoMjU2KQorCisjaWZkZWYgX1dJTjMyCisjZGVmaW5lIFVTRVdJTjMySU9BUEkKKyNpbmNsdWRlICJpb3dpbjMyLmgiCisjZW5kaWYKKy8qCisgIG1pbmkgdW56aXAsIGRlbW8gb2YgdW56aXAgcGFja2FnZQorCisgIHVzYWdlIDoKKyAgVXNhZ2UgOiBtaW5pdW56IFstZXh2bG9dIGZpbGUuemlwIFtmaWxlX3RvX2V4dHJhY3RdIFstZCBleHRyYWN0ZGlyXQorCisgIGxpc3QgdGhlIGZpbGUgaW4gdGhlIHppcGZpbGUsIGFuZCBwcmludCB0aGUgY29udGVudCBvZiBGSUxFX0lELlpJUCBvciBSRUFETUUuVFhUCisgICAgaWYgaXQgZXhpc3RzCisqLworCisKKy8qIGNoYW5nZV9maWxlX2RhdGUgOiBjaGFuZ2UgdGhlIGRhdGUvdGltZSBvZiBhIGZpbGUKKyAgICBmaWxlbmFtZSA6IHRoZSBmaWxlbmFtZSBvZiB0aGUgZmlsZSB3aGVyZSBkYXRlL3RpbWUgbXVzdCBiZSBtb2RpZmllZAorICAgIGRvc2RhdGUgOiB0aGUgbmV3IGRhdGUgYXQgdGhlIE1TRG9zIGZvcm1hdCAoNCBieXRlcykKKyAgICB0bXVfZGF0ZSA6IHRoZSBTQU1FIG5ldyBkYXRlIGF0IHRoZSB0bV91bnogZm9ybWF0ICovCit2b2lkIGNoYW5nZV9maWxlX2RhdGUoZmlsZW5hbWUsZG9zZGF0ZSx0bXVfZGF0ZSkKKyAgICBjb25zdCBjaGFyICpmaWxlbmFtZTsKKyAgICB1TG9uZyBkb3NkYXRlOworICAgIHRtX3VueiB0bXVfZGF0ZTsKK3sKKyNpZmRlZiBfV0lOMzIKKyAgSEFORExFIGhGaWxlOworICBGSUxFVElNRSBmdG0sZnRMb2NhbCxmdENyZWF0ZSxmdExhc3RBY2MsZnRMYXN0V3JpdGU7CisKKyAgaEZpbGUgPSBDcmVhdGVGaWxlQShmaWxlbmFtZSxHRU5FUklDX1JFQUQgfCBHRU5FUklDX1dSSVRFLAorICAgICAgICAgICAgICAgICAgICAgIDAsTlVMTCxPUEVOX0VYSVNUSU5HLDAsTlVMTCk7CisgIEdldEZpbGVUaW1lKGhGaWxlLCZmdENyZWF0ZSwmZnRMYXN0QWNjLCZmdExhc3RXcml0ZSk7CisgIERvc0RhdGVUaW1lVG9GaWxlVGltZSgoV09SRCkoZG9zZGF0ZT4+MTYpLChXT1JEKWRvc2RhdGUsJmZ0TG9jYWwpOworICBMb2NhbEZpbGVUaW1lVG9GaWxlVGltZSgmZnRMb2NhbCwmZnRtKTsKKyAgU2V0RmlsZVRpbWUoaEZpbGUsJmZ0bSwmZnRMYXN0QWNjLCZmdG0pOworICBDbG9zZUhhbmRsZShoRmlsZSk7CisjZWxzZQorI2lmZGVmIHVuaXggfHwgX19BUFBMRV9fCisgIHN0cnVjdCB1dGltYnVmIHV0OworICBzdHJ1Y3QgdG0gbmV3ZGF0ZTsKKyAgbmV3ZGF0ZS50bV9zZWMgPSB0bXVfZGF0ZS50bV9zZWM7CisgIG5ld2RhdGUudG1fbWluPXRtdV9kYXRlLnRtX21pbjsKKyAgbmV3ZGF0ZS50bV9ob3VyPXRtdV9kYXRlLnRtX2hvdXI7CisgIG5ld2RhdGUudG1fbWRheT10bXVfZGF0ZS50bV9tZGF5OworICBuZXdkYXRlLnRtX21vbj10bXVfZGF0ZS50bV9tb247CisgIGlmICh0bXVfZGF0ZS50bV95ZWFyID4gMTkwMCkKKyAgICAgIG5ld2RhdGUudG1feWVhcj10bXVfZGF0ZS50bV95ZWFyIC0gMTkwMDsKKyAgZWxzZQorICAgICAgbmV3ZGF0ZS50bV95ZWFyPXRtdV9kYXRlLnRtX3llYXIgOworICBuZXdkYXRlLnRtX2lzZHN0PS0xOworCisgIHV0LmFjdGltZT11dC5tb2R0aW1lPW1rdGltZSgmbmV3ZGF0ZSk7CisgIHV0aW1lKGZpbGVuYW1lLCZ1dCk7CisjZW5kaWYKKyNlbmRpZgorfQorCisKKy8qIG15bWtkaXIgYW5kIGNoYW5nZV9maWxlX2RhdGUgYXJlIG5vdCAxMDAgJSBwb3J0YWJsZQorICAgQXMgSSBkb24ndCBrbm93IHdlbGwgVW5peCwgSSB3YWl0IGZlZWRiYWNrIGZvciB0aGUgdW5peCBwb3J0aW9uICovCisKK2ludCBteW1rZGlyKGRpcm5hbWUpCisgICAgY29uc3QgY2hhciogZGlybmFtZTsKK3sKKyAgICBpbnQgcmV0PTA7CisjaWZkZWYgX1dJTjMyCisgICAgcmV0ID0gX21rZGlyKGRpcm5hbWUpOworI2VsaWYgdW5peAorICAgIHJldCA9IG1rZGlyIChkaXJuYW1lLDA3NzUpOworI2VsaWYgX19BUFBMRV9fCisgICAgcmV0ID0gbWtkaXIgKGRpcm5hbWUsMDc3NSk7CisjZW5kaWYKKyAgICByZXR1cm4gcmV0OworfQorCitpbnQgbWFrZWRpciAobmV3ZGlyKQorICAgIGNoYXIgKm5ld2RpcjsKK3sKKyAgY2hhciAqYnVmZmVyIDsKKyAgY2hhciAqcDsKKyAgaW50ICBsZW4gPSAoaW50KXN0cmxlbihuZXdkaXIpOworCisgIGlmIChsZW4gPD0gMCkKKyAgICByZXR1cm4gMDsKKworICBidWZmZXIgPSAoY2hhciopbWFsbG9jKGxlbisxKTsKKyAgICAgICAgaWYgKGJ1ZmZlcj09TlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIHByaW50ZigiRXJyb3IgYWxsb2NhdGluZyBtZW1vcnlcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBVTlpfSU5URVJOQUxFUlJPUjsKKyAgICAgICAgfQorICBzdHJjcHkoYnVmZmVyLG5ld2Rpcik7CisKKyAgaWYgKGJ1ZmZlcltsZW4tMV0gPT0gJy8nKSB7CisgICAgYnVmZmVyW2xlbi0xXSA9ICdcMCc7CisgIH0KKyAgaWYgKG15bWtkaXIoYnVmZmVyKSA9PSAwKQorICAgIHsKKyAgICAgIGZyZWUoYnVmZmVyKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKworICBwID0gYnVmZmVyKzE7CisgIHdoaWxlICgxKQorICAgIHsKKyAgICAgIGNoYXIgaG9sZDsKKworICAgICAgd2hpbGUoKnAgJiYgKnAgIT0gJ1xcJyAmJiAqcCAhPSAnLycpCisgICAgICAgIHArKzsKKyAgICAgIGhvbGQgPSAqcDsKKyAgICAgICpwID0gMDsKKyAgICAgIGlmICgobXlta2RpcihidWZmZXIpID09IC0xKSAmJiAoZXJybm8gPT0gRU5PRU5UKSkKKyAgICAgICAgeworICAgICAgICAgIHByaW50ZigiY291bGRuJ3QgY3JlYXRlIGRpcmVjdG9yeSAlc1xuIixidWZmZXIpOworICAgICAgICAgIGZyZWUoYnVmZmVyKTsKKyAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgaWYgKGhvbGQgPT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICAqcCsrID0gaG9sZDsKKyAgICB9CisgIGZyZWUoYnVmZmVyKTsKKyAgcmV0dXJuIDE7Cit9CisKK3ZvaWQgZG9fYmFubmVyKCkKK3sKKyAgICBwcmludGYoIk1pbmlVbnogMS4wMWIsIGRlbW8gb2YgekxpYiArIFVueiBwYWNrYWdlIHdyaXR0ZW4gYnkgR2lsbGVzIFZvbGxhbnRcbiIpOworICAgIHByaW50ZigibW9yZSBpbmZvIGF0IGh0dHA6Ly93d3cud2luaW1hZ2UuY29tL3pMaWJEbGwvdW56aXAuaHRtbFxuXG4iKTsKK30KKwordm9pZCBkb19oZWxwKCkKK3sKKyAgICBwcmludGYoIlVzYWdlIDogbWluaXVueiBbLWVdIFsteF0gWy12XSBbLWxdIFstb10gWy1wIHBhc3N3b3JkXSBmaWxlLnppcCBbZmlsZV90b19leHRyLl0gWy1kIGV4dHJhY3RkaXJdXG5cbiIgXAorICAgICAgICAgICAiICAtZSAgRXh0cmFjdCB3aXRob3V0IHBhdGhuYW1lIChqdW5rIHBhdGhzKVxuIiBcCisgICAgICAgICAgICIgIC14ICBFeHRyYWN0IHdpdGggcGF0aG5hbWVcbiIgXAorICAgICAgICAgICAiICAtdiAgbGlzdCBmaWxlc1xuIiBcCisgICAgICAgICAgICIgIC1sICBsaXN0IGZpbGVzXG4iIFwKKyAgICAgICAgICAgIiAgLWQgIGRpcmVjdG9yeSB0byBleHRyYWN0IGludG9cbiIgXAorICAgICAgICAgICAiICAtbyAgb3ZlcndyaXRlIGZpbGVzIHdpdGhvdXQgcHJvbXB0aW5nXG4iIFwKKyAgICAgICAgICAgIiAgLXAgIGV4dHJhY3QgY3J5cHRlZCBmaWxlIHVzaW5nIHBhc3N3b3JkXG5cbiIpOworfQorCit2b2lkIERpc3BsYXk2NEJpdHNTaXplKFpQT1M2NF9UIG4sIGludCBzaXplX2NoYXIpCit7CisgIC8qIHRvIGF2b2lkIGNvbXBhdGliaWxpdHkgcHJvYmxlbSAsIHdlIGRvIGhlcmUgdGhlIGNvbnZlcnNpb24gKi8KKyAgY2hhciBudW1iZXJbMjFdOworICBpbnQgb2Zmc2V0PTE5OworICBpbnQgcG9zX3N0cmluZyA9IDE5OworICBudW1iZXJbMjBdPTA7CisgIGZvciAoOzspIHsKKyAgICAgIG51bWJlcltvZmZzZXRdPShjaGFyKSgobiUxMCkrJzAnKTsKKyAgICAgIGlmIChudW1iZXJbb2Zmc2V0XSAhPSAnMCcpCisgICAgICAgICAgcG9zX3N0cmluZz1vZmZzZXQ7CisgICAgICBuLz0xMDsKKyAgICAgIGlmIChvZmZzZXQ9PTApCisgICAgICAgICAgYnJlYWs7CisgICAgICBvZmZzZXQtLTsKKyAgfQorICB7CisgICAgICBpbnQgc2l6ZV9kaXNwbGF5X3N0cmluZyA9IDE5LXBvc19zdHJpbmc7CisgICAgICB3aGlsZSAoc2l6ZV9jaGFyID4gc2l6ZV9kaXNwbGF5X3N0cmluZykKKyAgICAgIHsKKyAgICAgICAgICBzaXplX2NoYXItLTsKKyAgICAgICAgICBwcmludGYoIiAiKTsKKyAgICAgIH0KKyAgfQorCisgIHByaW50ZigiJXMiLCZudW1iZXJbcG9zX3N0cmluZ10pOworfQorCitpbnQgZG9fbGlzdCh1ZikKKyAgICB1bnpGaWxlIHVmOworeworICAgIHVMb25nIGk7CisgICAgdW56X2dsb2JhbF9pbmZvNjQgZ2k7CisgICAgaW50IGVycjsKKworICAgIGVyciA9IHVuekdldEdsb2JhbEluZm82NCh1ZiwmZ2kpOworICAgIGlmIChlcnIhPVVOWl9PSykKKyAgICAgICAgcHJpbnRmKCJlcnJvciAlZCB3aXRoIHppcGZpbGUgaW4gdW56R2V0R2xvYmFsSW5mbyBcbiIsZXJyKTsKKyAgICBwcmludGYoIiAgTGVuZ3RoICBNZXRob2QgICAgIFNpemUgUmF0aW8gICBEYXRlICAgIFRpbWUgICBDUkMtMzIgICAgIE5hbWVcbiIpOworICAgIHByaW50ZigiICAtLS0tLS0gIC0tLS0tLSAgICAgLS0tLSAtLS0tLSAgIC0tLS0gICAgLS0tLSAgIC0tLS0tLSAgICAgLS0tLVxuIik7CisgICAgZm9yIChpPTA7aTxnaS5udW1iZXJfZW50cnk7aSsrKQorICAgIHsKKyAgICAgICAgY2hhciBmaWxlbmFtZV9pbnppcFsyNTZdOworICAgICAgICB1bnpfZmlsZV9pbmZvNjQgZmlsZV9pbmZvOworICAgICAgICB1TG9uZyByYXRpbz0wOworICAgICAgICBjb25zdCBjaGFyICpzdHJpbmdfbWV0aG9kOworICAgICAgICBjaGFyIGNoYXJDcnlwdD0nICc7CisgICAgICAgIGVyciA9IHVuekdldEN1cnJlbnRGaWxlSW5mbzY0KHVmLCZmaWxlX2luZm8sZmlsZW5hbWVfaW56aXAsc2l6ZW9mKGZpbGVuYW1lX2luemlwKSxOVUxMLDAsTlVMTCwwKTsKKyAgICAgICAgaWYgKGVyciE9VU5aX09LKQorICAgICAgICB7CisgICAgICAgICAgICBwcmludGYoImVycm9yICVkIHdpdGggemlwZmlsZSBpbiB1bnpHZXRDdXJyZW50RmlsZUluZm9cbiIsZXJyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChmaWxlX2luZm8udW5jb21wcmVzc2VkX3NpemU+MCkKKyAgICAgICAgICAgIHJhdGlvID0gKHVMb25nKSgoZmlsZV9pbmZvLmNvbXByZXNzZWRfc2l6ZSoxMDApL2ZpbGVfaW5mby51bmNvbXByZXNzZWRfc2l6ZSk7CisKKyAgICAgICAgLyogZGlzcGxheSBhICcqJyBpZiB0aGUgZmlsZSBpcyBjcnlwdGVkICovCisgICAgICAgIGlmICgoZmlsZV9pbmZvLmZsYWcgJiAxKSAhPSAwKQorICAgICAgICAgICAgY2hhckNyeXB0PScqJzsKKworICAgICAgICBpZiAoZmlsZV9pbmZvLmNvbXByZXNzaW9uX21ldGhvZD09MCkKKyAgICAgICAgICAgIHN0cmluZ19tZXRob2Q9IlN0b3JlZCI7CisgICAgICAgIGVsc2UKKyAgICAgICAgaWYgKGZpbGVfaW5mby5jb21wcmVzc2lvbl9tZXRob2Q9PVpfREVGTEFURUQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVJbnQgaUxldmVsPSh1SW50KSgoZmlsZV9pbmZvLmZsYWcgJiAweDYpLzIpOworICAgICAgICAgICAgaWYgKGlMZXZlbD09MCkKKyAgICAgICAgICAgICAgc3RyaW5nX21ldGhvZD0iRGVmbDpOIjsKKyAgICAgICAgICAgIGVsc2UgaWYgKGlMZXZlbD09MSkKKyAgICAgICAgICAgICAgc3RyaW5nX21ldGhvZD0iRGVmbDpYIjsKKyAgICAgICAgICAgIGVsc2UgaWYgKChpTGV2ZWw9PTIpIHx8IChpTGV2ZWw9PTMpKQorICAgICAgICAgICAgICBzdHJpbmdfbWV0aG9kPSJEZWZsOkYiOyAvKiAyOmZhc3QgLCAzIDogZXh0cmEgZmFzdCovCisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICBpZiAoZmlsZV9pbmZvLmNvbXByZXNzaW9uX21ldGhvZD09Wl9CWklQMkVEKQorICAgICAgICB7CisgICAgICAgICAgICAgIHN0cmluZ19tZXRob2Q9IkJaaXAyICI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc3RyaW5nX21ldGhvZD0iVW5rbi4gIjsKKworICAgICAgICBEaXNwbGF5NjRCaXRzU2l6ZShmaWxlX2luZm8udW5jb21wcmVzc2VkX3NpemUsNyk7CisgICAgICAgIHByaW50ZigiICAlNnMlYyIsc3RyaW5nX21ldGhvZCxjaGFyQ3J5cHQpOworICAgICAgICBEaXNwbGF5NjRCaXRzU2l6ZShmaWxlX2luZm8uY29tcHJlc3NlZF9zaXplLDcpOworICAgICAgICBwcmludGYoIiAlM2x1JSUgICUyLjJsdS0lMi4ybHUtJTIuMmx1ICAlMi4ybHU6JTIuMmx1ICAlOC44bHggICAlc1xuIiwKKyAgICAgICAgICAgICAgICByYXRpbywKKyAgICAgICAgICAgICAgICAodUxvbmcpZmlsZV9pbmZvLnRtdV9kYXRlLnRtX21vbiArIDEsCisgICAgICAgICAgICAgICAgKHVMb25nKWZpbGVfaW5mby50bXVfZGF0ZS50bV9tZGF5LAorICAgICAgICAgICAgICAgICh1TG9uZylmaWxlX2luZm8udG11X2RhdGUudG1feWVhciAlIDEwMCwKKyAgICAgICAgICAgICAgICAodUxvbmcpZmlsZV9pbmZvLnRtdV9kYXRlLnRtX2hvdXIsKHVMb25nKWZpbGVfaW5mby50bXVfZGF0ZS50bV9taW4sCisgICAgICAgICAgICAgICAgKHVMb25nKWZpbGVfaW5mby5jcmMsZmlsZW5hbWVfaW56aXApOworICAgICAgICBpZiAoKGkrMSk8Z2kubnVtYmVyX2VudHJ5KQorICAgICAgICB7CisgICAgICAgICAgICBlcnIgPSB1bnpHb1RvTmV4dEZpbGUodWYpOworICAgICAgICAgICAgaWYgKGVyciE9VU5aX09LKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHByaW50ZigiZXJyb3IgJWQgd2l0aCB6aXBmaWxlIGluIHVuekdvVG9OZXh0RmlsZVxuIixlcnIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKworaW50IGRvX2V4dHJhY3RfY3VycmVudGZpbGUodWYscG9wdF9leHRyYWN0X3dpdGhvdXRfcGF0aCxwb3B0X292ZXJ3cml0ZSxwYXNzd29yZCkKKyAgICB1bnpGaWxlIHVmOworICAgIGNvbnN0IGludCogcG9wdF9leHRyYWN0X3dpdGhvdXRfcGF0aDsKKyAgICBpbnQqIHBvcHRfb3ZlcndyaXRlOworICAgIGNvbnN0IGNoYXIqIHBhc3N3b3JkOworeworICAgIGNoYXIgZmlsZW5hbWVfaW56aXBbMjU2XTsKKyAgICBjaGFyKiBmaWxlbmFtZV93aXRob3V0cGF0aDsKKyAgICBjaGFyKiBwOworICAgIGludCBlcnI9VU5aX09LOworICAgIEZJTEUgKmZvdXQ9TlVMTDsKKyAgICB2b2lkKiBidWY7CisgICAgdUludCBzaXplX2J1ZjsKKworICAgIHVuel9maWxlX2luZm82NCBmaWxlX2luZm87CisgICAgdUxvbmcgcmF0aW89MDsKKyAgICBlcnIgPSB1bnpHZXRDdXJyZW50RmlsZUluZm82NCh1ZiwmZmlsZV9pbmZvLGZpbGVuYW1lX2luemlwLHNpemVvZihmaWxlbmFtZV9pbnppcCksTlVMTCwwLE5VTEwsMCk7CisKKyAgICBpZiAoZXJyIT1VTlpfT0spCisgICAgeworICAgICAgICBwcmludGYoImVycm9yICVkIHdpdGggemlwZmlsZSBpbiB1bnpHZXRDdXJyZW50RmlsZUluZm9cbiIsZXJyKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBzaXplX2J1ZiA9IFdSSVRFQlVGRkVSU0laRTsKKyAgICBidWYgPSAodm9pZCopbWFsbG9jKHNpemVfYnVmKTsKKyAgICBpZiAoYnVmPT1OVUxMKQorICAgIHsKKyAgICAgICAgcHJpbnRmKCJFcnJvciBhbGxvY2F0aW5nIG1lbW9yeVxuIik7CisgICAgICAgIHJldHVybiBVTlpfSU5URVJOQUxFUlJPUjsKKyAgICB9CisKKyAgICBwID0gZmlsZW5hbWVfd2l0aG91dHBhdGggPSBmaWxlbmFtZV9pbnppcDsKKyAgICB3aGlsZSAoKCpwKSAhPSAnXDAnKQorICAgIHsKKyAgICAgICAgaWYgKCgoKnApPT0nLycpIHx8ICgoKnApPT0nXFwnKSkKKyAgICAgICAgICAgIGZpbGVuYW1lX3dpdGhvdXRwYXRoID0gcCsxOworICAgICAgICBwKys7CisgICAgfQorCisgICAgaWYgKCgqZmlsZW5hbWVfd2l0aG91dHBhdGgpPT0nXDAnKQorICAgIHsKKyAgICAgICAgaWYgKCgqcG9wdF9leHRyYWN0X3dpdGhvdXRfcGF0aCk9PTApCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50ZigiY3JlYXRpbmcgZGlyZWN0b3J5OiAlc1xuIixmaWxlbmFtZV9pbnppcCk7CisgICAgICAgICAgICBteW1rZGlyKGZpbGVuYW1lX2luemlwKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBjb25zdCBjaGFyKiB3cml0ZV9maWxlbmFtZTsKKyAgICAgICAgaW50IHNraXA9MDsKKworICAgICAgICBpZiAoKCpwb3B0X2V4dHJhY3Rfd2l0aG91dF9wYXRoKT09MCkKKyAgICAgICAgICAgIHdyaXRlX2ZpbGVuYW1lID0gZmlsZW5hbWVfaW56aXA7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHdyaXRlX2ZpbGVuYW1lID0gZmlsZW5hbWVfd2l0aG91dHBhdGg7CisKKyAgICAgICAgZXJyID0gdW56T3BlbkN1cnJlbnRGaWxlUGFzc3dvcmQodWYscGFzc3dvcmQpOworICAgICAgICBpZiAoZXJyIT1VTlpfT0spCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50ZigiZXJyb3IgJWQgd2l0aCB6aXBmaWxlIGluIHVuek9wZW5DdXJyZW50RmlsZVBhc3N3b3JkXG4iLGVycik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKCgqcG9wdF9vdmVyd3JpdGUpPT0wKSAmJiAoZXJyPT1VTlpfT0spKQorICAgICAgICB7CisgICAgICAgICAgICBjaGFyIHJlcD0wOworICAgICAgICAgICAgRklMRSogZnRlc3RleGlzdDsKKyAgICAgICAgICAgIGZ0ZXN0ZXhpc3QgPSBGT1BFTl9GVU5DKHdyaXRlX2ZpbGVuYW1lLCJyYiIpOworICAgICAgICAgICAgaWYgKGZ0ZXN0ZXhpc3QhPU5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmNsb3NlKGZ0ZXN0ZXhpc3QpOworICAgICAgICAgICAgICAgIGRvCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjaGFyIGFuc3dlclsxMjhdOworICAgICAgICAgICAgICAgICAgICBpbnQgcmV0OworCisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiVGhlIGZpbGUgJXMgZXhpc3RzLiBPdmVyd3JpdGUgPyBbeV1lcywgW25dbywgW0FdbGw6ICIsd3JpdGVfZmlsZW5hbWUpOworICAgICAgICAgICAgICAgICAgICByZXQgPSBzY2FuZigiJTFzIixhbnN3ZXIpOworICAgICAgICAgICAgICAgICAgICBpZiAocmV0ICE9IDEpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJlcCA9IGFuc3dlclswXSA7CisgICAgICAgICAgICAgICAgICAgIGlmICgocmVwPj0nYScpICYmIChyZXA8PSd6JykpCisgICAgICAgICAgICAgICAgICAgICAgICByZXAgLT0gMHgyMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd2hpbGUgKChyZXAhPSdZJykgJiYgKHJlcCE9J04nKSAmJiAocmVwIT0nQScpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHJlcCA9PSAnTicpCisgICAgICAgICAgICAgICAgc2tpcCA9IDE7CisKKyAgICAgICAgICAgIGlmIChyZXAgPT0gJ0EnKQorICAgICAgICAgICAgICAgICpwb3B0X292ZXJ3cml0ZT0xOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChza2lwPT0wKSAmJiAoZXJyPT1VTlpfT0spKQorICAgICAgICB7CisgICAgICAgICAgICBmb3V0PUZPUEVOX0ZVTkMod3JpdGVfZmlsZW5hbWUsIndiIik7CisgICAgICAgICAgICAvKiBzb21lIHppcGZpbGUgZG9uJ3QgY29udGFpbiBkaXJlY3RvcnkgYWxvbmUgYmVmb3JlIGZpbGUgKi8KKyAgICAgICAgICAgIGlmICgoZm91dD09TlVMTCkgJiYgKCgqcG9wdF9leHRyYWN0X3dpdGhvdXRfcGF0aCk9PTApICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmaWxlbmFtZV93aXRob3V0cGF0aCE9KGNoYXIqKWZpbGVuYW1lX2luemlwKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjaGFyIGM9KihmaWxlbmFtZV93aXRob3V0cGF0aC0xKTsKKyAgICAgICAgICAgICAgICAqKGZpbGVuYW1lX3dpdGhvdXRwYXRoLTEpPSdcMCc7CisgICAgICAgICAgICAgICAgbWFrZWRpcih3cml0ZV9maWxlbmFtZSk7CisgICAgICAgICAgICAgICAgKihmaWxlbmFtZV93aXRob3V0cGF0aC0xKT1jOworICAgICAgICAgICAgICAgIGZvdXQ9Rk9QRU5fRlVOQyh3cml0ZV9maWxlbmFtZSwid2IiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZvdXQ9PU5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJlcnJvciBvcGVuaW5nICVzXG4iLHdyaXRlX2ZpbGVuYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChmb3V0IT1OVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBwcmludGYoIiBleHRyYWN0aW5nOiAlc1xuIix3cml0ZV9maWxlbmFtZSk7CisKKyAgICAgICAgICAgIGRvCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZXJyID0gdW56UmVhZEN1cnJlbnRGaWxlKHVmLGJ1ZixzaXplX2J1Zik7CisgICAgICAgICAgICAgICAgaWYgKGVycjwwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJlcnJvciAlZCB3aXRoIHppcGZpbGUgaW4gdW56UmVhZEN1cnJlbnRGaWxlXG4iLGVycik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZXJyPjApCisgICAgICAgICAgICAgICAgICAgIGlmIChmd3JpdGUoYnVmLGVyciwxLGZvdXQpIT0xKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoImVycm9yIGluIHdyaXRpbmcgZXh0cmFjdGVkIGZpbGVcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgZXJyPVVOWl9FUlJOTzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aGlsZSAoZXJyPjApOworICAgICAgICAgICAgaWYgKGZvdXQpCisgICAgICAgICAgICAgICAgICAgIGZjbG9zZShmb3V0KTsKKworICAgICAgICAgICAgaWYgKGVycj09MCkKKyAgICAgICAgICAgICAgICBjaGFuZ2VfZmlsZV9kYXRlKHdyaXRlX2ZpbGVuYW1lLGZpbGVfaW5mby5kb3NEYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9pbmZvLnRtdV9kYXRlKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChlcnI9PVVOWl9PSykKKyAgICAgICAgeworICAgICAgICAgICAgZXJyID0gdW56Q2xvc2VDdXJyZW50RmlsZSAodWYpOworICAgICAgICAgICAgaWYgKGVyciE9VU5aX09LKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHByaW50ZigiZXJyb3IgJWQgd2l0aCB6aXBmaWxlIGluIHVuekNsb3NlQ3VycmVudEZpbGVcbiIsZXJyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICB1bnpDbG9zZUN1cnJlbnRGaWxlKHVmKTsgLyogZG9uJ3QgbG9zZSB0aGUgZXJyb3IgKi8KKyAgICB9CisKKyAgICBmcmVlKGJ1Zik7CisgICAgcmV0dXJuIGVycjsKK30KKworCitpbnQgZG9fZXh0cmFjdCh1ZixvcHRfZXh0cmFjdF93aXRob3V0X3BhdGgsb3B0X292ZXJ3cml0ZSxwYXNzd29yZCkKKyAgICB1bnpGaWxlIHVmOworICAgIGludCBvcHRfZXh0cmFjdF93aXRob3V0X3BhdGg7CisgICAgaW50IG9wdF9vdmVyd3JpdGU7CisgICAgY29uc3QgY2hhciogcGFzc3dvcmQ7Cit7CisgICAgdUxvbmcgaTsKKyAgICB1bnpfZ2xvYmFsX2luZm82NCBnaTsKKyAgICBpbnQgZXJyOworICAgIEZJTEUqIGZvdXQ9TlVMTDsKKworICAgIGVyciA9IHVuekdldEdsb2JhbEluZm82NCh1ZiwmZ2kpOworICAgIGlmIChlcnIhPVVOWl9PSykKKyAgICAgICAgcHJpbnRmKCJlcnJvciAlZCB3aXRoIHppcGZpbGUgaW4gdW56R2V0R2xvYmFsSW5mbyBcbiIsZXJyKTsKKworICAgIGZvciAoaT0wO2k8Z2kubnVtYmVyX2VudHJ5O2krKykKKyAgICB7CisgICAgICAgIGlmIChkb19leHRyYWN0X2N1cnJlbnRmaWxlKHVmLCZvcHRfZXh0cmFjdF93aXRob3V0X3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvcHRfb3ZlcndyaXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzd29yZCkgIT0gVU5aX09LKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgaWYgKChpKzEpPGdpLm51bWJlcl9lbnRyeSkKKyAgICAgICAgeworICAgICAgICAgICAgZXJyID0gdW56R29Ub05leHRGaWxlKHVmKTsKKyAgICAgICAgICAgIGlmIChlcnIhPVVOWl9PSykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcmludGYoImVycm9yICVkIHdpdGggemlwZmlsZSBpbiB1bnpHb1RvTmV4dEZpbGVcbiIsZXJyKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitpbnQgZG9fZXh0cmFjdF9vbmVmaWxlKHVmLGZpbGVuYW1lLG9wdF9leHRyYWN0X3dpdGhvdXRfcGF0aCxvcHRfb3ZlcndyaXRlLHBhc3N3b3JkKQorICAgIHVuekZpbGUgdWY7CisgICAgY29uc3QgY2hhciogZmlsZW5hbWU7CisgICAgaW50IG9wdF9leHRyYWN0X3dpdGhvdXRfcGF0aDsKKyAgICBpbnQgb3B0X292ZXJ3cml0ZTsKKyAgICBjb25zdCBjaGFyKiBwYXNzd29yZDsKK3sKKyAgICBpbnQgZXJyID0gVU5aX09LOworICAgIGlmICh1bnpMb2NhdGVGaWxlKHVmLGZpbGVuYW1lLENBU0VTRU5TSVRJVklUWSkhPVVOWl9PSykKKyAgICB7CisgICAgICAgIHByaW50ZigiZmlsZSAlcyBub3QgZm91bmQgaW4gdGhlIHppcGZpbGVcbiIsZmlsZW5hbWUpOworICAgICAgICByZXR1cm4gMjsKKyAgICB9CisKKyAgICBpZiAoZG9fZXh0cmFjdF9jdXJyZW50ZmlsZSh1Ziwmb3B0X2V4dHJhY3Rfd2l0aG91dF9wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3B0X292ZXJ3cml0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmQpID09IFVOWl9PSykKKyAgICAgICAgcmV0dXJuIDA7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gMTsKK30KKworCitpbnQgbWFpbihhcmdjLGFyZ3YpCisgICAgaW50IGFyZ2M7CisgICAgY2hhciAqYXJndltdOworeworICAgIGNvbnN0IGNoYXIgKnppcGZpbGVuYW1lPU5VTEw7CisgICAgY29uc3QgY2hhciAqZmlsZW5hbWVfdG9fZXh0cmFjdD1OVUxMOworICAgIGNvbnN0IGNoYXIgKnBhc3N3b3JkPU5VTEw7CisgICAgY2hhciBmaWxlbmFtZV90cnlbTUFYRklMRU5BTUUrMTZdID0gIiI7CisgICAgaW50IGk7CisgICAgaW50IHJldF92YWx1ZT0wOworICAgIGludCBvcHRfZG9fbGlzdD0wOworICAgIGludCBvcHRfZG9fZXh0cmFjdD0xOworICAgIGludCBvcHRfZG9fZXh0cmFjdF93aXRob3V0cGF0aD0wOworICAgIGludCBvcHRfb3ZlcndyaXRlPTA7CisgICAgaW50IG9wdF9leHRyYWN0ZGlyPTA7CisgICAgY29uc3QgY2hhciAqZGlybmFtZT1OVUxMOworICAgIHVuekZpbGUgdWY9TlVMTDsKKworICAgIGRvX2Jhbm5lcigpOworICAgIGlmIChhcmdjPT0xKQorICAgIHsKKyAgICAgICAgZG9faGVscCgpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZm9yIChpPTE7aTxhcmdjO2krKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCgqYXJndltpXSk9PSctJykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwPWFyZ3ZbaV0rMTsKKworICAgICAgICAgICAgICAgIHdoaWxlICgoKnApIT0nXDAnKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2hhciBjPSoocCsrKTs7CisgICAgICAgICAgICAgICAgICAgIGlmICgoYz09J2wnKSB8fCAoYz09J0wnKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wdF9kb19saXN0ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChjPT0ndicpIHx8IChjPT0nVicpKQorICAgICAgICAgICAgICAgICAgICAgICAgb3B0X2RvX2xpc3QgPSAxOworICAgICAgICAgICAgICAgICAgICBpZiAoKGM9PSd4JykgfHwgKGM9PSdYJykpCisgICAgICAgICAgICAgICAgICAgICAgICBvcHRfZG9fZXh0cmFjdCA9IDE7CisgICAgICAgICAgICAgICAgICAgIGlmICgoYz09J2UnKSB8fCAoYz09J0UnKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wdF9kb19leHRyYWN0ID0gb3B0X2RvX2V4dHJhY3Rfd2l0aG91dHBhdGggPSAxOworICAgICAgICAgICAgICAgICAgICBpZiAoKGM9PSdvJykgfHwgKGM9PSdPJykpCisgICAgICAgICAgICAgICAgICAgICAgICBvcHRfb3ZlcndyaXRlPTE7CisgICAgICAgICAgICAgICAgICAgIGlmICgoYz09J2QnKSB8fCAoYz09J0QnKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgb3B0X2V4dHJhY3RkaXI9MTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpcm5hbWU9YXJndltpKzFdOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCgoYz09J3AnKSB8fCAoYz09J1AnKSkgJiYgKGkrMTxhcmdjKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmQ9YXJndltpKzFdOworICAgICAgICAgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh6aXBmaWxlbmFtZSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB6aXBmaWxlbmFtZSA9IGFyZ3ZbaV07CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoKGZpbGVuYW1lX3RvX2V4dHJhY3Q9PU5VTEwpICYmICghb3B0X2V4dHJhY3RkaXIpKQorICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWVfdG9fZXh0cmFjdCA9IGFyZ3ZbaV0gOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHppcGZpbGVuYW1lIT1OVUxMKQorICAgIHsKKworIyAgICAgICAgaWZkZWYgVVNFV0lOMzJJT0FQSQorICAgICAgICB6bGliX2ZpbGVmdW5jNjRfZGVmIGZmdW5jOworIyAgICAgICAgZW5kaWYKKworICAgICAgICBzdHJuY3B5KGZpbGVuYW1lX3RyeSwgemlwZmlsZW5hbWUsTUFYRklMRU5BTUUtMSk7CisgICAgICAgIC8qIHN0cm5jcHkgZG9lc250IGFwcGVuZCB0aGUgdHJhaWxpbmcgTlVMTCwgb2YgdGhlIHN0cmluZyBpcyB0b28gbG9uZy4gKi8KKyAgICAgICAgZmlsZW5hbWVfdHJ5WyBNQVhGSUxFTkFNRSBdID0gJ1wwJzsKKworIyAgICAgICAgaWZkZWYgVVNFV0lOMzJJT0FQSQorICAgICAgICBmaWxsX3dpbjMyX2ZpbGVmdW5jNjRBKCZmZnVuYyk7CisgICAgICAgIHVmID0gdW56T3BlbjJfNjQoemlwZmlsZW5hbWUsJmZmdW5jKTsKKyMgICAgICAgIGVsc2UKKyAgICAgICAgdWYgPSB1bnpPcGVuNjQoemlwZmlsZW5hbWUpOworIyAgICAgICAgZW5kaWYKKyAgICAgICAgaWYgKHVmPT1OVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJjYXQoZmlsZW5hbWVfdHJ5LCIuemlwIik7CisjICAgICAgICAgICAgaWZkZWYgVVNFV0lOMzJJT0FQSQorICAgICAgICAgICAgdWYgPSB1bnpPcGVuMl82NChmaWxlbmFtZV90cnksJmZmdW5jKTsKKyMgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB1ZiA9IHVuek9wZW42NChmaWxlbmFtZV90cnkpOworIyAgICAgICAgICAgIGVuZGlmCisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAodWY9PU5VTEwpCisgICAgeworICAgICAgICBwcmludGYoIkNhbm5vdCBvcGVuICVzIG9yICVzLnppcFxuIix6aXBmaWxlbmFtZSx6aXBmaWxlbmFtZSk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBwcmludGYoIiVzIG9wZW5lZFxuIixmaWxlbmFtZV90cnkpOworCisgICAgaWYgKG9wdF9kb19saXN0PT0xKQorICAgICAgICByZXRfdmFsdWUgPSBkb19saXN0KHVmKTsKKyAgICBlbHNlIGlmIChvcHRfZG9fZXh0cmFjdD09MSkKKyAgICB7CisjaWZkZWYgX1dJTjMyCisgICAgICAgIGlmIChvcHRfZXh0cmFjdGRpciAmJiBfY2hkaXIoZGlybmFtZSkpCisjZWxzZQorICAgICAgICBpZiAob3B0X2V4dHJhY3RkaXIgJiYgY2hkaXIoZGlybmFtZSkpCisjZW5kaWYKKyAgICAgICAgeworICAgICAgICAgIHByaW50ZigiRXJyb3IgY2hhbmdpbmcgaW50byAlcywgYWJvcnRpbmdcbiIsIGRpcm5hbWUpOworICAgICAgICAgIGV4aXQoLTEpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGZpbGVuYW1lX3RvX2V4dHJhY3QgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldF92YWx1ZSA9IGRvX2V4dHJhY3QodWYsIG9wdF9kb19leHRyYWN0X3dpdGhvdXRwYXRoLCBvcHRfb3ZlcndyaXRlLCBwYXNzd29yZCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldF92YWx1ZSA9IGRvX2V4dHJhY3Rfb25lZmlsZSh1ZiwgZmlsZW5hbWVfdG9fZXh0cmFjdCwgb3B0X2RvX2V4dHJhY3Rfd2l0aG91dHBhdGgsIG9wdF9vdmVyd3JpdGUsIHBhc3N3b3JkKTsKKyAgICB9CisKKyAgICB1bnpDbG9zZSh1Zik7CisKKyAgICByZXR1cm4gcmV0X3ZhbHVlOworfQpkaWZmIC0tZ2l0IGEvemxpYi0xLjIuNi9jb250cmliL21pbml6aXAvbWluaXppcC5jIGIvemxpYi0xLjIuNi9jb250cmliL21pbml6aXAvbWluaXppcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyODg5NjIKLS0tIC9kZXYvbnVsbAorKysgYi96bGliLTEuMi42L2NvbnRyaWIvbWluaXppcC9taW5pemlwLmMKQEAgLTAsMCArMSw1MjAgQEAKKy8qCisgICBtaW5pemlwLmMKKyAgIFZlcnNpb24gMS4xLCBGZWJydWFyeSAxNGgsIDIwMTAKKyAgIHNhbXBsZSBwYXJ0IG9mIHRoZSBNaW5pWmlwIHByb2plY3QgLSAoIGh0dHA6Ly93d3cud2luaW1hZ2UuY29tL3pMaWJEbGwvbWluaXppcC5odG1sICkKKworICAgICAgICAgQ29weXJpZ2h0IChDKSAxOTk4LTIwMTAgR2lsbGVzIFZvbGxhbnQgKG1pbml6aXApICggaHR0cDovL3d3dy53aW5pbWFnZS5jb20vekxpYkRsbC9taW5pemlwLmh0bWwgKQorCisgICAgICAgICBNb2RpZmljYXRpb25zIG9mIFVuemlwIGZvciBaaXA2NAorICAgICAgICAgQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggRXZlbiBSb3VhdWx0CisKKyAgICAgICAgIE1vZGlmaWNhdGlvbnMgZm9yIFppcDY0IHN1cHBvcnQgb24gYm90aCB6aXAgYW5kIHVuemlwCisgICAgICAgICBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMCBNYXRoaWFzIFN2ZW5zc29uICggaHR0cDovL3Jlc3VsdDQyLmNvbSApCisqLworCisKKyNpZiAoIWRlZmluZWQoX1dJTjMyKSkgJiYgKCFkZWZpbmVkKFdJTjMyKSkgJiYgKCFkZWZpbmVkKF9fQVBQTEVfXykpCisgICAgICAgICNpZm5kZWYgX19VU0VfRklMRV9PRkZTRVQ2NAorICAgICAgICAgICAgICAgICNkZWZpbmUgX19VU0VfRklMRV9PRkZTRVQ2NAorICAgICAgICAjZW5kaWYKKyAgICAgICAgI2lmbmRlZiBfX1VTRV9MQVJHRUZJTEU2NAorICAgICAgICAgICAgICAgICNkZWZpbmUgX19VU0VfTEFSR0VGSUxFNjQKKyAgICAgICAgI2VuZGlmCisgICAgICAgICNpZm5kZWYgX0xBUkdFRklMRTY0X1NPVVJDRQorICAgICAgICAgICAgICAgICNkZWZpbmUgX0xBUkdFRklMRTY0X1NPVVJDRQorICAgICAgICAjZW5kaWYKKyAgICAgICAgI2lmbmRlZiBfRklMRV9PRkZTRVRfQklUCisgICAgICAgICAgICAgICAgI2RlZmluZSBfRklMRV9PRkZTRVRfQklUIDY0CisgICAgICAgICNlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBfX0FQUExFX18KKy8vIEluIGRhcndpbiBhbmQgcGVyaGFwcyBvdGhlciBCU0QgdmFyaWFudHMgb2ZmX3QgaXMgYSA2NCBiaXQgdmFsdWUsIGhlbmNlIG5vIG5lZWQgZm9yIHNwZWNpZmljIDY0IGJpdCBmdW5jdGlvbnMKKyNkZWZpbmUgRk9QRU5fRlVOQyhmaWxlbmFtZSwgbW9kZSkgZm9wZW4oZmlsZW5hbWUsIG1vZGUpCisjZGVmaW5lIEZURUxMT19GVU5DKHN0cmVhbSkgZnRlbGxvKHN0cmVhbSkKKyNkZWZpbmUgRlNFRUtPX0ZVTkMoc3RyZWFtLCBvZmZzZXQsIG9yaWdpbikgZnNlZWtvKHN0cmVhbSwgb2Zmc2V0LCBvcmlnaW4pCisjZWxzZQorI2RlZmluZSBGT1BFTl9GVU5DKGZpbGVuYW1lLCBtb2RlKSBmb3BlbjY0KGZpbGVuYW1lLCBtb2RlKQorI2RlZmluZSBGVEVMTE9fRlVOQyhzdHJlYW0pIGZ0ZWxsbzY0KHN0cmVhbSkKKyNkZWZpbmUgRlNFRUtPX0ZVTkMoc3RyZWFtLCBvZmZzZXQsIG9yaWdpbikgZnNlZWtvNjQoc3RyZWFtLCBvZmZzZXQsIG9yaWdpbikKKyNlbmRpZgorCisKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKworI2lmZGVmIF9XSU4zMgorIyBpbmNsdWRlIDxkaXJlY3QuaD4KKyMgaW5jbHVkZSA8aW8uaD4KKyNlbHNlCisjIGluY2x1ZGUgPHVuaXN0ZC5oPgorIyBpbmNsdWRlIDx1dGltZS5oPgorIyBpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyMgaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiemlwLmgiCisKKyNpZmRlZiBfV0lOMzIKKyAgICAgICAgI2RlZmluZSBVU0VXSU4zMklPQVBJCisgICAgICAgICNpbmNsdWRlICJpb3dpbjMyLmgiCisjZW5kaWYKKworCisKKyNkZWZpbmUgV1JJVEVCVUZGRVJTSVpFICgxNjM4NCkKKyNkZWZpbmUgTUFYRklMRU5BTUUgKDI1NikKKworI2lmZGVmIF9XSU4zMgordUxvbmcgZmlsZXRpbWUoZiwgdG16aXAsIGR0KQorICAgIGNoYXIgKmY7ICAgICAgICAgICAgICAgIC8qIG5hbWUgb2YgZmlsZSB0byBnZXQgaW5mbyBvbiAqLworICAgIHRtX3ppcCAqdG16aXA7ICAgICAgICAgICAgIC8qIHJldHVybiB2YWx1ZTogYWNjZXNzLCBtb2RpZmljLiBhbmQgY3JlYXRpb24gdGltZXMgKi8KKyAgICB1TG9uZyAqZHQ7ICAgICAgICAgICAgIC8qIGRvc3RpbWUgKi8KK3sKKyAgaW50IHJldCA9IDA7CisgIHsKKyAgICAgIEZJTEVUSU1FIGZ0TG9jYWw7CisgICAgICBIQU5ETEUgaEZpbmQ7CisgICAgICBXSU4zMl9GSU5EX0RBVEFBIGZmMzI7CisKKyAgICAgIGhGaW5kID0gRmluZEZpcnN0RmlsZUEoZiwmZmYzMik7CisgICAgICBpZiAoaEZpbmQgIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpCisgICAgICB7CisgICAgICAgIEZpbGVUaW1lVG9Mb2NhbEZpbGVUaW1lKCYoZmYzMi5mdExhc3RXcml0ZVRpbWUpLCZmdExvY2FsKTsKKyAgICAgICAgRmlsZVRpbWVUb0Rvc0RhdGVUaW1lKCZmdExvY2FsLCgoTFBXT1JEKWR0KSsxLCgoTFBXT1JEKWR0KSswKTsKKyAgICAgICAgRmluZENsb3NlKGhGaW5kKTsKKyAgICAgICAgcmV0ID0gMTsKKyAgICAgIH0KKyAgfQorICByZXR1cm4gcmV0OworfQorI2Vsc2UKKyNpZmRlZiB1bml4IHx8IF9fQVBQTEVfXwordUxvbmcgZmlsZXRpbWUoZiwgdG16aXAsIGR0KQorICAgIGNoYXIgKmY7ICAgICAgICAgICAgICAgLyogbmFtZSBvZiBmaWxlIHRvIGdldCBpbmZvIG9uICovCisgICAgdG1femlwICp0bXppcDsgICAgICAgICAvKiByZXR1cm4gdmFsdWU6IGFjY2VzcywgbW9kaWZpYy4gYW5kIGNyZWF0aW9uIHRpbWVzICovCisgICAgdUxvbmcgKmR0OyAgICAgICAgICAgICAvKiBkb3N0aW1lICovCit7CisgIGludCByZXQ9MDsKKyAgc3RydWN0IHN0YXQgczsgICAgICAgIC8qIHJlc3VsdHMgb2Ygc3RhdCgpICovCisgIHN0cnVjdCB0bSogZmlsZWRhdGU7CisgIHRpbWVfdCB0bV90PTA7CisKKyAgaWYgKHN0cmNtcChmLCItIikhPTApCisgIHsKKyAgICBjaGFyIG5hbWVbTUFYRklMRU5BTUUrMV07CisgICAgaW50IGxlbiA9IHN0cmxlbihmKTsKKyAgICBpZiAobGVuID4gTUFYRklMRU5BTUUpCisgICAgICBsZW4gPSBNQVhGSUxFTkFNRTsKKworICAgIHN0cm5jcHkobmFtZSwgZixNQVhGSUxFTkFNRS0xKTsKKyAgICAvKiBzdHJuY3B5IGRvZXNudCBhcHBlbmQgdGhlIHRyYWlsaW5nIE5VTEwsIG9mIHRoZSBzdHJpbmcgaXMgdG9vIGxvbmcuICovCisgICAgbmFtZVsgTUFYRklMRU5BTUUgXSA9ICdcMCc7CisKKyAgICBpZiAobmFtZVtsZW4gLSAxXSA9PSAnLycpCisgICAgICBuYW1lW2xlbiAtIDFdID0gJ1wwJzsKKyAgICAvKiBub3QgYWxsIHN5c3RlbXMgYWxsb3cgc3RhdCdpbmcgYSBmaWxlIHdpdGggLyBhcHBlbmRlZCAqLworICAgIGlmIChzdGF0KG5hbWUsJnMpPT0wKQorICAgIHsKKyAgICAgIHRtX3QgPSBzLnN0X210aW1lOworICAgICAgcmV0ID0gMTsKKyAgICB9CisgIH0KKyAgZmlsZWRhdGUgPSBsb2NhbHRpbWUoJnRtX3QpOworCisgIHRtemlwLT50bV9zZWMgID0gZmlsZWRhdGUtPnRtX3NlYzsKKyAgdG16aXAtPnRtX21pbiAgPSBmaWxlZGF0ZS0+dG1fbWluOworICB0bXppcC0+dG1faG91ciA9IGZpbGVkYXRlLT50bV9ob3VyOworICB0bXppcC0+dG1fbWRheSA9IGZpbGVkYXRlLT50bV9tZGF5OworICB0bXppcC0+dG1fbW9uICA9IGZpbGVkYXRlLT50bV9tb24gOworICB0bXppcC0+dG1feWVhciA9IGZpbGVkYXRlLT50bV95ZWFyOworCisgIHJldHVybiByZXQ7Cit9CisjZWxzZQordUxvbmcgZmlsZXRpbWUoZiwgdG16aXAsIGR0KQorICAgIGNoYXIgKmY7ICAgICAgICAgICAgICAgIC8qIG5hbWUgb2YgZmlsZSB0byBnZXQgaW5mbyBvbiAqLworICAgIHRtX3ppcCAqdG16aXA7ICAgICAgICAgICAgIC8qIHJldHVybiB2YWx1ZTogYWNjZXNzLCBtb2RpZmljLiBhbmQgY3JlYXRpb24gdGltZXMgKi8KKyAgICB1TG9uZyAqZHQ7ICAgICAgICAgICAgIC8qIGRvc3RpbWUgKi8KK3sKKyAgICByZXR1cm4gMDsKK30KKyNlbmRpZgorI2VuZGlmCisKKworCisKK2ludCBjaGVja19leGlzdF9maWxlKGZpbGVuYW1lKQorICAgIGNvbnN0IGNoYXIqIGZpbGVuYW1lOworeworICAgIEZJTEUqIGZ0ZXN0ZXhpc3Q7CisgICAgaW50IHJldCA9IDE7CisgICAgZnRlc3RleGlzdCA9IEZPUEVOX0ZVTkMoZmlsZW5hbWUsInJiIik7CisgICAgaWYgKGZ0ZXN0ZXhpc3Q9PU5VTEwpCisgICAgICAgIHJldCA9IDA7CisgICAgZWxzZQorICAgICAgICBmY2xvc2UoZnRlc3RleGlzdCk7CisgICAgcmV0dXJuIHJldDsKK30KKwordm9pZCBkb19iYW5uZXIoKQoreworICAgIHByaW50ZigiTWluaVppcCAxLjEsIGRlbW8gb2YgekxpYiArIE1pbmlaaXA2NCBwYWNrYWdlLCB3cml0dGVuIGJ5IEdpbGxlcyBWb2xsYW50XG4iKTsKKyAgICBwcmludGYoIm1vcmUgaW5mbyBvbiBNaW5pWmlwIGF0IGh0dHA6Ly93d3cud2luaW1hZ2UuY29tL3pMaWJEbGwvbWluaXppcC5odG1sXG5cbiIpOworfQorCit2b2lkIGRvX2hlbHAoKQoreworICAgIHByaW50ZigiVXNhZ2UgOiBtaW5pemlwIFstb10gWy1hXSBbLTAgdG8gLTldIFstcCBwYXNzd29yZF0gWy1qXSBmaWxlLnppcCBbZmlsZXNfdG9fYWRkXVxuXG4iIFwKKyAgICAgICAgICAgIiAgLW8gIE92ZXJ3cml0ZSBleGlzdGluZyBmaWxlLnppcFxuIiBcCisgICAgICAgICAgICIgIC1hICBBcHBlbmQgdG8gZXhpc3RpbmcgZmlsZS56aXBcbiIgXAorICAgICAgICAgICAiICAtMCAgU3RvcmUgb25seVxuIiBcCisgICAgICAgICAgICIgIC0xICBDb21wcmVzcyBmYXN0ZXJcbiIgXAorICAgICAgICAgICAiICAtOSAgQ29tcHJlc3MgYmV0dGVyXG5cbiIgXAorICAgICAgICAgICAiICAtaiAgZXhjbHVkZSBwYXRoLiBzdG9yZSBvbmx5IHRoZSBmaWxlIG5hbWUuXG5cbiIpOworfQorCisvKiBjYWxjdWxhdGUgdGhlIENSQzMyIG9mIGEgZmlsZSwKKyAgIGJlY2F1c2UgdG8gZW5jcnlwdCBhIGZpbGUsIHdlIG5lZWQga25vd24gdGhlIENSQzMyIG9mIHRoZSBmaWxlIGJlZm9yZSAqLworaW50IGdldEZpbGVDcmMoY29uc3QgY2hhciogZmlsZW5hbWVpbnppcCx2b2lkKmJ1Zix1bnNpZ25lZCBsb25nIHNpemVfYnVmLHVuc2lnbmVkIGxvbmcqIHJlc3VsdF9jcmMpCit7CisgICB1bnNpZ25lZCBsb25nIGNhbGN1bGF0ZV9jcmM9MDsKKyAgIGludCBlcnI9WklQX09LOworICAgRklMRSAqIGZpbiA9IEZPUEVOX0ZVTkMoZmlsZW5hbWVpbnppcCwicmIiKTsKKworICAgdW5zaWduZWQgbG9uZyBzaXplX3JlYWQgPSAwOworICAgdW5zaWduZWQgbG9uZyB0b3RhbF9yZWFkID0gMDsKKyAgIGlmIChmaW49PU5VTEwpCisgICB7CisgICAgICAgZXJyID0gWklQX0VSUk5POworICAgfQorCisgICAgaWYgKGVyciA9PSBaSVBfT0spCisgICAgICAgIGRvCisgICAgICAgIHsKKyAgICAgICAgICAgIGVyciA9IFpJUF9PSzsKKyAgICAgICAgICAgIHNpemVfcmVhZCA9IChpbnQpZnJlYWQoYnVmLDEsc2l6ZV9idWYsZmluKTsKKyAgICAgICAgICAgIGlmIChzaXplX3JlYWQgPCBzaXplX2J1ZikKKyAgICAgICAgICAgICAgICBpZiAoZmVvZihmaW4pPT0wKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHByaW50ZigiZXJyb3IgaW4gcmVhZGluZyAlc1xuIixmaWxlbmFtZWluemlwKTsKKyAgICAgICAgICAgICAgICBlcnIgPSBaSVBfRVJSTk87CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzaXplX3JlYWQ+MCkKKyAgICAgICAgICAgICAgICBjYWxjdWxhdGVfY3JjID0gY3JjMzIoY2FsY3VsYXRlX2NyYyxidWYsc2l6ZV9yZWFkKTsKKyAgICAgICAgICAgIHRvdGFsX3JlYWQgKz0gc2l6ZV9yZWFkOworCisgICAgICAgIH0gd2hpbGUgKChlcnIgPT0gWklQX09LKSAmJiAoc2l6ZV9yZWFkPjApKTsKKworICAgIGlmIChmaW4pCisgICAgICAgIGZjbG9zZShmaW4pOworCisgICAgKnJlc3VsdF9jcmM9Y2FsY3VsYXRlX2NyYzsKKyAgICBwcmludGYoImZpbGUgJXMgY3JjICVseFxuIiwgZmlsZW5hbWVpbnppcCwgY2FsY3VsYXRlX2NyYyk7CisgICAgcmV0dXJuIGVycjsKK30KKworaW50IGlzTGFyZ2VGaWxlKGNvbnN0IGNoYXIqIGZpbGVuYW1lKQoreworICBpbnQgbGFyZ2VGaWxlID0gMDsKKyAgWlBPUzY0X1QgcG9zID0gMDsKKyAgRklMRSogcEZpbGUgPSBGT1BFTl9GVU5DKGZpbGVuYW1lLCAicmIiKTsKKworICBpZihwRmlsZSAhPSBOVUxMKQorICB7CisgICAgaW50IG4gPSBGU0VFS09fRlVOQyhwRmlsZSwgMCwgU0VFS19FTkQpOworICAgIHBvcyA9IEZURUxMT19GVU5DKHBGaWxlKTsKKworICAgICAgICAgICAgICAgIHByaW50ZigiRmlsZSA6ICVzIGlzICVsbGQgYnl0ZXNcbiIsIGZpbGVuYW1lLCBwb3MpOworCisgICAgaWYocG9zID49IDB4ZmZmZmZmZmYpCisgICAgIGxhcmdlRmlsZSA9IDE7CisKKyAgICAgICAgICAgICAgICBmY2xvc2UocEZpbGUpOworICB9CisKKyByZXR1cm4gbGFyZ2VGaWxlOworfQorCitpbnQgbWFpbihhcmdjLGFyZ3YpCisgICAgaW50IGFyZ2M7CisgICAgY2hhciAqYXJndltdOworeworICAgIGludCBpOworICAgIGludCBvcHRfb3ZlcndyaXRlPTA7CisgICAgaW50IG9wdF9jb21wcmVzc19sZXZlbD1aX0RFRkFVTFRfQ09NUFJFU1NJT047CisgICAgaW50IG9wdF9leGNsdWRlX3BhdGg9MDsKKyAgICBpbnQgemlwZmlsZW5hbWVhcmcgPSAwOworICAgIGNoYXIgZmlsZW5hbWVfdHJ5W01BWEZJTEVOQU1FKzE2XTsKKyAgICBpbnQgemlwb2s7CisgICAgaW50IGVycj0wOworICAgIGludCBzaXplX2J1Zj0wOworICAgIHZvaWQqIGJ1Zj1OVUxMOworICAgIGNvbnN0IGNoYXIqIHBhc3N3b3JkPU5VTEw7CisKKworICAgIGRvX2Jhbm5lcigpOworICAgIGlmIChhcmdjPT0xKQorICAgIHsKKyAgICAgICAgZG9faGVscCgpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZm9yIChpPTE7aTxhcmdjO2krKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCgqYXJndltpXSk9PSctJykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwPWFyZ3ZbaV0rMTsKKworICAgICAgICAgICAgICAgIHdoaWxlICgoKnApIT0nXDAnKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2hhciBjPSoocCsrKTs7CisgICAgICAgICAgICAgICAgICAgIGlmICgoYz09J28nKSB8fCAoYz09J08nKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wdF9vdmVyd3JpdGUgPSAxOworICAgICAgICAgICAgICAgICAgICBpZiAoKGM9PSdhJykgfHwgKGM9PSdBJykpCisgICAgICAgICAgICAgICAgICAgICAgICBvcHRfb3ZlcndyaXRlID0gMjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChjPj0nMCcpICYmIChjPD0nOScpKQorICAgICAgICAgICAgICAgICAgICAgICAgb3B0X2NvbXByZXNzX2xldmVsID0gYy0nMCc7CisgICAgICAgICAgICAgICAgICAgIGlmICgoYz09J2onKSB8fCAoYz09J0onKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wdF9leGNsdWRlX3BhdGggPSAxOworCisgICAgICAgICAgICAgICAgICAgIGlmICgoKGM9PSdwJykgfHwgKGM9PSdQJykpICYmIChpKzE8YXJnYykpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhc3N3b3JkPWFyZ3ZbaSsxXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoemlwZmlsZW5hbWVhcmcgPT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHppcGZpbGVuYW1lYXJnID0gaSA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgc2l6ZV9idWYgPSBXUklURUJVRkZFUlNJWkU7CisgICAgYnVmID0gKHZvaWQqKW1hbGxvYyhzaXplX2J1Zik7CisgICAgaWYgKGJ1Zj09TlVMTCkKKyAgICB7CisgICAgICAgIHByaW50ZigiRXJyb3IgYWxsb2NhdGluZyBtZW1vcnlcbiIpOworICAgICAgICByZXR1cm4gWklQX0lOVEVSTkFMRVJST1I7CisgICAgfQorCisgICAgaWYgKHppcGZpbGVuYW1lYXJnPT0wKQorICAgIHsKKyAgICAgICAgemlwb2s9MDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaW50IGksbGVuOworICAgICAgICBpbnQgZG90X2ZvdW5kPTA7CisKKyAgICAgICAgemlwb2sgPSAxIDsKKyAgICAgICAgc3RybmNweShmaWxlbmFtZV90cnksIGFyZ3ZbemlwZmlsZW5hbWVhcmddLE1BWEZJTEVOQU1FLTEpOworICAgICAgICAvKiBzdHJuY3B5IGRvZXNudCBhcHBlbmQgdGhlIHRyYWlsaW5nIE5VTEwsIG9mIHRoZSBzdHJpbmcgaXMgdG9vIGxvbmcuICovCisgICAgICAgIGZpbGVuYW1lX3RyeVsgTUFYRklMRU5BTUUgXSA9ICdcMCc7CisKKyAgICAgICAgbGVuPShpbnQpc3RybGVuKGZpbGVuYW1lX3RyeSk7CisgICAgICAgIGZvciAoaT0wO2k8bGVuO2krKykKKyAgICAgICAgICAgIGlmIChmaWxlbmFtZV90cnlbaV09PScuJykKKyAgICAgICAgICAgICAgICBkb3RfZm91bmQ9MTsKKworICAgICAgICBpZiAoZG90X2ZvdW5kPT0wKQorICAgICAgICAgICAgc3RyY2F0KGZpbGVuYW1lX3RyeSwiLnppcCIpOworCisgICAgICAgIGlmIChvcHRfb3ZlcndyaXRlPT0yKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBpZiB0aGUgZmlsZSBkb24ndCBleGlzdCwgd2Ugbm90IGFwcGVuZCBmaWxlICovCisgICAgICAgICAgICBpZiAoY2hlY2tfZXhpc3RfZmlsZShmaWxlbmFtZV90cnkpPT0wKQorICAgICAgICAgICAgICAgIG9wdF9vdmVyd3JpdGU9MTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIGlmIChvcHRfb3ZlcndyaXRlPT0wKQorICAgICAgICAgICAgaWYgKGNoZWNrX2V4aXN0X2ZpbGUoZmlsZW5hbWVfdHJ5KSE9MCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjaGFyIHJlcD0wOworICAgICAgICAgICAgICAgIGRvCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjaGFyIGFuc3dlclsxMjhdOworICAgICAgICAgICAgICAgICAgICBpbnQgcmV0OworICAgICAgICAgICAgICAgICAgICBwcmludGYoIlRoZSBmaWxlICVzIGV4aXN0cy4gT3ZlcndyaXRlID8gW3ldZXMsIFtuXW8sIFthXXBwZW5kIDogIixmaWxlbmFtZV90cnkpOworICAgICAgICAgICAgICAgICAgICByZXQgPSBzY2FuZigiJTFzIixhbnN3ZXIpOworICAgICAgICAgICAgICAgICAgICBpZiAocmV0ICE9IDEpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJlcCA9IGFuc3dlclswXSA7CisgICAgICAgICAgICAgICAgICAgIGlmICgocmVwPj0nYScpICYmIChyZXA8PSd6JykpCisgICAgICAgICAgICAgICAgICAgICAgICByZXAgLT0gMHgyMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd2hpbGUgKChyZXAhPSdZJykgJiYgKHJlcCE9J04nKSAmJiAocmVwIT0nQScpKTsKKyAgICAgICAgICAgICAgICBpZiAocmVwPT0nTicpCisgICAgICAgICAgICAgICAgICAgIHppcG9rID0gMDsKKyAgICAgICAgICAgICAgICBpZiAocmVwPT0nQScpCisgICAgICAgICAgICAgICAgICAgIG9wdF9vdmVyd3JpdGUgPSAyOworICAgICAgICAgICAgfQorICAgIH0KKworICAgIGlmICh6aXBvaz09MSkKKyAgICB7CisgICAgICAgIHppcEZpbGUgemY7CisgICAgICAgIGludCBlcnJjbG9zZTsKKyMgICAgICAgIGlmZGVmIFVTRVdJTjMySU9BUEkKKyAgICAgICAgemxpYl9maWxlZnVuYzY0X2RlZiBmZnVuYzsKKyAgICAgICAgZmlsbF93aW4zMl9maWxlZnVuYzY0QSgmZmZ1bmMpOworICAgICAgICB6ZiA9IHppcE9wZW4yXzY0KGZpbGVuYW1lX3RyeSwob3B0X292ZXJ3cml0ZT09MikgPyAyIDogMCxOVUxMLCZmZnVuYyk7CisjICAgICAgICBlbHNlCisgICAgICAgIHpmID0gemlwT3BlbjY0KGZpbGVuYW1lX3RyeSwob3B0X292ZXJ3cml0ZT09MikgPyAyIDogMCk7CisjICAgICAgICBlbmRpZgorCisgICAgICAgIGlmICh6ZiA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBwcmludGYoImVycm9yIG9wZW5pbmcgJXNcbiIsZmlsZW5hbWVfdHJ5KTsKKyAgICAgICAgICAgIGVycj0gWklQX0VSUk5POworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHByaW50ZigiY3JlYXRpbmcgJXNcbiIsZmlsZW5hbWVfdHJ5KTsKKworICAgICAgICBmb3IgKGk9emlwZmlsZW5hbWVhcmcrMTsoaTxhcmdjKSAmJiAoZXJyPT1aSVBfT0spO2krKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCEoKCgoKihhcmd2W2ldKSk9PSctJykgfHwgKCgqKGFyZ3ZbaV0pKT09Jy8nKSkgJiYKKyAgICAgICAgICAgICAgICAgICgoYXJndltpXVsxXT09J28nKSB8fCAoYXJndltpXVsxXT09J08nKSB8fAorICAgICAgICAgICAgICAgICAgIChhcmd2W2ldWzFdPT0nYScpIHx8IChhcmd2W2ldWzFdPT0nQScpIHx8CisgICAgICAgICAgICAgICAgICAgKGFyZ3ZbaV1bMV09PSdwJykgfHwgKGFyZ3ZbaV1bMV09PSdQJykgfHwKKyAgICAgICAgICAgICAgICAgICAoKGFyZ3ZbaV1bMV0+PScwJykgfHwgKGFyZ3ZbaV1bMV08PSc5JykpKSAmJgorICAgICAgICAgICAgICAgICAgKHN0cmxlbihhcmd2W2ldKSA9PSAyKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRklMRSAqIGZpbjsKKyAgICAgICAgICAgICAgICBpbnQgc2l6ZV9yZWFkOworICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZpbGVuYW1laW56aXAgPSBhcmd2W2ldOworICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnNhdmVmaWxlbmFtZWluemlwOworICAgICAgICAgICAgICAgIHppcF9maWxlaW5mbyB6aTsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGNyY0ZpbGU9MDsKKyAgICAgICAgICAgICAgICBpbnQgemlwNjQgPSAwOworCisgICAgICAgICAgICAgICAgemkudG16X2RhdGUudG1fc2VjID0gemkudG16X2RhdGUudG1fbWluID0gemkudG16X2RhdGUudG1faG91ciA9CisgICAgICAgICAgICAgICAgemkudG16X2RhdGUudG1fbWRheSA9IHppLnRtel9kYXRlLnRtX21vbiA9IHppLnRtel9kYXRlLnRtX3llYXIgPSAwOworICAgICAgICAgICAgICAgIHppLmRvc0RhdGUgPSAwOworICAgICAgICAgICAgICAgIHppLmludGVybmFsX2ZhID0gMDsKKyAgICAgICAgICAgICAgICB6aS5leHRlcm5hbF9mYSA9IDA7CisgICAgICAgICAgICAgICAgZmlsZXRpbWUoZmlsZW5hbWVpbnppcCwmemkudG16X2RhdGUsJnppLmRvc0RhdGUpOworCisvKgorICAgICAgICAgICAgICAgIGVyciA9IHppcE9wZW5OZXdGaWxlSW5aaXAoemYsZmlsZW5hbWVpbnppcCwmemksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLDAsTlVMTCwwLE5VTEwgLyAqIGNvbW1lbnQgKiAvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9wdF9jb21wcmVzc19sZXZlbCAhPSAwKSA/IFpfREVGTEFURUQgOiAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0X2NvbXByZXNzX2xldmVsKTsKKyovCisgICAgICAgICAgICAgICAgaWYgKChwYXNzd29yZCAhPSBOVUxMKSAmJiAoZXJyPT1aSVBfT0spKQorICAgICAgICAgICAgICAgICAgICBlcnIgPSBnZXRGaWxlQ3JjKGZpbGVuYW1laW56aXAsYnVmLHNpemVfYnVmLCZjcmNGaWxlKTsKKworICAgICAgICAgICAgICAgIHppcDY0ID0gaXNMYXJnZUZpbGUoZmlsZW5hbWVpbnppcCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRoZSBwYXRoIG5hbWUgc2F2ZWQsIHNob3VsZCBub3QgaW5jbHVkZSBhIGxlYWRpbmcgc2xhc2guICovCisgICAgICAgICAgICAgICAvKmlmIGl0IGRpZCwgd2luZG93cy94cCBhbmQgZHluYXppcCBjb3VsZG4ndCByZWFkIHRoZSB6aXAgZmlsZS4gKi8KKyAgICAgICAgICAgICAgICAgc2F2ZWZpbGVuYW1laW56aXAgPSBmaWxlbmFtZWluemlwOworICAgICAgICAgICAgICAgICB3aGlsZSggc2F2ZWZpbGVuYW1laW56aXBbMF0gPT0gJ1xcJyB8fCBzYXZlZmlsZW5hbWVpbnppcFswXSA9PSAnLycgKQorICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICBzYXZlZmlsZW5hbWVpbnppcCsrOworICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgLypzaG91bGQgdGhlIHppcCBmaWxlIGNvbnRhaW4gYW55IHBhdGggYXQgYWxsPyovCisgICAgICAgICAgICAgICAgIGlmKCBvcHRfZXhjbHVkZV9wYXRoICkKKyAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdG1wcHRyOworICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbGFzdHNsYXNoID0gMDsKKyAgICAgICAgICAgICAgICAgICAgIGZvciggdG1wcHRyID0gc2F2ZWZpbGVuYW1laW56aXA7ICp0bXBwdHI7IHRtcHB0cisrKQorICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAqdG1wcHRyID09ICdcXCcgfHwgKnRtcHB0ciA9PSAnLycpCisgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0c2xhc2ggPSB0bXBwdHI7CisgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgaWYoIGxhc3RzbGFzaCAhPSBOVUxMICkKKyAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICBzYXZlZmlsZW5hbWVpbnppcCA9IGxhc3RzbGFzaCsxOyAvLyBiYXNlIGZpbGVuYW1lIGZvbGxvd3MgbGFzdCBzbGFzaC4KKyAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgIC8qKi8KKyAgICAgICAgICAgICAgICBlcnIgPSB6aXBPcGVuTmV3RmlsZUluWmlwM182NCh6ZixzYXZlZmlsZW5hbWVpbnppcCwmemksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLDAsTlVMTCwwLE5VTEwgLyogY29tbWVudCovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9wdF9jb21wcmVzc19sZXZlbCAhPSAwKSA/IFpfREVGTEFURUQgOiAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0X2NvbXByZXNzX2xldmVsLDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAtTUFYX1dCSVRTLCBERUZfTUVNX0xFVkVMLCBaX0RFRkFVTFRfU1RSQVRFR1ksICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtTUFYX1dCSVRTLCBERUZfTUVNX0xFVkVMLCBaX0RFRkFVTFRfU1RSQVRFR1ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzd29yZCxjcmNGaWxlLCB6aXA2NCk7CisKKyAgICAgICAgICAgICAgICBpZiAoZXJyICE9IFpJUF9PSykKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJlcnJvciBpbiBvcGVuaW5nICVzIGluIHppcGZpbGVcbiIsZmlsZW5hbWVpbnppcCk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmluID0gRk9QRU5fRlVOQyhmaWxlbmFtZWluemlwLCJyYiIpOworICAgICAgICAgICAgICAgICAgICBpZiAoZmluPT1OVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBlcnI9WklQX0VSUk5POworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJlcnJvciBpbiBvcGVuaW5nICVzIGZvciByZWFkaW5nXG4iLGZpbGVuYW1laW56aXApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBaSVBfT0spCisgICAgICAgICAgICAgICAgICAgIGRvCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IFpJUF9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfcmVhZCA9IChpbnQpZnJlYWQoYnVmLDEsc2l6ZV9idWYsZmluKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaXplX3JlYWQgPCBzaXplX2J1ZikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmVvZihmaW4pPT0wKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiZXJyb3IgaW4gcmVhZGluZyAlc1xuIixmaWxlbmFtZWluemlwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBaSVBfRVJSTk87CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaXplX3JlYWQ+MCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSB6aXBXcml0ZUluRmlsZUluWmlwICh6ZixidWYsc2l6ZV9yZWFkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyPDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoImVycm9yIGluIHdyaXRpbmcgJXMgaW4gdGhlIHppcGZpbGVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWVpbnppcCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKChlcnIgPT0gWklQX09LKSAmJiAoc2l6ZV9yZWFkPjApKTsKKworICAgICAgICAgICAgICAgIGlmIChmaW4pCisgICAgICAgICAgICAgICAgICAgIGZjbG9zZShmaW4pOworCisgICAgICAgICAgICAgICAgaWYgKGVycjwwKQorICAgICAgICAgICAgICAgICAgICBlcnI9WklQX0VSUk5POworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGVyciA9IHppcENsb3NlRmlsZUluWmlwKHpmKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVyciE9WklQX09LKQorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJlcnJvciBpbiBjbG9zaW5nICVzIGluIHRoZSB6aXBmaWxlXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWVpbnppcCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVycmNsb3NlID0gemlwQ2xvc2UoemYsTlVMTCk7CisgICAgICAgIGlmIChlcnJjbG9zZSAhPSBaSVBfT0spCisgICAgICAgICAgICBwcmludGYoImVycm9yIGluIGNsb3NpbmcgJXNcbiIsZmlsZW5hbWVfdHJ5KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICBkb19oZWxwKCk7CisgICAgfQorCisgICAgZnJlZShidWYpOworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvemxpYi0xLjIuNi9jb250cmliL21pbml6aXAvbWluaXppcC5wYy5pbiBiL3psaWItMS4yLjYvY29udHJpYi9taW5pemlwL21pbml6aXAucGMuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjliNWI3ZgotLS0gL2Rldi9udWxsCisrKyBiL3psaWItMS4yLjYvY29udHJpYi9taW5pemlwL21pbml6aXAucGMuaW4KQEAgLTAsMCArMSwxMiBAQAorcHJlZml4PUBwcmVmaXhACitleGVjX3ByZWZpeD1AZXhlY19wcmVmaXhACitsaWJkaXI9QGxpYmRpckAKK2luY2x1ZGVkaXI9QGluY2x1ZGVkaXJAL21pbml6aXAKKworTmFtZTogbWluaXppcAorRGVzY3JpcHRpb246IE1pbml6aXAgemlwIGZpbGUgbWFuaXB1bGF0aW9uIGxpYnJhcnkKK1JlcXVpcmVzOgorVmVyc2lvbjogQFBBQ0tBR0VfVkVSU0lPTkAKK0xpYnM6IC1MJHtsaWJkaXJ9IC1sbWluaXppcAorTGlicy5wcml2YXRlOiAtbHoKK0NmbGFnczogLUkke2luY2x1ZGVkaXJ9CmRpZmYgLS1naXQgYS96bGliLTEuMi42L2NvbnRyaWIvbWluaXppcC9tenRvb2xzLmMgYi96bGliLTEuMi42L2NvbnRyaWIvbWluaXppcC9tenRvb2xzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY4OTFjMgotLS0gL2Rldi9udWxsCisrKyBiL3psaWItMS4yLjYvY29udHJpYi9taW5pemlwL216dG9vbHMuYwpAQCAtMCwwICsxLDI5MSBAQAorLyoKKyAgQWRkaXRpb25hbCB0b29scyBmb3IgTWluaXppcAorICBDb2RlOiBYYXZpZXIgUm9jaGUgJzIwMDQKKyAgTGljZW5zZTogU2FtZSBhcyBaTElCICh3d3cuZ3ppcC5vcmcpCisqLworCisvKiBDb2RlICovCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJ6bGliLmgiCisjaW5jbHVkZSAidW56aXAuaCIKKworI2RlZmluZSBSRUFEXzgoYWRyKSAgKCh1bnNpZ25lZCBjaGFyKSooYWRyKSkKKyNkZWZpbmUgUkVBRF8xNihhZHIpICggUkVBRF84KGFkcikgfCAoUkVBRF84KGFkcisxKSA8PCA4KSApCisjZGVmaW5lIFJFQURfMzIoYWRyKSAoIFJFQURfMTYoYWRyKSB8IChSRUFEXzE2KChhZHIpKzIpIDw8IDE2KSApCisKKyNkZWZpbmUgV1JJVEVfOChidWZmLCBuKSBkbyB7IFwKKyAgKigodW5zaWduZWQgY2hhciopKGJ1ZmYpKSA9ICh1bnNpZ25lZCBjaGFyKSAoKG4pICYgMHhmZik7IFwKK30gd2hpbGUoMCkKKyNkZWZpbmUgV1JJVEVfMTYoYnVmZiwgbikgZG8geyBcCisgIFdSSVRFXzgoKHVuc2lnbmVkIGNoYXIqKShidWZmKSwgbik7IFwKKyAgV1JJVEVfOCgoKHVuc2lnbmVkIGNoYXIqKShidWZmKSkgKyAxLCAobikgPj4gOCk7IFwKK30gd2hpbGUoMCkKKyNkZWZpbmUgV1JJVEVfMzIoYnVmZiwgbikgZG8geyBcCisgIFdSSVRFXzE2KCh1bnNpZ25lZCBjaGFyKikoYnVmZiksIChuKSAmIDB4ZmZmZik7IFwKKyAgV1JJVEVfMTYoKHVuc2lnbmVkIGNoYXIqKShidWZmKSArIDIsIChuKSA+PiAxNik7IFwKK30gd2hpbGUoMCkKKworZXh0ZXJuIGludCBaRVhQT1JUIHVuelJlcGFpcihmaWxlLCBmaWxlT3V0LCBmaWxlT3V0VG1wLCBuUmVjb3ZlcmVkLCBieXRlc1JlY292ZXJlZCkKK2NvbnN0IGNoYXIqIGZpbGU7Citjb25zdCBjaGFyKiBmaWxlT3V0OworY29uc3QgY2hhciogZmlsZU91dFRtcDsKK3VMb25nKiBuUmVjb3ZlcmVkOwordUxvbmcqIGJ5dGVzUmVjb3ZlcmVkOworeworICBpbnQgZXJyID0gWl9PSzsKKyAgRklMRSogZnBaaXAgPSBmb3BlbihmaWxlLCAicmIiKTsKKyAgRklMRSogZnBPdXQgPSBmb3BlbihmaWxlT3V0LCAid2IiKTsKKyAgRklMRSogZnBPdXRDRCA9IGZvcGVuKGZpbGVPdXRUbXAsICJ3YiIpOworICBpZiAoZnBaaXAgIT0gTlVMTCAmJiAgZnBPdXQgIT0gTlVMTCkgeworICAgIGludCBlbnRyaWVzID0gMDsKKyAgICB1TG9uZyB0b3RhbEJ5dGVzID0gMDsKKyAgICBjaGFyIGhlYWRlclszMF07CisgICAgY2hhciBmaWxlbmFtZVsxMDI0XTsKKyAgICBjaGFyIGV4dHJhWzEwMjRdOworICAgIGludCBvZmZzZXQgPSAwOworICAgIGludCBvZmZzZXRDRCA9IDA7CisgICAgd2hpbGUgKCBmcmVhZChoZWFkZXIsIDEsIDMwLCBmcFppcCkgPT0gMzAgKSB7CisgICAgICBpbnQgY3VycmVudE9mZnNldCA9IG9mZnNldDsKKworICAgICAgLyogRmlsZSBlbnRyeSAqLworICAgICAgaWYgKFJFQURfMzIoaGVhZGVyKSA9PSAweDA0MDM0YjUwKSB7CisgICAgICAgIHVuc2lnbmVkIGludCB2ZXJzaW9uID0gUkVBRF8xNihoZWFkZXIgKyA0KTsKKyAgICAgICAgdW5zaWduZWQgaW50IGdwZmxhZyA9IFJFQURfMTYoaGVhZGVyICsgNik7CisgICAgICAgIHVuc2lnbmVkIGludCBtZXRob2QgPSBSRUFEXzE2KGhlYWRlciArIDgpOworICAgICAgICB1bnNpZ25lZCBpbnQgZmlsZXRpbWUgPSBSRUFEXzE2KGhlYWRlciArIDEwKTsKKyAgICAgICAgdW5zaWduZWQgaW50IGZpbGVkYXRlID0gUkVBRF8xNihoZWFkZXIgKyAxMik7CisgICAgICAgIHVuc2lnbmVkIGludCBjcmMgPSBSRUFEXzMyKGhlYWRlciArIDE0KTsgLyogY3JjICovCisgICAgICAgIHVuc2lnbmVkIGludCBjcHNpemUgPSBSRUFEXzMyKGhlYWRlciArIDE4KTsgLyogY29tcHJlc3NlZCBzaXplICovCisgICAgICAgIHVuc2lnbmVkIGludCB1bmNwc2l6ZSA9IFJFQURfMzIoaGVhZGVyICsgMjIpOyAvKiB1bmNvbXByZXNzZWQgc3ogKi8KKyAgICAgICAgdW5zaWduZWQgaW50IGZuc2l6ZSA9IFJFQURfMTYoaGVhZGVyICsgMjYpOyAvKiBmaWxlIG5hbWUgbGVuZ3RoICovCisgICAgICAgIHVuc2lnbmVkIGludCBleHRzaXplID0gUkVBRF8xNihoZWFkZXIgKyAyOCk7IC8qIGV4dHJhIGZpZWxkIGxlbmd0aCAqLworICAgICAgICBmaWxlbmFtZVswXSA9IGV4dHJhWzBdID0gJ1wwJzsKKworICAgICAgICAvKiBIZWFkZXIgKi8KKyAgICAgICAgaWYgKGZ3cml0ZShoZWFkZXIsIDEsIDMwLCBmcE91dCkgPT0gMzApIHsKKyAgICAgICAgICBvZmZzZXQgKz0gMzA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZXJyID0gWl9FUlJOTzsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8qIEZpbGVuYW1lICovCisgICAgICAgIGlmIChmbnNpemUgPiAwKSB7CisgICAgICAgICAgaWYgKGZuc2l6ZSA8IHNpemVvZihmaWxlbmFtZSkpIHsKKyAgICAgICAgICAgIGlmIChmcmVhZChmaWxlbmFtZSwgMSwgZm5zaXplLCBmcFppcCkgPT0gZm5zaXplKSB7CisgICAgICAgICAgICAgICAgaWYgKGZ3cml0ZShmaWxlbmFtZSwgMSwgZm5zaXplLCBmcE91dCkgPT0gZm5zaXplKSB7CisgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGZuc2l6ZTsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBaX0VSUk5POworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBlcnIgPSBaX0VSUk5POworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZXJyID0gWl9FUlJOTzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBlcnIgPSBaX1NUUkVBTV9FUlJPUjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8qIEV4dHJhIGZpZWxkICovCisgICAgICAgIGlmIChleHRzaXplID4gMCkgeworICAgICAgICAgIGlmIChleHRzaXplIDwgc2l6ZW9mKGV4dHJhKSkgeworICAgICAgICAgICAgaWYgKGZyZWFkKGV4dHJhLCAxLCBleHRzaXplLCBmcFppcCkgPT0gZXh0c2l6ZSkgeworICAgICAgICAgICAgICBpZiAoZndyaXRlKGV4dHJhLCAxLCBleHRzaXplLCBmcE91dCkgPT0gZXh0c2l6ZSkgeworICAgICAgICAgICAgICAgIG9mZnNldCArPSBleHRzaXplOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZXJyID0gWl9FUlJOTzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgZXJyID0gWl9FUlJOTzsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGVyciA9IFpfRVJSTk87CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBEYXRhICovCisgICAgICAgIHsKKyAgICAgICAgICBpbnQgZGF0YVNpemUgPSBjcHNpemU7CisgICAgICAgICAgaWYgKGRhdGFTaXplID09IDApIHsKKyAgICAgICAgICAgIGRhdGFTaXplID0gdW5jcHNpemU7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChkYXRhU2l6ZSA+IDApIHsKKyAgICAgICAgICAgIGNoYXIqIGRhdGEgPSBtYWxsb2MoZGF0YVNpemUpOworICAgICAgICAgICAgaWYgKGRhdGEgIT0gTlVMTCkgeworICAgICAgICAgICAgICBpZiAoKGludClmcmVhZChkYXRhLCAxLCBkYXRhU2l6ZSwgZnBaaXApID09IGRhdGFTaXplKSB7CisgICAgICAgICAgICAgICAgaWYgKChpbnQpZndyaXRlKGRhdGEsIDEsIGRhdGFTaXplLCBmcE91dCkgPT0gZGF0YVNpemUpIHsKKyAgICAgICAgICAgICAgICAgIG9mZnNldCArPSBkYXRhU2l6ZTsKKyAgICAgICAgICAgICAgICAgIHRvdGFsQnl0ZXMgKz0gZGF0YVNpemU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgIGVyciA9IFpfRVJSTk87CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGVyciA9IFpfRVJSTk87CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZnJlZShkYXRhKTsKKyAgICAgICAgICAgICAgaWYgKGVyciAhPSBaX09LKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGVyciA9IFpfTUVNX0VSUk9SOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBDZW50cmFsIGRpcmVjdG9yeSBlbnRyeSAqLworICAgICAgICB7CisgICAgICAgICAgY2hhciBoZWFkZXJbNDZdOworICAgICAgICAgIGNoYXIqIGNvbW1lbnQgPSAiIjsKKyAgICAgICAgICBpbnQgY29tc2l6ZSA9IChpbnQpIHN0cmxlbihjb21tZW50KTsKKyAgICAgICAgICBXUklURV8zMihoZWFkZXIsIDB4MDIwMTRiNTApOworICAgICAgICAgIFdSSVRFXzE2KGhlYWRlciArIDQsIHZlcnNpb24pOworICAgICAgICAgIFdSSVRFXzE2KGhlYWRlciArIDYsIHZlcnNpb24pOworICAgICAgICAgIFdSSVRFXzE2KGhlYWRlciArIDgsIGdwZmxhZyk7CisgICAgICAgICAgV1JJVEVfMTYoaGVhZGVyICsgMTAsIG1ldGhvZCk7CisgICAgICAgICAgV1JJVEVfMTYoaGVhZGVyICsgMTIsIGZpbGV0aW1lKTsKKyAgICAgICAgICBXUklURV8xNihoZWFkZXIgKyAxNCwgZmlsZWRhdGUpOworICAgICAgICAgIFdSSVRFXzMyKGhlYWRlciArIDE2LCBjcmMpOworICAgICAgICAgIFdSSVRFXzMyKGhlYWRlciArIDIwLCBjcHNpemUpOworICAgICAgICAgIFdSSVRFXzMyKGhlYWRlciArIDI0LCB1bmNwc2l6ZSk7CisgICAgICAgICAgV1JJVEVfMTYoaGVhZGVyICsgMjgsIGZuc2l6ZSk7CisgICAgICAgICAgV1JJVEVfMTYoaGVhZGVyICsgMzAsIGV4dHNpemUpOworICAgICAgICAgIFdSSVRFXzE2KGhlYWRlciArIDMyLCBjb21zaXplKTsKKyAgICAgICAgICBXUklURV8xNihoZWFkZXIgKyAzNCwgMCk7ICAgICAvKiBkaXNrICMgKi8KKyAgICAgICAgICBXUklURV8xNihoZWFkZXIgKyAzNiwgMCk7ICAgICAvKiBpbnQgYXR0cmIgKi8KKyAgICAgICAgICBXUklURV8zMihoZWFkZXIgKyAzOCwgMCk7ICAgICAvKiBleHQgYXR0cmIgKi8KKyAgICAgICAgICBXUklURV8zMihoZWFkZXIgKyA0MiwgY3VycmVudE9mZnNldCk7CisgICAgICAgICAgLyogSGVhZGVyICovCisgICAgICAgICAgaWYgKGZ3cml0ZShoZWFkZXIsIDEsIDQ2LCBmcE91dENEKSA9PSA0NikgeworICAgICAgICAgICAgb2Zmc2V0Q0QgKz0gNDY7CisKKyAgICAgICAgICAgIC8qIEZpbGVuYW1lICovCisgICAgICAgICAgICBpZiAoZm5zaXplID4gMCkgeworICAgICAgICAgICAgICBpZiAoZndyaXRlKGZpbGVuYW1lLCAxLCBmbnNpemUsIGZwT3V0Q0QpID09IGZuc2l6ZSkgeworICAgICAgICAgICAgICAgIG9mZnNldENEICs9IGZuc2l6ZTsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBaX0VSUk5POworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBlcnIgPSBaX1NUUkVBTV9FUlJPUjsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIEV4dHJhIGZpZWxkICovCisgICAgICAgICAgICBpZiAoZXh0c2l6ZSA+IDApIHsKKyAgICAgICAgICAgICAgaWYgKGZ3cml0ZShleHRyYSwgMSwgZXh0c2l6ZSwgZnBPdXRDRCkgPT0gZXh0c2l6ZSkgeworICAgICAgICAgICAgICAgIG9mZnNldENEICs9IGV4dHNpemU7CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZXJyID0gWl9FUlJOTzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBDb21tZW50IGZpZWxkICovCisgICAgICAgICAgICBpZiAoY29tc2l6ZSA+IDApIHsKKyAgICAgICAgICAgICAgaWYgKChpbnQpZndyaXRlKGNvbW1lbnQsIDEsIGNvbXNpemUsIGZwT3V0Q0QpID09IGNvbXNpemUpIHsKKyAgICAgICAgICAgICAgICBvZmZzZXRDRCArPSBjb21zaXplOworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGVyciA9IFpfRVJSTk87CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGVyciA9IFpfRVJSTk87CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBTdWNjZXNzICovCisgICAgICAgIGVudHJpZXMrKzsKKworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorCisgICAgLyogRmluYWwgY2VudHJhbCBkaXJlY3RvcnkgICovCisgICAgeworICAgICAgaW50IGVudHJpZXNaaXAgPSBlbnRyaWVzOworICAgICAgY2hhciBoZWFkZXJbMjJdOworICAgICAgY2hhciogY29tbWVudCA9ICIiOyAvLyAiWklQIEZpbGUgcmVjb3ZlcmVkIGJ5IHpsaWIvbWluaXppcC9tenRvb2xzIjsKKyAgICAgIGludCBjb21zaXplID0gKGludCkgc3RybGVuKGNvbW1lbnQpOworICAgICAgaWYgKGVudHJpZXNaaXAgPiAweGZmZmYpIHsKKyAgICAgICAgZW50cmllc1ppcCA9IDB4ZmZmZjsKKyAgICAgIH0KKyAgICAgIFdSSVRFXzMyKGhlYWRlciwgMHgwNjA1NGI1MCk7CisgICAgICBXUklURV8xNihoZWFkZXIgKyA0LCAwKTsgICAgLyogZGlzayAjICovCisgICAgICBXUklURV8xNihoZWFkZXIgKyA2LCAwKTsgICAgLyogZGlzayAjICovCisgICAgICBXUklURV8xNihoZWFkZXIgKyA4LCBlbnRyaWVzWmlwKTsgICAvKiBoYWNrICovCisgICAgICBXUklURV8xNihoZWFkZXIgKyAxMCwgZW50cmllc1ppcCk7ICAvKiBoYWNrICovCisgICAgICBXUklURV8zMihoZWFkZXIgKyAxMiwgb2Zmc2V0Q0QpOyAgICAvKiBzaXplIG9mIENEICovCisgICAgICBXUklURV8zMihoZWFkZXIgKyAxNiwgb2Zmc2V0KTsgICAgICAvKiBvZmZzZXQgdG8gQ0QgKi8KKyAgICAgIFdSSVRFXzE2KGhlYWRlciArIDIwLCBjb21zaXplKTsgICAgIC8qIGNvbW1lbnQgKi8KKworICAgICAgLyogSGVhZGVyICovCisgICAgICBpZiAoZndyaXRlKGhlYWRlciwgMSwgMjIsIGZwT3V0Q0QpID09IDIyKSB7CisKKyAgICAgICAgLyogQ29tbWVudCBmaWVsZCAqLworICAgICAgICBpZiAoY29tc2l6ZSA+IDApIHsKKyAgICAgICAgICBpZiAoKGludClmd3JpdGUoY29tbWVudCwgMSwgY29tc2l6ZSwgZnBPdXRDRCkgIT0gY29tc2l6ZSkgeworICAgICAgICAgICAgZXJyID0gWl9FUlJOTzsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZXJyID0gWl9FUlJOTzsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBGaW5hbCBtZXJnZSAoZmlsZSArIGNlbnRyYWwgZGlyZWN0b3J5KSAqLworICAgIGZjbG9zZShmcE91dENEKTsKKyAgICBpZiAoZXJyID09IFpfT0spIHsKKyAgICAgIGZwT3V0Q0QgPSBmb3BlbihmaWxlT3V0VG1wLCAicmIiKTsKKyAgICAgIGlmIChmcE91dENEICE9IE5VTEwpIHsKKyAgICAgICAgaW50IG5SZWFkOworICAgICAgICBjaGFyIGJ1ZmZlcls4MTkyXTsKKyAgICAgICAgd2hpbGUgKCAoblJlYWQgPSAoaW50KWZyZWFkKGJ1ZmZlciwgMSwgc2l6ZW9mKGJ1ZmZlciksIGZwT3V0Q0QpKSA+IDApIHsKKyAgICAgICAgICBpZiAoKGludClmd3JpdGUoYnVmZmVyLCAxLCBuUmVhZCwgZnBPdXQpICE9IG5SZWFkKSB7CisgICAgICAgICAgICBlcnIgPSBaX0VSUk5POworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZjbG9zZShmcE91dENEKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBDbG9zZSAqLworICAgIGZjbG9zZShmcFppcCk7CisgICAgZmNsb3NlKGZwT3V0KTsKKworICAgIC8qIFdpcGUgdGVtcG9yYXJ5IGZpbGUgKi8KKyAgICAodm9pZClyZW1vdmUoZmlsZU91dFRtcCk7CisKKyAgICAvKiBOdW1iZXIgb2YgcmVjb3ZlcmVkIGVudHJpZXMgKi8KKyAgICBpZiAoZXJyID09IFpfT0spIHsKKyAgICAgIGlmIChuUmVjb3ZlcmVkICE9IE5VTEwpIHsKKyAgICAgICAgKm5SZWNvdmVyZWQgPSBlbnRyaWVzOworICAgICAgfQorICAgICAgaWYgKGJ5dGVzUmVjb3ZlcmVkICE9IE5VTEwpIHsKKyAgICAgICAgKmJ5dGVzUmVjb3ZlcmVkID0gdG90YWxCeXRlczsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CisgICAgZXJyID0gWl9TVFJFQU1fRVJST1I7CisgIH0KKyAgcmV0dXJuIGVycjsKK30KZGlmZiAtLWdpdCBhL3psaWItMS4yLjYvY29udHJpYi9taW5pemlwL216dG9vbHMuaCBiL3psaWItMS4yLjYvY29udHJpYi9taW5pemlwL216dG9vbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDlhNDI2Ci0tLSAvZGV2L251bGwKKysrIGIvemxpYi0xLjIuNi9jb250cmliL21pbml6aXAvbXp0b29scy5oCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgIEFkZGl0aW9uYWwgdG9vbHMgZm9yIE1pbml6aXAKKyAgQ29kZTogWGF2aWVyIFJvY2hlICcyMDA0CisgIExpY2Vuc2U6IFNhbWUgYXMgWkxJQiAod3d3Lmd6aXAub3JnKQorKi8KKworI2lmbmRlZiBfemlwX3Rvb2xzX0gKKyNkZWZpbmUgX3ppcF90b29sc19ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2lmbmRlZiBfWkxJQl9ICisjaW5jbHVkZSAiemxpYi5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJ1bnppcC5oIgorCisvKiBSZXBhaXIgYSBaSVAgZmlsZSAobWlzc2luZyBjZW50cmFsIGRpcmVjdG9yeSkKKyAgIGZpbGU6IGZpbGUgdG8gcmVjb3ZlcgorICAgZmlsZU91dDogb3V0cHV0IGZpbGUgYWZ0ZXIgcmVjb3ZlcnkKKyAgIGZpbGVPdXRUbXA6IHRlbXBvcmFyeSBmaWxlIG5hbWUgdXNlZCBmb3IgcmVjb3ZlcnkKKyovCitleHRlcm4gaW50IFpFWFBPUlQgdW56UmVwYWlyKGNvbnN0IGNoYXIqIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZpbGVPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZpbGVPdXRUbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVMb25nKiBuUmVjb3ZlcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1TG9uZyogYnl0ZXNSZWNvdmVyZWQpOworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKworI2VuZGlmCmRpZmYgLS1naXQgYS96bGliLTEuMi42L2NvbnRyaWIvbWluaXppcC91bnppcC5jIGIvemxpYi0xLjIuNi9jb250cmliL21pbml6aXAvdW56aXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmZhZDRiCi0tLSAvZGV2L251bGwKKysrIGIvemxpYi0xLjIuNi9jb250cmliL21pbml6aXAvdW56aXAuYwpAQCAtMCwwICsxLDIxMjUgQEAKKy8qIHVuemlwLmMgLS0gSU8gZm9yIHVuY29tcHJlc3MgLnppcCBmaWxlcyB1c2luZyB6bGliCisgICBWZXJzaW9uIDEuMSwgRmVicnVhcnkgMTRoLCAyMDEwCisgICBwYXJ0IG9mIHRoZSBNaW5pWmlwIHByb2plY3QgLSAoIGh0dHA6Ly93d3cud2luaW1hZ2UuY29tL3pMaWJEbGwvbWluaXppcC5odG1sICkKKworICAgICAgICAgQ29weXJpZ2h0IChDKSAxOTk4LTIwMTAgR2lsbGVzIFZvbGxhbnQgKG1pbml6aXApICggaHR0cDovL3d3dy53aW5pbWFnZS5jb20vekxpYkRsbC9taW5pemlwLmh0bWwgKQorCisgICAgICAgICBNb2RpZmljYXRpb25zIG9mIFVuemlwIGZvciBaaXA2NAorICAgICAgICAgQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggRXZlbiBSb3VhdWx0CisKKyAgICAgICAgIE1vZGlmaWNhdGlvbnMgZm9yIFppcDY0IHN1cHBvcnQgb24gYm90aCB6aXAgYW5kIHVuemlwCisgICAgICAgICBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMCBNYXRoaWFzIFN2ZW5zc29uICggaHR0cDovL3Jlc3VsdDQyLmNvbSApCisKKyAgICAgICAgIEZvciBtb3JlIGluZm8gcmVhZCBNaW5pWmlwX2luZm8udHh0CisKKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgRGVjcnlwdGlvbiBjb2RlIGNvbWVzIGZyb20gY3J5cHQuYyBieSBJbmZvLVpJUCBidXQgaGFzIGJlZW4gZ3JlYXRseSByZWR1Y2VkIGluIHRlcm1zIG9mCisgIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciBzb2Z0d2FyZS4gVGhlIGZvbGxvd2luZyBpcyBmcm9tIHRoZSBvcmlnaW5hbCBjcnlwdC5jLgorICBDb2RlIHdvdmVuIGluIGJ5IFRlcnJ5IFRob3JzZW4gMS8yMDAzLgorCisgIENvcHlyaWdodCAoYykgMTk5MC0yMDAwIEluZm8tWklQLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICBTZWUgdGhlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0UsIHZlcnNpb24gMjAwMC1BcHItMDkgb3IgbGF0ZXIKKyAgKHRoZSBjb250ZW50cyBvZiB3aGljaCBhcmUgYWxzbyBpbmNsdWRlZCBpbiB6aXAuaCkgZm9yIHRlcm1zIG9mIHVzZS4KKyAgSWYsIGZvciBzb21lIHJlYXNvbiwgYWxsIHRoZXNlIGZpbGVzIGFyZSBtaXNzaW5nLCB0aGUgSW5mby1aSVAgbGljZW5zZQorICBhbHNvIG1heSBiZSBmb3VuZCBhdDogIGZ0cDovL2Z0cC5pbmZvLXppcC5vcmcvcHViL2luZm96aXAvbGljZW5zZS5odG1sCisKKyAgICAgICAgY3J5cHQuYyAoZnVsbCB2ZXJzaW9uKSBieSBJbmZvLVpJUC4gICAgICBMYXN0IHJldmlzZWQ6ICBbc2VlIGNyeXB0LmhdCisKKyAgVGhlIGVuY3J5cHRpb24vZGVjcnlwdGlvbiBwYXJ0cyBvZiB0aGlzIHNvdXJjZSBjb2RlIChhcyBvcHBvc2VkIHRvIHRoZQorICBub24tZWNob2luZyBwYXNzd29yZCBwYXJ0cykgd2VyZSBvcmlnaW5hbGx5IHdyaXR0ZW4gaW4gRXVyb3BlLiAgVGhlCisgIHdob2xlIHNvdXJjZSBwYWNrYWdlIGNhbiBiZSBmcmVlbHkgZGlzdHJpYnV0ZWQsIGluY2x1ZGluZyBmcm9tIHRoZSBVU0EuCisgIChQcmlvciB0byBKYW51YXJ5IDIwMDAsIHJlLWV4cG9ydCBmcm9tIHRoZSBVUyB3YXMgYSB2aW9sYXRpb24gb2YgVVMgbGF3LikKKworICAgICAgICBUaGlzIGVuY3J5cHRpb24gY29kZSBpcyBhIGRpcmVjdCB0cmFuc2NyaXB0aW9uIG9mIHRoZSBhbGdvcml0aG0gZnJvbQorICBSb2dlciBTY2hsYWZseSwgZGVzY3JpYmVkIGJ5IFBoaWwgS2F0eiBpbiB0aGUgZmlsZSBhcHBub3RlLnR4dC4gIFRoaXMKKyAgZmlsZSAoYXBwbm90ZS50eHQpIGlzIGRpc3RyaWJ1dGVkIHdpdGggdGhlIFBLWklQIHByb2dyYW0gKGV2ZW4gaW4gdGhlCisgIHZlcnNpb24gd2l0aG91dCBlbmNyeXB0aW9uIGNhcGFiaWxpdGllcykuCisKKyAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgQ2hhbmdlcyBpbiB1bnppcC5jCisKKyAgICAgICAgMjAwNy0yMDA4IC0gRXZlbiBSb3VhdWx0IC0gQWRkaXRpb24gb2YgY3BsX3VuekdldEN1cnJlbnRGaWxlWlN0cmVhbVBvcworICAyMDA3LTIwMDggLSBFdmVuIFJvdWF1bHQgLSBEZWNvcmF0aW9uIG9mIHN5bWJvbCBuYW1lcyB1bnoqIC0+IGNwbF91bnoqCisgIDIwMDctMjAwOCAtIEV2ZW4gUm91YXVsdCAtIFJlbW92ZSBvbGQgQyBzdHlsZSBmdW5jdGlvbiBwcm90b3R5cGVzCisgIDIwMDctMjAwOCAtIEV2ZW4gUm91YXVsdCAtIEFkZCB1bnppcCBzdXBwb3J0IGZvciBaSVA2NAorCisgICAgICAgIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEV2ZW4gUm91YXVsdAorCisKKyAgICAgICAgT2N0LTIwMDkgLSBNYXRoaWFzIFN2ZW5zc29uIC0gUmVtb3ZlZCBjcGxfKiBmcm9tIHN5bWJvbCBuYW1lcyAoRXZlbiBSb3VhdWx0IGFkZGVkIHRoZW0gYnV0IHNpbmNlIHRoaXMgaXMgbm93IG1vdmVkIHRvIGEgbmV3IHByb2plY3QgKG1pbml6aXA2NCkgSSByZW5hbWVkIHRoZW0gYWdhaW4pLgorICBPY3QtMjAwOSAtIE1hdGhpYXMgU3ZlbnNzb24gLSBGaXhlZCBwcm9ibGVtIGlmIHVuY29tcHJlc3NlZCBzaXplIHdhcyA+IDRHIGFuZCBjb21wcmVzc2VkIHNpemUgd2FzIDw0RworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGQgb25seSByZWFkIHRoZSBjb21wcmVzc2VkL3VuY29tcHJlc3NlZCBzaXplIGZyb20gdGhlIFppcDY0IGZvcm1hdCBpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgc2l6ZSBmcm9tIG5vcm1hbCBoZWFkZXIgd2FzIDB4RkZGRkZGRkYKKyAgT2N0LTIwMDkgLSBNYXRoaWFzIFN2ZW5zc29uIC0gQXBwbGllZCBzb21lIGJ1ZyBmaXhlcyBmcm9tIHBhY2hlcyByZWNpdmVkIGZyb20gR2lsbGVzIFZvbGxhbnQKKyAgICAgICAgT2N0LTIwMDkgLSBNYXRoaWFzIFN2ZW5zc29uIC0gQXBwbGllZCBzdXBwb3J0IHRvIHVuemlwIGZpbGVzIHdpdGggY29tcHJlc3Npb24gbWF0aG9kIEJaSVAyIChiemlwMiBsaWIgaXMgcmVxdWlyZWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhdGNoIGNyZWF0ZWQgYnkgRGFuaWVsIEJvcmNhCisKKyAgSmFuLTIwMTAgLSBiYWNrIHRvIHVuemlwIGFuZCBtaW5pemlwIDEuMCBuYW1lIHNjaGVtZSwgd2l0aCBjb21wYXRpYmlsaXR5IGxheWVyCisKKyAgQ29weXJpZ2h0IChDKSAxOTk4IC0gMjAxMCBHaWxsZXMgVm9sbGFudCwgRXZlbiBSb3VhdWx0LCBNYXRoaWFzIFN2ZW5zc29uCisKKyovCisKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpZm5kZWYgTk9VTkNSWVBUCisgICAgICAgICNkZWZpbmUgTk9VTkNSWVBUCisjZW5kaWYKKworI2luY2x1ZGUgInpsaWIuaCIKKyNpbmNsdWRlICJ1bnppcC5oIgorCisjaWZkZWYgU1REQworIyAgaW5jbHVkZSA8c3RkZGVmLmg+CisjICBpbmNsdWRlIDxzdHJpbmcuaD4KKyMgIGluY2x1ZGUgPHN0ZGxpYi5oPgorI2VuZGlmCisjaWZkZWYgTk9fRVJSTk9fSAorICAgIGV4dGVybiBpbnQgZXJybm87CisjZWxzZQorIyAgIGluY2x1ZGUgPGVycm5vLmg+CisjZW5kaWYKKworCisjaWZuZGVmIGxvY2FsCisjICBkZWZpbmUgbG9jYWwgc3RhdGljCisjZW5kaWYKKy8qIGNvbXBpbGUgd2l0aCAtRGxvY2FsIGlmIHlvdXIgZGVidWdnZXIgY2FuJ3QgZmluZCBzdGF0aWMgc3ltYm9scyAqLworCisKKyNpZm5kZWYgQ0FTRVNFTlNJVElWSVRZREVGQVVMVF9OTworIyAgaWYgIWRlZmluZWQodW5peCkgJiYgIWRlZmluZWQoQ0FTRVNFTlNJVElWSVRZREVGQVVMVF9ZRVMpCisjICAgIGRlZmluZSBDQVNFU0VOU0lUSVZJVFlERUZBVUxUX05PCisjICBlbmRpZgorI2VuZGlmCisKKworI2lmbmRlZiBVTlpfQlVGU0laRQorI2RlZmluZSBVTlpfQlVGU0laRSAoMTYzODQpCisjZW5kaWYKKworI2lmbmRlZiBVTlpfTUFYRklMRU5BTUVJTlpJUAorI2RlZmluZSBVTlpfTUFYRklMRU5BTUVJTlpJUCAoMjU2KQorI2VuZGlmCisKKyNpZm5kZWYgQUxMT0MKKyMgZGVmaW5lIEFMTE9DKHNpemUpIChtYWxsb2Moc2l6ZSkpCisjZW5kaWYKKyNpZm5kZWYgVFJZRlJFRQorIyBkZWZpbmUgVFJZRlJFRShwKSB7aWYgKHApIGZyZWUocCk7fQorI2VuZGlmCisKKyNkZWZpbmUgU0laRUNFTlRSQUxESVJJVEVNICgweDJlKQorI2RlZmluZSBTSVpFWklQTE9DQUxIRUFERVIgKDB4MWUpCisKKworY29uc3QgY2hhciB1bnpfY29weXJpZ2h0W10gPQorICAgIiB1bnppcCAxLjAxIENvcHlyaWdodCAxOTk4LTIwMDQgR2lsbGVzIFZvbGxhbnQgLSBodHRwOi8vd3d3LndpbmltYWdlLmNvbS96TGliRGxsIjsKKworLyogdW56X2ZpbGVfaW5mb19pbnRlcm50YWwgY29udGFpbiBpbnRlcm5hbCBpbmZvIGFib3V0IGEgZmlsZSBpbiB6aXBmaWxlKi8KK3R5cGVkZWYgc3RydWN0IHVuel9maWxlX2luZm82NF9pbnRlcm5hbF9zCit7CisgICAgWlBPUzY0X1Qgb2Zmc2V0X2N1cmZpbGU7LyogcmVsYXRpdmUgb2Zmc2V0IG9mIGxvY2FsIGhlYWRlciA4IGJ5dGVzICovCit9IHVuel9maWxlX2luZm82NF9pbnRlcm5hbDsKKworCisvKiBmaWxlX2luX3ppcF9yZWFkX2luZm9fcyBjb250YWluIGludGVybmFsIGluZm9ybWF0aW9uIGFib3V0IGEgZmlsZSBpbiB6aXBmaWxlLAorICAgIHdoZW4gcmVhZGluZyBhbmQgZGVjb21wcmVzcyBpdCAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBjaGFyICAqcmVhZF9idWZmZXI7ICAgICAgICAgLyogaW50ZXJuYWwgYnVmZmVyIGZvciBjb21wcmVzc2VkIGRhdGEgKi8KKyAgICB6X3N0cmVhbSBzdHJlYW07ICAgICAgICAgICAgLyogekxpYiBzdHJlYW0gc3RydWN0dXJlIGZvciBpbmZsYXRlICovCisKKyNpZmRlZiBIQVZFX0JaSVAyCisgICAgYnpfc3RyZWFtIGJzdHJlYW07ICAgICAgICAgIC8qIGJ6TGliIHN0cmVhbSBzdHJ1Y3R1cmUgZm9yIGJ6aXBlZCAqLworI2VuZGlmCisKKyAgICBaUE9TNjRfVCBwb3NfaW5femlwZmlsZTsgICAgICAgLyogcG9zaXRpb24gaW4gYnl0ZSBvbiB0aGUgemlwZmlsZSwgZm9yIGZzZWVrKi8KKyAgICB1TG9uZyBzdHJlYW1faW5pdGlhbGlzZWQ7ICAgLyogZmxhZyBzZXQgaWYgc3RyZWFtIHN0cnVjdHVyZSBpcyBpbml0aWFsaXNlZCovCisKKyAgICBaUE9TNjRfVCBvZmZzZXRfbG9jYWxfZXh0cmFmaWVsZDsvKiBvZmZzZXQgb2YgdGhlIGxvY2FsIGV4dHJhIGZpZWxkICovCisgICAgdUludCAgc2l6ZV9sb2NhbF9leHRyYWZpZWxkOy8qIHNpemUgb2YgdGhlIGxvY2FsIGV4dHJhIGZpZWxkICovCisgICAgWlBPUzY0X1QgcG9zX2xvY2FsX2V4dHJhZmllbGQ7ICAgLyogcG9zaXRpb24gaW4gdGhlIGxvY2FsIGV4dHJhIGZpZWxkIGluIHJlYWQqLworICAgIFpQT1M2NF9UIHRvdGFsX291dF82NDsKKworICAgIHVMb25nIGNyYzMyOyAgICAgICAgICAgICAgICAvKiBjcmMzMiBvZiBhbGwgZGF0YSB1bmNvbXByZXNzZWQgKi8KKyAgICB1TG9uZyBjcmMzMl93YWl0OyAgICAgICAgICAgLyogY3JjMzIgd2UgbXVzdCBvYnRhaW4gYWZ0ZXIgZGVjb21wcmVzcyBhbGwgKi8KKyAgICBaUE9TNjRfVCByZXN0X3JlYWRfY29tcHJlc3NlZDsgLyogbnVtYmVyIG9mIGJ5dGUgdG8gYmUgZGVjb21wcmVzc2VkICovCisgICAgWlBPUzY0X1QgcmVzdF9yZWFkX3VuY29tcHJlc3NlZDsvKm51bWJlciBvZiBieXRlIHRvIGJlIG9idGFpbmVkIGFmdGVyIGRlY29tcCovCisgICAgemxpYl9maWxlZnVuYzY0XzMyX2RlZiB6X2ZpbGVmdW5jOworICAgIHZvaWRwZiBmaWxlc3RyZWFtOyAgICAgICAgLyogaW8gc3RydWN0b3JlIG9mIHRoZSB6aXBmaWxlICovCisgICAgdUxvbmcgY29tcHJlc3Npb25fbWV0aG9kOyAgIC8qIGNvbXByZXNzaW9uIG1ldGhvZCAoMD09c3RvcmUpICovCisgICAgWlBPUzY0X1QgYnl0ZV9iZWZvcmVfdGhlX3ppcGZpbGU7LyogYnl0ZSBiZWZvcmUgdGhlIHppcGZpbGUsICg+MCBmb3Igc2Z4KSovCisgICAgaW50ICAgcmF3OworfSBmaWxlX2luX3ppcDY0X3JlYWRfaW5mb19zOworCisKKy8qIHVuejY0X3MgY29udGFpbiBpbnRlcm5hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgemlwZmlsZQorKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgemxpYl9maWxlZnVuYzY0XzMyX2RlZiB6X2ZpbGVmdW5jOworICAgIGludCBpczY0Yml0T3BlbkZ1bmN0aW9uOworICAgIHZvaWRwZiBmaWxlc3RyZWFtOyAgICAgICAgLyogaW8gc3RydWN0b3JlIG9mIHRoZSB6aXBmaWxlICovCisgICAgdW56X2dsb2JhbF9pbmZvNjQgZ2k7ICAgICAgIC8qIHB1YmxpYyBnbG9iYWwgaW5mb3JtYXRpb24gKi8KKyAgICBaUE9TNjRfVCBieXRlX2JlZm9yZV90aGVfemlwZmlsZTsvKiBieXRlIGJlZm9yZSB0aGUgemlwZmlsZSwgKD4wIGZvciBzZngpKi8KKyAgICBaUE9TNjRfVCBudW1fZmlsZTsgICAgICAgICAgICAgLyogbnVtYmVyIG9mIHRoZSBjdXJyZW50IGZpbGUgaW4gdGhlIHppcGZpbGUqLworICAgIFpQT1M2NF9UIHBvc19pbl9jZW50cmFsX2RpcjsgICAvKiBwb3Mgb2YgdGhlIGN1cnJlbnQgZmlsZSBpbiB0aGUgY2VudHJhbCBkaXIqLworICAgIFpQT1M2NF9UIGN1cnJlbnRfZmlsZV9vazsgICAgICAvKiBmbGFnIGFib3V0IHRoZSB1c2FiaWxpdHkgb2YgdGhlIGN1cnJlbnQgZmlsZSovCisgICAgWlBPUzY0X1QgY2VudHJhbF9wb3M7ICAgICAgICAgIC8qIHBvc2l0aW9uIG9mIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGNlbnRyYWwgZGlyKi8KKworICAgIFpQT1M2NF9UIHNpemVfY2VudHJhbF9kaXI7ICAgICAvKiBzaXplIG9mIHRoZSBjZW50cmFsIGRpcmVjdG9yeSAgKi8KKyAgICBaUE9TNjRfVCBvZmZzZXRfY2VudHJhbF9kaXI7ICAgLyogb2Zmc2V0IG9mIHN0YXJ0IG9mIGNlbnRyYWwgZGlyZWN0b3J5IHdpdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcGVjdCB0byB0aGUgc3RhcnRpbmcgZGlzayBudW1iZXIgKi8KKworICAgIHVuel9maWxlX2luZm82NCBjdXJfZmlsZV9pbmZvOyAvKiBwdWJsaWMgaW5mbyBhYm91dCB0aGUgY3VycmVudCBmaWxlIGluIHppcCovCisgICAgdW56X2ZpbGVfaW5mbzY0X2ludGVybmFsIGN1cl9maWxlX2luZm9faW50ZXJuYWw7IC8qIHByaXZhdGUgaW5mbyBhYm91dCBpdCovCisgICAgZmlsZV9pbl96aXA2NF9yZWFkX2luZm9fcyogcGZpbGVfaW5femlwX3JlYWQ7IC8qIHN0cnVjdHVyZSBhYm91dCB0aGUgY3VycmVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUgaWYgd2UgYXJlIGRlY29tcHJlc3NpbmcgaXQgKi8KKyAgICBpbnQgZW5jcnlwdGVkOworCisgICAgaW50IGlzWmlwNjQ7CisKKyMgICAgaWZuZGVmIE5PVU5DUllQVAorICAgIHVuc2lnbmVkIGxvbmcga2V5c1szXTsgICAgIC8qIGtleXMgZGVmaW5pbmcgdGhlIHBzZXVkby1yYW5kb20gc2VxdWVuY2UgKi8KKyAgICBjb25zdCB1bnNpZ25lZCBsb25nKiBwY3JjXzMyX3RhYjsKKyMgICAgZW5kaWYKK30gdW56NjRfczsKKworCisjaWZuZGVmIE5PVU5DUllQVAorI2luY2x1ZGUgImNyeXB0LmgiCisjZW5kaWYKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgIFJlYWQgYSBieXRlIGZyb20gYSBnel9zdHJlYW07IHVwZGF0ZSBuZXh0X2luIGFuZCBhdmFpbF9pbi4gUmV0dXJuIEVPRgorICAgZm9yIGVuZCBvZiBmaWxlLgorICAgSU4gYXNzZXJ0aW9uOiB0aGUgc3RyZWFtIHMgaGFzIGJlZW4gc3VjZXNzZnVsbHkgb3BlbmVkIGZvciByZWFkaW5nLgorKi8KKworCitsb2NhbCBpbnQgdW56NjRsb2NhbF9nZXRCeXRlIE9GKCgKKyAgICBjb25zdCB6bGliX2ZpbGVmdW5jNjRfMzJfZGVmKiBwemxpYl9maWxlZnVuY19kZWYsCisgICAgdm9pZHBmIGZpbGVzdHJlYW0sCisgICAgaW50ICpwaSkpOworCitsb2NhbCBpbnQgdW56NjRsb2NhbF9nZXRCeXRlKGNvbnN0IHpsaWJfZmlsZWZ1bmM2NF8zMl9kZWYqIHB6bGliX2ZpbGVmdW5jX2RlZiwgdm9pZHBmIGZpbGVzdHJlYW0sIGludCAqcGkpCit7CisgICAgdW5zaWduZWQgY2hhciBjOworICAgIGludCBlcnIgPSAoaW50KVpSRUFENjQoKnB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtLCZjLDEpOworICAgIGlmIChlcnI9PTEpCisgICAgeworICAgICAgICAqcGkgPSAoaW50KWM7CisgICAgICAgIHJldHVybiBVTlpfT0s7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmIChaRVJST1I2NCgqcHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0pKQorICAgICAgICAgICAgcmV0dXJuIFVOWl9FUlJOTzsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIFVOWl9FT0Y7CisgICAgfQorfQorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgUmVhZHMgYSBsb25nIGluIExTQiBvcmRlciBmcm9tIHRoZSBnaXZlbiBnel9zdHJlYW0uIFNldHMKKyovCitsb2NhbCBpbnQgdW56NjRsb2NhbF9nZXRTaG9ydCBPRigoCisgICAgY29uc3QgemxpYl9maWxlZnVuYzY0XzMyX2RlZiogcHpsaWJfZmlsZWZ1bmNfZGVmLAorICAgIHZvaWRwZiBmaWxlc3RyZWFtLAorICAgIHVMb25nICpwWCkpOworCitsb2NhbCBpbnQgdW56NjRsb2NhbF9nZXRTaG9ydCAoY29uc3QgemxpYl9maWxlZnVuYzY0XzMyX2RlZiogcHpsaWJfZmlsZWZ1bmNfZGVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkcGYgZmlsZXN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdUxvbmcgKnBYKQoreworICAgIHVMb25nIHggOworICAgIGludCBpID0gMDsKKyAgICBpbnQgZXJyOworCisgICAgZXJyID0gdW56NjRsb2NhbF9nZXRCeXRlKHB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtLCZpKTsKKyAgICB4ID0gKHVMb25nKWk7CisKKyAgICBpZiAoZXJyPT1VTlpfT0spCisgICAgICAgIGVyciA9IHVuejY0bG9jYWxfZ2V0Qnl0ZShwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSwmaSk7CisgICAgeCB8PSAoKHVMb25nKWkpPDw4OworCisgICAgaWYgKGVycj09VU5aX09LKQorICAgICAgICAqcFggPSB4OworICAgIGVsc2UKKyAgICAgICAgKnBYID0gMDsKKyAgICByZXR1cm4gZXJyOworfQorCitsb2NhbCBpbnQgdW56NjRsb2NhbF9nZXRMb25nIE9GKCgKKyAgICBjb25zdCB6bGliX2ZpbGVmdW5jNjRfMzJfZGVmKiBwemxpYl9maWxlZnVuY19kZWYsCisgICAgdm9pZHBmIGZpbGVzdHJlYW0sCisgICAgdUxvbmcgKnBYKSk7CisKK2xvY2FsIGludCB1bno2NGxvY2FsX2dldExvbmcgKGNvbnN0IHpsaWJfZmlsZWZ1bmM2NF8zMl9kZWYqIHB6bGliX2ZpbGVmdW5jX2RlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkcGYgZmlsZXN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1TG9uZyAqcFgpCit7CisgICAgdUxvbmcgeCA7CisgICAgaW50IGkgPSAwOworICAgIGludCBlcnI7CisKKyAgICBlcnIgPSB1bno2NGxvY2FsX2dldEJ5dGUocHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0sJmkpOworICAgIHggPSAodUxvbmcpaTsKKworICAgIGlmIChlcnI9PVVOWl9PSykKKyAgICAgICAgZXJyID0gdW56NjRsb2NhbF9nZXRCeXRlKHB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtLCZpKTsKKyAgICB4IHw9ICgodUxvbmcpaSk8PDg7CisKKyAgICBpZiAoZXJyPT1VTlpfT0spCisgICAgICAgIGVyciA9IHVuejY0bG9jYWxfZ2V0Qnl0ZShwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSwmaSk7CisgICAgeCB8PSAoKHVMb25nKWkpPDwxNjsKKworICAgIGlmIChlcnI9PVVOWl9PSykKKyAgICAgICAgZXJyID0gdW56NjRsb2NhbF9nZXRCeXRlKHB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtLCZpKTsKKyAgICB4ICs9ICgodUxvbmcpaSk8PDI0OworCisgICAgaWYgKGVycj09VU5aX09LKQorICAgICAgICAqcFggPSB4OworICAgIGVsc2UKKyAgICAgICAgKnBYID0gMDsKKyAgICByZXR1cm4gZXJyOworfQorCitsb2NhbCBpbnQgdW56NjRsb2NhbF9nZXRMb25nNjQgT0YoKAorICAgIGNvbnN0IHpsaWJfZmlsZWZ1bmM2NF8zMl9kZWYqIHB6bGliX2ZpbGVmdW5jX2RlZiwKKyAgICB2b2lkcGYgZmlsZXN0cmVhbSwKKyAgICBaUE9TNjRfVCAqcFgpKTsKKworCitsb2NhbCBpbnQgdW56NjRsb2NhbF9nZXRMb25nNjQgKGNvbnN0IHpsaWJfZmlsZWZ1bmM2NF8zMl9kZWYqIHB6bGliX2ZpbGVmdW5jX2RlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkcGYgZmlsZXN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBaUE9TNjRfVCAqcFgpCit7CisgICAgWlBPUzY0X1QgeCA7CisgICAgaW50IGkgPSAwOworICAgIGludCBlcnI7CisKKyAgICBlcnIgPSB1bno2NGxvY2FsX2dldEJ5dGUocHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0sJmkpOworICAgIHggPSAoWlBPUzY0X1QpaTsKKworICAgIGlmIChlcnI9PVVOWl9PSykKKyAgICAgICAgZXJyID0gdW56NjRsb2NhbF9nZXRCeXRlKHB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtLCZpKTsKKyAgICB4IHw9ICgoWlBPUzY0X1QpaSk8PDg7CisKKyAgICBpZiAoZXJyPT1VTlpfT0spCisgICAgICAgIGVyciA9IHVuejY0bG9jYWxfZ2V0Qnl0ZShwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSwmaSk7CisgICAgeCB8PSAoKFpQT1M2NF9UKWkpPDwxNjsKKworICAgIGlmIChlcnI9PVVOWl9PSykKKyAgICAgICAgZXJyID0gdW56NjRsb2NhbF9nZXRCeXRlKHB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtLCZpKTsKKyAgICB4IHw9ICgoWlBPUzY0X1QpaSk8PDI0OworCisgICAgaWYgKGVycj09VU5aX09LKQorICAgICAgICBlcnIgPSB1bno2NGxvY2FsX2dldEJ5dGUocHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0sJmkpOworICAgIHggfD0gKChaUE9TNjRfVClpKTw8MzI7CisKKyAgICBpZiAoZXJyPT1VTlpfT0spCisgICAgICAgIGVyciA9IHVuejY0bG9jYWxfZ2V0Qnl0ZShwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSwmaSk7CisgICAgeCB8PSAoKFpQT1M2NF9UKWkpPDw0MDsKKworICAgIGlmIChlcnI9PVVOWl9PSykKKyAgICAgICAgZXJyID0gdW56NjRsb2NhbF9nZXRCeXRlKHB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtLCZpKTsKKyAgICB4IHw9ICgoWlBPUzY0X1QpaSk8PDQ4OworCisgICAgaWYgKGVycj09VU5aX09LKQorICAgICAgICBlcnIgPSB1bno2NGxvY2FsX2dldEJ5dGUocHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0sJmkpOworICAgIHggfD0gKChaUE9TNjRfVClpKTw8NTY7CisKKyAgICBpZiAoZXJyPT1VTlpfT0spCisgICAgICAgICpwWCA9IHg7CisgICAgZWxzZQorICAgICAgICAqcFggPSAwOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qIE15IG93biBzdHJjbXBpIC8gc3RyY2FzZWNtcCAqLworbG9jYWwgaW50IHN0cmNtcGNhc2Vub3NlbnNpdGl2ZV9pbnRlcm5hbCAoY29uc3QgY2hhciogZmlsZU5hbWUxLCBjb25zdCBjaGFyKiBmaWxlTmFtZTIpCit7CisgICAgZm9yICg7OykKKyAgICB7CisgICAgICAgIGNoYXIgYzE9KihmaWxlTmFtZTErKyk7CisgICAgICAgIGNoYXIgYzI9KihmaWxlTmFtZTIrKyk7CisgICAgICAgIGlmICgoYzE+PSdhJykgJiYgKGMxPD0neicpKQorICAgICAgICAgICAgYzEgLT0gMHgyMDsKKyAgICAgICAgaWYgKChjMj49J2EnKSAmJiAoYzI8PSd6JykpCisgICAgICAgICAgICBjMiAtPSAweDIwOworICAgICAgICBpZiAoYzE9PSdcMCcpCisgICAgICAgICAgICByZXR1cm4gKChjMj09J1wwJykgPyAwIDogLTEpOworICAgICAgICBpZiAoYzI9PSdcMCcpCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgaWYgKGMxPGMyKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBpZiAoYzE+YzIpCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICB9Cit9CisKKworI2lmZGVmICBDQVNFU0VOU0lUSVZJVFlERUZBVUxUX05PCisjZGVmaW5lIENBU0VTRU5TSVRJVklUWURFRkFVTFRWQUxVRSAyCisjZWxzZQorI2RlZmluZSBDQVNFU0VOU0lUSVZJVFlERUZBVUxUVkFMVUUgMQorI2VuZGlmCisKKyNpZm5kZWYgU1RSQ01QQ0FTRU5PU0VOVElWRUZVTkNUSU9OCisjZGVmaW5lIFNUUkNNUENBU0VOT1NFTlRJVkVGVU5DVElPTiBzdHJjbXBjYXNlbm9zZW5zaXRpdmVfaW50ZXJuYWwKKyNlbmRpZgorCisvKgorICAgQ29tcGFyZSB0d28gZmlsZW5hbWUgKGZpbGVOYW1lMSxmaWxlTmFtZTIpLgorICAgSWYgaUNhc2VTZW5pc2l2aXR5ID0gMSwgY29tcGFyaXNpb24gaXMgY2FzZSBzZW5zaXRpdml0eSAobGlrZSBzdHJjbXApCisgICBJZiBpQ2FzZVNlbmlzaXZpdHkgPSAyLCBjb21wYXJpc2lvbiBpcyBub3QgY2FzZSBzZW5zaXRpdml0eSAobGlrZSBzdHJjbXBpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Igc3RyY2FzZWNtcCkKKyAgIElmIGlDYXNlU2VuaXNpdml0eSA9IDAsIGNhc2Ugc2Vuc2l0aXZpdHkgaXMgZGVmYXV0IG9mIHlvdXIgb3BlcmF0aW5nIHN5c3RlbQorICAgICAgICAobGlrZSAxIG9uIFVuaXgsIDIgb24gV2luZG93cykKKworKi8KK2V4dGVybiBpbnQgWkVYUE9SVCB1bnpTdHJpbmdGaWxlTmFtZUNvbXBhcmUgKGNvbnN0IGNoYXIqICBmaWxlTmFtZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogIGZpbGVOYW1lMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaUNhc2VTZW5zaXRpdml0eSkKKworeworICAgIGlmIChpQ2FzZVNlbnNpdGl2aXR5PT0wKQorICAgICAgICBpQ2FzZVNlbnNpdGl2aXR5PUNBU0VTRU5TSVRJVklUWURFRkFVTFRWQUxVRTsKKworICAgIGlmIChpQ2FzZVNlbnNpdGl2aXR5PT0xKQorICAgICAgICByZXR1cm4gc3RyY21wKGZpbGVOYW1lMSxmaWxlTmFtZTIpOworCisgICAgcmV0dXJuIFNUUkNNUENBU0VOT1NFTlRJVkVGVU5DVElPTihmaWxlTmFtZTEsZmlsZU5hbWUyKTsKK30KKworI2lmbmRlZiBCVUZSRUFEQ09NTUVOVAorI2RlZmluZSBCVUZSRUFEQ09NTUVOVCAoMHg0MDApCisjZW5kaWYKKworLyoKKyAgTG9jYXRlIHRoZSBDZW50cmFsIGRpcmVjdG9yeSBvZiBhIHppcGZpbGUgKGF0IHRoZSBlbmQsIGp1c3QgYmVmb3JlCisgICAgdGhlIGdsb2JhbCBjb21tZW50KQorKi8KK2xvY2FsIFpQT1M2NF9UIHVuejY0bG9jYWxfU2VhcmNoQ2VudHJhbERpciBPRigoY29uc3QgemxpYl9maWxlZnVuYzY0XzMyX2RlZiogcHpsaWJfZmlsZWZ1bmNfZGVmLCB2b2lkcGYgZmlsZXN0cmVhbSkpOworbG9jYWwgWlBPUzY0X1QgdW56NjRsb2NhbF9TZWFyY2hDZW50cmFsRGlyKGNvbnN0IHpsaWJfZmlsZWZ1bmM2NF8zMl9kZWYqIHB6bGliX2ZpbGVmdW5jX2RlZiwgdm9pZHBmIGZpbGVzdHJlYW0pCit7CisgICAgdW5zaWduZWQgY2hhciogYnVmOworICAgIFpQT1M2NF9UIHVTaXplRmlsZTsKKyAgICBaUE9TNjRfVCB1QmFja1JlYWQ7CisgICAgWlBPUzY0X1QgdU1heEJhY2s9MHhmZmZmOyAvKiBtYXhpbXVtIHNpemUgb2YgZ2xvYmFsIGNvbW1lbnQgKi8KKyAgICBaUE9TNjRfVCB1UG9zRm91bmQ9MDsKKworICAgIGlmIChaU0VFSzY0KCpwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSwwLFpMSUJfRklMRUZVTkNfU0VFS19FTkQpICE9IDApCisgICAgICAgIHJldHVybiAwOworCisKKyAgICB1U2l6ZUZpbGUgPSBaVEVMTDY0KCpwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSk7CisKKyAgICBpZiAodU1heEJhY2s+dVNpemVGaWxlKQorICAgICAgICB1TWF4QmFjayA9IHVTaXplRmlsZTsKKworICAgIGJ1ZiA9ICh1bnNpZ25lZCBjaGFyKilBTExPQyhCVUZSRUFEQ09NTUVOVCs0KTsKKyAgICBpZiAoYnVmPT1OVUxMKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHVCYWNrUmVhZCA9IDQ7CisgICAgd2hpbGUgKHVCYWNrUmVhZDx1TWF4QmFjaykKKyAgICB7CisgICAgICAgIHVMb25nIHVSZWFkU2l6ZTsKKyAgICAgICAgWlBPUzY0X1QgdVJlYWRQb3MgOworICAgICAgICBpbnQgaTsKKyAgICAgICAgaWYgKHVCYWNrUmVhZCtCVUZSRUFEQ09NTUVOVD51TWF4QmFjaykKKyAgICAgICAgICAgIHVCYWNrUmVhZCA9IHVNYXhCYWNrOworICAgICAgICBlbHNlCisgICAgICAgICAgICB1QmFja1JlYWQrPUJVRlJFQURDT01NRU5UOworICAgICAgICB1UmVhZFBvcyA9IHVTaXplRmlsZS11QmFja1JlYWQgOworCisgICAgICAgIHVSZWFkU2l6ZSA9ICgoQlVGUkVBRENPTU1FTlQrNCkgPCAodVNpemVGaWxlLXVSZWFkUG9zKSkgPworICAgICAgICAgICAgICAgICAgICAgKEJVRlJFQURDT01NRU5UKzQpIDogKHVMb25nKSh1U2l6ZUZpbGUtdVJlYWRQb3MpOworICAgICAgICBpZiAoWlNFRUs2NCgqcHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0sdVJlYWRQb3MsWkxJQl9GSUxFRlVOQ19TRUVLX1NFVCkhPTApCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBpZiAoWlJFQUQ2NCgqcHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0sYnVmLHVSZWFkU2l6ZSkhPXVSZWFkU2l6ZSkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGZvciAoaT0oaW50KXVSZWFkU2l6ZS0zOyAoaS0tKT4wOykKKyAgICAgICAgICAgIGlmICgoKCooYnVmK2kpKT09MHg1MCkgJiYgKCgqKGJ1ZitpKzEpKT09MHg0YikgJiYKKyAgICAgICAgICAgICAgICAoKCooYnVmK2krMikpPT0weDA1KSAmJiAoKCooYnVmK2krMykpPT0weDA2KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1UG9zRm91bmQgPSB1UmVhZFBvcytpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgIGlmICh1UG9zRm91bmQhPTApCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgVFJZRlJFRShidWYpOworICAgIHJldHVybiB1UG9zRm91bmQ7Cit9CisKKworLyoKKyAgTG9jYXRlIHRoZSBDZW50cmFsIGRpcmVjdG9yeSA2NCBvZiBhIHppcGZpbGUgKGF0IHRoZSBlbmQsIGp1c3QgYmVmb3JlCisgICAgdGhlIGdsb2JhbCBjb21tZW50KQorKi8KK2xvY2FsIFpQT1M2NF9UIHVuejY0bG9jYWxfU2VhcmNoQ2VudHJhbERpcjY0IE9GKCgKKyAgICBjb25zdCB6bGliX2ZpbGVmdW5jNjRfMzJfZGVmKiBwemxpYl9maWxlZnVuY19kZWYsCisgICAgdm9pZHBmIGZpbGVzdHJlYW0pKTsKKworbG9jYWwgWlBPUzY0X1QgdW56NjRsb2NhbF9TZWFyY2hDZW50cmFsRGlyNjQoY29uc3QgemxpYl9maWxlZnVuYzY0XzMyX2RlZiogcHpsaWJfZmlsZWZ1bmNfZGVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkcGYgZmlsZXN0cmVhbSkKK3sKKyAgICB1bnNpZ25lZCBjaGFyKiBidWY7CisgICAgWlBPUzY0X1QgdVNpemVGaWxlOworICAgIFpQT1M2NF9UIHVCYWNrUmVhZDsKKyAgICBaUE9TNjRfVCB1TWF4QmFjaz0weGZmZmY7IC8qIG1heGltdW0gc2l6ZSBvZiBnbG9iYWwgY29tbWVudCAqLworICAgIFpQT1M2NF9UIHVQb3NGb3VuZD0wOworICAgIHVMb25nIHVMOworICAgICAgICAgICAgICAgIFpQT1M2NF9UIHJlbGF0aXZlT2Zmc2V0OworCisgICAgaWYgKFpTRUVLNjQoKnB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtLDAsWkxJQl9GSUxFRlVOQ19TRUVLX0VORCkgIT0gMCkKKyAgICAgICAgcmV0dXJuIDA7CisKKworICAgIHVTaXplRmlsZSA9IFpURUxMNjQoKnB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtKTsKKworICAgIGlmICh1TWF4QmFjaz51U2l6ZUZpbGUpCisgICAgICAgIHVNYXhCYWNrID0gdVNpemVGaWxlOworCisgICAgYnVmID0gKHVuc2lnbmVkIGNoYXIqKUFMTE9DKEJVRlJFQURDT01NRU5UKzQpOworICAgIGlmIChidWY9PU5VTEwpCisgICAgICAgIHJldHVybiAwOworCisgICAgdUJhY2tSZWFkID0gNDsKKyAgICB3aGlsZSAodUJhY2tSZWFkPHVNYXhCYWNrKQorICAgIHsKKyAgICAgICAgdUxvbmcgdVJlYWRTaXplOworICAgICAgICBaUE9TNjRfVCB1UmVhZFBvczsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGlmICh1QmFja1JlYWQrQlVGUkVBRENPTU1FTlQ+dU1heEJhY2spCisgICAgICAgICAgICB1QmFja1JlYWQgPSB1TWF4QmFjazsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdUJhY2tSZWFkKz1CVUZSRUFEQ09NTUVOVDsKKyAgICAgICAgdVJlYWRQb3MgPSB1U2l6ZUZpbGUtdUJhY2tSZWFkIDsKKworICAgICAgICB1UmVhZFNpemUgPSAoKEJVRlJFQURDT01NRU5UKzQpIDwgKHVTaXplRmlsZS11UmVhZFBvcykpID8KKyAgICAgICAgICAgICAgICAgICAgIChCVUZSRUFEQ09NTUVOVCs0KSA6ICh1TG9uZykodVNpemVGaWxlLXVSZWFkUG9zKTsKKyAgICAgICAgaWYgKFpTRUVLNjQoKnB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtLHVSZWFkUG9zLFpMSUJfRklMRUZVTkNfU0VFS19TRVQpIT0wKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgaWYgKFpSRUFENjQoKnB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtLGJ1Zix1UmVhZFNpemUpIT11UmVhZFNpemUpCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBmb3IgKGk9KGludCl1UmVhZFNpemUtMzsgKGktLSk+MDspCisgICAgICAgICAgICBpZiAoKCgqKGJ1ZitpKSk9PTB4NTApICYmICgoKihidWYraSsxKSk9PTB4NGIpICYmCisgICAgICAgICAgICAgICAgKCgqKGJ1ZitpKzIpKT09MHgwNikgJiYgKCgqKGJ1ZitpKzMpKT09MHgwNykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdVBvc0ZvdW5kID0gdVJlYWRQb3MraTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICBpZiAodVBvc0ZvdW5kIT0wKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIFRSWUZSRUUoYnVmKTsKKyAgICBpZiAodVBvc0ZvdW5kID09IDApCisgICAgICAgIHJldHVybiAwOworCisgICAgLyogWmlwNjQgZW5kIG9mIGNlbnRyYWwgZGlyZWN0b3J5IGxvY2F0b3IgKi8KKyAgICBpZiAoWlNFRUs2NCgqcHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0sIHVQb3NGb3VuZCxaTElCX0ZJTEVGVU5DX1NFRUtfU0VUKSE9MCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICAvKiB0aGUgc2lnbmF0dXJlLCBhbHJlYWR5IGNoZWNrZWQgKi8KKyAgICBpZiAodW56NjRsb2NhbF9nZXRMb25nKHB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtLCZ1TCkhPVVOWl9PSykKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICAvKiBudW1iZXIgb2YgdGhlIGRpc2sgd2l0aCB0aGUgc3RhcnQgb2YgdGhlIHppcDY0IGVuZCBvZiAgY2VudHJhbCBkaXJlY3RvcnkgKi8KKyAgICBpZiAodW56NjRsb2NhbF9nZXRMb25nKHB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtLCZ1TCkhPVVOWl9PSykKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKHVMICE9IDApCisgICAgICAgIHJldHVybiAwOworCisgICAgLyogcmVsYXRpdmUgb2Zmc2V0IG9mIHRoZSB6aXA2NCBlbmQgb2YgY2VudHJhbCBkaXJlY3RvcnkgcmVjb3JkICovCisgICAgaWYgKHVuejY0bG9jYWxfZ2V0TG9uZzY0KHB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtLCZyZWxhdGl2ZU9mZnNldCkhPVVOWl9PSykKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICAvKiB0b3RhbCBudW1iZXIgb2YgZGlza3MgKi8KKyAgICBpZiAodW56NjRsb2NhbF9nZXRMb25nKHB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtLCZ1TCkhPVVOWl9PSykKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKHVMICE9IDEpCisgICAgICAgIHJldHVybiAwOworCisgICAgLyogR290byBlbmQgb2YgY2VudHJhbCBkaXJlY3RvcnkgcmVjb3JkICovCisgICAgaWYgKFpTRUVLNjQoKnB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtLCByZWxhdGl2ZU9mZnNldCxaTElCX0ZJTEVGVU5DX1NFRUtfU0VUKSE9MCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgLyogdGhlIHNpZ25hdHVyZSAqLworICAgIGlmICh1bno2NGxvY2FsX2dldExvbmcocHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0sJnVMKSE9VU5aX09LKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlmICh1TCAhPSAweDA2MDY0YjUwKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHJldHVybiByZWxhdGl2ZU9mZnNldDsKK30KKworLyoKKyAgT3BlbiBhIFppcCBmaWxlLiBwYXRoIGNvbnRhaW4gdGhlIGZ1bGwgcGF0aG5hbWUgKGJ5IGV4YW1wbGUsCisgICAgIG9uIGEgV2luZG93cyBOVCBjb21wdXRlciAiYzpcXHRlc3RcXHpsaWIxMTQuemlwIiBvciBvbiBhbiBVbml4IGNvbXB1dGVyCisgICAgICJ6bGliL3psaWIxMTQuemlwIi4KKyAgICAgSWYgdGhlIHppcGZpbGUgY2Fubm90IGJlIG9wZW5lZCAoZmlsZSBkb2Vzbid0IGV4aXN0IG9yIGluIG5vdCB2YWxpZCksIHRoZQorICAgICAgIHJldHVybiB2YWx1ZSBpcyBOVUxMLgorICAgICBFbHNlLCB0aGUgcmV0dXJuIHZhbHVlIGlzIGEgdW56RmlsZSBIYW5kbGUsIHVzYWJsZSB3aXRoIG90aGVyIGZ1bmN0aW9uCisgICAgICAgb2YgdGhpcyB1bnppcCBwYWNrYWdlLgorKi8KK2xvY2FsIHVuekZpbGUgdW56T3BlbkludGVybmFsIChjb25zdCB2b2lkICpwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpsaWJfZmlsZWZ1bmM2NF8zMl9kZWYqIHB6bGliX2ZpbGVmdW5jNjRfMzJfZGVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpczY0Yml0T3BlbkZ1bmN0aW9uKQoreworICAgIHVuejY0X3MgdXM7CisgICAgdW56NjRfcyAqczsKKyAgICBaUE9TNjRfVCBjZW50cmFsX3BvczsKKyAgICB1TG9uZyAgIHVMOworCisgICAgdUxvbmcgbnVtYmVyX2Rpc2s7ICAgICAgICAgIC8qIG51bWJlciBvZiB0aGUgY3VycmVudCBkaXN0LCB1c2VkIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFuaW5nIFpJUCwgdW5zdXBwb3J0ZWQsIGFsd2F5cyAwKi8KKyAgICB1TG9uZyBudW1iZXJfZGlza193aXRoX0NEOyAgLyogbnVtYmVyIHRoZSB0aGUgZGlzayB3aXRoIGNlbnRyYWwgZGlyLCB1c2VkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBzcGFuaW5nIFpJUCwgdW5zdXBwb3J0ZWQsIGFsd2F5cyAwKi8KKyAgICBaUE9TNjRfVCBudW1iZXJfZW50cnlfQ0Q7ICAgICAgLyogdG90YWwgbnVtYmVyIG9mIGVudHJpZXMgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGNlbnRyYWwgZGlyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzYW1lIHRoYW4gbnVtYmVyX2VudHJ5IG9uIG5vc3BhbikgKi8KKworICAgIGludCBlcnI9VU5aX09LOworCisgICAgaWYgKHVuel9jb3B5cmlnaHRbMF0hPScgJykKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICB1cy56X2ZpbGVmdW5jLnpzZWVrMzJfZmlsZSA9IE5VTEw7CisgICAgdXMuel9maWxlZnVuYy56dGVsbDMyX2ZpbGUgPSBOVUxMOworICAgIGlmIChwemxpYl9maWxlZnVuYzY0XzMyX2RlZj09TlVMTCkKKyAgICAgICAgZmlsbF9mb3BlbjY0X2ZpbGVmdW5jKCZ1cy56X2ZpbGVmdW5jLnpmaWxlX2Z1bmM2NCk7CisgICAgZWxzZQorICAgICAgICB1cy56X2ZpbGVmdW5jID0gKnB6bGliX2ZpbGVmdW5jNjRfMzJfZGVmOworICAgIHVzLmlzNjRiaXRPcGVuRnVuY3Rpb24gPSBpczY0Yml0T3BlbkZ1bmN0aW9uOworCisKKworICAgIHVzLmZpbGVzdHJlYW0gPSBaT1BFTjY0KHVzLnpfZmlsZWZ1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaTElCX0ZJTEVGVU5DX01PREVfUkVBRCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWkxJQl9GSUxFRlVOQ19NT0RFX0VYSVNUSU5HKTsKKyAgICBpZiAodXMuZmlsZXN0cmVhbT09TlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBjZW50cmFsX3BvcyA9IHVuejY0bG9jYWxfU2VhcmNoQ2VudHJhbERpcjY0KCZ1cy56X2ZpbGVmdW5jLHVzLmZpbGVzdHJlYW0pOworICAgIGlmIChjZW50cmFsX3BvcykKKyAgICB7CisgICAgICAgIHVMb25nIHVTOworICAgICAgICBaUE9TNjRfVCB1TDY0OworCisgICAgICAgIHVzLmlzWmlwNjQgPSAxOworCisgICAgICAgIGlmIChaU0VFSzY0KHVzLnpfZmlsZWZ1bmMsIHVzLmZpbGVzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbnRyYWxfcG9zLFpMSUJfRklMRUZVTkNfU0VFS19TRVQpIT0wKQorICAgICAgICBlcnI9VU5aX0VSUk5POworCisgICAgICAgIC8qIHRoZSBzaWduYXR1cmUsIGFscmVhZHkgY2hlY2tlZCAqLworICAgICAgICBpZiAodW56NjRsb2NhbF9nZXRMb25nKCZ1cy56X2ZpbGVmdW5jLCB1cy5maWxlc3RyZWFtLCZ1TCkhPVVOWl9PSykKKyAgICAgICAgICAgIGVycj1VTlpfRVJSTk87CisKKyAgICAgICAgLyogc2l6ZSBvZiB6aXA2NCBlbmQgb2YgY2VudHJhbCBkaXJlY3RvcnkgcmVjb3JkICovCisgICAgICAgIGlmICh1bno2NGxvY2FsX2dldExvbmc2NCgmdXMuel9maWxlZnVuYywgdXMuZmlsZXN0cmVhbSwmdUw2NCkhPVVOWl9PSykKKyAgICAgICAgICAgIGVycj1VTlpfRVJSTk87CisKKyAgICAgICAgLyogdmVyc2lvbiBtYWRlIGJ5ICovCisgICAgICAgIGlmICh1bno2NGxvY2FsX2dldFNob3J0KCZ1cy56X2ZpbGVmdW5jLCB1cy5maWxlc3RyZWFtLCZ1UykhPVVOWl9PSykKKyAgICAgICAgICAgIGVycj1VTlpfRVJSTk87CisKKyAgICAgICAgLyogdmVyc2lvbiBuZWVkZWQgdG8gZXh0cmFjdCAqLworICAgICAgICBpZiAodW56NjRsb2NhbF9nZXRTaG9ydCgmdXMuel9maWxlZnVuYywgdXMuZmlsZXN0cmVhbSwmdVMpIT1VTlpfT0spCisgICAgICAgICAgICBlcnI9VU5aX0VSUk5POworCisgICAgICAgIC8qIG51bWJlciBvZiB0aGlzIGRpc2sgKi8KKyAgICAgICAgaWYgKHVuejY0bG9jYWxfZ2V0TG9uZygmdXMuel9maWxlZnVuYywgdXMuZmlsZXN0cmVhbSwmbnVtYmVyX2Rpc2spIT1VTlpfT0spCisgICAgICAgICAgICBlcnI9VU5aX0VSUk5POworCisgICAgICAgIC8qIG51bWJlciBvZiB0aGUgZGlzayB3aXRoIHRoZSBzdGFydCBvZiB0aGUgY2VudHJhbCBkaXJlY3RvcnkgKi8KKyAgICAgICAgaWYgKHVuejY0bG9jYWxfZ2V0TG9uZygmdXMuel9maWxlZnVuYywgdXMuZmlsZXN0cmVhbSwmbnVtYmVyX2Rpc2tfd2l0aF9DRCkhPVVOWl9PSykKKyAgICAgICAgICAgIGVycj1VTlpfRVJSTk87CisKKyAgICAgICAgLyogdG90YWwgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGNlbnRyYWwgZGlyZWN0b3J5IG9uIHRoaXMgZGlzayAqLworICAgICAgICBpZiAodW56NjRsb2NhbF9nZXRMb25nNjQoJnVzLnpfZmlsZWZ1bmMsIHVzLmZpbGVzdHJlYW0sJnVzLmdpLm51bWJlcl9lbnRyeSkhPVVOWl9PSykKKyAgICAgICAgICAgIGVycj1VTlpfRVJSTk87CisKKyAgICAgICAgLyogdG90YWwgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGNlbnRyYWwgZGlyZWN0b3J5ICovCisgICAgICAgIGlmICh1bno2NGxvY2FsX2dldExvbmc2NCgmdXMuel9maWxlZnVuYywgdXMuZmlsZXN0cmVhbSwmbnVtYmVyX2VudHJ5X0NEKSE9VU5aX09LKQorICAgICAgICAgICAgZXJyPVVOWl9FUlJOTzsKKworICAgICAgICBpZiAoKG51bWJlcl9lbnRyeV9DRCE9dXMuZ2kubnVtYmVyX2VudHJ5KSB8fAorICAgICAgICAgICAgKG51bWJlcl9kaXNrX3dpdGhfQ0QhPTApIHx8CisgICAgICAgICAgICAobnVtYmVyX2Rpc2shPTApKQorICAgICAgICAgICAgZXJyPVVOWl9CQURaSVBGSUxFOworCisgICAgICAgIC8qIHNpemUgb2YgdGhlIGNlbnRyYWwgZGlyZWN0b3J5ICovCisgICAgICAgIGlmICh1bno2NGxvY2FsX2dldExvbmc2NCgmdXMuel9maWxlZnVuYywgdXMuZmlsZXN0cmVhbSwmdXMuc2l6ZV9jZW50cmFsX2RpcikhPVVOWl9PSykKKyAgICAgICAgICAgIGVycj1VTlpfRVJSTk87CisKKyAgICAgICAgLyogb2Zmc2V0IG9mIHN0YXJ0IG9mIGNlbnRyYWwgZGlyZWN0b3J5IHdpdGggcmVzcGVjdCB0byB0aGUKKyAgICAgICAgICBzdGFydGluZyBkaXNrIG51bWJlciAqLworICAgICAgICBpZiAodW56NjRsb2NhbF9nZXRMb25nNjQoJnVzLnpfZmlsZWZ1bmMsIHVzLmZpbGVzdHJlYW0sJnVzLm9mZnNldF9jZW50cmFsX2RpcikhPVVOWl9PSykKKyAgICAgICAgICAgIGVycj1VTlpfRVJSTk87CisKKyAgICAgICAgdXMuZ2kuc2l6ZV9jb21tZW50ID0gMDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgY2VudHJhbF9wb3MgPSB1bno2NGxvY2FsX1NlYXJjaENlbnRyYWxEaXIoJnVzLnpfZmlsZWZ1bmMsdXMuZmlsZXN0cmVhbSk7CisgICAgICAgIGlmIChjZW50cmFsX3Bvcz09MCkKKyAgICAgICAgICAgIGVycj1VTlpfRVJSTk87CisKKyAgICAgICAgdXMuaXNaaXA2NCA9IDA7CisKKyAgICAgICAgaWYgKFpTRUVLNjQodXMuel9maWxlZnVuYywgdXMuZmlsZXN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZW50cmFsX3BvcyxaTElCX0ZJTEVGVU5DX1NFRUtfU0VUKSE9MCkKKyAgICAgICAgICAgIGVycj1VTlpfRVJSTk87CisKKyAgICAgICAgLyogdGhlIHNpZ25hdHVyZSwgYWxyZWFkeSBjaGVja2VkICovCisgICAgICAgIGlmICh1bno2NGxvY2FsX2dldExvbmcoJnVzLnpfZmlsZWZ1bmMsIHVzLmZpbGVzdHJlYW0sJnVMKSE9VU5aX09LKQorICAgICAgICAgICAgZXJyPVVOWl9FUlJOTzsKKworICAgICAgICAvKiBudW1iZXIgb2YgdGhpcyBkaXNrICovCisgICAgICAgIGlmICh1bno2NGxvY2FsX2dldFNob3J0KCZ1cy56X2ZpbGVmdW5jLCB1cy5maWxlc3RyZWFtLCZudW1iZXJfZGlzaykhPVVOWl9PSykKKyAgICAgICAgICAgIGVycj1VTlpfRVJSTk87CisKKyAgICAgICAgLyogbnVtYmVyIG9mIHRoZSBkaXNrIHdpdGggdGhlIHN0YXJ0IG9mIHRoZSBjZW50cmFsIGRpcmVjdG9yeSAqLworICAgICAgICBpZiAodW56NjRsb2NhbF9nZXRTaG9ydCgmdXMuel9maWxlZnVuYywgdXMuZmlsZXN0cmVhbSwmbnVtYmVyX2Rpc2tfd2l0aF9DRCkhPVVOWl9PSykKKyAgICAgICAgICAgIGVycj1VTlpfRVJSTk87CisKKyAgICAgICAgLyogdG90YWwgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGNlbnRyYWwgZGlyIG9uIHRoaXMgZGlzayAqLworICAgICAgICBpZiAodW56NjRsb2NhbF9nZXRTaG9ydCgmdXMuel9maWxlZnVuYywgdXMuZmlsZXN0cmVhbSwmdUwpIT1VTlpfT0spCisgICAgICAgICAgICBlcnI9VU5aX0VSUk5POworICAgICAgICB1cy5naS5udW1iZXJfZW50cnkgPSB1TDsKKworICAgICAgICAvKiB0b3RhbCBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgY2VudHJhbCBkaXIgKi8KKyAgICAgICAgaWYgKHVuejY0bG9jYWxfZ2V0U2hvcnQoJnVzLnpfZmlsZWZ1bmMsIHVzLmZpbGVzdHJlYW0sJnVMKSE9VU5aX09LKQorICAgICAgICAgICAgZXJyPVVOWl9FUlJOTzsKKyAgICAgICAgbnVtYmVyX2VudHJ5X0NEID0gdUw7CisKKyAgICAgICAgaWYgKChudW1iZXJfZW50cnlfQ0QhPXVzLmdpLm51bWJlcl9lbnRyeSkgfHwKKyAgICAgICAgICAgIChudW1iZXJfZGlza193aXRoX0NEIT0wKSB8fAorICAgICAgICAgICAgKG51bWJlcl9kaXNrIT0wKSkKKyAgICAgICAgICAgIGVycj1VTlpfQkFEWklQRklMRTsKKworICAgICAgICAvKiBzaXplIG9mIHRoZSBjZW50cmFsIGRpcmVjdG9yeSAqLworICAgICAgICBpZiAodW56NjRsb2NhbF9nZXRMb25nKCZ1cy56X2ZpbGVmdW5jLCB1cy5maWxlc3RyZWFtLCZ1TCkhPVVOWl9PSykKKyAgICAgICAgICAgIGVycj1VTlpfRVJSTk87CisgICAgICAgIHVzLnNpemVfY2VudHJhbF9kaXIgPSB1TDsKKworICAgICAgICAvKiBvZmZzZXQgb2Ygc3RhcnQgb2YgY2VudHJhbCBkaXJlY3Rvcnkgd2l0aCByZXNwZWN0IHRvIHRoZQorICAgICAgICAgICAgc3RhcnRpbmcgZGlzayBudW1iZXIgKi8KKyAgICAgICAgaWYgKHVuejY0bG9jYWxfZ2V0TG9uZygmdXMuel9maWxlZnVuYywgdXMuZmlsZXN0cmVhbSwmdUwpIT1VTlpfT0spCisgICAgICAgICAgICBlcnI9VU5aX0VSUk5POworICAgICAgICB1cy5vZmZzZXRfY2VudHJhbF9kaXIgPSB1TDsKKworICAgICAgICAvKiB6aXBmaWxlIGNvbW1lbnQgbGVuZ3RoICovCisgICAgICAgIGlmICh1bno2NGxvY2FsX2dldFNob3J0KCZ1cy56X2ZpbGVmdW5jLCB1cy5maWxlc3RyZWFtLCZ1cy5naS5zaXplX2NvbW1lbnQpIT1VTlpfT0spCisgICAgICAgICAgICBlcnI9VU5aX0VSUk5POworICAgIH0KKworICAgIGlmICgoY2VudHJhbF9wb3M8dXMub2Zmc2V0X2NlbnRyYWxfZGlyK3VzLnNpemVfY2VudHJhbF9kaXIpICYmCisgICAgICAgIChlcnI9PVVOWl9PSykpCisgICAgICAgIGVycj1VTlpfQkFEWklQRklMRTsKKworICAgIGlmIChlcnIhPVVOWl9PSykKKyAgICB7CisgICAgICAgIFpDTE9TRTY0KHVzLnpfZmlsZWZ1bmMsIHVzLmZpbGVzdHJlYW0pOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICB1cy5ieXRlX2JlZm9yZV90aGVfemlwZmlsZSA9IGNlbnRyYWxfcG9zIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodXMub2Zmc2V0X2NlbnRyYWxfZGlyK3VzLnNpemVfY2VudHJhbF9kaXIpOworICAgIHVzLmNlbnRyYWxfcG9zID0gY2VudHJhbF9wb3M7CisgICAgdXMucGZpbGVfaW5femlwX3JlYWQgPSBOVUxMOworICAgIHVzLmVuY3J5cHRlZCA9IDA7CisKKworICAgIHM9KHVuejY0X3MqKUFMTE9DKHNpemVvZih1bno2NF9zKSk7CisgICAgaWYoIHMgIT0gTlVMTCkKKyAgICB7CisgICAgICAgICpzPXVzOworICAgICAgICB1bnpHb1RvRmlyc3RGaWxlKCh1bnpGaWxlKXMpOworICAgIH0KKyAgICByZXR1cm4gKHVuekZpbGUpczsKK30KKworCitleHRlcm4gdW56RmlsZSBaRVhQT1JUIHVuek9wZW4yIChjb25zdCBjaGFyICpwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpsaWJfZmlsZWZ1bmNfZGVmKiBwemxpYl9maWxlZnVuYzMyX2RlZikKK3sKKyAgICBpZiAocHpsaWJfZmlsZWZ1bmMzMl9kZWYgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHpsaWJfZmlsZWZ1bmM2NF8zMl9kZWYgemxpYl9maWxlZnVuYzY0XzMyX2RlZl9maWxsOworICAgICAgICBmaWxsX3psaWJfZmlsZWZ1bmM2NF8zMl9kZWZfZnJvbV9maWxlZnVuYzMyKCZ6bGliX2ZpbGVmdW5jNjRfMzJfZGVmX2ZpbGwscHpsaWJfZmlsZWZ1bmMzMl9kZWYpOworICAgICAgICByZXR1cm4gdW56T3BlbkludGVybmFsKHBhdGgsICZ6bGliX2ZpbGVmdW5jNjRfMzJfZGVmX2ZpbGwsIDApOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldHVybiB1bnpPcGVuSW50ZXJuYWwocGF0aCwgTlVMTCwgMCk7Cit9CisKK2V4dGVybiB1bnpGaWxlIFpFWFBPUlQgdW56T3BlbjJfNjQgKGNvbnN0IHZvaWQgKnBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemxpYl9maWxlZnVuYzY0X2RlZiogcHpsaWJfZmlsZWZ1bmNfZGVmKQoreworICAgIGlmIChwemxpYl9maWxlZnVuY19kZWYgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHpsaWJfZmlsZWZ1bmM2NF8zMl9kZWYgemxpYl9maWxlZnVuYzY0XzMyX2RlZl9maWxsOworICAgICAgICB6bGliX2ZpbGVmdW5jNjRfMzJfZGVmX2ZpbGwuemZpbGVfZnVuYzY0ID0gKnB6bGliX2ZpbGVmdW5jX2RlZjsKKyAgICAgICAgemxpYl9maWxlZnVuYzY0XzMyX2RlZl9maWxsLnp0ZWxsMzJfZmlsZSA9IE5VTEw7CisgICAgICAgIHpsaWJfZmlsZWZ1bmM2NF8zMl9kZWZfZmlsbC56c2VlazMyX2ZpbGUgPSBOVUxMOworICAgICAgICByZXR1cm4gdW56T3BlbkludGVybmFsKHBhdGgsICZ6bGliX2ZpbGVmdW5jNjRfMzJfZGVmX2ZpbGwsIDEpOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldHVybiB1bnpPcGVuSW50ZXJuYWwocGF0aCwgTlVMTCwgMSk7Cit9CisKK2V4dGVybiB1bnpGaWxlIFpFWFBPUlQgdW56T3BlbiAoY29uc3QgY2hhciAqcGF0aCkKK3sKKyAgICByZXR1cm4gdW56T3BlbkludGVybmFsKHBhdGgsIE5VTEwsIDApOworfQorCitleHRlcm4gdW56RmlsZSBaRVhQT1JUIHVuek9wZW42NCAoY29uc3Qgdm9pZCAqcGF0aCkKK3sKKyAgICByZXR1cm4gdW56T3BlbkludGVybmFsKHBhdGgsIE5VTEwsIDEpOworfQorCisvKgorICBDbG9zZSBhIFppcEZpbGUgb3BlbmVkIHdpdGggdW56aXBPcGVuLgorICBJZiB0aGVyZSBpcyBmaWxlcyBpbnNpZGUgdGhlIC5aaXAgb3BlbmVkIHdpdGggdW56aXBPcGVuQ3VycmVudEZpbGUgKHNlZSBsYXRlciksCisgICAgdGhlc2UgZmlsZXMgTVVTVCBiZSBjbG9zZWQgd2l0aCB1bnppcENsb3NlQ3VycmVudEZpbGUgYmVmb3JlIGNhbGwgdW56aXBDbG9zZS4KKyAgcmV0dXJuIFVOWl9PSyBpZiB0aGVyZSBpcyBubyBwcm9ibGVtLiAqLworZXh0ZXJuIGludCBaRVhQT1JUIHVuekNsb3NlICh1bnpGaWxlIGZpbGUpCit7CisgICAgdW56NjRfcyogczsKKyAgICBpZiAoZmlsZT09TlVMTCkKKyAgICAgICAgcmV0dXJuIFVOWl9QQVJBTUVSUk9SOworICAgIHM9KHVuejY0X3MqKWZpbGU7CisKKyAgICBpZiAocy0+cGZpbGVfaW5femlwX3JlYWQhPU5VTEwpCisgICAgICAgIHVuekNsb3NlQ3VycmVudEZpbGUoZmlsZSk7CisKKyAgICBaQ0xPU0U2NChzLT56X2ZpbGVmdW5jLCBzLT5maWxlc3RyZWFtKTsKKyAgICBUUllGUkVFKHMpOworICAgIHJldHVybiBVTlpfT0s7Cit9CisKKworLyoKKyAgV3JpdGUgaW5mbyBhYm91dCB0aGUgWmlwRmlsZSBpbiB0aGUgKnBnbG9iYWxfaW5mbyBzdHJ1Y3R1cmUuCisgIE5vIHByZXBhcmF0aW9uIG9mIHRoZSBzdHJ1Y3R1cmUgaXMgbmVlZGVkCisgIHJldHVybiBVTlpfT0sgaWYgdGhlcmUgaXMgbm8gcHJvYmxlbS4gKi8KK2V4dGVybiBpbnQgWkVYUE9SVCB1bnpHZXRHbG9iYWxJbmZvNjQgKHVuekZpbGUgZmlsZSwgdW56X2dsb2JhbF9pbmZvNjQqIHBnbG9iYWxfaW5mbykKK3sKKyAgICB1bno2NF9zKiBzOworICAgIGlmIChmaWxlPT1OVUxMKQorICAgICAgICByZXR1cm4gVU5aX1BBUkFNRVJST1I7CisgICAgcz0odW56NjRfcyopZmlsZTsKKyAgICAqcGdsb2JhbF9pbmZvPXMtPmdpOworICAgIHJldHVybiBVTlpfT0s7Cit9CisKK2V4dGVybiBpbnQgWkVYUE9SVCB1bnpHZXRHbG9iYWxJbmZvICh1bnpGaWxlIGZpbGUsIHVuel9nbG9iYWxfaW5mbyogcGdsb2JhbF9pbmZvMzIpCit7CisgICAgdW56NjRfcyogczsKKyAgICBpZiAoZmlsZT09TlVMTCkKKyAgICAgICAgcmV0dXJuIFVOWl9QQVJBTUVSUk9SOworICAgIHM9KHVuejY0X3MqKWZpbGU7CisgICAgLyogdG8gZG8gOiBjaGVjayBpZiBudW1iZXJfZW50cnkgaXMgbm90IHRydW5jYXRlZCAqLworICAgIHBnbG9iYWxfaW5mbzMyLT5udW1iZXJfZW50cnkgPSAodUxvbmcpcy0+Z2kubnVtYmVyX2VudHJ5OworICAgIHBnbG9iYWxfaW5mbzMyLT5zaXplX2NvbW1lbnQgPSBzLT5naS5zaXplX2NvbW1lbnQ7CisgICAgcmV0dXJuIFVOWl9PSzsKK30KKy8qCisgICBUcmFuc2xhdGUgZGF0ZS90aW1lIGZyb20gRG9zIGZvcm1hdCB0byB0bV91bnogKHJlYWRhYmxlIG1vcmUgZWFzaWx0eSkKKyovCitsb2NhbCB2b2lkIHVuejY0bG9jYWxfRG9zRGF0ZVRvVG11RGF0ZSAoWlBPUzY0X1QgdWxEb3NEYXRlLCB0bV91bnoqIHB0bSkKK3sKKyAgICBaUE9TNjRfVCB1RGF0ZTsKKyAgICB1RGF0ZSA9IChaUE9TNjRfVCkodWxEb3NEYXRlPj4xNik7CisgICAgcHRtLT50bV9tZGF5ID0gKHVJbnQpKHVEYXRlJjB4MWYpIDsKKyAgICBwdG0tPnRtX21vbiA9ICAodUludCkoKCgodURhdGUpJjB4MUUwKS8weDIwKS0xKSA7CisgICAgcHRtLT50bV95ZWFyID0gKHVJbnQpKCgodURhdGUmMHgwRkUwMCkvMHgwMjAwKSsxOTgwKSA7CisKKyAgICBwdG0tPnRtX2hvdXIgPSAodUludCkgKCh1bERvc0RhdGUgJjB4RjgwMCkvMHg4MDApOworICAgIHB0bS0+dG1fbWluID0gICh1SW50KSAoKHVsRG9zRGF0ZSYweDdFMCkvMHgyMCkgOworICAgIHB0bS0+dG1fc2VjID0gICh1SW50KSAoMioodWxEb3NEYXRlJjB4MWYpKSA7Cit9CisKKy8qCisgIEdldCBJbmZvIGFib3V0IHRoZSBjdXJyZW50IGZpbGUgaW4gdGhlIHppcGZpbGUsIHdpdGggaW50ZXJuYWwgb25seSBpbmZvCisqLworbG9jYWwgaW50IHVuejY0bG9jYWxfR2V0Q3VycmVudEZpbGVJbmZvSW50ZXJuYWwgT0YoKHVuekZpbGUgZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW56X2ZpbGVfaW5mbzY0ICpwZmlsZV9pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnpfZmlsZV9pbmZvNjRfaW50ZXJuYWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBmaWxlX2luZm9faW50ZXJuYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnN6RmlsZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVMb25nIGZpbGVOYW1lQnVmZmVyU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZXh0cmFGaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdUxvbmcgZXh0cmFGaWVsZEJ1ZmZlclNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnN6Q29tbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdUxvbmcgY29tbWVudEJ1ZmZlclNpemUpKTsKKworbG9jYWwgaW50IHVuejY0bG9jYWxfR2V0Q3VycmVudEZpbGVJbmZvSW50ZXJuYWwgKHVuekZpbGUgZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW56X2ZpbGVfaW5mbzY0ICpwZmlsZV9pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnpfZmlsZV9pbmZvNjRfaW50ZXJuYWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBmaWxlX2luZm9faW50ZXJuYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnN6RmlsZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVMb25nIGZpbGVOYW1lQnVmZmVyU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZXh0cmFGaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdUxvbmcgZXh0cmFGaWVsZEJ1ZmZlclNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnN6Q29tbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdUxvbmcgY29tbWVudEJ1ZmZlclNpemUpCit7CisgICAgdW56NjRfcyogczsKKyAgICB1bnpfZmlsZV9pbmZvNjQgZmlsZV9pbmZvOworICAgIHVuel9maWxlX2luZm82NF9pbnRlcm5hbCBmaWxlX2luZm9faW50ZXJuYWw7CisgICAgaW50IGVycj1VTlpfT0s7CisgICAgdUxvbmcgdU1hZ2ljOworICAgIGxvbmcgbFNlZWs9MDsKKyAgICB1TG9uZyB1TDsKKworICAgIGlmIChmaWxlPT1OVUxMKQorICAgICAgICByZXR1cm4gVU5aX1BBUkFNRVJST1I7CisgICAgcz0odW56NjRfcyopZmlsZTsKKyAgICBpZiAoWlNFRUs2NChzLT56X2ZpbGVmdW5jLCBzLT5maWxlc3RyZWFtLAorICAgICAgICAgICAgICBzLT5wb3NfaW5fY2VudHJhbF9kaXIrcy0+Ynl0ZV9iZWZvcmVfdGhlX3ppcGZpbGUsCisgICAgICAgICAgICAgIFpMSUJfRklMRUZVTkNfU0VFS19TRVQpIT0wKQorICAgICAgICBlcnI9VU5aX0VSUk5POworCisKKyAgICAvKiB3ZSBjaGVjayB0aGUgbWFnaWMgKi8KKyAgICBpZiAoZXJyPT1VTlpfT0spCisgICAgeworICAgICAgICBpZiAodW56NjRsb2NhbF9nZXRMb25nKCZzLT56X2ZpbGVmdW5jLCBzLT5maWxlc3RyZWFtLCZ1TWFnaWMpICE9IFVOWl9PSykKKyAgICAgICAgICAgIGVycj1VTlpfRVJSTk87CisgICAgICAgIGVsc2UgaWYgKHVNYWdpYyE9MHgwMjAxNGI1MCkKKyAgICAgICAgICAgIGVycj1VTlpfQkFEWklQRklMRTsKKyAgICB9CisKKyAgICBpZiAodW56NjRsb2NhbF9nZXRTaG9ydCgmcy0+el9maWxlZnVuYywgcy0+ZmlsZXN0cmVhbSwmZmlsZV9pbmZvLnZlcnNpb24pICE9IFVOWl9PSykKKyAgICAgICAgZXJyPVVOWl9FUlJOTzsKKworICAgIGlmICh1bno2NGxvY2FsX2dldFNob3J0KCZzLT56X2ZpbGVmdW5jLCBzLT5maWxlc3RyZWFtLCZmaWxlX2luZm8udmVyc2lvbl9uZWVkZWQpICE9IFVOWl9PSykKKyAgICAgICAgZXJyPVVOWl9FUlJOTzsKKworICAgIGlmICh1bno2NGxvY2FsX2dldFNob3J0KCZzLT56X2ZpbGVmdW5jLCBzLT5maWxlc3RyZWFtLCZmaWxlX2luZm8uZmxhZykgIT0gVU5aX09LKQorICAgICAgICBlcnI9VU5aX0VSUk5POworCisgICAgaWYgKHVuejY0bG9jYWxfZ2V0U2hvcnQoJnMtPnpfZmlsZWZ1bmMsIHMtPmZpbGVzdHJlYW0sJmZpbGVfaW5mby5jb21wcmVzc2lvbl9tZXRob2QpICE9IFVOWl9PSykKKyAgICAgICAgZXJyPVVOWl9FUlJOTzsKKworICAgIGlmICh1bno2NGxvY2FsX2dldExvbmcoJnMtPnpfZmlsZWZ1bmMsIHMtPmZpbGVzdHJlYW0sJmZpbGVfaW5mby5kb3NEYXRlKSAhPSBVTlpfT0spCisgICAgICAgIGVycj1VTlpfRVJSTk87CisKKyAgICB1bno2NGxvY2FsX0Rvc0RhdGVUb1RtdURhdGUoZmlsZV9pbmZvLmRvc0RhdGUsJmZpbGVfaW5mby50bXVfZGF0ZSk7CisKKyAgICBpZiAodW56NjRsb2NhbF9nZXRMb25nKCZzLT56X2ZpbGVmdW5jLCBzLT5maWxlc3RyZWFtLCZmaWxlX2luZm8uY3JjKSAhPSBVTlpfT0spCisgICAgICAgIGVycj1VTlpfRVJSTk87CisKKyAgICBpZiAodW56NjRsb2NhbF9nZXRMb25nKCZzLT56X2ZpbGVmdW5jLCBzLT5maWxlc3RyZWFtLCZ1TCkgIT0gVU5aX09LKQorICAgICAgICBlcnI9VU5aX0VSUk5POworICAgIGZpbGVfaW5mby5jb21wcmVzc2VkX3NpemUgPSB1TDsKKworICAgIGlmICh1bno2NGxvY2FsX2dldExvbmcoJnMtPnpfZmlsZWZ1bmMsIHMtPmZpbGVzdHJlYW0sJnVMKSAhPSBVTlpfT0spCisgICAgICAgIGVycj1VTlpfRVJSTk87CisgICAgZmlsZV9pbmZvLnVuY29tcHJlc3NlZF9zaXplID0gdUw7CisKKyAgICBpZiAodW56NjRsb2NhbF9nZXRTaG9ydCgmcy0+el9maWxlZnVuYywgcy0+ZmlsZXN0cmVhbSwmZmlsZV9pbmZvLnNpemVfZmlsZW5hbWUpICE9IFVOWl9PSykKKyAgICAgICAgZXJyPVVOWl9FUlJOTzsKKworICAgIGlmICh1bno2NGxvY2FsX2dldFNob3J0KCZzLT56X2ZpbGVmdW5jLCBzLT5maWxlc3RyZWFtLCZmaWxlX2luZm8uc2l6ZV9maWxlX2V4dHJhKSAhPSBVTlpfT0spCisgICAgICAgIGVycj1VTlpfRVJSTk87CisKKyAgICBpZiAodW56NjRsb2NhbF9nZXRTaG9ydCgmcy0+el9maWxlZnVuYywgcy0+ZmlsZXN0cmVhbSwmZmlsZV9pbmZvLnNpemVfZmlsZV9jb21tZW50KSAhPSBVTlpfT0spCisgICAgICAgIGVycj1VTlpfRVJSTk87CisKKyAgICBpZiAodW56NjRsb2NhbF9nZXRTaG9ydCgmcy0+el9maWxlZnVuYywgcy0+ZmlsZXN0cmVhbSwmZmlsZV9pbmZvLmRpc2tfbnVtX3N0YXJ0KSAhPSBVTlpfT0spCisgICAgICAgIGVycj1VTlpfRVJSTk87CisKKyAgICBpZiAodW56NjRsb2NhbF9nZXRTaG9ydCgmcy0+el9maWxlZnVuYywgcy0+ZmlsZXN0cmVhbSwmZmlsZV9pbmZvLmludGVybmFsX2ZhKSAhPSBVTlpfT0spCisgICAgICAgIGVycj1VTlpfRVJSTk87CisKKyAgICBpZiAodW56NjRsb2NhbF9nZXRMb25nKCZzLT56X2ZpbGVmdW5jLCBzLT5maWxlc3RyZWFtLCZmaWxlX2luZm8uZXh0ZXJuYWxfZmEpICE9IFVOWl9PSykKKyAgICAgICAgZXJyPVVOWl9FUlJOTzsKKworICAgICAgICAgICAgICAgIC8vIHJlbGF0aXZlIG9mZnNldCBvZiBsb2NhbCBoZWFkZXIKKyAgICBpZiAodW56NjRsb2NhbF9nZXRMb25nKCZzLT56X2ZpbGVmdW5jLCBzLT5maWxlc3RyZWFtLCZ1TCkgIT0gVU5aX09LKQorICAgICAgICBlcnI9VU5aX0VSUk5POworICAgIGZpbGVfaW5mb19pbnRlcm5hbC5vZmZzZXRfY3VyZmlsZSA9IHVMOworCisgICAgbFNlZWsrPWZpbGVfaW5mby5zaXplX2ZpbGVuYW1lOworICAgIGlmICgoZXJyPT1VTlpfT0spICYmIChzekZpbGVOYW1lIT1OVUxMKSkKKyAgICB7CisgICAgICAgIHVMb25nIHVTaXplUmVhZCA7CisgICAgICAgIGlmIChmaWxlX2luZm8uc2l6ZV9maWxlbmFtZTxmaWxlTmFtZUJ1ZmZlclNpemUpCisgICAgICAgIHsKKyAgICAgICAgICAgICooc3pGaWxlTmFtZStmaWxlX2luZm8uc2l6ZV9maWxlbmFtZSk9J1wwJzsKKyAgICAgICAgICAgIHVTaXplUmVhZCA9IGZpbGVfaW5mby5zaXplX2ZpbGVuYW1lOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHVTaXplUmVhZCA9IGZpbGVOYW1lQnVmZmVyU2l6ZTsKKworICAgICAgICBpZiAoKGZpbGVfaW5mby5zaXplX2ZpbGVuYW1lPjApICYmIChmaWxlTmFtZUJ1ZmZlclNpemU+MCkpCisgICAgICAgICAgICBpZiAoWlJFQUQ2NChzLT56X2ZpbGVmdW5jLCBzLT5maWxlc3RyZWFtLHN6RmlsZU5hbWUsdVNpemVSZWFkKSE9dVNpemVSZWFkKQorICAgICAgICAgICAgICAgIGVycj1VTlpfRVJSTk87CisgICAgICAgIGxTZWVrIC09IHVTaXplUmVhZDsKKyAgICB9CisKKyAgICAvLyBSZWFkIGV4dHJhZmllbGQKKyAgICBpZiAoKGVycj09VU5aX09LKSAmJiAoZXh0cmFGaWVsZCE9TlVMTCkpCisgICAgeworICAgICAgICBaUE9TNjRfVCB1U2l6ZVJlYWQgOworICAgICAgICBpZiAoZmlsZV9pbmZvLnNpemVfZmlsZV9leHRyYTxleHRyYUZpZWxkQnVmZmVyU2l6ZSkKKyAgICAgICAgICAgIHVTaXplUmVhZCA9IGZpbGVfaW5mby5zaXplX2ZpbGVfZXh0cmE7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHVTaXplUmVhZCA9IGV4dHJhRmllbGRCdWZmZXJTaXplOworCisgICAgICAgIGlmIChsU2VlayE9MCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKFpTRUVLNjQocy0+el9maWxlZnVuYywgcy0+ZmlsZXN0cmVhbSxsU2VlayxaTElCX0ZJTEVGVU5DX1NFRUtfQ1VSKT09MCkKKyAgICAgICAgICAgICAgICBsU2Vlaz0wOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGVycj1VTlpfRVJSTk87CisgICAgICAgIH0KKworICAgICAgICBpZiAoKGZpbGVfaW5mby5zaXplX2ZpbGVfZXh0cmE+MCkgJiYgKGV4dHJhRmllbGRCdWZmZXJTaXplPjApKQorICAgICAgICAgICAgaWYgKFpSRUFENjQocy0+el9maWxlZnVuYywgcy0+ZmlsZXN0cmVhbSxleHRyYUZpZWxkLCh1TG9uZyl1U2l6ZVJlYWQpIT11U2l6ZVJlYWQpCisgICAgICAgICAgICAgICAgZXJyPVVOWl9FUlJOTzsKKworICAgICAgICBsU2VlayArPSBmaWxlX2luZm8uc2l6ZV9maWxlX2V4dHJhIC0gKHVMb25nKXVTaXplUmVhZDsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBsU2VlayArPSBmaWxlX2luZm8uc2l6ZV9maWxlX2V4dHJhOworCisKKyAgICBpZiAoKGVycj09VU5aX09LKSAmJiAoZmlsZV9pbmZvLnNpemVfZmlsZV9leHRyYSAhPSAwKSkKKyAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVMb25nIGFjYyA9IDA7CisKKyAgICAgICAgLy8gc2luY2UgbFNlZWsgbm93IHBvaW50cyB0byBhZnRlciB0aGUgZXh0cmEgZmllbGQgd2UgbmVlZCB0byBtb3ZlIGJhY2sKKyAgICAgICAgbFNlZWsgLT0gZmlsZV9pbmZvLnNpemVfZmlsZV9leHRyYTsKKworICAgICAgICBpZiAobFNlZWshPTApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChaU0VFSzY0KHMtPnpfZmlsZWZ1bmMsIHMtPmZpbGVzdHJlYW0sbFNlZWssWkxJQl9GSUxFRlVOQ19TRUVLX0NVUik9PTApCisgICAgICAgICAgICAgICAgbFNlZWs9MDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBlcnI9VU5aX0VSUk5POworICAgICAgICB9CisKKyAgICAgICAgd2hpbGUoYWNjIDwgZmlsZV9pbmZvLnNpemVfZmlsZV9leHRyYSkKKyAgICAgICAgeworICAgICAgICAgICAgdUxvbmcgaGVhZGVySWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1TG9uZyBkYXRhU2l6ZTsKKworICAgICAgICAgICAgaWYgKHVuejY0bG9jYWxfZ2V0U2hvcnQoJnMtPnpfZmlsZWZ1bmMsIHMtPmZpbGVzdHJlYW0sJmhlYWRlcklkKSAhPSBVTlpfT0spCisgICAgICAgICAgICAgICAgZXJyPVVOWl9FUlJOTzsKKworICAgICAgICAgICAgaWYgKHVuejY0bG9jYWxfZ2V0U2hvcnQoJnMtPnpfZmlsZWZ1bmMsIHMtPmZpbGVzdHJlYW0sJmRhdGFTaXplKSAhPSBVTlpfT0spCisgICAgICAgICAgICAgICAgZXJyPVVOWl9FUlJOTzsKKworICAgICAgICAgICAgLyogWklQNjQgZXh0cmEgZmllbGRzICovCisgICAgICAgICAgICBpZiAoaGVhZGVySWQgPT0gMHgwMDAxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1TG9uZyB1TDsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGZpbGVfaW5mby51bmNvbXByZXNzZWRfc2l6ZSA9PSBNQVhVMzIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVuejY0bG9jYWxfZ2V0TG9uZzY0KCZzLT56X2ZpbGVmdW5jLCBzLT5maWxlc3RyZWFtLCZmaWxlX2luZm8udW5jb21wcmVzc2VkX3NpemUpICE9IFVOWl9PSykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnI9VU5aX0VSUk5POworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGZpbGVfaW5mby5jb21wcmVzc2VkX3NpemUgPT0gTUFYVTMyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1bno2NGxvY2FsX2dldExvbmc2NCgmcy0+el9maWxlZnVuYywgcy0+ZmlsZXN0cmVhbSwmZmlsZV9pbmZvLmNvbXByZXNzZWRfc2l6ZSkgIT0gVU5aX09LKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycj1VTlpfRVJSTk87CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZmlsZV9pbmZvX2ludGVybmFsLm9mZnNldF9jdXJmaWxlID09IE1BWFUzMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZWxhdGl2ZSBIZWFkZXIgb2Zmc2V0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodW56NjRsb2NhbF9nZXRMb25nNjQoJnMtPnpfZmlsZWZ1bmMsIHMtPmZpbGVzdHJlYW0sJmZpbGVfaW5mb19pbnRlcm5hbC5vZmZzZXRfY3VyZmlsZSkgIT0gVU5aX09LKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnI9VU5aX0VSUk5POworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGZpbGVfaW5mby5kaXNrX251bV9zdGFydCA9PSBNQVhVMzIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGlzayBTdGFydCBOdW1iZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1bno2NGxvY2FsX2dldExvbmcoJnMtPnpfZmlsZWZ1bmMsIHMtPmZpbGVzdHJlYW0sJnVMKSAhPSBVTlpfT0spCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycj1VTlpfRVJSTk87CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKFpTRUVLNjQocy0+el9maWxlZnVuYywgcy0+ZmlsZXN0cmVhbSxkYXRhU2l6ZSxaTElCX0ZJTEVGVU5DX1NFRUtfQ1VSKSE9MCkKKyAgICAgICAgICAgICAgICAgICAgZXJyPVVOWl9FUlJOTzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYWNjICs9IDIgKyAyICsgZGF0YVNpemU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGVycj09VU5aX09LKSAmJiAoc3pDb21tZW50IT1OVUxMKSkKKyAgICB7CisgICAgICAgIHVMb25nIHVTaXplUmVhZCA7CisgICAgICAgIGlmIChmaWxlX2luZm8uc2l6ZV9maWxlX2NvbW1lbnQ8Y29tbWVudEJ1ZmZlclNpemUpCisgICAgICAgIHsKKyAgICAgICAgICAgICooc3pDb21tZW50K2ZpbGVfaW5mby5zaXplX2ZpbGVfY29tbWVudCk9J1wwJzsKKyAgICAgICAgICAgIHVTaXplUmVhZCA9IGZpbGVfaW5mby5zaXplX2ZpbGVfY29tbWVudDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICB1U2l6ZVJlYWQgPSBjb21tZW50QnVmZmVyU2l6ZTsKKworICAgICAgICBpZiAobFNlZWshPTApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChaU0VFSzY0KHMtPnpfZmlsZWZ1bmMsIHMtPmZpbGVzdHJlYW0sbFNlZWssWkxJQl9GSUxFRlVOQ19TRUVLX0NVUik9PTApCisgICAgICAgICAgICAgICAgbFNlZWs9MDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBlcnI9VU5aX0VSUk5POworICAgICAgICB9CisKKyAgICAgICAgaWYgKChmaWxlX2luZm8uc2l6ZV9maWxlX2NvbW1lbnQ+MCkgJiYgKGNvbW1lbnRCdWZmZXJTaXplPjApKQorICAgICAgICAgICAgaWYgKFpSRUFENjQocy0+el9maWxlZnVuYywgcy0+ZmlsZXN0cmVhbSxzekNvbW1lbnQsdVNpemVSZWFkKSE9dVNpemVSZWFkKQorICAgICAgICAgICAgICAgIGVycj1VTlpfRVJSTk87CisgICAgICAgIGxTZWVrKz1maWxlX2luZm8uc2l6ZV9maWxlX2NvbW1lbnQgLSB1U2l6ZVJlYWQ7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgbFNlZWsrPWZpbGVfaW5mby5zaXplX2ZpbGVfY29tbWVudDsKKworCisgICAgaWYgKChlcnI9PVVOWl9PSykgJiYgKHBmaWxlX2luZm8hPU5VTEwpKQorICAgICAgICAqcGZpbGVfaW5mbz1maWxlX2luZm87CisKKyAgICBpZiAoKGVycj09VU5aX09LKSAmJiAocGZpbGVfaW5mb19pbnRlcm5hbCE9TlVMTCkpCisgICAgICAgICpwZmlsZV9pbmZvX2ludGVybmFsPWZpbGVfaW5mb19pbnRlcm5hbDsKKworICAgIHJldHVybiBlcnI7Cit9CisKKworCisvKgorICBXcml0ZSBpbmZvIGFib3V0IHRoZSBaaXBGaWxlIGluIHRoZSAqcGdsb2JhbF9pbmZvIHN0cnVjdHVyZS4KKyAgTm8gcHJlcGFyYXRpb24gb2YgdGhlIHN0cnVjdHVyZSBpcyBuZWVkZWQKKyAgcmV0dXJuIFVOWl9PSyBpZiB0aGVyZSBpcyBubyBwcm9ibGVtLgorKi8KK2V4dGVybiBpbnQgWkVYUE9SVCB1bnpHZXRDdXJyZW50RmlsZUluZm82NCAodW56RmlsZSBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW56X2ZpbGVfaW5mbzY0ICogcGZpbGVfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKiBzekZpbGVOYW1lLCB1TG9uZyBmaWxlTmFtZUJ1ZmZlclNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpleHRyYUZpZWxkLCB1TG9uZyBleHRyYUZpZWxkQnVmZmVyU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqIHN6Q29tbWVudCwgIHVMb25nIGNvbW1lbnRCdWZmZXJTaXplKQoreworICAgIHJldHVybiB1bno2NGxvY2FsX0dldEN1cnJlbnRGaWxlSW5mb0ludGVybmFsKGZpbGUscGZpbGVfaW5mbyxOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3pGaWxlTmFtZSxmaWxlTmFtZUJ1ZmZlclNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYUZpZWxkLGV4dHJhRmllbGRCdWZmZXJTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3pDb21tZW50LGNvbW1lbnRCdWZmZXJTaXplKTsKK30KKworZXh0ZXJuIGludCBaRVhQT1JUIHVuekdldEN1cnJlbnRGaWxlSW5mbyAodW56RmlsZSBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW56X2ZpbGVfaW5mbyAqIHBmaWxlX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICogc3pGaWxlTmFtZSwgdUxvbmcgZmlsZU5hbWVCdWZmZXJTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZXh0cmFGaWVsZCwgdUxvbmcgZXh0cmFGaWVsZEJ1ZmZlclNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiBzekNvbW1lbnQsICB1TG9uZyBjb21tZW50QnVmZmVyU2l6ZSkKK3sKKyAgICBpbnQgZXJyOworICAgIHVuel9maWxlX2luZm82NCBmaWxlX2luZm82NDsKKyAgICBlcnIgPSB1bno2NGxvY2FsX0dldEN1cnJlbnRGaWxlSW5mb0ludGVybmFsKGZpbGUsJmZpbGVfaW5mbzY0LE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzekZpbGVOYW1lLGZpbGVOYW1lQnVmZmVyU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhRmllbGQsZXh0cmFGaWVsZEJ1ZmZlclNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzekNvbW1lbnQsY29tbWVudEJ1ZmZlclNpemUpOworICAgIGlmICgoZXJyPT1VTlpfT0spICYmIChwZmlsZV9pbmZvICE9IE5VTEwpKQorICAgIHsKKyAgICAgICAgcGZpbGVfaW5mby0+dmVyc2lvbiA9IGZpbGVfaW5mbzY0LnZlcnNpb247CisgICAgICAgIHBmaWxlX2luZm8tPnZlcnNpb25fbmVlZGVkID0gZmlsZV9pbmZvNjQudmVyc2lvbl9uZWVkZWQ7CisgICAgICAgIHBmaWxlX2luZm8tPmZsYWcgPSBmaWxlX2luZm82NC5mbGFnOworICAgICAgICBwZmlsZV9pbmZvLT5jb21wcmVzc2lvbl9tZXRob2QgPSBmaWxlX2luZm82NC5jb21wcmVzc2lvbl9tZXRob2Q7CisgICAgICAgIHBmaWxlX2luZm8tPmRvc0RhdGUgPSBmaWxlX2luZm82NC5kb3NEYXRlOworICAgICAgICBwZmlsZV9pbmZvLT5jcmMgPSBmaWxlX2luZm82NC5jcmM7CisKKyAgICAgICAgcGZpbGVfaW5mby0+c2l6ZV9maWxlbmFtZSA9IGZpbGVfaW5mbzY0LnNpemVfZmlsZW5hbWU7CisgICAgICAgIHBmaWxlX2luZm8tPnNpemVfZmlsZV9leHRyYSA9IGZpbGVfaW5mbzY0LnNpemVfZmlsZV9leHRyYTsKKyAgICAgICAgcGZpbGVfaW5mby0+c2l6ZV9maWxlX2NvbW1lbnQgPSBmaWxlX2luZm82NC5zaXplX2ZpbGVfY29tbWVudDsKKworICAgICAgICBwZmlsZV9pbmZvLT5kaXNrX251bV9zdGFydCA9IGZpbGVfaW5mbzY0LmRpc2tfbnVtX3N0YXJ0OworICAgICAgICBwZmlsZV9pbmZvLT5pbnRlcm5hbF9mYSA9IGZpbGVfaW5mbzY0LmludGVybmFsX2ZhOworICAgICAgICBwZmlsZV9pbmZvLT5leHRlcm5hbF9mYSA9IGZpbGVfaW5mbzY0LmV4dGVybmFsX2ZhOworCisgICAgICAgIHBmaWxlX2luZm8tPnRtdV9kYXRlID0gZmlsZV9pbmZvNjQudG11X2RhdGUsCisKKworICAgICAgICBwZmlsZV9pbmZvLT5jb21wcmVzc2VkX3NpemUgPSAodUxvbmcpZmlsZV9pbmZvNjQuY29tcHJlc3NlZF9zaXplOworICAgICAgICBwZmlsZV9pbmZvLT51bmNvbXByZXNzZWRfc2l6ZSA9ICh1TG9uZylmaWxlX2luZm82NC51bmNvbXByZXNzZWRfc2l6ZTsKKworICAgIH0KKyAgICByZXR1cm4gZXJyOworfQorLyoKKyAgU2V0IHRoZSBjdXJyZW50IGZpbGUgb2YgdGhlIHppcGZpbGUgdG8gdGhlIGZpcnN0IGZpbGUuCisgIHJldHVybiBVTlpfT0sgaWYgdGhlcmUgaXMgbm8gcHJvYmxlbQorKi8KK2V4dGVybiBpbnQgWkVYUE9SVCB1bnpHb1RvRmlyc3RGaWxlICh1bnpGaWxlIGZpbGUpCit7CisgICAgaW50IGVycj1VTlpfT0s7CisgICAgdW56NjRfcyogczsKKyAgICBpZiAoZmlsZT09TlVMTCkKKyAgICAgICAgcmV0dXJuIFVOWl9QQVJBTUVSUk9SOworICAgIHM9KHVuejY0X3MqKWZpbGU7CisgICAgcy0+cG9zX2luX2NlbnRyYWxfZGlyPXMtPm9mZnNldF9jZW50cmFsX2RpcjsKKyAgICBzLT5udW1fZmlsZT0wOworICAgIGVycj11bno2NGxvY2FsX0dldEN1cnJlbnRGaWxlSW5mb0ludGVybmFsKGZpbGUsJnMtPmN1cl9maWxlX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcy0+Y3VyX2ZpbGVfaW5mb19pbnRlcm5hbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsMCxOVUxMLDAsTlVMTCwwKTsKKyAgICBzLT5jdXJyZW50X2ZpbGVfb2sgPSAoZXJyID09IFVOWl9PSyk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoKKyAgU2V0IHRoZSBjdXJyZW50IGZpbGUgb2YgdGhlIHppcGZpbGUgdG8gdGhlIG5leHQgZmlsZS4KKyAgcmV0dXJuIFVOWl9PSyBpZiB0aGVyZSBpcyBubyBwcm9ibGVtCisgIHJldHVybiBVTlpfRU5EX09GX0xJU1RfT0ZfRklMRSBpZiB0aGUgYWN0dWFsIGZpbGUgd2FzIHRoZSBsYXRlc3QuCisqLworZXh0ZXJuIGludCBaRVhQT1JUIHVuekdvVG9OZXh0RmlsZSAodW56RmlsZSAgZmlsZSkKK3sKKyAgICB1bno2NF9zKiBzOworICAgIGludCBlcnI7CisKKyAgICBpZiAoZmlsZT09TlVMTCkKKyAgICAgICAgcmV0dXJuIFVOWl9QQVJBTUVSUk9SOworICAgIHM9KHVuejY0X3MqKWZpbGU7CisgICAgaWYgKCFzLT5jdXJyZW50X2ZpbGVfb2spCisgICAgICAgIHJldHVybiBVTlpfRU5EX09GX0xJU1RfT0ZfRklMRTsKKyAgICBpZiAocy0+Z2kubnVtYmVyX2VudHJ5ICE9IDB4ZmZmZikgICAgLyogMl4xNiBmaWxlcyBvdmVyZmxvdyBoYWNrICovCisgICAgICBpZiAocy0+bnVtX2ZpbGUrMT09cy0+Z2kubnVtYmVyX2VudHJ5KQorICAgICAgICByZXR1cm4gVU5aX0VORF9PRl9MSVNUX09GX0ZJTEU7CisKKyAgICBzLT5wb3NfaW5fY2VudHJhbF9kaXIgKz0gU0laRUNFTlRSQUxESVJJVEVNICsgcy0+Y3VyX2ZpbGVfaW5mby5zaXplX2ZpbGVuYW1lICsKKyAgICAgICAgICAgIHMtPmN1cl9maWxlX2luZm8uc2l6ZV9maWxlX2V4dHJhICsgcy0+Y3VyX2ZpbGVfaW5mby5zaXplX2ZpbGVfY29tbWVudCA7CisgICAgcy0+bnVtX2ZpbGUrKzsKKyAgICBlcnIgPSB1bno2NGxvY2FsX0dldEN1cnJlbnRGaWxlSW5mb0ludGVybmFsKGZpbGUsJnMtPmN1cl9maWxlX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzLT5jdXJfZmlsZV9pbmZvX2ludGVybmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLDAsTlVMTCwwLE5VTEwsMCk7CisgICAgcy0+Y3VycmVudF9maWxlX29rID0gKGVyciA9PSBVTlpfT0spOworICAgIHJldHVybiBlcnI7Cit9CisKKworLyoKKyAgVHJ5IGxvY2F0ZSB0aGUgZmlsZSBzekZpbGVOYW1lIGluIHRoZSB6aXBmaWxlLgorICBGb3IgdGhlIGlDYXNlU2Vuc2l0aXZpdHkgc2lnbmlmaWNhdGlvbiwgc2VlIHVuemlwU3RyaW5nRmlsZU5hbWVDb21wYXJlCisKKyAgcmV0dXJuIHZhbHVlIDoKKyAgVU5aX09LIGlmIHRoZSBmaWxlIGlzIGZvdW5kLiBJdCBiZWNvbWVzIHRoZSBjdXJyZW50IGZpbGUuCisgIFVOWl9FTkRfT0ZfTElTVF9PRl9GSUxFIGlmIHRoZSBmaWxlIGlzIG5vdCBmb3VuZAorKi8KK2V4dGVybiBpbnQgWkVYUE9SVCB1bnpMb2NhdGVGaWxlICh1bnpGaWxlIGZpbGUsIGNvbnN0IGNoYXIgKnN6RmlsZU5hbWUsIGludCBpQ2FzZVNlbnNpdGl2aXR5KQoreworICAgIHVuejY0X3MqIHM7CisgICAgaW50IGVycjsKKworICAgIC8qIFdlIHJlbWVtYmVyIHRoZSAnY3VycmVudCcgcG9zaXRpb24gaW4gdGhlIGZpbGUgc28gdGhhdCB3ZSBjYW4ganVtcAorICAgICAqIGJhY2sgdGhlcmUgaWYgd2UgZmFpbC4KKyAgICAgKi8KKyAgICB1bnpfZmlsZV9pbmZvNjQgY3VyX2ZpbGVfaW5mb1NhdmVkOworICAgIHVuel9maWxlX2luZm82NF9pbnRlcm5hbCBjdXJfZmlsZV9pbmZvX2ludGVybmFsU2F2ZWQ7CisgICAgWlBPUzY0X1QgbnVtX2ZpbGVTYXZlZDsKKyAgICBaUE9TNjRfVCBwb3NfaW5fY2VudHJhbF9kaXJTYXZlZDsKKworCisgICAgaWYgKGZpbGU9PU5VTEwpCisgICAgICAgIHJldHVybiBVTlpfUEFSQU1FUlJPUjsKKworICAgIGlmIChzdHJsZW4oc3pGaWxlTmFtZSk+PVVOWl9NQVhGSUxFTkFNRUlOWklQKQorICAgICAgICByZXR1cm4gVU5aX1BBUkFNRVJST1I7CisKKyAgICBzPSh1bno2NF9zKilmaWxlOworICAgIGlmICghcy0+Y3VycmVudF9maWxlX29rKQorICAgICAgICByZXR1cm4gVU5aX0VORF9PRl9MSVNUX09GX0ZJTEU7CisKKyAgICAvKiBTYXZlIHRoZSBjdXJyZW50IHN0YXRlICovCisgICAgbnVtX2ZpbGVTYXZlZCA9IHMtPm51bV9maWxlOworICAgIHBvc19pbl9jZW50cmFsX2RpclNhdmVkID0gcy0+cG9zX2luX2NlbnRyYWxfZGlyOworICAgIGN1cl9maWxlX2luZm9TYXZlZCA9IHMtPmN1cl9maWxlX2luZm87CisgICAgY3VyX2ZpbGVfaW5mb19pbnRlcm5hbFNhdmVkID0gcy0+Y3VyX2ZpbGVfaW5mb19pbnRlcm5hbDsKKworICAgIGVyciA9IHVuekdvVG9GaXJzdEZpbGUoZmlsZSk7CisKKyAgICB3aGlsZSAoZXJyID09IFVOWl9PSykKKyAgICB7CisgICAgICAgIGNoYXIgc3pDdXJyZW50RmlsZU5hbWVbVU5aX01BWEZJTEVOQU1FSU5aSVArMV07CisgICAgICAgIGVyciA9IHVuekdldEN1cnJlbnRGaWxlSW5mbzY0KGZpbGUsTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN6Q3VycmVudEZpbGVOYW1lLHNpemVvZihzekN1cnJlbnRGaWxlTmFtZSktMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsMCxOVUxMLDApOworICAgICAgICBpZiAoZXJyID09IFVOWl9PSykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHVuelN0cmluZ0ZpbGVOYW1lQ29tcGFyZShzekN1cnJlbnRGaWxlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3pGaWxlTmFtZSxpQ2FzZVNlbnNpdGl2aXR5KT09MCkKKyAgICAgICAgICAgICAgICByZXR1cm4gVU5aX09LOworICAgICAgICAgICAgZXJyID0gdW56R29Ub05leHRGaWxlKGZpbGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogV2UgZmFpbGVkLCBzbyByZXN0b3JlIHRoZSBzdGF0ZSBvZiB0aGUgJ2N1cnJlbnQgZmlsZScgdG8gd2hlcmUgd2UKKyAgICAgKiB3ZXJlLgorICAgICAqLworICAgIHMtPm51bV9maWxlID0gbnVtX2ZpbGVTYXZlZCA7CisgICAgcy0+cG9zX2luX2NlbnRyYWxfZGlyID0gcG9zX2luX2NlbnRyYWxfZGlyU2F2ZWQgOworICAgIHMtPmN1cl9maWxlX2luZm8gPSBjdXJfZmlsZV9pbmZvU2F2ZWQ7CisgICAgcy0+Y3VyX2ZpbGVfaW5mb19pbnRlcm5hbCA9IGN1cl9maWxlX2luZm9faW50ZXJuYWxTYXZlZDsKKyAgICByZXR1cm4gZXJyOworfQorCisKKy8qCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDb250cmlidXRlZCBieSBSeWFuIEhha3NpIChtYWlsdG86Ly9jcnlvZ2VuQGluZm9zZXJ2ZS5uZXQpCisvLyBJIG5lZWQgcmFuZG9tIGFjY2VzcworLy8KKy8vIEZ1cnRoZXIgb3B0aW1pemF0aW9uIGNvdWxkIGJlIHJlYWxpemVkIGJ5IGFkZGluZyBhbiBhYmlsaXR5CisvLyB0byBjYWNoZSB0aGUgZGlyZWN0b3J5IGluIG1lbW9yeS4gVGhlIGdvYWwgYmVpbmcgYSBzaW5nbGUKKy8vIGNvbXByZWhlbnNpdmUgZmlsZSByZWFkIHRvIHB1dCB0aGUgZmlsZSBJIG5lZWQgaW4gYSBtZW1vcnkuCisqLworCisvKgordHlwZWRlZiBzdHJ1Y3QgdW56X2ZpbGVfcG9zX3MKK3sKKyAgICBaUE9TNjRfVCBwb3NfaW5femlwX2RpcmVjdG9yeTsgICAvLyBvZmZzZXQgaW4gZmlsZQorICAgIFpQT1M2NF9UIG51bV9vZl9maWxlOyAgICAgICAgICAgIC8vICMgb2YgZmlsZQorfSB1bnpfZmlsZV9wb3M7CisqLworCitleHRlcm4gaW50IFpFWFBPUlQgdW56R2V0RmlsZVBvczY0KHVuekZpbGUgZmlsZSwgdW56NjRfZmlsZV9wb3MqICBmaWxlX3BvcykKK3sKKyAgICB1bno2NF9zKiBzOworCisgICAgaWYgKGZpbGU9PU5VTEwgfHwgZmlsZV9wb3M9PU5VTEwpCisgICAgICAgIHJldHVybiBVTlpfUEFSQU1FUlJPUjsKKyAgICBzPSh1bno2NF9zKilmaWxlOworICAgIGlmICghcy0+Y3VycmVudF9maWxlX29rKQorICAgICAgICByZXR1cm4gVU5aX0VORF9PRl9MSVNUX09GX0ZJTEU7CisKKyAgICBmaWxlX3Bvcy0+cG9zX2luX3ppcF9kaXJlY3RvcnkgID0gcy0+cG9zX2luX2NlbnRyYWxfZGlyOworICAgIGZpbGVfcG9zLT5udW1fb2ZfZmlsZSAgICAgICAgICAgPSBzLT5udW1fZmlsZTsKKworICAgIHJldHVybiBVTlpfT0s7Cit9CisKK2V4dGVybiBpbnQgWkVYUE9SVCB1bnpHZXRGaWxlUG9zKAorICAgIHVuekZpbGUgZmlsZSwKKyAgICB1bnpfZmlsZV9wb3MqIGZpbGVfcG9zKQoreworICAgIHVuejY0X2ZpbGVfcG9zIGZpbGVfcG9zNjQ7CisgICAgaW50IGVyciA9IHVuekdldEZpbGVQb3M2NChmaWxlLCZmaWxlX3BvczY0KTsKKyAgICBpZiAoZXJyPT1VTlpfT0spCisgICAgeworICAgICAgICBmaWxlX3Bvcy0+cG9zX2luX3ppcF9kaXJlY3RvcnkgPSAodUxvbmcpZmlsZV9wb3M2NC5wb3NfaW5femlwX2RpcmVjdG9yeTsKKyAgICAgICAgZmlsZV9wb3MtPm51bV9vZl9maWxlID0gKHVMb25nKWZpbGVfcG9zNjQubnVtX29mX2ZpbGU7CisgICAgfQorICAgIHJldHVybiBlcnI7Cit9CisKK2V4dGVybiBpbnQgWkVYUE9SVCB1bnpHb1RvRmlsZVBvczY0KHVuekZpbGUgZmlsZSwgY29uc3QgdW56NjRfZmlsZV9wb3MqIGZpbGVfcG9zKQoreworICAgIHVuejY0X3MqIHM7CisgICAgaW50IGVycjsKKworICAgIGlmIChmaWxlPT1OVUxMIHx8IGZpbGVfcG9zPT1OVUxMKQorICAgICAgICByZXR1cm4gVU5aX1BBUkFNRVJST1I7CisgICAgcz0odW56NjRfcyopZmlsZTsKKworICAgIC8qIGp1bXAgdG8gdGhlIHJpZ2h0IHNwb3QgKi8KKyAgICBzLT5wb3NfaW5fY2VudHJhbF9kaXIgPSBmaWxlX3Bvcy0+cG9zX2luX3ppcF9kaXJlY3Rvcnk7CisgICAgcy0+bnVtX2ZpbGUgICAgICAgICAgID0gZmlsZV9wb3MtPm51bV9vZl9maWxlOworCisgICAgLyogc2V0IHRoZSBjdXJyZW50IGZpbGUgKi8KKyAgICBlcnIgPSB1bno2NGxvY2FsX0dldEN1cnJlbnRGaWxlSW5mb0ludGVybmFsKGZpbGUsJnMtPmN1cl9maWxlX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzLT5jdXJfZmlsZV9pbmZvX2ludGVybmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLDAsTlVMTCwwLE5VTEwsMCk7CisgICAgLyogcmV0dXJuIHJlc3VsdHMgKi8KKyAgICBzLT5jdXJyZW50X2ZpbGVfb2sgPSAoZXJyID09IFVOWl9PSyk7CisgICAgcmV0dXJuIGVycjsKK30KKworZXh0ZXJuIGludCBaRVhQT1JUIHVuekdvVG9GaWxlUG9zKAorICAgIHVuekZpbGUgZmlsZSwKKyAgICB1bnpfZmlsZV9wb3MqIGZpbGVfcG9zKQoreworICAgIHVuejY0X2ZpbGVfcG9zIGZpbGVfcG9zNjQ7CisgICAgaWYgKGZpbGVfcG9zID09IE5VTEwpCisgICAgICAgIHJldHVybiBVTlpfUEFSQU1FUlJPUjsKKworICAgIGZpbGVfcG9zNjQucG9zX2luX3ppcF9kaXJlY3RvcnkgPSBmaWxlX3Bvcy0+cG9zX2luX3ppcF9kaXJlY3Rvcnk7CisgICAgZmlsZV9wb3M2NC5udW1fb2ZfZmlsZSA9IGZpbGVfcG9zLT5udW1fb2ZfZmlsZTsKKyAgICByZXR1cm4gdW56R29Ub0ZpbGVQb3M2NChmaWxlLCZmaWxlX3BvczY0KTsKK30KKworLyoKKy8vIFVuemlwIEhlbHBlciBGdW5jdGlvbnMgLSBzaG91bGQgYmUgaGVyZT8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyovCisKKy8qCisgIFJlYWQgdGhlIGxvY2FsIGhlYWRlciBvZiB0aGUgY3VycmVudCB6aXBmaWxlCisgIENoZWNrIHRoZSBjb2hlcmVuY3kgb2YgdGhlIGxvY2FsIGhlYWRlciBhbmQgaW5mbyBpbiB0aGUgZW5kIG9mIGNlbnRyYWwKKyAgICAgICAgZGlyZWN0b3J5IGFib3V0IHRoaXMgZmlsZQorICBzdG9yZSBpbiAqcGlTaXplVmFyIHRoZSBzaXplIG9mIGV4dHJhIGluZm8gaW4gbG9jYWwgaGVhZGVyCisgICAgICAgIChmaWxlbmFtZSBhbmQgc2l6ZSBvZiBleHRyYSBmaWVsZCBkYXRhKQorKi8KK2xvY2FsIGludCB1bno2NGxvY2FsX0NoZWNrQ3VycmVudEZpbGVDb2hlcmVuY3lIZWFkZXIgKHVuejY0X3MqIHMsIHVJbnQqIHBpU2l6ZVZhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaUE9TNjRfVCAqIHBvZmZzZXRfbG9jYWxfZXh0cmFmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1SW50ICAqIHBzaXplX2xvY2FsX2V4dHJhZmllbGQpCit7CisgICAgdUxvbmcgdU1hZ2ljLHVEYXRhLHVGbGFnczsKKyAgICB1TG9uZyBzaXplX2ZpbGVuYW1lOworICAgIHVMb25nIHNpemVfZXh0cmFfZmllbGQ7CisgICAgaW50IGVycj1VTlpfT0s7CisKKyAgICAqcGlTaXplVmFyID0gMDsKKyAgICAqcG9mZnNldF9sb2NhbF9leHRyYWZpZWxkID0gMDsKKyAgICAqcHNpemVfbG9jYWxfZXh0cmFmaWVsZCA9IDA7CisKKyAgICBpZiAoWlNFRUs2NChzLT56X2ZpbGVmdW5jLCBzLT5maWxlc3RyZWFtLHMtPmN1cl9maWxlX2luZm9faW50ZXJuYWwub2Zmc2V0X2N1cmZpbGUgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5ieXRlX2JlZm9yZV90aGVfemlwZmlsZSxaTElCX0ZJTEVGVU5DX1NFRUtfU0VUKSE9MCkKKyAgICAgICAgcmV0dXJuIFVOWl9FUlJOTzsKKworCisgICAgaWYgKGVycj09VU5aX09LKQorICAgIHsKKyAgICAgICAgaWYgKHVuejY0bG9jYWxfZ2V0TG9uZygmcy0+el9maWxlZnVuYywgcy0+ZmlsZXN0cmVhbSwmdU1hZ2ljKSAhPSBVTlpfT0spCisgICAgICAgICAgICBlcnI9VU5aX0VSUk5POworICAgICAgICBlbHNlIGlmICh1TWFnaWMhPTB4MDQwMzRiNTApCisgICAgICAgICAgICBlcnI9VU5aX0JBRFpJUEZJTEU7CisgICAgfQorCisgICAgaWYgKHVuejY0bG9jYWxfZ2V0U2hvcnQoJnMtPnpfZmlsZWZ1bmMsIHMtPmZpbGVzdHJlYW0sJnVEYXRhKSAhPSBVTlpfT0spCisgICAgICAgIGVycj1VTlpfRVJSTk87CisvKgorICAgIGVsc2UgaWYgKChlcnI9PVVOWl9PSykgJiYgKHVEYXRhIT1zLT5jdXJfZmlsZV9pbmZvLndWZXJzaW9uKSkKKyAgICAgICAgZXJyPVVOWl9CQURaSVBGSUxFOworKi8KKyAgICBpZiAodW56NjRsb2NhbF9nZXRTaG9ydCgmcy0+el9maWxlZnVuYywgcy0+ZmlsZXN0cmVhbSwmdUZsYWdzKSAhPSBVTlpfT0spCisgICAgICAgIGVycj1VTlpfRVJSTk87CisKKyAgICBpZiAodW56NjRsb2NhbF9nZXRTaG9ydCgmcy0+el9maWxlZnVuYywgcy0+ZmlsZXN0cmVhbSwmdURhdGEpICE9IFVOWl9PSykKKyAgICAgICAgZXJyPVVOWl9FUlJOTzsKKyAgICBlbHNlIGlmICgoZXJyPT1VTlpfT0spICYmICh1RGF0YSE9cy0+Y3VyX2ZpbGVfaW5mby5jb21wcmVzc2lvbl9tZXRob2QpKQorICAgICAgICBlcnI9VU5aX0JBRFpJUEZJTEU7CisKKyAgICBpZiAoKGVycj09VU5aX09LKSAmJiAocy0+Y3VyX2ZpbGVfaW5mby5jb21wcmVzc2lvbl9tZXRob2QhPTApICYmCisvKiAjaWZkZWYgSEFWRV9CWklQMiAqLworICAgICAgICAgICAgICAgICAgICAgICAgIChzLT5jdXJfZmlsZV9pbmZvLmNvbXByZXNzaW9uX21ldGhvZCE9Wl9CWklQMkVEKSAmJgorLyogI2VuZGlmICovCisgICAgICAgICAgICAgICAgICAgICAgICAgKHMtPmN1cl9maWxlX2luZm8uY29tcHJlc3Npb25fbWV0aG9kIT1aX0RFRkxBVEVEKSkKKyAgICAgICAgZXJyPVVOWl9CQURaSVBGSUxFOworCisgICAgaWYgKHVuejY0bG9jYWxfZ2V0TG9uZygmcy0+el9maWxlZnVuYywgcy0+ZmlsZXN0cmVhbSwmdURhdGEpICE9IFVOWl9PSykgLyogZGF0ZS90aW1lICovCisgICAgICAgIGVycj1VTlpfRVJSTk87CisKKyAgICBpZiAodW56NjRsb2NhbF9nZXRMb25nKCZzLT56X2ZpbGVmdW5jLCBzLT5maWxlc3RyZWFtLCZ1RGF0YSkgIT0gVU5aX09LKSAvKiBjcmMgKi8KKyAgICAgICAgZXJyPVVOWl9FUlJOTzsKKyAgICBlbHNlIGlmICgoZXJyPT1VTlpfT0spICYmICh1RGF0YSE9cy0+Y3VyX2ZpbGVfaW5mby5jcmMpICYmICgodUZsYWdzICYgOCk9PTApKQorICAgICAgICBlcnI9VU5aX0JBRFpJUEZJTEU7CisKKyAgICBpZiAodW56NjRsb2NhbF9nZXRMb25nKCZzLT56X2ZpbGVmdW5jLCBzLT5maWxlc3RyZWFtLCZ1RGF0YSkgIT0gVU5aX09LKSAvKiBzaXplIGNvbXByICovCisgICAgICAgIGVycj1VTlpfRVJSTk87CisgICAgZWxzZSBpZiAodURhdGEgIT0gMHhGRkZGRkZGRiAmJiAoZXJyPT1VTlpfT0spICYmICh1RGF0YSE9cy0+Y3VyX2ZpbGVfaW5mby5jb21wcmVzc2VkX3NpemUpICYmICgodUZsYWdzICYgOCk9PTApKQorICAgICAgICBlcnI9VU5aX0JBRFpJUEZJTEU7CisKKyAgICBpZiAodW56NjRsb2NhbF9nZXRMb25nKCZzLT56X2ZpbGVmdW5jLCBzLT5maWxlc3RyZWFtLCZ1RGF0YSkgIT0gVU5aX09LKSAvKiBzaXplIHVuY29tcHIgKi8KKyAgICAgICAgZXJyPVVOWl9FUlJOTzsKKyAgICBlbHNlIGlmICh1RGF0YSAhPSAweEZGRkZGRkZGICYmIChlcnI9PVVOWl9PSykgJiYgKHVEYXRhIT1zLT5jdXJfZmlsZV9pbmZvLnVuY29tcHJlc3NlZF9zaXplKSAmJiAoKHVGbGFncyAmIDgpPT0wKSkKKyAgICAgICAgZXJyPVVOWl9CQURaSVBGSUxFOworCisgICAgaWYgKHVuejY0bG9jYWxfZ2V0U2hvcnQoJnMtPnpfZmlsZWZ1bmMsIHMtPmZpbGVzdHJlYW0sJnNpemVfZmlsZW5hbWUpICE9IFVOWl9PSykKKyAgICAgICAgZXJyPVVOWl9FUlJOTzsKKyAgICBlbHNlIGlmICgoZXJyPT1VTlpfT0spICYmIChzaXplX2ZpbGVuYW1lIT1zLT5jdXJfZmlsZV9pbmZvLnNpemVfZmlsZW5hbWUpKQorICAgICAgICBlcnI9VU5aX0JBRFpJUEZJTEU7CisKKyAgICAqcGlTaXplVmFyICs9ICh1SW50KXNpemVfZmlsZW5hbWU7CisKKyAgICBpZiAodW56NjRsb2NhbF9nZXRTaG9ydCgmcy0+el9maWxlZnVuYywgcy0+ZmlsZXN0cmVhbSwmc2l6ZV9leHRyYV9maWVsZCkgIT0gVU5aX09LKQorICAgICAgICBlcnI9VU5aX0VSUk5POworICAgICpwb2Zmc2V0X2xvY2FsX2V4dHJhZmllbGQ9IHMtPmN1cl9maWxlX2luZm9faW50ZXJuYWwub2Zmc2V0X2N1cmZpbGUgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0laRVpJUExPQ0FMSEVBREVSICsgc2l6ZV9maWxlbmFtZTsKKyAgICAqcHNpemVfbG9jYWxfZXh0cmFmaWVsZCA9ICh1SW50KXNpemVfZXh0cmFfZmllbGQ7CisKKyAgICAqcGlTaXplVmFyICs9ICh1SW50KXNpemVfZXh0cmFfZmllbGQ7CisKKyAgICByZXR1cm4gZXJyOworfQorCisvKgorICBPcGVuIGZvciByZWFkaW5nIGRhdGEgdGhlIGN1cnJlbnQgZmlsZSBpbiB0aGUgemlwZmlsZS4KKyAgSWYgdGhlcmUgaXMgbm8gZXJyb3IgYW5kIHRoZSBmaWxlIGlzIG9wZW5lZCwgdGhlIHJldHVybiB2YWx1ZSBpcyBVTlpfT0suCisqLworZXh0ZXJuIGludCBaRVhQT1JUIHVuek9wZW5DdXJyZW50RmlsZTMgKHVuekZpbGUgZmlsZSwgaW50KiBtZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogbGV2ZWwsIGludCByYXcsIGNvbnN0IGNoYXIqIHBhc3N3b3JkKQoreworICAgIGludCBlcnI9VU5aX09LOworICAgIHVJbnQgaVNpemVWYXI7CisgICAgdW56NjRfcyogczsKKyAgICBmaWxlX2luX3ppcDY0X3JlYWRfaW5mb19zKiBwZmlsZV9pbl96aXBfcmVhZF9pbmZvOworICAgIFpQT1M2NF9UIG9mZnNldF9sb2NhbF9leHRyYWZpZWxkOyAgLyogb2Zmc2V0IG9mIHRoZSBsb2NhbCBleHRyYSBmaWVsZCAqLworICAgIHVJbnQgIHNpemVfbG9jYWxfZXh0cmFmaWVsZDsgICAgLyogc2l6ZSBvZiB0aGUgbG9jYWwgZXh0cmEgZmllbGQgKi8KKyMgICAgaWZuZGVmIE5PVU5DUllQVAorICAgIGNoYXIgc291cmNlWzEyXTsKKyMgICAgZWxzZQorICAgIGlmIChwYXNzd29yZCAhPSBOVUxMKQorICAgICAgICByZXR1cm4gVU5aX1BBUkFNRVJST1I7CisjICAgIGVuZGlmCisKKyAgICBpZiAoZmlsZT09TlVMTCkKKyAgICAgICAgcmV0dXJuIFVOWl9QQVJBTUVSUk9SOworICAgIHM9KHVuejY0X3MqKWZpbGU7CisgICAgaWYgKCFzLT5jdXJyZW50X2ZpbGVfb2spCisgICAgICAgIHJldHVybiBVTlpfUEFSQU1FUlJPUjsKKworICAgIGlmIChzLT5wZmlsZV9pbl96aXBfcmVhZCAhPSBOVUxMKQorICAgICAgICB1bnpDbG9zZUN1cnJlbnRGaWxlKGZpbGUpOworCisgICAgaWYgKHVuejY0bG9jYWxfQ2hlY2tDdXJyZW50RmlsZUNvaGVyZW5jeUhlYWRlcihzLCZpU2l6ZVZhciwgJm9mZnNldF9sb2NhbF9leHRyYWZpZWxkLCZzaXplX2xvY2FsX2V4dHJhZmllbGQpIT1VTlpfT0spCisgICAgICAgIHJldHVybiBVTlpfQkFEWklQRklMRTsKKworICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8gPSAoZmlsZV9pbl96aXA2NF9yZWFkX2luZm9fcyopQUxMT0Moc2l6ZW9mKGZpbGVfaW5femlwNjRfcmVhZF9pbmZvX3MpKTsKKyAgICBpZiAocGZpbGVfaW5femlwX3JlYWRfaW5mbz09TlVMTCkKKyAgICAgICAgcmV0dXJuIFVOWl9JTlRFUk5BTEVSUk9SOworCisgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+cmVhZF9idWZmZXI9KGNoYXIqKUFMTE9DKFVOWl9CVUZTSVpFKTsKKyAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5vZmZzZXRfbG9jYWxfZXh0cmFmaWVsZCA9IG9mZnNldF9sb2NhbF9leHRyYWZpZWxkOworICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnNpemVfbG9jYWxfZXh0cmFmaWVsZCA9IHNpemVfbG9jYWxfZXh0cmFmaWVsZDsKKyAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5wb3NfbG9jYWxfZXh0cmFmaWVsZD0wOworICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnJhdz1yYXc7CisKKyAgICBpZiAocGZpbGVfaW5femlwX3JlYWRfaW5mby0+cmVhZF9idWZmZXI9PU5VTEwpCisgICAgeworICAgICAgICBUUllGUkVFKHBmaWxlX2luX3ppcF9yZWFkX2luZm8pOworICAgICAgICByZXR1cm4gVU5aX0lOVEVSTkFMRVJST1I7CisgICAgfQorCisgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtX2luaXRpYWxpc2VkPTA7CisKKyAgICBpZiAobWV0aG9kIT1OVUxMKQorICAgICAgICAqbWV0aG9kID0gKGludClzLT5jdXJfZmlsZV9pbmZvLmNvbXByZXNzaW9uX21ldGhvZDsKKworICAgIGlmIChsZXZlbCE9TlVMTCkKKyAgICB7CisgICAgICAgICpsZXZlbCA9IDY7CisgICAgICAgIHN3aXRjaCAocy0+Y3VyX2ZpbGVfaW5mby5mbGFnICYgMHgwNikKKyAgICAgICAgeworICAgICAgICAgIGNhc2UgNiA6ICpsZXZlbCA9IDE7IGJyZWFrOworICAgICAgICAgIGNhc2UgNCA6ICpsZXZlbCA9IDI7IGJyZWFrOworICAgICAgICAgIGNhc2UgMiA6ICpsZXZlbCA9IDk7IGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChzLT5jdXJfZmlsZV9pbmZvLmNvbXByZXNzaW9uX21ldGhvZCE9MCkgJiYKKy8qICNpZmRlZiBIQVZFX0JaSVAyICovCisgICAgICAgIChzLT5jdXJfZmlsZV9pbmZvLmNvbXByZXNzaW9uX21ldGhvZCE9Wl9CWklQMkVEKSAmJgorLyogI2VuZGlmICovCisgICAgICAgIChzLT5jdXJfZmlsZV9pbmZvLmNvbXByZXNzaW9uX21ldGhvZCE9Wl9ERUZMQVRFRCkpCisKKyAgICAgICAgZXJyPVVOWl9CQURaSVBGSUxFOworCisgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+Y3JjMzJfd2FpdD1zLT5jdXJfZmlsZV9pbmZvLmNyYzsKKyAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5jcmMzMj0wOworICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnRvdGFsX291dF82ND0wOworICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPmNvbXByZXNzaW9uX21ldGhvZCA9IHMtPmN1cl9maWxlX2luZm8uY29tcHJlc3Npb25fbWV0aG9kOworICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPmZpbGVzdHJlYW09cy0+ZmlsZXN0cmVhbTsKKyAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT56X2ZpbGVmdW5jPXMtPnpfZmlsZWZ1bmM7CisgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+Ynl0ZV9iZWZvcmVfdGhlX3ppcGZpbGU9cy0+Ynl0ZV9iZWZvcmVfdGhlX3ppcGZpbGU7CisKKyAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0udG90YWxfb3V0ID0gMDsKKworICAgIGlmICgocy0+Y3VyX2ZpbGVfaW5mby5jb21wcmVzc2lvbl9tZXRob2Q9PVpfQlpJUDJFRCkgJiYgKCFyYXcpKQorICAgIHsKKyNpZmRlZiBIQVZFX0JaSVAyCisgICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5ic3RyZWFtLmJ6YWxsb2MgPSAodm9pZCAqKCopICh2b2lkICosIGludCwgaW50KSkwOworICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+YnN0cmVhbS5iemZyZWUgPSAoZnJlZV9mdW5jKTA7CisgICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5ic3RyZWFtLm9wYXF1ZSA9ICh2b2lkcGYpMDsKKyAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPmJzdHJlYW0uc3RhdGUgPSAodm9pZHBmKTA7CisKKyAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS56YWxsb2MgPSAoYWxsb2NfZnVuYykwOworICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLnpmcmVlID0gKGZyZWVfZnVuYykwOworICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLm9wYXF1ZSA9ICh2b2lkcGYpMDsKKyAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS5uZXh0X2luID0gKHZvaWRwZikwOworICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLmF2YWlsX2luID0gMDsKKworICAgICAgZXJyPUJaMl9iekRlY29tcHJlc3NJbml0KCZwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5ic3RyZWFtLCAwLCAwKTsKKyAgICAgIGlmIChlcnIgPT0gWl9PSykKKyAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtX2luaXRpYWxpc2VkPVpfQlpJUDJFRDsKKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgVFJZRlJFRShwZmlsZV9pbl96aXBfcmVhZF9pbmZvKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgIH0KKyNlbHNlCisgICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5yYXc9MTsKKyNlbmRpZgorICAgIH0KKyAgICBlbHNlIGlmICgocy0+Y3VyX2ZpbGVfaW5mby5jb21wcmVzc2lvbl9tZXRob2Q9PVpfREVGTEFURUQpICYmICghcmF3KSkKKyAgICB7CisgICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0uemFsbG9jID0gKGFsbG9jX2Z1bmMpMDsKKyAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS56ZnJlZSA9IChmcmVlX2Z1bmMpMDsKKyAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS5vcGFxdWUgPSAodm9pZHBmKTA7CisgICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0ubmV4dF9pbiA9IDA7CisgICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0uYXZhaWxfaW4gPSAwOworCisgICAgICBlcnI9aW5mbGF0ZUluaXQyKCZwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0sIC1NQVhfV0JJVFMpOworICAgICAgaWYgKGVyciA9PSBaX09LKQorICAgICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW1faW5pdGlhbGlzZWQ9Wl9ERUZMQVRFRDsKKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgVFJZRlJFRShwZmlsZV9pbl96aXBfcmVhZF9pbmZvKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgIH0KKyAgICAgICAgLyogd2luZG93Qml0cyBpcyBwYXNzZWQgPCAwIHRvIHRlbGwgdGhhdCB0aGVyZSBpcyBubyB6bGliIGhlYWRlci4KKyAgICAgICAgICogTm90ZSB0aGF0IGluIHRoaXMgY2FzZSBpbmZsYXRlICpyZXF1aXJlcyogYW4gZXh0cmEgImR1bW15IiBieXRlCisgICAgICAgICAqIGFmdGVyIHRoZSBjb21wcmVzc2VkIHN0cmVhbSBpbiBvcmRlciB0byBjb21wbGV0ZSBkZWNvbXByZXNzaW9uIGFuZAorICAgICAgICAgKiByZXR1cm4gWl9TVFJFQU1fRU5ELgorICAgICAgICAgKiBJbiB1bnppcCwgaSBkb24ndCB3YWl0IGFic29sdXRlbHkgWl9TVFJFQU1fRU5EIGJlY2F1c2UgSSBrbm93biB0aGUKKyAgICAgICAgICogc2l6ZSBvZiBib3RoIGNvbXByZXNzZWQgYW5kIHVuY29tcHJlc3NlZCBkYXRhCisgICAgICAgICAqLworICAgIH0KKyAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5yZXN0X3JlYWRfY29tcHJlc3NlZCA9CisgICAgICAgICAgICBzLT5jdXJfZmlsZV9pbmZvLmNvbXByZXNzZWRfc2l6ZSA7CisgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+cmVzdF9yZWFkX3VuY29tcHJlc3NlZCA9CisgICAgICAgICAgICBzLT5jdXJfZmlsZV9pbmZvLnVuY29tcHJlc3NlZF9zaXplIDsKKworCisgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+cG9zX2luX3ppcGZpbGUgPQorICAgICAgICAgICAgcy0+Y3VyX2ZpbGVfaW5mb19pbnRlcm5hbC5vZmZzZXRfY3VyZmlsZSArIFNJWkVaSVBMT0NBTEhFQURFUiArCisgICAgICAgICAgICAgIGlTaXplVmFyOworCisgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLmF2YWlsX2luID0gKHVJbnQpMDsKKworICAgIHMtPnBmaWxlX2luX3ppcF9yZWFkID0gcGZpbGVfaW5femlwX3JlYWRfaW5mbzsKKyAgICAgICAgICAgICAgICBzLT5lbmNyeXB0ZWQgPSAwOworCisjICAgIGlmbmRlZiBOT1VOQ1JZUFQKKyAgICBpZiAocGFzc3dvcmQgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGludCBpOworICAgICAgICBzLT5wY3JjXzMyX3RhYiA9IGdldF9jcmNfdGFibGUoKTsKKyAgICAgICAgaW5pdF9rZXlzKHBhc3N3b3JkLHMtPmtleXMscy0+cGNyY18zMl90YWIpOworICAgICAgICBpZiAoWlNFRUs2NChzLT56X2ZpbGVmdW5jLCBzLT5maWxlc3RyZWFtLAorICAgICAgICAgICAgICAgICAgcy0+cGZpbGVfaW5femlwX3JlYWQtPnBvc19pbl96aXBmaWxlICsKKyAgICAgICAgICAgICAgICAgICAgIHMtPnBmaWxlX2luX3ppcF9yZWFkLT5ieXRlX2JlZm9yZV90aGVfemlwZmlsZSwKKyAgICAgICAgICAgICAgICAgIFNFRUtfU0VUKSE9MCkKKyAgICAgICAgICAgIHJldHVybiBVTlpfSU5URVJOQUxFUlJPUjsKKyAgICAgICAgaWYoWlJFQUQ2NChzLT56X2ZpbGVmdW5jLCBzLT5maWxlc3RyZWFtLHNvdXJjZSwgMTIpPDEyKQorICAgICAgICAgICAgcmV0dXJuIFVOWl9JTlRFUk5BTEVSUk9SOworCisgICAgICAgIGZvciAoaSA9IDA7IGk8MTI7IGkrKykKKyAgICAgICAgICAgIHpkZWNvZGUocy0+a2V5cyxzLT5wY3JjXzMyX3RhYixzb3VyY2VbaV0pOworCisgICAgICAgIHMtPnBmaWxlX2luX3ppcF9yZWFkLT5wb3NfaW5femlwZmlsZSs9MTI7CisgICAgICAgIHMtPmVuY3J5cHRlZD0xOworICAgIH0KKyMgICAgZW5kaWYKKworCisgICAgcmV0dXJuIFVOWl9PSzsKK30KKworZXh0ZXJuIGludCBaRVhQT1JUIHVuek9wZW5DdXJyZW50RmlsZSAodW56RmlsZSBmaWxlKQoreworICAgIHJldHVybiB1bnpPcGVuQ3VycmVudEZpbGUzKGZpbGUsIE5VTEwsIE5VTEwsIDAsIE5VTEwpOworfQorCitleHRlcm4gaW50IFpFWFBPUlQgdW56T3BlbkN1cnJlbnRGaWxlUGFzc3dvcmQgKHVuekZpbGUgZmlsZSwgY29uc3QgY2hhciogIHBhc3N3b3JkKQoreworICAgIHJldHVybiB1bnpPcGVuQ3VycmVudEZpbGUzKGZpbGUsIE5VTEwsIE5VTEwsIDAsIHBhc3N3b3JkKTsKK30KKworZXh0ZXJuIGludCBaRVhQT1JUIHVuek9wZW5DdXJyZW50RmlsZTIgKHVuekZpbGUgZmlsZSwgaW50KiBtZXRob2QsIGludCogbGV2ZWwsIGludCByYXcpCit7CisgICAgcmV0dXJuIHVuek9wZW5DdXJyZW50RmlsZTMoZmlsZSwgbWV0aG9kLCBsZXZlbCwgcmF3LCBOVUxMKTsKK30KKworLyoqIEFkZGl0aW9uIGZvciBHREFMIDogU1RBUlQgKi8KKworZXh0ZXJuIFpQT1M2NF9UIFpFWFBPUlQgdW56R2V0Q3VycmVudEZpbGVaU3RyZWFtUG9zNjQoIHVuekZpbGUgZmlsZSkKK3sKKyAgICB1bno2NF9zKiBzOworICAgIGZpbGVfaW5femlwNjRfcmVhZF9pbmZvX3MqIHBmaWxlX2luX3ppcF9yZWFkX2luZm87CisgICAgcz0odW56NjRfcyopZmlsZTsKKyAgICBpZiAoZmlsZT09TlVMTCkKKyAgICAgICAgcmV0dXJuIDA7IC8vVU5aX1BBUkFNRVJST1I7CisgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mbz1zLT5wZmlsZV9pbl96aXBfcmVhZDsKKyAgICBpZiAocGZpbGVfaW5femlwX3JlYWRfaW5mbz09TlVMTCkKKyAgICAgICAgcmV0dXJuIDA7IC8vVU5aX1BBUkFNRVJST1I7CisgICAgcmV0dXJuIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnBvc19pbl96aXBmaWxlICsKKyAgICAgICAgICAgICAgICAgICAgICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5ieXRlX2JlZm9yZV90aGVfemlwZmlsZTsKK30KKworLyoqIEFkZGl0aW9uIGZvciBHREFMIDogRU5EICovCisKKy8qCisgIFJlYWQgYnl0ZXMgZnJvbSB0aGUgY3VycmVudCBmaWxlLgorICBidWYgY29udGFpbiBidWZmZXIgd2hlcmUgZGF0YSBtdXN0IGJlIGNvcGllZAorICBsZW4gdGhlIHNpemUgb2YgYnVmLgorCisgIHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGUgY29waWVkIGlmIHNvbWVzIGJ5dGVzIGFyZSBjb3BpZWQKKyAgcmV0dXJuIDAgaWYgdGhlIGVuZCBvZiBmaWxlIHdhcyByZWFjaGVkCisgIHJldHVybiA8MCB3aXRoIGVycm9yIGNvZGUgaWYgdGhlcmUgaXMgYW4gZXJyb3IKKyAgICAoVU5aX0VSUk5PIGZvciBJTyBlcnJvciwgb3IgekxpYiBlcnJvciBmb3IgdW5jb21wcmVzcyBlcnJvcikKKyovCitleHRlcm4gaW50IFpFWFBPUlQgdW56UmVhZEN1cnJlbnRGaWxlICAodW56RmlsZSBmaWxlLCB2b2lkcCBidWYsIHVuc2lnbmVkIGxlbikKK3sKKyAgICBpbnQgZXJyPVVOWl9PSzsKKyAgICB1SW50IGlSZWFkID0gMDsKKyAgICB1bno2NF9zKiBzOworICAgIGZpbGVfaW5femlwNjRfcmVhZF9pbmZvX3MqIHBmaWxlX2luX3ppcF9yZWFkX2luZm87CisgICAgaWYgKGZpbGU9PU5VTEwpCisgICAgICAgIHJldHVybiBVTlpfUEFSQU1FUlJPUjsKKyAgICBzPSh1bno2NF9zKilmaWxlOworICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm89cy0+cGZpbGVfaW5femlwX3JlYWQ7CisKKyAgICBpZiAocGZpbGVfaW5femlwX3JlYWRfaW5mbz09TlVMTCkKKyAgICAgICAgcmV0dXJuIFVOWl9QQVJBTUVSUk9SOworCisKKyAgICBpZiAocGZpbGVfaW5femlwX3JlYWRfaW5mby0+cmVhZF9idWZmZXIgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFVOWl9FTkRfT0ZfTElTVF9PRl9GSUxFOworICAgIGlmIChsZW49PTApCisgICAgICAgIHJldHVybiAwOworCisgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLm5leHRfb3V0ID0gKEJ5dGVmKilidWY7CisKKyAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0uYXZhaWxfb3V0ID0gKHVJbnQpbGVuOworCisgICAgaWYgKChsZW4+cGZpbGVfaW5femlwX3JlYWRfaW5mby0+cmVzdF9yZWFkX3VuY29tcHJlc3NlZCkgJiYKKyAgICAgICAgKCEocGZpbGVfaW5femlwX3JlYWRfaW5mby0+cmF3KSkpCisgICAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS5hdmFpbF9vdXQgPQorICAgICAgICAgICAgKHVJbnQpcGZpbGVfaW5femlwX3JlYWRfaW5mby0+cmVzdF9yZWFkX3VuY29tcHJlc3NlZDsKKworICAgIGlmICgobGVuPnBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnJlc3RfcmVhZF9jb21wcmVzc2VkKworICAgICAgICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0uYXZhaWxfaW4pICYmCisgICAgICAgICAocGZpbGVfaW5femlwX3JlYWRfaW5mby0+cmF3KSkKKyAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLmF2YWlsX291dCA9CisgICAgICAgICAgICAodUludClwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5yZXN0X3JlYWRfY29tcHJlc3NlZCsKKyAgICAgICAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS5hdmFpbF9pbjsKKworICAgIHdoaWxlIChwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0uYXZhaWxfb3V0PjApCisgICAgeworICAgICAgICBpZiAoKHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS5hdmFpbF9pbj09MCkgJiYKKyAgICAgICAgICAgIChwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5yZXN0X3JlYWRfY29tcHJlc3NlZD4wKSkKKyAgICAgICAgeworICAgICAgICAgICAgdUludCB1UmVhZFRoaXMgPSBVTlpfQlVGU0laRTsKKyAgICAgICAgICAgIGlmIChwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5yZXN0X3JlYWRfY29tcHJlc3NlZDx1UmVhZFRoaXMpCisgICAgICAgICAgICAgICAgdVJlYWRUaGlzID0gKHVJbnQpcGZpbGVfaW5femlwX3JlYWRfaW5mby0+cmVzdF9yZWFkX2NvbXByZXNzZWQ7CisgICAgICAgICAgICBpZiAodVJlYWRUaGlzID09IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIFVOWl9FT0Y7CisgICAgICAgICAgICBpZiAoWlNFRUs2NChwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT56X2ZpbGVmdW5jLAorICAgICAgICAgICAgICAgICAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPmZpbGVzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+cG9zX2luX3ppcGZpbGUgKworICAgICAgICAgICAgICAgICAgICAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPmJ5dGVfYmVmb3JlX3RoZV96aXBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIFpMSUJfRklMRUZVTkNfU0VFS19TRVQpIT0wKQorICAgICAgICAgICAgICAgIHJldHVybiBVTlpfRVJSTk87CisgICAgICAgICAgICBpZiAoWlJFQUQ2NChwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT56X2ZpbGVmdW5jLAorICAgICAgICAgICAgICAgICAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPmZpbGVzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+cmVhZF9idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgdVJlYWRUaGlzKSE9dVJlYWRUaGlzKQorICAgICAgICAgICAgICAgIHJldHVybiBVTlpfRVJSTk87CisKKworIyAgICAgICAgICAgIGlmbmRlZiBOT1VOQ1JZUFQKKyAgICAgICAgICAgIGlmKHMtPmVuY3J5cHRlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1SW50IGk7CisgICAgICAgICAgICAgICAgZm9yKGk9MDtpPHVSZWFkVGhpcztpKyspCisgICAgICAgICAgICAgICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5yZWFkX2J1ZmZlcltpXSA9CisgICAgICAgICAgICAgICAgICAgICAgemRlY29kZShzLT5rZXlzLHMtPnBjcmNfMzJfdGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+cmVhZF9idWZmZXJbaV0pOworICAgICAgICAgICAgfQorIyAgICAgICAgICAgIGVuZGlmCisKKworICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+cG9zX2luX3ppcGZpbGUgKz0gdVJlYWRUaGlzOworCisgICAgICAgICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5yZXN0X3JlYWRfY29tcHJlc3NlZC09dVJlYWRUaGlzOworCisgICAgICAgICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0ubmV4dF9pbiA9CisgICAgICAgICAgICAgICAgKEJ5dGVmKilwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5yZWFkX2J1ZmZlcjsKKyAgICAgICAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS5hdmFpbF9pbiA9ICh1SW50KXVSZWFkVGhpczsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgocGZpbGVfaW5femlwX3JlYWRfaW5mby0+Y29tcHJlc3Npb25fbWV0aG9kPT0wKSB8fCAocGZpbGVfaW5femlwX3JlYWRfaW5mby0+cmF3KSkKKyAgICAgICAgeworICAgICAgICAgICAgdUludCB1RG9Db3B5LGkgOworCisgICAgICAgICAgICBpZiAoKHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS5hdmFpbF9pbiA9PSAwKSAmJgorICAgICAgICAgICAgICAgIChwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5yZXN0X3JlYWRfY29tcHJlc3NlZCA9PSAwKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gKGlSZWFkPT0wKSA/IFVOWl9FT0YgOiBpUmVhZDsKKworICAgICAgICAgICAgaWYgKHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS5hdmFpbF9vdXQgPAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS5hdmFpbF9pbikKKyAgICAgICAgICAgICAgICB1RG9Db3B5ID0gcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLmF2YWlsX291dCA7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdURvQ29weSA9IHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS5hdmFpbF9pbiA7CisKKyAgICAgICAgICAgIGZvciAoaT0wO2k8dURvQ29weTtpKyspCisgICAgICAgICAgICAgICAgKihwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0ubmV4dF9vdXQraSkgPQorICAgICAgICAgICAgICAgICAgICAgICAgKihwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0ubmV4dF9pbitpKTsKKworICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+dG90YWxfb3V0XzY0ID0gcGZpbGVfaW5femlwX3JlYWRfaW5mby0+dG90YWxfb3V0XzY0ICsgdURvQ29weTsKKworICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+Y3JjMzIgPSBjcmMzMihwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5jcmMzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLm5leHRfb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1RG9Db3B5KTsKKyAgICAgICAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnJlc3RfcmVhZF91bmNvbXByZXNzZWQtPXVEb0NvcHk7CisgICAgICAgICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0uYXZhaWxfaW4gLT0gdURvQ29weTsKKyAgICAgICAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS5hdmFpbF9vdXQgLT0gdURvQ29weTsKKyAgICAgICAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS5uZXh0X291dCArPSB1RG9Db3B5OworICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLm5leHRfaW4gKz0gdURvQ29weTsKKyAgICAgICAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS50b3RhbF9vdXQgKz0gdURvQ29weTsKKyAgICAgICAgICAgIGlSZWFkICs9IHVEb0NvcHk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAocGZpbGVfaW5femlwX3JlYWRfaW5mby0+Y29tcHJlc3Npb25fbWV0aG9kPT1aX0JaSVAyRUQpCisgICAgICAgIHsKKyNpZmRlZiBIQVZFX0JaSVAyCisgICAgICAgICAgICB1TG9uZyB1VG90YWxPdXRCZWZvcmUsdVRvdGFsT3V0QWZ0ZXI7CisgICAgICAgICAgICBjb25zdCBCeXRlZiAqYnVmQmVmb3JlOworICAgICAgICAgICAgdUxvbmcgdU91dFRoaXM7CisKKyAgICAgICAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPmJzdHJlYW0ubmV4dF9pbiAgICAgICAgPSAoY2hhciopcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLm5leHRfaW47CisgICAgICAgICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5ic3RyZWFtLmF2YWlsX2luICAgICAgID0gcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLmF2YWlsX2luOworICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+YnN0cmVhbS50b3RhbF9pbl9sbzMyICA9IHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS50b3RhbF9pbjsKKyAgICAgICAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPmJzdHJlYW0udG90YWxfaW5faGkzMiAgPSAwOworICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+YnN0cmVhbS5uZXh0X291dCAgICAgICA9IChjaGFyKilwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0ubmV4dF9vdXQ7CisgICAgICAgICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5ic3RyZWFtLmF2YWlsX291dCAgICAgID0gcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLmF2YWlsX291dDsKKyAgICAgICAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPmJzdHJlYW0udG90YWxfb3V0X2xvMzIgPSBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0udG90YWxfb3V0OworICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+YnN0cmVhbS50b3RhbF9vdXRfaGkzMiA9IDA7CisKKyAgICAgICAgICAgIHVUb3RhbE91dEJlZm9yZSA9IHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPmJzdHJlYW0udG90YWxfb3V0X2xvMzI7CisgICAgICAgICAgICBidWZCZWZvcmUgPSAoY29uc3QgQnl0ZWYgKilwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5ic3RyZWFtLm5leHRfb3V0OworCisgICAgICAgICAgICBlcnI9QloyX2J6RGVjb21wcmVzcygmcGZpbGVfaW5femlwX3JlYWRfaW5mby0+YnN0cmVhbSk7CisKKyAgICAgICAgICAgIHVUb3RhbE91dEFmdGVyID0gcGZpbGVfaW5femlwX3JlYWRfaW5mby0+YnN0cmVhbS50b3RhbF9vdXRfbG8zMjsKKyAgICAgICAgICAgIHVPdXRUaGlzID0gdVRvdGFsT3V0QWZ0ZXItdVRvdGFsT3V0QmVmb3JlOworCisgICAgICAgICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT50b3RhbF9vdXRfNjQgPSBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT50b3RhbF9vdXRfNjQgKyB1T3V0VGhpczsKKworICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+Y3JjMzIgPSBjcmMzMihwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5jcmMzMixidWZCZWZvcmUsICh1SW50KSh1T3V0VGhpcykpOworICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+cmVzdF9yZWFkX3VuY29tcHJlc3NlZCAtPSB1T3V0VGhpczsKKyAgICAgICAgICAgIGlSZWFkICs9ICh1SW50KSh1VG90YWxPdXRBZnRlciAtIHVUb3RhbE91dEJlZm9yZSk7CisKKyAgICAgICAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS5uZXh0X2luICAgPSAoQnl0ZWYqKXBmaWxlX2luX3ppcF9yZWFkX2luZm8tPmJzdHJlYW0ubmV4dF9pbjsKKyAgICAgICAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS5hdmFpbF9pbiAgPSBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5ic3RyZWFtLmF2YWlsX2luOworICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLnRvdGFsX2luICA9IHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPmJzdHJlYW0udG90YWxfaW5fbG8zMjsKKyAgICAgICAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS5uZXh0X291dCAgPSAoQnl0ZWYqKXBmaWxlX2luX3ppcF9yZWFkX2luZm8tPmJzdHJlYW0ubmV4dF9vdXQ7CisgICAgICAgICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0uYXZhaWxfb3V0ID0gcGZpbGVfaW5femlwX3JlYWRfaW5mby0+YnN0cmVhbS5hdmFpbF9vdXQ7CisgICAgICAgICAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0udG90YWxfb3V0ID0gcGZpbGVfaW5femlwX3JlYWRfaW5mby0+YnN0cmVhbS50b3RhbF9vdXRfbG8zMjsKKworICAgICAgICAgICAgaWYgKGVycj09QlpfU1RSRUFNX0VORCkKKyAgICAgICAgICAgICAgcmV0dXJuIChpUmVhZD09MCkgPyBVTlpfRU9GIDogaVJlYWQ7CisgICAgICAgICAgICBpZiAoZXJyIT1CWl9PSykKKyAgICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICAgICAgfSAvLyBlbmQgWl9CWklQMkVECisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgWlBPUzY0X1QgdVRvdGFsT3V0QmVmb3JlLHVUb3RhbE91dEFmdGVyOworICAgICAgICAgICAgY29uc3QgQnl0ZWYgKmJ1ZkJlZm9yZTsKKyAgICAgICAgICAgIFpQT1M2NF9UIHVPdXRUaGlzOworICAgICAgICAgICAgaW50IGZsdXNoPVpfU1lOQ19GTFVTSDsKKworICAgICAgICAgICAgdVRvdGFsT3V0QmVmb3JlID0gcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLnRvdGFsX291dDsKKyAgICAgICAgICAgIGJ1ZkJlZm9yZSA9IHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS5uZXh0X291dDsKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgIGlmICgocGZpbGVfaW5femlwX3JlYWRfaW5mby0+cmVzdF9yZWFkX3VuY29tcHJlc3NlZCA9PQorICAgICAgICAgICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLmF2YWlsX291dCkgJiYKKyAgICAgICAgICAgICAgICAocGZpbGVfaW5femlwX3JlYWRfaW5mby0+cmVzdF9yZWFkX2NvbXByZXNzZWQgPT0gMCkpCisgICAgICAgICAgICAgICAgZmx1c2ggPSBaX0ZJTklTSDsKKyAgICAgICAgICAgICovCisgICAgICAgICAgICBlcnI9aW5mbGF0ZSgmcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLGZsdXNoKTsKKworICAgICAgICAgICAgaWYgKChlcnI+PTApICYmIChwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0ubXNnIT1OVUxMKSkKKyAgICAgICAgICAgICAgZXJyID0gWl9EQVRBX0VSUk9SOworCisgICAgICAgICAgICB1VG90YWxPdXRBZnRlciA9IHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbS50b3RhbF9vdXQ7CisgICAgICAgICAgICB1T3V0VGhpcyA9IHVUb3RhbE91dEFmdGVyLXVUb3RhbE91dEJlZm9yZTsKKworICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+dG90YWxfb3V0XzY0ID0gcGZpbGVfaW5femlwX3JlYWRfaW5mby0+dG90YWxfb3V0XzY0ICsgdU91dFRoaXM7CisKKyAgICAgICAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPmNyYzMyID0KKyAgICAgICAgICAgICAgICBjcmMzMihwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5jcmMzMixidWZCZWZvcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAodUludCkodU91dFRoaXMpKTsKKworICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+cmVzdF9yZWFkX3VuY29tcHJlc3NlZCAtPQorICAgICAgICAgICAgICAgIHVPdXRUaGlzOworCisgICAgICAgICAgICBpUmVhZCArPSAodUludCkodVRvdGFsT3V0QWZ0ZXIgLSB1VG90YWxPdXRCZWZvcmUpOworCisgICAgICAgICAgICBpZiAoZXJyPT1aX1NUUkVBTV9FTkQpCisgICAgICAgICAgICAgICAgcmV0dXJuIChpUmVhZD09MCkgPyBVTlpfRU9GIDogaVJlYWQ7CisgICAgICAgICAgICBpZiAoZXJyIT1aX09LKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGVycj09Wl9PSykKKyAgICAgICAgcmV0dXJuIGlSZWFkOworICAgIHJldHVybiBlcnI7Cit9CisKKworLyoKKyAgR2l2ZSB0aGUgY3VycmVudCBwb3NpdGlvbiBpbiB1bmNvbXByZXNzZWQgZGF0YQorKi8KK2V4dGVybiB6X29mZl90IFpFWFBPUlQgdW56dGVsbCAodW56RmlsZSBmaWxlKQoreworICAgIHVuejY0X3MqIHM7CisgICAgZmlsZV9pbl96aXA2NF9yZWFkX2luZm9fcyogcGZpbGVfaW5femlwX3JlYWRfaW5mbzsKKyAgICBpZiAoZmlsZT09TlVMTCkKKyAgICAgICAgcmV0dXJuIFVOWl9QQVJBTUVSUk9SOworICAgIHM9KHVuejY0X3MqKWZpbGU7CisgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mbz1zLT5wZmlsZV9pbl96aXBfcmVhZDsKKworICAgIGlmIChwZmlsZV9pbl96aXBfcmVhZF9pbmZvPT1OVUxMKQorICAgICAgICByZXR1cm4gVU5aX1BBUkFNRVJST1I7CisKKyAgICByZXR1cm4gKHpfb2ZmX3QpcGZpbGVfaW5femlwX3JlYWRfaW5mby0+c3RyZWFtLnRvdGFsX291dDsKK30KKworZXh0ZXJuIFpQT1M2NF9UIFpFWFBPUlQgdW56dGVsbDY0ICh1bnpGaWxlIGZpbGUpCit7CisKKyAgICB1bno2NF9zKiBzOworICAgIGZpbGVfaW5femlwNjRfcmVhZF9pbmZvX3MqIHBmaWxlX2luX3ppcF9yZWFkX2luZm87CisgICAgaWYgKGZpbGU9PU5VTEwpCisgICAgICAgIHJldHVybiAoWlBPUzY0X1QpLTE7CisgICAgcz0odW56NjRfcyopZmlsZTsKKyAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvPXMtPnBmaWxlX2luX3ppcF9yZWFkOworCisgICAgaWYgKHBmaWxlX2luX3ppcF9yZWFkX2luZm89PU5VTEwpCisgICAgICAgIHJldHVybiAoWlBPUzY0X1QpLTE7CisKKyAgICByZXR1cm4gcGZpbGVfaW5femlwX3JlYWRfaW5mby0+dG90YWxfb3V0XzY0OworfQorCisKKy8qCisgIHJldHVybiAxIGlmIHRoZSBlbmQgb2YgZmlsZSB3YXMgcmVhY2hlZCwgMCBlbHNld2hlcmUKKyovCitleHRlcm4gaW50IFpFWFBPUlQgdW56ZW9mICh1bnpGaWxlIGZpbGUpCit7CisgICAgdW56NjRfcyogczsKKyAgICBmaWxlX2luX3ppcDY0X3JlYWRfaW5mb19zKiBwZmlsZV9pbl96aXBfcmVhZF9pbmZvOworICAgIGlmIChmaWxlPT1OVUxMKQorICAgICAgICByZXR1cm4gVU5aX1BBUkFNRVJST1I7CisgICAgcz0odW56NjRfcyopZmlsZTsKKyAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvPXMtPnBmaWxlX2luX3ppcF9yZWFkOworCisgICAgaWYgKHBmaWxlX2luX3ppcF9yZWFkX2luZm89PU5VTEwpCisgICAgICAgIHJldHVybiBVTlpfUEFSQU1FUlJPUjsKKworICAgIGlmIChwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5yZXN0X3JlYWRfdW5jb21wcmVzc2VkID09IDApCisgICAgICAgIHJldHVybiAxOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKKworCisvKgorUmVhZCBleHRyYSBmaWVsZCBmcm9tIHRoZSBjdXJyZW50IGZpbGUgKG9wZW5lZCBieSB1bnpPcGVuQ3VycmVudEZpbGUpCitUaGlzIGlzIHRoZSBsb2NhbC1oZWFkZXIgdmVyc2lvbiBvZiB0aGUgZXh0cmEgZmllbGQgKHNvbWV0aW1lcywgdGhlcmUgaXMKK21vcmUgaW5mbyBpbiB0aGUgbG9jYWwtaGVhZGVyIHZlcnNpb24gdGhhbiBpbiB0aGUgY2VudHJhbC1oZWFkZXIpCisKKyAgaWYgYnVmPT1OVUxMLCBpdCByZXR1cm4gdGhlIHNpemUgb2YgdGhlIGxvY2FsIGV4dHJhIGZpZWxkIHRoYXQgY2FuIGJlIHJlYWQKKworICBpZiBidWYhPU5VTEwsIGxlbiBpcyB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyLCB0aGUgZXh0cmEgaGVhZGVyIGlzIGNvcGllZCBpbgorICAgIGJ1Zi4KKyAgdGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvcGllZCBpbiBidWYsIG9yIChpZiA8MCkKKyAgICB0aGUgZXJyb3IgY29kZQorKi8KK2V4dGVybiBpbnQgWkVYUE9SVCB1bnpHZXRMb2NhbEV4dHJhZmllbGQgKHVuekZpbGUgZmlsZSwgdm9pZHAgYnVmLCB1bnNpZ25lZCBsZW4pCit7CisgICAgdW56NjRfcyogczsKKyAgICBmaWxlX2luX3ppcDY0X3JlYWRfaW5mb19zKiBwZmlsZV9pbl96aXBfcmVhZF9pbmZvOworICAgIHVJbnQgcmVhZF9ub3c7CisgICAgWlBPUzY0X1Qgc2l6ZV90b19yZWFkOworCisgICAgaWYgKGZpbGU9PU5VTEwpCisgICAgICAgIHJldHVybiBVTlpfUEFSQU1FUlJPUjsKKyAgICBzPSh1bno2NF9zKilmaWxlOworICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm89cy0+cGZpbGVfaW5femlwX3JlYWQ7CisKKyAgICBpZiAocGZpbGVfaW5femlwX3JlYWRfaW5mbz09TlVMTCkKKyAgICAgICAgcmV0dXJuIFVOWl9QQVJBTUVSUk9SOworCisgICAgc2l6ZV90b19yZWFkID0gKHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnNpemVfbG9jYWxfZXh0cmFmaWVsZCAtCisgICAgICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+cG9zX2xvY2FsX2V4dHJhZmllbGQpOworCisgICAgaWYgKGJ1Zj09TlVMTCkKKyAgICAgICAgcmV0dXJuIChpbnQpc2l6ZV90b19yZWFkOworCisgICAgaWYgKGxlbj5zaXplX3RvX3JlYWQpCisgICAgICAgIHJlYWRfbm93ID0gKHVJbnQpc2l6ZV90b19yZWFkOworICAgIGVsc2UKKyAgICAgICAgcmVhZF9ub3cgPSAodUludClsZW4gOworCisgICAgaWYgKHJlYWRfbm93PT0wKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlmIChaU0VFSzY0KHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnpfZmlsZWZ1bmMsCisgICAgICAgICAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPmZpbGVzdHJlYW0sCisgICAgICAgICAgICAgIHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPm9mZnNldF9sb2NhbF9leHRyYWZpZWxkICsKKyAgICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+cG9zX2xvY2FsX2V4dHJhZmllbGQsCisgICAgICAgICAgICAgIFpMSUJfRklMRUZVTkNfU0VFS19TRVQpIT0wKQorICAgICAgICByZXR1cm4gVU5aX0VSUk5POworCisgICAgaWYgKFpSRUFENjQocGZpbGVfaW5femlwX3JlYWRfaW5mby0+el9maWxlZnVuYywKKyAgICAgICAgICAgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mby0+ZmlsZXN0cmVhbSwKKyAgICAgICAgICAgICAgYnVmLHJlYWRfbm93KSE9cmVhZF9ub3cpCisgICAgICAgIHJldHVybiBVTlpfRVJSTk87CisKKyAgICByZXR1cm4gKGludClyZWFkX25vdzsKK30KKworLyoKKyAgQ2xvc2UgdGhlIGZpbGUgaW4gemlwIG9wZW5lZCB3aXRoIHVuemlwT3BlbkN1cnJlbnRGaWxlCisgIFJldHVybiBVTlpfQ1JDRVJST1IgaWYgYWxsIHRoZSBmaWxlIHdhcyByZWFkIGJ1dCB0aGUgQ1JDIGlzIG5vdCBnb29kCisqLworZXh0ZXJuIGludCBaRVhQT1JUIHVuekNsb3NlQ3VycmVudEZpbGUgKHVuekZpbGUgZmlsZSkKK3sKKyAgICBpbnQgZXJyPVVOWl9PSzsKKworICAgIHVuejY0X3MqIHM7CisgICAgZmlsZV9pbl96aXA2NF9yZWFkX2luZm9fcyogcGZpbGVfaW5femlwX3JlYWRfaW5mbzsKKyAgICBpZiAoZmlsZT09TlVMTCkKKyAgICAgICAgcmV0dXJuIFVOWl9QQVJBTUVSUk9SOworICAgIHM9KHVuejY0X3MqKWZpbGU7CisgICAgcGZpbGVfaW5femlwX3JlYWRfaW5mbz1zLT5wZmlsZV9pbl96aXBfcmVhZDsKKworICAgIGlmIChwZmlsZV9pbl96aXBfcmVhZF9pbmZvPT1OVUxMKQorICAgICAgICByZXR1cm4gVU5aX1BBUkFNRVJST1I7CisKKworICAgIGlmICgocGZpbGVfaW5femlwX3JlYWRfaW5mby0+cmVzdF9yZWFkX3VuY29tcHJlc3NlZCA9PSAwKSAmJgorICAgICAgICAoIXBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnJhdykpCisgICAgeworICAgICAgICBpZiAocGZpbGVfaW5femlwX3JlYWRfaW5mby0+Y3JjMzIgIT0gcGZpbGVfaW5femlwX3JlYWRfaW5mby0+Y3JjMzJfd2FpdCkKKyAgICAgICAgICAgIGVycj1VTlpfQ1JDRVJST1I7CisgICAgfQorCisKKyAgICBUUllGUkVFKHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnJlYWRfYnVmZmVyKTsKKyAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5yZWFkX2J1ZmZlciA9IE5VTEw7CisgICAgaWYgKHBmaWxlX2luX3ppcF9yZWFkX2luZm8tPnN0cmVhbV9pbml0aWFsaXNlZCA9PSBaX0RFRkxBVEVEKQorICAgICAgICBpbmZsYXRlRW5kKCZwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW0pOworI2lmZGVmIEhBVkVfQlpJUDIKKyAgICBlbHNlIGlmIChwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW1faW5pdGlhbGlzZWQgPT0gWl9CWklQMkVEKQorICAgICAgICBCWjJfYnpEZWNvbXByZXNzRW5kKCZwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5ic3RyZWFtKTsKKyNlbmRpZgorCisKKyAgICBwZmlsZV9pbl96aXBfcmVhZF9pbmZvLT5zdHJlYW1faW5pdGlhbGlzZWQgPSAwOworICAgIFRSWUZSRUUocGZpbGVfaW5femlwX3JlYWRfaW5mbyk7CisKKyAgICBzLT5wZmlsZV9pbl96aXBfcmVhZD1OVUxMOworCisgICAgcmV0dXJuIGVycjsKK30KKworCisvKgorICBHZXQgdGhlIGdsb2JhbCBjb21tZW50IHN0cmluZyBvZiB0aGUgWmlwRmlsZSwgaW4gdGhlIHN6Q29tbWVudCBidWZmZXIuCisgIHVTaXplQnVmIGlzIHRoZSBzaXplIG9mIHRoZSBzekNvbW1lbnQgYnVmZmVyLgorICByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlIGNvcGllZCBvciBhbiBlcnJvciBjb2RlIDwwCisqLworZXh0ZXJuIGludCBaRVhQT1JUIHVuekdldEdsb2JhbENvbW1lbnQgKHVuekZpbGUgZmlsZSwgY2hhciAqIHN6Q29tbWVudCwgdUxvbmcgdVNpemVCdWYpCit7CisgICAgdW56NjRfcyogczsKKyAgICB1TG9uZyB1UmVhZFRoaXMgOworICAgIGlmIChmaWxlPT1OVUxMKQorICAgICAgICByZXR1cm4gKGludClVTlpfUEFSQU1FUlJPUjsKKyAgICBzPSh1bno2NF9zKilmaWxlOworCisgICAgdVJlYWRUaGlzID0gdVNpemVCdWY7CisgICAgaWYgKHVSZWFkVGhpcz5zLT5naS5zaXplX2NvbW1lbnQpCisgICAgICAgIHVSZWFkVGhpcyA9IHMtPmdpLnNpemVfY29tbWVudDsKKworICAgIGlmIChaU0VFSzY0KHMtPnpfZmlsZWZ1bmMscy0+ZmlsZXN0cmVhbSxzLT5jZW50cmFsX3BvcysyMixaTElCX0ZJTEVGVU5DX1NFRUtfU0VUKSE9MCkKKyAgICAgICAgcmV0dXJuIFVOWl9FUlJOTzsKKworICAgIGlmICh1UmVhZFRoaXM+MCkKKyAgICB7CisgICAgICAqc3pDb21tZW50PSdcMCc7CisgICAgICBpZiAoWlJFQUQ2NChzLT56X2ZpbGVmdW5jLHMtPmZpbGVzdHJlYW0sc3pDb21tZW50LHVSZWFkVGhpcykhPXVSZWFkVGhpcykKKyAgICAgICAgcmV0dXJuIFVOWl9FUlJOTzsKKyAgICB9CisKKyAgICBpZiAoKHN6Q29tbWVudCAhPSBOVUxMKSAmJiAodVNpemVCdWYgPiBzLT5naS5zaXplX2NvbW1lbnQpKQorICAgICAgICAqKHN6Q29tbWVudCtzLT5naS5zaXplX2NvbW1lbnQpPSdcMCc7CisgICAgcmV0dXJuIChpbnQpdVJlYWRUaGlzOworfQorCisvKiBBZGRpdGlvbnMgYnkgUlggJzIwMDQgKi8KK2V4dGVybiBaUE9TNjRfVCBaRVhQT1JUIHVuekdldE9mZnNldDY0KHVuekZpbGUgZmlsZSkKK3sKKyAgICB1bno2NF9zKiBzOworCisgICAgaWYgKGZpbGU9PU5VTEwpCisgICAgICAgICAgcmV0dXJuIDA7IC8vVU5aX1BBUkFNRVJST1I7CisgICAgcz0odW56NjRfcyopZmlsZTsKKyAgICBpZiAoIXMtPmN1cnJlbnRfZmlsZV9vaykKKyAgICAgIHJldHVybiAwOworICAgIGlmIChzLT5naS5udW1iZXJfZW50cnkgIT0gMCAmJiBzLT5naS5udW1iZXJfZW50cnkgIT0gMHhmZmZmKQorICAgICAgaWYgKHMtPm51bV9maWxlPT1zLT5naS5udW1iZXJfZW50cnkpCisgICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gcy0+cG9zX2luX2NlbnRyYWxfZGlyOworfQorCitleHRlcm4gdUxvbmcgWkVYUE9SVCB1bnpHZXRPZmZzZXQgKHVuekZpbGUgZmlsZSkKK3sKKyAgICBaUE9TNjRfVCBvZmZzZXQ2NDsKKworICAgIGlmIChmaWxlPT1OVUxMKQorICAgICAgICAgIHJldHVybiAwOyAvL1VOWl9QQVJBTUVSUk9SOworICAgIG9mZnNldDY0ID0gdW56R2V0T2Zmc2V0NjQoZmlsZSk7CisgICAgcmV0dXJuICh1TG9uZylvZmZzZXQ2NDsKK30KKworZXh0ZXJuIGludCBaRVhQT1JUIHVuelNldE9mZnNldDY0KHVuekZpbGUgZmlsZSwgWlBPUzY0X1QgcG9zKQoreworICAgIHVuejY0X3MqIHM7CisgICAgaW50IGVycjsKKworICAgIGlmIChmaWxlPT1OVUxMKQorICAgICAgICByZXR1cm4gVU5aX1BBUkFNRVJST1I7CisgICAgcz0odW56NjRfcyopZmlsZTsKKworICAgIHMtPnBvc19pbl9jZW50cmFsX2RpciA9IHBvczsKKyAgICBzLT5udW1fZmlsZSA9IHMtPmdpLm51bWJlcl9lbnRyeTsgICAgICAvKiBoYWNrICovCisgICAgZXJyID0gdW56NjRsb2NhbF9HZXRDdXJyZW50RmlsZUluZm9JbnRlcm5hbChmaWxlLCZzLT5jdXJfZmlsZV9pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzLT5jdXJfZmlsZV9pbmZvX2ludGVybmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsMCxOVUxMLDAsTlVMTCwwKTsKKyAgICBzLT5jdXJyZW50X2ZpbGVfb2sgPSAoZXJyID09IFVOWl9PSyk7CisgICAgcmV0dXJuIGVycjsKK30KKworZXh0ZXJuIGludCBaRVhQT1JUIHVuelNldE9mZnNldCAodW56RmlsZSBmaWxlLCB1TG9uZyBwb3MpCit7CisgICAgcmV0dXJuIHVuelNldE9mZnNldDY0KGZpbGUscG9zKTsKK30KZGlmZiAtLWdpdCBhL3psaWItMS4yLjYvY29udHJpYi9taW5pemlwL3VuemlwLmggYi96bGliLTEuMi42L2NvbnRyaWIvbWluaXppcC91bnppcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxODM5NjgKLS0tIC9kZXYvbnVsbAorKysgYi96bGliLTEuMi42L2NvbnRyaWIvbWluaXppcC91bnppcC5oCkBAIC0wLDAgKzEsNDM3IEBACisvKiB1bnppcC5oIC0tIElPIGZvciB1bmNvbXByZXNzIC56aXAgZmlsZXMgdXNpbmcgemxpYgorICAgVmVyc2lvbiAxLjEsIEZlYnJ1YXJ5IDE0aCwgMjAxMAorICAgcGFydCBvZiB0aGUgTWluaVppcCBwcm9qZWN0IC0gKCBodHRwOi8vd3d3LndpbmltYWdlLmNvbS96TGliRGxsL21pbml6aXAuaHRtbCApCisKKyAgICAgICAgIENvcHlyaWdodCAoQykgMTk5OC0yMDEwIEdpbGxlcyBWb2xsYW50IChtaW5pemlwKSAoIGh0dHA6Ly93d3cud2luaW1hZ2UuY29tL3pMaWJEbGwvbWluaXppcC5odG1sICkKKworICAgICAgICAgTW9kaWZpY2F0aW9ucyBvZiBVbnppcCBmb3IgWmlwNjQKKyAgICAgICAgIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEV2ZW4gUm91YXVsdAorCisgICAgICAgICBNb2RpZmljYXRpb25zIGZvciBaaXA2NCBzdXBwb3J0IG9uIGJvdGggemlwIGFuZCB1bnppcAorICAgICAgICAgQ29weXJpZ2h0IChDKSAyMDA5LTIwMTAgTWF0aGlhcyBTdmVuc3NvbiAoIGh0dHA6Ly9yZXN1bHQ0Mi5jb20gKQorCisgICAgICAgICBGb3IgbW9yZSBpbmZvIHJlYWQgTWluaVppcF9pbmZvLnR4dAorCisgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICBDb25kaXRpb24gb2YgdXNlIGFuZCBkaXN0cmlidXRpb24gYXJlIHRoZSBzYW1lIHRoYW4gemxpYiA6CisKKyAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKKyAgd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcworICBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgorCisgIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAorICBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0CisgIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKKworICAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAorICAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQorICAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKKyAgICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KKyAgMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKKyAgICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgorICAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgorCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgIENoYW5nZXMKKworICAgICAgICBTZWUgaGVhZGVyIG9mIHVuemlwNjQuYworCisqLworCisjaWZuZGVmIF91bno2NF9ICisjZGVmaW5lIF91bno2NF9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2lmbmRlZiBfWkxJQl9ICisjaW5jbHVkZSAiemxpYi5oIgorI2VuZGlmCisKKyNpZm5kZWYgIF9aTElCSU9BUElfSAorI2luY2x1ZGUgImlvYXBpLmgiCisjZW5kaWYKKworI2lmZGVmIEhBVkVfQlpJUDIKKyNpbmNsdWRlICJiemxpYi5oIgorI2VuZGlmCisKKyNkZWZpbmUgWl9CWklQMkVEIDEyCisKKyNpZiBkZWZpbmVkKFNUUklDVFVOWklQKSB8fCBkZWZpbmVkKFNUUklDVFpJUFVOWklQKQorLyogbGlrZSB0aGUgU1RSSUNUIG9mIFdJTjMyLCB3ZSBkZWZpbmUgYSBwb2ludGVyIHRoYXQgY2Fubm90IGJlIGNvbnZlcnRlZAorICAgIGZyb20gKHZvaWQqKSB3aXRob3V0IGNhc3QgKi8KK3R5cGVkZWYgc3RydWN0IFRhZ3VuekZpbGVfXyB7IGludCB1bnVzZWQ7IH0gdW56RmlsZV9fOwordHlwZWRlZiB1bnpGaWxlX18gKnVuekZpbGU7CisjZWxzZQordHlwZWRlZiB2b2lkcCB1bnpGaWxlOworI2VuZGlmCisKKworI2RlZmluZSBVTlpfT0sgICAgICAgICAgICAgICAgICAgICAgICAgICgwKQorI2RlZmluZSBVTlpfRU5EX09GX0xJU1RfT0ZfRklMRSAgICAgICAgICgtMTAwKQorI2RlZmluZSBVTlpfRVJSTk8gICAgICAgICAgICAgICAgICAgICAgIChaX0VSUk5PKQorI2RlZmluZSBVTlpfRU9GICAgICAgICAgICAgICAgICAgICAgICAgICgwKQorI2RlZmluZSBVTlpfUEFSQU1FUlJPUiAgICAgICAgICAgICAgICAgICgtMTAyKQorI2RlZmluZSBVTlpfQkFEWklQRklMRSAgICAgICAgICAgICAgICAgICgtMTAzKQorI2RlZmluZSBVTlpfSU5URVJOQUxFUlJPUiAgICAgICAgICAgICAgICgtMTA0KQorI2RlZmluZSBVTlpfQ1JDRVJST1IgICAgICAgICAgICAgICAgICAgICgtMTA1KQorCisvKiB0bV91bnogY29udGFpbiBkYXRlL3RpbWUgaW5mbyAqLwordHlwZWRlZiBzdHJ1Y3QgdG1fdW56X3MKK3sKKyAgICB1SW50IHRtX3NlYzsgICAgICAgICAgICAvKiBzZWNvbmRzIGFmdGVyIHRoZSBtaW51dGUgLSBbMCw1OV0gKi8KKyAgICB1SW50IHRtX21pbjsgICAgICAgICAgICAvKiBtaW51dGVzIGFmdGVyIHRoZSBob3VyIC0gWzAsNTldICovCisgICAgdUludCB0bV9ob3VyOyAgICAgICAgICAgLyogaG91cnMgc2luY2UgbWlkbmlnaHQgLSBbMCwyM10gKi8KKyAgICB1SW50IHRtX21kYXk7ICAgICAgICAgICAvKiBkYXkgb2YgdGhlIG1vbnRoIC0gWzEsMzFdICovCisgICAgdUludCB0bV9tb247ICAgICAgICAgICAgLyogbW9udGhzIHNpbmNlIEphbnVhcnkgLSBbMCwxMV0gKi8KKyAgICB1SW50IHRtX3llYXI7ICAgICAgICAgICAvKiB5ZWFycyAtIFsxOTgwLi4yMDQ0XSAqLworfSB0bV91bno7CisKKy8qIHVuel9nbG9iYWxfaW5mbyBzdHJ1Y3R1cmUgY29udGFpbiBnbG9iYWwgZGF0YSBhYm91dCB0aGUgWklQZmlsZQorICAgVGhlc2UgZGF0YSBjb21lcyBmcm9tIHRoZSBlbmQgb2YgY2VudHJhbCBkaXIgKi8KK3R5cGVkZWYgc3RydWN0IHVuel9nbG9iYWxfaW5mbzY0X3MKK3sKKyAgICBaUE9TNjRfVCBudW1iZXJfZW50cnk7ICAgICAgICAgLyogdG90YWwgbnVtYmVyIG9mIGVudHJpZXMgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY2VudHJhbCBkaXIgb24gdGhpcyBkaXNrICovCisgICAgdUxvbmcgc2l6ZV9jb21tZW50OyAgICAgICAgIC8qIHNpemUgb2YgdGhlIGdsb2JhbCBjb21tZW50IG9mIHRoZSB6aXBmaWxlICovCit9IHVuel9nbG9iYWxfaW5mbzY0OworCit0eXBlZGVmIHN0cnVjdCB1bnpfZ2xvYmFsX2luZm9fcworeworICAgIHVMb25nIG51bWJlcl9lbnRyeTsgICAgICAgICAvKiB0b3RhbCBudW1iZXIgb2YgZW50cmllcyBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjZW50cmFsIGRpciBvbiB0aGlzIGRpc2sgKi8KKyAgICB1TG9uZyBzaXplX2NvbW1lbnQ7ICAgICAgICAgLyogc2l6ZSBvZiB0aGUgZ2xvYmFsIGNvbW1lbnQgb2YgdGhlIHppcGZpbGUgKi8KK30gdW56X2dsb2JhbF9pbmZvOworCisvKiB1bnpfZmlsZV9pbmZvIGNvbnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgYSBmaWxlIGluIHRoZSB6aXBmaWxlICovCit0eXBlZGVmIHN0cnVjdCB1bnpfZmlsZV9pbmZvNjRfcworeworICAgIHVMb25nIHZlcnNpb247ICAgICAgICAgICAgICAvKiB2ZXJzaW9uIG1hZGUgYnkgICAgICAgICAgICAgICAgIDIgYnl0ZXMgKi8KKyAgICB1TG9uZyB2ZXJzaW9uX25lZWRlZDsgICAgICAgLyogdmVyc2lvbiBuZWVkZWQgdG8gZXh0cmFjdCAgICAgICAyIGJ5dGVzICovCisgICAgdUxvbmcgZmxhZzsgICAgICAgICAgICAgICAgIC8qIGdlbmVyYWwgcHVycG9zZSBiaXQgZmxhZyAgICAgICAgMiBieXRlcyAqLworICAgIHVMb25nIGNvbXByZXNzaW9uX21ldGhvZDsgICAvKiBjb21wcmVzc2lvbiBtZXRob2QgICAgICAgICAgICAgIDIgYnl0ZXMgKi8KKyAgICB1TG9uZyBkb3NEYXRlOyAgICAgICAgICAgICAgLyogbGFzdCBtb2QgZmlsZSBkYXRlIGluIERvcyBmbXQgICA0IGJ5dGVzICovCisgICAgdUxvbmcgY3JjOyAgICAgICAgICAgICAgICAgIC8qIGNyYy0zMiAgICAgICAgICAgICAgICAgICAgICAgICAgNCBieXRlcyAqLworICAgIFpQT1M2NF9UIGNvbXByZXNzZWRfc2l6ZTsgICAvKiBjb21wcmVzc2VkIHNpemUgICAgICAgICAgICAgICAgIDggYnl0ZXMgKi8KKyAgICBaUE9TNjRfVCB1bmNvbXByZXNzZWRfc2l6ZTsgLyogdW5jb21wcmVzc2VkIHNpemUgICAgICAgICAgICAgICA4IGJ5dGVzICovCisgICAgdUxvbmcgc2l6ZV9maWxlbmFtZTsgICAgICAgIC8qIGZpbGVuYW1lIGxlbmd0aCAgICAgICAgICAgICAgICAgMiBieXRlcyAqLworICAgIHVMb25nIHNpemVfZmlsZV9leHRyYTsgICAgICAvKiBleHRyYSBmaWVsZCBsZW5ndGggICAgICAgICAgICAgIDIgYnl0ZXMgKi8KKyAgICB1TG9uZyBzaXplX2ZpbGVfY29tbWVudDsgICAgLyogZmlsZSBjb21tZW50IGxlbmd0aCAgICAgICAgICAgICAyIGJ5dGVzICovCisKKyAgICB1TG9uZyBkaXNrX251bV9zdGFydDsgICAgICAgLyogZGlzayBudW1iZXIgc3RhcnQgICAgICAgICAgICAgICAyIGJ5dGVzICovCisgICAgdUxvbmcgaW50ZXJuYWxfZmE7ICAgICAgICAgIC8qIGludGVybmFsIGZpbGUgYXR0cmlidXRlcyAgICAgICAgMiBieXRlcyAqLworICAgIHVMb25nIGV4dGVybmFsX2ZhOyAgICAgICAgICAvKiBleHRlcm5hbCBmaWxlIGF0dHJpYnV0ZXMgICAgICAgIDQgYnl0ZXMgKi8KKworICAgIHRtX3VueiB0bXVfZGF0ZTsKK30gdW56X2ZpbGVfaW5mbzY0OworCit0eXBlZGVmIHN0cnVjdCB1bnpfZmlsZV9pbmZvX3MKK3sKKyAgICB1TG9uZyB2ZXJzaW9uOyAgICAgICAgICAgICAgLyogdmVyc2lvbiBtYWRlIGJ5ICAgICAgICAgICAgICAgICAyIGJ5dGVzICovCisgICAgdUxvbmcgdmVyc2lvbl9uZWVkZWQ7ICAgICAgIC8qIHZlcnNpb24gbmVlZGVkIHRvIGV4dHJhY3QgICAgICAgMiBieXRlcyAqLworICAgIHVMb25nIGZsYWc7ICAgICAgICAgICAgICAgICAvKiBnZW5lcmFsIHB1cnBvc2UgYml0IGZsYWcgICAgICAgIDIgYnl0ZXMgKi8KKyAgICB1TG9uZyBjb21wcmVzc2lvbl9tZXRob2Q7ICAgLyogY29tcHJlc3Npb24gbWV0aG9kICAgICAgICAgICAgICAyIGJ5dGVzICovCisgICAgdUxvbmcgZG9zRGF0ZTsgICAgICAgICAgICAgIC8qIGxhc3QgbW9kIGZpbGUgZGF0ZSBpbiBEb3MgZm10ICAgNCBieXRlcyAqLworICAgIHVMb25nIGNyYzsgICAgICAgICAgICAgICAgICAvKiBjcmMtMzIgICAgICAgICAgICAgICAgICAgICAgICAgIDQgYnl0ZXMgKi8KKyAgICB1TG9uZyBjb21wcmVzc2VkX3NpemU7ICAgICAgLyogY29tcHJlc3NlZCBzaXplICAgICAgICAgICAgICAgICA0IGJ5dGVzICovCisgICAgdUxvbmcgdW5jb21wcmVzc2VkX3NpemU7ICAgIC8qIHVuY29tcHJlc3NlZCBzaXplICAgICAgICAgICAgICAgNCBieXRlcyAqLworICAgIHVMb25nIHNpemVfZmlsZW5hbWU7ICAgICAgICAvKiBmaWxlbmFtZSBsZW5ndGggICAgICAgICAgICAgICAgIDIgYnl0ZXMgKi8KKyAgICB1TG9uZyBzaXplX2ZpbGVfZXh0cmE7ICAgICAgLyogZXh0cmEgZmllbGQgbGVuZ3RoICAgICAgICAgICAgICAyIGJ5dGVzICovCisgICAgdUxvbmcgc2l6ZV9maWxlX2NvbW1lbnQ7ICAgIC8qIGZpbGUgY29tbWVudCBsZW5ndGggICAgICAgICAgICAgMiBieXRlcyAqLworCisgICAgdUxvbmcgZGlza19udW1fc3RhcnQ7ICAgICAgIC8qIGRpc2sgbnVtYmVyIHN0YXJ0ICAgICAgICAgICAgICAgMiBieXRlcyAqLworICAgIHVMb25nIGludGVybmFsX2ZhOyAgICAgICAgICAvKiBpbnRlcm5hbCBmaWxlIGF0dHJpYnV0ZXMgICAgICAgIDIgYnl0ZXMgKi8KKyAgICB1TG9uZyBleHRlcm5hbF9mYTsgICAgICAgICAgLyogZXh0ZXJuYWwgZmlsZSBhdHRyaWJ1dGVzICAgICAgICA0IGJ5dGVzICovCisKKyAgICB0bV91bnogdG11X2RhdGU7Cit9IHVuel9maWxlX2luZm87CisKK2V4dGVybiBpbnQgWkVYUE9SVCB1bnpTdHJpbmdGaWxlTmFtZUNvbXBhcmUgT0YgKChjb25zdCBjaGFyKiBmaWxlTmFtZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZmlsZU5hbWUyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpQ2FzZVNlbnNpdGl2aXR5KSk7CisvKgorICAgQ29tcGFyZSB0d28gZmlsZW5hbWUgKGZpbGVOYW1lMSxmaWxlTmFtZTIpLgorICAgSWYgaUNhc2VTZW5pc2l2aXR5ID0gMSwgY29tcGFyaXNpb24gaXMgY2FzZSBzZW5zaXRpdml0eSAobGlrZSBzdHJjbXApCisgICBJZiBpQ2FzZVNlbmlzaXZpdHkgPSAyLCBjb21wYXJpc2lvbiBpcyBub3QgY2FzZSBzZW5zaXRpdml0eSAobGlrZSBzdHJjbXBpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIHN0cmNhc2VjbXApCisgICBJZiBpQ2FzZVNlbmlzaXZpdHkgPSAwLCBjYXNlIHNlbnNpdGl2aXR5IGlzIGRlZmF1dCBvZiB5b3VyIG9wZXJhdGluZyBzeXN0ZW0KKyAgICAobGlrZSAxIG9uIFVuaXgsIDIgb24gV2luZG93cykKKyovCisKKworZXh0ZXJuIHVuekZpbGUgWkVYUE9SVCB1bnpPcGVuIE9GKChjb25zdCBjaGFyICpwYXRoKSk7CitleHRlcm4gdW56RmlsZSBaRVhQT1JUIHVuek9wZW42NCBPRigoY29uc3Qgdm9pZCAqcGF0aCkpOworLyoKKyAgT3BlbiBhIFppcCBmaWxlLiBwYXRoIGNvbnRhaW4gdGhlIGZ1bGwgcGF0aG5hbWUgKGJ5IGV4YW1wbGUsCisgICAgIG9uIGEgV2luZG93cyBYUCBjb21wdXRlciAiYzpcXHpsaWJcXHpsaWIxMTMuemlwIiBvciBvbiBhbiBVbml4IGNvbXB1dGVyCisgICAgICJ6bGliL3psaWIxMTMuemlwIi4KKyAgICAgSWYgdGhlIHppcGZpbGUgY2Fubm90IGJlIG9wZW5lZCAoZmlsZSBkb24ndCBleGlzdCBvciBpbiBub3QgdmFsaWQpLCB0aGUKKyAgICAgICByZXR1cm4gdmFsdWUgaXMgTlVMTC4KKyAgICAgRWxzZSwgdGhlIHJldHVybiB2YWx1ZSBpcyBhIHVuekZpbGUgSGFuZGxlLCB1c2FibGUgd2l0aCBvdGhlciBmdW5jdGlvbgorICAgICAgIG9mIHRoaXMgdW56aXAgcGFja2FnZS4KKyAgICAgdGhlICI2NCIgZnVuY3Rpb24gdGFrZSBhIGNvbnN0IHZvaWQqIHBvaW50ZXIsIGJlY2F1c2UgdGhlIHBhdGggaXMganVzdCB0aGUKKyAgICAgICB2YWx1ZSBwYXNzZWQgdG8gdGhlIG9wZW42NF9maWxlX2Z1bmMgY2FsbGJhY2suCisgICAgIFVuZGVyIFdpbmRvd3MsIGlmIFVOSUNPREUgaXMgZGVmaW5lZCwgdXNpbmcgZmlsbF9mb3BlbjY0X2ZpbGVmdW5jLCB0aGUgcGF0aAorICAgICAgIGlzIGEgcG9pbnRlciB0byBhIHdpZGUgdW5pY29kZSBzdHJpbmcgKExQQ1RTVFIgaXMgTFBDV1NUUiksIHNvIGNvbnN0IGNoYXIqCisgICAgICAgZG9lcyBub3QgZGVzY3JpYmUgdGhlIHJlYWxpdHkKKyovCisKKworZXh0ZXJuIHVuekZpbGUgWkVYUE9SVCB1bnpPcGVuMiBPRigoY29uc3QgY2hhciAqcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpsaWJfZmlsZWZ1bmNfZGVmKiBwemxpYl9maWxlZnVuY19kZWYpKTsKKy8qCisgICBPcGVuIGEgWmlwIGZpbGUsIGxpa2UgdW56T3BlbiwgYnV0IHByb3ZpZGUgYSBzZXQgb2YgZmlsZSBsb3cgbGV2ZWwgQVBJCisgICAgICBmb3IgcmVhZC93cml0ZSB0aGUgemlwIGZpbGUgKHNlZSBpb2FwaS5oKQorKi8KKworZXh0ZXJuIHVuekZpbGUgWkVYUE9SVCB1bnpPcGVuMl82NCBPRigoY29uc3Qgdm9pZCAqcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpsaWJfZmlsZWZ1bmM2NF9kZWYqIHB6bGliX2ZpbGVmdW5jX2RlZikpOworLyoKKyAgIE9wZW4gYSBaaXAgZmlsZSwgbGlrZSB1bno2NE9wZW4sIGJ1dCBwcm92aWRlIGEgc2V0IG9mIGZpbGUgbG93IGxldmVsIEFQSQorICAgICAgZm9yIHJlYWQvd3JpdGUgdGhlIHppcCBmaWxlIChzZWUgaW9hcGkuaCkKKyovCisKK2V4dGVybiBpbnQgWkVYUE9SVCB1bnpDbG9zZSBPRigodW56RmlsZSBmaWxlKSk7CisvKgorICBDbG9zZSBhIFppcEZpbGUgb3BlbmVkIHdpdGggdW56aXBPcGVuLgorICBJZiB0aGVyZSBpcyBmaWxlcyBpbnNpZGUgdGhlIC5aaXAgb3BlbmVkIHdpdGggdW56T3BlbkN1cnJlbnRGaWxlIChzZWUgbGF0ZXIpLAorICAgIHRoZXNlIGZpbGVzIE1VU1QgYmUgY2xvc2VkIHdpdGggdW56aXBDbG9zZUN1cnJlbnRGaWxlIGJlZm9yZSBjYWxsIHVuemlwQ2xvc2UuCisgIHJldHVybiBVTlpfT0sgaWYgdGhlcmUgaXMgbm8gcHJvYmxlbS4gKi8KKworZXh0ZXJuIGludCBaRVhQT1JUIHVuekdldEdsb2JhbEluZm8gT0YoKHVuekZpbGUgZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnpfZ2xvYmFsX2luZm8gKnBnbG9iYWxfaW5mbykpOworCitleHRlcm4gaW50IFpFWFBPUlQgdW56R2V0R2xvYmFsSW5mbzY0IE9GKCh1bnpGaWxlIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW56X2dsb2JhbF9pbmZvNjQgKnBnbG9iYWxfaW5mbykpOworLyoKKyAgV3JpdGUgaW5mbyBhYm91dCB0aGUgWmlwRmlsZSBpbiB0aGUgKnBnbG9iYWxfaW5mbyBzdHJ1Y3R1cmUuCisgIE5vIHByZXBhcmF0aW9uIG9mIHRoZSBzdHJ1Y3R1cmUgaXMgbmVlZGVkCisgIHJldHVybiBVTlpfT0sgaWYgdGhlcmUgaXMgbm8gcHJvYmxlbS4gKi8KKworCitleHRlcm4gaW50IFpFWFBPUlQgdW56R2V0R2xvYmFsQ29tbWVudCBPRigodW56RmlsZSBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnN6Q29tbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1TG9uZyB1U2l6ZUJ1ZikpOworLyoKKyAgR2V0IHRoZSBnbG9iYWwgY29tbWVudCBzdHJpbmcgb2YgdGhlIFppcEZpbGUsIGluIHRoZSBzekNvbW1lbnQgYnVmZmVyLgorICB1U2l6ZUJ1ZiBpcyB0aGUgc2l6ZSBvZiB0aGUgc3pDb21tZW50IGJ1ZmZlci4KKyAgcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZSBjb3BpZWQgb3IgYW4gZXJyb3IgY29kZSA8MAorKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogVW56aXAgcGFja2FnZSBhbGxvdyB5b3UgYnJvd3NlIHRoZSBkaXJlY3Rvcnkgb2YgdGhlIHppcGZpbGUgKi8KKworZXh0ZXJuIGludCBaRVhQT1JUIHVuekdvVG9GaXJzdEZpbGUgT0YoKHVuekZpbGUgZmlsZSkpOworLyoKKyAgU2V0IHRoZSBjdXJyZW50IGZpbGUgb2YgdGhlIHppcGZpbGUgdG8gdGhlIGZpcnN0IGZpbGUuCisgIHJldHVybiBVTlpfT0sgaWYgdGhlcmUgaXMgbm8gcHJvYmxlbQorKi8KKworZXh0ZXJuIGludCBaRVhQT1JUIHVuekdvVG9OZXh0RmlsZSBPRigodW56RmlsZSBmaWxlKSk7CisvKgorICBTZXQgdGhlIGN1cnJlbnQgZmlsZSBvZiB0aGUgemlwZmlsZSB0byB0aGUgbmV4dCBmaWxlLgorICByZXR1cm4gVU5aX09LIGlmIHRoZXJlIGlzIG5vIHByb2JsZW0KKyAgcmV0dXJuIFVOWl9FTkRfT0ZfTElTVF9PRl9GSUxFIGlmIHRoZSBhY3R1YWwgZmlsZSB3YXMgdGhlIGxhdGVzdC4KKyovCisKK2V4dGVybiBpbnQgWkVYUE9SVCB1bnpMb2NhdGVGaWxlIE9GKCh1bnpGaWxlIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzekZpbGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgaW50IGlDYXNlU2Vuc2l0aXZpdHkpKTsKKy8qCisgIFRyeSBsb2NhdGUgdGhlIGZpbGUgc3pGaWxlTmFtZSBpbiB0aGUgemlwZmlsZS4KKyAgRm9yIHRoZSBpQ2FzZVNlbnNpdGl2aXR5IHNpZ25pZmljYXRpb24sIHNlZSB1bnpTdHJpbmdGaWxlTmFtZUNvbXBhcmUKKworICByZXR1cm4gdmFsdWUgOgorICBVTlpfT0sgaWYgdGhlIGZpbGUgaXMgZm91bmQuIEl0IGJlY29tZXMgdGhlIGN1cnJlbnQgZmlsZS4KKyAgVU5aX0VORF9PRl9MSVNUX09GX0ZJTEUgaWYgdGhlIGZpbGUgaXMgbm90IGZvdW5kCisqLworCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogUnlhbiBzdXBwbGllZCBmdW5jdGlvbnMgKi8KKy8qIHVuel9maWxlX2luZm8gY29udGFpbiBpbmZvcm1hdGlvbiBhYm91dCBhIGZpbGUgaW4gdGhlIHppcGZpbGUgKi8KK3R5cGVkZWYgc3RydWN0IHVuel9maWxlX3Bvc19zCit7CisgICAgdUxvbmcgcG9zX2luX3ppcF9kaXJlY3Rvcnk7ICAgLyogb2Zmc2V0IGluIHppcCBmaWxlIGRpcmVjdG9yeSAqLworICAgIHVMb25nIG51bV9vZl9maWxlOyAgICAgICAgICAgIC8qICMgb2YgZmlsZSAqLworfSB1bnpfZmlsZV9wb3M7CisKK2V4dGVybiBpbnQgWkVYUE9SVCB1bnpHZXRGaWxlUG9zKAorICAgIHVuekZpbGUgZmlsZSwKKyAgICB1bnpfZmlsZV9wb3MqIGZpbGVfcG9zKTsKKworZXh0ZXJuIGludCBaRVhQT1JUIHVuekdvVG9GaWxlUG9zKAorICAgIHVuekZpbGUgZmlsZSwKKyAgICB1bnpfZmlsZV9wb3MqIGZpbGVfcG9zKTsKKwordHlwZWRlZiBzdHJ1Y3QgdW56NjRfZmlsZV9wb3NfcworeworICAgIFpQT1M2NF9UIHBvc19pbl96aXBfZGlyZWN0b3J5OyAgIC8qIG9mZnNldCBpbiB6aXAgZmlsZSBkaXJlY3RvcnkgKi8KKyAgICBaUE9TNjRfVCBudW1fb2ZfZmlsZTsgICAgICAgICAgICAvKiAjIG9mIGZpbGUgKi8KK30gdW56NjRfZmlsZV9wb3M7CisKK2V4dGVybiBpbnQgWkVYUE9SVCB1bnpHZXRGaWxlUG9zNjQoCisgICAgdW56RmlsZSBmaWxlLAorICAgIHVuejY0X2ZpbGVfcG9zKiBmaWxlX3Bvcyk7CisKK2V4dGVybiBpbnQgWkVYUE9SVCB1bnpHb1RvRmlsZVBvczY0KAorICAgIHVuekZpbGUgZmlsZSwKKyAgICBjb25zdCB1bno2NF9maWxlX3BvcyogZmlsZV9wb3MpOworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworZXh0ZXJuIGludCBaRVhQT1JUIHVuekdldEN1cnJlbnRGaWxlSW5mbzY0IE9GKCh1bnpGaWxlIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdW56X2ZpbGVfaW5mbzY0ICpwZmlsZV9pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnN6RmlsZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdUxvbmcgZmlsZU5hbWVCdWZmZXJTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmV4dHJhRmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgdUxvbmcgZXh0cmFGaWVsZEJ1ZmZlclNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqc3pDb21tZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgIHVMb25nIGNvbW1lbnRCdWZmZXJTaXplKSk7CisKK2V4dGVybiBpbnQgWkVYUE9SVCB1bnpHZXRDdXJyZW50RmlsZUluZm8gT0YoKHVuekZpbGUgZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bnpfZmlsZV9pbmZvICpwZmlsZV9pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnN6RmlsZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdUxvbmcgZmlsZU5hbWVCdWZmZXJTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmV4dHJhRmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgdUxvbmcgZXh0cmFGaWVsZEJ1ZmZlclNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqc3pDb21tZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgIHVMb25nIGNvbW1lbnRCdWZmZXJTaXplKSk7CisvKgorICBHZXQgSW5mbyBhYm91dCB0aGUgY3VycmVudCBmaWxlCisgIGlmIHBmaWxlX2luZm8hPU5VTEwsIHRoZSAqcGZpbGVfaW5mbyBzdHJ1Y3R1cmUgd2lsbCBjb250YWluIHNvbWVzIGluZm8gYWJvdXQKKyAgICAgICAgdGhlIGN1cnJlbnQgZmlsZQorICBpZiBzekZpbGVOYW1lIT1OVUxMLCB0aGUgZmlsZW1hbmUgc3RyaW5nIHdpbGwgYmUgY29waWVkIGluIHN6RmlsZU5hbWUKKyAgICAgICAgICAgIChmaWxlTmFtZUJ1ZmZlclNpemUgaXMgdGhlIHNpemUgb2YgdGhlIGJ1ZmZlcikKKyAgaWYgZXh0cmFGaWVsZCE9TlVMTCwgdGhlIGV4dHJhIGZpZWxkIGluZm9ybWF0aW9uIHdpbGwgYmUgY29waWVkIGluIGV4dHJhRmllbGQKKyAgICAgICAgICAgIChleHRyYUZpZWxkQnVmZmVyU2l6ZSBpcyB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyKS4KKyAgICAgICAgICAgIFRoaXMgaXMgdGhlIENlbnRyYWwtaGVhZGVyIHZlcnNpb24gb2YgdGhlIGV4dHJhIGZpZWxkCisgIGlmIHN6Q29tbWVudCE9TlVMTCwgdGhlIGNvbW1lbnQgc3RyaW5nIG9mIHRoZSBmaWxlIHdpbGwgYmUgY29waWVkIGluIHN6Q29tbWVudAorICAgICAgICAgICAgKGNvbW1lbnRCdWZmZXJTaXplIGlzIHRoZSBzaXplIG9mIHRoZSBidWZmZXIpCisqLworCisKKy8qKiBBZGRpdGlvbiBmb3IgR0RBTCA6IFNUQVJUICovCisKK2V4dGVybiBaUE9TNjRfVCBaRVhQT1JUIHVuekdldEN1cnJlbnRGaWxlWlN0cmVhbVBvczY0IE9GKCh1bnpGaWxlIGZpbGUpKTsKKworLyoqIEFkZGl0aW9uIGZvciBHREFMIDogRU5EICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIGZvciByZWFkaW5nIHRoZSBjb250ZW50IG9mIHRoZSBjdXJyZW50IHppcGZpbGUsIHlvdSBjYW4gb3BlbiBpdCwgcmVhZCBkYXRhCisgICBmcm9tIGl0LCBhbmQgY2xvc2UgaXQgKHlvdSBjYW4gY2xvc2UgaXQgYmVmb3JlIHJlYWRpbmcgYWxsIHRoZSBmaWxlKQorICAgKi8KKworZXh0ZXJuIGludCBaRVhQT1JUIHVuek9wZW5DdXJyZW50RmlsZSBPRigodW56RmlsZSBmaWxlKSk7CisvKgorICBPcGVuIGZvciByZWFkaW5nIGRhdGEgdGhlIGN1cnJlbnQgZmlsZSBpbiB0aGUgemlwZmlsZS4KKyAgSWYgdGhlcmUgaXMgbm8gZXJyb3IsIHRoZSByZXR1cm4gdmFsdWUgaXMgVU5aX09LLgorKi8KKworZXh0ZXJuIGludCBaRVhQT1JUIHVuek9wZW5DdXJyZW50RmlsZVBhc3N3b3JkIE9GKCh1bnpGaWxlIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHBhc3N3b3JkKSk7CisvKgorICBPcGVuIGZvciByZWFkaW5nIGRhdGEgdGhlIGN1cnJlbnQgZmlsZSBpbiB0aGUgemlwZmlsZS4KKyAgcGFzc3dvcmQgaXMgYSBjcnlwdGluZyBwYXNzd29yZAorICBJZiB0aGVyZSBpcyBubyBlcnJvciwgdGhlIHJldHVybiB2YWx1ZSBpcyBVTlpfT0suCisqLworCitleHRlcm4gaW50IFpFWFBPUlQgdW56T3BlbkN1cnJlbnRGaWxlMiBPRigodW56RmlsZSBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogbWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJhdykpOworLyoKKyAgU2FtZSB0aGFuIHVuek9wZW5DdXJyZW50RmlsZSwgYnV0IG9wZW4gZm9yIHJlYWQgcmF3IHRoZSBmaWxlIChub3QgdW5jb21wcmVzcykKKyAgICBpZiByYXc9PTEKKyAgKm1ldGhvZCB3aWxsIHJlY2VpdmUgbWV0aG9kIG9mIGNvbXByZXNzaW9uLCAqbGV2ZWwgd2lsbCByZWNlaXZlIGxldmVsIG9mCisgICAgIGNvbXByZXNzaW9uCisgIG5vdGUgOiB5b3UgY2FuIHNldCBsZXZlbCBwYXJhbWV0ZXIgYXMgTlVMTCAoaWYgeW91IGRpZCBub3Qgd2FudCBrbm93biBsZXZlbCwKKyAgICAgICAgIGJ1dCB5b3UgQ0FOTk9UIHNldCBtZXRob2QgcGFyYW1ldGVyIGFzIE5VTEwKKyovCisKK2V4dGVybiBpbnQgWkVYUE9SVCB1bnpPcGVuQ3VycmVudEZpbGUzIE9GKCh1bnpGaWxlIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBtZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBsZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmF3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHBhc3N3b3JkKSk7CisvKgorICBTYW1lIHRoYW4gdW56T3BlbkN1cnJlbnRGaWxlLCBidXQgb3BlbiBmb3IgcmVhZCByYXcgdGhlIGZpbGUgKG5vdCB1bmNvbXByZXNzKQorICAgIGlmIHJhdz09MQorICAqbWV0aG9kIHdpbGwgcmVjZWl2ZSBtZXRob2Qgb2YgY29tcHJlc3Npb24sICpsZXZlbCB3aWxsIHJlY2VpdmUgbGV2ZWwgb2YKKyAgICAgY29tcHJlc3Npb24KKyAgbm90ZSA6IHlvdSBjYW4gc2V0IGxldmVsIHBhcmFtZXRlciBhcyBOVUxMIChpZiB5b3UgZGlkIG5vdCB3YW50IGtub3duIGxldmVsLAorICAgICAgICAgYnV0IHlvdSBDQU5OT1Qgc2V0IG1ldGhvZCBwYXJhbWV0ZXIgYXMgTlVMTAorKi8KKworCitleHRlcm4gaW50IFpFWFBPUlQgdW56Q2xvc2VDdXJyZW50RmlsZSBPRigodW56RmlsZSBmaWxlKSk7CisvKgorICBDbG9zZSB0aGUgZmlsZSBpbiB6aXAgb3BlbmVkIHdpdGggdW56T3BlbkN1cnJlbnRGaWxlCisgIFJldHVybiBVTlpfQ1JDRVJST1IgaWYgYWxsIHRoZSBmaWxlIHdhcyByZWFkIGJ1dCB0aGUgQ1JDIGlzIG5vdCBnb29kCisqLworCitleHRlcm4gaW50IFpFWFBPUlQgdW56UmVhZEN1cnJlbnRGaWxlIE9GKCh1bnpGaWxlIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgdm9pZHAgYnVmLAorICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxlbikpOworLyoKKyAgUmVhZCBieXRlcyBmcm9tIHRoZSBjdXJyZW50IGZpbGUgKG9wZW5lZCBieSB1bnpPcGVuQ3VycmVudEZpbGUpCisgIGJ1ZiBjb250YWluIGJ1ZmZlciB3aGVyZSBkYXRhIG11c3QgYmUgY29waWVkCisgIGxlbiB0aGUgc2l6ZSBvZiBidWYuCisKKyAgcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZSBjb3BpZWQgaWYgc29tZXMgYnl0ZXMgYXJlIGNvcGllZAorICByZXR1cm4gMCBpZiB0aGUgZW5kIG9mIGZpbGUgd2FzIHJlYWNoZWQKKyAgcmV0dXJuIDwwIHdpdGggZXJyb3IgY29kZSBpZiB0aGVyZSBpcyBhbiBlcnJvcgorICAgIChVTlpfRVJSTk8gZm9yIElPIGVycm9yLCBvciB6TGliIGVycm9yIGZvciB1bmNvbXByZXNzIGVycm9yKQorKi8KKworZXh0ZXJuIHpfb2ZmX3QgWkVYUE9SVCB1bnp0ZWxsIE9GKCh1bnpGaWxlIGZpbGUpKTsKKworZXh0ZXJuIFpQT1M2NF9UIFpFWFBPUlQgdW56dGVsbDY0IE9GKCh1bnpGaWxlIGZpbGUpKTsKKy8qCisgIEdpdmUgdGhlIGN1cnJlbnQgcG9zaXRpb24gaW4gdW5jb21wcmVzc2VkIGRhdGEKKyovCisKK2V4dGVybiBpbnQgWkVYUE9SVCB1bnplb2YgT0YoKHVuekZpbGUgZmlsZSkpOworLyoKKyAgcmV0dXJuIDEgaWYgdGhlIGVuZCBvZiBmaWxlIHdhcyByZWFjaGVkLCAwIGVsc2V3aGVyZQorKi8KKworZXh0ZXJuIGludCBaRVhQT1JUIHVuekdldExvY2FsRXh0cmFmaWVsZCBPRigodW56RmlsZSBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZHAgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbGVuKSk7CisvKgorICBSZWFkIGV4dHJhIGZpZWxkIGZyb20gdGhlIGN1cnJlbnQgZmlsZSAob3BlbmVkIGJ5IHVuek9wZW5DdXJyZW50RmlsZSkKKyAgVGhpcyBpcyB0aGUgbG9jYWwtaGVhZGVyIHZlcnNpb24gb2YgdGhlIGV4dHJhIGZpZWxkIChzb21ldGltZXMsIHRoZXJlIGlzCisgICAgbW9yZSBpbmZvIGluIHRoZSBsb2NhbC1oZWFkZXIgdmVyc2lvbiB0aGFuIGluIHRoZSBjZW50cmFsLWhlYWRlcikKKworICBpZiBidWY9PU5VTEwsIGl0IHJldHVybiB0aGUgc2l6ZSBvZiB0aGUgbG9jYWwgZXh0cmEgZmllbGQKKworICBpZiBidWYhPU5VTEwsIGxlbiBpcyB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyLCB0aGUgZXh0cmEgaGVhZGVyIGlzIGNvcGllZCBpbgorICAgIGJ1Zi4KKyAgdGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvcGllZCBpbiBidWYsIG9yIChpZiA8MCkKKyAgICB0aGUgZXJyb3IgY29kZQorKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogR2V0IHRoZSBjdXJyZW50IGZpbGUgb2Zmc2V0ICovCitleHRlcm4gWlBPUzY0X1QgWkVYUE9SVCB1bnpHZXRPZmZzZXQ2NCAodW56RmlsZSBmaWxlKTsKK2V4dGVybiB1TG9uZyBaRVhQT1JUIHVuekdldE9mZnNldCAodW56RmlsZSBmaWxlKTsKKworLyogU2V0IHRoZSBjdXJyZW50IGZpbGUgb2Zmc2V0ICovCitleHRlcm4gaW50IFpFWFBPUlQgdW56U2V0T2Zmc2V0NjQgKHVuekZpbGUgZmlsZSwgWlBPUzY0X1QgcG9zKTsKK2V4dGVybiBpbnQgWkVYUE9SVCB1bnpTZXRPZmZzZXQgKHVuekZpbGUgZmlsZSwgdUxvbmcgcG9zKTsKKworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfdW56NjRfSCAqLwpkaWZmIC0tZ2l0IGEvemxpYi0xLjIuNi9jb250cmliL21pbml6aXAvemlwLmMgYi96bGliLTEuMi42L2NvbnRyaWIvbWluaXppcC96aXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjk5NTgwCi0tLSAvZGV2L251bGwKKysrIGIvemxpYi0xLjIuNi9jb250cmliL21pbml6aXAvemlwLmMKQEAgLTAsMCArMSwyMDA3IEBACisvKiB6aXAuYyAtLSBJTyBvbiAuemlwIGZpbGVzIHVzaW5nIHpsaWIKKyAgIFZlcnNpb24gMS4xLCBGZWJydWFyeSAxNGgsIDIwMTAKKyAgIHBhcnQgb2YgdGhlIE1pbmlaaXAgcHJvamVjdCAtICggaHR0cDovL3d3dy53aW5pbWFnZS5jb20vekxpYkRsbC9taW5pemlwLmh0bWwgKQorCisgICAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTgtMjAxMCBHaWxsZXMgVm9sbGFudCAobWluaXppcCkgKCBodHRwOi8vd3d3LndpbmltYWdlLmNvbS96TGliRGxsL21pbml6aXAuaHRtbCApCisKKyAgICAgICAgIE1vZGlmaWNhdGlvbnMgZm9yIFppcDY0IHN1cHBvcnQKKyAgICAgICAgIENvcHlyaWdodCAoQykgMjAwOS0yMDEwIE1hdGhpYXMgU3ZlbnNzb24gKCBodHRwOi8vcmVzdWx0NDIuY29tICkKKworICAgICAgICAgRm9yIG1vcmUgaW5mbyByZWFkIE1pbmlaaXBfaW5mby50eHQKKworICAgICAgICAgQ2hhbmdlcworICAgT2N0LTIwMDkgLSBNYXRoaWFzIFN2ZW5zc29uIC0gUmVtb3ZlIG9sZCBDIHN0eWxlIGZ1bmN0aW9uIHByb3RvdHlwZXMKKyAgIE9jdC0yMDA5IC0gTWF0aGlhcyBTdmVuc3NvbiAtIEFkZGVkIFppcDY0IFN1cHBvcnQgd2hlbiBjcmVhdGluZyBuZXcgZmlsZSBhcmNoaXZlcworICAgT2N0LTIwMDkgLSBNYXRoaWFzIFN2ZW5zc29uIC0gRGlkIHNvbWUgY29kZSBjbGVhbnVwIGFuZCByZWZhY3RvcmluZyB0byBnZXQgYmV0dGVyIG92ZXJ2aWV3IG9mIHNvbWUgZnVuY3Rpb25zLgorICAgT2N0LTIwMDkgLSBNYXRoaWFzIFN2ZW5zc29uIC0gQWRkZWQgemlwUmVtb3ZlRXh0cmFJbmZvQmxvY2sgdG8gc3RyaXAgZXh0cmEgZmllbGQgZGF0YSBmcm9tIGl0cyBaSVA2NCBkYXRhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJdCBpcyB1c2VkIHdoZW4gcmVjcmV0aW5nIHppcCBhcmNoaXZlIHdpdGggUkFXIHdoZW4gZGVsZXRpbmcgaXRlbXMgZnJvbSBhIHppcC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpJUDY0IGRhdGEgaXMgYXV0b21hdGljbHkgYWRkZWQgdG8gaXRlbXMgdGhhdCBuZWVkcyBpdCwgYW5kIGV4aXN0aW5nIFpJUDY0IGRhdGEgbmVlZCB0byBiZSByZW1vdmVkLgorICAgT2N0LTIwMDkgLSBNYXRoaWFzIFN2ZW5zc29uIC0gQWRkZWQgc3VwcG9ydCBmb3IgQlpJUDIgYXMgY29tcHJlc3Npb24gbW9kZSAoYnppcDIgbGliIGlzIHJlcXVpcmVkKQorICAgSmFuLTIwMTAgLSBiYWNrIHRvIHVuemlwIGFuZCBtaW5pemlwIDEuMCBuYW1lIHNjaGVtZSwgd2l0aCBjb21wYXRpYmlsaXR5IGxheWVyCisKKyovCisKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgInpsaWIuaCIKKyNpbmNsdWRlICJ6aXAuaCIKKworI2lmZGVmIFNUREMKKyMgIGluY2x1ZGUgPHN0ZGRlZi5oPgorIyAgaW5jbHVkZSA8c3RyaW5nLmg+CisjICBpbmNsdWRlIDxzdGRsaWIuaD4KKyNlbmRpZgorI2lmZGVmIE5PX0VSUk5PX0gKKyAgICBleHRlcm4gaW50IGVycm5vOworI2Vsc2UKKyMgICBpbmNsdWRlIDxlcnJuby5oPgorI2VuZGlmCisKKworI2lmbmRlZiBsb2NhbAorIyAgZGVmaW5lIGxvY2FsIHN0YXRpYworI2VuZGlmCisvKiBjb21waWxlIHdpdGggLURsb2NhbCBpZiB5b3VyIGRlYnVnZ2VyIGNhbid0IGZpbmQgc3RhdGljIHN5bWJvbHMgKi8KKworI2lmbmRlZiBWRVJTSU9OTUFERUJZCisjIGRlZmluZSBWRVJTSU9OTUFERUJZICAgKDB4MCkgLyogcGxhdGZvcm0gZGVwZWRlbnQgKi8KKyNlbmRpZgorCisjaWZuZGVmIFpfQlVGU0laRQorI2RlZmluZSBaX0JVRlNJWkUgKDY0KjEwMjQpIC8vKDE2Mzg0KQorI2VuZGlmCisKKyNpZm5kZWYgWl9NQVhGSUxFTkFNRUlOWklQCisjZGVmaW5lIFpfTUFYRklMRU5BTUVJTlpJUCAoMjU2KQorI2VuZGlmCisKKyNpZm5kZWYgQUxMT0MKKyMgZGVmaW5lIEFMTE9DKHNpemUpIChtYWxsb2Moc2l6ZSkpCisjZW5kaWYKKyNpZm5kZWYgVFJZRlJFRQorIyBkZWZpbmUgVFJZRlJFRShwKSB7aWYgKHApIGZyZWUocCk7fQorI2VuZGlmCisKKy8qCisjZGVmaW5lIFNJWkVDRU5UUkFMRElSSVRFTSAoMHgyZSkKKyNkZWZpbmUgU0laRVpJUExPQ0FMSEVBREVSICgweDFlKQorKi8KKworLyogSSd2ZSBmb3VuZCBhbiBvbGQgVW5peCAoYSBTdW5PUyA0LjEuM19VMSkgd2l0aG91dCBhbGwgU0VFS18qIGRlZmluZWQuLi4uICovCisKKworLy8gTk9UIHN1cmUgdGhhdCB0aGlzIHdvcmsgb24gQUxMIHBsYXRmb3JtCisjZGVmaW5lIE1BS0VVTE9ORzY0KGEsIGIpICgoWlBPUzY0X1QpKCgodW5zaWduZWQgbG9uZykoYSkpIHwgKChaUE9TNjRfVCkoKHVuc2lnbmVkIGxvbmcpKGIpKSkgPDwgMzIpKQorCisjaWZuZGVmIFNFRUtfQ1VSCisjZGVmaW5lIFNFRUtfQ1VSICAgIDEKKyNlbmRpZgorCisjaWZuZGVmIFNFRUtfRU5ECisjZGVmaW5lIFNFRUtfRU5EICAgIDIKKyNlbmRpZgorCisjaWZuZGVmIFNFRUtfU0VUCisjZGVmaW5lIFNFRUtfU0VUICAgIDAKKyNlbmRpZgorCisjaWZuZGVmIERFRl9NRU1fTEVWRUwKKyNpZiBNQVhfTUVNX0xFVkVMID49IDgKKyMgIGRlZmluZSBERUZfTUVNX0xFVkVMIDgKKyNlbHNlCisjICBkZWZpbmUgREVGX01FTV9MRVZFTCAgTUFYX01FTV9MRVZFTAorI2VuZGlmCisjZW5kaWYKK2NvbnN0IGNoYXIgemlwX2NvcHlyaWdodFtdID0iIHppcCAxLjAxIENvcHlyaWdodCAxOTk4LTIwMDQgR2lsbGVzIFZvbGxhbnQgLSBodHRwOi8vd3d3LndpbmltYWdlLmNvbS96TGliRGxsIjsKKworCisjZGVmaW5lIFNJWkVEQVRBX0lOREFUQUJMT0NLICg0MDk2LSg0KjQpKQorCisjZGVmaW5lIExPQ0FMSEVBREVSTUFHSUMgICAgKDB4MDQwMzRiNTApCisjZGVmaW5lIENFTlRSQUxIRUFERVJNQUdJQyAgKDB4MDIwMTRiNTApCisjZGVmaW5lIEVOREhFQURFUk1BR0lDICAgICAgKDB4MDYwNTRiNTApCisjZGVmaW5lIFpJUDY0RU5ESEVBREVSTUFHSUMgICAgICAoMHg2MDY0YjUwKQorI2RlZmluZSBaSVA2NEVORExPQ0hFQURFUk1BR0lDICAgKDB4NzA2NGI1MCkKKworI2RlZmluZSBGTEFHX0xPQ0FMSEVBREVSX09GRlNFVCAoMHgwNikKKyNkZWZpbmUgQ1JDX0xPQ0FMSEVBREVSX09GRlNFVCAgKDB4MGUpCisKKyNkZWZpbmUgU0laRUNFTlRSQUxIRUFERVIgKDB4MmUpIC8qIDQ2ICovCisKK3R5cGVkZWYgc3RydWN0IGxpbmtlZGxpc3RfZGF0YWJsb2NrX2ludGVybmFsX3MKK3sKKyAgc3RydWN0IGxpbmtlZGxpc3RfZGF0YWJsb2NrX2ludGVybmFsX3MqIG5leHRfZGF0YWJsb2NrOworICB1TG9uZyAgYXZhaWxfaW5fdGhpc19ibG9jazsKKyAgdUxvbmcgIGZpbGxlZF9pbl90aGlzX2Jsb2NrOworICB1TG9uZyAgdW51c2VkOyAvKiBmb3IgZnV0dXJlIHVzZSBhbmQgYWxpZ25lbWVudCAqLworICB1bnNpZ25lZCBjaGFyIGRhdGFbU0laRURBVEFfSU5EQVRBQkxPQ0tdOworfSBsaW5rZWRsaXN0X2RhdGFibG9ja19pbnRlcm5hbDsKKwordHlwZWRlZiBzdHJ1Y3QgbGlua2VkbGlzdF9kYXRhX3MKK3sKKyAgICBsaW5rZWRsaXN0X2RhdGFibG9ja19pbnRlcm5hbCogZmlyc3RfYmxvY2s7CisgICAgbGlua2VkbGlzdF9kYXRhYmxvY2tfaW50ZXJuYWwqIGxhc3RfYmxvY2s7Cit9IGxpbmtlZGxpc3RfZGF0YTsKKworCit0eXBlZGVmIHN0cnVjdAoreworICAgIHpfc3RyZWFtIHN0cmVhbTsgICAgICAgICAgICAvKiB6TGliIHN0cmVhbSBzdHJ1Y3R1cmUgZm9yIGluZmxhdGUgKi8KKyNpZmRlZiBIQVZFX0JaSVAyCisgICAgYnpfc3RyZWFtIGJzdHJlYW07ICAgICAgICAgIC8qIGJ6TGliIHN0cmVhbSBzdHJ1Y3R1cmUgZm9yIGJ6aXBlZCAqLworI2VuZGlmCisKKyAgICBpbnQgIHN0cmVhbV9pbml0aWFsaXNlZDsgICAgLyogMSBpcyBzdHJlYW0gaXMgaW5pdGlhbGlzZWQgKi8KKyAgICB1SW50IHBvc19pbl9idWZmZXJlZF9kYXRhOyAgLyogbGFzdCB3cml0dGVuIGJ5dGUgaW4gYnVmZmVyZWRfZGF0YSAqLworCisgICAgWlBPUzY0X1QgcG9zX2xvY2FsX2hlYWRlcjsgICAgIC8qIG9mZnNldCBvZiB0aGUgbG9jYWwgaGVhZGVyIG9mIHRoZSBmaWxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudHkgd3JpdGluZyAqLworICAgIGNoYXIqIGNlbnRyYWxfaGVhZGVyOyAgICAgICAvKiBjZW50cmFsIGhlYWRlciBkYXRhIGZvciB0aGUgY3VycmVudCBmaWxlICovCisgICAgdUxvbmcgc2l6ZV9jZW50cmFsRXh0cmE7CisgICAgdUxvbmcgc2l6ZV9jZW50cmFsaGVhZGVyOyAgIC8qIHNpemUgb2YgdGhlIGNlbnRyYWwgaGVhZGVyIGZvciBjdXIgZmlsZSAqLworICAgIHVMb25nIHNpemVfY2VudHJhbEV4dHJhRnJlZTsgLyogRXh0cmEgYnl0ZXMgYWxsb2NhdGVkIHRvIHRoZSBjZW50cmFsaGVhZGVyIGJ1dCB0aGF0IGFyZSBub3QgdXNlZCAqLworICAgIHVMb25nIGZsYWc7ICAgICAgICAgICAgICAgICAvKiBmbGFnIG9mIHRoZSBmaWxlIGN1cnJlbnRseSB3cml0aW5nICovCisKKyAgICBpbnQgIG1ldGhvZDsgICAgICAgICAgICAgICAgLyogY29tcHJlc3Npb24gbWV0aG9kIG9mIGZpbGUgY3VycmVudHkgd3IuKi8KKyAgICBpbnQgIHJhdzsgICAgICAgICAgICAgICAgICAgLyogMSBmb3IgZGlyZWN0bHkgd3JpdGluZyByYXcgZGF0YSAqLworICAgIEJ5dGUgYnVmZmVyZWRfZGF0YVtaX0JVRlNJWkVdOy8qIGJ1ZmZlciBjb250YWluIGNvbXByZXNzZWQgZGF0YSB0byBiZSB3cml0Ki8KKyAgICB1TG9uZyBkb3NEYXRlOworICAgIHVMb25nIGNyYzMyOworICAgIGludCAgZW5jcnlwdDsKKyAgICBpbnQgIHppcDY0OyAgICAgICAgICAgICAgIC8qIEFkZCBaSVA2NCBleHRlbmVkIGluZm9ybWF0aW9uIGluIHRoZSBleHRyYSBmaWVsZCAqLworICAgIFpQT1M2NF9UIHBvc196aXA2NGV4dHJhaW5mbzsKKyAgICBaUE9TNjRfVCB0b3RhbENvbXByZXNzZWREYXRhOworICAgIFpQT1M2NF9UIHRvdGFsVW5jb21wcmVzc2VkRGF0YTsKKyNpZm5kZWYgTk9DUllQVAorICAgIHVuc2lnbmVkIGxvbmcga2V5c1szXTsgICAgIC8qIGtleXMgZGVmaW5pbmcgdGhlIHBzZXVkby1yYW5kb20gc2VxdWVuY2UgKi8KKyAgICBjb25zdCB1bnNpZ25lZCBsb25nKiBwY3JjXzMyX3RhYjsKKyAgICBpbnQgY3J5cHRfaGVhZGVyX3NpemU7CisjZW5kaWYKK30gY3VyZmlsZTY0X2luZm87CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgemxpYl9maWxlZnVuYzY0XzMyX2RlZiB6X2ZpbGVmdW5jOworICAgIHZvaWRwZiBmaWxlc3RyZWFtOyAgICAgICAgLyogaW8gc3RydWN0b3JlIG9mIHRoZSB6aXBmaWxlICovCisgICAgbGlua2VkbGlzdF9kYXRhIGNlbnRyYWxfZGlyOy8qIGRhdGFibG9jayB3aXRoIGNlbnRyYWwgZGlyIGluIGNvbnN0cnVjdGlvbiovCisgICAgaW50ICBpbl9vcGVuZWRfZmlsZV9pbnppcDsgIC8qIDEgaWYgYSBmaWxlIGluIHRoZSB6aXAgaXMgY3VycmVudGx5IHdyaXQuKi8KKyAgICBjdXJmaWxlNjRfaW5mbyBjaTsgICAgICAgICAgICAvKiBpbmZvIG9uIHRoZSBmaWxlIGN1cnJldGx5IHdyaXRpbmcgKi8KKworICAgIFpQT1M2NF9UIGJlZ2luX3BvczsgICAgICAgICAgICAvKiBwb3NpdGlvbiBvZiB0aGUgYmVnaW5uaW5nIG9mIHRoZSB6aXBmaWxlICovCisgICAgWlBPUzY0X1QgYWRkX3Bvc2l0aW9uX3doZW5fd3JpdHRpbmdfb2Zmc2V0OworICAgIFpQT1M2NF9UIG51bWJlcl9lbnRyeTsKKworI2lmbmRlZiBOT19BRERGSUxFSU5FWElTVElOR1pJUAorICAgIGNoYXIgKmdsb2JhbGNvbW1lbnQ7CisjZW5kaWYKKworfSB6aXA2NF9pbnRlcm5hbDsKKworCisjaWZuZGVmIE5PQ1JZUFQKKyNkZWZpbmUgSU5DTFVERUNSWVBUSU5HQ09ERV9JRkNSWVBUQUxMT1dFRAorI2luY2x1ZGUgImNyeXB0LmgiCisjZW5kaWYKKworbG9jYWwgbGlua2VkbGlzdF9kYXRhYmxvY2tfaW50ZXJuYWwqIGFsbG9jYXRlX25ld19kYXRhYmxvY2soKQoreworICAgIGxpbmtlZGxpc3RfZGF0YWJsb2NrX2ludGVybmFsKiBsZGk7CisgICAgbGRpID0gKGxpbmtlZGxpc3RfZGF0YWJsb2NrX2ludGVybmFsKikKKyAgICAgICAgICAgICAgICAgQUxMT0Moc2l6ZW9mKGxpbmtlZGxpc3RfZGF0YWJsb2NrX2ludGVybmFsKSk7CisgICAgaWYgKGxkaSE9TlVMTCkKKyAgICB7CisgICAgICAgIGxkaS0+bmV4dF9kYXRhYmxvY2sgPSBOVUxMIDsKKyAgICAgICAgbGRpLT5maWxsZWRfaW5fdGhpc19ibG9jayA9IDAgOworICAgICAgICBsZGktPmF2YWlsX2luX3RoaXNfYmxvY2sgPSBTSVpFREFUQV9JTkRBVEFCTE9DSyA7CisgICAgfQorICAgIHJldHVybiBsZGk7Cit9CisKK2xvY2FsIHZvaWQgZnJlZV9kYXRhYmxvY2sobGlua2VkbGlzdF9kYXRhYmxvY2tfaW50ZXJuYWwqIGxkaSkKK3sKKyAgICB3aGlsZSAobGRpIT1OVUxMKQorICAgIHsKKyAgICAgICAgbGlua2VkbGlzdF9kYXRhYmxvY2tfaW50ZXJuYWwqIGxkaW5leHQgPSBsZGktPm5leHRfZGF0YWJsb2NrOworICAgICAgICBUUllGUkVFKGxkaSk7CisgICAgICAgIGxkaSA9IGxkaW5leHQ7CisgICAgfQorfQorCitsb2NhbCB2b2lkIGluaXRfbGlua2VkbGlzdChsaW5rZWRsaXN0X2RhdGEqIGxsKQoreworICAgIGxsLT5maXJzdF9ibG9jayA9IGxsLT5sYXN0X2Jsb2NrID0gTlVMTDsKK30KKworbG9jYWwgdm9pZCBmcmVlX2xpbmtlZGxpc3QobGlua2VkbGlzdF9kYXRhKiBsbCkKK3sKKyAgICBmcmVlX2RhdGFibG9jayhsbC0+Zmlyc3RfYmxvY2spOworICAgIGxsLT5maXJzdF9ibG9jayA9IGxsLT5sYXN0X2Jsb2NrID0gTlVMTDsKK30KKworCitsb2NhbCBpbnQgYWRkX2RhdGFfaW5fZGF0YWJsb2NrKGxpbmtlZGxpc3RfZGF0YSogbGwsIGNvbnN0IHZvaWQqIGJ1ZiwgdUxvbmcgbGVuKQoreworICAgIGxpbmtlZGxpc3RfZGF0YWJsb2NrX2ludGVybmFsKiBsZGk7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciogZnJvbV9jb3B5OworCisgICAgaWYgKGxsPT1OVUxMKQorICAgICAgICByZXR1cm4gWklQX0lOVEVSTkFMRVJST1I7CisKKyAgICBpZiAobGwtPmxhc3RfYmxvY2sgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIGxsLT5maXJzdF9ibG9jayA9IGxsLT5sYXN0X2Jsb2NrID0gYWxsb2NhdGVfbmV3X2RhdGFibG9jaygpOworICAgICAgICBpZiAobGwtPmZpcnN0X2Jsb2NrID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gWklQX0lOVEVSTkFMRVJST1I7CisgICAgfQorCisgICAgbGRpID0gbGwtPmxhc3RfYmxvY2s7CisgICAgZnJvbV9jb3B5ID0gKHVuc2lnbmVkIGNoYXIqKWJ1ZjsKKworICAgIHdoaWxlIChsZW4+MCkKKyAgICB7CisgICAgICAgIHVJbnQgY29weV90aGlzOworICAgICAgICB1SW50IGk7CisgICAgICAgIHVuc2lnbmVkIGNoYXIqIHRvX2NvcHk7CisKKyAgICAgICAgaWYgKGxkaS0+YXZhaWxfaW5fdGhpc19ibG9jaz09MCkKKyAgICAgICAgeworICAgICAgICAgICAgbGRpLT5uZXh0X2RhdGFibG9jayA9IGFsbG9jYXRlX25ld19kYXRhYmxvY2soKTsKKyAgICAgICAgICAgIGlmIChsZGktPm5leHRfZGF0YWJsb2NrID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIFpJUF9JTlRFUk5BTEVSUk9SOworICAgICAgICAgICAgbGRpID0gbGRpLT5uZXh0X2RhdGFibG9jayA7CisgICAgICAgICAgICBsbC0+bGFzdF9ibG9jayA9IGxkaTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChsZGktPmF2YWlsX2luX3RoaXNfYmxvY2sgPCBsZW4pCisgICAgICAgICAgICBjb3B5X3RoaXMgPSAodUludClsZGktPmF2YWlsX2luX3RoaXNfYmxvY2s7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGNvcHlfdGhpcyA9ICh1SW50KWxlbjsKKworICAgICAgICB0b19jb3B5ID0gJihsZGktPmRhdGFbbGRpLT5maWxsZWRfaW5fdGhpc19ibG9ja10pOworCisgICAgICAgIGZvciAoaT0wO2k8Y29weV90aGlzO2krKykKKyAgICAgICAgICAgICoodG9fY29weStpKT0qKGZyb21fY29weStpKTsKKworICAgICAgICBsZGktPmZpbGxlZF9pbl90aGlzX2Jsb2NrICs9IGNvcHlfdGhpczsKKyAgICAgICAgbGRpLT5hdmFpbF9pbl90aGlzX2Jsb2NrIC09IGNvcHlfdGhpczsKKyAgICAgICAgZnJvbV9jb3B5ICs9IGNvcHlfdGhpcyA7CisgICAgICAgIGxlbiAtPSBjb3B5X3RoaXM7CisgICAgfQorICAgIHJldHVybiBaSVBfT0s7Cit9CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBOT19BRERGSUxFSU5FWElTVElOR1pJUAorLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICBJbnB1dHMgYSBsb25nIGluIExTQiBvcmRlciB0byB0aGUgZ2l2ZW4gZmlsZQorICAgbmJCeXRlID09IDEsIDIgLDQgb3IgOCAoYnl0ZSwgc2hvcnQgb3IgbG9uZywgWlBPUzY0X1QpCisqLworCitsb2NhbCBpbnQgemlwNjRsb2NhbF9wdXRWYWx1ZSBPRigoY29uc3QgemxpYl9maWxlZnVuYzY0XzMyX2RlZiogcHpsaWJfZmlsZWZ1bmNfZGVmLCB2b2lkcGYgZmlsZXN0cmVhbSwgWlBPUzY0X1QgeCwgaW50IG5iQnl0ZSkpOworbG9jYWwgaW50IHppcDY0bG9jYWxfcHV0VmFsdWUgKGNvbnN0IHpsaWJfZmlsZWZ1bmM2NF8zMl9kZWYqIHB6bGliX2ZpbGVmdW5jX2RlZiwgdm9pZHBmIGZpbGVzdHJlYW0sIFpQT1M2NF9UIHgsIGludCBuYkJ5dGUpCit7CisgICAgdW5zaWduZWQgY2hhciBidWZbOF07CisgICAgaW50IG47CisgICAgZm9yIChuID0gMDsgbiA8IG5iQnl0ZTsgbisrKQorICAgIHsKKyAgICAgICAgYnVmW25dID0gKHVuc2lnbmVkIGNoYXIpKHggJiAweGZmKTsKKyAgICAgICAgeCA+Pj0gODsKKyAgICB9CisgICAgaWYgKHggIT0gMCkKKyAgICAgIHsgICAgIC8qIGRhdGEgb3ZlcmZsb3cgLSBoYWNrIGZvciBaSVA2NCAoWCBSb2NoZSkgKi8KKyAgICAgIGZvciAobiA9IDA7IG4gPCBuYkJ5dGU7IG4rKykKKyAgICAgICAgeworICAgICAgICAgIGJ1ZltuXSA9IDB4ZmY7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgIGlmIChaV1JJVEU2NCgqcHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0sYnVmLG5iQnl0ZSkhPSh1TG9uZyluYkJ5dGUpCisgICAgICAgIHJldHVybiBaSVBfRVJSTk87CisgICAgZWxzZQorICAgICAgICByZXR1cm4gWklQX09LOworfQorCitsb2NhbCB2b2lkIHppcDY0bG9jYWxfcHV0VmFsdWVfaW5tZW1vcnkgT0YoKHZvaWQqIGRlc3QsIFpQT1M2NF9UIHgsIGludCBuYkJ5dGUpKTsKK2xvY2FsIHZvaWQgemlwNjRsb2NhbF9wdXRWYWx1ZV9pbm1lbW9yeSAodm9pZCogZGVzdCwgWlBPUzY0X1QgeCwgaW50IG5iQnl0ZSkKK3sKKyAgICB1bnNpZ25lZCBjaGFyKiBidWY9KHVuc2lnbmVkIGNoYXIqKWRlc3Q7CisgICAgaW50IG47CisgICAgZm9yIChuID0gMDsgbiA8IG5iQnl0ZTsgbisrKSB7CisgICAgICAgIGJ1ZltuXSA9ICh1bnNpZ25lZCBjaGFyKSh4ICYgMHhmZik7CisgICAgICAgIHggPj49IDg7CisgICAgfQorCisgICAgaWYgKHggIT0gMCkKKyAgICB7ICAgICAvKiBkYXRhIG92ZXJmbG93IC0gaGFjayBmb3IgWklQNjQgKi8KKyAgICAgICBmb3IgKG4gPSAwOyBuIDwgbmJCeXRlOyBuKyspCisgICAgICAgeworICAgICAgICAgIGJ1ZltuXSA9IDB4ZmY7CisgICAgICAgfQorICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworbG9jYWwgdUxvbmcgemlwNjRsb2NhbF9UbXpEYXRlVG9Eb3NEYXRlKGNvbnN0IHRtX3ppcCogcHRtKQoreworICAgIHVMb25nIHllYXIgPSAodUxvbmcpcHRtLT50bV95ZWFyOworICAgIGlmICh5ZWFyPj0xOTgwKQorICAgICAgICB5ZWFyLT0xOTgwOworICAgIGVsc2UgaWYgKHllYXI+PTgwKQorICAgICAgICB5ZWFyLT04MDsKKyAgICByZXR1cm4KKyAgICAgICh1TG9uZykgKCgocHRtLT50bV9tZGF5KSArICgzMiAqIChwdG0tPnRtX21vbisxKSkgKyAoNTEyICogeWVhcikpIDw8IDE2KSB8CisgICAgICAgICgocHRtLT50bV9zZWMvMikgKyAoMzIqIHB0bS0+dG1fbWluKSArICgyMDQ4ICogKHVMb25nKXB0bS0+dG1faG91cikpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitsb2NhbCBpbnQgemlwNjRsb2NhbF9nZXRCeXRlIE9GKChjb25zdCB6bGliX2ZpbGVmdW5jNjRfMzJfZGVmKiBwemxpYl9maWxlZnVuY19kZWYsIHZvaWRwZiBmaWxlc3RyZWFtLCBpbnQgKnBpKSk7CisKK2xvY2FsIGludCB6aXA2NGxvY2FsX2dldEJ5dGUoY29uc3QgemxpYl9maWxlZnVuYzY0XzMyX2RlZiogcHpsaWJfZmlsZWZ1bmNfZGVmLHZvaWRwZiBmaWxlc3RyZWFtLGludCogcGkpCit7CisgICAgdW5zaWduZWQgY2hhciBjOworICAgIGludCBlcnIgPSAoaW50KVpSRUFENjQoKnB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtLCZjLDEpOworICAgIGlmIChlcnI9PTEpCisgICAgeworICAgICAgICAqcGkgPSAoaW50KWM7CisgICAgICAgIHJldHVybiBaSVBfT0s7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmIChaRVJST1I2NCgqcHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0pKQorICAgICAgICAgICAgcmV0dXJuIFpJUF9FUlJOTzsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIFpJUF9FT0Y7CisgICAgfQorfQorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgUmVhZHMgYSBsb25nIGluIExTQiBvcmRlciBmcm9tIHRoZSBnaXZlbiBnel9zdHJlYW0uIFNldHMKKyovCitsb2NhbCBpbnQgemlwNjRsb2NhbF9nZXRTaG9ydCBPRigoY29uc3QgemxpYl9maWxlZnVuYzY0XzMyX2RlZiogcHpsaWJfZmlsZWZ1bmNfZGVmLCB2b2lkcGYgZmlsZXN0cmVhbSwgdUxvbmcgKnBYKSk7CisKK2xvY2FsIGludCB6aXA2NGxvY2FsX2dldFNob3J0IChjb25zdCB6bGliX2ZpbGVmdW5jNjRfMzJfZGVmKiBwemxpYl9maWxlZnVuY19kZWYsIHZvaWRwZiBmaWxlc3RyZWFtLCB1TG9uZyogcFgpCit7CisgICAgdUxvbmcgeCA7CisgICAgaW50IGkgPSAwOworICAgIGludCBlcnI7CisKKyAgICBlcnIgPSB6aXA2NGxvY2FsX2dldEJ5dGUocHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0sJmkpOworICAgIHggPSAodUxvbmcpaTsKKworICAgIGlmIChlcnI9PVpJUF9PSykKKyAgICAgICAgZXJyID0gemlwNjRsb2NhbF9nZXRCeXRlKHB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtLCZpKTsKKyAgICB4ICs9ICgodUxvbmcpaSk8PDg7CisKKyAgICBpZiAoZXJyPT1aSVBfT0spCisgICAgICAgICpwWCA9IHg7CisgICAgZWxzZQorICAgICAgICAqcFggPSAwOworICAgIHJldHVybiBlcnI7Cit9CisKK2xvY2FsIGludCB6aXA2NGxvY2FsX2dldExvbmcgT0YoKGNvbnN0IHpsaWJfZmlsZWZ1bmM2NF8zMl9kZWYqIHB6bGliX2ZpbGVmdW5jX2RlZiwgdm9pZHBmIGZpbGVzdHJlYW0sIHVMb25nICpwWCkpOworCitsb2NhbCBpbnQgemlwNjRsb2NhbF9nZXRMb25nIChjb25zdCB6bGliX2ZpbGVmdW5jNjRfMzJfZGVmKiBwemxpYl9maWxlZnVuY19kZWYsIHZvaWRwZiBmaWxlc3RyZWFtLCB1TG9uZyogcFgpCit7CisgICAgdUxvbmcgeCA7CisgICAgaW50IGkgPSAwOworICAgIGludCBlcnI7CisKKyAgICBlcnIgPSB6aXA2NGxvY2FsX2dldEJ5dGUocHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0sJmkpOworICAgIHggPSAodUxvbmcpaTsKKworICAgIGlmIChlcnI9PVpJUF9PSykKKyAgICAgICAgZXJyID0gemlwNjRsb2NhbF9nZXRCeXRlKHB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtLCZpKTsKKyAgICB4ICs9ICgodUxvbmcpaSk8PDg7CisKKyAgICBpZiAoZXJyPT1aSVBfT0spCisgICAgICAgIGVyciA9IHppcDY0bG9jYWxfZ2V0Qnl0ZShwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSwmaSk7CisgICAgeCArPSAoKHVMb25nKWkpPDwxNjsKKworICAgIGlmIChlcnI9PVpJUF9PSykKKyAgICAgICAgZXJyID0gemlwNjRsb2NhbF9nZXRCeXRlKHB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtLCZpKTsKKyAgICB4ICs9ICgodUxvbmcpaSk8PDI0OworCisgICAgaWYgKGVycj09WklQX09LKQorICAgICAgICAqcFggPSB4OworICAgIGVsc2UKKyAgICAgICAgKnBYID0gMDsKKyAgICByZXR1cm4gZXJyOworfQorCitsb2NhbCBpbnQgemlwNjRsb2NhbF9nZXRMb25nNjQgT0YoKGNvbnN0IHpsaWJfZmlsZWZ1bmM2NF8zMl9kZWYqIHB6bGliX2ZpbGVmdW5jX2RlZiwgdm9pZHBmIGZpbGVzdHJlYW0sIFpQT1M2NF9UICpwWCkpOworCisKK2xvY2FsIGludCB6aXA2NGxvY2FsX2dldExvbmc2NCAoY29uc3QgemxpYl9maWxlZnVuYzY0XzMyX2RlZiogcHpsaWJfZmlsZWZ1bmNfZGVmLCB2b2lkcGYgZmlsZXN0cmVhbSwgWlBPUzY0X1QgKnBYKQoreworICBaUE9TNjRfVCB4OworICBpbnQgaSA9IDA7CisgIGludCBlcnI7CisKKyAgZXJyID0gemlwNjRsb2NhbF9nZXRCeXRlKHB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtLCZpKTsKKyAgeCA9IChaUE9TNjRfVClpOworCisgIGlmIChlcnI9PVpJUF9PSykKKyAgICBlcnIgPSB6aXA2NGxvY2FsX2dldEJ5dGUocHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0sJmkpOworICB4ICs9ICgoWlBPUzY0X1QpaSk8PDg7CisKKyAgaWYgKGVycj09WklQX09LKQorICAgIGVyciA9IHppcDY0bG9jYWxfZ2V0Qnl0ZShwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSwmaSk7CisgIHggKz0gKChaUE9TNjRfVClpKTw8MTY7CisKKyAgaWYgKGVycj09WklQX09LKQorICAgIGVyciA9IHppcDY0bG9jYWxfZ2V0Qnl0ZShwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSwmaSk7CisgIHggKz0gKChaUE9TNjRfVClpKTw8MjQ7CisKKyAgaWYgKGVycj09WklQX09LKQorICAgIGVyciA9IHppcDY0bG9jYWxfZ2V0Qnl0ZShwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSwmaSk7CisgIHggKz0gKChaUE9TNjRfVClpKTw8MzI7CisKKyAgaWYgKGVycj09WklQX09LKQorICAgIGVyciA9IHppcDY0bG9jYWxfZ2V0Qnl0ZShwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSwmaSk7CisgIHggKz0gKChaUE9TNjRfVClpKTw8NDA7CisKKyAgaWYgKGVycj09WklQX09LKQorICAgIGVyciA9IHppcDY0bG9jYWxfZ2V0Qnl0ZShwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSwmaSk7CisgIHggKz0gKChaUE9TNjRfVClpKTw8NDg7CisKKyAgaWYgKGVycj09WklQX09LKQorICAgIGVyciA9IHppcDY0bG9jYWxfZ2V0Qnl0ZShwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSwmaSk7CisgIHggKz0gKChaUE9TNjRfVClpKTw8NTY7CisKKyAgaWYgKGVycj09WklQX09LKQorICAgICpwWCA9IHg7CisgIGVsc2UKKyAgICAqcFggPSAwOworCisgIHJldHVybiBlcnI7Cit9CisKKyNpZm5kZWYgQlVGUkVBRENPTU1FTlQKKyNkZWZpbmUgQlVGUkVBRENPTU1FTlQgKDB4NDAwKQorI2VuZGlmCisvKgorICBMb2NhdGUgdGhlIENlbnRyYWwgZGlyZWN0b3J5IG9mIGEgemlwZmlsZSAoYXQgdGhlIGVuZCwganVzdCBiZWZvcmUKKyAgICB0aGUgZ2xvYmFsIGNvbW1lbnQpCisqLworbG9jYWwgWlBPUzY0X1QgemlwNjRsb2NhbF9TZWFyY2hDZW50cmFsRGlyIE9GKChjb25zdCB6bGliX2ZpbGVmdW5jNjRfMzJfZGVmKiBwemxpYl9maWxlZnVuY19kZWYsIHZvaWRwZiBmaWxlc3RyZWFtKSk7CisKK2xvY2FsIFpQT1M2NF9UIHppcDY0bG9jYWxfU2VhcmNoQ2VudHJhbERpcihjb25zdCB6bGliX2ZpbGVmdW5jNjRfMzJfZGVmKiBwemxpYl9maWxlZnVuY19kZWYsIHZvaWRwZiBmaWxlc3RyZWFtKQoreworICB1bnNpZ25lZCBjaGFyKiBidWY7CisgIFpQT1M2NF9UIHVTaXplRmlsZTsKKyAgWlBPUzY0X1QgdUJhY2tSZWFkOworICBaUE9TNjRfVCB1TWF4QmFjaz0weGZmZmY7IC8qIG1heGltdW0gc2l6ZSBvZiBnbG9iYWwgY29tbWVudCAqLworICBaUE9TNjRfVCB1UG9zRm91bmQ9MDsKKworICBpZiAoWlNFRUs2NCgqcHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0sMCxaTElCX0ZJTEVGVU5DX1NFRUtfRU5EKSAhPSAwKQorICAgIHJldHVybiAwOworCisKKyAgdVNpemVGaWxlID0gWlRFTEw2NCgqcHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0pOworCisgIGlmICh1TWF4QmFjaz51U2l6ZUZpbGUpCisgICAgdU1heEJhY2sgPSB1U2l6ZUZpbGU7CisKKyAgYnVmID0gKHVuc2lnbmVkIGNoYXIqKUFMTE9DKEJVRlJFQURDT01NRU5UKzQpOworICBpZiAoYnVmPT1OVUxMKQorICAgIHJldHVybiAwOworCisgIHVCYWNrUmVhZCA9IDQ7CisgIHdoaWxlICh1QmFja1JlYWQ8dU1heEJhY2spCisgIHsKKyAgICB1TG9uZyB1UmVhZFNpemU7CisgICAgWlBPUzY0X1QgdVJlYWRQb3MgOworICAgIGludCBpOworICAgIGlmICh1QmFja1JlYWQrQlVGUkVBRENPTU1FTlQ+dU1heEJhY2spCisgICAgICB1QmFja1JlYWQgPSB1TWF4QmFjazsKKyAgICBlbHNlCisgICAgICB1QmFja1JlYWQrPUJVRlJFQURDT01NRU5UOworICAgIHVSZWFkUG9zID0gdVNpemVGaWxlLXVCYWNrUmVhZCA7CisKKyAgICB1UmVhZFNpemUgPSAoKEJVRlJFQURDT01NRU5UKzQpIDwgKHVTaXplRmlsZS11UmVhZFBvcykpID8KKyAgICAgIChCVUZSRUFEQ09NTUVOVCs0KSA6ICh1TG9uZykodVNpemVGaWxlLXVSZWFkUG9zKTsKKyAgICBpZiAoWlNFRUs2NCgqcHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0sdVJlYWRQb3MsWkxJQl9GSUxFRlVOQ19TRUVLX1NFVCkhPTApCisgICAgICBicmVhazsKKworICAgIGlmIChaUkVBRDY0KCpwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSxidWYsdVJlYWRTaXplKSE9dVJlYWRTaXplKQorICAgICAgYnJlYWs7CisKKyAgICBmb3IgKGk9KGludCl1UmVhZFNpemUtMzsgKGktLSk+MDspCisgICAgICBpZiAoKCgqKGJ1ZitpKSk9PTB4NTApICYmICgoKihidWYraSsxKSk9PTB4NGIpICYmCisgICAgICAgICgoKihidWYraSsyKSk9PTB4MDUpICYmICgoKihidWYraSszKSk9PTB4MDYpKQorICAgICAgeworICAgICAgICB1UG9zRm91bmQgPSB1UmVhZFBvcytpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgaWYgKHVQb3NGb3VuZCE9MCkKKyAgICAgICAgYnJlYWs7CisgIH0KKyAgVFJZRlJFRShidWYpOworICByZXR1cm4gdVBvc0ZvdW5kOworfQorCisvKgorTG9jYXRlIHRoZSBFbmQgb2YgWmlwNjQgQ2VudHJhbCBkaXJlY3RvcnkgbG9jYXRvciBhbmQgZnJvbSB0aGVyZSBmaW5kIHRoZSBDRCBvZiBhIHppcGZpbGUgKGF0IHRoZSBlbmQsIGp1c3QgYmVmb3JlCit0aGUgZ2xvYmFsIGNvbW1lbnQpCisqLworbG9jYWwgWlBPUzY0X1QgemlwNjRsb2NhbF9TZWFyY2hDZW50cmFsRGlyNjQgT0YoKGNvbnN0IHpsaWJfZmlsZWZ1bmM2NF8zMl9kZWYqIHB6bGliX2ZpbGVmdW5jX2RlZiwgdm9pZHBmIGZpbGVzdHJlYW0pKTsKKworbG9jYWwgWlBPUzY0X1QgemlwNjRsb2NhbF9TZWFyY2hDZW50cmFsRGlyNjQoY29uc3QgemxpYl9maWxlZnVuYzY0XzMyX2RlZiogcHpsaWJfZmlsZWZ1bmNfZGVmLCB2b2lkcGYgZmlsZXN0cmVhbSkKK3sKKyAgdW5zaWduZWQgY2hhciogYnVmOworICBaUE9TNjRfVCB1U2l6ZUZpbGU7CisgIFpQT1M2NF9UIHVCYWNrUmVhZDsKKyAgWlBPUzY0X1QgdU1heEJhY2s9MHhmZmZmOyAvKiBtYXhpbXVtIHNpemUgb2YgZ2xvYmFsIGNvbW1lbnQgKi8KKyAgWlBPUzY0X1QgdVBvc0ZvdW5kPTA7CisgIHVMb25nIHVMOworICBaUE9TNjRfVCByZWxhdGl2ZU9mZnNldDsKKworICBpZiAoWlNFRUs2NCgqcHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0sMCxaTElCX0ZJTEVGVU5DX1NFRUtfRU5EKSAhPSAwKQorICAgIHJldHVybiAwOworCisgIHVTaXplRmlsZSA9IFpURUxMNjQoKnB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtKTsKKworICBpZiAodU1heEJhY2s+dVNpemVGaWxlKQorICAgIHVNYXhCYWNrID0gdVNpemVGaWxlOworCisgIGJ1ZiA9ICh1bnNpZ25lZCBjaGFyKilBTExPQyhCVUZSRUFEQ09NTUVOVCs0KTsKKyAgaWYgKGJ1Zj09TlVMTCkKKyAgICByZXR1cm4gMDsKKworICB1QmFja1JlYWQgPSA0OworICB3aGlsZSAodUJhY2tSZWFkPHVNYXhCYWNrKQorICB7CisgICAgdUxvbmcgdVJlYWRTaXplOworICAgIFpQT1M2NF9UIHVSZWFkUG9zOworICAgIGludCBpOworICAgIGlmICh1QmFja1JlYWQrQlVGUkVBRENPTU1FTlQ+dU1heEJhY2spCisgICAgICB1QmFja1JlYWQgPSB1TWF4QmFjazsKKyAgICBlbHNlCisgICAgICB1QmFja1JlYWQrPUJVRlJFQURDT01NRU5UOworICAgIHVSZWFkUG9zID0gdVNpemVGaWxlLXVCYWNrUmVhZCA7CisKKyAgICB1UmVhZFNpemUgPSAoKEJVRlJFQURDT01NRU5UKzQpIDwgKHVTaXplRmlsZS11UmVhZFBvcykpID8KKyAgICAgIChCVUZSRUFEQ09NTUVOVCs0KSA6ICh1TG9uZykodVNpemVGaWxlLXVSZWFkUG9zKTsKKyAgICBpZiAoWlNFRUs2NCgqcHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0sdVJlYWRQb3MsWkxJQl9GSUxFRlVOQ19TRUVLX1NFVCkhPTApCisgICAgICBicmVhazsKKworICAgIGlmIChaUkVBRDY0KCpwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSxidWYsdVJlYWRTaXplKSE9dVJlYWRTaXplKQorICAgICAgYnJlYWs7CisKKyAgICBmb3IgKGk9KGludCl1UmVhZFNpemUtMzsgKGktLSk+MDspCisgICAgeworICAgICAgLy8gU2lnbmF0dXJlICIweDA3MDY0YjUwIiBaaXA2NCBlbmQgb2YgY2VudHJhbCBkaXJlY3RvcnkgbG9jYXRlcgorICAgICAgaWYgKCgoKihidWYraSkpPT0weDUwKSAmJiAoKCooYnVmK2krMSkpPT0weDRiKSAmJiAoKCooYnVmK2krMikpPT0weDA2KSAmJiAoKCooYnVmK2krMykpPT0weDA3KSkKKyAgICAgIHsKKyAgICAgICAgdVBvc0ZvdW5kID0gdVJlYWRQb3MraTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorCisgICAgICBpZiAodVBvc0ZvdW5kIT0wKQorICAgICAgICBicmVhazsKKyAgfQorCisgIFRSWUZSRUUoYnVmKTsKKyAgaWYgKHVQb3NGb3VuZCA9PSAwKQorICAgIHJldHVybiAwOworCisgIC8qIFppcDY0IGVuZCBvZiBjZW50cmFsIGRpcmVjdG9yeSBsb2NhdG9yICovCisgIGlmIChaU0VFSzY0KCpwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSwgdVBvc0ZvdW5kLFpMSUJfRklMRUZVTkNfU0VFS19TRVQpIT0wKQorICAgIHJldHVybiAwOworCisgIC8qIHRoZSBzaWduYXR1cmUsIGFscmVhZHkgY2hlY2tlZCAqLworICBpZiAoemlwNjRsb2NhbF9nZXRMb25nKHB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtLCZ1TCkhPVpJUF9PSykKKyAgICByZXR1cm4gMDsKKworICAvKiBudW1iZXIgb2YgdGhlIGRpc2sgd2l0aCB0aGUgc3RhcnQgb2YgdGhlIHppcDY0IGVuZCBvZiAgY2VudHJhbCBkaXJlY3RvcnkgKi8KKyAgaWYgKHppcDY0bG9jYWxfZ2V0TG9uZyhwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSwmdUwpIT1aSVBfT0spCisgICAgcmV0dXJuIDA7CisgIGlmICh1TCAhPSAwKQorICAgIHJldHVybiAwOworCisgIC8qIHJlbGF0aXZlIG9mZnNldCBvZiB0aGUgemlwNjQgZW5kIG9mIGNlbnRyYWwgZGlyZWN0b3J5IHJlY29yZCAqLworICBpZiAoemlwNjRsb2NhbF9nZXRMb25nNjQocHpsaWJfZmlsZWZ1bmNfZGVmLGZpbGVzdHJlYW0sJnJlbGF0aXZlT2Zmc2V0KSE9WklQX09LKQorICAgIHJldHVybiAwOworCisgIC8qIHRvdGFsIG51bWJlciBvZiBkaXNrcyAqLworICBpZiAoemlwNjRsb2NhbF9nZXRMb25nKHB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtLCZ1TCkhPVpJUF9PSykKKyAgICByZXR1cm4gMDsKKyAgaWYgKHVMICE9IDEpCisgICAgcmV0dXJuIDA7CisKKyAgLyogR290byBaaXA2NCBlbmQgb2YgY2VudHJhbCBkaXJlY3RvcnkgcmVjb3JkICovCisgIGlmIChaU0VFSzY0KCpwemxpYl9maWxlZnVuY19kZWYsZmlsZXN0cmVhbSwgcmVsYXRpdmVPZmZzZXQsWkxJQl9GSUxFRlVOQ19TRUVLX1NFVCkhPTApCisgICAgcmV0dXJuIDA7CisKKyAgLyogdGhlIHNpZ25hdHVyZSAqLworICBpZiAoemlwNjRsb2NhbF9nZXRMb25nKHB6bGliX2ZpbGVmdW5jX2RlZixmaWxlc3RyZWFtLCZ1TCkhPVpJUF9PSykKKyAgICByZXR1cm4gMDsKKworICBpZiAodUwgIT0gMHgwNjA2NGI1MCkgLy8gc2lnbmF0dXJlIG9mICdaaXA2NCBlbmQgb2YgY2VudHJhbCBkaXJlY3RvcnknCisgICAgcmV0dXJuIDA7CisKKyAgcmV0dXJuIHJlbGF0aXZlT2Zmc2V0OworfQorCitpbnQgTG9hZENlbnRyYWxEaXJlY3RvcnlSZWNvcmQoemlwNjRfaW50ZXJuYWwqIHB6aWluaXQpCit7CisgIGludCBlcnI9WklQX09LOworICBaUE9TNjRfVCBieXRlX2JlZm9yZV90aGVfemlwZmlsZTsvKiBieXRlIGJlZm9yZSB0aGUgemlwZmlsZSwgKD4wIGZvciBzZngpKi8KKworICBaUE9TNjRfVCBzaXplX2NlbnRyYWxfZGlyOyAgICAgLyogc2l6ZSBvZiB0aGUgY2VudHJhbCBkaXJlY3RvcnkgICovCisgIFpQT1M2NF9UIG9mZnNldF9jZW50cmFsX2RpcjsgICAvKiBvZmZzZXQgb2Ygc3RhcnQgb2YgY2VudHJhbCBkaXJlY3RvcnkgKi8KKyAgWlBPUzY0X1QgY2VudHJhbF9wb3M7CisgIHVMb25nIHVMOworCisgIHVMb25nIG51bWJlcl9kaXNrOyAgICAgICAgICAvKiBudW1iZXIgb2YgdGhlIGN1cnJlbnQgZGlzdCwgdXNlZCBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYW5pbmcgWklQLCB1bnN1cHBvcnRlZCwgYWx3YXlzIDAqLworICB1TG9uZyBudW1iZXJfZGlza193aXRoX0NEOyAgLyogbnVtYmVyIHRoZSB0aGUgZGlzayB3aXRoIGNlbnRyYWwgZGlyLCB1c2VkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3Igc3BhbmluZyBaSVAsIHVuc3VwcG9ydGVkLCBhbHdheXMgMCovCisgIFpQT1M2NF9UIG51bWJlcl9lbnRyeTsKKyAgWlBPUzY0X1QgbnVtYmVyX2VudHJ5X0NEOyAgICAgIC8qIHRvdGFsIG51bWJlciBvZiBlbnRyaWVzIGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjZW50cmFsIGRpcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2FtZSB0aGFuIG51bWJlcl9lbnRyeSBvbiBub3NwYW4pICovCisgIHVMb25nIFZlcnNpb25NYWRlQnk7CisgIHVMb25nIFZlcnNpb25OZWVkZWQ7CisgIHVMb25nIHNpemVfY29tbWVudDsKKworICBpbnQgaGFzWklQNjRSZWNvcmQgPSAwOworCisgIC8vIGNoZWNrIGZpcnN0IGlmIHdlIGZpbmQgYSBaSVA2NCByZWNvcmQKKyAgY2VudHJhbF9wb3MgPSB6aXA2NGxvY2FsX1NlYXJjaENlbnRyYWxEaXI2NCgmcHppaW5pdC0+el9maWxlZnVuYyxwemlpbml0LT5maWxlc3RyZWFtKTsKKyAgaWYoY2VudHJhbF9wb3MgPiAwKQorICB7CisgICAgaGFzWklQNjRSZWNvcmQgPSAxOworICB9CisgIGVsc2UgaWYoY2VudHJhbF9wb3MgPT0gMCkKKyAgeworICAgIGNlbnRyYWxfcG9zID0gemlwNjRsb2NhbF9TZWFyY2hDZW50cmFsRGlyKCZwemlpbml0LT56X2ZpbGVmdW5jLHB6aWluaXQtPmZpbGVzdHJlYW0pOworICB9CisKKy8qIGRpc2FibGUgdG8gYWxsb3cgYXBwZW5kaW5nIHRvIGVtcHR5IFpJUCBhcmNoaXZlCisgICAgICAgIGlmIChjZW50cmFsX3Bvcz09MCkKKyAgICAgICAgICAgIGVycj1aSVBfRVJSTk87CisqLworCisgIGlmKGhhc1pJUDY0UmVjb3JkKQorICB7CisgICAgWlBPUzY0X1Qgc2l6ZUVuZE9mQ2VudHJhbERpcmVjdG9yeTsKKyAgICBpZiAoWlNFRUs2NChwemlpbml0LT56X2ZpbGVmdW5jLCBwemlpbml0LT5maWxlc3RyZWFtLCBjZW50cmFsX3BvcywgWkxJQl9GSUxFRlVOQ19TRUVLX1NFVCkgIT0gMCkKKyAgICAgIGVycj1aSVBfRVJSTk87CisKKyAgICAvKiB0aGUgc2lnbmF0dXJlLCBhbHJlYWR5IGNoZWNrZWQgKi8KKyAgICBpZiAoemlwNjRsb2NhbF9nZXRMb25nKCZwemlpbml0LT56X2ZpbGVmdW5jLCBwemlpbml0LT5maWxlc3RyZWFtLCZ1TCkhPVpJUF9PSykKKyAgICAgIGVycj1aSVBfRVJSTk87CisKKyAgICAvKiBzaXplIG9mIHppcDY0IGVuZCBvZiBjZW50cmFsIGRpcmVjdG9yeSByZWNvcmQgKi8KKyAgICBpZiAoemlwNjRsb2NhbF9nZXRMb25nNjQoJnB6aWluaXQtPnpfZmlsZWZ1bmMsIHB6aWluaXQtPmZpbGVzdHJlYW0sICZzaXplRW5kT2ZDZW50cmFsRGlyZWN0b3J5KSE9WklQX09LKQorICAgICAgZXJyPVpJUF9FUlJOTzsKKworICAgIC8qIHZlcnNpb24gbWFkZSBieSAqLworICAgIGlmICh6aXA2NGxvY2FsX2dldFNob3J0KCZwemlpbml0LT56X2ZpbGVmdW5jLCBwemlpbml0LT5maWxlc3RyZWFtLCAmVmVyc2lvbk1hZGVCeSkhPVpJUF9PSykKKyAgICAgIGVycj1aSVBfRVJSTk87CisKKyAgICAvKiB2ZXJzaW9uIG5lZWRlZCB0byBleHRyYWN0ICovCisgICAgaWYgKHppcDY0bG9jYWxfZ2V0U2hvcnQoJnB6aWluaXQtPnpfZmlsZWZ1bmMsIHB6aWluaXQtPmZpbGVzdHJlYW0sICZWZXJzaW9uTmVlZGVkKSE9WklQX09LKQorICAgICAgZXJyPVpJUF9FUlJOTzsKKworICAgIC8qIG51bWJlciBvZiB0aGlzIGRpc2sgKi8KKyAgICBpZiAoemlwNjRsb2NhbF9nZXRMb25nKCZwemlpbml0LT56X2ZpbGVmdW5jLCBwemlpbml0LT5maWxlc3RyZWFtLCZudW1iZXJfZGlzaykhPVpJUF9PSykKKyAgICAgIGVycj1aSVBfRVJSTk87CisKKyAgICAvKiBudW1iZXIgb2YgdGhlIGRpc2sgd2l0aCB0aGUgc3RhcnQgb2YgdGhlIGNlbnRyYWwgZGlyZWN0b3J5ICovCisgICAgaWYgKHppcDY0bG9jYWxfZ2V0TG9uZygmcHppaW5pdC0+el9maWxlZnVuYywgcHppaW5pdC0+ZmlsZXN0cmVhbSwmbnVtYmVyX2Rpc2tfd2l0aF9DRCkhPVpJUF9PSykKKyAgICAgIGVycj1aSVBfRVJSTk87CisKKyAgICAvKiB0b3RhbCBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgY2VudHJhbCBkaXJlY3Rvcnkgb24gdGhpcyBkaXNrICovCisgICAgaWYgKHppcDY0bG9jYWxfZ2V0TG9uZzY0KCZwemlpbml0LT56X2ZpbGVmdW5jLCBwemlpbml0LT5maWxlc3RyZWFtLCAmbnVtYmVyX2VudHJ5KSE9WklQX09LKQorICAgICAgZXJyPVpJUF9FUlJOTzsKKworICAgIC8qIHRvdGFsIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBjZW50cmFsIGRpcmVjdG9yeSAqLworICAgIGlmICh6aXA2NGxvY2FsX2dldExvbmc2NCgmcHppaW5pdC0+el9maWxlZnVuYywgcHppaW5pdC0+ZmlsZXN0cmVhbSwmbnVtYmVyX2VudHJ5X0NEKSE9WklQX09LKQorICAgICAgZXJyPVpJUF9FUlJOTzsKKworICAgIGlmICgobnVtYmVyX2VudHJ5X0NEIT1udW1iZXJfZW50cnkpIHx8IChudW1iZXJfZGlza193aXRoX0NEIT0wKSB8fCAobnVtYmVyX2Rpc2shPTApKQorICAgICAgZXJyPVpJUF9CQURaSVBGSUxFOworCisgICAgLyogc2l6ZSBvZiB0aGUgY2VudHJhbCBkaXJlY3RvcnkgKi8KKyAgICBpZiAoemlwNjRsb2NhbF9nZXRMb25nNjQoJnB6aWluaXQtPnpfZmlsZWZ1bmMsIHB6aWluaXQtPmZpbGVzdHJlYW0sJnNpemVfY2VudHJhbF9kaXIpIT1aSVBfT0spCisgICAgICBlcnI9WklQX0VSUk5POworCisgICAgLyogb2Zmc2V0IG9mIHN0YXJ0IG9mIGNlbnRyYWwgZGlyZWN0b3J5IHdpdGggcmVzcGVjdCB0byB0aGUKKyAgICBzdGFydGluZyBkaXNrIG51bWJlciAqLworICAgIGlmICh6aXA2NGxvY2FsX2dldExvbmc2NCgmcHppaW5pdC0+el9maWxlZnVuYywgcHppaW5pdC0+ZmlsZXN0cmVhbSwmb2Zmc2V0X2NlbnRyYWxfZGlyKSE9WklQX09LKQorICAgICAgZXJyPVpJUF9FUlJOTzsKKworICAgIC8vIFRPRE8uLgorICAgIC8vIHJlYWQgdGhlIGNvbW1lbnQgZnJvbSB0aGUgc3RhbmRhcmQgY2VudHJhbCBoZWFkZXIuCisgICAgc2l6ZV9jb21tZW50ID0gMDsKKyAgfQorICBlbHNlCisgIHsKKyAgICAvLyBSZWFkIEVuZCBvZiBjZW50cmFsIERpcmVjdG9yeSBpbmZvCisgICAgaWYgKFpTRUVLNjQocHppaW5pdC0+el9maWxlZnVuYywgcHppaW5pdC0+ZmlsZXN0cmVhbSwgY2VudHJhbF9wb3MsWkxJQl9GSUxFRlVOQ19TRUVLX1NFVCkhPTApCisgICAgICBlcnI9WklQX0VSUk5POworCisgICAgLyogdGhlIHNpZ25hdHVyZSwgYWxyZWFkeSBjaGVja2VkICovCisgICAgaWYgKHppcDY0bG9jYWxfZ2V0TG9uZygmcHppaW5pdC0+el9maWxlZnVuYywgcHppaW5pdC0+ZmlsZXN0cmVhbSwmdUwpIT1aSVBfT0spCisgICAgICBlcnI9WklQX0VSUk5POworCisgICAgLyogbnVtYmVyIG9mIHRoaXMgZGlzayAqLworICAgIGlmICh6aXA2NGxvY2FsX2dldFNob3J0KCZwemlpbml0LT56X2ZpbGVmdW5jLCBwemlpbml0LT5maWxlc3RyZWFtLCZudW1iZXJfZGlzaykhPVpJUF9PSykKKyAgICAgIGVycj1aSVBfRVJSTk87CisKKyAgICAvKiBudW1iZXIgb2YgdGhlIGRpc2sgd2l0aCB0aGUgc3RhcnQgb2YgdGhlIGNlbnRyYWwgZGlyZWN0b3J5ICovCisgICAgaWYgKHppcDY0bG9jYWxfZ2V0U2hvcnQoJnB6aWluaXQtPnpfZmlsZWZ1bmMsIHB6aWluaXQtPmZpbGVzdHJlYW0sJm51bWJlcl9kaXNrX3dpdGhfQ0QpIT1aSVBfT0spCisgICAgICBlcnI9WklQX0VSUk5POworCisgICAgLyogdG90YWwgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGNlbnRyYWwgZGlyIG9uIHRoaXMgZGlzayAqLworICAgIG51bWJlcl9lbnRyeSA9IDA7CisgICAgaWYgKHppcDY0bG9jYWxfZ2V0U2hvcnQoJnB6aWluaXQtPnpfZmlsZWZ1bmMsIHB6aWluaXQtPmZpbGVzdHJlYW0sICZ1TCkhPVpJUF9PSykKKyAgICAgIGVycj1aSVBfRVJSTk87CisgICAgZWxzZQorICAgICAgbnVtYmVyX2VudHJ5ID0gdUw7CisKKyAgICAvKiB0b3RhbCBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgY2VudHJhbCBkaXIgKi8KKyAgICBudW1iZXJfZW50cnlfQ0QgPSAwOworICAgIGlmICh6aXA2NGxvY2FsX2dldFNob3J0KCZwemlpbml0LT56X2ZpbGVmdW5jLCBwemlpbml0LT5maWxlc3RyZWFtLCAmdUwpIT1aSVBfT0spCisgICAgICBlcnI9WklQX0VSUk5POworICAgIGVsc2UKKyAgICAgIG51bWJlcl9lbnRyeV9DRCA9IHVMOworCisgICAgaWYgKChudW1iZXJfZW50cnlfQ0QhPW51bWJlcl9lbnRyeSkgfHwgKG51bWJlcl9kaXNrX3dpdGhfQ0QhPTApIHx8IChudW1iZXJfZGlzayE9MCkpCisgICAgICBlcnI9WklQX0JBRFpJUEZJTEU7CisKKyAgICAvKiBzaXplIG9mIHRoZSBjZW50cmFsIGRpcmVjdG9yeSAqLworICAgIHNpemVfY2VudHJhbF9kaXIgPSAwOworICAgIGlmICh6aXA2NGxvY2FsX2dldExvbmcoJnB6aWluaXQtPnpfZmlsZWZ1bmMsIHB6aWluaXQtPmZpbGVzdHJlYW0sICZ1TCkhPVpJUF9PSykKKyAgICAgIGVycj1aSVBfRVJSTk87CisgICAgZWxzZQorICAgICAgc2l6ZV9jZW50cmFsX2RpciA9IHVMOworCisgICAgLyogb2Zmc2V0IG9mIHN0YXJ0IG9mIGNlbnRyYWwgZGlyZWN0b3J5IHdpdGggcmVzcGVjdCB0byB0aGUgc3RhcnRpbmcgZGlzayBudW1iZXIgKi8KKyAgICBvZmZzZXRfY2VudHJhbF9kaXIgPSAwOworICAgIGlmICh6aXA2NGxvY2FsX2dldExvbmcoJnB6aWluaXQtPnpfZmlsZWZ1bmMsIHB6aWluaXQtPmZpbGVzdHJlYW0sICZ1TCkhPVpJUF9PSykKKyAgICAgIGVycj1aSVBfRVJSTk87CisgICAgZWxzZQorICAgICAgb2Zmc2V0X2NlbnRyYWxfZGlyID0gdUw7CisKKworICAgIC8qIHppcGZpbGUgZ2xvYmFsIGNvbW1lbnQgbGVuZ3RoICovCisgICAgaWYgKHppcDY0bG9jYWxfZ2V0U2hvcnQoJnB6aWluaXQtPnpfZmlsZWZ1bmMsIHB6aWluaXQtPmZpbGVzdHJlYW0sICZzaXplX2NvbW1lbnQpIT1aSVBfT0spCisgICAgICBlcnI9WklQX0VSUk5POworICB9CisKKyAgaWYgKChjZW50cmFsX3BvczxvZmZzZXRfY2VudHJhbF9kaXIrc2l6ZV9jZW50cmFsX2RpcikgJiYKKyAgICAoZXJyPT1aSVBfT0spKQorICAgIGVycj1aSVBfQkFEWklQRklMRTsKKworICBpZiAoZXJyIT1aSVBfT0spCisgIHsKKyAgICBaQ0xPU0U2NChwemlpbml0LT56X2ZpbGVmdW5jLCBwemlpbml0LT5maWxlc3RyZWFtKTsKKyAgICByZXR1cm4gWklQX0VSUk5POworICB9CisKKyAgaWYgKHNpemVfY29tbWVudD4wKQorICB7CisgICAgcHppaW5pdC0+Z2xvYmFsY29tbWVudCA9IChjaGFyKilBTExPQyhzaXplX2NvbW1lbnQrMSk7CisgICAgaWYgKHB6aWluaXQtPmdsb2JhbGNvbW1lbnQpCisgICAgeworICAgICAgc2l6ZV9jb21tZW50ID0gWlJFQUQ2NChwemlpbml0LT56X2ZpbGVmdW5jLCBwemlpbml0LT5maWxlc3RyZWFtLCBwemlpbml0LT5nbG9iYWxjb21tZW50LHNpemVfY29tbWVudCk7CisgICAgICBwemlpbml0LT5nbG9iYWxjb21tZW50W3NpemVfY29tbWVudF09MDsKKyAgICB9CisgIH0KKworICBieXRlX2JlZm9yZV90aGVfemlwZmlsZSA9IGNlbnRyYWxfcG9zIC0gKG9mZnNldF9jZW50cmFsX2RpcitzaXplX2NlbnRyYWxfZGlyKTsKKyAgcHppaW5pdC0+YWRkX3Bvc2l0aW9uX3doZW5fd3JpdHRpbmdfb2Zmc2V0ID0gYnl0ZV9iZWZvcmVfdGhlX3ppcGZpbGU7CisKKyAgeworICAgIFpQT1M2NF9UIHNpemVfY2VudHJhbF9kaXJfdG9fcmVhZCA9IHNpemVfY2VudHJhbF9kaXI7CisgICAgc2l6ZV90IGJ1Zl9zaXplID0gU0laRURBVEFfSU5EQVRBQkxPQ0s7CisgICAgdm9pZCogYnVmX3JlYWQgPSAodm9pZCopQUxMT0MoYnVmX3NpemUpOworICAgIGlmIChaU0VFSzY0KHB6aWluaXQtPnpfZmlsZWZ1bmMsIHB6aWluaXQtPmZpbGVzdHJlYW0sIG9mZnNldF9jZW50cmFsX2RpciArIGJ5dGVfYmVmb3JlX3RoZV96aXBmaWxlLCBaTElCX0ZJTEVGVU5DX1NFRUtfU0VUKSAhPSAwKQorICAgICAgZXJyPVpJUF9FUlJOTzsKKworICAgIHdoaWxlICgoc2l6ZV9jZW50cmFsX2Rpcl90b19yZWFkPjApICYmIChlcnI9PVpJUF9PSykpCisgICAgeworICAgICAgWlBPUzY0X1QgcmVhZF90aGlzID0gU0laRURBVEFfSU5EQVRBQkxPQ0s7CisgICAgICBpZiAocmVhZF90aGlzID4gc2l6ZV9jZW50cmFsX2Rpcl90b19yZWFkKQorICAgICAgICByZWFkX3RoaXMgPSBzaXplX2NlbnRyYWxfZGlyX3RvX3JlYWQ7CisKKyAgICAgIGlmIChaUkVBRDY0KHB6aWluaXQtPnpfZmlsZWZ1bmMsIHB6aWluaXQtPmZpbGVzdHJlYW0sYnVmX3JlYWQsKHVMb25nKXJlYWRfdGhpcykgIT0gcmVhZF90aGlzKQorICAgICAgICBlcnI9WklQX0VSUk5POworCisgICAgICBpZiAoZXJyPT1aSVBfT0spCisgICAgICAgIGVyciA9IGFkZF9kYXRhX2luX2RhdGFibG9jaygmcHppaW5pdC0+Y2VudHJhbF9kaXIsYnVmX3JlYWQsICh1TG9uZylyZWFkX3RoaXMpOworCisgICAgICBzaXplX2NlbnRyYWxfZGlyX3RvX3JlYWQtPXJlYWRfdGhpczsKKyAgICB9CisgICAgVFJZRlJFRShidWZfcmVhZCk7CisgIH0KKyAgcHppaW5pdC0+YmVnaW5fcG9zID0gYnl0ZV9iZWZvcmVfdGhlX3ppcGZpbGU7CisgIHB6aWluaXQtPm51bWJlcl9lbnRyeSA9IG51bWJlcl9lbnRyeV9DRDsKKworICBpZiAoWlNFRUs2NChwemlpbml0LT56X2ZpbGVmdW5jLCBwemlpbml0LT5maWxlc3RyZWFtLCBvZmZzZXRfY2VudHJhbF9kaXIrYnl0ZV9iZWZvcmVfdGhlX3ppcGZpbGUsWkxJQl9GSUxFRlVOQ19TRUVLX1NFVCkgIT0gMCkKKyAgICBlcnI9WklQX0VSUk5POworCisgIHJldHVybiBlcnI7Cit9CisKKworI2VuZGlmIC8qICFOT19BRERGSUxFSU5FWElTVElOR1pJUCovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2V4dGVybiB6aXBGaWxlIFpFWFBPUlQgemlwT3BlbjMgKGNvbnN0IHZvaWQgKnBhdGhuYW1lLCBpbnQgYXBwZW5kLCB6aXBjaGFycGMqIGdsb2JhbGNvbW1lbnQsIHpsaWJfZmlsZWZ1bmM2NF8zMl9kZWYqIHB6bGliX2ZpbGVmdW5jNjRfMzJfZGVmKQoreworICAgIHppcDY0X2ludGVybmFsIHppaW5pdDsKKyAgICB6aXA2NF9pbnRlcm5hbCogemk7CisgICAgaW50IGVycj1aSVBfT0s7CisKKyAgICB6aWluaXQuel9maWxlZnVuYy56c2VlazMyX2ZpbGUgPSBOVUxMOworICAgIHppaW5pdC56X2ZpbGVmdW5jLnp0ZWxsMzJfZmlsZSA9IE5VTEw7CisgICAgaWYgKHB6bGliX2ZpbGVmdW5jNjRfMzJfZGVmPT1OVUxMKQorICAgICAgICBmaWxsX2ZvcGVuNjRfZmlsZWZ1bmMoJnppaW5pdC56X2ZpbGVmdW5jLnpmaWxlX2Z1bmM2NCk7CisgICAgZWxzZQorICAgICAgICB6aWluaXQuel9maWxlZnVuYyA9ICpwemxpYl9maWxlZnVuYzY0XzMyX2RlZjsKKworICAgIHppaW5pdC5maWxlc3RyZWFtID0gWk9QRU42NCh6aWluaXQuel9maWxlZnVuYywKKyAgICAgICAgICAgICAgICAgIHBhdGhuYW1lLAorICAgICAgICAgICAgICAgICAgKGFwcGVuZCA9PSBBUFBFTkRfU1RBVFVTX0NSRUFURSkgPworICAgICAgICAgICAgICAgICAgKFpMSUJfRklMRUZVTkNfTU9ERV9SRUFEIHwgWkxJQl9GSUxFRlVOQ19NT0RFX1dSSVRFIHwgWkxJQl9GSUxFRlVOQ19NT0RFX0NSRUFURSkgOgorICAgICAgICAgICAgICAgICAgICAoWkxJQl9GSUxFRlVOQ19NT0RFX1JFQUQgfCBaTElCX0ZJTEVGVU5DX01PREVfV1JJVEUgfCBaTElCX0ZJTEVGVU5DX01PREVfRVhJU1RJTkcpKTsKKworICAgIGlmICh6aWluaXQuZmlsZXN0cmVhbSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGlmIChhcHBlbmQgPT0gQVBQRU5EX1NUQVRVU19DUkVBVEVBRlRFUikKKyAgICAgICAgWlNFRUs2NCh6aWluaXQuel9maWxlZnVuYyx6aWluaXQuZmlsZXN0cmVhbSwwLFNFRUtfRU5EKTsKKworICAgIHppaW5pdC5iZWdpbl9wb3MgPSBaVEVMTDY0KHppaW5pdC56X2ZpbGVmdW5jLHppaW5pdC5maWxlc3RyZWFtKTsKKyAgICB6aWluaXQuaW5fb3BlbmVkX2ZpbGVfaW56aXAgPSAwOworICAgIHppaW5pdC5jaS5zdHJlYW1faW5pdGlhbGlzZWQgPSAwOworICAgIHppaW5pdC5udW1iZXJfZW50cnkgPSAwOworICAgIHppaW5pdC5hZGRfcG9zaXRpb25fd2hlbl93cml0dGluZ19vZmZzZXQgPSAwOworICAgIGluaXRfbGlua2VkbGlzdCgmKHppaW5pdC5jZW50cmFsX2RpcikpOworCisKKworICAgIHppID0gKHppcDY0X2ludGVybmFsKilBTExPQyhzaXplb2YoemlwNjRfaW50ZXJuYWwpKTsKKyAgICBpZiAoemk9PU5VTEwpCisgICAgeworICAgICAgICBaQ0xPU0U2NCh6aWluaXQuel9maWxlZnVuYyx6aWluaXQuZmlsZXN0cmVhbSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIC8qIG5vdyB3ZSBhZGQgZmlsZSBpbiBhIHppcGZpbGUgKi8KKyMgICAgaWZuZGVmIE5PX0FEREZJTEVJTkVYSVNUSU5HWklQCisgICAgemlpbml0Lmdsb2JhbGNvbW1lbnQgPSBOVUxMOworICAgIGlmIChhcHBlbmQgPT0gQVBQRU5EX1NUQVRVU19BRERJTlpJUCkKKyAgICB7CisgICAgICAvLyBSZWFkIGFuZCBDYWNoZSBDZW50cmFsIERpcmVjdG9yeSBSZWNvcmRzCisgICAgICBlcnIgPSBMb2FkQ2VudHJhbERpcmVjdG9yeVJlY29yZCgmemlpbml0KTsKKyAgICB9CisKKyAgICBpZiAoZ2xvYmFsY29tbWVudCkKKyAgICB7CisgICAgICAqZ2xvYmFsY29tbWVudCA9IHppaW5pdC5nbG9iYWxjb21tZW50OworICAgIH0KKyMgICAgZW5kaWYgLyogIU5PX0FEREZJTEVJTkVYSVNUSU5HWklQKi8KKworICAgIGlmIChlcnIgIT0gWklQX09LKQorICAgIHsKKyMgICAgaWZuZGVmIE5PX0FEREZJTEVJTkVYSVNUSU5HWklQCisgICAgICAgIFRSWUZSRUUoemlpbml0Lmdsb2JhbGNvbW1lbnQpOworIyAgICBlbmRpZiAvKiAhTk9fQURERklMRUlORVhJU1RJTkdaSVAqLworICAgICAgICBUUllGUkVFKHppKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgICp6aSA9IHppaW5pdDsKKyAgICAgICAgcmV0dXJuICh6aXBGaWxlKXppOworICAgIH0KK30KKworZXh0ZXJuIHppcEZpbGUgWkVYUE9SVCB6aXBPcGVuMiAoY29uc3QgY2hhciAqcGF0aG5hbWUsIGludCBhcHBlbmQsIHppcGNoYXJwYyogZ2xvYmFsY29tbWVudCwgemxpYl9maWxlZnVuY19kZWYqIHB6bGliX2ZpbGVmdW5jMzJfZGVmKQoreworICAgIGlmIChwemxpYl9maWxlZnVuYzMyX2RlZiAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgemxpYl9maWxlZnVuYzY0XzMyX2RlZiB6bGliX2ZpbGVmdW5jNjRfMzJfZGVmX2ZpbGw7CisgICAgICAgIGZpbGxfemxpYl9maWxlZnVuYzY0XzMyX2RlZl9mcm9tX2ZpbGVmdW5jMzIoJnpsaWJfZmlsZWZ1bmM2NF8zMl9kZWZfZmlsbCxwemxpYl9maWxlZnVuYzMyX2RlZik7CisgICAgICAgIHJldHVybiB6aXBPcGVuMyhwYXRobmFtZSwgYXBwZW5kLCBnbG9iYWxjb21tZW50LCAmemxpYl9maWxlZnVuYzY0XzMyX2RlZl9maWxsKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICByZXR1cm4gemlwT3BlbjMocGF0aG5hbWUsIGFwcGVuZCwgZ2xvYmFsY29tbWVudCwgTlVMTCk7Cit9CisKK2V4dGVybiB6aXBGaWxlIFpFWFBPUlQgemlwT3BlbjJfNjQgKGNvbnN0IHZvaWQgKnBhdGhuYW1lLCBpbnQgYXBwZW5kLCB6aXBjaGFycGMqIGdsb2JhbGNvbW1lbnQsIHpsaWJfZmlsZWZ1bmM2NF9kZWYqIHB6bGliX2ZpbGVmdW5jX2RlZikKK3sKKyAgICBpZiAocHpsaWJfZmlsZWZ1bmNfZGVmICE9IE5VTEwpCisgICAgeworICAgICAgICB6bGliX2ZpbGVmdW5jNjRfMzJfZGVmIHpsaWJfZmlsZWZ1bmM2NF8zMl9kZWZfZmlsbDsKKyAgICAgICAgemxpYl9maWxlZnVuYzY0XzMyX2RlZl9maWxsLnpmaWxlX2Z1bmM2NCA9ICpwemxpYl9maWxlZnVuY19kZWY7CisgICAgICAgIHpsaWJfZmlsZWZ1bmM2NF8zMl9kZWZfZmlsbC56dGVsbDMyX2ZpbGUgPSBOVUxMOworICAgICAgICB6bGliX2ZpbGVmdW5jNjRfMzJfZGVmX2ZpbGwuenNlZWszMl9maWxlID0gTlVMTDsKKyAgICAgICAgcmV0dXJuIHppcE9wZW4zKHBhdGhuYW1lLCBhcHBlbmQsIGdsb2JhbGNvbW1lbnQsICZ6bGliX2ZpbGVmdW5jNjRfMzJfZGVmX2ZpbGwpOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldHVybiB6aXBPcGVuMyhwYXRobmFtZSwgYXBwZW5kLCBnbG9iYWxjb21tZW50LCBOVUxMKTsKK30KKworCisKK2V4dGVybiB6aXBGaWxlIFpFWFBPUlQgemlwT3BlbiAoY29uc3QgY2hhciogcGF0aG5hbWUsIGludCBhcHBlbmQpCit7CisgICAgcmV0dXJuIHppcE9wZW4zKChjb25zdCB2b2lkKilwYXRobmFtZSxhcHBlbmQsTlVMTCxOVUxMKTsKK30KKworZXh0ZXJuIHppcEZpbGUgWkVYUE9SVCB6aXBPcGVuNjQgKGNvbnN0IHZvaWQqIHBhdGhuYW1lLCBpbnQgYXBwZW5kKQoreworICAgIHJldHVybiB6aXBPcGVuMyhwYXRobmFtZSxhcHBlbmQsTlVMTCxOVUxMKTsKK30KKworaW50IFdyaXRlX0xvY2FsRmlsZUhlYWRlcih6aXA2NF9pbnRlcm5hbCogemksIGNvbnN0IGNoYXIqIGZpbGVuYW1lLCB1SW50IHNpemVfZXh0cmFmaWVsZF9sb2NhbCwgY29uc3Qgdm9pZCogZXh0cmFmaWVsZF9sb2NhbCkKK3sKKyAgLyogd3JpdGUgdGhlIGxvY2FsIGhlYWRlciAqLworICBpbnQgZXJyOworICB1SW50IHNpemVfZmlsZW5hbWUgPSAodUludClzdHJsZW4oZmlsZW5hbWUpOworICB1SW50IHNpemVfZXh0cmFmaWVsZCA9IHNpemVfZXh0cmFmaWVsZF9sb2NhbDsKKworICBlcnIgPSB6aXA2NGxvY2FsX3B1dFZhbHVlKCZ6aS0+el9maWxlZnVuYyx6aS0+ZmlsZXN0cmVhbSwodUxvbmcpTE9DQUxIRUFERVJNQUdJQywgNCk7CisKKyAgaWYgKGVycj09WklQX09LKQorICB7CisgICAgaWYoemktPmNpLnppcDY0KQorICAgICAgZXJyID0gemlwNjRsb2NhbF9wdXRWYWx1ZSgmemktPnpfZmlsZWZ1bmMsemktPmZpbGVzdHJlYW0sKHVMb25nKTQ1LDIpOy8qIHZlcnNpb24gbmVlZGVkIHRvIGV4dHJhY3QgKi8KKyAgICBlbHNlCisgICAgICBlcnIgPSB6aXA2NGxvY2FsX3B1dFZhbHVlKCZ6aS0+el9maWxlZnVuYyx6aS0+ZmlsZXN0cmVhbSwodUxvbmcpMjAsMik7LyogdmVyc2lvbiBuZWVkZWQgdG8gZXh0cmFjdCAqLworICB9CisKKyAgaWYgKGVycj09WklQX09LKQorICAgIGVyciA9IHppcDY0bG9jYWxfcHV0VmFsdWUoJnppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtLCh1TG9uZyl6aS0+Y2kuZmxhZywyKTsKKworICBpZiAoZXJyPT1aSVBfT0spCisgICAgZXJyID0gemlwNjRsb2NhbF9wdXRWYWx1ZSgmemktPnpfZmlsZWZ1bmMsemktPmZpbGVzdHJlYW0sKHVMb25nKXppLT5jaS5tZXRob2QsMik7CisKKyAgaWYgKGVycj09WklQX09LKQorICAgIGVyciA9IHppcDY0bG9jYWxfcHV0VmFsdWUoJnppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtLCh1TG9uZyl6aS0+Y2kuZG9zRGF0ZSw0KTsKKworICAvLyBDUkMgLyBDb21wcmVzc2VkIHNpemUgLyBVbmNvbXByZXNzZWQgc2l6ZSB3aWxsIGJlIGZpbGxlZCBpbiBsYXRlciBhbmQgcmV3cml0dGVuIGxhdGVyCisgIGlmIChlcnI9PVpJUF9PSykKKyAgICBlcnIgPSB6aXA2NGxvY2FsX3B1dFZhbHVlKCZ6aS0+el9maWxlZnVuYyx6aS0+ZmlsZXN0cmVhbSwodUxvbmcpMCw0KTsgLyogY3JjIDMyLCB1bmtub3duICovCisgIGlmIChlcnI9PVpJUF9PSykKKyAgeworICAgIGlmKHppLT5jaS56aXA2NCkKKyAgICAgIGVyciA9IHppcDY0bG9jYWxfcHV0VmFsdWUoJnppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtLCh1TG9uZykweEZGRkZGRkZGLDQpOyAvKiBjb21wcmVzc2VkIHNpemUsIHVua25vd24gKi8KKyAgICBlbHNlCisgICAgICBlcnIgPSB6aXA2NGxvY2FsX3B1dFZhbHVlKCZ6aS0+el9maWxlZnVuYyx6aS0+ZmlsZXN0cmVhbSwodUxvbmcpMCw0KTsgLyogY29tcHJlc3NlZCBzaXplLCB1bmtub3duICovCisgIH0KKyAgaWYgKGVycj09WklQX09LKQorICB7CisgICAgaWYoemktPmNpLnppcDY0KQorICAgICAgZXJyID0gemlwNjRsb2NhbF9wdXRWYWx1ZSgmemktPnpfZmlsZWZ1bmMsemktPmZpbGVzdHJlYW0sKHVMb25nKTB4RkZGRkZGRkYsNCk7IC8qIHVuY29tcHJlc3NlZCBzaXplLCB1bmtub3duICovCisgICAgZWxzZQorICAgICAgZXJyID0gemlwNjRsb2NhbF9wdXRWYWx1ZSgmemktPnpfZmlsZWZ1bmMsemktPmZpbGVzdHJlYW0sKHVMb25nKTAsNCk7IC8qIHVuY29tcHJlc3NlZCBzaXplLCB1bmtub3duICovCisgIH0KKworICBpZiAoZXJyPT1aSVBfT0spCisgICAgZXJyID0gemlwNjRsb2NhbF9wdXRWYWx1ZSgmemktPnpfZmlsZWZ1bmMsemktPmZpbGVzdHJlYW0sKHVMb25nKXNpemVfZmlsZW5hbWUsMik7CisKKyAgaWYoemktPmNpLnppcDY0KQorICB7CisgICAgc2l6ZV9leHRyYWZpZWxkICs9IDIwOworICB9CisKKyAgaWYgKGVycj09WklQX09LKQorICAgIGVyciA9IHppcDY0bG9jYWxfcHV0VmFsdWUoJnppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtLCh1TG9uZylzaXplX2V4dHJhZmllbGQsMik7CisKKyAgaWYgKChlcnI9PVpJUF9PSykgJiYgKHNpemVfZmlsZW5hbWUgPiAwKSkKKyAgeworICAgIGlmIChaV1JJVEU2NCh6aS0+el9maWxlZnVuYyx6aS0+ZmlsZXN0cmVhbSxmaWxlbmFtZSxzaXplX2ZpbGVuYW1lKSE9c2l6ZV9maWxlbmFtZSkKKyAgICAgIGVyciA9IFpJUF9FUlJOTzsKKyAgfQorCisgIGlmICgoZXJyPT1aSVBfT0spICYmIChzaXplX2V4dHJhZmllbGRfbG9jYWwgPiAwKSkKKyAgeworICAgIGlmIChaV1JJVEU2NCh6aS0+el9maWxlZnVuYywgemktPmZpbGVzdHJlYW0sIGV4dHJhZmllbGRfbG9jYWwsIHNpemVfZXh0cmFmaWVsZF9sb2NhbCkgIT0gc2l6ZV9leHRyYWZpZWxkX2xvY2FsKQorICAgICAgZXJyID0gWklQX0VSUk5POworICB9CisKKworICBpZiAoKGVycj09WklQX09LKSAmJiAoemktPmNpLnppcDY0KSkKKyAgeworICAgICAgLy8gd3JpdGUgdGhlIFppcDY0IGV4dGVuZGVkIGluZm8KKyAgICAgIHNob3J0IEhlYWRlcklEID0gMTsKKyAgICAgIHNob3J0IERhdGFTaXplID0gMTY7CisgICAgICBaUE9TNjRfVCBDb21wcmVzc2VkU2l6ZSA9IDA7CisgICAgICBaUE9TNjRfVCBVbmNvbXByZXNzZWRTaXplID0gMDsKKworICAgICAgLy8gUmVtZW1iZXIgcG9zaXRpb24gb2YgWmlwNjQgZXh0ZW5kZWQgaW5mbyBmb3IgdGhlIGxvY2FsIGZpbGUgaGVhZGVyLiAobmVlZGVkIHdoZW4gd2UgdXBkYXRlIHNpemUgYWZ0ZXIgZG9uZSB3aXRoIGZpbGUpCisgICAgICB6aS0+Y2kucG9zX3ppcDY0ZXh0cmFpbmZvID0gWlRFTEw2NCh6aS0+el9maWxlZnVuYyx6aS0+ZmlsZXN0cmVhbSk7CisKKyAgICAgIGVyciA9IHppcDY0bG9jYWxfcHV0VmFsdWUoJnppLT56X2ZpbGVmdW5jLCB6aS0+ZmlsZXN0cmVhbSwgKHNob3J0KUhlYWRlcklELDIpOworICAgICAgZXJyID0gemlwNjRsb2NhbF9wdXRWYWx1ZSgmemktPnpfZmlsZWZ1bmMsIHppLT5maWxlc3RyZWFtLCAoc2hvcnQpRGF0YVNpemUsMik7CisKKyAgICAgIGVyciA9IHppcDY0bG9jYWxfcHV0VmFsdWUoJnppLT56X2ZpbGVmdW5jLCB6aS0+ZmlsZXN0cmVhbSwgKFpQT1M2NF9UKVVuY29tcHJlc3NlZFNpemUsOCk7CisgICAgICBlcnIgPSB6aXA2NGxvY2FsX3B1dFZhbHVlKCZ6aS0+el9maWxlZnVuYywgemktPmZpbGVzdHJlYW0sIChaUE9TNjRfVClDb21wcmVzc2VkU2l6ZSw4KTsKKyAgfQorCisgIHJldHVybiBlcnI7Cit9CisKKy8qCisgTk9URS4KKyBXaGVuIHdyaXRpbmcgUkFXIHRoZSBaSVA2NCBleHRlbmRlZCBpbmZvcm1hdGlvbiBpbiBleHRyYWZpZWxkX2xvY2FsIGFuZCBleHRyYWZpZWxkX2dsb2JhbCBuZWVkcyB0byBiZSBzdHJpcHBlZAorIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gaXQgY2FuIGJlIGRvbmUgd2l0aCB6aXBSZW1vdmVFeHRyYUluZm9CbG9jaworCisgSXQgaXMgbm90IGRvbmUgaGVyZSBiZWNhdXNlIHRoZW4gd2UgbmVlZCB0byByZWFsbG9jIGEgbmV3IGJ1ZmZlciBzaW5jZSBwYXJhbWV0ZXJzIGFyZSAnY29uc3QnIGFuZCBJIHdhbnQgdG8gbWluaW1pemUKKyB1bm5lY2Vzc2FyeSBhbGxvY2F0aW9ucy4KKyAqLworZXh0ZXJuIGludCBaRVhQT1JUIHppcE9wZW5OZXdGaWxlSW5aaXA0XzY0ICh6aXBGaWxlIGZpbGUsIGNvbnN0IGNoYXIqIGZpbGVuYW1lLCBjb25zdCB6aXBfZmlsZWluZm8qIHppcGZpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBleHRyYWZpZWxkX2xvY2FsLCB1SW50IHNpemVfZXh0cmFmaWVsZF9sb2NhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogZXh0cmFmaWVsZF9nbG9iYWwsIHVJbnQgc2l6ZV9leHRyYWZpZWxkX2dsb2JhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogY29tbWVudCwgaW50IG1ldGhvZCwgaW50IGxldmVsLCBpbnQgcmF3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2luZG93Qml0cyxpbnQgbWVtTGV2ZWwsIGludCBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcGFzc3dvcmQsIHVMb25nIGNyY0ZvckNyeXB0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1TG9uZyB2ZXJzaW9uTWFkZUJ5LCB1TG9uZyBmbGFnQmFzZSwgaW50IHppcDY0KQoreworICAgIHppcDY0X2ludGVybmFsKiB6aTsKKyAgICB1SW50IHNpemVfZmlsZW5hbWU7CisgICAgdUludCBzaXplX2NvbW1lbnQ7CisgICAgdUludCBpOworICAgIGludCBlcnIgPSBaSVBfT0s7CisKKyMgICAgaWZkZWYgTk9DUllQVAorICAgIChjcmNGb3JDcnlwdGluZyk7CisgICAgaWYgKHBhc3N3b3JkICE9IE5VTEwpCisgICAgICAgIHJldHVybiBaSVBfUEFSQU1FUlJPUjsKKyMgICAgZW5kaWYKKworICAgIGlmIChmaWxlID09IE5VTEwpCisgICAgICAgIHJldHVybiBaSVBfUEFSQU1FUlJPUjsKKworI2lmZGVmIEhBVkVfQlpJUDIKKyAgICBpZiAoKG1ldGhvZCE9MCkgJiYgKG1ldGhvZCE9Wl9ERUZMQVRFRCkgJiYgKG1ldGhvZCE9Wl9CWklQMkVEKSkKKyAgICAgIHJldHVybiBaSVBfUEFSQU1FUlJPUjsKKyNlbHNlCisgICAgaWYgKChtZXRob2QhPTApICYmIChtZXRob2QhPVpfREVGTEFURUQpKQorICAgICAgcmV0dXJuIFpJUF9QQVJBTUVSUk9SOworI2VuZGlmCisKKyAgICB6aSA9ICh6aXA2NF9pbnRlcm5hbCopZmlsZTsKKworICAgIGlmICh6aS0+aW5fb3BlbmVkX2ZpbGVfaW56aXAgPT0gMSkKKyAgICB7CisgICAgICAgIGVyciA9IHppcENsb3NlRmlsZUluWmlwIChmaWxlKTsKKyAgICAgICAgaWYgKGVyciAhPSBaSVBfT0spCisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGlmIChmaWxlbmFtZT09TlVMTCkKKyAgICAgICAgZmlsZW5hbWU9Ii0iOworCisgICAgaWYgKGNvbW1lbnQ9PU5VTEwpCisgICAgICAgIHNpemVfY29tbWVudCA9IDA7CisgICAgZWxzZQorICAgICAgICBzaXplX2NvbW1lbnQgPSAodUludClzdHJsZW4oY29tbWVudCk7CisKKyAgICBzaXplX2ZpbGVuYW1lID0gKHVJbnQpc3RybGVuKGZpbGVuYW1lKTsKKworICAgIGlmICh6aXBmaSA9PSBOVUxMKQorICAgICAgICB6aS0+Y2kuZG9zRGF0ZSA9IDA7CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYgKHppcGZpLT5kb3NEYXRlICE9IDApCisgICAgICAgICAgICB6aS0+Y2kuZG9zRGF0ZSA9IHppcGZpLT5kb3NEYXRlOworICAgICAgICBlbHNlCisgICAgICAgICAgemktPmNpLmRvc0RhdGUgPSB6aXA2NGxvY2FsX1RtekRhdGVUb0Rvc0RhdGUoJnppcGZpLT50bXpfZGF0ZSk7CisgICAgfQorCisgICAgemktPmNpLmZsYWcgPSBmbGFnQmFzZTsKKyAgICBpZiAoKGxldmVsPT04KSB8fCAobGV2ZWw9PTkpKQorICAgICAgemktPmNpLmZsYWcgfD0gMjsKKyAgICBpZiAoKGxldmVsPT0yKSkKKyAgICAgIHppLT5jaS5mbGFnIHw9IDQ7CisgICAgaWYgKChsZXZlbD09MSkpCisgICAgICB6aS0+Y2kuZmxhZyB8PSA2OworICAgIGlmIChwYXNzd29yZCAhPSBOVUxMKQorICAgICAgemktPmNpLmZsYWcgfD0gMTsKKworICAgIHppLT5jaS5jcmMzMiA9IDA7CisgICAgemktPmNpLm1ldGhvZCA9IG1ldGhvZDsKKyAgICB6aS0+Y2kuZW5jcnlwdCA9IDA7CisgICAgemktPmNpLnN0cmVhbV9pbml0aWFsaXNlZCA9IDA7CisgICAgemktPmNpLnBvc19pbl9idWZmZXJlZF9kYXRhID0gMDsKKyAgICB6aS0+Y2kucmF3ID0gcmF3OworICAgIHppLT5jaS5wb3NfbG9jYWxfaGVhZGVyID0gWlRFTEw2NCh6aS0+el9maWxlZnVuYyx6aS0+ZmlsZXN0cmVhbSk7CisKKyAgICB6aS0+Y2kuc2l6ZV9jZW50cmFsaGVhZGVyID0gU0laRUNFTlRSQUxIRUFERVIgKyBzaXplX2ZpbGVuYW1lICsgc2l6ZV9leHRyYWZpZWxkX2dsb2JhbCArIHNpemVfY29tbWVudDsKKyAgICB6aS0+Y2kuc2l6ZV9jZW50cmFsRXh0cmFGcmVlID0gMzI7IC8vIEV4dHJhIHNwYWNlIHdlIGhhdmUgcmVzZXJ2ZWQgaW4gY2FzZSB3ZSBuZWVkIHRvIGFkZCBaSVA2NCBleHRyYSBpbmZvIGRhdGEKKworICAgIHppLT5jaS5jZW50cmFsX2hlYWRlciA9IChjaGFyKilBTExPQygodUludCl6aS0+Y2kuc2l6ZV9jZW50cmFsaGVhZGVyICsgemktPmNpLnNpemVfY2VudHJhbEV4dHJhRnJlZSk7CisKKyAgICB6aS0+Y2kuc2l6ZV9jZW50cmFsRXh0cmEgPSBzaXplX2V4dHJhZmllbGRfZ2xvYmFsOworICAgIHppcDY0bG9jYWxfcHV0VmFsdWVfaW5tZW1vcnkoemktPmNpLmNlbnRyYWxfaGVhZGVyLCh1TG9uZylDRU5UUkFMSEVBREVSTUFHSUMsNCk7CisgICAgLyogdmVyc2lvbiBpbmZvICovCisgICAgemlwNjRsb2NhbF9wdXRWYWx1ZV9pbm1lbW9yeSh6aS0+Y2kuY2VudHJhbF9oZWFkZXIrNCwodUxvbmcpdmVyc2lvbk1hZGVCeSwyKTsKKyAgICB6aXA2NGxvY2FsX3B1dFZhbHVlX2lubWVtb3J5KHppLT5jaS5jZW50cmFsX2hlYWRlcis2LCh1TG9uZykyMCwyKTsKKyAgICB6aXA2NGxvY2FsX3B1dFZhbHVlX2lubWVtb3J5KHppLT5jaS5jZW50cmFsX2hlYWRlcis4LCh1TG9uZyl6aS0+Y2kuZmxhZywyKTsKKyAgICB6aXA2NGxvY2FsX3B1dFZhbHVlX2lubWVtb3J5KHppLT5jaS5jZW50cmFsX2hlYWRlcisxMCwodUxvbmcpemktPmNpLm1ldGhvZCwyKTsKKyAgICB6aXA2NGxvY2FsX3B1dFZhbHVlX2lubWVtb3J5KHppLT5jaS5jZW50cmFsX2hlYWRlcisxMiwodUxvbmcpemktPmNpLmRvc0RhdGUsNCk7CisgICAgemlwNjRsb2NhbF9wdXRWYWx1ZV9pbm1lbW9yeSh6aS0+Y2kuY2VudHJhbF9oZWFkZXIrMTYsKHVMb25nKTAsNCk7IC8qY3JjKi8KKyAgICB6aXA2NGxvY2FsX3B1dFZhbHVlX2lubWVtb3J5KHppLT5jaS5jZW50cmFsX2hlYWRlcisyMCwodUxvbmcpMCw0KTsgLypjb21wciBzaXplKi8KKyAgICB6aXA2NGxvY2FsX3B1dFZhbHVlX2lubWVtb3J5KHppLT5jaS5jZW50cmFsX2hlYWRlcisyNCwodUxvbmcpMCw0KTsgLyp1bmNvbXByIHNpemUqLworICAgIHppcDY0bG9jYWxfcHV0VmFsdWVfaW5tZW1vcnkoemktPmNpLmNlbnRyYWxfaGVhZGVyKzI4LCh1TG9uZylzaXplX2ZpbGVuYW1lLDIpOworICAgIHppcDY0bG9jYWxfcHV0VmFsdWVfaW5tZW1vcnkoemktPmNpLmNlbnRyYWxfaGVhZGVyKzMwLCh1TG9uZylzaXplX2V4dHJhZmllbGRfZ2xvYmFsLDIpOworICAgIHppcDY0bG9jYWxfcHV0VmFsdWVfaW5tZW1vcnkoemktPmNpLmNlbnRyYWxfaGVhZGVyKzMyLCh1TG9uZylzaXplX2NvbW1lbnQsMik7CisgICAgemlwNjRsb2NhbF9wdXRWYWx1ZV9pbm1lbW9yeSh6aS0+Y2kuY2VudHJhbF9oZWFkZXIrMzQsKHVMb25nKTAsMik7IC8qZGlzayBubSBzdGFydCovCisKKyAgICBpZiAoemlwZmk9PU5VTEwpCisgICAgICAgIHppcDY0bG9jYWxfcHV0VmFsdWVfaW5tZW1vcnkoemktPmNpLmNlbnRyYWxfaGVhZGVyKzM2LCh1TG9uZykwLDIpOworICAgIGVsc2UKKyAgICAgICAgemlwNjRsb2NhbF9wdXRWYWx1ZV9pbm1lbW9yeSh6aS0+Y2kuY2VudHJhbF9oZWFkZXIrMzYsKHVMb25nKXppcGZpLT5pbnRlcm5hbF9mYSwyKTsKKworICAgIGlmICh6aXBmaT09TlVMTCkKKyAgICAgICAgemlwNjRsb2NhbF9wdXRWYWx1ZV9pbm1lbW9yeSh6aS0+Y2kuY2VudHJhbF9oZWFkZXIrMzgsKHVMb25nKTAsNCk7CisgICAgZWxzZQorICAgICAgICB6aXA2NGxvY2FsX3B1dFZhbHVlX2lubWVtb3J5KHppLT5jaS5jZW50cmFsX2hlYWRlciszOCwodUxvbmcpemlwZmktPmV4dGVybmFsX2ZhLDQpOworCisgICAgaWYoemktPmNpLnBvc19sb2NhbF9oZWFkZXIgPj0gMHhmZmZmZmZmZikKKyAgICAgIHppcDY0bG9jYWxfcHV0VmFsdWVfaW5tZW1vcnkoemktPmNpLmNlbnRyYWxfaGVhZGVyKzQyLCh1TG9uZykweGZmZmZmZmZmLDQpOworICAgIGVsc2UKKyAgICAgIHppcDY0bG9jYWxfcHV0VmFsdWVfaW5tZW1vcnkoemktPmNpLmNlbnRyYWxfaGVhZGVyKzQyLCh1TG9uZyl6aS0+Y2kucG9zX2xvY2FsX2hlYWRlciAtIHppLT5hZGRfcG9zaXRpb25fd2hlbl93cml0dGluZ19vZmZzZXQsNCk7CisKKyAgICBmb3IgKGk9MDtpPHNpemVfZmlsZW5hbWU7aSsrKQorICAgICAgICAqKHppLT5jaS5jZW50cmFsX2hlYWRlcitTSVpFQ0VOVFJBTEhFQURFUitpKSA9ICooZmlsZW5hbWUraSk7CisKKyAgICBmb3IgKGk9MDtpPHNpemVfZXh0cmFmaWVsZF9nbG9iYWw7aSsrKQorICAgICAgICAqKHppLT5jaS5jZW50cmFsX2hlYWRlcitTSVpFQ0VOVFJBTEhFQURFUitzaXplX2ZpbGVuYW1lK2kpID0KKyAgICAgICAgICAgICAgKigoKGNvbnN0IGNoYXIqKWV4dHJhZmllbGRfZ2xvYmFsKStpKTsKKworICAgIGZvciAoaT0wO2k8c2l6ZV9jb21tZW50O2krKykKKyAgICAgICAgKih6aS0+Y2kuY2VudHJhbF9oZWFkZXIrU0laRUNFTlRSQUxIRUFERVIrc2l6ZV9maWxlbmFtZSsKKyAgICAgICAgICAgICAgc2l6ZV9leHRyYWZpZWxkX2dsb2JhbCtpKSA9ICooY29tbWVudCtpKTsKKyAgICBpZiAoemktPmNpLmNlbnRyYWxfaGVhZGVyID09IE5VTEwpCisgICAgICAgIHJldHVybiBaSVBfSU5URVJOQUxFUlJPUjsKKworICAgIHppLT5jaS56aXA2NCA9IHppcDY0OworICAgIHppLT5jaS50b3RhbENvbXByZXNzZWREYXRhID0gMDsKKyAgICB6aS0+Y2kudG90YWxVbmNvbXByZXNzZWREYXRhID0gMDsKKyAgICB6aS0+Y2kucG9zX3ppcDY0ZXh0cmFpbmZvID0gMDsKKworICAgIGVyciA9IFdyaXRlX0xvY2FsRmlsZUhlYWRlcih6aSwgZmlsZW5hbWUsIHNpemVfZXh0cmFmaWVsZF9sb2NhbCwgZXh0cmFmaWVsZF9sb2NhbCk7CisKKyNpZmRlZiBIQVZFX0JaSVAyCisgICAgemktPmNpLmJzdHJlYW0uYXZhaWxfaW4gPSAodUludCkwOworICAgIHppLT5jaS5ic3RyZWFtLmF2YWlsX291dCA9ICh1SW50KVpfQlVGU0laRTsKKyAgICB6aS0+Y2kuYnN0cmVhbS5uZXh0X291dCA9IChjaGFyKil6aS0+Y2kuYnVmZmVyZWRfZGF0YTsKKyAgICB6aS0+Y2kuYnN0cmVhbS50b3RhbF9pbl9oaTMyID0gMDsKKyAgICB6aS0+Y2kuYnN0cmVhbS50b3RhbF9pbl9sbzMyID0gMDsKKyAgICB6aS0+Y2kuYnN0cmVhbS50b3RhbF9vdXRfaGkzMiA9IDA7CisgICAgemktPmNpLmJzdHJlYW0udG90YWxfb3V0X2xvMzIgPSAwOworI2VuZGlmCisKKyAgICB6aS0+Y2kuc3RyZWFtLmF2YWlsX2luID0gKHVJbnQpMDsKKyAgICB6aS0+Y2kuc3RyZWFtLmF2YWlsX291dCA9ICh1SW50KVpfQlVGU0laRTsKKyAgICB6aS0+Y2kuc3RyZWFtLm5leHRfb3V0ID0gemktPmNpLmJ1ZmZlcmVkX2RhdGE7CisgICAgemktPmNpLnN0cmVhbS50b3RhbF9pbiA9IDA7CisgICAgemktPmNpLnN0cmVhbS50b3RhbF9vdXQgPSAwOworICAgIHppLT5jaS5zdHJlYW0uZGF0YV90eXBlID0gWl9CSU5BUlk7CisKKyNpZmRlZiBIQVZFX0JaSVAyCisgICAgaWYgKChlcnI9PVpJUF9PSykgJiYgKHppLT5jaS5tZXRob2QgPT0gWl9ERUZMQVRFRCB8fCB6aS0+Y2kubWV0aG9kID09IFpfQlpJUDJFRCkgJiYgKCF6aS0+Y2kucmF3KSkKKyNlbHNlCisgICAgaWYgKChlcnI9PVpJUF9PSykgJiYgKHppLT5jaS5tZXRob2QgPT0gWl9ERUZMQVRFRCkgJiYgKCF6aS0+Y2kucmF3KSkKKyNlbmRpZgorICAgIHsKKyAgICAgICAgaWYoemktPmNpLm1ldGhvZCA9PSBaX0RFRkxBVEVEKQorICAgICAgICB7CisgICAgICAgICAgemktPmNpLnN0cmVhbS56YWxsb2MgPSAoYWxsb2NfZnVuYykwOworICAgICAgICAgIHppLT5jaS5zdHJlYW0uemZyZWUgPSAoZnJlZV9mdW5jKTA7CisgICAgICAgICAgemktPmNpLnN0cmVhbS5vcGFxdWUgPSAodm9pZHBmKTA7CisKKyAgICAgICAgICBpZiAod2luZG93Qml0cz4wKQorICAgICAgICAgICAgICB3aW5kb3dCaXRzID0gLXdpbmRvd0JpdHM7CisKKyAgICAgICAgICBlcnIgPSBkZWZsYXRlSW5pdDIoJnppLT5jaS5zdHJlYW0sIGxldmVsLCBaX0RFRkxBVEVELCB3aW5kb3dCaXRzLCBtZW1MZXZlbCwgc3RyYXRlZ3kpOworCisgICAgICAgICAgaWYgKGVycj09Wl9PSykKKyAgICAgICAgICAgICAgemktPmNpLnN0cmVhbV9pbml0aWFsaXNlZCA9IFpfREVGTEFURUQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZih6aS0+Y2kubWV0aG9kID09IFpfQlpJUDJFRCkKKyAgICAgICAgeworI2lmZGVmIEhBVkVfQlpJUDIKKyAgICAgICAgICAgIC8vIEluaXQgQlppcCBzdHVmZiBoZXJlCisgICAgICAgICAgemktPmNpLmJzdHJlYW0uYnphbGxvYyA9IDA7CisgICAgICAgICAgemktPmNpLmJzdHJlYW0uYnpmcmVlID0gMDsKKyAgICAgICAgICB6aS0+Y2kuYnN0cmVhbS5vcGFxdWUgPSAodm9pZHBmKTA7CisKKyAgICAgICAgICBlcnIgPSBCWjJfYnpDb21wcmVzc0luaXQoJnppLT5jaS5ic3RyZWFtLCBsZXZlbCwgMCwzNSk7CisgICAgICAgICAgaWYoZXJyID09IEJaX09LKQorICAgICAgICAgICAgemktPmNpLnN0cmVhbV9pbml0aWFsaXNlZCA9IFpfQlpJUDJFRDsKKyNlbmRpZgorICAgICAgICB9CisKKyAgICB9CisKKyMgICAgaWZuZGVmIE5PQ1JZUFQKKyAgICB6aS0+Y2kuY3J5cHRfaGVhZGVyX3NpemUgPSAwOworICAgIGlmICgoZXJyPT1aX09LKSAmJiAocGFzc3dvcmQgIT0gTlVMTCkpCisgICAgeworICAgICAgICB1bnNpZ25lZCBjaGFyIGJ1ZkhlYWRbUkFORF9IRUFEX0xFTl07CisgICAgICAgIHVuc2lnbmVkIGludCBzaXplSGVhZDsKKyAgICAgICAgemktPmNpLmVuY3J5cHQgPSAxOworICAgICAgICB6aS0+Y2kucGNyY18zMl90YWIgPSBnZXRfY3JjX3RhYmxlKCk7CisgICAgICAgIC8qaW5pdF9rZXlzKHBhc3N3b3JkLHppLT5jaS5rZXlzLHppLT5jaS5wY3JjXzMyX3RhYik7Ki8KKworICAgICAgICBzaXplSGVhZD1jcnlwdGhlYWQocGFzc3dvcmQsYnVmSGVhZCxSQU5EX0hFQURfTEVOLHppLT5jaS5rZXlzLHppLT5jaS5wY3JjXzMyX3RhYixjcmNGb3JDcnlwdGluZyk7CisgICAgICAgIHppLT5jaS5jcnlwdF9oZWFkZXJfc2l6ZSA9IHNpemVIZWFkOworCisgICAgICAgIGlmIChaV1JJVEU2NCh6aS0+el9maWxlZnVuYyx6aS0+ZmlsZXN0cmVhbSxidWZIZWFkLHNpemVIZWFkKSAhPSBzaXplSGVhZCkKKyAgICAgICAgICAgICAgICBlcnIgPSBaSVBfRVJSTk87CisgICAgfQorIyAgICBlbmRpZgorCisgICAgaWYgKGVycj09Wl9PSykKKyAgICAgICAgemktPmluX29wZW5lZF9maWxlX2luemlwID0gMTsKKyAgICByZXR1cm4gZXJyOworfQorCitleHRlcm4gaW50IFpFWFBPUlQgemlwT3Blbk5ld0ZpbGVJblppcDQgKHppcEZpbGUgZmlsZSwgY29uc3QgY2hhciogZmlsZW5hbWUsIGNvbnN0IHppcF9maWxlaW5mbyogemlwZmksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIGV4dHJhZmllbGRfbG9jYWwsIHVJbnQgc2l6ZV9leHRyYWZpZWxkX2xvY2FsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBleHRyYWZpZWxkX2dsb2JhbCwgdUludCBzaXplX2V4dHJhZmllbGRfZ2xvYmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBjb21tZW50LCBpbnQgbWV0aG9kLCBpbnQgbGV2ZWwsIGludCByYXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aW5kb3dCaXRzLGludCBtZW1MZXZlbCwgaW50IHN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBwYXNzd29yZCwgdUxvbmcgY3JjRm9yQ3J5cHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVMb25nIHZlcnNpb25NYWRlQnksIHVMb25nIGZsYWdCYXNlKQoreworICAgIHJldHVybiB6aXBPcGVuTmV3RmlsZUluWmlwNF82NCAoZmlsZSwgZmlsZW5hbWUsIHppcGZpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFmaWVsZF9sb2NhbCwgc2l6ZV9leHRyYWZpZWxkX2xvY2FsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFmaWVsZF9nbG9iYWwsIHNpemVfZXh0cmFmaWVsZF9nbG9iYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50LCBtZXRob2QsIGxldmVsLCByYXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3dCaXRzLCBtZW1MZXZlbCwgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzd29yZCwgY3JjRm9yQ3J5cHRpbmcsIHZlcnNpb25NYWRlQnksIGZsYWdCYXNlLCAwKTsKK30KKworZXh0ZXJuIGludCBaRVhQT1JUIHppcE9wZW5OZXdGaWxlSW5aaXAzICh6aXBGaWxlIGZpbGUsIGNvbnN0IGNoYXIqIGZpbGVuYW1lLCBjb25zdCB6aXBfZmlsZWluZm8qIHppcGZpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBleHRyYWZpZWxkX2xvY2FsLCB1SW50IHNpemVfZXh0cmFmaWVsZF9sb2NhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogZXh0cmFmaWVsZF9nbG9iYWwsIHVJbnQgc2l6ZV9leHRyYWZpZWxkX2dsb2JhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogY29tbWVudCwgaW50IG1ldGhvZCwgaW50IGxldmVsLCBpbnQgcmF3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2luZG93Qml0cyxpbnQgbWVtTGV2ZWwsIGludCBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcGFzc3dvcmQsIHVMb25nIGNyY0ZvckNyeXB0aW5nKQoreworICAgIHJldHVybiB6aXBPcGVuTmV3RmlsZUluWmlwNF82NCAoZmlsZSwgZmlsZW5hbWUsIHppcGZpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFmaWVsZF9sb2NhbCwgc2l6ZV9leHRyYWZpZWxkX2xvY2FsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFmaWVsZF9nbG9iYWwsIHNpemVfZXh0cmFmaWVsZF9nbG9iYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50LCBtZXRob2QsIGxldmVsLCByYXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3dCaXRzLCBtZW1MZXZlbCwgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzd29yZCwgY3JjRm9yQ3J5cHRpbmcsIFZFUlNJT05NQURFQlksIDAsIDApOworfQorCitleHRlcm4gaW50IFpFWFBPUlQgemlwT3Blbk5ld0ZpbGVJblppcDNfNjQoemlwRmlsZSBmaWxlLCBjb25zdCBjaGFyKiBmaWxlbmFtZSwgY29uc3QgemlwX2ZpbGVpbmZvKiB6aXBmaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogZXh0cmFmaWVsZF9sb2NhbCwgdUludCBzaXplX2V4dHJhZmllbGRfbG9jYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIGV4dHJhZmllbGRfZ2xvYmFsLCB1SW50IHNpemVfZXh0cmFmaWVsZF9nbG9iYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNvbW1lbnQsIGludCBtZXRob2QsIGludCBsZXZlbCwgaW50IHJhdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpbmRvd0JpdHMsaW50IG1lbUxldmVsLCBpbnQgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHBhc3N3b3JkLCB1TG9uZyBjcmNGb3JDcnlwdGluZywgaW50IHppcDY0KQoreworICAgIHJldHVybiB6aXBPcGVuTmV3RmlsZUluWmlwNF82NCAoZmlsZSwgZmlsZW5hbWUsIHppcGZpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFmaWVsZF9sb2NhbCwgc2l6ZV9leHRyYWZpZWxkX2xvY2FsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFmaWVsZF9nbG9iYWwsIHNpemVfZXh0cmFmaWVsZF9nbG9iYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50LCBtZXRob2QsIGxldmVsLCByYXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3dCaXRzLCBtZW1MZXZlbCwgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzd29yZCwgY3JjRm9yQ3J5cHRpbmcsIFZFUlNJT05NQURFQlksIDAsIHppcDY0KTsKK30KKworZXh0ZXJuIGludCBaRVhQT1JUIHppcE9wZW5OZXdGaWxlSW5aaXAyKHppcEZpbGUgZmlsZSwgY29uc3QgY2hhciogZmlsZW5hbWUsIGNvbnN0IHppcF9maWxlaW5mbyogemlwZmksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogZXh0cmFmaWVsZF9sb2NhbCwgdUludCBzaXplX2V4dHJhZmllbGRfbG9jYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogZXh0cmFmaWVsZF9nbG9iYWwsIHVJbnQgc2l6ZV9leHRyYWZpZWxkX2dsb2JhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBjb21tZW50LCBpbnQgbWV0aG9kLCBpbnQgbGV2ZWwsIGludCByYXcpCit7CisgICAgcmV0dXJuIHppcE9wZW5OZXdGaWxlSW5aaXA0XzY0IChmaWxlLCBmaWxlbmFtZSwgemlwZmksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYWZpZWxkX2xvY2FsLCBzaXplX2V4dHJhZmllbGRfbG9jYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYWZpZWxkX2dsb2JhbCwgc2l6ZV9leHRyYWZpZWxkX2dsb2JhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQsIG1ldGhvZCwgbGV2ZWwsIHJhdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1NQVhfV0JJVFMsIERFRl9NRU1fTEVWRUwsIFpfREVGQVVMVF9TVFJBVEVHWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIDAsIFZFUlNJT05NQURFQlksIDAsIDApOworfQorCitleHRlcm4gaW50IFpFWFBPUlQgemlwT3Blbk5ld0ZpbGVJblppcDJfNjQoemlwRmlsZSBmaWxlLCBjb25zdCBjaGFyKiBmaWxlbmFtZSwgY29uc3QgemlwX2ZpbGVpbmZvKiB6aXBmaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBleHRyYWZpZWxkX2xvY2FsLCB1SW50IHNpemVfZXh0cmFmaWVsZF9sb2NhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBleHRyYWZpZWxkX2dsb2JhbCwgdUludCBzaXplX2V4dHJhZmllbGRfZ2xvYmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNvbW1lbnQsIGludCBtZXRob2QsIGludCBsZXZlbCwgaW50IHJhdywgaW50IHppcDY0KQoreworICAgIHJldHVybiB6aXBPcGVuTmV3RmlsZUluWmlwNF82NCAoZmlsZSwgZmlsZW5hbWUsIHppcGZpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFmaWVsZF9sb2NhbCwgc2l6ZV9leHRyYWZpZWxkX2xvY2FsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFmaWVsZF9nbG9iYWwsIHNpemVfZXh0cmFmaWVsZF9nbG9iYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50LCBtZXRob2QsIGxldmVsLCByYXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtTUFYX1dCSVRTLCBERUZfTUVNX0xFVkVMLCBaX0RFRkFVTFRfU1RSQVRFR1ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAwLCBWRVJTSU9OTUFERUJZLCAwLCB6aXA2NCk7Cit9CisKK2V4dGVybiBpbnQgWkVYUE9SVCB6aXBPcGVuTmV3RmlsZUluWmlwNjQgKHppcEZpbGUgZmlsZSwgY29uc3QgY2hhciogZmlsZW5hbWUsIGNvbnN0IHppcF9maWxlaW5mbyogemlwZmksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogZXh0cmFmaWVsZF9sb2NhbCwgdUludCBzaXplX2V4dHJhZmllbGRfbG9jYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCpleHRyYWZpZWxkX2dsb2JhbCwgdUludCBzaXplX2V4dHJhZmllbGRfZ2xvYmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNvbW1lbnQsIGludCBtZXRob2QsIGludCBsZXZlbCwgaW50IHppcDY0KQoreworICAgIHJldHVybiB6aXBPcGVuTmV3RmlsZUluWmlwNF82NCAoZmlsZSwgZmlsZW5hbWUsIHppcGZpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFmaWVsZF9sb2NhbCwgc2l6ZV9leHRyYWZpZWxkX2xvY2FsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFmaWVsZF9nbG9iYWwsIHNpemVfZXh0cmFmaWVsZF9nbG9iYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50LCBtZXRob2QsIGxldmVsLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLU1BWF9XQklUUywgREVGX01FTV9MRVZFTCwgWl9ERUZBVUxUX1NUUkFURUdZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCwgVkVSU0lPTk1BREVCWSwgMCwgemlwNjQpOworfQorCitleHRlcm4gaW50IFpFWFBPUlQgemlwT3Blbk5ld0ZpbGVJblppcCAoemlwRmlsZSBmaWxlLCBjb25zdCBjaGFyKiBmaWxlbmFtZSwgY29uc3QgemlwX2ZpbGVpbmZvKiB6aXBmaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBleHRyYWZpZWxkX2xvY2FsLCB1SW50IHNpemVfZXh0cmFmaWVsZF9sb2NhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKmV4dHJhZmllbGRfZ2xvYmFsLCB1SW50IHNpemVfZXh0cmFmaWVsZF9nbG9iYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogY29tbWVudCwgaW50IG1ldGhvZCwgaW50IGxldmVsKQoreworICAgIHJldHVybiB6aXBPcGVuTmV3RmlsZUluWmlwNF82NCAoZmlsZSwgZmlsZW5hbWUsIHppcGZpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFmaWVsZF9sb2NhbCwgc2l6ZV9leHRyYWZpZWxkX2xvY2FsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFmaWVsZF9nbG9iYWwsIHNpemVfZXh0cmFmaWVsZF9nbG9iYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50LCBtZXRob2QsIGxldmVsLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLU1BWF9XQklUUywgREVGX01FTV9MRVZFTCwgWl9ERUZBVUxUX1NUUkFURUdZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCwgVkVSU0lPTk1BREVCWSwgMCwgMCk7Cit9CisKK2xvY2FsIGludCB6aXA2NEZsdXNoV3JpdGVCdWZmZXIoemlwNjRfaW50ZXJuYWwqIHppKQoreworICAgIGludCBlcnI9WklQX09LOworCisgICAgaWYgKHppLT5jaS5lbmNyeXB0ICE9IDApCisgICAgeworI2lmbmRlZiBOT0NSWVBUCisgICAgICAgIHVJbnQgaTsKKyAgICAgICAgaW50IHQ7CisgICAgICAgIGZvciAoaT0wO2k8emktPmNpLnBvc19pbl9idWZmZXJlZF9kYXRhO2krKykKKyAgICAgICAgICAgIHppLT5jaS5idWZmZXJlZF9kYXRhW2ldID0gemVuY29kZSh6aS0+Y2kua2V5cywgemktPmNpLnBjcmNfMzJfdGFiLCB6aS0+Y2kuYnVmZmVyZWRfZGF0YVtpXSx0KTsKKyNlbmRpZgorICAgIH0KKworICAgIGlmIChaV1JJVEU2NCh6aS0+el9maWxlZnVuYyx6aS0+ZmlsZXN0cmVhbSx6aS0+Y2kuYnVmZmVyZWRfZGF0YSx6aS0+Y2kucG9zX2luX2J1ZmZlcmVkX2RhdGEpICE9IHppLT5jaS5wb3NfaW5fYnVmZmVyZWRfZGF0YSkKKyAgICAgIGVyciA9IFpJUF9FUlJOTzsKKworICAgIHppLT5jaS50b3RhbENvbXByZXNzZWREYXRhICs9IHppLT5jaS5wb3NfaW5fYnVmZmVyZWRfZGF0YTsKKworI2lmZGVmIEhBVkVfQlpJUDIKKyAgICBpZih6aS0+Y2kubWV0aG9kID09IFpfQlpJUDJFRCkKKyAgICB7CisgICAgICB6aS0+Y2kudG90YWxVbmNvbXByZXNzZWREYXRhICs9IHppLT5jaS5ic3RyZWFtLnRvdGFsX2luX2xvMzI7CisgICAgICB6aS0+Y2kuYnN0cmVhbS50b3RhbF9pbl9sbzMyID0gMDsKKyAgICAgIHppLT5jaS5ic3RyZWFtLnRvdGFsX2luX2hpMzIgPSAwOworICAgIH0KKyAgICBlbHNlCisjZW5kaWYKKyAgICB7CisgICAgICB6aS0+Y2kudG90YWxVbmNvbXByZXNzZWREYXRhICs9IHppLT5jaS5zdHJlYW0udG90YWxfaW47CisgICAgICB6aS0+Y2kuc3RyZWFtLnRvdGFsX2luID0gMDsKKyAgICB9CisKKworICAgIHppLT5jaS5wb3NfaW5fYnVmZmVyZWRfZGF0YSA9IDA7CisKKyAgICByZXR1cm4gZXJyOworfQorCitleHRlcm4gaW50IFpFWFBPUlQgemlwV3JpdGVJbkZpbGVJblppcCAoemlwRmlsZSBmaWxlLGNvbnN0IHZvaWQqIGJ1Zix1bnNpZ25lZCBpbnQgbGVuKQoreworICAgIHppcDY0X2ludGVybmFsKiB6aTsKKyAgICBpbnQgZXJyPVpJUF9PSzsKKworICAgIGlmIChmaWxlID09IE5VTEwpCisgICAgICAgIHJldHVybiBaSVBfUEFSQU1FUlJPUjsKKyAgICB6aSA9ICh6aXA2NF9pbnRlcm5hbCopZmlsZTsKKworICAgIGlmICh6aS0+aW5fb3BlbmVkX2ZpbGVfaW56aXAgPT0gMCkKKyAgICAgICAgcmV0dXJuIFpJUF9QQVJBTUVSUk9SOworCisgICAgemktPmNpLmNyYzMyID0gY3JjMzIoemktPmNpLmNyYzMyLGJ1ZiwodUludClsZW4pOworCisjaWZkZWYgSEFWRV9CWklQMgorICAgIGlmKHppLT5jaS5tZXRob2QgPT0gWl9CWklQMkVEICYmICghemktPmNpLnJhdykpCisgICAgeworICAgICAgemktPmNpLmJzdHJlYW0ubmV4dF9pbiA9ICh2b2lkKilidWY7CisgICAgICB6aS0+Y2kuYnN0cmVhbS5hdmFpbF9pbiA9IGxlbjsKKyAgICAgIGVyciA9IEJaX1JVTl9PSzsKKworICAgICAgd2hpbGUgKChlcnI9PUJaX1JVTl9PSykgJiYgKHppLT5jaS5ic3RyZWFtLmF2YWlsX2luPjApKQorICAgICAgeworICAgICAgICBpZiAoemktPmNpLmJzdHJlYW0uYXZhaWxfb3V0ID09IDApCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoemlwNjRGbHVzaFdyaXRlQnVmZmVyKHppKSA9PSBaSVBfRVJSTk8pCisgICAgICAgICAgICBlcnIgPSBaSVBfRVJSTk87CisgICAgICAgICAgemktPmNpLmJzdHJlYW0uYXZhaWxfb3V0ID0gKHVJbnQpWl9CVUZTSVpFOworICAgICAgICAgIHppLT5jaS5ic3RyZWFtLm5leHRfb3V0ID0gKGNoYXIqKXppLT5jaS5idWZmZXJlZF9kYXRhOworICAgICAgICB9CisKKworICAgICAgICBpZihlcnIgIT0gQlpfUlVOX09LKQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGlmICgoemktPmNpLm1ldGhvZCA9PSBaX0JaSVAyRUQpICYmICghemktPmNpLnJhdykpCisgICAgICAgIHsKKyAgICAgICAgICB1TG9uZyB1VG90YWxPdXRCZWZvcmVfbG8gPSB6aS0+Y2kuYnN0cmVhbS50b3RhbF9vdXRfbG8zMjsKKy8vICAgICAgICAgIHVMb25nIHVUb3RhbE91dEJlZm9yZV9oaSA9IHppLT5jaS5ic3RyZWFtLnRvdGFsX291dF9oaTMyOworICAgICAgICAgIGVycj1CWjJfYnpDb21wcmVzcygmemktPmNpLmJzdHJlYW0sICBCWl9SVU4pOworCisgICAgICAgICAgemktPmNpLnBvc19pbl9idWZmZXJlZF9kYXRhICs9ICh1SW50KSh6aS0+Y2kuYnN0cmVhbS50b3RhbF9vdXRfbG8zMiAtIHVUb3RhbE91dEJlZm9yZV9sbykgOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmKGVyciA9PSBCWl9SVU5fT0spCisgICAgICAgIGVyciA9IFpJUF9PSzsKKyAgICB9CisgICAgZWxzZQorI2VuZGlmCisgICAgeworICAgICAgemktPmNpLnN0cmVhbS5uZXh0X2luID0gKEJ5dGVmKilidWY7CisgICAgICB6aS0+Y2kuc3RyZWFtLmF2YWlsX2luID0gbGVuOworCisgICAgICB3aGlsZSAoKGVycj09WklQX09LKSAmJiAoemktPmNpLnN0cmVhbS5hdmFpbF9pbj4wKSkKKyAgICAgIHsKKyAgICAgICAgICBpZiAoemktPmNpLnN0cmVhbS5hdmFpbF9vdXQgPT0gMCkKKyAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmICh6aXA2NEZsdXNoV3JpdGVCdWZmZXIoemkpID09IFpJUF9FUlJOTykKKyAgICAgICAgICAgICAgICAgIGVyciA9IFpJUF9FUlJOTzsKKyAgICAgICAgICAgICAgemktPmNpLnN0cmVhbS5hdmFpbF9vdXQgPSAodUludClaX0JVRlNJWkU7CisgICAgICAgICAgICAgIHppLT5jaS5zdHJlYW0ubmV4dF9vdXQgPSB6aS0+Y2kuYnVmZmVyZWRfZGF0YTsKKyAgICAgICAgICB9CisKKworICAgICAgICAgIGlmKGVyciAhPSBaSVBfT0spCisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgaWYgKCh6aS0+Y2kubWV0aG9kID09IFpfREVGTEFURUQpICYmICghemktPmNpLnJhdykpCisgICAgICAgICAgeworICAgICAgICAgICAgICB1TG9uZyB1VG90YWxPdXRCZWZvcmUgPSB6aS0+Y2kuc3RyZWFtLnRvdGFsX291dDsKKyAgICAgICAgICAgICAgZXJyPWRlZmxhdGUoJnppLT5jaS5zdHJlYW0sICBaX05PX0ZMVVNIKTsKKyAgICAgICAgICAgICAgaWYodVRvdGFsT3V0QmVmb3JlID4gemktPmNpLnN0cmVhbS50b3RhbF9vdXQpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgYkJyZWFrID0gMDsKKyAgICAgICAgICAgICAgICBiQnJlYWsrKzsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIHppLT5jaS5wb3NfaW5fYnVmZmVyZWRfZGF0YSArPSAodUludCkoemktPmNpLnN0cmVhbS50b3RhbF9vdXQgLSB1VG90YWxPdXRCZWZvcmUpIDsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgIHsKKyAgICAgICAgICAgICAgdUludCBjb3B5X3RoaXMsaTsKKyAgICAgICAgICAgICAgaWYgKHppLT5jaS5zdHJlYW0uYXZhaWxfaW4gPCB6aS0+Y2kuc3RyZWFtLmF2YWlsX291dCkKKyAgICAgICAgICAgICAgICAgIGNvcHlfdGhpcyA9IHppLT5jaS5zdHJlYW0uYXZhaWxfaW47CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgIGNvcHlfdGhpcyA9IHppLT5jaS5zdHJlYW0uYXZhaWxfb3V0OworCisgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3B5X3RoaXM7IGkrKykKKyAgICAgICAgICAgICAgICAgICooKChjaGFyKil6aS0+Y2kuc3RyZWFtLm5leHRfb3V0KStpKSA9CisgICAgICAgICAgICAgICAgICAgICAgKigoKGNvbnN0IGNoYXIqKXppLT5jaS5zdHJlYW0ubmV4dF9pbikraSk7CisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHppLT5jaS5zdHJlYW0uYXZhaWxfaW4gLT0gY29weV90aGlzOworICAgICAgICAgICAgICAgICAgemktPmNpLnN0cmVhbS5hdmFpbF9vdXQtPSBjb3B5X3RoaXM7CisgICAgICAgICAgICAgICAgICB6aS0+Y2kuc3RyZWFtLm5leHRfaW4rPSBjb3B5X3RoaXM7CisgICAgICAgICAgICAgICAgICB6aS0+Y2kuc3RyZWFtLm5leHRfb3V0Kz0gY29weV90aGlzOworICAgICAgICAgICAgICAgICAgemktPmNpLnN0cmVhbS50b3RhbF9pbis9IGNvcHlfdGhpczsKKyAgICAgICAgICAgICAgICAgIHppLT5jaS5zdHJlYW0udG90YWxfb3V0Kz0gY29weV90aGlzOworICAgICAgICAgICAgICAgICAgemktPmNpLnBvc19pbl9idWZmZXJlZF9kYXRhICs9IGNvcHlfdGhpczsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgIH0vLyB3aGlsZSguLi4pCisgICAgfQorCisgICAgcmV0dXJuIGVycjsKK30KKworZXh0ZXJuIGludCBaRVhQT1JUIHppcENsb3NlRmlsZUluWmlwUmF3ICh6aXBGaWxlIGZpbGUsIHVMb25nIHVuY29tcHJlc3NlZF9zaXplLCB1TG9uZyBjcmMzMikKK3sKKyAgICByZXR1cm4gemlwQ2xvc2VGaWxlSW5aaXBSYXc2NCAoZmlsZSwgdW5jb21wcmVzc2VkX3NpemUsIGNyYzMyKTsKK30KKworZXh0ZXJuIGludCBaRVhQT1JUIHppcENsb3NlRmlsZUluWmlwUmF3NjQgKHppcEZpbGUgZmlsZSwgWlBPUzY0X1QgdW5jb21wcmVzc2VkX3NpemUsIHVMb25nIGNyYzMyKQoreworICAgIHppcDY0X2ludGVybmFsKiB6aTsKKyAgICBaUE9TNjRfVCBjb21wcmVzc2VkX3NpemU7CisgICAgdUxvbmcgaW52YWxpZFZhbHVlID0gMHhmZmZmZmZmZjsKKyAgICBzaG9ydCBkYXRhc2l6ZSA9IDA7CisgICAgaW50IGVycj1aSVBfT0s7CisKKyAgICBpZiAoZmlsZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gWklQX1BBUkFNRVJST1I7CisgICAgemkgPSAoemlwNjRfaW50ZXJuYWwqKWZpbGU7CisKKyAgICBpZiAoemktPmluX29wZW5lZF9maWxlX2luemlwID09IDApCisgICAgICAgIHJldHVybiBaSVBfUEFSQU1FUlJPUjsKKyAgICB6aS0+Y2kuc3RyZWFtLmF2YWlsX2luID0gMDsKKworICAgIGlmICgoemktPmNpLm1ldGhvZCA9PSBaX0RFRkxBVEVEKSAmJiAoIXppLT5jaS5yYXcpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChlcnI9PVpJUF9PSykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdUxvbmcgdVRvdGFsT3V0QmVmb3JlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoemktPmNpLnN0cmVhbS5hdmFpbF9vdXQgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh6aXA2NEZsdXNoV3JpdGVCdWZmZXIoemkpID09IFpJUF9FUlJOTykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IFpJUF9FUlJOTzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aS0+Y2kuc3RyZWFtLmF2YWlsX291dCA9ICh1SW50KVpfQlVGU0laRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aS0+Y2kuc3RyZWFtLm5leHRfb3V0ID0gemktPmNpLmJ1ZmZlcmVkX2RhdGE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdVRvdGFsT3V0QmVmb3JlID0gemktPmNpLnN0cmVhbS50b3RhbF9vdXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycj1kZWZsYXRlKCZ6aS0+Y2kuc3RyZWFtLCAgWl9GSU5JU0gpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aS0+Y2kucG9zX2luX2J1ZmZlcmVkX2RhdGEgKz0gKHVJbnQpKHppLT5jaS5zdHJlYW0udG90YWxfb3V0IC0gdVRvdGFsT3V0QmVmb3JlKSA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgIGVsc2UgaWYgKCh6aS0+Y2kubWV0aG9kID09IFpfQlpJUDJFRCkgJiYgKCF6aS0+Y2kucmF3KSkKKyAgICB7CisjaWZkZWYgSEFWRV9CWklQMgorICAgICAgZXJyID0gQlpfRklOSVNIX09LOworICAgICAgd2hpbGUgKGVycj09QlpfRklOSVNIX09LKQorICAgICAgeworICAgICAgICB1TG9uZyB1VG90YWxPdXRCZWZvcmU7CisgICAgICAgIGlmICh6aS0+Y2kuYnN0cmVhbS5hdmFpbF9vdXQgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgIGlmICh6aXA2NEZsdXNoV3JpdGVCdWZmZXIoemkpID09IFpJUF9FUlJOTykKKyAgICAgICAgICAgIGVyciA9IFpJUF9FUlJOTzsKKyAgICAgICAgICB6aS0+Y2kuYnN0cmVhbS5hdmFpbF9vdXQgPSAodUludClaX0JVRlNJWkU7CisgICAgICAgICAgemktPmNpLmJzdHJlYW0ubmV4dF9vdXQgPSAoY2hhciopemktPmNpLmJ1ZmZlcmVkX2RhdGE7CisgICAgICAgIH0KKyAgICAgICAgdVRvdGFsT3V0QmVmb3JlID0gemktPmNpLmJzdHJlYW0udG90YWxfb3V0X2xvMzI7CisgICAgICAgIGVycj1CWjJfYnpDb21wcmVzcygmemktPmNpLmJzdHJlYW0sICBCWl9GSU5JU0gpOworICAgICAgICBpZihlcnIgPT0gQlpfU1RSRUFNX0VORCkKKyAgICAgICAgICBlcnIgPSBaX1NUUkVBTV9FTkQ7CisKKyAgICAgICAgemktPmNpLnBvc19pbl9idWZmZXJlZF9kYXRhICs9ICh1SW50KSh6aS0+Y2kuYnN0cmVhbS50b3RhbF9vdXRfbG8zMiAtIHVUb3RhbE91dEJlZm9yZSk7CisgICAgICB9CisKKyAgICAgIGlmKGVyciA9PSBCWl9GSU5JU0hfT0spCisgICAgICAgIGVyciA9IFpJUF9PSzsKKyNlbmRpZgorICAgIH0KKworICAgIGlmIChlcnI9PVpfU1RSRUFNX0VORCkKKyAgICAgICAgZXJyPVpJUF9PSzsgLyogdGhpcyBpcyBub3JtYWwgKi8KKworICAgIGlmICgoemktPmNpLnBvc19pbl9idWZmZXJlZF9kYXRhPjApICYmIChlcnI9PVpJUF9PSykpCisgICAgICAgICAgICAgICAgeworICAgICAgICBpZiAoemlwNjRGbHVzaFdyaXRlQnVmZmVyKHppKT09WklQX0VSUk5PKQorICAgICAgICAgICAgZXJyID0gWklQX0VSUk5POworICAgICAgICAgICAgICAgIH0KKworICAgIGlmICgoemktPmNpLm1ldGhvZCA9PSBaX0RFRkxBVEVEKSAmJiAoIXppLT5jaS5yYXcpKQorICAgIHsKKyAgICAgICAgaW50IHRtcF9lcnIgPSBkZWZsYXRlRW5kKCZ6aS0+Y2kuc3RyZWFtKTsKKyAgICAgICAgaWYgKGVyciA9PSBaSVBfT0spCisgICAgICAgICAgICBlcnIgPSB0bXBfZXJyOworICAgICAgICB6aS0+Y2kuc3RyZWFtX2luaXRpYWxpc2VkID0gMDsKKyAgICB9CisjaWZkZWYgSEFWRV9CWklQMgorICAgIGVsc2UgaWYoKHppLT5jaS5tZXRob2QgPT0gWl9CWklQMkVEKSAmJiAoIXppLT5jaS5yYXcpKQorICAgIHsKKyAgICAgIGludCB0bXBlcnIgPSBCWjJfYnpDb21wcmVzc0VuZCgmemktPmNpLmJzdHJlYW0pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycj09WklQX09LKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSB0bXBlcnI7CisgICAgICAgICAgICAgICAgICAgICAgICB6aS0+Y2kuc3RyZWFtX2luaXRpYWxpc2VkID0gMDsKKyAgICB9CisjZW5kaWYKKworICAgIGlmICghemktPmNpLnJhdykKKyAgICB7CisgICAgICAgIGNyYzMyID0gKHVMb25nKXppLT5jaS5jcmMzMjsKKyAgICAgICAgdW5jb21wcmVzc2VkX3NpemUgPSB6aS0+Y2kudG90YWxVbmNvbXByZXNzZWREYXRhOworICAgIH0KKyAgICBjb21wcmVzc2VkX3NpemUgPSB6aS0+Y2kudG90YWxDb21wcmVzc2VkRGF0YTsKKworIyAgICBpZm5kZWYgTk9DUllQVAorICAgIGNvbXByZXNzZWRfc2l6ZSArPSB6aS0+Y2kuY3J5cHRfaGVhZGVyX3NpemU7CisjICAgIGVuZGlmCisKKyAgICAvLyB1cGRhdGUgQ3VycmVudCBJdGVtIGNyYyBhbmQgc2l6ZXMsCisgICAgaWYoY29tcHJlc3NlZF9zaXplID49IDB4ZmZmZmZmZmYgfHwgdW5jb21wcmVzc2VkX3NpemUgPj0gMHhmZmZmZmZmZiB8fCB6aS0+Y2kucG9zX2xvY2FsX2hlYWRlciA+PSAweGZmZmZmZmZmKQorICAgIHsKKyAgICAgIC8qdmVyc2lvbiBNYWRlIGJ5Ki8KKyAgICAgIHppcDY0bG9jYWxfcHV0VmFsdWVfaW5tZW1vcnkoemktPmNpLmNlbnRyYWxfaGVhZGVyKzQsKHVMb25nKTQ1LDIpOworICAgICAgLyp2ZXJzaW9uIG5lZWRlZCovCisgICAgICB6aXA2NGxvY2FsX3B1dFZhbHVlX2lubWVtb3J5KHppLT5jaS5jZW50cmFsX2hlYWRlcis2LCh1TG9uZyk0NSwyKTsKKworICAgIH0KKworICAgIHppcDY0bG9jYWxfcHV0VmFsdWVfaW5tZW1vcnkoemktPmNpLmNlbnRyYWxfaGVhZGVyKzE2LGNyYzMyLDQpOyAvKmNyYyovCisKKworICAgIGlmKGNvbXByZXNzZWRfc2l6ZSA+PSAweGZmZmZmZmZmKQorICAgICAgemlwNjRsb2NhbF9wdXRWYWx1ZV9pbm1lbW9yeSh6aS0+Y2kuY2VudHJhbF9oZWFkZXIrMjAsIGludmFsaWRWYWx1ZSw0KTsgLypjb21wciBzaXplKi8KKyAgICBlbHNlCisgICAgICB6aXA2NGxvY2FsX3B1dFZhbHVlX2lubWVtb3J5KHppLT5jaS5jZW50cmFsX2hlYWRlcisyMCwgY29tcHJlc3NlZF9zaXplLDQpOyAvKmNvbXByIHNpemUqLworCisgICAgLy8vIHNldCBpbnRlcm5hbCBmaWxlIGF0dHJpYnV0ZXMgZmllbGQKKyAgICBpZiAoemktPmNpLnN0cmVhbS5kYXRhX3R5cGUgPT0gWl9BU0NJSSkKKyAgICAgICAgemlwNjRsb2NhbF9wdXRWYWx1ZV9pbm1lbW9yeSh6aS0+Y2kuY2VudHJhbF9oZWFkZXIrMzYsKHVMb25nKVpfQVNDSUksMik7CisKKyAgICBpZih1bmNvbXByZXNzZWRfc2l6ZSA+PSAweGZmZmZmZmZmKQorICAgICAgemlwNjRsb2NhbF9wdXRWYWx1ZV9pbm1lbW9yeSh6aS0+Y2kuY2VudHJhbF9oZWFkZXIrMjQsIGludmFsaWRWYWx1ZSw0KTsgLyp1bmNvbXByIHNpemUqLworICAgIGVsc2UKKyAgICAgIHppcDY0bG9jYWxfcHV0VmFsdWVfaW5tZW1vcnkoemktPmNpLmNlbnRyYWxfaGVhZGVyKzI0LCB1bmNvbXByZXNzZWRfc2l6ZSw0KTsgLyp1bmNvbXByIHNpemUqLworCisgICAgLy8gQWRkIFpJUDY0IGV4dHJhIGluZm8gZmllbGQgZm9yIHVuY29tcHJlc3NlZCBzaXplCisgICAgaWYodW5jb21wcmVzc2VkX3NpemUgPj0gMHhmZmZmZmZmZikKKyAgICAgIGRhdGFzaXplICs9IDg7CisKKyAgICAvLyBBZGQgWklQNjQgZXh0cmEgaW5mbyBmaWVsZCBmb3IgY29tcHJlc3NlZCBzaXplCisgICAgaWYoY29tcHJlc3NlZF9zaXplID49IDB4ZmZmZmZmZmYpCisgICAgICBkYXRhc2l6ZSArPSA4OworCisgICAgLy8gQWRkIFpJUDY0IGV4dHJhIGluZm8gZmllbGQgZm9yIHJlbGF0aXZlIG9mZnNldCB0byBsb2NhbCBmaWxlIGhlYWRlciBvZiBjdXJyZW50IGZpbGUKKyAgICBpZih6aS0+Y2kucG9zX2xvY2FsX2hlYWRlciA+PSAweGZmZmZmZmZmKQorICAgICAgZGF0YXNpemUgKz0gODsKKworICAgIGlmKGRhdGFzaXplID4gMCkKKyAgICB7CisgICAgICBjaGFyKiBwID0gTlVMTDsKKworICAgICAgaWYoKHVMb25nKShkYXRhc2l6ZSArIDQpID4gemktPmNpLnNpemVfY2VudHJhbEV4dHJhRnJlZSkKKyAgICAgIHsKKyAgICAgICAgLy8gd2UgY2FuIG5vdCB3cml0ZSBtb3JlIGRhdGEgdG8gdGhlIGJ1ZmZlciB0aGF0IHdlIGhhdmUgcm9vbSBmb3IuCisgICAgICAgIHJldHVybiBaSVBfQkFEWklQRklMRTsKKyAgICAgIH0KKworICAgICAgcCA9IHppLT5jaS5jZW50cmFsX2hlYWRlciArIHppLT5jaS5zaXplX2NlbnRyYWxoZWFkZXI7CisKKyAgICAgIC8vIEFkZCBFeHRyYSBJbmZvcm1hdGlvbiBIZWFkZXIgZm9yICdaSVA2NCBpbmZvcm1hdGlvbicKKyAgICAgIHppcDY0bG9jYWxfcHV0VmFsdWVfaW5tZW1vcnkocCwgMHgwMDAxLCAyKTsgLy8gSGVhZGVySUQKKyAgICAgIHAgKz0gMjsKKyAgICAgIHppcDY0bG9jYWxfcHV0VmFsdWVfaW5tZW1vcnkocCwgZGF0YXNpemUsIDIpOyAvLyBEYXRhU2l6ZQorICAgICAgcCArPSAyOworCisgICAgICBpZih1bmNvbXByZXNzZWRfc2l6ZSA+PSAweGZmZmZmZmZmKQorICAgICAgeworICAgICAgICB6aXA2NGxvY2FsX3B1dFZhbHVlX2lubWVtb3J5KHAsIHVuY29tcHJlc3NlZF9zaXplLCA4KTsKKyAgICAgICAgcCArPSA4OworICAgICAgfQorCisgICAgICBpZihjb21wcmVzc2VkX3NpemUgPj0gMHhmZmZmZmZmZikKKyAgICAgIHsKKyAgICAgICAgemlwNjRsb2NhbF9wdXRWYWx1ZV9pbm1lbW9yeShwLCBjb21wcmVzc2VkX3NpemUsIDgpOworICAgICAgICBwICs9IDg7CisgICAgICB9CisKKyAgICAgIGlmKHppLT5jaS5wb3NfbG9jYWxfaGVhZGVyID49IDB4ZmZmZmZmZmYpCisgICAgICB7CisgICAgICAgIHppcDY0bG9jYWxfcHV0VmFsdWVfaW5tZW1vcnkocCwgemktPmNpLnBvc19sb2NhbF9oZWFkZXIsIDgpOworICAgICAgICBwICs9IDg7CisgICAgICB9CisKKyAgICAgIC8vIFVwZGF0ZSBob3cgbXVjaCBleHRyYSBmcmVlIHNwYWNlIHdlIGdvdCBpbiB0aGUgbWVtb3J5IGJ1ZmZlcgorICAgICAgLy8gYW5kIGluY3JlYXNlIHRoZSBjZW50cmFsaGVhZGVyIHNpemUgc28gdGhlIG5ldyBaSVA2NCBmaWVsZHMgYXJlIGluY2x1ZGVkCisgICAgICAvLyAoIDQgYmVsb3cgaXMgdGhlIHNpemUgb2YgSGVhZGVySUQgYW5kIERhdGFTaXplIGZpZWxkICkKKyAgICAgIHppLT5jaS5zaXplX2NlbnRyYWxFeHRyYUZyZWUgLT0gZGF0YXNpemUgKyA0OworICAgICAgemktPmNpLnNpemVfY2VudHJhbGhlYWRlciArPSBkYXRhc2l6ZSArIDQ7CisKKyAgICAgIC8vIFVwZGF0ZSB0aGUgZXh0cmEgaW5mbyBzaXplIGZpZWxkCisgICAgICB6aS0+Y2kuc2l6ZV9jZW50cmFsRXh0cmEgKz0gZGF0YXNpemUgKyA0OworICAgICAgemlwNjRsb2NhbF9wdXRWYWx1ZV9pbm1lbW9yeSh6aS0+Y2kuY2VudHJhbF9oZWFkZXIrMzAsKHVMb25nKXppLT5jaS5zaXplX2NlbnRyYWxFeHRyYSwyKTsKKyAgICB9CisKKyAgICBpZiAoZXJyPT1aSVBfT0spCisgICAgICAgIGVyciA9IGFkZF9kYXRhX2luX2RhdGFibG9jaygmemktPmNlbnRyYWxfZGlyLCB6aS0+Y2kuY2VudHJhbF9oZWFkZXIsICh1TG9uZyl6aS0+Y2kuc2l6ZV9jZW50cmFsaGVhZGVyKTsKKworICAgIGZyZWUoemktPmNpLmNlbnRyYWxfaGVhZGVyKTsKKworICAgIGlmIChlcnI9PVpJUF9PSykKKyAgICB7CisgICAgICAgIC8vIFVwZGF0ZSB0aGUgTG9jYWxGaWxlSGVhZGVyIHdpdGggdGhlIG5ldyB2YWx1ZXMuCisKKyAgICAgICAgWlBPUzY0X1QgY3VyX3Bvc19pbnppcCA9IFpURUxMNjQoemktPnpfZmlsZWZ1bmMsemktPmZpbGVzdHJlYW0pOworCisgICAgICAgIGlmIChaU0VFSzY0KHppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtLCB6aS0+Y2kucG9zX2xvY2FsX2hlYWRlciArIDE0LFpMSUJfRklMRUZVTkNfU0VFS19TRVQpIT0wKQorICAgICAgICAgICAgZXJyID0gWklQX0VSUk5POworCisgICAgICAgIGlmIChlcnI9PVpJUF9PSykKKyAgICAgICAgICAgIGVyciA9IHppcDY0bG9jYWxfcHV0VmFsdWUoJnppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtLGNyYzMyLDQpOyAvKiBjcmMgMzIsIHVua25vd24gKi8KKworICAgICAgICBpZih1bmNvbXByZXNzZWRfc2l6ZSA+PSAweGZmZmZmZmZmIHx8IGNvbXByZXNzZWRfc2l6ZSA+PSAweGZmZmZmZmZmICkKKyAgICAgICAgeworICAgICAgICAgIGlmKHppLT5jaS5wb3NfemlwNjRleHRyYWluZm8gPiAwKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgc2l6ZSBpbiB0aGUgWklQNjQgZXh0ZW5kZWQgZmllbGQuCisgICAgICAgICAgICBpZiAoWlNFRUs2NCh6aS0+el9maWxlZnVuYyx6aS0+ZmlsZXN0cmVhbSwgemktPmNpLnBvc196aXA2NGV4dHJhaW5mbyArIDQsWkxJQl9GSUxFRlVOQ19TRUVLX1NFVCkhPTApCisgICAgICAgICAgICAgIGVyciA9IFpJUF9FUlJOTzsKKworICAgICAgICAgICAgaWYgKGVycj09WklQX09LKSAvKiBjb21wcmVzc2VkIHNpemUsIHVua25vd24gKi8KKyAgICAgICAgICAgICAgZXJyID0gemlwNjRsb2NhbF9wdXRWYWx1ZSgmemktPnpfZmlsZWZ1bmMsIHppLT5maWxlc3RyZWFtLCB1bmNvbXByZXNzZWRfc2l6ZSwgOCk7CisKKyAgICAgICAgICAgIGlmIChlcnI9PVpJUF9PSykgLyogdW5jb21wcmVzc2VkIHNpemUsIHVua25vd24gKi8KKyAgICAgICAgICAgICAgZXJyID0gemlwNjRsb2NhbF9wdXRWYWx1ZSgmemktPnpfZmlsZWZ1bmMsIHppLT5maWxlc3RyZWFtLCBjb21wcmVzc2VkX3NpemUsIDgpOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIGVyciA9IFpJUF9CQURaSVBGSUxFOyAvLyBDYWxsZXIgcGFzc2VkIHppcDY0ID0gMCwgc28gbm8gcm9vbSBmb3IgemlwNjQgaW5mbyAtPiBmYXRhbAorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGlmIChlcnI9PVpJUF9PSykgLyogY29tcHJlc3NlZCBzaXplLCB1bmtub3duICovCisgICAgICAgICAgICAgIGVyciA9IHppcDY0bG9jYWxfcHV0VmFsdWUoJnppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtLGNvbXByZXNzZWRfc2l6ZSw0KTsKKworICAgICAgICAgIGlmIChlcnI9PVpJUF9PSykgLyogdW5jb21wcmVzc2VkIHNpemUsIHVua25vd24gKi8KKyAgICAgICAgICAgICAgZXJyID0gemlwNjRsb2NhbF9wdXRWYWx1ZSgmemktPnpfZmlsZWZ1bmMsemktPmZpbGVzdHJlYW0sdW5jb21wcmVzc2VkX3NpemUsNCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoWlNFRUs2NCh6aS0+el9maWxlZnVuYyx6aS0+ZmlsZXN0cmVhbSwgY3VyX3Bvc19pbnppcCxaTElCX0ZJTEVGVU5DX1NFRUtfU0VUKSE9MCkKKyAgICAgICAgICAgIGVyciA9IFpJUF9FUlJOTzsKKyAgICB9CisKKyAgICB6aS0+bnVtYmVyX2VudHJ5ICsrOworICAgIHppLT5pbl9vcGVuZWRfZmlsZV9pbnppcCA9IDA7CisKKyAgICByZXR1cm4gZXJyOworfQorCitleHRlcm4gaW50IFpFWFBPUlQgemlwQ2xvc2VGaWxlSW5aaXAgKHppcEZpbGUgZmlsZSkKK3sKKyAgICByZXR1cm4gemlwQ2xvc2VGaWxlSW5aaXBSYXcgKGZpbGUsMCwwKTsKK30KKworaW50IFdyaXRlX1ppcDY0RW5kT2ZDZW50cmFsRGlyZWN0b3J5TG9jYXRvcih6aXA2NF9pbnRlcm5hbCogemksIFpQT1M2NF9UIHppcDY0ZW9jZF9wb3NfaW56aXApCit7CisgIGludCBlcnIgPSBaSVBfT0s7CisgIFpQT1M2NF9UIHBvcyA9IHppcDY0ZW9jZF9wb3NfaW56aXAgLSB6aS0+YWRkX3Bvc2l0aW9uX3doZW5fd3JpdHRpbmdfb2Zmc2V0OworCisgIGVyciA9IHppcDY0bG9jYWxfcHV0VmFsdWUoJnppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtLCh1TG9uZylaSVA2NEVORExPQ0hFQURFUk1BR0lDLDQpOworCisgIC8qbnVtIGRpc2tzKi8KKyAgICBpZiAoZXJyPT1aSVBfT0spIC8qIG51bWJlciBvZiB0aGUgZGlzayB3aXRoIHRoZSBzdGFydCBvZiB0aGUgY2VudHJhbCBkaXJlY3RvcnkgKi8KKyAgICAgIGVyciA9IHppcDY0bG9jYWxfcHV0VmFsdWUoJnppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtLCh1TG9uZykwLDQpOworCisgIC8qcmVsYXRpdmUgb2Zmc2V0Ki8KKyAgICBpZiAoZXJyPT1aSVBfT0spIC8qIFJlbGF0aXZlIG9mZnNldCB0byB0aGUgWmlwNjRFbmRPZkNlbnRyYWxEaXJlY3RvcnkgKi8KKyAgICAgIGVyciA9IHppcDY0bG9jYWxfcHV0VmFsdWUoJnppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtLCBwb3MsOCk7CisKKyAgLyp0b3RhbCBkaXNrcyovIC8qIERvIG5vdCBzdXBwb3J0IHNwYXduaW5nIG9mIGRpc2sgc28gYWx3YXlzIHNheSAxIGhlcmUqLworICAgIGlmIChlcnI9PVpJUF9PSykgLyogbnVtYmVyIG9mIHRoZSBkaXNrIHdpdGggdGhlIHN0YXJ0IG9mIHRoZSBjZW50cmFsIGRpcmVjdG9yeSAqLworICAgICAgZXJyID0gemlwNjRsb2NhbF9wdXRWYWx1ZSgmemktPnpfZmlsZWZ1bmMsemktPmZpbGVzdHJlYW0sKHVMb25nKTEsNCk7CisKKyAgICByZXR1cm4gZXJyOworfQorCitpbnQgV3JpdGVfWmlwNjRFbmRPZkNlbnRyYWxEaXJlY3RvcnlSZWNvcmQoemlwNjRfaW50ZXJuYWwqIHppLCB1TG9uZyBzaXplX2NlbnRyYWxkaXIsIFpQT1M2NF9UIGNlbnRyYWxkaXJfcG9zX2luemlwKQoreworICBpbnQgZXJyID0gWklQX09LOworCisgIHVMb25nIFppcDY0RGF0YVNpemUgPSA0NDsKKworICBlcnIgPSB6aXA2NGxvY2FsX3B1dFZhbHVlKCZ6aS0+el9maWxlZnVuYyx6aS0+ZmlsZXN0cmVhbSwodUxvbmcpWklQNjRFTkRIRUFERVJNQUdJQyw0KTsKKworICBpZiAoZXJyPT1aSVBfT0spIC8qIHNpemUgb2YgdGhpcyAnemlwNjQgZW5kIG9mIGNlbnRyYWwgZGlyZWN0b3J5JyAqLworICAgIGVyciA9IHppcDY0bG9jYWxfcHV0VmFsdWUoJnppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtLChaUE9TNjRfVClaaXA2NERhdGFTaXplLDgpOyAvLyB3aHkgWlBPUzY0X1Qgb2YgdGhpcyA/CisKKyAgaWYgKGVycj09WklQX09LKSAvKiB2ZXJzaW9uIG1hZGUgYnkgKi8KKyAgICBlcnIgPSB6aXA2NGxvY2FsX3B1dFZhbHVlKCZ6aS0+el9maWxlZnVuYyx6aS0+ZmlsZXN0cmVhbSwodUxvbmcpNDUsMik7CisKKyAgaWYgKGVycj09WklQX09LKSAvKiB2ZXJzaW9uIG5lZWRlZCAqLworICAgIGVyciA9IHppcDY0bG9jYWxfcHV0VmFsdWUoJnppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtLCh1TG9uZyk0NSwyKTsKKworICBpZiAoZXJyPT1aSVBfT0spIC8qIG51bWJlciBvZiB0aGlzIGRpc2sgKi8KKyAgICBlcnIgPSB6aXA2NGxvY2FsX3B1dFZhbHVlKCZ6aS0+el9maWxlZnVuYyx6aS0+ZmlsZXN0cmVhbSwodUxvbmcpMCw0KTsKKworICBpZiAoZXJyPT1aSVBfT0spIC8qIG51bWJlciBvZiB0aGUgZGlzayB3aXRoIHRoZSBzdGFydCBvZiB0aGUgY2VudHJhbCBkaXJlY3RvcnkgKi8KKyAgICBlcnIgPSB6aXA2NGxvY2FsX3B1dFZhbHVlKCZ6aS0+el9maWxlZnVuYyx6aS0+ZmlsZXN0cmVhbSwodUxvbmcpMCw0KTsKKworICBpZiAoZXJyPT1aSVBfT0spIC8qIHRvdGFsIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBjZW50cmFsIGRpciBvbiB0aGlzIGRpc2sgKi8KKyAgICBlcnIgPSB6aXA2NGxvY2FsX3B1dFZhbHVlKCZ6aS0+el9maWxlZnVuYywgemktPmZpbGVzdHJlYW0sIHppLT5udW1iZXJfZW50cnksIDgpOworCisgIGlmIChlcnI9PVpJUF9PSykgLyogdG90YWwgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGNlbnRyYWwgZGlyICovCisgICAgZXJyID0gemlwNjRsb2NhbF9wdXRWYWx1ZSgmemktPnpfZmlsZWZ1bmMsIHppLT5maWxlc3RyZWFtLCB6aS0+bnVtYmVyX2VudHJ5LCA4KTsKKworICBpZiAoZXJyPT1aSVBfT0spIC8qIHNpemUgb2YgdGhlIGNlbnRyYWwgZGlyZWN0b3J5ICovCisgICAgZXJyID0gemlwNjRsb2NhbF9wdXRWYWx1ZSgmemktPnpfZmlsZWZ1bmMsemktPmZpbGVzdHJlYW0sKFpQT1M2NF9UKXNpemVfY2VudHJhbGRpciw4KTsKKworICBpZiAoZXJyPT1aSVBfT0spIC8qIG9mZnNldCBvZiBzdGFydCBvZiBjZW50cmFsIGRpcmVjdG9yeSB3aXRoIHJlc3BlY3QgdG8gdGhlIHN0YXJ0aW5nIGRpc2sgbnVtYmVyICovCisgIHsKKyAgICBaUE9TNjRfVCBwb3MgPSBjZW50cmFsZGlyX3Bvc19pbnppcCAtIHppLT5hZGRfcG9zaXRpb25fd2hlbl93cml0dGluZ19vZmZzZXQ7CisgICAgZXJyID0gemlwNjRsb2NhbF9wdXRWYWx1ZSgmemktPnpfZmlsZWZ1bmMsemktPmZpbGVzdHJlYW0sIChaUE9TNjRfVClwb3MsOCk7CisgIH0KKyAgcmV0dXJuIGVycjsKK30KK2ludCBXcml0ZV9FbmRPZkNlbnRyYWxEaXJlY3RvcnlSZWNvcmQoemlwNjRfaW50ZXJuYWwqIHppLCB1TG9uZyBzaXplX2NlbnRyYWxkaXIsIFpQT1M2NF9UIGNlbnRyYWxkaXJfcG9zX2luemlwKQoreworICBpbnQgZXJyID0gWklQX09LOworCisgIC8qc2lnbmF0dXJlKi8KKyAgZXJyID0gemlwNjRsb2NhbF9wdXRWYWx1ZSgmemktPnpfZmlsZWZ1bmMsemktPmZpbGVzdHJlYW0sKHVMb25nKUVOREhFQURFUk1BR0lDLDQpOworCisgIGlmIChlcnI9PVpJUF9PSykgLyogbnVtYmVyIG9mIHRoaXMgZGlzayAqLworICAgIGVyciA9IHppcDY0bG9jYWxfcHV0VmFsdWUoJnppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtLCh1TG9uZykwLDIpOworCisgIGlmIChlcnI9PVpJUF9PSykgLyogbnVtYmVyIG9mIHRoZSBkaXNrIHdpdGggdGhlIHN0YXJ0IG9mIHRoZSBjZW50cmFsIGRpcmVjdG9yeSAqLworICAgIGVyciA9IHppcDY0bG9jYWxfcHV0VmFsdWUoJnppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtLCh1TG9uZykwLDIpOworCisgIGlmIChlcnI9PVpJUF9PSykgLyogdG90YWwgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGNlbnRyYWwgZGlyIG9uIHRoaXMgZGlzayAqLworICB7CisgICAgeworICAgICAgaWYoemktPm51bWJlcl9lbnRyeSA+PSAweEZGRkYpCisgICAgICAgIGVyciA9IHppcDY0bG9jYWxfcHV0VmFsdWUoJnppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtLCh1TG9uZykweGZmZmYsMik7IC8vIHVzZSB2YWx1ZSBpbiBaSVA2NCByZWNvcmQKKyAgICAgIGVsc2UKKyAgICAgICAgZXJyID0gemlwNjRsb2NhbF9wdXRWYWx1ZSgmemktPnpfZmlsZWZ1bmMsemktPmZpbGVzdHJlYW0sKHVMb25nKXppLT5udW1iZXJfZW50cnksMik7CisgICAgfQorICB9CisKKyAgaWYgKGVycj09WklQX09LKSAvKiB0b3RhbCBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgY2VudHJhbCBkaXIgKi8KKyAgeworICAgIGlmKHppLT5udW1iZXJfZW50cnkgPj0gMHhGRkZGKQorICAgICAgZXJyID0gemlwNjRsb2NhbF9wdXRWYWx1ZSgmemktPnpfZmlsZWZ1bmMsemktPmZpbGVzdHJlYW0sKHVMb25nKTB4ZmZmZiwyKTsgLy8gdXNlIHZhbHVlIGluIFpJUDY0IHJlY29yZAorICAgIGVsc2UKKyAgICAgIGVyciA9IHppcDY0bG9jYWxfcHV0VmFsdWUoJnppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtLCh1TG9uZyl6aS0+bnVtYmVyX2VudHJ5LDIpOworICB9CisKKyAgaWYgKGVycj09WklQX09LKSAvKiBzaXplIG9mIHRoZSBjZW50cmFsIGRpcmVjdG9yeSAqLworICAgIGVyciA9IHppcDY0bG9jYWxfcHV0VmFsdWUoJnppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtLCh1TG9uZylzaXplX2NlbnRyYWxkaXIsNCk7CisKKyAgaWYgKGVycj09WklQX09LKSAvKiBvZmZzZXQgb2Ygc3RhcnQgb2YgY2VudHJhbCBkaXJlY3Rvcnkgd2l0aCByZXNwZWN0IHRvIHRoZSBzdGFydGluZyBkaXNrIG51bWJlciAqLworICB7CisgICAgWlBPUzY0X1QgcG9zID0gY2VudHJhbGRpcl9wb3NfaW56aXAgLSB6aS0+YWRkX3Bvc2l0aW9uX3doZW5fd3JpdHRpbmdfb2Zmc2V0OworICAgIGlmKHBvcyA+PSAweGZmZmZmZmZmKQorICAgIHsKKyAgICAgIGVyciA9IHppcDY0bG9jYWxfcHV0VmFsdWUoJnppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtLCAodUxvbmcpMHhmZmZmZmZmZiw0KTsKKyAgICB9CisgICAgZWxzZQorICAgICAgZXJyID0gemlwNjRsb2NhbF9wdXRWYWx1ZSgmemktPnpfZmlsZWZ1bmMsemktPmZpbGVzdHJlYW0sICh1TG9uZykoY2VudHJhbGRpcl9wb3NfaW56aXAgLSB6aS0+YWRkX3Bvc2l0aW9uX3doZW5fd3JpdHRpbmdfb2Zmc2V0KSw0KTsKKyAgfQorCisgICByZXR1cm4gZXJyOworfQorCitpbnQgV3JpdGVfR2xvYmFsQ29tbWVudCh6aXA2NF9pbnRlcm5hbCogemksIGNvbnN0IGNoYXIqIGdsb2JhbF9jb21tZW50KQoreworICBpbnQgZXJyID0gWklQX09LOworICB1SW50IHNpemVfZ2xvYmFsX2NvbW1lbnQgPSAwOworCisgIGlmKGdsb2JhbF9jb21tZW50ICE9IE5VTEwpCisgICAgc2l6ZV9nbG9iYWxfY29tbWVudCA9ICh1SW50KXN0cmxlbihnbG9iYWxfY29tbWVudCk7CisKKyAgZXJyID0gemlwNjRsb2NhbF9wdXRWYWx1ZSgmemktPnpfZmlsZWZ1bmMsemktPmZpbGVzdHJlYW0sKHVMb25nKXNpemVfZ2xvYmFsX2NvbW1lbnQsMik7CisKKyAgaWYgKGVyciA9PSBaSVBfT0sgJiYgc2l6ZV9nbG9iYWxfY29tbWVudCA+IDApCisgIHsKKyAgICBpZiAoWldSSVRFNjQoemktPnpfZmlsZWZ1bmMsemktPmZpbGVzdHJlYW0sIGdsb2JhbF9jb21tZW50LCBzaXplX2dsb2JhbF9jb21tZW50KSAhPSBzaXplX2dsb2JhbF9jb21tZW50KQorICAgICAgZXJyID0gWklQX0VSUk5POworICB9CisgIHJldHVybiBlcnI7Cit9CisKK2V4dGVybiBpbnQgWkVYUE9SVCB6aXBDbG9zZSAoemlwRmlsZSBmaWxlLCBjb25zdCBjaGFyKiBnbG9iYWxfY29tbWVudCkKK3sKKyAgICB6aXA2NF9pbnRlcm5hbCogemk7CisgICAgaW50IGVyciA9IDA7CisgICAgdUxvbmcgc2l6ZV9jZW50cmFsZGlyID0gMDsKKyAgICBaUE9TNjRfVCBjZW50cmFsZGlyX3Bvc19pbnppcDsKKyAgICBaUE9TNjRfVCBwb3M7CisKKyAgICBpZiAoZmlsZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gWklQX1BBUkFNRVJST1I7CisKKyAgICB6aSA9ICh6aXA2NF9pbnRlcm5hbCopZmlsZTsKKworICAgIGlmICh6aS0+aW5fb3BlbmVkX2ZpbGVfaW56aXAgPT0gMSkKKyAgICB7CisgICAgICAgIGVyciA9IHppcENsb3NlRmlsZUluWmlwIChmaWxlKTsKKyAgICB9CisKKyNpZm5kZWYgTk9fQURERklMRUlORVhJU1RJTkdaSVAKKyAgICBpZiAoZ2xvYmFsX2NvbW1lbnQ9PU5VTEwpCisgICAgICAgIGdsb2JhbF9jb21tZW50ID0gemktPmdsb2JhbGNvbW1lbnQ7CisjZW5kaWYKKworICAgIGNlbnRyYWxkaXJfcG9zX2luemlwID0gWlRFTEw2NCh6aS0+el9maWxlZnVuYyx6aS0+ZmlsZXN0cmVhbSk7CisKKyAgICBpZiAoZXJyPT1aSVBfT0spCisgICAgeworICAgICAgICBsaW5rZWRsaXN0X2RhdGFibG9ja19pbnRlcm5hbCogbGRpID0gemktPmNlbnRyYWxfZGlyLmZpcnN0X2Jsb2NrOworICAgICAgICB3aGlsZSAobGRpIT1OVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKGVycj09WklQX09LKSAmJiAobGRpLT5maWxsZWRfaW5fdGhpc19ibG9jaz4wKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoWldSSVRFNjQoemktPnpfZmlsZWZ1bmMsemktPmZpbGVzdHJlYW0sIGxkaS0+ZGF0YSwgbGRpLT5maWxsZWRfaW5fdGhpc19ibG9jaykgIT0gbGRpLT5maWxsZWRfaW5fdGhpc19ibG9jaykKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gWklQX0VSUk5POworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzaXplX2NlbnRyYWxkaXIgKz0gbGRpLT5maWxsZWRfaW5fdGhpc19ibG9jazsKKyAgICAgICAgICAgIGxkaSA9IGxkaS0+bmV4dF9kYXRhYmxvY2s7CisgICAgICAgIH0KKyAgICB9CisgICAgZnJlZV9saW5rZWRsaXN0KCYoemktPmNlbnRyYWxfZGlyKSk7CisKKyAgICBwb3MgPSBjZW50cmFsZGlyX3Bvc19pbnppcCAtIHppLT5hZGRfcG9zaXRpb25fd2hlbl93cml0dGluZ19vZmZzZXQ7CisgICAgaWYocG9zID49IDB4ZmZmZmZmZmYgfHwgemktPm51bWJlcl9lbnRyeSA+IDB4RkZGRikKKyAgICB7CisgICAgICBaUE9TNjRfVCBaaXA2NEVPQ0Rwb3MgPSBaVEVMTDY0KHppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtKTsKKyAgICAgIFdyaXRlX1ppcDY0RW5kT2ZDZW50cmFsRGlyZWN0b3J5UmVjb3JkKHppLCBzaXplX2NlbnRyYWxkaXIsIGNlbnRyYWxkaXJfcG9zX2luemlwKTsKKworICAgICAgV3JpdGVfWmlwNjRFbmRPZkNlbnRyYWxEaXJlY3RvcnlMb2NhdG9yKHppLCBaaXA2NEVPQ0Rwb3MpOworICAgIH0KKworICAgIGlmIChlcnI9PVpJUF9PSykKKyAgICAgIGVyciA9IFdyaXRlX0VuZE9mQ2VudHJhbERpcmVjdG9yeVJlY29yZCh6aSwgc2l6ZV9jZW50cmFsZGlyLCBjZW50cmFsZGlyX3Bvc19pbnppcCk7CisKKyAgICBpZihlcnIgPT0gWklQX09LKQorICAgICAgZXJyID0gV3JpdGVfR2xvYmFsQ29tbWVudCh6aSwgZ2xvYmFsX2NvbW1lbnQpOworCisgICAgaWYgKFpDTE9TRTY0KHppLT56X2ZpbGVmdW5jLHppLT5maWxlc3RyZWFtKSAhPSAwKQorICAgICAgICBpZiAoZXJyID09IFpJUF9PSykKKyAgICAgICAgICAgIGVyciA9IFpJUF9FUlJOTzsKKworI2lmbmRlZiBOT19BRERGSUxFSU5FWElTVElOR1pJUAorICAgIFRSWUZSRUUoemktPmdsb2JhbGNvbW1lbnQpOworI2VuZGlmCisgICAgVFJZRlJFRSh6aSk7CisKKyAgICByZXR1cm4gZXJyOworfQorCitleHRlcm4gaW50IFpFWFBPUlQgemlwUmVtb3ZlRXh0cmFJbmZvQmxvY2sgKGNoYXIqIHBEYXRhLCBpbnQqIGRhdGFMZW4sIHNob3J0IHNIZWFkZXIpCit7CisgIGNoYXIqIHAgPSBwRGF0YTsKKyAgaW50IHNpemUgPSAwOworICBjaGFyKiBwTmV3SGVhZGVyOworICBjaGFyKiBwVG1wOworICBzaG9ydCBoZWFkZXI7CisgIHNob3J0IGRhdGFTaXplOworCisgIGludCByZXRWYWwgPSBaSVBfT0s7CisKKyAgaWYocERhdGEgPT0gTlVMTCB8fCAqZGF0YUxlbiA8IDQpCisgICAgcmV0dXJuIFpJUF9QQVJBTUVSUk9SOworCisgIHBOZXdIZWFkZXIgPSAoY2hhciopQUxMT0MoKmRhdGFMZW4pOworICBwVG1wID0gcE5ld0hlYWRlcjsKKworICB3aGlsZShwIDwgKHBEYXRhICsgKmRhdGFMZW4pKQorICB7CisgICAgaGVhZGVyID0gKihzaG9ydCopcDsKKyAgICBkYXRhU2l6ZSA9ICooKChzaG9ydCopcCkrMSk7CisKKyAgICBpZiggaGVhZGVyID09IHNIZWFkZXIgKSAvLyBIZWFkZXIgZm91bmQuCisgICAgeworICAgICAgcCArPSBkYXRhU2l6ZSArIDQ7IC8vIHNraXAgaXQuIGRvIG5vdCBjb3B5IHRvIHRlbXAgYnVmZmVyCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvLyBFeHRyYSBJbmZvIGJsb2NrIHNob3VsZCBub3QgYmUgcmVtb3ZlZCwgU28gY29weSBpdCB0byB0aGUgdGVtcCBidWZmZXIuCisgICAgICBtZW1jcHkocFRtcCwgcCwgZGF0YVNpemUgKyA0KTsKKyAgICAgIHAgKz0gZGF0YVNpemUgKyA0OworICAgICAgc2l6ZSArPSBkYXRhU2l6ZSArIDQ7CisgICAgfQorCisgIH0KKworICBpZihzaXplIDwgKmRhdGFMZW4pCisgIHsKKyAgICAvLyBjbGVhbiBvbGQgZXh0cmEgaW5mbyBibG9jay4KKyAgICBtZW1zZXQocERhdGEsMCwgKmRhdGFMZW4pOworCisgICAgLy8gY29weSB0aGUgbmV3IGV4dHJhIGluZm8gYmxvY2sgb3ZlciB0aGUgb2xkCisgICAgaWYoc2l6ZSA+IDApCisgICAgICBtZW1jcHkocERhdGEsIHBOZXdIZWFkZXIsIHNpemUpOworCisgICAgLy8gc2V0IHRoZSBuZXcgZXh0cmEgaW5mbyBzaXplCisgICAgKmRhdGFMZW4gPSBzaXplOworCisgICAgcmV0VmFsID0gWklQX09LOworICB9CisgIGVsc2UKKyAgICByZXRWYWwgPSBaSVBfRVJSTk87CisKKyAgVFJZRlJFRShwTmV3SGVhZGVyKTsKKworICByZXR1cm4gcmV0VmFsOworfQpkaWZmIC0tZ2l0IGEvemxpYi0xLjIuNi9jb250cmliL21pbml6aXAvemlwLmggYi96bGliLTEuMi42L2NvbnRyaWIvbWluaXppcC96aXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWFlYmI2Ci0tLSAvZGV2L251bGwKKysrIGIvemxpYi0xLjIuNi9jb250cmliL21pbml6aXAvemlwLmgKQEAgLTAsMCArMSwzNjIgQEAKKy8qIHppcC5oIC0tIElPIG9uIC56aXAgZmlsZXMgdXNpbmcgemxpYgorICAgVmVyc2lvbiAxLjEsIEZlYnJ1YXJ5IDE0aCwgMjAxMAorICAgcGFydCBvZiB0aGUgTWluaVppcCBwcm9qZWN0IC0gKCBodHRwOi8vd3d3LndpbmltYWdlLmNvbS96TGliRGxsL21pbml6aXAuaHRtbCApCisKKyAgICAgICAgIENvcHlyaWdodCAoQykgMTk5OC0yMDEwIEdpbGxlcyBWb2xsYW50IChtaW5pemlwKSAoIGh0dHA6Ly93d3cud2luaW1hZ2UuY29tL3pMaWJEbGwvbWluaXppcC5odG1sICkKKworICAgICAgICAgTW9kaWZpY2F0aW9ucyBmb3IgWmlwNjQgc3VwcG9ydAorICAgICAgICAgQ29weXJpZ2h0IChDKSAyMDA5LTIwMTAgTWF0aGlhcyBTdmVuc3NvbiAoIGh0dHA6Ly9yZXN1bHQ0Mi5jb20gKQorCisgICAgICAgICBGb3IgbW9yZSBpbmZvIHJlYWQgTWluaVppcF9pbmZvLnR4dAorCisgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgQ29uZGl0aW9uIG9mIHVzZSBhbmQgZGlzdHJpYnV0aW9uIGFyZSB0aGUgc2FtZSB0aGFuIHpsaWIgOgorCisgIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCisgIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKKyAgYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KKworICBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKKyAgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAorICBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CisKKyAgMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKKyAgICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKKyAgICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCisgICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCisgIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCisgICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KKyAgMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KKworICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICBDaGFuZ2VzCisKKyAgICAgICAgU2VlIGhlYWRlciBvZiB6aXAuaAorCisqLworCisjaWZuZGVmIF96aXAxMl9ICisjZGVmaW5lIF96aXAxMl9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLy8jZGVmaW5lIEhBVkVfQlpJUDIKKworI2lmbmRlZiBfWkxJQl9ICisjaW5jbHVkZSAiemxpYi5oIgorI2VuZGlmCisKKyNpZm5kZWYgX1pMSUJJT0FQSV9ICisjaW5jbHVkZSAiaW9hcGkuaCIKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9CWklQMgorI2luY2x1ZGUgImJ6bGliLmgiCisjZW5kaWYKKworI2RlZmluZSBaX0JaSVAyRUQgMTIKKworI2lmIGRlZmluZWQoU1RSSUNUWklQKSB8fCBkZWZpbmVkKFNUUklDVFpJUFVOWklQKQorLyogbGlrZSB0aGUgU1RSSUNUIG9mIFdJTjMyLCB3ZSBkZWZpbmUgYSBwb2ludGVyIHRoYXQgY2Fubm90IGJlIGNvbnZlcnRlZAorICAgIGZyb20gKHZvaWQqKSB3aXRob3V0IGNhc3QgKi8KK3R5cGVkZWYgc3RydWN0IFRhZ3ppcEZpbGVfXyB7IGludCB1bnVzZWQ7IH0gemlwRmlsZV9fOwordHlwZWRlZiB6aXBGaWxlX18gKnppcEZpbGU7CisjZWxzZQordHlwZWRlZiB2b2lkcCB6aXBGaWxlOworI2VuZGlmCisKKyNkZWZpbmUgWklQX09LICAgICAgICAgICAgICAgICAgICAgICAgICAoMCkKKyNkZWZpbmUgWklQX0VPRiAgICAgICAgICAgICAgICAgICAgICAgICAoMCkKKyNkZWZpbmUgWklQX0VSUk5PICAgICAgICAgICAgICAgICAgICAgICAoWl9FUlJOTykKKyNkZWZpbmUgWklQX1BBUkFNRVJST1IgICAgICAgICAgICAgICAgICAoLTEwMikKKyNkZWZpbmUgWklQX0JBRFpJUEZJTEUgICAgICAgICAgICAgICAgICAoLTEwMykKKyNkZWZpbmUgWklQX0lOVEVSTkFMRVJST1IgICAgICAgICAgICAgICAoLTEwNCkKKworI2lmbmRlZiBERUZfTUVNX0xFVkVMCisjICBpZiBNQVhfTUVNX0xFVkVMID49IDgKKyMgICAgZGVmaW5lIERFRl9NRU1fTEVWRUwgOAorIyAgZWxzZQorIyAgICBkZWZpbmUgREVGX01FTV9MRVZFTCAgTUFYX01FTV9MRVZFTAorIyAgZW5kaWYKKyNlbmRpZgorLyogZGVmYXVsdCBtZW1MZXZlbCAqLworCisvKiB0bV96aXAgY29udGFpbiBkYXRlL3RpbWUgaW5mbyAqLwordHlwZWRlZiBzdHJ1Y3QgdG1femlwX3MKK3sKKyAgICB1SW50IHRtX3NlYzsgICAgICAgICAgICAvKiBzZWNvbmRzIGFmdGVyIHRoZSBtaW51dGUgLSBbMCw1OV0gKi8KKyAgICB1SW50IHRtX21pbjsgICAgICAgICAgICAvKiBtaW51dGVzIGFmdGVyIHRoZSBob3VyIC0gWzAsNTldICovCisgICAgdUludCB0bV9ob3VyOyAgICAgICAgICAgLyogaG91cnMgc2luY2UgbWlkbmlnaHQgLSBbMCwyM10gKi8KKyAgICB1SW50IHRtX21kYXk7ICAgICAgICAgICAvKiBkYXkgb2YgdGhlIG1vbnRoIC0gWzEsMzFdICovCisgICAgdUludCB0bV9tb247ICAgICAgICAgICAgLyogbW9udGhzIHNpbmNlIEphbnVhcnkgLSBbMCwxMV0gKi8KKyAgICB1SW50IHRtX3llYXI7ICAgICAgICAgICAvKiB5ZWFycyAtIFsxOTgwLi4yMDQ0XSAqLworfSB0bV96aXA7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdG1femlwICAgICAgdG16X2RhdGU7ICAgICAgIC8qIGRhdGUgaW4gdW5kZXJzdGFuZGFibGUgZm9ybWF0ICAgICAgICAgICAqLworICAgIHVMb25nICAgICAgIGRvc0RhdGU7ICAgICAgIC8qIGlmIGRvc19kYXRlID09IDAsIHRtdV9kYXRlIGlzIHVzZWQgICAgICAqLworLyogICAgdUxvbmcgICAgICAgZmxhZzsgICAgICAgICovICAgLyogZ2VuZXJhbCBwdXJwb3NlIGJpdCBmbGFnICAgICAgICAyIGJ5dGVzICovCisKKyAgICB1TG9uZyAgICAgICBpbnRlcm5hbF9mYTsgICAgLyogaW50ZXJuYWwgZmlsZSBhdHRyaWJ1dGVzICAgICAgICAyIGJ5dGVzICovCisgICAgdUxvbmcgICAgICAgZXh0ZXJuYWxfZmE7ICAgIC8qIGV4dGVybmFsIGZpbGUgYXR0cmlidXRlcyAgICAgICAgNCBieXRlcyAqLworfSB6aXBfZmlsZWluZm87CisKK3R5cGVkZWYgY29uc3QgY2hhciogemlwY2hhcnBjOworCisKKyNkZWZpbmUgQVBQRU5EX1NUQVRVU19DUkVBVEUgICAgICAgICgwKQorI2RlZmluZSBBUFBFTkRfU1RBVFVTX0NSRUFURUFGVEVSICAgKDEpCisjZGVmaW5lIEFQUEVORF9TVEFUVVNfQURESU5aSVAgICAgICAoMikKKworZXh0ZXJuIHppcEZpbGUgWkVYUE9SVCB6aXBPcGVuIE9GKChjb25zdCBjaGFyICpwYXRobmFtZSwgaW50IGFwcGVuZCkpOworZXh0ZXJuIHppcEZpbGUgWkVYUE9SVCB6aXBPcGVuNjQgT0YoKGNvbnN0IHZvaWQgKnBhdGhuYW1lLCBpbnQgYXBwZW5kKSk7CisvKgorICBDcmVhdGUgYSB6aXBmaWxlLgorICAgICBwYXRobmFtZSBjb250YWluIG9uIFdpbmRvd3MgWFAgYSBmaWxlbmFtZSBsaWtlICJjOlxcemxpYlxcemxpYjExMy56aXAiIG9yIG9uCisgICAgICAgYW4gVW5peCBjb21wdXRlciAiemxpYi96bGliMTEzLnppcCIuCisgICAgIGlmIHRoZSBmaWxlIHBhdGhuYW1lIGV4aXN0IGFuZCBhcHBlbmQ9PUFQUEVORF9TVEFUVVNfQ1JFQVRFQUZURVIsIHRoZSB6aXAKKyAgICAgICB3aWxsIGJlIGNyZWF0ZWQgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZS4KKyAgICAgICAgICh1c2VmdWwgaWYgdGhlIGZpbGUgY29udGFpbiBhIHNlbGYgZXh0cmFjdG9yIGNvZGUpCisgICAgIGlmIHRoZSBmaWxlIHBhdGhuYW1lIGV4aXN0IGFuZCBhcHBlbmQ9PUFQUEVORF9TVEFUVVNfQURESU5aSVAsIHdlIHdpbGwKKyAgICAgICBhZGQgZmlsZXMgaW4gZXhpc3RpbmcgemlwIChiZSBzdXJlIHlvdSBkb24ndCBhZGQgZmlsZSB0aGF0IGRvZXNuJ3QgZXhpc3QpCisgICAgIElmIHRoZSB6aXBmaWxlIGNhbm5vdCBiZSBvcGVuZWQsIHRoZSByZXR1cm4gdmFsdWUgaXMgTlVMTC4KKyAgICAgRWxzZSwgdGhlIHJldHVybiB2YWx1ZSBpcyBhIHppcEZpbGUgSGFuZGxlLCB1c2FibGUgd2l0aCBvdGhlciBmdW5jdGlvbgorICAgICAgIG9mIHRoaXMgemlwIHBhY2thZ2UuCisqLworCisvKiBOb3RlIDogdGhlcmUgaXMgbm8gZGVsZXRlIGZ1bmN0aW9uIGludG8gYSB6aXBmaWxlLgorICAgSWYgeW91IHdhbnQgZGVsZXRlIGZpbGUgaW50byBhIHppcGZpbGUsIHlvdSBtdXN0IG9wZW4gYSB6aXBmaWxlLCBhbmQgY3JlYXRlIGFub3RoZXIKKyAgIE9mIGNvdXNlLCB5b3UgY2FuIHVzZSBSQVcgcmVhZGluZyBhbmQgd3JpdGluZyB0byBjb3B5IHRoZSBmaWxlIHlvdSBkaWQgbm90IHdhbnQgZGVsdGUKKyovCisKK2V4dGVybiB6aXBGaWxlIFpFWFBPUlQgemlwT3BlbjIgT0YoKGNvbnN0IGNoYXIgKnBhdGhuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXBwZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aXBjaGFycGMqIGdsb2JhbGNvbW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpsaWJfZmlsZWZ1bmNfZGVmKiBwemxpYl9maWxlZnVuY19kZWYpKTsKKworZXh0ZXJuIHppcEZpbGUgWkVYUE9SVCB6aXBPcGVuMl82NCBPRigoY29uc3Qgdm9pZCAqcGF0aG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhcHBlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHppcGNoYXJwYyogZ2xvYmFsY29tbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemxpYl9maWxlZnVuYzY0X2RlZiogcHpsaWJfZmlsZWZ1bmNfZGVmKSk7CisKK2V4dGVybiBpbnQgWkVYUE9SVCB6aXBPcGVuTmV3RmlsZUluWmlwIE9GKCh6aXBGaWxlIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB6aXBfZmlsZWluZm8qIHppcGZpLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBleHRyYWZpZWxkX2xvY2FsLAorICAgICAgICAgICAgICAgICAgICAgICB1SW50IHNpemVfZXh0cmFmaWVsZF9sb2NhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogZXh0cmFmaWVsZF9nbG9iYWwsCisgICAgICAgICAgICAgICAgICAgICAgIHVJbnQgc2l6ZV9leHRyYWZpZWxkX2dsb2JhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogY29tbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IG1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IGxldmVsKSk7CisKK2V4dGVybiBpbnQgWkVYUE9SVCB6aXBPcGVuTmV3RmlsZUluWmlwNjQgT0YoKHppcEZpbGUgZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHppcF9maWxlaW5mbyogemlwZmksCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIGV4dHJhZmllbGRfbG9jYWwsCisgICAgICAgICAgICAgICAgICAgICAgIHVJbnQgc2l6ZV9leHRyYWZpZWxkX2xvY2FsLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBleHRyYWZpZWxkX2dsb2JhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgdUludCBzaXplX2V4dHJhZmllbGRfZ2xvYmFsLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBjb21tZW50LAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgIGludCB6aXA2NCkpOworCisvKgorICBPcGVuIGEgZmlsZSBpbiB0aGUgWklQIGZvciB3cml0aW5nLgorICBmaWxlbmFtZSA6IHRoZSBmaWxlbmFtZSBpbiB6aXAgKGlmIE5VTEwsICctJyB3aXRob3V0IHF1b3RlIHdpbGwgYmUgdXNlZAorICAqemlwZmkgY29udGFpbiBzdXBwbGVtZW50YWwgaW5mb3JtYXRpb24KKyAgaWYgZXh0cmFmaWVsZF9sb2NhbCE9TlVMTCBhbmQgc2l6ZV9leHRyYWZpZWxkX2xvY2FsPjAsIGV4dHJhZmllbGRfbG9jYWwKKyAgICBjb250YWlucyB0aGUgZXh0cmFmaWVsZCBkYXRhIHRoZSB0aGUgbG9jYWwgaGVhZGVyCisgIGlmIGV4dHJhZmllbGRfZ2xvYmFsIT1OVUxMIGFuZCBzaXplX2V4dHJhZmllbGRfZ2xvYmFsPjAsIGV4dHJhZmllbGRfZ2xvYmFsCisgICAgY29udGFpbnMgdGhlIGV4dHJhZmllbGQgZGF0YSB0aGUgdGhlIGxvY2FsIGhlYWRlcgorICBpZiBjb21tZW50ICE9IE5VTEwsIGNvbW1lbnQgY29udGFpbiB0aGUgY29tbWVudCBzdHJpbmcKKyAgbWV0aG9kIGNvbnRhaW4gdGhlIGNvbXByZXNzaW9uIG1ldGhvZCAoMCBmb3Igc3RvcmUsIFpfREVGTEFURUQgZm9yIGRlZmxhdGUpCisgIGxldmVsIGNvbnRhaW4gdGhlIGxldmVsIG9mIGNvbXByZXNzaW9uIChjYW4gYmUgWl9ERUZBVUxUX0NPTVBSRVNTSU9OKQorICB6aXA2NCBpcyBzZXQgdG8gMSBpZiBhIHppcDY0IGV4dGVuZGVkIGluZm9ybWF0aW9uIGJsb2NrIHNob3VsZCBiZSBhZGRlZCB0byB0aGUgbG9jYWwgZmlsZSBoZWFkZXIuCisgICAgICAgICAgICAgICAgICAgIHRoaXMgTVVTVCBiZSAnMScgaWYgdGhlIHVuY29tcHJlc3NlZCBzaXplIGlzID49IDB4ZmZmZmZmZmYuCisKKyovCisKKworZXh0ZXJuIGludCBaRVhQT1JUIHppcE9wZW5OZXdGaWxlSW5aaXAyIE9GKCh6aXBGaWxlIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB6aXBfZmlsZWluZm8qIHppcGZpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBleHRyYWZpZWxkX2xvY2FsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1SW50IHNpemVfZXh0cmFmaWVsZF9sb2NhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogZXh0cmFmaWVsZF9nbG9iYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVJbnQgc2l6ZV9leHRyYWZpZWxkX2dsb2JhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogY29tbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmF3KSk7CisKKworZXh0ZXJuIGludCBaRVhQT1JUIHppcE9wZW5OZXdGaWxlSW5aaXAyXzY0IE9GKCh6aXBGaWxlIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB6aXBfZmlsZWluZm8qIHppcGZpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBleHRyYWZpZWxkX2xvY2FsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1SW50IHNpemVfZXh0cmFmaWVsZF9sb2NhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogZXh0cmFmaWVsZF9nbG9iYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVJbnQgc2l6ZV9leHRyYWZpZWxkX2dsb2JhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogY29tbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmF3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgemlwNjQpKTsKKy8qCisgIFNhbWUgdGhhbiB6aXBPcGVuTmV3RmlsZUluWmlwLCBleGNlcHQgaWYgcmF3PTEsIHdlIHdyaXRlIHJhdyBmaWxlCisgKi8KKworZXh0ZXJuIGludCBaRVhQT1JUIHppcE9wZW5OZXdGaWxlSW5aaXAzIE9GKCh6aXBGaWxlIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB6aXBfZmlsZWluZm8qIHppcGZpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBleHRyYWZpZWxkX2xvY2FsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1SW50IHNpemVfZXh0cmFmaWVsZF9sb2NhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogZXh0cmFmaWVsZF9nbG9iYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVJbnQgc2l6ZV9leHRyYWZpZWxkX2dsb2JhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogY29tbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmF3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2luZG93Qml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1lbUxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHBhc3N3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1TG9uZyBjcmNGb3JDcnlwdGluZykpOworCitleHRlcm4gaW50IFpFWFBPUlQgemlwT3Blbk5ld0ZpbGVJblppcDNfNjQgT0YoKHppcEZpbGUgZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHppcF9maWxlaW5mbyogemlwZmksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIGV4dHJhZmllbGRfbG9jYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVJbnQgc2l6ZV9leHRyYWZpZWxkX2xvY2FsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBleHRyYWZpZWxkX2dsb2JhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdUludCBzaXplX2V4dHJhZmllbGRfZ2xvYmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBjb21tZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByYXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aW5kb3dCaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWVtTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcGFzc3dvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVMb25nIGNyY0ZvckNyeXB0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgemlwNjQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSk7CisKKy8qCisgIFNhbWUgdGhhbiB6aXBPcGVuTmV3RmlsZUluWmlwMiwgZXhjZXB0CisgICAgd2luZG93Qml0cyxtZW1MZXZlbCwsc3RyYXRlZ3kgOiBzZWUgcGFyYW1ldGVyIHN0cmF0ZWd5IGluIGRlZmxhdGVJbml0MgorICAgIHBhc3N3b3JkIDogY3J5cHRpbmcgcGFzc3dvcmQgKE5VTEwgZm9yIG5vIGNyeXB0aW5nKQorICAgIGNyY0ZvckNyeXB0aW5nIDogY3JjIG9mIGZpbGUgdG8gY29tcHJlc3MgKG5lZWRlZCBmb3IgY3J5cHRpbmcpCisgKi8KKworZXh0ZXJuIGludCBaRVhQT1JUIHppcE9wZW5OZXdGaWxlSW5aaXA0IE9GKCh6aXBGaWxlIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB6aXBfZmlsZWluZm8qIHppcGZpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBleHRyYWZpZWxkX2xvY2FsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1SW50IHNpemVfZXh0cmFmaWVsZF9sb2NhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogZXh0cmFmaWVsZF9nbG9iYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVJbnQgc2l6ZV9leHRyYWZpZWxkX2dsb2JhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogY29tbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmF3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2luZG93Qml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1lbUxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHBhc3N3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1TG9uZyBjcmNGb3JDcnlwdGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdUxvbmcgdmVyc2lvbk1hZGVCeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdUxvbmcgZmxhZ0Jhc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSk7CisKKworZXh0ZXJuIGludCBaRVhQT1JUIHppcE9wZW5OZXdGaWxlSW5aaXA0XzY0IE9GKCh6aXBGaWxlIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB6aXBfZmlsZWluZm8qIHppcGZpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBleHRyYWZpZWxkX2xvY2FsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1SW50IHNpemVfZXh0cmFmaWVsZF9sb2NhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogZXh0cmFmaWVsZF9nbG9iYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVJbnQgc2l6ZV9leHRyYWZpZWxkX2dsb2JhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogY29tbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmF3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2luZG93Qml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1lbUxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHBhc3N3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1TG9uZyBjcmNGb3JDcnlwdGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdUxvbmcgdmVyc2lvbk1hZGVCeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdUxvbmcgZmxhZ0Jhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB6aXA2NAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKTsKKy8qCisgIFNhbWUgdGhhbiB6aXBPcGVuTmV3RmlsZUluWmlwNCwgZXhjZXB0CisgICAgdmVyc2lvbk1hZGVCeSA6IHZhbHVlIGZvciBWZXJzaW9uIG1hZGUgYnkgZmllbGQKKyAgICBmbGFnIDogdmFsdWUgZm9yIGZsYWcgZmllbGQgKGNvbXByZXNzaW9uIGxldmVsIGluZm8gd2lsbCBiZSBhZGRlZCkKKyAqLworCisKK2V4dGVybiBpbnQgWkVYUE9SVCB6aXBXcml0ZUluRmlsZUluWmlwIE9GKCh6aXBGaWxlIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbGVuKSk7CisvKgorICBXcml0ZSBkYXRhIGluIHRoZSB6aXBmaWxlCisqLworCitleHRlcm4gaW50IFpFWFBPUlQgemlwQ2xvc2VGaWxlSW5aaXAgT0YoKHppcEZpbGUgZmlsZSkpOworLyoKKyAgQ2xvc2UgdGhlIGN1cnJlbnQgZmlsZSBpbiB0aGUgemlwZmlsZQorKi8KKworZXh0ZXJuIGludCBaRVhQT1JUIHppcENsb3NlRmlsZUluWmlwUmF3IE9GKCh6aXBGaWxlIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVMb25nIHVuY29tcHJlc3NlZF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1TG9uZyBjcmMzMikpOworCitleHRlcm4gaW50IFpFWFBPUlQgemlwQ2xvc2VGaWxlSW5aaXBSYXc2NCBPRigoemlwRmlsZSBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaUE9TNjRfVCB1bmNvbXByZXNzZWRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdUxvbmcgY3JjMzIpKTsKKworLyoKKyAgQ2xvc2UgdGhlIGN1cnJlbnQgZmlsZSBpbiB0aGUgemlwZmlsZSwgZm9yIGZpbGUgb3BlbmVkIHdpdGgKKyAgICBwYXJhbWV0ZXIgcmF3PTEgaW4gemlwT3Blbk5ld0ZpbGVJblppcDIKKyAgdW5jb21wcmVzc2VkX3NpemUgYW5kIGNyYzMyIGFyZSB2YWx1ZSBmb3IgdGhlIHVuY29tcHJlc3NlZCBzaXplCisqLworCitleHRlcm4gaW50IFpFWFBPUlQgemlwQ2xvc2UgT0YoKHppcEZpbGUgZmlsZSwKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBnbG9iYWxfY29tbWVudCkpOworLyoKKyAgQ2xvc2UgdGhlIHppcGZpbGUKKyovCisKKworZXh0ZXJuIGludCBaRVhQT1JUIHppcFJlbW92ZUV4dHJhSW5mb0Jsb2NrIE9GKChjaGFyKiBwRGF0YSwgaW50KiBkYXRhTGVuLCBzaG9ydCBzSGVhZGVyKSk7CisvKgorICB6aXBSZW1vdmVFeHRyYUluZm9CbG9jayAtICBBZGRlZCBieSBNYXRoaWFzIFN2ZW5zc29uCisKKyAgUmVtb3ZlIGV4dHJhIGluZm9ybWF0aW9uIGJsb2NrIGZyb20gYSBleHRyYSBpbmZvcm1hdGlvbiBkYXRhIGZvciB0aGUgbG9jYWwgZmlsZSBoZWFkZXIgb3IgY2VudHJhbCBkaXJlY3RvcnkgaGVhZGVyCisKKyAgSXQgaXMgbmVlZGVkIHRvIHJlbW92ZSBaSVA2NCBleHRyYSBpbmZvcm1hdGlvbiBibG9ja3Mgd2hlbiBiZWZvcmUgZGF0YSBpcyB3cml0dGVuIGlmIHVzaW5nIFJBVyBtb2RlLgorCisgIDB4MDAwMSBpcyB0aGUgc2lnbmF0dXJlIGhlYWRlciBmb3IgdGhlIFpJUDY0IGV4dHJhIGluZm9ybWF0aW9uIGJsb2NrcworCisgIHVzYWdlLgorICAgICAgICAgICAgICAgICAgICAgICAgUmVtb3ZlIFpJUDY0IEV4dHJhIGluZm9ybWF0aW9uIGZyb20gYSBjZW50cmFsIGRpcmVjdG9yIGV4dHJhIGZpZWxkIGRhdGEKKyAgICAgICAgICAgICAgemlwUmVtb3ZlRXh0cmFJbmZvQmxvY2socENlbkRpckV4dHJhRmllbGREYXRhLCAmbkNlbkRpckV4dHJhRmllbGREYXRhTGVuLCAweDAwMDEpOworCisgICAgICAgICAgICAgICAgICAgICAgICBSZW1vdmUgWklQNjQgRXh0cmEgaW5mb3JtYXRpb24gZnJvbSBhIExvY2FsIEZpbGUgSGVhZGVyIGV4dHJhIGZpZWxkIGRhdGEKKyAgICAgICAgemlwUmVtb3ZlRXh0cmFJbmZvQmxvY2socExvY2FsSGVhZGVyRXh0cmFGaWVsZERhdGEsICZuTG9jYWxIZWFkZXJFeHRyYUZpZWxkRGF0YUxlbiwgMHgwMDAxKTsKKyovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfemlwNjRfSCAqLwpkaWZmIC0tZ2l0IGEvemxpYi0xLjIuNi9jb250cmliL3Bhc2NhbC9leGFtcGxlLnBhcyBiL3psaWItMS4yLjYvY29udHJpYi9wYXNjYWwvZXhhbXBsZS5wYXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTUxOGIzNgotLS0gL2Rldi9udWxsCisrKyBiL3psaWItMS4yLjYvY29udHJpYi9wYXNjYWwvZXhhbXBsZS5wYXMKQEAgLTAsMCArMSw1OTkgQEAKKygqIGV4YW1wbGUuYyAtLSB1c2FnZSBleGFtcGxlIG9mIHRoZSB6bGliIGNvbXByZXNzaW9uIGxpYnJhcnkKKyAqIENvcHlyaWdodCAoQykgMTk5NS0yMDAzIEplYW4tbG91cCBHYWlsbHkuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCisgKgorICogUGFzY2FsIHRyYW5zbGF0aW9uCisgKiBDb3B5cmlnaHQgKEMpIDE5OTggYnkgSmFjcXVlcyBOb21zc2kgTnphbGkuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gcmVhZG1lLnR4dAorICoKKyAqIEFkYXB0YXRpb24gdG8gdGhlIHpsaWJwYXMgaW50ZXJmYWNlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgYnkgQ29zbWluIFRydXRhLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHJlYWRtZS50eHQKKyAqKQorCitwcm9ncmFtIGV4YW1wbGU7CisKK3skREVGSU5FIFRFU1RfQ09NUFJFU1N9Cit7RE8gTk9UICRERUZJTkUgVEVTVF9HWklPfQoreyRERUZJTkUgVEVTVF9ERUZMQVRFfQoreyRERUZJTkUgVEVTVF9JTkZMQVRFfQoreyRERUZJTkUgVEVTVF9GTFVTSH0KK3skREVGSU5FIFRFU1RfU1lOQ30KK3skREVGSU5FIFRFU1RfRElDVH0KKwordXNlcyBTeXNVdGlscywgemxpYnBhczsKKworY29uc3QgVEVTVEZJTEUgPSAnZm9vLmd6JzsKKworKCogImhlbGxvIHdvcmxkIiB3b3VsZCBiZSBtb3JlIHN0YW5kYXJkLCBidXQgdGhlIHJlcGVhdGVkICJoZWxsbyIKKyAqIHN0cmVzc2VzIHRoZSBjb21wcmVzc2lvbiBjb2RlIGJldHRlciwgc29ycnkuLi4KKyAqKQorY29uc3QgaGVsbG86IFBDaGFyID0gJ2hlbGxvLCBoZWxsbyEnOworCitjb25zdCBkaWN0aW9uYXJ5OiBQQ2hhciA9ICdoZWxsbyc7CisKK3ZhciBkaWN0SWQ6IExvbmdJbnQ7ICgqIEFkbGVyMzIgdmFsdWUgb2YgdGhlIGRpY3Rpb25hcnkgKikKKworcHJvY2VkdXJlIENIRUNLX0VSUihlcnI6IEludGVnZXI7IG1zZzogU3RyaW5nKTsKK2JlZ2luCisgIGlmIGVyciA8PiBaX09LIHRoZW4KKyAgYmVnaW4KKyAgICBXcml0ZUxuKG1zZywgJyBlcnJvcjogJywgZXJyKTsKKyAgICBIYWx0KDEpOworICBlbmQ7CitlbmQ7CisKK3Byb2NlZHVyZSBFWElUX0VSUihjb25zdCBtc2c6IFN0cmluZyk7CitiZWdpbgorICBXcml0ZUxuKCdFcnJvcjogJywgbXNnKTsKKyAgSGFsdCgxKTsKK2VuZDsKKworKCogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBUZXN0IGNvbXByZXNzIGFuZCB1bmNvbXByZXNzCisgKikKK3skSUZERUYgVEVTVF9DT01QUkVTU30KK3Byb2NlZHVyZSB0ZXN0X2NvbXByZXNzKGNvbXByOiBQb2ludGVyOyBjb21wckxlbjogTG9uZ0ludDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuY29tcHI6IFBvaW50ZXI7IHVuY29tcHJMZW46IExvbmdJbnQpOwordmFyIGVycjogSW50ZWdlcjsKKyAgICBsZW46IExvbmdJbnQ7CitiZWdpbgorICBsZW4gOj0gU3RyTGVuKGhlbGxvKSsxOworCisgIGVyciA6PSBjb21wcmVzcyhjb21wciwgY29tcHJMZW4sIGhlbGxvLCBsZW4pOworICBDSEVDS19FUlIoZXJyLCAnY29tcHJlc3MnKTsKKworICBTdHJDb3B5KFBDaGFyKHVuY29tcHIpLCAnZ2FyYmFnZScpOworCisgIGVyciA6PSB1bmNvbXByZXNzKHVuY29tcHIsIHVuY29tcHJMZW4sIGNvbXByLCBjb21wckxlbik7CisgIENIRUNLX0VSUihlcnIsICd1bmNvbXByZXNzJyk7CisKKyAgaWYgU3RyQ29tcChQQ2hhcih1bmNvbXByKSwgaGVsbG8pIDw+IDAgdGhlbgorICAgIEVYSVRfRVJSKCdiYWQgdW5jb21wcmVzcycpCisgIGVsc2UKKyAgICBXcml0ZUxuKCd1bmNvbXByZXNzKCk6ICcsIFBDaGFyKHVuY29tcHIpKTsKK2VuZDsKK3skRU5ESUZ9CisKKygqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogVGVzdCByZWFkL3dyaXRlIG9mIC5neiBmaWxlcworICopCit7JElGREVGIFRFU1RfR1pJT30KK3Byb2NlZHVyZSB0ZXN0X2d6aW8oY29uc3QgZm5hbWU6IFBDaGFyOyAoKiBjb21wcmVzc2VkIGZpbGUgbmFtZSAqKQorICAgICAgICAgICAgICAgICAgICB1bmNvbXByOiBQb2ludGVyOworICAgICAgICAgICAgICAgICAgICB1bmNvbXByTGVuOiBMb25nSW50KTsKK3ZhciBlcnI6IEludGVnZXI7CisgICAgbGVuOiBJbnRlZ2VyOworICAgIHpmaWxlOiBnekZpbGU7CisgICAgcG9zOiBMb25nSW50OworYmVnaW4KKyAgbGVuIDo9IFN0ckxlbihoZWxsbykrMTsKKworICB6ZmlsZSA6PSBnem9wZW4oZm5hbWUsICd3YicpOworICBpZiB6ZmlsZSA9IE5JTCB0aGVuCisgIGJlZ2luCisgICAgV3JpdGVMbignZ3pvcGVuIGVycm9yJyk7CisgICAgSGFsdCgxKTsKKyAgZW5kOworICBnenB1dGMoemZpbGUsICdoJyk7CisgIGlmIGd6cHV0cyh6ZmlsZSwgJ2VsbG8nKSA8PiA0IHRoZW4KKyAgYmVnaW4KKyAgICBXcml0ZUxuKCdnenB1dHMgZXJyOiAnLCBnemVycm9yKHpmaWxlLCBlcnIpKTsKKyAgICBIYWx0KDEpOworICBlbmQ7CisgIHskSUZERUYgR1pfRk9STUFUX1NUUklOR30KKyAgaWYgZ3pwcmludGYoemZpbGUsICcsICVzIScsICdoZWxsbycpIDw+IDggdGhlbgorICBiZWdpbgorICAgIFdyaXRlTG4oJ2d6cHJpbnRmIGVycjogJywgZ3plcnJvcih6ZmlsZSwgZXJyKSk7CisgICAgSGFsdCgxKTsKKyAgZW5kOworICB7JEVMU0V9CisgIGlmIGd6cHV0cyh6ZmlsZSwgJywgaGVsbG8hJykgPD4gOCB0aGVuCisgIGJlZ2luCisgICAgV3JpdGVMbignZ3pwdXRzIGVycjogJywgZ3plcnJvcih6ZmlsZSwgZXJyKSk7CisgICAgSGFsdCgxKTsKKyAgZW5kOworICB7JEVORElGfQorICBnenNlZWsoemZpbGUsIDEsIFNFRUtfQ1VSKTsgKCogYWRkIG9uZSB6ZXJvIGJ5dGUgKikKKyAgZ3pjbG9zZSh6ZmlsZSk7CisKKyAgemZpbGUgOj0gZ3pvcGVuKGZuYW1lLCAncmInKTsKKyAgaWYgemZpbGUgPSBOSUwgdGhlbgorICBiZWdpbgorICAgIFdyaXRlTG4oJ2d6b3BlbiBlcnJvcicpOworICAgIEhhbHQoMSk7CisgIGVuZDsKKworICBTdHJDb3B5KFBDaGFyKHVuY29tcHIpLCAnZ2FyYmFnZScpOworCisgIGlmIGd6cmVhZCh6ZmlsZSwgdW5jb21wciwgdW5jb21wckxlbikgPD4gbGVuIHRoZW4KKyAgYmVnaW4KKyAgICBXcml0ZUxuKCdnenJlYWQgZXJyOiAnLCBnemVycm9yKHpmaWxlLCBlcnIpKTsKKyAgICBIYWx0KDEpOworICBlbmQ7CisgIGlmIFN0ckNvbXAoUENoYXIodW5jb21wciksIGhlbGxvKSA8PiAwIHRoZW4KKyAgYmVnaW4KKyAgICBXcml0ZUxuKCdiYWQgZ3pyZWFkOiAnLCBQQ2hhcih1bmNvbXByKSk7CisgICAgSGFsdCgxKTsKKyAgZW5kCisgIGVsc2UKKyAgICBXcml0ZUxuKCdnenJlYWQoKTogJywgUENoYXIodW5jb21wcikpOworCisgIHBvcyA6PSBnenNlZWsoemZpbGUsIC04LCBTRUVLX0NVUik7CisgIGlmIChwb3MgPD4gNikgb3IgKGd6dGVsbCh6ZmlsZSkgPD4gcG9zKSB0aGVuCisgIGJlZ2luCisgICAgV3JpdGVMbignZ3pzZWVrIGVycm9yLCBwb3M9JywgcG9zLCAnLCBnenRlbGw9JywgZ3p0ZWxsKHpmaWxlKSk7CisgICAgSGFsdCgxKTsKKyAgZW5kOworCisgIGlmIGd6Z2V0Yyh6ZmlsZSkgPD4gJyAnIHRoZW4KKyAgYmVnaW4KKyAgICBXcml0ZUxuKCdnemdldGMgZXJyb3InKTsKKyAgICBIYWx0KDEpOworICBlbmQ7CisKKyAgaWYgZ3p1bmdldGMoJyAnLCB6ZmlsZSkgPD4gJyAnIHRoZW4KKyAgYmVnaW4KKyAgICBXcml0ZUxuKCdnenVuZ2V0YyBlcnJvcicpOworICAgIEhhbHQoMSk7CisgIGVuZDsKKworICBnemdldHMoemZpbGUsIFBDaGFyKHVuY29tcHIpLCB1bmNvbXByTGVuKTsKKyAgdW5jb21wckxlbiA6PSBTdHJMZW4oUENoYXIodW5jb21wcikpOworICBpZiB1bmNvbXByTGVuIDw+IDcgdGhlbiAoKiAiIGhlbGxvISIgKikKKyAgYmVnaW4KKyAgICBXcml0ZUxuKCdnemdldHMgZXJyIGFmdGVyIGd6c2VlazogJywgZ3plcnJvcih6ZmlsZSwgZXJyKSk7CisgICAgSGFsdCgxKTsKKyAgZW5kOworICBpZiBTdHJDb21wKFBDaGFyKHVuY29tcHIpLCBoZWxsbyArIDYpIDw+IDAgdGhlbgorICBiZWdpbgorICAgIFdyaXRlTG4oJ2JhZCBnemdldHMgYWZ0ZXIgZ3pzZWVrJyk7CisgICAgSGFsdCgxKTsKKyAgZW5kCisgIGVsc2UKKyAgICBXcml0ZUxuKCdnemdldHMoKSBhZnRlciBnenNlZWs6ICcsIFBDaGFyKHVuY29tcHIpKTsKKworICBnemNsb3NlKHpmaWxlKTsKK2VuZDsKK3skRU5ESUZ9CisKKygqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogVGVzdCBkZWZsYXRlIHdpdGggc21hbGwgYnVmZmVycworICopCit7JElGREVGIFRFU1RfREVGTEFURX0KK3Byb2NlZHVyZSB0ZXN0X2RlZmxhdGUoY29tcHI6IFBvaW50ZXI7IGNvbXByTGVuOiBMb25nSW50KTsKK3ZhciBjX3N0cmVhbTogel9zdHJlYW07ICgqIGNvbXByZXNzaW9uIHN0cmVhbSAqKQorICAgIGVycjogSW50ZWdlcjsKKyAgICBsZW46IExvbmdJbnQ7CitiZWdpbgorICBsZW4gOj0gU3RyTGVuKGhlbGxvKSsxOworCisgIGNfc3RyZWFtLnphbGxvYyA6PSBOSUw7CisgIGNfc3RyZWFtLnpmcmVlIDo9IE5JTDsKKyAgY19zdHJlYW0ub3BhcXVlIDo9IE5JTDsKKworICBlcnIgOj0gZGVmbGF0ZUluaXQoY19zdHJlYW0sIFpfREVGQVVMVF9DT01QUkVTU0lPTik7CisgIENIRUNLX0VSUihlcnIsICdkZWZsYXRlSW5pdCcpOworCisgIGNfc3RyZWFtLm5leHRfaW4gOj0gaGVsbG87CisgIGNfc3RyZWFtLm5leHRfb3V0IDo9IGNvbXByOworCisgIHdoaWxlIChjX3N0cmVhbS50b3RhbF9pbiA8PiBsZW4pIGFuZAorICAgICAgICAoY19zdHJlYW0udG90YWxfb3V0IDwgY29tcHJMZW4pIGRvCisgIGJlZ2luCisgICAgY19zdHJlYW0uYXZhaWxfb3V0IDo9IDE7IHsgZm9yY2Ugc21hbGwgYnVmZmVycyB9CisgICAgY19zdHJlYW0uYXZhaWxfaW4gOj0gMTsKKyAgICBlcnIgOj0gZGVmbGF0ZShjX3N0cmVhbSwgWl9OT19GTFVTSCk7CisgICAgQ0hFQ0tfRVJSKGVyciwgJ2RlZmxhdGUnKTsKKyAgZW5kOworCisgICgqIEZpbmlzaCB0aGUgc3RyZWFtLCBzdGlsbCBmb3JjaW5nIHNtYWxsIGJ1ZmZlcnM6ICopCisgIHdoaWxlIFRSVUUgZG8KKyAgYmVnaW4KKyAgICBjX3N0cmVhbS5hdmFpbF9vdXQgOj0gMTsKKyAgICBlcnIgOj0gZGVmbGF0ZShjX3N0cmVhbSwgWl9GSU5JU0gpOworICAgIGlmIGVyciA9IFpfU1RSRUFNX0VORCB0aGVuCisgICAgICBicmVhazsKKyAgICBDSEVDS19FUlIoZXJyLCAnZGVmbGF0ZScpOworICBlbmQ7CisKKyAgZXJyIDo9IGRlZmxhdGVFbmQoY19zdHJlYW0pOworICBDSEVDS19FUlIoZXJyLCAnZGVmbGF0ZUVuZCcpOworZW5kOworeyRFTkRJRn0KKworKCogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBUZXN0IGluZmxhdGUgd2l0aCBzbWFsbCBidWZmZXJzCisgKikKK3skSUZERUYgVEVTVF9JTkZMQVRFfQorcHJvY2VkdXJlIHRlc3RfaW5mbGF0ZShjb21wcjogUG9pbnRlcjsgY29tcHJMZW4gOiBMb25nSW50OworICAgICAgICAgICAgICAgICAgICAgICB1bmNvbXByOiBQb2ludGVyOyB1bmNvbXByTGVuIDogTG9uZ0ludCk7Cit2YXIgZXJyOiBJbnRlZ2VyOworICAgIGRfc3RyZWFtOiB6X3N0cmVhbTsgKCogZGVjb21wcmVzc2lvbiBzdHJlYW0gKikKK2JlZ2luCisgIFN0ckNvcHkoUENoYXIodW5jb21wciksICdnYXJiYWdlJyk7CisKKyAgZF9zdHJlYW0uemFsbG9jIDo9IE5JTDsKKyAgZF9zdHJlYW0uemZyZWUgOj0gTklMOworICBkX3N0cmVhbS5vcGFxdWUgOj0gTklMOworCisgIGRfc3RyZWFtLm5leHRfaW4gOj0gY29tcHI7CisgIGRfc3RyZWFtLmF2YWlsX2luIDo9IDA7CisgIGRfc3RyZWFtLm5leHRfb3V0IDo9IHVuY29tcHI7CisKKyAgZXJyIDo9IGluZmxhdGVJbml0KGRfc3RyZWFtKTsKKyAgQ0hFQ0tfRVJSKGVyciwgJ2luZmxhdGVJbml0Jyk7CisKKyAgd2hpbGUgKGRfc3RyZWFtLnRvdGFsX291dCA8IHVuY29tcHJMZW4pIGFuZAorICAgICAgICAoZF9zdHJlYW0udG90YWxfaW4gPCBjb21wckxlbikgZG8KKyAgYmVnaW4KKyAgICBkX3N0cmVhbS5hdmFpbF9vdXQgOj0gMTsgKCogZm9yY2Ugc21hbGwgYnVmZmVycyAqKQorICAgIGRfc3RyZWFtLmF2YWlsX2luIDo9IDE7CisgICAgZXJyIDo9IGluZmxhdGUoZF9zdHJlYW0sIFpfTk9fRkxVU0gpOworICAgIGlmIGVyciA9IFpfU1RSRUFNX0VORCB0aGVuCisgICAgICBicmVhazsKKyAgICBDSEVDS19FUlIoZXJyLCAnaW5mbGF0ZScpOworICBlbmQ7CisKKyAgZXJyIDo9IGluZmxhdGVFbmQoZF9zdHJlYW0pOworICBDSEVDS19FUlIoZXJyLCAnaW5mbGF0ZUVuZCcpOworCisgIGlmIFN0ckNvbXAoUENoYXIodW5jb21wciksIGhlbGxvKSA8PiAwIHRoZW4KKyAgICBFWElUX0VSUignYmFkIGluZmxhdGUnKQorICBlbHNlCisgICAgV3JpdGVMbignaW5mbGF0ZSgpOiAnLCBQQ2hhcih1bmNvbXByKSk7CitlbmQ7Cit7JEVORElGfQorCisoKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFRlc3QgZGVmbGF0ZSB3aXRoIGxhcmdlIGJ1ZmZlcnMgYW5kIGR5bmFtaWMgY2hhbmdlIG9mIGNvbXByZXNzaW9uIGxldmVsCisgKikKK3skSUZERUYgVEVTVF9ERUZMQVRFfQorcHJvY2VkdXJlIHRlc3RfbGFyZ2VfZGVmbGF0ZShjb21wcjogUG9pbnRlcjsgY29tcHJMZW46IExvbmdJbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuY29tcHI6IFBvaW50ZXI7IHVuY29tcHJMZW46IExvbmdJbnQpOwordmFyIGNfc3RyZWFtOiB6X3N0cmVhbTsgKCogY29tcHJlc3Npb24gc3RyZWFtICopCisgICAgZXJyOiBJbnRlZ2VyOworYmVnaW4KKyAgY19zdHJlYW0uemFsbG9jIDo9IE5JTDsKKyAgY19zdHJlYW0uemZyZWUgOj0gTklMOworICBjX3N0cmVhbS5vcGFxdWUgOj0gTklMOworCisgIGVyciA6PSBkZWZsYXRlSW5pdChjX3N0cmVhbSwgWl9CRVNUX1NQRUVEKTsKKyAgQ0hFQ0tfRVJSKGVyciwgJ2RlZmxhdGVJbml0Jyk7CisKKyAgY19zdHJlYW0ubmV4dF9vdXQgOj0gY29tcHI7CisgIGNfc3RyZWFtLmF2YWlsX291dCA6PSBJbnRlZ2VyKGNvbXByTGVuKTsKKworICAoKiBBdCB0aGlzIHBvaW50LCB1bmNvbXByIGlzIHN0aWxsIG1vc3RseSB6ZXJvZXMsIHNvIGl0IHNob3VsZCBjb21wcmVzcworICAgKiB2ZXJ5IHdlbGw6CisgICAqKQorICBjX3N0cmVhbS5uZXh0X2luIDo9IHVuY29tcHI7CisgIGNfc3RyZWFtLmF2YWlsX2luIDo9IEludGVnZXIodW5jb21wckxlbik7CisgIGVyciA6PSBkZWZsYXRlKGNfc3RyZWFtLCBaX05PX0ZMVVNIKTsKKyAgQ0hFQ0tfRVJSKGVyciwgJ2RlZmxhdGUnKTsKKyAgaWYgY19zdHJlYW0uYXZhaWxfaW4gPD4gMCB0aGVuCisgICAgRVhJVF9FUlIoJ2RlZmxhdGUgbm90IGdyZWVkeScpOworCisgICgqIEZlZWQgaW4gYWxyZWFkeSBjb21wcmVzc2VkIGRhdGEgYW5kIHN3aXRjaCB0byBubyBjb21wcmVzc2lvbjogKikKKyAgZGVmbGF0ZVBhcmFtcyhjX3N0cmVhbSwgWl9OT19DT01QUkVTU0lPTiwgWl9ERUZBVUxUX1NUUkFURUdZKTsKKyAgY19zdHJlYW0ubmV4dF9pbiA6PSBjb21wcjsKKyAgY19zdHJlYW0uYXZhaWxfaW4gOj0gSW50ZWdlcihjb21wckxlbiBkaXYgMik7CisgIGVyciA6PSBkZWZsYXRlKGNfc3RyZWFtLCBaX05PX0ZMVVNIKTsKKyAgQ0hFQ0tfRVJSKGVyciwgJ2RlZmxhdGUnKTsKKworICAoKiBTd2l0Y2ggYmFjayB0byBjb21wcmVzc2luZyBtb2RlOiAqKQorICBkZWZsYXRlUGFyYW1zKGNfc3RyZWFtLCBaX0JFU1RfQ09NUFJFU1NJT04sIFpfRklMVEVSRUQpOworICBjX3N0cmVhbS5uZXh0X2luIDo9IHVuY29tcHI7CisgIGNfc3RyZWFtLmF2YWlsX2luIDo9IEludGVnZXIodW5jb21wckxlbik7CisgIGVyciA6PSBkZWZsYXRlKGNfc3RyZWFtLCBaX05PX0ZMVVNIKTsKKyAgQ0hFQ0tfRVJSKGVyciwgJ2RlZmxhdGUnKTsKKworICBlcnIgOj0gZGVmbGF0ZShjX3N0cmVhbSwgWl9GSU5JU0gpOworICBpZiBlcnIgPD4gWl9TVFJFQU1fRU5EIHRoZW4KKyAgICBFWElUX0VSUignZGVmbGF0ZSBzaG91bGQgcmVwb3J0IFpfU1RSRUFNX0VORCcpOworCisgIGVyciA6PSBkZWZsYXRlRW5kKGNfc3RyZWFtKTsKKyAgQ0hFQ0tfRVJSKGVyciwgJ2RlZmxhdGVFbmQnKTsKK2VuZDsKK3skRU5ESUZ9CisKKygqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogVGVzdCBpbmZsYXRlIHdpdGggbGFyZ2UgYnVmZmVycworICopCit7JElGREVGIFRFU1RfSU5GTEFURX0KK3Byb2NlZHVyZSB0ZXN0X2xhcmdlX2luZmxhdGUoY29tcHI6IFBvaW50ZXI7IGNvbXByTGVuOiBMb25nSW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmNvbXByOiBQb2ludGVyOyB1bmNvbXByTGVuOiBMb25nSW50KTsKK3ZhciBlcnI6IEludGVnZXI7CisgICAgZF9zdHJlYW06IHpfc3RyZWFtOyAoKiBkZWNvbXByZXNzaW9uIHN0cmVhbSAqKQorYmVnaW4KKyAgU3RyQ29weShQQ2hhcih1bmNvbXByKSwgJ2dhcmJhZ2UnKTsKKworICBkX3N0cmVhbS56YWxsb2MgOj0gTklMOworICBkX3N0cmVhbS56ZnJlZSA6PSBOSUw7CisgIGRfc3RyZWFtLm9wYXF1ZSA6PSBOSUw7CisKKyAgZF9zdHJlYW0ubmV4dF9pbiA6PSBjb21wcjsKKyAgZF9zdHJlYW0uYXZhaWxfaW4gOj0gSW50ZWdlcihjb21wckxlbik7CisKKyAgZXJyIDo9IGluZmxhdGVJbml0KGRfc3RyZWFtKTsKKyAgQ0hFQ0tfRVJSKGVyciwgJ2luZmxhdGVJbml0Jyk7CisKKyAgd2hpbGUgVFJVRSBkbworICBiZWdpbgorICAgIGRfc3RyZWFtLm5leHRfb3V0IDo9IHVuY29tcHI7ICAgICAgICAgICAgKCogZGlzY2FyZCB0aGUgb3V0cHV0ICopCisgICAgZF9zdHJlYW0uYXZhaWxfb3V0IDo9IEludGVnZXIodW5jb21wckxlbik7CisgICAgZXJyIDo9IGluZmxhdGUoZF9zdHJlYW0sIFpfTk9fRkxVU0gpOworICAgIGlmIGVyciA9IFpfU1RSRUFNX0VORCB0aGVuCisgICAgICBicmVhazsKKyAgICBDSEVDS19FUlIoZXJyLCAnbGFyZ2UgaW5mbGF0ZScpOworICBlbmQ7CisKKyAgZXJyIDo9IGluZmxhdGVFbmQoZF9zdHJlYW0pOworICBDSEVDS19FUlIoZXJyLCAnaW5mbGF0ZUVuZCcpOworCisgIGlmIGRfc3RyZWFtLnRvdGFsX291dCA8PiAyICogdW5jb21wckxlbiArIGNvbXByTGVuIGRpdiAyIHRoZW4KKyAgYmVnaW4KKyAgICBXcml0ZUxuKCdiYWQgbGFyZ2UgaW5mbGF0ZTogJywgZF9zdHJlYW0udG90YWxfb3V0KTsKKyAgICBIYWx0KDEpOworICBlbmQKKyAgZWxzZQorICAgIFdyaXRlTG4oJ2xhcmdlX2luZmxhdGUoKTogT0snKTsKK2VuZDsKK3skRU5ESUZ9CisKKygqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogVGVzdCBkZWZsYXRlIHdpdGggZnVsbCBmbHVzaAorICopCit7JElGREVGIFRFU1RfRkxVU0h9Citwcm9jZWR1cmUgdGVzdF9mbHVzaChjb21wcjogUG9pbnRlcjsgdmFyIGNvbXByTGVuIDogTG9uZ0ludCk7Cit2YXIgY19zdHJlYW06IHpfc3RyZWFtOyAoKiBjb21wcmVzc2lvbiBzdHJlYW0gKikKKyAgICBlcnI6IEludGVnZXI7CisgICAgbGVuOiBJbnRlZ2VyOworYmVnaW4KKyAgbGVuIDo9IFN0ckxlbihoZWxsbykrMTsKKworICBjX3N0cmVhbS56YWxsb2MgOj0gTklMOworICBjX3N0cmVhbS56ZnJlZSA6PSBOSUw7CisgIGNfc3RyZWFtLm9wYXF1ZSA6PSBOSUw7CisKKyAgZXJyIDo9IGRlZmxhdGVJbml0KGNfc3RyZWFtLCBaX0RFRkFVTFRfQ09NUFJFU1NJT04pOworICBDSEVDS19FUlIoZXJyLCAnZGVmbGF0ZUluaXQnKTsKKworICBjX3N0cmVhbS5uZXh0X2luIDo9IGhlbGxvOworICBjX3N0cmVhbS5uZXh0X291dCA6PSBjb21wcjsKKyAgY19zdHJlYW0uYXZhaWxfaW4gOj0gMzsKKyAgY19zdHJlYW0uYXZhaWxfb3V0IDo9IEludGVnZXIoY29tcHJMZW4pOworICBlcnIgOj0gZGVmbGF0ZShjX3N0cmVhbSwgWl9GVUxMX0ZMVVNIKTsKKyAgQ0hFQ0tfRVJSKGVyciwgJ2RlZmxhdGUnKTsKKworICBJbmMoUEJ5dGVBcnJheShjb21wcileWzNdKTsgKCogZm9yY2UgYW4gZXJyb3IgaW4gZmlyc3QgY29tcHJlc3NlZCBibG9jayAqKQorICBjX3N0cmVhbS5hdmFpbF9pbiA6PSBsZW4gLSAzOworCisgIGVyciA6PSBkZWZsYXRlKGNfc3RyZWFtLCBaX0ZJTklTSCk7CisgIGlmIGVyciA8PiBaX1NUUkVBTV9FTkQgdGhlbgorICAgIENIRUNLX0VSUihlcnIsICdkZWZsYXRlJyk7CisKKyAgZXJyIDo9IGRlZmxhdGVFbmQoY19zdHJlYW0pOworICBDSEVDS19FUlIoZXJyLCAnZGVmbGF0ZUVuZCcpOworCisgIGNvbXByTGVuIDo9IGNfc3RyZWFtLnRvdGFsX291dDsKK2VuZDsKK3skRU5ESUZ9CisKKygqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogVGVzdCBpbmZsYXRlU3luYygpCisgKikKK3skSUZERUYgVEVTVF9TWU5DfQorcHJvY2VkdXJlIHRlc3Rfc3luYyhjb21wcjogUG9pbnRlcjsgY29tcHJMZW46IExvbmdJbnQ7CisgICAgICAgICAgICAgICAgICAgIHVuY29tcHI6IFBvaW50ZXI7IHVuY29tcHJMZW4gOiBMb25nSW50KTsKK3ZhciBlcnI6IEludGVnZXI7CisgICAgZF9zdHJlYW06IHpfc3RyZWFtOyAoKiBkZWNvbXByZXNzaW9uIHN0cmVhbSAqKQorYmVnaW4KKyAgU3RyQ29weShQQ2hhcih1bmNvbXByKSwgJ2dhcmJhZ2UnKTsKKworICBkX3N0cmVhbS56YWxsb2MgOj0gTklMOworICBkX3N0cmVhbS56ZnJlZSA6PSBOSUw7CisgIGRfc3RyZWFtLm9wYXF1ZSA6PSBOSUw7CisKKyAgZF9zdHJlYW0ubmV4dF9pbiA6PSBjb21wcjsKKyAgZF9zdHJlYW0uYXZhaWxfaW4gOj0gMjsgKCoganVzdCByZWFkIHRoZSB6bGliIGhlYWRlciAqKQorCisgIGVyciA6PSBpbmZsYXRlSW5pdChkX3N0cmVhbSk7CisgIENIRUNLX0VSUihlcnIsICdpbmZsYXRlSW5pdCcpOworCisgIGRfc3RyZWFtLm5leHRfb3V0IDo9IHVuY29tcHI7CisgIGRfc3RyZWFtLmF2YWlsX291dCA6PSBJbnRlZ2VyKHVuY29tcHJMZW4pOworCisgIGluZmxhdGUoZF9zdHJlYW0sIFpfTk9fRkxVU0gpOworICBDSEVDS19FUlIoZXJyLCAnaW5mbGF0ZScpOworCisgIGRfc3RyZWFtLmF2YWlsX2luIDo9IEludGVnZXIoY29tcHJMZW4tMik7ICAgKCogcmVhZCBhbGwgY29tcHJlc3NlZCBkYXRhICopCisgIGVyciA6PSBpbmZsYXRlU3luYyhkX3N0cmVhbSk7ICAgICAgICAgICAgICAgKCogYnV0IHNraXAgdGhlIGRhbWFnZWQgcGFydCAqKQorICBDSEVDS19FUlIoZXJyLCAnaW5mbGF0ZVN5bmMnKTsKKworICBlcnIgOj0gaW5mbGF0ZShkX3N0cmVhbSwgWl9GSU5JU0gpOworICBpZiBlcnIgPD4gWl9EQVRBX0VSUk9SIHRoZW4KKyAgICBFWElUX0VSUignaW5mbGF0ZSBzaG91bGQgcmVwb3J0IERBVEFfRVJST1InKTsKKyAgICAoKiBCZWNhdXNlIG9mIGluY29ycmVjdCBhZGxlcjMyICopCisKKyAgZXJyIDo9IGluZmxhdGVFbmQoZF9zdHJlYW0pOworICBDSEVDS19FUlIoZXJyLCAnaW5mbGF0ZUVuZCcpOworCisgIFdyaXRlTG4oJ2FmdGVyIGluZmxhdGVTeW5jKCk6IGhlbCcsIFBDaGFyKHVuY29tcHIpKTsKK2VuZDsKK3skRU5ESUZ9CisKKygqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogVGVzdCBkZWZsYXRlIHdpdGggcHJlc2V0IGRpY3Rpb25hcnkKKyAqKQoreyRJRkRFRiBURVNUX0RJQ1R9Citwcm9jZWR1cmUgdGVzdF9kaWN0X2RlZmxhdGUoY29tcHI6IFBvaW50ZXI7IGNvbXByTGVuOiBMb25nSW50KTsKK3ZhciBjX3N0cmVhbTogel9zdHJlYW07ICgqIGNvbXByZXNzaW9uIHN0cmVhbSAqKQorICAgIGVycjogSW50ZWdlcjsKK2JlZ2luCisgIGNfc3RyZWFtLnphbGxvYyA6PSBOSUw7CisgIGNfc3RyZWFtLnpmcmVlIDo9IE5JTDsKKyAgY19zdHJlYW0ub3BhcXVlIDo9IE5JTDsKKworICBlcnIgOj0gZGVmbGF0ZUluaXQoY19zdHJlYW0sIFpfQkVTVF9DT01QUkVTU0lPTik7CisgIENIRUNLX0VSUihlcnIsICdkZWZsYXRlSW5pdCcpOworCisgIGVyciA6PSBkZWZsYXRlU2V0RGljdGlvbmFyeShjX3N0cmVhbSwgZGljdGlvbmFyeSwgU3RyTGVuKGRpY3Rpb25hcnkpKTsKKyAgQ0hFQ0tfRVJSKGVyciwgJ2RlZmxhdGVTZXREaWN0aW9uYXJ5Jyk7CisKKyAgZGljdElkIDo9IGNfc3RyZWFtLmFkbGVyOworICBjX3N0cmVhbS5uZXh0X291dCA6PSBjb21wcjsKKyAgY19zdHJlYW0uYXZhaWxfb3V0IDo9IEludGVnZXIoY29tcHJMZW4pOworCisgIGNfc3RyZWFtLm5leHRfaW4gOj0gaGVsbG87CisgIGNfc3RyZWFtLmF2YWlsX2luIDo9IFN0ckxlbihoZWxsbykrMTsKKworICBlcnIgOj0gZGVmbGF0ZShjX3N0cmVhbSwgWl9GSU5JU0gpOworICBpZiBlcnIgPD4gWl9TVFJFQU1fRU5EIHRoZW4KKyAgICBFWElUX0VSUignZGVmbGF0ZSBzaG91bGQgcmVwb3J0IFpfU1RSRUFNX0VORCcpOworCisgIGVyciA6PSBkZWZsYXRlRW5kKGNfc3RyZWFtKTsKKyAgQ0hFQ0tfRVJSKGVyciwgJ2RlZmxhdGVFbmQnKTsKK2VuZDsKK3skRU5ESUZ9CisKKygqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogVGVzdCBpbmZsYXRlIHdpdGggYSBwcmVzZXQgZGljdGlvbmFyeQorICopCit7JElGREVGIFRFU1RfRElDVH0KK3Byb2NlZHVyZSB0ZXN0X2RpY3RfaW5mbGF0ZShjb21wcjogUG9pbnRlcjsgY29tcHJMZW46IExvbmdJbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5jb21wcjogUG9pbnRlcjsgdW5jb21wckxlbjogTG9uZ0ludCk7Cit2YXIgZXJyOiBJbnRlZ2VyOworICAgIGRfc3RyZWFtOiB6X3N0cmVhbTsgKCogZGVjb21wcmVzc2lvbiBzdHJlYW0gKikKK2JlZ2luCisgIFN0ckNvcHkoUENoYXIodW5jb21wciksICdnYXJiYWdlJyk7CisKKyAgZF9zdHJlYW0uemFsbG9jIDo9IE5JTDsKKyAgZF9zdHJlYW0uemZyZWUgOj0gTklMOworICBkX3N0cmVhbS5vcGFxdWUgOj0gTklMOworCisgIGRfc3RyZWFtLm5leHRfaW4gOj0gY29tcHI7CisgIGRfc3RyZWFtLmF2YWlsX2luIDo9IEludGVnZXIoY29tcHJMZW4pOworCisgIGVyciA6PSBpbmZsYXRlSW5pdChkX3N0cmVhbSk7CisgIENIRUNLX0VSUihlcnIsICdpbmZsYXRlSW5pdCcpOworCisgIGRfc3RyZWFtLm5leHRfb3V0IDo9IHVuY29tcHI7CisgIGRfc3RyZWFtLmF2YWlsX291dCA6PSBJbnRlZ2VyKHVuY29tcHJMZW4pOworCisgIHdoaWxlIFRSVUUgZG8KKyAgYmVnaW4KKyAgICBlcnIgOj0gaW5mbGF0ZShkX3N0cmVhbSwgWl9OT19GTFVTSCk7CisgICAgaWYgZXJyID0gWl9TVFJFQU1fRU5EIHRoZW4KKyAgICAgIGJyZWFrOworICAgIGlmIGVyciA9IFpfTkVFRF9ESUNUIHRoZW4KKyAgICBiZWdpbgorICAgICAgaWYgZF9zdHJlYW0uYWRsZXIgPD4gZGljdElkIHRoZW4KKyAgICAgICAgRVhJVF9FUlIoJ3VuZXhwZWN0ZWQgZGljdGlvbmFyeScpOworICAgICAgZXJyIDo9IGluZmxhdGVTZXREaWN0aW9uYXJ5KGRfc3RyZWFtLCBkaWN0aW9uYXJ5LCBTdHJMZW4oZGljdGlvbmFyeSkpOworICAgIGVuZDsKKyAgICBDSEVDS19FUlIoZXJyLCAnaW5mbGF0ZSB3aXRoIGRpY3QnKTsKKyAgZW5kOworCisgIGVyciA6PSBpbmZsYXRlRW5kKGRfc3RyZWFtKTsKKyAgQ0hFQ0tfRVJSKGVyciwgJ2luZmxhdGVFbmQnKTsKKworICBpZiBTdHJDb21wKFBDaGFyKHVuY29tcHIpLCBoZWxsbykgPD4gMCB0aGVuCisgICAgRVhJVF9FUlIoJ2JhZCBpbmZsYXRlIHdpdGggZGljdCcpCisgIGVsc2UKKyAgICBXcml0ZUxuKCdpbmZsYXRlIHdpdGggZGljdGlvbmFyeTogJywgUENoYXIodW5jb21wcikpOworZW5kOworeyRFTkRJRn0KKwordmFyIGNvbXByLCB1bmNvbXByOiBQb2ludGVyOworICAgIGNvbXByTGVuLCB1bmNvbXByTGVuOiBMb25nSW50OworCitiZWdpbgorICBpZiB6bGliVmVyc2lvbl4gPD4gWkxJQl9WRVJTSU9OWzFdIHRoZW4KKyAgICBFWElUX0VSUignSW5jb21wYXRpYmxlIHpsaWIgdmVyc2lvbicpOworCisgIFdyaXRlTG4oJ3psaWIgdmVyc2lvbjogJywgemxpYlZlcnNpb24pOworICBXcml0ZUxuKCd6bGliIGNvbXBpbGUgZmxhZ3M6ICcsIEZvcm1hdCgnMHgleCcsIFt6bGliQ29tcGlsZUZsYWdzXSkpOworCisgIGNvbXByTGVuIDo9IDEwMDAwICogU2l6ZU9mKEludGVnZXIpOyAoKiBkb24ndCBvdmVyZmxvdyBvbiBNU0RPUyAqKQorICB1bmNvbXByTGVuIDo9IGNvbXByTGVuOworICBHZXRNZW0oY29tcHIsIGNvbXByTGVuKTsKKyAgR2V0TWVtKHVuY29tcHIsIHVuY29tcHJMZW4pOworICBpZiAoY29tcHIgPSBOSUwpIG9yICh1bmNvbXByID0gTklMKSB0aGVuCisgICAgRVhJVF9FUlIoJ091dCBvZiBtZW1vcnknKTsKKyAgKCogY29tcHIgYW5kIHVuY29tcHIgYXJlIGNsZWFyZWQgdG8gYXZvaWQgcmVhZGluZyB1bmluaXRpYWxpemVkCisgICAqIGRhdGEgYW5kIHRvIGVuc3VyZSB0aGF0IHVuY29tcHIgY29tcHJlc3NlcyB3ZWxsLgorICAgKikKKyAgRmlsbENoYXIoY29tcHJeLCBjb21wckxlbiwgMCk7CisgIEZpbGxDaGFyKHVuY29tcHJeLCB1bmNvbXByTGVuLCAwKTsKKworICB7JElGREVGIFRFU1RfQ09NUFJFU1N9CisgIFdyaXRlTG4oJyoqIFRlc3RpbmcgY29tcHJlc3MnKTsKKyAgdGVzdF9jb21wcmVzcyhjb21wciwgY29tcHJMZW4sIHVuY29tcHIsIHVuY29tcHJMZW4pOworICB7JEVORElGfQorCisgIHskSUZERUYgVEVTVF9HWklPfQorICBXcml0ZUxuKCcqKiBUZXN0aW5nIGd6aW8nKTsKKyAgaWYgUGFyYW1Db3VudCA+PSAxIHRoZW4KKyAgICB0ZXN0X2d6aW8oUGFyYW1TdHIoMSksIHVuY29tcHIsIHVuY29tcHJMZW4pCisgIGVsc2UKKyAgICB0ZXN0X2d6aW8oVEVTVEZJTEUsIHVuY29tcHIsIHVuY29tcHJMZW4pOworICB7JEVORElGfQorCisgIHskSUZERUYgVEVTVF9ERUZMQVRFfQorICBXcml0ZUxuKCcqKiBUZXN0aW5nIGRlZmxhdGUgd2l0aCBzbWFsbCBidWZmZXJzJyk7CisgIHRlc3RfZGVmbGF0ZShjb21wciwgY29tcHJMZW4pOworICB7JEVORElGfQorICB7JElGREVGIFRFU1RfSU5GTEFURX0KKyAgV3JpdGVMbignKiogVGVzdGluZyBpbmZsYXRlIHdpdGggc21hbGwgYnVmZmVycycpOworICB0ZXN0X2luZmxhdGUoY29tcHIsIGNvbXByTGVuLCB1bmNvbXByLCB1bmNvbXByTGVuKTsKKyAgeyRFTkRJRn0KKworICB7JElGREVGIFRFU1RfREVGTEFURX0KKyAgV3JpdGVMbignKiogVGVzdGluZyBkZWZsYXRlIHdpdGggbGFyZ2UgYnVmZmVycycpOworICB0ZXN0X2xhcmdlX2RlZmxhdGUoY29tcHIsIGNvbXByTGVuLCB1bmNvbXByLCB1bmNvbXByTGVuKTsKKyAgeyRFTkRJRn0KKyAgeyRJRkRFRiBURVNUX0lORkxBVEV9CisgIFdyaXRlTG4oJyoqIFRlc3RpbmcgaW5mbGF0ZSB3aXRoIGxhcmdlIGJ1ZmZlcnMnKTsKKyAgdGVzdF9sYXJnZV9pbmZsYXRlKGNvbXByLCBjb21wckxlbiwgdW5jb21wciwgdW5jb21wckxlbik7CisgIHskRU5ESUZ9CisKKyAgeyRJRkRFRiBURVNUX0ZMVVNIfQorICBXcml0ZUxuKCcqKiBUZXN0aW5nIGRlZmxhdGUgd2l0aCBmdWxsIGZsdXNoJyk7CisgIHRlc3RfZmx1c2goY29tcHIsIGNvbXByTGVuKTsKKyAgeyRFTkRJRn0KKyAgeyRJRkRFRiBURVNUX1NZTkN9CisgIFdyaXRlTG4oJyoqIFRlc3RpbmcgaW5mbGF0ZVN5bmMnKTsKKyAgdGVzdF9zeW5jKGNvbXByLCBjb21wckxlbiwgdW5jb21wciwgdW5jb21wckxlbik7CisgIHskRU5ESUZ9CisgIGNvbXByTGVuIDo9IHVuY29tcHJMZW47CisKKyAgeyRJRkRFRiBURVNUX0RJQ1R9CisgIFdyaXRlTG4oJyoqIFRlc3RpbmcgZGVmbGF0ZSBhbmQgaW5mbGF0ZSB3aXRoIHByZXNldCBkaWN0aW9uYXJ5Jyk7CisgIHRlc3RfZGljdF9kZWZsYXRlKGNvbXByLCBjb21wckxlbik7CisgIHRlc3RfZGljdF9pbmZsYXRlKGNvbXByLCBjb21wckxlbiwgdW5jb21wciwgdW5jb21wckxlbik7CisgIHskRU5ESUZ9CisKKyAgRnJlZU1lbShjb21wciwgY29tcHJMZW4pOworICBGcmVlTWVtKHVuY29tcHIsIHVuY29tcHJMZW4pOworZW5kLgpkaWZmIC0tZ2l0IGEvemxpYi0xLjIuNi9jb250cmliL3Bhc2NhbC9yZWFkbWUudHh0IGIvemxpYi0xLjIuNi9jb250cmliL3Bhc2NhbC9yZWFkbWUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwZTg3YzgKLS0tIC9kZXYvbnVsbAorKysgYi96bGliLTEuMi42L2NvbnRyaWIvcGFzY2FsL3JlYWRtZS50eHQKQEAgLTAsMCArMSw3NiBAQAorCitUaGlzIGRpcmVjdG9yeSBjb250YWlucyBhIFBhc2NhbCAoRGVscGhpLCBLeWxpeCkgaW50ZXJmYWNlIHRvIHRoZQoremxpYiBkYXRhIGNvbXByZXNzaW9uIGxpYnJhcnkuCisKKworRGlyZWN0b3J5IGxpc3RpbmcKKz09PT09PT09PT09PT09PT09CisKK3psaWJkMzIubWFrICAgICBtYWtlZmlsZSBmb3IgQm9ybGFuZCBDKysKK2V4YW1wbGUucGFzICAgICB1c2FnZSBleGFtcGxlIG9mIHpsaWIKK3psaWJwYXMucGFzICAgICB0aGUgUGFzY2FsIGludGVyZmFjZSB0byB6bGliCityZWFkbWUudHh0ICAgICAgdGhpcyBmaWxlCisKKworQ29tcGF0aWJpbGl0eSBub3RlcworPT09PT09PT09PT09PT09PT09PQorCistIEFsdGhvdWdoIHRoZSBuYW1lICJ6bGliIiB3b3VsZCBoYXZlIGJlZW4gbW9yZSBub3JtYWwgZm9yIHRoZQorICB6bGlicGFzIHVuaXQsIHRoaXMgbmFtZSBpcyBhbHJlYWR5IHRha2VuIGJ5IEJvcmxhbmQncyBaTGliIHVuaXQuCisgIFRoaXMgaXMgc29tZWhvdyB1bmZvcnR1bmF0ZSwgYmVjYXVzZSB0aGF0IHVuaXQgaXMgbm90IGEgZ2VudWluZQorICBpbnRlcmZhY2UgdG8gdGhlIGZ1bGwtZmxlZGdlZCB6bGliIGZ1bmN0aW9uYWxpdHksIGJ1dCBhIHN1aXRlIG9mCisgIGNsYXNzIHdyYXBwZXJzIGFyb3VuZCB6bGliIHN0cmVhbXMuICBPdGhlciBlc3NlbnRpYWwgZmVhdHVyZXMsCisgIHN1Y2ggYXMgY2hlY2tzdW1zLCBhcmUgbWlzc2luZy4KKyAgSXQgd291bGQgaGF2ZSBiZWVuIG1vcmUgYXBwcm9wcmlhdGUgZm9yIHRoYXQgdW5pdCB0byBoYXZlIGEgbmFtZQorICBsaWtlICJaU3RyZWFtcyIsIG9yIHNvbWV0aGluZyBzaW1pbGFyLgorCistIFRoZSBDIGFuZCB6bGliLXN1cHBsaWVkIHR5cGVzIGludCwgdUludCwgbG9uZywgdUxvbmcsIGV0Yy4gYXJlCisgIHRyYW5zbGF0ZWQgZGlyZWN0bHkgaW50byBQYXNjYWwgdHlwZXMgb2Ygc2ltaWxhciBzaXplcyAoSW50ZWdlciwKKyAgTG9uZ0ludCwgZXRjLiksIHRvIGF2b2lkIG5hbWVzcGFjZSBwb2xsdXRpb24uICBJbiBwYXJ0aWN1bGFyLAorICB0aGVyZSBpcyBubyBjb252ZXJzaW9uIG9mIHVuc2lnbmVkIGludCBpbnRvIGEgUGFzY2FsIHVuc2lnbmVkCisgIGludGVnZXIuICBUaGUgV29yZCB0eXBlIGlzIG5vbi1wb3J0YWJsZSBhbmQgaGFzIHRoZSBzYW1lIHNpemUKKyAgKDE2IGJpdHMpIGJvdGggaW4gYSAxNi1iaXQgYW5kIGluIGEgMzItYml0IGVudmlyb25tZW50LCB1bmxpa2UKKyAgSW50ZWdlci4gIEV2ZW4gaWYgdGhlcmUgaXMgYSAzMi1iaXQgQ2FyZGluYWwgdHlwZSwgdGhlcmUgaXMgbm8KKyAgcmVhbCBuZWVkIGZvciB1bnNpZ25lZCBpbnQgaW4gemxpYiB1bmRlciBhIDMyLWJpdCBlbnZpcm9ubWVudC4KKworLSBFeGNlcHQgZm9yIHRoZSBjYWxsYmFja3MsIHRoZSB6bGliIGZ1bmN0aW9uIGludGVyZmFjZXMgYXJlCisgIGFzc3VtaW5nIHRoZSBjYWxsaW5nIGNvbnZlbnRpb24gbm9ybWFsbHkgdXNlZCBpbiBQYXNjYWwKKyAgKF9fcGFzY2FsIGZvciBET1MgYW5kIFdpbmRvd3MxNiwgX19mYXN0Y2FsbCBmb3IgV2luZG93czMyKS4KKyAgU2luY2UgdGhlIGNkZWNsIGtleXdvcmQgaXMgdXNlZCwgdGhlIG9sZCBUdXJibyBQYXNjYWwgZG9lcworICBub3Qgd29yayB3aXRoIHRoaXMgaW50ZXJmYWNlLgorCistIFRoZSBneiogZnVuY3Rpb24gaW50ZXJmYWNlcyBhcmUgbm90IHRyYW5zbGF0ZWQsIHRvIGF2b2lkCisgIGludGVyZmFjaW5nIHByb2JsZW1zIHdpdGggdGhlIEMgcnVudGltZSBsaWJyYXJ5LiAgQmVzaWRlcywKKyAgICBnenByaW50ZihnekZpbGUgZmlsZSwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCisgIGNhbm5vdCBiZSB0cmFuc2xhdGVkIGludG8gUGFzY2FsLgorCisKK0xlZ2FsIGlzc3VlcworPT09PT09PT09PT09CisKK1RoZSB6bGlicGFzIGludGVyZmFjZSBpczoKKyAgQ29weXJpZ2h0IChDKSAxOTk1LTIwMDMgSmVhbi1sb3VwIEdhaWxseSBhbmQgTWFyayBBZGxlci4KKyAgQ29weXJpZ2h0IChDKSAxOTk4IGJ5IEJvYiBEZWxsYWNhLgorICBDb3B5cmlnaHQgKEMpIDIwMDMgYnkgQ29zbWluIFRydXRhLgorCitUaGUgZXhhbXBsZSBwcm9ncmFtIGlzOgorICBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMyBieSBKZWFuLWxvdXAgR2FpbGx5LgorICBDb3B5cmlnaHQgKEMpIDE5OTgsMTk5OSwyMDAwIGJ5IEphY3F1ZXMgTm9tc3NpIE56YWxpLgorICBDb3B5cmlnaHQgKEMpIDIwMDMgYnkgQ29zbWluIFRydXRhLgorCisgIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCisgIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9yIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcworICBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgorCisgIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAorICBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0CisgIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKKworICAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAorICAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQorICAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKKyAgICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KKyAgMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKKyAgICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgorICAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgorCmRpZmYgLS1naXQgYS96bGliLTEuMi42L2NvbnRyaWIvcGFzY2FsL3psaWJkMzIubWFrIGIvemxpYi0xLjIuNi9jb250cmliL3Bhc2NhbC96bGliZDMyLm1hawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmIwMGI3Ci0tLSAvZGV2L251bGwKKysrIGIvemxpYi0xLjIuNi9jb250cmliL3Bhc2NhbC96bGliZDMyLm1hawpAQCAtMCwwICsxLDk5IEBACisjIE1ha2VmaWxlIGZvciB6bGliCisjIEZvciB1c2Ugd2l0aCBEZWxwaGkgYW5kIEMrKyBCdWlsZGVyIHVuZGVyIFdpbjMyCisjIFVwZGF0ZWQgZm9yIHpsaWIgMS4yLnggYnkgQ29zbWluIFRydXRhCisKKyMgLS0tLS0tLS0tLS0tIEJvcmxhbmQgQysrIC0tLS0tLS0tLS0tLQorCisjIFRoaXMgcHJvamVjdCB1c2VzIHRoZSBEZWxwaGkgKGZhc3RjYWxsL3JlZ2lzdGVyKSBjYWxsaW5nIGNvbnZlbnRpb246CitMT0MgPSAtRFpFWFBPUlQ9X19mYXN0Y2FsbCAtRFpFWFBPUlRWQT1fX2NkZWNsCisKK0NDID0gYmNjMzIKK0xEID0gYmNjMzIKK0FSID0gdGxpYgorIyBkbyBub3QgdXNlICItcHIiIGluIENGTEFHUworQ0ZMQUdTID0gLWEgLWQgLWstIC1PMiAkKExPQykKK0xERkxBR1MgPQorCisKKyMgdmFyaWFibGVzCitaTElCX0xJQiA9IHpsaWIubGliCisKK09CSjEgPSBhZGxlcjMyLm9iaiBjb21wcmVzcy5vYmogY3JjMzIub2JqIGRlZmxhdGUub2JqIGd6Y2xvc2Uub2JqIGd6bGliLm9iaiBnenJlYWQub2JqCitPQkoyID0gZ3p3cml0ZS5vYmogaW5mYmFjay5vYmogaW5mZmFzdC5vYmogaW5mbGF0ZS5vYmogaW5mdHJlZXMub2JqIHRyZWVzLm9iaiB1bmNvbXByLm9iaiB6dXRpbC5vYmoKK09CSlAxID0gK2FkbGVyMzIub2JqK2NvbXByZXNzLm9iaitjcmMzMi5vYmorZGVmbGF0ZS5vYmorZ3pjbG9zZS5vYmorZ3psaWIub2JqK2d6cmVhZC5vYmoKK09CSlAyID0gK2d6d3JpdGUub2JqK2luZmJhY2sub2JqK2luZmZhc3Qub2JqK2luZmxhdGUub2JqK2luZnRyZWVzLm9iait0cmVlcy5vYmordW5jb21wci5vYmorenV0aWwub2JqCisKKworIyB0YXJnZXRzCithbGw6ICQoWkxJQl9MSUIpIGV4YW1wbGUuZXhlIG1pbmlnemlwLmV4ZQorCisuYy5vYmo6CisJJChDQykgLWMgJChDRkxBR1MpICQqLmMKKworYWRsZXIzMi5vYmo6IGFkbGVyMzIuYyB6bGliLmggemNvbmYuaAorCitjb21wcmVzcy5vYmo6IGNvbXByZXNzLmMgemxpYi5oIHpjb25mLmgKKworY3JjMzIub2JqOiBjcmMzMi5jIHpsaWIuaCB6Y29uZi5oIGNyYzMyLmgKKworZGVmbGF0ZS5vYmo6IGRlZmxhdGUuYyBkZWZsYXRlLmggenV0aWwuaCB6bGliLmggemNvbmYuaAorCitnemNsb3NlLm9iajogZ3pjbG9zZS5jIHpsaWIuaCB6Y29uZi5oIGd6Z3V0cy5oCisKK2d6bGliLm9iajogZ3psaWIuYyB6bGliLmggemNvbmYuaCBnemd1dHMuaAorCitnenJlYWQub2JqOiBnenJlYWQuYyB6bGliLmggemNvbmYuaCBnemd1dHMuaAorCitnendyaXRlLm9iajogZ3p3cml0ZS5jIHpsaWIuaCB6Y29uZi5oIGd6Z3V0cy5oCisKK2luZmJhY2sub2JqOiBpbmZiYWNrLmMgenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZ0cmVlcy5oIGluZmxhdGUuaCBcCisgaW5mZmFzdC5oIGluZmZpeGVkLmgKKworaW5mZmFzdC5vYmo6IGluZmZhc3QuYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZnRyZWVzLmggaW5mbGF0ZS5oIFwKKyBpbmZmYXN0LmgKKworaW5mbGF0ZS5vYmo6IGluZmxhdGUuYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZnRyZWVzLmggaW5mbGF0ZS5oIFwKKyBpbmZmYXN0LmggaW5mZml4ZWQuaAorCitpbmZ0cmVlcy5vYmo6IGluZnRyZWVzLmMgenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZ0cmVlcy5oCisKK3RyZWVzLm9iajogdHJlZXMuYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGRlZmxhdGUuaCB0cmVlcy5oCisKK3VuY29tcHIub2JqOiB1bmNvbXByLmMgemxpYi5oIHpjb25mLmgKKworenV0aWwub2JqOiB6dXRpbC5jIHp1dGlsLmggemxpYi5oIHpjb25mLmgKKworZXhhbXBsZS5vYmo6IHRlc3QvZXhhbXBsZS5jIHpsaWIuaCB6Y29uZi5oCisKK21pbmlnemlwLm9iajogdGVzdC9taW5pZ3ppcC5jIHpsaWIuaCB6Y29uZi5oCisKKworIyBGb3IgdGhlIHNha2Ugb2YgdGhlIG9sZCBCb3JsYW5kIG1ha2UsCisjIHRoZSBjb21tYW5kIGxpbmUgaXMgY3V0IHRvIGZpdCBpbiB0aGUgTVMtRE9TIDEyOCBieXRlIGxpbWl0OgorJChaTElCX0xJQik6ICQoT0JKMSkgJChPQkoyKQorCS1kZWwgJChaTElCX0xJQikKKwkkKEFSKSAkKFpMSUJfTElCKSAkKE9CSlAxKQorCSQoQVIpICQoWkxJQl9MSUIpICQoT0JKUDIpCisKKworIyB0ZXN0aW5nCit0ZXN0OiBleGFtcGxlLmV4ZSBtaW5pZ3ppcC5leGUKKwlleGFtcGxlCisJZWNobyBoZWxsbyB3b3JsZCB8IG1pbmlnemlwIHwgbWluaWd6aXAgLWQKKworZXhhbXBsZS5leGU6IGV4YW1wbGUub2JqICQoWkxJQl9MSUIpCisJJChMRCkgJChMREZMQUdTKSBleGFtcGxlLm9iaiAkKFpMSUJfTElCKQorCittaW5pZ3ppcC5leGU6IG1pbmlnemlwLm9iaiAkKFpMSUJfTElCKQorCSQoTEQpICQoTERGTEFHUykgbWluaWd6aXAub2JqICQoWkxJQl9MSUIpCisKKworIyBjbGVhbnVwCitjbGVhbjoKKwktZGVsICoub2JqCisJLWRlbCAqLmV4ZQorCS1kZWwgKi5saWIKKwktZGVsICoudGRzCisJLWRlbCB6bGliLmJhaworCS1kZWwgZm9vLmd6CisKZGlmZiAtLWdpdCBhL3psaWItMS4yLjYvY29udHJpYi9wYXNjYWwvemxpYnBhcy5wYXMgYi96bGliLTEuMi42L2NvbnRyaWIvcGFzY2FsL3psaWJwYXMucGFzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjOTg3NWMKLS0tIC9kZXYvbnVsbAorKysgYi96bGliLTEuMi42L2NvbnRyaWIvcGFzY2FsL3psaWJwYXMucGFzCkBAIC0wLDAgKzEsMjc2IEBACisoKiB6bGlicGFzIC0tIFBhc2NhbCBpbnRlcmZhY2UgdG8gdGhlIHpsaWIgZGF0YSBjb21wcmVzc2lvbiBsaWJyYXJ5CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzIENvc21pbiBUcnV0YS4KKyAqIERlcml2ZWQgZnJvbSBvcmlnaW5hbCBzb3VyY2VzIGJ5IEJvYiBEZWxsYWNhLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHJlYWRtZS50eHQKKyAqKQorCit1bml0IHpsaWJwYXM7CisKK2ludGVyZmFjZQorCitjb25zdAorICBaTElCX1ZFUlNJT04gPSAnMS4yLjYnOworICBaTElCX1ZFUk5VTSAgPSAkMTI2MDsKKwordHlwZQorICBhbGxvY19mdW5jID0gZnVuY3Rpb24ob3BhcXVlOiBQb2ludGVyOyBpdGVtcywgc2l6ZTogSW50ZWdlcik6IFBvaW50ZXI7CisgICAgICAgICAgICAgICAgIGNkZWNsOworICBmcmVlX2Z1bmMgID0gcHJvY2VkdXJlKG9wYXF1ZSwgYWRkcmVzczogUG9pbnRlcik7CisgICAgICAgICAgICAgICAgIGNkZWNsOworCisgIGluX2Z1bmMgICAgPSBmdW5jdGlvbihvcGFxdWU6IFBvaW50ZXI7IHZhciBidWY6IFBCeXRlKTogSW50ZWdlcjsKKyAgICAgICAgICAgICAgICAgY2RlY2w7CisgIG91dF9mdW5jICAgPSBmdW5jdGlvbihvcGFxdWU6IFBvaW50ZXI7IGJ1ZjogUEJ5dGU7IHNpemU6IEludGVnZXIpOiBJbnRlZ2VyOworICAgICAgICAgICAgICAgICBjZGVjbDsKKworICB6X3N0cmVhbXAgPSBeel9zdHJlYW07CisgIHpfc3RyZWFtID0gcGFja2VkIHJlY29yZAorICAgIG5leHRfaW46IFBDaGFyOyAgICAgICAoKiBuZXh0IGlucHV0IGJ5dGUgKikKKyAgICBhdmFpbF9pbjogSW50ZWdlcjsgICAgKCogbnVtYmVyIG9mIGJ5dGVzIGF2YWlsYWJsZSBhdCBuZXh0X2luICopCisgICAgdG90YWxfaW46IExvbmdJbnQ7ICAgICgqIHRvdGFsIG5iIG9mIGlucHV0IGJ5dGVzIHJlYWQgc28gZmFyICopCisKKyAgICBuZXh0X291dDogUENoYXI7ICAgICAgKCogbmV4dCBvdXRwdXQgYnl0ZSBzaG91bGQgYmUgcHV0IHRoZXJlICopCisgICAgYXZhaWxfb3V0OiBJbnRlZ2VyOyAgICgqIHJlbWFpbmluZyBmcmVlIHNwYWNlIGF0IG5leHRfb3V0ICopCisgICAgdG90YWxfb3V0OiBMb25nSW50OyAgICgqIHRvdGFsIG5iIG9mIGJ5dGVzIG91dHB1dCBzbyBmYXIgKikKKworICAgIG1zZzogUENoYXI7ICAgICAgICAgICAoKiBsYXN0IGVycm9yIG1lc3NhZ2UsIE5VTEwgaWYgbm8gZXJyb3IgKikKKyAgICBzdGF0ZTogUG9pbnRlcjsgICAgICAgKCogbm90IHZpc2libGUgYnkgYXBwbGljYXRpb25zICopCisKKyAgICB6YWxsb2M6IGFsbG9jX2Z1bmM7ICAgKCogdXNlZCB0byBhbGxvY2F0ZSB0aGUgaW50ZXJuYWwgc3RhdGUgKikKKyAgICB6ZnJlZTogZnJlZV9mdW5jOyAgICAgKCogdXNlZCB0byBmcmVlIHRoZSBpbnRlcm5hbCBzdGF0ZSAqKQorICAgIG9wYXF1ZTogUG9pbnRlcjsgICAgICAoKiBwcml2YXRlIGRhdGEgb2JqZWN0IHBhc3NlZCB0byB6YWxsb2MgYW5kIHpmcmVlICopCisKKyAgICBkYXRhX3R5cGU6IEludGVnZXI7ICAgKCogYmVzdCBndWVzcyBhYm91dCB0aGUgZGF0YSB0eXBlOiBhc2NpaSBvciBiaW5hcnkgKikKKyAgICBhZGxlcjogTG9uZ0ludDsgICAgICAgKCogYWRsZXIzMiB2YWx1ZSBvZiB0aGUgdW5jb21wcmVzc2VkIGRhdGEgKikKKyAgICByZXNlcnZlZDogTG9uZ0ludDsgICAgKCogcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgKikKKyAgZW5kOworCisgIGd6X2hlYWRlcnAgPSBeZ3pfaGVhZGVyOworICBnel9oZWFkZXIgPSBwYWNrZWQgcmVjb3JkCisgICAgdGV4dDogSW50ZWdlcjsgICAgICAgICgqIHRydWUgaWYgY29tcHJlc3NlZCBkYXRhIGJlbGlldmVkIHRvIGJlIHRleHQgKikKKyAgICB0aW1lOiBMb25nSW50OyAgICAgICAgKCogbW9kaWZpY2F0aW9uIHRpbWUgKikKKyAgICB4ZmxhZ3M6IEludGVnZXI7ICAgICAgKCogZXh0cmEgZmxhZ3MgKG5vdCB1c2VkIHdoZW4gd3JpdGluZyBhIGd6aXAgZmlsZSkgKikKKyAgICBvczogSW50ZWdlcjsgICAgICAgICAgKCogb3BlcmF0aW5nIHN5c3RlbSAqKQorICAgIGV4dHJhOiBQQ2hhcjsgICAgICAgICAoKiBwb2ludGVyIHRvIGV4dHJhIGZpZWxkIG9yIFpfTlVMTCBpZiBub25lICopCisgICAgZXh0cmFfbGVuOiBJbnRlZ2VyOyAgICgqIGV4dHJhIGZpZWxkIGxlbmd0aCAodmFsaWQgaWYgZXh0cmEgIT0gWl9OVUxMKSAqKQorICAgIGV4dHJhX21heDogSW50ZWdlcjsgICAoKiBzcGFjZSBhdCBleHRyYSAob25seSB3aGVuIHJlYWRpbmcgaGVhZGVyKSAqKQorICAgIG5hbWU6IFBDaGFyOyAgICAgICAgICAoKiBwb2ludGVyIHRvIHplcm8tdGVybWluYXRlZCBmaWxlIG5hbWUgb3IgWl9OVUxMICopCisgICAgbmFtZV9tYXg6IEludGVnZXI7ICAgICgqIHNwYWNlIGF0IG5hbWUgKG9ubHkgd2hlbiByZWFkaW5nIGhlYWRlcikgKikKKyAgICBjb21tZW50OiBQQ2hhcjsgICAgICAgKCogcG9pbnRlciB0byB6ZXJvLXRlcm1pbmF0ZWQgY29tbWVudCBvciBaX05VTEwgKikKKyAgICBjb21tX21heDogSW50ZWdlcjsgICAgKCogc3BhY2UgYXQgY29tbWVudCAob25seSB3aGVuIHJlYWRpbmcgaGVhZGVyKSAqKQorICAgIGhjcmM6IEludGVnZXI7ICAgICAgICAoKiB0cnVlIGlmIHRoZXJlIHdhcyBvciB3aWxsIGJlIGEgaGVhZGVyIGNyYyAqKQorICAgIGRvbmU6IEludGVnZXI7ICAgICAgICAoKiB0cnVlIHdoZW4gZG9uZSByZWFkaW5nIGd6aXAgaGVhZGVyICopCisgIGVuZDsKKworKCogY29uc3RhbnRzICopCitjb25zdAorICBaX05PX0ZMVVNIICAgICAgPSAwOworICBaX1BBUlRJQUxfRkxVU0ggPSAxOworICBaX1NZTkNfRkxVU0ggICAgPSAyOworICBaX0ZVTExfRkxVU0ggICAgPSAzOworICBaX0ZJTklTSCAgICAgICAgPSA0OworICBaX0JMT0NLICAgICAgICAgPSA1OworICBaX1RSRUVTICAgICAgICAgPSA2OworCisgIFpfT0sgICAgICAgICAgICA9ICAwOworICBaX1NUUkVBTV9FTkQgICAgPSAgMTsKKyAgWl9ORUVEX0RJQ1QgICAgID0gIDI7CisgIFpfRVJSTk8gICAgICAgICA9IC0xOworICBaX1NUUkVBTV9FUlJPUiAgPSAtMjsKKyAgWl9EQVRBX0VSUk9SICAgID0gLTM7CisgIFpfTUVNX0VSUk9SICAgICA9IC00OworICBaX0JVRl9FUlJPUiAgICAgPSAtNTsKKyAgWl9WRVJTSU9OX0VSUk9SID0gLTY7CisKKyAgWl9OT19DT01QUkVTU0lPTiAgICAgICA9ICAwOworICBaX0JFU1RfU1BFRUQgICAgICAgICAgID0gIDE7CisgIFpfQkVTVF9DT01QUkVTU0lPTiAgICAgPSAgOTsKKyAgWl9ERUZBVUxUX0NPTVBSRVNTSU9OICA9IC0xOworCisgIFpfRklMVEVSRUQgICAgICAgICAgICA9IDE7CisgIFpfSFVGRk1BTl9PTkxZICAgICAgICA9IDI7CisgIFpfUkxFICAgICAgICAgICAgICAgICA9IDM7CisgIFpfRklYRUQgICAgICAgICAgICAgICA9IDQ7CisgIFpfREVGQVVMVF9TVFJBVEVHWSAgICA9IDA7CisKKyAgWl9CSU5BUlkgICA9IDA7CisgIFpfVEVYVCAgICAgPSAxOworICBaX0FTQ0lJICAgID0gMTsKKyAgWl9VTktOT1dOICA9IDI7CisKKyAgWl9ERUZMQVRFRCA9IDg7CisKKygqIGJhc2ljIGZ1bmN0aW9ucyAqKQorZnVuY3Rpb24gemxpYlZlcnNpb246IFBDaGFyOworZnVuY3Rpb24gZGVmbGF0ZUluaXQodmFyIHN0cm06IHpfc3RyZWFtOyBsZXZlbDogSW50ZWdlcik6IEludGVnZXI7CitmdW5jdGlvbiBkZWZsYXRlKHZhciBzdHJtOiB6X3N0cmVhbTsgZmx1c2g6IEludGVnZXIpOiBJbnRlZ2VyOworZnVuY3Rpb24gZGVmbGF0ZUVuZCh2YXIgc3RybTogel9zdHJlYW0pOiBJbnRlZ2VyOworZnVuY3Rpb24gaW5mbGF0ZUluaXQodmFyIHN0cm06IHpfc3RyZWFtKTogSW50ZWdlcjsKK2Z1bmN0aW9uIGluZmxhdGUodmFyIHN0cm06IHpfc3RyZWFtOyBmbHVzaDogSW50ZWdlcik6IEludGVnZXI7CitmdW5jdGlvbiBpbmZsYXRlRW5kKHZhciBzdHJtOiB6X3N0cmVhbSk6IEludGVnZXI7CisKKygqIGFkdmFuY2VkIGZ1bmN0aW9ucyAqKQorZnVuY3Rpb24gZGVmbGF0ZUluaXQyKHZhciBzdHJtOiB6X3N0cmVhbTsgbGV2ZWwsIG1ldGhvZCwgd2luZG93Qml0cywKKyAgICAgICAgICAgICAgICAgICAgICBtZW1MZXZlbCwgc3RyYXRlZ3k6IEludGVnZXIpOiBJbnRlZ2VyOworZnVuY3Rpb24gZGVmbGF0ZVNldERpY3Rpb25hcnkodmFyIHN0cm06IHpfc3RyZWFtOyBjb25zdCBkaWN0aW9uYXJ5OiBQQ2hhcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpY3RMZW5ndGg6IEludGVnZXIpOiBJbnRlZ2VyOworZnVuY3Rpb24gZGVmbGF0ZUNvcHkodmFyIGRlc3QsIHNvdXJjZTogel9zdHJlYW0pOiBJbnRlZ2VyOworZnVuY3Rpb24gZGVmbGF0ZVJlc2V0KHZhciBzdHJtOiB6X3N0cmVhbSk6IEludGVnZXI7CitmdW5jdGlvbiBkZWZsYXRlUGFyYW1zKHZhciBzdHJtOiB6X3N0cmVhbTsgbGV2ZWwsIHN0cmF0ZWd5OiBJbnRlZ2VyKTogSW50ZWdlcjsKK2Z1bmN0aW9uIGRlZmxhdGVUdW5lKHZhciBzdHJtOiB6X3N0cmVhbTsgZ29vZF9sZW5ndGgsIG1heF9sYXp5LCBuaWNlX2xlbmd0aCwgbWF4X2NoYWluOiBJbnRlZ2VyKTogSW50ZWdlcjsKK2Z1bmN0aW9uIGRlZmxhdGVCb3VuZCh2YXIgc3RybTogel9zdHJlYW07IHNvdXJjZUxlbjogTG9uZ0ludCk6IExvbmdJbnQ7CitmdW5jdGlvbiBkZWZsYXRlUGVuZGluZyh2YXIgc3RybTogel9zdHJlYW07IHZhciBwZW5kaW5nOiBJbnRlZ2VyOyB2YXIgYml0czogSW50ZWdlcik6IEludGVnZXI7CitmdW5jdGlvbiBkZWZsYXRlUHJpbWUodmFyIHN0cm06IHpfc3RyZWFtOyBiaXRzLCB2YWx1ZTogSW50ZWdlcik6IEludGVnZXI7CitmdW5jdGlvbiBkZWZsYXRlU2V0SGVhZGVyKHZhciBzdHJtOiB6X3N0cmVhbTsgaGVhZDogZ3pfaGVhZGVyKTogSW50ZWdlcjsKK2Z1bmN0aW9uIGluZmxhdGVJbml0Mih2YXIgc3RybTogel9zdHJlYW07IHdpbmRvd0JpdHM6IEludGVnZXIpOiBJbnRlZ2VyOworZnVuY3Rpb24gaW5mbGF0ZVNldERpY3Rpb25hcnkodmFyIHN0cm06IHpfc3RyZWFtOyBjb25zdCBkaWN0aW9uYXJ5OiBQQ2hhcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpY3RMZW5ndGg6IEludGVnZXIpOiBJbnRlZ2VyOworZnVuY3Rpb24gaW5mbGF0ZVN5bmModmFyIHN0cm06IHpfc3RyZWFtKTogSW50ZWdlcjsKK2Z1bmN0aW9uIGluZmxhdGVDb3B5KHZhciBkZXN0LCBzb3VyY2U6IHpfc3RyZWFtKTogSW50ZWdlcjsKK2Z1bmN0aW9uIGluZmxhdGVSZXNldCh2YXIgc3RybTogel9zdHJlYW0pOiBJbnRlZ2VyOworZnVuY3Rpb24gaW5mbGF0ZVJlc2V0Mih2YXIgc3RybTogel9zdHJlYW07IHdpbmRvd0JpdHM6IEludGVnZXIpOiBJbnRlZ2VyOworZnVuY3Rpb24gaW5mbGF0ZVByaW1lKHZhciBzdHJtOiB6X3N0cmVhbTsgYml0cywgdmFsdWU6IEludGVnZXIpOiBJbnRlZ2VyOworZnVuY3Rpb24gaW5mbGF0ZU1hcmsodmFyIHN0cm06IHpfc3RyZWFtKTogTG9uZ0ludDsKK2Z1bmN0aW9uIGluZmxhdGVHZXRIZWFkZXIodmFyIHN0cm06IHpfc3RyZWFtOyB2YXIgaGVhZDogZ3pfaGVhZGVyKTogSW50ZWdlcjsKK2Z1bmN0aW9uIGluZmxhdGVCYWNrSW5pdCh2YXIgc3RybTogel9zdHJlYW07CisgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Qml0czogSW50ZWdlcjsgd2luZG93OiBQQ2hhcik6IEludGVnZXI7CitmdW5jdGlvbiBpbmZsYXRlQmFjayh2YXIgc3RybTogel9zdHJlYW07IGluX2ZuOiBpbl9mdW5jOyBpbl9kZXNjOiBQb2ludGVyOworICAgICAgICAgICAgICAgICAgICAgb3V0X2ZuOiBvdXRfZnVuYzsgb3V0X2Rlc2M6IFBvaW50ZXIpOiBJbnRlZ2VyOworZnVuY3Rpb24gaW5mbGF0ZUJhY2tFbmQodmFyIHN0cm06IHpfc3RyZWFtKTogSW50ZWdlcjsKK2Z1bmN0aW9uIHpsaWJDb21waWxlRmxhZ3M6IExvbmdJbnQ7CisKKygqIHV0aWxpdHkgZnVuY3Rpb25zICopCitmdW5jdGlvbiBjb21wcmVzcyhkZXN0OiBQQ2hhcjsgdmFyIGRlc3RMZW46IExvbmdJbnQ7CisgICAgICAgICAgICAgICAgICBjb25zdCBzb3VyY2U6IFBDaGFyOyBzb3VyY2VMZW46IExvbmdJbnQpOiBJbnRlZ2VyOworZnVuY3Rpb24gY29tcHJlc3MyKGRlc3Q6IFBDaGFyOyB2YXIgZGVzdExlbjogTG9uZ0ludDsKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHNvdXJjZTogUENoYXI7IHNvdXJjZUxlbjogTG9uZ0ludDsKKyAgICAgICAgICAgICAgICAgIGxldmVsOiBJbnRlZ2VyKTogSW50ZWdlcjsKK2Z1bmN0aW9uIGNvbXByZXNzQm91bmQoc291cmNlTGVuOiBMb25nSW50KTogTG9uZ0ludDsKK2Z1bmN0aW9uIHVuY29tcHJlc3MoZGVzdDogUENoYXI7IHZhciBkZXN0TGVuOiBMb25nSW50OworICAgICAgICAgICAgICAgICAgICBjb25zdCBzb3VyY2U6IFBDaGFyOyBzb3VyY2VMZW46IExvbmdJbnQpOiBJbnRlZ2VyOworCisoKiBjaGVja3N1bSBmdW5jdGlvbnMgKikKK2Z1bmN0aW9uIGFkbGVyMzIoYWRsZXI6IExvbmdJbnQ7IGNvbnN0IGJ1ZjogUENoYXI7IGxlbjogSW50ZWdlcik6IExvbmdJbnQ7CitmdW5jdGlvbiBhZGxlcjMyX2NvbWJpbmUoYWRsZXIxLCBhZGxlcjIsIGxlbjI6IExvbmdJbnQpOiBMb25nSW50OworZnVuY3Rpb24gY3JjMzIoY3JjOiBMb25nSW50OyBjb25zdCBidWY6IFBDaGFyOyBsZW46IEludGVnZXIpOiBMb25nSW50OworZnVuY3Rpb24gY3JjMzJfY29tYmluZShjcmMxLCBjcmMyLCBsZW4yOiBMb25nSW50KTogTG9uZ0ludDsKKworKCogdmFyaW91cyBoYWNrcywgZG9uJ3QgbG9vayA6KSAqKQorZnVuY3Rpb24gZGVmbGF0ZUluaXRfKHZhciBzdHJtOiB6X3N0cmVhbTsgbGV2ZWw6IEludGVnZXI7CisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmVyc2lvbjogUENoYXI7IHN0cmVhbV9zaXplOiBJbnRlZ2VyKTogSW50ZWdlcjsKK2Z1bmN0aW9uIGluZmxhdGVJbml0Xyh2YXIgc3RybTogel9zdHJlYW07IGNvbnN0IHZlcnNpb246IFBDaGFyOworICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbV9zaXplOiBJbnRlZ2VyKTogSW50ZWdlcjsKK2Z1bmN0aW9uIGRlZmxhdGVJbml0Ml8odmFyIHN0cm06IHpfc3RyZWFtOworICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCwgbWV0aG9kLCB3aW5kb3dCaXRzLCBtZW1MZXZlbCwgc3RyYXRlZ3k6IEludGVnZXI7CisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZlcnNpb246IFBDaGFyOyBzdHJlYW1fc2l6ZTogSW50ZWdlcik6IEludGVnZXI7CitmdW5jdGlvbiBpbmZsYXRlSW5pdDJfKHZhciBzdHJtOiB6X3N0cmVhbTsgd2luZG93Qml0czogSW50ZWdlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmVyc2lvbjogUENoYXI7IHN0cmVhbV9zaXplOiBJbnRlZ2VyKTogSW50ZWdlcjsKK2Z1bmN0aW9uIGluZmxhdGVCYWNrSW5pdF8odmFyIHN0cm06IHpfc3RyZWFtOworICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3dCaXRzOiBJbnRlZ2VyOyB3aW5kb3c6IFBDaGFyOworICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2ZXJzaW9uOiBQQ2hhcjsgc3RyZWFtX3NpemU6IEludGVnZXIpOiBJbnRlZ2VyOworCisKK2ltcGxlbWVudGF0aW9uCisKK3skTCBhZGxlcjMyLm9ian0KK3skTCBjb21wcmVzcy5vYmp9Cit7JEwgY3JjMzIub2JqfQoreyRMIGRlZmxhdGUub2JqfQoreyRMIGluZmJhY2sub2JqfQoreyRMIGluZmZhc3Qub2JqfQoreyRMIGluZmxhdGUub2JqfQoreyRMIGluZnRyZWVzLm9ian0KK3skTCB0cmVlcy5vYmp9Cit7JEwgdW5jb21wci5vYmp9Cit7JEwgenV0aWwub2JqfQorCitmdW5jdGlvbiBhZGxlcjMyOyBleHRlcm5hbDsKK2Z1bmN0aW9uIGFkbGVyMzJfY29tYmluZTsgZXh0ZXJuYWw7CitmdW5jdGlvbiBjb21wcmVzczsgZXh0ZXJuYWw7CitmdW5jdGlvbiBjb21wcmVzczI7IGV4dGVybmFsOworZnVuY3Rpb24gY29tcHJlc3NCb3VuZDsgZXh0ZXJuYWw7CitmdW5jdGlvbiBjcmMzMjsgZXh0ZXJuYWw7CitmdW5jdGlvbiBjcmMzMl9jb21iaW5lOyBleHRlcm5hbDsKK2Z1bmN0aW9uIGRlZmxhdGU7IGV4dGVybmFsOworZnVuY3Rpb24gZGVmbGF0ZUJvdW5kOyBleHRlcm5hbDsKK2Z1bmN0aW9uIGRlZmxhdGVDb3B5OyBleHRlcm5hbDsKK2Z1bmN0aW9uIGRlZmxhdGVFbmQ7IGV4dGVybmFsOworZnVuY3Rpb24gZGVmbGF0ZUluaXRfOyBleHRlcm5hbDsKK2Z1bmN0aW9uIGRlZmxhdGVJbml0Ml87IGV4dGVybmFsOworZnVuY3Rpb24gZGVmbGF0ZVBhcmFtczsgZXh0ZXJuYWw7CitmdW5jdGlvbiBkZWZsYXRlUGVuZGluZzsgZXh0ZXJuYWw7CitmdW5jdGlvbiBkZWZsYXRlUHJpbWU7IGV4dGVybmFsOworZnVuY3Rpb24gZGVmbGF0ZVJlc2V0OyBleHRlcm5hbDsKK2Z1bmN0aW9uIGRlZmxhdGVTZXREaWN0aW9uYXJ5OyBleHRlcm5hbDsKK2Z1bmN0aW9uIGRlZmxhdGVTZXRIZWFkZXI7IGV4dGVybmFsOworZnVuY3Rpb24gZGVmbGF0ZVR1bmU7IGV4dGVybmFsOworZnVuY3Rpb24gaW5mbGF0ZTsgZXh0ZXJuYWw7CitmdW5jdGlvbiBpbmZsYXRlQmFjazsgZXh0ZXJuYWw7CitmdW5jdGlvbiBpbmZsYXRlQmFja0VuZDsgZXh0ZXJuYWw7CitmdW5jdGlvbiBpbmZsYXRlQmFja0luaXRfOyBleHRlcm5hbDsKK2Z1bmN0aW9uIGluZmxhdGVDb3B5OyBleHRlcm5hbDsKK2Z1bmN0aW9uIGluZmxhdGVFbmQ7IGV4dGVybmFsOworZnVuY3Rpb24gaW5mbGF0ZUdldEhlYWRlcjsgZXh0ZXJuYWw7CitmdW5jdGlvbiBpbmZsYXRlSW5pdF87IGV4dGVybmFsOworZnVuY3Rpb24gaW5mbGF0ZUluaXQyXzsgZXh0ZXJuYWw7CitmdW5jdGlvbiBpbmZsYXRlTWFyazsgZXh0ZXJuYWw7CitmdW5jdGlvbiBpbmZsYXRlUHJpbWU7IGV4dGVybmFsOworZnVuY3Rpb24gaW5mbGF0ZVJlc2V0OyBleHRlcm5hbDsKK2Z1bmN0aW9uIGluZmxhdGVSZXNldDI7IGV4dGVybmFsOworZnVuY3Rpb24gaW5mbGF0ZVNldERpY3Rpb25hcnk7IGV4dGVybmFsOworZnVuY3Rpb24gaW5mbGF0ZVN5bmM7IGV4dGVybmFsOworZnVuY3Rpb24gdW5jb21wcmVzczsgZXh0ZXJuYWw7CitmdW5jdGlvbiB6bGliQ29tcGlsZUZsYWdzOyBleHRlcm5hbDsKK2Z1bmN0aW9uIHpsaWJWZXJzaW9uOyBleHRlcm5hbDsKKworZnVuY3Rpb24gZGVmbGF0ZUluaXQodmFyIHN0cm06IHpfc3RyZWFtOyBsZXZlbDogSW50ZWdlcik6IEludGVnZXI7CitiZWdpbgorICBSZXN1bHQgOj0gZGVmbGF0ZUluaXRfKHN0cm0sIGxldmVsLCBaTElCX1ZFUlNJT04sIHNpemVvZih6X3N0cmVhbSkpOworZW5kOworCitmdW5jdGlvbiBkZWZsYXRlSW5pdDIodmFyIHN0cm06IHpfc3RyZWFtOyBsZXZlbCwgbWV0aG9kLCB3aW5kb3dCaXRzLCBtZW1MZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICBzdHJhdGVneTogSW50ZWdlcik6IEludGVnZXI7CitiZWdpbgorICBSZXN1bHQgOj0gZGVmbGF0ZUluaXQyXyhzdHJtLCBsZXZlbCwgbWV0aG9kLCB3aW5kb3dCaXRzLCBtZW1MZXZlbCwgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFpMSUJfVkVSU0lPTiwgc2l6ZW9mKHpfc3RyZWFtKSk7CitlbmQ7CisKK2Z1bmN0aW9uIGluZmxhdGVJbml0KHZhciBzdHJtOiB6X3N0cmVhbSk6IEludGVnZXI7CitiZWdpbgorICBSZXN1bHQgOj0gaW5mbGF0ZUluaXRfKHN0cm0sIFpMSUJfVkVSU0lPTiwgc2l6ZW9mKHpfc3RyZWFtKSk7CitlbmQ7CisKK2Z1bmN0aW9uIGluZmxhdGVJbml0Mih2YXIgc3RybTogel9zdHJlYW07IHdpbmRvd0JpdHM6IEludGVnZXIpOiBJbnRlZ2VyOworYmVnaW4KKyAgUmVzdWx0IDo9IGluZmxhdGVJbml0Ml8oc3RybSwgd2luZG93Qml0cywgWkxJQl9WRVJTSU9OLCBzaXplb2Yoel9zdHJlYW0pKTsKK2VuZDsKKworZnVuY3Rpb24gaW5mbGF0ZUJhY2tJbml0KHZhciBzdHJtOiB6X3N0cmVhbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3dCaXRzOiBJbnRlZ2VyOyB3aW5kb3c6IFBDaGFyKTogSW50ZWdlcjsKK2JlZ2luCisgIFJlc3VsdCA6PSBpbmZsYXRlQmFja0luaXRfKHN0cm0sIHdpbmRvd0JpdHMsIHdpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWkxJQl9WRVJTSU9OLCBzaXplb2Yoel9zdHJlYW0pKTsKK2VuZDsKKworZnVuY3Rpb24gX21hbGxvYyhTaXplOiBJbnRlZ2VyKTogUG9pbnRlcjsgY2RlY2w7CitiZWdpbgorICBHZXRNZW0oUmVzdWx0LCBTaXplKTsKK2VuZDsKKworcHJvY2VkdXJlIF9mcmVlKEJsb2NrOiBQb2ludGVyKTsgY2RlY2w7CitiZWdpbgorICBGcmVlTWVtKEJsb2NrKTsKK2VuZDsKKworcHJvY2VkdXJlIF9tZW1zZXQoUDogUG9pbnRlcjsgQjogQnl0ZTsgY291bnQ6IEludGVnZXIpOyBjZGVjbDsKK2JlZ2luCisgIEZpbGxDaGFyKFBeLCBjb3VudCwgQik7CitlbmQ7CisKK3Byb2NlZHVyZSBfbWVtY3B5KGRlc3QsIHNvdXJjZTogUG9pbnRlcjsgY291bnQ6IEludGVnZXIpOyBjZGVjbDsKK2JlZ2luCisgIE1vdmUoc291cmNlXiwgZGVzdF4sIGNvdW50KTsKK2VuZDsKKworZW5kLgpkaWZmIC0tZ2l0IGEvemxpYi0xLjIuNi9jb250cmliL3B1ZmYvTWFrZWZpbGUgYi96bGliLTEuMi42L2NvbnRyaWIvcHVmZi9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTI1OTRjCi0tLSAvZGV2L251bGwKKysrIGIvemxpYi0xLjIuNi9jb250cmliL3B1ZmYvTWFrZWZpbGUKQEAgLTAsMCArMSw0MiBAQAorQ0ZMQUdTPS1PCisKK3B1ZmY6IHB1ZmYubyBwdWZmdGVzdC5vCisKK3B1ZmYubzogcHVmZi5oCisKK3B1ZmZ0ZXN0Lm86IHB1ZmYuaAorCit0ZXN0OiBwdWZmCisJcHVmZiB6ZXJvcy5yYXcKKworcHVmdDogcHVmZi5jIHB1ZmYuaCBwdWZmdGVzdC5vCisJY2MgLWZwcm9maWxlLWFyY3MgLWZ0ZXN0LWNvdmVyYWdlIC1vIHB1ZnQgcHVmZi5jIHB1ZmZ0ZXN0Lm8KKworIyBwdWZmIGZ1bGwgY292ZXJhZ2UgdGVzdCAoc2hvdWxkIHNheSAxMDAlKQorY292OiBwdWZ0CisJQHJtIC1mICouZ2NvdiAqLmdjZGEKKwlAcHVmdCAtdyB6ZXJvcy5yYXcgMj4mMSB8IGNhdCA+IC9kZXYvbnVsbAorCUBlY2hvICcwNCcgfCB4eGQgLXIgLXAgfCBwdWZ0IDI+IC9kZXYvbnVsbCB8fCB0ZXN0ICQkPyAtZXEgMgorCUBlY2hvICcwMCcgfCB4eGQgLXIgLXAgfCBwdWZ0IDI+IC9kZXYvbnVsbCB8fCB0ZXN0ICQkPyAtZXEgMgorCUBlY2hvICcwMCAwMCAwMCAwMCAwMCcgfCB4eGQgLXIgLXAgfCBwdWZ0IDI+IC9kZXYvbnVsbCB8fCB0ZXN0ICQkPyAtZXEgMjU0CisJQGVjaG8gJzAwIDAxIDAwIGZlIGZmJyB8IHh4ZCAtciAtcCB8IHB1ZnQgMj4gL2Rldi9udWxsIHx8IHRlc3QgJCQ/IC1lcSAyCisJQGVjaG8gJzAxIDAxIDAwIGZlIGZmIDBhJyB8IHh4ZCAtciAtcCB8IHB1ZnQgLWYgMj4mMSB8IGNhdCA+IC9kZXYvbnVsbAorCUBlY2hvICcwMiA3ZSBmZiBmZicgfCB4eGQgLXIgLXAgfCBwdWZ0IDI+IC9kZXYvbnVsbCB8fCB0ZXN0ICQkPyAtZXEgMjQ2CisJQGVjaG8gJzAyJyB8IHh4ZCAtciAtcCB8IHB1ZnQgMj4gL2Rldi9udWxsIHx8IHRlc3QgJCQ/IC1lcSAyCisJQGVjaG8gJzA0IDgwIDQ5IDkyIDI0IDQ5IDkyIDI0IDBmIGI0IGZmIGZmIGMzIDA0JyB8IHh4ZCAtciAtcCB8IHB1ZnQgMj4gL2Rldi9udWxsIHx8IHRlc3QgJCQ/IC1lcSAyCisJQGVjaG8gJzA0IDgwIDQ5IDkyIDI0IDQ5IDkyIDI0IDcxIGZmIGZmIDkzIDExIDAwJyB8IHh4ZCAtciAtcCB8IHB1ZnQgMj4gL2Rldi9udWxsIHx8IHRlc3QgJCQ/IC1lcSAyNDkKKwlAZWNobyAnMDQgYzAgODEgMDggMDAgMDAgMDAgMDAgMjAgN2YgZWIgMGIgMDAgMDAnIHwgeHhkIC1yIC1wIHwgcHVmdCAyPiAvZGV2L251bGwgfHwgdGVzdCAkJD8gLWVxIDI0NgorCUBlY2hvICcwYiAwMCAwMCcgfCB4eGQgLXIgLXAgfCBwdWZ0IC1mIDI+JjEgfCBjYXQgPiAvZGV2L251bGwKKwlAZWNobyAnMWEgMDcnIHwgeHhkIC1yIC1wIHwgcHVmdCAyPiAvZGV2L251bGwgfHwgdGVzdCAkJD8gLWVxIDI0NgorCUBlY2hvICcwYyBjMCA4MSAwMCAwMCAwMCAwMCAwMCA5MCBmZiA2YiAwNCcgfCB4eGQgLXIgLXAgfCBwdWZ0IDI+IC9kZXYvbnVsbCB8fCB0ZXN0ICQkPyAtZXEgMjQ1CisJQHB1ZnQgLWYgemVyb3MucmF3IDI+JjEgfCBjYXQgPiAvZGV2L251bGwKKwlAZWNobyAnZmMgMDAgMDAnIHwgeHhkIC1yIC1wIHwgcHVmdCAyPiAvZGV2L251bGwgfHwgdGVzdCAkJD8gLWVxIDI1MworCUBlY2hvICcwNCAwMCBmZSBmZicgfCB4eGQgLXIgLXAgfCBwdWZ0IDI+IC9kZXYvbnVsbCB8fCB0ZXN0ICQkPyAtZXEgMjUyCisJQGVjaG8gJzA0IDAwIDI0IDQ5JyB8IHh4ZCAtciAtcCB8IHB1ZnQgMj4gL2Rldi9udWxsIHx8IHRlc3QgJCQ/IC1lcSAyNTEKKwlAZWNobyAnMDQgODAgNDkgOTIgMjQgNDkgOTIgMjQgMGYgYjQgZmYgZmYgYzMgODQnIHwgeHhkIC1yIC1wIHwgcHVmdCAyPiAvZGV2L251bGwgfHwgdGVzdCAkJD8gLWVxIDI0OAorCUBlY2hvICcwNCAwMCAyNCBlOSBmZiBmZicgfCB4eGQgLXIgLXAgfCBwdWZ0IDI+IC9kZXYvbnVsbCB8fCB0ZXN0ICQkPyAtZXEgMjUwCisJQGVjaG8gJzA0IDAwIDI0IGU5IGZmIDZkJyB8IHh4ZCAtciAtcCB8IHB1ZnQgMj4gL2Rldi9udWxsIHx8IHRlc3QgJCQ/IC1lcSAyNDcKKwlAZ2NvdiAtbiBwdWZmLmMKKworY2xlYW46CisJcm0gLWYgcHVmZiBwdWZ0ICoubyAqLmdjKgpkaWZmIC0tZ2l0IGEvemxpYi0xLjIuNi9jb250cmliL3B1ZmYvUkVBRE1FIGIvemxpYi0xLjIuNi9jb250cmliL3B1ZmYvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiYzRjYjUKLS0tIC9kZXYvbnVsbAorKysgYi96bGliLTEuMi42L2NvbnRyaWIvcHVmZi9SRUFETUUKQEAgLTAsMCArMSw2MyBAQAorUHVmZiAtLSBBIFNpbXBsZSBJbmZsYXRlCiszIE1hciAyMDAzCitNYXJrIEFkbGVyCittYWRsZXJAYWx1bW5pLmNhbHRlY2guZWR1CisKK1doYXQgdGhpcyBpcyAtLQorCitwdWZmLmMgcHJvdmlkZXMgdGhlIHJvdXRpbmUgcHVmZigpIHRvIGRlY29tcHJlc3MgdGhlIGRlZmxhdGUgZGF0YSBmb3JtYXQuICBJdAorZG9lcyBzbyBtb3JlIHNsb3dseSB0aGFuIHpsaWIsIGJ1dCB0aGUgY29kZSBpcyBhYm91dCBvbmUtZmlmdGggdGhlIHNpemUgb2YgdGhlCitpbmZsYXRlIGNvZGUgaW4gemxpYiwgYW5kIHdyaXR0ZW4gdG8gYmUgdmVyeSBlYXN5IHRvIHJlYWQuCisKK1doeSBJIHdyb3RlIHRoaXMgLS0KKworcHVmZi5jIHdhcyB3cml0dGVuIHRvIGRvY3VtZW50IHRoZSBkZWZsYXRlIGZvcm1hdCB1bmFtYmlndW91c2x5LCBieSB2aXJ0dWUgb2YKK2JlaW5nIHdvcmtpbmcgQyBjb2RlLiAgSXQgaXMgbWVhbnQgdG8gc3VwcGxlbWVudCBSRkMgMTk1MSwgd2hpY2ggZm9ybWFsbHkKK2Rlc2NyaWJlcyB0aGUgZGVmbGF0ZSBmb3JtYXQuICBJIGhhdmUgcmVjZWl2ZWQgbWFueSBxdWVzdGlvbnMgb24gZGV0YWlscyBvZiB0aGUKK2RlZmxhdGUgZm9ybWF0LCBhbmQgSSBob3BlIHRoYXQgcmVhZGluZyB0aGlzIGNvZGUgd2lsbCBhbnN3ZXIgdGhvc2UgcXVlc3Rpb25zLgorcHVmZi5jIGlzIGhlYXZpbHkgY29tbWVudGVkIHdpdGggZGV0YWlscyBvZiB0aGUgZGVmbGF0ZSBmb3JtYXQsIGVzcGVjaWFsbHkKK3Rob3NlIGxpdHRsZSBub29rcyBhbmQgY3JhbmllcyBvZiB0aGUgZm9ybWF0IHRoYXQgbWlnaHQgbm90IGJlIG9idmlvdXMgZnJvbSBhCitzcGVjaWZpY2F0aW9uLgorCitwdWZmLmMgbWF5IGFsc28gYmUgdXNlZnVsIGluIGFwcGxpY2F0aW9ucyB3aGVyZSBjb2RlIHNpemUgb3IgbWVtb3J5IHVzYWdlIGlzIGEKK3ZlcnkgbGltaXRlZCByZXNvdXJjZSwgYW5kIHNwZWVkIGlzIG5vdCBhcyBpbXBvcnRhbnQuCisKK0hvdyB0byB1c2UgaXQgLS0KKworV2VsbCwgbW9zdCBsaWtlbHkgeW91IHNob3VsZCBqdXN0IGJlIHJlYWRpbmcgcHVmZi5jIGFuZCB1c2luZyB6bGliIGZvciBhY3R1YWwKK2FwcGxpY2F0aW9ucywgYnV0IGlmIHlvdSBtdXN0IC4uLgorCitJbmNsdWRlIHB1ZmYuaCBpbiB5b3VyIGNvZGUsIHdoaWNoIHByb3ZpZGVzIHRoaXMgcHJvdG90eXBlOgorCitpbnQgcHVmZih1bnNpZ25lZCBjaGFyICpkZXN0LCAgICAgICAgICAgLyogcG9pbnRlciB0byBkZXN0aW5hdGlvbiBwb2ludGVyICovCisgICAgICAgICB1bnNpZ25lZCBsb25nICpkZXN0bGVuLCAgICAgICAgLyogYW1vdW50IG9mIG91dHB1dCBzcGFjZSAqLworICAgICAgICAgdW5zaWduZWQgY2hhciAqc291cmNlLCAgICAgICAgIC8qIHBvaW50ZXIgdG8gc291cmNlIGRhdGEgcG9pbnRlciAqLworICAgICAgICAgdW5zaWduZWQgbG9uZyAqc291cmNlbGVuKTsgICAgIC8qIGFtb3VudCBvZiBpbnB1dCBhdmFpbGFibGUgKi8KKworVGhlbiB5b3UgY2FuIGNhbGwgcHVmZigpIHRvIGRlY29tcHJlc3MgYSBkZWZsYXRlIHN0cmVhbSB0aGF0IGlzIGluIG1lbW9yeSBpbgoraXRzIGVudGlyZXR5IGF0IHNvdXJjZSwgdG8gYSBzdWZmaWNpZW50bHkgc2l6ZWQgYmxvY2sgb2YgbWVtb3J5IGZvciB0aGUKK2RlY29tcHJlc3NlZCBkYXRhIGF0IGRlc3QuICBwdWZmKCkgaXMgdGhlIG9ubHkgZXh0ZXJuYWwgc3ltYm9sIGluIHB1ZmYuYyAgVGhlCitvbmx5IEMgbGlicmFyeSBmdW5jdGlvbnMgdGhhdCBwdWZmLmMgbmVlZHMgYXJlIHNldGptcCgpIGFuZCBsb25nam1wKCksIHdoaWNoCithcmUgdXNlZCB0byBzaW1wbGlmeSBlcnJvciBjaGVja2luZyBpbiB0aGUgY29kZSB0byBpbXByb3ZlIHJlYWRhYmlsdHkuICBwdWZmLmMKK2RvZXMgbm8gbWVtb3J5IGFsbG9jYXRpb24sIGFuZCB1c2VzIGxlc3MgdGhhbiAySyBieXRlcyBvZmYgb2YgdGhlIHN0YWNrLgorCitJZiBkZXN0bGVuIGlzIG5vdCBlbm91Z2ggc3BhY2UgZm9yIHRoZSB1bmNvbXByZXNzZWQgZGF0YSwgdGhlbiBpbmZsYXRlIHdpbGwKK3JldHVybiBhbiBlcnJvciB3aXRob3V0IHdyaXRpbmcgbW9yZSB0aGFuIGRlc3RsZW4gYnl0ZXMuICBOb3RlIHRoYXQgdGhpcyBtZWFucwordGhhdCBpbiBvcmRlciB0byBkZWNvbXByZXNzIHRoZSBkZWZsYXRlIGRhdGEgc3VjY2Vzc2Z1bGx5LCB5b3UgbmVlZCB0byBrbm93Cit0aGUgc2l6ZSBvZiB0aGUgdW5jb21wcmVzc2VkIGRhdGEgYWhlYWQgb2YgdGltZS4KKworSWYgbmVlZGVkLCBwdWZmKCkgY2FuIGRldGVybWluZSB0aGUgc2l6ZSBvZiB0aGUgdW5jb21wcmVzc2VkIGRhdGEgd2l0aCBubworb3V0cHV0IHNwYWNlLiAgVGhpcyBpcyBkb25lIGJ5IHBhc3NpbmcgZGVzdCBlcXVhbCB0byAodW5zaWduZWQgY2hhciAqKTAuICBUaGVuCit0aGUgaW5pdGlhbCB2YWx1ZSBvZiAqZGVzdGxlbiBpcyBpZ25vcmVkIGFuZCAqZGVzdGxlbiBpcyBzZXQgdG8gdGhlIGxlbmd0aCBvZgordGhlIHVuY29tcHJlc3NlZCBkYXRhLiAgU28gaWYgdGhlIHNpemUgb2YgdGhlIHVuY29tcHJlc3NlZCBkYXRhIGlzIG5vdCBrbm93biwKK3RoZW4gdHdvIHBhc3NlcyBvZiBwdWZmKCkgY2FuIGJlIHVzZWQtLWZpcnN0IHRvIGRldGVybWluZSB0aGUgc2l6ZSwgYW5kIHNlY29uZAordG8gZG8gdGhlIGFjdHVhbCBpbmZsYXRpb24gYWZ0ZXIgYWxsb2NhdGluZyB0aGUgYXBwcm9wcmlhdGUgbWVtb3J5LiAgTm90CitwcmV0dHksIGJ1dCBpdCB3b3Jrcy4gIChUaGlzIGlzIG9uZSBvZiB0aGUgcmVhc29ucyB5b3Ugc2hvdWxkIGJlIHVzaW5nIHpsaWIuKQorCitUaGUgZGVmbGF0ZSBmb3JtYXQgaXMgc2VsZi10ZXJtaW5hdGluZy4gIElmIHRoZSBkZWZsYXRlIHN0cmVhbSBkb2VzIG5vdCBlbmQKK2luICpzb3VyY2VsZW4gYnl0ZXMsIHB1ZmYoKSB3aWxsIHJldHVybiBhbiBlcnJvciB3aXRob3V0IHJlYWRpbmcgYXQgb3IgcGFzdAorZW5kc291cmNlLgorCitPbiByZXR1cm4sICpzb3VyY2VsZW4gaXMgdXBkYXRlZCB0byB0aGUgYW1vdW50IG9mIGlucHV0IGRhdGEgY29uc3VtZWQsIGFuZAorKmRlc3RsZW4gaXMgdXBkYXRlZCB0byB0aGUgc2l6ZSBvZiB0aGUgdW5jb21wcmVzc2VkIGRhdGEuICBTZWUgdGhlIGNvbW1lbnRzCitpbiBwdWZmLmMgZm9yIHRoZSBwb3NzaWJsZSByZXR1cm4gY29kZXMgZm9yIHB1ZmYoKS4KZGlmZiAtLWdpdCBhL3psaWItMS4yLjYvY29udHJpYi9wdWZmL3B1ZmYuYyBiL3psaWItMS4yLjYvY29udHJpYi9wdWZmL3B1ZmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjg0NzBjCi0tLSAvZGV2L251bGwKKysrIGIvemxpYi0xLjIuNi9jb250cmliL3B1ZmYvcHVmZi5jCkBAIC0wLDAgKzEsODM3IEBACisvKgorICogcHVmZi5jCisgKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAxMCBNYXJrIEFkbGVyCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gcHVmZi5oCisgKiB2ZXJzaW9uIDIuMiwgMjUgQXByIDIwMTAKKyAqCisgKiBwdWZmLmMgaXMgYSBzaW1wbGUgaW5mbGF0ZSB3cml0dGVuIHRvIGJlIGFuIHVuYW1iaWd1b3VzIHdheSB0byBzcGVjaWZ5IHRoZQorICogZGVmbGF0ZSBmb3JtYXQuICBJdCBpcyBub3Qgd3JpdHRlbiBmb3Igc3BlZWQgYnV0IHJhdGhlciBzaW1wbGljaXR5LiAgQXMgYQorICogc2lkZSBiZW5lZml0LCB0aGlzIGNvZGUgbWlnaHQgYWN0dWFsbHkgYmUgdXNlZnVsIHdoZW4gc21hbGwgY29kZSBpcyBtb3JlCisgKiBpbXBvcnRhbnQgdGhhbiBzcGVlZCwgc3VjaCBhcyBib290c3RyYXAgYXBwbGljYXRpb25zLiAgRm9yIHR5cGljYWwgZGVmbGF0ZQorICogZGF0YSwgemxpYidzIGluZmxhdGUoKSBpcyBhYm91dCBmb3VyIHRpbWVzIGFzIGZhc3QgYXMgcHVmZigpLiAgemxpYidzCisgKiBpbmZsYXRlIGNvbXBpbGVzIHRvIGFyb3VuZCAyMEsgb24gbXkgbWFjaGluZSwgd2hlcmVhcyBwdWZmLmMgY29tcGlsZXMgdG8KKyAqIGFyb3VuZCA0SyBvbiBteSBtYWNoaW5lIChhIFBvd2VyUEMgdXNpbmcgR05VIGNjKS4gIElmIHRoZSBmYXN0ZXIgZGVjb2RlKCkKKyAqIGZ1bmN0aW9uIGhlcmUgaXMgdXNlZCwgdGhlbiBwdWZmKCkgaXMgb25seSB0d2ljZSBhcyBzbG93IGFzIHpsaWIncworICogaW5mbGF0ZSgpLgorICoKKyAqIEFsbCBkeW5hbWljYWxseSBhbGxvY2F0ZWQgbWVtb3J5IGNvbWVzIGZyb20gdGhlIHN0YWNrLiAgVGhlIHN0YWNrIHJlcXVpcmVkCisgKiBpcyBsZXNzIHRoYW4gMksgYnl0ZXMuICBUaGlzIGNvZGUgaXMgY29tcGF0aWJsZSB3aXRoIDE2LWJpdCBpbnQncyBhbmQKKyAqIGFzc3VtZXMgdGhhdCBsb25nJ3MgYXJlIGF0IGxlYXN0IDMyIGJpdHMuICBwdWZmLmMgdXNlcyB0aGUgc2hvcnQgZGF0YSB0eXBlLAorICogYXNzdW1lZCB0byBiZSAxNiBiaXRzLCBmb3IgYXJyYXlzIGluIG9yZGVyIHRvIHRvIGNvbnNlcnZlIG1lbW9yeS4gIFRoZSBjb2RlCisgKiB3b3JrcyB3aGV0aGVyIGludGVnZXJzIGFyZSBzdG9yZWQgYmlnIGVuZGlhbiBvciBsaXR0bGUgZW5kaWFuLgorICoKKyAqIEluIHRoZSBjb21tZW50cyBiZWxvdyBhcmUgIkZvcm1hdCBub3RlcyIgdGhhdCBkZXNjcmliZSB0aGUgaW5mbGF0ZSBwcm9jZXNzCisgKiBhbmQgZG9jdW1lbnQgc29tZSBvZiB0aGUgbGVzcyBvYnZpb3VzIGFzcGVjdHMgb2YgdGhlIGZvcm1hdC4gIFRoaXMgc291cmNlCisgKiBjb2RlIGlzIG1lYW50IHRvIHN1cHBsZW1lbnQgUkZDIDE5NTEsIHdoaWNoIGZvcm1hbGx5IGRlc2NyaWJlcyB0aGUgZGVmbGF0ZQorICogZm9ybWF0OgorICoKKyAqICAgIGh0dHA6Ly93d3cuemxpYi5vcmcvcmZjLWRlZmxhdGUuaHRtbAorICovCisKKy8qCisgKiBDaGFuZ2UgaGlzdG9yeToKKyAqCisgKiAxLjAgIDEwIEZlYiAyMDAyICAgICAtIEZpcnN0IHZlcnNpb24KKyAqIDEuMSAgMTcgRmViIDIwMDIgICAgIC0gQ2xhcmlmaWNhdGlvbnMgb2Ygc29tZSBjb21tZW50cyBhbmQgbm90ZXMKKyAqICAgICAgICAgICAgICAgICAgICAgIC0gVXBkYXRlIHB1ZmYoKSBkZXN0IGFuZCBzb3VyY2UgcG9pbnRlcnMgb24gbmVnYXRpdmUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzIHRvIGZhY2lsaXRhdGUgZGVidWdnaW5nIGRlZmxhdG9ycworICogICAgICAgICAgICAgICAgICAgICAgLSBSZW1vdmUgbG9uZ2VzdCBmcm9tIHN0cnVjdCBodWZmbWFuIC0tIG5vdCBuZWVkZWQKKyAqICAgICAgICAgICAgICAgICAgICAgIC0gU2ltcGxpZnkgb2Zmc1tdIGluZGV4IGluIGNvbnN0cnVjdCgpCisgKiAgICAgICAgICAgICAgICAgICAgICAtIEFkZCBpbnB1dCBzaXplIGFuZCBjaGVja2luZywgdXNpbmcgbG9uZ2ptcCgpIHRvCisgKiAgICAgICAgICAgICAgICAgICAgICAgIG1haW50YWluIGVhc3kgcmVhZGFiaWxpdHkKKyAqICAgICAgICAgICAgICAgICAgICAgIC0gVXNlIHNob3J0IGRhdGEgdHlwZSBmb3IgbGFyZ2UgYXJyYXlzCisgKiAgICAgICAgICAgICAgICAgICAgICAtIFVzZSBwb2ludGVycyBpbnN0ZWFkIG9mIGxvbmcgdG8gc3BlY2lmeSBzb3VyY2UgYW5kCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uIHNpemVzIHRvIGF2b2lkIGFyYml0cmFyeSA0IEdCIGxpbWl0cworICogMS4yICAxNyBNYXIgMjAwMiAgICAgLSBBZGQgZmFzdGVyIHZlcnNpb24gb2YgZGVjb2RlKCksIGRvdWJsZXMgc3BlZWQgKCEpLAorICogICAgICAgICAgICAgICAgICAgICAgICBidXQgbGVhdmUgc2ltcGxlIHZlcnNpb24gZm9yIHJlYWRhYmlsdHkKKyAqICAgICAgICAgICAgICAgICAgICAgIC0gTWFrZSBzdXJlIGludmFsaWQgZGlzdGFuY2VzIGRldGVjdGVkIGlmIHBvaW50ZXJzCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGFyZSAxNiBiaXRzCisgKiAgICAgICAgICAgICAgICAgICAgICAtIEZpeCBmaXhlZCBjb2RlcyB0YWJsZSBlcnJvcgorICogICAgICAgICAgICAgICAgICAgICAgLSBQcm92aWRlIGEgc2Nhbm5pbmcgbW9kZSBmb3IgZGV0ZXJtaW5pbmcgc2l6ZSBvZgorICogICAgICAgICAgICAgICAgICAgICAgICB1bmNvbXByZXNzZWQgZGF0YQorICogMS4zICAyMCBNYXIgMjAwMiAgICAgLSBHbyBiYWNrIHRvIGxlbmd0aHMgZm9yIHB1ZmYoKSBwYXJhbWV0ZXJzIFtHYWlsbHldCisgKiAgICAgICAgICAgICAgICAgICAgICAtIEFkZCBhIHB1ZmYuaCBmaWxlIGZvciB0aGUgaW50ZXJmYWNlCisgKiAgICAgICAgICAgICAgICAgICAgICAtIEFkZCBicmFjZXMgaW4gcHVmZigpIGZvciBlbHNlIGRvIFtHYWlsbHldCisgKiAgICAgICAgICAgICAgICAgICAgICAtIFVzZSBpbmRleGVzIGluc3RlYWQgb2YgcG9pbnRlcnMgZm9yIHJlYWRhYmlsaXR5CisgKiAxLjQgIDMxIE1hciAyMDAyICAgICAtIFNpbXBsaWZ5IGNvbnN0cnVjdCgpIGNvZGUgc2V0IGNoZWNrCisgKiAgICAgICAgICAgICAgICAgICAgICAtIEZpeCBzb21lIGNvbW1lbnRzCisgKiAgICAgICAgICAgICAgICAgICAgICAtIEFkZCBGSVhMQ09ERVMgI2RlZmluZQorICogMS41ICAgNiBBcHIgMjAwMiAgICAgLSBNaW5vciBjb21tZW50IGZpeGVzCisgKiAxLjYgICA3IEF1ZyAyMDAyICAgICAtIE1pbm9yIGZvcm1hdCBjaGFuZ2VzCisgKiAxLjcgICAzIE1hciAyMDAzICAgICAtIEFkZGVkIHRlc3QgY29kZSBmb3IgZGlzdHJpYnV0aW9uCisgKiAgICAgICAgICAgICAgICAgICAgICAtIEFkZGVkIHpsaWItbGlrZSBsaWNlbnNlCisgKiAxLjggICA5IEphbiAyMDA0ICAgICAtIEFkZGVkIHNvbWUgY29tbWVudHMgb24gbm8gZGlzdGFuY2UgY29kZXMgY2FzZQorICogMS45ICAyMSBGZWIgMjAwOCAgICAgLSBGaXggYnVnIG9uIDE2LWJpdCBpbnRlZ2VyIGFyY2hpdGVjdHVyZXMgW1BvaGxhbmRdCisgKiAgICAgICAgICAgICAgICAgICAgICAtIENhdGNoIG1pc3NpbmcgZW5kLW9mLWJsb2NrIHN5bWJvbCBlcnJvcgorICogMi4wICAyNSBKdWwgMjAwOCAgICAgLSBBZGQgI2RlZmluZSB0byBwZXJtaXQgZGlzdGFuY2UgdG9vIGZhciBiYWNrCisgKiAgICAgICAgICAgICAgICAgICAgICAtIEFkZCBvcHRpb24gaW4gVEVTVCBjb2RlIGZvciBwdWZmIHRvIHdyaXRlIHRoZSBkYXRhCisgKiAgICAgICAgICAgICAgICAgICAgICAtIEFkZCBvcHRpb24gaW4gVEVTVCBjb2RlIHRvIHNraXAgaW5wdXQgYnl0ZXMKKyAqICAgICAgICAgICAgICAgICAgICAgIC0gQWxsb3cgVEVTVCBjb2RlIHRvIHJlYWQgZnJvbSBwaXBlZCBzdGRpbgorICogMi4xICAgNCBBcHIgMjAxMCAgICAgLSBBdm9pZCB2YXJpYWJsZSBpbml0aWFsaXphdGlvbiBmb3IgaGFwcGllciBjb21waWxlcnMKKyAqICAgICAgICAgICAgICAgICAgICAgIC0gQXZvaWQgdW5zaWduZWQgY29tcGFyaXNvbnMgZm9yIGV2ZW4gaGFwcGllciBjb21waWxlcnMKKyAqIDIuMiAgMjUgQXByIDIwMTAgICAgIC0gRml4IGJ1ZyBpbiB2YXJpYWJsZSBpbml0aWFsaXphdGlvbnMgW09iZXJodW1lcl0KKyAqICAgICAgICAgICAgICAgICAgICAgIC0gQWRkIGNvbnN0IHdoZXJlIGFwcHJvcHJpYXRlIFtPYmVyaHVtZXJdCisgKiAgICAgICAgICAgICAgICAgICAgICAtIFNwbGl0IGlmJ3MgYW5kID8ncyBmb3IgY292ZXJhZ2UgdGVzdGluZworICogICAgICAgICAgICAgICAgICAgICAgLSBCcmVhayBvdXQgdGVzdCBjb2RlIHRvIHNlcGFyYXRlIGZpbGUKKyAqICAgICAgICAgICAgICAgICAgICAgIC0gTW92ZSBOSUwgdG8gcHVmZi5oCisgKiAgICAgICAgICAgICAgICAgICAgICAtIEFsbG93IGluY29tcGxldGUgY29kZSBvbmx5IGlmIHNpbmdsZSBjb2RlIGxlbmd0aCBpcyAxCisgKiAgICAgICAgICAgICAgICAgICAgICAtIEFkZCBmdWxsIGNvZGUgY292ZXJhZ2UgdGVzdCB0byBNYWtlZmlsZQorICovCisKKyNpbmNsdWRlIDxzZXRqbXAuaD4gICAgICAgICAgICAgLyogZm9yIHNldGptcCgpLCBsb25nam1wKCksIGFuZCBqbXBfYnVmICovCisjaW5jbHVkZSAicHVmZi5oIiAgICAgICAgICAgICAgIC8qIHByb3RvdHlwZSBmb3IgcHVmZigpICovCisKKyNkZWZpbmUgbG9jYWwgc3RhdGljICAgICAgICAgICAgLyogZm9yIGxvY2FsIGZ1bmN0aW9uIGRlZmluaXRpb25zICovCisKKy8qCisgKiBNYXhpbXVtcyBmb3IgYWxsb2NhdGlvbnMgYW5kIGxvb3BzLiAgSXQgaXMgbm90IHVzZWZ1bCB0byBjaGFuZ2UgdGhlc2UgLS0KKyAqIHRoZXkgYXJlIGZpeGVkIGJ5IHRoZSBkZWZsYXRlIGZvcm1hdC4KKyAqLworI2RlZmluZSBNQVhCSVRTIDE1ICAgICAgICAgICAgICAvKiBtYXhpbXVtIGJpdHMgaW4gYSBjb2RlICovCisjZGVmaW5lIE1BWExDT0RFUyAyODYgICAgICAgICAgIC8qIG1heGltdW0gbnVtYmVyIG9mIGxpdGVyYWwvbGVuZ3RoIGNvZGVzICovCisjZGVmaW5lIE1BWERDT0RFUyAzMCAgICAgICAgICAgIC8qIG1heGltdW0gbnVtYmVyIG9mIGRpc3RhbmNlIGNvZGVzICovCisjZGVmaW5lIE1BWENPREVTIChNQVhMQ09ERVMrTUFYRENPREVTKSAgLyogbWF4aW11bSBjb2RlcyBsZW5ndGhzIHRvIHJlYWQgKi8KKyNkZWZpbmUgRklYTENPREVTIDI4OCAgICAgICAgICAgLyogbnVtYmVyIG9mIGZpeGVkIGxpdGVyYWwvbGVuZ3RoIGNvZGVzICovCisKKy8qIGlucHV0IGFuZCBvdXRwdXQgc3RhdGUgKi8KK3N0cnVjdCBzdGF0ZSB7CisgICAgLyogb3V0cHV0IHN0YXRlICovCisgICAgdW5zaWduZWQgY2hhciAqb3V0OyAgICAgICAgIC8qIG91dHB1dCBidWZmZXIgKi8KKyAgICB1bnNpZ25lZCBsb25nIG91dGxlbjsgICAgICAgLyogYXZhaWxhYmxlIHNwYWNlIGF0IG91dCAqLworICAgIHVuc2lnbmVkIGxvbmcgb3V0Y250OyAgICAgICAvKiBieXRlcyB3cml0dGVuIHRvIG91dCBzbyBmYXIgKi8KKworICAgIC8qIGlucHV0IHN0YXRlICovCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqaW47ICAgIC8qIGlucHV0IGJ1ZmZlciAqLworICAgIHVuc2lnbmVkIGxvbmcgaW5sZW47ICAgICAgICAvKiBhdmFpbGFibGUgaW5wdXQgYXQgaW4gKi8KKyAgICB1bnNpZ25lZCBsb25nIGluY250OyAgICAgICAgLyogYnl0ZXMgcmVhZCBzbyBmYXIgKi8KKyAgICBpbnQgYml0YnVmOyAgICAgICAgICAgICAgICAgLyogYml0IGJ1ZmZlciAqLworICAgIGludCBiaXRjbnQ7ICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgYml0cyBpbiBiaXQgYnVmZmVyICovCisKKyAgICAvKiBpbnB1dCBsaW1pdCBlcnJvciByZXR1cm4gc3RhdGUgZm9yIGJpdHMoKSBhbmQgZGVjb2RlKCkgKi8KKyAgICBqbXBfYnVmIGVudjsKK307CisKKy8qCisgKiBSZXR1cm4gbmVlZCBiaXRzIGZyb20gdGhlIGlucHV0IHN0cmVhbS4gIFRoaXMgYWx3YXlzIGxlYXZlcyBsZXNzIHRoYW4KKyAqIGVpZ2h0IGJpdHMgaW4gdGhlIGJ1ZmZlci4gIGJpdHMoKSB3b3JrcyBwcm9wZXJseSBmb3IgbmVlZCA9PSAwLgorICoKKyAqIEZvcm1hdCBub3RlczoKKyAqCisgKiAtIEJpdHMgYXJlIHN0b3JlZCBpbiBieXRlcyBmcm9tIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQgdG8gdGhlIG1vc3QKKyAqICAgc2lnbmlmaWNhbnQgYml0LiAgVGhlcmVmb3JlIGJpdHMgYXJlIGRyb3BwZWQgZnJvbSB0aGUgYm90dG9tIG9mIHRoZSBiaXQKKyAqICAgYnVmZmVyLCB1c2luZyBzaGlmdCByaWdodCwgYW5kIG5ldyBieXRlcyBhcmUgYXBwZW5kZWQgdG8gdGhlIHRvcCBvZiB0aGUKKyAqICAgYml0IGJ1ZmZlciwgdXNpbmcgc2hpZnQgbGVmdC4KKyAqLworbG9jYWwgaW50IGJpdHMoc3RydWN0IHN0YXRlICpzLCBpbnQgbmVlZCkKK3sKKyAgICBsb25nIHZhbDsgICAgICAgICAgIC8qIGJpdCBhY2N1bXVsYXRvciAoY2FuIHVzZSB1cCB0byAyMCBiaXRzKSAqLworCisgICAgLyogbG9hZCBhdCBsZWFzdCBuZWVkIGJpdHMgaW50byB2YWwgKi8KKyAgICB2YWwgPSBzLT5iaXRidWY7CisgICAgd2hpbGUgKHMtPmJpdGNudCA8IG5lZWQpIHsKKyAgICAgICAgaWYgKHMtPmluY250ID09IHMtPmlubGVuKQorICAgICAgICAgICAgbG9uZ2ptcChzLT5lbnYsIDEpOyAgICAgICAgIC8qIG91dCBvZiBpbnB1dCAqLworICAgICAgICB2YWwgfD0gKGxvbmcpKHMtPmluW3MtPmluY250KytdKSA8PCBzLT5iaXRjbnQ7ICAvKiBsb2FkIGVpZ2h0IGJpdHMgKi8KKyAgICAgICAgcy0+Yml0Y250ICs9IDg7CisgICAgfQorCisgICAgLyogZHJvcCBuZWVkIGJpdHMgYW5kIHVwZGF0ZSBidWZmZXIsIGFsd2F5cyB6ZXJvIHRvIHNldmVuIGJpdHMgbGVmdCAqLworICAgIHMtPmJpdGJ1ZiA9IChpbnQpKHZhbCA+PiBuZWVkKTsKKyAgICBzLT5iaXRjbnQgLT0gbmVlZDsKKworICAgIC8qIHJldHVybiBuZWVkIGJpdHMsIHplcm9pbmcgdGhlIGJpdHMgYWJvdmUgdGhhdCAqLworICAgIHJldHVybiAoaW50KSh2YWwgJiAoKDFMIDw8IG5lZWQpIC0gMSkpOworfQorCisvKgorICogUHJvY2VzcyBhIHN0b3JlZCBibG9jay4KKyAqCisgKiBGb3JtYXQgbm90ZXM6CisgKgorICogLSBBZnRlciB0aGUgdHdvLWJpdCBzdG9yZWQgYmxvY2sgdHlwZSAoMDApLCB0aGUgc3RvcmVkIGJsb2NrIGxlbmd0aCBhbmQKKyAqICAgc3RvcmVkIGJ5dGVzIGFyZSBieXRlLWFsaWduZWQgZm9yIGZhc3QgY29weWluZy4gIFRoZXJlZm9yZSBhbnkgbGVmdG92ZXIKKyAqICAgYml0cyBpbiB0aGUgYnl0ZSB0aGF0IGhhcyB0aGUgbGFzdCBiaXQgb2YgdGhlIHR5cGUsIGFzIG1hbnkgYXMgc2V2ZW4sIGFyZQorICogICBkaXNjYXJkZWQuICBUaGUgdmFsdWUgb2YgdGhlIGRpc2NhcmRlZCBiaXRzIGFyZSBub3QgZGVmaW5lZCBhbmQgc2hvdWxkIG5vdAorICogICBiZSBjaGVja2VkIGFnYWluc3QgYW55IGV4cGVjdGF0aW9uLgorICoKKyAqIC0gVGhlIHNlY29uZCBpbnZlcnRlZCBjb3B5IG9mIHRoZSBzdG9yZWQgYmxvY2sgbGVuZ3RoIGRvZXMgbm90IGhhdmUgdG8gYmUKKyAqICAgY2hlY2tlZCwgYnV0IGl0J3MgcHJvYmFibHkgYSBnb29kIGlkZWEgdG8gZG8gc28gYW55d2F5LgorICoKKyAqIC0gQSBzdG9yZWQgYmxvY2sgY2FuIGhhdmUgemVybyBsZW5ndGguICBUaGlzIGlzIHNvbWV0aW1lcyB1c2VkIHRvIGJ5dGUtYWxpZ24KKyAqICAgc3Vic2V0cyBvZiB0aGUgY29tcHJlc3NlZCBkYXRhIGZvciByYW5kb20gYWNjZXNzIG9yIHBhcnRpYWwgcmVjb3ZlcnkuCisgKi8KK2xvY2FsIGludCBzdG9yZWQoc3RydWN0IHN0YXRlICpzKQoreworICAgIHVuc2lnbmVkIGxlbjsgICAgICAgLyogbGVuZ3RoIG9mIHN0b3JlZCBibG9jayAqLworCisgICAgLyogZGlzY2FyZCBsZWZ0b3ZlciBiaXRzIGZyb20gY3VycmVudCBieXRlIChhc3N1bWVzIHMtPmJpdGNudCA8IDgpICovCisgICAgcy0+Yml0YnVmID0gMDsKKyAgICBzLT5iaXRjbnQgPSAwOworCisgICAgLyogZ2V0IGxlbmd0aCBhbmQgY2hlY2sgYWdhaW5zdCBpdHMgb25lJ3MgY29tcGxlbWVudCAqLworICAgIGlmIChzLT5pbmNudCArIDQgPiBzLT5pbmxlbikKKyAgICAgICAgcmV0dXJuIDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vdCBlbm91Z2ggaW5wdXQgKi8KKyAgICBsZW4gPSBzLT5pbltzLT5pbmNudCsrXTsKKyAgICBsZW4gfD0gcy0+aW5bcy0+aW5jbnQrK10gPDwgODsKKyAgICBpZiAocy0+aW5bcy0+aW5jbnQrK10gIT0gKH5sZW4gJiAweGZmKSB8fAorICAgICAgICBzLT5pbltzLT5pbmNudCsrXSAhPSAoKH5sZW4gPj4gOCkgJiAweGZmKSkKKyAgICAgICAgcmV0dXJuIC0yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRpZG4ndCBtYXRjaCBjb21wbGVtZW50ISAqLworCisgICAgLyogY29weSBsZW4gYnl0ZXMgZnJvbSBpbiB0byBvdXQgKi8KKyAgICBpZiAocy0+aW5jbnQgKyBsZW4gPiBzLT5pbmxlbikKKyAgICAgICAgcmV0dXJuIDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vdCBlbm91Z2ggaW5wdXQgKi8KKyAgICBpZiAocy0+b3V0ICE9IE5JTCkgeworICAgICAgICBpZiAocy0+b3V0Y250ICsgbGVuID4gcy0+b3V0bGVuKQorICAgICAgICAgICAgcmV0dXJuIDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm90IGVub3VnaCBvdXRwdXQgc3BhY2UgKi8KKyAgICAgICAgd2hpbGUgKGxlbi0tKQorICAgICAgICAgICAgcy0+b3V0W3MtPm91dGNudCsrXSA9IHMtPmluW3MtPmluY250KytdOworICAgIH0KKyAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGp1c3Qgc2Nhbm5pbmcgKi8KKyAgICAgICAgcy0+b3V0Y250ICs9IGxlbjsKKyAgICAgICAgcy0+aW5jbnQgKz0gbGVuOworICAgIH0KKworICAgIC8qIGRvbmUgd2l0aCBhIHZhbGlkIHN0b3JlZCBibG9jayAqLworICAgIHJldHVybiAwOworfQorCisvKgorICogSHVmZm1hbiBjb2RlIGRlY29kaW5nIHRhYmxlcy4gIGNvdW50WzEuLk1BWEJJVFNdIGlzIHRoZSBudW1iZXIgb2Ygc3ltYm9scyBvZgorICogZWFjaCBsZW5ndGgsIHdoaWNoIGZvciBhIGNhbm9uaWNhbCBjb2RlIGFyZSBzdGVwcGVkIHRocm91Z2ggaW4gb3JkZXIuCisgKiBzeW1ib2xbXSBhcmUgdGhlIHN5bWJvbCB2YWx1ZXMgaW4gY2Fub25pY2FsIG9yZGVyLCB3aGVyZSB0aGUgbnVtYmVyIG9mCisgKiBlbnRyaWVzIGlzIHRoZSBzdW0gb2YgdGhlIGNvdW50cyBpbiBjb3VudFtdLiAgVGhlIGRlY29kaW5nIHByb2Nlc3MgY2FuIGJlCisgKiBzZWVuIGluIHRoZSBmdW5jdGlvbiBkZWNvZGUoKSBiZWxvdy4KKyAqLworc3RydWN0IGh1ZmZtYW4geworICAgIHNob3J0ICpjb3VudDsgICAgICAgLyogbnVtYmVyIG9mIHN5bWJvbHMgb2YgZWFjaCBsZW5ndGggKi8KKyAgICBzaG9ydCAqc3ltYm9sOyAgICAgIC8qIGNhbm9uaWNhbGx5IG9yZGVyZWQgc3ltYm9scyAqLworfTsKKworLyoKKyAqIERlY29kZSBhIGNvZGUgZnJvbSB0aGUgc3RyZWFtIHMgdXNpbmcgaHVmZm1hbiB0YWJsZSBoLiAgUmV0dXJuIHRoZSBzeW1ib2wgb3IKKyAqIGEgbmVnYXRpdmUgdmFsdWUgaWYgdGhlcmUgaXMgYW4gZXJyb3IuICBJZiBhbGwgb2YgdGhlIGxlbmd0aHMgYXJlIHplcm8sIGkuZS4KKyAqIGFuIGVtcHR5IGNvZGUsIG9yIGlmIHRoZSBjb2RlIGlzIGluY29tcGxldGUgYW5kIGFuIGludmFsaWQgY29kZSBpcyByZWNlaXZlZCwKKyAqIHRoZW4gLTEwIGlzIHJldHVybmVkIGFmdGVyIHJlYWRpbmcgTUFYQklUUyBiaXRzLgorICoKKyAqIEZvcm1hdCBub3RlczoKKyAqCisgKiAtIFRoZSBjb2RlcyBhcyBzdG9yZWQgaW4gdGhlIGNvbXByZXNzZWQgZGF0YSBhcmUgYml0LXJldmVyc2VkIHJlbGF0aXZlIHRvCisgKiAgIGEgc2ltcGxlIGludGVnZXIgb3JkZXJpbmcgb2YgY29kZXMgb2YgdGhlIHNhbWUgbGVuZ3Rocy4gIEhlbmNlIGJlbG93IHRoZQorICogICBiaXRzIGFyZSBwdWxsZWQgZnJvbSB0aGUgY29tcHJlc3NlZCBkYXRhIG9uZSBhdCBhIHRpbWUgYW5kIHVzZWQgdG8KKyAqICAgYnVpbGQgdGhlIGNvZGUgdmFsdWUgcmV2ZXJzZWQgZnJvbSB3aGF0IGlzIGluIHRoZSBzdHJlYW0gaW4gb3JkZXIgdG8KKyAqICAgcGVybWl0IHNpbXBsZSBpbnRlZ2VyIGNvbXBhcmlzb25zIGZvciBkZWNvZGluZy4gIEEgdGFibGUtYmFzZWQgZGVjb2RpbmcKKyAqICAgc2NoZW1lIChhcyB1c2VkIGluIHpsaWIpIGRvZXMgbm90IG5lZWQgdG8gZG8gdGhpcyByZXZlcnNhbC4KKyAqCisgKiAtIFRoZSBmaXJzdCBjb2RlIGZvciB0aGUgc2hvcnRlc3QgbGVuZ3RoIGlzIGFsbCB6ZXJvcy4gIFN1YnNlcXVlbnQgY29kZXMgb2YKKyAqICAgdGhlIHNhbWUgbGVuZ3RoIGFyZSBzaW1wbHkgaW50ZWdlciBpbmNyZW1lbnRzIG9mIHRoZSBwcmV2aW91cyBjb2RlLiAgV2hlbgorICogICBtb3ZpbmcgdXAgYSBsZW5ndGgsIGEgemVybyBiaXQgaXMgYXBwZW5kZWQgdG8gdGhlIGNvZGUuICBGb3IgYSBjb21wbGV0ZQorICogICBjb2RlLCB0aGUgbGFzdCBjb2RlIG9mIHRoZSBsb25nZXN0IGxlbmd0aCB3aWxsIGJlIGFsbCBvbmVzLgorICoKKyAqIC0gSW5jb21wbGV0ZSBjb2RlcyBhcmUgaGFuZGxlZCBieSB0aGlzIGRlY29kZXIsIHNpbmNlIHRoZXkgYXJlIHBlcm1pdHRlZAorICogICBpbiB0aGUgZGVmbGF0ZSBmb3JtYXQuICBTZWUgdGhlIGZvcm1hdCBub3RlcyBmb3IgZml4ZWQoKSBhbmQgZHluYW1pYygpLgorICovCisjaWZkZWYgU0xPVworbG9jYWwgaW50IGRlY29kZShzdHJ1Y3Qgc3RhdGUgKnMsIGNvbnN0IHN0cnVjdCBodWZmbWFuICpoKQoreworICAgIGludCBsZW47ICAgICAgICAgICAgLyogY3VycmVudCBudW1iZXIgb2YgYml0cyBpbiBjb2RlICovCisgICAgaW50IGNvZGU7ICAgICAgICAgICAvKiBsZW4gYml0cyBiZWluZyBkZWNvZGVkICovCisgICAgaW50IGZpcnN0OyAgICAgICAgICAvKiBmaXJzdCBjb2RlIG9mIGxlbmd0aCBsZW4gKi8KKyAgICBpbnQgY291bnQ7ICAgICAgICAgIC8qIG51bWJlciBvZiBjb2RlcyBvZiBsZW5ndGggbGVuICovCisgICAgaW50IGluZGV4OyAgICAgICAgICAvKiBpbmRleCBvZiBmaXJzdCBjb2RlIG9mIGxlbmd0aCBsZW4gaW4gc3ltYm9sIHRhYmxlICovCisKKyAgICBjb2RlID0gZmlyc3QgPSBpbmRleCA9IDA7CisgICAgZm9yIChsZW4gPSAxOyBsZW4gPD0gTUFYQklUUzsgbGVuKyspIHsKKyAgICAgICAgY29kZSB8PSBiaXRzKHMsIDEpOyAgICAgICAgICAgICAvKiBnZXQgbmV4dCBiaXQgKi8KKyAgICAgICAgY291bnQgPSBoLT5jb3VudFtsZW5dOworICAgICAgICBpZiAoY29kZSAtIGNvdW50IDwgZmlyc3QpICAgICAgIC8qIGlmIGxlbmd0aCBsZW4sIHJldHVybiBzeW1ib2wgKi8KKyAgICAgICAgICAgIHJldHVybiBoLT5zeW1ib2xbaW5kZXggKyAoY29kZSAtIGZpcnN0KV07CisgICAgICAgIGluZGV4ICs9IGNvdW50OyAgICAgICAgICAgICAgICAgLyogZWxzZSB1cGRhdGUgZm9yIG5leHQgbGVuZ3RoICovCisgICAgICAgIGZpcnN0ICs9IGNvdW50OworICAgICAgICBmaXJzdCA8PD0gMTsKKyAgICAgICAgY29kZSA8PD0gMTsKKyAgICB9CisgICAgcmV0dXJuIC0xMDsgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmFuIG91dCBvZiBjb2RlcyAqLworfQorCisvKgorICogQSBmYXN0ZXIgdmVyc2lvbiBvZiBkZWNvZGUoKSBmb3IgcmVhbCBhcHBsaWNhdGlvbnMgb2YgdGhpcyBjb2RlLiAgIEl0J3Mgbm90CisgKiBhcyByZWFkYWJsZSwgYnV0IGl0IG1ha2VzIHB1ZmYoKSB0d2ljZSBhcyBmYXN0LiAgQW5kIGl0IG9ubHkgbWFrZXMgdGhlIGNvZGUKKyAqIGEgZmV3IHBlcmNlbnQgbGFyZ2VyLgorICovCisjZWxzZSAvKiAhU0xPVyAqLworbG9jYWwgaW50IGRlY29kZShzdHJ1Y3Qgc3RhdGUgKnMsIGNvbnN0IHN0cnVjdCBodWZmbWFuICpoKQoreworICAgIGludCBsZW47ICAgICAgICAgICAgLyogY3VycmVudCBudW1iZXIgb2YgYml0cyBpbiBjb2RlICovCisgICAgaW50IGNvZGU7ICAgICAgICAgICAvKiBsZW4gYml0cyBiZWluZyBkZWNvZGVkICovCisgICAgaW50IGZpcnN0OyAgICAgICAgICAvKiBmaXJzdCBjb2RlIG9mIGxlbmd0aCBsZW4gKi8KKyAgICBpbnQgY291bnQ7ICAgICAgICAgIC8qIG51bWJlciBvZiBjb2RlcyBvZiBsZW5ndGggbGVuICovCisgICAgaW50IGluZGV4OyAgICAgICAgICAvKiBpbmRleCBvZiBmaXJzdCBjb2RlIG9mIGxlbmd0aCBsZW4gaW4gc3ltYm9sIHRhYmxlICovCisgICAgaW50IGJpdGJ1ZjsgICAgICAgICAvKiBiaXRzIGZyb20gc3RyZWFtICovCisgICAgaW50IGxlZnQ7ICAgICAgICAgICAvKiBiaXRzIGxlZnQgaW4gbmV4dCBvciBsZWZ0IHRvIHByb2Nlc3MgKi8KKyAgICBzaG9ydCAqbmV4dDsgICAgICAgIC8qIG5leHQgbnVtYmVyIG9mIGNvZGVzICovCisKKyAgICBiaXRidWYgPSBzLT5iaXRidWY7CisgICAgbGVmdCA9IHMtPmJpdGNudDsKKyAgICBjb2RlID0gZmlyc3QgPSBpbmRleCA9IDA7CisgICAgbGVuID0gMTsKKyAgICBuZXh0ID0gaC0+Y291bnQgKyAxOworICAgIHdoaWxlICgxKSB7CisgICAgICAgIHdoaWxlIChsZWZ0LS0pIHsKKyAgICAgICAgICAgIGNvZGUgfD0gYml0YnVmICYgMTsKKyAgICAgICAgICAgIGJpdGJ1ZiA+Pj0gMTsKKyAgICAgICAgICAgIGNvdW50ID0gKm5leHQrKzsKKyAgICAgICAgICAgIGlmIChjb2RlIC0gY291bnQgPCBmaXJzdCkgeyAvKiBpZiBsZW5ndGggbGVuLCByZXR1cm4gc3ltYm9sICovCisgICAgICAgICAgICAgICAgcy0+Yml0YnVmID0gYml0YnVmOworICAgICAgICAgICAgICAgIHMtPmJpdGNudCA9IChzLT5iaXRjbnQgLSBsZW4pICYgNzsKKyAgICAgICAgICAgICAgICByZXR1cm4gaC0+c3ltYm9sW2luZGV4ICsgKGNvZGUgLSBmaXJzdCldOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW5kZXggKz0gY291bnQ7ICAgICAgICAgICAgIC8qIGVsc2UgdXBkYXRlIGZvciBuZXh0IGxlbmd0aCAqLworICAgICAgICAgICAgZmlyc3QgKz0gY291bnQ7CisgICAgICAgICAgICBmaXJzdCA8PD0gMTsKKyAgICAgICAgICAgIGNvZGUgPDw9IDE7CisgICAgICAgICAgICBsZW4rKzsKKyAgICAgICAgfQorICAgICAgICBsZWZ0ID0gKE1BWEJJVFMrMSkgLSBsZW47CisgICAgICAgIGlmIChsZWZ0ID09IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYgKHMtPmluY250ID09IHMtPmlubGVuKQorICAgICAgICAgICAgbG9uZ2ptcChzLT5lbnYsIDEpOyAgICAgICAgIC8qIG91dCBvZiBpbnB1dCAqLworICAgICAgICBiaXRidWYgPSBzLT5pbltzLT5pbmNudCsrXTsKKyAgICAgICAgaWYgKGxlZnQgPiA4KQorICAgICAgICAgICAgbGVmdCA9IDg7CisgICAgfQorICAgIHJldHVybiAtMTA7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJhbiBvdXQgb2YgY29kZXMgKi8KK30KKyNlbmRpZiAvKiBTTE9XICovCisKKy8qCisgKiBHaXZlbiB0aGUgbGlzdCBvZiBjb2RlIGxlbmd0aHMgbGVuZ3RoWzAuLm4tMV0gcmVwcmVzZW50aW5nIGEgY2Fub25pY2FsCisgKiBIdWZmbWFuIGNvZGUgZm9yIG4gc3ltYm9scywgY29uc3RydWN0IHRoZSB0YWJsZXMgcmVxdWlyZWQgdG8gZGVjb2RlIHRob3NlCisgKiBjb2Rlcy4gIFRob3NlIHRhYmxlcyBhcmUgdGhlIG51bWJlciBvZiBjb2RlcyBvZiBlYWNoIGxlbmd0aCwgYW5kIHRoZSBzeW1ib2xzCisgKiBzb3J0ZWQgYnkgbGVuZ3RoLCByZXRhaW5pbmcgdGhlaXIgb3JpZ2luYWwgb3JkZXIgd2l0aGluIGVhY2ggbGVuZ3RoLiAgVGhlCisgKiByZXR1cm4gdmFsdWUgaXMgemVybyBmb3IgYSBjb21wbGV0ZSBjb2RlIHNldCwgbmVnYXRpdmUgZm9yIGFuIG92ZXItCisgKiBzdWJzY3JpYmVkIGNvZGUgc2V0LCBhbmQgcG9zaXRpdmUgZm9yIGFuIGluY29tcGxldGUgY29kZSBzZXQuICBUaGUgdGFibGVzCisgKiBjYW4gYmUgdXNlZCBpZiB0aGUgcmV0dXJuIHZhbHVlIGlzIHplcm8gb3IgcG9zaXRpdmUsIGJ1dCB0aGV5IGNhbm5vdCBiZSB1c2VkCisgKiBpZiB0aGUgcmV0dXJuIHZhbHVlIGlzIG5lZ2F0aXZlLiAgSWYgdGhlIHJldHVybiB2YWx1ZSBpcyB6ZXJvLCBpdCBpcyBub3QKKyAqIHBvc3NpYmxlIGZvciBkZWNvZGUoKSB1c2luZyB0aGF0IHRhYmxlIHRvIHJldHVybiBhbiBlcnJvci0tYW55IHN0cmVhbSBvZgorICogZW5vdWdoIGJpdHMgd2lsbCByZXNvbHZlIHRvIGEgc3ltYm9sLiAgSWYgdGhlIHJldHVybiB2YWx1ZSBpcyBwb3NpdGl2ZSwgdGhlbgorICogaXQgaXMgcG9zc2libGUgZm9yIGRlY29kZSgpIHVzaW5nIHRoYXQgdGFibGUgdG8gcmV0dXJuIGFuIGVycm9yIGZvciByZWNlaXZlZAorICogY29kZXMgcGFzdCB0aGUgZW5kIG9mIHRoZSBpbmNvbXBsZXRlIGxlbmd0aHMuCisgKgorICogTm90IHVzZWQgYnkgZGVjb2RlKCksIGJ1dCB1c2VkIGZvciBlcnJvciBjaGVja2luZywgaC0+Y291bnRbMF0gaXMgdGhlIG51bWJlcgorICogb2YgdGhlIG4gc3ltYm9scyBub3QgaW4gdGhlIGNvZGUuICBTbyBuIC0gaC0+Y291bnRbMF0gaXMgdGhlIG51bWJlciBvZgorICogY29kZXMuICBUaGlzIGlzIHVzZWZ1bCBmb3IgY2hlY2tpbmcgZm9yIGluY29tcGxldGUgY29kZXMgdGhhdCBoYXZlIG1vcmUgdGhhbgorICogb25lIHN5bWJvbCwgd2hpY2ggaXMgYW4gZXJyb3IgaW4gYSBkeW5hbWljIGJsb2NrLgorICoKKyAqIEFzc3VtcHRpb246IGZvciBhbGwgaSBpbiAwLi5uLTEsIDAgPD0gbGVuZ3RoW2ldIDw9IE1BWEJJVFMKKyAqIFRoaXMgaXMgYXNzdXJlZCBieSB0aGUgY29uc3RydWN0aW9uIG9mIHRoZSBsZW5ndGggYXJyYXlzIGluIGR5bmFtaWMoKSBhbmQKKyAqIGZpeGVkKCkgYW5kIGlzIG5vdCB2ZXJpZmllZCBieSBjb25zdHJ1Y3QoKS4KKyAqCisgKiBGb3JtYXQgbm90ZXM6CisgKgorICogLSBQZXJtaXR0ZWQgYW5kIGV4cGVjdGVkIGV4YW1wbGVzIG9mIGluY29tcGxldGUgY29kZXMgYXJlIG9uZSBvZiB0aGUgZml4ZWQKKyAqICAgY29kZXMgYW5kIGFueSBjb2RlIHdpdGggYSBzaW5nbGUgc3ltYm9sIHdoaWNoIGluIGRlZmxhdGUgaXMgY29kZWQgYXMgb25lCisgKiAgIGJpdCBpbnN0ZWFkIG9mIHplcm8gYml0cy4gIFNlZSB0aGUgZm9ybWF0IG5vdGVzIGZvciBmaXhlZCgpIGFuZCBkeW5hbWljKCkuCisgKgorICogLSBXaXRoaW4gYSBnaXZlbiBjb2RlIGxlbmd0aCwgdGhlIHN5bWJvbHMgYXJlIGtlcHQgaW4gYXNjZW5kaW5nIG9yZGVyIGZvcgorICogICB0aGUgY29kZSBiaXRzIGRlZmluaXRpb24uCisgKi8KK2xvY2FsIGludCBjb25zdHJ1Y3Qoc3RydWN0IGh1ZmZtYW4gKmgsIGNvbnN0IHNob3J0ICpsZW5ndGgsIGludCBuKQoreworICAgIGludCBzeW1ib2w7ICAgICAgICAgLyogY3VycmVudCBzeW1ib2wgd2hlbiBzdGVwcGluZyB0aHJvdWdoIGxlbmd0aFtdICovCisgICAgaW50IGxlbjsgICAgICAgICAgICAvKiBjdXJyZW50IGxlbmd0aCB3aGVuIHN0ZXBwaW5nIHRocm91Z2ggaC0+Y291bnRbXSAqLworICAgIGludCBsZWZ0OyAgICAgICAgICAgLyogbnVtYmVyIG9mIHBvc3NpYmxlIGNvZGVzIGxlZnQgb2YgY3VycmVudCBsZW5ndGggKi8KKyAgICBzaG9ydCBvZmZzW01BWEJJVFMrMV07ICAgICAgLyogb2Zmc2V0cyBpbiBzeW1ib2wgdGFibGUgZm9yIGVhY2ggbGVuZ3RoICovCisKKyAgICAvKiBjb3VudCBudW1iZXIgb2YgY29kZXMgb2YgZWFjaCBsZW5ndGggKi8KKyAgICBmb3IgKGxlbiA9IDA7IGxlbiA8PSBNQVhCSVRTOyBsZW4rKykKKyAgICAgICAgaC0+Y291bnRbbGVuXSA9IDA7CisgICAgZm9yIChzeW1ib2wgPSAwOyBzeW1ib2wgPCBuOyBzeW1ib2wrKykKKyAgICAgICAgKGgtPmNvdW50W2xlbmd0aFtzeW1ib2xdXSkrKzsgICAvKiBhc3N1bWVzIGxlbmd0aHMgYXJlIHdpdGhpbiBib3VuZHMgKi8KKyAgICBpZiAoaC0+Y291bnRbMF0gPT0gbikgICAgICAgICAgICAgICAvKiBubyBjb2RlcyEgKi8KKyAgICAgICAgcmV0dXJuIDA7ICAgICAgICAgICAgICAgICAgICAgICAvKiBjb21wbGV0ZSwgYnV0IGRlY29kZSgpIHdpbGwgZmFpbCAqLworCisgICAgLyogY2hlY2sgZm9yIGFuIG92ZXItc3Vic2NyaWJlZCBvciBpbmNvbXBsZXRlIHNldCBvZiBsZW5ndGhzICovCisgICAgbGVmdCA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb25lIHBvc3NpYmxlIGNvZGUgb2YgemVybyBsZW5ndGggKi8KKyAgICBmb3IgKGxlbiA9IDE7IGxlbiA8PSBNQVhCSVRTOyBsZW4rKykgeworICAgICAgICBsZWZ0IDw8PSAxOyAgICAgICAgICAgICAgICAgICAgIC8qIG9uZSBtb3JlIGJpdCwgZG91YmxlIGNvZGVzIGxlZnQgKi8KKyAgICAgICAgbGVmdCAtPSBoLT5jb3VudFtsZW5dOyAgICAgICAgICAvKiBkZWR1Y3QgY291bnQgZnJvbSBwb3NzaWJsZSBjb2RlcyAqLworICAgICAgICBpZiAobGVmdCA8IDApCisgICAgICAgICAgICByZXR1cm4gbGVmdDsgICAgICAgICAgICAgICAgLyogb3Zlci1zdWJzY3JpYmVkLS1yZXR1cm4gbmVnYXRpdmUgKi8KKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsZWZ0ID4gMCBtZWFucyBpbmNvbXBsZXRlICovCisKKyAgICAvKiBnZW5lcmF0ZSBvZmZzZXRzIGludG8gc3ltYm9sIHRhYmxlIGZvciBlYWNoIGxlbmd0aCBmb3Igc29ydGluZyAqLworICAgIG9mZnNbMV0gPSAwOworICAgIGZvciAobGVuID0gMTsgbGVuIDwgTUFYQklUUzsgbGVuKyspCisgICAgICAgIG9mZnNbbGVuICsgMV0gPSBvZmZzW2xlbl0gKyBoLT5jb3VudFtsZW5dOworCisgICAgLyoKKyAgICAgKiBwdXQgc3ltYm9scyBpbiB0YWJsZSBzb3J0ZWQgYnkgbGVuZ3RoLCBieSBzeW1ib2wgb3JkZXIgd2l0aGluIGVhY2gKKyAgICAgKiBsZW5ndGgKKyAgICAgKi8KKyAgICBmb3IgKHN5bWJvbCA9IDA7IHN5bWJvbCA8IG47IHN5bWJvbCsrKQorICAgICAgICBpZiAobGVuZ3RoW3N5bWJvbF0gIT0gMCkKKyAgICAgICAgICAgIGgtPnN5bWJvbFtvZmZzW2xlbmd0aFtzeW1ib2xdXSsrXSA9IHN5bWJvbDsKKworICAgIC8qIHJldHVybiB6ZXJvIGZvciBjb21wbGV0ZSBzZXQsIHBvc2l0aXZlIGZvciBpbmNvbXBsZXRlIHNldCAqLworICAgIHJldHVybiBsZWZ0OworfQorCisvKgorICogRGVjb2RlIGxpdGVyYWwvbGVuZ3RoIGFuZCBkaXN0YW5jZSBjb2RlcyB1bnRpbCBhbiBlbmQtb2YtYmxvY2sgY29kZS4KKyAqCisgKiBGb3JtYXQgbm90ZXM6CisgKgorICogLSBDb21wcmVzc2VkIGRhdGEgdGhhdCBpcyBhZnRlciB0aGUgYmxvY2sgdHlwZSBpZiBmaXhlZCBvciBhZnRlciB0aGUgY29kZQorICogICBkZXNjcmlwdGlvbiBpZiBkeW5hbWljIGlzIGEgY29tYmluYXRpb24gb2YgbGl0ZXJhbHMgYW5kIGxlbmd0aC9kaXN0YW5jZQorICogICBwYWlycyB0ZXJtaW5hdGVkIGJ5IGFuZCBlbmQtb2YtYmxvY2sgY29kZS4gIExpdGVyYWxzIGFyZSBzaW1wbHkgSHVmZm1hbgorICogICBjb2RlZCBieXRlcy4gIEEgbGVuZ3RoL2Rpc3RhbmNlIHBhaXIgaXMgYSBjb2RlZCBsZW5ndGggZm9sbG93ZWQgYnkgYQorICogICBjb2RlZCBkaXN0YW5jZSB0byByZXByZXNlbnQgYSBzdHJpbmcgdGhhdCBvY2N1cnMgZWFybGllciBpbiB0aGUKKyAqICAgdW5jb21wcmVzc2VkIGRhdGEgdGhhdCBvY2N1cnMgYWdhaW4gYXQgdGhlIGN1cnJlbnQgbG9jYXRpb24uCisgKgorICogLSBMaXRlcmFscywgbGVuZ3RocywgYW5kIHRoZSBlbmQtb2YtYmxvY2sgY29kZSBhcmUgY29tYmluZWQgaW50byBhIHNpbmdsZQorICogICBjb2RlIG9mIHVwIHRvIDI4NiBzeW1ib2xzLiAgVGhleSBhcmUgMjU2IGxpdGVyYWxzICgwLi4yNTUpLCAyOSBsZW5ndGgKKyAqICAgc3ltYm9scyAoMjU3Li4yODUpLCBhbmQgdGhlIGVuZC1vZi1ibG9jayBzeW1ib2wgKDI1NikuCisgKgorICogLSBUaGVyZSBhcmUgMjU2IHBvc3NpYmxlIGxlbmd0aHMgKDMuLjI1OCksIGFuZCBzbyAyOSBzeW1ib2xzIGFyZSBub3QgZW5vdWdoCisgKiAgIHRvIHJlcHJlc2VudCBhbGwgb2YgdGhvc2UuICBMZW5ndGhzIDMuLjEwIGFuZCAyNTggYXJlIGluIGZhY3QgcmVwcmVzZW50ZWQKKyAqICAgYnkganVzdCBhIGxlbmd0aCBzeW1ib2wuICBMZW5ndGhzIDExLi4yNTcgYXJlIHJlcHJlc2VudGVkIGFzIGEgc3ltYm9sIGFuZAorICogICBzb21lIG51bWJlciBvZiBleHRyYSBiaXRzIHRoYXQgYXJlIGFkZGVkIGFzIGFuIGludGVnZXIgdG8gdGhlIGJhc2UgbGVuZ3RoCisgKiAgIG9mIHRoZSBsZW5ndGggc3ltYm9sLiAgVGhlIG51bWJlciBvZiBleHRyYSBiaXRzIGlzIGRldGVybWluZWQgYnkgdGhlIGJhc2UKKyAqICAgbGVuZ3RoIHN5bWJvbC4gIFRoZXNlIGFyZSBpbiB0aGUgc3RhdGljIGFycmF5cyBiZWxvdywgbGVuc1tdIGZvciB0aGUgYmFzZQorICogICBsZW5ndGhzIGFuZCBsZXh0W10gZm9yIHRoZSBjb3JyZXNwb25kaW5nIG51bWJlciBvZiBleHRyYSBiaXRzLgorICoKKyAqIC0gVGhlIHJlYXNvbiB0aGF0IDI1OCBnZXRzIGl0cyBvd24gc3ltYm9sIGlzIHRoYXQgdGhlIGxvbmdlc3QgbGVuZ3RoIGlzIHVzZWQKKyAqICAgb2Z0ZW4gaW4gaGlnaGx5IHJlZHVuZGFudCBmaWxlcy4gIE5vdGUgdGhhdCAyNTggY2FuIGFsc28gYmUgY29kZWQgYXMgdGhlCisgKiAgIGJhc2UgdmFsdWUgMjI3IHBsdXMgdGhlIG1heGltdW0gZXh0cmEgdmFsdWUgb2YgMzEuICBXaGlsZSBhIGdvb2QgZGVmbGF0ZQorICogICBzaG91bGQgbmV2ZXIgZG8gdGhpcywgaXQgaXMgbm90IGFuIGVycm9yLCBhbmQgc2hvdWxkIGJlIGRlY29kZWQgcHJvcGVybHkuCisgKgorICogLSBJZiBhIGxlbmd0aCBpcyBkZWNvZGVkLCBpbmNsdWRpbmcgaXRzIGV4dHJhIGJpdHMgaWYgYW55LCB0aGVuIGl0IGlzCisgKiAgIGZvbGxvd2VkIGEgZGlzdGFuY2UgY29kZS4gIFRoZXJlIGFyZSB1cCB0byAzMCBkaXN0YW5jZSBzeW1ib2xzLiAgQWdhaW4KKyAqICAgdGhlcmUgYXJlIG1hbnkgbW9yZSBwb3NzaWJsZSBkaXN0YW5jZXMgKDEuLjMyNzY4KSwgc28gZXh0cmEgYml0cyBhcmUgYWRkZWQKKyAqICAgdG8gYSBiYXNlIHZhbHVlIHJlcHJlc2VudGVkIGJ5IHRoZSBzeW1ib2wuICBUaGUgZGlzdGFuY2VzIDEuLjQgZ2V0IHRoZWlyCisgKiAgIG93biBzeW1ib2wsIGJ1dCB0aGUgcmVzdCByZXF1aXJlIGV4dHJhIGJpdHMuICBUaGUgYmFzZSBkaXN0YW5jZXMgYW5kCisgKiAgIGNvcnJlc3BvbmRpbmcgbnVtYmVyIG9mIGV4dHJhIGJpdHMgYXJlIGJlbG93IGluIHRoZSBzdGF0aWMgYXJyYXlzIGRpc3RbXQorICogICBhbmQgZGV4dFtdLgorICoKKyAqIC0gTGl0ZXJhbCBieXRlcyBhcmUgc2ltcGx5IHdyaXR0ZW4gdG8gdGhlIG91dHB1dC4gIEEgbGVuZ3RoL2Rpc3RhbmNlIHBhaXIgaXMKKyAqICAgYW4gaW5zdHJ1Y3Rpb24gdG8gY29weSBwcmV2aW91c2x5IHVuY29tcHJlc3NlZCBieXRlcyB0byB0aGUgb3V0cHV0LiAgVGhlCisgKiAgIGNvcHkgaXMgZnJvbSBkaXN0YW5jZSBieXRlcyBiYWNrIGluIHRoZSBvdXRwdXQgc3RyZWFtLCBjb3B5aW5nIGZvciBsZW5ndGgKKyAqICAgYnl0ZXMuCisgKgorICogLSBEaXN0YW5jZXMgcG9pbnRpbmcgYmVmb3JlIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG91dHB1dCBkYXRhIGFyZSBub3QKKyAqICAgcGVybWl0dGVkLgorICoKKyAqIC0gT3ZlcmxhcHBlZCBjb3BpZXMsIHdoZXJlIHRoZSBsZW5ndGggaXMgZ3JlYXRlciB0aGFuIHRoZSBkaXN0YW5jZSwgYXJlCisgKiAgIGFsbG93ZWQgYW5kIGNvbW1vbi4gIEZvciBleGFtcGxlLCBhIGRpc3RhbmNlIG9mIG9uZSBhbmQgYSBsZW5ndGggb2YgMjU4CisgKiAgIHNpbXBseSBjb3BpZXMgdGhlIGxhc3QgYnl0ZSAyNTggdGltZXMuICBBIGRpc3RhbmNlIG9mIGZvdXIgYW5kIGEgbGVuZ3RoIG9mCisgKiAgIHR3ZWx2ZSBjb3BpZXMgdGhlIGxhc3QgZm91ciBieXRlcyB0aHJlZSB0aW1lcy4gIEEgc2ltcGxlIGZvcndhcmQgY29weQorICogICBpZ25vcmluZyB3aGV0aGVyIHRoZSBsZW5ndGggaXMgZ3JlYXRlciB0aGFuIHRoZSBkaXN0YW5jZSBvciBub3QgaW1wbGVtZW50cworICogICB0aGlzIGNvcnJlY3RseS4gIFlvdSBzaG91bGQgbm90IHVzZSBtZW1jcHkoKSBzaW5jZSBpdHMgYmVoYXZpb3IgaXMgbm90CisgKiAgIGRlZmluZWQgZm9yIG92ZXJsYXBwZWQgYXJyYXlzLiAgWW91IHNob3VsZCBub3QgdXNlIG1lbW1vdmUoKSBvciBiY29weSgpCisgKiAgIHNpbmNlIHRob3VnaCB0aGVpciBiZWhhdmlvciAtaXMtIGRlZmluZWQgZm9yIG92ZXJsYXBwaW5nIGFycmF5cywgaXQgaXMKKyAqICAgZGVmaW5lZCB0byBkbyB0aGUgd3JvbmcgdGhpbmcgaW4gdGhpcyBjYXNlLgorICovCitsb2NhbCBpbnQgY29kZXMoc3RydWN0IHN0YXRlICpzLAorICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBodWZmbWFuICpsZW5jb2RlLAorICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBodWZmbWFuICpkaXN0Y29kZSkKK3sKKyAgICBpbnQgc3ltYm9sOyAgICAgICAgIC8qIGRlY29kZWQgc3ltYm9sICovCisgICAgaW50IGxlbjsgICAgICAgICAgICAvKiBsZW5ndGggZm9yIGNvcHkgKi8KKyAgICB1bnNpZ25lZCBkaXN0OyAgICAgIC8qIGRpc3RhbmNlIGZvciBjb3B5ICovCisgICAgc3RhdGljIGNvbnN0IHNob3J0IGxlbnNbMjldID0geyAvKiBTaXplIGJhc2UgZm9yIGxlbmd0aCBjb2RlcyAyNTcuLjI4NSAqLworICAgICAgICAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEzLCAxNSwgMTcsIDE5LCAyMywgMjcsIDMxLAorICAgICAgICAzNSwgNDMsIDUxLCA1OSwgNjcsIDgzLCA5OSwgMTE1LCAxMzEsIDE2MywgMTk1LCAyMjcsIDI1OH07CisgICAgc3RhdGljIGNvbnN0IHNob3J0IGxleHRbMjldID0geyAvKiBFeHRyYSBiaXRzIGZvciBsZW5ndGggY29kZXMgMjU3Li4yODUgKi8KKyAgICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMSwgMSwgMSwgMiwgMiwgMiwgMiwKKyAgICAgICAgMywgMywgMywgMywgNCwgNCwgNCwgNCwgNSwgNSwgNSwgNSwgMH07CisgICAgc3RhdGljIGNvbnN0IHNob3J0IGRpc3RzWzMwXSA9IHsgLyogT2Zmc2V0IGJhc2UgZm9yIGRpc3RhbmNlIGNvZGVzIDAuLjI5ICovCisgICAgICAgIDEsIDIsIDMsIDQsIDUsIDcsIDksIDEzLCAxNywgMjUsIDMzLCA0OSwgNjUsIDk3LCAxMjksIDE5MywKKyAgICAgICAgMjU3LCAzODUsIDUxMywgNzY5LCAxMDI1LCAxNTM3LCAyMDQ5LCAzMDczLCA0MDk3LCA2MTQ1LAorICAgICAgICA4MTkzLCAxMjI4OSwgMTYzODUsIDI0NTc3fTsKKyAgICBzdGF0aWMgY29uc3Qgc2hvcnQgZGV4dFszMF0gPSB7IC8qIEV4dHJhIGJpdHMgZm9yIGRpc3RhbmNlIGNvZGVzIDAuLjI5ICovCisgICAgICAgIDAsIDAsIDAsIDAsIDEsIDEsIDIsIDIsIDMsIDMsIDQsIDQsIDUsIDUsIDYsIDYsCisgICAgICAgIDcsIDcsIDgsIDgsIDksIDksIDEwLCAxMCwgMTEsIDExLAorICAgICAgICAxMiwgMTIsIDEzLCAxM307CisKKyAgICAvKiBkZWNvZGUgbGl0ZXJhbHMgYW5kIGxlbmd0aC9kaXN0YW5jZSBwYWlycyAqLworICAgIGRvIHsKKyAgICAgICAgc3ltYm9sID0gZGVjb2RlKHMsIGxlbmNvZGUpOworICAgICAgICBpZiAoc3ltYm9sIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBzeW1ib2w7ICAgICAgICAgICAgICAvKiBpbnZhbGlkIHN5bWJvbCAqLworICAgICAgICBpZiAoc3ltYm9sIDwgMjU2KSB7ICAgICAgICAgICAgIC8qIGxpdGVyYWw6IHN5bWJvbCBpcyB0aGUgYnl0ZSAqLworICAgICAgICAgICAgLyogd3JpdGUgb3V0IHRoZSBsaXRlcmFsICovCisgICAgICAgICAgICBpZiAocy0+b3V0ICE9IE5JTCkgeworICAgICAgICAgICAgICAgIGlmIChzLT5vdXRjbnQgPT0gcy0+b3V0bGVuKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgICAgICBzLT5vdXRbcy0+b3V0Y250XSA9IHN5bWJvbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHMtPm91dGNudCsrOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHN5bWJvbCA+IDI1NikgeyAgICAgICAgLyogbGVuZ3RoICovCisgICAgICAgICAgICAvKiBnZXQgYW5kIGNvbXB1dGUgbGVuZ3RoICovCisgICAgICAgICAgICBzeW1ib2wgLT0gMjU3OworICAgICAgICAgICAgaWYgKHN5bWJvbCA+PSAyOSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTEwOyAgICAgICAgICAgICAvKiBpbnZhbGlkIGZpeGVkIGNvZGUgKi8KKyAgICAgICAgICAgIGxlbiA9IGxlbnNbc3ltYm9sXSArIGJpdHMocywgbGV4dFtzeW1ib2xdKTsKKworICAgICAgICAgICAgLyogZ2V0IGFuZCBjaGVjayBkaXN0YW5jZSAqLworICAgICAgICAgICAgc3ltYm9sID0gZGVjb2RlKHMsIGRpc3Rjb2RlKTsKKyAgICAgICAgICAgIGlmIChzeW1ib2wgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiBzeW1ib2w7ICAgICAgICAgIC8qIGludmFsaWQgc3ltYm9sICovCisgICAgICAgICAgICBkaXN0ID0gZGlzdHNbc3ltYm9sXSArIGJpdHMocywgZGV4dFtzeW1ib2xdKTsKKyNpZm5kZWYgSU5GTEFURV9BTExPV19JTlZBTElEX0RJU1RBTkNFX1RPT0ZBUl9BUlJSCisgICAgICAgICAgICBpZiAoZGlzdCA+IHMtPm91dGNudCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTExOyAgICAgLyogZGlzdGFuY2UgdG9vIGZhciBiYWNrICovCisjZW5kaWYKKworICAgICAgICAgICAgLyogY29weSBsZW5ndGggYnl0ZXMgZnJvbSBkaXN0YW5jZSBieXRlcyBiYWNrICovCisgICAgICAgICAgICBpZiAocy0+b3V0ICE9IE5JTCkgeworICAgICAgICAgICAgICAgIGlmIChzLT5vdXRjbnQgKyBsZW4gPiBzLT5vdXRsZW4pCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgICAgIHdoaWxlIChsZW4tLSkgeworICAgICAgICAgICAgICAgICAgICBzLT5vdXRbcy0+b3V0Y250XSA9CisjaWZkZWYgSU5GTEFURV9BTExPV19JTlZBTElEX0RJU1RBTkNFX1RPT0ZBUl9BUlJSCisgICAgICAgICAgICAgICAgICAgICAgICBkaXN0ID4gcy0+b3V0Y250ID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIDoKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPm91dFtzLT5vdXRjbnQgLSBkaXN0XTsKKyAgICAgICAgICAgICAgICAgICAgcy0+b3V0Y250Kys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHMtPm91dGNudCArPSBsZW47CisgICAgICAgIH0KKyAgICB9IHdoaWxlIChzeW1ib2wgIT0gMjU2KTsgICAgICAgICAgICAvKiBlbmQgb2YgYmxvY2sgc3ltYm9sICovCisKKyAgICAvKiBkb25lIHdpdGggYSB2YWxpZCBmaXhlZCBvciBkeW5hbWljIGJsb2NrICovCisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiBQcm9jZXNzIGEgZml4ZWQgY29kZXMgYmxvY2suCisgKgorICogRm9ybWF0IG5vdGVzOgorICoKKyAqIC0gVGhpcyBibG9jayB0eXBlIGNhbiBiZSB1c2VmdWwgZm9yIGNvbXByZXNzaW5nIHNtYWxsIGFtb3VudHMgb2YgZGF0YSBmb3IKKyAqICAgd2hpY2ggdGhlIHNpemUgb2YgdGhlIGNvZGUgZGVzY3JpcHRpb25zIGluIGEgZHluYW1pYyBibG9jayBleGNlZWRzIHRoZQorICogICBiZW5lZml0IG9mIGN1c3RvbSBjb2RlcyBmb3IgdGhhdCBibG9jay4gIEZvciBmaXhlZCBjb2Rlcywgbm8gYml0cyBhcmUKKyAqICAgc3BlbnQgb24gY29kZSBkZXNjcmlwdGlvbnMuICBJbnN0ZWFkIHRoZSBjb2RlIGxlbmd0aHMgZm9yIGxpdGVyYWwvbGVuZ3RoCisgKiAgIGNvZGVzIGFuZCBkaXN0YW5jZSBjb2RlcyBhcmUgZml4ZWQuICBUaGUgc3BlY2lmaWMgbGVuZ3RocyBmb3IgZWFjaCBzeW1ib2wKKyAqICAgY2FuIGJlIHNlZW4gaW4gdGhlICJmb3IiIGxvb3BzIGJlbG93LgorICoKKyAqIC0gVGhlIGxpdGVyYWwvbGVuZ3RoIGNvZGUgaXMgY29tcGxldGUsIGJ1dCBoYXMgdHdvIHN5bWJvbHMgdGhhdCBhcmUgaW52YWxpZAorICogICBhbmQgc2hvdWxkIHJlc3VsdCBpbiBhbiBlcnJvciBpZiByZWNlaXZlZC4gIFRoaXMgY2Fubm90IGJlIGltcGxlbWVudGVkCisgKiAgIHNpbXBseSBhcyBhbiBpbmNvbXBsZXRlIGNvZGUgc2luY2UgdGhvc2UgdHdvIHN5bWJvbHMgYXJlIGluIHRoZSAibWlkZGxlIgorICogICBvZiB0aGUgY29kZS4gIFRoZXkgYXJlIGVpZ2h0IGJpdHMgbG9uZyBhbmQgdGhlIGxvbmdlc3QgbGl0ZXJhbC9sZW5ndGhcCisgKiAgIGNvZGUgaXMgbmluZSBiaXRzLiAgVGhlcmVmb3JlIHRoZSBjb2RlIG11c3QgYmUgY29uc3RydWN0ZWQgd2l0aCB0aG9zZQorICogICBzeW1ib2xzLCBhbmQgdGhlIGludmFsaWQgc3ltYm9scyBtdXN0IGJlIGRldGVjdGVkIGFmdGVyIGRlY29kaW5nLgorICoKKyAqIC0gVGhlIGZpeGVkIGRpc3RhbmNlIGNvZGVzIGFsc28gaGF2ZSB0d28gaW52YWxpZCBzeW1ib2xzIHRoYXQgc2hvdWxkIHJlc3VsdAorICogICBpbiBhbiBlcnJvciBpZiByZWNlaXZlZC4gIFNpbmNlIGFsbCBvZiB0aGUgZGlzdGFuY2UgY29kZXMgYXJlIHRoZSBzYW1lCisgKiAgIGxlbmd0aCwgdGhpcyBjYW4gYmUgaW1wbGVtZW50ZWQgYXMgYW4gaW5jb21wbGV0ZSBjb2RlLiAgVGhlbiB0aGUgaW52YWxpZAorICogICBjb2RlcyBhcmUgZGV0ZWN0ZWQgd2hpbGUgZGVjb2RpbmcuCisgKi8KK2xvY2FsIGludCBmaXhlZChzdHJ1Y3Qgc3RhdGUgKnMpCit7CisgICAgc3RhdGljIGludCB2aXJnaW4gPSAxOworICAgIHN0YXRpYyBzaG9ydCBsZW5jbnRbTUFYQklUUysxXSwgbGVuc3ltW0ZJWExDT0RFU107CisgICAgc3RhdGljIHNob3J0IGRpc3RjbnRbTUFYQklUUysxXSwgZGlzdHN5bVtNQVhEQ09ERVNdOworICAgIHN0YXRpYyBzdHJ1Y3QgaHVmZm1hbiBsZW5jb2RlLCBkaXN0Y29kZTsKKworICAgIC8qIGJ1aWxkIGZpeGVkIGh1ZmZtYW4gdGFibGVzIGlmIGZpcnN0IGNhbGwgKG1heSBub3QgYmUgdGhyZWFkIHNhZmUpICovCisgICAgaWYgKHZpcmdpbikgeworICAgICAgICBpbnQgc3ltYm9sOworICAgICAgICBzaG9ydCBsZW5ndGhzW0ZJWExDT0RFU107CisKKyAgICAgICAgLyogY29uc3RydWN0IGxlbmNvZGUgYW5kIGRpc3Rjb2RlICovCisgICAgICAgIGxlbmNvZGUuY291bnQgPSBsZW5jbnQ7CisgICAgICAgIGxlbmNvZGUuc3ltYm9sID0gbGVuc3ltOworICAgICAgICBkaXN0Y29kZS5jb3VudCA9IGRpc3RjbnQ7CisgICAgICAgIGRpc3Rjb2RlLnN5bWJvbCA9IGRpc3RzeW07CisKKyAgICAgICAgLyogbGl0ZXJhbC9sZW5ndGggdGFibGUgKi8KKyAgICAgICAgZm9yIChzeW1ib2wgPSAwOyBzeW1ib2wgPCAxNDQ7IHN5bWJvbCsrKQorICAgICAgICAgICAgbGVuZ3Roc1tzeW1ib2xdID0gODsKKyAgICAgICAgZm9yICg7IHN5bWJvbCA8IDI1Njsgc3ltYm9sKyspCisgICAgICAgICAgICBsZW5ndGhzW3N5bWJvbF0gPSA5OworICAgICAgICBmb3IgKDsgc3ltYm9sIDwgMjgwOyBzeW1ib2wrKykKKyAgICAgICAgICAgIGxlbmd0aHNbc3ltYm9sXSA9IDc7CisgICAgICAgIGZvciAoOyBzeW1ib2wgPCBGSVhMQ09ERVM7IHN5bWJvbCsrKQorICAgICAgICAgICAgbGVuZ3Roc1tzeW1ib2xdID0gODsKKyAgICAgICAgY29uc3RydWN0KCZsZW5jb2RlLCBsZW5ndGhzLCBGSVhMQ09ERVMpOworCisgICAgICAgIC8qIGRpc3RhbmNlIHRhYmxlICovCisgICAgICAgIGZvciAoc3ltYm9sID0gMDsgc3ltYm9sIDwgTUFYRENPREVTOyBzeW1ib2wrKykKKyAgICAgICAgICAgIGxlbmd0aHNbc3ltYm9sXSA9IDU7CisgICAgICAgIGNvbnN0cnVjdCgmZGlzdGNvZGUsIGxlbmd0aHMsIE1BWERDT0RFUyk7CisKKyAgICAgICAgLyogZG8gdGhpcyBqdXN0IG9uY2UgKi8KKyAgICAgICAgdmlyZ2luID0gMDsKKyAgICB9CisKKyAgICAvKiBkZWNvZGUgZGF0YSB1bnRpbCBlbmQtb2YtYmxvY2sgY29kZSAqLworICAgIHJldHVybiBjb2RlcyhzLCAmbGVuY29kZSwgJmRpc3Rjb2RlKTsKK30KKworLyoKKyAqIFByb2Nlc3MgYSBkeW5hbWljIGNvZGVzIGJsb2NrLgorICoKKyAqIEZvcm1hdCBub3RlczoKKyAqCisgKiAtIEEgZHluYW1pYyBibG9jayBzdGFydHMgd2l0aCBhIGRlc2NyaXB0aW9uIG9mIHRoZSBsaXRlcmFsL2xlbmd0aCBhbmQKKyAqICAgZGlzdGFuY2UgY29kZXMgZm9yIHRoYXQgYmxvY2suICBOZXcgZHluYW1pYyBibG9ja3MgYWxsb3cgdGhlIGNvbXByZXNzb3IgdG8KKyAqICAgcmFwaWRseSBhZGFwdCB0byBjaGFuZ2luZyBkYXRhIHdpdGggbmV3IGNvZGVzIG9wdGltaXplZCBmb3IgdGhhdCBkYXRhLgorICoKKyAqIC0gVGhlIGNvZGVzIHVzZWQgYnkgdGhlIGRlZmxhdGUgZm9ybWF0IGFyZSAiY2Fub25pY2FsIiwgd2hpY2ggbWVhbnMgdGhhdAorICogICB0aGUgYWN0dWFsIGJpdHMgb2YgdGhlIGNvZGVzIGFyZSBnZW5lcmF0ZWQgaW4gYW4gdW5hbWJpZ3VvdXMgd2F5IHNpbXBseQorICogICBmcm9tIHRoZSBudW1iZXIgb2YgYml0cyBpbiBlYWNoIGNvZGUuICBUaGVyZWZvcmUgdGhlIGNvZGUgZGVzY3JpcHRpb25zCisgKiAgIGFyZSBzaW1wbHkgYSBsaXN0IG9mIGNvZGUgbGVuZ3RocyBmb3IgZWFjaCBzeW1ib2wuCisgKgorICogLSBUaGUgY29kZSBsZW5ndGhzIGFyZSBzdG9yZWQgaW4gb3JkZXIgZm9yIHRoZSBzeW1ib2xzLCBzbyBsZW5ndGhzIGFyZQorICogICBwcm92aWRlZCBmb3IgZWFjaCBvZiB0aGUgbGl0ZXJhbC9sZW5ndGggc3ltYm9scywgYW5kIGZvciBlYWNoIG9mIHRoZQorICogICBkaXN0YW5jZSBzeW1ib2xzLgorICoKKyAqIC0gSWYgYSBzeW1ib2wgaXMgbm90IHVzZWQgaW4gdGhlIGJsb2NrLCB0aGlzIGlzIHJlcHJlc2VudGVkIGJ5IGEgemVybyBhcworICogICBhcyB0aGUgY29kZSBsZW5ndGguICBUaGlzIGRvZXMgbm90IG1lYW4gYSB6ZXJvLWxlbmd0aCBjb2RlLCBidXQgcmF0aGVyCisgKiAgIHRoYXQgbm8gY29kZSBzaG91bGQgYmUgY3JlYXRlZCBmb3IgdGhpcyBzeW1ib2wuICBUaGVyZSBpcyBubyB3YXkgaW4gdGhlCisgKiAgIGRlZmxhdGUgZm9ybWF0IHRvIHJlcHJlc2VudCBhIHplcm8tbGVuZ3RoIGNvZGUuCisgKgorICogLSBUaGUgbWF4aW11bSBudW1iZXIgb2YgYml0cyBpbiBhIGNvZGUgaXMgMTUsIHNvIHRoZSBwb3NzaWJsZSBsZW5ndGhzIGZvcgorICogICBhbnkgY29kZSBhcmUgMS4uMTUuCisgKgorICogLSBUaGUgZmFjdCB0aGF0IGEgbGVuZ3RoIG9mIHplcm8gaXMgbm90IHBlcm1pdHRlZCBmb3IgYSBjb2RlIGhhcyBhbgorICogICBpbnRlcmVzdGluZyBjb25zZXF1ZW5jZS4gIE5vcm1hbGx5IGlmIG9ubHkgb25lIHN5bWJvbCBpcyB1c2VkIGZvciBhIGdpdmVuCisgKiAgIGNvZGUsIHRoZW4gaW4gZmFjdCB0aGF0IGNvZGUgY291bGQgYmUgcmVwcmVzZW50ZWQgd2l0aCB6ZXJvIGJpdHMuICBIb3dldmVyCisgKiAgIGluIGRlZmxhdGUsIHRoYXQgY29kZSBoYXMgdG8gYmUgYXQgbGVhc3Qgb25lIGJpdC4gIFNvIGZvciBleGFtcGxlLCBpZgorICogICBvbmx5IGEgc2luZ2xlIGRpc3RhbmNlIGJhc2Ugc3ltYm9sIGFwcGVhcnMgaW4gYSBibG9jaywgdGhlbiBpdCB3aWxsIGJlCisgKiAgIHJlcHJlc2VudGVkIGJ5IGEgc2luZ2xlIGNvZGUgb2YgbGVuZ3RoIG9uZSwgaW4gcGFydGljdWxhciBvbmUgMCBiaXQuICBUaGlzCisgKiAgIGlzIGFuIGluY29tcGxldGUgY29kZSwgc2luY2UgaWYgYSAxIGJpdCBpcyByZWNlaXZlZCwgaXQgaGFzIG5vIG1lYW5pbmcsCisgKiAgIGFuZCBzaG91bGQgcmVzdWx0IGluIGFuIGVycm9yLiAgU28gaW5jb21wbGV0ZSBkaXN0YW5jZSBjb2RlcyBvZiBvbmUgc3ltYm9sCisgKiAgIHNob3VsZCBiZSBwZXJtaXR0ZWQsIGFuZCB0aGUgcmVjZWlwdCBvZiBpbnZhbGlkIGNvZGVzIHNob3VsZCBiZSBoYW5kbGVkLgorICoKKyAqIC0gSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBoYXZlIGEgc2luZ2xlIGxpdGVyYWwvbGVuZ3RoIGNvZGUsIGJ1dCB0aGF0IGNvZGUKKyAqICAgbXVzdCBiZSB0aGUgZW5kLW9mLWJsb2NrIGNvZGUsIHNpbmNlIGV2ZXJ5IGR5bmFtaWMgYmxvY2sgaGFzIG9uZS4gIFRoaXMKKyAqICAgaXMgbm90IHRoZSBtb3N0IGVmZmljaWVudCB3YXkgdG8gY3JlYXRlIGFuIGVtcHR5IGJsb2NrIChhbiBlbXB0eSBmaXhlZAorICogICBibG9jayBpcyBmZXdlciBiaXRzKSwgYnV0IGl0IGlzIGFsbG93ZWQgYnkgdGhlIGZvcm1hdC4gIFNvIGluY29tcGxldGUKKyAqICAgbGl0ZXJhbC9sZW5ndGggY29kZXMgb2Ygb25lIHN5bWJvbCBzaG91bGQgYWxzbyBiZSBwZXJtaXR0ZWQuCisgKgorICogLSBJZiB0aGVyZSBhcmUgb25seSBsaXRlcmFsIGNvZGVzIGFuZCBubyBsZW5ndGhzLCB0aGVuIHRoZXJlIGFyZSBubyBkaXN0YW5jZQorICogICBjb2Rlcy4gIFRoaXMgaXMgcmVwcmVzZW50ZWQgYnkgb25lIGRpc3RhbmNlIGNvZGUgd2l0aCB6ZXJvIGJpdHMuCisgKgorICogLSBUaGUgbGlzdCBvZiB1cCB0byAyODYgbGVuZ3RoL2xpdGVyYWwgbGVuZ3RocyBhbmQgdXAgdG8gMzAgZGlzdGFuY2UgbGVuZ3RocworICogICBhcmUgdGhlbXNlbHZlcyBjb21wcmVzc2VkIHVzaW5nIEh1ZmZtYW4gY29kZXMgYW5kIHJ1bi1sZW5ndGggZW5jb2RpbmcuICBJbgorICogICB0aGUgbGlzdCBvZiBjb2RlIGxlbmd0aHMsIGEgMCBzeW1ib2wgbWVhbnMgbm8gY29kZSwgYSAxLi4xNSBzeW1ib2wgbWVhbnMKKyAqICAgdGhhdCBsZW5ndGgsIGFuZCB0aGUgc3ltYm9scyAxNiwgMTcsIGFuZCAxOCBhcmUgcnVuLWxlbmd0aCBpbnN0cnVjdGlvbnMuCisgKiAgIEVhY2ggb2YgMTYsIDE3LCBhbmQgMTggYXJlIGZvbGx3ZWQgYnkgZXh0cmEgYml0cyB0byBkZWZpbmUgdGhlIGxlbmd0aCBvZgorICogICB0aGUgcnVuLiAgMTYgY29waWVzIHRoZSBsYXN0IGxlbmd0aCAzIHRvIDYgdGltZXMuICAxNyByZXByZXNlbnRzIDMgdG8gMTAKKyAqICAgemVybyBsZW5ndGhzLCBhbmQgMTggcmVwcmVzZW50cyAxMSB0byAxMzggemVybyBsZW5ndGhzLiAgVW51c2VkIHN5bWJvbHMKKyAqICAgYXJlIGNvbW1vbiwgaGVuY2UgdGhlIHNwZWNpYWwgY29kaW5nIGZvciB6ZXJvIGxlbmd0aHMuCisgKgorICogLSBUaGUgc3ltYm9scyBmb3IgMC4uMTggYXJlIEh1ZmZtYW4gY29kZWQsIGFuZCBzbyB0aGF0IGNvZGUgbXVzdCBiZQorICogICBkZXNjcmliZWQgZmlyc3QuICBUaGlzIGlzIHNpbXBseSBhIHNlcXVlbmNlIG9mIHVwIHRvIDE5IHRocmVlLWJpdCB2YWx1ZXMKKyAqICAgcmVwcmVzZW50aW5nIG5vIGNvZGUgKDApIG9yIHRoZSBjb2RlIGxlbmd0aCBmb3IgdGhhdCBzeW1ib2wgKDEuLjcpLgorICoKKyAqIC0gQSBkeW5hbWljIGJsb2NrIHN0YXJ0cyB3aXRoIHRocmVlIGZpeGVkLXNpemUgY291bnRzIGZyb20gd2hpY2ggaXMgY29tcHV0ZWQKKyAqICAgdGhlIG51bWJlciBvZiBsaXRlcmFsL2xlbmd0aCBjb2RlIGxlbmd0aHMsIHRoZSBudW1iZXIgb2YgZGlzdGFuY2UgY29kZQorICogICBsZW5ndGhzLCBhbmQgdGhlIG51bWJlciBvZiBjb2RlIGxlbmd0aCBjb2RlIGxlbmd0aHMgKG9rLCB5b3UgY29tZSB1cCB3aXRoCisgKiAgIGEgYmV0dGVyIG5hbWUhKSBpbiB0aGUgY29kZSBkZXNjcmlwdGlvbnMuICBGb3IgdGhlIGxpdGVyYWwvbGVuZ3RoIGFuZAorICogICBkaXN0YW5jZSBjb2RlcywgbGVuZ3RocyBhZnRlciB0aG9zZSBwcm92aWRlZCBhcmUgY29uc2lkZXJlZCB6ZXJvLCBpLmUuIG5vCisgKiAgIGNvZGUuICBUaGUgY29kZSBsZW5ndGggY29kZSBsZW5ndGhzIGFyZSByZWNlaXZlZCBpbiBhIHBlcm11dGVkIG9yZGVyIChzZWUKKyAqICAgdGhlIG9yZGVyW10gYXJyYXkgYmVsb3cpIHRvIG1ha2UgYSBzaG9ydCBjb2RlIGxlbmd0aCBjb2RlIGxlbmd0aCBsaXN0IG1vcmUKKyAqICAgbGlrZWx5LiAgQXMgaXQgdHVybnMgb3V0LCB2ZXJ5IHNob3J0IGFuZCB2ZXJ5IGxvbmcgY29kZXMgYXJlIGxlc3MgbGlrZWx5CisgKiAgIHRvIGJlIHNlZW4gaW4gYSBkeW5hbWljIGNvZGUgZGVzY3JpcHRpb24sIGhlbmNlIHdoYXQgbWF5IGFwcGVhciBpbml0aWFsbHkKKyAqICAgdG8gYmUgYSBwZWN1bGlhciBvcmRlcmluZy4KKyAqCisgKiAtIEdpdmVuIHRoZSBudW1iZXIgb2YgbGl0ZXJhbC9sZW5ndGggY29kZSBsZW5ndGhzIChubGVuKSBhbmQgZGlzdGFuY2UgY29kZQorICogICBsZW5ndGhzIChuZGlzdCksIHRoZW4gdGhleSBhcmUgdHJlYXRlZCBhcyBvbmUgbG9uZyBsaXN0IG9mIG5sZW4gKyBuZGlzdAorICogICBjb2RlIGxlbmd0aHMuICBUaGVyZWZvcmUgcnVuLWxlbmd0aCBjb2RpbmcgY2FuIGFuZCBvZnRlbiBkb2VzIGNyb3NzIHRoZQorICogICBib3VuZGFyeSBiZXR3ZWVuIHRoZSB0d28gc2V0cyBvZiBsZW5ndGhzLgorICoKKyAqIC0gU28gdG8gc3VtbWFyaXplLCB0aGUgY29kZSBkZXNjcmlwdGlvbiBhdCB0aGUgc3RhcnQgb2YgYSBkeW5hbWljIGJsb2NrIGlzCisgKiAgIHRocmVlIGNvdW50cyBmb3IgdGhlIG51bWJlciBvZiBjb2RlIGxlbmd0aHMgZm9yIHRoZSBsaXRlcmFsL2xlbmd0aCBjb2RlcywKKyAqICAgdGhlIGRpc3RhbmNlIGNvZGVzLCBhbmQgdGhlIGNvZGUgbGVuZ3RoIGNvZGVzLiAgVGhpcyBpcyBmb2xsb3dlZCBieSB0aGUKKyAqICAgY29kZSBsZW5ndGggY29kZSBsZW5ndGhzLCB0aHJlZSBiaXRzIGVhY2guICBUaGlzIGlzIHVzZWQgdG8gY29uc3RydWN0IHRoZQorICogICBjb2RlIGxlbmd0aCBjb2RlIHdoaWNoIGlzIHVzZWQgdG8gcmVhZCB0aGUgcmVtYWluZGVyIG9mIHRoZSBsZW5ndGhzLiAgVGhlbgorICogICB0aGUgbGl0ZXJhbC9sZW5ndGggY29kZSBsZW5ndGhzIGFuZCBkaXN0YW5jZSBsZW5ndGhzIGFyZSByZWFkIGFzIGEgc2luZ2xlCisgKiAgIHNldCBvZiBsZW5ndGhzIHVzaW5nIHRoZSBjb2RlIGxlbmd0aCBjb2Rlcy4gIENvZGVzIGFyZSBjb25zdHJ1Y3RlZCBmcm9tCisgKiAgIHRoZSByZXN1bHRpbmcgdHdvIHNldHMgb2YgbGVuZ3RocywgYW5kIHRoZW4gZmluYWxseSB5b3UgY2FuIHN0YXJ0CisgKiAgIGRlY29kaW5nIGFjdHVhbCBjb21wcmVzc2VkIGRhdGEgaW4gdGhlIGJsb2NrLgorICoKKyAqIC0gRm9yIHJlZmVyZW5jZSwgYSAidHlwaWNhbCIgc2l6ZSBmb3IgdGhlIGNvZGUgZGVzY3JpcHRpb24gaW4gYSBkeW5hbWljCisgKiAgIGJsb2NrIGlzIGFyb3VuZCA4MCBieXRlcy4KKyAqLworbG9jYWwgaW50IGR5bmFtaWMoc3RydWN0IHN0YXRlICpzKQoreworICAgIGludCBubGVuLCBuZGlzdCwgbmNvZGU7ICAgICAgICAgICAgIC8qIG51bWJlciBvZiBsZW5ndGhzIGluIGRlc2NyaXB0b3IgKi8KKyAgICBpbnQgaW5kZXg7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbmRleCBvZiBsZW5ndGhzW10gKi8KKyAgICBpbnQgZXJyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb25zdHJ1Y3QoKSByZXR1cm4gdmFsdWUgKi8KKyAgICBzaG9ydCBsZW5ndGhzW01BWENPREVTXTsgICAgICAgICAgICAvKiBkZXNjcmlwdG9yIGNvZGUgbGVuZ3RocyAqLworICAgIHNob3J0IGxlbmNudFtNQVhCSVRTKzFdLCBsZW5zeW1bTUFYTENPREVTXTsgICAgICAgICAvKiBsZW5jb2RlIG1lbW9yeSAqLworICAgIHNob3J0IGRpc3RjbnRbTUFYQklUUysxXSwgZGlzdHN5bVtNQVhEQ09ERVNdOyAgICAgICAvKiBkaXN0Y29kZSBtZW1vcnkgKi8KKyAgICBzdHJ1Y3QgaHVmZm1hbiBsZW5jb2RlLCBkaXN0Y29kZTsgICAvKiBsZW5ndGggYW5kIGRpc3RhbmNlIGNvZGVzICovCisgICAgc3RhdGljIGNvbnN0IHNob3J0IG9yZGVyWzE5XSA9ICAgICAgLyogcGVybXV0YXRpb24gb2YgY29kZSBsZW5ndGggY29kZXMgKi8KKyAgICAgICAgezE2LCAxNywgMTgsIDAsIDgsIDcsIDksIDYsIDEwLCA1LCAxMSwgNCwgMTIsIDMsIDEzLCAyLCAxNCwgMSwgMTV9OworCisgICAgLyogY29uc3RydWN0IGxlbmNvZGUgYW5kIGRpc3Rjb2RlICovCisgICAgbGVuY29kZS5jb3VudCA9IGxlbmNudDsKKyAgICBsZW5jb2RlLnN5bWJvbCA9IGxlbnN5bTsKKyAgICBkaXN0Y29kZS5jb3VudCA9IGRpc3RjbnQ7CisgICAgZGlzdGNvZGUuc3ltYm9sID0gZGlzdHN5bTsKKworICAgIC8qIGdldCBudW1iZXIgb2YgbGVuZ3RocyBpbiBlYWNoIHRhYmxlLCBjaGVjayBsZW5ndGhzICovCisgICAgbmxlbiA9IGJpdHMocywgNSkgKyAyNTc7CisgICAgbmRpc3QgPSBiaXRzKHMsIDUpICsgMTsKKyAgICBuY29kZSA9IGJpdHMocywgNCkgKyA0OworICAgIGlmIChubGVuID4gTUFYTENPREVTIHx8IG5kaXN0ID4gTUFYRENPREVTKQorICAgICAgICByZXR1cm4gLTM7ICAgICAgICAgICAgICAgICAgICAgIC8qIGJhZCBjb3VudHMgKi8KKworICAgIC8qIHJlYWQgY29kZSBsZW5ndGggY29kZSBsZW5ndGhzIChyZWFsbHkpLCBtaXNzaW5nIGxlbmd0aHMgYXJlIHplcm8gKi8KKyAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBuY29kZTsgaW5kZXgrKykKKyAgICAgICAgbGVuZ3Roc1tvcmRlcltpbmRleF1dID0gYml0cyhzLCAzKTsKKyAgICBmb3IgKDsgaW5kZXggPCAxOTsgaW5kZXgrKykKKyAgICAgICAgbGVuZ3Roc1tvcmRlcltpbmRleF1dID0gMDsKKworICAgIC8qIGJ1aWxkIGh1ZmZtYW4gdGFibGUgZm9yIGNvZGUgbGVuZ3RocyBjb2RlcyAodXNlIGxlbmNvZGUgdGVtcG9yYXJpbHkpICovCisgICAgZXJyID0gY29uc3RydWN0KCZsZW5jb2RlLCBsZW5ndGhzLCAxOSk7CisgICAgaWYgKGVyciAhPSAwKSAgICAgICAgICAgICAgIC8qIHJlcXVpcmUgY29tcGxldGUgY29kZSBzZXQgaGVyZSAqLworICAgICAgICByZXR1cm4gLTQ7CisKKyAgICAvKiByZWFkIGxlbmd0aC9saXRlcmFsIGFuZCBkaXN0YW5jZSBjb2RlIGxlbmd0aCB0YWJsZXMgKi8KKyAgICBpbmRleCA9IDA7CisgICAgd2hpbGUgKGluZGV4IDwgbmxlbiArIG5kaXN0KSB7CisgICAgICAgIGludCBzeW1ib2w7ICAgICAgICAgICAgIC8qIGRlY29kZWQgdmFsdWUgKi8KKyAgICAgICAgaW50IGxlbjsgICAgICAgICAgICAgICAgLyogbGFzdCBsZW5ndGggdG8gcmVwZWF0ICovCisKKyAgICAgICAgc3ltYm9sID0gZGVjb2RlKHMsICZsZW5jb2RlKTsKKyAgICAgICAgaWYgKHN5bWJvbCA8IDE2KSAgICAgICAgICAgICAgICAvKiBsZW5ndGggaW4gMC4uMTUgKi8KKyAgICAgICAgICAgIGxlbmd0aHNbaW5kZXgrK10gPSBzeW1ib2w7CisgICAgICAgIGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVwZWF0IGluc3RydWN0aW9uICovCisgICAgICAgICAgICBsZW4gPSAwOyAgICAgICAgICAgICAgICAgICAgLyogYXNzdW1lIHJlcGVhdGluZyB6ZXJvcyAqLworICAgICAgICAgICAgaWYgKHN5bWJvbCA9PSAxNikgeyAgICAgICAgIC8qIHJlcGVhdCBsYXN0IGxlbmd0aCAzLi42IHRpbWVzICovCisgICAgICAgICAgICAgICAgaWYgKGluZGV4ID09IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtNTsgICAgICAgICAgLyogbm8gbGFzdCBsZW5ndGghICovCisgICAgICAgICAgICAgICAgbGVuID0gbGVuZ3Roc1tpbmRleCAtIDFdOyAgICAgICAvKiBsYXN0IGxlbmd0aCAqLworICAgICAgICAgICAgICAgIHN5bWJvbCA9IDMgKyBiaXRzKHMsIDIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoc3ltYm9sID09IDE3KSAgICAgIC8qIHJlcGVhdCB6ZXJvIDMuLjEwIHRpbWVzICovCisgICAgICAgICAgICAgICAgc3ltYm9sID0gMyArIGJpdHMocywgMyk7CisgICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgLyogPT0gMTgsIHJlcGVhdCB6ZXJvIDExLi4xMzggdGltZXMgKi8KKyAgICAgICAgICAgICAgICBzeW1ib2wgPSAxMSArIGJpdHMocywgNyk7CisgICAgICAgICAgICBpZiAoaW5kZXggKyBzeW1ib2wgPiBubGVuICsgbmRpc3QpCisgICAgICAgICAgICAgICAgcmV0dXJuIC02OyAgICAgICAgICAgICAgLyogdG9vIG1hbnkgbGVuZ3RocyEgKi8KKyAgICAgICAgICAgIHdoaWxlIChzeW1ib2wtLSkgICAgICAgICAgICAvKiByZXBlYXQgbGFzdCBvciB6ZXJvIHN5bWJvbCB0aW1lcyAqLworICAgICAgICAgICAgICAgIGxlbmd0aHNbaW5kZXgrK10gPSBsZW47CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBjaGVjayBmb3IgZW5kLW9mLWJsb2NrIGNvZGUgLS0gdGhlcmUgYmV0dGVyIGJlIG9uZSEgKi8KKyAgICBpZiAobGVuZ3Roc1syNTZdID09IDApCisgICAgICAgIHJldHVybiAtOTsKKworICAgIC8qIGJ1aWxkIGh1ZmZtYW4gdGFibGUgZm9yIGxpdGVyYWwvbGVuZ3RoIGNvZGVzICovCisgICAgZXJyID0gY29uc3RydWN0KCZsZW5jb2RlLCBsZW5ndGhzLCBubGVuKTsKKyAgICBpZiAoZXJyICYmIChlcnIgPCAwIHx8IG5sZW4gIT0gbGVuY29kZS5jb3VudFswXSArIGxlbmNvZGUuY291bnRbMV0pKQorICAgICAgICByZXR1cm4gLTc7ICAgICAgLyogaW5jb21wbGV0ZSBjb2RlIG9rIG9ubHkgZm9yIHNpbmdsZSBsZW5ndGggMSBjb2RlICovCisKKyAgICAvKiBidWlsZCBodWZmbWFuIHRhYmxlIGZvciBkaXN0YW5jZSBjb2RlcyAqLworICAgIGVyciA9IGNvbnN0cnVjdCgmZGlzdGNvZGUsIGxlbmd0aHMgKyBubGVuLCBuZGlzdCk7CisgICAgaWYgKGVyciAmJiAoZXJyIDwgMCB8fCBuZGlzdCAhPSBkaXN0Y29kZS5jb3VudFswXSArIGRpc3Rjb2RlLmNvdW50WzFdKSkKKyAgICAgICAgcmV0dXJuIC04OyAgICAgIC8qIGluY29tcGxldGUgY29kZSBvayBvbmx5IGZvciBzaW5nbGUgbGVuZ3RoIDEgY29kZSAqLworCisgICAgLyogZGVjb2RlIGRhdGEgdW50aWwgZW5kLW9mLWJsb2NrIGNvZGUgKi8KKyAgICByZXR1cm4gY29kZXMocywgJmxlbmNvZGUsICZkaXN0Y29kZSk7Cit9CisKKy8qCisgKiBJbmZsYXRlIHNvdXJjZSB0byBkZXN0LiAgT24gcmV0dXJuLCBkZXN0bGVuIGFuZCBzb3VyY2VsZW4gYXJlIHVwZGF0ZWQgdG8gdGhlCisgKiBzaXplIG9mIHRoZSB1bmNvbXByZXNzZWQgZGF0YSBhbmQgdGhlIHNpemUgb2YgdGhlIGRlZmxhdGUgZGF0YSByZXNwZWN0aXZlbHkuCisgKiBPbiBzdWNjZXNzLCB0aGUgcmV0dXJuIHZhbHVlIG9mIHB1ZmYoKSBpcyB6ZXJvLiAgSWYgdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlCisgKiBzb3VyY2UgZGF0YSwgaS5lLiBpdCBpcyBub3QgaW4gdGhlIGRlZmxhdGUgZm9ybWF0LCB0aGVuIGEgbmVnYXRpdmUgdmFsdWUgaXMKKyAqIHJldHVybmVkLiAgSWYgdGhlcmUgaXMgbm90IGVub3VnaCBpbnB1dCBhdmFpbGFibGUgb3IgdGhlcmUgaXMgbm90IGVub3VnaAorICogb3V0cHV0IHNwYWNlLCB0aGVuIGEgcG9zaXRpdmUgZXJyb3IgaXMgcmV0dXJuZWQuICBJbiB0aGF0IGNhc2UsIGRlc3RsZW4gYW5kCisgKiBzb3VyY2VsZW4gYXJlIG5vdCB1cGRhdGVkIHRvIGZhY2lsaXRhdGUgcmV0cnlpbmcgZnJvbSB0aGUgYmVnaW5uaW5nIHdpdGggdGhlCisgKiBwcm92aXNpb24gb2YgbW9yZSBpbnB1dCBkYXRhIG9yIG1vcmUgb3V0cHV0IHNwYWNlLiAgSW4gdGhlIGNhc2Ugb2YgaW52YWxpZAorICogaW5mbGF0ZSBkYXRhIChhIG5lZ2F0aXZlIGVycm9yKSwgdGhlIGRlc3QgYW5kIHNvdXJjZSBwb2ludGVycyBhcmUgdXBkYXRlZCB0bworICogZmFjaWxpdGF0ZSB0aGUgZGVidWdnaW5nIG9mIGRlZmxhdG9ycy4KKyAqCisgKiBwdWZmKCkgYWxzbyBoYXMgYSBtb2RlIHRvIGRldGVybWluZSB0aGUgc2l6ZSBvZiB0aGUgdW5jb21wcmVzc2VkIG91dHB1dCB3aXRoCisgKiBubyBvdXRwdXQgd3JpdHRlbi4gIEZvciB0aGlzIGRlc3QgbXVzdCBiZSAodW5zaWduZWQgY2hhciAqKTAuICBJbiB0aGlzIGNhc2UsCisgKiB0aGUgaW5wdXQgdmFsdWUgb2YgKmRlc3RsZW4gaXMgaWdub3JlZCwgYW5kIG9uIHJldHVybiAqZGVzdGxlbiBpcyBzZXQgdG8gdGhlCisgKiBzaXplIG9mIHRoZSB1bmNvbXByZXNzZWQgb3V0cHV0LgorICoKKyAqIFRoZSByZXR1cm4gY29kZXMgYXJlOgorICoKKyAqICAgMjogIGF2YWlsYWJsZSBpbmZsYXRlIGRhdGEgZGlkIG5vdCB0ZXJtaW5hdGUKKyAqICAgMTogIG91dHB1dCBzcGFjZSBleGhhdXN0ZWQgYmVmb3JlIGNvbXBsZXRpbmcgaW5mbGF0ZQorICogICAwOiAgc3VjY2Vzc2Z1bCBpbmZsYXRlCisgKiAgLTE6ICBpbnZhbGlkIGJsb2NrIHR5cGUgKHR5cGUgPT0gMykKKyAqICAtMjogIHN0b3JlZCBibG9jayBsZW5ndGggZGlkIG5vdCBtYXRjaCBvbmUncyBjb21wbGVtZW50CisgKiAgLTM6ICBkeW5hbWljIGJsb2NrIGNvZGUgZGVzY3JpcHRpb246IHRvbyBtYW55IGxlbmd0aCBvciBkaXN0YW5jZSBjb2RlcworICogIC00OiAgZHluYW1pYyBibG9jayBjb2RlIGRlc2NyaXB0aW9uOiBjb2RlIGxlbmd0aHMgY29kZXMgaW5jb21wbGV0ZQorICogIC01OiAgZHluYW1pYyBibG9jayBjb2RlIGRlc2NyaXB0aW9uOiByZXBlYXQgbGVuZ3RocyB3aXRoIG5vIGZpcnN0IGxlbmd0aAorICogIC02OiAgZHluYW1pYyBibG9jayBjb2RlIGRlc2NyaXB0aW9uOiByZXBlYXQgbW9yZSB0aGFuIHNwZWNpZmllZCBsZW5ndGhzCisgKiAgLTc6ICBkeW5hbWljIGJsb2NrIGNvZGUgZGVzY3JpcHRpb246IGludmFsaWQgbGl0ZXJhbC9sZW5ndGggY29kZSBsZW5ndGhzCisgKiAgLTg6ICBkeW5hbWljIGJsb2NrIGNvZGUgZGVzY3JpcHRpb246IGludmFsaWQgZGlzdGFuY2UgY29kZSBsZW5ndGhzCisgKiAgLTk6ICBkeW5hbWljIGJsb2NrIGNvZGUgZGVzY3JpcHRpb246IG1pc3NpbmcgZW5kLW9mLWJsb2NrIGNvZGUKKyAqIC0xMDogIGludmFsaWQgbGl0ZXJhbC9sZW5ndGggb3IgZGlzdGFuY2UgY29kZSBpbiBmaXhlZCBvciBkeW5hbWljIGJsb2NrCisgKiAtMTE6ICBkaXN0YW5jZSBpcyB0b28gZmFyIGJhY2sgaW4gZml4ZWQgb3IgZHluYW1pYyBibG9jaworICoKKyAqIEZvcm1hdCBub3RlczoKKyAqCisgKiAtIFRocmVlIGJpdHMgYXJlIHJlYWQgZm9yIGVhY2ggYmxvY2sgdG8gZGV0ZXJtaW5lIHRoZSBraW5kIG9mIGJsb2NrIGFuZAorICogICB3aGV0aGVyIG9yIG5vdCBpdCBpcyB0aGUgbGFzdCBibG9jay4gIFRoZW4gdGhlIGJsb2NrIGlzIGRlY29kZWQgYW5kIHRoZQorICogICBwcm9jZXNzIHJlcGVhdGVkIGlmIGl0IHdhcyBub3QgdGhlIGxhc3QgYmxvY2suCisgKgorICogLSBUaGUgbGVmdG92ZXIgYml0cyBpbiB0aGUgbGFzdCBieXRlIG9mIHRoZSBkZWZsYXRlIGRhdGEgYWZ0ZXIgdGhlIGxhc3QKKyAqICAgYmxvY2sgKGlmIGl0IHdhcyBhIGZpeGVkIG9yIGR5bmFtaWMgYmxvY2spIGFyZSB1bmRlZmluZWQgYW5kIGhhdmUgbm8KKyAqICAgZXhwZWN0ZWQgdmFsdWVzIHRvIGNoZWNrLgorICovCitpbnQgcHVmZih1bnNpZ25lZCBjaGFyICpkZXN0LCAgICAgICAgICAgLyogcG9pbnRlciB0byBkZXN0aW5hdGlvbiBwb2ludGVyICovCisgICAgICAgICB1bnNpZ25lZCBsb25nICpkZXN0bGVuLCAgICAgICAgLyogYW1vdW50IG9mIG91dHB1dCBzcGFjZSAqLworICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqc291cmNlLCAgIC8qIHBvaW50ZXIgdG8gc291cmNlIGRhdGEgcG9pbnRlciAqLworICAgICAgICAgdW5zaWduZWQgbG9uZyAqc291cmNlbGVuKSAgICAgIC8qIGFtb3VudCBvZiBpbnB1dCBhdmFpbGFibGUgKi8KK3sKKyAgICBzdHJ1Y3Qgc3RhdGUgczsgICAgICAgICAgICAgLyogaW5wdXQvb3V0cHV0IHN0YXRlICovCisgICAgaW50IGxhc3QsIHR5cGU7ICAgICAgICAgICAgIC8qIGJsb2NrIGluZm9ybWF0aW9uICovCisgICAgaW50IGVycjsgICAgICAgICAgICAgICAgICAgIC8qIHJldHVybiB2YWx1ZSAqLworCisgICAgLyogaW5pdGlhbGl6ZSBvdXRwdXQgc3RhdGUgKi8KKyAgICBzLm91dCA9IGRlc3Q7CisgICAgcy5vdXRsZW4gPSAqZGVzdGxlbjsgICAgICAgICAgICAgICAgLyogaWdub3JlZCBpZiBkZXN0IGlzIE5JTCAqLworICAgIHMub3V0Y250ID0gMDsKKworICAgIC8qIGluaXRpYWxpemUgaW5wdXQgc3RhdGUgKi8KKyAgICBzLmluID0gc291cmNlOworICAgIHMuaW5sZW4gPSAqc291cmNlbGVuOworICAgIHMuaW5jbnQgPSAwOworICAgIHMuYml0YnVmID0gMDsKKyAgICBzLmJpdGNudCA9IDA7CisKKyAgICAvKiByZXR1cm4gaWYgYml0cygpIG9yIGRlY29kZSgpIHRyaWVzIHRvIHJlYWQgcGFzdCBhdmFpbGFibGUgaW5wdXQgKi8KKyAgICBpZiAoc2V0am1wKHMuZW52KSAhPSAwKSAgICAgICAgICAgICAvKiBpZiBjYW1lIGJhY2sgaGVyZSB2aWEgbG9uZ2ptcCgpICovCisgICAgICAgIGVyciA9IDI7ICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhlbiBza2lwIGRvLWxvb3AsIHJldHVybiBlcnJvciAqLworICAgIGVsc2UgeworICAgICAgICAvKiBwcm9jZXNzIGJsb2NrcyB1bnRpbCBsYXN0IGJsb2NrIG9yIGVycm9yICovCisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGxhc3QgPSBiaXRzKCZzLCAxKTsgICAgICAgICAvKiBvbmUgaWYgbGFzdCBibG9jayAqLworICAgICAgICAgICAgdHlwZSA9IGJpdHMoJnMsIDIpOyAgICAgICAgIC8qIGJsb2NrIHR5cGUgMC4uMyAqLworICAgICAgICAgICAgZXJyID0gdHlwZSA9PSAwID8KKyAgICAgICAgICAgICAgICAgICAgc3RvcmVkKCZzKSA6CisgICAgICAgICAgICAgICAgICAgICh0eXBlID09IDEgPworICAgICAgICAgICAgICAgICAgICAgICAgZml4ZWQoJnMpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICh0eXBlID09IDIgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR5bmFtaWMoJnMpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSkpOyAgICAgICAvKiB0eXBlID09IDMsIGludmFsaWQgKi8KKyAgICAgICAgICAgIGlmIChlcnIgIT0gMCkKKyAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAvKiByZXR1cm4gd2l0aCBlcnJvciAqLworICAgICAgICB9IHdoaWxlICghbGFzdCk7CisgICAgfQorCisgICAgLyogdXBkYXRlIHRoZSBsZW5ndGhzIGFuZCByZXR1cm4gKi8KKyAgICBpZiAoZXJyIDw9IDApIHsKKyAgICAgICAgKmRlc3RsZW4gPSBzLm91dGNudDsKKyAgICAgICAgKnNvdXJjZWxlbiA9IHMuaW5jbnQ7CisgICAgfQorICAgIHJldHVybiBlcnI7Cit9CmRpZmYgLS1naXQgYS96bGliLTEuMi42L2NvbnRyaWIvcHVmZi9wdWZmLmggYi96bGliLTEuMi42L2NvbnRyaWIvcHVmZi9wdWZmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmEwMDgwYQotLS0gL2Rldi9udWxsCisrKyBiL3psaWItMS4yLjYvY29udHJpYi9wdWZmL3B1ZmYuaApAQCAtMCwwICsxLDM1IEBACisvKiBwdWZmLmgKKyAgQ29weXJpZ2h0IChDKSAyMDAyLTIwMTAgTWFyayBBZGxlciwgYWxsIHJpZ2h0cyByZXNlcnZlZAorICB2ZXJzaW9uIDIuMiwgMjUgQXByIDIwMTAKKworICBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAorICB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvciBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKKyAgYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KKworICBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKKyAgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAorICBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CisKKyAgMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKKyAgICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKKyAgICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCisgICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCisgIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCisgICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KKyAgMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KKworICBNYXJrIEFkbGVyICAgIG1hZGxlckBhbHVtbmkuY2FsdGVjaC5lZHUKKyAqLworCisKKy8qCisgKiBTZWUgcHVmZi5jIGZvciBwdXJwb3NlIGFuZCB1c2FnZS4KKyAqLworI2lmbmRlZiBOSUwKKyMgIGRlZmluZSBOSUwgKCh1bnNpZ25lZCBjaGFyICopMCkgICAgICAvKiBmb3Igbm8gb3V0cHV0IG9wdGlvbiAqLworI2VuZGlmCisKK2ludCBwdWZmKHVuc2lnbmVkIGNoYXIgKmRlc3QsICAgICAgICAgICAvKiBwb2ludGVyIHRvIGRlc3RpbmF0aW9uIHBvaW50ZXIgKi8KKyAgICAgICAgIHVuc2lnbmVkIGxvbmcgKmRlc3RsZW4sICAgICAgICAvKiBhbW91bnQgb2Ygb3V0cHV0IHNwYWNlICovCisgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzb3VyY2UsICAgLyogcG9pbnRlciB0byBzb3VyY2UgZGF0YSBwb2ludGVyICovCisgICAgICAgICB1bnNpZ25lZCBsb25nICpzb3VyY2VsZW4pOyAgICAgLyogYW1vdW50IG9mIGlucHV0IGF2YWlsYWJsZSAqLwpkaWZmIC0tZ2l0IGEvemxpYi0xLjIuNi9jb250cmliL3B1ZmYvcHVmZnRlc3QuYyBiL3psaWItMS4yLjYvY29udHJpYi9wdWZmL3B1ZmZ0ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzZlMzVmNgotLS0gL2Rldi9udWxsCisrKyBiL3psaWItMS4yLjYvY29udHJpYi9wdWZmL3B1ZmZ0ZXN0LmMKQEAgLTAsMCArMSwxNjUgQEAKKy8qCisgKiBwdWZmdGVzdC5jCisgKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAxMCBNYXJrIEFkbGVyCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gcHVmZi5oCisgKiB2ZXJzaW9uIDIuMiwgMjUgQXByIDIwMTAKKyAqLworCisvKiBFeGFtcGxlIG9mIGhvdyB0byB1c2UgcHVmZigpLgorCisgICBVc2FnZTogcHVmZiBbLXddIFstZl0gWy1ubm5dIGZpbGUKKyAgICAgICAgICAuLi4gfCBwdWZmIFstd10gWy1mXSBbLW5ubl0KKworICAgd2hlcmUgZmlsZSBpcyB0aGUgaW5wdXQgZmlsZSB3aXRoIGRlZmxhdGUgZGF0YSwgbm5uIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMKKyAgIG9mIGlucHV0IHRvIHNraXAgYmVmb3JlIGluZmxhdGluZyAoZS5nLiB0byBza2lwIGEgemxpYiBvciBnemlwIGhlYWRlciksIGFuZAorICAgLXcgaXMgdXNlZCB0byB3cml0ZSB0aGUgZGVjb21wcmVzc2VkIGRhdGEgdG8gc3Rkb3V0LiAgLWYgaXMgZm9yIGNvdmVyYWdlCisgICB0ZXN0aW5nLCBhbmQgY2F1c2VzIHB1ZmZ0ZXN0IHRvIGZhaWwgd2l0aCBub3QgZW5vdWdoIG91dHB1dCBzcGFjZSAoLWYgZG9lcworICAgYSB3cml0ZSBsaWtlIC13LCBzbyAtdyBpcyBub3QgcmVxdWlyZWQpLiAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJwdWZmLmgiCisKKyNpZiBkZWZpbmVkKE1TRE9TKSB8fCBkZWZpbmVkKE9TMikgfHwgZGVmaW5lZChXSU4zMikgfHwgZGVmaW5lZChfX0NZR1dJTl9fKQorIyAgaW5jbHVkZSA8ZmNudGwuaD4KKyMgIGluY2x1ZGUgPGlvLmg+CisjICBkZWZpbmUgU0VUX0JJTkFSWV9NT0RFKGZpbGUpIHNldG1vZGUoZmlsZW5vKGZpbGUpLCBPX0JJTkFSWSkKKyNlbHNlCisjICBkZWZpbmUgU0VUX0JJTkFSWV9NT0RFKGZpbGUpCisjZW5kaWYKKworI2RlZmluZSBsb2NhbCBzdGF0aWMKKworLyogUmV0dXJuIHNpemUgdGltZXMgYXBwcm94aW1hdGVseSB0aGUgY3ViZSByb290IG9mIDIsIGtlZXBpbmcgdGhlIHJlc3VsdCBhcyAxLAorICAgMywgb3IgNSB0aW1lcyBhIHBvd2VyIG9mIDIgLS0gdGhlIHJlc3VsdCBpcyBhbHdheXMgPiBzaXplLCB1bnRpbCB0aGUgcmVzdWx0CisgICBpcyB0aGUgbWF4aW11bSB2YWx1ZSBvZiBhbiB1bnNpZ25lZCBsb25nLCB3aGVyZSBpdCByZW1haW5zLiAgVGhpcyBpcyB1c2VmdWwKKyAgIHRvIGtlZXAgcmVhbGxvY2F0aW9ucyBsZXNzIHRoYW4gfjMzJSBvdmVyIHRoZSBhY3R1YWwgZGF0YS4gKi8KK2xvY2FsIHNpemVfdCBieXRoaXJkcyhzaXplX3Qgc2l6ZSkKK3sKKyAgICBpbnQgbjsKKyAgICBzaXplX3QgbTsKKworICAgIG0gPSBzaXplOworICAgIGZvciAobiA9IDA7IG07IG4rKykKKyAgICAgICAgbSA+Pj0gMTsKKyAgICBpZiAobiA8IDMpCisgICAgICAgIHJldHVybiBzaXplICsgMTsKKyAgICBuIC09IDM7CisgICAgbSA9IHNpemUgPj4gbjsKKyAgICBtICs9IG0gPT0gNiA/IDIgOiAxOworICAgIG0gPDw9IG47CisgICAgcmV0dXJuIG0gPiBzaXplID8gbSA6IChzaXplX3QpKC0xKTsKK30KKworLyogUmVhZCB0aGUgaW5wdXQgZmlsZSAqbmFtZSwgb3Igc3RkaW4gaWYgbmFtZSBpcyBOVUxMLCBpbnRvIGFsbG9jYXRlZCBtZW1vcnkuCisgICBSZWFsbG9jYXRlIHRvIGxhcmdlciBidWZmZXJzIHVudGlsIHRoZSBlbnRpcmUgZmlsZSBpcyByZWFkIGluLiAgUmV0dXJuIGEKKyAgIHBvaW50ZXIgdG8gdGhlIGFsbG9jYXRlZCBkYXRhLCBvciBOVUxMIGlmIHRoZXJlIHdhcyBhIG1lbW9yeSBhbGxvY2F0aW9uCisgICBmYWlsdXJlLiAgKmxlbiBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIG9mIGRhdGEgcmVhZCBmcm9tIHRoZSBpbnB1dCBmaWxlIChldmVuCisgICBpZiBsb2FkKCkgcmV0dXJucyBOVUxMKS4gIElmIHRoZSBpbnB1dCBmaWxlIHdhcyBlbXB0eSBvciBjb3VsZCBub3QgYmUgb3BlbmVkCisgICBvciByZWFkLCAqbGVuIGlzIHplcm8uICovCitsb2NhbCB2b2lkICpsb2FkKGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCAqbGVuKQoreworICAgIHNpemVfdCBzaXplOworICAgIHZvaWQgKmJ1ZiwgKnN3YXA7CisgICAgRklMRSAqaW47CisKKyAgICAqbGVuID0gMDsKKyAgICBidWYgPSBtYWxsb2Moc2l6ZSA9IDQwOTYpOworICAgIGlmIChidWYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaW4gPSBuYW1lID09IE5VTEwgPyBzdGRpbiA6IGZvcGVuKG5hbWUsICJyYiIpOworICAgIGlmIChpbiAhPSBOVUxMKSB7CisgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgICpsZW4gKz0gZnJlYWQoKGNoYXIgKilidWYgKyAqbGVuLCAxLCBzaXplIC0gKmxlbiwgaW4pOworICAgICAgICAgICAgaWYgKCpsZW4gPCBzaXplKSBicmVhazsKKyAgICAgICAgICAgIHNpemUgPSBieXRoaXJkcyhzaXplKTsKKyAgICAgICAgICAgIGlmIChzaXplID09ICpsZW4gfHwgKHN3YXAgPSByZWFsbG9jKGJ1Ziwgc2l6ZSkpID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBmcmVlKGJ1Zik7CisgICAgICAgICAgICAgICAgYnVmID0gTlVMTDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ1ZiA9IHN3YXA7CisgICAgICAgIH0KKyAgICAgICAgZmNsb3NlKGluKTsKKyAgICB9CisgICAgcmV0dXJuIGJ1ZjsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICAgIGludCByZXQsIHB1dCA9IDAsIGZhaWwgPSAwOworICAgIHVuc2lnbmVkIHNraXAgPSAwOworICAgIGNoYXIgKmFyZywgKm5hbWUgPSBOVUxMOworICAgIHVuc2lnbmVkIGNoYXIgKnNvdXJjZSA9IE5VTEwsICpkZXN0OworICAgIHNpemVfdCBsZW4gPSAwOworICAgIHVuc2lnbmVkIGxvbmcgc291cmNlbGVuLCBkZXN0bGVuOworCisgICAgLyogcHJvY2VzcyBhcmd1bWVudHMgKi8KKyAgICB3aGlsZSAoYXJnID0gKisrYXJndiwgLS1hcmdjKQorICAgICAgICBpZiAoYXJnWzBdID09ICctJykgeworICAgICAgICAgICAgaWYgKGFyZ1sxXSA9PSAndycgJiYgYXJnWzJdID09IDApCisgICAgICAgICAgICAgICAgcHV0ID0gMTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGFyZ1sxXSA9PSAnZicgJiYgYXJnWzJdID09IDApCisgICAgICAgICAgICAgICAgZmFpbCA9IDEsIHB1dCA9IDE7CisgICAgICAgICAgICBlbHNlIGlmIChhcmdbMV0gPj0gJzAnICYmIGFyZ1sxXSA8PSAnOScpCisgICAgICAgICAgICAgICAgc2tpcCA9ICh1bnNpZ25lZClhdG9pKGFyZyArIDEpOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJpbnZhbGlkIG9wdGlvbiAlc1xuIiwgYXJnKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChuYW1lICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAib25seSBvbmUgZmlsZSBuYW1lIGFsbG93ZWRcbiIpOworICAgICAgICAgICAgcmV0dXJuIDM7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbmFtZSA9IGFyZzsKKyAgICBzb3VyY2UgPSBsb2FkKG5hbWUsICZsZW4pOworICAgIGlmIChzb3VyY2UgPT0gTlVMTCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIm1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmVcbiIpOworICAgICAgICByZXR1cm4gNDsKKyAgICB9CisgICAgaWYgKGxlbiA9PSAwKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiY291bGQgbm90IHJlYWQgJXMsIG9yIGl0IHdhcyBlbXB0eVxuIiwKKyAgICAgICAgICAgICAgICBuYW1lID09IE5VTEwgPyAiPHN0ZGluPiIgOiBuYW1lKTsKKyAgICAgICAgZnJlZShzb3VyY2UpOworICAgICAgICByZXR1cm4gMzsKKyAgICB9CisgICAgaWYgKHNraXAgPj0gbGVuKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAic2tpcCByZXF1ZXN0IG9mICVkIGxlYXZlcyBubyBpbnB1dFxuIiwgc2tpcCk7CisgICAgICAgIGZyZWUoc291cmNlKTsKKyAgICAgICAgcmV0dXJuIDM7CisgICAgfQorCisgICAgLyogdGVzdCBpbmZsYXRlIGRhdGEgd2l0aCBvZmZzZXQgc2tpcCAqLworICAgIGxlbiAtPSBza2lwOworICAgIHNvdXJjZWxlbiA9ICh1bnNpZ25lZCBsb25nKWxlbjsKKyAgICByZXQgPSBwdWZmKE5JTCwgJmRlc3RsZW4sIHNvdXJjZSArIHNraXAsICZzb3VyY2VsZW4pOworICAgIGlmIChyZXQpCisgICAgICAgIGZwcmludGYoc3RkZXJyLCAicHVmZigpIGZhaWxlZCB3aXRoIHJldHVybiBjb2RlICVkXG4iLCByZXQpOworICAgIGVsc2UgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInB1ZmYoKSBzdWNjZWVkZWQgdW5jb21wcmVzc2luZyAlbHUgYnl0ZXNcbiIsIGRlc3RsZW4pOworICAgICAgICBpZiAoc291cmNlbGVuIDwgbGVuKSBmcHJpbnRmKHN0ZGVyciwgIiVsdSBjb21wcmVzc2VkIGJ5dGVzIHVudXNlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4gLSBzb3VyY2VsZW4pOworICAgIH0KKworICAgIC8qIGlmIHJlcXVlc3RlZCwgaW5mbGF0ZSBhZ2FpbiBhbmQgd3JpdGUgZGVjb21wcmVzc2QgZGF0YSB0byBzdGRvdXQgKi8KKyAgICBpZiAocHV0ICYmIHJldCA9PSAwKSB7CisgICAgICAgIGlmIChmYWlsKQorICAgICAgICAgICAgZGVzdGxlbiA+Pj0gMTsKKyAgICAgICAgZGVzdCA9IG1hbGxvYyhkZXN0bGVuKTsKKyAgICAgICAgaWYgKGRlc3QgPT0gTlVMTCkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJtZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlXG4iKTsKKyAgICAgICAgICAgIGZyZWUoc291cmNlKTsKKyAgICAgICAgICAgIHJldHVybiA0OworICAgICAgICB9CisgICAgICAgIHB1ZmYoZGVzdCwgJmRlc3RsZW4sIHNvdXJjZSArIHNraXAsICZzb3VyY2VsZW4pOworICAgICAgICBTRVRfQklOQVJZX01PREUoc3Rkb3V0KTsKKyAgICAgICAgZndyaXRlKGRlc3QsIDEsIGRlc3RsZW4sIHN0ZG91dCk7CisgICAgICAgIGZyZWUoZGVzdCk7CisgICAgfQorCisgICAgLyogY2xlYW4gdXAgKi8KKyAgICBmcmVlKHNvdXJjZSk7CisgICAgcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL3psaWItMS4yLjYvY29udHJpYi9wdWZmL3plcm9zLnJhdyBiL3psaWItMS4yLjYvY29udHJpYi9wdWZmL3plcm9zLnJhdwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTkwZTc2Ci0tLSAvZGV2L251bGwKKysrIGIvemxpYi0xLjIuNi9jb250cmliL3B1ZmYvemVyb3MucmF3CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3psaWItMS4yLjYvY29udHJpYi90ZXN0emxpYi90ZXN0emxpYi5jIGIvemxpYi0xLjIuNi9jb250cmliL3Rlc3R6bGliL3Rlc3R6bGliLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM1ODg4ZQotLS0gL2Rldi9udWxsCisrKyBiL3psaWItMS4yLjYvY29udHJpYi90ZXN0emxpYi90ZXN0emxpYi5jCkBAIC0wLDAgKzEsMjc1IEBACisjaW5jbHVkZSA8c3RkaW8uaD4NCisjaW5jbHVkZSA8c3RkbGliLmg+DQorI2luY2x1ZGUgPHdpbmRvd3MuaD4NCisNCisjaW5jbHVkZSAiemxpYi5oIg0KKw0KKw0KK3ZvaWQgTXlEb01pbnVzNjQoTEFSR0VfSU5URUdFUiAqUixMQVJHRV9JTlRFR0VSIEEsTEFSR0VfSU5URUdFUiBCKQ0KK3sNCisgICAgUi0+SGlnaFBhcnQgPSBBLkhpZ2hQYXJ0IC0gQi5IaWdoUGFydDsNCisgICAgaWYgKEEuTG93UGFydCA+PSBCLkxvd1BhcnQpDQorICAgICAgICBSLT5Mb3dQYXJ0ID0gQS5Mb3dQYXJ0IC0gQi5Mb3dQYXJ0Ow0KKyAgICBlbHNlDQorICAgIHsNCisgICAgICAgIFItPkxvd1BhcnQgPSBBLkxvd1BhcnQgLSBCLkxvd1BhcnQ7DQorICAgICAgICBSLT5IaWdoUGFydCAtLTsNCisgICAgfQ0KK30NCisNCisjaWZkZWYgX01fWDY0DQorLy8gc2VlIGh0dHA6Ly9tc2RuMi5taWNyb3NvZnQuY29tL2xpYnJhcnkvdHdjaGhlOTUoZW4tdXMsdnMuODApLmFzcHggZm9yIF9fcmR0c2MNCit1bnNpZ25lZCBfX2ludDY0IF9fcmR0c2Modm9pZCk7DQordm9pZCBCZWdpbkNvdW50UmR0c2MoTEFSR0VfSU5URUdFUiAqIHBiZWdpblRpbWU2NCkNCit7DQorIC8vICAgcHJpbnRmKCJyZHRzYyA9ICVJNjR4XG4iLF9fcmR0c2MoKSk7DQorICAgcGJlZ2luVGltZTY0LT5RdWFkUGFydD1fX3JkdHNjKCk7DQorfQ0KKw0KK0xBUkdFX0lOVEVHRVIgR2V0UmVzUmR0c2MoTEFSR0VfSU5URUdFUiBiZWdpblRpbWU2NCxCT09MIGZDb21wdXRlVGltZVF1ZXJ5UGVyZikNCit7DQorICAgIExBUkdFX0lOVEVHRVIgTElyZXM7DQorICAgIHVuc2lnbmVkIF9pbnQ2NCByZXM9X19yZHRzYygpLSgodW5zaWduZWQgX2ludDY0KShiZWdpblRpbWU2NC5RdWFkUGFydCkpOw0KKyAgICBMSXJlcy5RdWFkUGFydD1yZXM7DQorICAgLy8gcHJpbnRmKCJyZHRzYyA9ICVJNjR4XG4iLF9fcmR0c2MoKSk7DQorICAgIHJldHVybiBMSXJlczsNCit9DQorI2Vsc2UNCisjaWZkZWYgX01fSVg4Ng0KK3ZvaWQgbXlHZXRSRFRTQzMyKExBUkdFX0lOVEVHRVIgKiBwYmVnaW5UaW1lNjQpDQorew0KKyAgICBEV09SRCBkd0VkeCxkd0VheDsNCisgICAgX2FzbQ0KKyAgICB7DQorICAgICAgICByZHRzYw0KKyAgICAgICAgbW92IGR3RWF4LGVheA0KKyAgICAgICAgbW92IGR3RWR4LGVkeA0KKyAgICB9DQorICAgIHBiZWdpblRpbWU2NC0+TG93UGFydD1kd0VheDsNCisgICAgcGJlZ2luVGltZTY0LT5IaWdoUGFydD1kd0VkeDsNCit9DQorDQordm9pZCBCZWdpbkNvdW50UmR0c2MoTEFSR0VfSU5URUdFUiAqIHBiZWdpblRpbWU2NCkNCit7DQorICAgIG15R2V0UkRUU0MzMihwYmVnaW5UaW1lNjQpOw0KK30NCisNCitMQVJHRV9JTlRFR0VSIEdldFJlc1JkdHNjKExBUkdFX0lOVEVHRVIgYmVnaW5UaW1lNjQsQk9PTCBmQ29tcHV0ZVRpbWVRdWVyeVBlcmYpDQorew0KKyAgICBMQVJHRV9JTlRFR0VSIExJcmVzLGVuZFRpbWU2NDsNCisgICAgbXlHZXRSRFRTQzMyKCZlbmRUaW1lNjQpOw0KKw0KKyAgICBMSXJlcy5Mb3dQYXJ0PUxJcmVzLkhpZ2hQYXJ0PTA7DQorICAgIE15RG9NaW51czY0KCZMSXJlcyxlbmRUaW1lNjQsYmVnaW5UaW1lNjQpOw0KKyAgICByZXR1cm4gTElyZXM7DQorfQ0KKyNlbHNlDQordm9pZCBteUdldFJEVFNDMzIoTEFSR0VfSU5URUdFUiAqIHBiZWdpblRpbWU2NCkNCit7DQorfQ0KKw0KK3ZvaWQgQmVnaW5Db3VudFJkdHNjKExBUkdFX0lOVEVHRVIgKiBwYmVnaW5UaW1lNjQpDQorew0KK30NCisNCitMQVJHRV9JTlRFR0VSIEdldFJlc1JkdHNjKExBUkdFX0lOVEVHRVIgYmVnaW5UaW1lNjQsQk9PTCBmQ29tcHV0ZVRpbWVRdWVyeVBlcmYpDQorew0KKyAgICBMQVJHRV9JTlRFR0VSIGxyOw0KKyAgICBsci5RdWFkUGFydD0wOw0KKyAgICByZXR1cm4gbHI7DQorfQ0KKyNlbmRpZg0KKyNlbmRpZg0KKw0KK3ZvaWQgQmVnaW5Db3VudFBlcmZDb3VudGVyKExBUkdFX0lOVEVHRVIgKiBwYmVnaW5UaW1lNjQsQk9PTCBmQ29tcHV0ZVRpbWVRdWVyeVBlcmYpDQorew0KKyAgICBpZiAoKCFmQ29tcHV0ZVRpbWVRdWVyeVBlcmYpIHx8ICghUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIocGJlZ2luVGltZTY0KSkpDQorICAgIHsNCisgICAgICAgIHBiZWdpblRpbWU2NC0+TG93UGFydCA9IEdldFRpY2tDb3VudCgpOw0KKyAgICAgICAgcGJlZ2luVGltZTY0LT5IaWdoUGFydCA9IDA7DQorICAgIH0NCit9DQorDQorRFdPUkQgR2V0TXNlY1NpbmNlUGVyZkNvdW50ZXIoTEFSR0VfSU5URUdFUiBiZWdpblRpbWU2NCxCT09MIGZDb21wdXRlVGltZVF1ZXJ5UGVyZikNCit7DQorICAgIExBUkdFX0lOVEVHRVIgZW5kVGltZTY0LHRpY2tzUGVyU2Vjb25kLHRpY2tzOw0KKyAgICBEV09SRExPTkcgdGlja3NTaGlmdGVkLHRpY2tTZWNTaGlmdGVkOw0KKyAgICBEV09SRCBkd0xvZz0xNiswOw0KKyAgICBEV09SRCBkd1JldDsNCisgICAgaWYgKCghZkNvbXB1dGVUaW1lUXVlcnlQZXJmKSB8fCAoIVF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyKCZlbmRUaW1lNjQpKSkNCisgICAgICAgIGR3UmV0ID0gKEdldFRpY2tDb3VudCgpIC0gYmVnaW5UaW1lNjQuTG93UGFydCkqMTsNCisgICAgZWxzZQ0KKyAgICB7DQorICAgICAgICBNeURvTWludXM2NCgmdGlja3MsZW5kVGltZTY0LGJlZ2luVGltZTY0KTsNCisgICAgICAgIFF1ZXJ5UGVyZm9ybWFuY2VGcmVxdWVuY3koJnRpY2tzUGVyU2Vjb25kKTsNCisNCisNCisgICAgICAgIHsNCisgICAgICAgICAgICB0aWNrc1NoaWZ0ZWQgPSBJbnQ2NFNocmxNb2QzMigqKERXT1JETE9ORyopJnRpY2tzLGR3TG9nKTsNCisgICAgICAgICAgICB0aWNrU2VjU2hpZnRlZCA9IEludDY0U2hybE1vZDMyKCooRFdPUkRMT05HKikmdGlja3NQZXJTZWNvbmQsZHdMb2cpOw0KKw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgZHdSZXQgPSAoRFdPUkQpKCgoKERXT1JEKXRpY2tzU2hpZnRlZCkqMTAwMCkvKERXT1JEKSh0aWNrU2VjU2hpZnRlZCkpOw0KKyAgICAgICAgZHdSZXQgKj0xOw0KKyAgICB9DQorICAgIHJldHVybiBkd1JldDsNCit9DQorDQoraW50IFJlYWRGaWxlTWVtb3J5KGNvbnN0IGNoYXIqIGZpbGVuYW1lLGxvbmcqIHBsRmlsZVNpemUsdm9pZCoqIHBGaWxlUHRyKQ0KK3sNCisgICAgRklMRSogc3RyZWFtOw0KKyAgICB2b2lkKiBwdHI7DQorICAgIGludCByZXRWYWw9MTsNCisgICAgc3RyZWFtPWZvcGVuKGZpbGVuYW1lLCAicmIiKTsNCisgICAgaWYgKHN0cmVhbT09TlVMTCkNCisgICAgICAgIHJldHVybiAwOw0KKw0KKyAgICBmc2VlayhzdHJlYW0sMCxTRUVLX0VORCk7DQorDQorICAgICpwbEZpbGVTaXplPWZ0ZWxsKHN0cmVhbSk7DQorICAgIGZzZWVrKHN0cmVhbSwwLFNFRUtfU0VUKTsNCisgICAgcHRyPW1hbGxvYygoKnBsRmlsZVNpemUpKzEpOw0KKyAgICBpZiAocHRyPT1OVUxMKQ0KKyAgICAgICAgcmV0VmFsPTA7DQorICAgIGVsc2UNCisgICAgew0KKyAgICAgICAgaWYgKGZyZWFkKHB0ciwgMSwgKnBsRmlsZVNpemUsc3RyZWFtKSAhPSAoKnBsRmlsZVNpemUpKQ0KKyAgICAgICAgICAgIHJldFZhbD0wOw0KKyAgICB9DQorICAgIGZjbG9zZShzdHJlYW0pOw0KKyAgICAqcEZpbGVQdHI9cHRyOw0KKyAgICByZXR1cm4gcmV0VmFsOw0KK30NCisNCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQ0KK3sNCisgICAgaW50IEJsb2NrU2l6ZUNvbXByZXNzPTB4ODAwMDsNCisgICAgaW50IEJsb2NrU2l6ZVVuY29tcHJlc3M9MHg4MDAwOw0KKyAgICBpbnQgY3ByTGV2ZWw9Wl9ERUZBVUxUX0NPTVBSRVNTSU9OIDsNCisgICAgbG9uZyBsRmlsZVNpemU7DQorICAgIHVuc2lnbmVkIGNoYXIqIEZpbGVQdHI7DQorICAgIGxvbmcgbEJ1ZmZlclNpemVDcHI7DQorICAgIGxvbmcgbEJ1ZmZlclNpemVVbmNwcjsNCisgICAgbG9uZyBsQ29tcHJlc3NlZFNpemU9MDsNCisgICAgdW5zaWduZWQgY2hhciogQ3ByUHRyOw0KKyAgICB1bnNpZ25lZCBjaGFyKiBVbmNwclB0cjsNCisgICAgbG9uZyBsU2l6ZUNwcixsU2l6ZVVuY3ByOw0KKyAgICBEV09SRCBkd0dldFRpY2ssZHdNc2VjUVA7DQorICAgIExBUkdFX0lOVEVHRVIgbGlfcXAsbGlfcmR0c2MsZHdSZXNSZHRzYzsNCisNCisgICAgaWYgKGFyZ2M8PTEpDQorICAgIHsNCisgICAgICAgIHByaW50ZigicnVuIFRlc3RabGliIDxGaWxlPiBbQmxvY2tTaXplQ29tcHJlc3NdIFtCbG9ja1NpemVVbmNvbXByZXNzXSBbY29tcHJlcy4gbGV2ZWxdXG4iKTsNCisgICAgICAgIHJldHVybiAwOw0KKyAgICB9DQorDQorICAgIGlmIChSZWFkRmlsZU1lbW9yeShhcmd2WzFdLCZsRmlsZVNpemUsJkZpbGVQdHIpPT0wKQ0KKyAgICB7DQorICAgICAgICBwcmludGYoImVycm9yIHJlYWRpbmcgJXNcbiIsYXJndlsxXSk7DQorICAgICAgICByZXR1cm4gMTsNCisgICAgfQ0KKyAgICBlbHNlIHByaW50ZigiZmlsZSAlcyByZWFkLCAldSBieXRlc1xuIixhcmd2WzFdLGxGaWxlU2l6ZSk7DQorDQorICAgIGlmIChhcmdjPj0zKQ0KKyAgICAgICAgQmxvY2tTaXplQ29tcHJlc3M9YXRvbChhcmd2WzJdKTsNCisNCisgICAgaWYgKGFyZ2M+PTQpDQorICAgICAgICBCbG9ja1NpemVVbmNvbXByZXNzPWF0b2woYXJndlszXSk7DQorDQorICAgIGlmIChhcmdjPj01KQ0KKyAgICAgICAgY3ByTGV2ZWw9KGludClhdG9sKGFyZ3ZbNF0pOw0KKw0KKyAgICBsQnVmZmVyU2l6ZUNwciA9IGxGaWxlU2l6ZSArIChsRmlsZVNpemUvMHgxMCkgKyAweDIwMDsNCisgICAgbEJ1ZmZlclNpemVVbmNwciA9IGxCdWZmZXJTaXplQ3ByOw0KKw0KKyAgICBDcHJQdHI9KHVuc2lnbmVkIGNoYXIqKW1hbGxvYyhsQnVmZmVyU2l6ZUNwciArIEJsb2NrU2l6ZUNvbXByZXNzKTsNCisNCisgICAgQmVnaW5Db3VudFBlcmZDb3VudGVyKCZsaV9xcCxUUlVFKTsNCisgICAgZHdHZXRUaWNrPUdldFRpY2tDb3VudCgpOw0KKyAgICBCZWdpbkNvdW50UmR0c2MoJmxpX3JkdHNjKTsNCisgICAgew0KKyAgICAgICAgel9zdHJlYW0gemNwcjsNCisgICAgICAgIGludCByZXQ9Wl9PSzsNCisgICAgICAgIGxvbmcgbE9yaWdUb0RvID0gbEZpbGVTaXplOw0KKyAgICAgICAgbG9uZyBsT3JpZ0RvbmUgPSAwOw0KKyAgICAgICAgaW50IHN0ZXA9MDsNCisgICAgICAgIG1lbXNldCgmemNwciwwLHNpemVvZih6X3N0cmVhbSkpOw0KKyAgICAgICAgZGVmbGF0ZUluaXQoJnpjcHIsY3ByTGV2ZWwpOw0KKw0KKyAgICAgICAgemNwci5uZXh0X2luID0gRmlsZVB0cjsNCisgICAgICAgIHpjcHIubmV4dF9vdXQgPSBDcHJQdHI7DQorDQorDQorICAgICAgICBkbw0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGxvbmcgYWxsX3JlYWRfYmVmb3JlID0gemNwci50b3RhbF9pbjsNCisgICAgICAgICAgICB6Y3ByLmF2YWlsX2luID0gbWluKGxPcmlnVG9EbyxCbG9ja1NpemVDb21wcmVzcyk7DQorICAgICAgICAgICAgemNwci5hdmFpbF9vdXQgPSBCbG9ja1NpemVDb21wcmVzczsNCisgICAgICAgICAgICByZXQ9ZGVmbGF0ZSgmemNwciwoemNwci5hdmFpbF9pbj09bE9yaWdUb0RvKSA/IFpfRklOSVNIIDogWl9TWU5DX0ZMVVNIKTsNCisgICAgICAgICAgICBsT3JpZ0RvbmUgKz0gKHpjcHIudG90YWxfaW4tYWxsX3JlYWRfYmVmb3JlKTsNCisgICAgICAgICAgICBsT3JpZ1RvRG8gLT0gKHpjcHIudG90YWxfaW4tYWxsX3JlYWRfYmVmb3JlKTsNCisgICAgICAgICAgICBzdGVwKys7DQorICAgICAgICB9IHdoaWxlIChyZXQ9PVpfT0spOw0KKw0KKyAgICAgICAgbFNpemVDcHI9emNwci50b3RhbF9vdXQ7DQorICAgICAgICBkZWZsYXRlRW5kKCZ6Y3ByKTsNCisgICAgICAgIGR3R2V0VGljaz1HZXRUaWNrQ291bnQoKS1kd0dldFRpY2s7DQorICAgICAgICBkd01zZWNRUD1HZXRNc2VjU2luY2VQZXJmQ291bnRlcihsaV9xcCxUUlVFKTsNCisgICAgICAgIGR3UmVzUmR0c2M9R2V0UmVzUmR0c2MobGlfcmR0c2MsVFJVRSk7DQorICAgICAgICBwcmludGYoInRvdGFsIGNvbXByZXNzIHNpemUgPSAldSwgaW4gJXUgc3RlcFxuIixsU2l6ZUNwcixzdGVwKTsNCisgICAgICAgIHByaW50ZigidGltZSA9ICV1IG1zZWMgPSAlZiBzZWNcbiIsZHdHZXRUaWNrLGR3R2V0VGljay8oZG91YmxlKTEwMDAuKTsNCisgICAgICAgIHByaW50ZigiZGVmY3ByIHRpbWUgUVAgPSAldSBtc2VjID0gJWYgc2VjXG4iLGR3TXNlY1FQLGR3TXNlY1FQLyhkb3VibGUpMTAwMC4pOw0KKyAgICAgICAgcHJpbnRmKCJkZWZjcHIgcmVzdWx0IHJkdHNjID0gJUk2NHhcblxuIixkd1Jlc1JkdHNjLlF1YWRQYXJ0KTsNCisgICAgfQ0KKw0KKyAgICBDcHJQdHI9KHVuc2lnbmVkIGNoYXIqKXJlYWxsb2MoQ3ByUHRyLGxTaXplQ3ByKTsNCisgICAgVW5jcHJQdHI9KHVuc2lnbmVkIGNoYXIqKW1hbGxvYyhsQnVmZmVyU2l6ZVVuY3ByICsgQmxvY2tTaXplVW5jb21wcmVzcyk7DQorDQorICAgIEJlZ2luQ291bnRQZXJmQ291bnRlcigmbGlfcXAsVFJVRSk7DQorICAgIGR3R2V0VGljaz1HZXRUaWNrQ291bnQoKTsNCisgICAgQmVnaW5Db3VudFJkdHNjKCZsaV9yZHRzYyk7DQorICAgIHsNCisgICAgICAgIHpfc3RyZWFtIHpjcHI7DQorICAgICAgICBpbnQgcmV0PVpfT0s7DQorICAgICAgICBsb25nIGxPcmlnVG9EbyA9IGxTaXplQ3ByOw0KKyAgICAgICAgbG9uZyBsT3JpZ0RvbmUgPSAwOw0KKyAgICAgICAgaW50IHN0ZXA9MDsNCisgICAgICAgIG1lbXNldCgmemNwciwwLHNpemVvZih6X3N0cmVhbSkpOw0KKyAgICAgICAgaW5mbGF0ZUluaXQoJnpjcHIpOw0KKw0KKyAgICAgICAgemNwci5uZXh0X2luID0gQ3ByUHRyOw0KKyAgICAgICAgemNwci5uZXh0X291dCA9IFVuY3ByUHRyOw0KKw0KKw0KKyAgICAgICAgZG8NCisgICAgICAgIHsNCisgICAgICAgICAgICBsb25nIGFsbF9yZWFkX2JlZm9yZSA9IHpjcHIudG90YWxfaW47DQorICAgICAgICAgICAgemNwci5hdmFpbF9pbiA9IG1pbihsT3JpZ1RvRG8sQmxvY2tTaXplVW5jb21wcmVzcyk7DQorICAgICAgICAgICAgemNwci5hdmFpbF9vdXQgPSBCbG9ja1NpemVVbmNvbXByZXNzOw0KKyAgICAgICAgICAgIHJldD1pbmZsYXRlKCZ6Y3ByLFpfU1lOQ19GTFVTSCk7DQorICAgICAgICAgICAgbE9yaWdEb25lICs9ICh6Y3ByLnRvdGFsX2luLWFsbF9yZWFkX2JlZm9yZSk7DQorICAgICAgICAgICAgbE9yaWdUb0RvIC09ICh6Y3ByLnRvdGFsX2luLWFsbF9yZWFkX2JlZm9yZSk7DQorICAgICAgICAgICAgc3RlcCsrOw0KKyAgICAgICAgfSB3aGlsZSAocmV0PT1aX09LKTsNCisNCisgICAgICAgIGxTaXplVW5jcHI9emNwci50b3RhbF9vdXQ7DQorICAgICAgICBpbmZsYXRlRW5kKCZ6Y3ByKTsNCisgICAgICAgIGR3R2V0VGljaz1HZXRUaWNrQ291bnQoKS1kd0dldFRpY2s7DQorICAgICAgICBkd01zZWNRUD1HZXRNc2VjU2luY2VQZXJmQ291bnRlcihsaV9xcCxUUlVFKTsNCisgICAgICAgIGR3UmVzUmR0c2M9R2V0UmVzUmR0c2MobGlfcmR0c2MsVFJVRSk7DQorICAgICAgICBwcmludGYoInRvdGFsIHVuY29tcHJlc3Mgc2l6ZSA9ICV1LCBpbiAldSBzdGVwXG4iLGxTaXplVW5jcHIsc3RlcCk7DQorICAgICAgICBwcmludGYoInRpbWUgPSAldSBtc2VjID0gJWYgc2VjXG4iLGR3R2V0VGljayxkd0dldFRpY2svKGRvdWJsZSkxMDAwLik7DQorICAgICAgICBwcmludGYoInVuY3ByICB0aW1lIFFQID0gJXUgbXNlYyA9ICVmIHNlY1xuIixkd01zZWNRUCxkd01zZWNRUC8oZG91YmxlKTEwMDAuKTsNCisgICAgICAgIHByaW50ZigidW5jcHIgIHJlc3VsdCByZHRzYyA9ICVJNjR4XG5cbiIsZHdSZXNSZHRzYy5RdWFkUGFydCk7DQorICAgIH0NCisNCisgICAgaWYgKGxTaXplVW5jcHI9PWxGaWxlU2l6ZSkNCisgICAgew0KKyAgICAgICAgaWYgKG1lbWNtcChGaWxlUHRyLFVuY3ByUHRyLGxGaWxlU2l6ZSk9PTApDQorICAgICAgICAgICAgcHJpbnRmKCJjb21wYXJlIG9rXG4iKTsNCisNCisgICAgfQ0KKw0KKyAgICByZXR1cm4gMDsNCit9DQpkaWZmIC0tZ2l0IGEvemxpYi0xLjIuNi9jb250cmliL3Rlc3R6bGliL3Rlc3R6bGliLnR4dCBiL3psaWItMS4yLjYvY29udHJpYi90ZXN0emxpYi90ZXN0emxpYi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjIyNThmMQotLS0gL2Rldi9udWxsCisrKyBiL3psaWItMS4yLjYvY29udHJpYi90ZXN0emxpYi90ZXN0emxpYi50eHQKQEAgLTAsMCArMSwxMCBAQAorVG8gYnVpbGQgdGVzdHpMaWIgd2l0aCBWaXN1YWwgU3R1ZGlvIDIwMDU6DQorDQorY29weSB0byBhIGRpcmVjdG9yeSBmaWxlIGZyb20gOg0KKy0gcm9vdCBvZiB6TGliIHRyZWUNCistIGNvbnRyaWIvdGVzdHpsaWINCistIGNvbnRyaWIvbWFzbXg4Ng0KKy0gY29udHJpYi9tYXNteDY0DQorLSBjb250cmliL3ZzdHVkaW8vdmM3DQorDQorYW5kIG9wZW4gdGVzdHpsaWI4LnNsbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3psaWItMS4yLjYvY29udHJpYi91bnRnei9NYWtlZmlsZSBiL3psaWItMS4yLjYvY29udHJpYi91bnRnei9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTQyNjZmCi0tLSAvZGV2L251bGwKKysrIGIvemxpYi0xLjIuNi9jb250cmliL3VudGd6L01ha2VmaWxlCkBAIC0wLDAgKzEsMTQgQEAKK0NDPWNjCitDRkxBR1M9LWcKKwordW50Z3o6IHVudGd6Lm8gLi4vLi4vbGliei5hCisJJChDQykgJChDRkxBR1MpIC1vIHVudGd6IHVudGd6Lm8gLUwuLi8uLiAtbHoKKwordW50Z3oubzogdW50Z3ouYyAuLi8uLi96bGliLmgKKwkkKENDKSAkKENGTEFHUykgLWMgLUkuLi8uLiB1bnRnei5jCisKKy4uLy4uL2xpYnouYToKKwljZCAuLi8uLjsgLi9jb25maWd1cmU7IG1ha2UKKworY2xlYW46CisJcm0gLWYgdW50Z3ogdW50Z3oubyAqfgpkaWZmIC0tZ2l0IGEvemxpYi0xLjIuNi9jb250cmliL3VudGd6L01ha2VmaWxlLm1zYyBiL3psaWItMS4yLjYvY29udHJpYi91bnRnei9NYWtlZmlsZS5tc2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdiODYwMgotLS0gL2Rldi9udWxsCisrKyBiL3psaWItMS4yLjYvY29udHJpYi91bnRnei9NYWtlZmlsZS5tc2MKQEAgLTAsMCArMSwxNyBAQAorQ0M9Y2wKK0NGTEFHUz0tTUQKKwordW50Z3ouZXhlOiB1bnRnei5vYmogLi5cLi5cemxpYi5saWIKKwkkKENDKSAkKENGTEFHUykgdW50Z3oub2JqIC4uXC4uXHpsaWIubGliCisKK3VudGd6Lm9iajogdW50Z3ouYyAuLlwuLlx6bGliLmgKKwkkKENDKSAkKENGTEFHUykgLWMgLUkuLlwuLiB1bnRnei5jCisKKy4uXC4uXHpsaWIubGliOgorCWNkIC4uXC4uCisJJChNQUtFKSAtZiB3aW4zMlxtYWtlZmlsZS5tc2MKKwljZCBjb250cmliXHVudGd6CisKK2NsZWFuOgorCS1kZWwgdW50Z3oub2JqCisJLWRlbCB1bnRnei5leGUKZGlmZiAtLWdpdCBhL3psaWItMS4yLjYvY29udHJpYi91bnRnei91bnRnei5jIGIvemxpYi0xLjIuNi9jb250cmliL3VudGd6L3VudGd6LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmMzOTFlNQotLS0gL2Rldi9udWxsCisrKyBiL3psaWItMS4yLjYvY29udHJpYi91bnRnei91bnRnei5jCkBAIC0wLDAgKzEsNjc0IEBACisvKgorICogdW50Z3ouYyAtLSBEaXNwbGF5IGNvbnRlbnRzIGFuZCBleHRyYWN0IGZpbGVzIGZyb20gYSBnemlwJ2QgVEFSIGZpbGUKKyAqCisgKiB3cml0dGVuIGJ5IFBlZHJvIEEuIEFyYW5kYSBHdXRpZXJyZXogPHBhYWdAdGlkLmVzPgorICogYWRhcHRhdGlvbiB0byBVbml4IGJ5IEplYW4tbG91cCBHYWlsbHkgPGpsb3VwQGd6aXAub3JnPgorICogdmFyaW91cyBmaXhlcyBieSBDb3NtaW4gVHJ1dGEgPGNvc21pbnRAY3MudWJiY2x1ai5ybz4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2luY2x1ZGUgInpsaWIuaCIKKworI2lmZGVmIHVuaXgKKyMgIGluY2x1ZGUgPHVuaXN0ZC5oPgorI2Vsc2UKKyMgIGluY2x1ZGUgPGRpcmVjdC5oPgorIyAgaW5jbHVkZSA8aW8uaD4KKyNlbmRpZgorCisjaWZkZWYgV0lOMzIKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjICBpZm5kZWYgRl9PSworIyAgICBkZWZpbmUgRl9PSyAgMAorIyAgZW5kaWYKKyMgIGRlZmluZSBta2RpcihkaXJuYW1lLG1vZGUpICAgX21rZGlyKGRpcm5hbWUpCisjICBpZmRlZiBfTVNDX1ZFUgorIyAgICBkZWZpbmUgYWNjZXNzKHBhdGgsbW9kZSkgICBfYWNjZXNzKHBhdGgsbW9kZSkKKyMgICAgZGVmaW5lIGNobW9kKHBhdGgsbW9kZSkgICAgX2NobW9kKHBhdGgsbW9kZSkKKyMgICAgZGVmaW5lIHN0cmR1cChzdHIpICAgICAgICAgX3N0cmR1cChzdHIpCisjICBlbmRpZgorI2Vsc2UKKyMgIGluY2x1ZGUgPHV0aW1lLmg+CisjZW5kaWYKKworCisvKiB2YWx1ZXMgdXNlZCBpbiB0eXBlZmxhZyBmaWVsZCAqLworCisjZGVmaW5lIFJFR1RZUEUgICcwJyAgICAgICAgICAgIC8qIHJlZ3VsYXIgZmlsZSAqLworI2RlZmluZSBBUkVHVFlQRSAnXDAnICAgICAgICAgICAvKiByZWd1bGFyIGZpbGUgKi8KKyNkZWZpbmUgTE5LVFlQRSAgJzEnICAgICAgICAgICAgLyogbGluayAqLworI2RlZmluZSBTWU1UWVBFICAnMicgICAgICAgICAgICAvKiByZXNlcnZlZCAqLworI2RlZmluZSBDSFJUWVBFICAnMycgICAgICAgICAgICAvKiBjaGFyYWN0ZXIgc3BlY2lhbCAqLworI2RlZmluZSBCTEtUWVBFICAnNCcgICAgICAgICAgICAvKiBibG9jayBzcGVjaWFsICovCisjZGVmaW5lIERJUlRZUEUgICc1JyAgICAgICAgICAgIC8qIGRpcmVjdG9yeSAqLworI2RlZmluZSBGSUZPVFlQRSAnNicgICAgICAgICAgICAvKiBGSUZPIHNwZWNpYWwgKi8KKyNkZWZpbmUgQ09OVFRZUEUgJzcnICAgICAgICAgICAgLyogcmVzZXJ2ZWQgKi8KKworLyogR05VIHRhciBleHRlbnNpb25zICovCisKKyNkZWZpbmUgR05VVFlQRV9EVU1QRElSICAnRCcgICAgLyogZmlsZSBuYW1lcyBmcm9tIGR1bXBlZCBkaXJlY3RvcnkgKi8KKyNkZWZpbmUgR05VVFlQRV9MT05HTElOSyAnSycgICAgLyogbG9uZyBsaW5rIG5hbWUgKi8KKyNkZWZpbmUgR05VVFlQRV9MT05HTkFNRSAnTCcgICAgLyogbG9uZyBmaWxlIG5hbWUgKi8KKyNkZWZpbmUgR05VVFlQRV9NVUxUSVZPTCAnTScgICAgLyogY29udGludWF0aW9uIG9mIGZpbGUgZnJvbSBhbm90aGVyIHZvbHVtZSAqLworI2RlZmluZSBHTlVUWVBFX05BTUVTICAgICdOJyAgICAvKiBmaWxlIG5hbWUgdGhhdCBkb2VzIG5vdCBmaXQgaW50byBtYWluIGhkciAqLworI2RlZmluZSBHTlVUWVBFX1NQQVJTRSAgICdTJyAgICAvKiBzcGFyc2UgZmlsZSAqLworI2RlZmluZSBHTlVUWVBFX1ZPTEhEUiAgICdWJyAgICAvKiB0YXBlL3ZvbHVtZSBoZWFkZXIgKi8KKworCisvKiB0YXIgaGVhZGVyICovCisKKyNkZWZpbmUgQkxPQ0tTSVpFICAgICA1MTIKKyNkZWZpbmUgU0hPUlROQU1FU0laRSAxMDAKKworc3RydWN0IHRhcl9oZWFkZXIKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYnl0ZSBvZmZzZXQgKi8KKyAgY2hhciBuYW1lWzEwMF07ICAgICAgICAgICAgICAgLyogICAwICovCisgIGNoYXIgbW9kZVs4XTsgICAgICAgICAgICAgICAgIC8qIDEwMCAqLworICBjaGFyIHVpZFs4XTsgICAgICAgICAgICAgICAgICAvKiAxMDggKi8KKyAgY2hhciBnaWRbOF07ICAgICAgICAgICAgICAgICAgLyogMTE2ICovCisgIGNoYXIgc2l6ZVsxMl07ICAgICAgICAgICAgICAgIC8qIDEyNCAqLworICBjaGFyIG10aW1lWzEyXTsgICAgICAgICAgICAgICAvKiAxMzYgKi8KKyAgY2hhciBjaGtzdW1bOF07ICAgICAgICAgICAgICAgLyogMTQ4ICovCisgIGNoYXIgdHlwZWZsYWc7ICAgICAgICAgICAgICAgIC8qIDE1NiAqLworICBjaGFyIGxpbmtuYW1lWzEwMF07ICAgICAgICAgICAvKiAxNTcgKi8KKyAgY2hhciBtYWdpY1s2XTsgICAgICAgICAgICAgICAgLyogMjU3ICovCisgIGNoYXIgdmVyc2lvblsyXTsgICAgICAgICAgICAgIC8qIDI2MyAqLworICBjaGFyIHVuYW1lWzMyXTsgICAgICAgICAgICAgICAvKiAyNjUgKi8KKyAgY2hhciBnbmFtZVszMl07ICAgICAgICAgICAgICAgLyogMjk3ICovCisgIGNoYXIgZGV2bWFqb3JbOF07ICAgICAgICAgICAgIC8qIDMyOSAqLworICBjaGFyIGRldm1pbm9yWzhdOyAgICAgICAgICAgICAvKiAzMzcgKi8KKyAgY2hhciBwcmVmaXhbMTU1XTsgICAgICAgICAgICAgLyogMzQ1ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDUwMCAqLworfTsKKwordW5pb24gdGFyX2J1ZmZlcgoreworICBjaGFyICAgICAgICAgICAgICAgYnVmZmVyW0JMT0NLU0laRV07CisgIHN0cnVjdCB0YXJfaGVhZGVyICBoZWFkZXI7Cit9OworCitzdHJ1Y3QgYXR0cl9pdGVtCit7CisgIHN0cnVjdCBhdHRyX2l0ZW0gICpuZXh0OworICBjaGFyICAgICAgICAgICAgICAqZm5hbWU7CisgIGludCAgICAgICAgICAgICAgICBtb2RlOworICB0aW1lX3QgICAgICAgICAgICAgdGltZTsKK307CisKK2VudW0geyBUR1pfRVhUUkFDVCwgVEdaX0xJU1QsIFRHWl9JTlZBTElEIH07CisKK2NoYXIgKlRHWmZuYW1lICAgICAgICAgIE9GKChjb25zdCBjaGFyICopKTsKK3ZvaWQgVEdabm90Zm91bmQgICAgICAgIE9GKChjb25zdCBjaGFyICopKTsKKworaW50IGdldG9jdCAgICAgICAgICAgICAgT0YoKGNoYXIgKiwgaW50KSk7CitjaGFyICpzdHJ0aW1lICAgICAgICAgICBPRigodGltZV90ICopKTsKK2ludCBzZXRmaWxldGltZSAgICAgICAgIE9GKChjaGFyICosIHRpbWVfdCkpOwordm9pZCBwdXNoX2F0dHIgICAgICAgICAgT0YoKHN0cnVjdCBhdHRyX2l0ZW0gKiosIGNoYXIgKiwgaW50LCB0aW1lX3QpKTsKK3ZvaWQgcmVzdG9yZV9hdHRyICAgICAgIE9GKChzdHJ1Y3QgYXR0cl9pdGVtICoqKSk7CisKK2ludCBFeHByTWF0Y2ggICAgICAgICAgIE9GKChjaGFyICosIGNoYXIgKikpOworCitpbnQgbWFrZWRpciAgICAgICAgICAgICBPRigoY2hhciAqKSk7CitpbnQgbWF0Y2huYW1lICAgICAgICAgICBPRigoaW50LCBpbnQsIGNoYXIgKiosIGNoYXIgKikpOworCit2b2lkIGVycm9yICAgICAgICAgICAgICBPRigoY29uc3QgY2hhciAqKSk7CitpbnQgdGFyICAgICAgICAgICAgICAgICBPRigoZ3pGaWxlLCBpbnQsIGludCwgaW50LCBjaGFyICoqKSk7CisKK3ZvaWQgaGVscCAgICAgICAgICAgICAgIE9GKChpbnQpKTsKK2ludCBtYWluICAgICAgICAgICAgICAgIE9GKChpbnQsIGNoYXIgKiopKTsKKworY2hhciAqcHJvZzsKKworY29uc3QgY2hhciAqVEdac3VmZml4W10gPSB7ICJcMCIsICIudGFyIiwgIi50YXIuZ3oiLCAiLnRheiIsICIudGd6IiwgTlVMTCB9OworCisvKiByZXR1cm4gdGhlIGZpbGUgbmFtZSBvZiB0aGUgVEdaIGFyY2hpdmUgKi8KKy8qIG9yIE5VTEwgaWYgaXQgZG9lcyBub3QgZXhpc3QgKi8KKworY2hhciAqVEdaZm5hbWUgKGNvbnN0IGNoYXIgKmFyY25hbWUpCit7CisgIHN0YXRpYyBjaGFyIGJ1ZmZlclsxMDI0XTsKKyAgaW50IG9yaWdsZW4saTsKKworICBzdHJjcHkoYnVmZmVyLGFyY25hbWUpOworICBvcmlnbGVuID0gc3RybGVuKGJ1ZmZlcik7CisKKyAgZm9yIChpPTA7IFRHWnN1ZmZpeFtpXTsgaSsrKQorICAgIHsKKyAgICAgICBzdHJjcHkoYnVmZmVyK29yaWdsZW4sVEdac3VmZml4W2ldKTsKKyAgICAgICBpZiAoYWNjZXNzKGJ1ZmZlcixGX09LKSA9PSAwKQorICAgICAgICAgcmV0dXJuIGJ1ZmZlcjsKKyAgICB9CisgIHJldHVybiBOVUxMOworfQorCisKKy8qIGVycm9yIG1lc3NhZ2UgZm9yIHRoZSBmaWxlbmFtZSAqLworCit2b2lkIFRHWm5vdGZvdW5kIChjb25zdCBjaGFyICphcmNuYW1lKQoreworICBpbnQgaTsKKworICBmcHJpbnRmKHN0ZGVyciwiJXM6IENvdWxkbid0IGZpbmQgIixwcm9nKTsKKyAgZm9yIChpPTA7VEdac3VmZml4W2ldO2krKykKKyAgICBmcHJpbnRmKHN0ZGVyciwoVEdac3VmZml4W2krMV0pID8gIiVzJXMsICIgOiAib3IgJXMlc1xuIiwKKyAgICAgICAgICAgIGFyY25hbWUsCisgICAgICAgICAgICBUR1pzdWZmaXhbaV0pOworICBleGl0KDEpOworfQorCisKKy8qIGNvbnZlcnQgb2N0YWwgZGlnaXRzIHRvIGludCAqLworLyogb24gZXJyb3IgcmV0dXJuIC0xICovCisKK2ludCBnZXRvY3QgKGNoYXIgKnAsaW50IHdpZHRoKQoreworICBpbnQgcmVzdWx0ID0gMDsKKyAgY2hhciBjOworCisgIHdoaWxlICh3aWR0aC0tKQorICAgIHsKKyAgICAgIGMgPSAqcCsrOworICAgICAgaWYgKGMgPT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICBpZiAoYyA9PSAnICcpCisgICAgICAgIGNvbnRpbnVlOworICAgICAgaWYgKGMgPCAnMCcgfHwgYyA+ICc3JykKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgcmVzdWx0ID0gcmVzdWx0ICogOCArIChjIC0gJzAnKTsKKyAgICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKKworLyogY29udmVydCB0aW1lX3QgdG8gc3RyaW5nICovCisvKiB1c2UgdGhlICJZWVlZL01NL0REIGhoOm1tOnNzIiBmb3JtYXQgKi8KKworY2hhciAqc3RydGltZSAodGltZV90ICp0KQoreworICBzdHJ1Y3QgdG0gICAqbG9jYWw7CisgIHN0YXRpYyBjaGFyIHJlc3VsdFszMl07CisKKyAgbG9jYWwgPSBsb2NhbHRpbWUodCk7CisgIHNwcmludGYocmVzdWx0LCIlNGQvJTAyZC8lMDJkICUwMmQ6JTAyZDolMDJkIiwKKyAgICAgICAgICBsb2NhbC0+dG1feWVhcisxOTAwLCBsb2NhbC0+dG1fbW9uKzEsIGxvY2FsLT50bV9tZGF5LAorICAgICAgICAgIGxvY2FsLT50bV9ob3VyLCBsb2NhbC0+dG1fbWluLCBsb2NhbC0+dG1fc2VjKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworCisvKiBzZXQgZmlsZSB0aW1lICovCisKK2ludCBzZXRmaWxldGltZSAoY2hhciAqZm5hbWUsdGltZV90IGZ0aW1lKQoreworI2lmZGVmIFdJTjMyCisgIHN0YXRpYyBpbnQgaXNXaW5OVCA9IC0xOworICBTWVNURU1USU1FIHN0OworICBGSUxFVElNRSBsb2NmdCwgbW9kZnQ7CisgIHN0cnVjdCB0bSAqbG9jdG07CisgIEhBTkRMRSBoRmlsZTsKKyAgaW50IHJlc3VsdDsKKworICBsb2N0bSA9IGxvY2FsdGltZSgmZnRpbWUpOworICBpZiAobG9jdG0gPT0gTlVMTCkKKyAgICByZXR1cm4gLTE7CisKKyAgc3Qud1llYXIgICAgICAgICA9IChXT1JEKWxvY3RtLT50bV95ZWFyICsgMTkwMDsKKyAgc3Qud01vbnRoICAgICAgICA9IChXT1JEKWxvY3RtLT50bV9tb24gKyAxOworICBzdC53RGF5T2ZXZWVrICAgID0gKFdPUkQpbG9jdG0tPnRtX3dkYXk7CisgIHN0LndEYXkgICAgICAgICAgPSAoV09SRClsb2N0bS0+dG1fbWRheTsKKyAgc3Qud0hvdXIgICAgICAgICA9IChXT1JEKWxvY3RtLT50bV9ob3VyOworICBzdC53TWludXRlICAgICAgID0gKFdPUkQpbG9jdG0tPnRtX21pbjsKKyAgc3Qud1NlY29uZCAgICAgICA9IChXT1JEKWxvY3RtLT50bV9zZWM7CisgIHN0LndNaWxsaXNlY29uZHMgPSAwOworICBpZiAoIVN5c3RlbVRpbWVUb0ZpbGVUaW1lKCZzdCwgJmxvY2Z0KSB8fAorICAgICAgIUxvY2FsRmlsZVRpbWVUb0ZpbGVUaW1lKCZsb2NmdCwgJm1vZGZ0KSkKKyAgICByZXR1cm4gLTE7CisKKyAgaWYgKGlzV2luTlQgPCAwKQorICAgIGlzV2luTlQgPSAoR2V0VmVyc2lvbigpIDwgMHg4MDAwMDAwMCkgPyAxIDogMDsKKyAgaEZpbGUgPSBDcmVhdGVGaWxlKGZuYW1lLCBHRU5FUklDX1dSSVRFLCAwLCBOVUxMLCBPUEVOX0VYSVNUSU5HLAorICAgICAgICAgICAgICAgICAgICAgKGlzV2luTlQgPyBGSUxFX0ZMQUdfQkFDS1VQX1NFTUFOVElDUyA6IDApLAorICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgIGlmIChoRmlsZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkKKyAgICByZXR1cm4gLTE7CisgIHJlc3VsdCA9IFNldEZpbGVUaW1lKGhGaWxlLCBOVUxMLCBOVUxMLCAmbW9kZnQpID8gMCA6IC0xOworICBDbG9zZUhhbmRsZShoRmlsZSk7CisgIHJldHVybiByZXN1bHQ7CisjZWxzZQorICBzdHJ1Y3QgdXRpbWJ1ZiBzZXR0aW1lOworCisgIHNldHRpbWUuYWN0aW1lID0gc2V0dGltZS5tb2R0aW1lID0gZnRpbWU7CisgIHJldHVybiB1dGltZShmbmFtZSwmc2V0dGltZSk7CisjZW5kaWYKK30KKworCisvKiBwdXNoIGZpbGUgYXR0cmlidXRlcyAqLworCit2b2lkIHB1c2hfYXR0cihzdHJ1Y3QgYXR0cl9pdGVtICoqbGlzdCxjaGFyICpmbmFtZSxpbnQgbW9kZSx0aW1lX3QgdGltZSkKK3sKKyAgc3RydWN0IGF0dHJfaXRlbSAqaXRlbTsKKworICBpdGVtID0gKHN0cnVjdCBhdHRyX2l0ZW0gKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCBhdHRyX2l0ZW0pKTsKKyAgaWYgKGl0ZW0gPT0gTlVMTCkKKyAgICBlcnJvcigiT3V0IG9mIG1lbW9yeSIpOworICBpdGVtLT5mbmFtZSA9IHN0cmR1cChmbmFtZSk7CisgIGl0ZW0tPm1vZGUgID0gbW9kZTsKKyAgaXRlbS0+dGltZSAgPSB0aW1lOworICBpdGVtLT5uZXh0ICA9ICpsaXN0OworICAqbGlzdCAgICAgICA9IGl0ZW07Cit9CisKKworLyogcmVzdG9yZSBmaWxlIGF0dHJpYnV0ZXMgKi8KKwordm9pZCByZXN0b3JlX2F0dHIoc3RydWN0IGF0dHJfaXRlbSAqKmxpc3QpCit7CisgIHN0cnVjdCBhdHRyX2l0ZW0gKml0ZW0sICpwcmV2OworCisgIGZvciAoaXRlbSA9ICpsaXN0OyBpdGVtICE9IE5VTEw7ICkKKyAgICB7CisgICAgICBzZXRmaWxldGltZShpdGVtLT5mbmFtZSxpdGVtLT50aW1lKTsKKyAgICAgIGNobW9kKGl0ZW0tPmZuYW1lLGl0ZW0tPm1vZGUpOworICAgICAgcHJldiA9IGl0ZW07CisgICAgICBpdGVtID0gaXRlbS0+bmV4dDsKKyAgICAgIGZyZWUocHJldik7CisgICAgfQorICAqbGlzdCA9IE5VTEw7Cit9CisKKworLyogbWF0Y2ggcmVndWxhciBleHByZXNzaW9uICovCisKKyNkZWZpbmUgSVNTUEVDSUFMKGMpICgoKGMpID09ICcqJykgfHwgKChjKSA9PSAnLycpKQorCitpbnQgRXhwck1hdGNoIChjaGFyICpzdHJpbmcsY2hhciAqZXhwcikKK3sKKyAgd2hpbGUgKDEpCisgICAgeworICAgICAgaWYgKElTU1BFQ0lBTCgqZXhwcikpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoKmV4cHIgPT0gJy8nKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAoKnN0cmluZyAhPSAnXFwnICYmICpzdHJpbmcgIT0gJy8nKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICBzdHJpbmcgKys7IGV4cHIrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIGlmICgqZXhwciA9PSAnKicpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmICgqZXhwciArKyA9PSAwKQorICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgICB3aGlsZSAoKisrc3RyaW5nICE9ICpleHByKQorICAgICAgICAgICAgICAgIGlmICgqc3RyaW5nID09IDApCisgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgaWYgKCpzdHJpbmcgIT0gKmV4cHIpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICBpZiAoKmV4cHIrKyA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgc3RyaW5nKys7CisgICAgICAgIH0KKyAgICB9Cit9CisKKworLyogcmVjdXJzaXZlIG1rZGlyICovCisvKiBhYm9ydCBvbiBFTk9FTlQ7IGlnbm9yZSBvdGhlciBlcnJvcnMgbGlrZSAiZGlyZWN0b3J5IGFscmVhZHkgZXhpc3RzIiAqLworLyogcmV0dXJuIDEgaWYgT0sgKi8KKy8qICAgICAgICAwIG9uIGVycm9yICovCisKK2ludCBtYWtlZGlyIChjaGFyICpuZXdkaXIpCit7CisgIGNoYXIgKmJ1ZmZlciA9IHN0cmR1cChuZXdkaXIpOworICBjaGFyICpwOworICBpbnQgIGxlbiA9IHN0cmxlbihidWZmZXIpOworCisgIGlmIChsZW4gPD0gMCkgeworICAgIGZyZWUoYnVmZmVyKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAoYnVmZmVyW2xlbi0xXSA9PSAnLycpIHsKKyAgICBidWZmZXJbbGVuLTFdID0gJ1wwJzsKKyAgfQorICBpZiAobWtkaXIoYnVmZmVyLCAwNzU1KSA9PSAwKQorICAgIHsKKyAgICAgIGZyZWUoYnVmZmVyKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKworICBwID0gYnVmZmVyKzE7CisgIHdoaWxlICgxKQorICAgIHsKKyAgICAgIGNoYXIgaG9sZDsKKworICAgICAgd2hpbGUoKnAgJiYgKnAgIT0gJ1xcJyAmJiAqcCAhPSAnLycpCisgICAgICAgIHArKzsKKyAgICAgIGhvbGQgPSAqcDsKKyAgICAgICpwID0gMDsKKyAgICAgIGlmICgobWtkaXIoYnVmZmVyLCAwNzU1KSA9PSAtMSkgJiYgKGVycm5vID09IEVOT0VOVCkpCisgICAgICAgIHsKKyAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwiJXM6IENvdWxkbid0IGNyZWF0ZSBkaXJlY3RvcnkgJXNcbiIscHJvZyxidWZmZXIpOworICAgICAgICAgIGZyZWUoYnVmZmVyKTsKKyAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgaWYgKGhvbGQgPT0gMCkKKyAgICAgICAgYnJlYWs7CisgICAgICAqcCsrID0gaG9sZDsKKyAgICB9CisgIGZyZWUoYnVmZmVyKTsKKyAgcmV0dXJuIDE7Cit9CisKKworaW50IG1hdGNobmFtZSAoaW50IGFyZyxpbnQgYXJnYyxjaGFyICoqYXJndixjaGFyICpmbmFtZSkKK3sKKyAgaWYgKGFyZyA9PSBhcmdjKSAgICAgIC8qIG5vIGFyZ3VtZW50cyBnaXZlbiAodW50Z3ogdGd6YXJjaGl2ZSkgKi8KKyAgICByZXR1cm4gMTsKKworICB3aGlsZSAoYXJnIDwgYXJnYykKKyAgICBpZiAoRXhwck1hdGNoKGZuYW1lLGFyZ3ZbYXJnKytdKSkKKyAgICAgIHJldHVybiAxOworCisgIHJldHVybiAwOyAvKiBpZ25vcmUgdGhpcyBmb3IgdGhlIG1vbWVudCBiZWluZyAqLworfQorCisKKy8qIHRhciBmaWxlIGxpc3Qgb3IgZXh0cmFjdCAqLworCitpbnQgdGFyIChnekZpbGUgaW4saW50IGFjdGlvbixpbnQgYXJnLGludCBhcmdjLGNoYXIgKiphcmd2KQoreworICB1bmlvbiAgdGFyX2J1ZmZlciBidWZmZXI7CisgIGludCAgICBsZW47CisgIGludCAgICBlcnI7CisgIGludCAgICBnZXRoZWFkZXIgPSAxOworICBpbnQgICAgcmVtYWluaW5nID0gMDsKKyAgRklMRSAgICpvdXRmaWxlID0gTlVMTDsKKyAgY2hhciAgIGZuYW1lW0JMT0NLU0laRV07CisgIGludCAgICB0YXJtb2RlOworICB0aW1lX3QgdGFydGltZTsKKyAgc3RydWN0IGF0dHJfaXRlbSAqYXR0cmlidXRlcyA9IE5VTEw7CisKKyAgaWYgKGFjdGlvbiA9PSBUR1pfTElTVCkKKyAgICBwcmludGYoIiAgICBkYXRlICAgICAgdGltZSAgICAgc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgZmlsZVxuIgorICAgICAgICAgICAiIC0tLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworICB3aGlsZSAoMSkKKyAgICB7CisgICAgICBsZW4gPSBnenJlYWQoaW4sICZidWZmZXIsIEJMT0NLU0laRSk7CisgICAgICBpZiAobGVuIDwgMCkKKyAgICAgICAgZXJyb3IoZ3plcnJvcihpbiwgJmVycikpOworICAgICAgLyoKKyAgICAgICAqIEFsd2F5cyBleHBlY3QgY29tcGxldGUgYmxvY2tzIHRvIHByb2Nlc3MKKyAgICAgICAqIHRoZSB0YXIgaW5mb3JtYXRpb24uCisgICAgICAgKi8KKyAgICAgIGlmIChsZW4gIT0gQkxPQ0tTSVpFKQorICAgICAgICB7CisgICAgICAgICAgYWN0aW9uID0gVEdaX0lOVkFMSUQ7IC8qIGZvcmNlIGVycm9yIGV4aXQgKi8KKyAgICAgICAgICByZW1haW5pbmcgPSAwOyAgICAgICAgLyogZm9yY2UgSS9PIGNsZWFudXAgKi8KKyAgICAgICAgfQorCisgICAgICAvKgorICAgICAgICogSWYgd2UgaGF2ZSB0byBnZXQgYSB0YXIgaGVhZGVyCisgICAgICAgKi8KKyAgICAgIGlmIChnZXRoZWFkZXIgPj0gMSkKKyAgICAgICAgeworICAgICAgICAgIC8qCisgICAgICAgICAgICogaWYgd2UgbWV0IHRoZSBlbmQgb2YgdGhlIHRhcgorICAgICAgICAgICAqIG9yIHRoZSBlbmQtb2YtdGFyIGJsb2NrLAorICAgICAgICAgICAqIHdlIGFyZSBkb25lCisgICAgICAgICAgICovCisgICAgICAgICAgaWYgKGxlbiA9PSAwIHx8IGJ1ZmZlci5oZWFkZXIubmFtZVswXSA9PSAwKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICB0YXJtb2RlID0gZ2V0b2N0KGJ1ZmZlci5oZWFkZXIubW9kZSw4KTsKKyAgICAgICAgICB0YXJ0aW1lID0gKHRpbWVfdClnZXRvY3QoYnVmZmVyLmhlYWRlci5tdGltZSwxMik7CisgICAgICAgICAgaWYgKHRhcm1vZGUgPT0gLTEgfHwgdGFydGltZSA9PSAodGltZV90KS0xKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBidWZmZXIuaGVhZGVyLm5hbWVbMF0gPSAwOworICAgICAgICAgICAgICBhY3Rpb24gPSBUR1pfSU5WQUxJRDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChnZXRoZWFkZXIgPT0gMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgc3RybmNweShmbmFtZSxidWZmZXIuaGVhZGVyLm5hbWUsU0hPUlROQU1FU0laRSk7CisgICAgICAgICAgICAgIGlmIChmbmFtZVtTSE9SVE5BTUVTSVpFLTFdICE9IDApCisgICAgICAgICAgICAgICAgICBmbmFtZVtTSE9SVE5BTUVTSVpFXSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgKiBUaGUgZmlsZSBuYW1lIGlzIGxvbmdlciB0aGFuIFNIT1JUTkFNRVNJWkUKKyAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgIGlmIChzdHJuY21wKGZuYW1lLGJ1ZmZlci5oZWFkZXIubmFtZSxTSE9SVE5BTUVTSVpFLTEpICE9IDApCisgICAgICAgICAgICAgICAgICBlcnJvcigiYmFkIGxvbmcgbmFtZSIpOworICAgICAgICAgICAgICBnZXRoZWFkZXIgPSAxOworICAgICAgICAgICAgfQorCisgICAgICAgICAgLyoKKyAgICAgICAgICAgKiBBY3QgYWNjb3JkaW5nIHRvIHRoZSB0eXBlIGZsYWcKKyAgICAgICAgICAgKi8KKyAgICAgICAgICBzd2l0Y2ggKGJ1ZmZlci5oZWFkZXIudHlwZWZsYWcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlIERJUlRZUEU6CisgICAgICAgICAgICAgIGlmIChhY3Rpb24gPT0gVEdaX0xJU1QpCisgICAgICAgICAgICAgICAgcHJpbnRmKCIgJXMgICAgIDxkaXI+ICVzXG4iLHN0cnRpbWUoJnRhcnRpbWUpLGZuYW1lKTsKKyAgICAgICAgICAgICAgaWYgKGFjdGlvbiA9PSBUR1pfRVhUUkFDVCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBtYWtlZGlyKGZuYW1lKTsKKyAgICAgICAgICAgICAgICAgIHB1c2hfYXR0cigmYXR0cmlidXRlcyxmbmFtZSx0YXJtb2RlLHRhcnRpbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFJFR1RZUEU6CisgICAgICAgICAgICBjYXNlIEFSRUdUWVBFOgorICAgICAgICAgICAgICByZW1haW5pbmcgPSBnZXRvY3QoYnVmZmVyLmhlYWRlci5zaXplLDEyKTsKKyAgICAgICAgICAgICAgaWYgKHJlbWFpbmluZyA9PSAtMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBhY3Rpb24gPSBUR1pfSU5WQUxJRDsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgaWYgKGFjdGlvbiA9PSBUR1pfTElTVCkKKyAgICAgICAgICAgICAgICBwcmludGYoIiAlcyAlOWQgJXNcbiIsc3RydGltZSgmdGFydGltZSkscmVtYWluaW5nLGZuYW1lKTsKKyAgICAgICAgICAgICAgZWxzZSBpZiAoYWN0aW9uID09IFRHWl9FWFRSQUNUKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGlmIChtYXRjaG5hbWUoYXJnLGFyZ2MsYXJndixmbmFtZSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICBvdXRmaWxlID0gZm9wZW4oZm5hbWUsIndiIik7CisgICAgICAgICAgICAgICAgICAgICAgaWYgKG91dGZpbGUgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogdHJ5IGNyZWF0aW5nIGRpcmVjdG9yeSAqLworICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqcCA9IHN0cnJjaHIoZm5hbWUsICcvJyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICpwID0gJ1wwJzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZWRpcihmbmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICpwID0gJy8nOworICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRmaWxlID0gZm9wZW4oZm5hbWUsIndiIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgIGlmIChvdXRmaWxlICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIkV4dHJhY3RpbmcgJXNcbiIsZm5hbWUpOworICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IENvdWxkbid0IGNyZWF0ZSAlcyIscHJvZyxmbmFtZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgb3V0ZmlsZSA9IE5VTEw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBnZXRoZWFkZXIgPSAwOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgR05VVFlQRV9MT05HTElOSzoKKyAgICAgICAgICAgIGNhc2UgR05VVFlQRV9MT05HTkFNRToKKyAgICAgICAgICAgICAgcmVtYWluaW5nID0gZ2V0b2N0KGJ1ZmZlci5oZWFkZXIuc2l6ZSwxMik7CisgICAgICAgICAgICAgIGlmIChyZW1haW5pbmcgPCAwIHx8IHJlbWFpbmluZyA+PSBCTE9DS1NJWkUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgYWN0aW9uID0gVEdaX0lOVkFMSUQ7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGxlbiA9IGd6cmVhZChpbiwgZm5hbWUsIEJMT0NLU0laRSk7CisgICAgICAgICAgICAgIGlmIChsZW4gPCAwKQorICAgICAgICAgICAgICAgIGVycm9yKGd6ZXJyb3IoaW4sICZlcnIpKTsKKyAgICAgICAgICAgICAgaWYgKGZuYW1lW0JMT0NLU0laRS0xXSAhPSAwIHx8IChpbnQpc3RybGVuKGZuYW1lKSA+IHJlbWFpbmluZykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBhY3Rpb24gPSBUR1pfSU5WQUxJRDsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZ2V0aGVhZGVyID0gMjsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICBpZiAoYWN0aW9uID09IFRHWl9MSVNUKQorICAgICAgICAgICAgICAgIHByaW50ZigiICVzICAgICA8LS0tPiAlc1xuIixzdHJ0aW1lKCZ0YXJ0aW1lKSxmbmFtZSk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICB1bnNpZ25lZCBpbnQgYnl0ZXMgPSAocmVtYWluaW5nID4gQkxPQ0tTSVpFKSA/IEJMT0NLU0laRSA6IHJlbWFpbmluZzsKKworICAgICAgICAgIGlmIChvdXRmaWxlICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmIChmd3JpdGUoJmJ1ZmZlcixzaXplb2YoY2hhciksYnl0ZXMsb3V0ZmlsZSkgIT0gYnl0ZXMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAgICAgICAgICIlczogRXJyb3Igd3JpdGluZyAlcyAtLSBza2lwcGluZ1xuIixwcm9nLGZuYW1lKTsKKyAgICAgICAgICAgICAgICAgIGZjbG9zZShvdXRmaWxlKTsKKyAgICAgICAgICAgICAgICAgIG91dGZpbGUgPSBOVUxMOworICAgICAgICAgICAgICAgICAgcmVtb3ZlKGZuYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgcmVtYWluaW5nIC09IGJ5dGVzOworICAgICAgICB9CisKKyAgICAgIGlmIChyZW1haW5pbmcgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgIGdldGhlYWRlciA9IDE7CisgICAgICAgICAgaWYgKG91dGZpbGUgIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZmNsb3NlKG91dGZpbGUpOworICAgICAgICAgICAgICBvdXRmaWxlID0gTlVMTDsKKyAgICAgICAgICAgICAgaWYgKGFjdGlvbiAhPSBUR1pfSU5WQUxJRCkKKyAgICAgICAgICAgICAgICBwdXNoX2F0dHIoJmF0dHJpYnV0ZXMsZm5hbWUsdGFybW9kZSx0YXJ0aW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAvKgorICAgICAgICogQWJhbmRvbiBpZiBlcnJvcnMgYXJlIGZvdW5kCisgICAgICAgKi8KKyAgICAgIGlmIChhY3Rpb24gPT0gVEdaX0lOVkFMSUQpCisgICAgICAgIHsKKyAgICAgICAgICBlcnJvcigiYnJva2VuIGFyY2hpdmUiKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAvKgorICAgKiBSZXN0b3JlIGZpbGUgbW9kZXMgYW5kIHRpbWUgc3RhbXBzCisgICAqLworICByZXN0b3JlX2F0dHIoJmF0dHJpYnV0ZXMpOworCisgIGlmIChnemNsb3NlKGluKSAhPSBaX09LKQorICAgIGVycm9yKCJmYWlsZWQgZ3pjbG9zZSIpOworCisgIHJldHVybiAwOworfQorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCit2b2lkIGhlbHAoaW50IGV4aXR2YWwpCit7CisgIHByaW50ZigidW50Z3ogdmVyc2lvbiAwLjIuMVxuIgorICAgICAgICAgIiAgdXNpbmcgemxpYiB2ZXJzaW9uICVzXG5cbiIsCisgICAgICAgICB6bGliVmVyc2lvbigpKTsKKyAgcHJpbnRmKCJVc2FnZTogdW50Z3ogZmlsZS50Z3ogICAgICAgICAgICBleHRyYWN0IGFsbCBmaWxlc1xuIgorICAgICAgICAgIiAgICAgICB1bnRneiBmaWxlLnRneiBmbmFtZSAuLi4gIGV4dHJhY3Qgc2VsZWN0ZWQgZmlsZXNcbiIKKyAgICAgICAgICIgICAgICAgdW50Z3ogLWwgZmlsZS50Z3ogICAgICAgICBsaXN0IGFyY2hpdmUgY29udGVudHNcbiIKKyAgICAgICAgICIgICAgICAgdW50Z3ogLWggICAgICAgICAgICAgICAgICBkaXNwbGF5IHRoaXMgaGVscFxuIik7CisgIGV4aXQoZXhpdHZhbCk7Cit9CisKK3ZvaWQgZXJyb3IoY29uc3QgY2hhciAqbXNnKQoreworICBmcHJpbnRmKHN0ZGVyciwgIiVzOiAlc1xuIiwgcHJvZywgbXNnKTsKKyAgZXhpdCgxKTsKK30KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworI2lmIGRlZmluZWQoV0lOMzIpICYmIGRlZmluZWQoX19HTlVDX18pCitpbnQgX0NSVF9nbG9iID0gMDsgICAgICAvKiBkaXNhYmxlIGFyZ3VtZW50IGdsb2JiaW5nIGluIE1pbkdXICovCisjZW5kaWYKKworaW50IG1haW4oaW50IGFyZ2MsY2hhciAqKmFyZ3YpCit7CisgICAgaW50ICAgICAgICAgYWN0aW9uID0gVEdaX0VYVFJBQ1Q7CisgICAgaW50ICAgICAgICAgYXJnID0gMTsKKyAgICBjaGFyICAgICAgICAqVEdaZmlsZTsKKyAgICBnekZpbGUgICAgICAqZjsKKworICAgIHByb2cgPSBzdHJyY2hyKGFyZ3ZbMF0sJ1xcJyk7CisgICAgaWYgKHByb2cgPT0gTlVMTCkKKyAgICAgIHsKKyAgICAgICAgcHJvZyA9IHN0cnJjaHIoYXJndlswXSwnLycpOworICAgICAgICBpZiAocHJvZyA9PSBOVUxMKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHByb2cgPSBzdHJyY2hyKGFyZ3ZbMF0sJzonKTsKKyAgICAgICAgICAgIGlmIChwcm9nID09IE5VTEwpCisgICAgICAgICAgICAgIHByb2cgPSBhcmd2WzBdOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBwcm9nKys7CisgICAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgcHJvZysrOworICAgICAgfQorICAgIGVsc2UKKyAgICAgIHByb2crKzsKKworICAgIGlmIChhcmdjID09IDEpCisgICAgICBoZWxwKDApOworCisgICAgaWYgKHN0cmNtcChhcmd2W2FyZ10sIi1sIikgPT0gMCkKKyAgICAgIHsKKyAgICAgICAgYWN0aW9uID0gVEdaX0xJU1Q7CisgICAgICAgIGlmIChhcmdjID09ICsrYXJnKQorICAgICAgICAgIGhlbHAoMCk7CisgICAgICB9CisgICAgZWxzZSBpZiAoc3RyY21wKGFyZ3ZbYXJnXSwiLWgiKSA9PSAwKQorICAgICAgeworICAgICAgICBoZWxwKDApOworICAgICAgfQorCisgICAgaWYgKChUR1pmaWxlID0gVEdaZm5hbWUoYXJndlthcmddKSkgPT0gTlVMTCkKKyAgICAgIFRHWm5vdGZvdW5kKGFyZ3ZbYXJnXSk7CisKKyAgICArK2FyZzsKKyAgICBpZiAoKGFjdGlvbiA9PSBUR1pfTElTVCkgJiYgKGFyZyAhPSBhcmdjKSkKKyAgICAgIGhlbHAoMSk7CisKKy8qCisgKiAgUHJvY2VzcyB0aGUgVEdaIGZpbGUKKyAqLworICAgIHN3aXRjaChhY3Rpb24pCisgICAgICB7CisgICAgICBjYXNlIFRHWl9MSVNUOgorICAgICAgY2FzZSBUR1pfRVhUUkFDVDoKKyAgICAgICAgZiA9IGd6b3BlbihUR1pmaWxlLCJyYiIpOworICAgICAgICBpZiAoZiA9PSBOVUxMKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCIlczogQ291bGRuJ3QgZ3pvcGVuICVzXG4iLHByb2csVEdaZmlsZSk7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICB9CisgICAgICAgIGV4aXQodGFyKGYsIGFjdGlvbiwgYXJnLCBhcmdjLCBhcmd2KSk7CisgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgZXJyb3IoIlVua25vd24gb3B0aW9uIik7CisgICAgICAgIGV4aXQoMSk7CisgICAgICB9CisKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3psaWItMS4yLjYvY29udHJpYi92c3R1ZGlvL3JlYWRtZS50eHQgYi96bGliLTEuMi42L2NvbnRyaWIvdnN0dWRpby9yZWFkbWUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwNDg4OGIKLS0tIC9kZXYvbnVsbAorKysgYi96bGliLTEuMi42L2NvbnRyaWIvdnN0dWRpby9yZWFkbWUudHh0CkBAIC0wLDAgKzEsNjAgQEAKK0J1aWxkaW5nIGluc3RydWN0aW9ucyBmb3IgdGhlIERMTCB2ZXJzaW9ucyBvZiBabGliIDEuMi40DQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCisNCitUaGlzIGRpcmVjdG9yeSBjb250YWlucyBwcm9qZWN0cyB0aGF0IGJ1aWxkIHpsaWIgYW5kIG1pbml6aXAgdXNpbmcNCitNaWNyb3NvZnQgVmlzdWFsIEMrKyA5LjAvMTAuMCwgYW5kIFZpc3VhbCBDKysgLg0KKw0KK1lvdSBkb24ndCBuZWVkIHRvIGJ1aWxkIHRoZXNlIHByb2plY3RzIHlvdXJzZWxmLiBZb3UgY2FuIGRvd25sb2FkIHRoZQ0KK2JpbmFyaWVzIGZyb206DQorICBodHRwOi8vd3d3LndpbmltYWdlLmNvbS96TGliRGxsDQorDQorTW9yZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgYXQgdGhpcyBzaXRlLg0KKw0KK2ZpcnN0IGNvbXBpbGUgYXNzZW1ibHkgY29kZSBieSBydW5uaW5nDQorYmxkX21sNjQuYmF0IGluIGNvbnRyaWJcbWFzbXg2NA0KK2JsZF9tbDMyLmJhdCBpbiBjb250cmliXG1hc214ODYNCisNCisNCisNCisNCitCdWlsZCBpbnN0cnVjdGlvbnMgZm9yIFZpc3VhbCBTdHVkaW8gMjAwOCAoMzIgYml0cyBvciA2NCBiaXRzKQ0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorLSBVbmNvbXByZXNzIGN1cnJlbnQgemxpYiwgaW5jbHVkaW5nIGFsbCBjb250cmliLyogZmlsZXMNCistIE9wZW4gY29udHJpYlx2c3R1ZGlvXHZjOVx6bGlidmMuc2xuIHdpdGggTWljcm9zb2Z0IFZpc3VhbCBDKysgMjAwOC4wDQorLSBPciBydW46IHZjYnVpbGQgL3JlYnVpbGQgY29udHJpYlx2c3R1ZGlvXHZjOVx6bGlidmMuc2xuICJSZWxlYXNlfFdpbjMyIg0KKw0KK0J1aWxkIGluc3RydWN0aW9ucyBmb3IgVmlzdWFsIFN0dWRpbyAyMDEwICgzMiBiaXRzIG9yIDY0IGJpdHMpDQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCistIFVuY29tcHJlc3MgY3VycmVudCB6bGliLCBpbmNsdWRpbmcgYWxsIGNvbnRyaWIvKiBmaWxlcw0KKy0gT3BlbiBjb250cmliXHZzdHVkaW9cdmMxMFx6bGlidmMuc2xuIHdpdGggTWljcm9zb2Z0IFZpc3VhbCBDKysgMjAxMC4wDQorDQorDQorSW1wb3J0YW50DQorLS0tLS0tLS0tDQorLSBUbyB1c2UgemxpYndhcGkuZGxsIGluIHlvdXIgYXBwbGljYXRpb24sIHlvdSBtdXN0IGRlZmluZSB0aGUNCisgIG1hY3JvIFpMSUJfV0lOQVBJIHdoZW4gY29tcGlsaW5nIHlvdXIgYXBwbGljYXRpb24ncyBzb3VyY2UgZmlsZXMuDQorDQorDQorQWRkaXRpb25hbCBub3Rlcw0KKy0tLS0tLS0tLS0tLS0tLS0NCistIFRoaXMgRExMLCBuYW1lZCB6bGlid2FwaS5kbGwsIGlzIGNvbXBhdGlibGUgdG8gdGhlIG9sZCB6bGliLmRsbCBidWlsdA0KKyAgYnkgR2lsbGVzIFZvbGxhbnQgZnJvbSB0aGUgemxpYiAxLjEueCBzb3VyY2VzLCBhbmQgZGlzdHJpYnV0ZWQgYXQNCisgICAgaHR0cDovL3d3dy53aW5pbWFnZS5jb20vekxpYkRsbA0KKyAgSXQgdXNlcyB0aGUgV0lOQVBJIGNhbGxpbmcgY29udmVudGlvbiBmb3IgdGhlIGV4cG9ydGVkIGZ1bmN0aW9ucywgYW5kDQorICBpbmNsdWRlcyB0aGUgbWluaXppcCBmdW5jdGlvbmFsaXR5LiBJZiB5b3VyIGFwcGxpY2F0aW9uIG5lZWRzIHRoYXQNCisgIHBhcnRpY3VsYXIgYnVpbGQgb2YgemxpYi5kbGwsIHlvdSBjYW4gcmVuYW1lIHpsaWJ3YXBpLmRsbCB0byB6bGliLmRsbC4NCisNCistIFRoZSBuZXcgRExMIHdhcyByZW5hbWVkIGJlY2F1c2UgdGhlcmUgZXhpc3Qgc2V2ZXJhbCBpbmNvbXBhdGlibGUNCisgIHZlcnNpb25zIG9mIHpsaWIuZGxsIG9uIHRoZSBJbnRlcm5ldC4NCisNCistIFRoZXJlIGlzIGFsc28gYW4gb2ZmaWNpYWwgRExMIGJ1aWxkIG9mIHpsaWIsIG5hbWVkIHpsaWIxLmRsbC4gVGhpcyBvbmUNCisgIGlzIGV4cG9ydGluZyB0aGUgZnVuY3Rpb25zIHVzaW5nIHRoZSBDREVDTCBjb252ZW50aW9uLiBTZWUgdGhlIGZpbGUNCisgIHdpbjMyXERMTF9GQVEudHh0IGZvdW5kIGluIHRoaXMgemxpYiBkaXN0cmlidXRpb24uDQorDQorLSBUaGVyZSB1c2VkIHRvIGJlIGEgWkxJQl9ETEwgbWFjcm8gaW4gemxpYiAxLjEueCwgYnV0IG5vdyB0aGlzIHN5bWJvbA0KKyAgaGFzIGEgc2xpZ2h0bHkgZGlmZmVyZW50IGVmZmVjdC4gVG8gYXZvaWQgY29tcGF0aWJpbGl0eSBwcm9ibGVtcywgZG8NCisgIG5vdCBkZWZpbmUgaXQgaGVyZS4NCisNCisNCitHaWxsZXMgVm9sbGFudA0KK2luZm9Ad2luaW1hZ2UuY29tDQpkaWZmIC0tZ2l0IGEvemxpYi0xLjIuNi9jb250cmliL3ZzdHVkaW8vdmMxMC9taW5pdW56LnZjeHByb2ogYi96bGliLTEuMi42L2NvbnRyaWIvdnN0dWRpby92YzEwL21pbml1bnoudmN4cHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGUxNWM5Ci0tLSAvZGV2L251bGwKKysrIGIvemxpYi0xLjIuNi9jb250cmliL3ZzdHVkaW8vdmMxMC9taW5pdW56LnZjeHByb2oKQEAgLTAsMCArMSwzMTAgQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQorPFByb2plY3QgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiBUb29sc1ZlcnNpb249IjQuMCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+DQorICA8SXRlbUdyb3VwIExhYmVsPSJQcm9qZWN0Q29uZmlndXJhdGlvbnMiPg0KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iRGVidWd8SXRhbml1bSI+DQorICAgICAgPENvbmZpZ3VyYXRpb24+RGVidWc8L0NvbmZpZ3VyYXRpb24+DQorICAgICAgPFBsYXRmb3JtPkl0YW5pdW08L1BsYXRmb3JtPg0KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPg0KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iRGVidWd8V2luMzIiPg0KKyAgICAgIDxDb25maWd1cmF0aW9uPkRlYnVnPC9Db25maWd1cmF0aW9uPg0KKyAgICAgIDxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+DQorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+DQorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJEZWJ1Z3x4NjQiPg0KKyAgICAgIDxDb25maWd1cmF0aW9uPkRlYnVnPC9Db25maWd1cmF0aW9uPg0KKyAgICAgIDxQbGF0Zm9ybT54NjQ8L1BsYXRmb3JtPg0KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPg0KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUmVsZWFzZXxJdGFuaXVtIj4NCisgICAgICA8Q29uZmlndXJhdGlvbj5SZWxlYXNlPC9Db25maWd1cmF0aW9uPg0KKyAgICAgIDxQbGF0Zm9ybT5JdGFuaXVtPC9QbGF0Zm9ybT4NCisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4NCisgICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IlJlbGVhc2V8V2luMzIiPg0KKyAgICAgIDxDb25maWd1cmF0aW9uPlJlbGVhc2U8L0NvbmZpZ3VyYXRpb24+DQorICAgICAgPFBsYXRmb3JtPldpbjMyPC9QbGF0Zm9ybT4NCisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4NCisgICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IlJlbGVhc2V8eDY0Ij4NCisgICAgICA8Q29uZmlndXJhdGlvbj5SZWxlYXNlPC9Db25maWd1cmF0aW9uPg0KKyAgICAgIDxQbGF0Zm9ybT54NjQ8L1BsYXRmb3JtPg0KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBMYWJlbD0iR2xvYmFscyI+DQorICAgIDxQcm9qZWN0R3VpZD57QzUyRjlFN0ItNDk4QS00MkJFLThEQjQtODVBMTU2OTQzODJBfTwvUHJvamVjdEd1aWQ+DQorICAgIDxLZXl3b3JkPldpbjMyUHJvajwvS2V5d29yZD4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLkRlZmF1bHQucHJvcHMiIC8+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+DQorICAgIDxDb25maWd1cmF0aW9uVHlwZT5BcHBsaWNhdGlvbjwvQ29uZmlndXJhdGlvblR5cGU+DQorICAgIDxDaGFyYWN0ZXJTZXQ+TXVsdGlCeXRlPC9DaGFyYWN0ZXJTZXQ+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPg0KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+QXBwbGljYXRpb248L0NvbmZpZ3VyYXRpb25UeXBlPg0KKyAgICA8Q2hhcmFjdGVyU2V0Pk11bHRpQnl0ZTwvQ2hhcmFjdGVyU2V0Pg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfEl0YW5pdW0nIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+DQorICAgIDxDb25maWd1cmF0aW9uVHlwZT5BcHBsaWNhdGlvbjwvQ29uZmlndXJhdGlvblR5cGU+DQorICAgIDxDaGFyYWN0ZXJTZXQ+TXVsdGlCeXRlPC9DaGFyYWN0ZXJTZXQ+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfEl0YW5pdW0nIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+DQorICAgIDxDb25maWd1cmF0aW9uVHlwZT5BcHBsaWNhdGlvbjwvQ29uZmlndXJhdGlvblR5cGU+DQorICAgIDxDaGFyYWN0ZXJTZXQ+TXVsdGlCeXRlPC9DaGFyYWN0ZXJTZXQ+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPg0KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+QXBwbGljYXRpb248L0NvbmZpZ3VyYXRpb25UeXBlPg0KKyAgICA8Q2hhcmFjdGVyU2V0Pk11bHRpQnl0ZTwvQ2hhcmFjdGVyU2V0Pg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+DQorICAgIDxDb25maWd1cmF0aW9uVHlwZT5BcHBsaWNhdGlvbjwvQ29uZmlndXJhdGlvblR5cGU+DQorICAgIDxDaGFyYWN0ZXJTZXQ+TXVsdGlCeXRlPC9DaGFyYWN0ZXJTZXQ+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClcTWljcm9zb2Z0LkNwcC5wcm9wcyIgLz4NCisgIDxJbXBvcnRHcm91cCBMYWJlbD0iRXh0ZW5zaW9uU2V0dGluZ3MiPg0KKyAgPC9JbXBvcnRHcm91cD4NCisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPg0KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+DQorICA8L0ltcG9ydEdyb3VwPg0KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPg0KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+DQorICA8L0ltcG9ydEdyb3VwPg0KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxJdGFuaXVtJyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4NCisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPg0KKyAgPC9JbXBvcnRHcm91cD4NCisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfEl0YW5pdW0nIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPg0KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+DQorICA8L0ltcG9ydEdyb3VwPg0KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPg0KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+DQorICA8L0ltcG9ydEdyb3VwPg0KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4NCisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPg0KKyAgPC9JbXBvcnRHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIExhYmVsPSJVc2VyTWFjcm9zIiAvPg0KKyAgPFByb3BlcnR5R3JvdXA+DQorICAgIDxfUHJvamVjdEZpbGVWZXJzaW9uPjEwLjAuMzAxMjguMTwvX1Byb2plY3RGaWxlVmVyc2lvbj4NCisgICAgPE91dERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+eDg2XE1pbmlVbnppcCQoQ29uZmlndXJhdGlvbilcPC9PdXREaXI+DQorICAgIDxJbnREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPng4NlxNaW5pVW56aXAkKENvbmZpZ3VyYXRpb24pXFRtcFw8L0ludERpcj4NCisgICAgPExpbmtJbmNyZW1lbnRhbCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+dHJ1ZTwvTGlua0luY3JlbWVudGFsPg0KKyAgICA8R2VuZXJhdGVNYW5pZmVzdCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+ZmFsc2U8L0dlbmVyYXRlTWFuaWZlc3Q+DQorICAgIDxPdXREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+eDg2XE1pbmlVbnppcCQoQ29uZmlndXJhdGlvbilcPC9PdXREaXI+DQorICAgIDxJbnREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+eDg2XE1pbmlVbnppcCQoQ29uZmlndXJhdGlvbilcVG1wXDwvSW50RGlyPg0KKyAgICA8TGlua0luY3JlbWVudGFsIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPmZhbHNlPC9MaW5rSW5jcmVtZW50YWw+DQorICAgIDxHZW5lcmF0ZU1hbmlmZXN0IENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPmZhbHNlPC9HZW5lcmF0ZU1hbmlmZXN0Pg0KKyAgICA8T3V0RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+eDY0XE1pbmlVbnppcCQoQ29uZmlndXJhdGlvbilcPC9PdXREaXI+DQorICAgIDxJbnREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj54NjRcTWluaVVuemlwJChDb25maWd1cmF0aW9uKVxUbXBcPC9JbnREaXI+DQorICAgIDxMaW5rSW5jcmVtZW50YWwgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj50cnVlPC9MaW5rSW5jcmVtZW50YWw+DQorICAgIDxHZW5lcmF0ZU1hbmlmZXN0IENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+ZmFsc2U8L0dlbmVyYXRlTWFuaWZlc3Q+DQorICAgIDxPdXREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xJdGFuaXVtJyI+aWE2NFxNaW5pVW56aXAkKENvbmZpZ3VyYXRpb24pXDwvT3V0RGlyPg0KKyAgICA8SW50RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8SXRhbml1bSciPmlhNjRcTWluaVVuemlwJChDb25maWd1cmF0aW9uKVxUbXBcPC9JbnREaXI+DQorICAgIDxMaW5rSW5jcmVtZW50YWwgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xJdGFuaXVtJyI+dHJ1ZTwvTGlua0luY3JlbWVudGFsPg0KKyAgICA8R2VuZXJhdGVNYW5pZmVzdCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfEl0YW5pdW0nIj5mYWxzZTwvR2VuZXJhdGVNYW5pZmVzdD4NCisgICAgPE91dERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+eDY0XE1pbmlVbnppcCQoQ29uZmlndXJhdGlvbilcPC9PdXREaXI+DQorICAgIDxJbnREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciPng2NFxNaW5pVW56aXAkKENvbmZpZ3VyYXRpb24pXFRtcFw8L0ludERpcj4NCisgICAgPExpbmtJbmNyZW1lbnRhbCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+ZmFsc2U8L0xpbmtJbmNyZW1lbnRhbD4NCisgICAgPEdlbmVyYXRlTWFuaWZlc3QgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciPmZhbHNlPC9HZW5lcmF0ZU1hbmlmZXN0Pg0KKyAgICA8T3V0RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxJdGFuaXVtJyI+aWE2NFxNaW5pVW56aXAkKENvbmZpZ3VyYXRpb24pXDwvT3V0RGlyPg0KKyAgICA8SW50RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxJdGFuaXVtJyI+aWE2NFxNaW5pVW56aXAkKENvbmZpZ3VyYXRpb24pXFRtcFw8L0ludERpcj4NCisgICAgPExpbmtJbmNyZW1lbnRhbCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8SXRhbml1bSciPmZhbHNlPC9MaW5rSW5jcmVtZW50YWw+DQorICAgIDxHZW5lcmF0ZU1hbmlmZXN0IENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxJdGFuaXVtJyI+ZmFsc2U8L0dlbmVyYXRlTWFuaWZlc3Q+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlU2V0IENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8SXRhbml1bSciPkFsbFJ1bGVzLnJ1bGVzZXQ8L0NvZGVBbmFseXNpc1J1bGVTZXQ+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfEl0YW5pdW0nIiAvPg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZUFzc2VtYmxpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xJdGFuaXVtJyIgLz4NCisgICAgPENvZGVBbmFseXNpc1J1bGVTZXQgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPkFsbFJ1bGVzLnJ1bGVzZXQ8L0NvZGVBbmFseXNpc1J1bGVTZXQ+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyIgLz4NCisgICAgPENvZGVBbmFseXNpc1J1bGVBc3NlbWJsaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIiAvPg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZVNldCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciPkFsbFJ1bGVzLnJ1bGVzZXQ8L0NvZGVBbmFseXNpc1J1bGVTZXQ+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciIC8+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlQXNzZW1ibGllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciIC8+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlU2V0IENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxJdGFuaXVtJyI+QWxsUnVsZXMucnVsZXNldDwvQ29kZUFuYWx5c2lzUnVsZVNldD4NCisgICAgPENvZGVBbmFseXNpc1J1bGVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxJdGFuaXVtJyIgLz4NCisgICAgPENvZGVBbmFseXNpc1J1bGVBc3NlbWJsaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxJdGFuaXVtJyIgLz4NCisgICAgPENvZGVBbmFseXNpc1J1bGVTZXQgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+QWxsUnVsZXMucnVsZXNldDwvQ29kZUFuYWx5c2lzUnVsZVNldD4NCisgICAgPENvZGVBbmFseXNpc1J1bGVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciIC8+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlQXNzZW1ibGllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIiAvPg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZVNldCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+QWxsUnVsZXMucnVsZXNldDwvQ29kZUFuYWx5c2lzUnVsZVNldD4NCisgICAgPENvZGVBbmFseXNpc1J1bGVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIiAvPg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZUFzc2VtYmxpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciIC8+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+DQorICAgIDxDbENvbXBpbGU+DQorICAgICAgPE9wdGltaXphdGlvbj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPi4uXC4uXC4uOy4uXC4uXG1pbml6aXA7JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+V0lOMzI7X0NSVF9OT05TVERDX05PX0RFUFJFQ0FURTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7WkxJQl9XSU5BUEk7X0RFQlVHO19DT05TT0xFOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8TWluaW1hbFJlYnVpbGQ+dHJ1ZTwvTWluaW1hbFJlYnVpbGQ+DQorICAgICAgPEJhc2ljUnVudGltZUNoZWNrcz5EZWZhdWx0PC9CYXNpY1J1bnRpbWVDaGVja3M+DQorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWREZWJ1ZzwvUnVudGltZUxpYnJhcnk+DQorICAgICAgPEJ1ZmZlclNlY3VyaXR5Q2hlY2s+ZmFsc2U8L0J1ZmZlclNlY3VyaXR5Q2hlY2s+DQorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDwvUHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPEFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj4kKEludERpcik8L0Fzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj4NCisgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPg0KKyAgICAgIDxEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PkVkaXRBbmRDb250aW51ZTwvRGVidWdJbmZvcm1hdGlvbkZvcm1hdD4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxMaW5rPg0KKyAgICAgIDxBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPng4NlxabGliRGxsRGVidWdcemxpYndhcGkubGliOyUoQWRkaXRpb25hbERlcGVuZGVuY2llcyk8L0FkZGl0aW9uYWxEZXBlbmRlbmNpZXM+DQorICAgICAgPE91dHB1dEZpbGU+JChPdXREaXIpbWluaXVuei5leGU8L091dHB1dEZpbGU+DQorICAgICAgPEdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj50cnVlPC9HZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+DQorICAgICAgPFByb2dyYW1EYXRhYmFzZUZpbGU+JChPdXREaXIpbWluaXVuei5wZGI8L1Byb2dyYW1EYXRhYmFzZUZpbGU+DQorICAgICAgPFN1YlN5c3RlbT5Db25zb2xlPC9TdWJTeXN0ZW0+DQorICAgICAgPFJhbmRvbWl6ZWRCYXNlQWRkcmVzcz5mYWxzZTwvUmFuZG9taXplZEJhc2VBZGRyZXNzPg0KKyAgICAgIDxEYXRhRXhlY3V0aW9uUHJldmVudGlvbj4NCisgICAgICA8L0RhdGFFeGVjdXRpb25QcmV2ZW50aW9uPg0KKyAgICAgIDxUYXJnZXRNYWNoaW5lPk1hY2hpbmVYODY8L1RhcmdldE1hY2hpbmU+DQorICAgIDwvTGluaz4NCisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4NCisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPg0KKyAgICA8Q2xDb21waWxlPg0KKyAgICAgIDxPcHRpbWl6YXRpb24+TWF4U3BlZWQ8L09wdGltaXphdGlvbj4NCisgICAgICA8SW5saW5lRnVuY3Rpb25FeHBhbnNpb24+T25seUV4cGxpY2l0SW5saW5lPC9JbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj4NCisgICAgICA8T21pdEZyYW1lUG9pbnRlcnM+dHJ1ZTwvT21pdEZyYW1lUG9pbnRlcnM+DQorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+Li5cLi5cLi47Li5cLi5cbWluaXppcDslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5XSU4zMjtfQ1JUX05PTlNURENfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtaTElCX1dJTkFQSTtOREVCVUc7X0NPTlNPTEU7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KKyAgICAgIDxTdHJpbmdQb29saW5nPnRydWU8L1N0cmluZ1Bvb2xpbmc+DQorICAgICAgPEJhc2ljUnVudGltZUNoZWNrcz5EZWZhdWx0PC9CYXNpY1J1bnRpbWVDaGVja3M+DQorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWQ8L1J1bnRpbWVMaWJyYXJ5Pg0KKyAgICAgIDxCdWZmZXJTZWN1cml0eUNoZWNrPmZhbHNlPC9CdWZmZXJTZWN1cml0eUNoZWNrPg0KKyAgICAgIDxGdW5jdGlvbkxldmVsTGlua2luZz50cnVlPC9GdW5jdGlvbkxldmVsTGlua2luZz4NCisgICAgICA8UHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPC9QcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8QXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPiQoSW50RGlyKTwvQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPg0KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+DQorICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+UHJvZ3JhbURhdGFiYXNlPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0Pg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPExpbms+DQorICAgICAgPEFkZGl0aW9uYWxEZXBlbmRlbmNpZXM+eDg2XFpsaWJEbGxSZWxlYXNlXHpsaWJ3YXBpLmxpYjslKEFkZGl0aW9uYWxEZXBlbmRlbmNpZXMpPC9BZGRpdGlvbmFsRGVwZW5kZW5jaWVzPg0KKyAgICAgIDxPdXRwdXRGaWxlPiQoT3V0RGlyKW1pbml1bnouZXhlPC9PdXRwdXRGaWxlPg0KKyAgICAgIDxHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+dHJ1ZTwvR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPg0KKyAgICAgIDxTdWJTeXN0ZW0+Q29uc29sZTwvU3ViU3lzdGVtPg0KKyAgICAgIDxPcHRpbWl6ZVJlZmVyZW5jZXM+dHJ1ZTwvT3B0aW1pemVSZWZlcmVuY2VzPg0KKyAgICAgIDxFbmFibGVDT01EQVRGb2xkaW5nPnRydWU8L0VuYWJsZUNPTURBVEZvbGRpbmc+DQorICAgICAgPFJhbmRvbWl6ZWRCYXNlQWRkcmVzcz5mYWxzZTwvUmFuZG9taXplZEJhc2VBZGRyZXNzPg0KKyAgICAgIDxEYXRhRXhlY3V0aW9uUHJldmVudGlvbj4NCisgICAgICA8L0RhdGFFeGVjdXRpb25QcmV2ZW50aW9uPg0KKyAgICAgIDxUYXJnZXRNYWNoaW5lPk1hY2hpbmVYODY8L1RhcmdldE1hY2hpbmU+DQorICAgIDwvTGluaz4NCisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4NCisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+DQorICAgIDxNaWRsPg0KKyAgICAgIDxUYXJnZXRFbnZpcm9ubWVudD5YNjQ8L1RhcmdldEVudmlyb25tZW50Pg0KKyAgICA8L01pZGw+DQorICAgIDxDbENvbXBpbGU+DQorICAgICAgPE9wdGltaXphdGlvbj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPi4uXC4uXC4uOy4uXC4uXG1pbml6aXA7JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+X0NSVF9OT05TVERDX05PX0RFUFJFQ0FURTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7WkxJQl9XSU5BUEk7X0RFQlVHO19DT05TT0xFO1dJTjY0OyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8TWluaW1hbFJlYnVpbGQ+dHJ1ZTwvTWluaW1hbFJlYnVpbGQ+DQorICAgICAgPEJhc2ljUnVudGltZUNoZWNrcz5EZWZhdWx0PC9CYXNpY1J1bnRpbWVDaGVja3M+DQorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWREZWJ1Z0RMTDwvUnVudGltZUxpYnJhcnk+DQorICAgICAgPEJ1ZmZlclNlY3VyaXR5Q2hlY2s+ZmFsc2U8L0J1ZmZlclNlY3VyaXR5Q2hlY2s+DQorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDwvUHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPEFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj4kKEludERpcik8L0Fzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj4NCisgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPg0KKyAgICAgIDxEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PlByb2dyYW1EYXRhYmFzZTwvRGVidWdJbmZvcm1hdGlvbkZvcm1hdD4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxMaW5rPg0KKyAgICAgIDxBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPng2NFxabGliRGxsRGVidWdcemxpYndhcGkubGliOyUoQWRkaXRpb25hbERlcGVuZGVuY2llcyk8L0FkZGl0aW9uYWxEZXBlbmRlbmNpZXM+DQorICAgICAgPE91dHB1dEZpbGU+JChPdXREaXIpbWluaXVuei5leGU8L091dHB1dEZpbGU+DQorICAgICAgPEdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj50cnVlPC9HZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+DQorICAgICAgPFByb2dyYW1EYXRhYmFzZUZpbGU+JChPdXREaXIpbWluaXVuei5wZGI8L1Byb2dyYW1EYXRhYmFzZUZpbGU+DQorICAgICAgPFN1YlN5c3RlbT5Db25zb2xlPC9TdWJTeXN0ZW0+DQorICAgICAgPFRhcmdldE1hY2hpbmU+TWFjaGluZVg2NDwvVGFyZ2V0TWFjaGluZT4NCisgICAgPC9MaW5rPg0KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPg0KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xJdGFuaXVtJyI+DQorICAgIDxNaWRsPg0KKyAgICAgIDxUYXJnZXRFbnZpcm9ubWVudD5JdGFuaXVtPC9UYXJnZXRFbnZpcm9ubWVudD4NCisgICAgPC9NaWRsPg0KKyAgICA8Q2xDb21waWxlPg0KKyAgICAgIDxPcHRpbWl6YXRpb24+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4NCisgICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4uLlwuLlwuLjsuLlwuLlxtaW5pemlwOyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPl9DUlRfTk9OU1REQ19OT19ERVBSRUNBVEU7X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFO1pMSUJfV0lOQVBJO19ERUJVRztfQ09OU09MRTtXSU42NDslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPE1pbmltYWxSZWJ1aWxkPnRydWU8L01pbmltYWxSZWJ1aWxkPg0KKyAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3M+RGVmYXVsdDwvQmFzaWNSdW50aW1lQ2hlY2tzPg0KKyAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkRGVidWdETEw8L1J1bnRpbWVMaWJyYXJ5Pg0KKyAgICAgIDxCdWZmZXJTZWN1cml0eUNoZWNrPmZhbHNlPC9CdWZmZXJTZWN1cml0eUNoZWNrPg0KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8L1ByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDxBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb24+JChJbnREaXIpPC9Bc3NlbWJsZXJMaXN0aW5nTG9jYXRpb24+DQorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4NCisgICAgICA8RGVidWdJbmZvcm1hdGlvbkZvcm1hdD5Qcm9ncmFtRGF0YWJhc2U8L0RlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8TGluaz4NCisgICAgICA8QWRkaXRpb25hbERlcGVuZGVuY2llcz5pYTY0XFpsaWJEbGxEZWJ1Z1x6bGlid2FwaS5saWI7JShBZGRpdGlvbmFsRGVwZW5kZW5jaWVzKTwvQWRkaXRpb25hbERlcGVuZGVuY2llcz4NCisgICAgICA8T3V0cHV0RmlsZT4kKE91dERpciltaW5pdW56LmV4ZTwvT3V0cHV0RmlsZT4NCisgICAgICA8R2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPnRydWU8L0dlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj4NCisgICAgICA8UHJvZ3JhbURhdGFiYXNlRmlsZT4kKE91dERpciltaW5pdW56LnBkYjwvUHJvZ3JhbURhdGFiYXNlRmlsZT4NCisgICAgICA8U3ViU3lzdGVtPkNvbnNvbGU8L1N1YlN5c3RlbT4NCisgICAgICA8VGFyZ2V0TWFjaGluZT5NYWNoaW5lSUE2NDwvVGFyZ2V0TWFjaGluZT4NCisgICAgPC9MaW5rPg0KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPg0KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciPg0KKyAgICA8TWlkbD4NCisgICAgICA8VGFyZ2V0RW52aXJvbm1lbnQ+WDY0PC9UYXJnZXRFbnZpcm9ubWVudD4NCisgICAgPC9NaWRsPg0KKyAgICA8Q2xDb21waWxlPg0KKyAgICAgIDxPcHRpbWl6YXRpb24+TWF4U3BlZWQ8L09wdGltaXphdGlvbj4NCisgICAgICA8SW5saW5lRnVuY3Rpb25FeHBhbnNpb24+T25seUV4cGxpY2l0SW5saW5lPC9JbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj4NCisgICAgICA8T21pdEZyYW1lUG9pbnRlcnM+dHJ1ZTwvT21pdEZyYW1lUG9pbnRlcnM+DQorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+Li5cLi5cLi47Li5cLi5cbWluaXppcDslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5fQ1JUX05PTlNURENfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtaTElCX1dJTkFQSTtOREVCVUc7X0NPTlNPTEU7V0lONjQ7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KKyAgICAgIDxTdHJpbmdQb29saW5nPnRydWU8L1N0cmluZ1Bvb2xpbmc+DQorICAgICAgPEJhc2ljUnVudGltZUNoZWNrcz5EZWZhdWx0PC9CYXNpY1J1bnRpbWVDaGVja3M+DQorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWRETEw8L1J1bnRpbWVMaWJyYXJ5Pg0KKyAgICAgIDxCdWZmZXJTZWN1cml0eUNoZWNrPmZhbHNlPC9CdWZmZXJTZWN1cml0eUNoZWNrPg0KKyAgICAgIDxGdW5jdGlvbkxldmVsTGlua2luZz50cnVlPC9GdW5jdGlvbkxldmVsTGlua2luZz4NCisgICAgICA8UHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPC9QcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8QXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPiQoSW50RGlyKTwvQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPg0KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+DQorICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+UHJvZ3JhbURhdGFiYXNlPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0Pg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPExpbms+DQorICAgICAgPEFkZGl0aW9uYWxEZXBlbmRlbmNpZXM+eDY0XFpsaWJEbGxSZWxlYXNlXHpsaWJ3YXBpLmxpYjslKEFkZGl0aW9uYWxEZXBlbmRlbmNpZXMpPC9BZGRpdGlvbmFsRGVwZW5kZW5jaWVzPg0KKyAgICAgIDxPdXRwdXRGaWxlPiQoT3V0RGlyKW1pbml1bnouZXhlPC9PdXRwdXRGaWxlPg0KKyAgICAgIDxHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+dHJ1ZTwvR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPg0KKyAgICAgIDxTdWJTeXN0ZW0+Q29uc29sZTwvU3ViU3lzdGVtPg0KKyAgICAgIDxPcHRpbWl6ZVJlZmVyZW5jZXM+dHJ1ZTwvT3B0aW1pemVSZWZlcmVuY2VzPg0KKyAgICAgIDxFbmFibGVDT01EQVRGb2xkaW5nPnRydWU8L0VuYWJsZUNPTURBVEZvbGRpbmc+DQorICAgICAgPFRhcmdldE1hY2hpbmU+TWFjaGluZVg2NDwvVGFyZ2V0TWFjaGluZT4NCisgICAgPC9MaW5rPg0KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPg0KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfEl0YW5pdW0nIj4NCisgICAgPE1pZGw+DQorICAgICAgPFRhcmdldEVudmlyb25tZW50Pkl0YW5pdW08L1RhcmdldEVudmlyb25tZW50Pg0KKyAgICA8L01pZGw+DQorICAgIDxDbENvbXBpbGU+DQorICAgICAgPE9wdGltaXphdGlvbj5NYXhTcGVlZDwvT3B0aW1pemF0aW9uPg0KKyAgICAgIDxJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj5Pbmx5RXhwbGljaXRJbmxpbmU8L0lubGluZUZ1bmN0aW9uRXhwYW5zaW9uPg0KKyAgICAgIDxPbWl0RnJhbWVQb2ludGVycz50cnVlPC9PbWl0RnJhbWVQb2ludGVycz4NCisgICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4uLlwuLlwuLjsuLlwuLlxtaW5pemlwOyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPl9DUlRfTk9OU1REQ19OT19ERVBSRUNBVEU7X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFO1pMSUJfV0lOQVBJO05ERUJVRztfQ09OU09MRTtXSU42NDslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPFN0cmluZ1Bvb2xpbmc+dHJ1ZTwvU3RyaW5nUG9vbGluZz4NCisgICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzPkRlZmF1bHQ8L0Jhc2ljUnVudGltZUNoZWNrcz4NCisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZERMTDwvUnVudGltZUxpYnJhcnk+DQorICAgICAgPEJ1ZmZlclNlY3VyaXR5Q2hlY2s+ZmFsc2U8L0J1ZmZlclNlY3VyaXR5Q2hlY2s+DQorICAgICAgPEZ1bmN0aW9uTGV2ZWxMaW5raW5nPnRydWU8L0Z1bmN0aW9uTGV2ZWxMaW5raW5nPg0KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8L1ByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDxBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb24+JChJbnREaXIpPC9Bc3NlbWJsZXJMaXN0aW5nTG9jYXRpb24+DQorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4NCisgICAgICA8RGVidWdJbmZvcm1hdGlvbkZvcm1hdD5Qcm9ncmFtRGF0YWJhc2U8L0RlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8TGluaz4NCisgICAgICA8QWRkaXRpb25hbERlcGVuZGVuY2llcz5pYTY0XFpsaWJEbGxSZWxlYXNlXHpsaWJ3YXBpLmxpYjslKEFkZGl0aW9uYWxEZXBlbmRlbmNpZXMpPC9BZGRpdGlvbmFsRGVwZW5kZW5jaWVzPg0KKyAgICAgIDxPdXRwdXRGaWxlPiQoT3V0RGlyKW1pbml1bnouZXhlPC9PdXRwdXRGaWxlPg0KKyAgICAgIDxHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+dHJ1ZTwvR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPg0KKyAgICAgIDxTdWJTeXN0ZW0+Q29uc29sZTwvU3ViU3lzdGVtPg0KKyAgICAgIDxPcHRpbWl6ZVJlZmVyZW5jZXM+dHJ1ZTwvT3B0aW1pemVSZWZlcmVuY2VzPg0KKyAgICAgIDxFbmFibGVDT01EQVRGb2xkaW5nPnRydWU8L0VuYWJsZUNPTURBVEZvbGRpbmc+DQorICAgICAgPFRhcmdldE1hY2hpbmU+TWFjaGluZUlBNjQ8L1RhcmdldE1hY2hpbmU+DQorICAgIDwvTGluaz4NCisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbWluaXppcFxtaW5pdW56LmMiIC8+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9InpsaWJ2Yy52Y3hwcm9qIj4NCisgICAgICA8UHJvamVjdD57OGZkODI2ZjgtMzczOS00NGU2LThjYzgtOTk3MTIyZTUzYjhkfTwvUHJvamVjdD4NCisgICAgPC9Qcm9qZWN0UmVmZXJlbmNlPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClcTWljcm9zb2Z0LkNwcC50YXJnZXRzIiAvPg0KKyAgPEltcG9ydEdyb3VwIExhYmVsPSJFeHRlbnNpb25UYXJnZXRzIj4NCisgIDwvSW1wb3J0R3JvdXA+DQorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3psaWItMS4yLjYvY29udHJpYi92c3R1ZGlvL3ZjMTAvbWluaXVuei52Y3hwcm9qLmZpbHRlcnMgYi96bGliLTEuMi42L2NvbnRyaWIvdnN0dWRpby92YzEwL21pbml1bnoudmN4cHJvai5maWx0ZXJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiMmEzZGUKLS0tIC9kZXYvbnVsbAorKysgYi96bGliLTEuMi42L2NvbnRyaWIvdnN0dWRpby92YzEwL21pbml1bnoudmN4cHJvai5maWx0ZXJzCkBAIC0wLDAgKzEsMjIgQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQorPFByb2plY3QgVG9vbHNWZXJzaW9uPSI0LjAiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPEZpbHRlciBJbmNsdWRlPSJTb3VyY2UgRmlsZXMiPg0KKyAgICAgIDxVbmlxdWVJZGVudGlmaWVyPnswNDhhZjk0My0wMjJiLTRkYjYtYmVlYi1hNTRjMzQ3NzRlZTJ9PC9VbmlxdWVJZGVudGlmaWVyPg0KKyAgICAgIDxFeHRlbnNpb25zPmNwcDtjO2N4eDtkZWY7b2RsO2lkbDtocGo7YmF0O2FzbTwvRXh0ZW5zaW9ucz4NCisgICAgPC9GaWx0ZXI+DQorICAgIDxGaWx0ZXIgSW5jbHVkZT0iSGVhZGVyIEZpbGVzIj4NCisgICAgICA8VW5pcXVlSWRlbnRpZmllcj57YzFkNjAwZDItODg4Zi00YWVhLWI3M2UtOGIwZGQ5YmVmYTBjfTwvVW5pcXVlSWRlbnRpZmllcj4NCisgICAgICA8RXh0ZW5zaW9ucz5oO2hwcDtoeHg7aG07aW5sO2luYzwvRXh0ZW5zaW9ucz4NCisgICAgPC9GaWx0ZXI+DQorICAgIDxGaWx0ZXIgSW5jbHVkZT0iUmVzb3VyY2UgRmlsZXMiPg0KKyAgICAgIDxVbmlxdWVJZGVudGlmaWVyPnswODQ0MTk5YS05NjZiLTRmMTktODFkYi0xZTAxMjVlMTQxYjl9PC9VbmlxdWVJZGVudGlmaWVyPg0KKyAgICAgIDxFeHRlbnNpb25zPnJjO2ljbztjdXI7Ym1wO2RsZztyYzI7cmN0O2JpbjtyZ3M7Z2lmO2pwZztqcGVnO2pwZTwvRXh0ZW5zaW9ucz4NCisgICAgPC9GaWx0ZXI+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbWluaXppcFxtaW5pdW56LmMiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgPC9JdGVtR3JvdXA+DQorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3psaWItMS4yLjYvY29udHJpYi92c3R1ZGlvL3ZjMTAvbWluaXVuei52Y3hwcm9qLnVzZXIgYi96bGliLTEuMi42L2NvbnRyaWIvdnN0dWRpby92YzEwL21pbml1bnoudmN4cHJvai51c2VyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5NWI1YzcKLS0tIC9kZXYvbnVsbAorKysgYi96bGliLTEuMi42L2NvbnRyaWIvdnN0dWRpby92YzEwL21pbml1bnoudmN4cHJvai51c2VyCkBAIC0wLDAgKzEsMyBAQAor77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCis8UHJvamVjdCBUb29sc1ZlcnNpb249IjQuMCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+DQorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3psaWItMS4yLjYvY29udHJpYi92c3R1ZGlvL3ZjMTAvbWluaXppcC52Y3hwcm9qIGIvemxpYi0xLjIuNi9jb250cmliL3ZzdHVkaW8vdmMxMC9taW5pemlwLnZjeHByb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE3ZTE1NgotLS0gL2Rldi9udWxsCisrKyBiL3psaWItMS4yLjYvY29udHJpYi92c3R1ZGlvL3ZjMTAvbWluaXppcC52Y3hwcm9qCkBAIC0wLDAgKzEsMzA3IEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KKzxQcm9qZWN0IERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgVG9vbHNWZXJzaW9uPSI0LjAiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPg0KKyAgPEl0ZW1Hcm91cCBMYWJlbD0iUHJvamVjdENvbmZpZ3VyYXRpb25zIj4NCisgICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IkRlYnVnfEl0YW5pdW0iPg0KKyAgICAgIDxDb25maWd1cmF0aW9uPkRlYnVnPC9Db25maWd1cmF0aW9uPg0KKyAgICAgIDxQbGF0Zm9ybT5JdGFuaXVtPC9QbGF0Zm9ybT4NCisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4NCisgICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IkRlYnVnfFdpbjMyIj4NCisgICAgICA8Q29uZmlndXJhdGlvbj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4NCisgICAgICA8UGxhdGZvcm0+V2luMzI8L1BsYXRmb3JtPg0KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPg0KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iRGVidWd8eDY0Ij4NCisgICAgICA8Q29uZmlndXJhdGlvbj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4NCisgICAgICA8UGxhdGZvcm0+eDY0PC9QbGF0Zm9ybT4NCisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4NCisgICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IlJlbGVhc2V8SXRhbml1bSI+DQorICAgICAgPENvbmZpZ3VyYXRpb24+UmVsZWFzZTwvQ29uZmlndXJhdGlvbj4NCisgICAgICA8UGxhdGZvcm0+SXRhbml1bTwvUGxhdGZvcm0+DQorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+DQorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJSZWxlYXNlfFdpbjMyIj4NCisgICAgICA8Q29uZmlndXJhdGlvbj5SZWxlYXNlPC9Db25maWd1cmF0aW9uPg0KKyAgICAgIDxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+DQorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+DQorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJSZWxlYXNlfHg2NCI+DQorICAgICAgPENvbmZpZ3VyYXRpb24+UmVsZWFzZTwvQ29uZmlndXJhdGlvbj4NCisgICAgICA8UGxhdGZvcm0+eDY0PC9QbGF0Zm9ybT4NCisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgTGFiZWw9Ikdsb2JhbHMiPg0KKyAgICA8UHJvamVjdEd1aWQ+ezQ4Q0REOURDLUUwOUYtNDEzNS05QzBDLTRGRTUwQzNDNjU0Qn08L1Byb2plY3RHdWlkPg0KKyAgICA8S2V5d29yZD5XaW4zMlByb2o8L0tleXdvcmQ+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClcTWljcm9zb2Z0LkNwcC5EZWZhdWx0LnByb3BzIiAvPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPg0KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+QXBwbGljYXRpb248L0NvbmZpZ3VyYXRpb25UeXBlPg0KKyAgICA8Q2hhcmFjdGVyU2V0Pk11bHRpQnl0ZTwvQ2hhcmFjdGVyU2V0Pg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciIExhYmVsPSJDb25maWd1cmF0aW9uIj4NCisgICAgPENvbmZpZ3VyYXRpb25UeXBlPkFwcGxpY2F0aW9uPC9Db25maWd1cmF0aW9uVHlwZT4NCisgICAgPENoYXJhY3RlclNldD5NdWx0aUJ5dGU8L0NoYXJhY3RlclNldD4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxJdGFuaXVtJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPg0KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+QXBwbGljYXRpb248L0NvbmZpZ3VyYXRpb25UeXBlPg0KKyAgICA8Q2hhcmFjdGVyU2V0Pk11bHRpQnl0ZTwvQ2hhcmFjdGVyU2V0Pg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xJdGFuaXVtJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPg0KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+QXBwbGljYXRpb248L0NvbmZpZ3VyYXRpb25UeXBlPg0KKyAgICA8Q2hhcmFjdGVyU2V0Pk11bHRpQnl0ZTwvQ2hhcmFjdGVyU2V0Pg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciIExhYmVsPSJDb25maWd1cmF0aW9uIj4NCisgICAgPENvbmZpZ3VyYXRpb25UeXBlPkFwcGxpY2F0aW9uPC9Db25maWd1cmF0aW9uVHlwZT4NCisgICAgPENoYXJhY3RlclNldD5NdWx0aUJ5dGU8L0NoYXJhY3RlclNldD4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPg0KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+QXBwbGljYXRpb248L0NvbmZpZ3VyYXRpb25UeXBlPg0KKyAgICA8Q2hhcmFjdGVyU2V0Pk11bHRpQnl0ZTwvQ2hhcmFjdGVyU2V0Pg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPEltcG9ydCBQcm9qZWN0PSIkKFZDVGFyZ2V0c1BhdGgpXE1pY3Jvc29mdC5DcHAucHJvcHMiIC8+DQorICA8SW1wb3J0R3JvdXAgTGFiZWw9IkV4dGVuc2lvblNldHRpbmdzIj4NCisgIDwvSW1wb3J0R3JvdXA+DQorICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4NCisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPg0KKyAgPC9JbXBvcnRHcm91cD4NCisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4NCisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPg0KKyAgPC9JbXBvcnRHcm91cD4NCisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8SXRhbml1bSciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+DQorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4NCisgIDwvSW1wb3J0R3JvdXA+DQorICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xJdGFuaXVtJyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4NCisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPg0KKyAgPC9JbXBvcnRHcm91cD4NCisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4NCisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPg0KKyAgPC9JbXBvcnRHcm91cD4NCisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+DQorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4NCisgIDwvSW1wb3J0R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBMYWJlbD0iVXNlck1hY3JvcyIgLz4NCisgIDxQcm9wZXJ0eUdyb3VwPg0KKyAgICA8X1Byb2plY3RGaWxlVmVyc2lvbj4xMC4wLjMwMTI4LjE8L19Qcm9qZWN0RmlsZVZlcnNpb24+DQorICAgIDxPdXREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPng4NlxNaW5pWmlwJChDb25maWd1cmF0aW9uKVw8L091dERpcj4NCisgICAgPEludERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+eDg2XE1pbmlaaXAkKENvbmZpZ3VyYXRpb24pXFRtcFw8L0ludERpcj4NCisgICAgPExpbmtJbmNyZW1lbnRhbCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+dHJ1ZTwvTGlua0luY3JlbWVudGFsPg0KKyAgICA8R2VuZXJhdGVNYW5pZmVzdCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+ZmFsc2U8L0dlbmVyYXRlTWFuaWZlc3Q+DQorICAgIDxPdXREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+eDg2XE1pbmlaaXAkKENvbmZpZ3VyYXRpb24pXDwvT3V0RGlyPg0KKyAgICA8SW50RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPng4NlxNaW5pWmlwJChDb25maWd1cmF0aW9uKVxUbXBcPC9JbnREaXI+DQorICAgIDxMaW5rSW5jcmVtZW50YWwgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+ZmFsc2U8L0xpbmtJbmNyZW1lbnRhbD4NCisgICAgPE91dERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciPng2NFwkKENvbmZpZ3VyYXRpb24pXDwvT3V0RGlyPg0KKyAgICA8SW50RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+eDY0XCQoQ29uZmlndXJhdGlvbilcPC9JbnREaXI+DQorICAgIDxMaW5rSW5jcmVtZW50YWwgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj50cnVlPC9MaW5rSW5jcmVtZW50YWw+DQorICAgIDxHZW5lcmF0ZU1hbmlmZXN0IENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+ZmFsc2U8L0dlbmVyYXRlTWFuaWZlc3Q+DQorICAgIDxPdXREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xJdGFuaXVtJyI+aWE2NFwkKENvbmZpZ3VyYXRpb24pXDwvT3V0RGlyPg0KKyAgICA8SW50RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8SXRhbml1bSciPmlhNjRcJChDb25maWd1cmF0aW9uKVw8L0ludERpcj4NCisgICAgPExpbmtJbmNyZW1lbnRhbCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfEl0YW5pdW0nIj50cnVlPC9MaW5rSW5jcmVtZW50YWw+DQorICAgIDxHZW5lcmF0ZU1hbmlmZXN0IENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8SXRhbml1bSciPmZhbHNlPC9HZW5lcmF0ZU1hbmlmZXN0Pg0KKyAgICA8T3V0RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj54NjRcJChDb25maWd1cmF0aW9uKVw8L091dERpcj4NCisgICAgPEludERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+eDY0XCQoQ29uZmlndXJhdGlvbilcPC9JbnREaXI+DQorICAgIDxMaW5rSW5jcmVtZW50YWwgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciPmZhbHNlPC9MaW5rSW5jcmVtZW50YWw+DQorICAgIDxPdXREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfEl0YW5pdW0nIj5pYTY0XCQoQ29uZmlndXJhdGlvbilcPC9PdXREaXI+DQorICAgIDxJbnREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfEl0YW5pdW0nIj5pYTY0XCQoQ29uZmlndXJhdGlvbilcPC9JbnREaXI+DQorICAgIDxMaW5rSW5jcmVtZW50YWwgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfEl0YW5pdW0nIj5mYWxzZTwvTGlua0luY3JlbWVudGFsPg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZVNldCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfEl0YW5pdW0nIj5BbGxSdWxlcy5ydWxlc2V0PC9Db2RlQW5hbHlzaXNSdWxlU2V0Pg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xJdGFuaXVtJyIgLz4NCisgICAgPENvZGVBbmFseXNpc1J1bGVBc3NlbWJsaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8SXRhbml1bSciIC8+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlU2V0IENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj5BbGxSdWxlcy5ydWxlc2V0PC9Db2RlQW5hbHlzaXNSdWxlU2V0Pg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciIC8+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlQXNzZW1ibGllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyIgLz4NCisgICAgPENvZGVBbmFseXNpc1J1bGVTZXQgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj5BbGxSdWxlcy5ydWxlc2V0PC9Db2RlQW5hbHlzaXNSdWxlU2V0Pg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIiAvPg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZUFzc2VtYmxpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIiAvPg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZVNldCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8SXRhbml1bSciPkFsbFJ1bGVzLnJ1bGVzZXQ8L0NvZGVBbmFseXNpc1J1bGVTZXQ+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8SXRhbml1bSciIC8+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlQXNzZW1ibGllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8SXRhbml1bSciIC8+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlU2V0IENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPkFsbFJ1bGVzLnJ1bGVzZXQ8L0NvZGVBbmFseXNpc1J1bGVTZXQ+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIiAvPg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZUFzc2VtYmxpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyIgLz4NCisgICAgPENvZGVBbmFseXNpc1J1bGVTZXQgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciPkFsbFJ1bGVzLnJ1bGVzZXQ8L0NvZGVBbmFseXNpc1J1bGVTZXQ+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyIgLz4NCisgICAgPENvZGVBbmFseXNpc1J1bGVBc3NlbWJsaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIiAvPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPg0KKyAgICA8Q2xDb21waWxlPg0KKyAgICAgIDxPcHRpbWl6YXRpb24+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4NCisgICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4uLlwuLlwuLjsuLlwuLlxtaW5pemlwOyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPldJTjMyO19DUlRfTk9OU1REQ19OT19ERVBSRUNBVEU7X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFO1pMSUJfV0lOQVBJO19ERUJVRztfQ09OU09MRTslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPE1pbmltYWxSZWJ1aWxkPnRydWU8L01pbmltYWxSZWJ1aWxkPg0KKyAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3M+RGVmYXVsdDwvQmFzaWNSdW50aW1lQ2hlY2tzPg0KKyAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkRGVidWc8L1J1bnRpbWVMaWJyYXJ5Pg0KKyAgICAgIDxCdWZmZXJTZWN1cml0eUNoZWNrPmZhbHNlPC9CdWZmZXJTZWN1cml0eUNoZWNrPg0KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8L1ByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDxBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb24+JChJbnREaXIpPC9Bc3NlbWJsZXJMaXN0aW5nTG9jYXRpb24+DQorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4NCisgICAgICA8RGVidWdJbmZvcm1hdGlvbkZvcm1hdD5FZGl0QW5kQ29udGludWU8L0RlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8TGluaz4NCisgICAgICA8QWRkaXRpb25hbERlcGVuZGVuY2llcz54ODZcWmxpYkRsbERlYnVnXHpsaWJ3YXBpLmxpYjslKEFkZGl0aW9uYWxEZXBlbmRlbmNpZXMpPC9BZGRpdGlvbmFsRGVwZW5kZW5jaWVzPg0KKyAgICAgIDxPdXRwdXRGaWxlPiQoT3V0RGlyKW1pbml6aXAuZXhlPC9PdXRwdXRGaWxlPg0KKyAgICAgIDxHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+dHJ1ZTwvR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPg0KKyAgICAgIDxQcm9ncmFtRGF0YWJhc2VGaWxlPiQoT3V0RGlyKW1pbml6aXAucGRiPC9Qcm9ncmFtRGF0YWJhc2VGaWxlPg0KKyAgICAgIDxTdWJTeXN0ZW0+Q29uc29sZTwvU3ViU3lzdGVtPg0KKyAgICAgIDxSYW5kb21pemVkQmFzZUFkZHJlc3M+ZmFsc2U8L1JhbmRvbWl6ZWRCYXNlQWRkcmVzcz4NCisgICAgICA8RGF0YUV4ZWN1dGlvblByZXZlbnRpb24+DQorICAgICAgPC9EYXRhRXhlY3V0aW9uUHJldmVudGlvbj4NCisgICAgICA8VGFyZ2V0TWFjaGluZT5NYWNoaW5lWDg2PC9UYXJnZXRNYWNoaW5lPg0KKyAgICA8L0xpbms+DQorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+DQorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj4NCisgICAgPENsQ29tcGlsZT4NCisgICAgICA8T3B0aW1pemF0aW9uPk1heFNwZWVkPC9PcHRpbWl6YXRpb24+DQorICAgICAgPElubGluZUZ1bmN0aW9uRXhwYW5zaW9uPk9ubHlFeHBsaWNpdElubGluZTwvSW5saW5lRnVuY3Rpb25FeHBhbnNpb24+DQorICAgICAgPE9taXRGcmFtZVBvaW50ZXJzPnRydWU8L09taXRGcmFtZVBvaW50ZXJzPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPi4uXC4uXC4uOy4uXC4uXG1pbml6aXA7JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+V0lOMzI7X0NSVF9OT05TVERDX05PX0RFUFJFQ0FURTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7WkxJQl9XSU5BUEk7TkRFQlVHO19DT05TT0xFOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8U3RyaW5nUG9vbGluZz50cnVlPC9TdHJpbmdQb29saW5nPg0KKyAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3M+RGVmYXVsdDwvQmFzaWNSdW50aW1lQ2hlY2tzPg0KKyAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkPC9SdW50aW1lTGlicmFyeT4NCisgICAgICA8QnVmZmVyU2VjdXJpdHlDaGVjaz5mYWxzZTwvQnVmZmVyU2VjdXJpdHlDaGVjaz4NCisgICAgICA8RnVuY3Rpb25MZXZlbExpbmtpbmc+dHJ1ZTwvRnVuY3Rpb25MZXZlbExpbmtpbmc+DQorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDwvUHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPEFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj4kKEludERpcik8L0Fzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj4NCisgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPg0KKyAgICAgIDxEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PlByb2dyYW1EYXRhYmFzZTwvRGVidWdJbmZvcm1hdGlvbkZvcm1hdD4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxMaW5rPg0KKyAgICAgIDxBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPng4NlxabGliRGxsUmVsZWFzZVx6bGlid2FwaS5saWI7JShBZGRpdGlvbmFsRGVwZW5kZW5jaWVzKTwvQWRkaXRpb25hbERlcGVuZGVuY2llcz4NCisgICAgICA8T3V0cHV0RmlsZT4kKE91dERpciltaW5pemlwLmV4ZTwvT3V0cHV0RmlsZT4NCisgICAgICA8R2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPnRydWU8L0dlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj4NCisgICAgICA8U3ViU3lzdGVtPkNvbnNvbGU8L1N1YlN5c3RlbT4NCisgICAgICA8T3B0aW1pemVSZWZlcmVuY2VzPnRydWU8L09wdGltaXplUmVmZXJlbmNlcz4NCisgICAgICA8RW5hYmxlQ09NREFURm9sZGluZz50cnVlPC9FbmFibGVDT01EQVRGb2xkaW5nPg0KKyAgICAgIDxSYW5kb21pemVkQmFzZUFkZHJlc3M+ZmFsc2U8L1JhbmRvbWl6ZWRCYXNlQWRkcmVzcz4NCisgICAgICA8RGF0YUV4ZWN1dGlvblByZXZlbnRpb24+DQorICAgICAgPC9EYXRhRXhlY3V0aW9uUHJldmVudGlvbj4NCisgICAgICA8VGFyZ2V0TWFjaGluZT5NYWNoaW5lWDg2PC9UYXJnZXRNYWNoaW5lPg0KKyAgICA8L0xpbms+DQorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+DQorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciPg0KKyAgICA8TWlkbD4NCisgICAgICA8VGFyZ2V0RW52aXJvbm1lbnQ+WDY0PC9UYXJnZXRFbnZpcm9ubWVudD4NCisgICAgPC9NaWRsPg0KKyAgICA8Q2xDb21waWxlPg0KKyAgICAgIDxPcHRpbWl6YXRpb24+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4NCisgICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4uLlwuLlwuLjsuLlwuLlxtaW5pemlwOyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPl9DUlRfTk9OU1REQ19OT19ERVBSRUNBVEU7X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFO1pMSUJfV0lOQVBJO19ERUJVRztfQ09OU09MRTtXSU42NDslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPE1pbmltYWxSZWJ1aWxkPnRydWU8L01pbmltYWxSZWJ1aWxkPg0KKyAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3M+RGVmYXVsdDwvQmFzaWNSdW50aW1lQ2hlY2tzPg0KKyAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkRGVidWdETEw8L1J1bnRpbWVMaWJyYXJ5Pg0KKyAgICAgIDxCdWZmZXJTZWN1cml0eUNoZWNrPmZhbHNlPC9CdWZmZXJTZWN1cml0eUNoZWNrPg0KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8L1ByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDxBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb24+JChJbnREaXIpPC9Bc3NlbWJsZXJMaXN0aW5nTG9jYXRpb24+DQorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4NCisgICAgICA8RGVidWdJbmZvcm1hdGlvbkZvcm1hdD5Qcm9ncmFtRGF0YWJhc2U8L0RlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8TGluaz4NCisgICAgICA8QWRkaXRpb25hbERlcGVuZGVuY2llcz54NjRcWmxpYkRsbERlYnVnXHpsaWJ3YXBpLmxpYjslKEFkZGl0aW9uYWxEZXBlbmRlbmNpZXMpPC9BZGRpdGlvbmFsRGVwZW5kZW5jaWVzPg0KKyAgICAgIDxPdXRwdXRGaWxlPiQoT3V0RGlyKW1pbml6aXAuZXhlPC9PdXRwdXRGaWxlPg0KKyAgICAgIDxHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+dHJ1ZTwvR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPg0KKyAgICAgIDxQcm9ncmFtRGF0YWJhc2VGaWxlPiQoT3V0RGlyKW1pbml6aXAucGRiPC9Qcm9ncmFtRGF0YWJhc2VGaWxlPg0KKyAgICAgIDxTdWJTeXN0ZW0+Q29uc29sZTwvU3ViU3lzdGVtPg0KKyAgICAgIDxUYXJnZXRNYWNoaW5lPk1hY2hpbmVYNjQ8L1RhcmdldE1hY2hpbmU+DQorICAgIDwvTGluaz4NCisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4NCisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8SXRhbml1bSciPg0KKyAgICA8TWlkbD4NCisgICAgICA8VGFyZ2V0RW52aXJvbm1lbnQ+SXRhbml1bTwvVGFyZ2V0RW52aXJvbm1lbnQ+DQorICAgIDwvTWlkbD4NCisgICAgPENsQ29tcGlsZT4NCisgICAgICA8T3B0aW1pemF0aW9uPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+DQorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+Li5cLi5cLi47Li5cLi5cbWluaXppcDslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5fQ1JUX05PTlNURENfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtaTElCX1dJTkFQSTtfREVCVUc7X0NPTlNPTEU7V0lONjQ7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KKyAgICAgIDxNaW5pbWFsUmVidWlsZD50cnVlPC9NaW5pbWFsUmVidWlsZD4NCisgICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzPkRlZmF1bHQ8L0Jhc2ljUnVudGltZUNoZWNrcz4NCisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZERlYnVnRExMPC9SdW50aW1lTGlicmFyeT4NCisgICAgICA8QnVmZmVyU2VjdXJpdHlDaGVjaz5mYWxzZTwvQnVmZmVyU2VjdXJpdHlDaGVjaz4NCisgICAgICA8UHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPC9QcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8QXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPiQoSW50RGlyKTwvQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPg0KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+DQorICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+UHJvZ3JhbURhdGFiYXNlPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0Pg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPExpbms+DQorICAgICAgPEFkZGl0aW9uYWxEZXBlbmRlbmNpZXM+aWE2NFxabGliRGxsRGVidWdcemxpYndhcGkubGliOyUoQWRkaXRpb25hbERlcGVuZGVuY2llcyk8L0FkZGl0aW9uYWxEZXBlbmRlbmNpZXM+DQorICAgICAgPE91dHB1dEZpbGU+JChPdXREaXIpbWluaXppcC5leGU8L091dHB1dEZpbGU+DQorICAgICAgPEdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj50cnVlPC9HZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+DQorICAgICAgPFByb2dyYW1EYXRhYmFzZUZpbGU+JChPdXREaXIpbWluaXppcC5wZGI8L1Byb2dyYW1EYXRhYmFzZUZpbGU+DQorICAgICAgPFN1YlN5c3RlbT5Db25zb2xlPC9TdWJTeXN0ZW0+DQorICAgICAgPFRhcmdldE1hY2hpbmU+TWFjaGluZUlBNjQ8L1RhcmdldE1hY2hpbmU+DQorICAgIDwvTGluaz4NCisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4NCisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj4NCisgICAgPE1pZGw+DQorICAgICAgPFRhcmdldEVudmlyb25tZW50Plg2NDwvVGFyZ2V0RW52aXJvbm1lbnQ+DQorICAgIDwvTWlkbD4NCisgICAgPENsQ29tcGlsZT4NCisgICAgICA8T3B0aW1pemF0aW9uPk1heFNwZWVkPC9PcHRpbWl6YXRpb24+DQorICAgICAgPElubGluZUZ1bmN0aW9uRXhwYW5zaW9uPk9ubHlFeHBsaWNpdElubGluZTwvSW5saW5lRnVuY3Rpb25FeHBhbnNpb24+DQorICAgICAgPE9taXRGcmFtZVBvaW50ZXJzPnRydWU8L09taXRGcmFtZVBvaW50ZXJzPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPi4uXC4uXC4uOy4uXC4uXG1pbml6aXA7JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+X0NSVF9OT05TVERDX05PX0RFUFJFQ0FURTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7WkxJQl9XSU5BUEk7TkRFQlVHO19DT05TT0xFO1dJTjY0OyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8U3RyaW5nUG9vbGluZz50cnVlPC9TdHJpbmdQb29saW5nPg0KKyAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3M+RGVmYXVsdDwvQmFzaWNSdW50aW1lQ2hlY2tzPg0KKyAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkRExMPC9SdW50aW1lTGlicmFyeT4NCisgICAgICA8QnVmZmVyU2VjdXJpdHlDaGVjaz5mYWxzZTwvQnVmZmVyU2VjdXJpdHlDaGVjaz4NCisgICAgICA8RnVuY3Rpb25MZXZlbExpbmtpbmc+dHJ1ZTwvRnVuY3Rpb25MZXZlbExpbmtpbmc+DQorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDwvUHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPEFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj4kKEludERpcik8L0Fzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj4NCisgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPg0KKyAgICAgIDxEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PlByb2dyYW1EYXRhYmFzZTwvRGVidWdJbmZvcm1hdGlvbkZvcm1hdD4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxMaW5rPg0KKyAgICAgIDxBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPng2NFxabGliRGxsUmVsZWFzZVx6bGlid2FwaS5saWI7JShBZGRpdGlvbmFsRGVwZW5kZW5jaWVzKTwvQWRkaXRpb25hbERlcGVuZGVuY2llcz4NCisgICAgICA8T3V0cHV0RmlsZT4kKE91dERpciltaW5pemlwLmV4ZTwvT3V0cHV0RmlsZT4NCisgICAgICA8R2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPnRydWU8L0dlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj4NCisgICAgICA8U3ViU3lzdGVtPkNvbnNvbGU8L1N1YlN5c3RlbT4NCisgICAgICA8T3B0aW1pemVSZWZlcmVuY2VzPnRydWU8L09wdGltaXplUmVmZXJlbmNlcz4NCisgICAgICA8RW5hYmxlQ09NREFURm9sZGluZz50cnVlPC9FbmFibGVDT01EQVRGb2xkaW5nPg0KKyAgICAgIDxUYXJnZXRNYWNoaW5lPk1hY2hpbmVYNjQ8L1RhcmdldE1hY2hpbmU+DQorICAgIDwvTGluaz4NCisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4NCisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxJdGFuaXVtJyI+DQorICAgIDxNaWRsPg0KKyAgICAgIDxUYXJnZXRFbnZpcm9ubWVudD5JdGFuaXVtPC9UYXJnZXRFbnZpcm9ubWVudD4NCisgICAgPC9NaWRsPg0KKyAgICA8Q2xDb21waWxlPg0KKyAgICAgIDxPcHRpbWl6YXRpb24+TWF4U3BlZWQ8L09wdGltaXphdGlvbj4NCisgICAgICA8SW5saW5lRnVuY3Rpb25FeHBhbnNpb24+T25seUV4cGxpY2l0SW5saW5lPC9JbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj4NCisgICAgICA8T21pdEZyYW1lUG9pbnRlcnM+dHJ1ZTwvT21pdEZyYW1lUG9pbnRlcnM+DQorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+Li5cLi5cLi47Li5cLi5cbWluaXppcDslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5fQ1JUX05PTlNURENfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtaTElCX1dJTkFQSTtOREVCVUc7X0NPTlNPTEU7V0lONjQ7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KKyAgICAgIDxTdHJpbmdQb29saW5nPnRydWU8L1N0cmluZ1Bvb2xpbmc+DQorICAgICAgPEJhc2ljUnVudGltZUNoZWNrcz5EZWZhdWx0PC9CYXNpY1J1bnRpbWVDaGVja3M+DQorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWRETEw8L1J1bnRpbWVMaWJyYXJ5Pg0KKyAgICAgIDxCdWZmZXJTZWN1cml0eUNoZWNrPmZhbHNlPC9CdWZmZXJTZWN1cml0eUNoZWNrPg0KKyAgICAgIDxGdW5jdGlvbkxldmVsTGlua2luZz50cnVlPC9GdW5jdGlvbkxldmVsTGlua2luZz4NCisgICAgICA8UHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPC9QcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8QXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPiQoSW50RGlyKTwvQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPg0KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+DQorICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+UHJvZ3JhbURhdGFiYXNlPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0Pg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPExpbms+DQorICAgICAgPEFkZGl0aW9uYWxEZXBlbmRlbmNpZXM+aWE2NFxabGliRGxsUmVsZWFzZVx6bGlid2FwaS5saWI7JShBZGRpdGlvbmFsRGVwZW5kZW5jaWVzKTwvQWRkaXRpb25hbERlcGVuZGVuY2llcz4NCisgICAgICA8T3V0cHV0RmlsZT4kKE91dERpciltaW5pemlwLmV4ZTwvT3V0cHV0RmlsZT4NCisgICAgICA8R2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPnRydWU8L0dlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj4NCisgICAgICA8U3ViU3lzdGVtPkNvbnNvbGU8L1N1YlN5c3RlbT4NCisgICAgICA8T3B0aW1pemVSZWZlcmVuY2VzPnRydWU8L09wdGltaXplUmVmZXJlbmNlcz4NCisgICAgICA8RW5hYmxlQ09NREFURm9sZGluZz50cnVlPC9FbmFibGVDT01EQVRGb2xkaW5nPg0KKyAgICAgIDxUYXJnZXRNYWNoaW5lPk1hY2hpbmVJQTY0PC9UYXJnZXRNYWNoaW5lPg0KKyAgICA8L0xpbms+DQorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXG1pbml6aXBcbWluaXppcC5jIiAvPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSJ6bGlidmMudmN4cHJvaiI+DQorICAgICAgPFByb2plY3Q+ezhmZDgyNmY4LTM3MzktNDRlNi04Y2M4LTk5NzEyMmU1M2I4ZH08L1Byb2plY3Q+DQorICAgIDwvUHJvamVjdFJlZmVyZW5jZT4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEltcG9ydCBQcm9qZWN0PSIkKFZDVGFyZ2V0c1BhdGgpXE1pY3Jvc29mdC5DcHAudGFyZ2V0cyIgLz4NCisgIDxJbXBvcnRHcm91cCBMYWJlbD0iRXh0ZW5zaW9uVGFyZ2V0cyI+DQorICA8L0ltcG9ydEdyb3VwPg0KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS96bGliLTEuMi42L2NvbnRyaWIvdnN0dWRpby92YzEwL21pbml6aXAudmN4cHJvai5maWx0ZXJzIGIvemxpYi0xLjIuNi9jb250cmliL3ZzdHVkaW8vdmMxMC9taW5pemlwLnZjeHByb2ouZmlsdGVycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDczY2QzCi0tLSAvZGV2L251bGwKKysrIGIvemxpYi0xLjIuNi9jb250cmliL3ZzdHVkaW8vdmMxMC9taW5pemlwLnZjeHByb2ouZmlsdGVycwpAQCAtMCwwICsxLDIyIEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KKzxQcm9qZWN0IFRvb2xzVmVyc2lvbj0iNC4wIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxGaWx0ZXIgSW5jbHVkZT0iU291cmNlIEZpbGVzIj4NCisgICAgICA8VW5pcXVlSWRlbnRpZmllcj57YzA0MTliNDAtYmY1MC00MGRhLWIxNTMtZmY3NDIxNWI3OWRlfTwvVW5pcXVlSWRlbnRpZmllcj4NCisgICAgICA8RXh0ZW5zaW9ucz5jcHA7YztjeHg7ZGVmO29kbDtpZGw7aHBqO2JhdDthc208L0V4dGVuc2lvbnM+DQorICAgIDwvRmlsdGVyPg0KKyAgICA8RmlsdGVyIEluY2x1ZGU9IkhlYWRlciBGaWxlcyI+DQorICAgICAgPFVuaXF1ZUlkZW50aWZpZXI+e2JiODdiMDcwLTczNWItNDc4ZS05MmNlLTczODNhYmIyZjM2Y308L1VuaXF1ZUlkZW50aWZpZXI+DQorICAgICAgPEV4dGVuc2lvbnM+aDtocHA7aHh4O2htO2lubDtpbmM8L0V4dGVuc2lvbnM+DQorICAgIDwvRmlsdGVyPg0KKyAgICA8RmlsdGVyIEluY2x1ZGU9IlJlc291cmNlIEZpbGVzIj4NCisgICAgICA8VW5pcXVlSWRlbnRpZmllcj57ZjQ2YWI2YTYtNTQ4Zi00M2NiLWFlOTYtNjgxYWJiNWJkNWRifTwvVW5pcXVlSWRlbnRpZmllcj4NCisgICAgICA8RXh0ZW5zaW9ucz5yYztpY287Y3VyO2JtcDtkbGc7cmMyO3JjdDtiaW47cmdzO2dpZjtqcGc7anBlZztqcGU8L0V4dGVuc2lvbnM+DQorICAgIDwvRmlsdGVyPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXG1pbml6aXBcbWluaXppcC5jIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgIDwvSXRlbUdyb3VwPg0KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS96bGliLTEuMi42L2NvbnRyaWIvdnN0dWRpby92YzEwL21pbml6aXAudmN4cHJvai51c2VyIGIvemxpYi0xLjIuNi9jb250cmliL3ZzdHVkaW8vdmMxMC9taW5pemlwLnZjeHByb2oudXNlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTViNWM3Ci0tLSAvZGV2L251bGwKKysrIGIvemxpYi0xLjIuNi9jb250cmliL3ZzdHVkaW8vdmMxMC9taW5pemlwLnZjeHByb2oudXNlcgpAQCAtMCwwICsxLDMgQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQorPFByb2plY3QgVG9vbHNWZXJzaW9uPSI0LjAiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPg0KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS96bGliLTEuMi42L2NvbnRyaWIvdnN0dWRpby92YzEwL3Rlc3R6bGliLnZjeHByb2ogYi96bGliLTEuMi42L2NvbnRyaWIvdnN0dWRpby92YzEwL3Rlc3R6bGliLnZjeHByb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA4OGQxNwotLS0gL2Rldi9udWxsCisrKyBiL3psaWItMS4yLjYvY29udHJpYi92c3R1ZGlvL3ZjMTAvdGVzdHpsaWIudmN4cHJvagpAQCAtMCwwICsxLDQyMCBAQAor77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCis8UHJvamVjdCBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIFRvb2xzVmVyc2lvbj0iNC4wIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4NCisgIDxJdGVtR3JvdXAgTGFiZWw9IlByb2plY3RDb25maWd1cmF0aW9ucyI+DQorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJEZWJ1Z3xJdGFuaXVtIj4NCisgICAgICA8Q29uZmlndXJhdGlvbj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4NCisgICAgICA8UGxhdGZvcm0+SXRhbml1bTwvUGxhdGZvcm0+DQorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+DQorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJEZWJ1Z3xXaW4zMiI+DQorICAgICAgPENvbmZpZ3VyYXRpb24+RGVidWc8L0NvbmZpZ3VyYXRpb24+DQorICAgICAgPFBsYXRmb3JtPldpbjMyPC9QbGF0Zm9ybT4NCisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4NCisgICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IkRlYnVnfHg2NCI+DQorICAgICAgPENvbmZpZ3VyYXRpb24+RGVidWc8L0NvbmZpZ3VyYXRpb24+DQorICAgICAgPFBsYXRmb3JtPng2NDwvUGxhdGZvcm0+DQorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+DQorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJSZWxlYXNlV2l0aG91dEFzbXxJdGFuaXVtIj4NCisgICAgICA8Q29uZmlndXJhdGlvbj5SZWxlYXNlV2l0aG91dEFzbTwvQ29uZmlndXJhdGlvbj4NCisgICAgICA8UGxhdGZvcm0+SXRhbml1bTwvUGxhdGZvcm0+DQorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+DQorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJSZWxlYXNlV2l0aG91dEFzbXxXaW4zMiI+DQorICAgICAgPENvbmZpZ3VyYXRpb24+UmVsZWFzZVdpdGhvdXRBc208L0NvbmZpZ3VyYXRpb24+DQorICAgICAgPFBsYXRmb3JtPldpbjMyPC9QbGF0Zm9ybT4NCisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4NCisgICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IlJlbGVhc2VXaXRob3V0QXNtfHg2NCI+DQorICAgICAgPENvbmZpZ3VyYXRpb24+UmVsZWFzZVdpdGhvdXRBc208L0NvbmZpZ3VyYXRpb24+DQorICAgICAgPFBsYXRmb3JtPng2NDwvUGxhdGZvcm0+DQorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+DQorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJSZWxlYXNlfEl0YW5pdW0iPg0KKyAgICAgIDxDb25maWd1cmF0aW9uPlJlbGVhc2U8L0NvbmZpZ3VyYXRpb24+DQorICAgICAgPFBsYXRmb3JtPkl0YW5pdW08L1BsYXRmb3JtPg0KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPg0KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUmVsZWFzZXxXaW4zMiI+DQorICAgICAgPENvbmZpZ3VyYXRpb24+UmVsZWFzZTwvQ29uZmlndXJhdGlvbj4NCisgICAgICA8UGxhdGZvcm0+V2luMzI8L1BsYXRmb3JtPg0KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPg0KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUmVsZWFzZXx4NjQiPg0KKyAgICAgIDxDb25maWd1cmF0aW9uPlJlbGVhc2U8L0NvbmZpZ3VyYXRpb24+DQorICAgICAgPFBsYXRmb3JtPng2NDwvUGxhdGZvcm0+DQorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIExhYmVsPSJHbG9iYWxzIj4NCisgICAgPFByb2plY3RHdWlkPntBQTY2NjZBQS1FMDlGLTQxMzUtOUMwQy00RkU1MEMzQzY1NEJ9PC9Qcm9qZWN0R3VpZD4NCisgICAgPFJvb3ROYW1lc3BhY2U+dGVzdHpsaWI8L1Jvb3ROYW1lc3BhY2U+DQorICAgIDxLZXl3b3JkPldpbjMyUHJvajwvS2V5d29yZD4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLkRlZmF1bHQucHJvcHMiIC8+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+DQorICAgIDxDb25maWd1cmF0aW9uVHlwZT5BcHBsaWNhdGlvbjwvQ29uZmlndXJhdGlvblR5cGU+DQorICAgIDxDaGFyYWN0ZXJTZXQ+TXVsdGlCeXRlPC9DaGFyYWN0ZXJTZXQ+DQorICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+dHJ1ZTwvV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlV2l0aG91dEFzbXxXaW4zMiciIExhYmVsPSJDb25maWd1cmF0aW9uIj4NCisgICAgPENvbmZpZ3VyYXRpb25UeXBlPkFwcGxpY2F0aW9uPC9Db25maWd1cmF0aW9uVHlwZT4NCisgICAgPENoYXJhY3RlclNldD5NdWx0aUJ5dGU8L0NoYXJhY3RlclNldD4NCisgICAgPFdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj50cnVlPC9XaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPg0KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+QXBwbGljYXRpb248L0NvbmZpZ3VyYXRpb25UeXBlPg0KKyAgICA8Q2hhcmFjdGVyU2V0Pk11bHRpQnl0ZTwvQ2hhcmFjdGVyU2V0Pg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfEl0YW5pdW0nIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+DQorICAgIDxDb25maWd1cmF0aW9uVHlwZT5BcHBsaWNhdGlvbjwvQ29uZmlndXJhdGlvblR5cGU+DQorICAgIDxDaGFyYWN0ZXJTZXQ+TXVsdGlCeXRlPC9DaGFyYWN0ZXJTZXQ+DQorICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+dHJ1ZTwvV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlV2l0aG91dEFzbXxJdGFuaXVtJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPg0KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+QXBwbGljYXRpb248L0NvbmZpZ3VyYXRpb25UeXBlPg0KKyAgICA8Q2hhcmFjdGVyU2V0Pk11bHRpQnl0ZTwvQ2hhcmFjdGVyU2V0Pg0KKyAgICA8V2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPnRydWU8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8SXRhbml1bSciIExhYmVsPSJDb25maWd1cmF0aW9uIj4NCisgICAgPENvbmZpZ3VyYXRpb25UeXBlPkFwcGxpY2F0aW9uPC9Db25maWd1cmF0aW9uVHlwZT4NCisgICAgPENoYXJhY3RlclNldD5NdWx0aUJ5dGU8L0NoYXJhY3RlclNldD4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+DQorICAgIDxDb25maWd1cmF0aW9uVHlwZT5BcHBsaWNhdGlvbjwvQ29uZmlndXJhdGlvblR5cGU+DQorICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+dHJ1ZTwvV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlV2l0aG91dEFzbXx4NjQnIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+DQorICAgIDxDb25maWd1cmF0aW9uVHlwZT5BcHBsaWNhdGlvbjwvQ29uZmlndXJhdGlvblR5cGU+DQorICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+dHJ1ZTwvV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+DQorICAgIDxDb25maWd1cmF0aW9uVHlwZT5BcHBsaWNhdGlvbjwvQ29uZmlndXJhdGlvblR5cGU+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClcTWljcm9zb2Z0LkNwcC5wcm9wcyIgLz4NCisgIDxJbXBvcnRHcm91cCBMYWJlbD0iRXh0ZW5zaW9uU2V0dGluZ3MiPg0KKyAgPC9JbXBvcnRHcm91cD4NCisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPg0KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+DQorICA8L0ltcG9ydEdyb3VwPg0KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZVdpdGhvdXRBc218V2luMzInIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPg0KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+DQorICA8L0ltcG9ydEdyb3VwPg0KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPg0KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+DQorICA8L0ltcG9ydEdyb3VwPg0KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxJdGFuaXVtJyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4NCisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPg0KKyAgPC9JbXBvcnRHcm91cD4NCisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2VXaXRob3V0QXNtfEl0YW5pdW0nIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPg0KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+DQorICA8L0ltcG9ydEdyb3VwPg0KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8SXRhbml1bSciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+DQorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4NCisgIDwvSW1wb3J0R3JvdXA+DQorICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+DQorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4NCisgIDwvSW1wb3J0R3JvdXA+DQorICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlV2l0aG91dEFzbXx4NjQnIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPg0KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+DQorICA8L0ltcG9ydEdyb3VwPg0KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4NCisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPg0KKyAgPC9JbXBvcnRHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIExhYmVsPSJVc2VyTWFjcm9zIiAvPg0KKyAgPFByb3BlcnR5R3JvdXA+DQorICAgIDxfUHJvamVjdEZpbGVWZXJzaW9uPjEwLjAuMzAxMjguMTwvX1Byb2plY3RGaWxlVmVyc2lvbj4NCisgICAgPE91dERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+eDg2XFRlc3RabGliJChDb25maWd1cmF0aW9uKVw8L091dERpcj4NCisgICAgPEludERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+eDg2XFRlc3RabGliJChDb25maWd1cmF0aW9uKVxUbXBcPC9JbnREaXI+DQorICAgIDxMaW5rSW5jcmVtZW50YWwgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPnRydWU8L0xpbmtJbmNyZW1lbnRhbD4NCisgICAgPEdlbmVyYXRlTWFuaWZlc3QgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPmZhbHNlPC9HZW5lcmF0ZU1hbmlmZXN0Pg0KKyAgICA8T3V0RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZVdpdGhvdXRBc218V2luMzInIj54ODZcVGVzdFpsaWIkKENvbmZpZ3VyYXRpb24pXDwvT3V0RGlyPg0KKyAgICA8SW50RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZVdpdGhvdXRBc218V2luMzInIj54ODZcVGVzdFpsaWIkKENvbmZpZ3VyYXRpb24pXFRtcFw8L0ludERpcj4NCisgICAgPExpbmtJbmNyZW1lbnRhbCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2VXaXRob3V0QXNtfFdpbjMyJyI+ZmFsc2U8L0xpbmtJbmNyZW1lbnRhbD4NCisgICAgPEdlbmVyYXRlTWFuaWZlc3QgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlV2l0aG91dEFzbXxXaW4zMiciPmZhbHNlPC9HZW5lcmF0ZU1hbmlmZXN0Pg0KKyAgICA8T3V0RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPng4NlxUZXN0WmxpYiQoQ29uZmlndXJhdGlvbilcPC9PdXREaXI+DQorICAgIDxJbnREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+eDg2XFRlc3RabGliJChDb25maWd1cmF0aW9uKVxUbXBcPC9JbnREaXI+DQorICAgIDxMaW5rSW5jcmVtZW50YWwgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+ZmFsc2U8L0xpbmtJbmNyZW1lbnRhbD4NCisgICAgPEdlbmVyYXRlTWFuaWZlc3QgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+ZmFsc2U8L0dlbmVyYXRlTWFuaWZlc3Q+DQorICAgIDxPdXREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj54NjRcVGVzdFpsaWIkKENvbmZpZ3VyYXRpb24pXDwvT3V0RGlyPg0KKyAgICA8SW50RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+eDY0XFRlc3RabGliJChDb25maWd1cmF0aW9uKVxUbXBcPC9JbnREaXI+DQorICAgIDxHZW5lcmF0ZU1hbmlmZXN0IENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+ZmFsc2U8L0dlbmVyYXRlTWFuaWZlc3Q+DQorICAgIDxPdXREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xJdGFuaXVtJyI+aWE2NFxUZXN0WmxpYiQoQ29uZmlndXJhdGlvbilcPC9PdXREaXI+DQorICAgIDxJbnREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xJdGFuaXVtJyI+aWE2NFxUZXN0WmxpYiQoQ29uZmlndXJhdGlvbilcVG1wXDwvSW50RGlyPg0KKyAgICA8TGlua0luY3JlbWVudGFsIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8SXRhbml1bSciPnRydWU8L0xpbmtJbmNyZW1lbnRhbD4NCisgICAgPEdlbmVyYXRlTWFuaWZlc3QgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xJdGFuaXVtJyI+ZmFsc2U8L0dlbmVyYXRlTWFuaWZlc3Q+DQorICAgIDxPdXREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlV2l0aG91dEFzbXx4NjQnIj54NjRcVGVzdFpsaWIkKENvbmZpZ3VyYXRpb24pXDwvT3V0RGlyPg0KKyAgICA8SW50RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZVdpdGhvdXRBc218eDY0JyI+eDY0XFRlc3RabGliJChDb25maWd1cmF0aW9uKVxUbXBcPC9JbnREaXI+DQorICAgIDxHZW5lcmF0ZU1hbmlmZXN0IENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZVdpdGhvdXRBc218eDY0JyI+ZmFsc2U8L0dlbmVyYXRlTWFuaWZlc3Q+DQorICAgIDxPdXREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlV2l0aG91dEFzbXxJdGFuaXVtJyI+aWE2NFxUZXN0WmxpYiQoQ29uZmlndXJhdGlvbilcPC9PdXREaXI+DQorICAgIDxJbnREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlV2l0aG91dEFzbXxJdGFuaXVtJyI+aWE2NFxUZXN0WmxpYiQoQ29uZmlndXJhdGlvbilcVG1wXDwvSW50RGlyPg0KKyAgICA8TGlua0luY3JlbWVudGFsIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZVdpdGhvdXRBc218SXRhbml1bSciPmZhbHNlPC9MaW5rSW5jcmVtZW50YWw+DQorICAgIDxHZW5lcmF0ZU1hbmlmZXN0IENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZVdpdGhvdXRBc218SXRhbml1bSciPmZhbHNlPC9HZW5lcmF0ZU1hbmlmZXN0Pg0KKyAgICA8T3V0RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj54NjRcVGVzdFpsaWIkKENvbmZpZ3VyYXRpb24pXDwvT3V0RGlyPg0KKyAgICA8SW50RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj54NjRcVGVzdFpsaWIkKENvbmZpZ3VyYXRpb24pXFRtcFw8L0ludERpcj4NCisgICAgPEdlbmVyYXRlTWFuaWZlc3QgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciPmZhbHNlPC9HZW5lcmF0ZU1hbmlmZXN0Pg0KKyAgICA8T3V0RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxJdGFuaXVtJyI+aWE2NFxUZXN0WmxpYiQoQ29uZmlndXJhdGlvbilcPC9PdXREaXI+DQorICAgIDxJbnREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfEl0YW5pdW0nIj5pYTY0XFRlc3RabGliJChDb25maWd1cmF0aW9uKVxUbXBcPC9JbnREaXI+DQorICAgIDxMaW5rSW5jcmVtZW50YWwgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfEl0YW5pdW0nIj5mYWxzZTwvTGlua0luY3JlbWVudGFsPg0KKyAgICA8R2VuZXJhdGVNYW5pZmVzdCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8SXRhbml1bSciPmZhbHNlPC9HZW5lcmF0ZU1hbmlmZXN0Pg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZVNldCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfEl0YW5pdW0nIj5BbGxSdWxlcy5ydWxlc2V0PC9Db2RlQW5hbHlzaXNSdWxlU2V0Pg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xJdGFuaXVtJyIgLz4NCisgICAgPENvZGVBbmFseXNpc1J1bGVBc3NlbWJsaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8SXRhbml1bSciIC8+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlU2V0IENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj5BbGxSdWxlcy5ydWxlc2V0PC9Db2RlQW5hbHlzaXNSdWxlU2V0Pg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciIC8+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlQXNzZW1ibGllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyIgLz4NCisgICAgPENvZGVBbmFseXNpc1J1bGVTZXQgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj5BbGxSdWxlcy5ydWxlc2V0PC9Db2RlQW5hbHlzaXNSdWxlU2V0Pg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIiAvPg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZUFzc2VtYmxpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIiAvPg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZVNldCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2VXaXRob3V0QXNtfEl0YW5pdW0nIj5BbGxSdWxlcy5ydWxlc2V0PC9Db2RlQW5hbHlzaXNSdWxlU2V0Pg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlV2l0aG91dEFzbXxJdGFuaXVtJyIgLz4NCisgICAgPENvZGVBbmFseXNpc1J1bGVBc3NlbWJsaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZVdpdGhvdXRBc218SXRhbml1bSciIC8+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlU2V0IENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZVdpdGhvdXRBc218V2luMzInIj5BbGxSdWxlcy5ydWxlc2V0PC9Db2RlQW5hbHlzaXNSdWxlU2V0Pg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlV2l0aG91dEFzbXxXaW4zMiciIC8+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlQXNzZW1ibGllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2VXaXRob3V0QXNtfFdpbjMyJyIgLz4NCisgICAgPENvZGVBbmFseXNpc1J1bGVTZXQgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlV2l0aG91dEFzbXx4NjQnIj5BbGxSdWxlcy5ydWxlc2V0PC9Db2RlQW5hbHlzaXNSdWxlU2V0Pg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlV2l0aG91dEFzbXx4NjQnIiAvPg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZUFzc2VtYmxpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlV2l0aG91dEFzbXx4NjQnIiAvPg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZVNldCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8SXRhbml1bSciPkFsbFJ1bGVzLnJ1bGVzZXQ8L0NvZGVBbmFseXNpc1J1bGVTZXQ+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8SXRhbml1bSciIC8+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlQXNzZW1ibGllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8SXRhbml1bSciIC8+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlU2V0IENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPkFsbFJ1bGVzLnJ1bGVzZXQ8L0NvZGVBbmFseXNpc1J1bGVTZXQ+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIiAvPg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZUFzc2VtYmxpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyIgLz4NCisgICAgPENvZGVBbmFseXNpc1J1bGVTZXQgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciPkFsbFJ1bGVzLnJ1bGVzZXQ8L0NvZGVBbmFseXNpc1J1bGVTZXQ+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyIgLz4NCisgICAgPENvZGVBbmFseXNpc1J1bGVBc3NlbWJsaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIiAvPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPg0KKyAgICA8Q2xDb21waWxlPg0KKyAgICAgIDxPcHRpbWl6YXRpb24+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4NCisgICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4uLlwuLlwuLjslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5BU01WO0FTTUlORjtXSU4zMjtaTElCX1dJTkFQSTtfREVCVUc7X0NPTlNPTEU7X0NSVF9OT05TVERDX05PX0RFUFJFQ0FURTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7X0NSVF9OT05TVERDX05PX1dBUk5JTkdTOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8TWluaW1hbFJlYnVpbGQ+dHJ1ZTwvTWluaW1hbFJlYnVpbGQ+DQorICAgICAgPEJhc2ljUnVudGltZUNoZWNrcz5EZWZhdWx0PC9CYXNpY1J1bnRpbWVDaGVja3M+DQorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWREZWJ1ZzwvUnVudGltZUxpYnJhcnk+DQorICAgICAgPEJ1ZmZlclNlY3VyaXR5Q2hlY2s+ZmFsc2U8L0J1ZmZlclNlY3VyaXR5Q2hlY2s+DQorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDwvUHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPEFzc2VtYmxlck91dHB1dD5Bc3NlbWJseUFuZFNvdXJjZUNvZGU8L0Fzc2VtYmxlck91dHB1dD4NCisgICAgICA8QXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPiQoSW50RGlyKTwvQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPg0KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+DQorICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+RWRpdEFuZENvbnRpbnVlPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0Pg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPExpbms+DQorICAgICAgPEFkZGl0aW9uYWxEZXBlbmRlbmNpZXM+Li5cLi5cbWFzbXg4NlxtYXRjaDY4Ni5vYmo7Li5cLi5cbWFzbXg4NlxpbmZmYXMzMi5vYmo7JShBZGRpdGlvbmFsRGVwZW5kZW5jaWVzKTwvQWRkaXRpb25hbERlcGVuZGVuY2llcz4NCisgICAgICA8T3V0cHV0RmlsZT4kKE91dERpcil0ZXN0emxpYi5leGU8L091dHB1dEZpbGU+DQorICAgICAgPEdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj50cnVlPC9HZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+DQorICAgICAgPFByb2dyYW1EYXRhYmFzZUZpbGU+JChPdXREaXIpdGVzdHpsaWIucGRiPC9Qcm9ncmFtRGF0YWJhc2VGaWxlPg0KKyAgICAgIDxTdWJTeXN0ZW0+Q29uc29sZTwvU3ViU3lzdGVtPg0KKyAgICAgIDxSYW5kb21pemVkQmFzZUFkZHJlc3M+ZmFsc2U8L1JhbmRvbWl6ZWRCYXNlQWRkcmVzcz4NCisgICAgICA8RGF0YUV4ZWN1dGlvblByZXZlbnRpb24+DQorICAgICAgPC9EYXRhRXhlY3V0aW9uUHJldmVudGlvbj4NCisgICAgICA8VGFyZ2V0TWFjaGluZT5NYWNoaW5lWDg2PC9UYXJnZXRNYWNoaW5lPg0KKyAgICA8L0xpbms+DQorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+DQorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2VXaXRob3V0QXNtfFdpbjMyJyI+DQorICAgIDxDbENvbXBpbGU+DQorICAgICAgPE9wdGltaXphdGlvbj5NYXhTcGVlZDwvT3B0aW1pemF0aW9uPg0KKyAgICAgIDxJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj5Pbmx5RXhwbGljaXRJbmxpbmU8L0lubGluZUZ1bmN0aW9uRXhwYW5zaW9uPg0KKyAgICAgIDxPbWl0RnJhbWVQb2ludGVycz50cnVlPC9PbWl0RnJhbWVQb2ludGVycz4NCisgICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4uLlwuLlwuLjslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5XSU4zMjtaTElCX1dJTkFQSTtOREVCVUc7X0NPTlNPTEU7X0NSVF9OT05TVERDX05PX0RFUFJFQ0FURTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7X0NSVF9OT05TVERDX05PX1dBUk5JTkdTOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8U3RyaW5nUG9vbGluZz50cnVlPC9TdHJpbmdQb29saW5nPg0KKyAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3M+RGVmYXVsdDwvQmFzaWNSdW50aW1lQ2hlY2tzPg0KKyAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkPC9SdW50aW1lTGlicmFyeT4NCisgICAgICA8QnVmZmVyU2VjdXJpdHlDaGVjaz5mYWxzZTwvQnVmZmVyU2VjdXJpdHlDaGVjaz4NCisgICAgICA8RnVuY3Rpb25MZXZlbExpbmtpbmc+dHJ1ZTwvRnVuY3Rpb25MZXZlbExpbmtpbmc+DQorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDwvUHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPEFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj4kKEludERpcik8L0Fzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj4NCisgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPg0KKyAgICAgIDxEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PlByb2dyYW1EYXRhYmFzZTwvRGVidWdJbmZvcm1hdGlvbkZvcm1hdD4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxMaW5rPg0KKyAgICAgIDxPdXRwdXRGaWxlPiQoT3V0RGlyKXRlc3R6bGliLmV4ZTwvT3V0cHV0RmlsZT4NCisgICAgICA8R2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPnRydWU8L0dlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj4NCisgICAgICA8U3ViU3lzdGVtPkNvbnNvbGU8L1N1YlN5c3RlbT4NCisgICAgICA8T3B0aW1pemVSZWZlcmVuY2VzPnRydWU8L09wdGltaXplUmVmZXJlbmNlcz4NCisgICAgICA8RW5hYmxlQ09NREFURm9sZGluZz50cnVlPC9FbmFibGVDT01EQVRGb2xkaW5nPg0KKyAgICAgIDxSYW5kb21pemVkQmFzZUFkZHJlc3M+ZmFsc2U8L1JhbmRvbWl6ZWRCYXNlQWRkcmVzcz4NCisgICAgICA8RGF0YUV4ZWN1dGlvblByZXZlbnRpb24+DQorICAgICAgPC9EYXRhRXhlY3V0aW9uUHJldmVudGlvbj4NCisgICAgICA8VGFyZ2V0TWFjaGluZT5NYWNoaW5lWDg2PC9UYXJnZXRNYWNoaW5lPg0KKyAgICA8L0xpbms+DQorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+DQorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj4NCisgICAgPENsQ29tcGlsZT4NCisgICAgICA8T3B0aW1pemF0aW9uPk1heFNwZWVkPC9PcHRpbWl6YXRpb24+DQorICAgICAgPElubGluZUZ1bmN0aW9uRXhwYW5zaW9uPk9ubHlFeHBsaWNpdElubGluZTwvSW5saW5lRnVuY3Rpb25FeHBhbnNpb24+DQorICAgICAgPE9taXRGcmFtZVBvaW50ZXJzPnRydWU8L09taXRGcmFtZVBvaW50ZXJzPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPi4uXC4uXC4uOyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPkFTTVY7QVNNSU5GO1dJTjMyO1pMSUJfV0lOQVBJO05ERUJVRztfQ09OU09MRTtfQ1JUX05PTlNURENfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtfQ1JUX05PTlNURENfTk9fV0FSTklOR1M7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KKyAgICAgIDxTdHJpbmdQb29saW5nPnRydWU8L1N0cmluZ1Bvb2xpbmc+DQorICAgICAgPEJhc2ljUnVudGltZUNoZWNrcz5EZWZhdWx0PC9CYXNpY1J1bnRpbWVDaGVja3M+DQorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWQ8L1J1bnRpbWVMaWJyYXJ5Pg0KKyAgICAgIDxCdWZmZXJTZWN1cml0eUNoZWNrPmZhbHNlPC9CdWZmZXJTZWN1cml0eUNoZWNrPg0KKyAgICAgIDxGdW5jdGlvbkxldmVsTGlua2luZz50cnVlPC9GdW5jdGlvbkxldmVsTGlua2luZz4NCisgICAgICA8UHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPC9QcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8QXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPiQoSW50RGlyKTwvQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPg0KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+DQorICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+UHJvZ3JhbURhdGFiYXNlPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0Pg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPExpbms+DQorICAgICAgPEFkZGl0aW9uYWxEZXBlbmRlbmNpZXM+Li5cLi5cbWFzbXg4NlxtYXRjaDY4Ni5vYmo7Li5cLi5cbWFzbXg4NlxpbmZmYXMzMi5vYmo7JShBZGRpdGlvbmFsRGVwZW5kZW5jaWVzKTwvQWRkaXRpb25hbERlcGVuZGVuY2llcz4NCisgICAgICA8T3V0cHV0RmlsZT4kKE91dERpcil0ZXN0emxpYi5leGU8L091dHB1dEZpbGU+DQorICAgICAgPEdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj50cnVlPC9HZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+DQorICAgICAgPFN1YlN5c3RlbT5Db25zb2xlPC9TdWJTeXN0ZW0+DQorICAgICAgPE9wdGltaXplUmVmZXJlbmNlcz50cnVlPC9PcHRpbWl6ZVJlZmVyZW5jZXM+DQorICAgICAgPEVuYWJsZUNPTURBVEZvbGRpbmc+dHJ1ZTwvRW5hYmxlQ09NREFURm9sZGluZz4NCisgICAgICA8UmFuZG9taXplZEJhc2VBZGRyZXNzPmZhbHNlPC9SYW5kb21pemVkQmFzZUFkZHJlc3M+DQorICAgICAgPERhdGFFeGVjdXRpb25QcmV2ZW50aW9uPg0KKyAgICAgIDwvRGF0YUV4ZWN1dGlvblByZXZlbnRpb24+DQorICAgICAgPFRhcmdldE1hY2hpbmU+TWFjaGluZVg4NjwvVGFyZ2V0TWFjaGluZT4NCisgICAgPC9MaW5rPg0KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPg0KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj4NCisgICAgPENsQ29tcGlsZT4NCisgICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4uLlwuLlwuLjslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5BU01WO0FTTUlORjtXSU4zMjtaTElCX1dJTkFQSTtfREVCVUc7X0NPTlNPTEU7X0NSVF9OT05TVERDX05PX0RFUFJFQ0FURTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7X0NSVF9OT05TVERDX05PX1dBUk5JTkdTOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzPkRlZmF1bHQ8L0Jhc2ljUnVudGltZUNoZWNrcz4NCisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZERlYnVnRExMPC9SdW50aW1lTGlicmFyeT4NCisgICAgICA8QnVmZmVyU2VjdXJpdHlDaGVjaz5mYWxzZTwvQnVmZmVyU2VjdXJpdHlDaGVjaz4NCisgICAgICA8QXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPiQoSW50RGlyKTwvQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPExpbms+DQorICAgICAgPEFkZGl0aW9uYWxEZXBlbmRlbmNpZXM+Li5cLi5cbWFzbXg2NFxndm1hdDY0Lm9iajsuLlwuLlxtYXNteDY0XGluZmZhc3g2NC5vYmo7JShBZGRpdGlvbmFsRGVwZW5kZW5jaWVzKTwvQWRkaXRpb25hbERlcGVuZGVuY2llcz4NCisgICAgPC9MaW5rPg0KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPg0KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xJdGFuaXVtJyI+DQorICAgIDxNaWRsPg0KKyAgICAgIDxUYXJnZXRFbnZpcm9ubWVudD5JdGFuaXVtPC9UYXJnZXRFbnZpcm9ubWVudD4NCisgICAgPC9NaWRsPg0KKyAgICA8Q2xDb21waWxlPg0KKyAgICAgIDxPcHRpbWl6YXRpb24+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4NCisgICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4uLlwuLlwuLjslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5aTElCX1dJTkFQSTtfREVCVUc7X0NPTlNPTEU7X0NSVF9OT05TVERDX05PX0RFUFJFQ0FURTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7X0NSVF9OT05TVERDX05PX1dBUk5JTkdTO1dJTjY0OyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8TWluaW1hbFJlYnVpbGQ+dHJ1ZTwvTWluaW1hbFJlYnVpbGQ+DQorICAgICAgPEJhc2ljUnVudGltZUNoZWNrcz5EZWZhdWx0PC9CYXNpY1J1bnRpbWVDaGVja3M+DQorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWREZWJ1Z0RMTDwvUnVudGltZUxpYnJhcnk+DQorICAgICAgPEJ1ZmZlclNlY3VyaXR5Q2hlY2s+ZmFsc2U8L0J1ZmZlclNlY3VyaXR5Q2hlY2s+DQorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDwvUHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPEFzc2VtYmxlck91dHB1dD5Bc3NlbWJseUFuZFNvdXJjZUNvZGU8L0Fzc2VtYmxlck91dHB1dD4NCisgICAgICA8QXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPiQoSW50RGlyKTwvQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPg0KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+DQorICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+UHJvZ3JhbURhdGFiYXNlPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0Pg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPExpbms+DQorICAgICAgPE91dHB1dEZpbGU+JChPdXREaXIpdGVzdHpsaWIuZXhlPC9PdXRwdXRGaWxlPg0KKyAgICAgIDxHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+dHJ1ZTwvR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPg0KKyAgICAgIDxQcm9ncmFtRGF0YWJhc2VGaWxlPiQoT3V0RGlyKXRlc3R6bGliLnBkYjwvUHJvZ3JhbURhdGFiYXNlRmlsZT4NCisgICAgICA8U3ViU3lzdGVtPkNvbnNvbGU8L1N1YlN5c3RlbT4NCisgICAgICA8VGFyZ2V0TWFjaGluZT5NYWNoaW5lSUE2NDwvVGFyZ2V0TWFjaGluZT4NCisgICAgPC9MaW5rPg0KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPg0KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlV2l0aG91dEFzbXx4NjQnIj4NCisgICAgPENsQ29tcGlsZT4NCisgICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4uLlwuLlwuLjslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5XSU4zMjtaTElCX1dJTkFQSTtOREVCVUc7X0NPTlNPTEU7X0NSVF9OT05TVERDX05PX0RFUFJFQ0FURTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7X0NSVF9OT05TVERDX05PX1dBUk5JTkdTOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzPkRlZmF1bHQ8L0Jhc2ljUnVudGltZUNoZWNrcz4NCisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZERMTDwvUnVudGltZUxpYnJhcnk+DQorICAgICAgPEJ1ZmZlclNlY3VyaXR5Q2hlY2s+ZmFsc2U8L0J1ZmZlclNlY3VyaXR5Q2hlY2s+DQorICAgICAgPEFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj4kKEludERpcik8L0Fzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxMaW5rPg0KKyAgICAgIDxBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPiUoQWRkaXRpb25hbERlcGVuZGVuY2llcyk8L0FkZGl0aW9uYWxEZXBlbmRlbmNpZXM+DQorICAgIDwvTGluaz4NCisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4NCisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZVdpdGhvdXRBc218SXRhbml1bSciPg0KKyAgICA8TWlkbD4NCisgICAgICA8VGFyZ2V0RW52aXJvbm1lbnQ+SXRhbml1bTwvVGFyZ2V0RW52aXJvbm1lbnQ+DQorICAgIDwvTWlkbD4NCisgICAgPENsQ29tcGlsZT4NCisgICAgICA8T3B0aW1pemF0aW9uPk1heFNwZWVkPC9PcHRpbWl6YXRpb24+DQorICAgICAgPElubGluZUZ1bmN0aW9uRXhwYW5zaW9uPk9ubHlFeHBsaWNpdElubGluZTwvSW5saW5lRnVuY3Rpb25FeHBhbnNpb24+DQorICAgICAgPE9taXRGcmFtZVBvaW50ZXJzPnRydWU8L09taXRGcmFtZVBvaW50ZXJzPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPi4uXC4uXC4uOyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPlpMSUJfV0lOQVBJO05ERUJVRztfQ09OU09MRTtfQ1JUX05PTlNURENfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtfQ1JUX05PTlNURENfTk9fV0FSTklOR1M7V0lONjQ7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KKyAgICAgIDxTdHJpbmdQb29saW5nPnRydWU8L1N0cmluZ1Bvb2xpbmc+DQorICAgICAgPEJhc2ljUnVudGltZUNoZWNrcz5EZWZhdWx0PC9CYXNpY1J1bnRpbWVDaGVja3M+DQorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWRETEw8L1J1bnRpbWVMaWJyYXJ5Pg0KKyAgICAgIDxCdWZmZXJTZWN1cml0eUNoZWNrPmZhbHNlPC9CdWZmZXJTZWN1cml0eUNoZWNrPg0KKyAgICAgIDxGdW5jdGlvbkxldmVsTGlua2luZz50cnVlPC9GdW5jdGlvbkxldmVsTGlua2luZz4NCisgICAgICA8UHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPC9QcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8QXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPiQoSW50RGlyKTwvQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPg0KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+DQorICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+UHJvZ3JhbURhdGFiYXNlPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0Pg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPExpbms+DQorICAgICAgPE91dHB1dEZpbGU+JChPdXREaXIpdGVzdHpsaWIuZXhlPC9PdXRwdXRGaWxlPg0KKyAgICAgIDxHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+dHJ1ZTwvR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPg0KKyAgICAgIDxTdWJTeXN0ZW0+Q29uc29sZTwvU3ViU3lzdGVtPg0KKyAgICAgIDxPcHRpbWl6ZVJlZmVyZW5jZXM+dHJ1ZTwvT3B0aW1pemVSZWZlcmVuY2VzPg0KKyAgICAgIDxFbmFibGVDT01EQVRGb2xkaW5nPnRydWU8L0VuYWJsZUNPTURBVEZvbGRpbmc+DQorICAgICAgPFRhcmdldE1hY2hpbmU+TWFjaGluZUlBNjQ8L1RhcmdldE1hY2hpbmU+DQorICAgIDwvTGluaz4NCisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4NCisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj4NCisgICAgPENsQ29tcGlsZT4NCisgICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4uLlwuLlwuLjslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5BU01WO0FTTUlORjtXSU4zMjtaTElCX1dJTkFQSTtOREVCVUc7X0NPTlNPTEU7X0NSVF9OT05TVERDX05PX0RFUFJFQ0FURTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7X0NSVF9OT05TVERDX05PX1dBUk5JTkdTOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzPkRlZmF1bHQ8L0Jhc2ljUnVudGltZUNoZWNrcz4NCisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZERMTDwvUnVudGltZUxpYnJhcnk+DQorICAgICAgPEJ1ZmZlclNlY3VyaXR5Q2hlY2s+ZmFsc2U8L0J1ZmZlclNlY3VyaXR5Q2hlY2s+DQorICAgICAgPEFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj4kKEludERpcik8L0Fzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxMaW5rPg0KKyAgICAgIDxBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPi4uXC4uXG1hc214NjRcZ3ZtYXQ2NC5vYmo7Li5cLi5cbWFzbXg2NFxpbmZmYXN4NjQub2JqOyUoQWRkaXRpb25hbERlcGVuZGVuY2llcyk8L0FkZGl0aW9uYWxEZXBlbmRlbmNpZXM+DQorICAgIDwvTGluaz4NCisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4NCisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxJdGFuaXVtJyI+DQorICAgIDxNaWRsPg0KKyAgICAgIDxUYXJnZXRFbnZpcm9ubWVudD5JdGFuaXVtPC9UYXJnZXRFbnZpcm9ubWVudD4NCisgICAgPC9NaWRsPg0KKyAgICA8Q2xDb21waWxlPg0KKyAgICAgIDxPcHRpbWl6YXRpb24+TWF4U3BlZWQ8L09wdGltaXphdGlvbj4NCisgICAgICA8SW5saW5lRnVuY3Rpb25FeHBhbnNpb24+T25seUV4cGxpY2l0SW5saW5lPC9JbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj4NCisgICAgICA8T21pdEZyYW1lUG9pbnRlcnM+dHJ1ZTwvT21pdEZyYW1lUG9pbnRlcnM+DQorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+Li5cLi5cLi47JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+WkxJQl9XSU5BUEk7TkRFQlVHO19DT05TT0xFO19DUlRfTk9OU1REQ19OT19ERVBSRUNBVEU7X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFO19DUlRfTk9OU1REQ19OT19XQVJOSU5HUztXSU42NDslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPFN0cmluZ1Bvb2xpbmc+dHJ1ZTwvU3RyaW5nUG9vbGluZz4NCisgICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzPkRlZmF1bHQ8L0Jhc2ljUnVudGltZUNoZWNrcz4NCisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZERMTDwvUnVudGltZUxpYnJhcnk+DQorICAgICAgPEJ1ZmZlclNlY3VyaXR5Q2hlY2s+ZmFsc2U8L0J1ZmZlclNlY3VyaXR5Q2hlY2s+DQorICAgICAgPEZ1bmN0aW9uTGV2ZWxMaW5raW5nPnRydWU8L0Z1bmN0aW9uTGV2ZWxMaW5raW5nPg0KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8L1ByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDxBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb24+JChJbnREaXIpPC9Bc3NlbWJsZXJMaXN0aW5nTG9jYXRpb24+DQorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4NCisgICAgICA8RGVidWdJbmZvcm1hdGlvbkZvcm1hdD5Qcm9ncmFtRGF0YWJhc2U8L0RlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8TGluaz4NCisgICAgICA8T3V0cHV0RmlsZT4kKE91dERpcil0ZXN0emxpYi5leGU8L091dHB1dEZpbGU+DQorICAgICAgPEdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj50cnVlPC9HZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+DQorICAgICAgPFN1YlN5c3RlbT5Db25zb2xlPC9TdWJTeXN0ZW0+DQorICAgICAgPE9wdGltaXplUmVmZXJlbmNlcz50cnVlPC9PcHRpbWl6ZVJlZmVyZW5jZXM+DQorICAgICAgPEVuYWJsZUNPTURBVEZvbGRpbmc+dHJ1ZTwvRW5hYmxlQ09NREFURm9sZGluZz4NCisgICAgICA8VGFyZ2V0TWFjaGluZT5NYWNoaW5lSUE2NDwvVGFyZ2V0TWFjaGluZT4NCisgICAgPC9MaW5rPg0KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxhZGxlcjMyLmMiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cY29tcHJlc3MuYyIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxjcmMzMi5jIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXGRlZmxhdGUuYyIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxpbmZiYWNrLmMiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbWFzbXg2NFxpbmZmYXM4NjY0LmMiPg0KKyAgICAgIDxFeGNsdWRlZEZyb21CdWlsZCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfEl0YW5pdW0nIj50cnVlPC9FeGNsdWRlZEZyb21CdWlsZD4NCisgICAgICA8RXhjbHVkZWRGcm9tQnVpbGQgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPnRydWU8L0V4Y2x1ZGVkRnJvbUJ1aWxkPg0KKyAgICAgIDxFeGNsdWRlZEZyb21CdWlsZCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2VXaXRob3V0QXNtfEl0YW5pdW0nIj50cnVlPC9FeGNsdWRlZEZyb21CdWlsZD4NCisgICAgICA8RXhjbHVkZWRGcm9tQnVpbGQgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlV2l0aG91dEFzbXxXaW4zMiciPnRydWU8L0V4Y2x1ZGVkRnJvbUJ1aWxkPg0KKyAgICAgIDxFeGNsdWRlZEZyb21CdWlsZCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8SXRhbml1bSciPnRydWU8L0V4Y2x1ZGVkRnJvbUJ1aWxkPg0KKyAgICAgIDxFeGNsdWRlZEZyb21CdWlsZCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj50cnVlPC9FeGNsdWRlZEZyb21CdWlsZD4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5caW5mZmFzdC5jIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXGluZmxhdGUuYyIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxpbmZ0cmVlcy5jIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXHRlc3R6bGliXHRlc3R6bGliLmMiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cdHJlZXMuYyIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlx1bmNvbXByLmMiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cenV0aWwuYyIgLz4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEltcG9ydCBQcm9qZWN0PSIkKFZDVGFyZ2V0c1BhdGgpXE1pY3Jvc29mdC5DcHAudGFyZ2V0cyIgLz4NCisgIDxJbXBvcnRHcm91cCBMYWJlbD0iRXh0ZW5zaW9uVGFyZ2V0cyI+DQorICA8L0ltcG9ydEdyb3VwPg0KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS96bGliLTEuMi42L2NvbnRyaWIvdnN0dWRpby92YzEwL3Rlc3R6bGliLnZjeHByb2ouZmlsdGVycyBiL3psaWItMS4yLjYvY29udHJpYi92c3R1ZGlvL3ZjMTAvdGVzdHpsaWIudmN4cHJvai5maWx0ZXJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0OWRhYTgKLS0tIC9kZXYvbnVsbAorKysgYi96bGliLTEuMi42L2NvbnRyaWIvdnN0dWRpby92YzEwL3Rlc3R6bGliLnZjeHByb2ouZmlsdGVycwpAQCAtMCwwICsxLDU4IEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KKzxQcm9qZWN0IFRvb2xzVmVyc2lvbj0iNC4wIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxGaWx0ZXIgSW5jbHVkZT0iU291cmNlIEZpbGVzIj4NCisgICAgICA8VW5pcXVlSWRlbnRpZmllcj57YzFmNmEyZTMtNWRhNS00OTU1LTg2NTMtMzEwZDNlZmUwNWE5fTwvVW5pcXVlSWRlbnRpZmllcj4NCisgICAgICA8RXh0ZW5zaW9ucz5jcHA7YztjeHg7ZGVmO29kbDtpZGw7aHBqO2JhdDthc208L0V4dGVuc2lvbnM+DQorICAgIDwvRmlsdGVyPg0KKyAgICA8RmlsdGVyIEluY2x1ZGU9IkhlYWRlciBGaWxlcyI+DQorICAgICAgPFVuaXF1ZUlkZW50aWZpZXI+e2MyYWFmZmRjLTJjOTUtNGQ2Zi04NDY2LTRiZWM1ODkwYWYyY308L1VuaXF1ZUlkZW50aWZpZXI+DQorICAgICAgPEV4dGVuc2lvbnM+aDtocHA7aHh4O2htO2lubDtpbmM8L0V4dGVuc2lvbnM+DQorICAgIDwvRmlsdGVyPg0KKyAgICA8RmlsdGVyIEluY2x1ZGU9IlJlc291cmNlIEZpbGVzIj4NCisgICAgICA8VW5pcXVlSWRlbnRpZmllcj57YzI3NGZlMDctMDVmMi00NjFjLTk2NGItZjYzNDFlNGU3ZWI1fTwvVW5pcXVlSWRlbnRpZmllcj4NCisgICAgICA8RXh0ZW5zaW9ucz5yYztpY287Y3VyO2JtcDtkbGc7cmMyO3JjdDtiaW47cmdzO2dpZjtqcGc7anBlZztqcGU8L0V4dGVuc2lvbnM+DQorICAgIDwvRmlsdGVyPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXGFkbGVyMzIuYyI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cY29tcHJlc3MuYyI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cY3JjMzIuYyI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cZGVmbGF0ZS5jIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxpbmZiYWNrLmMiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXG1hc214NjRcaW5mZmFzODY2NC5jIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxpbmZmYXN0LmMiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXGluZmxhdGUuYyI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5caW5mdHJlZXMuYyI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cdGVzdHpsaWJcdGVzdHpsaWIuYyI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cdHJlZXMuYyI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cdW5jb21wci5jIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlx6dXRpbC5jIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgIDwvSXRlbUdyb3VwPg0KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS96bGliLTEuMi42L2NvbnRyaWIvdnN0dWRpby92YzEwL3Rlc3R6bGliLnZjeHByb2oudXNlciBiL3psaWItMS4yLjYvY29udHJpYi92c3R1ZGlvL3ZjMTAvdGVzdHpsaWIudmN4cHJvai51c2VyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5NWI1YzcKLS0tIC9kZXYvbnVsbAorKysgYi96bGliLTEuMi42L2NvbnRyaWIvdnN0dWRpby92YzEwL3Rlc3R6bGliLnZjeHByb2oudXNlcgpAQCAtMCwwICsxLDMgQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQorPFByb2plY3QgVG9vbHNWZXJzaW9uPSI0LjAiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPg0KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS96bGliLTEuMi42L2NvbnRyaWIvdnN0dWRpby92YzEwL3Rlc3R6bGliZGxsLnZjeHByb2ogYi96bGliLTEuMi42L2NvbnRyaWIvdnN0dWRpby92YzEwL3Rlc3R6bGliZGxsLnZjeHByb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ2MjgxNQotLS0gL2Rldi9udWxsCisrKyBiL3psaWItMS4yLjYvY29udHJpYi92c3R1ZGlvL3ZjMTAvdGVzdHpsaWJkbGwudmN4cHJvagpAQCAtMCwwICsxLDMxMCBAQAor77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCis8UHJvamVjdCBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIFRvb2xzVmVyc2lvbj0iNC4wIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4NCisgIDxJdGVtR3JvdXAgTGFiZWw9IlByb2plY3RDb25maWd1cmF0aW9ucyI+DQorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJEZWJ1Z3xJdGFuaXVtIj4NCisgICAgICA8Q29uZmlndXJhdGlvbj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4NCisgICAgICA8UGxhdGZvcm0+SXRhbml1bTwvUGxhdGZvcm0+DQorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+DQorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJEZWJ1Z3xXaW4zMiI+DQorICAgICAgPENvbmZpZ3VyYXRpb24+RGVidWc8L0NvbmZpZ3VyYXRpb24+DQorICAgICAgPFBsYXRmb3JtPldpbjMyPC9QbGF0Zm9ybT4NCisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4NCisgICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IkRlYnVnfHg2NCI+DQorICAgICAgPENvbmZpZ3VyYXRpb24+RGVidWc8L0NvbmZpZ3VyYXRpb24+DQorICAgICAgPFBsYXRmb3JtPng2NDwvUGxhdGZvcm0+DQorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+DQorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJSZWxlYXNlfEl0YW5pdW0iPg0KKyAgICAgIDxDb25maWd1cmF0aW9uPlJlbGVhc2U8L0NvbmZpZ3VyYXRpb24+DQorICAgICAgPFBsYXRmb3JtPkl0YW5pdW08L1BsYXRmb3JtPg0KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPg0KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUmVsZWFzZXxXaW4zMiI+DQorICAgICAgPENvbmZpZ3VyYXRpb24+UmVsZWFzZTwvQ29uZmlndXJhdGlvbj4NCisgICAgICA8UGxhdGZvcm0+V2luMzI8L1BsYXRmb3JtPg0KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPg0KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUmVsZWFzZXx4NjQiPg0KKyAgICAgIDxDb25maWd1cmF0aW9uPlJlbGVhc2U8L0NvbmZpZ3VyYXRpb24+DQorICAgICAgPFBsYXRmb3JtPng2NDwvUGxhdGZvcm0+DQorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIExhYmVsPSJHbG9iYWxzIj4NCisgICAgPFByb2plY3RHdWlkPntDNTJGOUU3Qi00OThBLTQyQkUtOERCNC04NUExNTY5NDM2NkF9PC9Qcm9qZWN0R3VpZD4NCisgICAgPEtleXdvcmQ+V2luMzJQcm9qPC9LZXl3b3JkPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPEltcG9ydCBQcm9qZWN0PSIkKFZDVGFyZ2V0c1BhdGgpXE1pY3Jvc29mdC5DcHAuRGVmYXVsdC5wcm9wcyIgLz4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciIExhYmVsPSJDb25maWd1cmF0aW9uIj4NCisgICAgPENvbmZpZ3VyYXRpb25UeXBlPkFwcGxpY2F0aW9uPC9Db25maWd1cmF0aW9uVHlwZT4NCisgICAgPENoYXJhY3RlclNldD5NdWx0aUJ5dGU8L0NoYXJhY3RlclNldD4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+DQorICAgIDxDb25maWd1cmF0aW9uVHlwZT5BcHBsaWNhdGlvbjwvQ29uZmlndXJhdGlvblR5cGU+DQorICAgIDxDaGFyYWN0ZXJTZXQ+TXVsdGlCeXRlPC9DaGFyYWN0ZXJTZXQ+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8SXRhbml1bSciIExhYmVsPSJDb25maWd1cmF0aW9uIj4NCisgICAgPENvbmZpZ3VyYXRpb25UeXBlPkFwcGxpY2F0aW9uPC9Db25maWd1cmF0aW9uVHlwZT4NCisgICAgPENoYXJhY3RlclNldD5NdWx0aUJ5dGU8L0NoYXJhY3RlclNldD4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8SXRhbml1bSciIExhYmVsPSJDb25maWd1cmF0aW9uIj4NCisgICAgPENvbmZpZ3VyYXRpb25UeXBlPkFwcGxpY2F0aW9uPC9Db25maWd1cmF0aW9uVHlwZT4NCisgICAgPENoYXJhY3RlclNldD5NdWx0aUJ5dGU8L0NoYXJhY3RlclNldD4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+DQorICAgIDxDb25maWd1cmF0aW9uVHlwZT5BcHBsaWNhdGlvbjwvQ29uZmlndXJhdGlvblR5cGU+DQorICAgIDxDaGFyYWN0ZXJTZXQ+TXVsdGlCeXRlPC9DaGFyYWN0ZXJTZXQ+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciIExhYmVsPSJDb25maWd1cmF0aW9uIj4NCisgICAgPENvbmZpZ3VyYXRpb25UeXBlPkFwcGxpY2F0aW9uPC9Db25maWd1cmF0aW9uVHlwZT4NCisgICAgPENoYXJhY3RlclNldD5NdWx0aUJ5dGU8L0NoYXJhY3RlclNldD4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLnByb3BzIiAvPg0KKyAgPEltcG9ydEdyb3VwIExhYmVsPSJFeHRlbnNpb25TZXR0aW5ncyI+DQorICA8L0ltcG9ydEdyb3VwPg0KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+DQorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4NCisgIDwvSW1wb3J0R3JvdXA+DQorICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+DQorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4NCisgIDwvSW1wb3J0R3JvdXA+DQorICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfEl0YW5pdW0nIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPg0KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+DQorICA8L0ltcG9ydEdyb3VwPg0KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8SXRhbml1bSciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+DQorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4NCisgIDwvSW1wb3J0R3JvdXA+DQorICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+DQorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4NCisgIDwvSW1wb3J0R3JvdXA+DQorICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPg0KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+DQorICA8L0ltcG9ydEdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgTGFiZWw9IlVzZXJNYWNyb3MiIC8+DQorICA8UHJvcGVydHlHcm91cD4NCisgICAgPF9Qcm9qZWN0RmlsZVZlcnNpb24+MTAuMC4zMDEyOC4xPC9fUHJvamVjdEZpbGVWZXJzaW9uPg0KKyAgICA8T3V0RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj54ODZcVGVzdFpsaWJEbGwkKENvbmZpZ3VyYXRpb24pXDwvT3V0RGlyPg0KKyAgICA8SW50RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj54ODZcVGVzdFpsaWJEbGwkKENvbmZpZ3VyYXRpb24pXFRtcFw8L0ludERpcj4NCisgICAgPExpbmtJbmNyZW1lbnRhbCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+dHJ1ZTwvTGlua0luY3JlbWVudGFsPg0KKyAgICA8R2VuZXJhdGVNYW5pZmVzdCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+ZmFsc2U8L0dlbmVyYXRlTWFuaWZlc3Q+DQorICAgIDxPdXREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+eDg2XFRlc3RabGliRGxsJChDb25maWd1cmF0aW9uKVw8L091dERpcj4NCisgICAgPEludERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj54ODZcVGVzdFpsaWJEbGwkKENvbmZpZ3VyYXRpb24pXFRtcFw8L0ludERpcj4NCisgICAgPExpbmtJbmNyZW1lbnRhbCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj5mYWxzZTwvTGlua0luY3JlbWVudGFsPg0KKyAgICA8R2VuZXJhdGVNYW5pZmVzdCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj5mYWxzZTwvR2VuZXJhdGVNYW5pZmVzdD4NCisgICAgPE91dERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciPng2NFxUZXN0WmxpYkRsbCQoQ29uZmlndXJhdGlvbilcPC9PdXREaXI+DQorICAgIDxJbnREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj54NjRcVGVzdFpsaWJEbGwkKENvbmZpZ3VyYXRpb24pXFRtcFw8L0ludERpcj4NCisgICAgPExpbmtJbmNyZW1lbnRhbCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciPnRydWU8L0xpbmtJbmNyZW1lbnRhbD4NCisgICAgPEdlbmVyYXRlTWFuaWZlc3QgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj5mYWxzZTwvR2VuZXJhdGVNYW5pZmVzdD4NCisgICAgPE91dERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfEl0YW5pdW0nIj5pYTY0XFRlc3RabGliRGxsJChDb25maWd1cmF0aW9uKVw8L091dERpcj4NCisgICAgPEludERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfEl0YW5pdW0nIj5pYTY0XFRlc3RabGliRGxsJChDb25maWd1cmF0aW9uKVxUbXBcPC9JbnREaXI+DQorICAgIDxMaW5rSW5jcmVtZW50YWwgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xJdGFuaXVtJyI+dHJ1ZTwvTGlua0luY3JlbWVudGFsPg0KKyAgICA8R2VuZXJhdGVNYW5pZmVzdCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfEl0YW5pdW0nIj5mYWxzZTwvR2VuZXJhdGVNYW5pZmVzdD4NCisgICAgPE91dERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+eDY0XFRlc3RabGliRGxsJChDb25maWd1cmF0aW9uKVw8L091dERpcj4NCisgICAgPEludERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+eDY0XFRlc3RabGliRGxsJChDb25maWd1cmF0aW9uKVxUbXBcPC9JbnREaXI+DQorICAgIDxMaW5rSW5jcmVtZW50YWwgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciPmZhbHNlPC9MaW5rSW5jcmVtZW50YWw+DQorICAgIDxHZW5lcmF0ZU1hbmlmZXN0IENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj5mYWxzZTwvR2VuZXJhdGVNYW5pZmVzdD4NCisgICAgPE91dERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8SXRhbml1bSciPmlhNjRcVGVzdFpsaWJEbGwkKENvbmZpZ3VyYXRpb24pXDwvT3V0RGlyPg0KKyAgICA8SW50RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxJdGFuaXVtJyI+aWE2NFxUZXN0WmxpYkRsbCQoQ29uZmlndXJhdGlvbilcVG1wXDwvSW50RGlyPg0KKyAgICA8TGlua0luY3JlbWVudGFsIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxJdGFuaXVtJyI+ZmFsc2U8L0xpbmtJbmNyZW1lbnRhbD4NCisgICAgPEdlbmVyYXRlTWFuaWZlc3QgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfEl0YW5pdW0nIj5mYWxzZTwvR2VuZXJhdGVNYW5pZmVzdD4NCisgICAgPENvZGVBbmFseXNpc1J1bGVTZXQgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xJdGFuaXVtJyI+QWxsUnVsZXMucnVsZXNldDwvQ29kZUFuYWx5c2lzUnVsZVNldD4NCisgICAgPENvZGVBbmFseXNpc1J1bGVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8SXRhbml1bSciIC8+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlQXNzZW1ibGllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfEl0YW5pdW0nIiAvPg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZVNldCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+QWxsUnVsZXMucnVsZXNldDwvQ29kZUFuYWx5c2lzUnVsZVNldD4NCisgICAgPENvZGVBbmFseXNpc1J1bGVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIiAvPg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZUFzc2VtYmxpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciIC8+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlU2V0IENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+QWxsUnVsZXMucnVsZXNldDwvQ29kZUFuYWx5c2lzUnVsZVNldD4NCisgICAgPENvZGVBbmFseXNpc1J1bGVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyIgLz4NCisgICAgPENvZGVBbmFseXNpc1J1bGVBc3NlbWJsaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyIgLz4NCisgICAgPENvZGVBbmFseXNpc1J1bGVTZXQgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfEl0YW5pdW0nIj5BbGxSdWxlcy5ydWxlc2V0PC9Db2RlQW5hbHlzaXNSdWxlU2V0Pg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfEl0YW5pdW0nIiAvPg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZUFzc2VtYmxpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfEl0YW5pdW0nIiAvPg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZVNldCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj5BbGxSdWxlcy5ydWxlc2V0PC9Db2RlQW5hbHlzaXNSdWxlU2V0Pg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyIgLz4NCisgICAgPENvZGVBbmFseXNpc1J1bGVBc3NlbWJsaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciIC8+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlU2V0IENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj5BbGxSdWxlcy5ydWxlc2V0PC9Db2RlQW5hbHlzaXNSdWxlU2V0Pg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciIC8+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlQXNzZW1ibGllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyIgLz4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj4NCisgICAgPENsQ29tcGlsZT4NCisgICAgICA8T3B0aW1pemF0aW9uPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+DQorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+Li5cLi5cLi47Li5cLi5cbWluaXppcDslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5XSU4zMjtfQ1JUX05PTlNURENfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtaTElCX1dJTkFQSTtfREVCVUc7X0NPTlNPTEU7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KKyAgICAgIDxNaW5pbWFsUmVidWlsZD50cnVlPC9NaW5pbWFsUmVidWlsZD4NCisgICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzPkRlZmF1bHQ8L0Jhc2ljUnVudGltZUNoZWNrcz4NCisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZERlYnVnPC9SdW50aW1lTGlicmFyeT4NCisgICAgICA8QnVmZmVyU2VjdXJpdHlDaGVjaz5mYWxzZTwvQnVmZmVyU2VjdXJpdHlDaGVjaz4NCisgICAgICA8UHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPC9QcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8QXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPiQoSW50RGlyKTwvQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPg0KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+DQorICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+RWRpdEFuZENvbnRpbnVlPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0Pg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPExpbms+DQorICAgICAgPEFkZGl0aW9uYWxEZXBlbmRlbmNpZXM+eDg2XFpsaWJEbGxEZWJ1Z1x6bGlid2FwaS5saWI7JShBZGRpdGlvbmFsRGVwZW5kZW5jaWVzKTwvQWRkaXRpb25hbERlcGVuZGVuY2llcz4NCisgICAgICA8T3V0cHV0RmlsZT4kKE91dERpcil0ZXN0emxpYi5leGU8L091dHB1dEZpbGU+DQorICAgICAgPEdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj50cnVlPC9HZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+DQorICAgICAgPFByb2dyYW1EYXRhYmFzZUZpbGU+JChPdXREaXIpdGVzdHpsaWIucGRiPC9Qcm9ncmFtRGF0YWJhc2VGaWxlPg0KKyAgICAgIDxTdWJTeXN0ZW0+Q29uc29sZTwvU3ViU3lzdGVtPg0KKyAgICAgIDxSYW5kb21pemVkQmFzZUFkZHJlc3M+ZmFsc2U8L1JhbmRvbWl6ZWRCYXNlQWRkcmVzcz4NCisgICAgICA8RGF0YUV4ZWN1dGlvblByZXZlbnRpb24+DQorICAgICAgPC9EYXRhRXhlY3V0aW9uUHJldmVudGlvbj4NCisgICAgICA8VGFyZ2V0TWFjaGluZT5NYWNoaW5lWDg2PC9UYXJnZXRNYWNoaW5lPg0KKyAgICA8L0xpbms+DQorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+DQorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj4NCisgICAgPENsQ29tcGlsZT4NCisgICAgICA8T3B0aW1pemF0aW9uPk1heFNwZWVkPC9PcHRpbWl6YXRpb24+DQorICAgICAgPElubGluZUZ1bmN0aW9uRXhwYW5zaW9uPk9ubHlFeHBsaWNpdElubGluZTwvSW5saW5lRnVuY3Rpb25FeHBhbnNpb24+DQorICAgICAgPE9taXRGcmFtZVBvaW50ZXJzPnRydWU8L09taXRGcmFtZVBvaW50ZXJzPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPi4uXC4uXC4uOy4uXC4uXG1pbml6aXA7JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+V0lOMzI7X0NSVF9OT05TVERDX05PX0RFUFJFQ0FURTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7WkxJQl9XSU5BUEk7TkRFQlVHO19DT05TT0xFOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8U3RyaW5nUG9vbGluZz50cnVlPC9TdHJpbmdQb29saW5nPg0KKyAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3M+RGVmYXVsdDwvQmFzaWNSdW50aW1lQ2hlY2tzPg0KKyAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkPC9SdW50aW1lTGlicmFyeT4NCisgICAgICA8QnVmZmVyU2VjdXJpdHlDaGVjaz5mYWxzZTwvQnVmZmVyU2VjdXJpdHlDaGVjaz4NCisgICAgICA8RnVuY3Rpb25MZXZlbExpbmtpbmc+dHJ1ZTwvRnVuY3Rpb25MZXZlbExpbmtpbmc+DQorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDwvUHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPEFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj4kKEludERpcik8L0Fzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj4NCisgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPg0KKyAgICAgIDxEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PlByb2dyYW1EYXRhYmFzZTwvRGVidWdJbmZvcm1hdGlvbkZvcm1hdD4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxMaW5rPg0KKyAgICAgIDxBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPng4NlxabGliRGxsUmVsZWFzZVx6bGlid2FwaS5saWI7JShBZGRpdGlvbmFsRGVwZW5kZW5jaWVzKTwvQWRkaXRpb25hbERlcGVuZGVuY2llcz4NCisgICAgICA8T3V0cHV0RmlsZT4kKE91dERpcil0ZXN0emxpYi5leGU8L091dHB1dEZpbGU+DQorICAgICAgPEdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj50cnVlPC9HZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+DQorICAgICAgPFN1YlN5c3RlbT5Db25zb2xlPC9TdWJTeXN0ZW0+DQorICAgICAgPE9wdGltaXplUmVmZXJlbmNlcz50cnVlPC9PcHRpbWl6ZVJlZmVyZW5jZXM+DQorICAgICAgPEVuYWJsZUNPTURBVEZvbGRpbmc+dHJ1ZTwvRW5hYmxlQ09NREFURm9sZGluZz4NCisgICAgICA8UmFuZG9taXplZEJhc2VBZGRyZXNzPmZhbHNlPC9SYW5kb21pemVkQmFzZUFkZHJlc3M+DQorICAgICAgPERhdGFFeGVjdXRpb25QcmV2ZW50aW9uPg0KKyAgICAgIDwvRGF0YUV4ZWN1dGlvblByZXZlbnRpb24+DQorICAgICAgPFRhcmdldE1hY2hpbmU+TWFjaGluZVg4NjwvVGFyZ2V0TWFjaGluZT4NCisgICAgPC9MaW5rPg0KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPg0KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj4NCisgICAgPE1pZGw+DQorICAgICAgPFRhcmdldEVudmlyb25tZW50Plg2NDwvVGFyZ2V0RW52aXJvbm1lbnQ+DQorICAgIDwvTWlkbD4NCisgICAgPENsQ29tcGlsZT4NCisgICAgICA8T3B0aW1pemF0aW9uPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+DQorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+Li5cLi5cLi47Li5cLi5cbWluaXppcDslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5fQ1JUX05PTlNURENfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtaTElCX1dJTkFQSTtfREVCVUc7X0NPTlNPTEU7V0lONjQ7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KKyAgICAgIDxNaW5pbWFsUmVidWlsZD50cnVlPC9NaW5pbWFsUmVidWlsZD4NCisgICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzPkRlZmF1bHQ8L0Jhc2ljUnVudGltZUNoZWNrcz4NCisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZERlYnVnRExMPC9SdW50aW1lTGlicmFyeT4NCisgICAgICA8QnVmZmVyU2VjdXJpdHlDaGVjaz5mYWxzZTwvQnVmZmVyU2VjdXJpdHlDaGVjaz4NCisgICAgICA8UHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPC9QcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8QXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPiQoSW50RGlyKTwvQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPg0KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+DQorICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+UHJvZ3JhbURhdGFiYXNlPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0Pg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPExpbms+DQorICAgICAgPEFkZGl0aW9uYWxEZXBlbmRlbmNpZXM+eDY0XFpsaWJEbGxEZWJ1Z1x6bGlid2FwaS5saWI7JShBZGRpdGlvbmFsRGVwZW5kZW5jaWVzKTwvQWRkaXRpb25hbERlcGVuZGVuY2llcz4NCisgICAgICA8T3V0cHV0RmlsZT4kKE91dERpcil0ZXN0emxpYi5leGU8L091dHB1dEZpbGU+DQorICAgICAgPEdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj50cnVlPC9HZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+DQorICAgICAgPFByb2dyYW1EYXRhYmFzZUZpbGU+JChPdXREaXIpdGVzdHpsaWIucGRiPC9Qcm9ncmFtRGF0YWJhc2VGaWxlPg0KKyAgICAgIDxTdWJTeXN0ZW0+Q29uc29sZTwvU3ViU3lzdGVtPg0KKyAgICAgIDxUYXJnZXRNYWNoaW5lPk1hY2hpbmVYNjQ8L1RhcmdldE1hY2hpbmU+DQorICAgIDwvTGluaz4NCisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4NCisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8SXRhbml1bSciPg0KKyAgICA8TWlkbD4NCisgICAgICA8VGFyZ2V0RW52aXJvbm1lbnQ+SXRhbml1bTwvVGFyZ2V0RW52aXJvbm1lbnQ+DQorICAgIDwvTWlkbD4NCisgICAgPENsQ29tcGlsZT4NCisgICAgICA8T3B0aW1pemF0aW9uPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+DQorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+Li5cLi5cLi47Li5cLi5cbWluaXppcDslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5fQ1JUX05PTlNURENfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtaTElCX1dJTkFQSTtfREVCVUc7X0NPTlNPTEU7V0lONjQ7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KKyAgICAgIDxNaW5pbWFsUmVidWlsZD50cnVlPC9NaW5pbWFsUmVidWlsZD4NCisgICAgICA8QmFzaWNSdW50aW1lQ2hlY2tzPkRlZmF1bHQ8L0Jhc2ljUnVudGltZUNoZWNrcz4NCisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZERlYnVnRExMPC9SdW50aW1lTGlicmFyeT4NCisgICAgICA8QnVmZmVyU2VjdXJpdHlDaGVjaz5mYWxzZTwvQnVmZmVyU2VjdXJpdHlDaGVjaz4NCisgICAgICA8UHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPC9QcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8QXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPiQoSW50RGlyKTwvQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPg0KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+DQorICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+UHJvZ3JhbURhdGFiYXNlPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0Pg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPExpbms+DQorICAgICAgPEFkZGl0aW9uYWxEZXBlbmRlbmNpZXM+aWE2NFxabGliRGxsRGVidWdcemxpYndhcGkubGliOyUoQWRkaXRpb25hbERlcGVuZGVuY2llcyk8L0FkZGl0aW9uYWxEZXBlbmRlbmNpZXM+DQorICAgICAgPE91dHB1dEZpbGU+JChPdXREaXIpdGVzdHpsaWIuZXhlPC9PdXRwdXRGaWxlPg0KKyAgICAgIDxHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+dHJ1ZTwvR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPg0KKyAgICAgIDxQcm9ncmFtRGF0YWJhc2VGaWxlPiQoT3V0RGlyKXRlc3R6bGliLnBkYjwvUHJvZ3JhbURhdGFiYXNlRmlsZT4NCisgICAgICA8U3ViU3lzdGVtPkNvbnNvbGU8L1N1YlN5c3RlbT4NCisgICAgICA8VGFyZ2V0TWFjaGluZT5NYWNoaW5lSUE2NDwvVGFyZ2V0TWFjaGluZT4NCisgICAgPC9MaW5rPg0KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPg0KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciPg0KKyAgICA8TWlkbD4NCisgICAgICA8VGFyZ2V0RW52aXJvbm1lbnQ+WDY0PC9UYXJnZXRFbnZpcm9ubWVudD4NCisgICAgPC9NaWRsPg0KKyAgICA8Q2xDb21waWxlPg0KKyAgICAgIDxPcHRpbWl6YXRpb24+TWF4U3BlZWQ8L09wdGltaXphdGlvbj4NCisgICAgICA8SW5saW5lRnVuY3Rpb25FeHBhbnNpb24+T25seUV4cGxpY2l0SW5saW5lPC9JbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj4NCisgICAgICA8T21pdEZyYW1lUG9pbnRlcnM+dHJ1ZTwvT21pdEZyYW1lUG9pbnRlcnM+DQorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+Li5cLi5cLi47Li5cLi5cbWluaXppcDslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5fQ1JUX05PTlNURENfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtaTElCX1dJTkFQSTtOREVCVUc7X0NPTlNPTEU7V0lONjQ7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KKyAgICAgIDxTdHJpbmdQb29saW5nPnRydWU8L1N0cmluZ1Bvb2xpbmc+DQorICAgICAgPEJhc2ljUnVudGltZUNoZWNrcz5EZWZhdWx0PC9CYXNpY1J1bnRpbWVDaGVja3M+DQorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWRETEw8L1J1bnRpbWVMaWJyYXJ5Pg0KKyAgICAgIDxCdWZmZXJTZWN1cml0eUNoZWNrPmZhbHNlPC9CdWZmZXJTZWN1cml0eUNoZWNrPg0KKyAgICAgIDxGdW5jdGlvbkxldmVsTGlua2luZz50cnVlPC9GdW5jdGlvbkxldmVsTGlua2luZz4NCisgICAgICA8UHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPC9QcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8QXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPiQoSW50RGlyKTwvQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPg0KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+DQorICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+UHJvZ3JhbURhdGFiYXNlPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0Pg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPExpbms+DQorICAgICAgPEFkZGl0aW9uYWxEZXBlbmRlbmNpZXM+eDY0XFpsaWJEbGxSZWxlYXNlXHpsaWJ3YXBpLmxpYjslKEFkZGl0aW9uYWxEZXBlbmRlbmNpZXMpPC9BZGRpdGlvbmFsRGVwZW5kZW5jaWVzPg0KKyAgICAgIDxPdXRwdXRGaWxlPiQoT3V0RGlyKXRlc3R6bGliLmV4ZTwvT3V0cHV0RmlsZT4NCisgICAgICA8R2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPnRydWU8L0dlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj4NCisgICAgICA8U3ViU3lzdGVtPkNvbnNvbGU8L1N1YlN5c3RlbT4NCisgICAgICA8T3B0aW1pemVSZWZlcmVuY2VzPnRydWU8L09wdGltaXplUmVmZXJlbmNlcz4NCisgICAgICA8RW5hYmxlQ09NREFURm9sZGluZz50cnVlPC9FbmFibGVDT01EQVRGb2xkaW5nPg0KKyAgICAgIDxUYXJnZXRNYWNoaW5lPk1hY2hpbmVYNjQ8L1RhcmdldE1hY2hpbmU+DQorICAgIDwvTGluaz4NCisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4NCisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxJdGFuaXVtJyI+DQorICAgIDxNaWRsPg0KKyAgICAgIDxUYXJnZXRFbnZpcm9ubWVudD5JdGFuaXVtPC9UYXJnZXRFbnZpcm9ubWVudD4NCisgICAgPC9NaWRsPg0KKyAgICA8Q2xDb21waWxlPg0KKyAgICAgIDxPcHRpbWl6YXRpb24+TWF4U3BlZWQ8L09wdGltaXphdGlvbj4NCisgICAgICA8SW5saW5lRnVuY3Rpb25FeHBhbnNpb24+T25seUV4cGxpY2l0SW5saW5lPC9JbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj4NCisgICAgICA8T21pdEZyYW1lUG9pbnRlcnM+dHJ1ZTwvT21pdEZyYW1lUG9pbnRlcnM+DQorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+Li5cLi5cLi47Li5cLi5cbWluaXppcDslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5fQ1JUX05PTlNURENfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtaTElCX1dJTkFQSTtOREVCVUc7X0NPTlNPTEU7V0lONjQ7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KKyAgICAgIDxTdHJpbmdQb29saW5nPnRydWU8L1N0cmluZ1Bvb2xpbmc+DQorICAgICAgPEJhc2ljUnVudGltZUNoZWNrcz5EZWZhdWx0PC9CYXNpY1J1bnRpbWVDaGVja3M+DQorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWRETEw8L1J1bnRpbWVMaWJyYXJ5Pg0KKyAgICAgIDxCdWZmZXJTZWN1cml0eUNoZWNrPmZhbHNlPC9CdWZmZXJTZWN1cml0eUNoZWNrPg0KKyAgICAgIDxGdW5jdGlvbkxldmVsTGlua2luZz50cnVlPC9GdW5jdGlvbkxldmVsTGlua2luZz4NCisgICAgICA8UHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPC9QcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8QXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPiQoSW50RGlyKTwvQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPg0KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+DQorICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+UHJvZ3JhbURhdGFiYXNlPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0Pg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPExpbms+DQorICAgICAgPEFkZGl0aW9uYWxEZXBlbmRlbmNpZXM+aWE2NFxabGliRGxsUmVsZWFzZVx6bGlid2FwaS5saWI7JShBZGRpdGlvbmFsRGVwZW5kZW5jaWVzKTwvQWRkaXRpb25hbERlcGVuZGVuY2llcz4NCisgICAgICA8T3V0cHV0RmlsZT4kKE91dERpcil0ZXN0emxpYi5leGU8L091dHB1dEZpbGU+DQorICAgICAgPEdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj50cnVlPC9HZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+DQorICAgICAgPFN1YlN5c3RlbT5Db25zb2xlPC9TdWJTeXN0ZW0+DQorICAgICAgPE9wdGltaXplUmVmZXJlbmNlcz50cnVlPC9PcHRpbWl6ZVJlZmVyZW5jZXM+DQorICAgICAgPEVuYWJsZUNPTURBVEZvbGRpbmc+dHJ1ZTwvRW5hYmxlQ09NREFURm9sZGluZz4NCisgICAgICA8VGFyZ2V0TWFjaGluZT5NYWNoaW5lSUE2NDwvVGFyZ2V0TWFjaGluZT4NCisgICAgPC9MaW5rPg0KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlx0ZXN0emxpYlx0ZXN0emxpYi5jIiAvPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSJ6bGlidmMudmN4cHJvaiI+DQorICAgICAgPFByb2plY3Q+ezhmZDgyNmY4LTM3MzktNDRlNi04Y2M4LTk5NzEyMmU1M2I4ZH08L1Byb2plY3Q+DQorICAgIDwvUHJvamVjdFJlZmVyZW5jZT4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEltcG9ydCBQcm9qZWN0PSIkKFZDVGFyZ2V0c1BhdGgpXE1pY3Jvc29mdC5DcHAudGFyZ2V0cyIgLz4NCisgIDxJbXBvcnRHcm91cCBMYWJlbD0iRXh0ZW5zaW9uVGFyZ2V0cyI+DQorICA8L0ltcG9ydEdyb3VwPg0KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS96bGliLTEuMi42L2NvbnRyaWIvdnN0dWRpby92YzEwL3Rlc3R6bGliZGxsLnZjeHByb2ouZmlsdGVycyBiL3psaWItMS4yLjYvY29udHJpYi92c3R1ZGlvL3ZjMTAvdGVzdHpsaWJkbGwudmN4cHJvai5maWx0ZXJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzYTg2OTMKLS0tIC9kZXYvbnVsbAorKysgYi96bGliLTEuMi42L2NvbnRyaWIvdnN0dWRpby92YzEwL3Rlc3R6bGliZGxsLnZjeHByb2ouZmlsdGVycwpAQCAtMCwwICsxLDIyIEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KKzxQcm9qZWN0IFRvb2xzVmVyc2lvbj0iNC4wIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxGaWx0ZXIgSW5jbHVkZT0iU291cmNlIEZpbGVzIj4NCisgICAgICA8VW5pcXVlSWRlbnRpZmllcj57ZmE2MWE4OWYtOTNmYy00Yzg5LWIyOWUtMzYyMjRiNzU5MmY0fTwvVW5pcXVlSWRlbnRpZmllcj4NCisgICAgICA8RXh0ZW5zaW9ucz5jcHA7YztjeHg7ZGVmO29kbDtpZGw7aHBqO2JhdDthc208L0V4dGVuc2lvbnM+DQorICAgIDwvRmlsdGVyPg0KKyAgICA8RmlsdGVyIEluY2x1ZGU9IkhlYWRlciBGaWxlcyI+DQorICAgICAgPFVuaXF1ZUlkZW50aWZpZXI+e2Q0Yjg1ZGEwLTJiYTItNDkzNC1iNTdmLWUyNTg0ZTM4NDhlZX08L1VuaXF1ZUlkZW50aWZpZXI+DQorICAgICAgPEV4dGVuc2lvbnM+aDtocHA7aHh4O2htO2lubDtpbmM8L0V4dGVuc2lvbnM+DQorICAgIDwvRmlsdGVyPg0KKyAgICA8RmlsdGVyIEluY2x1ZGU9IlJlc291cmNlIEZpbGVzIj4NCisgICAgICA8VW5pcXVlSWRlbnRpZmllcj57ZTU3M2UwNzUtMDBiZC00YTdkLWJkNjctYThjYzliZmM1YWNhfTwvVW5pcXVlSWRlbnRpZmllcj4NCisgICAgICA8RXh0ZW5zaW9ucz5yYztpY287Y3VyO2JtcDtkbGc7cmMyO3JjdDtiaW47cmdzO2dpZjtqcGc7anBlZztqcGU8L0V4dGVuc2lvbnM+DQorICAgIDwvRmlsdGVyPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXHRlc3R6bGliXHRlc3R6bGliLmMiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgPC9JdGVtR3JvdXA+DQorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3psaWItMS4yLjYvY29udHJpYi92c3R1ZGlvL3ZjMTAvdGVzdHpsaWJkbGwudmN4cHJvai51c2VyIGIvemxpYi0xLjIuNi9jb250cmliL3ZzdHVkaW8vdmMxMC90ZXN0emxpYmRsbC52Y3hwcm9qLnVzZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk1YjVjNwotLS0gL2Rldi9udWxsCisrKyBiL3psaWItMS4yLjYvY29udHJpYi92c3R1ZGlvL3ZjMTAvdGVzdHpsaWJkbGwudmN4cHJvai51c2VyCkBAIC0wLDAgKzEsMyBAQAor77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCis8UHJvamVjdCBUb29sc1ZlcnNpb249IjQuMCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+DQorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3psaWItMS4yLjYvY29udHJpYi92c3R1ZGlvL3ZjMTAvemxpYi5yYyBiL3psaWItMS4yLjYvY29udHJpYi92c3R1ZGlvL3ZjMTAvemxpYi5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjIyZmFiCi0tLSAvZGV2L251bGwKKysrIGIvemxpYi0xLjIuNi9jb250cmliL3ZzdHVkaW8vdmMxMC96bGliLnJjCkBAIC0wLDAgKzEsMzIgQEAKKyNpbmNsdWRlIDx3aW5kb3dzLmg+DQorDQorI2RlZmluZSBJRFJfVkVSU0lPTjEgIDENCitJRFJfVkVSU0lPTjEJVkVSU0lPTklORk8JTU9WRUFCTEUgSU1QVVJFIExPQURPTkNBTEwgRElTQ0FSREFCTEUNCisgIEZJTEVWRVJTSU9OCSAxLjIuNiwxDQorICBQUk9EVUNUVkVSU0lPTiAxLjIuNiwxDQorICBGSUxFRkxBR1NNQVNLCVZTX0ZGSV9GSUxFRkxBR1NNQVNLDQorICBGSUxFRkxBR1MJMA0KKyAgRklMRU9TCVZPU19ET1NfV0lORE9XUzMyDQorICBGSUxFVFlQRQlWRlRfRExMDQorICBGSUxFU1VCVFlQRQkwCS8vIG5vdCB1c2VkDQorQkVHSU4NCisgIEJMT0NLICJTdHJpbmdGaWxlSW5mbyINCisgIEJFR0lODQorICAgIEJMT0NLICIwNDA5MDRFNCINCisgICAgLy9sYW5ndWFnZSBJRCA9IFUuUy4gRW5nbGlzaCwgY2hhciBzZXQgPSBXaW5kb3dzLCBNdWx0aWxpbmd1YWwNCisNCisgICAgQkVHSU4NCisgICAgICBWQUxVRSAiRmlsZURlc2NyaXB0aW9uIiwgInpsaWIgZGF0YSBjb21wcmVzc2lvbiBhbmQgWklQIGZpbGUgSS9PIGxpYnJhcnlcMCINCisgICAgICBWQUxVRSAiRmlsZVZlcnNpb24iLAkiMS4yLjZcMCINCisgICAgICBWQUxVRSAiSW50ZXJuYWxOYW1lIiwJInpsaWJcMCINCisgICAgICBWQUxVRSAiT3JpZ2luYWxGaWxlbmFtZSIsCSJ6bGliLmRsbFwwIg0KKyAgICAgIFZBTFVFICJQcm9kdWN0TmFtZSIsCSJaTGliLkRMTFwwIg0KKyAgICAgIFZBTFVFICJDb21tZW50cyIsIkRMTCBzdXBwb3J0IGJ5IEFsZXNzYW5kcm8gSWFjb3BldHRpICYgR2lsbGVzIFZvbGxhbnRcMCINCisgICAgICBWQUxVRSAiTGVnYWxDb3B5cmlnaHQiLCAiKEMpIDE5OTUtMjAxMiBKZWFuLWxvdXAgR2FpbGx5ICYgTWFyayBBZGxlclwwIg0KKyAgICBFTkQNCisgIEVORA0KKyAgQkxPQ0sgIlZhckZpbGVJbmZvIg0KKyAgQkVHSU4NCisgICAgVkFMVUUgIlRyYW5zbGF0aW9uIiwgMHgwNDA5LCAxMjUyDQorICBFTkQNCitFTkQNCmRpZmYgLS1naXQgYS96bGliLTEuMi42L2NvbnRyaWIvdnN0dWRpby92YzEwL3psaWJzdGF0LnZjeHByb2ogYi96bGliLTEuMi42L2NvbnRyaWIvdnN0dWRpby92YzEwL3psaWJzdGF0LnZjeHByb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY4MmZjYQotLS0gL2Rldi9udWxsCisrKyBiL3psaWItMS4yLjYvY29udHJpYi92c3R1ZGlvL3ZjMTAvemxpYnN0YXQudmN4cHJvagpAQCAtMCwwICsxLDQ1NyBAQAor77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCis8UHJvamVjdCBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIFRvb2xzVmVyc2lvbj0iNC4wIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4NCisgIDxJdGVtR3JvdXAgTGFiZWw9IlByb2plY3RDb25maWd1cmF0aW9ucyI+DQorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJEZWJ1Z3xJdGFuaXVtIj4NCisgICAgICA8Q29uZmlndXJhdGlvbj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4NCisgICAgICA8UGxhdGZvcm0+SXRhbml1bTwvUGxhdGZvcm0+DQorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+DQorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJEZWJ1Z3xXaW4zMiI+DQorICAgICAgPENvbmZpZ3VyYXRpb24+RGVidWc8L0NvbmZpZ3VyYXRpb24+DQorICAgICAgPFBsYXRmb3JtPldpbjMyPC9QbGF0Zm9ybT4NCisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4NCisgICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IkRlYnVnfHg2NCI+DQorICAgICAgPENvbmZpZ3VyYXRpb24+RGVidWc8L0NvbmZpZ3VyYXRpb24+DQorICAgICAgPFBsYXRmb3JtPng2NDwvUGxhdGZvcm0+DQorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+DQorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJSZWxlYXNlV2l0aG91dEFzbXxJdGFuaXVtIj4NCisgICAgICA8Q29uZmlndXJhdGlvbj5SZWxlYXNlV2l0aG91dEFzbTwvQ29uZmlndXJhdGlvbj4NCisgICAgICA8UGxhdGZvcm0+SXRhbml1bTwvUGxhdGZvcm0+DQorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+DQorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJSZWxlYXNlV2l0aG91dEFzbXxXaW4zMiI+DQorICAgICAgPENvbmZpZ3VyYXRpb24+UmVsZWFzZVdpdGhvdXRBc208L0NvbmZpZ3VyYXRpb24+DQorICAgICAgPFBsYXRmb3JtPldpbjMyPC9QbGF0Zm9ybT4NCisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4NCisgICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IlJlbGVhc2VXaXRob3V0QXNtfHg2NCI+DQorICAgICAgPENvbmZpZ3VyYXRpb24+UmVsZWFzZVdpdGhvdXRBc208L0NvbmZpZ3VyYXRpb24+DQorICAgICAgPFBsYXRmb3JtPng2NDwvUGxhdGZvcm0+DQorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+DQorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJSZWxlYXNlfEl0YW5pdW0iPg0KKyAgICAgIDxDb25maWd1cmF0aW9uPlJlbGVhc2U8L0NvbmZpZ3VyYXRpb24+DQorICAgICAgPFBsYXRmb3JtPkl0YW5pdW08L1BsYXRmb3JtPg0KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPg0KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUmVsZWFzZXxXaW4zMiI+DQorICAgICAgPENvbmZpZ3VyYXRpb24+UmVsZWFzZTwvQ29uZmlndXJhdGlvbj4NCisgICAgICA8UGxhdGZvcm0+V2luMzI8L1BsYXRmb3JtPg0KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPg0KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUmVsZWFzZXx4NjQiPg0KKyAgICAgIDxDb25maWd1cmF0aW9uPlJlbGVhc2U8L0NvbmZpZ3VyYXRpb24+DQorICAgICAgPFBsYXRmb3JtPng2NDwvUGxhdGZvcm0+DQorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIExhYmVsPSJHbG9iYWxzIj4NCisgICAgPFByb2plY3RHdWlkPns3NDVERUM1OC1FQkIzLTQ3QTktQTlCOC00QzY2MjdDMDFCRjh9PC9Qcm9qZWN0R3VpZD4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLkRlZmF1bHQucHJvcHMiIC8+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2VXaXRob3V0QXNtfFdpbjMyJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPg0KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+U3RhdGljTGlicmFyeTwvQ29uZmlndXJhdGlvblR5cGU+DQorICAgIDxVc2VPZk1mYz5mYWxzZTwvVXNlT2ZNZmM+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+DQorICAgIDxDb25maWd1cmF0aW9uVHlwZT5TdGF0aWNMaWJyYXJ5PC9Db25maWd1cmF0aW9uVHlwZT4NCisgICAgPFVzZU9mTWZjPmZhbHNlPC9Vc2VPZk1mYz4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+DQorICAgIDxDb25maWd1cmF0aW9uVHlwZT5TdGF0aWNMaWJyYXJ5PC9Db25maWd1cmF0aW9uVHlwZT4NCisgICAgPFVzZU9mTWZjPmZhbHNlPC9Vc2VPZk1mYz4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZVdpdGhvdXRBc218SXRhbml1bSciIExhYmVsPSJDb25maWd1cmF0aW9uIj4NCisgICAgPENvbmZpZ3VyYXRpb25UeXBlPlN0YXRpY0xpYnJhcnk8L0NvbmZpZ3VyYXRpb25UeXBlPg0KKyAgICA8VXNlT2ZNZmM+ZmFsc2U8L1VzZU9mTWZjPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfEl0YW5pdW0nIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+DQorICAgIDxDb25maWd1cmF0aW9uVHlwZT5TdGF0aWNMaWJyYXJ5PC9Db25maWd1cmF0aW9uVHlwZT4NCisgICAgPFVzZU9mTWZjPmZhbHNlPC9Vc2VPZk1mYz4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8SXRhbml1bSciIExhYmVsPSJDb25maWd1cmF0aW9uIj4NCisgICAgPENvbmZpZ3VyYXRpb25UeXBlPlN0YXRpY0xpYnJhcnk8L0NvbmZpZ3VyYXRpb25UeXBlPg0KKyAgICA8VXNlT2ZNZmM+ZmFsc2U8L1VzZU9mTWZjPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlV2l0aG91dEFzbXx4NjQnIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+DQorICAgIDxDb25maWd1cmF0aW9uVHlwZT5TdGF0aWNMaWJyYXJ5PC9Db25maWd1cmF0aW9uVHlwZT4NCisgICAgPFVzZU9mTWZjPmZhbHNlPC9Vc2VPZk1mYz4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+DQorICAgIDxDb25maWd1cmF0aW9uVHlwZT5TdGF0aWNMaWJyYXJ5PC9Db25maWd1cmF0aW9uVHlwZT4NCisgICAgPFVzZU9mTWZjPmZhbHNlPC9Vc2VPZk1mYz4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPg0KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+U3RhdGljTGlicmFyeTwvQ29uZmlndXJhdGlvblR5cGU+DQorICAgIDxVc2VPZk1mYz5mYWxzZTwvVXNlT2ZNZmM+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClcTWljcm9zb2Z0LkNwcC5wcm9wcyIgLz4NCisgIDxJbXBvcnRHcm91cCBMYWJlbD0iRXh0ZW5zaW9uU2V0dGluZ3MiPg0KKyAgPC9JbXBvcnRHcm91cD4NCisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2VXaXRob3V0QXNtfFdpbjMyJyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4NCisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPg0KKyAgPC9JbXBvcnRHcm91cD4NCisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPg0KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+DQorICA8L0ltcG9ydEdyb3VwPg0KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPg0KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+DQorICA8L0ltcG9ydEdyb3VwPg0KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZVdpdGhvdXRBc218SXRhbml1bSciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+DQorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4NCisgIDwvSW1wb3J0R3JvdXA+DQorICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfEl0YW5pdW0nIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPg0KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+DQorICA8L0ltcG9ydEdyb3VwPg0KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8SXRhbml1bSciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+DQorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4NCisgIDwvSW1wb3J0R3JvdXA+DQorICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlV2l0aG91dEFzbXx4NjQnIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPg0KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+DQorICA8L0ltcG9ydEdyb3VwPg0KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPg0KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+DQorICA8L0ltcG9ydEdyb3VwPg0KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4NCisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPg0KKyAgPC9JbXBvcnRHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIExhYmVsPSJVc2VyTWFjcm9zIiAvPg0KKyAgPFByb3BlcnR5R3JvdXA+DQorICAgIDxfUHJvamVjdEZpbGVWZXJzaW9uPjEwLjAuMzAxMjguMTwvX1Byb2plY3RGaWxlVmVyc2lvbj4NCisgICAgPE91dERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+eDg2XFpsaWJTdGF0JChDb25maWd1cmF0aW9uKVw8L091dERpcj4NCisgICAgPEludERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+eDg2XFpsaWJTdGF0JChDb25maWd1cmF0aW9uKVxUbXBcPC9JbnREaXI+DQorICAgIDxPdXREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+eDg2XFpsaWJTdGF0JChDb25maWd1cmF0aW9uKVw8L091dERpcj4NCisgICAgPEludERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj54ODZcWmxpYlN0YXQkKENvbmZpZ3VyYXRpb24pXFRtcFw8L0ludERpcj4NCisgICAgPE91dERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2VXaXRob3V0QXNtfFdpbjMyJyI+eDg2XFpsaWJTdGF0JChDb25maWd1cmF0aW9uKVw8L091dERpcj4NCisgICAgPEludERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2VXaXRob3V0QXNtfFdpbjMyJyI+eDg2XFpsaWJTdGF0JChDb25maWd1cmF0aW9uKVxUbXBcPC9JbnREaXI+DQorICAgIDxPdXREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj54NjRcWmxpYlN0YXQkKENvbmZpZ3VyYXRpb24pXDwvT3V0RGlyPg0KKyAgICA8SW50RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+eDY0XFpsaWJTdGF0JChDb25maWd1cmF0aW9uKVxUbXBcPC9JbnREaXI+DQorICAgIDxPdXREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xJdGFuaXVtJyI+aWE2NFxabGliU3RhdCQoQ29uZmlndXJhdGlvbilcPC9PdXREaXI+DQorICAgIDxJbnREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xJdGFuaXVtJyI+aWE2NFxabGliU3RhdCQoQ29uZmlndXJhdGlvbilcVG1wXDwvSW50RGlyPg0KKyAgICA8T3V0RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj54NjRcWmxpYlN0YXQkKENvbmZpZ3VyYXRpb24pXDwvT3V0RGlyPg0KKyAgICA8SW50RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj54NjRcWmxpYlN0YXQkKENvbmZpZ3VyYXRpb24pXFRtcFw8L0ludERpcj4NCisgICAgPE91dERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8SXRhbml1bSciPmlhNjRcWmxpYlN0YXQkKENvbmZpZ3VyYXRpb24pXDwvT3V0RGlyPg0KKyAgICA8SW50RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxJdGFuaXVtJyI+aWE2NFxabGliU3RhdCQoQ29uZmlndXJhdGlvbilcVG1wXDwvSW50RGlyPg0KKyAgICA8T3V0RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZVdpdGhvdXRBc218eDY0JyI+eDY0XFpsaWJTdGF0JChDb25maWd1cmF0aW9uKVw8L091dERpcj4NCisgICAgPEludERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2VXaXRob3V0QXNtfHg2NCciPng2NFxabGliU3RhdCQoQ29uZmlndXJhdGlvbilcVG1wXDwvSW50RGlyPg0KKyAgICA8T3V0RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZVdpdGhvdXRBc218SXRhbml1bSciPmlhNjRcWmxpYlN0YXQkKENvbmZpZ3VyYXRpb24pXDwvT3V0RGlyPg0KKyAgICA8SW50RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZVdpdGhvdXRBc218SXRhbml1bSciPmlhNjRcWmxpYlN0YXQkKENvbmZpZ3VyYXRpb24pXFRtcFw8L0ludERpcj4NCisgICAgPENvZGVBbmFseXNpc1J1bGVTZXQgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xJdGFuaXVtJyI+QWxsUnVsZXMucnVsZXNldDwvQ29kZUFuYWx5c2lzUnVsZVNldD4NCisgICAgPENvZGVBbmFseXNpc1J1bGVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8SXRhbml1bSciIC8+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlQXNzZW1ibGllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfEl0YW5pdW0nIiAvPg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZVNldCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+QWxsUnVsZXMucnVsZXNldDwvQ29kZUFuYWx5c2lzUnVsZVNldD4NCisgICAgPENvZGVBbmFseXNpc1J1bGVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIiAvPg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZUFzc2VtYmxpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciIC8+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlU2V0IENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+QWxsUnVsZXMucnVsZXNldDwvQ29kZUFuYWx5c2lzUnVsZVNldD4NCisgICAgPENvZGVBbmFseXNpc1J1bGVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyIgLz4NCisgICAgPENvZGVBbmFseXNpc1J1bGVBc3NlbWJsaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyIgLz4NCisgICAgPENvZGVBbmFseXNpc1J1bGVTZXQgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlV2l0aG91dEFzbXxJdGFuaXVtJyI+QWxsUnVsZXMucnVsZXNldDwvQ29kZUFuYWx5c2lzUnVsZVNldD4NCisgICAgPENvZGVBbmFseXNpc1J1bGVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZVdpdGhvdXRBc218SXRhbml1bSciIC8+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlQXNzZW1ibGllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2VXaXRob3V0QXNtfEl0YW5pdW0nIiAvPg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZVNldCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2VXaXRob3V0QXNtfFdpbjMyJyI+QWxsUnVsZXMucnVsZXNldDwvQ29kZUFuYWx5c2lzUnVsZVNldD4NCisgICAgPENvZGVBbmFseXNpc1J1bGVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZVdpdGhvdXRBc218V2luMzInIiAvPg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZUFzc2VtYmxpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlV2l0aG91dEFzbXxXaW4zMiciIC8+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlU2V0IENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZVdpdGhvdXRBc218eDY0JyI+QWxsUnVsZXMucnVsZXNldDwvQ29kZUFuYWx5c2lzUnVsZVNldD4NCisgICAgPENvZGVBbmFseXNpc1J1bGVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZVdpdGhvdXRBc218eDY0JyIgLz4NCisgICAgPENvZGVBbmFseXNpc1J1bGVBc3NlbWJsaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZVdpdGhvdXRBc218eDY0JyIgLz4NCisgICAgPENvZGVBbmFseXNpc1J1bGVTZXQgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfEl0YW5pdW0nIj5BbGxSdWxlcy5ydWxlc2V0PC9Db2RlQW5hbHlzaXNSdWxlU2V0Pg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfEl0YW5pdW0nIiAvPg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZUFzc2VtYmxpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfEl0YW5pdW0nIiAvPg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZVNldCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj5BbGxSdWxlcy5ydWxlc2V0PC9Db2RlQW5hbHlzaXNSdWxlU2V0Pg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyIgLz4NCisgICAgPENvZGVBbmFseXNpc1J1bGVBc3NlbWJsaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciIC8+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlU2V0IENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj5BbGxSdWxlcy5ydWxlc2V0PC9Db2RlQW5hbHlzaXNSdWxlU2V0Pg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciIC8+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlQXNzZW1ibGllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyIgLz4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj4NCisgICAgPENsQ29tcGlsZT4NCisgICAgICA8T3B0aW1pemF0aW9uPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+DQorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+Li5cLi5cLi47Li5cLi5cbWFzbXg4NjslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5XSU4zMjtaTElCX1dJTkFQSTtfQ1JUX05PTlNURENfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtfQ1JUX05PTlNURENfTk9fV0FSTklOR1M7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KKyAgICAgIDxFeGNlcHRpb25IYW5kbGluZz4NCisgICAgICA8L0V4Y2VwdGlvbkhhbmRsaW5nPg0KKyAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkRGVidWc8L1J1bnRpbWVMaWJyYXJ5Pg0KKyAgICAgIDxCdWZmZXJTZWN1cml0eUNoZWNrPmZhbHNlPC9CdWZmZXJTZWN1cml0eUNoZWNrPg0KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlck91dHB1dEZpbGU+JChJbnREaXIpemxpYnN0YXQucGNoPC9QcmVjb21waWxlZEhlYWRlck91dHB1dEZpbGU+DQorICAgICAgPEFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj4kKEludERpcik8L0Fzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj4NCisgICAgICA8T2JqZWN0RmlsZU5hbWU+JChJbnREaXIpPC9PYmplY3RGaWxlTmFtZT4NCisgICAgICA8UHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+JChPdXREaXIpPC9Qcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4NCisgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPg0KKyAgICAgIDxTdXBwcmVzc1N0YXJ0dXBCYW5uZXI+dHJ1ZTwvU3VwcHJlc3NTdGFydHVwQmFubmVyPg0KKyAgICAgIDxEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0Pk9sZFN0eWxlPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0Pg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPFJlc291cmNlQ29tcGlsZT4NCisgICAgICA8Q3VsdHVyZT4weDA0MGM8L0N1bHR1cmU+DQorICAgIDwvUmVzb3VyY2VDb21waWxlPg0KKyAgICA8TGliPg0KKyAgICAgIDxBZGRpdGlvbmFsT3B0aW9ucz4vTUFDSElORTpYODYgL05PREVGQVVMVExJQiAlKEFkZGl0aW9uYWxPcHRpb25zKTwvQWRkaXRpb25hbE9wdGlvbnM+DQorICAgICAgPE91dHB1dEZpbGU+JChPdXREaXIpemxpYnN0YXQubGliPC9PdXRwdXRGaWxlPg0KKyAgICAgIDxTdXBwcmVzc1N0YXJ0dXBCYW5uZXI+dHJ1ZTwvU3VwcHJlc3NTdGFydHVwQmFubmVyPg0KKyAgICA8L0xpYj4NCisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4NCisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPg0KKyAgICA8Q2xDb21waWxlPg0KKyAgICAgIDxJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj5Pbmx5RXhwbGljaXRJbmxpbmU8L0lubGluZUZ1bmN0aW9uRXhwYW5zaW9uPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPi4uXC4uXC4uOy4uXC4uXG1hc214ODY7JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+V0lOMzI7WkxJQl9XSU5BUEk7X0NSVF9OT05TVERDX05PX0RFUFJFQ0FURTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7X0NSVF9OT05TVERDX05PX1dBUk5JTkdTO0FTTVY7QVNNSU5GOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8U3RyaW5nUG9vbGluZz50cnVlPC9TdHJpbmdQb29saW5nPg0KKyAgICAgIDxFeGNlcHRpb25IYW5kbGluZz4NCisgICAgICA8L0V4Y2VwdGlvbkhhbmRsaW5nPg0KKyAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkPC9SdW50aW1lTGlicmFyeT4NCisgICAgICA8QnVmZmVyU2VjdXJpdHlDaGVjaz5mYWxzZTwvQnVmZmVyU2VjdXJpdHlDaGVjaz4NCisgICAgICA8RnVuY3Rpb25MZXZlbExpbmtpbmc+dHJ1ZTwvRnVuY3Rpb25MZXZlbExpbmtpbmc+DQorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyT3V0cHV0RmlsZT4kKEludERpcil6bGlic3RhdC5wY2g8L1ByZWNvbXBpbGVkSGVhZGVyT3V0cHV0RmlsZT4NCisgICAgICA8QXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPiQoSW50RGlyKTwvQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPg0KKyAgICAgIDxPYmplY3RGaWxlTmFtZT4kKEludERpcik8L09iamVjdEZpbGVOYW1lPg0KKyAgICAgIDxQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4kKE91dERpcik8L1Byb2dyYW1EYXRhQmFzZUZpbGVOYW1lPg0KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+DQorICAgICAgPFN1cHByZXNzU3RhcnR1cEJhbm5lcj50cnVlPC9TdXBwcmVzc1N0YXJ0dXBCYW5uZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8UmVzb3VyY2VDb21waWxlPg0KKyAgICAgIDxDdWx0dXJlPjB4MDQwYzwvQ3VsdHVyZT4NCisgICAgPC9SZXNvdXJjZUNvbXBpbGU+DQorICAgIDxMaWI+DQorICAgICAgPEFkZGl0aW9uYWxPcHRpb25zPi9NQUNISU5FOlg4NiAvTk9ERUZBVUxUTElCICUoQWRkaXRpb25hbE9wdGlvbnMpPC9BZGRpdGlvbmFsT3B0aW9ucz4NCisgICAgICA8QWRkaXRpb25hbERlcGVuZGVuY2llcz4uLlwuLlxtYXNteDg2XG1hdGNoNjg2Lm9iajsuLlwuLlxtYXNteDg2XGluZmZhczMyLm9iajslKEFkZGl0aW9uYWxEZXBlbmRlbmNpZXMpPC9BZGRpdGlvbmFsRGVwZW5kZW5jaWVzPg0KKyAgICAgIDxPdXRwdXRGaWxlPiQoT3V0RGlyKXpsaWJzdGF0LmxpYjwvT3V0cHV0RmlsZT4NCisgICAgICA8U3VwcHJlc3NTdGFydHVwQmFubmVyPnRydWU8L1N1cHByZXNzU3RhcnR1cEJhbm5lcj4NCisgICAgPC9MaWI+DQorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+DQorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2VXaXRob3V0QXNtfFdpbjMyJyI+DQorICAgIDxDbENvbXBpbGU+DQorICAgICAgPElubGluZUZ1bmN0aW9uRXhwYW5zaW9uPk9ubHlFeHBsaWNpdElubGluZTwvSW5saW5lRnVuY3Rpb25FeHBhbnNpb24+DQorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+Li5cLi5cLi47Li5cLi5cbWFzbXg4NjslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5XSU4zMjtaTElCX1dJTkFQSTtfQ1JUX05PTlNURENfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtfQ1JUX05PTlNURENfTk9fV0FSTklOR1M7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KKyAgICAgIDxTdHJpbmdQb29saW5nPnRydWU8L1N0cmluZ1Bvb2xpbmc+DQorICAgICAgPEV4Y2VwdGlvbkhhbmRsaW5nPg0KKyAgICAgIDwvRXhjZXB0aW9uSGFuZGxpbmc+DQorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWQ8L1J1bnRpbWVMaWJyYXJ5Pg0KKyAgICAgIDxCdWZmZXJTZWN1cml0eUNoZWNrPmZhbHNlPC9CdWZmZXJTZWN1cml0eUNoZWNrPg0KKyAgICAgIDxGdW5jdGlvbkxldmVsTGlua2luZz50cnVlPC9GdW5jdGlvbkxldmVsTGlua2luZz4NCisgICAgICA8UHJlY29tcGlsZWRIZWFkZXJPdXRwdXRGaWxlPiQoSW50RGlyKXpsaWJzdGF0LnBjaDwvUHJlY29tcGlsZWRIZWFkZXJPdXRwdXRGaWxlPg0KKyAgICAgIDxBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb24+JChJbnREaXIpPC9Bc3NlbWJsZXJMaXN0aW5nTG9jYXRpb24+DQorICAgICAgPE9iamVjdEZpbGVOYW1lPiQoSW50RGlyKTwvT2JqZWN0RmlsZU5hbWU+DQorICAgICAgPFByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPiQoT3V0RGlyKTwvUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+DQorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4NCisgICAgICA8U3VwcHJlc3NTdGFydHVwQmFubmVyPnRydWU8L1N1cHByZXNzU3RhcnR1cEJhbm5lcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxSZXNvdXJjZUNvbXBpbGU+DQorICAgICAgPEN1bHR1cmU+MHgwNDBjPC9DdWx0dXJlPg0KKyAgICA8L1Jlc291cmNlQ29tcGlsZT4NCisgICAgPExpYj4NCisgICAgICA8QWRkaXRpb25hbE9wdGlvbnM+L01BQ0hJTkU6WDg2IC9OT0RFRkFVTFRMSUIgJShBZGRpdGlvbmFsT3B0aW9ucyk8L0FkZGl0aW9uYWxPcHRpb25zPg0KKyAgICAgIDxPdXRwdXRGaWxlPiQoT3V0RGlyKXpsaWJzdGF0LmxpYjwvT3V0cHV0RmlsZT4NCisgICAgICA8U3VwcHJlc3NTdGFydHVwQmFubmVyPnRydWU8L1N1cHByZXNzU3RhcnR1cEJhbm5lcj4NCisgICAgPC9MaWI+DQorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+DQorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciPg0KKyAgICA8TWlkbD4NCisgICAgICA8VGFyZ2V0RW52aXJvbm1lbnQ+WDY0PC9UYXJnZXRFbnZpcm9ubWVudD4NCisgICAgPC9NaWRsPg0KKyAgICA8Q2xDb21waWxlPg0KKyAgICAgIDxPcHRpbWl6YXRpb24+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4NCisgICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4uLlwuLlwuLjsuLlwuLlxtYXNteDg2OyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPlpMSUJfV0lOQVBJO19DUlRfTk9OU1REQ19OT19ERVBSRUNBVEU7X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFO19DUlRfTk9OU1REQ19OT19XQVJOSU5HUztXSU42NDslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPEV4Y2VwdGlvbkhhbmRsaW5nPg0KKyAgICAgIDwvRXhjZXB0aW9uSGFuZGxpbmc+DQorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWREZWJ1Z0RMTDwvUnVudGltZUxpYnJhcnk+DQorICAgICAgPEJ1ZmZlclNlY3VyaXR5Q2hlY2s+ZmFsc2U8L0J1ZmZlclNlY3VyaXR5Q2hlY2s+DQorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyT3V0cHV0RmlsZT4kKEludERpcil6bGlic3RhdC5wY2g8L1ByZWNvbXBpbGVkSGVhZGVyT3V0cHV0RmlsZT4NCisgICAgICA8QXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPiQoSW50RGlyKTwvQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPg0KKyAgICAgIDxPYmplY3RGaWxlTmFtZT4kKEludERpcik8L09iamVjdEZpbGVOYW1lPg0KKyAgICAgIDxQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4kKE91dERpcik8L1Byb2dyYW1EYXRhQmFzZUZpbGVOYW1lPg0KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+DQorICAgICAgPFN1cHByZXNzU3RhcnR1cEJhbm5lcj50cnVlPC9TdXBwcmVzc1N0YXJ0dXBCYW5uZXI+DQorICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+T2xkU3R5bGU8L0RlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8UmVzb3VyY2VDb21waWxlPg0KKyAgICAgIDxDdWx0dXJlPjB4MDQwYzwvQ3VsdHVyZT4NCisgICAgPC9SZXNvdXJjZUNvbXBpbGU+DQorICAgIDxMaWI+DQorICAgICAgPEFkZGl0aW9uYWxPcHRpb25zPi9NQUNISU5FOkFNRDY0IC9OT0RFRkFVTFRMSUIgJShBZGRpdGlvbmFsT3B0aW9ucyk8L0FkZGl0aW9uYWxPcHRpb25zPg0KKyAgICAgIDxPdXRwdXRGaWxlPiQoT3V0RGlyKXpsaWJzdGF0LmxpYjwvT3V0cHV0RmlsZT4NCisgICAgICA8U3VwcHJlc3NTdGFydHVwQmFubmVyPnRydWU8L1N1cHByZXNzU3RhcnR1cEJhbm5lcj4NCisgICAgPC9MaWI+DQorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+DQorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfEl0YW5pdW0nIj4NCisgICAgPE1pZGw+DQorICAgICAgPFRhcmdldEVudmlyb25tZW50Pkl0YW5pdW08L1RhcmdldEVudmlyb25tZW50Pg0KKyAgICA8L01pZGw+DQorICAgIDxDbENvbXBpbGU+DQorICAgICAgPE9wdGltaXphdGlvbj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPi4uXC4uXC4uOy4uXC4uXG1hc214ODY7JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+WkxJQl9XSU5BUEk7X0NSVF9OT05TVERDX05PX0RFUFJFQ0FURTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7X0NSVF9OT05TVERDX05PX1dBUk5JTkdTO1dJTjY0OyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8RXhjZXB0aW9uSGFuZGxpbmc+DQorICAgICAgPC9FeGNlcHRpb25IYW5kbGluZz4NCisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZERlYnVnRExMPC9SdW50aW1lTGlicmFyeT4NCisgICAgICA8QnVmZmVyU2VjdXJpdHlDaGVjaz5mYWxzZTwvQnVmZmVyU2VjdXJpdHlDaGVjaz4NCisgICAgICA8UHJlY29tcGlsZWRIZWFkZXJPdXRwdXRGaWxlPiQoSW50RGlyKXpsaWJzdGF0LnBjaDwvUHJlY29tcGlsZWRIZWFkZXJPdXRwdXRGaWxlPg0KKyAgICAgIDxBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb24+JChJbnREaXIpPC9Bc3NlbWJsZXJMaXN0aW5nTG9jYXRpb24+DQorICAgICAgPE9iamVjdEZpbGVOYW1lPiQoSW50RGlyKTwvT2JqZWN0RmlsZU5hbWU+DQorICAgICAgPFByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPiQoT3V0RGlyKTwvUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+DQorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4NCisgICAgICA8U3VwcHJlc3NTdGFydHVwQmFubmVyPnRydWU8L1N1cHByZXNzU3RhcnR1cEJhbm5lcj4NCisgICAgICA8RGVidWdJbmZvcm1hdGlvbkZvcm1hdD5PbGRTdHlsZTwvRGVidWdJbmZvcm1hdGlvbkZvcm1hdD4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxSZXNvdXJjZUNvbXBpbGU+DQorICAgICAgPEN1bHR1cmU+MHgwNDBjPC9DdWx0dXJlPg0KKyAgICA8L1Jlc291cmNlQ29tcGlsZT4NCisgICAgPExpYj4NCisgICAgICA8QWRkaXRpb25hbE9wdGlvbnM+L01BQ0hJTkU6SUE2NCAvTk9ERUZBVUxUTElCICUoQWRkaXRpb25hbE9wdGlvbnMpPC9BZGRpdGlvbmFsT3B0aW9ucz4NCisgICAgICA8T3V0cHV0RmlsZT4kKE91dERpcil6bGlic3RhdC5saWI8L091dHB1dEZpbGU+DQorICAgICAgPFN1cHByZXNzU3RhcnR1cEJhbm5lcj50cnVlPC9TdXBwcmVzc1N0YXJ0dXBCYW5uZXI+DQorICAgIDwvTGliPg0KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPg0KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciPg0KKyAgICA8TWlkbD4NCisgICAgICA8VGFyZ2V0RW52aXJvbm1lbnQ+WDY0PC9UYXJnZXRFbnZpcm9ubWVudD4NCisgICAgPC9NaWRsPg0KKyAgICA8Q2xDb21waWxlPg0KKyAgICAgIDxJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj5Pbmx5RXhwbGljaXRJbmxpbmU8L0lubGluZUZ1bmN0aW9uRXhwYW5zaW9uPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPi4uXC4uXC4uOy4uXC4uXG1hc214ODY7JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+WkxJQl9XSU5BUEk7X0NSVF9OT05TVERDX05PX0RFUFJFQ0FURTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7X0NSVF9OT05TVERDX05PX1dBUk5JTkdTO0FTTVY7QVNNSU5GO1dJTjY0OyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8U3RyaW5nUG9vbGluZz50cnVlPC9TdHJpbmdQb29saW5nPg0KKyAgICAgIDxFeGNlcHRpb25IYW5kbGluZz4NCisgICAgICA8L0V4Y2VwdGlvbkhhbmRsaW5nPg0KKyAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkRExMPC9SdW50aW1lTGlicmFyeT4NCisgICAgICA8QnVmZmVyU2VjdXJpdHlDaGVjaz5mYWxzZTwvQnVmZmVyU2VjdXJpdHlDaGVjaz4NCisgICAgICA8RnVuY3Rpb25MZXZlbExpbmtpbmc+dHJ1ZTwvRnVuY3Rpb25MZXZlbExpbmtpbmc+DQorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyT3V0cHV0RmlsZT4kKEludERpcil6bGlic3RhdC5wY2g8L1ByZWNvbXBpbGVkSGVhZGVyT3V0cHV0RmlsZT4NCisgICAgICA8QXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPiQoSW50RGlyKTwvQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPg0KKyAgICAgIDxPYmplY3RGaWxlTmFtZT4kKEludERpcik8L09iamVjdEZpbGVOYW1lPg0KKyAgICAgIDxQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4kKE91dERpcik8L1Byb2dyYW1EYXRhQmFzZUZpbGVOYW1lPg0KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+DQorICAgICAgPFN1cHByZXNzU3RhcnR1cEJhbm5lcj50cnVlPC9TdXBwcmVzc1N0YXJ0dXBCYW5uZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8UmVzb3VyY2VDb21waWxlPg0KKyAgICAgIDxDdWx0dXJlPjB4MDQwYzwvQ3VsdHVyZT4NCisgICAgPC9SZXNvdXJjZUNvbXBpbGU+DQorICAgIDxMaWI+DQorICAgICAgPEFkZGl0aW9uYWxPcHRpb25zPi9NQUNISU5FOkFNRDY0IC9OT0RFRkFVTFRMSUIgJShBZGRpdGlvbmFsT3B0aW9ucyk8L0FkZGl0aW9uYWxPcHRpb25zPg0KKyAgICAgIDxBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPi4uXC4uXG1hc214NjRcZ3ZtYXQ2NC5vYmo7Li5cLi5cbWFzbXg2NFxpbmZmYXN4NjQub2JqOyUoQWRkaXRpb25hbERlcGVuZGVuY2llcyk8L0FkZGl0aW9uYWxEZXBlbmRlbmNpZXM+DQorICAgICAgPE91dHB1dEZpbGU+JChPdXREaXIpemxpYnN0YXQubGliPC9PdXRwdXRGaWxlPg0KKyAgICAgIDxTdXBwcmVzc1N0YXJ0dXBCYW5uZXI+dHJ1ZTwvU3VwcHJlc3NTdGFydHVwQmFubmVyPg0KKyAgICA8L0xpYj4NCisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4NCisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxJdGFuaXVtJyI+DQorICAgIDxNaWRsPg0KKyAgICAgIDxUYXJnZXRFbnZpcm9ubWVudD5JdGFuaXVtPC9UYXJnZXRFbnZpcm9ubWVudD4NCisgICAgPC9NaWRsPg0KKyAgICA8Q2xDb21waWxlPg0KKyAgICAgIDxJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj5Pbmx5RXhwbGljaXRJbmxpbmU8L0lubGluZUZ1bmN0aW9uRXhwYW5zaW9uPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPi4uXC4uXC4uOy4uXC4uXG1hc214ODY7JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+WkxJQl9XSU5BUEk7X0NSVF9OT05TVERDX05PX0RFUFJFQ0FURTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7X0NSVF9OT05TVERDX05PX1dBUk5JTkdTO1dJTjY0OyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8U3RyaW5nUG9vbGluZz50cnVlPC9TdHJpbmdQb29saW5nPg0KKyAgICAgIDxFeGNlcHRpb25IYW5kbGluZz4NCisgICAgICA8L0V4Y2VwdGlvbkhhbmRsaW5nPg0KKyAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkRExMPC9SdW50aW1lTGlicmFyeT4NCisgICAgICA8QnVmZmVyU2VjdXJpdHlDaGVjaz5mYWxzZTwvQnVmZmVyU2VjdXJpdHlDaGVjaz4NCisgICAgICA8RnVuY3Rpb25MZXZlbExpbmtpbmc+dHJ1ZTwvRnVuY3Rpb25MZXZlbExpbmtpbmc+DQorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyT3V0cHV0RmlsZT4kKEludERpcil6bGlic3RhdC5wY2g8L1ByZWNvbXBpbGVkSGVhZGVyT3V0cHV0RmlsZT4NCisgICAgICA8QXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPiQoSW50RGlyKTwvQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPg0KKyAgICAgIDxPYmplY3RGaWxlTmFtZT4kKEludERpcik8L09iamVjdEZpbGVOYW1lPg0KKyAgICAgIDxQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4kKE91dERpcik8L1Byb2dyYW1EYXRhQmFzZUZpbGVOYW1lPg0KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+DQorICAgICAgPFN1cHByZXNzU3RhcnR1cEJhbm5lcj50cnVlPC9TdXBwcmVzc1N0YXJ0dXBCYW5uZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8UmVzb3VyY2VDb21waWxlPg0KKyAgICAgIDxDdWx0dXJlPjB4MDQwYzwvQ3VsdHVyZT4NCisgICAgPC9SZXNvdXJjZUNvbXBpbGU+DQorICAgIDxMaWI+DQorICAgICAgPEFkZGl0aW9uYWxPcHRpb25zPi9NQUNISU5FOklBNjQgL05PREVGQVVMVExJQiAlKEFkZGl0aW9uYWxPcHRpb25zKTwvQWRkaXRpb25hbE9wdGlvbnM+DQorICAgICAgPE91dHB1dEZpbGU+JChPdXREaXIpemxpYnN0YXQubGliPC9PdXRwdXRGaWxlPg0KKyAgICAgIDxTdXBwcmVzc1N0YXJ0dXBCYW5uZXI+dHJ1ZTwvU3VwcHJlc3NTdGFydHVwQmFubmVyPg0KKyAgICA8L0xpYj4NCisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4NCisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZVdpdGhvdXRBc218eDY0JyI+DQorICAgIDxNaWRsPg0KKyAgICAgIDxUYXJnZXRFbnZpcm9ubWVudD5YNjQ8L1RhcmdldEVudmlyb25tZW50Pg0KKyAgICA8L01pZGw+DQorICAgIDxDbENvbXBpbGU+DQorICAgICAgPElubGluZUZ1bmN0aW9uRXhwYW5zaW9uPk9ubHlFeHBsaWNpdElubGluZTwvSW5saW5lRnVuY3Rpb25FeHBhbnNpb24+DQorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+Li5cLi5cLi47Li5cLi5cbWFzbXg4NjslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5aTElCX1dJTkFQSTtfQ1JUX05PTlNURENfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtfQ1JUX05PTlNURENfTk9fV0FSTklOR1M7V0lONjQ7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KKyAgICAgIDxTdHJpbmdQb29saW5nPnRydWU8L1N0cmluZ1Bvb2xpbmc+DQorICAgICAgPEV4Y2VwdGlvbkhhbmRsaW5nPg0KKyAgICAgIDwvRXhjZXB0aW9uSGFuZGxpbmc+DQorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWRETEw8L1J1bnRpbWVMaWJyYXJ5Pg0KKyAgICAgIDxCdWZmZXJTZWN1cml0eUNoZWNrPmZhbHNlPC9CdWZmZXJTZWN1cml0eUNoZWNrPg0KKyAgICAgIDxGdW5jdGlvbkxldmVsTGlua2luZz50cnVlPC9GdW5jdGlvbkxldmVsTGlua2luZz4NCisgICAgICA8UHJlY29tcGlsZWRIZWFkZXJPdXRwdXRGaWxlPiQoSW50RGlyKXpsaWJzdGF0LnBjaDwvUHJlY29tcGlsZWRIZWFkZXJPdXRwdXRGaWxlPg0KKyAgICAgIDxBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb24+JChJbnREaXIpPC9Bc3NlbWJsZXJMaXN0aW5nTG9jYXRpb24+DQorICAgICAgPE9iamVjdEZpbGVOYW1lPiQoSW50RGlyKTwvT2JqZWN0RmlsZU5hbWU+DQorICAgICAgPFByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPiQoT3V0RGlyKTwvUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+DQorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4NCisgICAgICA8U3VwcHJlc3NTdGFydHVwQmFubmVyPnRydWU8L1N1cHByZXNzU3RhcnR1cEJhbm5lcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxSZXNvdXJjZUNvbXBpbGU+DQorICAgICAgPEN1bHR1cmU+MHgwNDBjPC9DdWx0dXJlPg0KKyAgICA8L1Jlc291cmNlQ29tcGlsZT4NCisgICAgPExpYj4NCisgICAgICA8QWRkaXRpb25hbE9wdGlvbnM+L01BQ0hJTkU6QU1ENjQgL05PREVGQVVMVExJQiAlKEFkZGl0aW9uYWxPcHRpb25zKTwvQWRkaXRpb25hbE9wdGlvbnM+DQorICAgICAgPE91dHB1dEZpbGU+JChPdXREaXIpemxpYnN0YXQubGliPC9PdXRwdXRGaWxlPg0KKyAgICAgIDxTdXBwcmVzc1N0YXJ0dXBCYW5uZXI+dHJ1ZTwvU3VwcHJlc3NTdGFydHVwQmFubmVyPg0KKyAgICA8L0xpYj4NCisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4NCisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZVdpdGhvdXRBc218SXRhbml1bSciPg0KKyAgICA8TWlkbD4NCisgICAgICA8VGFyZ2V0RW52aXJvbm1lbnQ+SXRhbml1bTwvVGFyZ2V0RW52aXJvbm1lbnQ+DQorICAgIDwvTWlkbD4NCisgICAgPENsQ29tcGlsZT4NCisgICAgICA8SW5saW5lRnVuY3Rpb25FeHBhbnNpb24+T25seUV4cGxpY2l0SW5saW5lPC9JbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj4NCisgICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4uLlwuLlwuLjsuLlwuLlxtYXNteDg2OyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPlpMSUJfV0lOQVBJO19DUlRfTk9OU1REQ19OT19ERVBSRUNBVEU7X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFO19DUlRfTk9OU1REQ19OT19XQVJOSU5HUztXSU42NDslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPFN0cmluZ1Bvb2xpbmc+dHJ1ZTwvU3RyaW5nUG9vbGluZz4NCisgICAgICA8RXhjZXB0aW9uSGFuZGxpbmc+DQorICAgICAgPC9FeGNlcHRpb25IYW5kbGluZz4NCisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZERMTDwvUnVudGltZUxpYnJhcnk+DQorICAgICAgPEJ1ZmZlclNlY3VyaXR5Q2hlY2s+ZmFsc2U8L0J1ZmZlclNlY3VyaXR5Q2hlY2s+DQorICAgICAgPEZ1bmN0aW9uTGV2ZWxMaW5raW5nPnRydWU8L0Z1bmN0aW9uTGV2ZWxMaW5raW5nPg0KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlck91dHB1dEZpbGU+JChJbnREaXIpemxpYnN0YXQucGNoPC9QcmVjb21waWxlZEhlYWRlck91dHB1dEZpbGU+DQorICAgICAgPEFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj4kKEludERpcik8L0Fzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj4NCisgICAgICA8T2JqZWN0RmlsZU5hbWU+JChJbnREaXIpPC9PYmplY3RGaWxlTmFtZT4NCisgICAgICA8UHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+JChPdXREaXIpPC9Qcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4NCisgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPg0KKyAgICAgIDxTdXBwcmVzc1N0YXJ0dXBCYW5uZXI+dHJ1ZTwvU3VwcHJlc3NTdGFydHVwQmFubmVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPFJlc291cmNlQ29tcGlsZT4NCisgICAgICA8Q3VsdHVyZT4weDA0MGM8L0N1bHR1cmU+DQorICAgIDwvUmVzb3VyY2VDb21waWxlPg0KKyAgICA8TGliPg0KKyAgICAgIDxBZGRpdGlvbmFsT3B0aW9ucz4vTUFDSElORTpJQTY0IC9OT0RFRkFVTFRMSUIgJShBZGRpdGlvbmFsT3B0aW9ucyk8L0FkZGl0aW9uYWxPcHRpb25zPg0KKyAgICAgIDxPdXRwdXRGaWxlPiQoT3V0RGlyKXpsaWJzdGF0LmxpYjwvT3V0cHV0RmlsZT4NCisgICAgICA8U3VwcHJlc3NTdGFydHVwQmFubmVyPnRydWU8L1N1cHByZXNzU3RhcnR1cEJhbm5lcj4NCisgICAgPC9MaWI+DQorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXGFkbGVyMzIuYyIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxjb21wcmVzcy5jIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXGNyYzMyLmMiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cZGVmbGF0ZS5jIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXGd6Y2xvc2UuYyIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxnemxpYi5jIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXGd6cmVhZC5jIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXGd6d3JpdGUuYyIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxpbmZiYWNrLmMiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbWFzbXg2NFxpbmZmYXM4NjY0LmMiPg0KKyAgICAgIDxFeGNsdWRlZEZyb21CdWlsZCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfEl0YW5pdW0nIj50cnVlPC9FeGNsdWRlZEZyb21CdWlsZD4NCisgICAgICA8RXhjbHVkZWRGcm9tQnVpbGQgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPnRydWU8L0V4Y2x1ZGVkRnJvbUJ1aWxkPg0KKyAgICAgIDxFeGNsdWRlZEZyb21CdWlsZCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2VXaXRob3V0QXNtfEl0YW5pdW0nIj50cnVlPC9FeGNsdWRlZEZyb21CdWlsZD4NCisgICAgICA8RXhjbHVkZWRGcm9tQnVpbGQgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlV2l0aG91dEFzbXxXaW4zMiciPnRydWU8L0V4Y2x1ZGVkRnJvbUJ1aWxkPg0KKyAgICAgIDxFeGNsdWRlZEZyb21CdWlsZCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8SXRhbml1bSciPnRydWU8L0V4Y2x1ZGVkRnJvbUJ1aWxkPg0KKyAgICAgIDxFeGNsdWRlZEZyb21CdWlsZCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj50cnVlPC9FeGNsdWRlZEZyb21CdWlsZD4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5caW5mZmFzdC5jIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXGluZmxhdGUuYyIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxpbmZ0cmVlcy5jIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXG1pbml6aXBcaW9hcGkuYyIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlx0cmVlcy5jIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXHVuY29tcHIuYyIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxtaW5pemlwXHVuemlwLmMiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbWluaXppcFx6aXAuYyIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlx6dXRpbC5jIiAvPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8UmVzb3VyY2VDb21waWxlIEluY2x1ZGU9InpsaWIucmMiIC8+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxOb25lIEluY2x1ZGU9InpsaWJ2Yy5kZWYiIC8+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLnRhcmdldHMiIC8+DQorICA8SW1wb3J0R3JvdXAgTGFiZWw9IkV4dGVuc2lvblRhcmdldHMiPg0KKyAgPC9JbXBvcnRHcm91cD4NCis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvemxpYi0xLjIuNi9jb250cmliL3ZzdHVkaW8vdmMxMC96bGlic3RhdC52Y3hwcm9qLmZpbHRlcnMgYi96bGliLTEuMi42L2NvbnRyaWIvdnN0dWRpby92YzEwL3psaWJzdGF0LnZjeHByb2ouZmlsdGVycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGM3ZjdlCi0tLSAvZGV2L251bGwKKysrIGIvemxpYi0xLjIuNi9jb250cmliL3ZzdHVkaW8vdmMxMC96bGlic3RhdC52Y3hwcm9qLmZpbHRlcnMKQEAgLTAsMCArMSw3NyBAQAor77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCis8UHJvamVjdCBUb29sc1ZlcnNpb249IjQuMCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8RmlsdGVyIEluY2x1ZGU9IlNvdXJjZSBGaWxlcyI+DQorICAgICAgPFVuaXF1ZUlkZW50aWZpZXI+ezE3NDIxM2Y2LTdmNjYtNGFlOC1hM2E4LWExZTBhMWU2ZmZkZH08L1VuaXF1ZUlkZW50aWZpZXI+DQorICAgIDwvRmlsdGVyPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXGFkbGVyMzIuYyI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cY29tcHJlc3MuYyI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cY3JjMzIuYyI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cZGVmbGF0ZS5jIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxnemNsb3NlLmMiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXGd6bGliLmMiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXGd6cmVhZC5jIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxnendyaXRlLmMiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXGluZmJhY2suYyI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbWFzbXg2NFxpbmZmYXM4NjY0LmMiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXGluZmZhc3QuYyI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5caW5mbGF0ZS5jIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxpbmZ0cmVlcy5jIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxtaW5pemlwXGlvYXBpLmMiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXHRyZWVzLmMiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXHVuY29tcHIuYyI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbWluaXppcFx1bnppcC5jIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxtaW5pemlwXHppcC5jIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlx6dXRpbC5jIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPFJlc291cmNlQ29tcGlsZSBJbmNsdWRlPSJ6bGliLnJjIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L1Jlc291cmNlQ29tcGlsZT4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPE5vbmUgSW5jbHVkZT0iemxpYnZjLmRlZiI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9Ob25lPg0KKyAgPC9JdGVtR3JvdXA+DQorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3psaWItMS4yLjYvY29udHJpYi92c3R1ZGlvL3ZjMTAvemxpYnN0YXQudmN4cHJvai51c2VyIGIvemxpYi0xLjIuNi9jb250cmliL3ZzdHVkaW8vdmMxMC96bGlic3RhdC52Y3hwcm9qLnVzZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk1YjVjNwotLS0gL2Rldi9udWxsCisrKyBiL3psaWItMS4yLjYvY29udHJpYi92c3R1ZGlvL3ZjMTAvemxpYnN0YXQudmN4cHJvai51c2VyCkBAIC0wLDAgKzEsMyBAQAor77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCis8UHJvamVjdCBUb29sc1ZlcnNpb249IjQuMCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+DQorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3psaWItMS4yLjYvY29udHJpYi92c3R1ZGlvL3ZjMTAvemxpYnZjLmRlZiBiL3psaWItMS4yLjYvY29udHJpYi92c3R1ZGlvL3ZjMTAvemxpYnZjLmRlZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzFiMGE2Ci0tLSAvZGV2L251bGwKKysrIGIvemxpYi0xLjIuNi9jb250cmliL3ZzdHVkaW8vdmMxMC96bGlidmMuZGVmCkBAIC0wLDAgKzEsMTM3IEBACitMSUJSQVJZDQorOyB6bGliIGRhdGEgY29tcHJlc3Npb24gYW5kIFpJUCBmaWxlIEkvTyBsaWJyYXJ5DQorDQorVkVSU0lPTgkJMS4yNA0KKw0KK0VYUE9SVFMNCisgICAgICAgIGFkbGVyMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDENCisgICAgICAgIGNvbXByZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDINCisgICAgICAgIGNyYzMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDMNCisgICAgICAgIGRlZmxhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDQNCisgICAgICAgIGRlZmxhdGVDb3B5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDUNCisgICAgICAgIGRlZmxhdGVFbmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDYNCisgICAgICAgIGRlZmxhdGVJbml0Ml8gICAgICAgICAgICAgICAgICAgICAgICAgICAgQDcNCisgICAgICAgIGRlZmxhdGVJbml0XyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDgNCisgICAgICAgIGRlZmxhdGVQYXJhbXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDkNCisgICAgICAgIGRlZmxhdGVSZXNldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDEwDQorICAgICAgICBkZWZsYXRlU2V0RGljdGlvbmFyeSAgICAgICAgICAgICAgICAgICAgIEAxMQ0KKyAgICAgICAgZ3pjbG9zZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMTINCisgICAgICAgIGd6ZG9wZW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDEzDQorICAgICAgICBnemVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAxNA0KKyAgICAgICAgZ3pmbHVzaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMTUNCisgICAgICAgIGd6b3BlbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDE2DQorICAgICAgICBnenJlYWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAxNw0KKyAgICAgICAgZ3p3cml0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMTgNCisgICAgICAgIGluZmxhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDE5DQorICAgICAgICBpbmZsYXRlRW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAyMA0KKyAgICAgICAgaW5mbGF0ZUluaXQyXyAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMjENCisgICAgICAgIGluZmxhdGVJbml0XyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDIyDQorICAgICAgICBpbmZsYXRlUmVzZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAyMw0KKyAgICAgICAgaW5mbGF0ZVNldERpY3Rpb25hcnkgICAgICAgICAgICAgICAgICAgICBAMjQNCisgICAgICAgIGluZmxhdGVTeW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDI1DQorICAgICAgICB1bmNvbXByZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAyNg0KKyAgICAgICAgemxpYlZlcnNpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMjcNCisgICAgICAgIGd6cHJpbnRmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDI4DQorICAgICAgICBnenB1dGMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAyOQ0KKyAgICAgICAgZ3pnZXRjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMzANCisgICAgICAgIGd6c2VlayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDMxDQorICAgICAgICBnenJld2luZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAzMg0KKyAgICAgICAgZ3p0ZWxsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMzMNCisgICAgICAgIGd6ZW9mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDM0DQorICAgICAgICBnenNldHBhcmFtcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAzNQ0KKyAgICAgICAgekVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMzYNCisgICAgICAgIGluZmxhdGVTeW5jUG9pbnQgICAgICAgICAgICAgICAgICAgICAgICAgQDM3DQorICAgICAgICBnZXRfY3JjX3RhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAzOA0KKyAgICAgICAgY29tcHJlc3MyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMzkNCisgICAgICAgIGd6cHV0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDQwDQorICAgICAgICBnemdldHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEA0MQ0KKyAgICAgICAgaW5mbGF0ZUNvcHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBANDINCisgICAgICAgIGluZmxhdGVCYWNrSW5pdF8gICAgICAgICAgICAgICAgICAgICAgICAgQDQzDQorICAgICAgICBpbmZsYXRlQmFjayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEA0NA0KKyAgICAgICAgaW5mbGF0ZUJhY2tFbmQgICAgICAgICAgICAgICAgICAgICAgICAgICBANDUNCisgICAgICAgIGNvbXByZXNzQm91bmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDQ2DQorICAgICAgICBkZWZsYXRlQm91bmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEA0Nw0KKyAgICAgICAgZ3pjbGVhcmVyciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBANDgNCisgICAgICAgIGd6dW5nZXRjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDQ5DQorICAgICAgICB6bGliQ29tcGlsZUZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgIEA1MA0KKyAgICAgICAgZGVmbGF0ZVByaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICBANTENCisgICAgICAgIGRlZmxhdGVQZW5kaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgQDUyDQorDQorICAgICAgICB1bnpPcGVuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEA2MQ0KKyAgICAgICAgdW56Q2xvc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBANjINCisgICAgICAgIHVuekdldEdsb2JhbEluZm8gICAgICAgICAgICAgICAgICAgICAgICAgQDYzDQorICAgICAgICB1bnpHZXRDdXJyZW50RmlsZUluZm8gICAgICAgICAgICAgICAgICAgIEA2NA0KKyAgICAgICAgdW56R29Ub0ZpcnN0RmlsZSAgICAgICAgICAgICAgICAgICAgICAgICBANjUNCisgICAgICAgIHVuekdvVG9OZXh0RmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgQDY2DQorICAgICAgICB1bnpPcGVuQ3VycmVudEZpbGUgICAgICAgICAgICAgICAgICAgICAgIEA2Nw0KKyAgICAgICAgdW56UmVhZEN1cnJlbnRGaWxlICAgICAgICAgICAgICAgICAgICAgICBANjgNCisgICAgICAgIHVuek9wZW5DdXJyZW50RmlsZTMgICAgICAgICAgICAgICAgICAgICAgQDY5DQorICAgICAgICB1bnp0ZWxsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEA3MA0KKyAgICAgICAgdW56ZW9mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBANzENCisgICAgICAgIHVuekNsb3NlQ3VycmVudEZpbGUgICAgICAgICAgICAgICAgICAgICAgQDcyDQorICAgICAgICB1bnpHZXRHbG9iYWxDb21tZW50ICAgICAgICAgICAgICAgICAgICAgIEA3Mw0KKyAgICAgICAgdW56U3RyaW5nRmlsZU5hbWVDb21wYXJlICAgICAgICAgICAgICAgICBANzQNCisgICAgICAgIHVuekxvY2F0ZUZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDc1DQorICAgICAgICB1bnpHZXRMb2NhbEV4dHJhZmllbGQgICAgICAgICAgICAgICAgICAgIEA3Ng0KKyAgICAgICAgdW56T3BlbjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBANzcNCisgICAgICAgIHVuek9wZW5DdXJyZW50RmlsZTIgICAgICAgICAgICAgICAgICAgICAgQDc4DQorICAgICAgICB1bnpPcGVuQ3VycmVudEZpbGVQYXNzd29yZCAgICAgICAgICAgICAgIEA3OQ0KKw0KKyAgICAgICAgemlwT3BlbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAODANCisgICAgICAgIHppcE9wZW5OZXdGaWxlSW5aaXAgICAgICAgICAgICAgICAgICAgICAgQDgxDQorICAgICAgICB6aXBXcml0ZUluRmlsZUluWmlwICAgICAgICAgICAgICAgICAgICAgIEA4Mg0KKyAgICAgICAgemlwQ2xvc2VGaWxlSW5aaXAgICAgICAgICAgICAgICAgICAgICAgICBAODMNCisgICAgICAgIHppcENsb3NlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDg0DQorICAgICAgICB6aXBPcGVuTmV3RmlsZUluWmlwMiAgICAgICAgICAgICAgICAgICAgIEA4Ng0KKyAgICAgICAgemlwQ2xvc2VGaWxlSW5aaXBSYXcgICAgICAgICAgICAgICAgICAgICBAODcNCisgICAgICAgIHppcE9wZW4yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDg4DQorICAgICAgICB6aXBPcGVuTmV3RmlsZUluWmlwMyAgICAgICAgICAgICAgICAgICAgIEA4OQ0KKw0KKyAgICAgICAgdW56R2V0RmlsZVBvcyAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMTAwDQorICAgICAgICB1bnpHb1RvRmlsZVBvcyAgICAgICAgICAgICAgICAgICAgICAgICAgIEAxMDENCisNCisgICAgICAgIGZpbGxfd2luMzJfZmlsZWZ1bmMgICAgICAgICAgICAgICAgICAgICAgQDExMA0KKw0KKzsgemxpYndhcGkgdjEuMi40IGFkZGVkOg0KKyAgICAgICAgZmlsbF93aW4zMl9maWxlZnVuYzY0ICAgICAgICAgICAgICAgICAgIEAxMTENCisgICAgICAgIGZpbGxfd2luMzJfZmlsZWZ1bmM2NEEgICAgICAgICAgICAgICAgICBAMTEyDQorICAgICAgICBmaWxsX3dpbjMyX2ZpbGVmdW5jNjRXICAgICAgICAgICAgICAgICAgQDExMw0KKw0KKyAgICAgICAgdW56T3BlbjY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAxMjANCisgICAgICAgIHVuek9wZW4yXzY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMTIxDQorICAgICAgICB1bnpHZXRHbG9iYWxJbmZvNjQgICAgICAgICAgICAgICAgICAgICAgQDEyMg0KKyAgICAgICAgdW56R2V0Q3VycmVudEZpbGVJbmZvNjQgICAgICAgICAgICAgICAgIEAxMjQNCisgICAgICAgIHVuekdldEN1cnJlbnRGaWxlWlN0cmVhbVBvczY0ICAgICAgICAgICBAMTI1DQorICAgICAgICB1bnp0ZWxsNjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDEyNg0KKyAgICAgICAgdW56R2V0RmlsZVBvczY0ICAgICAgICAgICAgICAgICAgICAgICAgIEAxMjcNCisgICAgICAgIHVuekdvVG9GaWxlUG9zNjQgICAgICAgICAgICAgICAgICAgICAgICBAMTI4DQorDQorICAgICAgICB6aXBPcGVuNjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDEzMA0KKyAgICAgICAgemlwT3BlbjJfNjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAxMzENCisgICAgICAgIHppcE9wZW5OZXdGaWxlSW5aaXA2NCAgICAgICAgICAgICAgICAgICBAMTMyDQorICAgICAgICB6aXBPcGVuTmV3RmlsZUluWmlwMl82NCAgICAgICAgICAgICAgICAgQDEzMw0KKyAgICAgICAgemlwT3Blbk5ld0ZpbGVJblppcDNfNjQgICAgICAgICAgICAgICAgIEAxMzQNCisgICAgICAgIHppcE9wZW5OZXdGaWxlSW5aaXA0XzY0ICAgICAgICAgICAgICAgICBAMTM1DQorICAgICAgICB6aXBDbG9zZUZpbGVJblppcFJhdzY0ICAgICAgICAgICAgICAgICAgQDEzNg0KKw0KKzsgemxpYjEgdjEuMi40IGFkZGVkOg0KKyAgICAgICAgYWRsZXIzMl9jb21iaW5lICAgICAgICAgICAgICAgICAgICAgICAgIEAxNDANCisgICAgICAgIGNyYzMyX2NvbWJpbmUgICAgICAgICAgICAgICAgICAgICAgICAgICBAMTQyDQorICAgICAgICBkZWZsYXRlU2V0SGVhZGVyICAgICAgICAgICAgICAgICAgICAgICAgQDE0NA0KKyAgICAgICAgZGVmbGF0ZVR1bmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAxNDUNCisgICAgICAgIGd6YnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMTQ2DQorICAgICAgICBnemNsb3NlX3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDE0Nw0KKyAgICAgICAgZ3pjbG9zZV93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAxNDgNCisgICAgICAgIGd6ZGlyZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMTQ5DQorICAgICAgICBnem9mZnNldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDE1MA0KKyAgICAgICAgaW5mbGF0ZUdldEhlYWRlciAgICAgICAgICAgICAgICAgICAgICAgIEAxNTYNCisgICAgICAgIGluZmxhdGVNYXJrICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMTU3DQorICAgICAgICBpbmZsYXRlUHJpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDE1OA0KKyAgICAgICAgaW5mbGF0ZVJlc2V0MiAgICAgICAgICAgICAgICAgICAgICAgICAgIEAxNTkNCisgICAgICAgIGluZmxhdGVVbmRlcm1pbmUgICAgICAgICAgICAgICAgICAgICAgICBAMTYwDQorDQorOyB6bGliMSB2MS4yLjYgYWRkZWQ6DQorICAgICAgICBnemdldGNfICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDE2MQ0KKyAgICAgICAgZ3pmbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAxNjINCisgICAgICAgIGluZmxhdGVSZXNldEtlZXAgICAgICAgICAgICAgICAgICAgICAgICBAMTYzDQorCWRlZmxhdGVSZXNldEtlZXAJCQlAMTY0CmRpZmYgLS1naXQgYS96bGliLTEuMi42L2NvbnRyaWIvdnN0dWRpby92YzEwL3psaWJ2Yy5zbG4gYi96bGliLTEuMi42L2NvbnRyaWIvdnN0dWRpby92YzEwL3psaWJ2Yy5zbG4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY2ZmZkNQotLS0gL2Rldi9udWxsCisrKyBiL3psaWItMS4yLjYvY29udHJpYi92c3R1ZGlvL3ZjMTAvemxpYnZjLnNsbgpAQCAtMCwwICsxLDEzNSBAQAor77u/DQorTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gU29sdXRpb24gRmlsZSwgRm9ybWF0IFZlcnNpb24gMTEuMDANCisjIFZpc3VhbCBTdHVkaW8gMjAxMA0KK1Byb2plY3QoIns4QkM5Q0VCOC04QjRBLTExRDAtOEQxMS0wMEEwQzkxQkM5NDJ9IikgPSAiemxpYnZjIiwgInpsaWJ2Yy52Y3hwcm9qIiwgIns4RkQ4MjZGOC0zNzM5LTQ0RTYtOENDOC05OTcxMjJFNTNCOER9Ig0KK0VuZFByb2plY3QNCitQcm9qZWN0KCJ7OEJDOUNFQjgtOEI0QS0xMUQwLThEMTEtMDBBMEM5MUJDOTQyfSIpID0gInpsaWJzdGF0IiwgInpsaWJzdGF0LnZjeHByb2oiLCAiezc0NURFQzU4LUVCQjMtNDdBOS1BOUI4LTRDNjYyN0MwMUJGOH0iDQorRW5kUHJvamVjdA0KK1Byb2plY3QoIns4QkM5Q0VCOC04QjRBLTExRDAtOEQxMS0wMEEwQzkxQkM5NDJ9IikgPSAidGVzdHpsaWIiLCAidGVzdHpsaWIudmN4cHJvaiIsICJ7QUE2NjY2QUEtRTA5Ri00MTM1LTlDMEMtNEZFNTBDM0M2NTRCfSINCitFbmRQcm9qZWN0DQorUHJvamVjdCgiezhCQzlDRUI4LThCNEEtMTFEMC04RDExLTAwQTBDOTFCQzk0Mn0iKSA9ICJ0ZXN0emxpYmRsbCIsICJ0ZXN0emxpYmRsbC52Y3hwcm9qIiwgIntDNTJGOUU3Qi00OThBLTQyQkUtOERCNC04NUExNTY5NDM2NkF9Ig0KK0VuZFByb2plY3QNCitQcm9qZWN0KCJ7OEJDOUNFQjgtOEI0QS0xMUQwLThEMTEtMDBBMEM5MUJDOTQyfSIpID0gIm1pbml6aXAiLCAibWluaXppcC52Y3hwcm9qIiwgIns0OENERDlEQy1FMDlGLTQxMzUtOUMwQy00RkU1MEMzQzY1NEJ9Ig0KK0VuZFByb2plY3QNCitQcm9qZWN0KCJ7OEJDOUNFQjgtOEI0QS0xMUQwLThEMTEtMDBBMEM5MUJDOTQyfSIpID0gIm1pbml1bnoiLCAibWluaXVuei52Y3hwcm9qIiwgIntDNTJGOUU3Qi00OThBLTQyQkUtOERCNC04NUExNTY5NDM4MkF9Ig0KK0VuZFByb2plY3QNCitHbG9iYWwNCisJR2xvYmFsU2VjdGlvbihTb2x1dGlvbkNvbmZpZ3VyYXRpb25QbGF0Zm9ybXMpID0gcHJlU29sdXRpb24NCisJCURlYnVnfEl0YW5pdW0gPSBEZWJ1Z3xJdGFuaXVtDQorCQlEZWJ1Z3xXaW4zMiA9IERlYnVnfFdpbjMyDQorCQlEZWJ1Z3x4NjQgPSBEZWJ1Z3x4NjQNCisJCVJlbGVhc2V8SXRhbml1bSA9IFJlbGVhc2V8SXRhbml1bQ0KKwkJUmVsZWFzZXxXaW4zMiA9IFJlbGVhc2V8V2luMzINCisJCVJlbGVhc2V8eDY0ID0gUmVsZWFzZXx4NjQNCisJCVJlbGVhc2VXaXRob3V0QXNtfEl0YW5pdW0gPSBSZWxlYXNlV2l0aG91dEFzbXxJdGFuaXVtDQorCQlSZWxlYXNlV2l0aG91dEFzbXxXaW4zMiA9IFJlbGVhc2VXaXRob3V0QXNtfFdpbjMyDQorCQlSZWxlYXNlV2l0aG91dEFzbXx4NjQgPSBSZWxlYXNlV2l0aG91dEFzbXx4NjQNCisJRW5kR2xvYmFsU2VjdGlvbg0KKwlHbG9iYWxTZWN0aW9uKFByb2plY3RDb25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHBvc3RTb2x1dGlvbg0KKwkJezhGRDgyNkY4LTM3MzktNDRFNi04Q0M4LTk5NzEyMkU1M0I4RH0uRGVidWd8SXRhbml1bS5BY3RpdmVDZmcgPSBEZWJ1Z3xJdGFuaXVtDQorCQl7OEZEODI2RjgtMzczOS00NEU2LThDQzgtOTk3MTIyRTUzQjhEfS5EZWJ1Z3xJdGFuaXVtLkJ1aWxkLjAgPSBEZWJ1Z3xJdGFuaXVtDQorCQl7OEZEODI2RjgtMzczOS00NEU2LThDQzgtOTk3MTIyRTUzQjhEfS5EZWJ1Z3xXaW4zMi5BY3RpdmVDZmcgPSBEZWJ1Z3xXaW4zMg0KKwkJezhGRDgyNkY4LTM3MzktNDRFNi04Q0M4LTk5NzEyMkU1M0I4RH0uRGVidWd8V2luMzIuQnVpbGQuMCA9IERlYnVnfFdpbjMyDQorCQl7OEZEODI2RjgtMzczOS00NEU2LThDQzgtOTk3MTIyRTUzQjhEfS5EZWJ1Z3x4NjQuQWN0aXZlQ2ZnID0gRGVidWd8eDY0DQorCQl7OEZEODI2RjgtMzczOS00NEU2LThDQzgtOTk3MTIyRTUzQjhEfS5EZWJ1Z3x4NjQuQnVpbGQuMCA9IERlYnVnfHg2NA0KKwkJezhGRDgyNkY4LTM3MzktNDRFNi04Q0M4LTk5NzEyMkU1M0I4RH0uUmVsZWFzZXxJdGFuaXVtLkFjdGl2ZUNmZyA9IFJlbGVhc2V8SXRhbml1bQ0KKwkJezhGRDgyNkY4LTM3MzktNDRFNi04Q0M4LTk5NzEyMkU1M0I4RH0uUmVsZWFzZXxJdGFuaXVtLkJ1aWxkLjAgPSBSZWxlYXNlfEl0YW5pdW0NCisJCXs4RkQ4MjZGOC0zNzM5LTQ0RTYtOENDOC05OTcxMjJFNTNCOER9LlJlbGVhc2V8V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMg0KKwkJezhGRDgyNkY4LTM3MzktNDRFNi04Q0M4LTk5NzEyMkU1M0I4RH0uUmVsZWFzZXxXaW4zMi5CdWlsZC4wID0gUmVsZWFzZXxXaW4zMg0KKwkJezhGRDgyNkY4LTM3MzktNDRFNi04Q0M4LTk5NzEyMkU1M0I4RH0uUmVsZWFzZXx4NjQuQWN0aXZlQ2ZnID0gUmVsZWFzZXx4NjQNCisJCXs4RkQ4MjZGOC0zNzM5LTQ0RTYtOENDOC05OTcxMjJFNTNCOER9LlJlbGVhc2V8eDY0LkJ1aWxkLjAgPSBSZWxlYXNlfHg2NA0KKwkJezhGRDgyNkY4LTM3MzktNDRFNi04Q0M4LTk5NzEyMkU1M0I4RH0uUmVsZWFzZVdpdGhvdXRBc218SXRhbml1bS5BY3RpdmVDZmcgPSBSZWxlYXNlV2l0aG91dEFzbXxJdGFuaXVtDQorCQl7OEZEODI2RjgtMzczOS00NEU2LThDQzgtOTk3MTIyRTUzQjhEfS5SZWxlYXNlV2l0aG91dEFzbXxJdGFuaXVtLkJ1aWxkLjAgPSBSZWxlYXNlV2l0aG91dEFzbXxJdGFuaXVtDQorCQl7OEZEODI2RjgtMzczOS00NEU2LThDQzgtOTk3MTIyRTUzQjhEfS5SZWxlYXNlV2l0aG91dEFzbXxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlV2l0aG91dEFzbXxXaW4zMg0KKwkJezhGRDgyNkY4LTM3MzktNDRFNi04Q0M4LTk5NzEyMkU1M0I4RH0uUmVsZWFzZVdpdGhvdXRBc218V2luMzIuQnVpbGQuMCA9IFJlbGVhc2VXaXRob3V0QXNtfFdpbjMyDQorCQl7OEZEODI2RjgtMzczOS00NEU2LThDQzgtOTk3MTIyRTUzQjhEfS5SZWxlYXNlV2l0aG91dEFzbXx4NjQuQWN0aXZlQ2ZnID0gUmVsZWFzZVdpdGhvdXRBc218eDY0DQorCQl7OEZEODI2RjgtMzczOS00NEU2LThDQzgtOTk3MTIyRTUzQjhEfS5SZWxlYXNlV2l0aG91dEFzbXx4NjQuQnVpbGQuMCA9IFJlbGVhc2VXaXRob3V0QXNtfHg2NA0KKwkJezc0NURFQzU4LUVCQjMtNDdBOS1BOUI4LTRDNjYyN0MwMUJGOH0uRGVidWd8SXRhbml1bS5BY3RpdmVDZmcgPSBEZWJ1Z3xJdGFuaXVtDQorCQl7NzQ1REVDNTgtRUJCMy00N0E5LUE5QjgtNEM2NjI3QzAxQkY4fS5EZWJ1Z3xJdGFuaXVtLkJ1aWxkLjAgPSBEZWJ1Z3xJdGFuaXVtDQorCQl7NzQ1REVDNTgtRUJCMy00N0E5LUE5QjgtNEM2NjI3QzAxQkY4fS5EZWJ1Z3xXaW4zMi5BY3RpdmVDZmcgPSBEZWJ1Z3xXaW4zMg0KKwkJezc0NURFQzU4LUVCQjMtNDdBOS1BOUI4LTRDNjYyN0MwMUJGOH0uRGVidWd8V2luMzIuQnVpbGQuMCA9IERlYnVnfFdpbjMyDQorCQl7NzQ1REVDNTgtRUJCMy00N0E5LUE5QjgtNEM2NjI3QzAxQkY4fS5EZWJ1Z3x4NjQuQWN0aXZlQ2ZnID0gRGVidWd8eDY0DQorCQl7NzQ1REVDNTgtRUJCMy00N0E5LUE5QjgtNEM2NjI3QzAxQkY4fS5EZWJ1Z3x4NjQuQnVpbGQuMCA9IERlYnVnfHg2NA0KKwkJezc0NURFQzU4LUVCQjMtNDdBOS1BOUI4LTRDNjYyN0MwMUJGOH0uUmVsZWFzZXxJdGFuaXVtLkFjdGl2ZUNmZyA9IFJlbGVhc2V8SXRhbml1bQ0KKwkJezc0NURFQzU4LUVCQjMtNDdBOS1BOUI4LTRDNjYyN0MwMUJGOH0uUmVsZWFzZXxJdGFuaXVtLkJ1aWxkLjAgPSBSZWxlYXNlfEl0YW5pdW0NCisJCXs3NDVERUM1OC1FQkIzLTQ3QTktQTlCOC00QzY2MjdDMDFCRjh9LlJlbGVhc2V8V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMg0KKwkJezc0NURFQzU4LUVCQjMtNDdBOS1BOUI4LTRDNjYyN0MwMUJGOH0uUmVsZWFzZXxXaW4zMi5CdWlsZC4wID0gUmVsZWFzZXxXaW4zMg0KKwkJezc0NURFQzU4LUVCQjMtNDdBOS1BOUI4LTRDNjYyN0MwMUJGOH0uUmVsZWFzZXx4NjQuQWN0aXZlQ2ZnID0gUmVsZWFzZXx4NjQNCisJCXs3NDVERUM1OC1FQkIzLTQ3QTktQTlCOC00QzY2MjdDMDFCRjh9LlJlbGVhc2V8eDY0LkJ1aWxkLjAgPSBSZWxlYXNlfHg2NA0KKwkJezc0NURFQzU4LUVCQjMtNDdBOS1BOUI4LTRDNjYyN0MwMUJGOH0uUmVsZWFzZVdpdGhvdXRBc218SXRhbml1bS5BY3RpdmVDZmcgPSBSZWxlYXNlV2l0aG91dEFzbXxJdGFuaXVtDQorCQl7NzQ1REVDNTgtRUJCMy00N0E5LUE5QjgtNEM2NjI3QzAxQkY4fS5SZWxlYXNlV2l0aG91dEFzbXxJdGFuaXVtLkJ1aWxkLjAgPSBSZWxlYXNlV2l0aG91dEFzbXxJdGFuaXVtDQorCQl7NzQ1REVDNTgtRUJCMy00N0E5LUE5QjgtNEM2NjI3QzAxQkY4fS5SZWxlYXNlV2l0aG91dEFzbXxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlV2l0aG91dEFzbXxXaW4zMg0KKwkJezc0NURFQzU4LUVCQjMtNDdBOS1BOUI4LTRDNjYyN0MwMUJGOH0uUmVsZWFzZVdpdGhvdXRBc218V2luMzIuQnVpbGQuMCA9IFJlbGVhc2VXaXRob3V0QXNtfFdpbjMyDQorCQl7NzQ1REVDNTgtRUJCMy00N0E5LUE5QjgtNEM2NjI3QzAxQkY4fS5SZWxlYXNlV2l0aG91dEFzbXx4NjQuQWN0aXZlQ2ZnID0gUmVsZWFzZVdpdGhvdXRBc218eDY0DQorCQl7NzQ1REVDNTgtRUJCMy00N0E5LUE5QjgtNEM2NjI3QzAxQkY4fS5SZWxlYXNlV2l0aG91dEFzbXx4NjQuQnVpbGQuMCA9IFJlbGVhc2VXaXRob3V0QXNtfHg2NA0KKwkJe0FBNjY2NkFBLUUwOUYtNDEzNS05QzBDLTRGRTUwQzNDNjU0Qn0uRGVidWd8SXRhbml1bS5BY3RpdmVDZmcgPSBEZWJ1Z3xJdGFuaXVtDQorCQl7QUE2NjY2QUEtRTA5Ri00MTM1LTlDMEMtNEZFNTBDM0M2NTRCfS5EZWJ1Z3xJdGFuaXVtLkJ1aWxkLjAgPSBEZWJ1Z3xJdGFuaXVtDQorCQl7QUE2NjY2QUEtRTA5Ri00MTM1LTlDMEMtNEZFNTBDM0M2NTRCfS5EZWJ1Z3xXaW4zMi5BY3RpdmVDZmcgPSBEZWJ1Z3xXaW4zMg0KKwkJe0FBNjY2NkFBLUUwOUYtNDEzNS05QzBDLTRGRTUwQzNDNjU0Qn0uRGVidWd8V2luMzIuQnVpbGQuMCA9IERlYnVnfFdpbjMyDQorCQl7QUE2NjY2QUEtRTA5Ri00MTM1LTlDMEMtNEZFNTBDM0M2NTRCfS5EZWJ1Z3x4NjQuQWN0aXZlQ2ZnID0gRGVidWd8eDY0DQorCQl7QUE2NjY2QUEtRTA5Ri00MTM1LTlDMEMtNEZFNTBDM0M2NTRCfS5EZWJ1Z3x4NjQuQnVpbGQuMCA9IERlYnVnfHg2NA0KKwkJe0FBNjY2NkFBLUUwOUYtNDEzNS05QzBDLTRGRTUwQzNDNjU0Qn0uUmVsZWFzZXxJdGFuaXVtLkFjdGl2ZUNmZyA9IFJlbGVhc2V8SXRhbml1bQ0KKwkJe0FBNjY2NkFBLUUwOUYtNDEzNS05QzBDLTRGRTUwQzNDNjU0Qn0uUmVsZWFzZXxJdGFuaXVtLkJ1aWxkLjAgPSBSZWxlYXNlfEl0YW5pdW0NCisJCXtBQTY2NjZBQS1FMDlGLTQxMzUtOUMwQy00RkU1MEMzQzY1NEJ9LlJlbGVhc2V8V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMg0KKwkJe0FBNjY2NkFBLUUwOUYtNDEzNS05QzBDLTRGRTUwQzNDNjU0Qn0uUmVsZWFzZXxXaW4zMi5CdWlsZC4wID0gUmVsZWFzZXxXaW4zMg0KKwkJe0FBNjY2NkFBLUUwOUYtNDEzNS05QzBDLTRGRTUwQzNDNjU0Qn0uUmVsZWFzZXx4NjQuQWN0aXZlQ2ZnID0gUmVsZWFzZXx4NjQNCisJCXtBQTY2NjZBQS1FMDlGLTQxMzUtOUMwQy00RkU1MEMzQzY1NEJ9LlJlbGVhc2V8eDY0LkJ1aWxkLjAgPSBSZWxlYXNlfHg2NA0KKwkJe0FBNjY2NkFBLUUwOUYtNDEzNS05QzBDLTRGRTUwQzNDNjU0Qn0uUmVsZWFzZVdpdGhvdXRBc218SXRhbml1bS5BY3RpdmVDZmcgPSBSZWxlYXNlV2l0aG91dEFzbXxJdGFuaXVtDQorCQl7QUE2NjY2QUEtRTA5Ri00MTM1LTlDMEMtNEZFNTBDM0M2NTRCfS5SZWxlYXNlV2l0aG91dEFzbXxJdGFuaXVtLkJ1aWxkLjAgPSBSZWxlYXNlV2l0aG91dEFzbXxJdGFuaXVtDQorCQl7QUE2NjY2QUEtRTA5Ri00MTM1LTlDMEMtNEZFNTBDM0M2NTRCfS5SZWxlYXNlV2l0aG91dEFzbXxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlV2l0aG91dEFzbXxXaW4zMg0KKwkJe0FBNjY2NkFBLUUwOUYtNDEzNS05QzBDLTRGRTUwQzNDNjU0Qn0uUmVsZWFzZVdpdGhvdXRBc218V2luMzIuQnVpbGQuMCA9IFJlbGVhc2VXaXRob3V0QXNtfFdpbjMyDQorCQl7QUE2NjY2QUEtRTA5Ri00MTM1LTlDMEMtNEZFNTBDM0M2NTRCfS5SZWxlYXNlV2l0aG91dEFzbXx4NjQuQWN0aXZlQ2ZnID0gUmVsZWFzZVdpdGhvdXRBc218eDY0DQorCQl7QUE2NjY2QUEtRTA5Ri00MTM1LTlDMEMtNEZFNTBDM0M2NTRCfS5SZWxlYXNlV2l0aG91dEFzbXx4NjQuQnVpbGQuMCA9IFJlbGVhc2VXaXRob3V0QXNtfHg2NA0KKwkJe0M1MkY5RTdCLTQ5OEEtNDJCRS04REI0LTg1QTE1Njk0MzY2QX0uRGVidWd8SXRhbml1bS5BY3RpdmVDZmcgPSBEZWJ1Z3xJdGFuaXVtDQorCQl7QzUyRjlFN0ItNDk4QS00MkJFLThEQjQtODVBMTU2OTQzNjZBfS5EZWJ1Z3xJdGFuaXVtLkJ1aWxkLjAgPSBEZWJ1Z3xJdGFuaXVtDQorCQl7QzUyRjlFN0ItNDk4QS00MkJFLThEQjQtODVBMTU2OTQzNjZBfS5EZWJ1Z3xXaW4zMi5BY3RpdmVDZmcgPSBEZWJ1Z3xXaW4zMg0KKwkJe0M1MkY5RTdCLTQ5OEEtNDJCRS04REI0LTg1QTE1Njk0MzY2QX0uRGVidWd8V2luMzIuQnVpbGQuMCA9IERlYnVnfFdpbjMyDQorCQl7QzUyRjlFN0ItNDk4QS00MkJFLThEQjQtODVBMTU2OTQzNjZBfS5EZWJ1Z3x4NjQuQWN0aXZlQ2ZnID0gRGVidWd8eDY0DQorCQl7QzUyRjlFN0ItNDk4QS00MkJFLThEQjQtODVBMTU2OTQzNjZBfS5EZWJ1Z3x4NjQuQnVpbGQuMCA9IERlYnVnfHg2NA0KKwkJe0M1MkY5RTdCLTQ5OEEtNDJCRS04REI0LTg1QTE1Njk0MzY2QX0uUmVsZWFzZXxJdGFuaXVtLkFjdGl2ZUNmZyA9IFJlbGVhc2V8SXRhbml1bQ0KKwkJe0M1MkY5RTdCLTQ5OEEtNDJCRS04REI0LTg1QTE1Njk0MzY2QX0uUmVsZWFzZXxJdGFuaXVtLkJ1aWxkLjAgPSBSZWxlYXNlfEl0YW5pdW0NCisJCXtDNTJGOUU3Qi00OThBLTQyQkUtOERCNC04NUExNTY5NDM2NkF9LlJlbGVhc2V8V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMg0KKwkJe0M1MkY5RTdCLTQ5OEEtNDJCRS04REI0LTg1QTE1Njk0MzY2QX0uUmVsZWFzZXxXaW4zMi5CdWlsZC4wID0gUmVsZWFzZXxXaW4zMg0KKwkJe0M1MkY5RTdCLTQ5OEEtNDJCRS04REI0LTg1QTE1Njk0MzY2QX0uUmVsZWFzZXx4NjQuQWN0aXZlQ2ZnID0gUmVsZWFzZXx4NjQNCisJCXtDNTJGOUU3Qi00OThBLTQyQkUtOERCNC04NUExNTY5NDM2NkF9LlJlbGVhc2V8eDY0LkJ1aWxkLjAgPSBSZWxlYXNlfHg2NA0KKwkJe0M1MkY5RTdCLTQ5OEEtNDJCRS04REI0LTg1QTE1Njk0MzY2QX0uUmVsZWFzZVdpdGhvdXRBc218SXRhbml1bS5BY3RpdmVDZmcgPSBSZWxlYXNlfEl0YW5pdW0NCisJCXtDNTJGOUU3Qi00OThBLTQyQkUtOERCNC04NUExNTY5NDM2NkF9LlJlbGVhc2VXaXRob3V0QXNtfEl0YW5pdW0uQnVpbGQuMCA9IFJlbGVhc2V8SXRhbml1bQ0KKwkJe0M1MkY5RTdCLTQ5OEEtNDJCRS04REI0LTg1QTE1Njk0MzY2QX0uUmVsZWFzZVdpdGhvdXRBc218V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMg0KKwkJe0M1MkY5RTdCLTQ5OEEtNDJCRS04REI0LTg1QTE1Njk0MzY2QX0uUmVsZWFzZVdpdGhvdXRBc218eDY0LkFjdGl2ZUNmZyA9IFJlbGVhc2V8eDY0DQorCQl7NDhDREQ5REMtRTA5Ri00MTM1LTlDMEMtNEZFNTBDM0M2NTRCfS5EZWJ1Z3xJdGFuaXVtLkFjdGl2ZUNmZyA9IERlYnVnfEl0YW5pdW0NCisJCXs0OENERDlEQy1FMDlGLTQxMzUtOUMwQy00RkU1MEMzQzY1NEJ9LkRlYnVnfEl0YW5pdW0uQnVpbGQuMCA9IERlYnVnfEl0YW5pdW0NCisJCXs0OENERDlEQy1FMDlGLTQxMzUtOUMwQy00RkU1MEMzQzY1NEJ9LkRlYnVnfFdpbjMyLkFjdGl2ZUNmZyA9IERlYnVnfFdpbjMyDQorCQl7NDhDREQ5REMtRTA5Ri00MTM1LTlDMEMtNEZFNTBDM0M2NTRCfS5EZWJ1Z3xXaW4zMi5CdWlsZC4wID0gRGVidWd8V2luMzINCisJCXs0OENERDlEQy1FMDlGLTQxMzUtOUMwQy00RkU1MEMzQzY1NEJ9LkRlYnVnfHg2NC5BY3RpdmVDZmcgPSBEZWJ1Z3x4NjQNCisJCXs0OENERDlEQy1FMDlGLTQxMzUtOUMwQy00RkU1MEMzQzY1NEJ9LkRlYnVnfHg2NC5CdWlsZC4wID0gRGVidWd8eDY0DQorCQl7NDhDREQ5REMtRTA5Ri00MTM1LTlDMEMtNEZFNTBDM0M2NTRCfS5SZWxlYXNlfEl0YW5pdW0uQWN0aXZlQ2ZnID0gUmVsZWFzZXxJdGFuaXVtDQorCQl7NDhDREQ5REMtRTA5Ri00MTM1LTlDMEMtNEZFNTBDM0M2NTRCfS5SZWxlYXNlfEl0YW5pdW0uQnVpbGQuMCA9IFJlbGVhc2V8SXRhbml1bQ0KKwkJezQ4Q0REOURDLUUwOUYtNDEzNS05QzBDLTRGRTUwQzNDNjU0Qn0uUmVsZWFzZXxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyDQorCQl7NDhDREQ5REMtRTA5Ri00MTM1LTlDMEMtNEZFNTBDM0M2NTRCfS5SZWxlYXNlfFdpbjMyLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbjMyDQorCQl7NDhDREQ5REMtRTA5Ri00MTM1LTlDMEMtNEZFNTBDM0M2NTRCfS5SZWxlYXNlfHg2NC5BY3RpdmVDZmcgPSBSZWxlYXNlfHg2NA0KKwkJezQ4Q0REOURDLUUwOUYtNDEzNS05QzBDLTRGRTUwQzNDNjU0Qn0uUmVsZWFzZXx4NjQuQnVpbGQuMCA9IFJlbGVhc2V8eDY0DQorCQl7NDhDREQ5REMtRTA5Ri00MTM1LTlDMEMtNEZFNTBDM0M2NTRCfS5SZWxlYXNlV2l0aG91dEFzbXxJdGFuaXVtLkFjdGl2ZUNmZyA9IFJlbGVhc2V8SXRhbml1bQ0KKwkJezQ4Q0REOURDLUUwOUYtNDEzNS05QzBDLTRGRTUwQzNDNjU0Qn0uUmVsZWFzZVdpdGhvdXRBc218SXRhbml1bS5CdWlsZC4wID0gUmVsZWFzZXxJdGFuaXVtDQorCQl7NDhDREQ5REMtRTA5Ri00MTM1LTlDMEMtNEZFNTBDM0M2NTRCfS5SZWxlYXNlV2l0aG91dEFzbXxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyDQorCQl7NDhDREQ5REMtRTA5Ri00MTM1LTlDMEMtNEZFNTBDM0M2NTRCfS5SZWxlYXNlV2l0aG91dEFzbXx4NjQuQWN0aXZlQ2ZnID0gUmVsZWFzZXx4NjQNCisJCXtDNTJGOUU3Qi00OThBLTQyQkUtOERCNC04NUExNTY5NDM4MkF9LkRlYnVnfEl0YW5pdW0uQWN0aXZlQ2ZnID0gRGVidWd8SXRhbml1bQ0KKwkJe0M1MkY5RTdCLTQ5OEEtNDJCRS04REI0LTg1QTE1Njk0MzgyQX0uRGVidWd8SXRhbml1bS5CdWlsZC4wID0gRGVidWd8SXRhbml1bQ0KKwkJe0M1MkY5RTdCLTQ5OEEtNDJCRS04REI0LTg1QTE1Njk0MzgyQX0uRGVidWd8V2luMzIuQWN0aXZlQ2ZnID0gRGVidWd8V2luMzINCisJCXtDNTJGOUU3Qi00OThBLTQyQkUtOERCNC04NUExNTY5NDM4MkF9LkRlYnVnfFdpbjMyLkJ1aWxkLjAgPSBEZWJ1Z3xXaW4zMg0KKwkJe0M1MkY5RTdCLTQ5OEEtNDJCRS04REI0LTg1QTE1Njk0MzgyQX0uRGVidWd8eDY0LkFjdGl2ZUNmZyA9IERlYnVnfHg2NA0KKwkJe0M1MkY5RTdCLTQ5OEEtNDJCRS04REI0LTg1QTE1Njk0MzgyQX0uRGVidWd8eDY0LkJ1aWxkLjAgPSBEZWJ1Z3x4NjQNCisJCXtDNTJGOUU3Qi00OThBLTQyQkUtOERCNC04NUExNTY5NDM4MkF9LlJlbGVhc2V8SXRhbml1bS5BY3RpdmVDZmcgPSBSZWxlYXNlfEl0YW5pdW0NCisJCXtDNTJGOUU3Qi00OThBLTQyQkUtOERCNC04NUExNTY5NDM4MkF9LlJlbGVhc2V8SXRhbml1bS5CdWlsZC4wID0gUmVsZWFzZXxJdGFuaXVtDQorCQl7QzUyRjlFN0ItNDk4QS00MkJFLThEQjQtODVBMTU2OTQzODJBfS5SZWxlYXNlfFdpbjMyLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzINCisJCXtDNTJGOUU3Qi00OThBLTQyQkUtOERCNC04NUExNTY5NDM4MkF9LlJlbGVhc2V8V2luMzIuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzINCisJCXtDNTJGOUU3Qi00OThBLTQyQkUtOERCNC04NUExNTY5NDM4MkF9LlJlbGVhc2V8eDY0LkFjdGl2ZUNmZyA9IFJlbGVhc2V8eDY0DQorCQl7QzUyRjlFN0ItNDk4QS00MkJFLThEQjQtODVBMTU2OTQzODJBfS5SZWxlYXNlfHg2NC5CdWlsZC4wID0gUmVsZWFzZXx4NjQNCisJCXtDNTJGOUU3Qi00OThBLTQyQkUtOERCNC04NUExNTY5NDM4MkF9LlJlbGVhc2VXaXRob3V0QXNtfEl0YW5pdW0uQWN0aXZlQ2ZnID0gUmVsZWFzZXxJdGFuaXVtDQorCQl7QzUyRjlFN0ItNDk4QS00MkJFLThEQjQtODVBMTU2OTQzODJBfS5SZWxlYXNlV2l0aG91dEFzbXxJdGFuaXVtLkJ1aWxkLjAgPSBSZWxlYXNlfEl0YW5pdW0NCisJCXtDNTJGOUU3Qi00OThBLTQyQkUtOERCNC04NUExNTY5NDM4MkF9LlJlbGVhc2VXaXRob3V0QXNtfFdpbjMyLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzINCisJCXtDNTJGOUU3Qi00OThBLTQyQkUtOERCNC04NUExNTY5NDM4MkF9LlJlbGVhc2VXaXRob3V0QXNtfHg2NC5BY3RpdmVDZmcgPSBSZWxlYXNlfHg2NA0KKwlFbmRHbG9iYWxTZWN0aW9uDQorCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Qcm9wZXJ0aWVzKSA9IHByZVNvbHV0aW9uDQorCQlIaWRlU29sdXRpb25Ob2RlID0gRkFMU0UNCisJRW5kR2xvYmFsU2VjdGlvbg0KK0VuZEdsb2JhbA0KZGlmZiAtLWdpdCBhL3psaWItMS4yLjYvY29udHJpYi92c3R1ZGlvL3ZjMTAvemxpYnZjLnZjeHByb2ogYi96bGliLTEuMi42L2NvbnRyaWIvdnN0dWRpby92YzEwL3psaWJ2Yy52Y3hwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4NjIzOTgKLS0tIC9kZXYvbnVsbAorKysgYi96bGliLTEuMi42L2NvbnRyaWIvdnN0dWRpby92YzEwL3psaWJ2Yy52Y3hwcm9qCkBAIC0wLDAgKzEsNjU5IEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KKzxQcm9qZWN0IERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgVG9vbHNWZXJzaW9uPSI0LjAiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPg0KKyAgPEl0ZW1Hcm91cCBMYWJlbD0iUHJvamVjdENvbmZpZ3VyYXRpb25zIj4NCisgICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IkRlYnVnfEl0YW5pdW0iPg0KKyAgICAgIDxDb25maWd1cmF0aW9uPkRlYnVnPC9Db25maWd1cmF0aW9uPg0KKyAgICAgIDxQbGF0Zm9ybT5JdGFuaXVtPC9QbGF0Zm9ybT4NCisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4NCisgICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IkRlYnVnfFdpbjMyIj4NCisgICAgICA8Q29uZmlndXJhdGlvbj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4NCisgICAgICA8UGxhdGZvcm0+V2luMzI8L1BsYXRmb3JtPg0KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPg0KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iRGVidWd8eDY0Ij4NCisgICAgICA8Q29uZmlndXJhdGlvbj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4NCisgICAgICA8UGxhdGZvcm0+eDY0PC9QbGF0Zm9ybT4NCisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4NCisgICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IlJlbGVhc2VXaXRob3V0QXNtfEl0YW5pdW0iPg0KKyAgICAgIDxDb25maWd1cmF0aW9uPlJlbGVhc2VXaXRob3V0QXNtPC9Db25maWd1cmF0aW9uPg0KKyAgICAgIDxQbGF0Zm9ybT5JdGFuaXVtPC9QbGF0Zm9ybT4NCisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4NCisgICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IlJlbGVhc2VXaXRob3V0QXNtfFdpbjMyIj4NCisgICAgICA8Q29uZmlndXJhdGlvbj5SZWxlYXNlV2l0aG91dEFzbTwvQ29uZmlndXJhdGlvbj4NCisgICAgICA8UGxhdGZvcm0+V2luMzI8L1BsYXRmb3JtPg0KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPg0KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUmVsZWFzZVdpdGhvdXRBc218eDY0Ij4NCisgICAgICA8Q29uZmlndXJhdGlvbj5SZWxlYXNlV2l0aG91dEFzbTwvQ29uZmlndXJhdGlvbj4NCisgICAgICA8UGxhdGZvcm0+eDY0PC9QbGF0Zm9ybT4NCisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4NCisgICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IlJlbGVhc2V8SXRhbml1bSI+DQorICAgICAgPENvbmZpZ3VyYXRpb24+UmVsZWFzZTwvQ29uZmlndXJhdGlvbj4NCisgICAgICA8UGxhdGZvcm0+SXRhbml1bTwvUGxhdGZvcm0+DQorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+DQorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJSZWxlYXNlfFdpbjMyIj4NCisgICAgICA8Q29uZmlndXJhdGlvbj5SZWxlYXNlPC9Db25maWd1cmF0aW9uPg0KKyAgICAgIDxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+DQorICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+DQorICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJSZWxlYXNlfHg2NCI+DQorICAgICAgPENvbmZpZ3VyYXRpb24+UmVsZWFzZTwvQ29uZmlndXJhdGlvbj4NCisgICAgICA8UGxhdGZvcm0+eDY0PC9QbGF0Zm9ybT4NCisgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgTGFiZWw9Ikdsb2JhbHMiPg0KKyAgICA8UHJvamVjdEd1aWQ+ezhGRDgyNkY4LTM3MzktNDRFNi04Q0M4LTk5NzEyMkU1M0I4RH08L1Byb2plY3RHdWlkPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPEltcG9ydCBQcm9qZWN0PSIkKFZDVGFyZ2V0c1BhdGgpXE1pY3Jvc29mdC5DcHAuRGVmYXVsdC5wcm9wcyIgLz4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciIExhYmVsPSJDb25maWd1cmF0aW9uIj4NCisgICAgPENvbmZpZ3VyYXRpb25UeXBlPkR5bmFtaWNMaWJyYXJ5PC9Db25maWd1cmF0aW9uVHlwZT4NCisgICAgPFVzZU9mTWZjPmZhbHNlPC9Vc2VPZk1mYz4NCisgICAgPFdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj50cnVlPC9XaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2VXaXRob3V0QXNtfFdpbjMyJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPg0KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+RHluYW1pY0xpYnJhcnk8L0NvbmZpZ3VyYXRpb25UeXBlPg0KKyAgICA8VXNlT2ZNZmM+ZmFsc2U8L1VzZU9mTWZjPg0KKyAgICA8V2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPnRydWU8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+DQorICAgIDxDb25maWd1cmF0aW9uVHlwZT5EeW5hbWljTGlicmFyeTwvQ29uZmlndXJhdGlvblR5cGU+DQorICAgIDxVc2VPZk1mYz5mYWxzZTwvVXNlT2ZNZmM+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8SXRhbml1bSciIExhYmVsPSJDb25maWd1cmF0aW9uIj4NCisgICAgPENvbmZpZ3VyYXRpb25UeXBlPkR5bmFtaWNMaWJyYXJ5PC9Db25maWd1cmF0aW9uVHlwZT4NCisgICAgPFVzZU9mTWZjPmZhbHNlPC9Vc2VPZk1mYz4NCisgICAgPFdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj50cnVlPC9XaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2VXaXRob3V0QXNtfEl0YW5pdW0nIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+DQorICAgIDxDb25maWd1cmF0aW9uVHlwZT5EeW5hbWljTGlicmFyeTwvQ29uZmlndXJhdGlvblR5cGU+DQorICAgIDxVc2VPZk1mYz5mYWxzZTwvVXNlT2ZNZmM+DQorICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+dHJ1ZTwvV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xJdGFuaXVtJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPg0KKyAgICA8Q29uZmlndXJhdGlvblR5cGU+RHluYW1pY0xpYnJhcnk8L0NvbmZpZ3VyYXRpb25UeXBlPg0KKyAgICA8VXNlT2ZNZmM+ZmFsc2U8L1VzZU9mTWZjPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciIExhYmVsPSJDb25maWd1cmF0aW9uIj4NCisgICAgPENvbmZpZ3VyYXRpb25UeXBlPkR5bmFtaWNMaWJyYXJ5PC9Db25maWd1cmF0aW9uVHlwZT4NCisgICAgPFVzZU9mTWZjPmZhbHNlPC9Vc2VPZk1mYz4NCisgICAgPFdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj50cnVlPC9XaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2VXaXRob3V0QXNtfHg2NCciIExhYmVsPSJDb25maWd1cmF0aW9uIj4NCisgICAgPENvbmZpZ3VyYXRpb25UeXBlPkR5bmFtaWNMaWJyYXJ5PC9Db25maWd1cmF0aW9uVHlwZT4NCisgICAgPFVzZU9mTWZjPmZhbHNlPC9Vc2VPZk1mYz4NCisgICAgPFdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj50cnVlPC9XaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciIExhYmVsPSJDb25maWd1cmF0aW9uIj4NCisgICAgPENvbmZpZ3VyYXRpb25UeXBlPkR5bmFtaWNMaWJyYXJ5PC9Db25maWd1cmF0aW9uVHlwZT4NCisgICAgPFVzZU9mTWZjPmZhbHNlPC9Vc2VPZk1mYz4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLnByb3BzIiAvPg0KKyAgPEltcG9ydEdyb3VwIExhYmVsPSJFeHRlbnNpb25TZXR0aW5ncyI+DQorICA8L0ltcG9ydEdyb3VwPg0KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+DQorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4NCisgIDwvSW1wb3J0R3JvdXA+DQorICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlV2l0aG91dEFzbXxXaW4zMiciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+DQorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4NCisgIDwvSW1wb3J0R3JvdXA+DQorICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+DQorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4NCisgIDwvSW1wb3J0R3JvdXA+DQorICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfEl0YW5pdW0nIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPg0KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+DQorICA8L0ltcG9ydEdyb3VwPg0KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZVdpdGhvdXRBc218SXRhbml1bSciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+DQorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4NCisgIDwvSW1wb3J0R3JvdXA+DQorICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xJdGFuaXVtJyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4NCisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPg0KKyAgPC9JbXBvcnRHcm91cD4NCisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4NCisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPg0KKyAgPC9JbXBvcnRHcm91cD4NCisgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2VXaXRob3V0QXNtfHg2NCciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+DQorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4NCisgIDwvSW1wb3J0R3JvdXA+DQorICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPg0KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+DQorICA8L0ltcG9ydEdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgTGFiZWw9IlVzZXJNYWNyb3MiIC8+DQorICA8UHJvcGVydHlHcm91cD4NCisgICAgPF9Qcm9qZWN0RmlsZVZlcnNpb24+MTAuMC4zMDEyOC4xPC9fUHJvamVjdEZpbGVWZXJzaW9uPg0KKyAgICA8T3V0RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj54ODZcWmxpYkRsbCQoQ29uZmlndXJhdGlvbilcPC9PdXREaXI+DQorICAgIDxJbnREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPng4NlxabGliRGxsJChDb25maWd1cmF0aW9uKVxUbXBcPC9JbnREaXI+DQorICAgIDxMaW5rSW5jcmVtZW50YWwgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPnRydWU8L0xpbmtJbmNyZW1lbnRhbD4NCisgICAgPEdlbmVyYXRlTWFuaWZlc3QgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPmZhbHNlPC9HZW5lcmF0ZU1hbmlmZXN0Pg0KKyAgICA8T3V0RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZVdpdGhvdXRBc218V2luMzInIj54ODZcWmxpYkRsbCQoQ29uZmlndXJhdGlvbilcPC9PdXREaXI+DQorICAgIDxJbnREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlV2l0aG91dEFzbXxXaW4zMiciPng4NlxabGliRGxsJChDb25maWd1cmF0aW9uKVxUbXBcPC9JbnREaXI+DQorICAgIDxMaW5rSW5jcmVtZW50YWwgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlV2l0aG91dEFzbXxXaW4zMiciPmZhbHNlPC9MaW5rSW5jcmVtZW50YWw+DQorICAgIDxHZW5lcmF0ZU1hbmlmZXN0IENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZVdpdGhvdXRBc218V2luMzInIj5mYWxzZTwvR2VuZXJhdGVNYW5pZmVzdD4NCisgICAgPE91dERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj54ODZcWmxpYkRsbCQoQ29uZmlndXJhdGlvbilcPC9PdXREaXI+DQorICAgIDxJbnREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+eDg2XFpsaWJEbGwkKENvbmZpZ3VyYXRpb24pXFRtcFw8L0ludERpcj4NCisgICAgPExpbmtJbmNyZW1lbnRhbCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj5mYWxzZTwvTGlua0luY3JlbWVudGFsPg0KKyAgICA8R2VuZXJhdGVNYW5pZmVzdCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj5mYWxzZTwvR2VuZXJhdGVNYW5pZmVzdD4NCisgICAgPE91dERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciPng2NFxabGliRGxsJChDb25maWd1cmF0aW9uKVw8L091dERpcj4NCisgICAgPEludERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciPng2NFxabGliRGxsJChDb25maWd1cmF0aW9uKVxUbXBcPC9JbnREaXI+DQorICAgIDxMaW5rSW5jcmVtZW50YWwgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj50cnVlPC9MaW5rSW5jcmVtZW50YWw+DQorICAgIDxHZW5lcmF0ZU1hbmlmZXN0IENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+ZmFsc2U8L0dlbmVyYXRlTWFuaWZlc3Q+DQorICAgIDxPdXREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xJdGFuaXVtJyI+aWE2NFxabGliRGxsJChDb25maWd1cmF0aW9uKVw8L091dERpcj4NCisgICAgPEludERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfEl0YW5pdW0nIj5pYTY0XFpsaWJEbGwkKENvbmZpZ3VyYXRpb24pXFRtcFw8L0ludERpcj4NCisgICAgPExpbmtJbmNyZW1lbnRhbCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfEl0YW5pdW0nIj50cnVlPC9MaW5rSW5jcmVtZW50YWw+DQorICAgIDxHZW5lcmF0ZU1hbmlmZXN0IENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8SXRhbml1bSciPmZhbHNlPC9HZW5lcmF0ZU1hbmlmZXN0Pg0KKyAgICA8T3V0RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZVdpdGhvdXRBc218eDY0JyI+eDY0XFpsaWJEbGwkKENvbmZpZ3VyYXRpb24pXDwvT3V0RGlyPg0KKyAgICA8SW50RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZVdpdGhvdXRBc218eDY0JyI+eDY0XFpsaWJEbGwkKENvbmZpZ3VyYXRpb24pXFRtcFw8L0ludERpcj4NCisgICAgPExpbmtJbmNyZW1lbnRhbCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2VXaXRob3V0QXNtfHg2NCciPmZhbHNlPC9MaW5rSW5jcmVtZW50YWw+DQorICAgIDxHZW5lcmF0ZU1hbmlmZXN0IENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZVdpdGhvdXRBc218eDY0JyI+ZmFsc2U8L0dlbmVyYXRlTWFuaWZlc3Q+DQorICAgIDxPdXREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlV2l0aG91dEFzbXxJdGFuaXVtJyI+aWE2NFxabGliRGxsJChDb25maWd1cmF0aW9uKVw8L091dERpcj4NCisgICAgPEludERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2VXaXRob3V0QXNtfEl0YW5pdW0nIj5pYTY0XFpsaWJEbGwkKENvbmZpZ3VyYXRpb24pXFRtcFw8L0ludERpcj4NCisgICAgPExpbmtJbmNyZW1lbnRhbCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2VXaXRob3V0QXNtfEl0YW5pdW0nIj5mYWxzZTwvTGlua0luY3JlbWVudGFsPg0KKyAgICA8R2VuZXJhdGVNYW5pZmVzdCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2VXaXRob3V0QXNtfEl0YW5pdW0nIj5mYWxzZTwvR2VuZXJhdGVNYW5pZmVzdD4NCisgICAgPE91dERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+eDY0XFpsaWJEbGwkKENvbmZpZ3VyYXRpb24pXDwvT3V0RGlyPg0KKyAgICA8SW50RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj54NjRcWmxpYkRsbCQoQ29uZmlndXJhdGlvbilcVG1wXDwvSW50RGlyPg0KKyAgICA8TGlua0luY3JlbWVudGFsIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj5mYWxzZTwvTGlua0luY3JlbWVudGFsPg0KKyAgICA8R2VuZXJhdGVNYW5pZmVzdCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+ZmFsc2U8L0dlbmVyYXRlTWFuaWZlc3Q+DQorICAgIDxPdXREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfEl0YW5pdW0nIj5pYTY0XFpsaWJEbGwkKENvbmZpZ3VyYXRpb24pXDwvT3V0RGlyPg0KKyAgICA8SW50RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxJdGFuaXVtJyI+aWE2NFxabGliRGxsJChDb25maWd1cmF0aW9uKVxUbXBcPC9JbnREaXI+DQorICAgIDxMaW5rSW5jcmVtZW50YWwgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfEl0YW5pdW0nIj5mYWxzZTwvTGlua0luY3JlbWVudGFsPg0KKyAgICA8R2VuZXJhdGVNYW5pZmVzdCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8SXRhbml1bSciPmZhbHNlPC9HZW5lcmF0ZU1hbmlmZXN0Pg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZVNldCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfEl0YW5pdW0nIj5BbGxSdWxlcy5ydWxlc2V0PC9Db2RlQW5hbHlzaXNSdWxlU2V0Pg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xJdGFuaXVtJyIgLz4NCisgICAgPENvZGVBbmFseXNpc1J1bGVBc3NlbWJsaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8SXRhbml1bSciIC8+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlU2V0IENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj5BbGxSdWxlcy5ydWxlc2V0PC9Db2RlQW5hbHlzaXNSdWxlU2V0Pg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciIC8+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlQXNzZW1ibGllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyIgLz4NCisgICAgPENvZGVBbmFseXNpc1J1bGVTZXQgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj5BbGxSdWxlcy5ydWxlc2V0PC9Db2RlQW5hbHlzaXNSdWxlU2V0Pg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIiAvPg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZUFzc2VtYmxpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIiAvPg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZVNldCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2VXaXRob3V0QXNtfEl0YW5pdW0nIj5BbGxSdWxlcy5ydWxlc2V0PC9Db2RlQW5hbHlzaXNSdWxlU2V0Pg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlV2l0aG91dEFzbXxJdGFuaXVtJyIgLz4NCisgICAgPENvZGVBbmFseXNpc1J1bGVBc3NlbWJsaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZVdpdGhvdXRBc218SXRhbml1bSciIC8+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlU2V0IENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZVdpdGhvdXRBc218V2luMzInIj5BbGxSdWxlcy5ydWxlc2V0PC9Db2RlQW5hbHlzaXNSdWxlU2V0Pg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlV2l0aG91dEFzbXxXaW4zMiciIC8+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlQXNzZW1ibGllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2VXaXRob3V0QXNtfFdpbjMyJyIgLz4NCisgICAgPENvZGVBbmFseXNpc1J1bGVTZXQgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlV2l0aG91dEFzbXx4NjQnIj5BbGxSdWxlcy5ydWxlc2V0PC9Db2RlQW5hbHlzaXNSdWxlU2V0Pg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlV2l0aG91dEFzbXx4NjQnIiAvPg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZUFzc2VtYmxpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlV2l0aG91dEFzbXx4NjQnIiAvPg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZVNldCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8SXRhbml1bSciPkFsbFJ1bGVzLnJ1bGVzZXQ8L0NvZGVBbmFseXNpc1J1bGVTZXQ+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8SXRhbml1bSciIC8+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlQXNzZW1ibGllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8SXRhbml1bSciIC8+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlU2V0IENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPkFsbFJ1bGVzLnJ1bGVzZXQ8L0NvZGVBbmFseXNpc1J1bGVTZXQ+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIiAvPg0KKyAgICA8Q29kZUFuYWx5c2lzUnVsZUFzc2VtYmxpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyIgLz4NCisgICAgPENvZGVBbmFseXNpc1J1bGVTZXQgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciPkFsbFJ1bGVzLnJ1bGVzZXQ8L0NvZGVBbmFseXNpc1J1bGVTZXQ+DQorICAgIDxDb2RlQW5hbHlzaXNSdWxlcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyIgLz4NCisgICAgPENvZGVBbmFseXNpc1J1bGVBc3NlbWJsaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIiAvPg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPg0KKyAgICA8TWlkbD4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+X0RFQlVHOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8TWtUeXBMaWJDb21wYXRpYmxlPnRydWU8L01rVHlwTGliQ29tcGF0aWJsZT4NCisgICAgICA8U3VwcHJlc3NTdGFydHVwQmFubmVyPnRydWU8L1N1cHByZXNzU3RhcnR1cEJhbm5lcj4NCisgICAgICA8VGFyZ2V0RW52aXJvbm1lbnQ+V2luMzI8L1RhcmdldEVudmlyb25tZW50Pg0KKyAgICAgIDxUeXBlTGlicmFyeU5hbWU+JChPdXREaXIpemxpYnZjLnRsYjwvVHlwZUxpYnJhcnlOYW1lPg0KKyAgICA8L01pZGw+DQorICAgIDxDbENvbXBpbGU+DQorICAgICAgPE9wdGltaXphdGlvbj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPi4uXC4uXC4uOy4uXC4uXG1hc214ODY7JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+V0lOMzI7X0NSVF9OT05TVERDX05PX0RFUFJFQ0FURTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7X0NSVF9OT05TVERDX05PX1dBUk5JTkdTO1pMSUJfV0lOQVBJO0FTTVY7QVNNSU5GOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8RXhjZXB0aW9uSGFuZGxpbmc+DQorICAgICAgPC9FeGNlcHRpb25IYW5kbGluZz4NCisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZERlYnVnPC9SdW50aW1lTGlicmFyeT4NCisgICAgICA8QnVmZmVyU2VjdXJpdHlDaGVjaz5mYWxzZTwvQnVmZmVyU2VjdXJpdHlDaGVjaz4NCisgICAgICA8UHJlY29tcGlsZWRIZWFkZXJPdXRwdXRGaWxlPiQoSW50RGlyKXpsaWJ2Yy5wY2g8L1ByZWNvbXBpbGVkSGVhZGVyT3V0cHV0RmlsZT4NCisgICAgICA8QXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPiQoSW50RGlyKTwvQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPg0KKyAgICAgIDxPYmplY3RGaWxlTmFtZT4kKEludERpcik8L09iamVjdEZpbGVOYW1lPg0KKyAgICAgIDxQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4kKE91dERpcik8L1Byb2dyYW1EYXRhQmFzZUZpbGVOYW1lPg0KKyAgICAgIDxCcm93c2VJbmZvcm1hdGlvbj4NCisgICAgICA8L0Jyb3dzZUluZm9ybWF0aW9uPg0KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+DQorICAgICAgPFN1cHByZXNzU3RhcnR1cEJhbm5lcj50cnVlPC9TdXBwcmVzc1N0YXJ0dXBCYW5uZXI+DQorICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+RWRpdEFuZENvbnRpbnVlPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0Pg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPFJlc291cmNlQ29tcGlsZT4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+X0RFQlVHOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8Q3VsdHVyZT4weDA0MGM8L0N1bHR1cmU+DQorICAgIDwvUmVzb3VyY2VDb21waWxlPg0KKyAgICA8TGluaz4NCisgICAgICA8QWRkaXRpb25hbE9wdGlvbnM+L01BQ0hJTkU6STM4NiAlKEFkZGl0aW9uYWxPcHRpb25zKTwvQWRkaXRpb25hbE9wdGlvbnM+DQorICAgICAgPEFkZGl0aW9uYWxEZXBlbmRlbmNpZXM+Li5cLi5cbWFzbXg4NlxtYXRjaDY4Ni5vYmo7Li5cLi5cbWFzbXg4NlxpbmZmYXMzMi5vYmo7JShBZGRpdGlvbmFsRGVwZW5kZW5jaWVzKTwvQWRkaXRpb25hbERlcGVuZGVuY2llcz4NCisgICAgICA8T3V0cHV0RmlsZT4kKE91dERpcil6bGlid2FwaS5kbGw8L091dHB1dEZpbGU+DQorICAgICAgPFN1cHByZXNzU3RhcnR1cEJhbm5lcj50cnVlPC9TdXBwcmVzc1N0YXJ0dXBCYW5uZXI+DQorICAgICAgPE1vZHVsZURlZmluaXRpb25GaWxlPi5cemxpYnZjLmRlZjwvTW9kdWxlRGVmaW5pdGlvbkZpbGU+DQorICAgICAgPEdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj50cnVlPC9HZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+DQorICAgICAgPFByb2dyYW1EYXRhYmFzZUZpbGU+JChPdXREaXIpemxpYndhcGkucGRiPC9Qcm9ncmFtRGF0YWJhc2VGaWxlPg0KKyAgICAgIDxHZW5lcmF0ZU1hcEZpbGU+dHJ1ZTwvR2VuZXJhdGVNYXBGaWxlPg0KKyAgICAgIDxNYXBGaWxlTmFtZT4kKE91dERpcil6bGlid2FwaS5tYXA8L01hcEZpbGVOYW1lPg0KKyAgICAgIDxTdWJTeXN0ZW0+V2luZG93czwvU3ViU3lzdGVtPg0KKyAgICAgIDxSYW5kb21pemVkQmFzZUFkZHJlc3M+ZmFsc2U8L1JhbmRvbWl6ZWRCYXNlQWRkcmVzcz4NCisgICAgICA8RGF0YUV4ZWN1dGlvblByZXZlbnRpb24+DQorICAgICAgPC9EYXRhRXhlY3V0aW9uUHJldmVudGlvbj4NCisgICAgICA8SW1wb3J0TGlicmFyeT4kKE91dERpcil6bGlid2FwaS5saWI8L0ltcG9ydExpYnJhcnk+DQorICAgIDwvTGluaz4NCisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4NCisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZVdpdGhvdXRBc218V2luMzInIj4NCisgICAgPE1pZGw+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPk5ERUJVRzslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPE1rVHlwTGliQ29tcGF0aWJsZT50cnVlPC9Na1R5cExpYkNvbXBhdGlibGU+DQorICAgICAgPFN1cHByZXNzU3RhcnR1cEJhbm5lcj50cnVlPC9TdXBwcmVzc1N0YXJ0dXBCYW5uZXI+DQorICAgICAgPFRhcmdldEVudmlyb25tZW50PldpbjMyPC9UYXJnZXRFbnZpcm9ubWVudD4NCisgICAgICA8VHlwZUxpYnJhcnlOYW1lPiQoT3V0RGlyKXpsaWJ2Yy50bGI8L1R5cGVMaWJyYXJ5TmFtZT4NCisgICAgPC9NaWRsPg0KKyAgICA8Q2xDb21waWxlPg0KKyAgICAgIDxJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj5Pbmx5RXhwbGljaXRJbmxpbmU8L0lubGluZUZ1bmN0aW9uRXhwYW5zaW9uPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPi4uXC4uXC4uOy4uXC4uXG1hc214ODY7JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+V0lOMzI7X0NSVF9OT05TVERDX05PX0RFUFJFQ0FURTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7X0NSVF9OT05TVERDX05PX1dBUk5JTkdTO1pMSUJfV0lOQVBJOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8U3RyaW5nUG9vbGluZz50cnVlPC9TdHJpbmdQb29saW5nPg0KKyAgICAgIDxFeGNlcHRpb25IYW5kbGluZz4NCisgICAgICA8L0V4Y2VwdGlvbkhhbmRsaW5nPg0KKyAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkRExMPC9SdW50aW1lTGlicmFyeT4NCisgICAgICA8QnVmZmVyU2VjdXJpdHlDaGVjaz5mYWxzZTwvQnVmZmVyU2VjdXJpdHlDaGVjaz4NCisgICAgICA8RnVuY3Rpb25MZXZlbExpbmtpbmc+dHJ1ZTwvRnVuY3Rpb25MZXZlbExpbmtpbmc+DQorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyT3V0cHV0RmlsZT4kKEludERpcil6bGlidmMucGNoPC9QcmVjb21waWxlZEhlYWRlck91dHB1dEZpbGU+DQorICAgICAgPEFzc2VtYmxlck91dHB1dD5BbGw8L0Fzc2VtYmxlck91dHB1dD4NCisgICAgICA8QXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPiQoSW50RGlyKTwvQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPg0KKyAgICAgIDxPYmplY3RGaWxlTmFtZT4kKEludERpcik8L09iamVjdEZpbGVOYW1lPg0KKyAgICAgIDxQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4kKE91dERpcik8L1Byb2dyYW1EYXRhQmFzZUZpbGVOYW1lPg0KKyAgICAgIDxCcm93c2VJbmZvcm1hdGlvbj4NCisgICAgICA8L0Jyb3dzZUluZm9ybWF0aW9uPg0KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+DQorICAgICAgPFN1cHByZXNzU3RhcnR1cEJhbm5lcj50cnVlPC9TdXBwcmVzc1N0YXJ0dXBCYW5uZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8UmVzb3VyY2VDb21waWxlPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5OREVCVUc7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KKyAgICAgIDxDdWx0dXJlPjB4MDQwYzwvQ3VsdHVyZT4NCisgICAgPC9SZXNvdXJjZUNvbXBpbGU+DQorICAgIDxMaW5rPg0KKyAgICAgIDxBZGRpdGlvbmFsT3B0aW9ucz4vTUFDSElORTpJMzg2ICUoQWRkaXRpb25hbE9wdGlvbnMpPC9BZGRpdGlvbmFsT3B0aW9ucz4NCisgICAgICA8T3V0cHV0RmlsZT4kKE91dERpcil6bGlid2FwaS5kbGw8L091dHB1dEZpbGU+DQorICAgICAgPFN1cHByZXNzU3RhcnR1cEJhbm5lcj50cnVlPC9TdXBwcmVzc1N0YXJ0dXBCYW5uZXI+DQorICAgICAgPElnbm9yZUFsbERlZmF1bHRMaWJyYXJpZXM+ZmFsc2U8L0lnbm9yZUFsbERlZmF1bHRMaWJyYXJpZXM+DQorICAgICAgPE1vZHVsZURlZmluaXRpb25GaWxlPi5cemxpYnZjLmRlZjwvTW9kdWxlRGVmaW5pdGlvbkZpbGU+DQorICAgICAgPFByb2dyYW1EYXRhYmFzZUZpbGU+JChPdXREaXIpemxpYndhcGkucGRiPC9Qcm9ncmFtRGF0YWJhc2VGaWxlPg0KKyAgICAgIDxHZW5lcmF0ZU1hcEZpbGU+dHJ1ZTwvR2VuZXJhdGVNYXBGaWxlPg0KKyAgICAgIDxNYXBGaWxlTmFtZT4kKE91dERpcil6bGlid2FwaS5tYXA8L01hcEZpbGVOYW1lPg0KKyAgICAgIDxTdWJTeXN0ZW0+V2luZG93czwvU3ViU3lzdGVtPg0KKyAgICAgIDxSYW5kb21pemVkQmFzZUFkZHJlc3M+ZmFsc2U8L1JhbmRvbWl6ZWRCYXNlQWRkcmVzcz4NCisgICAgICA8RGF0YUV4ZWN1dGlvblByZXZlbnRpb24+DQorICAgICAgPC9EYXRhRXhlY3V0aW9uUHJldmVudGlvbj4NCisgICAgICA8SW1wb3J0TGlicmFyeT4kKE91dERpcil6bGlid2FwaS5saWI8L0ltcG9ydExpYnJhcnk+DQorICAgIDwvTGluaz4NCisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4NCisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPg0KKyAgICA8TWlkbD4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+TkRFQlVHOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8TWtUeXBMaWJDb21wYXRpYmxlPnRydWU8L01rVHlwTGliQ29tcGF0aWJsZT4NCisgICAgICA8U3VwcHJlc3NTdGFydHVwQmFubmVyPnRydWU8L1N1cHByZXNzU3RhcnR1cEJhbm5lcj4NCisgICAgICA8VGFyZ2V0RW52aXJvbm1lbnQ+V2luMzI8L1RhcmdldEVudmlyb25tZW50Pg0KKyAgICAgIDxUeXBlTGlicmFyeU5hbWU+JChPdXREaXIpemxpYnZjLnRsYjwvVHlwZUxpYnJhcnlOYW1lPg0KKyAgICA8L01pZGw+DQorICAgIDxDbENvbXBpbGU+DQorICAgICAgPElubGluZUZ1bmN0aW9uRXhwYW5zaW9uPk9ubHlFeHBsaWNpdElubGluZTwvSW5saW5lRnVuY3Rpb25FeHBhbnNpb24+DQorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+Li5cLi5cLi47Li5cLi5cbWFzbXg4NjslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5XSU4zMjtfQ1JUX05PTlNURENfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtfQ1JUX05PTlNURENfTk9fV0FSTklOR1M7WkxJQl9XSU5BUEk7QVNNVjtBU01JTkY7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KKyAgICAgIDxTdHJpbmdQb29saW5nPnRydWU8L1N0cmluZ1Bvb2xpbmc+DQorICAgICAgPEV4Y2VwdGlvbkhhbmRsaW5nPg0KKyAgICAgIDwvRXhjZXB0aW9uSGFuZGxpbmc+DQorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWQ8L1J1bnRpbWVMaWJyYXJ5Pg0KKyAgICAgIDxCdWZmZXJTZWN1cml0eUNoZWNrPmZhbHNlPC9CdWZmZXJTZWN1cml0eUNoZWNrPg0KKyAgICAgIDxGdW5jdGlvbkxldmVsTGlua2luZz50cnVlPC9GdW5jdGlvbkxldmVsTGlua2luZz4NCisgICAgICA8UHJlY29tcGlsZWRIZWFkZXJPdXRwdXRGaWxlPiQoSW50RGlyKXpsaWJ2Yy5wY2g8L1ByZWNvbXBpbGVkSGVhZGVyT3V0cHV0RmlsZT4NCisgICAgICA8QXNzZW1ibGVyT3V0cHV0PkFsbDwvQXNzZW1ibGVyT3V0cHV0Pg0KKyAgICAgIDxBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb24+JChJbnREaXIpPC9Bc3NlbWJsZXJMaXN0aW5nTG9jYXRpb24+DQorICAgICAgPE9iamVjdEZpbGVOYW1lPiQoSW50RGlyKTwvT2JqZWN0RmlsZU5hbWU+DQorICAgICAgPFByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPiQoT3V0RGlyKTwvUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+DQorICAgICAgPEJyb3dzZUluZm9ybWF0aW9uPg0KKyAgICAgIDwvQnJvd3NlSW5mb3JtYXRpb24+DQorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4NCisgICAgICA8U3VwcHJlc3NTdGFydHVwQmFubmVyPnRydWU8L1N1cHByZXNzU3RhcnR1cEJhbm5lcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxSZXNvdXJjZUNvbXBpbGU+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPk5ERUJVRzslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPEN1bHR1cmU+MHgwNDBjPC9DdWx0dXJlPg0KKyAgICA8L1Jlc291cmNlQ29tcGlsZT4NCisgICAgPExpbms+DQorICAgICAgPEFkZGl0aW9uYWxPcHRpb25zPi9NQUNISU5FOkkzODYgJShBZGRpdGlvbmFsT3B0aW9ucyk8L0FkZGl0aW9uYWxPcHRpb25zPg0KKyAgICAgIDxBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPi4uXC4uXG1hc214ODZcbWF0Y2g2ODYub2JqOy4uXC4uXG1hc214ODZcaW5mZmFzMzIub2JqOyUoQWRkaXRpb25hbERlcGVuZGVuY2llcyk8L0FkZGl0aW9uYWxEZXBlbmRlbmNpZXM+DQorICAgICAgPE91dHB1dEZpbGU+JChPdXREaXIpemxpYndhcGkuZGxsPC9PdXRwdXRGaWxlPg0KKyAgICAgIDxTdXBwcmVzc1N0YXJ0dXBCYW5uZXI+dHJ1ZTwvU3VwcHJlc3NTdGFydHVwQmFubmVyPg0KKyAgICAgIDxJZ25vcmVBbGxEZWZhdWx0TGlicmFyaWVzPmZhbHNlPC9JZ25vcmVBbGxEZWZhdWx0TGlicmFyaWVzPg0KKyAgICAgIDxNb2R1bGVEZWZpbml0aW9uRmlsZT4uXHpsaWJ2Yy5kZWY8L01vZHVsZURlZmluaXRpb25GaWxlPg0KKyAgICAgIDxQcm9ncmFtRGF0YWJhc2VGaWxlPiQoT3V0RGlyKXpsaWJ3YXBpLnBkYjwvUHJvZ3JhbURhdGFiYXNlRmlsZT4NCisgICAgICA8R2VuZXJhdGVNYXBGaWxlPnRydWU8L0dlbmVyYXRlTWFwRmlsZT4NCisgICAgICA8TWFwRmlsZU5hbWU+JChPdXREaXIpemxpYndhcGkubWFwPC9NYXBGaWxlTmFtZT4NCisgICAgICA8U3ViU3lzdGVtPldpbmRvd3M8L1N1YlN5c3RlbT4NCisgICAgICA8UmFuZG9taXplZEJhc2VBZGRyZXNzPmZhbHNlPC9SYW5kb21pemVkQmFzZUFkZHJlc3M+DQorICAgICAgPERhdGFFeGVjdXRpb25QcmV2ZW50aW9uPg0KKyAgICAgIDwvRGF0YUV4ZWN1dGlvblByZXZlbnRpb24+DQorICAgICAgPEltcG9ydExpYnJhcnk+JChPdXREaXIpemxpYndhcGkubGliPC9JbXBvcnRMaWJyYXJ5Pg0KKyAgICA8L0xpbms+DQorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+DQorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciPg0KKyAgICA8TWlkbD4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+X0RFQlVHOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8TWtUeXBMaWJDb21wYXRpYmxlPnRydWU8L01rVHlwTGliQ29tcGF0aWJsZT4NCisgICAgICA8U3VwcHJlc3NTdGFydHVwQmFubmVyPnRydWU8L1N1cHByZXNzU3RhcnR1cEJhbm5lcj4NCisgICAgICA8VGFyZ2V0RW52aXJvbm1lbnQ+WDY0PC9UYXJnZXRFbnZpcm9ubWVudD4NCisgICAgICA8VHlwZUxpYnJhcnlOYW1lPiQoT3V0RGlyKXpsaWJ2Yy50bGI8L1R5cGVMaWJyYXJ5TmFtZT4NCisgICAgPC9NaWRsPg0KKyAgICA8Q2xDb21waWxlPg0KKyAgICAgIDxPcHRpbWl6YXRpb24+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4NCisgICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4uLlwuLlwuLjsuLlwuLlxtYXNteDg2OyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPldJTjMyO19DUlRfTk9OU1REQ19OT19ERVBSRUNBVEU7X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFO19DUlRfTk9OU1REQ19OT19XQVJOSU5HUztaTElCX1dJTkFQSTtBU01WO0FTTUlORjtXSU42NDslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPEV4Y2VwdGlvbkhhbmRsaW5nPg0KKyAgICAgIDwvRXhjZXB0aW9uSGFuZGxpbmc+DQorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWREZWJ1Z0RMTDwvUnVudGltZUxpYnJhcnk+DQorICAgICAgPEJ1ZmZlclNlY3VyaXR5Q2hlY2s+ZmFsc2U8L0J1ZmZlclNlY3VyaXR5Q2hlY2s+DQorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyT3V0cHV0RmlsZT4kKEludERpcil6bGlidmMucGNoPC9QcmVjb21waWxlZEhlYWRlck91dHB1dEZpbGU+DQorICAgICAgPEFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj4kKEludERpcik8L0Fzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj4NCisgICAgICA8T2JqZWN0RmlsZU5hbWU+JChJbnREaXIpPC9PYmplY3RGaWxlTmFtZT4NCisgICAgICA8UHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+JChPdXREaXIpPC9Qcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4NCisgICAgICA8QnJvd3NlSW5mb3JtYXRpb24+DQorICAgICAgPC9Ccm93c2VJbmZvcm1hdGlvbj4NCisgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPg0KKyAgICAgIDxTdXBwcmVzc1N0YXJ0dXBCYW5uZXI+dHJ1ZTwvU3VwcHJlc3NTdGFydHVwQmFubmVyPg0KKyAgICAgIDxEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PlByb2dyYW1EYXRhYmFzZTwvRGVidWdJbmZvcm1hdGlvbkZvcm1hdD4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxSZXNvdXJjZUNvbXBpbGU+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPl9ERUJVRzslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPEN1bHR1cmU+MHgwNDBjPC9DdWx0dXJlPg0KKyAgICA8L1Jlc291cmNlQ29tcGlsZT4NCisgICAgPExpbms+DQorICAgICAgPEFkZGl0aW9uYWxEZXBlbmRlbmNpZXM+Li5cLi5cbWFzbXg2NFxndm1hdDY0Lm9iajsuLlwuLlxtYXNteDY0XGluZmZhc3g2NC5vYmo7JShBZGRpdGlvbmFsRGVwZW5kZW5jaWVzKTwvQWRkaXRpb25hbERlcGVuZGVuY2llcz4NCisgICAgICA8T3V0cHV0RmlsZT4kKE91dERpcil6bGlid2FwaS5kbGw8L091dHB1dEZpbGU+DQorICAgICAgPFN1cHByZXNzU3RhcnR1cEJhbm5lcj50cnVlPC9TdXBwcmVzc1N0YXJ0dXBCYW5uZXI+DQorICAgICAgPE1vZHVsZURlZmluaXRpb25GaWxlPi5cemxpYnZjLmRlZjwvTW9kdWxlRGVmaW5pdGlvbkZpbGU+DQorICAgICAgPEdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj50cnVlPC9HZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+DQorICAgICAgPFByb2dyYW1EYXRhYmFzZUZpbGU+JChPdXREaXIpemxpYndhcGkucGRiPC9Qcm9ncmFtRGF0YWJhc2VGaWxlPg0KKyAgICAgIDxHZW5lcmF0ZU1hcEZpbGU+dHJ1ZTwvR2VuZXJhdGVNYXBGaWxlPg0KKyAgICAgIDxNYXBGaWxlTmFtZT4kKE91dERpcil6bGlid2FwaS5tYXA8L01hcEZpbGVOYW1lPg0KKyAgICAgIDxTdWJTeXN0ZW0+V2luZG93czwvU3ViU3lzdGVtPg0KKyAgICAgIDxJbXBvcnRMaWJyYXJ5PiQoT3V0RGlyKXpsaWJ3YXBpLmxpYjwvSW1wb3J0TGlicmFyeT4NCisgICAgICA8VGFyZ2V0TWFjaGluZT5NYWNoaW5lWDY0PC9UYXJnZXRNYWNoaW5lPg0KKyAgICA8L0xpbms+DQorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+DQorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfEl0YW5pdW0nIj4NCisgICAgPE1pZGw+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPl9ERUJVRzslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPE1rVHlwTGliQ29tcGF0aWJsZT50cnVlPC9Na1R5cExpYkNvbXBhdGlibGU+DQorICAgICAgPFN1cHByZXNzU3RhcnR1cEJhbm5lcj50cnVlPC9TdXBwcmVzc1N0YXJ0dXBCYW5uZXI+DQorICAgICAgPFRhcmdldEVudmlyb25tZW50Pkl0YW5pdW08L1RhcmdldEVudmlyb25tZW50Pg0KKyAgICAgIDxUeXBlTGlicmFyeU5hbWU+JChPdXREaXIpemxpYnZjLnRsYjwvVHlwZUxpYnJhcnlOYW1lPg0KKyAgICA8L01pZGw+DQorICAgIDxDbENvbXBpbGU+DQorICAgICAgPE9wdGltaXphdGlvbj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPi4uXC4uXC4uOy4uXC4uXG1hc214ODY7JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+V0lOMzI7X0NSVF9OT05TVERDX05PX0RFUFJFQ0FURTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7X0NSVF9OT05TVERDX05PX1dBUk5JTkdTO1pMSUJfV0lOQVBJO1dJTjY0OyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8RXhjZXB0aW9uSGFuZGxpbmc+DQorICAgICAgPC9FeGNlcHRpb25IYW5kbGluZz4NCisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZERlYnVnRExMPC9SdW50aW1lTGlicmFyeT4NCisgICAgICA8QnVmZmVyU2VjdXJpdHlDaGVjaz5mYWxzZTwvQnVmZmVyU2VjdXJpdHlDaGVjaz4NCisgICAgICA8UHJlY29tcGlsZWRIZWFkZXJPdXRwdXRGaWxlPiQoSW50RGlyKXpsaWJ2Yy5wY2g8L1ByZWNvbXBpbGVkSGVhZGVyT3V0cHV0RmlsZT4NCisgICAgICA8QXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPiQoSW50RGlyKTwvQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPg0KKyAgICAgIDxPYmplY3RGaWxlTmFtZT4kKEludERpcik8L09iamVjdEZpbGVOYW1lPg0KKyAgICAgIDxQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4kKE91dERpcik8L1Byb2dyYW1EYXRhQmFzZUZpbGVOYW1lPg0KKyAgICAgIDxCcm93c2VJbmZvcm1hdGlvbj4NCisgICAgICA8L0Jyb3dzZUluZm9ybWF0aW9uPg0KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+DQorICAgICAgPFN1cHByZXNzU3RhcnR1cEJhbm5lcj50cnVlPC9TdXBwcmVzc1N0YXJ0dXBCYW5uZXI+DQorICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+UHJvZ3JhbURhdGFiYXNlPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0Pg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPFJlc291cmNlQ29tcGlsZT4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+X0RFQlVHOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8Q3VsdHVyZT4weDA0MGM8L0N1bHR1cmU+DQorICAgIDwvUmVzb3VyY2VDb21waWxlPg0KKyAgICA8TGluaz4NCisgICAgICA8T3V0cHV0RmlsZT4kKE91dERpcil6bGlid2FwaS5kbGw8L091dHB1dEZpbGU+DQorICAgICAgPFN1cHByZXNzU3RhcnR1cEJhbm5lcj50cnVlPC9TdXBwcmVzc1N0YXJ0dXBCYW5uZXI+DQorICAgICAgPE1vZHVsZURlZmluaXRpb25GaWxlPi5cemxpYnZjLmRlZjwvTW9kdWxlRGVmaW5pdGlvbkZpbGU+DQorICAgICAgPEdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj50cnVlPC9HZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+DQorICAgICAgPFByb2dyYW1EYXRhYmFzZUZpbGU+JChPdXREaXIpemxpYndhcGkucGRiPC9Qcm9ncmFtRGF0YWJhc2VGaWxlPg0KKyAgICAgIDxHZW5lcmF0ZU1hcEZpbGU+dHJ1ZTwvR2VuZXJhdGVNYXBGaWxlPg0KKyAgICAgIDxNYXBGaWxlTmFtZT4kKE91dERpcil6bGlid2FwaS5tYXA8L01hcEZpbGVOYW1lPg0KKyAgICAgIDxTdWJTeXN0ZW0+V2luZG93czwvU3ViU3lzdGVtPg0KKyAgICAgIDxJbXBvcnRMaWJyYXJ5PiQoT3V0RGlyKXpsaWJ3YXBpLmxpYjwvSW1wb3J0TGlicmFyeT4NCisgICAgICA8VGFyZ2V0TWFjaGluZT5NYWNoaW5lSUE2NDwvVGFyZ2V0TWFjaGluZT4NCisgICAgPC9MaW5rPg0KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPg0KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlV2l0aG91dEFzbXx4NjQnIj4NCisgICAgPE1pZGw+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPk5ERUJVRzslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPE1rVHlwTGliQ29tcGF0aWJsZT50cnVlPC9Na1R5cExpYkNvbXBhdGlibGU+DQorICAgICAgPFN1cHByZXNzU3RhcnR1cEJhbm5lcj50cnVlPC9TdXBwcmVzc1N0YXJ0dXBCYW5uZXI+DQorICAgICAgPFRhcmdldEVudmlyb25tZW50Plg2NDwvVGFyZ2V0RW52aXJvbm1lbnQ+DQorICAgICAgPFR5cGVMaWJyYXJ5TmFtZT4kKE91dERpcil6bGlidmMudGxiPC9UeXBlTGlicmFyeU5hbWU+DQorICAgIDwvTWlkbD4NCisgICAgPENsQ29tcGlsZT4NCisgICAgICA8SW5saW5lRnVuY3Rpb25FeHBhbnNpb24+T25seUV4cGxpY2l0SW5saW5lPC9JbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj4NCisgICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4uLlwuLlwuLjsuLlwuLlxtYXNteDg2OyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPldJTjMyO19DUlRfTk9OU1REQ19OT19ERVBSRUNBVEU7X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFO19DUlRfTk9OU1REQ19OT19XQVJOSU5HUztaTElCX1dJTkFQSTtXSU42NDslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPFN0cmluZ1Bvb2xpbmc+dHJ1ZTwvU3RyaW5nUG9vbGluZz4NCisgICAgICA8RXhjZXB0aW9uSGFuZGxpbmc+DQorICAgICAgPC9FeGNlcHRpb25IYW5kbGluZz4NCisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZERMTDwvUnVudGltZUxpYnJhcnk+DQorICAgICAgPEJ1ZmZlclNlY3VyaXR5Q2hlY2s+ZmFsc2U8L0J1ZmZlclNlY3VyaXR5Q2hlY2s+DQorICAgICAgPEZ1bmN0aW9uTGV2ZWxMaW5raW5nPnRydWU8L0Z1bmN0aW9uTGV2ZWxMaW5raW5nPg0KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlck91dHB1dEZpbGU+JChJbnREaXIpemxpYnZjLnBjaDwvUHJlY29tcGlsZWRIZWFkZXJPdXRwdXRGaWxlPg0KKyAgICAgIDxBc3NlbWJsZXJPdXRwdXQ+QWxsPC9Bc3NlbWJsZXJPdXRwdXQ+DQorICAgICAgPEFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj4kKEludERpcik8L0Fzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj4NCisgICAgICA8T2JqZWN0RmlsZU5hbWU+JChJbnREaXIpPC9PYmplY3RGaWxlTmFtZT4NCisgICAgICA8UHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+JChPdXREaXIpPC9Qcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4NCisgICAgICA8QnJvd3NlSW5mb3JtYXRpb24+DQorICAgICAgPC9Ccm93c2VJbmZvcm1hdGlvbj4NCisgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPg0KKyAgICAgIDxTdXBwcmVzc1N0YXJ0dXBCYW5uZXI+dHJ1ZTwvU3VwcHJlc3NTdGFydHVwQmFubmVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPFJlc291cmNlQ29tcGlsZT4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+TkRFQlVHOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8Q3VsdHVyZT4weDA0MGM8L0N1bHR1cmU+DQorICAgIDwvUmVzb3VyY2VDb21waWxlPg0KKyAgICA8TGluaz4NCisgICAgICA8T3V0cHV0RmlsZT4kKE91dERpcil6bGlid2FwaS5kbGw8L091dHB1dEZpbGU+DQorICAgICAgPFN1cHByZXNzU3RhcnR1cEJhbm5lcj50cnVlPC9TdXBwcmVzc1N0YXJ0dXBCYW5uZXI+DQorICAgICAgPElnbm9yZUFsbERlZmF1bHRMaWJyYXJpZXM+ZmFsc2U8L0lnbm9yZUFsbERlZmF1bHRMaWJyYXJpZXM+DQorICAgICAgPE1vZHVsZURlZmluaXRpb25GaWxlPi5cemxpYnZjLmRlZjwvTW9kdWxlRGVmaW5pdGlvbkZpbGU+DQorICAgICAgPFByb2dyYW1EYXRhYmFzZUZpbGU+JChPdXREaXIpemxpYndhcGkucGRiPC9Qcm9ncmFtRGF0YWJhc2VGaWxlPg0KKyAgICAgIDxHZW5lcmF0ZU1hcEZpbGU+dHJ1ZTwvR2VuZXJhdGVNYXBGaWxlPg0KKyAgICAgIDxNYXBGaWxlTmFtZT4kKE91dERpcil6bGlid2FwaS5tYXA8L01hcEZpbGVOYW1lPg0KKyAgICAgIDxTdWJTeXN0ZW0+V2luZG93czwvU3ViU3lzdGVtPg0KKyAgICAgIDxJbXBvcnRMaWJyYXJ5PiQoT3V0RGlyKXpsaWJ3YXBpLmxpYjwvSW1wb3J0TGlicmFyeT4NCisgICAgICA8VGFyZ2V0TWFjaGluZT5NYWNoaW5lWDY0PC9UYXJnZXRNYWNoaW5lPg0KKyAgICA8L0xpbms+DQorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+DQorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2VXaXRob3V0QXNtfEl0YW5pdW0nIj4NCisgICAgPE1pZGw+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPk5ERUJVRzslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPE1rVHlwTGliQ29tcGF0aWJsZT50cnVlPC9Na1R5cExpYkNvbXBhdGlibGU+DQorICAgICAgPFN1cHByZXNzU3RhcnR1cEJhbm5lcj50cnVlPC9TdXBwcmVzc1N0YXJ0dXBCYW5uZXI+DQorICAgICAgPFRhcmdldEVudmlyb25tZW50Pkl0YW5pdW08L1RhcmdldEVudmlyb25tZW50Pg0KKyAgICAgIDxUeXBlTGlicmFyeU5hbWU+JChPdXREaXIpemxpYnZjLnRsYjwvVHlwZUxpYnJhcnlOYW1lPg0KKyAgICA8L01pZGw+DQorICAgIDxDbENvbXBpbGU+DQorICAgICAgPElubGluZUZ1bmN0aW9uRXhwYW5zaW9uPk9ubHlFeHBsaWNpdElubGluZTwvSW5saW5lRnVuY3Rpb25FeHBhbnNpb24+DQorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+Li5cLi5cLi47Li5cLi5cbWFzbXg4NjslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5XSU4zMjtfQ1JUX05PTlNURENfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtfQ1JUX05PTlNURENfTk9fV0FSTklOR1M7WkxJQl9XSU5BUEk7V0lONjQ7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KKyAgICAgIDxTdHJpbmdQb29saW5nPnRydWU8L1N0cmluZ1Bvb2xpbmc+DQorICAgICAgPEV4Y2VwdGlvbkhhbmRsaW5nPg0KKyAgICAgIDwvRXhjZXB0aW9uSGFuZGxpbmc+DQorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWRETEw8L1J1bnRpbWVMaWJyYXJ5Pg0KKyAgICAgIDxCdWZmZXJTZWN1cml0eUNoZWNrPmZhbHNlPC9CdWZmZXJTZWN1cml0eUNoZWNrPg0KKyAgICAgIDxGdW5jdGlvbkxldmVsTGlua2luZz50cnVlPC9GdW5jdGlvbkxldmVsTGlua2luZz4NCisgICAgICA8UHJlY29tcGlsZWRIZWFkZXJPdXRwdXRGaWxlPiQoSW50RGlyKXpsaWJ2Yy5wY2g8L1ByZWNvbXBpbGVkSGVhZGVyT3V0cHV0RmlsZT4NCisgICAgICA8QXNzZW1ibGVyT3V0cHV0PkFsbDwvQXNzZW1ibGVyT3V0cHV0Pg0KKyAgICAgIDxBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb24+JChJbnREaXIpPC9Bc3NlbWJsZXJMaXN0aW5nTG9jYXRpb24+DQorICAgICAgPE9iamVjdEZpbGVOYW1lPiQoSW50RGlyKTwvT2JqZWN0RmlsZU5hbWU+DQorICAgICAgPFByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPiQoT3V0RGlyKTwvUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+DQorICAgICAgPEJyb3dzZUluZm9ybWF0aW9uPg0KKyAgICAgIDwvQnJvd3NlSW5mb3JtYXRpb24+DQorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4NCisgICAgICA8U3VwcHJlc3NTdGFydHVwQmFubmVyPnRydWU8L1N1cHByZXNzU3RhcnR1cEJhbm5lcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxSZXNvdXJjZUNvbXBpbGU+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPk5ERUJVRzslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPEN1bHR1cmU+MHgwNDBjPC9DdWx0dXJlPg0KKyAgICA8L1Jlc291cmNlQ29tcGlsZT4NCisgICAgPExpbms+DQorICAgICAgPE91dHB1dEZpbGU+JChPdXREaXIpemxpYndhcGkuZGxsPC9PdXRwdXRGaWxlPg0KKyAgICAgIDxTdXBwcmVzc1N0YXJ0dXBCYW5uZXI+dHJ1ZTwvU3VwcHJlc3NTdGFydHVwQmFubmVyPg0KKyAgICAgIDxJZ25vcmVBbGxEZWZhdWx0TGlicmFyaWVzPmZhbHNlPC9JZ25vcmVBbGxEZWZhdWx0TGlicmFyaWVzPg0KKyAgICAgIDxNb2R1bGVEZWZpbml0aW9uRmlsZT4uXHpsaWJ2Yy5kZWY8L01vZHVsZURlZmluaXRpb25GaWxlPg0KKyAgICAgIDxQcm9ncmFtRGF0YWJhc2VGaWxlPiQoT3V0RGlyKXpsaWJ3YXBpLnBkYjwvUHJvZ3JhbURhdGFiYXNlRmlsZT4NCisgICAgICA8R2VuZXJhdGVNYXBGaWxlPnRydWU8L0dlbmVyYXRlTWFwRmlsZT4NCisgICAgICA8TWFwRmlsZU5hbWU+JChPdXREaXIpemxpYndhcGkubWFwPC9NYXBGaWxlTmFtZT4NCisgICAgICA8U3ViU3lzdGVtPldpbmRvd3M8L1N1YlN5c3RlbT4NCisgICAgICA8SW1wb3J0TGlicmFyeT4kKE91dERpcil6bGlid2FwaS5saWI8L0ltcG9ydExpYnJhcnk+DQorICAgICAgPFRhcmdldE1hY2hpbmU+TWFjaGluZUlBNjQ8L1RhcmdldE1hY2hpbmU+DQorICAgIDwvTGluaz4NCisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4NCisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj4NCisgICAgPE1pZGw+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPk5ERUJVRzslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPE1rVHlwTGliQ29tcGF0aWJsZT50cnVlPC9Na1R5cExpYkNvbXBhdGlibGU+DQorICAgICAgPFN1cHByZXNzU3RhcnR1cEJhbm5lcj50cnVlPC9TdXBwcmVzc1N0YXJ0dXBCYW5uZXI+DQorICAgICAgPFRhcmdldEVudmlyb25tZW50Plg2NDwvVGFyZ2V0RW52aXJvbm1lbnQ+DQorICAgICAgPFR5cGVMaWJyYXJ5TmFtZT4kKE91dERpcil6bGlidmMudGxiPC9UeXBlTGlicmFyeU5hbWU+DQorICAgIDwvTWlkbD4NCisgICAgPENsQ29tcGlsZT4NCisgICAgICA8SW5saW5lRnVuY3Rpb25FeHBhbnNpb24+T25seUV4cGxpY2l0SW5saW5lPC9JbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj4NCisgICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4uLlwuLlwuLjsuLlwuLlxtYXNteDg2OyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPl9DUlRfTk9OU1REQ19OT19ERVBSRUNBVEU7X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFO19DUlRfTk9OU1REQ19OT19XQVJOSU5HUztaTElCX1dJTkFQSTtBU01WO0FTTUlORjtXSU42NDslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPFN0cmluZ1Bvb2xpbmc+dHJ1ZTwvU3RyaW5nUG9vbGluZz4NCisgICAgICA8RXhjZXB0aW9uSGFuZGxpbmc+DQorICAgICAgPC9FeGNlcHRpb25IYW5kbGluZz4NCisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZERMTDwvUnVudGltZUxpYnJhcnk+DQorICAgICAgPEJ1ZmZlclNlY3VyaXR5Q2hlY2s+ZmFsc2U8L0J1ZmZlclNlY3VyaXR5Q2hlY2s+DQorICAgICAgPEZ1bmN0aW9uTGV2ZWxMaW5raW5nPnRydWU8L0Z1bmN0aW9uTGV2ZWxMaW5raW5nPg0KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlck91dHB1dEZpbGU+JChJbnREaXIpemxpYnZjLnBjaDwvUHJlY29tcGlsZWRIZWFkZXJPdXRwdXRGaWxlPg0KKyAgICAgIDxBc3NlbWJsZXJPdXRwdXQ+QWxsPC9Bc3NlbWJsZXJPdXRwdXQ+DQorICAgICAgPEFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj4kKEludERpcik8L0Fzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj4NCisgICAgICA8T2JqZWN0RmlsZU5hbWU+JChJbnREaXIpPC9PYmplY3RGaWxlTmFtZT4NCisgICAgICA8UHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+JChPdXREaXIpPC9Qcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4NCisgICAgICA8QnJvd3NlSW5mb3JtYXRpb24+DQorICAgICAgPC9Ccm93c2VJbmZvcm1hdGlvbj4NCisgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPg0KKyAgICAgIDxTdXBwcmVzc1N0YXJ0dXBCYW5uZXI+dHJ1ZTwvU3VwcHJlc3NTdGFydHVwQmFubmVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPFJlc291cmNlQ29tcGlsZT4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+TkRFQlVHOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8Q3VsdHVyZT4weDA0MGM8L0N1bHR1cmU+DQorICAgIDwvUmVzb3VyY2VDb21waWxlPg0KKyAgICA8TGluaz4NCisgICAgICA8QWRkaXRpb25hbERlcGVuZGVuY2llcz4uLlwuLlxtYXNteDY0XGd2bWF0NjQub2JqOy4uXC4uXG1hc214NjRcaW5mZmFzeDY0Lm9iajslKEFkZGl0aW9uYWxEZXBlbmRlbmNpZXMpPC9BZGRpdGlvbmFsRGVwZW5kZW5jaWVzPg0KKyAgICAgIDxPdXRwdXRGaWxlPiQoT3V0RGlyKXpsaWJ3YXBpLmRsbDwvT3V0cHV0RmlsZT4NCisgICAgICA8U3VwcHJlc3NTdGFydHVwQmFubmVyPnRydWU8L1N1cHByZXNzU3RhcnR1cEJhbm5lcj4NCisgICAgICA8SWdub3JlQWxsRGVmYXVsdExpYnJhcmllcz5mYWxzZTwvSWdub3JlQWxsRGVmYXVsdExpYnJhcmllcz4NCisgICAgICA8TW9kdWxlRGVmaW5pdGlvbkZpbGU+Llx6bGlidmMuZGVmPC9Nb2R1bGVEZWZpbml0aW9uRmlsZT4NCisgICAgICA8UHJvZ3JhbURhdGFiYXNlRmlsZT4kKE91dERpcil6bGlid2FwaS5wZGI8L1Byb2dyYW1EYXRhYmFzZUZpbGU+DQorICAgICAgPEdlbmVyYXRlTWFwRmlsZT50cnVlPC9HZW5lcmF0ZU1hcEZpbGU+DQorICAgICAgPE1hcEZpbGVOYW1lPiQoT3V0RGlyKXpsaWJ3YXBpLm1hcDwvTWFwRmlsZU5hbWU+DQorICAgICAgPFN1YlN5c3RlbT5XaW5kb3dzPC9TdWJTeXN0ZW0+DQorICAgICAgPEltcG9ydExpYnJhcnk+JChPdXREaXIpemxpYndhcGkubGliPC9JbXBvcnRMaWJyYXJ5Pg0KKyAgICAgIDxUYXJnZXRNYWNoaW5lPk1hY2hpbmVYNjQ8L1RhcmdldE1hY2hpbmU+DQorICAgIDwvTGluaz4NCisgIDwvSXRlbURlZmluaXRpb25Hcm91cD4NCisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxJdGFuaXVtJyI+DQorICAgIDxNaWRsPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5OREVCVUc7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KKyAgICAgIDxNa1R5cExpYkNvbXBhdGlibGU+dHJ1ZTwvTWtUeXBMaWJDb21wYXRpYmxlPg0KKyAgICAgIDxTdXBwcmVzc1N0YXJ0dXBCYW5uZXI+dHJ1ZTwvU3VwcHJlc3NTdGFydHVwQmFubmVyPg0KKyAgICAgIDxUYXJnZXRFbnZpcm9ubWVudD5JdGFuaXVtPC9UYXJnZXRFbnZpcm9ubWVudD4NCisgICAgICA8VHlwZUxpYnJhcnlOYW1lPiQoT3V0RGlyKXpsaWJ2Yy50bGI8L1R5cGVMaWJyYXJ5TmFtZT4NCisgICAgPC9NaWRsPg0KKyAgICA8Q2xDb21waWxlPg0KKyAgICAgIDxJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj5Pbmx5RXhwbGljaXRJbmxpbmU8L0lubGluZUZ1bmN0aW9uRXhwYW5zaW9uPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPi4uXC4uXC4uOy4uXC4uXG1hc214ODY7JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+X0NSVF9OT05TVERDX05PX0RFUFJFQ0FURTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7X0NSVF9OT05TVERDX05PX1dBUk5JTkdTO1pMSUJfV0lOQVBJO1dJTjY0OyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8U3RyaW5nUG9vbGluZz50cnVlPC9TdHJpbmdQb29saW5nPg0KKyAgICAgIDxFeGNlcHRpb25IYW5kbGluZz4NCisgICAgICA8L0V4Y2VwdGlvbkhhbmRsaW5nPg0KKyAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkRExMPC9SdW50aW1lTGlicmFyeT4NCisgICAgICA8QnVmZmVyU2VjdXJpdHlDaGVjaz5mYWxzZTwvQnVmZmVyU2VjdXJpdHlDaGVjaz4NCisgICAgICA8RnVuY3Rpb25MZXZlbExpbmtpbmc+dHJ1ZTwvRnVuY3Rpb25MZXZlbExpbmtpbmc+DQorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyT3V0cHV0RmlsZT4kKEludERpcil6bGlidmMucGNoPC9QcmVjb21waWxlZEhlYWRlck91dHB1dEZpbGU+DQorICAgICAgPEFzc2VtYmxlck91dHB1dD5BbGw8L0Fzc2VtYmxlck91dHB1dD4NCisgICAgICA8QXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPiQoSW50RGlyKTwvQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPg0KKyAgICAgIDxPYmplY3RGaWxlTmFtZT4kKEludERpcik8L09iamVjdEZpbGVOYW1lPg0KKyAgICAgIDxQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4kKE91dERpcik8L1Byb2dyYW1EYXRhQmFzZUZpbGVOYW1lPg0KKyAgICAgIDxCcm93c2VJbmZvcm1hdGlvbj4NCisgICAgICA8L0Jyb3dzZUluZm9ybWF0aW9uPg0KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+DQorICAgICAgPFN1cHByZXNzU3RhcnR1cEJhbm5lcj50cnVlPC9TdXBwcmVzc1N0YXJ0dXBCYW5uZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8UmVzb3VyY2VDb21waWxlPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5OREVCVUc7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KKyAgICAgIDxDdWx0dXJlPjB4MDQwYzwvQ3VsdHVyZT4NCisgICAgPC9SZXNvdXJjZUNvbXBpbGU+DQorICAgIDxMaW5rPg0KKyAgICAgIDxPdXRwdXRGaWxlPiQoT3V0RGlyKXpsaWJ3YXBpLmRsbDwvT3V0cHV0RmlsZT4NCisgICAgICA8U3VwcHJlc3NTdGFydHVwQmFubmVyPnRydWU8L1N1cHByZXNzU3RhcnR1cEJhbm5lcj4NCisgICAgICA8SWdub3JlQWxsRGVmYXVsdExpYnJhcmllcz5mYWxzZTwvSWdub3JlQWxsRGVmYXVsdExpYnJhcmllcz4NCisgICAgICA8TW9kdWxlRGVmaW5pdGlvbkZpbGU+Llx6bGlidmMuZGVmPC9Nb2R1bGVEZWZpbml0aW9uRmlsZT4NCisgICAgICA8UHJvZ3JhbURhdGFiYXNlRmlsZT4kKE91dERpcil6bGlid2FwaS5wZGI8L1Byb2dyYW1EYXRhYmFzZUZpbGU+DQorICAgICAgPEdlbmVyYXRlTWFwRmlsZT50cnVlPC9HZW5lcmF0ZU1hcEZpbGU+DQorICAgICAgPE1hcEZpbGVOYW1lPiQoT3V0RGlyKXpsaWJ3YXBpLm1hcDwvTWFwRmlsZU5hbWU+DQorICAgICAgPFN1YlN5c3RlbT5XaW5kb3dzPC9TdWJTeXN0ZW0+DQorICAgICAgPEltcG9ydExpYnJhcnk+JChPdXREaXIpemxpYndhcGkubGliPC9JbXBvcnRMaWJyYXJ5Pg0KKyAgICAgIDxUYXJnZXRNYWNoaW5lPk1hY2hpbmVJQTY0PC9UYXJnZXRNYWNoaW5lPg0KKyAgICA8L0xpbms+DQorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXGFkbGVyMzIuYyIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxjb21wcmVzcy5jIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXGNyYzMyLmMiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cZGVmbGF0ZS5jIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXGd6Y2xvc2UuYyIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxnemxpYi5jIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXGd6cmVhZC5jIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXGd6d3JpdGUuYyIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxpbmZiYWNrLmMiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbWFzbXg2NFxpbmZmYXM4NjY0LmMiPg0KKyAgICAgIDxFeGNsdWRlZEZyb21CdWlsZCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfEl0YW5pdW0nIj50cnVlPC9FeGNsdWRlZEZyb21CdWlsZD4NCisgICAgICA8RXhjbHVkZWRGcm9tQnVpbGQgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPnRydWU8L0V4Y2x1ZGVkRnJvbUJ1aWxkPg0KKyAgICAgIDxFeGNsdWRlZEZyb21CdWlsZCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2VXaXRob3V0QXNtfEl0YW5pdW0nIj50cnVlPC9FeGNsdWRlZEZyb21CdWlsZD4NCisgICAgICA8RXhjbHVkZWRGcm9tQnVpbGQgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlV2l0aG91dEFzbXxXaW4zMiciPnRydWU8L0V4Y2x1ZGVkRnJvbUJ1aWxkPg0KKyAgICAgIDxFeGNsdWRlZEZyb21CdWlsZCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8SXRhbml1bSciPnRydWU8L0V4Y2x1ZGVkRnJvbUJ1aWxkPg0KKyAgICAgIDxFeGNsdWRlZEZyb21CdWlsZCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj50cnVlPC9FeGNsdWRlZEZyb21CdWlsZD4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5caW5mZmFzdC5jIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXGluZmxhdGUuYyIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxpbmZ0cmVlcy5jIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXG1pbml6aXBcaW9hcGkuYyIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxtaW5pemlwXGlvd2luMzIuYyIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlx0cmVlcy5jIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXHVuY29tcHIuYyIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxtaW5pemlwXHVuemlwLmMiPg0KKyAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxJdGFuaXVtJyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfEl0YW5pdW0nIj5aTElCX0lOVEVSTkFMOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj4lKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj5aTElCX0lOVEVSTkFMOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciPlpMSUJfSU5URVJOQUw7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxtaW5pemlwXHppcC5jIj4NCisgICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3RvcmllcyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8SXRhbml1bSciPiUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxJdGFuaXVtJyI+WkxJQl9JTlRFUk5BTDslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+WkxJQl9JTlRFUk5BTDslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciPiUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj5aTElCX0lOVEVSTkFMOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cenV0aWwuYyIgLz4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPFJlc291cmNlQ29tcGlsZSBJbmNsdWRlPSJ6bGliLnJjIiAvPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8Tm9uZSBJbmNsdWRlPSJ6bGlidmMuZGVmIiAvPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXC4uXGRlZmxhdGUuaCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlwuLlxpbmZibG9jay5oIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXC4uXGluZmNvZGVzLmgiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5cLi5caW5mZmFzdC5oIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXC4uXGluZnRyZWVzLmgiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5cLi5caW5mdXRpbC5oIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXC4uXHpjb25mLmgiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5cLi5cemxpYi5oIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXC4uXHp1dGlsLmgiIC8+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLnRhcmdldHMiIC8+DQorICA8SW1wb3J0R3JvdXAgTGFiZWw9IkV4dGVuc2lvblRhcmdldHMiPg0KKyAgPC9JbXBvcnRHcm91cD4NCis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvemxpYi0xLjIuNi9jb250cmliL3ZzdHVkaW8vdmMxMC96bGlidmMudmN4cHJvai5maWx0ZXJzIGIvemxpYi0xLjIuNi9jb250cmliL3ZzdHVkaW8vdmMxMC96bGlidmMudmN4cHJvai5maWx0ZXJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4MGI3MWMKLS0tIC9kZXYvbnVsbAorKysgYi96bGliLTEuMi42L2NvbnRyaWIvdnN0dWRpby92YzEwL3psaWJ2Yy52Y3hwcm9qLmZpbHRlcnMKQEAgLTAsMCArMSwxMTggQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQorPFByb2plY3QgVG9vbHNWZXJzaW9uPSI0LjAiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPEZpbHRlciBJbmNsdWRlPSJTb3VyY2UgRmlsZXMiPg0KKyAgICAgIDxVbmlxdWVJZGVudGlmaWVyPnswNzkzNGE4NS04YjYxLTQ0M2QtYTBlZS1iMmVlZGI3NGYzY2R9PC9VbmlxdWVJZGVudGlmaWVyPg0KKyAgICAgIDxFeHRlbnNpb25zPmNwcDtjO2N4eDtyYztkZWY7cjtvZGw7aHBqO2JhdDtmb3I7ZjkwPC9FeHRlbnNpb25zPg0KKyAgICA8L0ZpbHRlcj4NCisgICAgPEZpbHRlciBJbmNsdWRlPSJIZWFkZXIgRmlsZXMiPg0KKyAgICAgIDxVbmlxdWVJZGVudGlmaWVyPnsxZDk5Njc1Yi00MzNkLTRhMjEtOWU1MC1lZDRhYjhiMTk3NjJ9PC9VbmlxdWVJZGVudGlmaWVyPg0KKyAgICAgIDxFeHRlbnNpb25zPmg7aHBwO2h4eDtobTtpbmw7Zmk7ZmQ8L0V4dGVuc2lvbnM+DQorICAgIDwvRmlsdGVyPg0KKyAgICA8RmlsdGVyIEluY2x1ZGU9IlJlc291cmNlIEZpbGVzIj4NCisgICAgICA8VW5pcXVlSWRlbnRpZmllcj57NDMxYzA5NTgtZmE3MS00NGQwLTkwODQtMmQxOWQxMDBjMGNjfTwvVW5pcXVlSWRlbnRpZmllcj4NCisgICAgICA8RXh0ZW5zaW9ucz5pY287Y3VyO2JtcDtkbGc7cmMyO3JjdDtiaW47Y250O3J0ZjtnaWY7anBnO2pwZWc7anBlPC9FeHRlbnNpb25zPg0KKyAgICA8L0ZpbHRlcj4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxhZGxlcjMyLmMiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXGNvbXByZXNzLmMiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXGNyYzMyLmMiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXGRlZmxhdGUuYyI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cZ3pjbG9zZS5jIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxnemxpYi5jIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxnenJlYWQuYyI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cZ3p3cml0ZS5jIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxpbmZiYWNrLmMiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXG1hc214NjRcaW5mZmFzODY2NC5jIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlwuLlxpbmZmYXN0LmMiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXGluZmxhdGUuYyI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5caW5mdHJlZXMuYyI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cbWluaXppcFxpb2FwaS5jIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxtaW5pemlwXGlvd2luMzIuYyI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cdHJlZXMuYyI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cLi5cdW5jb21wci5jIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlwuLlxtaW5pemlwXHVuemlwLmMiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXG1pbml6aXBcemlwLmMiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXHp1dGlsLmMiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8UmVzb3VyY2VDb21waWxlIEluY2x1ZGU9InpsaWIucmMiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvUmVzb3VyY2VDb21waWxlPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8Tm9uZSBJbmNsdWRlPSJ6bGlidmMuZGVmIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L05vbmU+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5cLi5cZGVmbGF0ZS5oIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsSW5jbHVkZT4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlwuLlxpbmZibG9jay5oIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsSW5jbHVkZT4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlwuLlxpbmZjb2Rlcy5oIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsSW5jbHVkZT4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlwuLlxpbmZmYXN0LmgiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXC4uXGluZnRyZWVzLmgiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXC4uXGluZnV0aWwuaCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5cLi5cemNvbmYuaCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cLi5cLi5cemxpYi5oIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsSW5jbHVkZT4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlwuLlx6dXRpbC5oIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsSW5jbHVkZT4NCisgIDwvSXRlbUdyb3VwPg0KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS96bGliLTEuMi42L2NvbnRyaWIvdnN0dWRpby92YzEwL3psaWJ2Yy52Y3hwcm9qLnVzZXIgYi96bGliLTEuMi42L2NvbnRyaWIvdnN0dWRpby92YzEwL3psaWJ2Yy52Y3hwcm9qLnVzZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk1YjVjNwotLS0gL2Rldi9udWxsCisrKyBiL3psaWItMS4yLjYvY29udHJpYi92c3R1ZGlvL3ZjMTAvemxpYnZjLnZjeHByb2oudXNlcgpAQCAtMCwwICsxLDMgQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQorPFByb2plY3QgVG9vbHNWZXJzaW9uPSI0LjAiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPg0KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS96bGliLTEuMi42L2NvbnRyaWIvdnN0dWRpby92YzkvbWluaXVuei52Y3Byb2ogYi96bGliLTEuMi42L2NvbnRyaWIvdnN0dWRpby92YzkvbWluaXVuei52Y3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RhMzJiOQotLS0gL2Rldi9udWxsCisrKyBiL3psaWItMS4yLjYvY29udHJpYi92c3R1ZGlvL3ZjOS9taW5pdW56LnZjcHJvagpAQCAtMCwwICsxLDU2NSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iV2luZG93cy0xMjUyIj8+DQorPFZpc3VhbFN0dWRpb1Byb2plY3QNCisJUHJvamVjdFR5cGU9IlZpc3VhbCBDKysiDQorCVZlcnNpb249IjkuMDAiDQorCU5hbWU9Im1pbml1bnoiDQorCVByb2plY3RHVUlEPSJ7QzUyRjlFN0ItNDk4QS00MkJFLThEQjQtODVBMTU2OTQzODJBfSINCisJS2V5d29yZD0iV2luMzJQcm9qIg0KKwlUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPSIxMzEwNzIiDQorCT4NCisJPFBsYXRmb3Jtcz4NCisJCTxQbGF0Zm9ybQ0KKwkJCU5hbWU9IldpbjMyIg0KKwkJLz4NCisJCTxQbGF0Zm9ybQ0KKwkJCU5hbWU9Ing2NCINCisJCS8+DQorCQk8UGxhdGZvcm0NCisJCQlOYW1lPSJJdGFuaXVtIg0KKwkJLz4NCisJPC9QbGF0Zm9ybXM+DQorCTxUb29sRmlsZXM+DQorCTwvVG9vbEZpbGVzPg0KKwk8Q29uZmlndXJhdGlvbnM+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IkRlYnVnfFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0ieDg2XE1pbmlVbnppcCQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0ieDg2XE1pbmlVbnppcCQoQ29uZmlndXJhdGlvbk5hbWUpXFRtcCINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iVXBncmFkZUZyb21WQzcwLnZzcHJvcHMiDQorCQkJQ2hhcmFjdGVyU2V0PSIyIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCU9wdGltaXphdGlvbj0iMCINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5cLi47Li5cLi5cbWluaXppcCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjMyO19DUlRfTk9OU1REQ19OT19ERVBSRUNBVEU7X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFO1pMSUJfV0lOQVBJO19ERUJVRztfQ09OU09MRSINCisJCQkJTWluaW1hbFJlYnVpbGQ9InRydWUiDQorCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMCINCisJCQkJUnVudGltZUxpYnJhcnk9IjEiDQorCQkJCUJ1ZmZlclNlY3VyaXR5Q2hlY2s9ImZhbHNlIg0KKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCINCisJCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIkKEludERpcilcIg0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCURldGVjdDY0Qml0UG9ydGFiaWxpdHlQcm9ibGVtcz0idHJ1ZSINCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iNCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0ieDg2XFpsaWJEbGxEZWJ1Z1x6bGlid2FwaS5saWIiDQorCQkJCU91dHB1dEZpbGU9IiQoT3V0RGlyKS9taW5pdW56LmV4ZSINCisJCQkJTGlua0luY3JlbWVudGFsPSIyIg0KKwkJCQlHZW5lcmF0ZU1hbmlmZXN0PSJmYWxzZSINCisJCQkJR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPSJ0cnVlIg0KKwkJCQlQcm9ncmFtRGF0YWJhc2VGaWxlPSIkKE91dERpcikvbWluaXVuei5wZGIiDQorCQkJCVN1YlN5c3RlbT0iMSINCisJCQkJUmFuZG9taXplZEJhc2VBZGRyZXNzPSIxIg0KKwkJCQlEYXRhRXhlY3V0aW9uUHJldmVudGlvbj0iMCINCisJCQkJVGFyZ2V0TWFjaGluZT0iMSINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0ieDg2XE1pbmlVbnppcCQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0ieDg2XE1pbmlVbnppcCQoQ29uZmlndXJhdGlvbk5hbWUpXFRtcCINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iVXBncmFkZUZyb21WQzcwLnZzcHJvcHMiDQorCQkJQ2hhcmFjdGVyU2V0PSIyIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCU9wdGltaXphdGlvbj0iMiINCisJCQkJSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjEiDQorCQkJCU9taXRGcmFtZVBvaW50ZXJzPSJ0cnVlIg0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLjsuLlwuLlxtaW5pemlwIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7X0NSVF9OT05TVERDX05PX0RFUFJFQ0FURTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7WkxJQl9XSU5BUEk7TkRFQlVHO19DT05TT0xFIg0KKwkJCQlTdHJpbmdQb29saW5nPSJ0cnVlIg0KKwkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjAiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIwIg0KKwkJCQlCdWZmZXJTZWN1cml0eUNoZWNrPSJmYWxzZSINCisJCQkJRW5hYmxlRnVuY3Rpb25MZXZlbExpbmtpbmc9InRydWUiDQorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIg0KKwkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249IiQoSW50RGlyKVwiDQorCQkJCVdhcm5pbmdMZXZlbD0iMyINCisJCQkJRGV0ZWN0NjRCaXRQb3J0YWJpbGl0eVByb2JsZW1zPSJ0cnVlIg0KKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSJ4ODZcWmxpYkRsbFJlbGVhc2VcemxpYndhcGkubGliIg0KKwkJCQlPdXRwdXRGaWxlPSIkKE91dERpcikvbWluaXVuei5leGUiDQorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMSINCisJCQkJR2VuZXJhdGVNYW5pZmVzdD0iZmFsc2UiDQorCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0idHJ1ZSINCisJCQkJU3ViU3lzdGVtPSIxIg0KKwkJCQlPcHRpbWl6ZVJlZmVyZW5jZXM9IjIiDQorCQkJCUVuYWJsZUNPTURBVEZvbGRpbmc9IjIiDQorCQkJCU9wdGltaXplRm9yV2luZG93czk4PSIxIg0KKwkJCQlSYW5kb21pemVkQmFzZUFkZHJlc3M9IjEiDQorCQkJCURhdGFFeGVjdXRpb25QcmV2ZW50aW9uPSIwIg0KKwkJCQlUYXJnZXRNYWNoaW5lPSIxIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IkRlYnVnfHg2NCINCisJCQlPdXRwdXREaXJlY3Rvcnk9Ing2NFxNaW5pVW56aXAkKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ing2NFxNaW5pVW56aXAkKENvbmZpZ3VyYXRpb25OYW1lKVxUbXAiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IlVwZ3JhZGVGcm9tVkM3MC52c3Byb3BzIg0KKwkJCUNoYXJhY3RlclNldD0iMiINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJCVRhcmdldEVudmlyb25tZW50PSIzIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJT3B0aW1pemF0aW9uPSIwIg0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLjsuLlwuLlxtaW5pemlwIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0NSVF9OT05TVERDX05PX0RFUFJFQ0FURTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7WkxJQl9XSU5BUEk7X0RFQlVHO19DT05TT0xFO1dJTjY0Ig0KKwkJCQlNaW5pbWFsUmVidWlsZD0idHJ1ZSINCisJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIwIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iMyINCisJCQkJQnVmZmVyU2VjdXJpdHlDaGVjaz0iZmFsc2UiDQorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIg0KKwkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249IiQoSW50RGlyKVwiDQorCQkJCVdhcm5pbmdMZXZlbD0iMyINCisJCQkJRGV0ZWN0NjRCaXRQb3J0YWJpbGl0eVByb2JsZW1zPSJ0cnVlIg0KKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSJ4NjRcWmxpYkRsbERlYnVnXHpsaWJ3YXBpLmxpYiINCisJCQkJT3V0cHV0RmlsZT0iJChPdXREaXIpL21pbml1bnouZXhlIg0KKwkJCQlMaW5rSW5jcmVtZW50YWw9IjIiDQorCQkJCUdlbmVyYXRlTWFuaWZlc3Q9ImZhbHNlIg0KKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249InRydWUiDQorCQkJCVByb2dyYW1EYXRhYmFzZUZpbGU9IiQoT3V0RGlyKS9taW5pdW56LnBkYiINCisJCQkJU3ViU3lzdGVtPSIxIg0KKwkJCQlUYXJnZXRNYWNoaW5lPSIxNyINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iRGVidWd8SXRhbml1bSINCisJCQlPdXRwdXREaXJlY3Rvcnk9ImlhNjRcTWluaVVuemlwJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSJpYTY0XE1pbmlVbnppcCQoQ29uZmlndXJhdGlvbk5hbWUpXFRtcCINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iVXBncmFkZUZyb21WQzcwLnZzcHJvcHMiDQorCQkJQ2hhcmFjdGVyU2V0PSIyIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkJVGFyZ2V0RW52aXJvbm1lbnQ9IjIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlPcHRpbWl6YXRpb249IjAiDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXC4uOy4uXC4uXG1pbml6aXAiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfQ1JUX05PTlNURENfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtaTElCX1dJTkFQSTtfREVCVUc7X0NPTlNPTEU7V0lONjQiDQorCQkJCU1pbmltYWxSZWJ1aWxkPSJ0cnVlIg0KKwkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjAiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIzIg0KKwkJCQlCdWZmZXJTZWN1cml0eUNoZWNrPSJmYWxzZSINCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiDQorCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iJChJbnREaXIpXCINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9InRydWUiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9ImlhNjRcWmxpYkRsbERlYnVnXHpsaWJ3YXBpLmxpYiINCisJCQkJT3V0cHV0RmlsZT0iJChPdXREaXIpL21pbml1bnouZXhlIg0KKwkJCQlMaW5rSW5jcmVtZW50YWw9IjIiDQorCQkJCUdlbmVyYXRlTWFuaWZlc3Q9ImZhbHNlIg0KKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249InRydWUiDQorCQkJCVByb2dyYW1EYXRhYmFzZUZpbGU9IiQoT3V0RGlyKS9taW5pdW56LnBkYiINCisJCQkJU3ViU3lzdGVtPSIxIg0KKwkJCQlUYXJnZXRNYWNoaW5lPSI1Ig0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlfHg2NCINCisJCQlPdXRwdXREaXJlY3Rvcnk9Ing2NFxNaW5pVW56aXAkKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ing2NFxNaW5pVW56aXAkKENvbmZpZ3VyYXRpb25OYW1lKVxUbXAiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IlVwZ3JhZGVGcm9tVkM3MC52c3Byb3BzIg0KKwkJCUNoYXJhY3RlclNldD0iMiINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJCVRhcmdldEVudmlyb25tZW50PSIzIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJT3B0aW1pemF0aW9uPSIyIg0KKwkJCQlJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj0iMSINCisJCQkJT21pdEZyYW1lUG9pbnRlcnM9InRydWUiDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXC4uOy4uXC4uXG1pbml6aXAiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfQ1JUX05PTlNURENfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtaTElCX1dJTkFQSTtOREVCVUc7X0NPTlNPTEU7V0lONjQiDQorCQkJCVN0cmluZ1Bvb2xpbmc9InRydWUiDQorCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMCINCisJCQkJUnVudGltZUxpYnJhcnk9IjIiDQorCQkJCUJ1ZmZlclNlY3VyaXR5Q2hlY2s9ImZhbHNlIg0KKwkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0idHJ1ZSINCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiDQorCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iJChJbnREaXIpXCINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9InRydWUiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9Ing2NFxabGliRGxsUmVsZWFzZVx6bGlid2FwaS5saWIiDQorCQkJCU91dHB1dEZpbGU9IiQoT3V0RGlyKS9taW5pdW56LmV4ZSINCisJCQkJTGlua0luY3JlbWVudGFsPSIxIg0KKwkJCQlHZW5lcmF0ZU1hbmlmZXN0PSJmYWxzZSINCisJCQkJR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPSJ0cnVlIg0KKwkJCQlTdWJTeXN0ZW09IjEiDQorCQkJCU9wdGltaXplUmVmZXJlbmNlcz0iMiINCisJCQkJRW5hYmxlQ09NREFURm9sZGluZz0iMiINCisJCQkJT3B0aW1pemVGb3JXaW5kb3dzOTg9IjEiDQorCQkJCVRhcmdldE1hY2hpbmU9IjE3Ig0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlfEl0YW5pdW0iDQorCQkJT3V0cHV0RGlyZWN0b3J5PSJpYTY0XE1pbmlVbnppcCQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iaWE2NFxNaW5pVW56aXAkKENvbmZpZ3VyYXRpb25OYW1lKVxUbXAiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IlVwZ3JhZGVGcm9tVkM3MC52c3Byb3BzIg0KKwkJCUNoYXJhY3RlclNldD0iMiINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJCVRhcmdldEVudmlyb25tZW50PSIyIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJT3B0aW1pemF0aW9uPSIyIg0KKwkJCQlJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj0iMSINCisJCQkJT21pdEZyYW1lUG9pbnRlcnM9InRydWUiDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXC4uOy4uXC4uXG1pbml6aXAiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfQ1JUX05PTlNURENfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtaTElCX1dJTkFQSTtOREVCVUc7X0NPTlNPTEU7V0lONjQiDQorCQkJCVN0cmluZ1Bvb2xpbmc9InRydWUiDQorCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMCINCisJCQkJUnVudGltZUxpYnJhcnk9IjIiDQorCQkJCUJ1ZmZlclNlY3VyaXR5Q2hlY2s9ImZhbHNlIg0KKwkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0idHJ1ZSINCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiDQorCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iJChJbnREaXIpXCINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9InRydWUiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9ImlhNjRcWmxpYkRsbFJlbGVhc2VcemxpYndhcGkubGliIg0KKwkJCQlPdXRwdXRGaWxlPSIkKE91dERpcikvbWluaXVuei5leGUiDQorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMSINCisJCQkJR2VuZXJhdGVNYW5pZmVzdD0iZmFsc2UiDQorCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0idHJ1ZSINCisJCQkJU3ViU3lzdGVtPSIxIg0KKwkJCQlPcHRpbWl6ZVJlZmVyZW5jZXM9IjIiDQorCQkJCUVuYWJsZUNPTURBVEZvbGRpbmc9IjIiDQorCQkJCU9wdGltaXplRm9yV2luZG93czk4PSIxIg0KKwkJCQlUYXJnZXRNYWNoaW5lPSI1Ig0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwk8L0NvbmZpZ3VyYXRpb25zPg0KKwk8UmVmZXJlbmNlcz4NCisJPC9SZWZlcmVuY2VzPg0KKwk8RmlsZXM+DQorCQk8RmlsdGVyDQorCQkJTmFtZT0iU291cmNlIEZpbGVzIg0KKwkJCUZpbHRlcj0iY3BwO2M7Y3h4O2RlZjtvZGw7aWRsO2hwajtiYXQ7YXNtIg0KKwkJCT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXG1pbml6aXBcbWluaXVuei5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJPC9GaWx0ZXI+DQorCQk8RmlsdGVyDQorCQkJTmFtZT0iSGVhZGVyIEZpbGVzIg0KKwkJCUZpbHRlcj0iaDtocHA7aHh4O2htO2lubDtpbmMiDQorCQkJPg0KKwkJPC9GaWx0ZXI+DQorCQk8RmlsdGVyDQorCQkJTmFtZT0iUmVzb3VyY2UgRmlsZXMiDQorCQkJRmlsdGVyPSJyYztpY287Y3VyO2JtcDtkbGc7cmMyO3JjdDtiaW47cmdzO2dpZjtqcGc7anBlZztqcGUiDQorCQkJPg0KKwkJPC9GaWx0ZXI+DQorCTwvRmlsZXM+DQorCTxHbG9iYWxzPg0KKwk8L0dsb2JhbHM+DQorPC9WaXN1YWxTdHVkaW9Qcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL3psaWItMS4yLjYvY29udHJpYi92c3R1ZGlvL3ZjOS9taW5pemlwLnZjcHJvaiBiL3psaWItMS4yLjYvY29udHJpYi92c3R1ZGlvL3ZjOS9taW5pemlwLnZjcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTdlMDdkCi0tLSAvZGV2L251bGwKKysrIGIvemxpYi0xLjIuNi9jb250cmliL3ZzdHVkaW8vdmM5L21pbml6aXAudmNwcm9qCkBAIC0wLDAgKzEsNTYyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJXaW5kb3dzLTEyNTIiPz4NCis8VmlzdWFsU3R1ZGlvUHJvamVjdA0KKwlQcm9qZWN0VHlwZT0iVmlzdWFsIEMrKyINCisJVmVyc2lvbj0iOS4wMCINCisJTmFtZT0ibWluaXppcCINCisJUHJvamVjdEdVSUQ9Ins0OENERDlEQy1FMDlGLTQxMzUtOUMwQy00RkU1MEMzQzY1NEJ9Ig0KKwlLZXl3b3JkPSJXaW4zMlByb2oiDQorCVRhcmdldEZyYW1ld29ya1ZlcnNpb249IjEzMTA3MiINCisJPg0KKwk8UGxhdGZvcm1zPg0KKwkJPFBsYXRmb3JtDQorCQkJTmFtZT0iV2luMzIiDQorCQkvPg0KKwkJPFBsYXRmb3JtDQorCQkJTmFtZT0ieDY0Ig0KKwkJLz4NCisJCTxQbGF0Zm9ybQ0KKwkJCU5hbWU9Ikl0YW5pdW0iDQorCQkvPg0KKwk8L1BsYXRmb3Jtcz4NCisJPFRvb2xGaWxlcz4NCisJPC9Ub29sRmlsZXM+DQorCTxDb25maWd1cmF0aW9ucz4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iRGVidWd8V2luMzIiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSJ4ODZcTWluaVppcCQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0ieDg2XE1pbmlaaXAkKENvbmZpZ3VyYXRpb25OYW1lKVxUbXAiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IlVwZ3JhZGVGcm9tVkM3MC52c3Byb3BzIg0KKwkJCUNoYXJhY3RlclNldD0iMiINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlPcHRpbWl6YXRpb249IjAiDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXC4uOy4uXC4uXG1pbml6aXAiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtfQ1JUX05PTlNURENfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtaTElCX1dJTkFQSTtfREVCVUc7X0NPTlNPTEUiDQorCQkJCU1pbmltYWxSZWJ1aWxkPSJ0cnVlIg0KKwkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjAiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIxIg0KKwkJCQlCdWZmZXJTZWN1cml0eUNoZWNrPSJmYWxzZSINCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiDQorCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iJChJbnREaXIpXCINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9InRydWUiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjQiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9Ing4NlxabGliRGxsRGVidWdcemxpYndhcGkubGliIg0KKwkJCQlPdXRwdXRGaWxlPSIkKE91dERpcikvbWluaXppcC5leGUiDQorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMiINCisJCQkJR2VuZXJhdGVNYW5pZmVzdD0iZmFsc2UiDQorCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0idHJ1ZSINCisJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iJChPdXREaXIpL21pbml6aXAucGRiIg0KKwkJCQlTdWJTeXN0ZW09IjEiDQorCQkJCVJhbmRvbWl6ZWRCYXNlQWRkcmVzcz0iMSINCisJCQkJRGF0YUV4ZWN1dGlvblByZXZlbnRpb249IjAiDQorCQkJCVRhcmdldE1hY2hpbmU9IjEiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiINCisJCQlPdXRwdXREaXJlY3Rvcnk9Ing4NlxNaW5pWmlwJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSJ4ODZcTWluaVppcCQoQ29uZmlndXJhdGlvbk5hbWUpXFRtcCINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iVXBncmFkZUZyb21WQzcwLnZzcHJvcHMiDQorCQkJQ2hhcmFjdGVyU2V0PSIyIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCU9wdGltaXphdGlvbj0iMiINCisJCQkJSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjEiDQorCQkJCU9taXRGcmFtZVBvaW50ZXJzPSJ0cnVlIg0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLjsuLlwuLlxtaW5pemlwIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7X0NSVF9OT05TVERDX05PX0RFUFJFQ0FURTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7WkxJQl9XSU5BUEk7TkRFQlVHO19DT05TT0xFIg0KKwkJCQlTdHJpbmdQb29saW5nPSJ0cnVlIg0KKwkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjAiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIwIg0KKwkJCQlCdWZmZXJTZWN1cml0eUNoZWNrPSJmYWxzZSINCisJCQkJRW5hYmxlRnVuY3Rpb25MZXZlbExpbmtpbmc9InRydWUiDQorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIg0KKwkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249IiQoSW50RGlyKVwiDQorCQkJCVdhcm5pbmdMZXZlbD0iMyINCisJCQkJRGV0ZWN0NjRCaXRQb3J0YWJpbGl0eVByb2JsZW1zPSJ0cnVlIg0KKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSJ4ODZcWmxpYkRsbFJlbGVhc2VcemxpYndhcGkubGliIg0KKwkJCQlPdXRwdXRGaWxlPSIkKE91dERpcikvbWluaXppcC5leGUiDQorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMSINCisJCQkJR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPSJ0cnVlIg0KKwkJCQlTdWJTeXN0ZW09IjEiDQorCQkJCU9wdGltaXplUmVmZXJlbmNlcz0iMiINCisJCQkJRW5hYmxlQ09NREFURm9sZGluZz0iMiINCisJCQkJT3B0aW1pemVGb3JXaW5kb3dzOTg9IjEiDQorCQkJCVJhbmRvbWl6ZWRCYXNlQWRkcmVzcz0iMSINCisJCQkJRGF0YUV4ZWN1dGlvblByZXZlbnRpb249IjAiDQorCQkJCVRhcmdldE1hY2hpbmU9IjEiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iRGVidWd8eDY0Ig0KKwkJCU91dHB1dERpcmVjdG9yeT0ieDY0XCQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0ieDY0XCQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSJVcGdyYWRlRnJvbVZDNzAudnNwcm9wcyINCisJCQlDaGFyYWN0ZXJTZXQ9IjIiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCQlUYXJnZXRFbnZpcm9ubWVudD0iMyINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCU9wdGltaXphdGlvbj0iMCINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5cLi47Li5cLi5cbWluaXppcCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9DUlRfTk9OU1REQ19OT19ERVBSRUNBVEU7X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFO1pMSUJfV0lOQVBJO19ERUJVRztfQ09OU09MRTtXSU42NCINCisJCQkJTWluaW1hbFJlYnVpbGQ9InRydWUiDQorCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMCINCisJCQkJUnVudGltZUxpYnJhcnk9IjMiDQorCQkJCUJ1ZmZlclNlY3VyaXR5Q2hlY2s9ImZhbHNlIg0KKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCINCisJCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIkKEludERpcilcIg0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCURldGVjdDY0Qml0UG9ydGFiaWxpdHlQcm9ibGVtcz0idHJ1ZSINCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0ieDY0XFpsaWJEbGxEZWJ1Z1x6bGlid2FwaS5saWIiDQorCQkJCU91dHB1dEZpbGU9IiQoT3V0RGlyKS9taW5pemlwLmV4ZSINCisJCQkJTGlua0luY3JlbWVudGFsPSIyIg0KKwkJCQlHZW5lcmF0ZU1hbmlmZXN0PSJmYWxzZSINCisJCQkJR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPSJ0cnVlIg0KKwkJCQlQcm9ncmFtRGF0YWJhc2VGaWxlPSIkKE91dERpcikvbWluaXppcC5wZGIiDQorCQkJCVN1YlN5c3RlbT0iMSINCisJCQkJVGFyZ2V0TWFjaGluZT0iMTciDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IkRlYnVnfEl0YW5pdW0iDQorCQkJT3V0cHV0RGlyZWN0b3J5PSJpYTY0XCQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iaWE2NFwkKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iVXBncmFkZUZyb21WQzcwLnZzcHJvcHMiDQorCQkJQ2hhcmFjdGVyU2V0PSIyIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkJVGFyZ2V0RW52aXJvbm1lbnQ9IjIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlPcHRpbWl6YXRpb249IjAiDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXC4uOy4uXC4uXG1pbml6aXAiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfQ1JUX05PTlNURENfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtaTElCX1dJTkFQSTtfREVCVUc7X0NPTlNPTEU7V0lONjQiDQorCQkJCU1pbmltYWxSZWJ1aWxkPSJ0cnVlIg0KKwkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjAiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIzIg0KKwkJCQlCdWZmZXJTZWN1cml0eUNoZWNrPSJmYWxzZSINCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiDQorCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iJChJbnREaXIpXCINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9InRydWUiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9ImlhNjRcWmxpYkRsbERlYnVnXHpsaWJ3YXBpLmxpYiINCisJCQkJT3V0cHV0RmlsZT0iJChPdXREaXIpL21pbml6aXAuZXhlIg0KKwkJCQlMaW5rSW5jcmVtZW50YWw9IjIiDQorCQkJCUdlbmVyYXRlTWFuaWZlc3Q9ImZhbHNlIg0KKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249InRydWUiDQorCQkJCVByb2dyYW1EYXRhYmFzZUZpbGU9IiQoT3V0RGlyKS9taW5pemlwLnBkYiINCisJCQkJU3ViU3lzdGVtPSIxIg0KKwkJCQlUYXJnZXRNYWNoaW5lPSI1Ig0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlfHg2NCINCisJCQlPdXRwdXREaXJlY3Rvcnk9Ing2NFwkKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ing2NFwkKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iVXBncmFkZUZyb21WQzcwLnZzcHJvcHMiDQorCQkJQ2hhcmFjdGVyU2V0PSIyIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkJVGFyZ2V0RW52aXJvbm1lbnQ9IjMiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlPcHRpbWl6YXRpb249IjIiDQorCQkJCUlubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIxIg0KKwkJCQlPbWl0RnJhbWVQb2ludGVycz0idHJ1ZSINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5cLi47Li5cLi5cbWluaXppcCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9DUlRfTk9OU1REQ19OT19ERVBSRUNBVEU7X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFO1pMSUJfV0lOQVBJO05ERUJVRztfQ09OU09MRTtXSU42NCINCisJCQkJU3RyaW5nUG9vbGluZz0idHJ1ZSINCisJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIwIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iMiINCisJCQkJQnVmZmVyU2VjdXJpdHlDaGVjaz0iZmFsc2UiDQorCQkJCUVuYWJsZUZ1bmN0aW9uTGV2ZWxMaW5raW5nPSJ0cnVlIg0KKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCINCisJCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIkKEludERpcilcIg0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCURldGVjdDY0Qml0UG9ydGFiaWxpdHlQcm9ibGVtcz0idHJ1ZSINCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0ieDY0XFpsaWJEbGxSZWxlYXNlXHpsaWJ3YXBpLmxpYiINCisJCQkJT3V0cHV0RmlsZT0iJChPdXREaXIpL21pbml6aXAuZXhlIg0KKwkJCQlMaW5rSW5jcmVtZW50YWw9IjEiDQorCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0idHJ1ZSINCisJCQkJU3ViU3lzdGVtPSIxIg0KKwkJCQlPcHRpbWl6ZVJlZmVyZW5jZXM9IjIiDQorCQkJCUVuYWJsZUNPTURBVEZvbGRpbmc9IjIiDQorCQkJCU9wdGltaXplRm9yV2luZG93czk4PSIxIg0KKwkJCQlUYXJnZXRNYWNoaW5lPSIxNyINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iUmVsZWFzZXxJdGFuaXVtIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iaWE2NFwkKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9ImlhNjRcJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IlVwZ3JhZGVGcm9tVkM3MC52c3Byb3BzIg0KKwkJCUNoYXJhY3RlclNldD0iMiINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJCVRhcmdldEVudmlyb25tZW50PSIyIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJT3B0aW1pemF0aW9uPSIyIg0KKwkJCQlJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj0iMSINCisJCQkJT21pdEZyYW1lUG9pbnRlcnM9InRydWUiDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXC4uOy4uXC4uXG1pbml6aXAiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfQ1JUX05PTlNURENfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtaTElCX1dJTkFQSTtOREVCVUc7X0NPTlNPTEU7V0lONjQiDQorCQkJCVN0cmluZ1Bvb2xpbmc9InRydWUiDQorCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMCINCisJCQkJUnVudGltZUxpYnJhcnk9IjIiDQorCQkJCUJ1ZmZlclNlY3VyaXR5Q2hlY2s9ImZhbHNlIg0KKwkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0idHJ1ZSINCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiDQorCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iJChJbnREaXIpXCINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9InRydWUiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9ImlhNjRcWmxpYkRsbFJlbGVhc2VcemxpYndhcGkubGliIg0KKwkJCQlPdXRwdXRGaWxlPSIkKE91dERpcikvbWluaXppcC5leGUiDQorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMSINCisJCQkJR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPSJ0cnVlIg0KKwkJCQlTdWJTeXN0ZW09IjEiDQorCQkJCU9wdGltaXplUmVmZXJlbmNlcz0iMiINCisJCQkJRW5hYmxlQ09NREFURm9sZGluZz0iMiINCisJCQkJT3B0aW1pemVGb3JXaW5kb3dzOTg9IjEiDQorCQkJCVRhcmdldE1hY2hpbmU9IjUiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCTwvQ29uZmlndXJhdGlvbnM+DQorCTxSZWZlcmVuY2VzPg0KKwk8L1JlZmVyZW5jZXM+DQorCTxGaWxlcz4NCisJCTxGaWx0ZXINCisJCQlOYW1lPSJTb3VyY2UgRmlsZXMiDQorCQkJRmlsdGVyPSJjcHA7YztjeHg7ZGVmO29kbDtpZGw7aHBqO2JhdDthc20iDQorCQkJPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cbWluaXppcFxtaW5pemlwLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQk8L0ZpbHRlcj4NCisJCTxGaWx0ZXINCisJCQlOYW1lPSJIZWFkZXIgRmlsZXMiDQorCQkJRmlsdGVyPSJoO2hwcDtoeHg7aG07aW5sO2luYyINCisJCQk+DQorCQk8L0ZpbHRlcj4NCisJCTxGaWx0ZXINCisJCQlOYW1lPSJSZXNvdXJjZSBGaWxlcyINCisJCQlGaWx0ZXI9InJjO2ljbztjdXI7Ym1wO2RsZztyYzI7cmN0O2JpbjtyZ3M7Z2lmO2pwZztqcGVnO2pwZSINCisJCQk+DQorCQk8L0ZpbHRlcj4NCisJPC9GaWxlcz4NCisJPEdsb2JhbHM+DQorCTwvR2xvYmFscz4NCis8L1Zpc3VhbFN0dWRpb1Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvemxpYi0xLjIuNi9jb250cmliL3ZzdHVkaW8vdmM5L3Rlc3R6bGliLnZjcHJvaiBiL3psaWItMS4yLjYvY29udHJpYi92c3R1ZGlvL3ZjOS90ZXN0emxpYi52Y3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWNiMGJmOAotLS0gL2Rldi9udWxsCisrKyBiL3psaWItMS4yLjYvY29udHJpYi92c3R1ZGlvL3ZjOS90ZXN0emxpYi52Y3Byb2oKQEAgLTAsMCArMSw4NTIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IldpbmRvd3MtMTI1MiI/Pg0KKzxWaXN1YWxTdHVkaW9Qcm9qZWN0DQorCVByb2plY3RUeXBlPSJWaXN1YWwgQysrIg0KKwlWZXJzaW9uPSI5LDAwIg0KKwlOYW1lPSJ0ZXN0emxpYiINCisJUHJvamVjdEdVSUQ9IntBQTY2NjZBQS1FMDlGLTQxMzUtOUMwQy00RkU1MEMzQzY1NEJ9Ig0KKwlSb290TmFtZXNwYWNlPSJ0ZXN0emxpYiINCisJS2V5d29yZD0iV2luMzJQcm9qIg0KKwlUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPSIxMzEwNzIiDQorCT4NCisJPFBsYXRmb3Jtcz4NCisJCTxQbGF0Zm9ybQ0KKwkJCU5hbWU9IldpbjMyIg0KKwkJLz4NCisJCTxQbGF0Zm9ybQ0KKwkJCU5hbWU9Ing2NCINCisJCS8+DQorCQk8UGxhdGZvcm0NCisJCQlOYW1lPSJJdGFuaXVtIg0KKwkJLz4NCisJPC9QbGF0Zm9ybXM+DQorCTxUb29sRmlsZXM+DQorCTwvVG9vbEZpbGVzPg0KKwk8Q29uZmlndXJhdGlvbnM+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IkRlYnVnfFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0ieDg2XFRlc3RabGliJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSJ4ODZcVGVzdFpsaWIkKENvbmZpZ3VyYXRpb25OYW1lKVxUbXAiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiDQorCQkJQ2hhcmFjdGVyU2V0PSIyIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCU9wdGltaXphdGlvbj0iMCINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5cLi4iDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJBU01WO0FTTUlORjtXSU4zMjtaTElCX1dJTkFQSTtfREVCVUc7X0NPTlNPTEU7X0NSVF9OT05TVERDX05PX0RFUFJFQ0FURTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7X0NSVF9OT05TVERDX05PX1dBUk5JTkdTIg0KKwkJCQlNaW5pbWFsUmVidWlsZD0idHJ1ZSINCisJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIwIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iMSINCisJCQkJQnVmZmVyU2VjdXJpdHlDaGVjaz0iZmFsc2UiDQorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIg0KKwkJCQlBc3NlbWJsZXJPdXRwdXQ9IjQiDQorCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iJChJbnREaXIpXCINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9InRydWUiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjQiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9Ii4uXC4uXG1hc214ODZcbWF0Y2g2ODYub2JqIC4uXC4uXG1hc214ODZcaW5mZmFzMzIub2JqIg0KKwkJCQlPdXRwdXRGaWxlPSIkKE91dERpcikvdGVzdHpsaWIuZXhlIg0KKwkJCQlMaW5rSW5jcmVtZW50YWw9IjIiDQorCQkJCUdlbmVyYXRlTWFuaWZlc3Q9ImZhbHNlIg0KKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249InRydWUiDQorCQkJCVByb2dyYW1EYXRhYmFzZUZpbGU9IiQoT3V0RGlyKS90ZXN0emxpYi5wZGIiDQorCQkJCVN1YlN5c3RlbT0iMSINCisJCQkJUmFuZG9taXplZEJhc2VBZGRyZXNzPSIxIg0KKwkJCQlEYXRhRXhlY3V0aW9uUHJldmVudGlvbj0iMCINCisJCQkJVGFyZ2V0TWFjaGluZT0iMSINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJEZWJ1Z3x4NjQiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSJ4NjRcVGVzdFpsaWIkKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ing2NFxUZXN0WmxpYiQoQ29uZmlndXJhdGlvbk5hbWUpXFRtcCINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLiINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IkFTTVY7QVNNSU5GO1dJTjMyO1pMSUJfV0lOQVBJO19ERUJVRztfQ09OU09MRTtfQ1JUX05PTlNURENfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtfQ1JUX05PTlNURENfTk9fV0FSTklOR1MiDQorCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMCINCisJCQkJUnVudGltZUxpYnJhcnk9IjMiDQorCQkJCUJ1ZmZlclNlY3VyaXR5Q2hlY2s9ImZhbHNlIg0KKwkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249IiQoSW50RGlyKVwiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9Ii4uXC4uXG1hc214NjRcZ3ZtYXQ2NC5vYmogLi5cLi5cbWFzbXg2NFxpbmZmYXN4NjQub2JqIg0KKwkJCQlHZW5lcmF0ZU1hbmlmZXN0PSJmYWxzZSINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJEZWJ1Z3xJdGFuaXVtIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iaWE2NFxUZXN0WmxpYiQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iaWE2NFxUZXN0WmxpYiQoQ29uZmlndXJhdGlvbk5hbWUpXFRtcCINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSINCisJCQlDaGFyYWN0ZXJTZXQ9IjIiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCQlUYXJnZXRFbnZpcm9ubWVudD0iMiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCU9wdGltaXphdGlvbj0iMCINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5cLi4iDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJaTElCX1dJTkFQSTtfREVCVUc7X0NPTlNPTEU7X0NSVF9OT05TVERDX05PX0RFUFJFQ0FURTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7X0NSVF9OT05TVERDX05PX1dBUk5JTkdTO1dJTjY0Ig0KKwkJCQlNaW5pbWFsUmVidWlsZD0idHJ1ZSINCisJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIwIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iMyINCisJCQkJQnVmZmVyU2VjdXJpdHlDaGVjaz0iZmFsc2UiDQorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIg0KKwkJCQlBc3NlbWJsZXJPdXRwdXQ9IjQiDQorCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iJChJbnREaXIpXCINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9InRydWUiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCU91dHB1dEZpbGU9IiQoT3V0RGlyKS90ZXN0emxpYi5leGUiDQorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMiINCisJCQkJR2VuZXJhdGVNYW5pZmVzdD0iZmFsc2UiDQorCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0idHJ1ZSINCisJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iJChPdXREaXIpL3Rlc3R6bGliLnBkYiINCisJCQkJU3ViU3lzdGVtPSIxIg0KKwkJCQlUYXJnZXRNYWNoaW5lPSI1Ig0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2VXaXRob3V0QXNtfFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0ieDg2XFRlc3RabGliJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSJ4ODZcVGVzdFpsaWIkKENvbmZpZ3VyYXRpb25OYW1lKVxUbXAiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiDQorCQkJQ2hhcmFjdGVyU2V0PSIyIg0KKwkJCVdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj0iMSINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlPcHRpbWl6YXRpb249IjIiDQorCQkJCUlubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIxIg0KKwkJCQlPbWl0RnJhbWVQb2ludGVycz0idHJ1ZSINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5cLi4iDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtaTElCX1dJTkFQSTtOREVCVUc7X0NPTlNPTEU7X0NSVF9OT05TVERDX05PX0RFUFJFQ0FURTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7X0NSVF9OT05TVERDX05PX1dBUk5JTkdTIg0KKwkJCQlTdHJpbmdQb29saW5nPSJ0cnVlIg0KKwkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjAiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIwIg0KKwkJCQlCdWZmZXJTZWN1cml0eUNoZWNrPSJmYWxzZSINCisJCQkJRW5hYmxlRnVuY3Rpb25MZXZlbExpbmtpbmc9InRydWUiDQorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIg0KKwkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249IiQoSW50RGlyKVwiDQorCQkJCVdhcm5pbmdMZXZlbD0iMyINCisJCQkJRGV0ZWN0NjRCaXRQb3J0YWJpbGl0eVByb2JsZW1zPSJ0cnVlIg0KKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlPdXRwdXRGaWxlPSIkKE91dERpcikvdGVzdHpsaWIuZXhlIg0KKwkJCQlMaW5rSW5jcmVtZW50YWw9IjEiDQorCQkJCUdlbmVyYXRlTWFuaWZlc3Q9ImZhbHNlIg0KKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249InRydWUiDQorCQkJCVN1YlN5c3RlbT0iMSINCisJCQkJT3B0aW1pemVSZWZlcmVuY2VzPSIyIg0KKwkJCQlFbmFibGVDT01EQVRGb2xkaW5nPSIyIg0KKwkJCQlPcHRpbWl6ZUZvcldpbmRvd3M5OD0iMSINCisJCQkJUmFuZG9taXplZEJhc2VBZGRyZXNzPSIxIg0KKwkJCQlEYXRhRXhlY3V0aW9uUHJldmVudGlvbj0iMCINCisJCQkJVGFyZ2V0TWFjaGluZT0iMSINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlV2l0aG91dEFzbXx4NjQiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSJ4NjRcVGVzdFpsaWIkKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ing2NFxUZXN0WmxpYiQoQ29uZmlndXJhdGlvbk5hbWUpXFRtcCINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSINCisJCQlXaG9sZVByb2dyYW1PcHRpbWl6YXRpb249IjEiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5cLi4iDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtaTElCX1dJTkFQSTtOREVCVUc7X0NPTlNPTEU7X0NSVF9OT05TVERDX05PX0RFUFJFQ0FURTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7X0NSVF9OT05TVERDX05PX1dBUk5JTkdTIg0KKwkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjAiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIyIg0KKwkJCQlCdWZmZXJTZWN1cml0eUNoZWNrPSJmYWxzZSINCisJCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIkKEludERpcilcIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSIiDQorCQkJCUdlbmVyYXRlTWFuaWZlc3Q9ImZhbHNlIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2VXaXRob3V0QXNtfEl0YW5pdW0iDQorCQkJT3V0cHV0RGlyZWN0b3J5PSJpYTY0XFRlc3RabGliJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSJpYTY0XFRlc3RabGliJChDb25maWd1cmF0aW9uTmFtZSlcVG1wIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIg0KKwkJCUNoYXJhY3RlclNldD0iMiINCisJCQlXaG9sZVByb2dyYW1PcHRpbWl6YXRpb249IjEiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCQlUYXJnZXRFbnZpcm9ubWVudD0iMiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCU9wdGltaXphdGlvbj0iMiINCisJCQkJSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjEiDQorCQkJCU9taXRGcmFtZVBvaW50ZXJzPSJ0cnVlIg0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLiINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IlpMSUJfV0lOQVBJO05ERUJVRztfQ09OU09MRTtfQ1JUX05PTlNURENfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtfQ1JUX05PTlNURENfTk9fV0FSTklOR1M7V0lONjQiDQorCQkJCVN0cmluZ1Bvb2xpbmc9InRydWUiDQorCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMCINCisJCQkJUnVudGltZUxpYnJhcnk9IjIiDQorCQkJCUJ1ZmZlclNlY3VyaXR5Q2hlY2s9ImZhbHNlIg0KKwkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0idHJ1ZSINCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiDQorCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iJChJbnREaXIpXCINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9InRydWUiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCU91dHB1dEZpbGU9IiQoT3V0RGlyKS90ZXN0emxpYi5leGUiDQorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMSINCisJCQkJR2VuZXJhdGVNYW5pZmVzdD0iZmFsc2UiDQorCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0idHJ1ZSINCisJCQkJU3ViU3lzdGVtPSIxIg0KKwkJCQlPcHRpbWl6ZVJlZmVyZW5jZXM9IjIiDQorCQkJCUVuYWJsZUNPTURBVEZvbGRpbmc9IjIiDQorCQkJCU9wdGltaXplRm9yV2luZG93czk4PSIxIg0KKwkJCQlUYXJnZXRNYWNoaW5lPSI1Ig0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2V8V2luMzIiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSJ4ODZcVGVzdFpsaWIkKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ing4NlxUZXN0WmxpYiQoQ29uZmlndXJhdGlvbk5hbWUpXFRtcCINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSINCisJCQlDaGFyYWN0ZXJTZXQ9IjIiDQorCQkJV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPSIxIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCU9wdGltaXphdGlvbj0iMiINCisJCQkJSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjEiDQorCQkJCU9taXRGcmFtZVBvaW50ZXJzPSJ0cnVlIg0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLiINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IkFTTVY7QVNNSU5GO1dJTjMyO1pMSUJfV0lOQVBJO05ERUJVRztfQ09OU09MRTtfQ1JUX05PTlNURENfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtfQ1JUX05PTlNURENfTk9fV0FSTklOR1MiDQorCQkJCVN0cmluZ1Bvb2xpbmc9InRydWUiDQorCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMCINCisJCQkJUnVudGltZUxpYnJhcnk9IjAiDQorCQkJCUJ1ZmZlclNlY3VyaXR5Q2hlY2s9ImZhbHNlIg0KKwkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0idHJ1ZSINCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiDQorCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iJChJbnREaXIpXCINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9InRydWUiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9Ii4uXC4uXG1hc214ODZcbWF0Y2g2ODYub2JqIC4uXC4uXG1hc214ODZcaW5mZmFzMzIub2JqIg0KKwkJCQlPdXRwdXRGaWxlPSIkKE91dERpcikvdGVzdHpsaWIuZXhlIg0KKwkJCQlMaW5rSW5jcmVtZW50YWw9IjEiDQorCQkJCUdlbmVyYXRlTWFuaWZlc3Q9ImZhbHNlIg0KKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249InRydWUiDQorCQkJCVN1YlN5c3RlbT0iMSINCisJCQkJT3B0aW1pemVSZWZlcmVuY2VzPSIyIg0KKwkJCQlFbmFibGVDT01EQVRGb2xkaW5nPSIyIg0KKwkJCQlPcHRpbWl6ZUZvcldpbmRvd3M5OD0iMSINCisJCQkJUmFuZG9taXplZEJhc2VBZGRyZXNzPSIxIg0KKwkJCQlEYXRhRXhlY3V0aW9uUHJldmVudGlvbj0iMCINCisJCQkJVGFyZ2V0TWFjaGluZT0iMSINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlfHg2NCINCisJCQlPdXRwdXREaXJlY3Rvcnk9Ing2NFxUZXN0WmxpYiQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0ieDY0XFRlc3RabGliJChDb25maWd1cmF0aW9uTmFtZSlcVG1wIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIg0KKwkJCVdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj0iMSINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLiINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IkFTTVY7QVNNSU5GO1dJTjMyO1pMSUJfV0lOQVBJO05ERUJVRztfQ09OU09MRTtfQ1JUX05PTlNURENfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtfQ1JUX05PTlNURENfTk9fV0FSTklOR1MiDQorCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMCINCisJCQkJUnVudGltZUxpYnJhcnk9IjAiDQorCQkJCUJ1ZmZlclNlY3VyaXR5Q2hlY2s9ImZhbHNlIg0KKwkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249IiQoSW50RGlyKVwiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9Ii4uXC4uXG1hc214NjRcZ3ZtYXQ2NC5vYmogLi5cLi5cbWFzbXg2NFxpbmZmYXN4NjQub2JqIg0KKwkJCQlHZW5lcmF0ZU1hbmlmZXN0PSJmYWxzZSINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlfEl0YW5pdW0iDQorCQkJT3V0cHV0RGlyZWN0b3J5PSJpYTY0XFRlc3RabGliJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSJpYTY0XFRlc3RabGliJChDb25maWd1cmF0aW9uTmFtZSlcVG1wIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIg0KKwkJCUNoYXJhY3RlclNldD0iMiINCisJCQlXaG9sZVByb2dyYW1PcHRpbWl6YXRpb249IjEiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCQlUYXJnZXRFbnZpcm9ubWVudD0iMiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCU9wdGltaXphdGlvbj0iMiINCisJCQkJSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjEiDQorCQkJCU9taXRGcmFtZVBvaW50ZXJzPSJ0cnVlIg0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLiINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IlpMSUJfV0lOQVBJO05ERUJVRztfQ09OU09MRTtfQ1JUX05PTlNURENfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtfQ1JUX05PTlNURENfTk9fV0FSTklOR1M7V0lONjQiDQorCQkJCVN0cmluZ1Bvb2xpbmc9InRydWUiDQorCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMCINCisJCQkJUnVudGltZUxpYnJhcnk9IjIiDQorCQkJCUJ1ZmZlclNlY3VyaXR5Q2hlY2s9ImZhbHNlIg0KKwkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0idHJ1ZSINCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiDQorCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iJChJbnREaXIpXCINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9InRydWUiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCU91dHB1dEZpbGU9IiQoT3V0RGlyKS90ZXN0emxpYi5leGUiDQorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMSINCisJCQkJR2VuZXJhdGVNYW5pZmVzdD0iZmFsc2UiDQorCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0idHJ1ZSINCisJCQkJU3ViU3lzdGVtPSIxIg0KKwkJCQlPcHRpbWl6ZVJlZmVyZW5jZXM9IjIiDQorCQkJCUVuYWJsZUNPTURBVEZvbGRpbmc9IjIiDQorCQkJCU9wdGltaXplRm9yV2luZG93czk4PSIxIg0KKwkJCQlUYXJnZXRNYWNoaW5lPSI1Ig0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCTwvQ29uZmlndXJhdGlvbnM+DQorCTxSZWZlcmVuY2VzPg0KKwk8L1JlZmVyZW5jZXM+DQorCTxGaWxlcz4NCisJCTxGaWx0ZXINCisJCQlOYW1lPSJTb3VyY2UgRmlsZXMiDQorCQkJRmlsdGVyPSJjcHA7YztjeHg7ZGVmO29kbDtpZGw7aHBqO2JhdDthc20iDQorCQkJPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cYWRsZXIzMi5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cY29tcHJlc3MuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXGNyYzMyLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxkZWZsYXRlLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxpbmZiYWNrLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxtYXNteDY0XGluZmZhczg2NjQuYyINCisJCQkJPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IkRlYnVnfFdpbjMyIg0KKwkJCQkJRXhjbHVkZWRGcm9tQnVpbGQ9InRydWUiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IkRlYnVnfEl0YW5pdW0iDQorCQkJCQlFeGNsdWRlZEZyb21CdWlsZD0idHJ1ZSINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iUmVsZWFzZVdpdGhvdXRBc218V2luMzIiDQorCQkJCQlFeGNsdWRlZEZyb21CdWlsZD0idHJ1ZSINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iUmVsZWFzZVdpdGhvdXRBc218SXRhbml1bSINCisJCQkJCUV4Y2x1ZGVkRnJvbUJ1aWxkPSJ0cnVlIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KKwkJCQkJRXhjbHVkZWRGcm9tQnVpbGQ9InRydWUiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IlJlbGVhc2V8SXRhbml1bSINCisJCQkJCUV4Y2x1ZGVkRnJvbUJ1aWxkPSJ0cnVlIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxpbmZmYXN0LmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxpbmZsYXRlLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxpbmZ0cmVlcy5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cdGVzdHpsaWJcdGVzdHpsaWIuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHRyZWVzLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlx1bmNvbXByLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlx6dXRpbC5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJPC9GaWx0ZXI+DQorCQk8RmlsdGVyDQorCQkJTmFtZT0iSGVhZGVyIEZpbGVzIg0KKwkJCUZpbHRlcj0iaDtocHA7aHh4O2htO2lubDtpbmMiDQorCQkJPg0KKwkJPC9GaWx0ZXI+DQorCQk8RmlsdGVyDQorCQkJTmFtZT0iUmVzb3VyY2UgRmlsZXMiDQorCQkJRmlsdGVyPSJyYztpY287Y3VyO2JtcDtkbGc7cmMyO3JjdDtiaW47cmdzO2dpZjtqcGc7anBlZztqcGUiDQorCQkJPg0KKwkJPC9GaWx0ZXI+DQorCTwvRmlsZXM+DQorCTxHbG9iYWxzPg0KKwk8L0dsb2JhbHM+DQorPC9WaXN1YWxTdHVkaW9Qcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL3psaWItMS4yLjYvY29udHJpYi92c3R1ZGlvL3ZjOS90ZXN0emxpYmRsbC52Y3Byb2ogYi96bGliLTEuMi42L2NvbnRyaWIvdnN0dWRpby92YzkvdGVzdHpsaWJkbGwudmNwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxZGRkZTAKLS0tIC9kZXYvbnVsbAorKysgYi96bGliLTEuMi42L2NvbnRyaWIvdnN0dWRpby92YzkvdGVzdHpsaWJkbGwudmNwcm9qCkBAIC0wLDAgKzEsNTY1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJXaW5kb3dzLTEyNTIiPz4NCis8VmlzdWFsU3R1ZGlvUHJvamVjdA0KKwlQcm9qZWN0VHlwZT0iVmlzdWFsIEMrKyINCisJVmVyc2lvbj0iOS4wMCINCisJTmFtZT0iVGVzdFpsaWJEbGwiDQorCVByb2plY3RHVUlEPSJ7QzUyRjlFN0ItNDk4QS00MkJFLThEQjQtODVBMTU2OTQzNjZBfSINCisJS2V5d29yZD0iV2luMzJQcm9qIg0KKwlUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPSIxMzEwNzIiDQorCT4NCisJPFBsYXRmb3Jtcz4NCisJCTxQbGF0Zm9ybQ0KKwkJCU5hbWU9IldpbjMyIg0KKwkJLz4NCisJCTxQbGF0Zm9ybQ0KKwkJCU5hbWU9Ing2NCINCisJCS8+DQorCQk8UGxhdGZvcm0NCisJCQlOYW1lPSJJdGFuaXVtIg0KKwkJLz4NCisJPC9QbGF0Zm9ybXM+DQorCTxUb29sRmlsZXM+DQorCTwvVG9vbEZpbGVzPg0KKwk8Q29uZmlndXJhdGlvbnM+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IkRlYnVnfFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0ieDg2XFRlc3RabGliRGxsJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSJ4ODZcVGVzdFpsaWJEbGwkKENvbmZpZ3VyYXRpb25OYW1lKVxUbXAiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IlVwZ3JhZGVGcm9tVkM3MC52c3Byb3BzIg0KKwkJCUNoYXJhY3RlclNldD0iMiINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlPcHRpbWl6YXRpb249IjAiDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXC4uOy4uXC4uXG1pbml6aXAiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtfQ1JUX05PTlNURENfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtaTElCX1dJTkFQSTtfREVCVUc7X0NPTlNPTEUiDQorCQkJCU1pbmltYWxSZWJ1aWxkPSJ0cnVlIg0KKwkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjAiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIxIg0KKwkJCQlCdWZmZXJTZWN1cml0eUNoZWNrPSJmYWxzZSINCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiDQorCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iJChJbnREaXIpXCINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9InRydWUiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjQiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9Ing4NlxabGliRGxsRGVidWdcemxpYndhcGkubGliIg0KKwkJCQlPdXRwdXRGaWxlPSIkKE91dERpcikvdGVzdHpsaWIuZXhlIg0KKwkJCQlMaW5rSW5jcmVtZW50YWw9IjIiDQorCQkJCUdlbmVyYXRlTWFuaWZlc3Q9ImZhbHNlIg0KKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249InRydWUiDQorCQkJCVByb2dyYW1EYXRhYmFzZUZpbGU9IiQoT3V0RGlyKS90ZXN0emxpYi5wZGIiDQorCQkJCVN1YlN5c3RlbT0iMSINCisJCQkJUmFuZG9taXplZEJhc2VBZGRyZXNzPSIxIg0KKwkJCQlEYXRhRXhlY3V0aW9uUHJldmVudGlvbj0iMCINCisJCQkJVGFyZ2V0TWFjaGluZT0iMSINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0ieDg2XFRlc3RabGliRGxsJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSJ4ODZcVGVzdFpsaWJEbGwkKENvbmZpZ3VyYXRpb25OYW1lKVxUbXAiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IlVwZ3JhZGVGcm9tVkM3MC52c3Byb3BzIg0KKwkJCUNoYXJhY3RlclNldD0iMiINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlPcHRpbWl6YXRpb249IjIiDQorCQkJCUlubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIxIg0KKwkJCQlPbWl0RnJhbWVQb2ludGVycz0idHJ1ZSINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5cLi47Li5cLi5cbWluaXppcCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjMyO19DUlRfTk9OU1REQ19OT19ERVBSRUNBVEU7X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFO1pMSUJfV0lOQVBJO05ERUJVRztfQ09OU09MRSINCisJCQkJU3RyaW5nUG9vbGluZz0idHJ1ZSINCisJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIwIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iMCINCisJCQkJQnVmZmVyU2VjdXJpdHlDaGVjaz0iZmFsc2UiDQorCQkJCUVuYWJsZUZ1bmN0aW9uTGV2ZWxMaW5raW5nPSJ0cnVlIg0KKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCINCisJCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIkKEludERpcilcIg0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCURldGVjdDY0Qml0UG9ydGFiaWxpdHlQcm9ibGVtcz0idHJ1ZSINCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0ieDg2XFpsaWJEbGxSZWxlYXNlXHpsaWJ3YXBpLmxpYiINCisJCQkJT3V0cHV0RmlsZT0iJChPdXREaXIpL3Rlc3R6bGliLmV4ZSINCisJCQkJTGlua0luY3JlbWVudGFsPSIxIg0KKwkJCQlHZW5lcmF0ZU1hbmlmZXN0PSJmYWxzZSINCisJCQkJR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPSJ0cnVlIg0KKwkJCQlTdWJTeXN0ZW09IjEiDQorCQkJCU9wdGltaXplUmVmZXJlbmNlcz0iMiINCisJCQkJRW5hYmxlQ09NREFURm9sZGluZz0iMiINCisJCQkJT3B0aW1pemVGb3JXaW5kb3dzOTg9IjEiDQorCQkJCVJhbmRvbWl6ZWRCYXNlQWRkcmVzcz0iMSINCisJCQkJRGF0YUV4ZWN1dGlvblByZXZlbnRpb249IjAiDQorCQkJCVRhcmdldE1hY2hpbmU9IjEiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iRGVidWd8eDY0Ig0KKwkJCU91dHB1dERpcmVjdG9yeT0ieDY0XFRlc3RabGliRGxsJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSJ4NjRcVGVzdFpsaWJEbGwkKENvbmZpZ3VyYXRpb25OYW1lKVxUbXAiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IlVwZ3JhZGVGcm9tVkM3MC52c3Byb3BzIg0KKwkJCUNoYXJhY3RlclNldD0iMiINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJCVRhcmdldEVudmlyb25tZW50PSIzIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJT3B0aW1pemF0aW9uPSIwIg0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLjsuLlwuLlxtaW5pemlwIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0NSVF9OT05TVERDX05PX0RFUFJFQ0FURTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7WkxJQl9XSU5BUEk7X0RFQlVHO19DT05TT0xFO1dJTjY0Ig0KKwkJCQlNaW5pbWFsUmVidWlsZD0idHJ1ZSINCisJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIwIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iMyINCisJCQkJQnVmZmVyU2VjdXJpdHlDaGVjaz0iZmFsc2UiDQorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIg0KKwkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249IiQoSW50RGlyKVwiDQorCQkJCVdhcm5pbmdMZXZlbD0iMyINCisJCQkJRGV0ZWN0NjRCaXRQb3J0YWJpbGl0eVByb2JsZW1zPSJ0cnVlIg0KKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSJ4NjRcWmxpYkRsbERlYnVnXHpsaWJ3YXBpLmxpYiINCisJCQkJT3V0cHV0RmlsZT0iJChPdXREaXIpL3Rlc3R6bGliLmV4ZSINCisJCQkJTGlua0luY3JlbWVudGFsPSIyIg0KKwkJCQlHZW5lcmF0ZU1hbmlmZXN0PSJmYWxzZSINCisJCQkJR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPSJ0cnVlIg0KKwkJCQlQcm9ncmFtRGF0YWJhc2VGaWxlPSIkKE91dERpcikvdGVzdHpsaWIucGRiIg0KKwkJCQlTdWJTeXN0ZW09IjEiDQorCQkJCVRhcmdldE1hY2hpbmU9IjE3Ig0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJEZWJ1Z3xJdGFuaXVtIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iaWE2NFxUZXN0WmxpYkRsbCQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iaWE2NFxUZXN0WmxpYkRsbCQoQ29uZmlndXJhdGlvbk5hbWUpXFRtcCINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iVXBncmFkZUZyb21WQzcwLnZzcHJvcHMiDQorCQkJQ2hhcmFjdGVyU2V0PSIyIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkJVGFyZ2V0RW52aXJvbm1lbnQ9IjIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlPcHRpbWl6YXRpb249IjAiDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXC4uOy4uXC4uXG1pbml6aXAiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfQ1JUX05PTlNURENfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtaTElCX1dJTkFQSTtfREVCVUc7X0NPTlNPTEU7V0lONjQiDQorCQkJCU1pbmltYWxSZWJ1aWxkPSJ0cnVlIg0KKwkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjAiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIzIg0KKwkJCQlCdWZmZXJTZWN1cml0eUNoZWNrPSJmYWxzZSINCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiDQorCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iJChJbnREaXIpXCINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9InRydWUiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9ImlhNjRcWmxpYkRsbERlYnVnXHpsaWJ3YXBpLmxpYiINCisJCQkJT3V0cHV0RmlsZT0iJChPdXREaXIpL3Rlc3R6bGliLmV4ZSINCisJCQkJTGlua0luY3JlbWVudGFsPSIyIg0KKwkJCQlHZW5lcmF0ZU1hbmlmZXN0PSJmYWxzZSINCisJCQkJR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPSJ0cnVlIg0KKwkJCQlQcm9ncmFtRGF0YWJhc2VGaWxlPSIkKE91dERpcikvdGVzdHpsaWIucGRiIg0KKwkJCQlTdWJTeXN0ZW09IjEiDQorCQkJCVRhcmdldE1hY2hpbmU9IjUiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2V8eDY0Ig0KKwkJCU91dHB1dERpcmVjdG9yeT0ieDY0XFRlc3RabGliRGxsJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSJ4NjRcVGVzdFpsaWJEbGwkKENvbmZpZ3VyYXRpb25OYW1lKVxUbXAiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IlVwZ3JhZGVGcm9tVkM3MC52c3Byb3BzIg0KKwkJCUNoYXJhY3RlclNldD0iMiINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJCVRhcmdldEVudmlyb25tZW50PSIzIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJT3B0aW1pemF0aW9uPSIyIg0KKwkJCQlJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj0iMSINCisJCQkJT21pdEZyYW1lUG9pbnRlcnM9InRydWUiDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXC4uOy4uXC4uXG1pbml6aXAiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfQ1JUX05PTlNURENfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtaTElCX1dJTkFQSTtOREVCVUc7X0NPTlNPTEU7V0lONjQiDQorCQkJCVN0cmluZ1Bvb2xpbmc9InRydWUiDQorCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMCINCisJCQkJUnVudGltZUxpYnJhcnk9IjIiDQorCQkJCUJ1ZmZlclNlY3VyaXR5Q2hlY2s9ImZhbHNlIg0KKwkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0idHJ1ZSINCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiDQorCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iJChJbnREaXIpXCINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9InRydWUiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9Ing2NFxabGliRGxsUmVsZWFzZVx6bGlid2FwaS5saWIiDQorCQkJCU91dHB1dEZpbGU9IiQoT3V0RGlyKS90ZXN0emxpYi5leGUiDQorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMSINCisJCQkJR2VuZXJhdGVNYW5pZmVzdD0iZmFsc2UiDQorCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0idHJ1ZSINCisJCQkJU3ViU3lzdGVtPSIxIg0KKwkJCQlPcHRpbWl6ZVJlZmVyZW5jZXM9IjIiDQorCQkJCUVuYWJsZUNPTURBVEZvbGRpbmc9IjIiDQorCQkJCU9wdGltaXplRm9yV2luZG93czk4PSIxIg0KKwkJCQlUYXJnZXRNYWNoaW5lPSIxNyINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iUmVsZWFzZXxJdGFuaXVtIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iaWE2NFxUZXN0WmxpYkRsbCQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iaWE2NFxUZXN0WmxpYkRsbCQoQ29uZmlndXJhdGlvbk5hbWUpXFRtcCINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iVXBncmFkZUZyb21WQzcwLnZzcHJvcHMiDQorCQkJQ2hhcmFjdGVyU2V0PSIyIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkJVGFyZ2V0RW52aXJvbm1lbnQ9IjIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlPcHRpbWl6YXRpb249IjIiDQorCQkJCUlubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIxIg0KKwkJCQlPbWl0RnJhbWVQb2ludGVycz0idHJ1ZSINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5cLi47Li5cLi5cbWluaXppcCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9DUlRfTk9OU1REQ19OT19ERVBSRUNBVEU7X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFO1pMSUJfV0lOQVBJO05ERUJVRztfQ09OU09MRTtXSU42NCINCisJCQkJU3RyaW5nUG9vbGluZz0idHJ1ZSINCisJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIwIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iMiINCisJCQkJQnVmZmVyU2VjdXJpdHlDaGVjaz0iZmFsc2UiDQorCQkJCUVuYWJsZUZ1bmN0aW9uTGV2ZWxMaW5raW5nPSJ0cnVlIg0KKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCINCisJCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIkKEludERpcilcIg0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCURldGVjdDY0Qml0UG9ydGFiaWxpdHlQcm9ibGVtcz0idHJ1ZSINCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0iaWE2NFxabGliRGxsUmVsZWFzZVx6bGlid2FwaS5saWIiDQorCQkJCU91dHB1dEZpbGU9IiQoT3V0RGlyKS90ZXN0emxpYi5leGUiDQorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMSINCisJCQkJR2VuZXJhdGVNYW5pZmVzdD0iZmFsc2UiDQorCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0idHJ1ZSINCisJCQkJU3ViU3lzdGVtPSIxIg0KKwkJCQlPcHRpbWl6ZVJlZmVyZW5jZXM9IjIiDQorCQkJCUVuYWJsZUNPTURBVEZvbGRpbmc9IjIiDQorCQkJCU9wdGltaXplRm9yV2luZG93czk4PSIxIg0KKwkJCQlUYXJnZXRNYWNoaW5lPSI1Ig0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwk8L0NvbmZpZ3VyYXRpb25zPg0KKwk8UmVmZXJlbmNlcz4NCisJPC9SZWZlcmVuY2VzPg0KKwk8RmlsZXM+DQorCQk8RmlsdGVyDQorCQkJTmFtZT0iU291cmNlIEZpbGVzIg0KKwkJCUZpbHRlcj0iY3BwO2M7Y3h4O2RlZjtvZGw7aWRsO2hwajtiYXQ7YXNtIg0KKwkJCT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHRlc3R6bGliXHRlc3R6bGliLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQk8L0ZpbHRlcj4NCisJCTxGaWx0ZXINCisJCQlOYW1lPSJIZWFkZXIgRmlsZXMiDQorCQkJRmlsdGVyPSJoO2hwcDtoeHg7aG07aW5sO2luYyINCisJCQk+DQorCQk8L0ZpbHRlcj4NCisJCTxGaWx0ZXINCisJCQlOYW1lPSJSZXNvdXJjZSBGaWxlcyINCisJCQlGaWx0ZXI9InJjO2ljbztjdXI7Ym1wO2RsZztyYzI7cmN0O2JpbjtyZ3M7Z2lmO2pwZztqcGVnO2pwZSINCisJCQk+DQorCQk8L0ZpbHRlcj4NCisJPC9GaWxlcz4NCisJPEdsb2JhbHM+DQorCTwvR2xvYmFscz4NCis8L1Zpc3VhbFN0dWRpb1Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvemxpYi0xLjIuNi9jb250cmliL3ZzdHVkaW8vdmM5L3psaWIucmMgYi96bGliLTEuMi42L2NvbnRyaWIvdnN0dWRpby92YzkvemxpYi5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjIyZmFiCi0tLSAvZGV2L251bGwKKysrIGIvemxpYi0xLjIuNi9jb250cmliL3ZzdHVkaW8vdmM5L3psaWIucmMKQEAgLTAsMCArMSwzMiBAQAorI2luY2x1ZGUgPHdpbmRvd3MuaD4NCisNCisjZGVmaW5lIElEUl9WRVJTSU9OMSAgMQ0KK0lEUl9WRVJTSU9OMQlWRVJTSU9OSU5GTwlNT1ZFQUJMRSBJTVBVUkUgTE9BRE9OQ0FMTCBESVNDQVJEQUJMRQ0KKyAgRklMRVZFUlNJT04JIDEuMi42LDENCisgIFBST0RVQ1RWRVJTSU9OIDEuMi42LDENCisgIEZJTEVGTEFHU01BU0sJVlNfRkZJX0ZJTEVGTEFHU01BU0sNCisgIEZJTEVGTEFHUwkwDQorICBGSUxFT1MJVk9TX0RPU19XSU5ET1dTMzINCisgIEZJTEVUWVBFCVZGVF9ETEwNCisgIEZJTEVTVUJUWVBFCTAJLy8gbm90IHVzZWQNCitCRUdJTg0KKyAgQkxPQ0sgIlN0cmluZ0ZpbGVJbmZvIg0KKyAgQkVHSU4NCisgICAgQkxPQ0sgIjA0MDkwNEU0Ig0KKyAgICAvL2xhbmd1YWdlIElEID0gVS5TLiBFbmdsaXNoLCBjaGFyIHNldCA9IFdpbmRvd3MsIE11bHRpbGluZ3VhbA0KKw0KKyAgICBCRUdJTg0KKyAgICAgIFZBTFVFICJGaWxlRGVzY3JpcHRpb24iLCAiemxpYiBkYXRhIGNvbXByZXNzaW9uIGFuZCBaSVAgZmlsZSBJL08gbGlicmFyeVwwIg0KKyAgICAgIFZBTFVFICJGaWxlVmVyc2lvbiIsCSIxLjIuNlwwIg0KKyAgICAgIFZBTFVFICJJbnRlcm5hbE5hbWUiLAkiemxpYlwwIg0KKyAgICAgIFZBTFVFICJPcmlnaW5hbEZpbGVuYW1lIiwJInpsaWIuZGxsXDAiDQorICAgICAgVkFMVUUgIlByb2R1Y3ROYW1lIiwJIlpMaWIuRExMXDAiDQorICAgICAgVkFMVUUgIkNvbW1lbnRzIiwiRExMIHN1cHBvcnQgYnkgQWxlc3NhbmRybyBJYWNvcGV0dGkgJiBHaWxsZXMgVm9sbGFudFwwIg0KKyAgICAgIFZBTFVFICJMZWdhbENvcHlyaWdodCIsICIoQykgMTk5NS0yMDEyIEplYW4tbG91cCBHYWlsbHkgJiBNYXJrIEFkbGVyXDAiDQorICAgIEVORA0KKyAgRU5EDQorICBCTE9DSyAiVmFyRmlsZUluZm8iDQorICBCRUdJTg0KKyAgICBWQUxVRSAiVHJhbnNsYXRpb24iLCAweDA0MDksIDEyNTINCisgIEVORA0KK0VORA0KZGlmZiAtLWdpdCBhL3psaWItMS4yLjYvY29udHJpYi92c3R1ZGlvL3ZjOS96bGlic3RhdC52Y3Byb2ogYi96bGliLTEuMi42L2NvbnRyaWIvdnN0dWRpby92YzkvemxpYnN0YXQudmNwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxYzc2YzcKLS0tIC9kZXYvbnVsbAorKysgYi96bGliLTEuMi42L2NvbnRyaWIvdnN0dWRpby92YzkvemxpYnN0YXQudmNwcm9qCkBAIC0wLDAgKzEsODM1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJXaW5kb3dzLTEyNTIiPz4NCis8VmlzdWFsU3R1ZGlvUHJvamVjdA0KKwlQcm9qZWN0VHlwZT0iVmlzdWFsIEMrKyINCisJVmVyc2lvbj0iOSwwMCINCisJTmFtZT0iemxpYnN0YXQiDQorCVByb2plY3RHVUlEPSJ7NzQ1REVDNTgtRUJCMy00N0E5LUE5QjgtNEM2NjI3QzAxQkY4fSINCisJVGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj0iMTMxMDcyIg0KKwk+DQorCTxQbGF0Zm9ybXM+DQorCQk8UGxhdGZvcm0NCisJCQlOYW1lPSJXaW4zMiINCisJCS8+DQorCQk8UGxhdGZvcm0NCisJCQlOYW1lPSJ4NjQiDQorCQkvPg0KKwkJPFBsYXRmb3JtDQorCQkJTmFtZT0iSXRhbml1bSINCisJCS8+DQorCTwvUGxhdGZvcm1zPg0KKwk8VG9vbEZpbGVzPg0KKwk8L1Rvb2xGaWxlcz4NCisJPENvbmZpZ3VyYXRpb25zPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJEZWJ1Z3xXaW4zMiINCisJCQlPdXRwdXREaXJlY3Rvcnk9Ing4NlxabGliU3RhdCQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0ieDg2XFpsaWJTdGF0JChDb25maWd1cmF0aW9uTmFtZSlcVG1wIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSI0Ig0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSJVcGdyYWRlRnJvbVZDNzAudnNwcm9wcyINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJT3B0aW1pemF0aW9uPSIwIg0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLjsuLlwuLlxtYXNteDg2Ig0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7WkxJQl9XSU5BUEk7X0NSVF9OT05TVERDX05PX0RFUFJFQ0FURTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7X0NSVF9OT05TVERDX05PX1dBUk5JTkdTIg0KKwkJCQlFeGNlcHRpb25IYW5kbGluZz0iMCINCisJCQkJUnVudGltZUxpYnJhcnk9IjEiDQorCQkJCUJ1ZmZlclNlY3VyaXR5Q2hlY2s9ImZhbHNlIg0KKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9IiQoSW50RGlyKS96bGlic3RhdC5wY2giDQorCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iJChJbnREaXIpXCINCisJCQkJT2JqZWN0RmlsZT0iJChJbnREaXIpXCINCisJCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9IiQoT3V0RGlyKVwiDQorCQkJCVdhcm5pbmdMZXZlbD0iMyINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCQlEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9InRydWUiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjEiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJCUN1bHR1cmU9IjEwMzYiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQorCQkJCUFkZGl0aW9uYWxPcHRpb25zPSIvTUFDSElORTpYODYgL05PREVGQVVMVExJQiINCisJCQkJT3V0cHV0RmlsZT0iJChPdXREaXIpXHpsaWJzdGF0LmxpYiINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iRGVidWd8eDY0Ig0KKwkJCU91dHB1dERpcmVjdG9yeT0ieDY0XFpsaWJTdGF0JChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSJ4NjRcWmxpYlN0YXQkKENvbmZpZ3VyYXRpb25OYW1lKVxUbXAiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjQiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IlVwZ3JhZGVGcm9tVkM3MC52c3Byb3BzIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJCVRhcmdldEVudmlyb25tZW50PSIzIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJT3B0aW1pemF0aW9uPSIwIg0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLjsuLlwuLlxtYXNteDg2Ig0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iWkxJQl9XSU5BUEk7X0NSVF9OT05TVERDX05PX0RFUFJFQ0FURTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7X0NSVF9OT05TVERDX05PX1dBUk5JTkdTO1dJTjY0Ig0KKwkJCQlFeGNlcHRpb25IYW5kbGluZz0iMCINCisJCQkJUnVudGltZUxpYnJhcnk9IjMiDQorCQkJCUJ1ZmZlclNlY3VyaXR5Q2hlY2s9ImZhbHNlIg0KKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9IiQoSW50RGlyKS96bGlic3RhdC5wY2giDQorCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iJChJbnREaXIpXCINCisJCQkJT2JqZWN0RmlsZT0iJChJbnREaXIpXCINCisJCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9IiQoT3V0RGlyKVwiDQorCQkJCVdhcm5pbmdMZXZlbD0iMyINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCQlEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9InRydWUiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjEiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJCUN1bHR1cmU9IjEwMzYiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQorCQkJCUFkZGl0aW9uYWxPcHRpb25zPSIvTUFDSElORTpBTUQ2NCAvTk9ERUZBVUxUTElCIg0KKwkJCQlPdXRwdXRGaWxlPSIkKE91dERpcilcemxpYnN0YXQubGliIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJEZWJ1Z3xJdGFuaXVtIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iaWE2NFxabGliU3RhdCQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iaWE2NFxabGliU3RhdCQoQ29uZmlndXJhdGlvbk5hbWUpXFRtcCINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iNCINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iVXBncmFkZUZyb21WQzcwLnZzcHJvcHMiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkJVGFyZ2V0RW52aXJvbm1lbnQ9IjIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlPcHRpbWl6YXRpb249IjAiDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXC4uOy4uXC4uXG1hc214ODYiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJaTElCX1dJTkFQSTtfQ1JUX05PTlNURENfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtfQ1JUX05PTlNURENfTk9fV0FSTklOR1M7V0lONjQiDQorCQkJCUV4Y2VwdGlvbkhhbmRsaW5nPSIwIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iMyINCisJCQkJQnVmZmVyU2VjdXJpdHlDaGVjaz0iZmFsc2UiDQorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iJChJbnREaXIpL3psaWJzdGF0LnBjaCINCisJCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIkKEludERpcilcIg0KKwkJCQlPYmplY3RGaWxlPSIkKEludERpcilcIg0KKwkJCQlQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iJChPdXREaXIpXCINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQorCQkJCURldGVjdDY0Qml0UG9ydGFiaWxpdHlQcm9ibGVtcz0idHJ1ZSINCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMSINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkJQ3VsdHVyZT0iMTAzNiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCisJCQkJQWRkaXRpb25hbE9wdGlvbnM9Ii9NQUNISU5FOklBNjQgL05PREVGQVVMVExJQiINCisJCQkJT3V0cHV0RmlsZT0iJChPdXREaXIpXHpsaWJzdGF0LmxpYiINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiINCisJCQlPdXRwdXREaXJlY3Rvcnk9Ing4NlxabGliU3RhdCQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0ieDg2XFpsaWJTdGF0JChDb25maWd1cmF0aW9uTmFtZSlcVG1wIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSI0Ig0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSJVcGdyYWRlRnJvbVZDNzAudnNwcm9wcyINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjEiDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXC4uOy4uXC4uXG1hc214ODYiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtaTElCX1dJTkFQSTtfQ1JUX05PTlNURENfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtfQ1JUX05PTlNURENfTk9fV0FSTklOR1M7QVNNVjtBU01JTkYiDQorCQkJCVN0cmluZ1Bvb2xpbmc9InRydWUiDQorCQkJCUV4Y2VwdGlvbkhhbmRsaW5nPSIwIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iMCINCisJCQkJQnVmZmVyU2VjdXJpdHlDaGVjaz0iZmFsc2UiDQorCQkJCUVuYWJsZUZ1bmN0aW9uTGV2ZWxMaW5raW5nPSJ0cnVlIg0KKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9IiQoSW50RGlyKS96bGlic3RhdC5wY2giDQorCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iJChJbnREaXIpXCINCisJCQkJT2JqZWN0RmlsZT0iJChJbnREaXIpXCINCisJCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9IiQoT3V0RGlyKVwiDQorCQkJCVdhcm5pbmdMZXZlbD0iMyINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCQlDdWx0dXJlPSIxMDM2Ig0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KKwkJCQlBZGRpdGlvbmFsT3B0aW9ucz0iL01BQ0hJTkU6WDg2IC9OT0RFRkFVTFRMSUIiDQorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9Ii4uXC4uXG1hc214ODZcbWF0Y2g2ODYub2JqIC4uXC4uXG1hc214ODZcaW5mZmFzMzIub2JqICINCisJCQkJT3V0cHV0RmlsZT0iJChPdXREaXIpXHpsaWJzdGF0LmxpYiINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iUmVsZWFzZXx4NjQiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSJ4NjRcWmxpYlN0YXQkKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ing2NFxabGliU3RhdCQoQ29uZmlndXJhdGlvbk5hbWUpXFRtcCINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iNCINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iVXBncmFkZUZyb21WQzcwLnZzcHJvcHMiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkJVGFyZ2V0RW52aXJvbm1lbnQ9IjMiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj0iMSINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5cLi47Li5cLi5cbWFzbXg4NiINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IlpMSUJfV0lOQVBJO19DUlRfTk9OU1REQ19OT19ERVBSRUNBVEU7X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFO19DUlRfTk9OU1REQ19OT19XQVJOSU5HUztBU01WO0FTTUlORjtXSU42NCINCisJCQkJU3RyaW5nUG9vbGluZz0idHJ1ZSINCisJCQkJRXhjZXB0aW9uSGFuZGxpbmc9IjAiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIyIg0KKwkJCQlCdWZmZXJTZWN1cml0eUNoZWNrPSJmYWxzZSINCisJCQkJRW5hYmxlRnVuY3Rpb25MZXZlbExpbmtpbmc9InRydWUiDQorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iJChJbnREaXIpL3psaWJzdGF0LnBjaCINCisJCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIkKEludERpcilcIg0KKwkJCQlPYmplY3RGaWxlPSIkKEludERpcilcIg0KKwkJCQlQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iJChPdXREaXIpXCINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJCUN1bHR1cmU9IjEwMzYiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQorCQkJCUFkZGl0aW9uYWxPcHRpb25zPSIvTUFDSElORTpBTUQ2NCAvTk9ERUZBVUxUTElCIg0KKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSIuLlwuLlxtYXNteDY0XGd2bWF0NjQub2JqIC4uXC4uXG1hc214NjRcaW5mZmFzeDY0Lm9iaiAiDQorCQkJCU91dHB1dEZpbGU9IiQoT3V0RGlyKVx6bGlic3RhdC5saWIiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2V8SXRhbml1bSINCisJCQlPdXRwdXREaXJlY3Rvcnk9ImlhNjRcWmxpYlN0YXQkKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9ImlhNjRcWmxpYlN0YXQkKENvbmZpZ3VyYXRpb25OYW1lKVxUbXAiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjQiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IlVwZ3JhZGVGcm9tVkM3MC52c3Byb3BzIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJCVRhcmdldEVudmlyb25tZW50PSIyIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjEiDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXC4uOy4uXC4uXG1hc214ODYiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJaTElCX1dJTkFQSTtfQ1JUX05PTlNURENfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtfQ1JUX05PTlNURENfTk9fV0FSTklOR1M7V0lONjQiDQorCQkJCVN0cmluZ1Bvb2xpbmc9InRydWUiDQorCQkJCUV4Y2VwdGlvbkhhbmRsaW5nPSIwIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iMiINCisJCQkJQnVmZmVyU2VjdXJpdHlDaGVjaz0iZmFsc2UiDQorCQkJCUVuYWJsZUZ1bmN0aW9uTGV2ZWxMaW5raW5nPSJ0cnVlIg0KKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9IiQoSW50RGlyKS96bGlic3RhdC5wY2giDQorCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iJChJbnREaXIpXCINCisJCQkJT2JqZWN0RmlsZT0iJChJbnREaXIpXCINCisJCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9IiQoT3V0RGlyKVwiDQorCQkJCVdhcm5pbmdMZXZlbD0iMyINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCQlDdWx0dXJlPSIxMDM2Ig0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KKwkJCQlBZGRpdGlvbmFsT3B0aW9ucz0iL01BQ0hJTkU6SUE2NCAvTk9ERUZBVUxUTElCIg0KKwkJCQlPdXRwdXRGaWxlPSIkKE91dERpcilcemxpYnN0YXQubGliIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlV2l0aG91dEFzbXxXaW4zMiINCisJCQlPdXRwdXREaXJlY3Rvcnk9Ing4NlxabGliU3RhdCQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0ieDg2XFpsaWJTdGF0JChDb25maWd1cmF0aW9uTmFtZSlcVG1wIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSI0Ig0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSJVcGdyYWRlRnJvbVZDNzAudnNwcm9wcyINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjEiDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXC4uOy4uXC4uXG1hc214ODYiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtaTElCX1dJTkFQSTtfQ1JUX05PTlNURENfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtfQ1JUX05PTlNURENfTk9fV0FSTklOR1MiDQorCQkJCVN0cmluZ1Bvb2xpbmc9InRydWUiDQorCQkJCUV4Y2VwdGlvbkhhbmRsaW5nPSIwIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iMCINCisJCQkJQnVmZmVyU2VjdXJpdHlDaGVjaz0iZmFsc2UiDQorCQkJCUVuYWJsZUZ1bmN0aW9uTGV2ZWxMaW5raW5nPSJ0cnVlIg0KKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9IiQoSW50RGlyKS96bGlic3RhdC5wY2giDQorCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iJChJbnREaXIpXCINCisJCQkJT2JqZWN0RmlsZT0iJChJbnREaXIpXCINCisJCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9IiQoT3V0RGlyKVwiDQorCQkJCVdhcm5pbmdMZXZlbD0iMyINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCQlDdWx0dXJlPSIxMDM2Ig0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KKwkJCQlBZGRpdGlvbmFsT3B0aW9ucz0iL01BQ0hJTkU6WDg2IC9OT0RFRkFVTFRMSUIiDQorCQkJCU91dHB1dEZpbGU9IiQoT3V0RGlyKVx6bGlic3RhdC5saWIiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2VXaXRob3V0QXNtfHg2NCINCisJCQlPdXRwdXREaXJlY3Rvcnk9Ing2NFxabGliU3RhdCQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0ieDY0XFpsaWJTdGF0JChDb25maWd1cmF0aW9uTmFtZSlcVG1wIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSI0Ig0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSJVcGdyYWRlRnJvbVZDNzAudnNwcm9wcyINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCQlUYXJnZXRFbnZpcm9ubWVudD0iMyINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUlubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIxIg0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLjsuLlwuLlxtYXNteDg2Ig0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iWkxJQl9XSU5BUEk7X0NSVF9OT05TVERDX05PX0RFUFJFQ0FURTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7X0NSVF9OT05TVERDX05PX1dBUk5JTkdTO1dJTjY0Ig0KKwkJCQlTdHJpbmdQb29saW5nPSJ0cnVlIg0KKwkJCQlFeGNlcHRpb25IYW5kbGluZz0iMCINCisJCQkJUnVudGltZUxpYnJhcnk9IjIiDQorCQkJCUJ1ZmZlclNlY3VyaXR5Q2hlY2s9ImZhbHNlIg0KKwkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0idHJ1ZSINCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIkKEludERpcikvemxpYnN0YXQucGNoIg0KKwkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249IiQoSW50RGlyKVwiDQorCQkJCU9iamVjdEZpbGU9IiQoSW50RGlyKVwiDQorCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIkKE91dERpcilcIg0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkJQ3VsdHVyZT0iMTAzNiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCisJCQkJQWRkaXRpb25hbE9wdGlvbnM9Ii9NQUNISU5FOkFNRDY0IC9OT0RFRkFVTFRMSUIiDQorCQkJCU91dHB1dEZpbGU9IiQoT3V0RGlyKVx6bGlic3RhdC5saWIiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2VXaXRob3V0QXNtfEl0YW5pdW0iDQorCQkJT3V0cHV0RGlyZWN0b3J5PSJpYTY0XFpsaWJTdGF0JChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSJpYTY0XFpsaWJTdGF0JChDb25maWd1cmF0aW9uTmFtZSlcVG1wIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSI0Ig0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSJVcGdyYWRlRnJvbVZDNzAudnNwcm9wcyINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCQlUYXJnZXRFbnZpcm9ubWVudD0iMiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUlubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIxIg0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLjsuLlwuLlxtYXNteDg2Ig0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iWkxJQl9XSU5BUEk7X0NSVF9OT05TVERDX05PX0RFUFJFQ0FURTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7X0NSVF9OT05TVERDX05PX1dBUk5JTkdTO1dJTjY0Ig0KKwkJCQlTdHJpbmdQb29saW5nPSJ0cnVlIg0KKwkJCQlFeGNlcHRpb25IYW5kbGluZz0iMCINCisJCQkJUnVudGltZUxpYnJhcnk9IjIiDQorCQkJCUJ1ZmZlclNlY3VyaXR5Q2hlY2s9ImZhbHNlIg0KKwkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0idHJ1ZSINCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIkKEludERpcikvemxpYnN0YXQucGNoIg0KKwkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249IiQoSW50RGlyKVwiDQorCQkJCU9iamVjdEZpbGU9IiQoSW50RGlyKVwiDQorCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIkKE91dERpcilcIg0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkJQ3VsdHVyZT0iMTAzNiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCisJCQkJQWRkaXRpb25hbE9wdGlvbnM9Ii9NQUNISU5FOklBNjQgL05PREVGQVVMVExJQiINCisJCQkJT3V0cHV0RmlsZT0iJChPdXREaXIpXHpsaWJzdGF0LmxpYiINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJPC9Db25maWd1cmF0aW9ucz4NCisJPFJlZmVyZW5jZXM+DQorCTwvUmVmZXJlbmNlcz4NCisJPEZpbGVzPg0KKwkJPEZpbHRlcg0KKwkJCU5hbWU9IlNvdXJjZSBGaWxlcyINCisJCQk+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxhZGxlcjMyLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxjb21wcmVzcy5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cY3JjMzIuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXGRlZmxhdGUuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXGd6Y2xvc2UuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXGd6Z3V0cy5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cZ3psaWIuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXGd6cmVhZC5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cZ3p3cml0ZS5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5caW5mYmFjay5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cbWFzbXg2NFxpbmZmYXM4NjY0LmMiDQorCQkJCT4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJEZWJ1Z3xXaW4zMiINCisJCQkJCUV4Y2x1ZGVkRnJvbUJ1aWxkPSJ0cnVlIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJEZWJ1Z3xJdGFuaXVtIg0KKwkJCQkJRXhjbHVkZWRGcm9tQnVpbGQ9InRydWUiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiDQorCQkJCQlFeGNsdWRlZEZyb21CdWlsZD0idHJ1ZSINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iUmVsZWFzZXxJdGFuaXVtIg0KKwkJCQkJRXhjbHVkZWRGcm9tQnVpbGQ9InRydWUiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IlJlbGVhc2VXaXRob3V0QXNtfFdpbjMyIg0KKwkJCQkJRXhjbHVkZWRGcm9tQnVpbGQ9InRydWUiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IlJlbGVhc2VXaXRob3V0QXNtfEl0YW5pdW0iDQorCQkJCQlFeGNsdWRlZEZyb21CdWlsZD0idHJ1ZSINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5caW5mZmFzdC5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5caW5mbGF0ZS5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5caW5mdHJlZXMuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXG1pbml6aXBcaW9hcGkuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHRyZWVzLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlx1bmNvbXByLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxtaW5pemlwXHVuemlwLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxtaW5pemlwXHppcC5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLlx6bGliLnJjIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLlx6bGlidmMuZGVmIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cenV0aWwuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCTwvRmlsdGVyPg0KKwk8L0ZpbGVzPg0KKwk8R2xvYmFscz4NCisJPC9HbG9iYWxzPg0KKzwvVmlzdWFsU3R1ZGlvUHJvamVjdD4NCmRpZmYgLS1naXQgYS96bGliLTEuMi42L2NvbnRyaWIvdnN0dWRpby92YzkvemxpYnZjLmRlZiBiL3psaWItMS4yLjYvY29udHJpYi92c3R1ZGlvL3ZjOS96bGlidmMuZGVmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3MWIwYTYKLS0tIC9kZXYvbnVsbAorKysgYi96bGliLTEuMi42L2NvbnRyaWIvdnN0dWRpby92YzkvemxpYnZjLmRlZgpAQCAtMCwwICsxLDEzNyBAQAorTElCUkFSWQ0KKzsgemxpYiBkYXRhIGNvbXByZXNzaW9uIGFuZCBaSVAgZmlsZSBJL08gbGlicmFyeQ0KKw0KK1ZFUlNJT04JCTEuMjQNCisNCitFWFBPUlRTDQorICAgICAgICBhZGxlcjMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAxDQorICAgICAgICBjb21wcmVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAyDQorICAgICAgICBjcmMzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAzDQorICAgICAgICBkZWZsYXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEA0DQorICAgICAgICBkZWZsYXRlQ29weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEA1DQorICAgICAgICBkZWZsYXRlRW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEA2DQorICAgICAgICBkZWZsYXRlSW5pdDJfICAgICAgICAgICAgICAgICAgICAgICAgICAgIEA3DQorICAgICAgICBkZWZsYXRlSW5pdF8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEA4DQorICAgICAgICBkZWZsYXRlUGFyYW1zICAgICAgICAgICAgICAgICAgICAgICAgICAgIEA5DQorICAgICAgICBkZWZsYXRlUmVzZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAxMA0KKyAgICAgICAgZGVmbGF0ZVNldERpY3Rpb25hcnkgICAgICAgICAgICAgICAgICAgICBAMTENCisgICAgICAgIGd6Y2xvc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDEyDQorICAgICAgICBnemRvcGVuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAxMw0KKyAgICAgICAgZ3plcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMTQNCisgICAgICAgIGd6Zmx1c2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDE1DQorICAgICAgICBnem9wZW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAxNg0KKyAgICAgICAgZ3pyZWFkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMTcNCisgICAgICAgIGd6d3JpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDE4DQorICAgICAgICBpbmZsYXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAxOQ0KKyAgICAgICAgaW5mbGF0ZUVuZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMjANCisgICAgICAgIGluZmxhdGVJbml0Ml8gICAgICAgICAgICAgICAgICAgICAgICAgICAgQDIxDQorICAgICAgICBpbmZsYXRlSW5pdF8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAyMg0KKyAgICAgICAgaW5mbGF0ZVJlc2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMjMNCisgICAgICAgIGluZmxhdGVTZXREaWN0aW9uYXJ5ICAgICAgICAgICAgICAgICAgICAgQDI0DQorICAgICAgICBpbmZsYXRlU3luYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAyNQ0KKyAgICAgICAgdW5jb21wcmVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMjYNCisgICAgICAgIHpsaWJWZXJzaW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDI3DQorICAgICAgICBnenByaW50ZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAyOA0KKyAgICAgICAgZ3pwdXRjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMjkNCisgICAgICAgIGd6Z2V0YyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDMwDQorICAgICAgICBnenNlZWsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAzMQ0KKyAgICAgICAgZ3pyZXdpbmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMzINCisgICAgICAgIGd6dGVsbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDMzDQorICAgICAgICBnemVvZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAzNA0KKyAgICAgICAgZ3pzZXRwYXJhbXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMzUNCisgICAgICAgIHpFcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDM2DQorICAgICAgICBpbmZsYXRlU3luY1BvaW50ICAgICAgICAgICAgICAgICAgICAgICAgIEAzNw0KKyAgICAgICAgZ2V0X2NyY190YWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMzgNCisgICAgICAgIGNvbXByZXNzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDM5DQorICAgICAgICBnenB1dHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEA0MA0KKyAgICAgICAgZ3pnZXRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBANDENCisgICAgICAgIGluZmxhdGVDb3B5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDQyDQorICAgICAgICBpbmZsYXRlQmFja0luaXRfICAgICAgICAgICAgICAgICAgICAgICAgIEA0Mw0KKyAgICAgICAgaW5mbGF0ZUJhY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBANDQNCisgICAgICAgIGluZmxhdGVCYWNrRW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgQDQ1DQorICAgICAgICBjb21wcmVzc0JvdW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgIEA0Ng0KKyAgICAgICAgZGVmbGF0ZUJvdW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICBANDcNCisgICAgICAgIGd6Y2xlYXJlcnIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDQ4DQorICAgICAgICBnenVuZ2V0YyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEA0OQ0KKyAgICAgICAgemxpYkNvbXBpbGVGbGFncyAgICAgICAgICAgICAgICAgICAgICAgICBANTANCisgICAgICAgIGRlZmxhdGVQcmltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDUxDQorICAgICAgICBkZWZsYXRlUGVuZGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgIEA1Mg0KKw0KKyAgICAgICAgdW56T3BlbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBANjENCisgICAgICAgIHVuekNsb3NlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDYyDQorICAgICAgICB1bnpHZXRHbG9iYWxJbmZvICAgICAgICAgICAgICAgICAgICAgICAgIEA2Mw0KKyAgICAgICAgdW56R2V0Q3VycmVudEZpbGVJbmZvICAgICAgICAgICAgICAgICAgICBANjQNCisgICAgICAgIHVuekdvVG9GaXJzdEZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgQDY1DQorICAgICAgICB1bnpHb1RvTmV4dEZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgIEA2Ng0KKyAgICAgICAgdW56T3BlbkN1cnJlbnRGaWxlICAgICAgICAgICAgICAgICAgICAgICBANjcNCisgICAgICAgIHVuelJlYWRDdXJyZW50RmlsZSAgICAgICAgICAgICAgICAgICAgICAgQDY4DQorICAgICAgICB1bnpPcGVuQ3VycmVudEZpbGUzICAgICAgICAgICAgICAgICAgICAgIEA2OQ0KKyAgICAgICAgdW56dGVsbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBANzANCisgICAgICAgIHVuemVvZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDcxDQorICAgICAgICB1bnpDbG9zZUN1cnJlbnRGaWxlICAgICAgICAgICAgICAgICAgICAgIEA3Mg0KKyAgICAgICAgdW56R2V0R2xvYmFsQ29tbWVudCAgICAgICAgICAgICAgICAgICAgICBANzMNCisgICAgICAgIHVuelN0cmluZ0ZpbGVOYW1lQ29tcGFyZSAgICAgICAgICAgICAgICAgQDc0DQorICAgICAgICB1bnpMb2NhdGVGaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgIEA3NQ0KKyAgICAgICAgdW56R2V0TG9jYWxFeHRyYWZpZWxkICAgICAgICAgICAgICAgICAgICBANzYNCisgICAgICAgIHVuek9wZW4yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDc3DQorICAgICAgICB1bnpPcGVuQ3VycmVudEZpbGUyICAgICAgICAgICAgICAgICAgICAgIEA3OA0KKyAgICAgICAgdW56T3BlbkN1cnJlbnRGaWxlUGFzc3dvcmQgICAgICAgICAgICAgICBANzkNCisNCisgICAgICAgIHppcE9wZW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDgwDQorICAgICAgICB6aXBPcGVuTmV3RmlsZUluWmlwICAgICAgICAgICAgICAgICAgICAgIEA4MQ0KKyAgICAgICAgemlwV3JpdGVJbkZpbGVJblppcCAgICAgICAgICAgICAgICAgICAgICBAODINCisgICAgICAgIHppcENsb3NlRmlsZUluWmlwICAgICAgICAgICAgICAgICAgICAgICAgQDgzDQorICAgICAgICB6aXBDbG9zZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEA4NA0KKyAgICAgICAgemlwT3Blbk5ld0ZpbGVJblppcDIgICAgICAgICAgICAgICAgICAgICBAODYNCisgICAgICAgIHppcENsb3NlRmlsZUluWmlwUmF3ICAgICAgICAgICAgICAgICAgICAgQDg3DQorICAgICAgICB6aXBPcGVuMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEA4OA0KKyAgICAgICAgemlwT3Blbk5ld0ZpbGVJblppcDMgICAgICAgICAgICAgICAgICAgICBAODkNCisNCisgICAgICAgIHVuekdldEZpbGVQb3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDEwMA0KKyAgICAgICAgdW56R29Ub0ZpbGVQb3MgICAgICAgICAgICAgICAgICAgICAgICAgICBAMTAxDQorDQorICAgICAgICBmaWxsX3dpbjMyX2ZpbGVmdW5jICAgICAgICAgICAgICAgICAgICAgIEAxMTANCisNCis7IHpsaWJ3YXBpIHYxLjIuNCBhZGRlZDoNCisgICAgICAgIGZpbGxfd2luMzJfZmlsZWZ1bmM2NCAgICAgICAgICAgICAgICAgICBAMTExDQorICAgICAgICBmaWxsX3dpbjMyX2ZpbGVmdW5jNjRBICAgICAgICAgICAgICAgICAgQDExMg0KKyAgICAgICAgZmlsbF93aW4zMl9maWxlZnVuYzY0VyAgICAgICAgICAgICAgICAgIEAxMTMNCisNCisgICAgICAgIHVuek9wZW42NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMTIwDQorICAgICAgICB1bnpPcGVuMl82NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDEyMQ0KKyAgICAgICAgdW56R2V0R2xvYmFsSW5mbzY0ICAgICAgICAgICAgICAgICAgICAgIEAxMjINCisgICAgICAgIHVuekdldEN1cnJlbnRGaWxlSW5mbzY0ICAgICAgICAgICAgICAgICBAMTI0DQorICAgICAgICB1bnpHZXRDdXJyZW50RmlsZVpTdHJlYW1Qb3M2NCAgICAgICAgICAgQDEyNQ0KKyAgICAgICAgdW56dGVsbDY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAxMjYNCisgICAgICAgIHVuekdldEZpbGVQb3M2NCAgICAgICAgICAgICAgICAgICAgICAgICBAMTI3DQorICAgICAgICB1bnpHb1RvRmlsZVBvczY0ICAgICAgICAgICAgICAgICAgICAgICAgQDEyOA0KKw0KKyAgICAgICAgemlwT3BlbjY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAxMzANCisgICAgICAgIHppcE9wZW4yXzY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMTMxDQorICAgICAgICB6aXBPcGVuTmV3RmlsZUluWmlwNjQgICAgICAgICAgICAgICAgICAgQDEzMg0KKyAgICAgICAgemlwT3Blbk5ld0ZpbGVJblppcDJfNjQgICAgICAgICAgICAgICAgIEAxMzMNCisgICAgICAgIHppcE9wZW5OZXdGaWxlSW5aaXAzXzY0ICAgICAgICAgICAgICAgICBAMTM0DQorICAgICAgICB6aXBPcGVuTmV3RmlsZUluWmlwNF82NCAgICAgICAgICAgICAgICAgQDEzNQ0KKyAgICAgICAgemlwQ2xvc2VGaWxlSW5aaXBSYXc2NCAgICAgICAgICAgICAgICAgIEAxMzYNCisNCis7IHpsaWIxIHYxLjIuNCBhZGRlZDoNCisgICAgICAgIGFkbGVyMzJfY29tYmluZSAgICAgICAgICAgICAgICAgICAgICAgICBAMTQwDQorICAgICAgICBjcmMzMl9jb21iaW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgQDE0Mg0KKyAgICAgICAgZGVmbGF0ZVNldEhlYWRlciAgICAgICAgICAgICAgICAgICAgICAgIEAxNDQNCisgICAgICAgIGRlZmxhdGVUdW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMTQ1DQorICAgICAgICBnemJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDE0Ng0KKyAgICAgICAgZ3pjbG9zZV9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAxNDcNCisgICAgICAgIGd6Y2xvc2VfdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMTQ4DQorICAgICAgICBnemRpcmVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDE0OQ0KKyAgICAgICAgZ3pvZmZzZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAxNTANCisgICAgICAgIGluZmxhdGVHZXRIZWFkZXIgICAgICAgICAgICAgICAgICAgICAgICBAMTU2DQorICAgICAgICBpbmZsYXRlTWFyayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDE1Nw0KKyAgICAgICAgaW5mbGF0ZVByaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAxNTgNCisgICAgICAgIGluZmxhdGVSZXNldDIgICAgICAgICAgICAgICAgICAgICAgICAgICBAMTU5DQorICAgICAgICBpbmZsYXRlVW5kZXJtaW5lICAgICAgICAgICAgICAgICAgICAgICAgQDE2MA0KKw0KKzsgemxpYjEgdjEuMi42IGFkZGVkOg0KKyAgICAgICAgZ3pnZXRjXyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAxNjENCisgICAgICAgIGd6ZmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAMTYyDQorICAgICAgICBpbmZsYXRlUmVzZXRLZWVwICAgICAgICAgICAgICAgICAgICAgICAgQDE2Mw0KKwlkZWZsYXRlUmVzZXRLZWVwCQkJQDE2NApkaWZmIC0tZ2l0IGEvemxpYi0xLjIuNi9jb250cmliL3ZzdHVkaW8vdmM5L3psaWJ2Yy5zbG4gYi96bGliLTEuMi42L2NvbnRyaWIvdnN0dWRpby92YzkvemxpYnZjLnNsbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDgyOTY3Ci0tLSAvZGV2L251bGwKKysrIGIvemxpYi0xLjIuNi9jb250cmliL3ZzdHVkaW8vdmM5L3psaWJ2Yy5zbG4KQEAgLTAsMCArMSwxNDQgQEAKK++7vw0KK01pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIFNvbHV0aW9uIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDEwLjAwDQorIyBWaXN1YWwgU3R1ZGlvIDIwMDgNCitQcm9qZWN0KCJ7OEJDOUNFQjgtOEI0QS0xMUQwLThEMTEtMDBBMEM5MUJDOTQyfSIpID0gInpsaWJ2YyIsICJ6bGlidmMudmNwcm9qIiwgIns4RkQ4MjZGOC0zNzM5LTQ0RTYtOENDOC05OTcxMjJFNTNCOER9Ig0KK0VuZFByb2plY3QNCitQcm9qZWN0KCJ7OEJDOUNFQjgtOEI0QS0xMUQwLThEMTEtMDBBMEM5MUJDOTQyfSIpID0gInpsaWJzdGF0IiwgInpsaWJzdGF0LnZjcHJvaiIsICJ7NzQ1REVDNTgtRUJCMy00N0E5LUE5QjgtNEM2NjI3QzAxQkY4fSINCitFbmRQcm9qZWN0DQorUHJvamVjdCgiezhCQzlDRUI4LThCNEEtMTFEMC04RDExLTAwQTBDOTFCQzk0Mn0iKSA9ICJ0ZXN0emxpYiIsICJ0ZXN0emxpYi52Y3Byb2oiLCAie0FBNjY2NkFBLUUwOUYtNDEzNS05QzBDLTRGRTUwQzNDNjU0Qn0iDQorRW5kUHJvamVjdA0KK1Byb2plY3QoIns4QkM5Q0VCOC04QjRBLTExRDAtOEQxMS0wMEEwQzkxQkM5NDJ9IikgPSAiVGVzdFpsaWJEbGwiLCAidGVzdHpsaWJkbGwudmNwcm9qIiwgIntDNTJGOUU3Qi00OThBLTQyQkUtOERCNC04NUExNTY5NDM2NkF9Ig0KKwlQcm9qZWN0U2VjdGlvbihQcm9qZWN0RGVwZW5kZW5jaWVzKSA9IHBvc3RQcm9qZWN0DQorCQl7OEZEODI2RjgtMzczOS00NEU2LThDQzgtOTk3MTIyRTUzQjhEfSA9IHs4RkQ4MjZGOC0zNzM5LTQ0RTYtOENDOC05OTcxMjJFNTNCOER9DQorCUVuZFByb2plY3RTZWN0aW9uDQorRW5kUHJvamVjdA0KK1Byb2plY3QoIns4QkM5Q0VCOC04QjRBLTExRDAtOEQxMS0wMEEwQzkxQkM5NDJ9IikgPSAibWluaXppcCIsICJtaW5pemlwLnZjcHJvaiIsICJ7NDhDREQ5REMtRTA5Ri00MTM1LTlDMEMtNEZFNTBDM0M2NTRCfSINCisJUHJvamVjdFNlY3Rpb24oUHJvamVjdERlcGVuZGVuY2llcykgPSBwb3N0UHJvamVjdA0KKwkJezhGRDgyNkY4LTM3MzktNDRFNi04Q0M4LTk5NzEyMkU1M0I4RH0gPSB7OEZEODI2RjgtMzczOS00NEU2LThDQzgtOTk3MTIyRTUzQjhEfQ0KKwlFbmRQcm9qZWN0U2VjdGlvbg0KK0VuZFByb2plY3QNCitQcm9qZWN0KCJ7OEJDOUNFQjgtOEI0QS0xMUQwLThEMTEtMDBBMEM5MUJDOTQyfSIpID0gIm1pbml1bnoiLCAibWluaXVuei52Y3Byb2oiLCAie0M1MkY5RTdCLTQ5OEEtNDJCRS04REI0LTg1QTE1Njk0MzgyQX0iDQorCVByb2plY3RTZWN0aW9uKFByb2plY3REZXBlbmRlbmNpZXMpID0gcG9zdFByb2plY3QNCisJCXs4RkQ4MjZGOC0zNzM5LTQ0RTYtOENDOC05OTcxMjJFNTNCOER9ID0gezhGRDgyNkY4LTM3MzktNDRFNi04Q0M4LTk5NzEyMkU1M0I4RH0NCisJRW5kUHJvamVjdFNlY3Rpb24NCitFbmRQcm9qZWN0DQorR2xvYmFsDQorCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Db25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHByZVNvbHV0aW9uDQorCQlEZWJ1Z3xJdGFuaXVtID0gRGVidWd8SXRhbml1bQ0KKwkJRGVidWd8V2luMzIgPSBEZWJ1Z3xXaW4zMg0KKwkJRGVidWd8eDY0ID0gRGVidWd8eDY0DQorCQlSZWxlYXNlfEl0YW5pdW0gPSBSZWxlYXNlfEl0YW5pdW0NCisJCVJlbGVhc2V8V2luMzIgPSBSZWxlYXNlfFdpbjMyDQorCQlSZWxlYXNlfHg2NCA9IFJlbGVhc2V8eDY0DQorCQlSZWxlYXNlV2l0aG91dEFzbXxJdGFuaXVtID0gUmVsZWFzZVdpdGhvdXRBc218SXRhbml1bQ0KKwkJUmVsZWFzZVdpdGhvdXRBc218V2luMzIgPSBSZWxlYXNlV2l0aG91dEFzbXxXaW4zMg0KKwkJUmVsZWFzZVdpdGhvdXRBc218eDY0ID0gUmVsZWFzZVdpdGhvdXRBc218eDY0DQorCUVuZEdsb2JhbFNlY3Rpb24NCisJR2xvYmFsU2VjdGlvbihQcm9qZWN0Q29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwb3N0U29sdXRpb24NCisJCXs4RkQ4MjZGOC0zNzM5LTQ0RTYtOENDOC05OTcxMjJFNTNCOER9LkRlYnVnfEl0YW5pdW0uQWN0aXZlQ2ZnID0gRGVidWd8SXRhbml1bQ0KKwkJezhGRDgyNkY4LTM3MzktNDRFNi04Q0M4LTk5NzEyMkU1M0I4RH0uRGVidWd8SXRhbml1bS5CdWlsZC4wID0gRGVidWd8SXRhbml1bQ0KKwkJezhGRDgyNkY4LTM3MzktNDRFNi04Q0M4LTk5NzEyMkU1M0I4RH0uRGVidWd8V2luMzIuQWN0aXZlQ2ZnID0gRGVidWd8V2luMzINCisJCXs4RkQ4MjZGOC0zNzM5LTQ0RTYtOENDOC05OTcxMjJFNTNCOER9LkRlYnVnfFdpbjMyLkJ1aWxkLjAgPSBEZWJ1Z3xXaW4zMg0KKwkJezhGRDgyNkY4LTM3MzktNDRFNi04Q0M4LTk5NzEyMkU1M0I4RH0uRGVidWd8eDY0LkFjdGl2ZUNmZyA9IERlYnVnfHg2NA0KKwkJezhGRDgyNkY4LTM3MzktNDRFNi04Q0M4LTk5NzEyMkU1M0I4RH0uRGVidWd8eDY0LkJ1aWxkLjAgPSBEZWJ1Z3x4NjQNCisJCXs4RkQ4MjZGOC0zNzM5LTQ0RTYtOENDOC05OTcxMjJFNTNCOER9LlJlbGVhc2V8SXRhbml1bS5BY3RpdmVDZmcgPSBSZWxlYXNlfEl0YW5pdW0NCisJCXs4RkQ4MjZGOC0zNzM5LTQ0RTYtOENDOC05OTcxMjJFNTNCOER9LlJlbGVhc2V8SXRhbml1bS5CdWlsZC4wID0gUmVsZWFzZXxJdGFuaXVtDQorCQl7OEZEODI2RjgtMzczOS00NEU2LThDQzgtOTk3MTIyRTUzQjhEfS5SZWxlYXNlfFdpbjMyLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzINCisJCXs4RkQ4MjZGOC0zNzM5LTQ0RTYtOENDOC05OTcxMjJFNTNCOER9LlJlbGVhc2V8V2luMzIuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzINCisJCXs4RkQ4MjZGOC0zNzM5LTQ0RTYtOENDOC05OTcxMjJFNTNCOER9LlJlbGVhc2V8eDY0LkFjdGl2ZUNmZyA9IFJlbGVhc2V8eDY0DQorCQl7OEZEODI2RjgtMzczOS00NEU2LThDQzgtOTk3MTIyRTUzQjhEfS5SZWxlYXNlfHg2NC5CdWlsZC4wID0gUmVsZWFzZXx4NjQNCisJCXs4RkQ4MjZGOC0zNzM5LTQ0RTYtOENDOC05OTcxMjJFNTNCOER9LlJlbGVhc2VXaXRob3V0QXNtfEl0YW5pdW0uQWN0aXZlQ2ZnID0gUmVsZWFzZVdpdGhvdXRBc218SXRhbml1bQ0KKwkJezhGRDgyNkY4LTM3MzktNDRFNi04Q0M4LTk5NzEyMkU1M0I4RH0uUmVsZWFzZVdpdGhvdXRBc218SXRhbml1bS5CdWlsZC4wID0gUmVsZWFzZVdpdGhvdXRBc218SXRhbml1bQ0KKwkJezhGRDgyNkY4LTM3MzktNDRFNi04Q0M4LTk5NzEyMkU1M0I4RH0uUmVsZWFzZVdpdGhvdXRBc218V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZVdpdGhvdXRBc218V2luMzINCisJCXs4RkQ4MjZGOC0zNzM5LTQ0RTYtOENDOC05OTcxMjJFNTNCOER9LlJlbGVhc2VXaXRob3V0QXNtfFdpbjMyLkJ1aWxkLjAgPSBSZWxlYXNlV2l0aG91dEFzbXxXaW4zMg0KKwkJezhGRDgyNkY4LTM3MzktNDRFNi04Q0M4LTk5NzEyMkU1M0I4RH0uUmVsZWFzZVdpdGhvdXRBc218eDY0LkFjdGl2ZUNmZyA9IFJlbGVhc2VXaXRob3V0QXNtfHg2NA0KKwkJezhGRDgyNkY4LTM3MzktNDRFNi04Q0M4LTk5NzEyMkU1M0I4RH0uUmVsZWFzZVdpdGhvdXRBc218eDY0LkJ1aWxkLjAgPSBSZWxlYXNlV2l0aG91dEFzbXx4NjQNCisJCXs3NDVERUM1OC1FQkIzLTQ3QTktQTlCOC00QzY2MjdDMDFCRjh9LkRlYnVnfEl0YW5pdW0uQWN0aXZlQ2ZnID0gRGVidWd8SXRhbml1bQ0KKwkJezc0NURFQzU4LUVCQjMtNDdBOS1BOUI4LTRDNjYyN0MwMUJGOH0uRGVidWd8SXRhbml1bS5CdWlsZC4wID0gRGVidWd8SXRhbml1bQ0KKwkJezc0NURFQzU4LUVCQjMtNDdBOS1BOUI4LTRDNjYyN0MwMUJGOH0uRGVidWd8V2luMzIuQWN0aXZlQ2ZnID0gRGVidWd8V2luMzINCisJCXs3NDVERUM1OC1FQkIzLTQ3QTktQTlCOC00QzY2MjdDMDFCRjh9LkRlYnVnfFdpbjMyLkJ1aWxkLjAgPSBEZWJ1Z3xXaW4zMg0KKwkJezc0NURFQzU4LUVCQjMtNDdBOS1BOUI4LTRDNjYyN0MwMUJGOH0uRGVidWd8eDY0LkFjdGl2ZUNmZyA9IERlYnVnfHg2NA0KKwkJezc0NURFQzU4LUVCQjMtNDdBOS1BOUI4LTRDNjYyN0MwMUJGOH0uRGVidWd8eDY0LkJ1aWxkLjAgPSBEZWJ1Z3x4NjQNCisJCXs3NDVERUM1OC1FQkIzLTQ3QTktQTlCOC00QzY2MjdDMDFCRjh9LlJlbGVhc2V8SXRhbml1bS5BY3RpdmVDZmcgPSBSZWxlYXNlfEl0YW5pdW0NCisJCXs3NDVERUM1OC1FQkIzLTQ3QTktQTlCOC00QzY2MjdDMDFCRjh9LlJlbGVhc2V8SXRhbml1bS5CdWlsZC4wID0gUmVsZWFzZXxJdGFuaXVtDQorCQl7NzQ1REVDNTgtRUJCMy00N0E5LUE5QjgtNEM2NjI3QzAxQkY4fS5SZWxlYXNlfFdpbjMyLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzINCisJCXs3NDVERUM1OC1FQkIzLTQ3QTktQTlCOC00QzY2MjdDMDFCRjh9LlJlbGVhc2V8V2luMzIuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzINCisJCXs3NDVERUM1OC1FQkIzLTQ3QTktQTlCOC00QzY2MjdDMDFCRjh9LlJlbGVhc2V8eDY0LkFjdGl2ZUNmZyA9IFJlbGVhc2V8eDY0DQorCQl7NzQ1REVDNTgtRUJCMy00N0E5LUE5QjgtNEM2NjI3QzAxQkY4fS5SZWxlYXNlfHg2NC5CdWlsZC4wID0gUmVsZWFzZXx4NjQNCisJCXs3NDVERUM1OC1FQkIzLTQ3QTktQTlCOC00QzY2MjdDMDFCRjh9LlJlbGVhc2VXaXRob3V0QXNtfEl0YW5pdW0uQWN0aXZlQ2ZnID0gUmVsZWFzZVdpdGhvdXRBc218SXRhbml1bQ0KKwkJezc0NURFQzU4LUVCQjMtNDdBOS1BOUI4LTRDNjYyN0MwMUJGOH0uUmVsZWFzZVdpdGhvdXRBc218SXRhbml1bS5CdWlsZC4wID0gUmVsZWFzZVdpdGhvdXRBc218SXRhbml1bQ0KKwkJezc0NURFQzU4LUVCQjMtNDdBOS1BOUI4LTRDNjYyN0MwMUJGOH0uUmVsZWFzZVdpdGhvdXRBc218V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZVdpdGhvdXRBc218V2luMzINCisJCXs3NDVERUM1OC1FQkIzLTQ3QTktQTlCOC00QzY2MjdDMDFCRjh9LlJlbGVhc2VXaXRob3V0QXNtfFdpbjMyLkJ1aWxkLjAgPSBSZWxlYXNlV2l0aG91dEFzbXxXaW4zMg0KKwkJezc0NURFQzU4LUVCQjMtNDdBOS1BOUI4LTRDNjYyN0MwMUJGOH0uUmVsZWFzZVdpdGhvdXRBc218eDY0LkFjdGl2ZUNmZyA9IFJlbGVhc2VXaXRob3V0QXNtfHg2NA0KKwkJezc0NURFQzU4LUVCQjMtNDdBOS1BOUI4LTRDNjYyN0MwMUJGOH0uUmVsZWFzZVdpdGhvdXRBc218eDY0LkJ1aWxkLjAgPSBSZWxlYXNlV2l0aG91dEFzbXx4NjQNCisJCXtBQTY2NjZBQS1FMDlGLTQxMzUtOUMwQy00RkU1MEMzQzY1NEJ9LkRlYnVnfEl0YW5pdW0uQWN0aXZlQ2ZnID0gRGVidWd8SXRhbml1bQ0KKwkJe0FBNjY2NkFBLUUwOUYtNDEzNS05QzBDLTRGRTUwQzNDNjU0Qn0uRGVidWd8SXRhbml1bS5CdWlsZC4wID0gRGVidWd8SXRhbml1bQ0KKwkJe0FBNjY2NkFBLUUwOUYtNDEzNS05QzBDLTRGRTUwQzNDNjU0Qn0uRGVidWd8V2luMzIuQWN0aXZlQ2ZnID0gRGVidWd8V2luMzINCisJCXtBQTY2NjZBQS1FMDlGLTQxMzUtOUMwQy00RkU1MEMzQzY1NEJ9LkRlYnVnfFdpbjMyLkJ1aWxkLjAgPSBEZWJ1Z3xXaW4zMg0KKwkJe0FBNjY2NkFBLUUwOUYtNDEzNS05QzBDLTRGRTUwQzNDNjU0Qn0uRGVidWd8eDY0LkFjdGl2ZUNmZyA9IERlYnVnfHg2NA0KKwkJe0FBNjY2NkFBLUUwOUYtNDEzNS05QzBDLTRGRTUwQzNDNjU0Qn0uRGVidWd8eDY0LkJ1aWxkLjAgPSBEZWJ1Z3x4NjQNCisJCXtBQTY2NjZBQS1FMDlGLTQxMzUtOUMwQy00RkU1MEMzQzY1NEJ9LlJlbGVhc2V8SXRhbml1bS5BY3RpdmVDZmcgPSBSZWxlYXNlfEl0YW5pdW0NCisJCXtBQTY2NjZBQS1FMDlGLTQxMzUtOUMwQy00RkU1MEMzQzY1NEJ9LlJlbGVhc2V8SXRhbml1bS5CdWlsZC4wID0gUmVsZWFzZXxJdGFuaXVtDQorCQl7QUE2NjY2QUEtRTA5Ri00MTM1LTlDMEMtNEZFNTBDM0M2NTRCfS5SZWxlYXNlfFdpbjMyLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzINCisJCXtBQTY2NjZBQS1FMDlGLTQxMzUtOUMwQy00RkU1MEMzQzY1NEJ9LlJlbGVhc2V8V2luMzIuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzINCisJCXtBQTY2NjZBQS1FMDlGLTQxMzUtOUMwQy00RkU1MEMzQzY1NEJ9LlJlbGVhc2V8eDY0LkFjdGl2ZUNmZyA9IFJlbGVhc2V8eDY0DQorCQl7QUE2NjY2QUEtRTA5Ri00MTM1LTlDMEMtNEZFNTBDM0M2NTRCfS5SZWxlYXNlfHg2NC5CdWlsZC4wID0gUmVsZWFzZXx4NjQNCisJCXtBQTY2NjZBQS1FMDlGLTQxMzUtOUMwQy00RkU1MEMzQzY1NEJ9LlJlbGVhc2VXaXRob3V0QXNtfEl0YW5pdW0uQWN0aXZlQ2ZnID0gUmVsZWFzZVdpdGhvdXRBc218SXRhbml1bQ0KKwkJe0FBNjY2NkFBLUUwOUYtNDEzNS05QzBDLTRGRTUwQzNDNjU0Qn0uUmVsZWFzZVdpdGhvdXRBc218SXRhbml1bS5CdWlsZC4wID0gUmVsZWFzZVdpdGhvdXRBc218SXRhbml1bQ0KKwkJe0FBNjY2NkFBLUUwOUYtNDEzNS05QzBDLTRGRTUwQzNDNjU0Qn0uUmVsZWFzZVdpdGhvdXRBc218V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZVdpdGhvdXRBc218V2luMzINCisJCXtBQTY2NjZBQS1FMDlGLTQxMzUtOUMwQy00RkU1MEMzQzY1NEJ9LlJlbGVhc2VXaXRob3V0QXNtfFdpbjMyLkJ1aWxkLjAgPSBSZWxlYXNlV2l0aG91dEFzbXxXaW4zMg0KKwkJe0FBNjY2NkFBLUUwOUYtNDEzNS05QzBDLTRGRTUwQzNDNjU0Qn0uUmVsZWFzZVdpdGhvdXRBc218eDY0LkFjdGl2ZUNmZyA9IFJlbGVhc2VXaXRob3V0QXNtfHg2NA0KKwkJe0FBNjY2NkFBLUUwOUYtNDEzNS05QzBDLTRGRTUwQzNDNjU0Qn0uUmVsZWFzZVdpdGhvdXRBc218eDY0LkJ1aWxkLjAgPSBSZWxlYXNlV2l0aG91dEFzbXx4NjQNCisJCXtDNTJGOUU3Qi00OThBLTQyQkUtOERCNC04NUExNTY5NDM2NkF9LkRlYnVnfEl0YW5pdW0uQWN0aXZlQ2ZnID0gRGVidWd8SXRhbml1bQ0KKwkJe0M1MkY5RTdCLTQ5OEEtNDJCRS04REI0LTg1QTE1Njk0MzY2QX0uRGVidWd8SXRhbml1bS5CdWlsZC4wID0gRGVidWd8SXRhbml1bQ0KKwkJe0M1MkY5RTdCLTQ5OEEtNDJCRS04REI0LTg1QTE1Njk0MzY2QX0uRGVidWd8V2luMzIuQWN0aXZlQ2ZnID0gRGVidWd8V2luMzINCisJCXtDNTJGOUU3Qi00OThBLTQyQkUtOERCNC04NUExNTY5NDM2NkF9LkRlYnVnfFdpbjMyLkJ1aWxkLjAgPSBEZWJ1Z3xXaW4zMg0KKwkJe0M1MkY5RTdCLTQ5OEEtNDJCRS04REI0LTg1QTE1Njk0MzY2QX0uRGVidWd8eDY0LkFjdGl2ZUNmZyA9IERlYnVnfHg2NA0KKwkJe0M1MkY5RTdCLTQ5OEEtNDJCRS04REI0LTg1QTE1Njk0MzY2QX0uRGVidWd8eDY0LkJ1aWxkLjAgPSBEZWJ1Z3x4NjQNCisJCXtDNTJGOUU3Qi00OThBLTQyQkUtOERCNC04NUExNTY5NDM2NkF9LlJlbGVhc2V8SXRhbml1bS5BY3RpdmVDZmcgPSBSZWxlYXNlfEl0YW5pdW0NCisJCXtDNTJGOUU3Qi00OThBLTQyQkUtOERCNC04NUExNTY5NDM2NkF9LlJlbGVhc2V8SXRhbml1bS5CdWlsZC4wID0gUmVsZWFzZXxJdGFuaXVtDQorCQl7QzUyRjlFN0ItNDk4QS00MkJFLThEQjQtODVBMTU2OTQzNjZBfS5SZWxlYXNlfFdpbjMyLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzINCisJCXtDNTJGOUU3Qi00OThBLTQyQkUtOERCNC04NUExNTY5NDM2NkF9LlJlbGVhc2V8V2luMzIuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzINCisJCXtDNTJGOUU3Qi00OThBLTQyQkUtOERCNC04NUExNTY5NDM2NkF9LlJlbGVhc2V8eDY0LkFjdGl2ZUNmZyA9IFJlbGVhc2V8eDY0DQorCQl7QzUyRjlFN0ItNDk4QS00MkJFLThEQjQtODVBMTU2OTQzNjZBfS5SZWxlYXNlfHg2NC5CdWlsZC4wID0gUmVsZWFzZXx4NjQNCisJCXtDNTJGOUU3Qi00OThBLTQyQkUtOERCNC04NUExNTY5NDM2NkF9LlJlbGVhc2VXaXRob3V0QXNtfEl0YW5pdW0uQWN0aXZlQ2ZnID0gUmVsZWFzZXxJdGFuaXVtDQorCQl7QzUyRjlFN0ItNDk4QS00MkJFLThEQjQtODVBMTU2OTQzNjZBfS5SZWxlYXNlV2l0aG91dEFzbXxJdGFuaXVtLkJ1aWxkLjAgPSBSZWxlYXNlfEl0YW5pdW0NCisJCXtDNTJGOUU3Qi00OThBLTQyQkUtOERCNC04NUExNTY5NDM2NkF9LlJlbGVhc2VXaXRob3V0QXNtfFdpbjMyLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzINCisJCXtDNTJGOUU3Qi00OThBLTQyQkUtOERCNC04NUExNTY5NDM2NkF9LlJlbGVhc2VXaXRob3V0QXNtfHg2NC5BY3RpdmVDZmcgPSBSZWxlYXNlfHg2NA0KKwkJezQ4Q0REOURDLUUwOUYtNDEzNS05QzBDLTRGRTUwQzNDNjU0Qn0uRGVidWd8SXRhbml1bS5BY3RpdmVDZmcgPSBEZWJ1Z3xJdGFuaXVtDQorCQl7NDhDREQ5REMtRTA5Ri00MTM1LTlDMEMtNEZFNTBDM0M2NTRCfS5EZWJ1Z3xJdGFuaXVtLkJ1aWxkLjAgPSBEZWJ1Z3xJdGFuaXVtDQorCQl7NDhDREQ5REMtRTA5Ri00MTM1LTlDMEMtNEZFNTBDM0M2NTRCfS5EZWJ1Z3xXaW4zMi5BY3RpdmVDZmcgPSBEZWJ1Z3xXaW4zMg0KKwkJezQ4Q0REOURDLUUwOUYtNDEzNS05QzBDLTRGRTUwQzNDNjU0Qn0uRGVidWd8V2luMzIuQnVpbGQuMCA9IERlYnVnfFdpbjMyDQorCQl7NDhDREQ5REMtRTA5Ri00MTM1LTlDMEMtNEZFNTBDM0M2NTRCfS5EZWJ1Z3x4NjQuQWN0aXZlQ2ZnID0gRGVidWd8eDY0DQorCQl7NDhDREQ5REMtRTA5Ri00MTM1LTlDMEMtNEZFNTBDM0M2NTRCfS5EZWJ1Z3x4NjQuQnVpbGQuMCA9IERlYnVnfHg2NA0KKwkJezQ4Q0REOURDLUUwOUYtNDEzNS05QzBDLTRGRTUwQzNDNjU0Qn0uUmVsZWFzZXxJdGFuaXVtLkFjdGl2ZUNmZyA9IFJlbGVhc2V8SXRhbml1bQ0KKwkJezQ4Q0REOURDLUUwOUYtNDEzNS05QzBDLTRGRTUwQzNDNjU0Qn0uUmVsZWFzZXxJdGFuaXVtLkJ1aWxkLjAgPSBSZWxlYXNlfEl0YW5pdW0NCisJCXs0OENERDlEQy1FMDlGLTQxMzUtOUMwQy00RkU1MEMzQzY1NEJ9LlJlbGVhc2V8V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMg0KKwkJezQ4Q0REOURDLUUwOUYtNDEzNS05QzBDLTRGRTUwQzNDNjU0Qn0uUmVsZWFzZXxXaW4zMi5CdWlsZC4wID0gUmVsZWFzZXxXaW4zMg0KKwkJezQ4Q0REOURDLUUwOUYtNDEzNS05QzBDLTRGRTUwQzNDNjU0Qn0uUmVsZWFzZXx4NjQuQWN0aXZlQ2ZnID0gUmVsZWFzZXx4NjQNCisJCXs0OENERDlEQy1FMDlGLTQxMzUtOUMwQy00RkU1MEMzQzY1NEJ9LlJlbGVhc2V8eDY0LkJ1aWxkLjAgPSBSZWxlYXNlfHg2NA0KKwkJezQ4Q0REOURDLUUwOUYtNDEzNS05QzBDLTRGRTUwQzNDNjU0Qn0uUmVsZWFzZVdpdGhvdXRBc218SXRhbml1bS5BY3RpdmVDZmcgPSBSZWxlYXNlfEl0YW5pdW0NCisJCXs0OENERDlEQy1FMDlGLTQxMzUtOUMwQy00RkU1MEMzQzY1NEJ9LlJlbGVhc2VXaXRob3V0QXNtfEl0YW5pdW0uQnVpbGQuMCA9IFJlbGVhc2V8SXRhbml1bQ0KKwkJezQ4Q0REOURDLUUwOUYtNDEzNS05QzBDLTRGRTUwQzNDNjU0Qn0uUmVsZWFzZVdpdGhvdXRBc218V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMg0KKwkJezQ4Q0REOURDLUUwOUYtNDEzNS05QzBDLTRGRTUwQzNDNjU0Qn0uUmVsZWFzZVdpdGhvdXRBc218eDY0LkFjdGl2ZUNmZyA9IFJlbGVhc2V8eDY0DQorCQl7QzUyRjlFN0ItNDk4QS00MkJFLThEQjQtODVBMTU2OTQzODJBfS5EZWJ1Z3xJdGFuaXVtLkFjdGl2ZUNmZyA9IERlYnVnfEl0YW5pdW0NCisJCXtDNTJGOUU3Qi00OThBLTQyQkUtOERCNC04NUExNTY5NDM4MkF9LkRlYnVnfEl0YW5pdW0uQnVpbGQuMCA9IERlYnVnfEl0YW5pdW0NCisJCXtDNTJGOUU3Qi00OThBLTQyQkUtOERCNC04NUExNTY5NDM4MkF9LkRlYnVnfFdpbjMyLkFjdGl2ZUNmZyA9IERlYnVnfFdpbjMyDQorCQl7QzUyRjlFN0ItNDk4QS00MkJFLThEQjQtODVBMTU2OTQzODJBfS5EZWJ1Z3xXaW4zMi5CdWlsZC4wID0gRGVidWd8V2luMzINCisJCXtDNTJGOUU3Qi00OThBLTQyQkUtOERCNC04NUExNTY5NDM4MkF9LkRlYnVnfHg2NC5BY3RpdmVDZmcgPSBEZWJ1Z3x4NjQNCisJCXtDNTJGOUU3Qi00OThBLTQyQkUtOERCNC04NUExNTY5NDM4MkF9LkRlYnVnfHg2NC5CdWlsZC4wID0gRGVidWd8eDY0DQorCQl7QzUyRjlFN0ItNDk4QS00MkJFLThEQjQtODVBMTU2OTQzODJBfS5SZWxlYXNlfEl0YW5pdW0uQWN0aXZlQ2ZnID0gUmVsZWFzZXxJdGFuaXVtDQorCQl7QzUyRjlFN0ItNDk4QS00MkJFLThEQjQtODVBMTU2OTQzODJBfS5SZWxlYXNlfEl0YW5pdW0uQnVpbGQuMCA9IFJlbGVhc2V8SXRhbml1bQ0KKwkJe0M1MkY5RTdCLTQ5OEEtNDJCRS04REI0LTg1QTE1Njk0MzgyQX0uUmVsZWFzZXxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyDQorCQl7QzUyRjlFN0ItNDk4QS00MkJFLThEQjQtODVBMTU2OTQzODJBfS5SZWxlYXNlfFdpbjMyLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbjMyDQorCQl7QzUyRjlFN0ItNDk4QS00MkJFLThEQjQtODVBMTU2OTQzODJBfS5SZWxlYXNlfHg2NC5BY3RpdmVDZmcgPSBSZWxlYXNlfHg2NA0KKwkJe0M1MkY5RTdCLTQ5OEEtNDJCRS04REI0LTg1QTE1Njk0MzgyQX0uUmVsZWFzZXx4NjQuQnVpbGQuMCA9IFJlbGVhc2V8eDY0DQorCQl7QzUyRjlFN0ItNDk4QS00MkJFLThEQjQtODVBMTU2OTQzODJBfS5SZWxlYXNlV2l0aG91dEFzbXxJdGFuaXVtLkFjdGl2ZUNmZyA9IFJlbGVhc2V8SXRhbml1bQ0KKwkJe0M1MkY5RTdCLTQ5OEEtNDJCRS04REI0LTg1QTE1Njk0MzgyQX0uUmVsZWFzZVdpdGhvdXRBc218SXRhbml1bS5CdWlsZC4wID0gUmVsZWFzZXxJdGFuaXVtDQorCQl7QzUyRjlFN0ItNDk4QS00MkJFLThEQjQtODVBMTU2OTQzODJBfS5SZWxlYXNlV2l0aG91dEFzbXxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyDQorCQl7QzUyRjlFN0ItNDk4QS00MkJFLThEQjQtODVBMTU2OTQzODJBfS5SZWxlYXNlV2l0aG91dEFzbXx4NjQuQWN0aXZlQ2ZnID0gUmVsZWFzZXx4NjQNCisJRW5kR2xvYmFsU2VjdGlvbg0KKwlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uUHJvcGVydGllcykgPSBwcmVTb2x1dGlvbg0KKwkJSGlkZVNvbHV0aW9uTm9kZSA9IEZBTFNFDQorCUVuZEdsb2JhbFNlY3Rpb24NCitFbmRHbG9iYWwNCmRpZmYgLS1naXQgYS96bGliLTEuMi42L2NvbnRyaWIvdnN0dWRpby92YzkvemxpYnZjLnZjcHJvaiBiL3psaWItMS4yLjYvY29udHJpYi92c3R1ZGlvL3ZjOS96bGlidmMudmNwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5YTg5NDcKLS0tIC9kZXYvbnVsbAorKysgYi96bGliLTEuMi42L2NvbnRyaWIvdnN0dWRpby92YzkvemxpYnZjLnZjcHJvagpAQCAtMCwwICsxLDExNTYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IldpbmRvd3MtMTI1MiI/Pg0KKzxWaXN1YWxTdHVkaW9Qcm9qZWN0DQorCVByb2plY3RUeXBlPSJWaXN1YWwgQysrIg0KKwlWZXJzaW9uPSI5LDAwIg0KKwlOYW1lPSJ6bGlidmMiDQorCVByb2plY3RHVUlEPSJ7OEZEODI2RjgtMzczOS00NEU2LThDQzgtOTk3MTIyRTUzQjhEfSINCisJUm9vdE5hbWVzcGFjZT0iemxpYnZjIg0KKwlUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPSIxMzEwNzIiDQorCT4NCisJPFBsYXRmb3Jtcz4NCisJCTxQbGF0Zm9ybQ0KKwkJCU5hbWU9IldpbjMyIg0KKwkJLz4NCisJCTxQbGF0Zm9ybQ0KKwkJCU5hbWU9Ing2NCINCisJCS8+DQorCQk8UGxhdGZvcm0NCisJCQlOYW1lPSJJdGFuaXVtIg0KKwkJLz4NCisJPC9QbGF0Zm9ybXM+DQorCTxUb29sRmlsZXM+DQorCTwvVG9vbEZpbGVzPg0KKwk8Q29uZmlndXJhdGlvbnM+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IkRlYnVnfFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0ieDg2XFpsaWJEbGwkKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ing4NlxabGliRGxsJChDb25maWd1cmF0aW9uTmFtZSlcVG1wIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIyIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSJVcGdyYWRlRnJvbVZDNzAudnNwcm9wcyINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHIg0KKwkJCQlNa1R5cExpYkNvbXBhdGlibGU9InRydWUiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCisJCQkJVGFyZ2V0RW52aXJvbm1lbnQ9IjEiDQorCQkJCVR5cGVMaWJyYXJ5TmFtZT0iJChPdXREaXIpL3psaWJ2Yy50bGIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlPcHRpbWl6YXRpb249IjAiDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXC4uOy4uXC4uXG1hc214ODYiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtfQ1JUX05PTlNURENfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtfQ1JUX05PTlNURENfTk9fV0FSTklOR1M7WkxJQl9XSU5BUEk7QVNNVjtBU01JTkYiDQorCQkJCUV4Y2VwdGlvbkhhbmRsaW5nPSIwIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iMSINCisJCQkJQnVmZmVyU2VjdXJpdHlDaGVjaz0iZmFsc2UiDQorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iJChJbnREaXIpL3psaWJ2Yy5wY2giDQorCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iJChJbnREaXIpXCINCisJCQkJT2JqZWN0RmlsZT0iJChJbnREaXIpXCINCisJCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9IiQoT3V0RGlyKVwiDQorCQkJCUJyb3dzZUluZm9ybWF0aW9uPSIwIg0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iNCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRyINCisJCQkJQ3VsdHVyZT0iMTAzNiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJQWRkaXRpb25hbE9wdGlvbnM9Ii9NQUNISU5FOkkzODYiDQorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9Ii4uXC4uXG1hc214ODZcbWF0Y2g2ODYub2JqIC4uXC4uXG1hc214ODZcaW5mZmFzMzIub2JqIg0KKwkJCQlPdXRwdXRGaWxlPSIkKE91dERpcilcemxpYndhcGkuZGxsIg0KKwkJCQlMaW5rSW5jcmVtZW50YWw9IjIiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCisJCQkJR2VuZXJhdGVNYW5pZmVzdD0iZmFsc2UiDQorCQkJCU1vZHVsZURlZmluaXRpb25GaWxlPSIuXHpsaWJ2Yy5kZWYiDQorCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0idHJ1ZSINCisJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iJChPdXREaXIpL3psaWJ3YXBpLnBkYiINCisJCQkJR2VuZXJhdGVNYXBGaWxlPSJ0cnVlIg0KKwkJCQlNYXBGaWxlTmFtZT0iJChPdXREaXIpL3psaWJ3YXBpLm1hcCINCisJCQkJU3ViU3lzdGVtPSIyIg0KKwkJCQlSYW5kb21pemVkQmFzZUFkZHJlc3M9IjEiDQorCQkJCURhdGFFeGVjdXRpb25QcmV2ZW50aW9uPSIwIg0KKwkJCQlJbXBvcnRMaWJyYXJ5PSIkKE91dERpcikvemxpYndhcGkubGliIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IkRlYnVnfHg2NCINCisJCQlPdXRwdXREaXJlY3Rvcnk9Ing2NFxabGliRGxsJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSJ4NjRcWmxpYkRsbCQoQ29uZmlndXJhdGlvbk5hbWUpXFRtcCINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMiINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iVXBncmFkZUZyb21WQzcwLnZzcHJvcHMiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRyINCisJCQkJTWtUeXBMaWJDb21wYXRpYmxlPSJ0cnVlIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQorCQkJCVRhcmdldEVudmlyb25tZW50PSIzIg0KKwkJCQlUeXBlTGlicmFyeU5hbWU9IiQoT3V0RGlyKS96bGlidmMudGxiIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJT3B0aW1pemF0aW9uPSIwIg0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLjsuLlwuLlxtYXNteDg2Ig0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7X0NSVF9OT05TVERDX05PX0RFUFJFQ0FURTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7X0NSVF9OT05TVERDX05PX1dBUk5JTkdTO1pMSUJfV0lOQVBJO0FTTVY7QVNNSU5GO1dJTjY0Ig0KKwkJCQlFeGNlcHRpb25IYW5kbGluZz0iMCINCisJCQkJUnVudGltZUxpYnJhcnk9IjMiDQorCQkJCUJ1ZmZlclNlY3VyaXR5Q2hlY2s9ImZhbHNlIg0KKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9IiQoSW50RGlyKS96bGlidmMucGNoIg0KKwkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249IiQoSW50RGlyKVwiDQorCQkJCU9iamVjdEZpbGU9IiQoSW50RGlyKVwiDQorCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIkKE91dERpcilcIg0KKwkJCQlCcm93c2VJbmZvcm1hdGlvbj0iMCINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfREVCVUciDQorCQkJCUN1bHR1cmU9IjEwMzYiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9Ii4uXC4uXG1hc214NjRcZ3ZtYXQ2NC5vYmogLi5cLi5cbWFzbXg2NFxpbmZmYXN4NjQub2JqICINCisJCQkJT3V0cHV0RmlsZT0iJChPdXREaXIpXHpsaWJ3YXBpLmRsbCINCisJCQkJTGlua0luY3JlbWVudGFsPSIyIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQorCQkJCUdlbmVyYXRlTWFuaWZlc3Q9ImZhbHNlIg0KKwkJCQlNb2R1bGVEZWZpbml0aW9uRmlsZT0iLlx6bGlidmMuZGVmIg0KKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249InRydWUiDQorCQkJCVByb2dyYW1EYXRhYmFzZUZpbGU9IiQoT3V0RGlyKS96bGlid2FwaS5wZGIiDQorCQkJCUdlbmVyYXRlTWFwRmlsZT0idHJ1ZSINCisJCQkJTWFwRmlsZU5hbWU9IiQoT3V0RGlyKS96bGlid2FwaS5tYXAiDQorCQkJCVN1YlN5c3RlbT0iMiINCisJCQkJSW1wb3J0TGlicmFyeT0iJChPdXREaXIpL3psaWJ3YXBpLmxpYiINCisJCQkJVGFyZ2V0TWFjaGluZT0iMTciDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iRGVidWd8SXRhbml1bSINCisJCQlPdXRwdXREaXJlY3Rvcnk9ImlhNjRcWmxpYkRsbCQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iaWE2NFxabGliRGxsJChDb25maWd1cmF0aW9uTmFtZSlcVG1wIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIyIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSJVcGdyYWRlRnJvbVZDNzAudnNwcm9wcyINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHIg0KKwkJCQlNa1R5cExpYkNvbXBhdGlibGU9InRydWUiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCisJCQkJVGFyZ2V0RW52aXJvbm1lbnQ9IjIiDQorCQkJCVR5cGVMaWJyYXJ5TmFtZT0iJChPdXREaXIpL3psaWJ2Yy50bGIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlPcHRpbWl6YXRpb249IjAiDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXC4uOy4uXC4uXG1hc214ODYiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtfQ1JUX05PTlNURENfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtfQ1JUX05PTlNURENfTk9fV0FSTklOR1M7WkxJQl9XSU5BUEk7V0lONjQiDQorCQkJCUV4Y2VwdGlvbkhhbmRsaW5nPSIwIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iMyINCisJCQkJQnVmZmVyU2VjdXJpdHlDaGVjaz0iZmFsc2UiDQorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iJChJbnREaXIpL3psaWJ2Yy5wY2giDQorCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iJChJbnREaXIpXCINCisJCQkJT2JqZWN0RmlsZT0iJChJbnREaXIpXCINCisJCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9IiQoT3V0RGlyKVwiDQorCQkJCUJyb3dzZUluZm9ybWF0aW9uPSIwIg0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRyINCisJCQkJQ3VsdHVyZT0iMTAzNiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJT3V0cHV0RmlsZT0iJChPdXREaXIpXHpsaWJ3YXBpLmRsbCINCisJCQkJTGlua0luY3JlbWVudGFsPSIyIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQorCQkJCUdlbmVyYXRlTWFuaWZlc3Q9ImZhbHNlIg0KKwkJCQlNb2R1bGVEZWZpbml0aW9uRmlsZT0iLlx6bGlidmMuZGVmIg0KKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249InRydWUiDQorCQkJCVByb2dyYW1EYXRhYmFzZUZpbGU9IiQoT3V0RGlyKS96bGlid2FwaS5wZGIiDQorCQkJCUdlbmVyYXRlTWFwRmlsZT0idHJ1ZSINCisJCQkJTWFwRmlsZU5hbWU9IiQoT3V0RGlyKS96bGlid2FwaS5tYXAiDQorCQkJCVN1YlN5c3RlbT0iMiINCisJCQkJSW1wb3J0TGlicmFyeT0iJChPdXREaXIpL3psaWJ3YXBpLmxpYiINCisJCQkJVGFyZ2V0TWFjaGluZT0iNSINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlV2l0aG91dEFzbXxXaW4zMiINCisJCQlPdXRwdXREaXJlY3Rvcnk9Ing4NlxabGliRGxsJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSJ4ODZcWmxpYkRsbCQoQ29uZmlndXJhdGlvbk5hbWUpXFRtcCINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMiINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iVXBncmFkZUZyb21WQzcwLnZzcHJvcHMiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KKwkJCVdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj0iMSINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUciDQorCQkJCU1rVHlwTGliQ29tcGF0aWJsZT0idHJ1ZSINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCQlUYXJnZXRFbnZpcm9ubWVudD0iMSINCisJCQkJVHlwZUxpYnJhcnlOYW1lPSIkKE91dERpcikvemxpYnZjLnRsYiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUlubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIxIg0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLjsuLlwuLlxtYXNteDg2Ig0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7X0NSVF9OT05TVERDX05PX0RFUFJFQ0FURTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7X0NSVF9OT05TVERDX05PX1dBUk5JTkdTO1pMSUJfV0lOQVBJIg0KKwkJCQlTdHJpbmdQb29saW5nPSJ0cnVlIg0KKwkJCQlFeGNlcHRpb25IYW5kbGluZz0iMCINCisJCQkJUnVudGltZUxpYnJhcnk9IjIiDQorCQkJCUJ1ZmZlclNlY3VyaXR5Q2hlY2s9ImZhbHNlIg0KKwkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0idHJ1ZSINCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIkKEludERpcikvemxpYnZjLnBjaCINCisJCQkJQXNzZW1ibGVyT3V0cHV0PSIyIg0KKwkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249IiQoSW50RGlyKVwiDQorCQkJCU9iamVjdEZpbGU9IiQoSW50RGlyKVwiDQorCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIkKE91dERpcilcIg0KKwkJCQlCcm93c2VJbmZvcm1hdGlvbj0iMCINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUciDQorCQkJCUN1bHR1cmU9IjEwMzYiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxPcHRpb25zPSIvTUFDSElORTpJMzg2Ig0KKwkJCQlPdXRwdXRGaWxlPSIkKE91dERpcilcemxpYndhcGkuZGxsIg0KKwkJCQlMaW5rSW5jcmVtZW50YWw9IjEiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCisJCQkJR2VuZXJhdGVNYW5pZmVzdD0iZmFsc2UiDQorCQkJCUlnbm9yZUFsbERlZmF1bHRMaWJyYXJpZXM9ImZhbHNlIg0KKwkJCQlNb2R1bGVEZWZpbml0aW9uRmlsZT0iLlx6bGlidmMuZGVmIg0KKwkJCQlQcm9ncmFtRGF0YWJhc2VGaWxlPSIkKE91dERpcikvemxpYndhcGkucGRiIg0KKwkJCQlHZW5lcmF0ZU1hcEZpbGU9InRydWUiDQorCQkJCU1hcEZpbGVOYW1lPSIkKE91dERpcikvemxpYndhcGkubWFwIg0KKwkJCQlTdWJTeXN0ZW09IjIiDQorCQkJCU9wdGltaXplRm9yV2luZG93czk4PSIxIg0KKwkJCQlSYW5kb21pemVkQmFzZUFkZHJlc3M9IjEiDQorCQkJCURhdGFFeGVjdXRpb25QcmV2ZW50aW9uPSIwIg0KKwkJCQlJbXBvcnRMaWJyYXJ5PSIkKE91dERpcikvemxpYndhcGkubGliIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2VXaXRob3V0QXNtfHg2NCINCisJCQlPdXRwdXREaXJlY3Rvcnk9Ing2NFxabGliRGxsJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSJ4NjRcWmxpYkRsbCQoQ29uZmlndXJhdGlvbk5hbWUpXFRtcCINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMiINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iVXBncmFkZUZyb21WQzcwLnZzcHJvcHMiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KKwkJCVdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj0iMSINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUciDQorCQkJCU1rVHlwTGliQ29tcGF0aWJsZT0idHJ1ZSINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCQlUYXJnZXRFbnZpcm9ubWVudD0iMyINCisJCQkJVHlwZUxpYnJhcnlOYW1lPSIkKE91dERpcikvemxpYnZjLnRsYiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUlubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIxIg0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLjsuLlwuLlxtYXNteDg2Ig0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7X0NSVF9OT05TVERDX05PX0RFUFJFQ0FURTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7X0NSVF9OT05TVERDX05PX1dBUk5JTkdTO1pMSUJfV0lOQVBJO1dJTjY0Ig0KKwkJCQlTdHJpbmdQb29saW5nPSJ0cnVlIg0KKwkJCQlFeGNlcHRpb25IYW5kbGluZz0iMCINCisJCQkJUnVudGltZUxpYnJhcnk9IjIiDQorCQkJCUJ1ZmZlclNlY3VyaXR5Q2hlY2s9ImZhbHNlIg0KKwkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0idHJ1ZSINCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIkKEludERpcikvemxpYnZjLnBjaCINCisJCQkJQXNzZW1ibGVyT3V0cHV0PSIyIg0KKwkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249IiQoSW50RGlyKVwiDQorCQkJCU9iamVjdEZpbGU9IiQoSW50RGlyKVwiDQorCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIkKE91dERpcilcIg0KKwkJCQlCcm93c2VJbmZvcm1hdGlvbj0iMCINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUciDQorCQkJCUN1bHR1cmU9IjEwMzYiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCU91dHB1dEZpbGU9IiQoT3V0RGlyKVx6bGlid2FwaS5kbGwiDQorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMSINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCQlHZW5lcmF0ZU1hbmlmZXN0PSJmYWxzZSINCisJCQkJSWdub3JlQWxsRGVmYXVsdExpYnJhcmllcz0iZmFsc2UiDQorCQkJCU1vZHVsZURlZmluaXRpb25GaWxlPSIuXHpsaWJ2Yy5kZWYiDQorCQkJCVByb2dyYW1EYXRhYmFzZUZpbGU9IiQoT3V0RGlyKS96bGlid2FwaS5wZGIiDQorCQkJCUdlbmVyYXRlTWFwRmlsZT0idHJ1ZSINCisJCQkJTWFwRmlsZU5hbWU9IiQoT3V0RGlyKS96bGlid2FwaS5tYXAiDQorCQkJCVN1YlN5c3RlbT0iMiINCisJCQkJT3B0aW1pemVGb3JXaW5kb3dzOTg9IjEiDQorCQkJCUltcG9ydExpYnJhcnk9IiQoT3V0RGlyKS96bGlid2FwaS5saWIiDQorCQkJCVRhcmdldE1hY2hpbmU9IjE3Ig0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2VXaXRob3V0QXNtfEl0YW5pdW0iDQorCQkJT3V0cHV0RGlyZWN0b3J5PSJpYTY0XFpsaWJEbGwkKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9ImlhNjRcWmxpYkRsbCQoQ29uZmlndXJhdGlvbk5hbWUpXFRtcCINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMiINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iVXBncmFkZUZyb21WQzcwLnZzcHJvcHMiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KKwkJCVdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj0iMSINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUciDQorCQkJCU1rVHlwTGliQ29tcGF0aWJsZT0idHJ1ZSINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCQlUYXJnZXRFbnZpcm9ubWVudD0iMiINCisJCQkJVHlwZUxpYnJhcnlOYW1lPSIkKE91dERpcikvemxpYnZjLnRsYiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUlubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIxIg0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLjsuLlwuLlxtYXNteDg2Ig0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7X0NSVF9OT05TVERDX05PX0RFUFJFQ0FURTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7X0NSVF9OT05TVERDX05PX1dBUk5JTkdTO1pMSUJfV0lOQVBJO1dJTjY0Ig0KKwkJCQlTdHJpbmdQb29saW5nPSJ0cnVlIg0KKwkJCQlFeGNlcHRpb25IYW5kbGluZz0iMCINCisJCQkJUnVudGltZUxpYnJhcnk9IjIiDQorCQkJCUJ1ZmZlclNlY3VyaXR5Q2hlY2s9ImZhbHNlIg0KKwkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0idHJ1ZSINCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIkKEludERpcikvemxpYnZjLnBjaCINCisJCQkJQXNzZW1ibGVyT3V0cHV0PSIyIg0KKwkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249IiQoSW50RGlyKVwiDQorCQkJCU9iamVjdEZpbGU9IiQoSW50RGlyKVwiDQorCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIkKE91dERpcilcIg0KKwkJCQlCcm93c2VJbmZvcm1hdGlvbj0iMCINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUciDQorCQkJCUN1bHR1cmU9IjEwMzYiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCU91dHB1dEZpbGU9IiQoT3V0RGlyKVx6bGlid2FwaS5kbGwiDQorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMSINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCQlHZW5lcmF0ZU1hbmlmZXN0PSJmYWxzZSINCisJCQkJSWdub3JlQWxsRGVmYXVsdExpYnJhcmllcz0iZmFsc2UiDQorCQkJCU1vZHVsZURlZmluaXRpb25GaWxlPSIuXHpsaWJ2Yy5kZWYiDQorCQkJCVByb2dyYW1EYXRhYmFzZUZpbGU9IiQoT3V0RGlyKS96bGlid2FwaS5wZGIiDQorCQkJCUdlbmVyYXRlTWFwRmlsZT0idHJ1ZSINCisJCQkJTWFwRmlsZU5hbWU9IiQoT3V0RGlyKS96bGlid2FwaS5tYXAiDQorCQkJCVN1YlN5c3RlbT0iMiINCisJCQkJT3B0aW1pemVGb3JXaW5kb3dzOTg9IjEiDQorCQkJCUltcG9ydExpYnJhcnk9IiQoT3V0RGlyKS96bGlid2FwaS5saWIiDQorCQkJCVRhcmdldE1hY2hpbmU9IjUiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiINCisJCQlPdXRwdXREaXJlY3Rvcnk9Ing4NlxabGliRGxsJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSJ4ODZcWmxpYkRsbCQoQ29uZmlndXJhdGlvbk5hbWUpXFRtcCINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMiINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iVXBncmFkZUZyb21WQzcwLnZzcHJvcHMiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KKwkJCVdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj0iMSINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUciDQorCQkJCU1rVHlwTGliQ29tcGF0aWJsZT0idHJ1ZSINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCQlUYXJnZXRFbnZpcm9ubWVudD0iMSINCisJCQkJVHlwZUxpYnJhcnlOYW1lPSIkKE91dERpcikvemxpYnZjLnRsYiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUlubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIxIg0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLjsuLlwuLlxtYXNteDg2Ig0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7X0NSVF9OT05TVERDX05PX0RFUFJFQ0FURTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7X0NSVF9OT05TVERDX05PX1dBUk5JTkdTO1pMSUJfV0lOQVBJO0FTTVY7QVNNSU5GIg0KKwkJCQlTdHJpbmdQb29saW5nPSJ0cnVlIg0KKwkJCQlFeGNlcHRpb25IYW5kbGluZz0iMCINCisJCQkJUnVudGltZUxpYnJhcnk9IjAiDQorCQkJCUJ1ZmZlclNlY3VyaXR5Q2hlY2s9ImZhbHNlIg0KKwkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0idHJ1ZSINCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIkKEludERpcikvemxpYnZjLnBjaCINCisJCQkJQXNzZW1ibGVyT3V0cHV0PSIyIg0KKwkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249IiQoSW50RGlyKVwiDQorCQkJCU9iamVjdEZpbGU9IiQoSW50RGlyKVwiDQorCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIkKE91dERpcilcIg0KKwkJCQlCcm93c2VJbmZvcm1hdGlvbj0iMCINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUciDQorCQkJCUN1bHR1cmU9IjEwMzYiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxPcHRpb25zPSIvTUFDSElORTpJMzg2Ig0KKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSIuLlwuLlxtYXNteDg2XG1hdGNoNjg2Lm9iaiAuLlwuLlxtYXNteDg2XGluZmZhczMyLm9iaiAiDQorCQkJCU91dHB1dEZpbGU9IiQoT3V0RGlyKVx6bGlid2FwaS5kbGwiDQorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMSINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCQlHZW5lcmF0ZU1hbmlmZXN0PSJmYWxzZSINCisJCQkJSWdub3JlQWxsRGVmYXVsdExpYnJhcmllcz0iZmFsc2UiDQorCQkJCU1vZHVsZURlZmluaXRpb25GaWxlPSIuXHpsaWJ2Yy5kZWYiDQorCQkJCVByb2dyYW1EYXRhYmFzZUZpbGU9IiQoT3V0RGlyKS96bGlid2FwaS5wZGIiDQorCQkJCUdlbmVyYXRlTWFwRmlsZT0idHJ1ZSINCisJCQkJTWFwRmlsZU5hbWU9IiQoT3V0RGlyKS96bGlid2FwaS5tYXAiDQorCQkJCVN1YlN5c3RlbT0iMiINCisJCQkJT3B0aW1pemVGb3JXaW5kb3dzOTg9IjEiDQorCQkJCVJhbmRvbWl6ZWRCYXNlQWRkcmVzcz0iMSINCisJCQkJRGF0YUV4ZWN1dGlvblByZXZlbnRpb249IjAiDQorCQkJCUltcG9ydExpYnJhcnk9IiQoT3V0RGlyKS96bGlid2FwaS5saWIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iUmVsZWFzZXx4NjQiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSJ4NjRcWmxpYkRsbCQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0ieDY0XFpsaWJEbGwkKENvbmZpZ3VyYXRpb25OYW1lKVxUbXAiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjIiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IlVwZ3JhZGVGcm9tVkM3MC52c3Byb3BzIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQlXaG9sZVByb2dyYW1PcHRpbWl6YXRpb249IjEiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHIg0KKwkJCQlNa1R5cExpYkNvbXBhdGlibGU9InRydWUiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCisJCQkJVGFyZ2V0RW52aXJvbm1lbnQ9IjMiDQorCQkJCVR5cGVMaWJyYXJ5TmFtZT0iJChPdXREaXIpL3psaWJ2Yy50bGIiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj0iMSINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5cLi47Li5cLi5cbWFzbXg4NiINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9DUlRfTk9OU1REQ19OT19ERVBSRUNBVEU7X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFO19DUlRfTk9OU1REQ19OT19XQVJOSU5HUztaTElCX1dJTkFQSTtBU01WO0FTTUlORjtXSU42NCINCisJCQkJU3RyaW5nUG9vbGluZz0idHJ1ZSINCisJCQkJRXhjZXB0aW9uSGFuZGxpbmc9IjAiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIyIg0KKwkJCQlCdWZmZXJTZWN1cml0eUNoZWNrPSJmYWxzZSINCisJCQkJRW5hYmxlRnVuY3Rpb25MZXZlbExpbmtpbmc9InRydWUiDQorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iJChJbnREaXIpL3psaWJ2Yy5wY2giDQorCQkJCUFzc2VtYmxlck91dHB1dD0iMiINCisJCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIkKEludERpcilcIg0KKwkJCQlPYmplY3RGaWxlPSIkKEludERpcilcIg0KKwkJCQlQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iJChPdXREaXIpXCINCisJCQkJQnJvd3NlSW5mb3JtYXRpb249IjAiDQorCQkJCVdhcm5pbmdMZXZlbD0iMyINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHIg0KKwkJCQlDdWx0dXJlPSIxMDM2Ig0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSIuLlwuLlxtYXNteDY0XGd2bWF0NjQub2JqIC4uXC4uXG1hc214NjRcaW5mZmFzeDY0Lm9iaiAiDQorCQkJCU91dHB1dEZpbGU9IiQoT3V0RGlyKVx6bGlid2FwaS5kbGwiDQorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMSINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCQlHZW5lcmF0ZU1hbmlmZXN0PSJmYWxzZSINCisJCQkJSWdub3JlQWxsRGVmYXVsdExpYnJhcmllcz0iZmFsc2UiDQorCQkJCU1vZHVsZURlZmluaXRpb25GaWxlPSIuXHpsaWJ2Yy5kZWYiDQorCQkJCVByb2dyYW1EYXRhYmFzZUZpbGU9IiQoT3V0RGlyKS96bGlid2FwaS5wZGIiDQorCQkJCUdlbmVyYXRlTWFwRmlsZT0idHJ1ZSINCisJCQkJTWFwRmlsZU5hbWU9IiQoT3V0RGlyKS96bGlid2FwaS5tYXAiDQorCQkJCVN1YlN5c3RlbT0iMiINCisJCQkJT3B0aW1pemVGb3JXaW5kb3dzOTg9IjEiDQorCQkJCUltcG9ydExpYnJhcnk9IiQoT3V0RGlyKS96bGlid2FwaS5saWIiDQorCQkJCVRhcmdldE1hY2hpbmU9IjE3Ig0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2V8SXRhbml1bSINCisJCQlPdXRwdXREaXJlY3Rvcnk9ImlhNjRcWmxpYkRsbCQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iaWE2NFxabGliRGxsJChDb25maWd1cmF0aW9uTmFtZSlcVG1wIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIyIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSJVcGdyYWRlRnJvbVZDNzAudnNwcm9wcyINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPSIxIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRyINCisJCQkJTWtUeXBMaWJDb21wYXRpYmxlPSJ0cnVlIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQorCQkJCVRhcmdldEVudmlyb25tZW50PSIyIg0KKwkJCQlUeXBlTGlicmFyeU5hbWU9IiQoT3V0RGlyKS96bGlidmMudGxiIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjEiDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXC4uOy4uXC4uXG1hc214ODYiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfQ1JUX05PTlNURENfTk9fREVQUkVDQVRFO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURTtfQ1JUX05PTlNURENfTk9fV0FSTklOR1M7WkxJQl9XSU5BUEk7V0lONjQiDQorCQkJCVN0cmluZ1Bvb2xpbmc9InRydWUiDQorCQkJCUV4Y2VwdGlvbkhhbmRsaW5nPSIwIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iMiINCisJCQkJQnVmZmVyU2VjdXJpdHlDaGVjaz0iZmFsc2UiDQorCQkJCUVuYWJsZUZ1bmN0aW9uTGV2ZWxMaW5raW5nPSJ0cnVlIg0KKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9IiQoSW50RGlyKS96bGlidmMucGNoIg0KKwkJCQlBc3NlbWJsZXJPdXRwdXQ9IjIiDQorCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iJChJbnREaXIpXCINCisJCQkJT2JqZWN0RmlsZT0iJChJbnREaXIpXCINCisJCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9IiQoT3V0RGlyKVwiDQorCQkJCUJyb3dzZUluZm9ybWF0aW9uPSIwIg0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRyINCisJCQkJQ3VsdHVyZT0iMTAzNiINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJT3V0cHV0RmlsZT0iJChPdXREaXIpXHpsaWJ3YXBpLmRsbCINCisJCQkJTGlua0luY3JlbWVudGFsPSIxIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQorCQkJCUdlbmVyYXRlTWFuaWZlc3Q9ImZhbHNlIg0KKwkJCQlJZ25vcmVBbGxEZWZhdWx0TGlicmFyaWVzPSJmYWxzZSINCisJCQkJTW9kdWxlRGVmaW5pdGlvbkZpbGU9Ii5cemxpYnZjLmRlZiINCisJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iJChPdXREaXIpL3psaWJ3YXBpLnBkYiINCisJCQkJR2VuZXJhdGVNYXBGaWxlPSJ0cnVlIg0KKwkJCQlNYXBGaWxlTmFtZT0iJChPdXREaXIpL3psaWJ3YXBpLm1hcCINCisJCQkJU3ViU3lzdGVtPSIyIg0KKwkJCQlPcHRpbWl6ZUZvcldpbmRvd3M5OD0iMSINCisJCQkJSW1wb3J0TGlicmFyeT0iJChPdXREaXIpL3psaWJ3YXBpLmxpYiINCisJCQkJVGFyZ2V0TWFjaGluZT0iNSINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwk8L0NvbmZpZ3VyYXRpb25zPg0KKwk8UmVmZXJlbmNlcz4NCisJPC9SZWZlcmVuY2VzPg0KKwk8RmlsZXM+DQorCQk8RmlsdGVyDQorCQkJTmFtZT0iU291cmNlIEZpbGVzIg0KKwkJCUZpbHRlcj0iY3BwO2M7Y3h4O3JjO2RlZjtyO29kbDtocGo7YmF0O2ZvcjtmOTAiDQorCQkJPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cYWRsZXIzMi5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cY29tcHJlc3MuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXGNyYzMyLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxkZWZsYXRlLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxnemNsb3NlLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxnemd1dHMuaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXGd6bGliLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxnenJlYWQuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXGd6d3JpdGUuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXGluZmJhY2suYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXG1hc214NjRcaW5mZmFzODY2NC5jIg0KKwkJCQk+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iRGVidWd8V2luMzIiDQorCQkJCQlFeGNsdWRlZEZyb21CdWlsZD0idHJ1ZSINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iRGVidWd8SXRhbml1bSINCisJCQkJCUV4Y2x1ZGVkRnJvbUJ1aWxkPSJ0cnVlIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJSZWxlYXNlV2l0aG91dEFzbXxXaW4zMiINCisJCQkJCUV4Y2x1ZGVkRnJvbUJ1aWxkPSJ0cnVlIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJSZWxlYXNlV2l0aG91dEFzbXxJdGFuaXVtIg0KKwkJCQkJRXhjbHVkZWRGcm9tQnVpbGQ9InRydWUiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiDQorCQkJCQlFeGNsdWRlZEZyb21CdWlsZD0idHJ1ZSINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iUmVsZWFzZXxJdGFuaXVtIg0KKwkJCQkJRXhjbHVkZWRGcm9tQnVpbGQ9InRydWUiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXGluZmZhc3QuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXGluZmxhdGUuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXGluZnRyZWVzLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxtaW5pemlwXGlvYXBpLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxtaW5pemlwXGlvd2luMzIuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHRyZWVzLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlx1bmNvbXByLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxtaW5pemlwXHVuemlwLmMiDQorCQkJCT4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iWkxJQl9JTlRFUk5BTCINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iUmVsZWFzZXx4NjQiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJaTElCX0lOVEVSTkFMIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJSZWxlYXNlfEl0YW5pdW0iDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iIg0KKwkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJaTElCX0lOVEVSTkFMIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxtaW5pemlwXHppcC5jIg0KKwkJCQk+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIiDQorCQkJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IlpMSUJfSU5URVJOQUwiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IlJlbGVhc2V8eDY0Ig0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iWkxJQl9JTlRFUk5BTCINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iUmVsZWFzZXxJdGFuaXVtIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiINCisJCQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iWkxJQl9JTlRFUk5BTCINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLlx6bGliLnJjIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLlx6bGlidmMuZGVmIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cenV0aWwuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCTwvRmlsdGVyPg0KKwkJPEZpbHRlcg0KKwkJCU5hbWU9IkhlYWRlciBGaWxlcyINCisJCQlGaWx0ZXI9Img7aHBwO2h4eDtobTtpbmw7Zmk7ZmQiDQorCQkJPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cZGVmbGF0ZS5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5caW5mYmxvY2suaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXGluZmNvZGVzLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxpbmZmYXN0LmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxpbmZ0cmVlcy5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5caW5mdXRpbC5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cemNvbmYuaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHpsaWIuaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHp1dGlsLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQk8L0ZpbHRlcj4NCisJCTxGaWx0ZXINCisJCQlOYW1lPSJSZXNvdXJjZSBGaWxlcyINCisJCQlGaWx0ZXI9ImljbztjdXI7Ym1wO2RsZztyYzI7cmN0O2JpbjtjbnQ7cnRmO2dpZjtqcGc7anBlZztqcGUiDQorCQkJPg0KKwkJPC9GaWx0ZXI+DQorCTwvRmlsZXM+DQorCTxHbG9iYWxzPg0KKwk8L0dsb2JhbHM+DQorPC9WaXN1YWxTdHVkaW9Qcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL3psaWItMS4yLjYvY3JjMzIuYyBiL3psaWItMS4yLjYvY3JjMzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTI0NzFlCi0tLSAvZGV2L251bGwKKysrIGIvemxpYi0xLjIuNi9jcmMzMi5jCkBAIC0wLDAgKzEsNDQ3IEBACisvKiBjcmMzMi5jIC0tIGNvbXB1dGUgdGhlIENSQy0zMiBvZiBhIGRhdGEgc3RyZWFtCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwNiwgMjAxMCwgMjAxMSBNYXJrIEFkbGVyCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCisgKgorICogVGhhbmtzIHRvIFJvZG5leSBCcm93biA8cmJyb3duNjRAY3NjLmNvbS5hdT4gZm9yIGhpcyBjb250cmlidXRpb24gb2YgZmFzdGVyCisgKiBDUkMgbWV0aG9kczogZXhjbHVzaXZlLW9yaW5nIDMyIGJpdHMgb2YgZGF0YSBhdCBhIHRpbWUsIGFuZCBwcmUtY29tcHV0aW5nCisgKiB0YWJsZXMgZm9yIHVwZGF0aW5nIHRoZSBzaGlmdCByZWdpc3RlciBpbiBvbmUgc3RlcCB3aXRoIHRocmVlIGV4Y2x1c2l2ZS1vcnMKKyAqIGluc3RlYWQgb2YgZm91ciBzdGVwcyB3aXRoIGZvdXIgZXhjbHVzaXZlLW9ycy4gIFRoaXMgcmVzdWx0cyBpbiBhYm91dCBhCisgKiBmYWN0b3Igb2YgdHdvIGluY3JlYXNlIGluIHNwZWVkIG9uIGEgUG93ZXIgUEMgRzQgKFBQQzc0NTUpIHVzaW5nIGdjYyAtTzMuCisgKi8KKworLyogQCgjKSAkSWQkICovCisKKy8qCisgIE5vdGUgb24gdGhlIHVzZSBvZiBEWU5BTUlDX0NSQ19UQUJMRTogdGhlcmUgaXMgbm8gbXV0ZXggb3Igc2VtYXBob3JlCisgIHByb3RlY3Rpb24gb24gdGhlIHN0YXRpYyB2YXJpYWJsZXMgdXNlZCB0byBjb250cm9sIHRoZSBmaXJzdC11c2UgZ2VuZXJhdGlvbgorICBvZiB0aGUgY3JjIHRhYmxlcy4gIFRoZXJlZm9yZSwgaWYgeW91ICNkZWZpbmUgRFlOQU1JQ19DUkNfVEFCTEUsIHlvdSBzaG91bGQKKyAgZmlyc3QgY2FsbCBnZXRfY3JjX3RhYmxlKCkgdG8gaW5pdGlhbGl6ZSB0aGUgdGFibGVzIGJlZm9yZSBhbGxvd2luZyBtb3JlIHRoYW4KKyAgb25lIHRocmVhZCB0byB1c2UgY3JjMzIoKS4KKworICBEWU5BTUlDX0NSQ19UQUJMRSBhbmQgTUFLRUNSQ0ggY2FuIGJlICNkZWZpbmVkIHRvIHdyaXRlIG91dCBjcmMzMi5oLgorICovCisKKyNpZmRlZiBNQUtFQ1JDSAorIyAgaW5jbHVkZSA8c3RkaW8uaD4KKyMgIGlmbmRlZiBEWU5BTUlDX0NSQ19UQUJMRQorIyAgICBkZWZpbmUgRFlOQU1JQ19DUkNfVEFCTEUKKyMgIGVuZGlmIC8qICFEWU5BTUlDX0NSQ19UQUJMRSAqLworI2VuZGlmIC8qIE1BS0VDUkNIICovCisKKyNpbmNsdWRlICJ6dXRpbC5oIiAgICAgIC8qIGZvciBTVERDIGFuZCBGQVIgZGVmaW5pdGlvbnMgKi8KKworI2RlZmluZSBsb2NhbCBzdGF0aWMKKworLyogRmluZCBhIGZvdXItYnl0ZSBpbnRlZ2VyIHR5cGUgZm9yIGNyYzMyX2xpdHRsZSgpIGFuZCBjcmMzMl9iaWcoKS4gKi8KKyNpZm5kZWYgTk9CWUZPVVIKKyMgIGlmZGVmIFNUREMgICAgICAgICAgIC8qIG5lZWQgQU5TSSBDIGxpbWl0cy5oIHRvIGRldGVybWluZSBzaXplcyAqLworIyAgICBpbmNsdWRlIDxsaW1pdHMuaD4KKyMgICAgZGVmaW5lIEJZRk9VUgorIyAgICBpZiAoVUlOVF9NQVggPT0gMHhmZmZmZmZmZlVMKQorICAgICAgIHR5cGVkZWYgdW5zaWduZWQgaW50IHU0OworIyAgICBlbHNlCisjICAgICAgaWYgKFVMT05HX01BWCA9PSAweGZmZmZmZmZmVUwpCisgICAgICAgICB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgdTQ7CisjICAgICAgZWxzZQorIyAgICAgICAgaWYgKFVTSFJUX01BWCA9PSAweGZmZmZmZmZmVUwpCisgICAgICAgICAgIHR5cGVkZWYgdW5zaWduZWQgc2hvcnQgdTQ7CisjICAgICAgICBlbHNlCisjICAgICAgICAgIHVuZGVmIEJZRk9VUiAgICAgLyogY2FuJ3QgZmluZCBhIGZvdXItYnl0ZSBpbnRlZ2VyIHR5cGUhICovCisjICAgICAgICBlbmRpZgorIyAgICAgIGVuZGlmCisjICAgIGVuZGlmCisjICBlbmRpZiAvKiBTVERDICovCisjZW5kaWYgLyogIU5PQllGT1VSICovCisKKy8qIERlZmluaXRpb25zIGZvciBkb2luZyB0aGUgY3JjIGZvdXIgZGF0YSBieXRlcyBhdCBhIHRpbWUuICovCisjaWZkZWYgQllGT1VSCisgICB0eXBlZGVmIHU0IGNyY190YWJsZV90OworIyAgZGVmaW5lIFJFVih3KSAoKCgodyk+PjI0KSYweGZmKSsoKCh3KT4+OCkmMHhmZjAwKSsgXAorICAgICAgICAgICAgICAgICgoKHcpJjB4ZmYwMCk8PDgpKygoKHcpJjB4ZmYpPDwyNCkpCisgICBsb2NhbCB1bnNpZ25lZCBsb25nIGNyYzMyX2xpdHRsZSBPRigodW5zaWduZWQgbG9uZywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgRkFSICosIHVuc2lnbmVkKSk7CisgICBsb2NhbCB1bnNpZ25lZCBsb25nIGNyYzMyX2JpZyBPRigodW5zaWduZWQgbG9uZywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgRkFSICosIHVuc2lnbmVkKSk7CisjICBkZWZpbmUgVEJMUyA4CisjZWxzZQorICAgdHlwZWRlZiB1bnNpZ25lZCBsb25nIGNyY190YWJsZV90OworIyAgZGVmaW5lIFRCTFMgMQorI2VuZGlmIC8qIEJZRk9VUiAqLworCisvKiBMb2NhbCBmdW5jdGlvbnMgZm9yIGNyYyBjb25jYXRlbmF0aW9uICovCitsb2NhbCB1bnNpZ25lZCBsb25nIGdmMl9tYXRyaXhfdGltZXMgT0YoKHVuc2lnbmVkIGxvbmcgKm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyB2ZWMpKTsKK2xvY2FsIHZvaWQgZ2YyX21hdHJpeF9zcXVhcmUgT0YoKHVuc2lnbmVkIGxvbmcgKnNxdWFyZSwgdW5zaWduZWQgbG9uZyAqbWF0KSk7Citsb2NhbCB1TG9uZyBjcmMzMl9jb21iaW5lXyBPRigodUxvbmcgY3JjMSwgdUxvbmcgY3JjMiwgel9vZmY2NF90IGxlbjIpKTsKKworCisjaWZkZWYgRFlOQU1JQ19DUkNfVEFCTEUKKworbG9jYWwgdm9sYXRpbGUgaW50IGNyY190YWJsZV9lbXB0eSA9IDE7Citsb2NhbCBjcmNfdGFibGVfdCBGQVIgY3JjX3RhYmxlW1RCTFNdWzI1Nl07Citsb2NhbCB2b2lkIG1ha2VfY3JjX3RhYmxlIE9GKCh2b2lkKSk7CisjaWZkZWYgTUFLRUNSQ0gKKyAgIGxvY2FsIHZvaWQgd3JpdGVfdGFibGUgT0YoKEZJTEUgKiwgY29uc3QgY3JjX3RhYmxlX3QgRkFSICopKTsKKyNlbmRpZiAvKiBNQUtFQ1JDSCAqLworLyoKKyAgR2VuZXJhdGUgdGFibGVzIGZvciBhIGJ5dGUtd2lzZSAzMi1iaXQgQ1JDIGNhbGN1bGF0aW9uIG9uIHRoZSBwb2x5bm9taWFsOgorICB4XjMyK3heMjYreF4yMyt4XjIyK3heMTYreF4xMit4XjExK3heMTAreF44K3heNyt4XjUreF40K3heMit4KzEuCisKKyAgUG9seW5vbWlhbHMgb3ZlciBHRigyKSBhcmUgcmVwcmVzZW50ZWQgaW4gYmluYXJ5LCBvbmUgYml0IHBlciBjb2VmZmljaWVudCwKKyAgd2l0aCB0aGUgbG93ZXN0IHBvd2VycyBpbiB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXQuICBUaGVuIGFkZGluZyBwb2x5bm9taWFscworICBpcyBqdXN0IGV4Y2x1c2l2ZS1vciwgYW5kIG11bHRpcGx5aW5nIGEgcG9seW5vbWlhbCBieSB4IGlzIGEgcmlnaHQgc2hpZnQgYnkKKyAgb25lLiAgSWYgd2UgY2FsbCB0aGUgYWJvdmUgcG9seW5vbWlhbCBwLCBhbmQgcmVwcmVzZW50IGEgYnl0ZSBhcyB0aGUKKyAgcG9seW5vbWlhbCBxLCBhbHNvIHdpdGggdGhlIGxvd2VzdCBwb3dlciBpbiB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXQgKHNvIHRoZQorICBieXRlIDB4YjEgaXMgdGhlIHBvbHlub21pYWwgeF43K3heMyt4KzEpLCB0aGVuIHRoZSBDUkMgaXMgKHEqeF4zMikgbW9kIHAsCisgIHdoZXJlIGEgbW9kIGIgbWVhbnMgdGhlIHJlbWFpbmRlciBhZnRlciBkaXZpZGluZyBhIGJ5IGIuCisKKyAgVGhpcyBjYWxjdWxhdGlvbiBpcyBkb25lIHVzaW5nIHRoZSBzaGlmdC1yZWdpc3RlciBtZXRob2Qgb2YgbXVsdGlwbHlpbmcgYW5kCisgIHRha2luZyB0aGUgcmVtYWluZGVyLiAgVGhlIHJlZ2lzdGVyIGlzIGluaXRpYWxpemVkIHRvIHplcm8sIGFuZCBmb3IgZWFjaAorICBpbmNvbWluZyBiaXQsIHheMzIgaXMgYWRkZWQgbW9kIHAgdG8gdGhlIHJlZ2lzdGVyIGlmIHRoZSBiaXQgaXMgYSBvbmUgKHdoZXJlCisgIHheMzIgbW9kIHAgaXMgcCt4XjMyID0geF4yNisuLi4rMSksIGFuZCB0aGUgcmVnaXN0ZXIgaXMgbXVsdGlwbGllZCBtb2QgcCBieQorICB4ICh3aGljaCBpcyBzaGlmdGluZyByaWdodCBieSBvbmUgYW5kIGFkZGluZyB4XjMyIG1vZCBwIGlmIHRoZSBiaXQgc2hpZnRlZAorICBvdXQgaXMgYSBvbmUpLiAgV2Ugc3RhcnQgd2l0aCB0aGUgaGlnaGVzdCBwb3dlciAobGVhc3Qgc2lnbmlmaWNhbnQgYml0KSBvZgorICBxIGFuZCByZXBlYXQgZm9yIGFsbCBlaWdodCBiaXRzIG9mIHEuCisKKyAgVGhlIGZpcnN0IHRhYmxlIGlzIHNpbXBseSB0aGUgQ1JDIG9mIGFsbCBwb3NzaWJsZSBlaWdodCBiaXQgdmFsdWVzLiAgVGhpcyBpcworICBhbGwgdGhlIGluZm9ybWF0aW9uIG5lZWRlZCB0byBnZW5lcmF0ZSBDUkNzIG9uIGRhdGEgYSBieXRlIGF0IGEgdGltZSBmb3IgYWxsCisgIGNvbWJpbmF0aW9ucyBvZiBDUkMgcmVnaXN0ZXIgdmFsdWVzIGFuZCBpbmNvbWluZyBieXRlcy4gIFRoZSByZW1haW5pbmcgdGFibGVzCisgIGFsbG93IGZvciB3b3JkLWF0LWEtdGltZSBDUkMgY2FsY3VsYXRpb24gZm9yIGJvdGggYmlnLWVuZGlhbiBhbmQgbGl0dGxlLQorICBlbmRpYW4gbWFjaGluZXMsIHdoZXJlIGEgd29yZCBpcyBmb3VyIGJ5dGVzLgorKi8KK2xvY2FsIHZvaWQgbWFrZV9jcmNfdGFibGUoKQoreworICAgIGNyY190YWJsZV90IGM7CisgICAgaW50IG4sIGs7CisgICAgY3JjX3RhYmxlX3QgcG9seTsgICAgICAgICAgICAgICAgICAgLyogcG9seW5vbWlhbCBleGNsdXNpdmUtb3IgcGF0dGVybiAqLworICAgIC8qIHRlcm1zIG9mIHBvbHlub21pYWwgZGVmaW5pbmcgdGhpcyBjcmMgKGV4Y2VwdCB4XjMyKTogKi8KKyAgICBzdGF0aWMgdm9sYXRpbGUgaW50IGZpcnN0ID0gMTsgICAgICAvKiBmbGFnIHRvIGxpbWl0IGNvbmN1cnJlbnQgbWFraW5nICovCisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgcFtdID0gezAsMSwyLDQsNSw3LDgsMTAsMTEsMTIsMTYsMjIsMjMsMjZ9OworCisgICAgLyogU2VlIGlmIGFub3RoZXIgdGFzayBpcyBhbHJlYWR5IGRvaW5nIHRoaXMgKG5vdCB0aHJlYWQtc2FmZSwgYnV0IGJldHRlcgorICAgICAgIHRoYW4gbm90aGluZyAtLSBzaWduaWZpY2FudGx5IHJlZHVjZXMgZHVyYXRpb24gb2YgdnVsbmVyYWJpbGl0eSBpbgorICAgICAgIGNhc2UgdGhlIGFkdmljZSBhYm91dCBEWU5BTUlDX0NSQ19UQUJMRSBpcyBpZ25vcmVkKSAqLworICAgIGlmIChmaXJzdCkgeworICAgICAgICBmaXJzdCA9IDA7CisKKyAgICAgICAgLyogbWFrZSBleGNsdXNpdmUtb3IgcGF0dGVybiBmcm9tIHBvbHlub21pYWwgKDB4ZWRiODgzMjBVTCkgKi8KKyAgICAgICAgcG9seSA9IDA7CisgICAgICAgIGZvciAobiA9IDA7IG4gPCAoaW50KShzaXplb2YocCkvc2l6ZW9mKHVuc2lnbmVkIGNoYXIpKTsgbisrKQorICAgICAgICAgICAgcG9seSB8PSAoY3JjX3RhYmxlX3QpMSA8PCAoMzEgLSBwW25dKTsKKworICAgICAgICAvKiBnZW5lcmF0ZSBhIGNyYyBmb3IgZXZlcnkgOC1iaXQgdmFsdWUgKi8KKyAgICAgICAgZm9yIChuID0gMDsgbiA8IDI1NjsgbisrKSB7CisgICAgICAgICAgICBjID0gKGNyY190YWJsZV90KW47CisgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgODsgaysrKQorICAgICAgICAgICAgICAgIGMgPSBjICYgMSA/IHBvbHkgXiAoYyA+PiAxKSA6IGMgPj4gMTsKKyAgICAgICAgICAgIGNyY190YWJsZVswXVtuXSA9IGM7CisgICAgICAgIH0KKworI2lmZGVmIEJZRk9VUgorICAgICAgICAvKiBnZW5lcmF0ZSBjcmMgZm9yIGVhY2ggdmFsdWUgZm9sbG93ZWQgYnkgb25lLCB0d28sIGFuZCB0aHJlZSB6ZXJvcywKKyAgICAgICAgICAgYW5kIHRoZW4gdGhlIGJ5dGUgcmV2ZXJzYWwgb2YgdGhvc2UgYXMgd2VsbCBhcyB0aGUgZmlyc3QgdGFibGUgKi8KKyAgICAgICAgZm9yIChuID0gMDsgbiA8IDI1NjsgbisrKSB7CisgICAgICAgICAgICBjID0gY3JjX3RhYmxlWzBdW25dOworICAgICAgICAgICAgY3JjX3RhYmxlWzRdW25dID0gUkVWKGMpOworICAgICAgICAgICAgZm9yIChrID0gMTsgayA8IDQ7IGsrKykgeworICAgICAgICAgICAgICAgIGMgPSBjcmNfdGFibGVbMF1bYyAmIDB4ZmZdIF4gKGMgPj4gOCk7CisgICAgICAgICAgICAgICAgY3JjX3RhYmxlW2tdW25dID0gYzsKKyAgICAgICAgICAgICAgICBjcmNfdGFibGVbayArIDRdW25dID0gUkVWKGMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisjZW5kaWYgLyogQllGT1VSICovCisKKyAgICAgICAgY3JjX3RhYmxlX2VtcHR5ID0gMDsKKyAgICB9CisgICAgZWxzZSB7ICAgICAgLyogbm90IGZpcnN0ICovCisgICAgICAgIC8qIHdhaXQgZm9yIHRoZSBvdGhlciBndXkgdG8gZmluaXNoIChub3QgZWZmaWNpZW50LCBidXQgcmFyZSkgKi8KKyAgICAgICAgd2hpbGUgKGNyY190YWJsZV9lbXB0eSkKKyAgICAgICAgICAgIDsKKyAgICB9CisKKyNpZmRlZiBNQUtFQ1JDSAorICAgIC8qIHdyaXRlIG91dCBDUkMgdGFibGVzIHRvIGNyYzMyLmggKi8KKyAgICB7CisgICAgICAgIEZJTEUgKm91dDsKKworICAgICAgICBvdXQgPSBmb3BlbigiY3JjMzIuaCIsICJ3Iik7CisgICAgICAgIGlmIChvdXQgPT0gTlVMTCkgcmV0dXJuOworICAgICAgICBmcHJpbnRmKG91dCwgIi8qIGNyYzMyLmggLS0gdGFibGVzIGZvciByYXBpZCBDUkMgY2FsY3VsYXRpb25cbiIpOworICAgICAgICBmcHJpbnRmKG91dCwgIiAqIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNyYzMyLmNcbiAqL1xuXG4iKTsKKyAgICAgICAgZnByaW50ZihvdXQsICJsb2NhbCBjb25zdCBjcmNfdGFibGVfdCBGQVIgIik7CisgICAgICAgIGZwcmludGYob3V0LCAiY3JjX3RhYmxlW1RCTFNdWzI1Nl0gPVxue1xuICB7XG4iKTsKKyAgICAgICAgd3JpdGVfdGFibGUob3V0LCBjcmNfdGFibGVbMF0pOworIyAgaWZkZWYgQllGT1VSCisgICAgICAgIGZwcmludGYob3V0LCAiI2lmZGVmIEJZRk9VUlxuIik7CisgICAgICAgIGZvciAoayA9IDE7IGsgPCA4OyBrKyspIHsKKyAgICAgICAgICAgIGZwcmludGYob3V0LCAiICB9LFxuICB7XG4iKTsKKyAgICAgICAgICAgIHdyaXRlX3RhYmxlKG91dCwgY3JjX3RhYmxlW2tdKTsKKyAgICAgICAgfQorICAgICAgICBmcHJpbnRmKG91dCwgIiNlbmRpZlxuIik7CisjICBlbmRpZiAvKiBCWUZPVVIgKi8KKyAgICAgICAgZnByaW50ZihvdXQsICIgIH1cbn07XG4iKTsKKyAgICAgICAgZmNsb3NlKG91dCk7CisgICAgfQorI2VuZGlmIC8qIE1BS0VDUkNIICovCit9CisKKyNpZmRlZiBNQUtFQ1JDSAorbG9jYWwgdm9pZCB3cml0ZV90YWJsZShvdXQsIHRhYmxlKQorICAgIEZJTEUgKm91dDsKKyAgICBjb25zdCBjcmNfdGFibGVfdCBGQVIgKnRhYmxlOworeworICAgIGludCBuOworCisgICAgZm9yIChuID0gMDsgbiA8IDI1NjsgbisrKQorICAgICAgICBmcHJpbnRmKG91dCwgIiVzMHglMDhseFVMJXMiLCBuICUgNSA/ICIiIDogIiAgICAiLAorICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSh0YWJsZVtuXSksCisgICAgICAgICAgICAgICAgbiA9PSAyNTUgPyAiXG4iIDogKG4gJSA1ID09IDQgPyAiLFxuIiA6ICIsICIpKTsKK30KKyNlbmRpZiAvKiBNQUtFQ1JDSCAqLworCisjZWxzZSAvKiAhRFlOQU1JQ19DUkNfVEFCTEUgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogVGFibGVzIG9mIENSQy0zMnMgb2YgYWxsIHNpbmdsZS1ieXRlIHZhbHVlcywgbWFkZSBieSBtYWtlX2NyY190YWJsZSgpLgorICovCisjaW5jbHVkZSAiY3JjMzIuaCIKKyNlbmRpZiAvKiBEWU5BTUlDX0NSQ19UQUJMRSAqLworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIGJ5IGFzbSB2ZXJzaW9ucyBvZiBjcmMzMigpCisgKi8KK2NvbnN0IHVuc2lnbmVkIGxvbmcgRkFSICogWkVYUE9SVCBnZXRfY3JjX3RhYmxlKCkKK3sKKyNpZmRlZiBEWU5BTUlDX0NSQ19UQUJMRQorICAgIGlmIChjcmNfdGFibGVfZW1wdHkpCisgICAgICAgIG1ha2VfY3JjX3RhYmxlKCk7CisjZW5kaWYgLyogRFlOQU1JQ19DUkNfVEFCTEUgKi8KKyAgICByZXR1cm4gKGNvbnN0IHVuc2lnbmVkIGxvbmcgRkFSICopY3JjX3RhYmxlOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisjZGVmaW5lIERPMSBjcmMgPSBjcmNfdGFibGVbMF1bKChpbnQpY3JjIF4gKCpidWYrKykpICYgMHhmZl0gXiAoY3JjID4+IDgpCisjZGVmaW5lIERPOCBETzE7IERPMTsgRE8xOyBETzE7IERPMTsgRE8xOyBETzE7IERPMQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCit1bnNpZ25lZCBsb25nIFpFWFBPUlQgY3JjMzIoY3JjLCBidWYsIGxlbikKKyAgICB1bnNpZ25lZCBsb25nIGNyYzsKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyIEZBUiAqYnVmOworICAgIHVJbnQgbGVuOworeworICAgIGlmIChidWYgPT0gWl9OVUxMKSByZXR1cm4gMFVMOworCisjaWZkZWYgRFlOQU1JQ19DUkNfVEFCTEUKKyAgICBpZiAoY3JjX3RhYmxlX2VtcHR5KQorICAgICAgICBtYWtlX2NyY190YWJsZSgpOworI2VuZGlmIC8qIERZTkFNSUNfQ1JDX1RBQkxFICovCisKKyNpZmRlZiBCWUZPVVIKKyAgICBpZiAoc2l6ZW9mKHZvaWQgKikgPT0gc2l6ZW9mKHB0cmRpZmZfdCkpIHsKKyAgICAgICAgdTQgZW5kaWFuOworCisgICAgICAgIGVuZGlhbiA9IDE7CisgICAgICAgIGlmICgqKCh1bnNpZ25lZCBjaGFyICopKCZlbmRpYW4pKSkKKyAgICAgICAgICAgIHJldHVybiBjcmMzMl9saXR0bGUoY3JjLCBidWYsIGxlbik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBjcmMzMl9iaWcoY3JjLCBidWYsIGxlbik7CisgICAgfQorI2VuZGlmIC8qIEJZRk9VUiAqLworICAgIGNyYyA9IGNyYyBeIDB4ZmZmZmZmZmZVTDsKKyAgICB3aGlsZSAobGVuID49IDgpIHsKKyAgICAgICAgRE84OworICAgICAgICBsZW4gLT0gODsKKyAgICB9CisgICAgaWYgKGxlbikgZG8geworICAgICAgICBETzE7CisgICAgfSB3aGlsZSAoLS1sZW4pOworICAgIHJldHVybiBjcmMgXiAweGZmZmZmZmZmVUw7Cit9CisKKyNpZmRlZiBCWUZPVVIKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworI2RlZmluZSBET0xJVDQgYyBePSAqYnVmNCsrOyBcCisgICAgICAgIGMgPSBjcmNfdGFibGVbM11bYyAmIDB4ZmZdIF4gY3JjX3RhYmxlWzJdWyhjID4+IDgpICYgMHhmZl0gXiBcCisgICAgICAgICAgICBjcmNfdGFibGVbMV1bKGMgPj4gMTYpICYgMHhmZl0gXiBjcmNfdGFibGVbMF1bYyA+PiAyNF0KKyNkZWZpbmUgRE9MSVQzMiBET0xJVDQ7IERPTElUNDsgRE9MSVQ0OyBET0xJVDQ7IERPTElUNDsgRE9MSVQ0OyBET0xJVDQ7IERPTElUNAorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitsb2NhbCB1bnNpZ25lZCBsb25nIGNyYzMyX2xpdHRsZShjcmMsIGJ1ZiwgbGVuKQorICAgIHVuc2lnbmVkIGxvbmcgY3JjOworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgRkFSICpidWY7CisgICAgdW5zaWduZWQgbGVuOworeworICAgIHJlZ2lzdGVyIHU0IGM7CisgICAgcmVnaXN0ZXIgY29uc3QgdTQgRkFSICpidWY0OworCisgICAgYyA9ICh1NCljcmM7CisgICAgYyA9IH5jOworICAgIHdoaWxlIChsZW4gJiYgKChwdHJkaWZmX3QpYnVmICYgMykpIHsKKyAgICAgICAgYyA9IGNyY190YWJsZVswXVsoYyBeICpidWYrKykgJiAweGZmXSBeIChjID4+IDgpOworICAgICAgICBsZW4tLTsKKyAgICB9CisKKyAgICBidWY0ID0gKGNvbnN0IHU0IEZBUiAqKShjb25zdCB2b2lkIEZBUiAqKWJ1ZjsKKyAgICB3aGlsZSAobGVuID49IDMyKSB7CisgICAgICAgIERPTElUMzI7CisgICAgICAgIGxlbiAtPSAzMjsKKyAgICB9CisgICAgd2hpbGUgKGxlbiA+PSA0KSB7CisgICAgICAgIERPTElUNDsKKyAgICAgICAgbGVuIC09IDQ7CisgICAgfQorICAgIGJ1ZiA9IChjb25zdCB1bnNpZ25lZCBjaGFyIEZBUiAqKWJ1ZjQ7CisKKyAgICBpZiAobGVuKSBkbyB7CisgICAgICAgIGMgPSBjcmNfdGFibGVbMF1bKGMgXiAqYnVmKyspICYgMHhmZl0gXiAoYyA+PiA4KTsKKyAgICB9IHdoaWxlICgtLWxlbik7CisgICAgYyA9IH5jOworICAgIHJldHVybiAodW5zaWduZWQgbG9uZyljOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisjZGVmaW5lIERPQklHNCBjIF49ICorK2J1ZjQ7IFwKKyAgICAgICAgYyA9IGNyY190YWJsZVs0XVtjICYgMHhmZl0gXiBjcmNfdGFibGVbNV1bKGMgPj4gOCkgJiAweGZmXSBeIFwKKyAgICAgICAgICAgIGNyY190YWJsZVs2XVsoYyA+PiAxNikgJiAweGZmXSBeIGNyY190YWJsZVs3XVtjID4+IDI0XQorI2RlZmluZSBET0JJRzMyIERPQklHNDsgRE9CSUc0OyBET0JJRzQ7IERPQklHNDsgRE9CSUc0OyBET0JJRzQ7IERPQklHNDsgRE9CSUc0CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK2xvY2FsIHVuc2lnbmVkIGxvbmcgY3JjMzJfYmlnKGNyYywgYnVmLCBsZW4pCisgICAgdW5zaWduZWQgbG9uZyBjcmM7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciBGQVIgKmJ1ZjsKKyAgICB1bnNpZ25lZCBsZW47Cit7CisgICAgcmVnaXN0ZXIgdTQgYzsKKyAgICByZWdpc3RlciBjb25zdCB1NCBGQVIgKmJ1ZjQ7CisKKyAgICBjID0gUkVWKCh1NCljcmMpOworICAgIGMgPSB+YzsKKyAgICB3aGlsZSAobGVuICYmICgocHRyZGlmZl90KWJ1ZiAmIDMpKSB7CisgICAgICAgIGMgPSBjcmNfdGFibGVbNF1bKGMgPj4gMjQpIF4gKmJ1ZisrXSBeIChjIDw8IDgpOworICAgICAgICBsZW4tLTsKKyAgICB9CisKKyAgICBidWY0ID0gKGNvbnN0IHU0IEZBUiAqKShjb25zdCB2b2lkIEZBUiAqKWJ1ZjsKKyAgICBidWY0LS07CisgICAgd2hpbGUgKGxlbiA+PSAzMikgeworICAgICAgICBET0JJRzMyOworICAgICAgICBsZW4gLT0gMzI7CisgICAgfQorICAgIHdoaWxlIChsZW4gPj0gNCkgeworICAgICAgICBET0JJRzQ7CisgICAgICAgIGxlbiAtPSA0OworICAgIH0KKyAgICBidWY0Kys7CisgICAgYnVmID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgRkFSICopYnVmNDsKKworICAgIGlmIChsZW4pIGRvIHsKKyAgICAgICAgYyA9IGNyY190YWJsZVs0XVsoYyA+PiAyNCkgXiAqYnVmKytdIF4gKGMgPDwgOCk7CisgICAgfSB3aGlsZSAoLS1sZW4pOworICAgIGMgPSB+YzsKKyAgICByZXR1cm4gKHVuc2lnbmVkIGxvbmcpKFJFVihjKSk7Cit9CisKKyNlbmRpZiAvKiBCWUZPVVIgKi8KKworI2RlZmluZSBHRjJfRElNIDMyICAgICAgLyogZGltZW5zaW9uIG9mIEdGKDIpIHZlY3RvcnMgKGxlbmd0aCBvZiBDUkMpICovCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK2xvY2FsIHVuc2lnbmVkIGxvbmcgZ2YyX21hdHJpeF90aW1lcyhtYXQsIHZlYykKKyAgICB1bnNpZ25lZCBsb25nICptYXQ7CisgICAgdW5zaWduZWQgbG9uZyB2ZWM7Cit7CisgICAgdW5zaWduZWQgbG9uZyBzdW07CisKKyAgICBzdW0gPSAwOworICAgIHdoaWxlICh2ZWMpIHsKKyAgICAgICAgaWYgKHZlYyAmIDEpCisgICAgICAgICAgICBzdW0gXj0gKm1hdDsKKyAgICAgICAgdmVjID4+PSAxOworICAgICAgICBtYXQrKzsKKyAgICB9CisgICAgcmV0dXJuIHN1bTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworbG9jYWwgdm9pZCBnZjJfbWF0cml4X3NxdWFyZShzcXVhcmUsIG1hdCkKKyAgICB1bnNpZ25lZCBsb25nICpzcXVhcmU7CisgICAgdW5zaWduZWQgbG9uZyAqbWF0OworeworICAgIGludCBuOworCisgICAgZm9yIChuID0gMDsgbiA8IEdGMl9ESU07IG4rKykKKyAgICAgICAgc3F1YXJlW25dID0gZ2YyX21hdHJpeF90aW1lcyhtYXQsIG1hdFtuXSk7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK2xvY2FsIHVMb25nIGNyYzMyX2NvbWJpbmVfKGNyYzEsIGNyYzIsIGxlbjIpCisgICAgdUxvbmcgY3JjMTsKKyAgICB1TG9uZyBjcmMyOworICAgIHpfb2ZmNjRfdCBsZW4yOworeworICAgIGludCBuOworICAgIHVuc2lnbmVkIGxvbmcgcm93OworICAgIHVuc2lnbmVkIGxvbmcgZXZlbltHRjJfRElNXTsgICAgLyogZXZlbi1wb3dlci1vZi10d28gemVyb3Mgb3BlcmF0b3IgKi8KKyAgICB1bnNpZ25lZCBsb25nIG9kZFtHRjJfRElNXTsgICAgIC8qIG9kZC1wb3dlci1vZi10d28gemVyb3Mgb3BlcmF0b3IgKi8KKworICAgIC8qIGRlZ2VuZXJhdGUgY2FzZSAoYWxzbyBkaXNhbGxvdyBuZWdhdGl2ZSBsZW5ndGhzKSAqLworICAgIGlmIChsZW4yIDw9IDApCisgICAgICAgIHJldHVybiBjcmMxOworCisgICAgLyogcHV0IG9wZXJhdG9yIGZvciBvbmUgemVybyBiaXQgaW4gb2RkICovCisgICAgb2RkWzBdID0gMHhlZGI4ODMyMFVMOyAgICAgICAgICAvKiBDUkMtMzIgcG9seW5vbWlhbCAqLworICAgIHJvdyA9IDE7CisgICAgZm9yIChuID0gMTsgbiA8IEdGMl9ESU07IG4rKykgeworICAgICAgICBvZGRbbl0gPSByb3c7CisgICAgICAgIHJvdyA8PD0gMTsKKyAgICB9CisKKyAgICAvKiBwdXQgb3BlcmF0b3IgZm9yIHR3byB6ZXJvIGJpdHMgaW4gZXZlbiAqLworICAgIGdmMl9tYXRyaXhfc3F1YXJlKGV2ZW4sIG9kZCk7CisKKyAgICAvKiBwdXQgb3BlcmF0b3IgZm9yIGZvdXIgemVybyBiaXRzIGluIG9kZCAqLworICAgIGdmMl9tYXRyaXhfc3F1YXJlKG9kZCwgZXZlbik7CisKKyAgICAvKiBhcHBseSBsZW4yIHplcm9zIHRvIGNyYzEgKGZpcnN0IHNxdWFyZSB3aWxsIHB1dCB0aGUgb3BlcmF0b3IgZm9yIG9uZQorICAgICAgIHplcm8gYnl0ZSwgZWlnaHQgemVybyBiaXRzLCBpbiBldmVuKSAqLworICAgIGRvIHsKKyAgICAgICAgLyogYXBwbHkgemVyb3Mgb3BlcmF0b3IgZm9yIHRoaXMgYml0IG9mIGxlbjIgKi8KKyAgICAgICAgZ2YyX21hdHJpeF9zcXVhcmUoZXZlbiwgb2RkKTsKKyAgICAgICAgaWYgKGxlbjIgJiAxKQorICAgICAgICAgICAgY3JjMSA9IGdmMl9tYXRyaXhfdGltZXMoZXZlbiwgY3JjMSk7CisgICAgICAgIGxlbjIgPj49IDE7CisKKyAgICAgICAgLyogaWYgbm8gbW9yZSBiaXRzIHNldCwgdGhlbiBkb25lICovCisgICAgICAgIGlmIChsZW4yID09IDApCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAvKiBhbm90aGVyIGl0ZXJhdGlvbiBvZiB0aGUgbG9vcCB3aXRoIG9kZCBhbmQgZXZlbiBzd2FwcGVkICovCisgICAgICAgIGdmMl9tYXRyaXhfc3F1YXJlKG9kZCwgZXZlbik7CisgICAgICAgIGlmIChsZW4yICYgMSkKKyAgICAgICAgICAgIGNyYzEgPSBnZjJfbWF0cml4X3RpbWVzKG9kZCwgY3JjMSk7CisgICAgICAgIGxlbjIgPj49IDE7CisKKyAgICAgICAgLyogaWYgbm8gbW9yZSBiaXRzIHNldCwgdGhlbiBkb25lICovCisgICAgfSB3aGlsZSAobGVuMiAhPSAwKTsKKworICAgIC8qIHJldHVybiBjb21iaW5lZCBjcmMgKi8KKyAgICBjcmMxIF49IGNyYzI7CisgICAgcmV0dXJuIGNyYzE7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK3VMb25nIFpFWFBPUlQgY3JjMzJfY29tYmluZShjcmMxLCBjcmMyLCBsZW4yKQorICAgIHVMb25nIGNyYzE7CisgICAgdUxvbmcgY3JjMjsKKyAgICB6X29mZl90IGxlbjI7Cit7CisgICAgcmV0dXJuIGNyYzMyX2NvbWJpbmVfKGNyYzEsIGNyYzIsIGxlbjIpOworfQorCit1TG9uZyBaRVhQT1JUIGNyYzMyX2NvbWJpbmU2NChjcmMxLCBjcmMyLCBsZW4yKQorICAgIHVMb25nIGNyYzE7CisgICAgdUxvbmcgY3JjMjsKKyAgICB6X29mZjY0X3QgbGVuMjsKK3sKKyAgICByZXR1cm4gY3JjMzJfY29tYmluZV8oY3JjMSwgY3JjMiwgbGVuMik7Cit9CmRpZmYgLS1naXQgYS96bGliLTEuMi42L2NyYzMyLmggYi96bGliLTEuMi42L2NyYzMyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNlNzE3MQotLS0gL2Rldi9udWxsCisrKyBiL3psaWItMS4yLjYvY3JjMzIuaApAQCAtMCwwICsxLDQ0MSBAQAorLyogY3JjMzIuaCAtLSB0YWJsZXMgZm9yIHJhcGlkIENSQyBjYWxjdWxhdGlvbgorICogR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgY3JjMzIuYworICovCisKK2xvY2FsIGNvbnN0IGNyY190YWJsZV90IEZBUiBjcmNfdGFibGVbVEJMU11bMjU2XSA9Cit7CisgIHsKKyAgICAweDAwMDAwMDAwVUwsIDB4NzcwNzMwOTZVTCwgMHhlZTBlNjEyY1VMLCAweDk5MDk1MWJhVUwsIDB4MDc2ZGM0MTlVTCwKKyAgICAweDcwNmFmNDhmVUwsIDB4ZTk2M2E1MzVVTCwgMHg5ZTY0OTVhM1VMLCAweDBlZGI4ODMyVUwsIDB4NzlkY2I4YTRVTCwKKyAgICAweGUwZDVlOTFlVUwsIDB4OTdkMmQ5ODhVTCwgMHgwOWI2NGMyYlVMLCAweDdlYjE3Y2JkVUwsIDB4ZTdiODJkMDdVTCwKKyAgICAweDkwYmYxZDkxVUwsIDB4MWRiNzEwNjRVTCwgMHg2YWIwMjBmMlVMLCAweGYzYjk3MTQ4VUwsIDB4ODRiZTQxZGVVTCwKKyAgICAweDFhZGFkNDdkVUwsIDB4NmRkZGU0ZWJVTCwgMHhmNGQ0YjU1MVVMLCAweDgzZDM4NWM3VUwsIDB4MTM2Yzk4NTZVTCwKKyAgICAweDY0NmJhOGMwVUwsIDB4ZmQ2MmY5N2FVTCwgMHg4YTY1YzllY1VMLCAweDE0MDE1YzRmVUwsIDB4NjMwNjZjZDlVTCwKKyAgICAweGZhMGYzZDYzVUwsIDB4OGQwODBkZjVVTCwgMHgzYjZlMjBjOFVMLCAweDRjNjkxMDVlVUwsIDB4ZDU2MDQxZTRVTCwKKyAgICAweGEyNjc3MTcyVUwsIDB4M2MwM2U0ZDFVTCwgMHg0YjA0ZDQ0N1VMLCAweGQyMGQ4NWZkVUwsIDB4YTUwYWI1NmJVTCwKKyAgICAweDM1YjVhOGZhVUwsIDB4NDJiMjk4NmNVTCwgMHhkYmJiYzlkNlVMLCAweGFjYmNmOTQwVUwsIDB4MzJkODZjZTNVTCwKKyAgICAweDQ1ZGY1Yzc1VUwsIDB4ZGNkNjBkY2ZVTCwgMHhhYmQxM2Q1OVVMLCAweDI2ZDkzMGFjVUwsIDB4NTFkZTAwM2FVTCwKKyAgICAweGM4ZDc1MTgwVUwsIDB4YmZkMDYxMTZVTCwgMHgyMWI0ZjRiNVVMLCAweDU2YjNjNDIzVUwsIDB4Y2ZiYTk1OTlVTCwKKyAgICAweGI4YmRhNTBmVUwsIDB4MjgwMmI4OWVVTCwgMHg1ZjA1ODgwOFVMLCAweGM2MGNkOWIyVUwsIDB4YjEwYmU5MjRVTCwKKyAgICAweDJmNmY3Yzg3VUwsIDB4NTg2ODRjMTFVTCwgMHhjMTYxMWRhYlVMLCAweGI2NjYyZDNkVUwsIDB4NzZkYzQxOTBVTCwKKyAgICAweDAxZGI3MTA2VUwsIDB4OThkMjIwYmNVTCwgMHhlZmQ1MTAyYVVMLCAweDcxYjE4NTg5VUwsIDB4MDZiNmI1MWZVTCwKKyAgICAweDlmYmZlNGE1VUwsIDB4ZThiOGQ0MzNVTCwgMHg3ODA3YzlhMlVMLCAweDBmMDBmOTM0VUwsIDB4OTYwOWE4OGVVTCwKKyAgICAweGUxMGU5ODE4VUwsIDB4N2Y2YTBkYmJVTCwgMHgwODZkM2QyZFVMLCAweDkxNjQ2Yzk3VUwsIDB4ZTY2MzVjMDFVTCwKKyAgICAweDZiNmI1MWY0VUwsIDB4MWM2YzYxNjJVTCwgMHg4NTY1MzBkOFVMLCAweGYyNjIwMDRlVUwsIDB4NmMwNjk1ZWRVTCwKKyAgICAweDFiMDFhNTdiVUwsIDB4ODIwOGY0YzFVTCwgMHhmNTBmYzQ1N1VMLCAweDY1YjBkOWM2VUwsIDB4MTJiN2U5NTBVTCwKKyAgICAweDhiYmViOGVhVUwsIDB4ZmNiOTg4N2NVTCwgMHg2MmRkMWRkZlVMLCAweDE1ZGEyZDQ5VUwsIDB4OGNkMzdjZjNVTCwKKyAgICAweGZiZDQ0YzY1VUwsIDB4NGRiMjYxNThVTCwgMHgzYWI1NTFjZVVMLCAweGEzYmMwMDc0VUwsIDB4ZDRiYjMwZTJVTCwKKyAgICAweDRhZGZhNTQxVUwsIDB4M2RkODk1ZDdVTCwgMHhhNGQxYzQ2ZFVMLCAweGQzZDZmNGZiVUwsIDB4NDM2OWU5NmFVTCwKKyAgICAweDM0NmVkOWZjVUwsIDB4YWQ2Nzg4NDZVTCwgMHhkYTYwYjhkMFVMLCAweDQ0MDQyZDczVUwsIDB4MzMwMzFkZTVVTCwKKyAgICAweGFhMGE0YzVmVUwsIDB4ZGQwZDdjYzlVTCwgMHg1MDA1NzEzY1VMLCAweDI3MDI0MWFhVUwsIDB4YmUwYjEwMTBVTCwKKyAgICAweGM5MGMyMDg2VUwsIDB4NTc2OGI1MjVVTCwgMHgyMDZmODViM1VMLCAweGI5NjZkNDA5VUwsIDB4Y2U2MWU0OWZVTCwKKyAgICAweDVlZGVmOTBlVUwsIDB4MjlkOWM5OThVTCwgMHhiMGQwOTgyMlVMLCAweGM3ZDdhOGI0VUwsIDB4NTliMzNkMTdVTCwKKyAgICAweDJlYjQwZDgxVUwsIDB4YjdiZDVjM2JVTCwgMHhjMGJhNmNhZFVMLCAweGVkYjg4MzIwVUwsIDB4OWFiZmIzYjZVTCwKKyAgICAweDAzYjZlMjBjVUwsIDB4NzRiMWQyOWFVTCwgMHhlYWQ1NDczOVVMLCAweDlkZDI3N2FmVUwsIDB4MDRkYjI2MTVVTCwKKyAgICAweDczZGMxNjgzVUwsIDB4ZTM2MzBiMTJVTCwgMHg5NDY0M2I4NFVMLCAweDBkNmQ2YTNlVUwsIDB4N2E2YTVhYThVTCwKKyAgICAweGU0MGVjZjBiVUwsIDB4OTMwOWZmOWRVTCwgMHgwYTAwYWUyN1VMLCAweDdkMDc5ZWIxVUwsIDB4ZjAwZjkzNDRVTCwKKyAgICAweDg3MDhhM2QyVUwsIDB4MWUwMWYyNjhVTCwgMHg2OTA2YzJmZVVMLCAweGY3NjI1NzVkVUwsIDB4ODA2NTY3Y2JVTCwKKyAgICAweDE5NmMzNjcxVUwsIDB4NmU2YjA2ZTdVTCwgMHhmZWQ0MWI3NlVMLCAweDg5ZDMyYmUwVUwsIDB4MTBkYTdhNWFVTCwKKyAgICAweDY3ZGQ0YWNjVUwsIDB4ZjliOWRmNmZVTCwgMHg4ZWJlZWZmOVVMLCAweDE3YjdiZTQzVUwsIDB4NjBiMDhlZDVVTCwKKyAgICAweGQ2ZDZhM2U4VUwsIDB4YTFkMTkzN2VVTCwgMHgzOGQ4YzJjNFVMLCAweDRmZGZmMjUyVUwsIDB4ZDFiYjY3ZjFVTCwKKyAgICAweGE2YmM1NzY3VUwsIDB4M2ZiNTA2ZGRVTCwgMHg0OGIyMzY0YlVMLCAweGQ4MGQyYmRhVUwsIDB4YWYwYTFiNGNVTCwKKyAgICAweDM2MDM0YWY2VUwsIDB4NDEwNDdhNjBVTCwgMHhkZjYwZWZjM1VMLCAweGE4NjdkZjU1VUwsIDB4MzE2ZThlZWZVTCwKKyAgICAweDQ2NjliZTc5VUwsIDB4Y2I2MWIzOGNVTCwgMHhiYzY2ODMxYVVMLCAweDI1NmZkMmEwVUwsIDB4NTI2OGUyMzZVTCwKKyAgICAweGNjMGM3Nzk1VUwsIDB4YmIwYjQ3MDNVTCwgMHgyMjAyMTZiOVVMLCAweDU1MDUyNjJmVUwsIDB4YzViYTNiYmVVTCwKKyAgICAweGIyYmQwYjI4VUwsIDB4MmJiNDVhOTJVTCwgMHg1Y2IzNmEwNFVMLCAweGMyZDdmZmE3VUwsIDB4YjVkMGNmMzFVTCwKKyAgICAweDJjZDk5ZThiVUwsIDB4NWJkZWFlMWRVTCwgMHg5YjY0YzJiMFVMLCAweGVjNjNmMjI2VUwsIDB4NzU2YWEzOWNVTCwKKyAgICAweDAyNmQ5MzBhVUwsIDB4OWMwOTA2YTlVTCwgMHhlYjBlMzYzZlVMLCAweDcyMDc2Nzg1VUwsIDB4MDUwMDU3MTNVTCwKKyAgICAweDk1YmY0YTgyVUwsIDB4ZTJiODdhMTRVTCwgMHg3YmIxMmJhZVVMLCAweDBjYjYxYjM4VUwsIDB4OTJkMjhlOWJVTCwKKyAgICAweGU1ZDViZTBkVUwsIDB4N2NkY2VmYjdVTCwgMHgwYmRiZGYyMVVMLCAweDg2ZDNkMmQ0VUwsIDB4ZjFkNGUyNDJVTCwKKyAgICAweDY4ZGRiM2Y4VUwsIDB4MWZkYTgzNmVVTCwgMHg4MWJlMTZjZFVMLCAweGY2YjkyNjViVUwsIDB4NmZiMDc3ZTFVTCwKKyAgICAweDE4Yjc0Nzc3VUwsIDB4ODgwODVhZTZVTCwgMHhmZjBmNmE3MFVMLCAweDY2MDYzYmNhVUwsIDB4MTEwMTBiNWNVTCwKKyAgICAweDhmNjU5ZWZmVUwsIDB4Zjg2MmFlNjlVTCwgMHg2MTZiZmZkM1VMLCAweDE2NmNjZjQ1VUwsIDB4YTAwYWUyNzhVTCwKKyAgICAweGQ3MGRkMmVlVUwsIDB4NGUwNDgzNTRVTCwgMHgzOTAzYjNjMlVMLCAweGE3NjcyNjYxVUwsIDB4ZDA2MDE2ZjdVTCwKKyAgICAweDQ5Njk0NzRkVUwsIDB4M2U2ZTc3ZGJVTCwgMHhhZWQxNmE0YVVMLCAweGQ5ZDY1YWRjVUwsIDB4NDBkZjBiNjZVTCwKKyAgICAweDM3ZDgzYmYwVUwsIDB4YTliY2FlNTNVTCwgMHhkZWJiOWVjNVVMLCAweDQ3YjJjZjdmVUwsIDB4MzBiNWZmZTlVTCwKKyAgICAweGJkYmRmMjFjVUwsIDB4Y2FiYWMyOGFVTCwgMHg1M2IzOTMzMFVMLCAweDI0YjRhM2E2VUwsIDB4YmFkMDM2MDVVTCwKKyAgICAweGNkZDcwNjkzVUwsIDB4NTRkZTU3MjlVTCwgMHgyM2Q5NjdiZlVMLCAweGIzNjY3YTJlVUwsIDB4YzQ2MTRhYjhVTCwKKyAgICAweDVkNjgxYjAyVUwsIDB4MmE2ZjJiOTRVTCwgMHhiNDBiYmUzN1VMLCAweGMzMGM4ZWExVUwsIDB4NWEwNWRmMWJVTCwKKyAgICAweDJkMDJlZjhkVUwKKyNpZmRlZiBCWUZPVVIKKyAgfSwKKyAgeworICAgIDB4MDAwMDAwMDBVTCwgMHgxOTFiMzE0MVVMLCAweDMyMzY2MjgyVUwsIDB4MmIyZDUzYzNVTCwgMHg2NDZjYzUwNFVMLAorICAgIDB4N2Q3N2Y0NDVVTCwgMHg1NjVhYTc4NlVMLCAweDRmNDE5NmM3VUwsIDB4YzhkOThhMDhVTCwgMHhkMWMyYmI0OVVMLAorICAgIDB4ZmFlZmU4OGFVTCwgMHhlM2Y0ZDljYlVMLCAweGFjYjU0ZjBjVUwsIDB4YjVhZTdlNGRVTCwgMHg5ZTgzMmQ4ZVVMLAorICAgIDB4ODc5ODFjY2ZVTCwgMHg0YWMyMTI1MVVMLCAweDUzZDkyMzEwVUwsIDB4NzhmNDcwZDNVTCwgMHg2MWVmNDE5MlVMLAorICAgIDB4MmVhZWQ3NTVVTCwgMHgzN2I1ZTYxNFVMLCAweDFjOThiNWQ3VUwsIDB4MDU4Mzg0OTZVTCwgMHg4MjFiOTg1OVVMLAorICAgIDB4OWIwMGE5MThVTCwgMHhiMDJkZmFkYlVMLCAweGE5MzZjYjlhVUwsIDB4ZTY3NzVkNWRVTCwgMHhmZjZjNmMxY1VMLAorICAgIDB4ZDQ0MTNmZGZVTCwgMHhjZDVhMGU5ZVVMLCAweDk1ODQyNGEyVUwsIDB4OGM5ZjE1ZTNVTCwgMHhhN2IyNDYyMFVMLAorICAgIDB4YmVhOTc3NjFVTCwgMHhmMWU4ZTFhNlVMLCAweGU4ZjNkMGU3VUwsIDB4YzNkZTgzMjRVTCwgMHhkYWM1YjI2NVVMLAorICAgIDB4NWQ1ZGFlYWFVTCwgMHg0NDQ2OWZlYlVMLCAweDZmNmJjYzI4VUwsIDB4NzY3MGZkNjlVTCwgMHgzOTMxNmJhZVVMLAorICAgIDB4MjAyYTVhZWZVTCwgMHgwYjA3MDkyY1VMLCAweDEyMWMzODZkVUwsIDB4ZGY0NjM2ZjNVTCwgMHhjNjVkMDdiMlVMLAorICAgIDB4ZWQ3MDU0NzFVTCwgMHhmNDZiNjUzMFVMLCAweGJiMmFmM2Y3VUwsIDB4YTIzMWMyYjZVTCwgMHg4OTFjOTE3NVVMLAorICAgIDB4OTAwN2EwMzRVTCwgMHgxNzlmYmNmYlVMLCAweDBlODQ4ZGJhVUwsIDB4MjVhOWRlNzlVTCwgMHgzY2IyZWYzOFVMLAorICAgIDB4NzNmMzc5ZmZVTCwgMHg2YWU4NDhiZVVMLCAweDQxYzUxYjdkVUwsIDB4NThkZTJhM2NVTCwgMHhmMDc5NGYwNVVMLAorICAgIDB4ZTk2MjdlNDRVTCwgMHhjMjRmMmQ4N1VMLCAweGRiNTQxY2M2VUwsIDB4OTQxNThhMDFVTCwgMHg4ZDBlYmI0MFVMLAorICAgIDB4YTYyM2U4ODNVTCwgMHhiZjM4ZDljMlVMLCAweDM4YTBjNTBkVUwsIDB4MjFiYmY0NGNVTCwgMHgwYTk2YTc4ZlVMLAorICAgIDB4MTM4ZDk2Y2VVTCwgMHg1Y2NjMDAwOVVMLCAweDQ1ZDczMTQ4VUwsIDB4NmVmYTYyOGJVTCwgMHg3N2UxNTNjYVVMLAorICAgIDB4YmFiYjVkNTRVTCwgMHhhM2EwNmMxNVVMLCAweDg4OGQzZmQ2VUwsIDB4OTE5NjBlOTdVTCwgMHhkZWQ3OTg1MFVMLAorICAgIDB4YzdjY2E5MTFVTCwgMHhlY2UxZmFkMlVMLCAweGY1ZmFjYjkzVUwsIDB4NzI2MmQ3NWNVTCwgMHg2Yjc5ZTYxZFVMLAorICAgIDB4NDA1NGI1ZGVVTCwgMHg1OTRmODQ5ZlVMLCAweDE2MGUxMjU4VUwsIDB4MGYxNTIzMTlVTCwgMHgyNDM4NzBkYVVMLAorICAgIDB4M2QyMzQxOWJVTCwgMHg2NWZkNmJhN1VMLCAweDdjZTY1YWU2VUwsIDB4NTdjYjA5MjVVTCwgMHg0ZWQwMzg2NFVMLAorICAgIDB4MDE5MWFlYTNVTCwgMHgxODhhOWZlMlVMLCAweDMzYTdjYzIxVUwsIDB4MmFiY2ZkNjBVTCwgMHhhZDI0ZTFhZlVMLAorICAgIDB4YjQzZmQwZWVVTCwgMHg5ZjEyODMyZFVMLCAweDg2MDliMjZjVUwsIDB4Yzk0ODI0YWJVTCwgMHhkMDUzMTVlYVVMLAorICAgIDB4ZmI3ZTQ2MjlVTCwgMHhlMjY1Nzc2OFVMLCAweDJmM2Y3OWY2VUwsIDB4MzYyNDQ4YjdVTCwgMHgxZDA5MWI3NFVMLAorICAgIDB4MDQxMjJhMzVVTCwgMHg0YjUzYmNmMlVMLCAweDUyNDg4ZGIzVUwsIDB4Nzk2NWRlNzBVTCwgMHg2MDdlZWYzMVVMLAorICAgIDB4ZTdlNmYzZmVVTCwgMHhmZWZkYzJiZlVMLCAweGQ1ZDA5MTdjVUwsIDB4Y2NjYmEwM2RVTCwgMHg4MzhhMzZmYVVMLAorICAgIDB4OWE5MTA3YmJVTCwgMHhiMWJjNTQ3OFVMLCAweGE4YTc2NTM5VUwsIDB4M2I4Mzk4NGJVTCwgMHgyMjk4YTkwYVVMLAorICAgIDB4MDliNWZhYzlVTCwgMHgxMGFlY2I4OFVMLCAweDVmZWY1ZDRmVUwsIDB4NDZmNDZjMGVVTCwgMHg2ZGQ5M2ZjZFVMLAorICAgIDB4NzRjMjBlOGNVTCwgMHhmMzVhMTI0M1VMLCAweGVhNDEyMzAyVUwsIDB4YzE2YzcwYzFVTCwgMHhkODc3NDE4MFVMLAorICAgIDB4OTczNmQ3NDdVTCwgMHg4ZTJkZTYwNlVMLCAweGE1MDBiNWM1VUwsIDB4YmMxYjg0ODRVTCwgMHg3MTQxOGExYVVMLAorICAgIDB4Njg1YWJiNWJVTCwgMHg0Mzc3ZTg5OFVMLCAweDVhNmNkOWQ5VUwsIDB4MTUyZDRmMWVVTCwgMHgwYzM2N2U1ZlVMLAorICAgIDB4MjcxYjJkOWNVTCwgMHgzZTAwMWNkZFVMLCAweGI5OTgwMDEyVUwsIDB4YTA4MzMxNTNVTCwgMHg4YmFlNjI5MFVMLAorICAgIDB4OTJiNTUzZDFVTCwgMHhkZGY0YzUxNlVMLCAweGM0ZWZmNDU3VUwsIDB4ZWZjMmE3OTRVTCwgMHhmNmQ5OTZkNVVMLAorICAgIDB4YWUwN2JjZTlVTCwgMHhiNzFjOGRhOFVMLCAweDljMzFkZTZiVUwsIDB4ODUyYWVmMmFVTCwgMHhjYTZiNzllZFVMLAorICAgIDB4ZDM3MDQ4YWNVTCwgMHhmODVkMWI2ZlVMLCAweGUxNDYyYTJlVUwsIDB4NjZkZTM2ZTFVTCwgMHg3ZmM1MDdhMFVMLAorICAgIDB4NTRlODU0NjNVTCwgMHg0ZGYzNjUyMlVMLCAweDAyYjJmM2U1VUwsIDB4MWJhOWMyYTRVTCwgMHgzMDg0OTE2N1VMLAorICAgIDB4Mjk5ZmEwMjZVTCwgMHhlNGM1YWViOFVMLCAweGZkZGU5ZmY5VUwsIDB4ZDZmM2NjM2FVTCwgMHhjZmU4ZmQ3YlVMLAorICAgIDB4ODBhOTZiYmNVTCwgMHg5OWIyNWFmZFVMLCAweGIyOWYwOTNlVUwsIDB4YWI4NDM4N2ZVTCwgMHgyYzFjMjRiMFVMLAorICAgIDB4MzUwNzE1ZjFVTCwgMHgxZTJhNDYzMlVMLCAweDA3MzE3NzczVUwsIDB4NDg3MGUxYjRVTCwgMHg1MTZiZDBmNVVMLAorICAgIDB4N2E0NjgzMzZVTCwgMHg2MzVkYjI3N1VMLCAweGNiZmFkNzRlVUwsIDB4ZDJlMWU2MGZVTCwgMHhmOWNjYjVjY1VMLAorICAgIDB4ZTBkNzg0OGRVTCwgMHhhZjk2MTI0YVVMLCAweGI2OGQyMzBiVUwsIDB4OWRhMDcwYzhVTCwgMHg4NGJiNDE4OVVMLAorICAgIDB4MDMyMzVkNDZVTCwgMHgxYTM4NmMwN1VMLCAweDMxMTUzZmM0VUwsIDB4MjgwZTBlODVVTCwgMHg2NzRmOTg0MlVMLAorICAgIDB4N2U1NGE5MDNVTCwgMHg1NTc5ZmFjMFVMLCAweDRjNjJjYjgxVUwsIDB4ODEzOGM1MWZVTCwgMHg5ODIzZjQ1ZVVMLAorICAgIDB4YjMwZWE3OWRVTCwgMHhhYTE1OTZkY1VMLCAweGU1NTQwMDFiVUwsIDB4ZmM0ZjMxNWFVTCwgMHhkNzYyNjI5OVVMLAorICAgIDB4Y2U3OTUzZDhVTCwgMHg0OWUxNGYxN1VMLCAweDUwZmE3ZTU2VUwsIDB4N2JkNzJkOTVVTCwgMHg2MmNjMWNkNFVMLAorICAgIDB4MmQ4ZDhhMTNVTCwgMHgzNDk2YmI1MlVMLCAweDFmYmJlODkxVUwsIDB4MDZhMGQ5ZDBVTCwgMHg1ZTdlZjNlY1VMLAorICAgIDB4NDc2NWMyYWRVTCwgMHg2YzQ4OTE2ZVVMLCAweDc1NTNhMDJmVUwsIDB4M2ExMjM2ZThVTCwgMHgyMzA5MDdhOVVMLAorICAgIDB4MDgyNDU0NmFVTCwgMHgxMTNmNjUyYlVMLCAweDk2YTc3OWU0VUwsIDB4OGZiYzQ4YTVVTCwgMHhhNDkxMWI2NlVMLAorICAgIDB4YmQ4YTJhMjdVTCwgMHhmMmNiYmNlMFVMLCAweGViZDA4ZGExVUwsIDB4YzBmZGRlNjJVTCwgMHhkOWU2ZWYyM1VMLAorICAgIDB4MTRiY2UxYmRVTCwgMHgwZGE3ZDBmY1VMLCAweDI2OGE4MzNmVUwsIDB4M2Y5MWIyN2VVTCwgMHg3MGQwMjRiOVVMLAorICAgIDB4NjljYjE1ZjhVTCwgMHg0MmU2NDYzYlVMLCAweDViZmQ3NzdhVUwsIDB4ZGM2NTZiYjVVTCwgMHhjNTdlNWFmNFVMLAorICAgIDB4ZWU1MzA5MzdVTCwgMHhmNzQ4Mzg3NlVMLCAweGI4MDlhZWIxVUwsIDB4YTExMjlmZjBVTCwgMHg4YTNmY2MzM1VMLAorICAgIDB4OTMyNGZkNzJVTAorICB9LAorICB7CisgICAgMHgwMDAwMDAwMFVMLCAweDAxYzI2YTM3VUwsIDB4MDM4NGQ0NmVVTCwgMHgwMjQ2YmU1OVVMLCAweDA3MDlhOGRjVUwsCisgICAgMHgwNmNiYzJlYlVMLCAweDA0OGQ3Y2IyVUwsIDB4MDU0ZjE2ODVVTCwgMHgwZTEzNTFiOFVMLCAweDBmZDEzYjhmVUwsCisgICAgMHgwZDk3ODVkNlVMLCAweDBjNTVlZmUxVUwsIDB4MDkxYWY5NjRVTCwgMHgwOGQ4OTM1M1VMLCAweDBhOWUyZDBhVUwsCisgICAgMHgwYjVjNDczZFVMLCAweDFjMjZhMzcwVUwsIDB4MWRlNGM5NDdVTCwgMHgxZmEyNzcxZVVMLCAweDFlNjAxZDI5VUwsCisgICAgMHgxYjJmMGJhY1VMLCAweDFhZWQ2MTliVUwsIDB4MThhYmRmYzJVTCwgMHgxOTY5YjVmNVVMLCAweDEyMzVmMmM4VUwsCisgICAgMHgxM2Y3OThmZlVMLCAweDExYjEyNmE2VUwsIDB4MTA3MzRjOTFVTCwgMHgxNTNjNWExNFVMLCAweDE0ZmUzMDIzVUwsCisgICAgMHgxNmI4OGU3YVVMLCAweDE3N2FlNDRkVUwsIDB4Mzg0ZDQ2ZTBVTCwgMHgzOThmMmNkN1VMLCAweDNiYzk5MjhlVUwsCisgICAgMHgzYTBiZjhiOVVMLCAweDNmNDRlZTNjVUwsIDB4M2U4Njg0MGJVTCwgMHgzY2MwM2E1MlVMLCAweDNkMDI1MDY1VUwsCisgICAgMHgzNjVlMTc1OFVMLCAweDM3OWM3ZDZmVUwsIDB4MzVkYWMzMzZVTCwgMHgzNDE4YTkwMVVMLCAweDMxNTdiZjg0VUwsCisgICAgMHgzMDk1ZDViM1VMLCAweDMyZDM2YmVhVUwsIDB4MzMxMTAxZGRVTCwgMHgyNDZiZTU5MFVMLCAweDI1YTk4ZmE3VUwsCisgICAgMHgyN2VmMzFmZVVMLCAweDI2MmQ1YmM5VUwsIDB4MjM2MjRkNGNVTCwgMHgyMmEwMjc3YlVMLCAweDIwZTY5OTIyVUwsCisgICAgMHgyMTI0ZjMxNVVMLCAweDJhNzhiNDI4VUwsIDB4MmJiYWRlMWZVTCwgMHgyOWZjNjA0NlVMLCAweDI4M2UwYTcxVUwsCisgICAgMHgyZDcxMWNmNFVMLCAweDJjYjM3NmMzVUwsIDB4MmVmNWM4OWFVTCwgMHgyZjM3YTJhZFVMLCAweDcwOWE4ZGMwVUwsCisgICAgMHg3MTU4ZTdmN1VMLCAweDczMWU1OWFlVUwsIDB4NzJkYzMzOTlVTCwgMHg3NzkzMjUxY1VMLCAweDc2NTE0ZjJiVUwsCisgICAgMHg3NDE3ZjE3MlVMLCAweDc1ZDU5YjQ1VUwsIDB4N2U4OWRjNzhVTCwgMHg3ZjRiYjY0ZlVMLCAweDdkMGQwODE2VUwsCisgICAgMHg3Y2NmNjIyMVVMLCAweDc5ODA3NGE0VUwsIDB4Nzg0MjFlOTNVTCwgMHg3YTA0YTBjYVVMLCAweDdiYzZjYWZkVUwsCisgICAgMHg2Y2JjMmViMFVMLCAweDZkN2U0NDg3VUwsIDB4NmYzOGZhZGVVTCwgMHg2ZWZhOTBlOVVMLCAweDZiYjU4NjZjVUwsCisgICAgMHg2YTc3ZWM1YlVMLCAweDY4MzE1MjAyVUwsIDB4NjlmMzM4MzVVTCwgMHg2MmFmN2YwOFVMLCAweDYzNmQxNTNmVUwsCisgICAgMHg2MTJiYWI2NlVMLCAweDYwZTljMTUxVUwsIDB4NjVhNmQ3ZDRVTCwgMHg2NDY0YmRlM1VMLCAweDY2MjIwM2JhVUwsCisgICAgMHg2N2UwNjk4ZFVMLCAweDQ4ZDdjYjIwVUwsIDB4NDkxNWExMTdVTCwgMHg0YjUzMWY0ZVVMLCAweDRhOTE3NTc5VUwsCisgICAgMHg0ZmRlNjNmY1VMLCAweDRlMWMwOWNiVUwsIDB4NGM1YWI3OTJVTCwgMHg0ZDk4ZGRhNVVMLCAweDQ2YzQ5YTk4VUwsCisgICAgMHg0NzA2ZjBhZlVMLCAweDQ1NDA0ZWY2VUwsIDB4NDQ4MjI0YzFVTCwgMHg0MWNkMzI0NFVMLCAweDQwMGY1ODczVUwsCisgICAgMHg0MjQ5ZTYyYVVMLCAweDQzOGI4YzFkVUwsIDB4NTRmMTY4NTBVTCwgMHg1NTMzMDI2N1VMLCAweDU3NzViYzNlVUwsCisgICAgMHg1NmI3ZDYwOVVMLCAweDUzZjhjMDhjVUwsIDB4NTIzYWFhYmJVTCwgMHg1MDdjMTRlMlVMLCAweDUxYmU3ZWQ1VUwsCisgICAgMHg1YWUyMzllOFVMLCAweDViMjA1M2RmVUwsIDB4NTk2NmVkODZVTCwgMHg1OGE0ODdiMVVMLCAweDVkZWI5MTM0VUwsCisgICAgMHg1YzI5ZmIwM1VMLCAweDVlNmY0NTVhVUwsIDB4NWZhZDJmNmRVTCwgMHhlMTM1MWI4MFVMLCAweGUwZjc3MWI3VUwsCisgICAgMHhlMmIxY2ZlZVVMLCAweGUzNzNhNWQ5VUwsIDB4ZTYzY2IzNWNVTCwgMHhlN2ZlZDk2YlVMLCAweGU1Yjg2NzMyVUwsCisgICAgMHhlNDdhMGQwNVVMLCAweGVmMjY0YTM4VUwsIDB4ZWVlNDIwMGZVTCwgMHhlY2EyOWU1NlVMLCAweGVkNjBmNDYxVUwsCisgICAgMHhlODJmZTJlNFVMLCAweGU5ZWQ4OGQzVUwsIDB4ZWJhYjM2OGFVTCwgMHhlYTY5NWNiZFVMLCAweGZkMTNiOGYwVUwsCisgICAgMHhmY2QxZDJjN1VMLCAweGZlOTc2YzllVUwsIDB4ZmY1NTA2YTlVTCwgMHhmYTFhMTAyY1VMLCAweGZiZDg3YTFiVUwsCisgICAgMHhmOTllYzQ0MlVMLCAweGY4NWNhZTc1VUwsIDB4ZjMwMGU5NDhVTCwgMHhmMmMyODM3ZlVMLCAweGYwODQzZDI2VUwsCisgICAgMHhmMTQ2NTcxMVVMLCAweGY0MDk0MTk0VUwsIDB4ZjVjYjJiYTNVTCwgMHhmNzhkOTVmYVVMLCAweGY2NGZmZmNkVUwsCisgICAgMHhkOTc4NWQ2MFVMLCAweGQ4YmEzNzU3VUwsIDB4ZGFmYzg5MGVVTCwgMHhkYjNlZTMzOVVMLCAweGRlNzFmNWJjVUwsCisgICAgMHhkZmIzOWY4YlVMLCAweGRkZjUyMWQyVUwsIDB4ZGMzNzRiZTVVTCwgMHhkNzZiMGNkOFVMLCAweGQ2YTk2NmVmVUwsCisgICAgMHhkNGVmZDhiNlVMLCAweGQ1MmRiMjgxVUwsIDB4ZDA2MmE0MDRVTCwgMHhkMWEwY2UzM1VMLCAweGQzZTY3MDZhVUwsCisgICAgMHhkMjI0MWE1ZFVMLCAweGM1NWVmZTEwVUwsIDB4YzQ5Yzk0MjdVTCwgMHhjNmRhMmE3ZVVMLCAweGM3MTg0MDQ5VUwsCisgICAgMHhjMjU3NTZjY1VMLCAweGMzOTUzY2ZiVUwsIDB4YzFkMzgyYTJVTCwgMHhjMDExZTg5NVVMLCAweGNiNGRhZmE4VUwsCisgICAgMHhjYThmYzU5ZlVMLCAweGM4Yzk3YmM2VUwsIDB4YzkwYjExZjFVTCwgMHhjYzQ0MDc3NFVMLCAweGNkODY2ZDQzVUwsCisgICAgMHhjZmMwZDMxYVVMLCAweGNlMDJiOTJkVUwsIDB4OTFhZjk2NDBVTCwgMHg5MDZkZmM3N1VMLCAweDkyMmI0MjJlVUwsCisgICAgMHg5M2U5MjgxOVVMLCAweDk2YTYzZTljVUwsIDB4OTc2NDU0YWJVTCwgMHg5NTIyZWFmMlVMLCAweDk0ZTA4MGM1VUwsCisgICAgMHg5ZmJjYzdmOFVMLCAweDllN2VhZGNmVUwsIDB4OWMzODEzOTZVTCwgMHg5ZGZhNzlhMVVMLCAweDk4YjU2ZjI0VUwsCisgICAgMHg5OTc3MDUxM1VMLCAweDliMzFiYjRhVUwsIDB4OWFmM2QxN2RVTCwgMHg4ZDg5MzUzMFVMLCAweDhjNGI1ZjA3VUwsCisgICAgMHg4ZTBkZTE1ZVVMLCAweDhmY2Y4YjY5VUwsIDB4OGE4MDlkZWNVTCwgMHg4YjQyZjdkYlVMLCAweDg5MDQ0OTgyVUwsCisgICAgMHg4OGM2MjNiNVVMLCAweDgzOWE2NDg4VUwsIDB4ODI1ODBlYmZVTCwgMHg4MDFlYjBlNlVMLCAweDgxZGNkYWQxVUwsCisgICAgMHg4NDkzY2M1NFVMLCAweDg1NTFhNjYzVUwsIDB4ODcxNzE4M2FVTCwgMHg4NmQ1NzIwZFVMLCAweGE5ZTJkMGEwVUwsCisgICAgMHhhODIwYmE5N1VMLCAweGFhNjYwNGNlVUwsIDB4YWJhNDZlZjlVTCwgMHhhZWViNzg3Y1VMLCAweGFmMjkxMjRiVUwsCisgICAgMHhhZDZmYWMxMlVMLCAweGFjYWRjNjI1VUwsIDB4YTdmMTgxMThVTCwgMHhhNjMzZWIyZlVMLCAweGE0NzU1NTc2VUwsCisgICAgMHhhNWI3M2Y0MVVMLCAweGEwZjgyOWM0VUwsIDB4YTEzYTQzZjNVTCwgMHhhMzdjZmRhYVVMLCAweGEyYmU5NzlkVUwsCisgICAgMHhiNWM0NzNkMFVMLCAweGI0MDYxOWU3VUwsIDB4YjY0MGE3YmVVTCwgMHhiNzgyY2Q4OVVMLCAweGIyY2RkYjBjVUwsCisgICAgMHhiMzBmYjEzYlVMLCAweGIxNDkwZjYyVUwsIDB4YjA4YjY1NTVVTCwgMHhiYmQ3MjI2OFVMLCAweGJhMTU0ODVmVUwsCisgICAgMHhiODUzZjYwNlVMLCAweGI5OTE5YzMxVUwsIDB4YmNkZThhYjRVTCwgMHhiZDFjZTA4M1VMLCAweGJmNWE1ZWRhVUwsCisgICAgMHhiZTk4MzRlZFVMCisgIH0sCisgIHsKKyAgICAweDAwMDAwMDAwVUwsIDB4YjhiYzY3NjVVTCwgMHhhYTA5Yzg4YlVMLCAweDEyYjVhZmVlVUwsIDB4OGY2Mjk3NTdVTCwKKyAgICAweDM3ZGVmMDMyVUwsIDB4MjU2YjVmZGNVTCwgMHg5ZGQ3MzhiOVVMLCAweGM1YjQyOGVmVUwsIDB4N2QwODRmOGFVTCwKKyAgICAweDZmYmRlMDY0VUwsIDB4ZDcwMTg3MDFVTCwgMHg0YWQ2YmZiOFVMLCAweGYyNmFkOGRkVUwsIDB4ZTBkZjc3MzNVTCwKKyAgICAweDU4NjMxMDU2VUwsIDB4NTAxOTU3OWZVTCwgMHhlOGE1MzBmYVVMLCAweGZhMTA5ZjE0VUwsIDB4NDJhY2Y4NzFVTCwKKyAgICAweGRmN2JjMGM4VUwsIDB4NjdjN2E3YWRVTCwgMHg3NTcyMDg0M1VMLCAweGNkY2U2ZjI2VUwsIDB4OTVhZDdmNzBVTCwKKyAgICAweDJkMTExODE1VUwsIDB4M2ZhNGI3ZmJVTCwgMHg4NzE4ZDA5ZVVMLCAweDFhY2ZlODI3VUwsIDB4YTI3MzhmNDJVTCwKKyAgICAweGIwYzYyMGFjVUwsIDB4MDg3YTQ3YzlVTCwgMHhhMDMyYWYzZVVMLCAweDE4OGVjODViVUwsIDB4MGEzYjY3YjVVTCwKKyAgICAweGIyODcwMGQwVUwsIDB4MmY1MDM4NjlVTCwgMHg5N2VjNWYwY1VMLCAweDg1NTlmMGUyVUwsIDB4M2RlNTk3ODdVTCwKKyAgICAweDY1ODY4N2QxVUwsIDB4ZGQzYWUwYjRVTCwgMHhjZjhmNGY1YVVMLCAweDc3MzMyODNmVUwsIDB4ZWFlNDEwODZVTCwKKyAgICAweDUyNTg3N2UzVUwsIDB4NDBlZGQ4MGRVTCwgMHhmODUxYmY2OFVMLCAweGYwMmJmOGExVUwsIDB4NDg5NzlmYzRVTCwKKyAgICAweDVhMjIzMDJhVUwsIDB4ZTI5ZTU3NGZVTCwgMHg3ZjQ5NmZmNlVMLCAweGM3ZjUwODkzVUwsIDB4ZDU0MGE3N2RVTCwKKyAgICAweDZkZmNjMDE4VUwsIDB4MzU5ZmQwNGVVTCwgMHg4ZDIzYjcyYlVMLCAweDlmOTYxOGM1VUwsIDB4MjcyYTdmYTBVTCwKKyAgICAweGJhZmQ0NzE5VUwsIDB4MDI0MTIwN2NVTCwgMHgxMGY0OGY5MlVMLCAweGE4NDhlOGY3VUwsIDB4OWIxNDU4M2RVTCwKKyAgICAweDIzYTgzZjU4VUwsIDB4MzExZDkwYjZVTCwgMHg4OWExZjdkM1VMLCAweDE0NzZjZjZhVUwsIDB4YWNjYWE4MGZVTCwKKyAgICAweGJlN2YwN2UxVUwsIDB4MDZjMzYwODRVTCwgMHg1ZWEwNzBkMlVMLCAweGU2MWMxN2I3VUwsIDB4ZjRhOWI4NTlVTCwKKyAgICAweDRjMTVkZjNjVUwsIDB4ZDFjMmU3ODVVTCwgMHg2OTdlODBlMFVMLCAweDdiY2IyZjBlVUwsIDB4YzM3NzQ4NmJVTCwKKyAgICAweGNiMGQwZmEyVUwsIDB4NzNiMTY4YzdVTCwgMHg2MTA0YzcyOVVMLCAweGQ5YjhhMDRjVUwsIDB4NDQ2Zjk4ZjVVTCwKKyAgICAweGZjZDNmZjkwVUwsIDB4ZWU2NjUwN2VVTCwgMHg1NmRhMzcxYlVMLCAweDBlYjkyNzRkVUwsIDB4YjYwNTQwMjhVTCwKKyAgICAweGE0YjBlZmM2VUwsIDB4MWMwYzg4YTNVTCwgMHg4MWRiYjAxYVVMLCAweDM5NjdkNzdmVUwsIDB4MmJkMjc4OTFVTCwKKyAgICAweDkzNmUxZmY0VUwsIDB4M2IyNmY3MDNVTCwgMHg4MzlhOTA2NlVMLCAweDkxMmYzZjg4VUwsIDB4Mjk5MzU4ZWRVTCwKKyAgICAweGI0NDQ2MDU0VUwsIDB4MGNmODA3MzFVTCwgMHgxZTRkYThkZlVMLCAweGE2ZjFjZmJhVUwsIDB4ZmU5MmRmZWNVTCwKKyAgICAweDQ2MmViODg5VUwsIDB4NTQ5YjE3NjdVTCwgMHhlYzI3NzAwMlVMLCAweDcxZjA0OGJiVUwsIDB4Yzk0YzJmZGVVTCwKKyAgICAweGRiZjk4MDMwVUwsIDB4NjM0NWU3NTVVTCwgMHg2YjNmYTA5Y1VMLCAweGQzODNjN2Y5VUwsIDB4YzEzNjY4MTdVTCwKKyAgICAweDc5OGEwZjcyVUwsIDB4ZTQ1ZDM3Y2JVTCwgMHg1Y2UxNTBhZVVMLCAweDRlNTRmZjQwVUwsIDB4ZjZlODk4MjVVTCwKKyAgICAweGFlOGI4ODczVUwsIDB4MTYzN2VmMTZVTCwgMHgwNDgyNDBmOFVMLCAweGJjM2UyNzlkVUwsIDB4MjFlOTFmMjRVTCwKKyAgICAweDk5NTU3ODQxVUwsIDB4OGJlMGQ3YWZVTCwgMHgzMzVjYjBjYVVMLCAweGVkNTliNjNiVUwsIDB4NTVlNWQxNWVVTCwKKyAgICAweDQ3NTA3ZWIwVUwsIDB4ZmZlYzE5ZDVVTCwgMHg2MjNiMjE2Y1VMLCAweGRhODc0NjA5VUwsIDB4YzgzMmU5ZTdVTCwKKyAgICAweDcwOGU4ZTgyVUwsIDB4MjhlZDllZDRVTCwgMHg5MDUxZjliMVVMLCAweDgyZTQ1NjVmVUwsIDB4M2E1ODMxM2FVTCwKKyAgICAweGE3OGYwOTgzVUwsIDB4MWYzMzZlZTZVTCwgMHgwZDg2YzEwOFVMLCAweGI1M2FhNjZkVUwsIDB4YmQ0MGUxYTRVTCwKKyAgICAweDA1ZmM4NmMxVUwsIDB4MTc0OTI5MmZVTCwgMHhhZmY1NGU0YVVMLCAweDMyMjI3NmYzVUwsIDB4OGE5ZTExOTZVTCwKKyAgICAweDk4MmJiZTc4VUwsIDB4MjA5N2Q5MWRVTCwgMHg3OGY0Yzk0YlVMLCAweGMwNDhhZTJlVUwsIDB4ZDJmZDAxYzBVTCwKKyAgICAweDZhNDE2NmE1VUwsIDB4Zjc5NjVlMWNVTCwgMHg0ZjJhMzk3OVVMLCAweDVkOWY5Njk3VUwsIDB4ZTUyM2YxZjJVTCwKKyAgICAweDRkNmIxOTA1VUwsIDB4ZjVkNzdlNjBVTCwgMHhlNzYyZDE4ZVVMLCAweDVmZGViNmViVUwsIDB4YzIwOThlNTJVTCwKKyAgICAweDdhYjVlOTM3VUwsIDB4NjgwMDQ2ZDlVTCwgMHhkMGJjMjFiY1VMLCAweDg4ZGYzMWVhVUwsIDB4MzA2MzU2OGZVTCwKKyAgICAweDIyZDZmOTYxVUwsIDB4OWE2YTllMDRVTCwgMHgwN2JkYTZiZFVMLCAweGJmMDFjMWQ4VUwsIDB4YWRiNDZlMzZVTCwKKyAgICAweDE1MDgwOTUzVUwsIDB4MWQ3MjRlOWFVTCwgMHhhNWNlMjlmZlVMLCAweGI3N2I4NjExVUwsIDB4MGZjN2UxNzRVTCwKKyAgICAweDkyMTBkOWNkVUwsIDB4MmFhY2JlYThVTCwgMHgzODE5MTE0NlVMLCAweDgwYTU3NjIzVUwsIDB4ZDhjNjY2NzVVTCwKKyAgICAweDYwN2EwMTEwVUwsIDB4NzJjZmFlZmVVTCwgMHhjYTczYzk5YlVMLCAweDU3YTRmMTIyVUwsIDB4ZWYxODk2NDdVTCwKKyAgICAweGZkYWQzOWE5VUwsIDB4NDUxMTVlY2NVTCwgMHg3NjRkZWUwNlVMLCAweGNlZjE4OTYzVUwsIDB4ZGM0NDI2OGRVTCwKKyAgICAweDY0Zjg0MWU4VUwsIDB4ZjkyZjc5NTFVTCwgMHg0MTkzMWUzNFVMLCAweDUzMjZiMWRhVUwsIDB4ZWI5YWQ2YmZVTCwKKyAgICAweGIzZjljNmU5VUwsIDB4MGI0NWExOGNVTCwgMHgxOWYwMGU2MlVMLCAweGExNGM2OTA3VUwsIDB4M2M5YjUxYmVVTCwKKyAgICAweDg0MjczNmRiVUwsIDB4OTY5Mjk5MzVVTCwgMHgyZTJlZmU1MFVMLCAweDI2NTRiOTk5VUwsIDB4OWVlOGRlZmNVTCwKKyAgICAweDhjNWQ3MTEyVUwsIDB4MzRlMTE2NzdVTCwgMHhhOTM2MmVjZVVMLCAweDExOGE0OWFiVUwsIDB4MDMzZmU2NDVVTCwKKyAgICAweGJiODM4MTIwVUwsIDB4ZTNlMDkxNzZVTCwgMHg1YjVjZjYxM1VMLCAweDQ5ZTk1OWZkVUwsIDB4ZjE1NTNlOThVTCwKKyAgICAweDZjODIwNjIxVUwsIDB4ZDQzZTYxNDRVTCwgMHhjNjhiY2VhYVVMLCAweDdlMzdhOWNmVUwsIDB4ZDY3ZjQxMzhVTCwKKyAgICAweDZlYzMyNjVkVUwsIDB4N2M3Njg5YjNVTCwgMHhjNGNhZWVkNlVMLCAweDU5MWRkNjZmVUwsIDB4ZTFhMWIxMGFVTCwKKyAgICAweGYzMTQxZWU0VUwsIDB4NGJhODc5ODFVTCwgMHgxM2NiNjlkN1VMLCAweGFiNzcwZWIyVUwsIDB4YjljMmExNWNVTCwKKyAgICAweDAxN2VjNjM5VUwsIDB4OWNhOWZlODBVTCwgMHgyNDE1OTllNVVMLCAweDM2YTAzNjBiVUwsIDB4OGUxYzUxNmVVTCwKKyAgICAweDg2NjYxNmE3VUwsIDB4M2VkYTcxYzJVTCwgMHgyYzZmZGUyY1VMLCAweDk0ZDNiOTQ5VUwsIDB4MDkwNDgxZjBVTCwKKyAgICAweGIxYjhlNjk1VUwsIDB4YTMwZDQ5N2JVTCwgMHgxYmIxMmUxZVVMLCAweDQzZDIzZTQ4VUwsIDB4ZmI2ZTU5MmRVTCwKKyAgICAweGU5ZGJmNmMzVUwsIDB4NTE2NzkxYTZVTCwgMHhjY2IwYTkxZlVMLCAweDc0MGNjZTdhVUwsIDB4NjZiOTYxOTRVTCwKKyAgICAweGRlMDUwNmYxVUwKKyAgfSwKKyAgeworICAgIDB4MDAwMDAwMDBVTCwgMHg5NjMwMDc3N1VMLCAweDJjNjEwZWVlVUwsIDB4YmE1MTA5OTlVTCwgMHgxOWM0NmQwN1VMLAorICAgIDB4OGZmNDZhNzBVTCwgMHgzNWE1NjNlOVVMLCAweGEzOTU2NDllVUwsIDB4MzI4OGRiMGVVTCwgMHhhNGI4ZGM3OVVMLAorICAgIDB4MWVlOWQ1ZTBVTCwgMHg4OGQ5ZDI5N1VMLCAweDJiNGNiNjA5VUwsIDB4YmQ3Y2IxN2VVTCwgMHgwNzJkYjhlN1VMLAorICAgIDB4OTExZGJmOTBVTCwgMHg2NDEwYjcxZFVMLCAweGYyMjBiMDZhVUwsIDB4NDg3MWI5ZjNVTCwgMHhkZTQxYmU4NFVMLAorICAgIDB4N2RkNGRhMWFVTCwgMHhlYmU0ZGQ2ZFVMLCAweDUxYjVkNGY0VUwsIDB4Yzc4NWQzODNVTCwgMHg1Njk4NmMxM1VMLAorICAgIDB4YzBhODZiNjRVTCwgMHg3YWY5NjJmZFVMLCAweGVjYzk2NThhVUwsIDB4NGY1YzAxMTRVTCwgMHhkOTZjMDY2M1VMLAorICAgIDB4NjMzZDBmZmFVTCwgMHhmNTBkMDg4ZFVMLCAweGM4MjA2ZTNiVUwsIDB4NWUxMDY5NGNVTCwgMHhlNDQxNjBkNVVMLAorICAgIDB4NzI3MTY3YTJVTCwgMHhkMWU0MDMzY1VMLCAweDQ3ZDQwNDRiVUwsIDB4ZmQ4NTBkZDJVTCwgMHg2YmI1MGFhNVVMLAorICAgIDB4ZmFhOGI1MzVVTCwgMHg2Yzk4YjI0MlVMLCAweGQ2YzliYmRiVUwsIDB4NDBmOWJjYWNVTCwgMHhlMzZjZDgzMlVMLAorICAgIDB4NzU1Y2RmNDVVTCwgMHhjZjBkZDZkY1VMLCAweDU5M2RkMWFiVUwsIDB4YWMzMGQ5MjZVTCwgMHgzYTAwZGU1MVVMLAorICAgIDB4ODA1MWQ3YzhVTCwgMHgxNjYxZDBiZlVMLCAweGI1ZjRiNDIxVUwsIDB4MjNjNGIzNTZVTCwgMHg5OTk1YmFjZlVMLAorICAgIDB4MGZhNWJkYjhVTCwgMHg5ZWI4MDIyOFVMLCAweDA4ODgwNTVmVUwsIDB4YjJkOTBjYzZVTCwgMHgyNGU5MGJiMVVMLAorICAgIDB4ODc3YzZmMmZVTCwgMHgxMTRjNjg1OFVMLCAweGFiMWQ2MWMxVUwsIDB4M2QyZDY2YjZVTCwgMHg5MDQxZGM3NlVMLAorICAgIDB4MDY3MWRiMDFVTCwgMHhiYzIwZDI5OFVMLCAweDJhMTBkNWVmVUwsIDB4ODk4NWIxNzFVTCwgMHgxZmI1YjYwNlVMLAorICAgIDB4YTVlNGJmOWZVTCwgMHgzM2Q0YjhlOFVMLCAweGEyYzkwNzc4VUwsIDB4MzRmOTAwMGZVTCwgMHg4ZWE4MDk5NlVMLAorICAgIDB4MTg5ODBlZTFVTCwgMHhiYjBkNmE3ZlVMLCAweDJkM2Q2ZDA4VUwsIDB4OTc2YzY0OTFVTCwgMHgwMTVjNjNlNlVMLAorICAgIDB4ZjQ1MTZiNmJVTCwgMHg2MjYxNmMxY1VMLCAweGQ4MzA2NTg1VUwsIDB4NGUwMDYyZjJVTCwgMHhlZDk1MDY2Y1VMLAorICAgIDB4N2JhNTAxMWJVTCwgMHhjMWY0MDg4MlVMLCAweDU3YzQwZmY1VUwsIDB4YzZkOWIwNjVVTCwgMHg1MGU5YjcxMlVMLAorICAgIDB4ZWFiOGJlOGJVTCwgMHg3Yzg4YjlmY1VMLCAweGRmMWRkZDYyVUwsIDB4NDkyZGRhMTVVTCwgMHhmMzdjZDM4Y1VMLAorICAgIDB4NjU0Y2Q0ZmJVTCwgMHg1ODYxYjI0ZFVMLCAweGNlNTFiNTNhVUwsIDB4NzQwMGJjYTNVTCwgMHhlMjMwYmJkNFVMLAorICAgIDB4NDFhNWRmNGFVTCwgMHhkNzk1ZDgzZFVMLCAweDZkYzRkMWE0VUwsIDB4ZmJmNGQ2ZDNVTCwgMHg2YWU5Njk0M1VMLAorICAgIDB4ZmNkOTZlMzRVTCwgMHg0Njg4NjdhZFVMLCAweGQwYjg2MGRhVUwsIDB4NzMyZDA0NDRVTCwgMHhlNTFkMDMzM1VMLAorICAgIDB4NWY0YzBhYWFVTCwgMHhjOTdjMGRkZFVMLCAweDNjNzEwNTUwVUwsIDB4YWE0MTAyMjdVTCwgMHgxMDEwMGJiZVVMLAorICAgIDB4ODYyMDBjYzlVTCwgMHgyNWI1Njg1N1VMLCAweGIzODU2ZjIwVUwsIDB4MDlkNDY2YjlVTCwgMHg5ZmU0NjFjZVVMLAorICAgIDB4MGVmOWRlNWVVTCwgMHg5OGM5ZDkyOVVMLCAweDIyOThkMGIwVUwsIDB4YjRhOGQ3YzdVTCwgMHgxNzNkYjM1OVVMLAorICAgIDB4ODEwZGI0MmVVTCwgMHgzYjVjYmRiN1VMLCAweGFkNmNiYWMwVUwsIDB4MjA4M2I4ZWRVTCwgMHhiNmIzYmY5YVVMLAorICAgIDB4MGNlMmI2MDNVTCwgMHg5YWQyYjE3NFVMLCAweDM5NDdkNWVhVUwsIDB4YWY3N2QyOWRVTCwgMHgxNTI2ZGIwNFVMLAorICAgIDB4ODMxNmRjNzNVTCwgMHgxMjBiNjNlM1VMLCAweDg0M2I2NDk0VUwsIDB4M2U2YTZkMGRVTCwgMHhhODVhNmE3YVVMLAorICAgIDB4MGJjZjBlZTRVTCwgMHg5ZGZmMDk5M1VMLCAweDI3YWUwMDBhVUwsIDB4YjE5ZTA3N2RVTCwgMHg0NDkzMGZmMFVMLAorICAgIDB4ZDJhMzA4ODdVTCwgMHg2OGYyMDExZVVMLCAweGZlYzIwNjY5VUwsIDB4NWQ1NzYyZjdVTCwgMHhjYjY3NjU4MFVMLAorICAgIDB4NzEzNjZjMTlVTCwgMHhlNzA2NmI2ZVVMLCAweDc2MWJkNGZlVUwsIDB4ZTAyYmQzODlVTCwgMHg1YTdhZGExMFVMLAorICAgIDB4Y2M0YWRkNjdVTCwgMHg2ZmRmYjlmOVVMLCAweGY5ZWZiZThlVUwsIDB4NDNiZWI3MTdVTCwgMHhkNThlYjA2MFVMLAorICAgIDB4ZThhM2Q2ZDZVTCwgMHg3ZTkzZDFhMVVMLCAweGM0YzJkODM4VUwsIDB4NTJmMmRmNGZVTCwgMHhmMTY3YmJkMVVMLAorICAgIDB4Njc1N2JjYTZVTCwgMHhkZDA2YjUzZlVMLCAweDRiMzZiMjQ4VUwsIDB4ZGEyYjBkZDhVTCwgMHg0YzFiMGFhZlVMLAorICAgIDB4ZjY0YTAzMzZVTCwgMHg2MDdhMDQ0MVVMLCAweGMzZWY2MGRmVUwsIDB4NTVkZjY3YThVTCwgMHhlZjhlNmUzMVVMLAorICAgIDB4NzliZTY5NDZVTCwgMHg4Y2IzNjFjYlVMLCAweDFhODM2NmJjVUwsIDB4YTBkMjZmMjVVTCwgMHgzNmUyNjg1MlVMLAorICAgIDB4OTU3NzBjY2NVTCwgMHgwMzQ3MGJiYlVMLCAweGI5MTYwMjIyVUwsIDB4MmYyNjA1NTVVTCwgMHhiZTNiYmFjNVVMLAorICAgIDB4MjgwYmJkYjJVTCwgMHg5MjVhYjQyYlVMLCAweDA0NmFiMzVjVUwsIDB4YTdmZmQ3YzJVTCwgMHgzMWNmZDBiNVVMLAorICAgIDB4OGI5ZWQ5MmNVTCwgMHgxZGFlZGU1YlVMLCAweGIwYzI2NDliVUwsIDB4MjZmMjYzZWNVTCwgMHg5Y2EzNmE3NVVMLAorICAgIDB4MGE5MzZkMDJVTCwgMHhhOTA2MDk5Y1VMLCAweDNmMzYwZWViVUwsIDB4ODU2NzA3NzJVTCwgMHgxMzU3MDAwNVVMLAorICAgIDB4ODI0YWJmOTVVTCwgMHgxNDdhYjhlMlVMLCAweGFlMmJiMTdiVUwsIDB4MzgxYmI2MGNVTCwgMHg5YjhlZDI5MlVMLAorICAgIDB4MGRiZWQ1ZTVVTCwgMHhiN2VmZGM3Y1VMLCAweDIxZGZkYjBiVUwsIDB4ZDRkMmQzODZVTCwgMHg0MmUyZDRmMVVMLAorICAgIDB4ZjhiM2RkNjhVTCwgMHg2ZTgzZGExZlVMLCAweGNkMTZiZTgxVUwsIDB4NWIyNmI5ZjZVTCwgMHhlMTc3YjA2ZlVMLAorICAgIDB4Nzc0N2I3MThVTCwgMHhlNjVhMDg4OFVMLCAweDcwNmEwZmZmVUwsIDB4Y2EzYjA2NjZVTCwgMHg1YzBiMDExMVVMLAorICAgIDB4ZmY5ZTY1OGZVTCwgMHg2OWFlNjJmOFVMLCAweGQzZmY2YjYxVUwsIDB4NDVjZjZjMTZVTCwgMHg3OGUyMGFhMFVMLAorICAgIDB4ZWVkMjBkZDdVTCwgMHg1NDgzMDQ0ZVVMLCAweGMyYjMwMzM5VUwsIDB4NjEyNjY3YTdVTCwgMHhmNzE2NjBkMFVMLAorICAgIDB4NGQ0NzY5NDlVTCwgMHhkYjc3NmUzZVVMLCAweDRhNmFkMWFlVUwsIDB4ZGM1YWQ2ZDlVTCwgMHg2NjBiZGY0MFVMLAorICAgIDB4ZjAzYmQ4MzdVTCwgMHg1M2FlYmNhOVVMLCAweGM1OWViYmRlVUwsIDB4N2ZjZmIyNDdVTCwgMHhlOWZmYjUzMFVMLAorICAgIDB4MWNmMmJkYmRVTCwgMHg4YWMyYmFjYVVMLCAweDMwOTNiMzUzVUwsIDB4YTZhM2I0MjRVTCwgMHgwNTM2ZDBiYVVMLAorICAgIDB4OTMwNmQ3Y2RVTCwgMHgyOTU3ZGU1NFVMLCAweGJmNjdkOTIzVUwsIDB4MmU3YTY2YjNVTCwgMHhiODRhNjFjNFVMLAorICAgIDB4MDIxYjY4NWRVTCwgMHg5NDJiNmYyYVVMLCAweDM3YmUwYmI0VUwsIDB4YTE4ZTBjYzNVTCwgMHgxYmRmMDU1YVVMLAorICAgIDB4OGRlZjAyMmRVTAorICB9LAorICB7CisgICAgMHgwMDAwMDAwMFVMLCAweDQxMzExYjE5VUwsIDB4ODI2MjM2MzJVTCwgMHhjMzUzMmQyYlVMLCAweDA0YzU2YzY0VUwsCisgICAgMHg0NWY0Nzc3ZFVMLCAweDg2YTc1YTU2VUwsIDB4Yzc5NjQxNGZVTCwgMHgwODhhZDljOFVMLCAweDQ5YmJjMmQxVUwsCisgICAgMHg4YWU4ZWZmYVVMLCAweGNiZDlmNGUzVUwsIDB4MGM0ZmI1YWNVTCwgMHg0ZDdlYWViNVVMLCAweDhlMmQ4MzllVUwsCisgICAgMHhjZjFjOTg4N1VMLCAweDUxMTJjMjRhVUwsIDB4MTAyM2Q5NTNVTCwgMHhkMzcwZjQ3OFVMLCAweDkyNDFlZjYxVUwsCisgICAgMHg1NWQ3YWUyZVVMLCAweDE0ZTZiNTM3VUwsIDB4ZDdiNTk4MWNVTCwgMHg5Njg0ODMwNVVMLCAweDU5OTgxYjgyVUwsCisgICAgMHgxOGE5MDA5YlVMLCAweGRiZmEyZGIwVUwsIDB4OWFjYjM2YTlVTCwgMHg1ZDVkNzdlNlVMLCAweDFjNmM2Y2ZmVUwsCisgICAgMHhkZjNmNDFkNFVMLCAweDllMGU1YWNkVUwsIDB4YTIyNDg0OTVVTCwgMHhlMzE1OWY4Y1VMLCAweDIwNDZiMmE3VUwsCisgICAgMHg2MTc3YTliZVVMLCAweGE2ZTFlOGYxVUwsIDB4ZTdkMGYzZThVTCwgMHgyNDgzZGVjM1VMLCAweDY1YjJjNWRhVUwsCisgICAgMHhhYWFlNWQ1ZFVMLCAweGViOWY0NjQ0VUwsIDB4MjhjYzZiNmZVTCwgMHg2OWZkNzA3NlVMLCAweGFlNmIzMTM5VUwsCisgICAgMHhlZjVhMmEyMFVMLCAweDJjMDkwNzBiVUwsIDB4NmQzODFjMTJVTCwgMHhmMzM2NDZkZlVMLCAweGIyMDc1ZGM2VUwsCisgICAgMHg3MTU0NzBlZFVMLCAweDMwNjU2YmY0VUwsIDB4ZjdmMzJhYmJVTCwgMHhiNmMyMzFhMlVMLCAweDc1OTExYzg5VUwsCisgICAgMHgzNGEwMDc5MFVMLCAweGZiYmM5ZjE3VUwsIDB4YmE4ZDg0MGVVTCwgMHg3OWRlYTkyNVVMLCAweDM4ZWZiMjNjVUwsCisgICAgMHhmZjc5ZjM3M1VMLCAweGJlNDhlODZhVUwsIDB4N2QxYmM1NDFVTCwgMHgzYzJhZGU1OFVMLCAweDA1NGY3OWYwVUwsCisgICAgMHg0NDdlNjJlOVVMLCAweDg3MmQ0ZmMyVUwsIDB4YzYxYzU0ZGJVTCwgMHgwMThhMTU5NFVMLCAweDQwYmIwZThkVUwsCisgICAgMHg4M2U4MjNhNlVMLCAweGMyZDkzOGJmVUwsIDB4MGRjNWEwMzhVTCwgMHg0Y2Y0YmIyMVVMLCAweDhmYTc5NjBhVUwsCisgICAgMHhjZTk2OGQxM1VMLCAweDA5MDBjYzVjVUwsIDB4NDgzMWQ3NDVVTCwgMHg4YjYyZmE2ZVVMLCAweGNhNTNlMTc3VUwsCisgICAgMHg1NDVkYmJiYVVMLCAweDE1NmNhMGEzVUwsIDB4ZDYzZjhkODhVTCwgMHg5NzBlOTY5MVVMLCAweDUwOThkN2RlVUwsCisgICAgMHgxMWE5Y2NjN1VMLCAweGQyZmFlMWVjVUwsIDB4OTNjYmZhZjVVTCwgMHg1Y2Q3NjI3MlVMLCAweDFkZTY3OTZiVUwsCisgICAgMHhkZWI1NTQ0MFVMLCAweDlmODQ0ZjU5VUwsIDB4NTgxMjBlMTZVTCwgMHgxOTIzMTUwZlVMLCAweGRhNzAzODI0VUwsCisgICAgMHg5YjQxMjMzZFVMLCAweGE3NmJmZDY1VUwsIDB4ZTY1YWU2N2NVTCwgMHgyNTA5Y2I1N1VMLCAweDY0MzhkMDRlVUwsCisgICAgMHhhM2FlOTEwMVVMLCAweGUyOWY4YTE4VUwsIDB4MjFjY2E3MzNVTCwgMHg2MGZkYmMyYVVMLCAweGFmZTEyNGFkVUwsCisgICAgMHhlZWQwM2ZiNFVMLCAweDJkODMxMjlmVUwsIDB4NmNiMjA5ODZVTCwgMHhhYjI0NDhjOVVMLCAweGVhMTU1M2QwVUwsCisgICAgMHgyOTQ2N2VmYlVMLCAweDY4Nzc2NWUyVUwsIDB4ZjY3OTNmMmZVTCwgMHhiNzQ4MjQzNlVMLCAweDc0MWIwOTFkVUwsCisgICAgMHgzNTJhMTIwNFVMLCAweGYyYmM1MzRiVUwsIDB4YjM4ZDQ4NTJVTCwgMHg3MGRlNjU3OVVMLCAweDMxZWY3ZTYwVUwsCisgICAgMHhmZWYzZTZlN1VMLCAweGJmYzJmZGZlVUwsIDB4N2M5MWQwZDVVTCwgMHgzZGEwY2JjY1VMLCAweGZhMzY4YTgzVUwsCisgICAgMHhiYjA3OTE5YVVMLCAweDc4NTRiY2IxVUwsIDB4Mzk2NWE3YThVTCwgMHg0Yjk4ODMzYlVMLCAweDBhYTk5ODIyVUwsCisgICAgMHhjOWZhYjUwOVVMLCAweDg4Y2JhZTEwVUwsIDB4NGY1ZGVmNWZVTCwgMHgwZTZjZjQ0NlVMLCAweGNkM2ZkOTZkVUwsCisgICAgMHg4YzBlYzI3NFVMLCAweDQzMTI1YWYzVUwsIDB4MDIyMzQxZWFVTCwgMHhjMTcwNmNjMVVMLCAweDgwNDE3N2Q4VUwsCisgICAgMHg0N2Q3MzY5N1VMLCAweDA2ZTYyZDhlVUwsIDB4YzViNTAwYTVVTCwgMHg4NDg0MWJiY1VMLCAweDFhOGE0MTcxVUwsCisgICAgMHg1YmJiNWE2OFVMLCAweDk4ZTg3NzQzVUwsIDB4ZDlkOTZjNWFVTCwgMHgxZTRmMmQxNVVMLCAweDVmN2UzNjBjVUwsCisgICAgMHg5YzJkMWIyN1VMLCAweGRkMWMwMDNlVUwsIDB4MTIwMDk4YjlVTCwgMHg1MzMxODNhMFVMLCAweDkwNjJhZThiVUwsCisgICAgMHhkMTUzYjU5MlVMLCAweDE2YzVmNGRkVUwsIDB4NTdmNGVmYzRVTCwgMHg5NGE3YzJlZlVMLCAweGQ1OTZkOWY2VUwsCisgICAgMHhlOWJjMDdhZVVMLCAweGE4OGQxY2I3VUwsIDB4NmJkZTMxOWNVTCwgMHgyYWVmMmE4NVVMLCAweGVkNzk2YmNhVUwsCisgICAgMHhhYzQ4NzBkM1VMLCAweDZmMWI1ZGY4VUwsIDB4MmUyYTQ2ZTFVTCwgMHhlMTM2ZGU2NlVMLCAweGEwMDdjNTdmVUwsCisgICAgMHg2MzU0ZTg1NFVMLCAweDIyNjVmMzRkVUwsIDB4ZTVmM2IyMDJVTCwgMHhhNGMyYTkxYlVMLCAweDY3OTE4NDMwVUwsCisgICAgMHgyNmEwOWYyOVVMLCAweGI4YWVjNWU0VUwsIDB4Zjk5ZmRlZmRVTCwgMHgzYWNjZjNkNlVMLCAweDdiZmRlOGNmVUwsCisgICAgMHhiYzZiYTk4MFVMLCAweGZkNWFiMjk5VUwsIDB4M2UwOTlmYjJVTCwgMHg3ZjM4ODRhYlVMLCAweGIwMjQxYzJjVUwsCisgICAgMHhmMTE1MDczNVVMLCAweDMyNDYyYTFlVUwsIDB4NzM3NzMxMDdVTCwgMHhiNGUxNzA0OFVMLCAweGY1ZDA2YjUxVUwsCisgICAgMHgzNjgzNDY3YVVMLCAweDc3YjI1ZDYzVUwsIDB4NGVkN2ZhY2JVTCwgMHgwZmU2ZTFkMlVMLCAweGNjYjVjY2Y5VUwsCisgICAgMHg4ZDg0ZDdlMFVMLCAweDRhMTI5NmFmVUwsIDB4MGIyMzhkYjZVTCwgMHhjODcwYTA5ZFVMLCAweDg5NDFiYjg0VUwsCisgICAgMHg0NjVkMjMwM1VMLCAweDA3NmMzODFhVUwsIDB4YzQzZjE1MzFVTCwgMHg4NTBlMGUyOFVMLCAweDQyOTg0ZjY3VUwsCisgICAgMHgwM2E5NTQ3ZVVMLCAweGMwZmE3OTU1VUwsIDB4ODFjYjYyNGNVTCwgMHgxZmM1Mzg4MVVMLCAweDVlZjQyMzk4VUwsCisgICAgMHg5ZGE3MGViM1VMLCAweGRjOTYxNWFhVUwsIDB4MWIwMDU0ZTVVTCwgMHg1YTMxNGZmY1VMLCAweDk5NjI2MmQ3VUwsCisgICAgMHhkODUzNzljZVVMLCAweDE3NGZlMTQ5VUwsIDB4NTY3ZWZhNTBVTCwgMHg5NTJkZDc3YlVMLCAweGQ0MWNjYzYyVUwsCisgICAgMHgxMzhhOGQyZFVMLCAweDUyYmI5NjM0VUwsIDB4OTFlOGJiMWZVTCwgMHhkMGQ5YTAwNlVMLCAweGVjZjM3ZTVlVUwsCisgICAgMHhhZGMyNjU0N1VMLCAweDZlOTE0ODZjVUwsIDB4MmZhMDUzNzVVTCwgMHhlODM2MTIzYVVMLCAweGE5MDcwOTIzVUwsCisgICAgMHg2YTU0MjQwOFVMLCAweDJiNjUzZjExVUwsIDB4ZTQ3OWE3OTZVTCwgMHhhNTQ4YmM4ZlVMLCAweDY2MWI5MWE0VUwsCisgICAgMHgyNzJhOGFiZFVMLCAweGUwYmNjYmYyVUwsIDB4YTE4ZGQwZWJVTCwgMHg2MmRlZmRjMFVMLCAweDIzZWZlNmQ5VUwsCisgICAgMHhiZGUxYmMxNFVMLCAweGZjZDBhNzBkVUwsIDB4M2Y4MzhhMjZVTCwgMHg3ZWIyOTEzZlVMLCAweGI5MjRkMDcwVUwsCisgICAgMHhmODE1Y2I2OVVMLCAweDNiNDZlNjQyVUwsIDB4N2E3N2ZkNWJVTCwgMHhiNTZiNjVkY1VMLCAweGY0NWE3ZWM1VUwsCisgICAgMHgzNzA5NTNlZVVMLCAweDc2Mzg0OGY3VUwsIDB4YjFhZTA5YjhVTCwgMHhmMDlmMTJhMVVMLCAweDMzY2MzZjhhVUwsCisgICAgMHg3MmZkMjQ5M1VMCisgIH0sCisgIHsKKyAgICAweDAwMDAwMDAwVUwsIDB4Mzc2YWMyMDFVTCwgMHg2ZWQ0ODQwM1VMLCAweDU5YmU0NjAyVUwsIDB4ZGNhODA5MDdVTCwKKyAgICAweGViYzJjYjA2VUwsIDB4YjI3YzhkMDRVTCwgMHg4NTE2NGYwNVVMLCAweGI4NTExMzBlVUwsIDB4OGYzYmQxMGZVTCwKKyAgICAweGQ2ODU5NzBkVUwsIDB4ZTFlZjU1MGNVTCwgMHg2NGY5MWEwOVVMLCAweDUzOTNkODA4VUwsIDB4MGEyZDllMGFVTCwKKyAgICAweDNkNDc1YzBiVUwsIDB4NzBhMzI2MWNVTCwgMHg0N2M5ZTQxZFVMLCAweDFlNzdhMjFmVUwsIDB4MjkxZDYwMWVVTCwKKyAgICAweGFjMGIyZjFiVUwsIDB4OWI2MWVkMWFVTCwgMHhjMmRmYWIxOFVMLCAweGY1YjU2OTE5VUwsIDB4YzhmMjM1MTJVTCwKKyAgICAweGZmOThmNzEzVUwsIDB4YTYyNmIxMTFVTCwgMHg5MTRjNzMxMFVMLCAweDE0NWEzYzE1VUwsIDB4MjMzMGZlMTRVTCwKKyAgICAweDdhOGViODE2VUwsIDB4NGRlNDdhMTdVTCwgMHhlMDQ2NGQzOFVMLCAweGQ3MmM4ZjM5VUwsIDB4OGU5MmM5M2JVTCwKKyAgICAweGI5ZjgwYjNhVUwsIDB4M2NlZTQ0M2ZVTCwgMHgwYjg0ODYzZVVMLCAweDUyM2FjMDNjVUwsIDB4NjU1MDAyM2RVTCwKKyAgICAweDU4MTc1ZTM2VUwsIDB4NmY3ZDljMzdVTCwgMHgzNmMzZGEzNVVMLCAweDAxYTkxODM0VUwsIDB4ODRiZjU3MzFVTCwKKyAgICAweGIzZDU5NTMwVUwsIDB4ZWE2YmQzMzJVTCwgMHhkZDAxMTEzM1VMLCAweDkwZTU2YjI0VUwsIDB4YTc4ZmE5MjVVTCwKKyAgICAweGZlMzFlZjI3VUwsIDB4Yzk1YjJkMjZVTCwgMHg0YzRkNjIyM1VMLCAweDdiMjdhMDIyVUwsIDB4MjI5OWU2MjBVTCwKKyAgICAweDE1ZjMyNDIxVUwsIDB4MjhiNDc4MmFVTCwgMHgxZmRlYmEyYlVMLCAweDQ2NjBmYzI5VUwsIDB4NzEwYTNlMjhVTCwKKyAgICAweGY0MWM3MTJkVUwsIDB4YzM3NmIzMmNVTCwgMHg5YWM4ZjUyZVVMLCAweGFkYTIzNzJmVUwsIDB4YzA4ZDlhNzBVTCwKKyAgICAweGY3ZTc1ODcxVUwsIDB4YWU1OTFlNzNVTCwgMHg5OTMzZGM3MlVMLCAweDFjMjU5Mzc3VUwsIDB4MmI0ZjUxNzZVTCwKKyAgICAweDcyZjExNzc0VUwsIDB4NDU5YmQ1NzVVTCwgMHg3OGRjODk3ZVVMLCAweDRmYjY0YjdmVUwsIDB4MTYwODBkN2RVTCwKKyAgICAweDIxNjJjZjdjVUwsIDB4YTQ3NDgwNzlVTCwgMHg5MzFlNDI3OFVMLCAweGNhYTAwNDdhVUwsIDB4ZmRjYWM2N2JVTCwKKyAgICAweGIwMmViYzZjVUwsIDB4ODc0NDdlNmRVTCwgMHhkZWZhMzg2ZlVMLCAweGU5OTBmYTZlVUwsIDB4NmM4NmI1NmJVTCwKKyAgICAweDViZWM3NzZhVUwsIDB4MDI1MjMxNjhVTCwgMHgzNTM4ZjM2OVVMLCAweDA4N2ZhZjYyVUwsIDB4M2YxNTZkNjNVTCwKKyAgICAweDY2YWIyYjYxVUwsIDB4NTFjMWU5NjBVTCwgMHhkNGQ3YTY2NVVMLCAweGUzYmQ2NDY0VUwsIDB4YmEwMzIyNjZVTCwKKyAgICAweDhkNjllMDY3VUwsIDB4MjBjYmQ3NDhVTCwgMHgxN2ExMTU0OVVMLCAweDRlMWY1MzRiVUwsIDB4Nzk3NTkxNGFVTCwKKyAgICAweGZjNjNkZTRmVUwsIDB4Y2IwOTFjNGVVTCwgMHg5MmI3NWE0Y1VMLCAweGE1ZGQ5ODRkVUwsIDB4OTg5YWM0NDZVTCwKKyAgICAweGFmZjAwNjQ3VUwsIDB4ZjY0ZTQwNDVVTCwgMHhjMTI0ODI0NFVMLCAweDQ0MzJjZDQxVUwsIDB4NzM1ODBmNDBVTCwKKyAgICAweDJhZTY0OTQyVUwsIDB4MWQ4YzhiNDNVTCwgMHg1MDY4ZjE1NFVMLCAweDY3MDIzMzU1VUwsIDB4M2ViYzc1NTdVTCwKKyAgICAweDA5ZDZiNzU2VUwsIDB4OGNjMGY4NTNVTCwgMHhiYmFhM2E1MlVMLCAweGUyMTQ3YzUwVUwsIDB4ZDU3ZWJlNTFVTCwKKyAgICAweGU4MzllMjVhVUwsIDB4ZGY1MzIwNWJVTCwgMHg4NmVkNjY1OVVMLCAweGIxODdhNDU4VUwsIDB4MzQ5MWViNWRVTCwKKyAgICAweDAzZmIyOTVjVUwsIDB4NWE0NTZmNWVVTCwgMHg2ZDJmYWQ1ZlVMLCAweDgwMWIzNWUxVUwsIDB4Yjc3MWY3ZTBVTCwKKyAgICAweGVlY2ZiMWUyVUwsIDB4ZDlhNTczZTNVTCwgMHg1Y2IzM2NlNlVMLCAweDZiZDlmZWU3VUwsIDB4MzI2N2I4ZTVVTCwKKyAgICAweDA1MGQ3YWU0VUwsIDB4Mzg0YTI2ZWZVTCwgMHgwZjIwZTRlZVVMLCAweDU2OWVhMmVjVUwsIDB4NjFmNDYwZWRVTCwKKyAgICAweGU0ZTIyZmU4VUwsIDB4ZDM4OGVkZTlVTCwgMHg4YTM2YWJlYlVMLCAweGJkNWM2OWVhVUwsIDB4ZjBiODEzZmRVTCwKKyAgICAweGM3ZDJkMWZjVUwsIDB4OWU2Yzk3ZmVVTCwgMHhhOTA2NTVmZlVMLCAweDJjMTAxYWZhVUwsIDB4MWI3YWQ4ZmJVTCwKKyAgICAweDQyYzQ5ZWY5VUwsIDB4NzVhZTVjZjhVTCwgMHg0OGU5MDBmM1VMLCAweDdmODNjMmYyVUwsIDB4MjYzZDg0ZjBVTCwKKyAgICAweDExNTc0NmYxVUwsIDB4OTQ0MTA5ZjRVTCwgMHhhMzJiY2JmNVVMLCAweGZhOTU4ZGY3VUwsIDB4Y2RmZjRmZjZVTCwKKyAgICAweDYwNWQ3OGQ5VUwsIDB4NTczN2JhZDhVTCwgMHgwZTg5ZmNkYVVMLCAweDM5ZTMzZWRiVUwsIDB4YmNmNTcxZGVVTCwKKyAgICAweDhiOWZiM2RmVUwsIDB4ZDIyMWY1ZGRVTCwgMHhlNTRiMzdkY1VMLCAweGQ4MGM2YmQ3VUwsIDB4ZWY2NmE5ZDZVTCwKKyAgICAweGI2ZDhlZmQ0VUwsIDB4ODFiMjJkZDVVTCwgMHgwNGE0NjJkMFVMLCAweDMzY2VhMGQxVUwsIDB4NmE3MGU2ZDNVTCwKKyAgICAweDVkMWEyNGQyVUwsIDB4MTBmZTVlYzVVTCwgMHgyNzk0OWNjNFVMLCAweDdlMmFkYWM2VUwsIDB4NDk0MDE4YzdVTCwKKyAgICAweGNjNTY1N2MyVUwsIDB4ZmIzYzk1YzNVTCwgMHhhMjgyZDNjMVVMLCAweDk1ZTgxMWMwVUwsIDB4YThhZjRkY2JVTCwKKyAgICAweDlmYzU4ZmNhVUwsIDB4YzY3YmM5YzhVTCwgMHhmMTExMGJjOVVMLCAweDc0MDc0NGNjVUwsIDB4NDM2ZDg2Y2RVTCwKKyAgICAweDFhZDNjMGNmVUwsIDB4MmRiOTAyY2VVTCwgMHg0MDk2YWY5MVVMLCAweDc3ZmM2ZDkwVUwsIDB4MmU0MjJiOTJVTCwKKyAgICAweDE5MjhlOTkzVUwsIDB4OWMzZWE2OTZVTCwgMHhhYjU0NjQ5N1VMLCAweGYyZWEyMjk1VUwsIDB4YzU4MGUwOTRVTCwKKyAgICAweGY4YzdiYzlmVUwsIDB4Y2ZhZDdlOWVVTCwgMHg5NjEzMzg5Y1VMLCAweGExNzlmYTlkVUwsIDB4MjQ2ZmI1OThVTCwKKyAgICAweDEzMDU3Nzk5VUwsIDB4NGFiYjMxOWJVTCwgMHg3ZGQxZjM5YVVMLCAweDMwMzU4OThkVUwsIDB4MDc1ZjRiOGNVTCwKKyAgICAweDVlZTEwZDhlVUwsIDB4Njk4YmNmOGZVTCwgMHhlYzlkODA4YVVMLCAweGRiZjc0MjhiVUwsIDB4ODI0OTA0ODlVTCwKKyAgICAweGI1MjNjNjg4VUwsIDB4ODg2NDlhODNVTCwgMHhiZjBlNTg4MlVMLCAweGU2YjAxZTgwVUwsIDB4ZDFkYWRjODFVTCwKKyAgICAweDU0Y2M5Mzg0VUwsIDB4NjNhNjUxODVVTCwgMHgzYTE4MTc4N1VMLCAweDBkNzJkNTg2VUwsIDB4YTBkMGUyYTlVTCwKKyAgICAweDk3YmEyMGE4VUwsIDB4Y2UwNDY2YWFVTCwgMHhmOTZlYTRhYlVMLCAweDdjNzhlYmFlVUwsIDB4NGIxMjI5YWZVTCwKKyAgICAweDEyYWM2ZmFkVUwsIDB4MjVjNmFkYWNVTCwgMHgxODgxZjFhN1VMLCAweDJmZWIzM2E2VUwsIDB4NzY1NTc1YTRVTCwKKyAgICAweDQxM2ZiN2E1VUwsIDB4YzQyOWY4YTBVTCwgMHhmMzQzM2FhMVVMLCAweGFhZmQ3Y2EzVUwsIDB4OWQ5N2JlYTJVTCwKKyAgICAweGQwNzNjNGI1VUwsIDB4ZTcxOTA2YjRVTCwgMHhiZWE3NDBiNlVMLCAweDg5Y2Q4MmI3VUwsIDB4MGNkYmNkYjJVTCwKKyAgICAweDNiYjEwZmIzVUwsIDB4NjIwZjQ5YjFVTCwgMHg1NTY1OGJiMFVMLCAweDY4MjJkN2JiVUwsIDB4NWY0ODE1YmFVTCwKKyAgICAweDA2ZjY1M2I4VUwsIDB4MzE5YzkxYjlVTCwgMHhiNDhhZGViY1VMLCAweDgzZTAxY2JkVUwsIDB4ZGE1ZTVhYmZVTCwKKyAgICAweGVkMzQ5OGJlVUwKKyAgfSwKKyAgeworICAgIDB4MDAwMDAwMDBVTCwgMHg2NTY3YmNiOFVMLCAweDhiYzgwOWFhVUwsIDB4ZWVhZmI1MTJVTCwgMHg1Nzk3NjI4ZlVMLAorICAgIDB4MzJmMGRlMzdVTCwgMHhkYzVmNmIyNVVMLCAweGI5MzhkNzlkVUwsIDB4ZWYyOGI0YzVVTCwgMHg4YTRmMDg3ZFVMLAorICAgIDB4NjRlMGJkNmZVTCwgMHgwMTg3MDFkN1VMLCAweGI4YmZkNjRhVUwsIDB4ZGRkODZhZjJVTCwgMHgzMzc3ZGZlMFVMLAorICAgIDB4NTYxMDYzNThVTCwgMHg5ZjU3MTk1MFVMLCAweGZhMzBhNWU4VUwsIDB4MTQ5ZjEwZmFVTCwgMHg3MWY4YWM0MlVMLAorICAgIDB4YzhjMDdiZGZVTCwgMHhhZGE3Yzc2N1VMLCAweDQzMDg3Mjc1VUwsIDB4MjY2ZmNlY2RVTCwgMHg3MDdmYWQ5NVVMLAorICAgIDB4MTUxODExMmRVTCwgMHhmYmI3YTQzZlVMLCAweDllZDAxODg3VUwsIDB4MjdlOGNmMWFVTCwgMHg0MjhmNzNhMlVMLAorICAgIDB4YWMyMGM2YjBVTCwgMHhjOTQ3N2EwOFVMLCAweDNlYWYzMmEwVUwsIDB4NWJjODhlMThVTCwgMHhiNTY3M2IwYVVMLAorICAgIDB4ZDAwMDg3YjJVTCwgMHg2OTM4NTAyZlVMLCAweDBjNWZlYzk3VUwsIDB4ZTJmMDU5ODVVTCwgMHg4Nzk3ZTUzZFVMLAorICAgIDB4ZDE4Nzg2NjVVTCwgMHhiNGUwM2FkZFVMLCAweDVhNGY4ZmNmVUwsIDB4M2YyODMzNzdVTCwgMHg4NjEwZTRlYVVMLAorICAgIDB4ZTM3NzU4NTJVTCwgMHgwZGQ4ZWQ0MFVMLCAweDY4YmY1MWY4VUwsIDB4YTFmODJiZjBVTCwgMHhjNDlmOTc0OFVMLAorICAgIDB4MmEzMDIyNWFVTCwgMHg0ZjU3OWVlMlVMLCAweGY2NmY0OTdmVUwsIDB4OTMwOGY1YzdVTCwgMHg3ZGE3NDBkNVVMLAorICAgIDB4MThjMGZjNmRVTCwgMHg0ZWQwOWYzNVVMLCAweDJiYjcyMzhkVUwsIDB4YzUxODk2OWZVTCwgMHhhMDdmMmEyN1VMLAorICAgIDB4MTk0N2ZkYmFVTCwgMHg3YzIwNDEwMlVMLCAweDkyOGZmNDEwVUwsIDB4ZjdlODQ4YThVTCwgMHgzZDU4MTQ5YlVMLAorICAgIDB4NTgzZmE4MjNVTCwgMHhiNjkwMWQzMVVMLCAweGQzZjdhMTg5VUwsIDB4NmFjZjc2MTRVTCwgMHgwZmE4Y2FhY1VMLAorICAgIDB4ZTEwNzdmYmVVTCwgMHg4NDYwYzMwNlVMLCAweGQyNzBhMDVlVUwsIDB4YjcxNzFjZTZVTCwgMHg1OWI4YTlmNFVMLAorICAgIDB4M2NkZjE1NGNVTCwgMHg4NWU3YzJkMVVMLCAweGUwODA3ZTY5VUwsIDB4MGUyZmNiN2JVTCwgMHg2YjQ4NzdjM1VMLAorICAgIDB4YTIwZjBkY2JVTCwgMHhjNzY4YjE3M1VMLCAweDI5YzcwNDYxVUwsIDB4NGNhMGI4ZDlVTCwgMHhmNTk4NmY0NFVMLAorICAgIDB4OTBmZmQzZmNVTCwgMHg3ZTUwNjZlZVVMLCAweDFiMzdkYTU2VUwsIDB4NGQyN2I5MGVVTCwgMHgyODQwMDViNlVMLAorICAgIDB4YzZlZmIwYTRVTCwgMHhhMzg4MGMxY1VMLCAweDFhYjBkYjgxVUwsIDB4N2ZkNzY3MzlVTCwgMHg5MTc4ZDIyYlVMLAorICAgIDB4ZjQxZjZlOTNVTCwgMHgwM2Y3MjYzYlVMLCAweDY2OTA5YTgzVUwsIDB4ODgzZjJmOTFVTCwgMHhlZDU4OTMyOVVMLAorICAgIDB4NTQ2MDQ0YjRVTCwgMHgzMTA3ZjgwY1VMLCAweGRmYTg0ZDFlVUwsIDB4YmFjZmYxYTZVTCwgMHhlY2RmOTJmZVVMLAorICAgIDB4ODliODJlNDZVTCwgMHg2NzE3OWI1NFVMLCAweDAyNzAyN2VjVUwsIDB4YmI0OGYwNzFVTCwgMHhkZTJmNGNjOVVMLAorICAgIDB4MzA4MGY5ZGJVTCwgMHg1NWU3NDU2M1VMLCAweDljYTAzZjZiVUwsIDB4ZjljNzgzZDNVTCwgMHgxNzY4MzZjMVVMLAorICAgIDB4NzIwZjhhNzlVTCwgMHhjYjM3NWRlNFVMLCAweGFlNTBlMTVjVUwsIDB4NDBmZjU0NGVVTCwgMHgyNTk4ZThmNlVMLAorICAgIDB4NzM4ODhiYWVVTCwgMHgxNmVmMzcxNlVMLCAweGY4NDA4MjA0VUwsIDB4OWQyNzNlYmNVTCwgMHgyNDFmZTkyMVVMLAorICAgIDB4NDE3ODU1OTlVTCwgMHhhZmQ3ZTA4YlVMLCAweGNhYjA1YzMzVUwsIDB4M2JiNjU5ZWRVTCwgMHg1ZWQxZTU1NVVMLAorICAgIDB4YjA3ZTUwNDdVTCwgMHhkNTE5ZWNmZlVMLCAweDZjMjEzYjYyVUwsIDB4MDk0Njg3ZGFVTCwgMHhlN2U5MzJjOFVMLAorICAgIDB4ODI4ZThlNzBVTCwgMHhkNDllZWQyOFVMLCAweGIxZjk1MTkwVUwsIDB4NWY1NmU0ODJVTCwgMHgzYTMxNTgzYVVMLAorICAgIDB4ODMwOThmYTdVTCwgMHhlNjZlMzMxZlVMLCAweDA4YzE4NjBkVUwsIDB4NmRhNjNhYjVVTCwgMHhhNGUxNDBiZFVMLAorICAgIDB4YzE4NmZjMDVVTCwgMHgyZjI5NDkxN1VMLCAweDRhNGVmNWFmVUwsIDB4ZjM3NjIyMzJVTCwgMHg5NjExOWU4YVVMLAorICAgIDB4NzhiZTJiOThVTCwgMHgxZGQ5OTcyMFVMLCAweDRiYzlmNDc4VUwsIDB4MmVhZTQ4YzBVTCwgMHhjMDAxZmRkMlVMLAorICAgIDB4YTU2NjQxNmFVTCwgMHgxYzVlOTZmN1VMLCAweDc5MzkyYTRmVUwsIDB4OTc5NjlmNWRVTCwgMHhmMmYxMjNlNVVMLAorICAgIDB4MDUxOTZiNGRVTCwgMHg2MDdlZDdmNVVMLCAweDhlZDE2MmU3VUwsIDB4ZWJiNmRlNWZVTCwgMHg1MjhlMDljMlVMLAorICAgIDB4MzdlOWI1N2FVTCwgMHhkOTQ2MDA2OFVMLCAweGJjMjFiY2QwVUwsIDB4ZWEzMWRmODhVTCwgMHg4ZjU2NjMzMFVMLAorICAgIDB4NjFmOWQ2MjJVTCwgMHgwNDllNmE5YVVMLCAweGJkYTZiZDA3VUwsIDB4ZDhjMTAxYmZVTCwgMHgzNjZlYjRhZFVMLAorICAgIDB4NTMwOTA4MTVVTCwgMHg5YTRlNzIxZFVMLCAweGZmMjljZWE1VUwsIDB4MTE4NjdiYjdVTCwgMHg3NGUxYzcwZlVMLAorICAgIDB4Y2RkOTEwOTJVTCwgMHhhOGJlYWMyYVVMLCAweDQ2MTExOTM4VUwsIDB4MjM3NmE1ODBVTCwgMHg3NTY2YzZkOFVMLAorICAgIDB4MTAwMTdhNjBVTCwgMHhmZWFlY2Y3MlVMLCAweDliYzk3M2NhVUwsIDB4MjJmMWE0NTdVTCwgMHg0Nzk2MThlZlVMLAorICAgIDB4YTkzOWFkZmRVTCwgMHhjYzVlMTE0NVVMLCAweDA2ZWU0ZDc2VUwsIDB4NjM4OWYxY2VVTCwgMHg4ZDI2NDRkY1VMLAorICAgIDB4ZTg0MWY4NjRVTCwgMHg1MTc5MmZmOVVMLCAweDM0MWU5MzQxVUwsIDB4ZGFiMTI2NTNVTCwgMHhiZmQ2OWFlYlVMLAorICAgIDB4ZTljNmY5YjNVTCwgMHg4Y2ExNDUwYlVMLCAweDYyMGVmMDE5VUwsIDB4MDc2OTRjYTFVTCwgMHhiZTUxOWIzY1VMLAorICAgIDB4ZGIzNjI3ODRVTCwgMHgzNTk5OTI5NlVMLCAweDUwZmUyZTJlVUwsIDB4OTliOTU0MjZVTCwgMHhmY2RlZTg5ZVVMLAorICAgIDB4MTI3MTVkOGNVTCwgMHg3NzE2ZTEzNFVMLCAweGNlMmUzNmE5VUwsIDB4YWI0OThhMTFVTCwgMHg0NWU2M2YwM1VMLAorICAgIDB4MjA4MTgzYmJVTCwgMHg3NjkxZTBlM1VMLCAweDEzZjY1YzViVUwsIDB4ZmQ1OWU5NDlVTCwgMHg5ODNlNTVmMVVMLAorICAgIDB4MjEwNjgyNmNVTCwgMHg0NDYxM2VkNFVMLCAweGFhY2U4YmM2VUwsIDB4Y2ZhOTM3N2VVTCwgMHgzODQxN2ZkNlVMLAorICAgIDB4NWQyNmMzNmVVTCwgMHhiMzg5NzY3Y1VMLCAweGQ2ZWVjYWM0VUwsIDB4NmZkNjFkNTlVTCwgMHgwYWIxYTFlMVVMLAorICAgIDB4ZTQxZTE0ZjNVTCwgMHg4MTc5YTg0YlVMLCAweGQ3NjljYjEzVUwsIDB4YjIwZTc3YWJVTCwgMHg1Y2ExYzJiOVVMLAorICAgIDB4MzljNjdlMDFVTCwgMHg4MGZlYTk5Y1VMLCAweGU1OTkxNTI0VUwsIDB4MGIzNmEwMzZVTCwgMHg2ZTUxMWM4ZVVMLAorICAgIDB4YTcxNjY2ODZVTCwgMHhjMjcxZGEzZVVMLCAweDJjZGU2ZjJjVUwsIDB4NDliOWQzOTRVTCwgMHhmMDgxMDQwOVVMLAorICAgIDB4OTVlNmI4YjFVTCwgMHg3YjQ5MGRhM1VMLCAweDFlMmViMTFiVUwsIDB4NDgzZWQyNDNVTCwgMHgyZDU5NmVmYlVMLAorICAgIDB4YzNmNmRiZTlVTCwgMHhhNjkxNjc1MVVMLCAweDFmYTliMGNjVUwsIDB4N2FjZTBjNzRVTCwgMHg5NDYxYjk2NlVMLAorICAgIDB4ZjEwNjA1ZGVVTAorI2VuZGlmCisgIH0KK307CmRpZmYgLS1naXQgYS96bGliLTEuMi42L2RlZmxhdGUuYyBiL3psaWItMS4yLjYvZGVmbGF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiZDQ4MGUKLS0tIC9kZXYvbnVsbAorKysgYi96bGliLTEuMi42L2RlZmxhdGUuYwpAQCAtMCwwICsxLDE5NjUgQEAKKy8qIGRlZmxhdGUuYyAtLSBjb21wcmVzcyBkYXRhIHVzaW5nIHRoZSBkZWZsYXRpb24gYWxnb3JpdGhtCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAxMiBKZWFuLWxvdXAgR2FpbGx5IGFuZCBNYXJrIEFkbGVyCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCisgKi8KKworLyoKKyAqICBBTEdPUklUSE0KKyAqCisgKiAgICAgIFRoZSAiZGVmbGF0aW9uIiBwcm9jZXNzIGRlcGVuZHMgb24gYmVpbmcgYWJsZSB0byBpZGVudGlmeSBwb3J0aW9ucworICogICAgICBvZiB0aGUgaW5wdXQgdGV4dCB3aGljaCBhcmUgaWRlbnRpY2FsIHRvIGVhcmxpZXIgaW5wdXQgKHdpdGhpbiBhCisgKiAgICAgIHNsaWRpbmcgd2luZG93IHRyYWlsaW5nIGJlaGluZCB0aGUgaW5wdXQgY3VycmVudGx5IGJlaW5nIHByb2Nlc3NlZCkuCisgKgorICogICAgICBUaGUgbW9zdCBzdHJhaWdodGZvcndhcmQgdGVjaG5pcXVlIHR1cm5zIG91dCB0byBiZSB0aGUgZmFzdGVzdCBmb3IKKyAqICAgICAgbW9zdCBpbnB1dCBmaWxlczogdHJ5IGFsbCBwb3NzaWJsZSBtYXRjaGVzIGFuZCBzZWxlY3QgdGhlIGxvbmdlc3QuCisgKiAgICAgIFRoZSBrZXkgZmVhdHVyZSBvZiB0aGlzIGFsZ29yaXRobSBpcyB0aGF0IGluc2VydGlvbnMgaW50byB0aGUgc3RyaW5nCisgKiAgICAgIGRpY3Rpb25hcnkgYXJlIHZlcnkgc2ltcGxlIGFuZCB0aHVzIGZhc3QsIGFuZCBkZWxldGlvbnMgYXJlIGF2b2lkZWQKKyAqICAgICAgY29tcGxldGVseS4gSW5zZXJ0aW9ucyBhcmUgcGVyZm9ybWVkIGF0IGVhY2ggaW5wdXQgY2hhcmFjdGVyLCB3aGVyZWFzCisgKiAgICAgIHN0cmluZyBtYXRjaGVzIGFyZSBwZXJmb3JtZWQgb25seSB3aGVuIHRoZSBwcmV2aW91cyBtYXRjaCBlbmRzLiBTbyBpdAorICogICAgICBpcyBwcmVmZXJhYmxlIHRvIHNwZW5kIG1vcmUgdGltZSBpbiBtYXRjaGVzIHRvIGFsbG93IHZlcnkgZmFzdCBzdHJpbmcKKyAqICAgICAgaW5zZXJ0aW9ucyBhbmQgYXZvaWQgZGVsZXRpb25zLiBUaGUgbWF0Y2hpbmcgYWxnb3JpdGhtIGZvciBzbWFsbAorICogICAgICBzdHJpbmdzIGlzIGluc3BpcmVkIGZyb20gdGhhdCBvZiBSYWJpbiAmIEthcnAuIEEgYnJ1dGUgZm9yY2UgYXBwcm9hY2gKKyAqICAgICAgaXMgdXNlZCB0byBmaW5kIGxvbmdlciBzdHJpbmdzIHdoZW4gYSBzbWFsbCBtYXRjaCBoYXMgYmVlbiBmb3VuZC4KKyAqICAgICAgQSBzaW1pbGFyIGFsZ29yaXRobSBpcyB1c2VkIGluIGNvbWljIChieSBKYW4tTWFyayBXYW1zKSBhbmQgZnJlZXplCisgKiAgICAgIChieSBMZW9uaWQgQnJvdWtoaXMpLgorICogICAgICAgICBBIHByZXZpb3VzIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVzZWQgYSBtb3JlIHNvcGhpc3RpY2F0ZWQgYWxnb3JpdGhtCisgKiAgICAgIChieSBGaWFsYSBhbmQgR3JlZW5lKSB3aGljaCBpcyBndWFyYW50ZWVkIHRvIHJ1biBpbiBsaW5lYXIgYW1vcnRpemVkCisgKiAgICAgIHRpbWUsIGJ1dCBoYXMgYSBsYXJnZXIgYXZlcmFnZSBjb3N0LCB1c2VzIG1vcmUgbWVtb3J5IGFuZCBpcyBwYXRlbnRlZC4KKyAqICAgICAgSG93ZXZlciB0aGUgRiZHIGFsZ29yaXRobSBtYXkgYmUgZmFzdGVyIGZvciBzb21lIGhpZ2hseSByZWR1bmRhbnQKKyAqICAgICAgZmlsZXMgaWYgdGhlIHBhcmFtZXRlciBtYXhfY2hhaW5fbGVuZ3RoIChkZXNjcmliZWQgYmVsb3cpIGlzIHRvbyBsYXJnZS4KKyAqCisgKiAgQUNLTk9XTEVER0VNRU5UUworICoKKyAqICAgICAgVGhlIGlkZWEgb2YgbGF6eSBldmFsdWF0aW9uIG9mIG1hdGNoZXMgaXMgZHVlIHRvIEphbi1NYXJrIFdhbXMsIGFuZAorICogICAgICBJIGZvdW5kIGl0IGluICdmcmVlemUnIHdyaXR0ZW4gYnkgTGVvbmlkIEJyb3VraGlzLgorICogICAgICBUaGFua3MgdG8gbWFueSBwZW9wbGUgZm9yIGJ1ZyByZXBvcnRzIGFuZCB0ZXN0aW5nLgorICoKKyAqICBSRUZFUkVOQ0VTCisgKgorICogICAgICBEZXV0c2NoLCBMLlAuLCJERUZMQVRFIENvbXByZXNzZWQgRGF0YSBGb3JtYXQgU3BlY2lmaWNhdGlvbiIuCisgKiAgICAgIEF2YWlsYWJsZSBpbiBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMxOTUxCisgKgorICogICAgICBBIGRlc2NyaXB0aW9uIG9mIHRoZSBSYWJpbiBhbmQgS2FycCBhbGdvcml0aG0gaXMgZ2l2ZW4gaW4gdGhlIGJvb2sKKyAqICAgICAgICAgIkFsZ29yaXRobXMiIGJ5IFIuIFNlZGdld2ljaywgQWRkaXNvbi1XZXNsZXksIHAyNTIuCisgKgorICogICAgICBGaWFsYSxFLlIuLCBhbmQgR3JlZW5lLEQuSC4KKyAqICAgICAgICAgRGF0YSBDb21wcmVzc2lvbiB3aXRoIEZpbml0ZSBXaW5kb3dzLCBDb21tLkFDTSwgMzIsNCAoMTk4OSkgNDkwLTU5NQorICoKKyAqLworCisvKiBAKCMpICRJZCQgKi8KKworI2luY2x1ZGUgImRlZmxhdGUuaCIKKworY29uc3QgY2hhciBkZWZsYXRlX2NvcHlyaWdodFtdID0KKyAgICIgZGVmbGF0ZSAxLjIuNiBDb3B5cmlnaHQgMTk5NS0yMDEyIEplYW4tbG91cCBHYWlsbHkgYW5kIE1hcmsgQWRsZXIgIjsKKy8qCisgIElmIHlvdSB1c2UgdGhlIHpsaWIgbGlicmFyeSBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGlzIHdlbGNvbWUKKyAgaW4gdGhlIGRvY3VtZW50YXRpb24gb2YgeW91ciBwcm9kdWN0LiBJZiBmb3Igc29tZSByZWFzb24geW91IGNhbm5vdAorICBpbmNsdWRlIHN1Y2ggYW4gYWNrbm93bGVkZ21lbnQsIEkgd291bGQgYXBwcmVjaWF0ZSB0aGF0IHlvdSBrZWVwIHRoaXMKKyAgY29weXJpZ2h0IHN0cmluZyBpbiB0aGUgZXhlY3V0YWJsZSBvZiB5b3VyIHByb2R1Y3QuCisgKi8KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiAgRnVuY3Rpb24gcHJvdG90eXBlcy4KKyAqLwordHlwZWRlZiBlbnVtIHsKKyAgICBuZWVkX21vcmUsICAgICAgLyogYmxvY2sgbm90IGNvbXBsZXRlZCwgbmVlZCBtb3JlIGlucHV0IG9yIG1vcmUgb3V0cHV0ICovCisgICAgYmxvY2tfZG9uZSwgICAgIC8qIGJsb2NrIGZsdXNoIHBlcmZvcm1lZCAqLworICAgIGZpbmlzaF9zdGFydGVkLCAvKiBmaW5pc2ggc3RhcnRlZCwgbmVlZCBvbmx5IG1vcmUgb3V0cHV0IGF0IG5leHQgZGVmbGF0ZSAqLworICAgIGZpbmlzaF9kb25lICAgICAvKiBmaW5pc2ggZG9uZSwgYWNjZXB0IG5vIG1vcmUgaW5wdXQgb3Igb3V0cHV0ICovCit9IGJsb2NrX3N0YXRlOworCit0eXBlZGVmIGJsb2NrX3N0YXRlICgqY29tcHJlc3NfZnVuYykgT0YoKGRlZmxhdGVfc3RhdGUgKnMsIGludCBmbHVzaCkpOworLyogQ29tcHJlc3Npb24gZnVuY3Rpb24uIFJldHVybnMgdGhlIGJsb2NrIHN0YXRlIGFmdGVyIHRoZSBjYWxsLiAqLworCitsb2NhbCB2b2lkIGZpbGxfd2luZG93ICAgIE9GKChkZWZsYXRlX3N0YXRlICpzKSk7Citsb2NhbCBibG9ja19zdGF0ZSBkZWZsYXRlX3N0b3JlZCBPRigoZGVmbGF0ZV9zdGF0ZSAqcywgaW50IGZsdXNoKSk7Citsb2NhbCBibG9ja19zdGF0ZSBkZWZsYXRlX2Zhc3QgICBPRigoZGVmbGF0ZV9zdGF0ZSAqcywgaW50IGZsdXNoKSk7CisjaWZuZGVmIEZBU1RFU1QKK2xvY2FsIGJsb2NrX3N0YXRlIGRlZmxhdGVfc2xvdyAgIE9GKChkZWZsYXRlX3N0YXRlICpzLCBpbnQgZmx1c2gpKTsKKyNlbmRpZgorbG9jYWwgYmxvY2tfc3RhdGUgZGVmbGF0ZV9ybGUgICAgT0YoKGRlZmxhdGVfc3RhdGUgKnMsIGludCBmbHVzaCkpOworbG9jYWwgYmxvY2tfc3RhdGUgZGVmbGF0ZV9odWZmICAgT0YoKGRlZmxhdGVfc3RhdGUgKnMsIGludCBmbHVzaCkpOworbG9jYWwgdm9pZCBsbV9pbml0ICAgICAgICBPRigoZGVmbGF0ZV9zdGF0ZSAqcykpOworbG9jYWwgdm9pZCBwdXRTaG9ydE1TQiAgICBPRigoZGVmbGF0ZV9zdGF0ZSAqcywgdUludCBiKSk7Citsb2NhbCB2b2lkIGZsdXNoX3BlbmRpbmcgIE9GKCh6X3N0cmVhbXAgc3RybSkpOworbG9jYWwgaW50IHJlYWRfYnVmICAgICAgICBPRigoel9zdHJlYW1wIHN0cm0sIEJ5dGVmICpidWYsIHVuc2lnbmVkIHNpemUpKTsKKyNpZmRlZiBBU01WCisgICAgICB2b2lkIG1hdGNoX2luaXQgT0YoKHZvaWQpKTsgLyogYXNtIGNvZGUgaW5pdGlhbGl6YXRpb24gKi8KKyAgICAgIHVJbnQgbG9uZ2VzdF9tYXRjaCAgT0YoKGRlZmxhdGVfc3RhdGUgKnMsIElQb3MgY3VyX21hdGNoKSk7CisjZWxzZQorbG9jYWwgdUludCBsb25nZXN0X21hdGNoICBPRigoZGVmbGF0ZV9zdGF0ZSAqcywgSVBvcyBjdXJfbWF0Y2gpKTsKKyNlbmRpZgorCisjaWZkZWYgREVCVUcKK2xvY2FsICB2b2lkIGNoZWNrX21hdGNoIE9GKChkZWZsYXRlX3N0YXRlICpzLCBJUG9zIHN0YXJ0LCBJUG9zIG1hdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW5ndGgpKTsKKyNlbmRpZgorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIExvY2FsIGRhdGEKKyAqLworCisjZGVmaW5lIE5JTCAwCisvKiBUYWlsIG9mIGhhc2ggY2hhaW5zICovCisKKyNpZm5kZWYgVE9PX0ZBUgorIyAgZGVmaW5lIFRPT19GQVIgNDA5NgorI2VuZGlmCisvKiBNYXRjaGVzIG9mIGxlbmd0aCAzIGFyZSBkaXNjYXJkZWQgaWYgdGhlaXIgZGlzdGFuY2UgZXhjZWVkcyBUT09fRkFSICovCisKKy8qIFZhbHVlcyBmb3IgbWF4X2xhenlfbWF0Y2gsIGdvb2RfbWF0Y2ggYW5kIG1heF9jaGFpbl9sZW5ndGgsIGRlcGVuZGluZyBvbgorICogdGhlIGRlc2lyZWQgcGFjayBsZXZlbCAoMC4uOSkuIFRoZSB2YWx1ZXMgZ2l2ZW4gYmVsb3cgaGF2ZSBiZWVuIHR1bmVkIHRvCisgKiBleGNsdWRlIHdvcnN0IGNhc2UgcGVyZm9ybWFuY2UgZm9yIHBhdGhvbG9naWNhbCBmaWxlcy4gQmV0dGVyIHZhbHVlcyBtYXkgYmUKKyAqIGZvdW5kIGZvciBzcGVjaWZpYyBmaWxlcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgY29uZmlnX3MgeworICAgdXNoIGdvb2RfbGVuZ3RoOyAvKiByZWR1Y2UgbGF6eSBzZWFyY2ggYWJvdmUgdGhpcyBtYXRjaCBsZW5ndGggKi8KKyAgIHVzaCBtYXhfbGF6eTsgICAgLyogZG8gbm90IHBlcmZvcm0gbGF6eSBzZWFyY2ggYWJvdmUgdGhpcyBtYXRjaCBsZW5ndGggKi8KKyAgIHVzaCBuaWNlX2xlbmd0aDsgLyogcXVpdCBzZWFyY2ggYWJvdmUgdGhpcyBtYXRjaCBsZW5ndGggKi8KKyAgIHVzaCBtYXhfY2hhaW47CisgICBjb21wcmVzc19mdW5jIGZ1bmM7Cit9IGNvbmZpZzsKKworI2lmZGVmIEZBU1RFU1QKK2xvY2FsIGNvbnN0IGNvbmZpZyBjb25maWd1cmF0aW9uX3RhYmxlWzJdID0geworLyogICAgICBnb29kIGxhenkgbmljZSBjaGFpbiAqLworLyogMCAqLyB7MCwgICAgMCwgIDAsICAgIDAsIGRlZmxhdGVfc3RvcmVkfSwgIC8qIHN0b3JlIG9ubHkgKi8KKy8qIDEgKi8gezQsICAgIDQsICA4LCAgICA0LCBkZWZsYXRlX2Zhc3R9fTsgLyogbWF4IHNwZWVkLCBubyBsYXp5IG1hdGNoZXMgKi8KKyNlbHNlCitsb2NhbCBjb25zdCBjb25maWcgY29uZmlndXJhdGlvbl90YWJsZVsxMF0gPSB7CisvKiAgICAgIGdvb2QgbGF6eSBuaWNlIGNoYWluICovCisvKiAwICovIHswLCAgICAwLCAgMCwgICAgMCwgZGVmbGF0ZV9zdG9yZWR9LCAgLyogc3RvcmUgb25seSAqLworLyogMSAqLyB7NCwgICAgNCwgIDgsICAgIDQsIGRlZmxhdGVfZmFzdH0sIC8qIG1heCBzcGVlZCwgbm8gbGF6eSBtYXRjaGVzICovCisvKiAyICovIHs0LCAgICA1LCAxNiwgICAgOCwgZGVmbGF0ZV9mYXN0fSwKKy8qIDMgKi8gezQsICAgIDYsIDMyLCAgIDMyLCBkZWZsYXRlX2Zhc3R9LAorCisvKiA0ICovIHs0LCAgICA0LCAxNiwgICAxNiwgZGVmbGF0ZV9zbG93fSwgIC8qIGxhenkgbWF0Y2hlcyAqLworLyogNSAqLyB7OCwgICAxNiwgMzIsICAgMzIsIGRlZmxhdGVfc2xvd30sCisvKiA2ICovIHs4LCAgIDE2LCAxMjgsIDEyOCwgZGVmbGF0ZV9zbG93fSwKKy8qIDcgKi8gezgsICAgMzIsIDEyOCwgMjU2LCBkZWZsYXRlX3Nsb3d9LAorLyogOCAqLyB7MzIsIDEyOCwgMjU4LCAxMDI0LCBkZWZsYXRlX3Nsb3d9LAorLyogOSAqLyB7MzIsIDI1OCwgMjU4LCA0MDk2LCBkZWZsYXRlX3Nsb3d9fTsgLyogbWF4IGNvbXByZXNzaW9uICovCisjZW5kaWYKKworLyogTm90ZTogdGhlIGRlZmxhdGUoKSBjb2RlIHJlcXVpcmVzIG1heF9sYXp5ID49IE1JTl9NQVRDSCBhbmQgbWF4X2NoYWluID49IDQKKyAqIEZvciBkZWZsYXRlX2Zhc3QoKSAobGV2ZWxzIDw9IDMpIGdvb2QgaXMgaWdub3JlZCBhbmQgbGF6eSBoYXMgYSBkaWZmZXJlbnQKKyAqIG1lYW5pbmcuCisgKi8KKworI2RlZmluZSBFUVVBTCAwCisvKiByZXN1bHQgb2YgbWVtY21wIGZvciBlcXVhbCBzdHJpbmdzICovCisKKyNpZm5kZWYgTk9fRFVNTVlfREVDTAorc3RydWN0IHN0YXRpY190cmVlX2Rlc2NfcyB7aW50IGR1bW15O307IC8qIGZvciBidWdneSBjb21waWxlcnMgKi8KKyNlbmRpZgorCisvKiByYW5rIFpfQkxPQ0sgYmV0d2VlbiBaX05PX0ZMVVNIIGFuZCBaX1BBUlRJQUxfRkxVU0ggKi8KKyNkZWZpbmUgUkFOSyhmKSAoKChmKSA8PCAxKSAtICgoZikgPiA0ID8gOSA6IDApKQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFVwZGF0ZSBhIGhhc2ggdmFsdWUgd2l0aCB0aGUgZ2l2ZW4gaW5wdXQgYnl0ZQorICogSU4gIGFzc2VydGlvbjogYWxsIGNhbGxzIHRvIHRvIFVQREFURV9IQVNIIGFyZSBtYWRlIHdpdGggY29uc2VjdXRpdmUKKyAqICAgIGlucHV0IGNoYXJhY3RlcnMsIHNvIHRoYXQgYSBydW5uaW5nIGhhc2gga2V5IGNhbiBiZSBjb21wdXRlZCBmcm9tIHRoZQorICogICAgcHJldmlvdXMga2V5IGluc3RlYWQgb2YgY29tcGxldGUgcmVjYWxjdWxhdGlvbiBlYWNoIHRpbWUuCisgKi8KKyNkZWZpbmUgVVBEQVRFX0hBU0gocyxoLGMpIChoID0gKCgoaCk8PHMtPmhhc2hfc2hpZnQpIF4gKGMpKSAmIHMtPmhhc2hfbWFzaykKKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEluc2VydCBzdHJpbmcgc3RyIGluIHRoZSBkaWN0aW9uYXJ5IGFuZCBzZXQgbWF0Y2hfaGVhZCB0byB0aGUgcHJldmlvdXMgaGVhZAorICogb2YgdGhlIGhhc2ggY2hhaW4gKHRoZSBtb3N0IHJlY2VudCBzdHJpbmcgd2l0aCBzYW1lIGhhc2gga2V5KS4gUmV0dXJuCisgKiB0aGUgcHJldmlvdXMgbGVuZ3RoIG9mIHRoZSBoYXNoIGNoYWluLgorICogSWYgdGhpcyBmaWxlIGlzIGNvbXBpbGVkIHdpdGggLURGQVNURVNULCB0aGUgY29tcHJlc3Npb24gbGV2ZWwgaXMgZm9yY2VkCisgKiB0byAxLCBhbmQgbm8gaGFzaCBjaGFpbnMgYXJlIG1haW50YWluZWQuCisgKiBJTiAgYXNzZXJ0aW9uOiBhbGwgY2FsbHMgdG8gdG8gSU5TRVJUX1NUUklORyBhcmUgbWFkZSB3aXRoIGNvbnNlY3V0aXZlCisgKiAgICBpbnB1dCBjaGFyYWN0ZXJzIGFuZCB0aGUgZmlyc3QgTUlOX01BVENIIGJ5dGVzIG9mIHN0ciBhcmUgdmFsaWQKKyAqICAgIChleGNlcHQgZm9yIHRoZSBsYXN0IE1JTl9NQVRDSC0xIGJ5dGVzIG9mIHRoZSBpbnB1dCBmaWxlKS4KKyAqLworI2lmZGVmIEZBU1RFU1QKKyNkZWZpbmUgSU5TRVJUX1NUUklORyhzLCBzdHIsIG1hdGNoX2hlYWQpIFwKKyAgIChVUERBVEVfSEFTSChzLCBzLT5pbnNfaCwgcy0+d2luZG93WyhzdHIpICsgKE1JTl9NQVRDSC0xKV0pLCBcCisgICAgbWF0Y2hfaGVhZCA9IHMtPmhlYWRbcy0+aW5zX2hdLCBcCisgICAgcy0+aGVhZFtzLT5pbnNfaF0gPSAoUG9zKShzdHIpKQorI2Vsc2UKKyNkZWZpbmUgSU5TRVJUX1NUUklORyhzLCBzdHIsIG1hdGNoX2hlYWQpIFwKKyAgIChVUERBVEVfSEFTSChzLCBzLT5pbnNfaCwgcy0+d2luZG93WyhzdHIpICsgKE1JTl9NQVRDSC0xKV0pLCBcCisgICAgbWF0Y2hfaGVhZCA9IHMtPnByZXZbKHN0cikgJiBzLT53X21hc2tdID0gcy0+aGVhZFtzLT5pbnNfaF0sIFwKKyAgICBzLT5oZWFkW3MtPmluc19oXSA9IChQb3MpKHN0cikpCisjZW5kaWYKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBJbml0aWFsaXplIHRoZSBoYXNoIHRhYmxlIChhdm9pZGluZyA2NEsgb3ZlcmZsb3cgZm9yIDE2IGJpdCBzeXN0ZW1zKS4KKyAqIHByZXZbXSB3aWxsIGJlIGluaXRpYWxpemVkIG9uIHRoZSBmbHkuCisgKi8KKyNkZWZpbmUgQ0xFQVJfSEFTSChzKSBcCisgICAgcy0+aGVhZFtzLT5oYXNoX3NpemUtMV0gPSBOSUw7IFwKKyAgICB6bWVtemVybygoQnl0ZWYgKilzLT5oZWFkLCAodW5zaWduZWQpKHMtPmhhc2hfc2l6ZS0xKSpzaXplb2YoKnMtPmhlYWQpKTsKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworaW50IFpFWFBPUlQgZGVmbGF0ZUluaXRfKHN0cm0sIGxldmVsLCB2ZXJzaW9uLCBzdHJlYW1fc2l6ZSkKKyAgICB6X3N0cmVhbXAgc3RybTsKKyAgICBpbnQgbGV2ZWw7CisgICAgY29uc3QgY2hhciAqdmVyc2lvbjsKKyAgICBpbnQgc3RyZWFtX3NpemU7Cit7CisgICAgcmV0dXJuIGRlZmxhdGVJbml0Ml8oc3RybSwgbGV2ZWwsIFpfREVGTEFURUQsIE1BWF9XQklUUywgREVGX01FTV9MRVZFTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBaX0RFRkFVTFRfU1RSQVRFR1ksIHZlcnNpb24sIHN0cmVhbV9zaXplKTsKKyAgICAvKiBUbyBkbzogaWdub3JlIHN0cm0tPm5leHRfaW4gaWYgd2UgdXNlIGl0IGFzIHdpbmRvdyAqLworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitpbnQgWkVYUE9SVCBkZWZsYXRlSW5pdDJfKHN0cm0sIGxldmVsLCBtZXRob2QsIHdpbmRvd0JpdHMsIG1lbUxldmVsLCBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgIHZlcnNpb24sIHN0cmVhbV9zaXplKQorICAgIHpfc3RyZWFtcCBzdHJtOworICAgIGludCAgbGV2ZWw7CisgICAgaW50ICBtZXRob2Q7CisgICAgaW50ICB3aW5kb3dCaXRzOworICAgIGludCAgbWVtTGV2ZWw7CisgICAgaW50ICBzdHJhdGVneTsKKyAgICBjb25zdCBjaGFyICp2ZXJzaW9uOworICAgIGludCBzdHJlYW1fc2l6ZTsKK3sKKyAgICBkZWZsYXRlX3N0YXRlICpzOworICAgIGludCB3cmFwID0gMTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBteV92ZXJzaW9uW10gPSBaTElCX1ZFUlNJT047CisKKyAgICB1c2hmICpvdmVybGF5OworICAgIC8qIFdlIG92ZXJsYXkgcGVuZGluZ19idWYgYW5kIGRfYnVmK2xfYnVmLiBUaGlzIHdvcmtzIHNpbmNlIHRoZSBhdmVyYWdlCisgICAgICogb3V0cHV0IHNpemUgZm9yIChsZW5ndGgsZGlzdGFuY2UpIGNvZGVzIGlzIDw9IDI0IGJpdHMuCisgICAgICovCisKKyAgICBpZiAodmVyc2lvbiA9PSBaX05VTEwgfHwgdmVyc2lvblswXSAhPSBteV92ZXJzaW9uWzBdIHx8CisgICAgICAgIHN0cmVhbV9zaXplICE9IHNpemVvZih6X3N0cmVhbSkpIHsKKyAgICAgICAgcmV0dXJuIFpfVkVSU0lPTl9FUlJPUjsKKyAgICB9CisgICAgaWYgKHN0cm0gPT0gWl9OVUxMKSByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisKKyAgICBzdHJtLT5tc2cgPSBaX05VTEw7CisgICAgaWYgKHN0cm0tPnphbGxvYyA9PSAoYWxsb2NfZnVuYykwKSB7CisjaWZkZWYgWl9TT0xPCisgICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKyNlbHNlCisgICAgICAgIHN0cm0tPnphbGxvYyA9IHpjYWxsb2M7CisgICAgICAgIHN0cm0tPm9wYXF1ZSA9ICh2b2lkcGYpMDsKKyNlbmRpZgorICAgIH0KKyAgICBpZiAoc3RybS0+emZyZWUgPT0gKGZyZWVfZnVuYykwKQorI2lmZGVmIFpfU09MTworICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisjZWxzZQorICAgICAgICBzdHJtLT56ZnJlZSA9IHpjZnJlZTsKKyNlbmRpZgorCisjaWZkZWYgRkFTVEVTVAorICAgIGlmIChsZXZlbCAhPSAwKSBsZXZlbCA9IDE7CisjZWxzZQorICAgIGlmIChsZXZlbCA9PSBaX0RFRkFVTFRfQ09NUFJFU1NJT04pIGxldmVsID0gNjsKKyNlbmRpZgorCisgICAgaWYgKHdpbmRvd0JpdHMgPCAwKSB7IC8qIHN1cHByZXNzIHpsaWIgd3JhcHBlciAqLworICAgICAgICB3cmFwID0gMDsKKyAgICAgICAgd2luZG93Qml0cyA9IC13aW5kb3dCaXRzOworICAgIH0KKyNpZmRlZiBHWklQCisgICAgZWxzZSBpZiAod2luZG93Qml0cyA+IDE1KSB7CisgICAgICAgIHdyYXAgPSAyOyAgICAgICAvKiB3cml0ZSBnemlwIHdyYXBwZXIgaW5zdGVhZCAqLworICAgICAgICB3aW5kb3dCaXRzIC09IDE2OworICAgIH0KKyNlbmRpZgorICAgIGlmIChtZW1MZXZlbCA8IDEgfHwgbWVtTGV2ZWwgPiBNQVhfTUVNX0xFVkVMIHx8IG1ldGhvZCAhPSBaX0RFRkxBVEVEIHx8CisgICAgICAgIHdpbmRvd0JpdHMgPCA4IHx8IHdpbmRvd0JpdHMgPiAxNSB8fCBsZXZlbCA8IDAgfHwgbGV2ZWwgPiA5IHx8CisgICAgICAgIHN0cmF0ZWd5IDwgMCB8fCBzdHJhdGVneSA+IFpfRklYRUQpIHsKKyAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworICAgIH0KKyAgICBpZiAod2luZG93Qml0cyA9PSA4KSB3aW5kb3dCaXRzID0gOTsgIC8qIHVudGlsIDI1Ni1ieXRlIHdpbmRvdyBidWcgZml4ZWQgKi8KKyAgICBzID0gKGRlZmxhdGVfc3RhdGUgKikgWkFMTE9DKHN0cm0sIDEsIHNpemVvZihkZWZsYXRlX3N0YXRlKSk7CisgICAgaWYgKHMgPT0gWl9OVUxMKSByZXR1cm4gWl9NRU1fRVJST1I7CisgICAgc3RybS0+c3RhdGUgPSAoc3RydWN0IGludGVybmFsX3N0YXRlIEZBUiAqKXM7CisgICAgcy0+c3RybSA9IHN0cm07CisKKyAgICBzLT53cmFwID0gd3JhcDsKKyAgICBzLT5nemhlYWQgPSBaX05VTEw7CisgICAgcy0+d19iaXRzID0gd2luZG93Qml0czsKKyAgICBzLT53X3NpemUgPSAxIDw8IHMtPndfYml0czsKKyAgICBzLT53X21hc2sgPSBzLT53X3NpemUgLSAxOworCisgICAgcy0+aGFzaF9iaXRzID0gbWVtTGV2ZWwgKyA3OworICAgIHMtPmhhc2hfc2l6ZSA9IDEgPDwgcy0+aGFzaF9iaXRzOworICAgIHMtPmhhc2hfbWFzayA9IHMtPmhhc2hfc2l6ZSAtIDE7CisgICAgcy0+aGFzaF9zaGlmdCA9ICAoKHMtPmhhc2hfYml0cytNSU5fTUFUQ0gtMSkvTUlOX01BVENIKTsKKworICAgIHMtPndpbmRvdyA9IChCeXRlZiAqKSBaQUxMT0Moc3RybSwgcy0+d19zaXplLCAyKnNpemVvZihCeXRlKSk7CisgICAgcy0+cHJldiAgID0gKFBvc2YgKikgIFpBTExPQyhzdHJtLCBzLT53X3NpemUsIHNpemVvZihQb3MpKTsKKyAgICBzLT5oZWFkICAgPSAoUG9zZiAqKSAgWkFMTE9DKHN0cm0sIHMtPmhhc2hfc2l6ZSwgc2l6ZW9mKFBvcykpOworCisgICAgcy0+aGlnaF93YXRlciA9IDA7ICAgICAgLyogbm90aGluZyB3cml0dGVuIHRvIHMtPndpbmRvdyB5ZXQgKi8KKworICAgIHMtPmxpdF9idWZzaXplID0gMSA8PCAobWVtTGV2ZWwgKyA2KTsgLyogMTZLIGVsZW1lbnRzIGJ5IGRlZmF1bHQgKi8KKworICAgIG92ZXJsYXkgPSAodXNoZiAqKSBaQUxMT0Moc3RybSwgcy0+bGl0X2J1ZnNpemUsIHNpemVvZih1c2gpKzIpOworICAgIHMtPnBlbmRpbmdfYnVmID0gKHVjaGYgKikgb3ZlcmxheTsKKyAgICBzLT5wZW5kaW5nX2J1Zl9zaXplID0gKHVsZylzLT5saXRfYnVmc2l6ZSAqIChzaXplb2YodXNoKSsyTCk7CisKKyAgICBpZiAocy0+d2luZG93ID09IFpfTlVMTCB8fCBzLT5wcmV2ID09IFpfTlVMTCB8fCBzLT5oZWFkID09IFpfTlVMTCB8fAorICAgICAgICBzLT5wZW5kaW5nX2J1ZiA9PSBaX05VTEwpIHsKKyAgICAgICAgcy0+c3RhdHVzID0gRklOSVNIX1NUQVRFOworICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciopRVJSX01TRyhaX01FTV9FUlJPUik7CisgICAgICAgIGRlZmxhdGVFbmQgKHN0cm0pOworICAgICAgICByZXR1cm4gWl9NRU1fRVJST1I7CisgICAgfQorICAgIHMtPmRfYnVmID0gb3ZlcmxheSArIHMtPmxpdF9idWZzaXplL3NpemVvZih1c2gpOworICAgIHMtPmxfYnVmID0gcy0+cGVuZGluZ19idWYgKyAoMStzaXplb2YodXNoKSkqcy0+bGl0X2J1ZnNpemU7CisKKyAgICBzLT5sZXZlbCA9IGxldmVsOworICAgIHMtPnN0cmF0ZWd5ID0gc3RyYXRlZ3k7CisgICAgcy0+bWV0aG9kID0gKEJ5dGUpbWV0aG9kOworCisgICAgcmV0dXJuIGRlZmxhdGVSZXNldChzdHJtKTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworaW50IFpFWFBPUlQgZGVmbGF0ZVNldERpY3Rpb25hcnkgKHN0cm0sIGRpY3Rpb25hcnksIGRpY3RMZW5ndGgpCisgICAgel9zdHJlYW1wIHN0cm07CisgICAgY29uc3QgQnl0ZWYgKmRpY3Rpb25hcnk7CisgICAgdUludCAgZGljdExlbmd0aDsKK3sKKyAgICBkZWZsYXRlX3N0YXRlICpzOworICAgIHVJbnQgc3RyLCBuOworICAgIGludCB3cmFwOworICAgIHVuc2lnbmVkIGF2YWlsOworICAgIHVuc2lnbmVkIGNoYXIgKm5leHQ7CisKKyAgICBpZiAoc3RybSA9PSBaX05VTEwgfHwgc3RybS0+c3RhdGUgPT0gWl9OVUxMIHx8IGRpY3Rpb25hcnkgPT0gWl9OVUxMKQorICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisgICAgcyA9IHN0cm0tPnN0YXRlOworICAgIHdyYXAgPSBzLT53cmFwOworICAgIGlmICh3cmFwID09IDIgfHwgKHdyYXAgPT0gMSAmJiBzLT5zdGF0dXMgIT0gSU5JVF9TVEFURSkgfHwgcy0+bG9va2FoZWFkKQorICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisKKyAgICAvKiB3aGVuIHVzaW5nIHpsaWIgd3JhcHBlcnMsIGNvbXB1dGUgQWRsZXItMzIgZm9yIHByb3ZpZGVkIGRpY3Rpb25hcnkgKi8KKyAgICBpZiAod3JhcCA9PSAxKQorICAgICAgICBzdHJtLT5hZGxlciA9IGFkbGVyMzIoc3RybS0+YWRsZXIsIGRpY3Rpb25hcnksIGRpY3RMZW5ndGgpOworICAgIHMtPndyYXAgPSAwOyAgICAgICAgICAgICAgICAgICAgLyogYXZvaWQgY29tcHV0aW5nIEFkbGVyLTMyIGluIHJlYWRfYnVmICovCisKKyAgICAvKiBpZiBkaWN0aW9uYXJ5IHdvdWxkIGZpbGwgd2luZG93LCBqdXN0IHJlcGxhY2UgdGhlIGhpc3RvcnkgKi8KKyAgICBpZiAoZGljdExlbmd0aCA+PSBzLT53X3NpemUpIHsKKyAgICAgICAgaWYgKHdyYXAgPT0gMCkgeyAgICAgICAgICAgIC8qIGFscmVhZHkgZW1wdHkgb3RoZXJ3aXNlICovCisgICAgICAgICAgICBDTEVBUl9IQVNIKHMpOworICAgICAgICAgICAgcy0+c3Ryc3RhcnQgPSAwOworICAgICAgICAgICAgcy0+YmxvY2tfc3RhcnQgPSAwTDsKKyAgICAgICAgICAgIHMtPmluc2VydCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZGljdGlvbmFyeSArPSBkaWN0TGVuZ3RoIC0gcy0+d19zaXplOyAgLyogdXNlIHRoZSB0YWlsICovCisgICAgICAgIGRpY3RMZW5ndGggPSBzLT53X3NpemU7CisgICAgfQorCisgICAgLyogaW5zZXJ0IGRpY3Rpb25hcnkgaW50byB3aW5kb3cgYW5kIGhhc2ggKi8KKyAgICBhdmFpbCA9IHN0cm0tPmF2YWlsX2luOworICAgIG5leHQgPSBzdHJtLT5uZXh0X2luOworICAgIHN0cm0tPmF2YWlsX2luID0gZGljdExlbmd0aDsKKyAgICBzdHJtLT5uZXh0X2luID0gKEJ5dGVmICopZGljdGlvbmFyeTsKKyAgICBmaWxsX3dpbmRvdyhzKTsKKyAgICB3aGlsZSAocy0+bG9va2FoZWFkID49IE1JTl9NQVRDSCkgeworICAgICAgICBzdHIgPSBzLT5zdHJzdGFydDsKKyAgICAgICAgbiA9IHMtPmxvb2thaGVhZCAtIChNSU5fTUFUQ0gtMSk7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIFVQREFURV9IQVNIKHMsIHMtPmluc19oLCBzLT53aW5kb3dbc3RyICsgTUlOX01BVENILTFdKTsKKyNpZm5kZWYgRkFTVEVTVAorICAgICAgICAgICAgcy0+cHJldltzdHIgJiBzLT53X21hc2tdID0gcy0+aGVhZFtzLT5pbnNfaF07CisjZW5kaWYKKyAgICAgICAgICAgIHMtPmhlYWRbcy0+aW5zX2hdID0gKFBvcylzdHI7CisgICAgICAgICAgICBzdHIrKzsKKyAgICAgICAgfSB3aGlsZSAoLS1uKTsKKyAgICAgICAgcy0+c3Ryc3RhcnQgPSBzdHI7CisgICAgICAgIHMtPmxvb2thaGVhZCA9IE1JTl9NQVRDSC0xOworICAgICAgICBmaWxsX3dpbmRvdyhzKTsKKyAgICB9CisgICAgcy0+c3Ryc3RhcnQgKz0gcy0+bG9va2FoZWFkOworICAgIHMtPmJsb2NrX3N0YXJ0ID0gKGxvbmcpcy0+c3Ryc3RhcnQ7CisgICAgcy0+aW5zZXJ0ID0gcy0+bG9va2FoZWFkOworICAgIHMtPmxvb2thaGVhZCA9IDA7CisgICAgcy0+bWF0Y2hfbGVuZ3RoID0gcy0+cHJldl9sZW5ndGggPSBNSU5fTUFUQ0gtMTsKKyAgICBzLT5tYXRjaF9hdmFpbGFibGUgPSAwOworICAgIHN0cm0tPm5leHRfaW4gPSBuZXh0OworICAgIHN0cm0tPmF2YWlsX2luID0gYXZhaWw7CisgICAgcy0+d3JhcCA9IHdyYXA7CisgICAgcmV0dXJuIFpfT0s7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK2ludCBaRVhQT1JUIGRlZmxhdGVSZXNldEtlZXAgKHN0cm0pCisgICAgel9zdHJlYW1wIHN0cm07Cit7CisgICAgZGVmbGF0ZV9zdGF0ZSAqczsKKworICAgIGlmIChzdHJtID09IFpfTlVMTCB8fCBzdHJtLT5zdGF0ZSA9PSBaX05VTEwgfHwKKyAgICAgICAgc3RybS0+emFsbG9jID09IChhbGxvY19mdW5jKTAgfHwgc3RybS0+emZyZWUgPT0gKGZyZWVfZnVuYykwKSB7CisgICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKyAgICB9CisKKyAgICBzdHJtLT50b3RhbF9pbiA9IHN0cm0tPnRvdGFsX291dCA9IDA7CisgICAgc3RybS0+bXNnID0gWl9OVUxMOyAvKiB1c2UgemZyZWUgaWYgd2UgZXZlciBhbGxvY2F0ZSBtc2cgZHluYW1pY2FsbHkgKi8KKyAgICBzdHJtLT5kYXRhX3R5cGUgPSBaX1VOS05PV047CisKKyAgICBzID0gKGRlZmxhdGVfc3RhdGUgKilzdHJtLT5zdGF0ZTsKKyAgICBzLT5wZW5kaW5nID0gMDsKKyAgICBzLT5wZW5kaW5nX291dCA9IHMtPnBlbmRpbmdfYnVmOworCisgICAgaWYgKHMtPndyYXAgPCAwKSB7CisgICAgICAgIHMtPndyYXAgPSAtcy0+d3JhcDsgLyogd2FzIG1hZGUgbmVnYXRpdmUgYnkgZGVmbGF0ZSguLi4sIFpfRklOSVNIKTsgKi8KKyAgICB9CisgICAgcy0+c3RhdHVzID0gcy0+d3JhcCA/IElOSVRfU1RBVEUgOiBCVVNZX1NUQVRFOworICAgIHN0cm0tPmFkbGVyID0KKyNpZmRlZiBHWklQCisgICAgICAgIHMtPndyYXAgPT0gMiA/IGNyYzMyKDBMLCBaX05VTEwsIDApIDoKKyNlbmRpZgorICAgICAgICBhZGxlcjMyKDBMLCBaX05VTEwsIDApOworICAgIHMtPmxhc3RfZmx1c2ggPSBaX05PX0ZMVVNIOworCisgICAgX3RyX2luaXQocyk7CisKKyAgICByZXR1cm4gWl9PSzsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworaW50IFpFWFBPUlQgZGVmbGF0ZVJlc2V0IChzdHJtKQorICAgIHpfc3RyZWFtcCBzdHJtOworeworICAgIGludCByZXQ7CisKKyAgICByZXQgPSBkZWZsYXRlUmVzZXRLZWVwKHN0cm0pOworICAgIGlmIChyZXQgPT0gWl9PSykKKyAgICAgICAgbG1faW5pdChzdHJtLT5zdGF0ZSk7CisgICAgcmV0dXJuIHJldDsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworaW50IFpFWFBPUlQgZGVmbGF0ZVNldEhlYWRlciAoc3RybSwgaGVhZCkKKyAgICB6X3N0cmVhbXAgc3RybTsKKyAgICBnel9oZWFkZXJwIGhlYWQ7Cit7CisgICAgaWYgKHN0cm0gPT0gWl9OVUxMIHx8IHN0cm0tPnN0YXRlID09IFpfTlVMTCkgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworICAgIGlmIChzdHJtLT5zdGF0ZS0+d3JhcCAhPSAyKSByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisgICAgc3RybS0+c3RhdGUtPmd6aGVhZCA9IGhlYWQ7CisgICAgcmV0dXJuIFpfT0s7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK2ludCBaRVhQT1JUIGRlZmxhdGVQZW5kaW5nIChzdHJtLCBwZW5kaW5nLCBiaXRzKQorICAgIHVuc2lnbmVkICpwZW5kaW5nOworICAgIGludCAqYml0czsKKyAgICB6X3N0cmVhbXAgc3RybTsKK3sKKyAgICBpZiAoc3RybSA9PSBaX05VTEwgfHwgc3RybS0+c3RhdGUgPT0gWl9OVUxMKSByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisgICAgaWYgKHBlbmRpbmcgIT0gWl9OVUxMKQorICAgICAgICAqcGVuZGluZyA9IHN0cm0tPnN0YXRlLT5wZW5kaW5nOworICAgIGlmIChiaXRzICE9IFpfTlVMTCkKKyAgICAgICAgKmJpdHMgPSBzdHJtLT5zdGF0ZS0+YmlfdmFsaWQ7CisgICAgcmV0dXJuIFpfT0s7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK2ludCBaRVhQT1JUIGRlZmxhdGVQcmltZSAoc3RybSwgYml0cywgdmFsdWUpCisgICAgel9zdHJlYW1wIHN0cm07CisgICAgaW50IGJpdHM7CisgICAgaW50IHZhbHVlOworeworICAgIGRlZmxhdGVfc3RhdGUgKnM7CisgICAgaW50IHB1dDsKKworICAgIGlmIChzdHJtID09IFpfTlVMTCB8fCBzdHJtLT5zdGF0ZSA9PSBaX05VTEwpIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKyAgICBzID0gc3RybS0+c3RhdGU7CisgICAgaWYgKChCeXRlZiAqKShzLT5kX2J1ZikgPCBzLT5wZW5kaW5nX291dCArICgoQnVmX3NpemUgKyA3KSA+PiAzKSkKKyAgICAgICAgcmV0dXJuIFpfQlVGX0VSUk9SOworICAgIGRvIHsKKyAgICAgICAgcHV0ID0gQnVmX3NpemUgLSBzLT5iaV92YWxpZDsKKyAgICAgICAgaWYgKHB1dCA+IGJpdHMpCisgICAgICAgICAgICBwdXQgPSBiaXRzOworICAgICAgICBzLT5iaV9idWYgfD0gKHVzaCkoKHZhbHVlICYgKCgxIDw8IHB1dCkgLSAxKSkgPDwgcy0+YmlfdmFsaWQpOworICAgICAgICBzLT5iaV92YWxpZCArPSBwdXQ7CisgICAgICAgIF90cl9mbHVzaF9iaXRzKHMpOworICAgICAgICB2YWx1ZSA+Pj0gcHV0OworICAgICAgICBiaXRzIC09IHB1dDsKKyAgICB9IHdoaWxlIChiaXRzKTsKKyAgICByZXR1cm4gWl9PSzsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworaW50IFpFWFBPUlQgZGVmbGF0ZVBhcmFtcyhzdHJtLCBsZXZlbCwgc3RyYXRlZ3kpCisgICAgel9zdHJlYW1wIHN0cm07CisgICAgaW50IGxldmVsOworICAgIGludCBzdHJhdGVneTsKK3sKKyAgICBkZWZsYXRlX3N0YXRlICpzOworICAgIGNvbXByZXNzX2Z1bmMgZnVuYzsKKyAgICBpbnQgZXJyID0gWl9PSzsKKworICAgIGlmIChzdHJtID09IFpfTlVMTCB8fCBzdHJtLT5zdGF0ZSA9PSBaX05VTEwpIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKyAgICBzID0gc3RybS0+c3RhdGU7CisKKyNpZmRlZiBGQVNURVNUCisgICAgaWYgKGxldmVsICE9IDApIGxldmVsID0gMTsKKyNlbHNlCisgICAgaWYgKGxldmVsID09IFpfREVGQVVMVF9DT01QUkVTU0lPTikgbGV2ZWwgPSA2OworI2VuZGlmCisgICAgaWYgKGxldmVsIDwgMCB8fCBsZXZlbCA+IDkgfHwgc3RyYXRlZ3kgPCAwIHx8IHN0cmF0ZWd5ID4gWl9GSVhFRCkgeworICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisgICAgfQorICAgIGZ1bmMgPSBjb25maWd1cmF0aW9uX3RhYmxlW3MtPmxldmVsXS5mdW5jOworCisgICAgaWYgKChzdHJhdGVneSAhPSBzLT5zdHJhdGVneSB8fCBmdW5jICE9IGNvbmZpZ3VyYXRpb25fdGFibGVbbGV2ZWxdLmZ1bmMpICYmCisgICAgICAgIHN0cm0tPnRvdGFsX2luICE9IDApIHsKKyAgICAgICAgLyogRmx1c2ggdGhlIGxhc3QgYnVmZmVyOiAqLworICAgICAgICBlcnIgPSBkZWZsYXRlKHN0cm0sIFpfQkxPQ0spOworICAgIH0KKyAgICBpZiAocy0+bGV2ZWwgIT0gbGV2ZWwpIHsKKyAgICAgICAgcy0+bGV2ZWwgPSBsZXZlbDsKKyAgICAgICAgcy0+bWF4X2xhenlfbWF0Y2ggICA9IGNvbmZpZ3VyYXRpb25fdGFibGVbbGV2ZWxdLm1heF9sYXp5OworICAgICAgICBzLT5nb29kX21hdGNoICAgICAgID0gY29uZmlndXJhdGlvbl90YWJsZVtsZXZlbF0uZ29vZF9sZW5ndGg7CisgICAgICAgIHMtPm5pY2VfbWF0Y2ggICAgICAgPSBjb25maWd1cmF0aW9uX3RhYmxlW2xldmVsXS5uaWNlX2xlbmd0aDsKKyAgICAgICAgcy0+bWF4X2NoYWluX2xlbmd0aCA9IGNvbmZpZ3VyYXRpb25fdGFibGVbbGV2ZWxdLm1heF9jaGFpbjsKKyAgICB9CisgICAgcy0+c3RyYXRlZ3kgPSBzdHJhdGVneTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitpbnQgWkVYUE9SVCBkZWZsYXRlVHVuZShzdHJtLCBnb29kX2xlbmd0aCwgbWF4X2xhenksIG5pY2VfbGVuZ3RoLCBtYXhfY2hhaW4pCisgICAgel9zdHJlYW1wIHN0cm07CisgICAgaW50IGdvb2RfbGVuZ3RoOworICAgIGludCBtYXhfbGF6eTsKKyAgICBpbnQgbmljZV9sZW5ndGg7CisgICAgaW50IG1heF9jaGFpbjsKK3sKKyAgICBkZWZsYXRlX3N0YXRlICpzOworCisgICAgaWYgKHN0cm0gPT0gWl9OVUxMIHx8IHN0cm0tPnN0YXRlID09IFpfTlVMTCkgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworICAgIHMgPSBzdHJtLT5zdGF0ZTsKKyAgICBzLT5nb29kX21hdGNoID0gZ29vZF9sZW5ndGg7CisgICAgcy0+bWF4X2xhenlfbWF0Y2ggPSBtYXhfbGF6eTsKKyAgICBzLT5uaWNlX21hdGNoID0gbmljZV9sZW5ndGg7CisgICAgcy0+bWF4X2NoYWluX2xlbmd0aCA9IG1heF9jaGFpbjsKKyAgICByZXR1cm4gWl9PSzsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRm9yIHRoZSBkZWZhdWx0IHdpbmRvd0JpdHMgb2YgMTUgYW5kIG1lbUxldmVsIG9mIDgsIHRoaXMgZnVuY3Rpb24gcmV0dXJucworICogYSBjbG9zZSB0byBleGFjdCwgYXMgd2VsbCBhcyBzbWFsbCwgdXBwZXIgYm91bmQgb24gdGhlIGNvbXByZXNzZWQgc2l6ZS4KKyAqIFRoZXkgYXJlIGNvZGVkIGFzIGNvbnN0YW50cyBoZXJlIGZvciBhIHJlYXNvbi0taWYgdGhlICNkZWZpbmUncyBhcmUKKyAqIGNoYW5nZWQsIHRoZW4gdGhpcyBmdW5jdGlvbiBuZWVkcyB0byBiZSBjaGFuZ2VkIGFzIHdlbGwuICBUaGUgcmV0dXJuCisgKiB2YWx1ZSBmb3IgMTUgYW5kIDggb25seSB3b3JrcyBmb3IgdGhvc2UgZXhhY3Qgc2V0dGluZ3MuCisgKgorICogRm9yIGFueSBzZXR0aW5nIG90aGVyIHRoYW4gdGhvc2UgZGVmYXVsdHMgZm9yIHdpbmRvd0JpdHMgYW5kIG1lbUxldmVsLAorICogdGhlIHZhbHVlIHJldHVybmVkIGlzIGEgY29uc2VydmF0aXZlIHdvcnN0IGNhc2UgZm9yIHRoZSBtYXhpbXVtIGV4cGFuc2lvbgorICogcmVzdWx0aW5nIGZyb20gdXNpbmcgZml4ZWQgYmxvY2tzIGluc3RlYWQgb2Ygc3RvcmVkIGJsb2Nrcywgd2hpY2ggZGVmbGF0ZQorICogY2FuIGVtaXQgb24gY29tcHJlc3NlZCBkYXRhIGZvciBzb21lIGNvbWJpbmF0aW9ucyBvZiB0aGUgcGFyYW1ldGVycy4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGNvdWxkIGJlIG1vcmUgc29waGlzdGljYXRlZCB0byBwcm92aWRlIGNsb3NlciB1cHBlciBib3VuZHMgZm9yCisgKiBldmVyeSBjb21iaW5hdGlvbiBvZiB3aW5kb3dCaXRzIGFuZCBtZW1MZXZlbC4gIEJ1dCBldmVuIHRoZSBjb25zZXJ2YXRpdmUKKyAqIHVwcGVyIGJvdW5kIG9mIGFib3V0IDE0JSBleHBhbnNpb24gZG9lcyBub3Qgc2VlbSBvbmVyb3VzIGZvciBvdXRwdXQgYnVmZmVyCisgKiBhbGxvY2F0aW9uLgorICovCit1TG9uZyBaRVhQT1JUIGRlZmxhdGVCb3VuZChzdHJtLCBzb3VyY2VMZW4pCisgICAgel9zdHJlYW1wIHN0cm07CisgICAgdUxvbmcgc291cmNlTGVuOworeworICAgIGRlZmxhdGVfc3RhdGUgKnM7CisgICAgdUxvbmcgY29tcGxlbiwgd3JhcGxlbjsKKyAgICBCeXRlZiAqc3RyOworCisgICAgLyogY29uc2VydmF0aXZlIHVwcGVyIGJvdW5kIGZvciBjb21wcmVzc2VkIGRhdGEgKi8KKyAgICBjb21wbGVuID0gc291cmNlTGVuICsKKyAgICAgICAgICAgICAgKChzb3VyY2VMZW4gKyA3KSA+PiAzKSArICgoc291cmNlTGVuICsgNjMpID4+IDYpICsgNTsKKworICAgIC8qIGlmIGNhbid0IGdldCBwYXJhbWV0ZXJzLCByZXR1cm4gY29uc2VydmF0aXZlIGJvdW5kIHBsdXMgemxpYiB3cmFwcGVyICovCisgICAgaWYgKHN0cm0gPT0gWl9OVUxMIHx8IHN0cm0tPnN0YXRlID09IFpfTlVMTCkKKyAgICAgICAgcmV0dXJuIGNvbXBsZW4gKyA2OworCisgICAgLyogY29tcHV0ZSB3cmFwcGVyIGxlbmd0aCAqLworICAgIHMgPSBzdHJtLT5zdGF0ZTsKKyAgICBzd2l0Y2ggKHMtPndyYXApIHsKKyAgICBjYXNlIDA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmF3IGRlZmxhdGUgKi8KKyAgICAgICAgd3JhcGxlbiA9IDA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB6bGliIHdyYXBwZXIgKi8KKyAgICAgICAgd3JhcGxlbiA9IDYgKyAocy0+c3Ryc3RhcnQgPyA0IDogMCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBnemlwIHdyYXBwZXIgKi8KKyAgICAgICAgd3JhcGxlbiA9IDE4OworICAgICAgICBpZiAocy0+Z3poZWFkICE9IFpfTlVMTCkgeyAgICAgICAgICAvKiB1c2VyLXN1cHBsaWVkIGd6aXAgaGVhZGVyICovCisgICAgICAgICAgICBpZiAocy0+Z3poZWFkLT5leHRyYSAhPSBaX05VTEwpCisgICAgICAgICAgICAgICAgd3JhcGxlbiArPSAyICsgcy0+Z3poZWFkLT5leHRyYV9sZW47CisgICAgICAgICAgICBzdHIgPSBzLT5nemhlYWQtPm5hbWU7CisgICAgICAgICAgICBpZiAoc3RyICE9IFpfTlVMTCkKKyAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgIHdyYXBsZW4rKzsKKyAgICAgICAgICAgICAgICB9IHdoaWxlICgqc3RyKyspOworICAgICAgICAgICAgc3RyID0gcy0+Z3poZWFkLT5jb21tZW50OworICAgICAgICAgICAgaWYgKHN0ciAhPSBaX05VTEwpCisgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICB3cmFwbGVuKys7CisgICAgICAgICAgICAgICAgfSB3aGlsZSAoKnN0cisrKTsKKyAgICAgICAgICAgIGlmIChzLT5nemhlYWQtPmhjcmMpCisgICAgICAgICAgICAgICAgd3JhcGxlbiArPSAyOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmb3IgY29tcGlsZXIgaGFwcGluZXNzICovCisgICAgICAgIHdyYXBsZW4gPSA2OworICAgIH0KKworICAgIC8qIGlmIG5vdCBkZWZhdWx0IHBhcmFtZXRlcnMsIHJldHVybiBjb25zZXJ2YXRpdmUgYm91bmQgKi8KKyAgICBpZiAocy0+d19iaXRzICE9IDE1IHx8IHMtPmhhc2hfYml0cyAhPSA4ICsgNykKKyAgICAgICAgcmV0dXJuIGNvbXBsZW4gKyB3cmFwbGVuOworCisgICAgLyogZGVmYXVsdCBzZXR0aW5nczogcmV0dXJuIHRpZ2h0IGJvdW5kIGZvciB0aGF0IGNhc2UgKi8KKyAgICByZXR1cm4gc291cmNlTGVuICsgKHNvdXJjZUxlbiA+PiAxMikgKyAoc291cmNlTGVuID4+IDE0KSArCisgICAgICAgICAgIChzb3VyY2VMZW4gPj4gMjUpICsgMTMgLSA2ICsgd3JhcGxlbjsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogUHV0IGEgc2hvcnQgaW4gdGhlIHBlbmRpbmcgYnVmZmVyLiBUaGUgMTYtYml0IHZhbHVlIGlzIHB1dCBpbiBNU0Igb3JkZXIuCisgKiBJTiBhc3NlcnRpb246IHRoZSBzdHJlYW0gc3RhdGUgaXMgY29ycmVjdCBhbmQgdGhlcmUgaXMgZW5vdWdoIHJvb20gaW4KKyAqIHBlbmRpbmdfYnVmLgorICovCitsb2NhbCB2b2lkIHB1dFNob3J0TVNCIChzLCBiKQorICAgIGRlZmxhdGVfc3RhdGUgKnM7CisgICAgdUludCBiOworeworICAgIHB1dF9ieXRlKHMsIChCeXRlKShiID4+IDgpKTsKKyAgICBwdXRfYnl0ZShzLCAoQnl0ZSkoYiAmIDB4ZmYpKTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRmx1c2ggYXMgbXVjaCBwZW5kaW5nIG91dHB1dCBhcyBwb3NzaWJsZS4gQWxsIGRlZmxhdGUoKSBvdXRwdXQgZ29lcworICogdGhyb3VnaCB0aGlzIGZ1bmN0aW9uIHNvIHNvbWUgYXBwbGljYXRpb25zIG1heSB3aXNoIHRvIG1vZGlmeSBpdAorICogdG8gYXZvaWQgYWxsb2NhdGluZyBhIGxhcmdlIHN0cm0tPm5leHRfb3V0IGJ1ZmZlciBhbmQgY29weWluZyBpbnRvIGl0LgorICogKFNlZSBhbHNvIHJlYWRfYnVmKCkpLgorICovCitsb2NhbCB2b2lkIGZsdXNoX3BlbmRpbmcoc3RybSkKKyAgICB6X3N0cmVhbXAgc3RybTsKK3sKKyAgICB1bnNpZ25lZCBsZW47CisgICAgZGVmbGF0ZV9zdGF0ZSAqcyA9IHN0cm0tPnN0YXRlOworCisgICAgX3RyX2ZsdXNoX2JpdHMocyk7CisgICAgbGVuID0gcy0+cGVuZGluZzsKKyAgICBpZiAobGVuID4gc3RybS0+YXZhaWxfb3V0KSBsZW4gPSBzdHJtLT5hdmFpbF9vdXQ7CisgICAgaWYgKGxlbiA9PSAwKSByZXR1cm47CisKKyAgICB6bWVtY3B5KHN0cm0tPm5leHRfb3V0LCBzLT5wZW5kaW5nX291dCwgbGVuKTsKKyAgICBzdHJtLT5uZXh0X291dCAgKz0gbGVuOworICAgIHMtPnBlbmRpbmdfb3V0ICArPSBsZW47CisgICAgc3RybS0+dG90YWxfb3V0ICs9IGxlbjsKKyAgICBzdHJtLT5hdmFpbF9vdXQgIC09IGxlbjsKKyAgICBzLT5wZW5kaW5nIC09IGxlbjsKKyAgICBpZiAocy0+cGVuZGluZyA9PSAwKSB7CisgICAgICAgIHMtPnBlbmRpbmdfb3V0ID0gcy0+cGVuZGluZ19idWY7CisgICAgfQorfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitpbnQgWkVYUE9SVCBkZWZsYXRlIChzdHJtLCBmbHVzaCkKKyAgICB6X3N0cmVhbXAgc3RybTsKKyAgICBpbnQgZmx1c2g7Cit7CisgICAgaW50IG9sZF9mbHVzaDsgLyogdmFsdWUgb2YgZmx1c2ggcGFyYW0gZm9yIHByZXZpb3VzIGRlZmxhdGUgY2FsbCAqLworICAgIGRlZmxhdGVfc3RhdGUgKnM7CisKKyAgICBpZiAoc3RybSA9PSBaX05VTEwgfHwgc3RybS0+c3RhdGUgPT0gWl9OVUxMIHx8CisgICAgICAgIGZsdXNoID4gWl9CTE9DSyB8fCBmbHVzaCA8IDApIHsKKyAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworICAgIH0KKyAgICBzID0gc3RybS0+c3RhdGU7CisKKyAgICBpZiAoc3RybS0+bmV4dF9vdXQgPT0gWl9OVUxMIHx8CisgICAgICAgIChzdHJtLT5uZXh0X2luID09IFpfTlVMTCAmJiBzdHJtLT5hdmFpbF9pbiAhPSAwKSB8fAorICAgICAgICAocy0+c3RhdHVzID09IEZJTklTSF9TVEFURSAmJiBmbHVzaCAhPSBaX0ZJTklTSCkpIHsKKyAgICAgICAgRVJSX1JFVFVSTihzdHJtLCBaX1NUUkVBTV9FUlJPUik7CisgICAgfQorICAgIGlmIChzdHJtLT5hdmFpbF9vdXQgPT0gMCkgRVJSX1JFVFVSTihzdHJtLCBaX0JVRl9FUlJPUik7CisKKyAgICBzLT5zdHJtID0gc3RybTsgLyoganVzdCBpbiBjYXNlICovCisgICAgb2xkX2ZsdXNoID0gcy0+bGFzdF9mbHVzaDsKKyAgICBzLT5sYXN0X2ZsdXNoID0gZmx1c2g7CisKKyAgICAvKiBXcml0ZSB0aGUgaGVhZGVyICovCisgICAgaWYgKHMtPnN0YXR1cyA9PSBJTklUX1NUQVRFKSB7CisjaWZkZWYgR1pJUAorICAgICAgICBpZiAocy0+d3JhcCA9PSAyKSB7CisgICAgICAgICAgICBzdHJtLT5hZGxlciA9IGNyYzMyKDBMLCBaX05VTEwsIDApOworICAgICAgICAgICAgcHV0X2J5dGUocywgMzEpOworICAgICAgICAgICAgcHV0X2J5dGUocywgMTM5KTsKKyAgICAgICAgICAgIHB1dF9ieXRlKHMsIDgpOworICAgICAgICAgICAgaWYgKHMtPmd6aGVhZCA9PSBaX05VTEwpIHsKKyAgICAgICAgICAgICAgICBwdXRfYnl0ZShzLCAwKTsKKyAgICAgICAgICAgICAgICBwdXRfYnl0ZShzLCAwKTsKKyAgICAgICAgICAgICAgICBwdXRfYnl0ZShzLCAwKTsKKyAgICAgICAgICAgICAgICBwdXRfYnl0ZShzLCAwKTsKKyAgICAgICAgICAgICAgICBwdXRfYnl0ZShzLCAwKTsKKyAgICAgICAgICAgICAgICBwdXRfYnl0ZShzLCBzLT5sZXZlbCA9PSA5ID8gMiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHMtPnN0cmF0ZWd5ID49IFpfSFVGRk1BTl9PTkxZIHx8IHMtPmxldmVsIDwgMiA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQgOiAwKSk7CisgICAgICAgICAgICAgICAgcHV0X2J5dGUocywgT1NfQ09ERSk7CisgICAgICAgICAgICAgICAgcy0+c3RhdHVzID0gQlVTWV9TVEFURTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHB1dF9ieXRlKHMsIChzLT5nemhlYWQtPnRleHQgPyAxIDogMCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzLT5nemhlYWQtPmhjcmMgPyAyIDogMCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzLT5nemhlYWQtPmV4dHJhID09IFpfTlVMTCA/IDAgOiA0KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHMtPmd6aGVhZC0+bmFtZSA9PSBaX05VTEwgPyAwIDogOCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzLT5nemhlYWQtPmNvbW1lbnQgPT0gWl9OVUxMID8gMCA6IDE2KQorICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICBwdXRfYnl0ZShzLCAoQnl0ZSkocy0+Z3poZWFkLT50aW1lICYgMHhmZikpOworICAgICAgICAgICAgICAgIHB1dF9ieXRlKHMsIChCeXRlKSgocy0+Z3poZWFkLT50aW1lID4+IDgpICYgMHhmZikpOworICAgICAgICAgICAgICAgIHB1dF9ieXRlKHMsIChCeXRlKSgocy0+Z3poZWFkLT50aW1lID4+IDE2KSAmIDB4ZmYpKTsKKyAgICAgICAgICAgICAgICBwdXRfYnl0ZShzLCAoQnl0ZSkoKHMtPmd6aGVhZC0+dGltZSA+PiAyNCkgJiAweGZmKSk7CisgICAgICAgICAgICAgICAgcHV0X2J5dGUocywgcy0+bGV2ZWwgPT0gOSA/IDIgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzLT5zdHJhdGVneSA+PSBaX0hVRkZNQU5fT05MWSB8fCBzLT5sZXZlbCA8IDIgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0IDogMCkpOworICAgICAgICAgICAgICAgIHB1dF9ieXRlKHMsIHMtPmd6aGVhZC0+b3MgJiAweGZmKTsKKyAgICAgICAgICAgICAgICBpZiAocy0+Z3poZWFkLT5leHRyYSAhPSBaX05VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgcHV0X2J5dGUocywgcy0+Z3poZWFkLT5leHRyYV9sZW4gJiAweGZmKTsKKyAgICAgICAgICAgICAgICAgICAgcHV0X2J5dGUocywgKHMtPmd6aGVhZC0+ZXh0cmFfbGVuID4+IDgpICYgMHhmZik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChzLT5nemhlYWQtPmhjcmMpCisgICAgICAgICAgICAgICAgICAgIHN0cm0tPmFkbGVyID0gY3JjMzIoc3RybS0+YWRsZXIsIHMtPnBlbmRpbmdfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnBlbmRpbmcpOworICAgICAgICAgICAgICAgIHMtPmd6aW5kZXggPSAwOworICAgICAgICAgICAgICAgIHMtPnN0YXR1cyA9IEVYVFJBX1NUQVRFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyNlbmRpZgorICAgICAgICB7CisgICAgICAgICAgICB1SW50IGhlYWRlciA9IChaX0RFRkxBVEVEICsgKChzLT53X2JpdHMtOCk8PDQpKSA8PCA4OworICAgICAgICAgICAgdUludCBsZXZlbF9mbGFnczsKKworICAgICAgICAgICAgaWYgKHMtPnN0cmF0ZWd5ID49IFpfSFVGRk1BTl9PTkxZIHx8IHMtPmxldmVsIDwgMikKKyAgICAgICAgICAgICAgICBsZXZlbF9mbGFncyA9IDA7CisgICAgICAgICAgICBlbHNlIGlmIChzLT5sZXZlbCA8IDYpCisgICAgICAgICAgICAgICAgbGV2ZWxfZmxhZ3MgPSAxOworICAgICAgICAgICAgZWxzZSBpZiAocy0+bGV2ZWwgPT0gNikKKyAgICAgICAgICAgICAgICBsZXZlbF9mbGFncyA9IDI7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbGV2ZWxfZmxhZ3MgPSAzOworICAgICAgICAgICAgaGVhZGVyIHw9IChsZXZlbF9mbGFncyA8PCA2KTsKKyAgICAgICAgICAgIGlmIChzLT5zdHJzdGFydCAhPSAwKSBoZWFkZXIgfD0gUFJFU0VUX0RJQ1Q7CisgICAgICAgICAgICBoZWFkZXIgKz0gMzEgLSAoaGVhZGVyICUgMzEpOworCisgICAgICAgICAgICBzLT5zdGF0dXMgPSBCVVNZX1NUQVRFOworICAgICAgICAgICAgcHV0U2hvcnRNU0IocywgaGVhZGVyKTsKKworICAgICAgICAgICAgLyogU2F2ZSB0aGUgYWRsZXIzMiBvZiB0aGUgcHJlc2V0IGRpY3Rpb25hcnk6ICovCisgICAgICAgICAgICBpZiAocy0+c3Ryc3RhcnQgIT0gMCkgeworICAgICAgICAgICAgICAgIHB1dFNob3J0TVNCKHMsICh1SW50KShzdHJtLT5hZGxlciA+PiAxNikpOworICAgICAgICAgICAgICAgIHB1dFNob3J0TVNCKHMsICh1SW50KShzdHJtLT5hZGxlciAmIDB4ZmZmZikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RybS0+YWRsZXIgPSBhZGxlcjMyKDBMLCBaX05VTEwsIDApOworICAgICAgICB9CisgICAgfQorI2lmZGVmIEdaSVAKKyAgICBpZiAocy0+c3RhdHVzID09IEVYVFJBX1NUQVRFKSB7CisgICAgICAgIGlmIChzLT5nemhlYWQtPmV4dHJhICE9IFpfTlVMTCkgeworICAgICAgICAgICAgdUludCBiZWcgPSBzLT5wZW5kaW5nOyAgLyogc3RhcnQgb2YgYnl0ZXMgdG8gdXBkYXRlIGNyYyAqLworCisgICAgICAgICAgICB3aGlsZSAocy0+Z3ppbmRleCA8IChzLT5nemhlYWQtPmV4dHJhX2xlbiAmIDB4ZmZmZikpIHsKKyAgICAgICAgICAgICAgICBpZiAocy0+cGVuZGluZyA9PSBzLT5wZW5kaW5nX2J1Zl9zaXplKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzLT5nemhlYWQtPmhjcmMgJiYgcy0+cGVuZGluZyA+IGJlZykKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cm0tPmFkbGVyID0gY3JjMzIoc3RybS0+YWRsZXIsIHMtPnBlbmRpbmdfYnVmICsgYmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5wZW5kaW5nIC0gYmVnKTsKKyAgICAgICAgICAgICAgICAgICAgZmx1c2hfcGVuZGluZyhzdHJtKTsKKyAgICAgICAgICAgICAgICAgICAgYmVnID0gcy0+cGVuZGluZzsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHMtPnBlbmRpbmcgPT0gcy0+cGVuZGluZ19idWZfc2l6ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwdXRfYnl0ZShzLCBzLT5nemhlYWQtPmV4dHJhW3MtPmd6aW5kZXhdKTsKKyAgICAgICAgICAgICAgICBzLT5nemluZGV4Kys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocy0+Z3poZWFkLT5oY3JjICYmIHMtPnBlbmRpbmcgPiBiZWcpCisgICAgICAgICAgICAgICAgc3RybS0+YWRsZXIgPSBjcmMzMihzdHJtLT5hZGxlciwgcy0+cGVuZGluZ19idWYgKyBiZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5wZW5kaW5nIC0gYmVnKTsKKyAgICAgICAgICAgIGlmIChzLT5nemluZGV4ID09IHMtPmd6aGVhZC0+ZXh0cmFfbGVuKSB7CisgICAgICAgICAgICAgICAgcy0+Z3ppbmRleCA9IDA7CisgICAgICAgICAgICAgICAgcy0+c3RhdHVzID0gTkFNRV9TVEFURTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBzLT5zdGF0dXMgPSBOQU1FX1NUQVRFOworICAgIH0KKyAgICBpZiAocy0+c3RhdHVzID09IE5BTUVfU1RBVEUpIHsKKyAgICAgICAgaWYgKHMtPmd6aGVhZC0+bmFtZSAhPSBaX05VTEwpIHsKKyAgICAgICAgICAgIHVJbnQgYmVnID0gcy0+cGVuZGluZzsgIC8qIHN0YXJ0IG9mIGJ5dGVzIHRvIHVwZGF0ZSBjcmMgKi8KKyAgICAgICAgICAgIGludCB2YWw7CisKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBpZiAocy0+cGVuZGluZyA9PSBzLT5wZW5kaW5nX2J1Zl9zaXplKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzLT5nemhlYWQtPmhjcmMgJiYgcy0+cGVuZGluZyA+IGJlZykKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cm0tPmFkbGVyID0gY3JjMzIoc3RybS0+YWRsZXIsIHMtPnBlbmRpbmdfYnVmICsgYmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5wZW5kaW5nIC0gYmVnKTsKKyAgICAgICAgICAgICAgICAgICAgZmx1c2hfcGVuZGluZyhzdHJtKTsKKyAgICAgICAgICAgICAgICAgICAgYmVnID0gcy0+cGVuZGluZzsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHMtPnBlbmRpbmcgPT0gcy0+cGVuZGluZ19idWZfc2l6ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHZhbCA9IHMtPmd6aGVhZC0+bmFtZVtzLT5nemluZGV4KytdOworICAgICAgICAgICAgICAgIHB1dF9ieXRlKHMsIHZhbCk7CisgICAgICAgICAgICB9IHdoaWxlICh2YWwgIT0gMCk7CisgICAgICAgICAgICBpZiAocy0+Z3poZWFkLT5oY3JjICYmIHMtPnBlbmRpbmcgPiBiZWcpCisgICAgICAgICAgICAgICAgc3RybS0+YWRsZXIgPSBjcmMzMihzdHJtLT5hZGxlciwgcy0+cGVuZGluZ19idWYgKyBiZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5wZW5kaW5nIC0gYmVnKTsKKyAgICAgICAgICAgIGlmICh2YWwgPT0gMCkgeworICAgICAgICAgICAgICAgIHMtPmd6aW5kZXggPSAwOworICAgICAgICAgICAgICAgIHMtPnN0YXR1cyA9IENPTU1FTlRfU1RBVEU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcy0+c3RhdHVzID0gQ09NTUVOVF9TVEFURTsKKyAgICB9CisgICAgaWYgKHMtPnN0YXR1cyA9PSBDT01NRU5UX1NUQVRFKSB7CisgICAgICAgIGlmIChzLT5nemhlYWQtPmNvbW1lbnQgIT0gWl9OVUxMKSB7CisgICAgICAgICAgICB1SW50IGJlZyA9IHMtPnBlbmRpbmc7ICAvKiBzdGFydCBvZiBieXRlcyB0byB1cGRhdGUgY3JjICovCisgICAgICAgICAgICBpbnQgdmFsOworCisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgaWYgKHMtPnBlbmRpbmcgPT0gcy0+cGVuZGluZ19idWZfc2l6ZSkgeworICAgICAgICAgICAgICAgICAgICBpZiAocy0+Z3poZWFkLT5oY3JjICYmIHMtPnBlbmRpbmcgPiBiZWcpCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJtLT5hZGxlciA9IGNyYzMyKHN0cm0tPmFkbGVyLCBzLT5wZW5kaW5nX2J1ZiArIGJlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cGVuZGluZyAtIGJlZyk7CisgICAgICAgICAgICAgICAgICAgIGZsdXNoX3BlbmRpbmcoc3RybSk7CisgICAgICAgICAgICAgICAgICAgIGJlZyA9IHMtPnBlbmRpbmc7CisgICAgICAgICAgICAgICAgICAgIGlmIChzLT5wZW5kaW5nID09IHMtPnBlbmRpbmdfYnVmX3NpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB2YWwgPSBzLT5nemhlYWQtPmNvbW1lbnRbcy0+Z3ppbmRleCsrXTsKKyAgICAgICAgICAgICAgICBwdXRfYnl0ZShzLCB2YWwpOworICAgICAgICAgICAgfSB3aGlsZSAodmFsICE9IDApOworICAgICAgICAgICAgaWYgKHMtPmd6aGVhZC0+aGNyYyAmJiBzLT5wZW5kaW5nID4gYmVnKQorICAgICAgICAgICAgICAgIHN0cm0tPmFkbGVyID0gY3JjMzIoc3RybS0+YWRsZXIsIHMtPnBlbmRpbmdfYnVmICsgYmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cGVuZGluZyAtIGJlZyk7CisgICAgICAgICAgICBpZiAodmFsID09IDApCisgICAgICAgICAgICAgICAgcy0+c3RhdHVzID0gSENSQ19TVEFURTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBzLT5zdGF0dXMgPSBIQ1JDX1NUQVRFOworICAgIH0KKyAgICBpZiAocy0+c3RhdHVzID09IEhDUkNfU1RBVEUpIHsKKyAgICAgICAgaWYgKHMtPmd6aGVhZC0+aGNyYykgeworICAgICAgICAgICAgaWYgKHMtPnBlbmRpbmcgKyAyID4gcy0+cGVuZGluZ19idWZfc2l6ZSkKKyAgICAgICAgICAgICAgICBmbHVzaF9wZW5kaW5nKHN0cm0pOworICAgICAgICAgICAgaWYgKHMtPnBlbmRpbmcgKyAyIDw9IHMtPnBlbmRpbmdfYnVmX3NpemUpIHsKKyAgICAgICAgICAgICAgICBwdXRfYnl0ZShzLCAoQnl0ZSkoc3RybS0+YWRsZXIgJiAweGZmKSk7CisgICAgICAgICAgICAgICAgcHV0X2J5dGUocywgKEJ5dGUpKChzdHJtLT5hZGxlciA+PiA4KSAmIDB4ZmYpKTsKKyAgICAgICAgICAgICAgICBzdHJtLT5hZGxlciA9IGNyYzMyKDBMLCBaX05VTEwsIDApOworICAgICAgICAgICAgICAgIHMtPnN0YXR1cyA9IEJVU1lfU1RBVEU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcy0+c3RhdHVzID0gQlVTWV9TVEFURTsKKyAgICB9CisjZW5kaWYKKworICAgIC8qIEZsdXNoIGFzIG11Y2ggcGVuZGluZyBvdXRwdXQgYXMgcG9zc2libGUgKi8KKyAgICBpZiAocy0+cGVuZGluZyAhPSAwKSB7CisgICAgICAgIGZsdXNoX3BlbmRpbmcoc3RybSk7CisgICAgICAgIGlmIChzdHJtLT5hdmFpbF9vdXQgPT0gMCkgeworICAgICAgICAgICAgLyogU2luY2UgYXZhaWxfb3V0IGlzIDAsIGRlZmxhdGUgd2lsbCBiZSBjYWxsZWQgYWdhaW4gd2l0aAorICAgICAgICAgICAgICogbW9yZSBvdXRwdXQgc3BhY2UsIGJ1dCBwb3NzaWJseSB3aXRoIGJvdGggcGVuZGluZyBhbmQKKyAgICAgICAgICAgICAqIGF2YWlsX2luIGVxdWFsIHRvIHplcm8uIFRoZXJlIHdvbid0IGJlIGFueXRoaW5nIHRvIGRvLAorICAgICAgICAgICAgICogYnV0IHRoaXMgaXMgbm90IGFuIGVycm9yIHNpdHVhdGlvbiBzbyBtYWtlIHN1cmUgd2UKKyAgICAgICAgICAgICAqIHJldHVybiBPSyBpbnN0ZWFkIG9mIEJVRl9FUlJPUiBhdCBuZXh0IGNhbGwgb2YgZGVmbGF0ZToKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcy0+bGFzdF9mbHVzaCA9IC0xOworICAgICAgICAgICAgcmV0dXJuIFpfT0s7CisgICAgICAgIH0KKworICAgIC8qIE1ha2Ugc3VyZSB0aGVyZSBpcyBzb21ldGhpbmcgdG8gZG8gYW5kIGF2b2lkIGR1cGxpY2F0ZSBjb25zZWN1dGl2ZQorICAgICAqIGZsdXNoZXMuIEZvciByZXBlYXRlZCBhbmQgdXNlbGVzcyBjYWxscyB3aXRoIFpfRklOSVNILCB3ZSBrZWVwCisgICAgICogcmV0dXJuaW5nIFpfU1RSRUFNX0VORCBpbnN0ZWFkIG9mIFpfQlVGX0VSUk9SLgorICAgICAqLworICAgIH0gZWxzZSBpZiAoc3RybS0+YXZhaWxfaW4gPT0gMCAmJiBSQU5LKGZsdXNoKSA8PSBSQU5LKG9sZF9mbHVzaCkgJiYKKyAgICAgICAgICAgICAgIGZsdXNoICE9IFpfRklOSVNIKSB7CisgICAgICAgIEVSUl9SRVRVUk4oc3RybSwgWl9CVUZfRVJST1IpOworICAgIH0KKworICAgIC8qIFVzZXIgbXVzdCBub3QgcHJvdmlkZSBtb3JlIGlucHV0IGFmdGVyIHRoZSBmaXJzdCBGSU5JU0g6ICovCisgICAgaWYgKHMtPnN0YXR1cyA9PSBGSU5JU0hfU1RBVEUgJiYgc3RybS0+YXZhaWxfaW4gIT0gMCkgeworICAgICAgICBFUlJfUkVUVVJOKHN0cm0sIFpfQlVGX0VSUk9SKTsKKyAgICB9CisKKyAgICAvKiBTdGFydCBhIG5ldyBibG9jayBvciBjb250aW51ZSB0aGUgY3VycmVudCBvbmUuCisgICAgICovCisgICAgaWYgKHN0cm0tPmF2YWlsX2luICE9IDAgfHwgcy0+bG9va2FoZWFkICE9IDAgfHwKKyAgICAgICAgKGZsdXNoICE9IFpfTk9fRkxVU0ggJiYgcy0+c3RhdHVzICE9IEZJTklTSF9TVEFURSkpIHsKKyAgICAgICAgYmxvY2tfc3RhdGUgYnN0YXRlOworCisgICAgICAgIGJzdGF0ZSA9IHMtPnN0cmF0ZWd5ID09IFpfSFVGRk1BTl9PTkxZID8gZGVmbGF0ZV9odWZmKHMsIGZsdXNoKSA6CisgICAgICAgICAgICAgICAgICAgIChzLT5zdHJhdGVneSA9PSBaX1JMRSA/IGRlZmxhdGVfcmxlKHMsIGZsdXNoKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAoKihjb25maWd1cmF0aW9uX3RhYmxlW3MtPmxldmVsXS5mdW5jKSkocywgZmx1c2gpKTsKKworICAgICAgICBpZiAoYnN0YXRlID09IGZpbmlzaF9zdGFydGVkIHx8IGJzdGF0ZSA9PSBmaW5pc2hfZG9uZSkgeworICAgICAgICAgICAgcy0+c3RhdHVzID0gRklOSVNIX1NUQVRFOworICAgICAgICB9CisgICAgICAgIGlmIChic3RhdGUgPT0gbmVlZF9tb3JlIHx8IGJzdGF0ZSA9PSBmaW5pc2hfc3RhcnRlZCkgeworICAgICAgICAgICAgaWYgKHN0cm0tPmF2YWlsX291dCA9PSAwKSB7CisgICAgICAgICAgICAgICAgcy0+bGFzdF9mbHVzaCA9IC0xOyAvKiBhdm9pZCBCVUZfRVJST1IgbmV4dCBjYWxsLCBzZWUgYWJvdmUgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBaX09LOworICAgICAgICAgICAgLyogSWYgZmx1c2ggIT0gWl9OT19GTFVTSCAmJiBhdmFpbF9vdXQgPT0gMCwgdGhlIG5leHQgY2FsbAorICAgICAgICAgICAgICogb2YgZGVmbGF0ZSBzaG91bGQgdXNlIHRoZSBzYW1lIGZsdXNoIHBhcmFtZXRlciB0byBtYWtlIHN1cmUKKyAgICAgICAgICAgICAqIHRoYXQgdGhlIGZsdXNoIGlzIGNvbXBsZXRlLiBTbyB3ZSBkb24ndCBoYXZlIHRvIG91dHB1dCBhbgorICAgICAgICAgICAgICogZW1wdHkgYmxvY2sgaGVyZSwgdGhpcyB3aWxsIGJlIGRvbmUgYXQgbmV4dCBjYWxsLiBUaGlzIGFsc28KKyAgICAgICAgICAgICAqIGVuc3VyZXMgdGhhdCBmb3IgYSB2ZXJ5IHNtYWxsIG91dHB1dCBidWZmZXIsIHdlIGVtaXQgYXQgbW9zdAorICAgICAgICAgICAgICogb25lIGVtcHR5IGJsb2NrLgorICAgICAgICAgICAgICovCisgICAgICAgIH0KKyAgICAgICAgaWYgKGJzdGF0ZSA9PSBibG9ja19kb25lKSB7CisgICAgICAgICAgICBpZiAoZmx1c2ggPT0gWl9QQVJUSUFMX0ZMVVNIKSB7CisgICAgICAgICAgICAgICAgX3RyX2FsaWduKHMpOworICAgICAgICAgICAgfSBlbHNlIGlmIChmbHVzaCAhPSBaX0JMT0NLKSB7IC8qIEZVTExfRkxVU0ggb3IgU1lOQ19GTFVTSCAqLworICAgICAgICAgICAgICAgIF90cl9zdG9yZWRfYmxvY2socywgKGNoYXIqKTAsIDBMLCAwKTsKKyAgICAgICAgICAgICAgICAvKiBGb3IgYSBmdWxsIGZsdXNoLCB0aGlzIGVtcHR5IGJsb2NrIHdpbGwgYmUgcmVjb2duaXplZAorICAgICAgICAgICAgICAgICAqIGFzIGEgc3BlY2lhbCBtYXJrZXIgYnkgaW5mbGF0ZV9zeW5jKCkuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgaWYgKGZsdXNoID09IFpfRlVMTF9GTFVTSCkgeworICAgICAgICAgICAgICAgICAgICBDTEVBUl9IQVNIKHMpOyAgICAgICAgICAgICAvKiBmb3JnZXQgaGlzdG9yeSAqLworICAgICAgICAgICAgICAgICAgICBpZiAocy0+bG9va2FoZWFkID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPnN0cnN0YXJ0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPmJsb2NrX3N0YXJ0ID0gMEw7CisgICAgICAgICAgICAgICAgICAgICAgICBzLT5pbnNlcnQgPSAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZmx1c2hfcGVuZGluZyhzdHJtKTsKKyAgICAgICAgICAgIGlmIChzdHJtLT5hdmFpbF9vdXQgPT0gMCkgeworICAgICAgICAgICAgICBzLT5sYXN0X2ZsdXNoID0gLTE7IC8qIGF2b2lkIEJVRl9FUlJPUiBhdCBuZXh0IGNhbGwsIHNlZSBhYm92ZSAqLworICAgICAgICAgICAgICByZXR1cm4gWl9PSzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBBc3NlcnQoc3RybS0+YXZhaWxfb3V0ID4gMCwgImJ1ZzIiKTsKKworICAgIGlmIChmbHVzaCAhPSBaX0ZJTklTSCkgcmV0dXJuIFpfT0s7CisgICAgaWYgKHMtPndyYXAgPD0gMCkgcmV0dXJuIFpfU1RSRUFNX0VORDsKKworICAgIC8qIFdyaXRlIHRoZSB0cmFpbGVyICovCisjaWZkZWYgR1pJUAorICAgIGlmIChzLT53cmFwID09IDIpIHsKKyAgICAgICAgcHV0X2J5dGUocywgKEJ5dGUpKHN0cm0tPmFkbGVyICYgMHhmZikpOworICAgICAgICBwdXRfYnl0ZShzLCAoQnl0ZSkoKHN0cm0tPmFkbGVyID4+IDgpICYgMHhmZikpOworICAgICAgICBwdXRfYnl0ZShzLCAoQnl0ZSkoKHN0cm0tPmFkbGVyID4+IDE2KSAmIDB4ZmYpKTsKKyAgICAgICAgcHV0X2J5dGUocywgKEJ5dGUpKChzdHJtLT5hZGxlciA+PiAyNCkgJiAweGZmKSk7CisgICAgICAgIHB1dF9ieXRlKHMsIChCeXRlKShzdHJtLT50b3RhbF9pbiAmIDB4ZmYpKTsKKyAgICAgICAgcHV0X2J5dGUocywgKEJ5dGUpKChzdHJtLT50b3RhbF9pbiA+PiA4KSAmIDB4ZmYpKTsKKyAgICAgICAgcHV0X2J5dGUocywgKEJ5dGUpKChzdHJtLT50b3RhbF9pbiA+PiAxNikgJiAweGZmKSk7CisgICAgICAgIHB1dF9ieXRlKHMsIChCeXRlKSgoc3RybS0+dG90YWxfaW4gPj4gMjQpICYgMHhmZikpOworICAgIH0KKyAgICBlbHNlCisjZW5kaWYKKyAgICB7CisgICAgICAgIHB1dFNob3J0TVNCKHMsICh1SW50KShzdHJtLT5hZGxlciA+PiAxNikpOworICAgICAgICBwdXRTaG9ydE1TQihzLCAodUludCkoc3RybS0+YWRsZXIgJiAweGZmZmYpKTsKKyAgICB9CisgICAgZmx1c2hfcGVuZGluZyhzdHJtKTsKKyAgICAvKiBJZiBhdmFpbF9vdXQgaXMgemVybywgdGhlIGFwcGxpY2F0aW9uIHdpbGwgY2FsbCBkZWZsYXRlIGFnYWluCisgICAgICogdG8gZmx1c2ggdGhlIHJlc3QuCisgICAgICovCisgICAgaWYgKHMtPndyYXAgPiAwKSBzLT53cmFwID0gLXMtPndyYXA7IC8qIHdyaXRlIHRoZSB0cmFpbGVyIG9ubHkgb25jZSEgKi8KKyAgICByZXR1cm4gcy0+cGVuZGluZyAhPSAwID8gWl9PSyA6IFpfU1RSRUFNX0VORDsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworaW50IFpFWFBPUlQgZGVmbGF0ZUVuZCAoc3RybSkKKyAgICB6X3N0cmVhbXAgc3RybTsKK3sKKyAgICBpbnQgc3RhdHVzOworCisgICAgaWYgKHN0cm0gPT0gWl9OVUxMIHx8IHN0cm0tPnN0YXRlID09IFpfTlVMTCkgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworCisgICAgc3RhdHVzID0gc3RybS0+c3RhdGUtPnN0YXR1czsKKyAgICBpZiAoc3RhdHVzICE9IElOSVRfU1RBVEUgJiYKKyAgICAgICAgc3RhdHVzICE9IEVYVFJBX1NUQVRFICYmCisgICAgICAgIHN0YXR1cyAhPSBOQU1FX1NUQVRFICYmCisgICAgICAgIHN0YXR1cyAhPSBDT01NRU5UX1NUQVRFICYmCisgICAgICAgIHN0YXR1cyAhPSBIQ1JDX1NUQVRFICYmCisgICAgICAgIHN0YXR1cyAhPSBCVVNZX1NUQVRFICYmCisgICAgICAgIHN0YXR1cyAhPSBGSU5JU0hfU1RBVEUpIHsKKyAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKyAgICB9CisKKyAgICAvKiBEZWFsbG9jYXRlIGluIHJldmVyc2Ugb3JkZXIgb2YgYWxsb2NhdGlvbnM6ICovCisgICAgVFJZX0ZSRUUoc3RybSwgc3RybS0+c3RhdGUtPnBlbmRpbmdfYnVmKTsKKyAgICBUUllfRlJFRShzdHJtLCBzdHJtLT5zdGF0ZS0+aGVhZCk7CisgICAgVFJZX0ZSRUUoc3RybSwgc3RybS0+c3RhdGUtPnByZXYpOworICAgIFRSWV9GUkVFKHN0cm0sIHN0cm0tPnN0YXRlLT53aW5kb3cpOworCisgICAgWkZSRUUoc3RybSwgc3RybS0+c3RhdGUpOworICAgIHN0cm0tPnN0YXRlID0gWl9OVUxMOworCisgICAgcmV0dXJuIHN0YXR1cyA9PSBCVVNZX1NUQVRFID8gWl9EQVRBX0VSUk9SIDogWl9PSzsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weSB0aGUgc291cmNlIHN0YXRlIHRvIHRoZSBkZXN0aW5hdGlvbiBzdGF0ZS4KKyAqIFRvIHNpbXBsaWZ5IHRoZSBzb3VyY2UsIHRoaXMgaXMgbm90IHN1cHBvcnRlZCBmb3IgMTYtYml0IE1TRE9TICh3aGljaAorICogZG9lc24ndCBoYXZlIGVub3VnaCBtZW1vcnkgYW55d2F5IHRvIGR1cGxpY2F0ZSBjb21wcmVzc2lvbiBzdGF0ZXMpLgorICovCitpbnQgWkVYUE9SVCBkZWZsYXRlQ29weSAoZGVzdCwgc291cmNlKQorICAgIHpfc3RyZWFtcCBkZXN0OworICAgIHpfc3RyZWFtcCBzb3VyY2U7Cit7CisjaWZkZWYgTUFYU0VHXzY0SworICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKyNlbHNlCisgICAgZGVmbGF0ZV9zdGF0ZSAqZHM7CisgICAgZGVmbGF0ZV9zdGF0ZSAqc3M7CisgICAgdXNoZiAqb3ZlcmxheTsKKworCisgICAgaWYgKHNvdXJjZSA9PSBaX05VTEwgfHwgZGVzdCA9PSBaX05VTEwgfHwgc291cmNlLT5zdGF0ZSA9PSBaX05VTEwpIHsKKyAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworICAgIH0KKworICAgIHNzID0gc291cmNlLT5zdGF0ZTsKKworICAgIHptZW1jcHkoKHZvaWRwZilkZXN0LCAodm9pZHBmKXNvdXJjZSwgc2l6ZW9mKHpfc3RyZWFtKSk7CisKKyAgICBkcyA9IChkZWZsYXRlX3N0YXRlICopIFpBTExPQyhkZXN0LCAxLCBzaXplb2YoZGVmbGF0ZV9zdGF0ZSkpOworICAgIGlmIChkcyA9PSBaX05VTEwpIHJldHVybiBaX01FTV9FUlJPUjsKKyAgICBkZXN0LT5zdGF0ZSA9IChzdHJ1Y3QgaW50ZXJuYWxfc3RhdGUgRkFSICopIGRzOworICAgIHptZW1jcHkoKHZvaWRwZilkcywgKHZvaWRwZilzcywgc2l6ZW9mKGRlZmxhdGVfc3RhdGUpKTsKKyAgICBkcy0+c3RybSA9IGRlc3Q7CisKKyAgICBkcy0+d2luZG93ID0gKEJ5dGVmICopIFpBTExPQyhkZXN0LCBkcy0+d19zaXplLCAyKnNpemVvZihCeXRlKSk7CisgICAgZHMtPnByZXYgICA9IChQb3NmICopICBaQUxMT0MoZGVzdCwgZHMtPndfc2l6ZSwgc2l6ZW9mKFBvcykpOworICAgIGRzLT5oZWFkICAgPSAoUG9zZiAqKSAgWkFMTE9DKGRlc3QsIGRzLT5oYXNoX3NpemUsIHNpemVvZihQb3MpKTsKKyAgICBvdmVybGF5ID0gKHVzaGYgKikgWkFMTE9DKGRlc3QsIGRzLT5saXRfYnVmc2l6ZSwgc2l6ZW9mKHVzaCkrMik7CisgICAgZHMtPnBlbmRpbmdfYnVmID0gKHVjaGYgKikgb3ZlcmxheTsKKworICAgIGlmIChkcy0+d2luZG93ID09IFpfTlVMTCB8fCBkcy0+cHJldiA9PSBaX05VTEwgfHwgZHMtPmhlYWQgPT0gWl9OVUxMIHx8CisgICAgICAgIGRzLT5wZW5kaW5nX2J1ZiA9PSBaX05VTEwpIHsKKyAgICAgICAgZGVmbGF0ZUVuZCAoZGVzdCk7CisgICAgICAgIHJldHVybiBaX01FTV9FUlJPUjsKKyAgICB9CisgICAgLyogZm9sbG93aW5nIHptZW1jcHkgZG8gbm90IHdvcmsgZm9yIDE2LWJpdCBNU0RPUyAqLworICAgIHptZW1jcHkoZHMtPndpbmRvdywgc3MtPndpbmRvdywgZHMtPndfc2l6ZSAqIDIgKiBzaXplb2YoQnl0ZSkpOworICAgIHptZW1jcHkoKHZvaWRwZilkcy0+cHJldiwgKHZvaWRwZilzcy0+cHJldiwgZHMtPndfc2l6ZSAqIHNpemVvZihQb3MpKTsKKyAgICB6bWVtY3B5KCh2b2lkcGYpZHMtPmhlYWQsICh2b2lkcGYpc3MtPmhlYWQsIGRzLT5oYXNoX3NpemUgKiBzaXplb2YoUG9zKSk7CisgICAgem1lbWNweShkcy0+cGVuZGluZ19idWYsIHNzLT5wZW5kaW5nX2J1ZiwgKHVJbnQpZHMtPnBlbmRpbmdfYnVmX3NpemUpOworCisgICAgZHMtPnBlbmRpbmdfb3V0ID0gZHMtPnBlbmRpbmdfYnVmICsgKHNzLT5wZW5kaW5nX291dCAtIHNzLT5wZW5kaW5nX2J1Zik7CisgICAgZHMtPmRfYnVmID0gb3ZlcmxheSArIGRzLT5saXRfYnVmc2l6ZS9zaXplb2YodXNoKTsKKyAgICBkcy0+bF9idWYgPSBkcy0+cGVuZGluZ19idWYgKyAoMStzaXplb2YodXNoKSkqZHMtPmxpdF9idWZzaXplOworCisgICAgZHMtPmxfZGVzYy5keW5fdHJlZSA9IGRzLT5keW5fbHRyZWU7CisgICAgZHMtPmRfZGVzYy5keW5fdHJlZSA9IGRzLT5keW5fZHRyZWU7CisgICAgZHMtPmJsX2Rlc2MuZHluX3RyZWUgPSBkcy0+YmxfdHJlZTsKKworICAgIHJldHVybiBaX09LOworI2VuZGlmIC8qIE1BWFNFR182NEsgKi8KK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBSZWFkIGEgbmV3IGJ1ZmZlciBmcm9tIHRoZSBjdXJyZW50IGlucHV0IHN0cmVhbSwgdXBkYXRlIHRoZSBhZGxlcjMyCisgKiBhbmQgdG90YWwgbnVtYmVyIG9mIGJ5dGVzIHJlYWQuICBBbGwgZGVmbGF0ZSgpIGlucHV0IGdvZXMgdGhyb3VnaAorICogdGhpcyBmdW5jdGlvbiBzbyBzb21lIGFwcGxpY2F0aW9ucyBtYXkgd2lzaCB0byBtb2RpZnkgaXQgdG8gYXZvaWQKKyAqIGFsbG9jYXRpbmcgYSBsYXJnZSBzdHJtLT5uZXh0X2luIGJ1ZmZlciBhbmQgY29weWluZyBmcm9tIGl0LgorICogKFNlZSBhbHNvIGZsdXNoX3BlbmRpbmcoKSkuCisgKi8KK2xvY2FsIGludCByZWFkX2J1ZihzdHJtLCBidWYsIHNpemUpCisgICAgel9zdHJlYW1wIHN0cm07CisgICAgQnl0ZWYgKmJ1ZjsKKyAgICB1bnNpZ25lZCBzaXplOworeworICAgIHVuc2lnbmVkIGxlbiA9IHN0cm0tPmF2YWlsX2luOworCisgICAgaWYgKGxlbiA+IHNpemUpIGxlbiA9IHNpemU7CisgICAgaWYgKGxlbiA9PSAwKSByZXR1cm4gMDsKKworICAgIHN0cm0tPmF2YWlsX2luICAtPSBsZW47CisKKyAgICB6bWVtY3B5KGJ1Ziwgc3RybS0+bmV4dF9pbiwgbGVuKTsKKyAgICBpZiAoc3RybS0+c3RhdGUtPndyYXAgPT0gMSkgeworICAgICAgICBzdHJtLT5hZGxlciA9IGFkbGVyMzIoc3RybS0+YWRsZXIsIGJ1ZiwgbGVuKTsKKyAgICB9CisjaWZkZWYgR1pJUAorICAgIGVsc2UgaWYgKHN0cm0tPnN0YXRlLT53cmFwID09IDIpIHsKKyAgICAgICAgc3RybS0+YWRsZXIgPSBjcmMzMihzdHJtLT5hZGxlciwgYnVmLCBsZW4pOworICAgIH0KKyNlbmRpZgorICAgIHN0cm0tPm5leHRfaW4gICs9IGxlbjsKKyAgICBzdHJtLT50b3RhbF9pbiArPSBsZW47CisKKyAgICByZXR1cm4gKGludClsZW47Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogSW5pdGlhbGl6ZSB0aGUgImxvbmdlc3QgbWF0Y2giIHJvdXRpbmVzIGZvciBhIG5ldyB6bGliIHN0cmVhbQorICovCitsb2NhbCB2b2lkIGxtX2luaXQgKHMpCisgICAgZGVmbGF0ZV9zdGF0ZSAqczsKK3sKKyAgICBzLT53aW5kb3dfc2l6ZSA9ICh1bGcpMkwqcy0+d19zaXplOworCisgICAgQ0xFQVJfSEFTSChzKTsKKworICAgIC8qIFNldCB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnM6CisgICAgICovCisgICAgcy0+bWF4X2xhenlfbWF0Y2ggICA9IGNvbmZpZ3VyYXRpb25fdGFibGVbcy0+bGV2ZWxdLm1heF9sYXp5OworICAgIHMtPmdvb2RfbWF0Y2ggICAgICAgPSBjb25maWd1cmF0aW9uX3RhYmxlW3MtPmxldmVsXS5nb29kX2xlbmd0aDsKKyAgICBzLT5uaWNlX21hdGNoICAgICAgID0gY29uZmlndXJhdGlvbl90YWJsZVtzLT5sZXZlbF0ubmljZV9sZW5ndGg7CisgICAgcy0+bWF4X2NoYWluX2xlbmd0aCA9IGNvbmZpZ3VyYXRpb25fdGFibGVbcy0+bGV2ZWxdLm1heF9jaGFpbjsKKworICAgIHMtPnN0cnN0YXJ0ID0gMDsKKyAgICBzLT5ibG9ja19zdGFydCA9IDBMOworICAgIHMtPmxvb2thaGVhZCA9IDA7CisgICAgcy0+aW5zZXJ0ID0gMDsKKyAgICBzLT5tYXRjaF9sZW5ndGggPSBzLT5wcmV2X2xlbmd0aCA9IE1JTl9NQVRDSC0xOworICAgIHMtPm1hdGNoX2F2YWlsYWJsZSA9IDA7CisgICAgcy0+aW5zX2ggPSAwOworI2lmbmRlZiBGQVNURVNUCisjaWZkZWYgQVNNVgorICAgIG1hdGNoX2luaXQoKTsgLyogaW5pdGlhbGl6ZSB0aGUgYXNtIGNvZGUgKi8KKyNlbmRpZgorI2VuZGlmCit9CisKKyNpZm5kZWYgRkFTVEVTVAorLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTZXQgbWF0Y2hfc3RhcnQgdG8gdGhlIGxvbmdlc3QgbWF0Y2ggc3RhcnRpbmcgYXQgdGhlIGdpdmVuIHN0cmluZyBhbmQKKyAqIHJldHVybiBpdHMgbGVuZ3RoLiBNYXRjaGVzIHNob3J0ZXIgb3IgZXF1YWwgdG8gcHJldl9sZW5ndGggYXJlIGRpc2NhcmRlZCwKKyAqIGluIHdoaWNoIGNhc2UgdGhlIHJlc3VsdCBpcyBlcXVhbCB0byBwcmV2X2xlbmd0aCBhbmQgbWF0Y2hfc3RhcnQgaXMKKyAqIGdhcmJhZ2UuCisgKiBJTiBhc3NlcnRpb25zOiBjdXJfbWF0Y2ggaXMgdGhlIGhlYWQgb2YgdGhlIGhhc2ggY2hhaW4gZm9yIHRoZSBjdXJyZW50CisgKiAgIHN0cmluZyAoc3Ryc3RhcnQpIGFuZCBpdHMgZGlzdGFuY2UgaXMgPD0gTUFYX0RJU1QsIGFuZCBwcmV2X2xlbmd0aCA+PSAxCisgKiBPVVQgYXNzZXJ0aW9uOiB0aGUgbWF0Y2ggbGVuZ3RoIGlzIG5vdCBncmVhdGVyIHRoYW4gcy0+bG9va2FoZWFkLgorICovCisjaWZuZGVmIEFTTVYKKy8qIEZvciA4MHg4NiBhbmQgNjgweDAsIGFuIG9wdGltaXplZCB2ZXJzaW9uIHdpbGwgYmUgcHJvdmlkZWQgaW4gbWF0Y2guYXNtIG9yCisgKiBtYXRjaC5TLiBUaGUgY29kZSB3aWxsIGJlIGZ1bmN0aW9uYWxseSBlcXVpdmFsZW50LgorICovCitsb2NhbCB1SW50IGxvbmdlc3RfbWF0Y2gocywgY3VyX21hdGNoKQorICAgIGRlZmxhdGVfc3RhdGUgKnM7CisgICAgSVBvcyBjdXJfbWF0Y2g7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjdXJyZW50IG1hdGNoICovCit7CisgICAgdW5zaWduZWQgY2hhaW5fbGVuZ3RoID0gcy0+bWF4X2NoYWluX2xlbmd0aDsvKiBtYXggaGFzaCBjaGFpbiBsZW5ndGggKi8KKyAgICByZWdpc3RlciBCeXRlZiAqc2NhbiA9IHMtPndpbmRvdyArIHMtPnN0cnN0YXJ0OyAvKiBjdXJyZW50IHN0cmluZyAqLworICAgIHJlZ2lzdGVyIEJ5dGVmICptYXRjaDsgICAgICAgICAgICAgICAgICAgICAgIC8qIG1hdGNoZWQgc3RyaW5nICovCisgICAgcmVnaXN0ZXIgaW50IGxlbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsZW5ndGggb2YgY3VycmVudCBtYXRjaCAqLworICAgIGludCBiZXN0X2xlbiA9IHMtPnByZXZfbGVuZ3RoOyAgICAgICAgICAgICAgLyogYmVzdCBtYXRjaCBsZW5ndGggc28gZmFyICovCisgICAgaW50IG5pY2VfbWF0Y2ggPSBzLT5uaWNlX21hdGNoOyAgICAgICAgICAgICAvKiBzdG9wIGlmIG1hdGNoIGxvbmcgZW5vdWdoICovCisgICAgSVBvcyBsaW1pdCA9IHMtPnN0cnN0YXJ0ID4gKElQb3MpTUFYX0RJU1QocykgPworICAgICAgICBzLT5zdHJzdGFydCAtIChJUG9zKU1BWF9ESVNUKHMpIDogTklMOworICAgIC8qIFN0b3Agd2hlbiBjdXJfbWF0Y2ggYmVjb21lcyA8PSBsaW1pdC4gVG8gc2ltcGxpZnkgdGhlIGNvZGUsCisgICAgICogd2UgcHJldmVudCBtYXRjaGVzIHdpdGggdGhlIHN0cmluZyBvZiB3aW5kb3cgaW5kZXggMC4KKyAgICAgKi8KKyAgICBQb3NmICpwcmV2ID0gcy0+cHJldjsKKyAgICB1SW50IHdtYXNrID0gcy0+d19tYXNrOworCisjaWZkZWYgVU5BTElHTkVEX09LCisgICAgLyogQ29tcGFyZSB0d28gYnl0ZXMgYXQgYSB0aW1lLiBOb3RlOiB0aGlzIGlzIG5vdCBhbHdheXMgYmVuZWZpY2lhbC4KKyAgICAgKiBUcnkgd2l0aCBhbmQgd2l0aG91dCAtRFVOQUxJR05FRF9PSyB0byBjaGVjay4KKyAgICAgKi8KKyAgICByZWdpc3RlciBCeXRlZiAqc3RyZW5kID0gcy0+d2luZG93ICsgcy0+c3Ryc3RhcnQgKyBNQVhfTUFUQ0ggLSAxOworICAgIHJlZ2lzdGVyIHVzaCBzY2FuX3N0YXJ0ID0gKih1c2hmKilzY2FuOworICAgIHJlZ2lzdGVyIHVzaCBzY2FuX2VuZCAgID0gKih1c2hmKikoc2NhbitiZXN0X2xlbi0xKTsKKyNlbHNlCisgICAgcmVnaXN0ZXIgQnl0ZWYgKnN0cmVuZCA9IHMtPndpbmRvdyArIHMtPnN0cnN0YXJ0ICsgTUFYX01BVENIOworICAgIHJlZ2lzdGVyIEJ5dGUgc2Nhbl9lbmQxICA9IHNjYW5bYmVzdF9sZW4tMV07CisgICAgcmVnaXN0ZXIgQnl0ZSBzY2FuX2VuZCAgID0gc2NhbltiZXN0X2xlbl07CisjZW5kaWYKKworICAgIC8qIFRoZSBjb2RlIGlzIG9wdGltaXplZCBmb3IgSEFTSF9CSVRTID49IDggYW5kIE1BWF9NQVRDSC0yIG11bHRpcGxlIG9mIDE2LgorICAgICAqIEl0IGlzIGVhc3kgdG8gZ2V0IHJpZCBvZiB0aGlzIG9wdGltaXphdGlvbiBpZiBuZWNlc3NhcnkuCisgICAgICovCisgICAgQXNzZXJ0KHMtPmhhc2hfYml0cyA+PSA4ICYmIE1BWF9NQVRDSCA9PSAyNTgsICJDb2RlIHRvbyBjbGV2ZXIiKTsKKworICAgIC8qIERvIG5vdCB3YXN0ZSB0b28gbXVjaCB0aW1lIGlmIHdlIGFscmVhZHkgaGF2ZSBhIGdvb2QgbWF0Y2g6ICovCisgICAgaWYgKHMtPnByZXZfbGVuZ3RoID49IHMtPmdvb2RfbWF0Y2gpIHsKKyAgICAgICAgY2hhaW5fbGVuZ3RoID4+PSAyOworICAgIH0KKyAgICAvKiBEbyBub3QgbG9vayBmb3IgbWF0Y2hlcyBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgaW5wdXQuIFRoaXMgaXMgbmVjZXNzYXJ5CisgICAgICogdG8gbWFrZSBkZWZsYXRlIGRldGVybWluaXN0aWMuCisgICAgICovCisgICAgaWYgKCh1SW50KW5pY2VfbWF0Y2ggPiBzLT5sb29rYWhlYWQpIG5pY2VfbWF0Y2ggPSBzLT5sb29rYWhlYWQ7CisKKyAgICBBc3NlcnQoKHVsZylzLT5zdHJzdGFydCA8PSBzLT53aW5kb3dfc2l6ZS1NSU5fTE9PS0FIRUFELCAibmVlZCBsb29rYWhlYWQiKTsKKworICAgIGRvIHsKKyAgICAgICAgQXNzZXJ0KGN1cl9tYXRjaCA8IHMtPnN0cnN0YXJ0LCAibm8gZnV0dXJlIik7CisgICAgICAgIG1hdGNoID0gcy0+d2luZG93ICsgY3VyX21hdGNoOworCisgICAgICAgIC8qIFNraXAgdG8gbmV4dCBtYXRjaCBpZiB0aGUgbWF0Y2ggbGVuZ3RoIGNhbm5vdCBpbmNyZWFzZQorICAgICAgICAgKiBvciBpZiB0aGUgbWF0Y2ggbGVuZ3RoIGlzIGxlc3MgdGhhbiAyLiAgTm90ZSB0aGF0IHRoZSBjaGVja3MgYmVsb3cKKyAgICAgICAgICogZm9yIGluc3VmZmljaWVudCBsb29rYWhlYWQgb25seSBvY2N1ciBvY2Nhc2lvbmFsbHkgZm9yIHBlcmZvcm1hbmNlCisgICAgICAgICAqIHJlYXNvbnMuICBUaGVyZWZvcmUgdW5pbml0aWFsaXplZCBtZW1vcnkgd2lsbCBiZSBhY2Nlc3NlZCwgYW5kCisgICAgICAgICAqIGNvbmRpdGlvbmFsIGp1bXBzIHdpbGwgYmUgbWFkZSB0aGF0IGRlcGVuZCBvbiB0aG9zZSB2YWx1ZXMuCisgICAgICAgICAqIEhvd2V2ZXIgdGhlIGxlbmd0aCBvZiB0aGUgbWF0Y2ggaXMgbGltaXRlZCB0byB0aGUgbG9va2FoZWFkLCBzbworICAgICAgICAgKiB0aGUgb3V0cHV0IG9mIGRlZmxhdGUgaXMgbm90IGFmZmVjdGVkIGJ5IHRoZSB1bmluaXRpYWxpemVkIHZhbHVlcy4KKyAgICAgICAgICovCisjaWYgKGRlZmluZWQoVU5BTElHTkVEX09LKSAmJiBNQVhfTUFUQ0ggPT0gMjU4KQorICAgICAgICAvKiBUaGlzIGNvZGUgYXNzdW1lcyBzaXplb2YodW5zaWduZWQgc2hvcnQpID09IDIuIERvIG5vdCB1c2UKKyAgICAgICAgICogVU5BTElHTkVEX09LIGlmIHlvdXIgY29tcGlsZXIgdXNlcyBhIGRpZmZlcmVudCBzaXplLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKCoodXNoZiopKG1hdGNoK2Jlc3RfbGVuLTEpICE9IHNjYW5fZW5kIHx8CisgICAgICAgICAgICAqKHVzaGYqKW1hdGNoICE9IHNjYW5fc3RhcnQpIGNvbnRpbnVlOworCisgICAgICAgIC8qIEl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gY29tcGFyZSBzY2FuWzJdIGFuZCBtYXRjaFsyXSBzaW5jZSB0aGV5IGFyZQorICAgICAgICAgKiBhbHdheXMgZXF1YWwgd2hlbiB0aGUgb3RoZXIgYnl0ZXMgbWF0Y2gsIGdpdmVuIHRoYXQgdGhlIGhhc2gga2V5cworICAgICAgICAgKiBhcmUgZXF1YWwgYW5kIHRoYXQgSEFTSF9CSVRTID49IDguIENvbXBhcmUgMiBieXRlcyBhdCBhIHRpbWUgYXQKKyAgICAgICAgICogc3Ryc3RhcnQrMywgKzUsIC4uLiB1cCB0byBzdHJzdGFydCsyNTcuIFdlIGNoZWNrIGZvciBpbnN1ZmZpY2llbnQKKyAgICAgICAgICogbG9va2FoZWFkIG9ubHkgZXZlcnkgNHRoIGNvbXBhcmlzb247IHRoZSAxMjh0aCBjaGVjayB3aWxsIGJlIG1hZGUKKyAgICAgICAgICogYXQgc3Ryc3RhcnQrMjU3LiBJZiBNQVhfTUFUQ0gtMiBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LCBpdCBpcworICAgICAgICAgKiBuZWNlc3NhcnkgdG8gcHV0IG1vcmUgZ3VhcmQgYnl0ZXMgYXQgdGhlIGVuZCBvZiB0aGUgd2luZG93LCBvcgorICAgICAgICAgKiB0byBjaGVjayBtb3JlIG9mdGVuIGZvciBpbnN1ZmZpY2llbnQgbG9va2FoZWFkLgorICAgICAgICAgKi8KKyAgICAgICAgQXNzZXJ0KHNjYW5bMl0gPT0gbWF0Y2hbMl0sICJzY2FuWzJdPyIpOworICAgICAgICBzY2FuKyssIG1hdGNoKys7CisgICAgICAgIGRvIHsKKyAgICAgICAgfSB3aGlsZSAoKih1c2hmKikoc2Nhbis9MikgPT0gKih1c2hmKikobWF0Y2grPTIpICYmCisgICAgICAgICAgICAgICAgICoodXNoZiopKHNjYW4rPTIpID09ICoodXNoZiopKG1hdGNoKz0yKSAmJgorICAgICAgICAgICAgICAgICAqKHVzaGYqKShzY2FuKz0yKSA9PSAqKHVzaGYqKShtYXRjaCs9MikgJiYKKyAgICAgICAgICAgICAgICAgKih1c2hmKikoc2Nhbis9MikgPT0gKih1c2hmKikobWF0Y2grPTIpICYmCisgICAgICAgICAgICAgICAgIHNjYW4gPCBzdHJlbmQpOworICAgICAgICAvKiBUaGUgZnVubnkgImRvIHt9IiBnZW5lcmF0ZXMgYmV0dGVyIGNvZGUgb24gbW9zdCBjb21waWxlcnMgKi8KKworICAgICAgICAvKiBIZXJlLCBzY2FuIDw9IHdpbmRvdytzdHJzdGFydCsyNTcgKi8KKyAgICAgICAgQXNzZXJ0KHNjYW4gPD0gcy0+d2luZG93Kyh1bnNpZ25lZCkocy0+d2luZG93X3NpemUtMSksICJ3aWxkIHNjYW4iKTsKKyAgICAgICAgaWYgKCpzY2FuID09ICptYXRjaCkgc2NhbisrOworCisgICAgICAgIGxlbiA9IChNQVhfTUFUQ0ggLSAxKSAtIChpbnQpKHN0cmVuZC1zY2FuKTsKKyAgICAgICAgc2NhbiA9IHN0cmVuZCAtIChNQVhfTUFUQ0gtMSk7CisKKyNlbHNlIC8qIFVOQUxJR05FRF9PSyAqLworCisgICAgICAgIGlmIChtYXRjaFtiZXN0X2xlbl0gICAhPSBzY2FuX2VuZCAgfHwKKyAgICAgICAgICAgIG1hdGNoW2Jlc3RfbGVuLTFdICE9IHNjYW5fZW5kMSB8fAorICAgICAgICAgICAgKm1hdGNoICAgICAgICAgICAgIT0gKnNjYW4gICAgIHx8CisgICAgICAgICAgICAqKyttYXRjaCAgICAgICAgICAhPSBzY2FuWzFdKSAgICAgIGNvbnRpbnVlOworCisgICAgICAgIC8qIFRoZSBjaGVjayBhdCBiZXN0X2xlbi0xIGNhbiBiZSByZW1vdmVkIGJlY2F1c2UgaXQgd2lsbCBiZSBtYWRlCisgICAgICAgICAqIGFnYWluIGxhdGVyLiAoVGhpcyBoZXVyaXN0aWMgaXMgbm90IGFsd2F5cyBhIHdpbi4pCisgICAgICAgICAqIEl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gY29tcGFyZSBzY2FuWzJdIGFuZCBtYXRjaFsyXSBzaW5jZSB0aGV5CisgICAgICAgICAqIGFyZSBhbHdheXMgZXF1YWwgd2hlbiB0aGUgb3RoZXIgYnl0ZXMgbWF0Y2gsIGdpdmVuIHRoYXQKKyAgICAgICAgICogdGhlIGhhc2gga2V5cyBhcmUgZXF1YWwgYW5kIHRoYXQgSEFTSF9CSVRTID49IDguCisgICAgICAgICAqLworICAgICAgICBzY2FuICs9IDIsIG1hdGNoKys7CisgICAgICAgIEFzc2VydCgqc2NhbiA9PSAqbWF0Y2gsICJtYXRjaFsyXT8iKTsKKworICAgICAgICAvKiBXZSBjaGVjayBmb3IgaW5zdWZmaWNpZW50IGxvb2thaGVhZCBvbmx5IGV2ZXJ5IDh0aCBjb21wYXJpc29uOworICAgICAgICAgKiB0aGUgMjU2dGggY2hlY2sgd2lsbCBiZSBtYWRlIGF0IHN0cnN0YXJ0KzI1OC4KKyAgICAgICAgICovCisgICAgICAgIGRvIHsKKyAgICAgICAgfSB3aGlsZSAoKisrc2NhbiA9PSAqKyttYXRjaCAmJiAqKytzY2FuID09ICorK21hdGNoICYmCisgICAgICAgICAgICAgICAgICorK3NjYW4gPT0gKisrbWF0Y2ggJiYgKisrc2NhbiA9PSAqKyttYXRjaCAmJgorICAgICAgICAgICAgICAgICAqKytzY2FuID09ICorK21hdGNoICYmICorK3NjYW4gPT0gKisrbWF0Y2ggJiYKKyAgICAgICAgICAgICAgICAgKisrc2NhbiA9PSAqKyttYXRjaCAmJiAqKytzY2FuID09ICorK21hdGNoICYmCisgICAgICAgICAgICAgICAgIHNjYW4gPCBzdHJlbmQpOworCisgICAgICAgIEFzc2VydChzY2FuIDw9IHMtPndpbmRvdysodW5zaWduZWQpKHMtPndpbmRvd19zaXplLTEpLCAid2lsZCBzY2FuIik7CisKKyAgICAgICAgbGVuID0gTUFYX01BVENIIC0gKGludCkoc3RyZW5kIC0gc2Nhbik7CisgICAgICAgIHNjYW4gPSBzdHJlbmQgLSBNQVhfTUFUQ0g7CisKKyNlbmRpZiAvKiBVTkFMSUdORURfT0sgKi8KKworICAgICAgICBpZiAobGVuID4gYmVzdF9sZW4pIHsKKyAgICAgICAgICAgIHMtPm1hdGNoX3N0YXJ0ID0gY3VyX21hdGNoOworICAgICAgICAgICAgYmVzdF9sZW4gPSBsZW47CisgICAgICAgICAgICBpZiAobGVuID49IG5pY2VfbWF0Y2gpIGJyZWFrOworI2lmZGVmIFVOQUxJR05FRF9PSworICAgICAgICAgICAgc2Nhbl9lbmQgPSAqKHVzaGYqKShzY2FuK2Jlc3RfbGVuLTEpOworI2Vsc2UKKyAgICAgICAgICAgIHNjYW5fZW5kMSAgPSBzY2FuW2Jlc3RfbGVuLTFdOworICAgICAgICAgICAgc2Nhbl9lbmQgICA9IHNjYW5bYmVzdF9sZW5dOworI2VuZGlmCisgICAgICAgIH0KKyAgICB9IHdoaWxlICgoY3VyX21hdGNoID0gcHJldltjdXJfbWF0Y2ggJiB3bWFza10pID4gbGltaXQKKyAgICAgICAgICAgICAmJiAtLWNoYWluX2xlbmd0aCAhPSAwKTsKKworICAgIGlmICgodUludCliZXN0X2xlbiA8PSBzLT5sb29rYWhlYWQpIHJldHVybiAodUludCliZXN0X2xlbjsKKyAgICByZXR1cm4gcy0+bG9va2FoZWFkOworfQorI2VuZGlmIC8qIEFTTVYgKi8KKworI2Vsc2UgLyogRkFTVEVTVCAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIE9wdGltaXplZCB2ZXJzaW9uIGZvciBGQVNURVNUIG9ubHkKKyAqLworbG9jYWwgdUludCBsb25nZXN0X21hdGNoKHMsIGN1cl9tYXRjaCkKKyAgICBkZWZsYXRlX3N0YXRlICpzOworICAgIElQb3MgY3VyX21hdGNoOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY3VycmVudCBtYXRjaCAqLworeworICAgIHJlZ2lzdGVyIEJ5dGVmICpzY2FuID0gcy0+d2luZG93ICsgcy0+c3Ryc3RhcnQ7IC8qIGN1cnJlbnQgc3RyaW5nICovCisgICAgcmVnaXN0ZXIgQnl0ZWYgKm1hdGNoOyAgICAgICAgICAgICAgICAgICAgICAgLyogbWF0Y2hlZCBzdHJpbmcgKi8KKyAgICByZWdpc3RlciBpbnQgbGVuOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxlbmd0aCBvZiBjdXJyZW50IG1hdGNoICovCisgICAgcmVnaXN0ZXIgQnl0ZWYgKnN0cmVuZCA9IHMtPndpbmRvdyArIHMtPnN0cnN0YXJ0ICsgTUFYX01BVENIOworCisgICAgLyogVGhlIGNvZGUgaXMgb3B0aW1pemVkIGZvciBIQVNIX0JJVFMgPj0gOCBhbmQgTUFYX01BVENILTIgbXVsdGlwbGUgb2YgMTYuCisgICAgICogSXQgaXMgZWFzeSB0byBnZXQgcmlkIG9mIHRoaXMgb3B0aW1pemF0aW9uIGlmIG5lY2Vzc2FyeS4KKyAgICAgKi8KKyAgICBBc3NlcnQocy0+aGFzaF9iaXRzID49IDggJiYgTUFYX01BVENIID09IDI1OCwgIkNvZGUgdG9vIGNsZXZlciIpOworCisgICAgQXNzZXJ0KCh1bGcpcy0+c3Ryc3RhcnQgPD0gcy0+d2luZG93X3NpemUtTUlOX0xPT0tBSEVBRCwgIm5lZWQgbG9va2FoZWFkIik7CisKKyAgICBBc3NlcnQoY3VyX21hdGNoIDwgcy0+c3Ryc3RhcnQsICJubyBmdXR1cmUiKTsKKworICAgIG1hdGNoID0gcy0+d2luZG93ICsgY3VyX21hdGNoOworCisgICAgLyogUmV0dXJuIGZhaWx1cmUgaWYgdGhlIG1hdGNoIGxlbmd0aCBpcyBsZXNzIHRoYW4gMjoKKyAgICAgKi8KKyAgICBpZiAobWF0Y2hbMF0gIT0gc2NhblswXSB8fCBtYXRjaFsxXSAhPSBzY2FuWzFdKSByZXR1cm4gTUlOX01BVENILTE7CisKKyAgICAvKiBUaGUgY2hlY2sgYXQgYmVzdF9sZW4tMSBjYW4gYmUgcmVtb3ZlZCBiZWNhdXNlIGl0IHdpbGwgYmUgbWFkZQorICAgICAqIGFnYWluIGxhdGVyLiAoVGhpcyBoZXVyaXN0aWMgaXMgbm90IGFsd2F5cyBhIHdpbi4pCisgICAgICogSXQgaXMgbm90IG5lY2Vzc2FyeSB0byBjb21wYXJlIHNjYW5bMl0gYW5kIG1hdGNoWzJdIHNpbmNlIHRoZXkKKyAgICAgKiBhcmUgYWx3YXlzIGVxdWFsIHdoZW4gdGhlIG90aGVyIGJ5dGVzIG1hdGNoLCBnaXZlbiB0aGF0CisgICAgICogdGhlIGhhc2gga2V5cyBhcmUgZXF1YWwgYW5kIHRoYXQgSEFTSF9CSVRTID49IDguCisgICAgICovCisgICAgc2NhbiArPSAyLCBtYXRjaCArPSAyOworICAgIEFzc2VydCgqc2NhbiA9PSAqbWF0Y2gsICJtYXRjaFsyXT8iKTsKKworICAgIC8qIFdlIGNoZWNrIGZvciBpbnN1ZmZpY2llbnQgbG9va2FoZWFkIG9ubHkgZXZlcnkgOHRoIGNvbXBhcmlzb247CisgICAgICogdGhlIDI1NnRoIGNoZWNrIHdpbGwgYmUgbWFkZSBhdCBzdHJzdGFydCsyNTguCisgICAgICovCisgICAgZG8geworICAgIH0gd2hpbGUgKCorK3NjYW4gPT0gKisrbWF0Y2ggJiYgKisrc2NhbiA9PSAqKyttYXRjaCAmJgorICAgICAgICAgICAgICorK3NjYW4gPT0gKisrbWF0Y2ggJiYgKisrc2NhbiA9PSAqKyttYXRjaCAmJgorICAgICAgICAgICAgICorK3NjYW4gPT0gKisrbWF0Y2ggJiYgKisrc2NhbiA9PSAqKyttYXRjaCAmJgorICAgICAgICAgICAgICorK3NjYW4gPT0gKisrbWF0Y2ggJiYgKisrc2NhbiA9PSAqKyttYXRjaCAmJgorICAgICAgICAgICAgIHNjYW4gPCBzdHJlbmQpOworCisgICAgQXNzZXJ0KHNjYW4gPD0gcy0+d2luZG93Kyh1bnNpZ25lZCkocy0+d2luZG93X3NpemUtMSksICJ3aWxkIHNjYW4iKTsKKworICAgIGxlbiA9IE1BWF9NQVRDSCAtIChpbnQpKHN0cmVuZCAtIHNjYW4pOworCisgICAgaWYgKGxlbiA8IE1JTl9NQVRDSCkgcmV0dXJuIE1JTl9NQVRDSCAtIDE7CisKKyAgICBzLT5tYXRjaF9zdGFydCA9IGN1cl9tYXRjaDsKKyAgICByZXR1cm4gKHVJbnQpbGVuIDw9IHMtPmxvb2thaGVhZCA/ICh1SW50KWxlbiA6IHMtPmxvb2thaGVhZDsKK30KKworI2VuZGlmIC8qIEZBU1RFU1QgKi8KKworI2lmZGVmIERFQlVHCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENoZWNrIHRoYXQgdGhlIG1hdGNoIGF0IG1hdGNoX3N0YXJ0IGlzIGluZGVlZCBhIG1hdGNoLgorICovCitsb2NhbCB2b2lkIGNoZWNrX21hdGNoKHMsIHN0YXJ0LCBtYXRjaCwgbGVuZ3RoKQorICAgIGRlZmxhdGVfc3RhdGUgKnM7CisgICAgSVBvcyBzdGFydCwgbWF0Y2g7CisgICAgaW50IGxlbmd0aDsKK3sKKyAgICAvKiBjaGVjayB0aGF0IHRoZSBtYXRjaCBpcyBpbmRlZWQgYSBtYXRjaCAqLworICAgIGlmICh6bWVtY21wKHMtPndpbmRvdyArIG1hdGNoLAorICAgICAgICAgICAgICAgIHMtPndpbmRvdyArIHN0YXJ0LCBsZW5ndGgpICE9IEVRVUFMKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiIHN0YXJ0ICV1LCBtYXRjaCAldSwgbGVuZ3RoICVkXG4iLAorICAgICAgICAgICAgICAgIHN0YXJ0LCBtYXRjaCwgbGVuZ3RoKTsKKyAgICAgICAgZG8geworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlYyVjIiwgcy0+d2luZG93W21hdGNoKytdLCBzLT53aW5kb3dbc3RhcnQrK10pOworICAgICAgICB9IHdoaWxlICgtLWxlbmd0aCAhPSAwKTsKKyAgICAgICAgel9lcnJvcigiaW52YWxpZCBtYXRjaCIpOworICAgIH0KKyAgICBpZiAoel92ZXJib3NlID4gMSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwiXFxbJWQsJWRdIiwgc3RhcnQtbWF0Y2gsIGxlbmd0aCk7CisgICAgICAgIGRvIHsgcHV0YyhzLT53aW5kb3dbc3RhcnQrK10sIHN0ZGVycik7IH0gd2hpbGUgKC0tbGVuZ3RoICE9IDApOworICAgIH0KK30KKyNlbHNlCisjICBkZWZpbmUgY2hlY2tfbWF0Y2gocywgc3RhcnQsIG1hdGNoLCBsZW5ndGgpCisjZW5kaWYgLyogREVCVUcgKi8KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGaWxsIHRoZSB3aW5kb3cgd2hlbiB0aGUgbG9va2FoZWFkIGJlY29tZXMgaW5zdWZmaWNpZW50LgorICogVXBkYXRlcyBzdHJzdGFydCBhbmQgbG9va2FoZWFkLgorICoKKyAqIElOIGFzc2VydGlvbjogbG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRAorICogT1VUIGFzc2VydGlvbnM6IHN0cnN0YXJ0IDw9IHdpbmRvd19zaXplLU1JTl9MT09LQUhFQUQKKyAqICAgIEF0IGxlYXN0IG9uZSBieXRlIGhhcyBiZWVuIHJlYWQsIG9yIGF2YWlsX2luID09IDA7IHJlYWRzIGFyZQorICogICAgcGVyZm9ybWVkIGZvciBhdCBsZWFzdCB0d28gYnl0ZXMgKHJlcXVpcmVkIGZvciB0aGUgemlwIHRyYW5zbGF0ZV9lb2wKKyAqICAgIG9wdGlvbiAtLSBub3Qgc3VwcG9ydGVkIGhlcmUpLgorICovCitsb2NhbCB2b2lkIGZpbGxfd2luZG93KHMpCisgICAgZGVmbGF0ZV9zdGF0ZSAqczsKK3sKKyAgICByZWdpc3RlciB1bnNpZ25lZCBuLCBtOworICAgIHJlZ2lzdGVyIFBvc2YgKnA7CisgICAgdW5zaWduZWQgbW9yZTsgICAgLyogQW1vdW50IG9mIGZyZWUgc3BhY2UgYXQgdGhlIGVuZCBvZiB0aGUgd2luZG93LiAqLworICAgIHVJbnQgd3NpemUgPSBzLT53X3NpemU7CisKKyAgICBBc3NlcnQocy0+bG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRCwgImFscmVhZHkgZW5vdWdoIGxvb2thaGVhZCIpOworCisgICAgZG8geworICAgICAgICBtb3JlID0gKHVuc2lnbmVkKShzLT53aW5kb3dfc2l6ZSAtKHVsZylzLT5sb29rYWhlYWQgLSh1bGcpcy0+c3Ryc3RhcnQpOworCisgICAgICAgIC8qIERlYWwgd2l0aCAhQCMkJSA2NEsgbGltaXQ6ICovCisgICAgICAgIGlmIChzaXplb2YoaW50KSA8PSAyKSB7CisgICAgICAgICAgICBpZiAobW9yZSA9PSAwICYmIHMtPnN0cnN0YXJ0ID09IDAgJiYgcy0+bG9va2FoZWFkID09IDApIHsKKyAgICAgICAgICAgICAgICBtb3JlID0gd3NpemU7CisKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobW9yZSA9PSAodW5zaWduZWQpKC0xKSkgeworICAgICAgICAgICAgICAgIC8qIFZlcnkgdW5saWtlbHksIGJ1dCBwb3NzaWJsZSBvbiAxNiBiaXQgbWFjaGluZSBpZgorICAgICAgICAgICAgICAgICAqIHN0cnN0YXJ0ID09IDAgJiYgbG9va2FoZWFkID09IDEgKGlucHV0IGRvbmUgYSBieXRlIGF0IHRpbWUpCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgbW9yZS0tOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogSWYgdGhlIHdpbmRvdyBpcyBhbG1vc3QgZnVsbCBhbmQgdGhlcmUgaXMgaW5zdWZmaWNpZW50IGxvb2thaGVhZCwKKyAgICAgICAgICogbW92ZSB0aGUgdXBwZXIgaGFsZiB0byB0aGUgbG93ZXIgb25lIHRvIG1ha2Ugcm9vbSBpbiB0aGUgdXBwZXIgaGFsZi4KKyAgICAgICAgICovCisgICAgICAgIGlmIChzLT5zdHJzdGFydCA+PSB3c2l6ZStNQVhfRElTVChzKSkgeworCisgICAgICAgICAgICB6bWVtY3B5KHMtPndpbmRvdywgcy0+d2luZG93K3dzaXplLCAodW5zaWduZWQpd3NpemUpOworICAgICAgICAgICAgcy0+bWF0Y2hfc3RhcnQgLT0gd3NpemU7CisgICAgICAgICAgICBzLT5zdHJzdGFydCAgICAtPSB3c2l6ZTsgLyogd2Ugbm93IGhhdmUgc3Ryc3RhcnQgPj0gTUFYX0RJU1QgKi8KKyAgICAgICAgICAgIHMtPmJsb2NrX3N0YXJ0IC09IChsb25nKSB3c2l6ZTsKKworICAgICAgICAgICAgLyogU2xpZGUgdGhlIGhhc2ggdGFibGUgKGNvdWxkIGJlIGF2b2lkZWQgd2l0aCAzMiBiaXQgdmFsdWVzCisgICAgICAgICAgICAgICBhdCB0aGUgZXhwZW5zZSBvZiBtZW1vcnkgdXNhZ2UpLiBXZSBzbGlkZSBldmVuIHdoZW4gbGV2ZWwgPT0gMAorICAgICAgICAgICAgICAgdG8ga2VlcCB0aGUgaGFzaCB0YWJsZSBjb25zaXN0ZW50IGlmIHdlIHN3aXRjaCBiYWNrIHRvIGxldmVsID4gMAorICAgICAgICAgICAgICAgbGF0ZXIuIChVc2luZyBsZXZlbCAwIHBlcm1hbmVudGx5IGlzIG5vdCBhbiBvcHRpbWFsIHVzYWdlIG9mCisgICAgICAgICAgICAgICB6bGliLCBzbyB3ZSBkb24ndCBjYXJlIGFib3V0IHRoaXMgcGF0aG9sb2dpY2FsIGNhc2UuKQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBuID0gcy0+aGFzaF9zaXplOworICAgICAgICAgICAgcCA9ICZzLT5oZWFkW25dOworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIG0gPSAqLS1wOworICAgICAgICAgICAgICAgICpwID0gKFBvcykobSA+PSB3c2l6ZSA/IG0td3NpemUgOiBOSUwpOworICAgICAgICAgICAgfSB3aGlsZSAoLS1uKTsKKworICAgICAgICAgICAgbiA9IHdzaXplOworI2lmbmRlZiBGQVNURVNUCisgICAgICAgICAgICBwID0gJnMtPnByZXZbbl07CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgbSA9ICotLXA7CisgICAgICAgICAgICAgICAgKnAgPSAoUG9zKShtID49IHdzaXplID8gbS13c2l6ZSA6IE5JTCk7CisgICAgICAgICAgICAgICAgLyogSWYgbiBpcyBub3Qgb24gYW55IGhhc2ggY2hhaW4sIHByZXZbbl0gaXMgZ2FyYmFnZSBidXQKKyAgICAgICAgICAgICAgICAgKiBpdHMgdmFsdWUgd2lsbCBuZXZlciBiZSB1c2VkLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgfSB3aGlsZSAoLS1uKTsKKyNlbmRpZgorICAgICAgICAgICAgbW9yZSArPSB3c2l6ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAocy0+c3RybS0+YXZhaWxfaW4gPT0gMCkgYnJlYWs7CisKKyAgICAgICAgLyogSWYgdGhlcmUgd2FzIG5vIHNsaWRpbmc6CisgICAgICAgICAqICAgIHN0cnN0YXJ0IDw9IFdTSVpFK01BWF9ESVNULTEgJiYgbG9va2FoZWFkIDw9IE1JTl9MT09LQUhFQUQgLSAxICYmCisgICAgICAgICAqICAgIG1vcmUgPT0gd2luZG93X3NpemUgLSBsb29rYWhlYWQgLSBzdHJzdGFydAorICAgICAgICAgKiA9PiBtb3JlID49IHdpbmRvd19zaXplIC0gKE1JTl9MT09LQUhFQUQtMSArIFdTSVpFICsgTUFYX0RJU1QtMSkKKyAgICAgICAgICogPT4gbW9yZSA+PSB3aW5kb3dfc2l6ZSAtIDIqV1NJWkUgKyAyCisgICAgICAgICAqIEluIHRoZSBCSUdfTUVNIG9yIE1NQVAgY2FzZSAobm90IHlldCBzdXBwb3J0ZWQpLAorICAgICAgICAgKiAgIHdpbmRvd19zaXplID09IGlucHV0X3NpemUgKyBNSU5fTE9PS0FIRUFEICAmJgorICAgICAgICAgKiAgIHN0cnN0YXJ0ICsgcy0+bG9va2FoZWFkIDw9IGlucHV0X3NpemUgPT4gbW9yZSA+PSBNSU5fTE9PS0FIRUFELgorICAgICAgICAgKiBPdGhlcndpc2UsIHdpbmRvd19zaXplID09IDIqV1NJWkUgc28gbW9yZSA+PSAyLgorICAgICAgICAgKiBJZiB0aGVyZSB3YXMgc2xpZGluZywgbW9yZSA+PSBXU0laRS4gU28gaW4gYWxsIGNhc2VzLCBtb3JlID49IDIuCisgICAgICAgICAqLworICAgICAgICBBc3NlcnQobW9yZSA+PSAyLCAibW9yZSA8IDIiKTsKKworICAgICAgICBuID0gcmVhZF9idWYocy0+c3RybSwgcy0+d2luZG93ICsgcy0+c3Ryc3RhcnQgKyBzLT5sb29rYWhlYWQsIG1vcmUpOworICAgICAgICBzLT5sb29rYWhlYWQgKz0gbjsKKworICAgICAgICAvKiBJbml0aWFsaXplIHRoZSBoYXNoIHZhbHVlIG5vdyB0aGF0IHdlIGhhdmUgc29tZSBpbnB1dDogKi8KKyAgICAgICAgaWYgKHMtPmxvb2thaGVhZCArIHMtPmluc2VydCA+PSBNSU5fTUFUQ0gpIHsKKyAgICAgICAgICAgIHVJbnQgc3RyID0gcy0+c3Ryc3RhcnQgLSBzLT5pbnNlcnQ7CisgICAgICAgICAgICBzLT5pbnNfaCA9IHMtPndpbmRvd1tzdHJdOworICAgICAgICAgICAgVVBEQVRFX0hBU0gocywgcy0+aW5zX2gsIHMtPndpbmRvd1tzdHIgKyAxXSk7CisjaWYgTUlOX01BVENIICE9IDMKKyAgICAgICAgICAgIENhbGwgVVBEQVRFX0hBU0goKSBNSU5fTUFUQ0gtMyBtb3JlIHRpbWVzCisjZW5kaWYKKyAgICAgICAgICAgIHdoaWxlIChzLT5pbnNlcnQpIHsKKyAgICAgICAgICAgICAgICBVUERBVEVfSEFTSChzLCBzLT5pbnNfaCwgcy0+d2luZG93W3N0ciArIE1JTl9NQVRDSC0xXSk7CisjaWZuZGVmIEZBU1RFU1QKKyAgICAgICAgICAgICAgICBzLT5wcmV2W3N0ciAmIHMtPndfbWFza10gPSBzLT5oZWFkW3MtPmluc19oXTsKKyNlbmRpZgorICAgICAgICAgICAgICAgIHMtPmhlYWRbcy0+aW5zX2hdID0gKFBvcylzdHI7CisgICAgICAgICAgICAgICAgc3RyKys7CisgICAgICAgICAgICAgICAgcy0+aW5zZXJ0LS07CisgICAgICAgICAgICAgICAgaWYgKHMtPmxvb2thaGVhZCArIHMtPmluc2VydCA8IE1JTl9NQVRDSCkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLyogSWYgdGhlIHdob2xlIGlucHV0IGhhcyBsZXNzIHRoYW4gTUlOX01BVENIIGJ5dGVzLCBpbnNfaCBpcyBnYXJiYWdlLAorICAgICAgICAgKiBidXQgdGhpcyBpcyBub3QgaW1wb3J0YW50IHNpbmNlIG9ubHkgbGl0ZXJhbCBieXRlcyB3aWxsIGJlIGVtaXR0ZWQuCisgICAgICAgICAqLworCisgICAgfSB3aGlsZSAocy0+bG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRCAmJiBzLT5zdHJtLT5hdmFpbF9pbiAhPSAwKTsKKworICAgIC8qIElmIHRoZSBXSU5fSU5JVCBieXRlcyBhZnRlciB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IGRhdGEgaGF2ZSBuZXZlciBiZWVuCisgICAgICogd3JpdHRlbiwgdGhlbiB6ZXJvIHRob3NlIGJ5dGVzIGluIG9yZGVyIHRvIGF2b2lkIG1lbW9yeSBjaGVjayByZXBvcnRzIG9mCisgICAgICogdGhlIHVzZSBvZiB1bmluaXRpYWxpemVkIChvciB1bmluaXRpYWxpc2VkIGFzIEp1bGlhbiB3cml0ZXMpIGJ5dGVzIGJ5CisgICAgICogdGhlIGxvbmdlc3QgbWF0Y2ggcm91dGluZXMuICBVcGRhdGUgdGhlIGhpZ2ggd2F0ZXIgbWFyayBmb3IgdGhlIG5leHQKKyAgICAgKiB0aW1lIHRocm91Z2ggaGVyZS4gIFdJTl9JTklUIGlzIHNldCB0byBNQVhfTUFUQ0ggc2luY2UgdGhlIGxvbmdlc3QgbWF0Y2gKKyAgICAgKiByb3V0aW5lcyBhbGxvdyBzY2FubmluZyB0byBzdHJzdGFydCArIE1BWF9NQVRDSCwgaWdub3JpbmcgbG9va2FoZWFkLgorICAgICAqLworICAgIGlmIChzLT5oaWdoX3dhdGVyIDwgcy0+d2luZG93X3NpemUpIHsKKyAgICAgICAgdWxnIGN1cnIgPSBzLT5zdHJzdGFydCArICh1bGcpKHMtPmxvb2thaGVhZCk7CisgICAgICAgIHVsZyBpbml0OworCisgICAgICAgIGlmIChzLT5oaWdoX3dhdGVyIDwgY3VycikgeworICAgICAgICAgICAgLyogUHJldmlvdXMgaGlnaCB3YXRlciBtYXJrIGJlbG93IGN1cnJlbnQgZGF0YSAtLSB6ZXJvIFdJTl9JTklUCisgICAgICAgICAgICAgKiBieXRlcyBvciB1cCB0byBlbmQgb2Ygd2luZG93LCB3aGljaGV2ZXIgaXMgbGVzcy4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaW5pdCA9IHMtPndpbmRvd19zaXplIC0gY3VycjsKKyAgICAgICAgICAgIGlmIChpbml0ID4gV0lOX0lOSVQpCisgICAgICAgICAgICAgICAgaW5pdCA9IFdJTl9JTklUOworICAgICAgICAgICAgem1lbXplcm8ocy0+d2luZG93ICsgY3VyciwgKHVuc2lnbmVkKWluaXQpOworICAgICAgICAgICAgcy0+aGlnaF93YXRlciA9IGN1cnIgKyBpbml0OworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHMtPmhpZ2hfd2F0ZXIgPCAodWxnKWN1cnIgKyBXSU5fSU5JVCkgeworICAgICAgICAgICAgLyogSGlnaCB3YXRlciBtYXJrIGF0IG9yIGFib3ZlIGN1cnJlbnQgZGF0YSwgYnV0IGJlbG93IGN1cnJlbnQgZGF0YQorICAgICAgICAgICAgICogcGx1cyBXSU5fSU5JVCAtLSB6ZXJvIG91dCB0byBjdXJyZW50IGRhdGEgcGx1cyBXSU5fSU5JVCwgb3IgdXAKKyAgICAgICAgICAgICAqIHRvIGVuZCBvZiB3aW5kb3csIHdoaWNoZXZlciBpcyBsZXNzLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpbml0ID0gKHVsZyljdXJyICsgV0lOX0lOSVQgLSBzLT5oaWdoX3dhdGVyOworICAgICAgICAgICAgaWYgKGluaXQgPiBzLT53aW5kb3dfc2l6ZSAtIHMtPmhpZ2hfd2F0ZXIpCisgICAgICAgICAgICAgICAgaW5pdCA9IHMtPndpbmRvd19zaXplIC0gcy0+aGlnaF93YXRlcjsKKyAgICAgICAgICAgIHptZW16ZXJvKHMtPndpbmRvdyArIHMtPmhpZ2hfd2F0ZXIsICh1bnNpZ25lZClpbml0KTsKKyAgICAgICAgICAgIHMtPmhpZ2hfd2F0ZXIgKz0gaW5pdDsKKyAgICAgICAgfQorICAgIH0KKworICAgIEFzc2VydCgodWxnKXMtPnN0cnN0YXJ0IDw9IHMtPndpbmRvd19zaXplIC0gTUlOX0xPT0tBSEVBRCwKKyAgICAgICAgICAgIm5vdCBlbm91Z2ggcm9vbSBmb3Igc2VhcmNoIik7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRmx1c2ggdGhlIGN1cnJlbnQgYmxvY2ssIHdpdGggZ2l2ZW4gZW5kLW9mLWZpbGUgZmxhZy4KKyAqIElOIGFzc2VydGlvbjogc3Ryc3RhcnQgaXMgc2V0IHRvIHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgbWF0Y2guCisgKi8KKyNkZWZpbmUgRkxVU0hfQkxPQ0tfT05MWShzLCBsYXN0KSB7IFwKKyAgIF90cl9mbHVzaF9ibG9jayhzLCAocy0+YmxvY2tfc3RhcnQgPj0gMEwgPyBcCisgICAgICAgICAgICAgICAgICAgKGNoYXJmICopJnMtPndpbmRvd1sodW5zaWduZWQpcy0+YmxvY2tfc3RhcnRdIDogXAorICAgICAgICAgICAgICAgICAgIChjaGFyZiAqKVpfTlVMTCksIFwKKyAgICAgICAgICAgICAgICAodWxnKSgobG9uZylzLT5zdHJzdGFydCAtIHMtPmJsb2NrX3N0YXJ0KSwgXAorICAgICAgICAgICAgICAgIChsYXN0KSk7IFwKKyAgIHMtPmJsb2NrX3N0YXJ0ID0gcy0+c3Ryc3RhcnQ7IFwKKyAgIGZsdXNoX3BlbmRpbmcocy0+c3RybSk7IFwKKyAgIFRyYWNldigoc3RkZXJyLCJbRkxVU0hdIikpOyBcCit9CisKKy8qIFNhbWUgYnV0IGZvcmNlIHByZW1hdHVyZSBleGl0IGlmIG5lY2Vzc2FyeS4gKi8KKyNkZWZpbmUgRkxVU0hfQkxPQ0socywgbGFzdCkgeyBcCisgICBGTFVTSF9CTE9DS19PTkxZKHMsIGxhc3QpOyBcCisgICBpZiAocy0+c3RybS0+YXZhaWxfb3V0ID09IDApIHJldHVybiAobGFzdCkgPyBmaW5pc2hfc3RhcnRlZCA6IG5lZWRfbW9yZTsgXAorfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHkgd2l0aG91dCBjb21wcmVzc2lvbiBhcyBtdWNoIGFzIHBvc3NpYmxlIGZyb20gdGhlIGlucHV0IHN0cmVhbSwgcmV0dXJuCisgKiB0aGUgY3VycmVudCBibG9jayBzdGF0ZS4KKyAqIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgaW5zZXJ0IG5ldyBzdHJpbmdzIGluIHRoZSBkaWN0aW9uYXJ5IHNpbmNlCisgKiB1bmNvbXByZXNzaWJsZSBkYXRhIGlzIHByb2JhYmx5IG5vdCB1c2VmdWwuIFRoaXMgZnVuY3Rpb24gaXMgdXNlZAorICogb25seSBmb3IgdGhlIGxldmVsPTAgY29tcHJlc3Npb24gb3B0aW9uLgorICogTk9URTogdGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgb3B0aW1pemVkIHRvIGF2b2lkIGV4dHJhIGNvcHlpbmcgZnJvbQorICogd2luZG93IHRvIHBlbmRpbmdfYnVmLgorICovCitsb2NhbCBibG9ja19zdGF0ZSBkZWZsYXRlX3N0b3JlZChzLCBmbHVzaCkKKyAgICBkZWZsYXRlX3N0YXRlICpzOworICAgIGludCBmbHVzaDsKK3sKKyAgICAvKiBTdG9yZWQgYmxvY2tzIGFyZSBsaW1pdGVkIHRvIDB4ZmZmZiBieXRlcywgcGVuZGluZ19idWYgaXMgbGltaXRlZAorICAgICAqIHRvIHBlbmRpbmdfYnVmX3NpemUsIGFuZCBlYWNoIHN0b3JlZCBibG9jayBoYXMgYSA1IGJ5dGUgaGVhZGVyOgorICAgICAqLworICAgIHVsZyBtYXhfYmxvY2tfc2l6ZSA9IDB4ZmZmZjsKKyAgICB1bGcgbWF4X3N0YXJ0OworCisgICAgaWYgKG1heF9ibG9ja19zaXplID4gcy0+cGVuZGluZ19idWZfc2l6ZSAtIDUpIHsKKyAgICAgICAgbWF4X2Jsb2NrX3NpemUgPSBzLT5wZW5kaW5nX2J1Zl9zaXplIC0gNTsKKyAgICB9CisKKyAgICAvKiBDb3B5IGFzIG11Y2ggYXMgcG9zc2libGUgZnJvbSBpbnB1dCB0byBvdXRwdXQ6ICovCisgICAgZm9yICg7OykgeworICAgICAgICAvKiBGaWxsIHRoZSB3aW5kb3cgYXMgbXVjaCBhcyBwb3NzaWJsZTogKi8KKyAgICAgICAgaWYgKHMtPmxvb2thaGVhZCA8PSAxKSB7CisKKyAgICAgICAgICAgIEFzc2VydChzLT5zdHJzdGFydCA8IHMtPndfc2l6ZStNQVhfRElTVChzKSB8fAorICAgICAgICAgICAgICAgICAgIHMtPmJsb2NrX3N0YXJ0ID49IChsb25nKXMtPndfc2l6ZSwgInNsaWRlIHRvbyBsYXRlIik7CisKKyAgICAgICAgICAgIGZpbGxfd2luZG93KHMpOworICAgICAgICAgICAgaWYgKHMtPmxvb2thaGVhZCA9PSAwICYmIGZsdXNoID09IFpfTk9fRkxVU0gpIHJldHVybiBuZWVkX21vcmU7CisKKyAgICAgICAgICAgIGlmIChzLT5sb29rYWhlYWQgPT0gMCkgYnJlYWs7IC8qIGZsdXNoIHRoZSBjdXJyZW50IGJsb2NrICovCisgICAgICAgIH0KKyAgICAgICAgQXNzZXJ0KHMtPmJsb2NrX3N0YXJ0ID49IDBMLCAiYmxvY2sgZ29uZSIpOworCisgICAgICAgIHMtPnN0cnN0YXJ0ICs9IHMtPmxvb2thaGVhZDsKKyAgICAgICAgcy0+bG9va2FoZWFkID0gMDsKKworICAgICAgICAvKiBFbWl0IGEgc3RvcmVkIGJsb2NrIGlmIHBlbmRpbmdfYnVmIHdpbGwgYmUgZnVsbDogKi8KKyAgICAgICAgbWF4X3N0YXJ0ID0gcy0+YmxvY2tfc3RhcnQgKyBtYXhfYmxvY2tfc2l6ZTsKKyAgICAgICAgaWYgKHMtPnN0cnN0YXJ0ID09IDAgfHwgKHVsZylzLT5zdHJzdGFydCA+PSBtYXhfc3RhcnQpIHsKKyAgICAgICAgICAgIC8qIHN0cnN0YXJ0ID09IDAgaXMgcG9zc2libGUgd2hlbiB3cmFwYXJvdW5kIG9uIDE2LWJpdCBtYWNoaW5lICovCisgICAgICAgICAgICBzLT5sb29rYWhlYWQgPSAodUludCkocy0+c3Ryc3RhcnQgLSBtYXhfc3RhcnQpOworICAgICAgICAgICAgcy0+c3Ryc3RhcnQgPSAodUludCltYXhfc3RhcnQ7CisgICAgICAgICAgICBGTFVTSF9CTE9DSyhzLCAwKTsKKyAgICAgICAgfQorICAgICAgICAvKiBGbHVzaCBpZiB3ZSBtYXkgaGF2ZSB0byBzbGlkZSwgb3RoZXJ3aXNlIGJsb2NrX3N0YXJ0IG1heSBiZWNvbWUKKyAgICAgICAgICogbmVnYXRpdmUgYW5kIHRoZSBkYXRhIHdpbGwgYmUgZ29uZToKKyAgICAgICAgICovCisgICAgICAgIGlmIChzLT5zdHJzdGFydCAtICh1SW50KXMtPmJsb2NrX3N0YXJ0ID49IE1BWF9ESVNUKHMpKSB7CisgICAgICAgICAgICBGTFVTSF9CTE9DSyhzLCAwKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBzLT5pbnNlcnQgPSAwOworICAgIGlmIChmbHVzaCA9PSBaX0ZJTklTSCkgeworICAgICAgICBGTFVTSF9CTE9DSyhzLCAxKTsKKyAgICAgICAgcmV0dXJuIGZpbmlzaF9kb25lOworICAgIH0KKyAgICBpZiAoKGxvbmcpcy0+c3Ryc3RhcnQgPiBzLT5ibG9ja19zdGFydCkKKyAgICAgICAgRkxVU0hfQkxPQ0socywgMCk7CisgICAgcmV0dXJuIGJsb2NrX2RvbmU7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29tcHJlc3MgYXMgbXVjaCBhcyBwb3NzaWJsZSBmcm9tIHRoZSBpbnB1dCBzdHJlYW0sIHJldHVybiB0aGUgY3VycmVudAorICogYmxvY2sgc3RhdGUuCisgKiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IHBlcmZvcm0gbGF6eSBldmFsdWF0aW9uIG9mIG1hdGNoZXMgYW5kIGluc2VydHMKKyAqIG5ldyBzdHJpbmdzIGluIHRoZSBkaWN0aW9uYXJ5IG9ubHkgZm9yIHVubWF0Y2hlZCBzdHJpbmdzIG9yIGZvciBzaG9ydAorICogbWF0Y2hlcy4gSXQgaXMgdXNlZCBvbmx5IGZvciB0aGUgZmFzdCBjb21wcmVzc2lvbiBvcHRpb25zLgorICovCitsb2NhbCBibG9ja19zdGF0ZSBkZWZsYXRlX2Zhc3QocywgZmx1c2gpCisgICAgZGVmbGF0ZV9zdGF0ZSAqczsKKyAgICBpbnQgZmx1c2g7Cit7CisgICAgSVBvcyBoYXNoX2hlYWQ7ICAgICAgIC8qIGhlYWQgb2YgdGhlIGhhc2ggY2hhaW4gKi8KKyAgICBpbnQgYmZsdXNoOyAgICAgICAgICAgLyogc2V0IGlmIGN1cnJlbnQgYmxvY2sgbXVzdCBiZSBmbHVzaGVkICovCisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIC8qIE1ha2Ugc3VyZSB0aGF0IHdlIGFsd2F5cyBoYXZlIGVub3VnaCBsb29rYWhlYWQsIGV4Y2VwdAorICAgICAgICAgKiBhdCB0aGUgZW5kIG9mIHRoZSBpbnB1dCBmaWxlLiBXZSBuZWVkIE1BWF9NQVRDSCBieXRlcworICAgICAgICAgKiBmb3IgdGhlIG5leHQgbWF0Y2gsIHBsdXMgTUlOX01BVENIIGJ5dGVzIHRvIGluc2VydCB0aGUKKyAgICAgICAgICogc3RyaW5nIGZvbGxvd2luZyB0aGUgbmV4dCBtYXRjaC4KKyAgICAgICAgICovCisgICAgICAgIGlmIChzLT5sb29rYWhlYWQgPCBNSU5fTE9PS0FIRUFEKSB7CisgICAgICAgICAgICBmaWxsX3dpbmRvdyhzKTsKKyAgICAgICAgICAgIGlmIChzLT5sb29rYWhlYWQgPCBNSU5fTE9PS0FIRUFEICYmIGZsdXNoID09IFpfTk9fRkxVU0gpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmVlZF9tb3JlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHMtPmxvb2thaGVhZCA9PSAwKSBicmVhazsgLyogZmx1c2ggdGhlIGN1cnJlbnQgYmxvY2sgKi8KKyAgICAgICAgfQorCisgICAgICAgIC8qIEluc2VydCB0aGUgc3RyaW5nIHdpbmRvd1tzdHJzdGFydCAuLiBzdHJzdGFydCsyXSBpbiB0aGUKKyAgICAgICAgICogZGljdGlvbmFyeSwgYW5kIHNldCBoYXNoX2hlYWQgdG8gdGhlIGhlYWQgb2YgdGhlIGhhc2ggY2hhaW46CisgICAgICAgICAqLworICAgICAgICBoYXNoX2hlYWQgPSBOSUw7CisgICAgICAgIGlmIChzLT5sb29rYWhlYWQgPj0gTUlOX01BVENIKSB7CisgICAgICAgICAgICBJTlNFUlRfU1RSSU5HKHMsIHMtPnN0cnN0YXJ0LCBoYXNoX2hlYWQpOworICAgICAgICB9CisKKyAgICAgICAgLyogRmluZCB0aGUgbG9uZ2VzdCBtYXRjaCwgZGlzY2FyZGluZyB0aG9zZSA8PSBwcmV2X2xlbmd0aC4KKyAgICAgICAgICogQXQgdGhpcyBwb2ludCB3ZSBoYXZlIGFsd2F5cyBtYXRjaF9sZW5ndGggPCBNSU5fTUFUQ0gKKyAgICAgICAgICovCisgICAgICAgIGlmIChoYXNoX2hlYWQgIT0gTklMICYmIHMtPnN0cnN0YXJ0IC0gaGFzaF9oZWFkIDw9IE1BWF9ESVNUKHMpKSB7CisgICAgICAgICAgICAvKiBUbyBzaW1wbGlmeSB0aGUgY29kZSwgd2UgcHJldmVudCBtYXRjaGVzIHdpdGggdGhlIHN0cmluZworICAgICAgICAgICAgICogb2Ygd2luZG93IGluZGV4IDAgKGluIHBhcnRpY3VsYXIgd2UgaGF2ZSB0byBhdm9pZCBhIG1hdGNoCisgICAgICAgICAgICAgKiBvZiB0aGUgc3RyaW5nIHdpdGggaXRzZWxmIGF0IHRoZSBzdGFydCBvZiB0aGUgaW5wdXQgZmlsZSkuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHMtPm1hdGNoX2xlbmd0aCA9IGxvbmdlc3RfbWF0Y2ggKHMsIGhhc2hfaGVhZCk7CisgICAgICAgICAgICAvKiBsb25nZXN0X21hdGNoKCkgc2V0cyBtYXRjaF9zdGFydCAqLworICAgICAgICB9CisgICAgICAgIGlmIChzLT5tYXRjaF9sZW5ndGggPj0gTUlOX01BVENIKSB7CisgICAgICAgICAgICBjaGVja19tYXRjaChzLCBzLT5zdHJzdGFydCwgcy0+bWF0Y2hfc3RhcnQsIHMtPm1hdGNoX2xlbmd0aCk7CisKKyAgICAgICAgICAgIF90cl90YWxseV9kaXN0KHMsIHMtPnN0cnN0YXJ0IC0gcy0+bWF0Y2hfc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5tYXRjaF9sZW5ndGggLSBNSU5fTUFUQ0gsIGJmbHVzaCk7CisKKyAgICAgICAgICAgIHMtPmxvb2thaGVhZCAtPSBzLT5tYXRjaF9sZW5ndGg7CisKKyAgICAgICAgICAgIC8qIEluc2VydCBuZXcgc3RyaW5ncyBpbiB0aGUgaGFzaCB0YWJsZSBvbmx5IGlmIHRoZSBtYXRjaCBsZW5ndGgKKyAgICAgICAgICAgICAqIGlzIG5vdCB0b28gbGFyZ2UuIFRoaXMgc2F2ZXMgdGltZSBidXQgZGVncmFkZXMgY29tcHJlc3Npb24uCisgICAgICAgICAgICAgKi8KKyNpZm5kZWYgRkFTVEVTVAorICAgICAgICAgICAgaWYgKHMtPm1hdGNoX2xlbmd0aCA8PSBzLT5tYXhfaW5zZXJ0X2xlbmd0aCAmJgorICAgICAgICAgICAgICAgIHMtPmxvb2thaGVhZCA+PSBNSU5fTUFUQ0gpIHsKKyAgICAgICAgICAgICAgICBzLT5tYXRjaF9sZW5ndGgtLTsgLyogc3RyaW5nIGF0IHN0cnN0YXJ0IGFscmVhZHkgaW4gdGFibGUgKi8KKyAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgIHMtPnN0cnN0YXJ0Kys7CisgICAgICAgICAgICAgICAgICAgIElOU0VSVF9TVFJJTkcocywgcy0+c3Ryc3RhcnQsIGhhc2hfaGVhZCk7CisgICAgICAgICAgICAgICAgICAgIC8qIHN0cnN0YXJ0IG5ldmVyIGV4Y2VlZHMgV1NJWkUtTUFYX01BVENILCBzbyB0aGVyZSBhcmUKKyAgICAgICAgICAgICAgICAgICAgICogYWx3YXlzIE1JTl9NQVRDSCBieXRlcyBhaGVhZC4KKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1zLT5tYXRjaF9sZW5ndGggIT0gMCk7CisgICAgICAgICAgICAgICAgcy0+c3Ryc3RhcnQrKzsKKyAgICAgICAgICAgIH0gZWxzZQorI2VuZGlmCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcy0+c3Ryc3RhcnQgKz0gcy0+bWF0Y2hfbGVuZ3RoOworICAgICAgICAgICAgICAgIHMtPm1hdGNoX2xlbmd0aCA9IDA7CisgICAgICAgICAgICAgICAgcy0+aW5zX2ggPSBzLT53aW5kb3dbcy0+c3Ryc3RhcnRdOworICAgICAgICAgICAgICAgIFVQREFURV9IQVNIKHMsIHMtPmluc19oLCBzLT53aW5kb3dbcy0+c3Ryc3RhcnQrMV0pOworI2lmIE1JTl9NQVRDSCAhPSAzCisgICAgICAgICAgICAgICAgQ2FsbCBVUERBVEVfSEFTSCgpIE1JTl9NQVRDSC0zIG1vcmUgdGltZXMKKyNlbmRpZgorICAgICAgICAgICAgICAgIC8qIElmIGxvb2thaGVhZCA8IE1JTl9NQVRDSCwgaW5zX2ggaXMgZ2FyYmFnZSwgYnV0IGl0IGRvZXMgbm90CisgICAgICAgICAgICAgICAgICogbWF0dGVyIHNpbmNlIGl0IHdpbGwgYmUgcmVjb21wdXRlZCBhdCBuZXh0IGRlZmxhdGUgY2FsbC4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIE5vIG1hdGNoLCBvdXRwdXQgYSBsaXRlcmFsIGJ5dGUgKi8KKyAgICAgICAgICAgIFRyYWNldnYoKHN0ZGVyciwiJWMiLCBzLT53aW5kb3dbcy0+c3Ryc3RhcnRdKSk7CisgICAgICAgICAgICBfdHJfdGFsbHlfbGl0IChzLCBzLT53aW5kb3dbcy0+c3Ryc3RhcnRdLCBiZmx1c2gpOworICAgICAgICAgICAgcy0+bG9va2FoZWFkLS07CisgICAgICAgICAgICBzLT5zdHJzdGFydCsrOworICAgICAgICB9CisgICAgICAgIGlmIChiZmx1c2gpIEZMVVNIX0JMT0NLKHMsIDApOworICAgIH0KKyAgICBzLT5pbnNlcnQgPSBzLT5zdHJzdGFydCA8IE1JTl9NQVRDSC0xID8gcy0+c3Ryc3RhcnQgOiBNSU5fTUFUQ0gtMTsKKyAgICBpZiAoZmx1c2ggPT0gWl9GSU5JU0gpIHsKKyAgICAgICAgRkxVU0hfQkxPQ0socywgMSk7CisgICAgICAgIHJldHVybiBmaW5pc2hfZG9uZTsKKyAgICB9CisgICAgaWYgKHMtPmxhc3RfbGl0KQorICAgICAgICBGTFVTSF9CTE9DSyhzLCAwKTsKKyAgICByZXR1cm4gYmxvY2tfZG9uZTsKK30KKworI2lmbmRlZiBGQVNURVNUCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNhbWUgYXMgYWJvdmUsIGJ1dCBhY2hpZXZlcyBiZXR0ZXIgY29tcHJlc3Npb24uIFdlIHVzZSBhIGxhenkKKyAqIGV2YWx1YXRpb24gZm9yIG1hdGNoZXM6IGEgbWF0Y2ggaXMgZmluYWxseSBhZG9wdGVkIG9ubHkgaWYgdGhlcmUgaXMKKyAqIG5vIGJldHRlciBtYXRjaCBhdCB0aGUgbmV4dCB3aW5kb3cgcG9zaXRpb24uCisgKi8KK2xvY2FsIGJsb2NrX3N0YXRlIGRlZmxhdGVfc2xvdyhzLCBmbHVzaCkKKyAgICBkZWZsYXRlX3N0YXRlICpzOworICAgIGludCBmbHVzaDsKK3sKKyAgICBJUG9zIGhhc2hfaGVhZDsgICAgICAgICAgLyogaGVhZCBvZiBoYXNoIGNoYWluICovCisgICAgaW50IGJmbHVzaDsgICAgICAgICAgICAgIC8qIHNldCBpZiBjdXJyZW50IGJsb2NrIG11c3QgYmUgZmx1c2hlZCAqLworCisgICAgLyogUHJvY2VzcyB0aGUgaW5wdXQgYmxvY2suICovCisgICAgZm9yICg7OykgeworICAgICAgICAvKiBNYWtlIHN1cmUgdGhhdCB3ZSBhbHdheXMgaGF2ZSBlbm91Z2ggbG9va2FoZWFkLCBleGNlcHQKKyAgICAgICAgICogYXQgdGhlIGVuZCBvZiB0aGUgaW5wdXQgZmlsZS4gV2UgbmVlZCBNQVhfTUFUQ0ggYnl0ZXMKKyAgICAgICAgICogZm9yIHRoZSBuZXh0IG1hdGNoLCBwbHVzIE1JTl9NQVRDSCBieXRlcyB0byBpbnNlcnQgdGhlCisgICAgICAgICAqIHN0cmluZyBmb2xsb3dpbmcgdGhlIG5leHQgbWF0Y2guCisgICAgICAgICAqLworICAgICAgICBpZiAocy0+bG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRCkgeworICAgICAgICAgICAgZmlsbF93aW5kb3cocyk7CisgICAgICAgICAgICBpZiAocy0+bG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRCAmJiBmbHVzaCA9PSBaX05PX0ZMVVNIKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5lZWRfbW9yZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzLT5sb29rYWhlYWQgPT0gMCkgYnJlYWs7IC8qIGZsdXNoIHRoZSBjdXJyZW50IGJsb2NrICovCisgICAgICAgIH0KKworICAgICAgICAvKiBJbnNlcnQgdGhlIHN0cmluZyB3aW5kb3dbc3Ryc3RhcnQgLi4gc3Ryc3RhcnQrMl0gaW4gdGhlCisgICAgICAgICAqIGRpY3Rpb25hcnksIGFuZCBzZXQgaGFzaF9oZWFkIHRvIHRoZSBoZWFkIG9mIHRoZSBoYXNoIGNoYWluOgorICAgICAgICAgKi8KKyAgICAgICAgaGFzaF9oZWFkID0gTklMOworICAgICAgICBpZiAocy0+bG9va2FoZWFkID49IE1JTl9NQVRDSCkgeworICAgICAgICAgICAgSU5TRVJUX1NUUklORyhzLCBzLT5zdHJzdGFydCwgaGFzaF9oZWFkKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIEZpbmQgdGhlIGxvbmdlc3QgbWF0Y2gsIGRpc2NhcmRpbmcgdGhvc2UgPD0gcHJldl9sZW5ndGguCisgICAgICAgICAqLworICAgICAgICBzLT5wcmV2X2xlbmd0aCA9IHMtPm1hdGNoX2xlbmd0aCwgcy0+cHJldl9tYXRjaCA9IHMtPm1hdGNoX3N0YXJ0OworICAgICAgICBzLT5tYXRjaF9sZW5ndGggPSBNSU5fTUFUQ0gtMTsKKworICAgICAgICBpZiAoaGFzaF9oZWFkICE9IE5JTCAmJiBzLT5wcmV2X2xlbmd0aCA8IHMtPm1heF9sYXp5X21hdGNoICYmCisgICAgICAgICAgICBzLT5zdHJzdGFydCAtIGhhc2hfaGVhZCA8PSBNQVhfRElTVChzKSkgeworICAgICAgICAgICAgLyogVG8gc2ltcGxpZnkgdGhlIGNvZGUsIHdlIHByZXZlbnQgbWF0Y2hlcyB3aXRoIHRoZSBzdHJpbmcKKyAgICAgICAgICAgICAqIG9mIHdpbmRvdyBpbmRleCAwIChpbiBwYXJ0aWN1bGFyIHdlIGhhdmUgdG8gYXZvaWQgYSBtYXRjaAorICAgICAgICAgICAgICogb2YgdGhlIHN0cmluZyB3aXRoIGl0c2VsZiBhdCB0aGUgc3RhcnQgb2YgdGhlIGlucHV0IGZpbGUpLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBzLT5tYXRjaF9sZW5ndGggPSBsb25nZXN0X21hdGNoIChzLCBoYXNoX2hlYWQpOworICAgICAgICAgICAgLyogbG9uZ2VzdF9tYXRjaCgpIHNldHMgbWF0Y2hfc3RhcnQgKi8KKworICAgICAgICAgICAgaWYgKHMtPm1hdGNoX2xlbmd0aCA8PSA1ICYmIChzLT5zdHJhdGVneSA9PSBaX0ZJTFRFUkVECisjaWYgVE9PX0ZBUiA8PSAzMjc2NworICAgICAgICAgICAgICAgIHx8IChzLT5tYXRjaF9sZW5ndGggPT0gTUlOX01BVENIICYmCisgICAgICAgICAgICAgICAgICAgIHMtPnN0cnN0YXJ0IC0gcy0+bWF0Y2hfc3RhcnQgPiBUT09fRkFSKQorI2VuZGlmCisgICAgICAgICAgICAgICAgKSkgeworCisgICAgICAgICAgICAgICAgLyogSWYgcHJldl9tYXRjaCBpcyBhbHNvIE1JTl9NQVRDSCwgbWF0Y2hfc3RhcnQgaXMgZ2FyYmFnZQorICAgICAgICAgICAgICAgICAqIGJ1dCB3ZSB3aWxsIGlnbm9yZSB0aGUgY3VycmVudCBtYXRjaCBhbnl3YXkuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgcy0+bWF0Y2hfbGVuZ3RoID0gTUlOX01BVENILTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLyogSWYgdGhlcmUgd2FzIGEgbWF0Y2ggYXQgdGhlIHByZXZpb3VzIHN0ZXAgYW5kIHRoZSBjdXJyZW50CisgICAgICAgICAqIG1hdGNoIGlzIG5vdCBiZXR0ZXIsIG91dHB1dCB0aGUgcHJldmlvdXMgbWF0Y2g6CisgICAgICAgICAqLworICAgICAgICBpZiAocy0+cHJldl9sZW5ndGggPj0gTUlOX01BVENIICYmIHMtPm1hdGNoX2xlbmd0aCA8PSBzLT5wcmV2X2xlbmd0aCkgeworICAgICAgICAgICAgdUludCBtYXhfaW5zZXJ0ID0gcy0+c3Ryc3RhcnQgKyBzLT5sb29rYWhlYWQgLSBNSU5fTUFUQ0g7CisgICAgICAgICAgICAvKiBEbyBub3QgaW5zZXJ0IHN0cmluZ3MgaW4gaGFzaCB0YWJsZSBiZXlvbmQgdGhpcy4gKi8KKworICAgICAgICAgICAgY2hlY2tfbWF0Y2gocywgcy0+c3Ryc3RhcnQtMSwgcy0+cHJldl9tYXRjaCwgcy0+cHJldl9sZW5ndGgpOworCisgICAgICAgICAgICBfdHJfdGFsbHlfZGlzdChzLCBzLT5zdHJzdGFydCAtMSAtIHMtPnByZXZfbWF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5wcmV2X2xlbmd0aCAtIE1JTl9NQVRDSCwgYmZsdXNoKTsKKworICAgICAgICAgICAgLyogSW5zZXJ0IGluIGhhc2ggdGFibGUgYWxsIHN0cmluZ3MgdXAgdG8gdGhlIGVuZCBvZiB0aGUgbWF0Y2guCisgICAgICAgICAgICAgKiBzdHJzdGFydC0xIGFuZCBzdHJzdGFydCBhcmUgYWxyZWFkeSBpbnNlcnRlZC4gSWYgdGhlcmUgaXMgbm90CisgICAgICAgICAgICAgKiBlbm91Z2ggbG9va2FoZWFkLCB0aGUgbGFzdCB0d28gc3RyaW5ncyBhcmUgbm90IGluc2VydGVkIGluCisgICAgICAgICAgICAgKiB0aGUgaGFzaCB0YWJsZS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcy0+bG9va2FoZWFkIC09IHMtPnByZXZfbGVuZ3RoLTE7CisgICAgICAgICAgICBzLT5wcmV2X2xlbmd0aCAtPSAyOworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGlmICgrK3MtPnN0cnN0YXJ0IDw9IG1heF9pbnNlcnQpIHsKKyAgICAgICAgICAgICAgICAgICAgSU5TRVJUX1NUUklORyhzLCBzLT5zdHJzdGFydCwgaGFzaF9oZWFkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IHdoaWxlICgtLXMtPnByZXZfbGVuZ3RoICE9IDApOworICAgICAgICAgICAgcy0+bWF0Y2hfYXZhaWxhYmxlID0gMDsKKyAgICAgICAgICAgIHMtPm1hdGNoX2xlbmd0aCA9IE1JTl9NQVRDSC0xOworICAgICAgICAgICAgcy0+c3Ryc3RhcnQrKzsKKworICAgICAgICAgICAgaWYgKGJmbHVzaCkgRkxVU0hfQkxPQ0socywgMCk7CisKKyAgICAgICAgfSBlbHNlIGlmIChzLT5tYXRjaF9hdmFpbGFibGUpIHsKKyAgICAgICAgICAgIC8qIElmIHRoZXJlIHdhcyBubyBtYXRjaCBhdCB0aGUgcHJldmlvdXMgcG9zaXRpb24sIG91dHB1dCBhCisgICAgICAgICAgICAgKiBzaW5nbGUgbGl0ZXJhbC4gSWYgdGhlcmUgd2FzIGEgbWF0Y2ggYnV0IHRoZSBjdXJyZW50IG1hdGNoCisgICAgICAgICAgICAgKiBpcyBsb25nZXIsIHRydW5jYXRlIHRoZSBwcmV2aW91cyBtYXRjaCB0byBhIHNpbmdsZSBsaXRlcmFsLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBUcmFjZXZ2KChzdGRlcnIsIiVjIiwgcy0+d2luZG93W3MtPnN0cnN0YXJ0LTFdKSk7CisgICAgICAgICAgICBfdHJfdGFsbHlfbGl0KHMsIHMtPndpbmRvd1tzLT5zdHJzdGFydC0xXSwgYmZsdXNoKTsKKyAgICAgICAgICAgIGlmIChiZmx1c2gpIHsKKyAgICAgICAgICAgICAgICBGTFVTSF9CTE9DS19PTkxZKHMsIDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcy0+c3Ryc3RhcnQrKzsKKyAgICAgICAgICAgIHMtPmxvb2thaGVhZC0tOworICAgICAgICAgICAgaWYgKHMtPnN0cm0tPmF2YWlsX291dCA9PSAwKSByZXR1cm4gbmVlZF9tb3JlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogVGhlcmUgaXMgbm8gcHJldmlvdXMgbWF0Y2ggdG8gY29tcGFyZSB3aXRoLCB3YWl0IGZvcgorICAgICAgICAgICAgICogdGhlIG5leHQgc3RlcCB0byBkZWNpZGUuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHMtPm1hdGNoX2F2YWlsYWJsZSA9IDE7CisgICAgICAgICAgICBzLT5zdHJzdGFydCsrOworICAgICAgICAgICAgcy0+bG9va2FoZWFkLS07CisgICAgICAgIH0KKyAgICB9CisgICAgQXNzZXJ0IChmbHVzaCAhPSBaX05PX0ZMVVNILCAibm8gZmx1c2g/Iik7CisgICAgaWYgKHMtPm1hdGNoX2F2YWlsYWJsZSkgeworICAgICAgICBUcmFjZXZ2KChzdGRlcnIsIiVjIiwgcy0+d2luZG93W3MtPnN0cnN0YXJ0LTFdKSk7CisgICAgICAgIF90cl90YWxseV9saXQocywgcy0+d2luZG93W3MtPnN0cnN0YXJ0LTFdLCBiZmx1c2gpOworICAgICAgICBzLT5tYXRjaF9hdmFpbGFibGUgPSAwOworICAgIH0KKyAgICBzLT5pbnNlcnQgPSBzLT5zdHJzdGFydCA8IE1JTl9NQVRDSC0xID8gcy0+c3Ryc3RhcnQgOiBNSU5fTUFUQ0gtMTsKKyAgICBpZiAoZmx1c2ggPT0gWl9GSU5JU0gpIHsKKyAgICAgICAgRkxVU0hfQkxPQ0socywgMSk7CisgICAgICAgIHJldHVybiBmaW5pc2hfZG9uZTsKKyAgICB9CisgICAgaWYgKHMtPmxhc3RfbGl0KQorICAgICAgICBGTFVTSF9CTE9DSyhzLCAwKTsKKyAgICByZXR1cm4gYmxvY2tfZG9uZTsKK30KKyNlbmRpZiAvKiBGQVNURVNUICovCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRm9yIFpfUkxFLCBzaW1wbHkgbG9vayBmb3IgcnVucyBvZiBieXRlcywgZ2VuZXJhdGUgbWF0Y2hlcyBvbmx5IG9mIGRpc3RhbmNlCisgKiBvbmUuICBEbyBub3QgbWFpbnRhaW4gYSBoYXNoIHRhYmxlLiAgKEl0IHdpbGwgYmUgcmVnZW5lcmF0ZWQgaWYgdGhpcyBydW4gb2YKKyAqIGRlZmxhdGUgc3dpdGNoZXMgYXdheSBmcm9tIFpfUkxFLikKKyAqLworbG9jYWwgYmxvY2tfc3RhdGUgZGVmbGF0ZV9ybGUocywgZmx1c2gpCisgICAgZGVmbGF0ZV9zdGF0ZSAqczsKKyAgICBpbnQgZmx1c2g7Cit7CisgICAgaW50IGJmbHVzaDsgICAgICAgICAgICAgLyogc2V0IGlmIGN1cnJlbnQgYmxvY2sgbXVzdCBiZSBmbHVzaGVkICovCisgICAgdUludCBwcmV2OyAgICAgICAgICAgICAgLyogYnl0ZSBhdCBkaXN0YW5jZSBvbmUgdG8gbWF0Y2ggKi8KKyAgICBCeXRlZiAqc2NhbiwgKnN0cmVuZDsgICAvKiBzY2FuIGdvZXMgdXAgdG8gc3RyZW5kIGZvciBsZW5ndGggb2YgcnVuICovCisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIC8qIE1ha2Ugc3VyZSB0aGF0IHdlIGFsd2F5cyBoYXZlIGVub3VnaCBsb29rYWhlYWQsIGV4Y2VwdAorICAgICAgICAgKiBhdCB0aGUgZW5kIG9mIHRoZSBpbnB1dCBmaWxlLiBXZSBuZWVkIE1BWF9NQVRDSCBieXRlcworICAgICAgICAgKiBmb3IgdGhlIGxvbmdlc3QgcnVuLCBwbHVzIG9uZSBmb3IgdGhlIHVucm9sbGVkIGxvb3AuCisgICAgICAgICAqLworICAgICAgICBpZiAocy0+bG9va2FoZWFkIDw9IE1BWF9NQVRDSCkgeworICAgICAgICAgICAgZmlsbF93aW5kb3cocyk7CisgICAgICAgICAgICBpZiAocy0+bG9va2FoZWFkIDw9IE1BWF9NQVRDSCAmJiBmbHVzaCA9PSBaX05PX0ZMVVNIKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5lZWRfbW9yZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzLT5sb29rYWhlYWQgPT0gMCkgYnJlYWs7IC8qIGZsdXNoIHRoZSBjdXJyZW50IGJsb2NrICovCisgICAgICAgIH0KKworICAgICAgICAvKiBTZWUgaG93IG1hbnkgdGltZXMgdGhlIHByZXZpb3VzIGJ5dGUgcmVwZWF0cyAqLworICAgICAgICBzLT5tYXRjaF9sZW5ndGggPSAwOworICAgICAgICBpZiAocy0+bG9va2FoZWFkID49IE1JTl9NQVRDSCAmJiBzLT5zdHJzdGFydCA+IDApIHsKKyAgICAgICAgICAgIHNjYW4gPSBzLT53aW5kb3cgKyBzLT5zdHJzdGFydCAtIDE7CisgICAgICAgICAgICBwcmV2ID0gKnNjYW47CisgICAgICAgICAgICBpZiAocHJldiA9PSAqKytzY2FuICYmIHByZXYgPT0gKisrc2NhbiAmJiBwcmV2ID09ICorK3NjYW4pIHsKKyAgICAgICAgICAgICAgICBzdHJlbmQgPSBzLT53aW5kb3cgKyBzLT5zdHJzdGFydCArIE1BWF9NQVRDSDsKKyAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgfSB3aGlsZSAocHJldiA9PSAqKytzY2FuICYmIHByZXYgPT0gKisrc2NhbiAmJgorICAgICAgICAgICAgICAgICAgICAgICAgIHByZXYgPT0gKisrc2NhbiAmJiBwcmV2ID09ICorK3NjYW4gJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2ID09ICorK3NjYW4gJiYgcHJldiA9PSAqKytzY2FuICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgcHJldiA9PSAqKytzY2FuICYmIHByZXYgPT0gKisrc2NhbiAmJgorICAgICAgICAgICAgICAgICAgICAgICAgIHNjYW4gPCBzdHJlbmQpOworICAgICAgICAgICAgICAgIHMtPm1hdGNoX2xlbmd0aCA9IE1BWF9NQVRDSCAtIChpbnQpKHN0cmVuZCAtIHNjYW4pOworICAgICAgICAgICAgICAgIGlmIChzLT5tYXRjaF9sZW5ndGggPiBzLT5sb29rYWhlYWQpCisgICAgICAgICAgICAgICAgICAgIHMtPm1hdGNoX2xlbmd0aCA9IHMtPmxvb2thaGVhZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFzc2VydChzY2FuIDw9IHMtPndpbmRvdysodUludCkocy0+d2luZG93X3NpemUtMSksICJ3aWxkIHNjYW4iKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIEVtaXQgbWF0Y2ggaWYgaGF2ZSBydW4gb2YgTUlOX01BVENIIG9yIGxvbmdlciwgZWxzZSBlbWl0IGxpdGVyYWwgKi8KKyAgICAgICAgaWYgKHMtPm1hdGNoX2xlbmd0aCA+PSBNSU5fTUFUQ0gpIHsKKyAgICAgICAgICAgIGNoZWNrX21hdGNoKHMsIHMtPnN0cnN0YXJ0LCBzLT5zdHJzdGFydCAtIDEsIHMtPm1hdGNoX2xlbmd0aCk7CisKKyAgICAgICAgICAgIF90cl90YWxseV9kaXN0KHMsIDEsIHMtPm1hdGNoX2xlbmd0aCAtIE1JTl9NQVRDSCwgYmZsdXNoKTsKKworICAgICAgICAgICAgcy0+bG9va2FoZWFkIC09IHMtPm1hdGNoX2xlbmd0aDsKKyAgICAgICAgICAgIHMtPnN0cnN0YXJ0ICs9IHMtPm1hdGNoX2xlbmd0aDsKKyAgICAgICAgICAgIHMtPm1hdGNoX2xlbmd0aCA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBObyBtYXRjaCwgb3V0cHV0IGEgbGl0ZXJhbCBieXRlICovCisgICAgICAgICAgICBUcmFjZXZ2KChzdGRlcnIsIiVjIiwgcy0+d2luZG93W3MtPnN0cnN0YXJ0XSkpOworICAgICAgICAgICAgX3RyX3RhbGx5X2xpdCAocywgcy0+d2luZG93W3MtPnN0cnN0YXJ0XSwgYmZsdXNoKTsKKyAgICAgICAgICAgIHMtPmxvb2thaGVhZC0tOworICAgICAgICAgICAgcy0+c3Ryc3RhcnQrKzsKKyAgICAgICAgfQorICAgICAgICBpZiAoYmZsdXNoKSBGTFVTSF9CTE9DSyhzLCAwKTsKKyAgICB9CisgICAgcy0+aW5zZXJ0ID0gMDsKKyAgICBpZiAoZmx1c2ggPT0gWl9GSU5JU0gpIHsKKyAgICAgICAgRkxVU0hfQkxPQ0socywgMSk7CisgICAgICAgIHJldHVybiBmaW5pc2hfZG9uZTsKKyAgICB9CisgICAgaWYgKHMtPmxhc3RfbGl0KQorICAgICAgICBGTFVTSF9CTE9DSyhzLCAwKTsKKyAgICByZXR1cm4gYmxvY2tfZG9uZTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGb3IgWl9IVUZGTUFOX09OTFksIGRvIG5vdCBsb29rIGZvciBtYXRjaGVzLiAgRG8gbm90IG1haW50YWluIGEgaGFzaCB0YWJsZS4KKyAqIChJdCB3aWxsIGJlIHJlZ2VuZXJhdGVkIGlmIHRoaXMgcnVuIG9mIGRlZmxhdGUgc3dpdGNoZXMgYXdheSBmcm9tIEh1ZmZtYW4uKQorICovCitsb2NhbCBibG9ja19zdGF0ZSBkZWZsYXRlX2h1ZmYocywgZmx1c2gpCisgICAgZGVmbGF0ZV9zdGF0ZSAqczsKKyAgICBpbnQgZmx1c2g7Cit7CisgICAgaW50IGJmbHVzaDsgICAgICAgICAgICAgLyogc2V0IGlmIGN1cnJlbnQgYmxvY2sgbXVzdCBiZSBmbHVzaGVkICovCisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIC8qIE1ha2Ugc3VyZSB0aGF0IHdlIGhhdmUgYSBsaXRlcmFsIHRvIHdyaXRlLiAqLworICAgICAgICBpZiAocy0+bG9va2FoZWFkID09IDApIHsKKyAgICAgICAgICAgIGZpbGxfd2luZG93KHMpOworICAgICAgICAgICAgaWYgKHMtPmxvb2thaGVhZCA9PSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKGZsdXNoID09IFpfTk9fRkxVU0gpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZWVkX21vcmU7CisgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgLyogZmx1c2ggdGhlIGN1cnJlbnQgYmxvY2sgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIE91dHB1dCBhIGxpdGVyYWwgYnl0ZSAqLworICAgICAgICBzLT5tYXRjaF9sZW5ndGggPSAwOworICAgICAgICBUcmFjZXZ2KChzdGRlcnIsIiVjIiwgcy0+d2luZG93W3MtPnN0cnN0YXJ0XSkpOworICAgICAgICBfdHJfdGFsbHlfbGl0IChzLCBzLT53aW5kb3dbcy0+c3Ryc3RhcnRdLCBiZmx1c2gpOworICAgICAgICBzLT5sb29rYWhlYWQtLTsKKyAgICAgICAgcy0+c3Ryc3RhcnQrKzsKKyAgICAgICAgaWYgKGJmbHVzaCkgRkxVU0hfQkxPQ0socywgMCk7CisgICAgfQorICAgIHMtPmluc2VydCA9IDA7CisgICAgaWYgKGZsdXNoID09IFpfRklOSVNIKSB7CisgICAgICAgIEZMVVNIX0JMT0NLKHMsIDEpOworICAgICAgICByZXR1cm4gZmluaXNoX2RvbmU7CisgICAgfQorICAgIGlmIChzLT5sYXN0X2xpdCkKKyAgICAgICAgRkxVU0hfQkxPQ0socywgMCk7CisgICAgcmV0dXJuIGJsb2NrX2RvbmU7Cit9CmRpZmYgLS1naXQgYS96bGliLTEuMi42L2RlZmxhdGUuaCBiL3psaWItMS4yLjYvZGVmbGF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiYWM0NGQKLS0tIC9kZXYvbnVsbAorKysgYi96bGliLTEuMi42L2RlZmxhdGUuaApAQCAtMCwwICsxLDM0NiBAQAorLyogZGVmbGF0ZS5oIC0tIGludGVybmFsIGNvbXByZXNzaW9uIHN0YXRlCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAxMiBKZWFuLWxvdXAgR2FpbGx5CisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCisgKi8KKworLyogV0FSTklORzogdGhpcyBmaWxlIHNob3VsZCAqbm90KiBiZSB1c2VkIGJ5IGFwcGxpY2F0aW9ucy4gSXQgaXMKKyAgIHBhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBjb21wcmVzc2lvbiBsaWJyYXJ5IGFuZCBpcworICAgc3ViamVjdCB0byBjaGFuZ2UuIEFwcGxpY2F0aW9ucyBzaG91bGQgb25seSB1c2UgemxpYi5oLgorICovCisKKy8qIEAoIykgJElkJCAqLworCisjaWZuZGVmIERFRkxBVEVfSAorI2RlZmluZSBERUZMQVRFX0gKKworI2luY2x1ZGUgInp1dGlsLmgiCisKKy8qIGRlZmluZSBOT19HWklQIHdoZW4gY29tcGlsaW5nIGlmIHlvdSB3YW50IHRvIGRpc2FibGUgZ3ppcCBoZWFkZXIgYW5kCisgICB0cmFpbGVyIGNyZWF0aW9uIGJ5IGRlZmxhdGUoKS4gIE5PX0daSVAgd291bGQgYmUgdXNlZCB0byBhdm9pZCBsaW5raW5nIGluCisgICB0aGUgY3JjIGNvZGUgd2hlbiBpdCBpcyBub3QgbmVlZGVkLiAgRm9yIHNoYXJlZCBsaWJyYXJpZXMsIGd6aXAgZW5jb2RpbmcKKyAgIHNob3VsZCBiZSBsZWZ0IGVuYWJsZWQuICovCisjaWZuZGVmIE5PX0daSVAKKyMgIGRlZmluZSBHWklQCisjZW5kaWYKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBJbnRlcm5hbCBjb21wcmVzc2lvbiBzdGF0ZS4KKyAqLworCisjZGVmaW5lIExFTkdUSF9DT0RFUyAyOQorLyogbnVtYmVyIG9mIGxlbmd0aCBjb2Rlcywgbm90IGNvdW50aW5nIHRoZSBzcGVjaWFsIEVORF9CTE9DSyBjb2RlICovCisKKyNkZWZpbmUgTElURVJBTFMgIDI1NgorLyogbnVtYmVyIG9mIGxpdGVyYWwgYnl0ZXMgMC4uMjU1ICovCisKKyNkZWZpbmUgTF9DT0RFUyAoTElURVJBTFMrMStMRU5HVEhfQ09ERVMpCisvKiBudW1iZXIgb2YgTGl0ZXJhbCBvciBMZW5ndGggY29kZXMsIGluY2x1ZGluZyB0aGUgRU5EX0JMT0NLIGNvZGUgKi8KKworI2RlZmluZSBEX0NPREVTICAgMzAKKy8qIG51bWJlciBvZiBkaXN0YW5jZSBjb2RlcyAqLworCisjZGVmaW5lIEJMX0NPREVTICAxOQorLyogbnVtYmVyIG9mIGNvZGVzIHVzZWQgdG8gdHJhbnNmZXIgdGhlIGJpdCBsZW5ndGhzICovCisKKyNkZWZpbmUgSEVBUF9TSVpFICgyKkxfQ09ERVMrMSkKKy8qIG1heGltdW0gaGVhcCBzaXplICovCisKKyNkZWZpbmUgTUFYX0JJVFMgMTUKKy8qIEFsbCBjb2RlcyBtdXN0IG5vdCBleGNlZWQgTUFYX0JJVFMgYml0cyAqLworCisjZGVmaW5lIEJ1Zl9zaXplIDE2CisvKiBzaXplIG9mIGJpdCBidWZmZXIgaW4gYmlfYnVmICovCisKKyNkZWZpbmUgSU5JVF9TVEFURSAgICA0MgorI2RlZmluZSBFWFRSQV9TVEFURSAgIDY5CisjZGVmaW5lIE5BTUVfU1RBVEUgICAgNzMKKyNkZWZpbmUgQ09NTUVOVF9TVEFURSA5MQorI2RlZmluZSBIQ1JDX1NUQVRFICAgMTAzCisjZGVmaW5lIEJVU1lfU1RBVEUgICAxMTMKKyNkZWZpbmUgRklOSVNIX1NUQVRFIDY2NgorLyogU3RyZWFtIHN0YXR1cyAqLworCisKKy8qIERhdGEgc3RydWN0dXJlIGRlc2NyaWJpbmcgYSBzaW5nbGUgdmFsdWUgYW5kIGl0cyBjb2RlIHN0cmluZy4gKi8KK3R5cGVkZWYgc3RydWN0IGN0X2RhdGFfcyB7CisgICAgdW5pb24geworICAgICAgICB1c2ggIGZyZXE7ICAgICAgIC8qIGZyZXF1ZW5jeSBjb3VudCAqLworICAgICAgICB1c2ggIGNvZGU7ICAgICAgIC8qIGJpdCBzdHJpbmcgKi8KKyAgICB9IGZjOworICAgIHVuaW9uIHsKKyAgICAgICAgdXNoICBkYWQ7ICAgICAgICAvKiBmYXRoZXIgbm9kZSBpbiBIdWZmbWFuIHRyZWUgKi8KKyAgICAgICAgdXNoICBsZW47ICAgICAgICAvKiBsZW5ndGggb2YgYml0IHN0cmluZyAqLworICAgIH0gZGw7Cit9IEZBUiBjdF9kYXRhOworCisjZGVmaW5lIEZyZXEgZmMuZnJlcQorI2RlZmluZSBDb2RlIGZjLmNvZGUKKyNkZWZpbmUgRGFkICBkbC5kYWQKKyNkZWZpbmUgTGVuICBkbC5sZW4KKwordHlwZWRlZiBzdHJ1Y3Qgc3RhdGljX3RyZWVfZGVzY19zICBzdGF0aWNfdHJlZV9kZXNjOworCit0eXBlZGVmIHN0cnVjdCB0cmVlX2Rlc2NfcyB7CisgICAgY3RfZGF0YSAqZHluX3RyZWU7ICAgICAgICAgICAvKiB0aGUgZHluYW1pYyB0cmVlICovCisgICAgaW50ICAgICBtYXhfY29kZTsgICAgICAgICAgICAvKiBsYXJnZXN0IGNvZGUgd2l0aCBub24gemVybyBmcmVxdWVuY3kgKi8KKyAgICBzdGF0aWNfdHJlZV9kZXNjICpzdGF0X2Rlc2M7IC8qIHRoZSBjb3JyZXNwb25kaW5nIHN0YXRpYyB0cmVlICovCit9IEZBUiB0cmVlX2Rlc2M7CisKK3R5cGVkZWYgdXNoIFBvczsKK3R5cGVkZWYgUG9zIEZBUiBQb3NmOwordHlwZWRlZiB1bnNpZ25lZCBJUG9zOworCisvKiBBIFBvcyBpcyBhbiBpbmRleCBpbiB0aGUgY2hhcmFjdGVyIHdpbmRvdy4gV2UgdXNlIHNob3J0IGluc3RlYWQgb2YgaW50IHRvCisgKiBzYXZlIHNwYWNlIGluIHRoZSB2YXJpb3VzIHRhYmxlcy4gSVBvcyBpcyB1c2VkIG9ubHkgZm9yIHBhcmFtZXRlciBwYXNzaW5nLgorICovCisKK3R5cGVkZWYgc3RydWN0IGludGVybmFsX3N0YXRlIHsKKyAgICB6X3N0cmVhbXAgc3RybTsgICAgICAvKiBwb2ludGVyIGJhY2sgdG8gdGhpcyB6bGliIHN0cmVhbSAqLworICAgIGludCAgIHN0YXR1czsgICAgICAgIC8qIGFzIHRoZSBuYW1lIGltcGxpZXMgKi8KKyAgICBCeXRlZiAqcGVuZGluZ19idWY7ICAvKiBvdXRwdXQgc3RpbGwgcGVuZGluZyAqLworICAgIHVsZyAgIHBlbmRpbmdfYnVmX3NpemU7IC8qIHNpemUgb2YgcGVuZGluZ19idWYgKi8KKyAgICBCeXRlZiAqcGVuZGluZ19vdXQ7ICAvKiBuZXh0IHBlbmRpbmcgYnl0ZSB0byBvdXRwdXQgdG8gdGhlIHN0cmVhbSAqLworICAgIHVJbnQgICBwZW5kaW5nOyAgICAgIC8qIG5iIG9mIGJ5dGVzIGluIHRoZSBwZW5kaW5nIGJ1ZmZlciAqLworICAgIGludCAgIHdyYXA7ICAgICAgICAgIC8qIGJpdCAwIHRydWUgZm9yIHpsaWIsIGJpdCAxIHRydWUgZm9yIGd6aXAgKi8KKyAgICBnel9oZWFkZXJwICBnemhlYWQ7ICAvKiBnemlwIGhlYWRlciBpbmZvcm1hdGlvbiB0byB3cml0ZSAqLworICAgIHVJbnQgICBnemluZGV4OyAgICAgIC8qIHdoZXJlIGluIGV4dHJhLCBuYW1lLCBvciBjb21tZW50ICovCisgICAgQnl0ZSAgbWV0aG9kOyAgICAgICAgLyogU1RPUkVEIChmb3IgemlwIG9ubHkpIG9yIERFRkxBVEVEICovCisgICAgaW50ICAgbGFzdF9mbHVzaDsgICAgLyogdmFsdWUgb2YgZmx1c2ggcGFyYW0gZm9yIHByZXZpb3VzIGRlZmxhdGUgY2FsbCAqLworCisgICAgICAgICAgICAgICAgLyogdXNlZCBieSBkZWZsYXRlLmM6ICovCisKKyAgICB1SW50ICB3X3NpemU7ICAgICAgICAvKiBMWjc3IHdpbmRvdyBzaXplICgzMksgYnkgZGVmYXVsdCkgKi8KKyAgICB1SW50ICB3X2JpdHM7ICAgICAgICAvKiBsb2cyKHdfc2l6ZSkgICg4Li4xNikgKi8KKyAgICB1SW50ICB3X21hc2s7ICAgICAgICAvKiB3X3NpemUgLSAxICovCisKKyAgICBCeXRlZiAqd2luZG93OworICAgIC8qIFNsaWRpbmcgd2luZG93LiBJbnB1dCBieXRlcyBhcmUgcmVhZCBpbnRvIHRoZSBzZWNvbmQgaGFsZiBvZiB0aGUgd2luZG93LAorICAgICAqIGFuZCBtb3ZlIHRvIHRoZSBmaXJzdCBoYWxmIGxhdGVyIHRvIGtlZXAgYSBkaWN0aW9uYXJ5IG9mIGF0IGxlYXN0IHdTaXplCisgICAgICogYnl0ZXMuIFdpdGggdGhpcyBvcmdhbml6YXRpb24sIG1hdGNoZXMgYXJlIGxpbWl0ZWQgdG8gYSBkaXN0YW5jZSBvZgorICAgICAqIHdTaXplLU1BWF9NQVRDSCBieXRlcywgYnV0IHRoaXMgZW5zdXJlcyB0aGF0IElPIGlzIGFsd2F5cworICAgICAqIHBlcmZvcm1lZCB3aXRoIGEgbGVuZ3RoIG11bHRpcGxlIG9mIHRoZSBibG9jayBzaXplLiBBbHNvLCBpdCBsaW1pdHMKKyAgICAgKiB0aGUgd2luZG93IHNpemUgdG8gNjRLLCB3aGljaCBpcyBxdWl0ZSB1c2VmdWwgb24gTVNET1MuCisgICAgICogVG8gZG86IHVzZSB0aGUgdXNlciBpbnB1dCBidWZmZXIgYXMgc2xpZGluZyB3aW5kb3cuCisgICAgICovCisKKyAgICB1bGcgd2luZG93X3NpemU7CisgICAgLyogQWN0dWFsIHNpemUgb2Ygd2luZG93OiAyKndTaXplLCBleGNlcHQgd2hlbiB0aGUgdXNlciBpbnB1dCBidWZmZXIKKyAgICAgKiBpcyBkaXJlY3RseSB1c2VkIGFzIHNsaWRpbmcgd2luZG93LgorICAgICAqLworCisgICAgUG9zZiAqcHJldjsKKyAgICAvKiBMaW5rIHRvIG9sZGVyIHN0cmluZyB3aXRoIHNhbWUgaGFzaCBpbmRleC4gVG8gbGltaXQgdGhlIHNpemUgb2YgdGhpcworICAgICAqIGFycmF5IHRvIDY0SywgdGhpcyBsaW5rIGlzIG1haW50YWluZWQgb25seSBmb3IgdGhlIGxhc3QgMzJLIHN0cmluZ3MuCisgICAgICogQW4gaW5kZXggaW4gdGhpcyBhcnJheSBpcyB0aHVzIGEgd2luZG93IGluZGV4IG1vZHVsbyAzMksuCisgICAgICovCisKKyAgICBQb3NmICpoZWFkOyAvKiBIZWFkcyBvZiB0aGUgaGFzaCBjaGFpbnMgb3IgTklMLiAqLworCisgICAgdUludCAgaW5zX2g7ICAgICAgICAgIC8qIGhhc2ggaW5kZXggb2Ygc3RyaW5nIHRvIGJlIGluc2VydGVkICovCisgICAgdUludCAgaGFzaF9zaXplOyAgICAgIC8qIG51bWJlciBvZiBlbGVtZW50cyBpbiBoYXNoIHRhYmxlICovCisgICAgdUludCAgaGFzaF9iaXRzOyAgICAgIC8qIGxvZzIoaGFzaF9zaXplKSAqLworICAgIHVJbnQgIGhhc2hfbWFzazsgICAgICAvKiBoYXNoX3NpemUtMSAqLworCisgICAgdUludCAgaGFzaF9zaGlmdDsKKyAgICAvKiBOdW1iZXIgb2YgYml0cyBieSB3aGljaCBpbnNfaCBtdXN0IGJlIHNoaWZ0ZWQgYXQgZWFjaCBpbnB1dAorICAgICAqIHN0ZXAuIEl0IG11c3QgYmUgc3VjaCB0aGF0IGFmdGVyIE1JTl9NQVRDSCBzdGVwcywgdGhlIG9sZGVzdAorICAgICAqIGJ5dGUgbm8gbG9uZ2VyIHRha2VzIHBhcnQgaW4gdGhlIGhhc2gga2V5LCB0aGF0IGlzOgorICAgICAqICAgaGFzaF9zaGlmdCAqIE1JTl9NQVRDSCA+PSBoYXNoX2JpdHMKKyAgICAgKi8KKworICAgIGxvbmcgYmxvY2tfc3RhcnQ7CisgICAgLyogV2luZG93IHBvc2l0aW9uIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGN1cnJlbnQgb3V0cHV0IGJsb2NrLiBHZXRzCisgICAgICogbmVnYXRpdmUgd2hlbiB0aGUgd2luZG93IGlzIG1vdmVkIGJhY2t3YXJkcy4KKyAgICAgKi8KKworICAgIHVJbnQgbWF0Y2hfbGVuZ3RoOyAgICAgICAgICAgLyogbGVuZ3RoIG9mIGJlc3QgbWF0Y2ggKi8KKyAgICBJUG9zIHByZXZfbWF0Y2g7ICAgICAgICAgICAgIC8qIHByZXZpb3VzIG1hdGNoICovCisgICAgaW50IG1hdGNoX2F2YWlsYWJsZTsgICAgICAgICAvKiBzZXQgaWYgcHJldmlvdXMgbWF0Y2ggZXhpc3RzICovCisgICAgdUludCBzdHJzdGFydDsgICAgICAgICAgICAgICAvKiBzdGFydCBvZiBzdHJpbmcgdG8gaW5zZXJ0ICovCisgICAgdUludCBtYXRjaF9zdGFydDsgICAgICAgICAgICAvKiBzdGFydCBvZiBtYXRjaGluZyBzdHJpbmcgKi8KKyAgICB1SW50IGxvb2thaGVhZDsgICAgICAgICAgICAgIC8qIG51bWJlciBvZiB2YWxpZCBieXRlcyBhaGVhZCBpbiB3aW5kb3cgKi8KKworICAgIHVJbnQgcHJldl9sZW5ndGg7CisgICAgLyogTGVuZ3RoIG9mIHRoZSBiZXN0IG1hdGNoIGF0IHByZXZpb3VzIHN0ZXAuIE1hdGNoZXMgbm90IGdyZWF0ZXIgdGhhbiB0aGlzCisgICAgICogYXJlIGRpc2NhcmRlZC4gVGhpcyBpcyB1c2VkIGluIHRoZSBsYXp5IG1hdGNoIGV2YWx1YXRpb24uCisgICAgICovCisKKyAgICB1SW50IG1heF9jaGFpbl9sZW5ndGg7CisgICAgLyogVG8gc3BlZWQgdXAgZGVmbGF0aW9uLCBoYXNoIGNoYWlucyBhcmUgbmV2ZXIgc2VhcmNoZWQgYmV5b25kIHRoaXMKKyAgICAgKiBsZW5ndGguICBBIGhpZ2hlciBsaW1pdCBpbXByb3ZlcyBjb21wcmVzc2lvbiByYXRpbyBidXQgZGVncmFkZXMgdGhlCisgICAgICogc3BlZWQuCisgICAgICovCisKKyAgICB1SW50IG1heF9sYXp5X21hdGNoOworICAgIC8qIEF0dGVtcHQgdG8gZmluZCBhIGJldHRlciBtYXRjaCBvbmx5IHdoZW4gdGhlIGN1cnJlbnQgbWF0Y2ggaXMgc3RyaWN0bHkKKyAgICAgKiBzbWFsbGVyIHRoYW4gdGhpcyB2YWx1ZS4gVGhpcyBtZWNoYW5pc20gaXMgdXNlZCBvbmx5IGZvciBjb21wcmVzc2lvbgorICAgICAqIGxldmVscyA+PSA0LgorICAgICAqLworIyAgIGRlZmluZSBtYXhfaW5zZXJ0X2xlbmd0aCAgbWF4X2xhenlfbWF0Y2gKKyAgICAvKiBJbnNlcnQgbmV3IHN0cmluZ3MgaW4gdGhlIGhhc2ggdGFibGUgb25seSBpZiB0aGUgbWF0Y2ggbGVuZ3RoIGlzIG5vdAorICAgICAqIGdyZWF0ZXIgdGhhbiB0aGlzIGxlbmd0aC4gVGhpcyBzYXZlcyB0aW1lIGJ1dCBkZWdyYWRlcyBjb21wcmVzc2lvbi4KKyAgICAgKiBtYXhfaW5zZXJ0X2xlbmd0aCBpcyB1c2VkIG9ubHkgZm9yIGNvbXByZXNzaW9uIGxldmVscyA8PSAzLgorICAgICAqLworCisgICAgaW50IGxldmVsOyAgICAvKiBjb21wcmVzc2lvbiBsZXZlbCAoMS4uOSkgKi8KKyAgICBpbnQgc3RyYXRlZ3k7IC8qIGZhdm9yIG9yIGZvcmNlIEh1ZmZtYW4gY29kaW5nKi8KKworICAgIHVJbnQgZ29vZF9tYXRjaDsKKyAgICAvKiBVc2UgYSBmYXN0ZXIgc2VhcmNoIHdoZW4gdGhlIHByZXZpb3VzIG1hdGNoIGlzIGxvbmdlciB0aGFuIHRoaXMgKi8KKworICAgIGludCBuaWNlX21hdGNoOyAvKiBTdG9wIHNlYXJjaGluZyB3aGVuIGN1cnJlbnQgbWF0Y2ggZXhjZWVkcyB0aGlzICovCisKKyAgICAgICAgICAgICAgICAvKiB1c2VkIGJ5IHRyZWVzLmM6ICovCisgICAgLyogRGlkbid0IHVzZSBjdF9kYXRhIHR5cGVkZWYgYmVsb3cgdG8gc3VwcHJlc3MgY29tcGlsZXIgd2FybmluZyAqLworICAgIHN0cnVjdCBjdF9kYXRhX3MgZHluX2x0cmVlW0hFQVBfU0laRV07ICAgLyogbGl0ZXJhbCBhbmQgbGVuZ3RoIHRyZWUgKi8KKyAgICBzdHJ1Y3QgY3RfZGF0YV9zIGR5bl9kdHJlZVsyKkRfQ09ERVMrMV07IC8qIGRpc3RhbmNlIHRyZWUgKi8KKyAgICBzdHJ1Y3QgY3RfZGF0YV9zIGJsX3RyZWVbMipCTF9DT0RFUysxXTsgIC8qIEh1ZmZtYW4gdHJlZSBmb3IgYml0IGxlbmd0aHMgKi8KKworICAgIHN0cnVjdCB0cmVlX2Rlc2NfcyBsX2Rlc2M7ICAgICAgICAgICAgICAgLyogZGVzYy4gZm9yIGxpdGVyYWwgdHJlZSAqLworICAgIHN0cnVjdCB0cmVlX2Rlc2NfcyBkX2Rlc2M7ICAgICAgICAgICAgICAgLyogZGVzYy4gZm9yIGRpc3RhbmNlIHRyZWUgKi8KKyAgICBzdHJ1Y3QgdHJlZV9kZXNjX3MgYmxfZGVzYzsgICAgICAgICAgICAgIC8qIGRlc2MuIGZvciBiaXQgbGVuZ3RoIHRyZWUgKi8KKworICAgIHVzaCBibF9jb3VudFtNQVhfQklUUysxXTsKKyAgICAvKiBudW1iZXIgb2YgY29kZXMgYXQgZWFjaCBiaXQgbGVuZ3RoIGZvciBhbiBvcHRpbWFsIHRyZWUgKi8KKworICAgIGludCBoZWFwWzIqTF9DT0RFUysxXTsgICAgICAvKiBoZWFwIHVzZWQgdG8gYnVpbGQgdGhlIEh1ZmZtYW4gdHJlZXMgKi8KKyAgICBpbnQgaGVhcF9sZW47ICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBoZWFwICovCisgICAgaW50IGhlYXBfbWF4OyAgICAgICAgICAgICAgIC8qIGVsZW1lbnQgb2YgbGFyZ2VzdCBmcmVxdWVuY3kgKi8KKyAgICAvKiBUaGUgc29ucyBvZiBoZWFwW25dIGFyZSBoZWFwWzIqbl0gYW5kIGhlYXBbMipuKzFdLiBoZWFwWzBdIGlzIG5vdCB1c2VkLgorICAgICAqIFRoZSBzYW1lIGhlYXAgYXJyYXkgaXMgdXNlZCB0byBidWlsZCBhbGwgdHJlZXMuCisgICAgICovCisKKyAgICB1Y2ggZGVwdGhbMipMX0NPREVTKzFdOworICAgIC8qIERlcHRoIG9mIGVhY2ggc3VidHJlZSB1c2VkIGFzIHRpZSBicmVha2VyIGZvciB0cmVlcyBvZiBlcXVhbCBmcmVxdWVuY3kKKyAgICAgKi8KKworICAgIHVjaGYgKmxfYnVmOyAgICAgICAgICAvKiBidWZmZXIgZm9yIGxpdGVyYWxzIG9yIGxlbmd0aHMgKi8KKworICAgIHVJbnQgIGxpdF9idWZzaXplOworICAgIC8qIFNpemUgb2YgbWF0Y2ggYnVmZmVyIGZvciBsaXRlcmFscy9sZW5ndGhzLiAgVGhlcmUgYXJlIDQgcmVhc29ucyBmb3IKKyAgICAgKiBsaW1pdGluZyBsaXRfYnVmc2l6ZSB0byA2NEs6CisgICAgICogICAtIGZyZXF1ZW5jaWVzIGNhbiBiZSBrZXB0IGluIDE2IGJpdCBjb3VudGVycworICAgICAqICAgLSBpZiBjb21wcmVzc2lvbiBpcyBub3Qgc3VjY2Vzc2Z1bCBmb3IgdGhlIGZpcnN0IGJsb2NrLCBhbGwgaW5wdXQKKyAgICAgKiAgICAgZGF0YSBpcyBzdGlsbCBpbiB0aGUgd2luZG93IHNvIHdlIGNhbiBzdGlsbCBlbWl0IGEgc3RvcmVkIGJsb2NrIGV2ZW4KKyAgICAgKiAgICAgd2hlbiBpbnB1dCBjb21lcyBmcm9tIHN0YW5kYXJkIGlucHV0LiAgKFRoaXMgY2FuIGFsc28gYmUgZG9uZSBmb3IKKyAgICAgKiAgICAgYWxsIGJsb2NrcyBpZiBsaXRfYnVmc2l6ZSBpcyBub3QgZ3JlYXRlciB0aGFuIDMySy4pCisgICAgICogICAtIGlmIGNvbXByZXNzaW9uIGlzIG5vdCBzdWNjZXNzZnVsIGZvciBhIGZpbGUgc21hbGxlciB0aGFuIDY0Sywgd2UgY2FuCisgICAgICogICAgIGV2ZW4gZW1pdCBhIHN0b3JlZCBmaWxlIGluc3RlYWQgb2YgYSBzdG9yZWQgYmxvY2sgKHNhdmluZyA1IGJ5dGVzKS4KKyAgICAgKiAgICAgVGhpcyBpcyBhcHBsaWNhYmxlIG9ubHkgZm9yIHppcCAobm90IGd6aXAgb3IgemxpYikuCisgICAgICogICAtIGNyZWF0aW5nIG5ldyBIdWZmbWFuIHRyZWVzIGxlc3MgZnJlcXVlbnRseSBtYXkgbm90IHByb3ZpZGUgZmFzdAorICAgICAqICAgICBhZGFwdGF0aW9uIHRvIGNoYW5nZXMgaW4gdGhlIGlucHV0IGRhdGEgc3RhdGlzdGljcy4gKFRha2UgZm9yCisgICAgICogICAgIGV4YW1wbGUgYSBiaW5hcnkgZmlsZSB3aXRoIHBvb3JseSBjb21wcmVzc2libGUgY29kZSBmb2xsb3dlZCBieQorICAgICAqICAgICBhIGhpZ2hseSBjb21wcmVzc2libGUgc3RyaW5nIHRhYmxlLikgU21hbGxlciBidWZmZXIgc2l6ZXMgZ2l2ZQorICAgICAqICAgICBmYXN0IGFkYXB0YXRpb24gYnV0IGhhdmUgb2YgY291cnNlIHRoZSBvdmVyaGVhZCBvZiB0cmFuc21pdHRpbmcKKyAgICAgKiAgICAgdHJlZXMgbW9yZSBmcmVxdWVudGx5LgorICAgICAqICAgLSBJIGNhbid0IGNvdW50IGFib3ZlIDQKKyAgICAgKi8KKworICAgIHVJbnQgbGFzdF9saXQ7ICAgICAgLyogcnVubmluZyBpbmRleCBpbiBsX2J1ZiAqLworCisgICAgdXNoZiAqZF9idWY7CisgICAgLyogQnVmZmVyIGZvciBkaXN0YW5jZXMuIFRvIHNpbXBsaWZ5IHRoZSBjb2RlLCBkX2J1ZiBhbmQgbF9idWYgaGF2ZQorICAgICAqIHRoZSBzYW1lIG51bWJlciBvZiBlbGVtZW50cy4gVG8gdXNlIGRpZmZlcmVudCBsZW5ndGhzLCBhbiBleHRyYSBmbGFnCisgICAgICogYXJyYXkgd291bGQgYmUgbmVjZXNzYXJ5LgorICAgICAqLworCisgICAgdWxnIG9wdF9sZW47ICAgICAgICAvKiBiaXQgbGVuZ3RoIG9mIGN1cnJlbnQgYmxvY2sgd2l0aCBvcHRpbWFsIHRyZWVzICovCisgICAgdWxnIHN0YXRpY19sZW47ICAgICAvKiBiaXQgbGVuZ3RoIG9mIGN1cnJlbnQgYmxvY2sgd2l0aCBzdGF0aWMgdHJlZXMgKi8KKyAgICB1SW50IG1hdGNoZXM7ICAgICAgIC8qIG51bWJlciBvZiBzdHJpbmcgbWF0Y2hlcyBpbiBjdXJyZW50IGJsb2NrICovCisgICAgdUludCBpbnNlcnQ7ICAgICAgICAvKiBieXRlcyBhdCBlbmQgb2Ygd2luZG93IGxlZnQgdG8gaW5zZXJ0ICovCisKKyNpZmRlZiBERUJVRworICAgIHVsZyBjb21wcmVzc2VkX2xlbjsgLyogdG90YWwgYml0IGxlbmd0aCBvZiBjb21wcmVzc2VkIGZpbGUgbW9kIDJeMzIgKi8KKyAgICB1bGcgYml0c19zZW50OyAgICAgIC8qIGJpdCBsZW5ndGggb2YgY29tcHJlc3NlZCBkYXRhIHNlbnQgbW9kIDJeMzIgKi8KKyNlbmRpZgorCisgICAgdXNoIGJpX2J1ZjsKKyAgICAvKiBPdXRwdXQgYnVmZmVyLiBiaXRzIGFyZSBpbnNlcnRlZCBzdGFydGluZyBhdCB0aGUgYm90dG9tIChsZWFzdAorICAgICAqIHNpZ25pZmljYW50IGJpdHMpLgorICAgICAqLworICAgIGludCBiaV92YWxpZDsKKyAgICAvKiBOdW1iZXIgb2YgdmFsaWQgYml0cyBpbiBiaV9idWYuICBBbGwgYml0cyBhYm92ZSB0aGUgbGFzdCB2YWxpZCBiaXQKKyAgICAgKiBhcmUgYWx3YXlzIHplcm8uCisgICAgICovCisKKyAgICB1bGcgaGlnaF93YXRlcjsKKyAgICAvKiBIaWdoIHdhdGVyIG1hcmsgb2Zmc2V0IGluIHdpbmRvdyBmb3IgaW5pdGlhbGl6ZWQgYnl0ZXMgLS0gYnl0ZXMgYWJvdmUKKyAgICAgKiB0aGlzIGFyZSBzZXQgdG8gemVybyBpbiBvcmRlciB0byBhdm9pZCBtZW1vcnkgY2hlY2sgd2FybmluZ3Mgd2hlbgorICAgICAqIGxvbmdlc3QgbWF0Y2ggcm91dGluZXMgYWNjZXNzIGJ5dGVzIHBhc3QgdGhlIGlucHV0LiAgVGhpcyBpcyB0aGVuCisgICAgICogdXBkYXRlZCB0byB0aGUgbmV3IGhpZ2ggd2F0ZXIgbWFyay4KKyAgICAgKi8KKworfSBGQVIgZGVmbGF0ZV9zdGF0ZTsKKworLyogT3V0cHV0IGEgYnl0ZSBvbiB0aGUgc3RyZWFtLgorICogSU4gYXNzZXJ0aW9uOiB0aGVyZSBpcyBlbm91Z2ggcm9vbSBpbiBwZW5kaW5nX2J1Zi4KKyAqLworI2RlZmluZSBwdXRfYnl0ZShzLCBjKSB7cy0+cGVuZGluZ19idWZbcy0+cGVuZGluZysrXSA9IChjKTt9CisKKworI2RlZmluZSBNSU5fTE9PS0FIRUFEIChNQVhfTUFUQ0grTUlOX01BVENIKzEpCisvKiBNaW5pbXVtIGFtb3VudCBvZiBsb29rYWhlYWQsIGV4Y2VwdCBhdCB0aGUgZW5kIG9mIHRoZSBpbnB1dCBmaWxlLgorICogU2VlIGRlZmxhdGUuYyBmb3IgY29tbWVudHMgYWJvdXQgdGhlIE1JTl9NQVRDSCsxLgorICovCisKKyNkZWZpbmUgTUFYX0RJU1QocykgICgocyktPndfc2l6ZS1NSU5fTE9PS0FIRUFEKQorLyogSW4gb3JkZXIgdG8gc2ltcGxpZnkgdGhlIGNvZGUsIHBhcnRpY3VsYXJseSBvbiAxNiBiaXQgbWFjaGluZXMsIG1hdGNoCisgKiBkaXN0YW5jZXMgYXJlIGxpbWl0ZWQgdG8gTUFYX0RJU1QgaW5zdGVhZCBvZiBXU0laRS4KKyAqLworCisjZGVmaW5lIFdJTl9JTklUIE1BWF9NQVRDSAorLyogTnVtYmVyIG9mIGJ5dGVzIGFmdGVyIGVuZCBvZiBkYXRhIGluIHdpbmRvdyB0byBpbml0aWFsaXplIGluIG9yZGVyIHRvIGF2b2lkCisgICBtZW1vcnkgY2hlY2tlciBlcnJvcnMgZnJvbSBsb25nZXN0IG1hdGNoIHJvdXRpbmVzICovCisKKyAgICAgICAgLyogaW4gdHJlZXMuYyAqLwordm9pZCBaTElCX0lOVEVSTkFMIF90cl9pbml0IE9GKChkZWZsYXRlX3N0YXRlICpzKSk7CitpbnQgWkxJQl9JTlRFUk5BTCBfdHJfdGFsbHkgT0YoKGRlZmxhdGVfc3RhdGUgKnMsIHVuc2lnbmVkIGRpc3QsIHVuc2lnbmVkIGxjKSk7Cit2b2lkIFpMSUJfSU5URVJOQUwgX3RyX2ZsdXNoX2Jsb2NrIE9GKChkZWZsYXRlX3N0YXRlICpzLCBjaGFyZiAqYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgdWxnIHN0b3JlZF9sZW4sIGludCBsYXN0KSk7Cit2b2lkIFpMSUJfSU5URVJOQUwgX3RyX2ZsdXNoX2JpdHMgT0YoKGRlZmxhdGVfc3RhdGUgKnMpKTsKK3ZvaWQgWkxJQl9JTlRFUk5BTCBfdHJfYWxpZ24gT0YoKGRlZmxhdGVfc3RhdGUgKnMpKTsKK3ZvaWQgWkxJQl9JTlRFUk5BTCBfdHJfc3RvcmVkX2Jsb2NrIE9GKChkZWZsYXRlX3N0YXRlICpzLCBjaGFyZiAqYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgdWxnIHN0b3JlZF9sZW4sIGludCBsYXN0KSk7CisKKyNkZWZpbmUgZF9jb2RlKGRpc3QpIFwKKyAgICgoZGlzdCkgPCAyNTYgPyBfZGlzdF9jb2RlW2Rpc3RdIDogX2Rpc3RfY29kZVsyNTYrKChkaXN0KT4+NyldKQorLyogTWFwcGluZyBmcm9tIGEgZGlzdGFuY2UgdG8gYSBkaXN0YW5jZSBjb2RlLiBkaXN0IGlzIHRoZSBkaXN0YW5jZSAtIDEgYW5kCisgKiBtdXN0IG5vdCBoYXZlIHNpZGUgZWZmZWN0cy4gX2Rpc3RfY29kZVsyNTZdIGFuZCBfZGlzdF9jb2RlWzI1N10gYXJlIG5ldmVyCisgKiB1c2VkLgorICovCisKKyNpZm5kZWYgREVCVUcKKy8qIElubGluZSB2ZXJzaW9ucyBvZiBfdHJfdGFsbHkgZm9yIHNwZWVkOiAqLworCisjaWYgZGVmaW5lZChHRU5fVFJFRVNfSCkgfHwgIWRlZmluZWQoU1REQykKKyAgZXh0ZXJuIHVjaCBaTElCX0lOVEVSTkFMIF9sZW5ndGhfY29kZVtdOworICBleHRlcm4gdWNoIFpMSUJfSU5URVJOQUwgX2Rpc3RfY29kZVtdOworI2Vsc2UKKyAgZXh0ZXJuIGNvbnN0IHVjaCBaTElCX0lOVEVSTkFMIF9sZW5ndGhfY29kZVtdOworICBleHRlcm4gY29uc3QgdWNoIFpMSUJfSU5URVJOQUwgX2Rpc3RfY29kZVtdOworI2VuZGlmCisKKyMgZGVmaW5lIF90cl90YWxseV9saXQocywgYywgZmx1c2gpIFwKKyAgeyB1Y2ggY2MgPSAoYyk7IFwKKyAgICBzLT5kX2J1ZltzLT5sYXN0X2xpdF0gPSAwOyBcCisgICAgcy0+bF9idWZbcy0+bGFzdF9saXQrK10gPSBjYzsgXAorICAgIHMtPmR5bl9sdHJlZVtjY10uRnJlcSsrOyBcCisgICAgZmx1c2ggPSAocy0+bGFzdF9saXQgPT0gcy0+bGl0X2J1ZnNpemUtMSk7IFwKKyAgIH0KKyMgZGVmaW5lIF90cl90YWxseV9kaXN0KHMsIGRpc3RhbmNlLCBsZW5ndGgsIGZsdXNoKSBcCisgIHsgdWNoIGxlbiA9IChsZW5ndGgpOyBcCisgICAgdXNoIGRpc3QgPSAoZGlzdGFuY2UpOyBcCisgICAgcy0+ZF9idWZbcy0+bGFzdF9saXRdID0gZGlzdDsgXAorICAgIHMtPmxfYnVmW3MtPmxhc3RfbGl0KytdID0gbGVuOyBcCisgICAgZGlzdC0tOyBcCisgICAgcy0+ZHluX2x0cmVlW19sZW5ndGhfY29kZVtsZW5dK0xJVEVSQUxTKzFdLkZyZXErKzsgXAorICAgIHMtPmR5bl9kdHJlZVtkX2NvZGUoZGlzdCldLkZyZXErKzsgXAorICAgIGZsdXNoID0gKHMtPmxhc3RfbGl0ID09IHMtPmxpdF9idWZzaXplLTEpOyBcCisgIH0KKyNlbHNlCisjIGRlZmluZSBfdHJfdGFsbHlfbGl0KHMsIGMsIGZsdXNoKSBmbHVzaCA9IF90cl90YWxseShzLCAwLCBjKQorIyBkZWZpbmUgX3RyX3RhbGx5X2Rpc3QocywgZGlzdGFuY2UsIGxlbmd0aCwgZmx1c2gpIFwKKyAgICAgICAgICAgICAgZmx1c2ggPSBfdHJfdGFsbHkocywgZGlzdGFuY2UsIGxlbmd0aCkKKyNlbmRpZgorCisjZW5kaWYgLyogREVGTEFURV9IICovCmRpZmYgLS1naXQgYS96bGliLTEuMi42L2RvYy9hbGdvcml0aG0udHh0IGIvemxpYi0xLjIuNi9kb2MvYWxnb3JpdGhtLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTdmNDk1Ci0tLSAvZGV2L251bGwKKysrIGIvemxpYi0xLjIuNi9kb2MvYWxnb3JpdGhtLnR4dApAQCAtMCwwICsxLDIwOSBAQAorMS4gQ29tcHJlc3Npb24gYWxnb3JpdGhtIChkZWZsYXRlKQorCitUaGUgZGVmbGF0aW9uIGFsZ29yaXRobSB1c2VkIGJ5IGd6aXAgKGFsc28gemlwIGFuZCB6bGliKSBpcyBhIHZhcmlhdGlvbiBvZgorTFo3NyAoTGVtcGVsLVppdiAxOTc3LCBzZWUgcmVmZXJlbmNlIGJlbG93KS4gSXQgZmluZHMgZHVwbGljYXRlZCBzdHJpbmdzIGluCit0aGUgaW5wdXQgZGF0YS4gIFRoZSBzZWNvbmQgb2NjdXJyZW5jZSBvZiBhIHN0cmluZyBpcyByZXBsYWNlZCBieSBhCitwb2ludGVyIHRvIHRoZSBwcmV2aW91cyBzdHJpbmcsIGluIHRoZSBmb3JtIG9mIGEgcGFpciAoZGlzdGFuY2UsCitsZW5ndGgpLiAgRGlzdGFuY2VzIGFyZSBsaW1pdGVkIHRvIDMySyBieXRlcywgYW5kIGxlbmd0aHMgYXJlIGxpbWl0ZWQKK3RvIDI1OCBieXRlcy4gV2hlbiBhIHN0cmluZyBkb2VzIG5vdCBvY2N1ciBhbnl3aGVyZSBpbiB0aGUgcHJldmlvdXMKKzMySyBieXRlcywgaXQgaXMgZW1pdHRlZCBhcyBhIHNlcXVlbmNlIG9mIGxpdGVyYWwgYnl0ZXMuICAoSW4gdGhpcworZGVzY3JpcHRpb24sIGBzdHJpbmcnIG11c3QgYmUgdGFrZW4gYXMgYW4gYXJiaXRyYXJ5IHNlcXVlbmNlIG9mIGJ5dGVzLAorYW5kIGlzIG5vdCByZXN0cmljdGVkIHRvIHByaW50YWJsZSBjaGFyYWN0ZXJzLikKKworTGl0ZXJhbHMgb3IgbWF0Y2ggbGVuZ3RocyBhcmUgY29tcHJlc3NlZCB3aXRoIG9uZSBIdWZmbWFuIHRyZWUsIGFuZAorbWF0Y2ggZGlzdGFuY2VzIGFyZSBjb21wcmVzc2VkIHdpdGggYW5vdGhlciB0cmVlLiBUaGUgdHJlZXMgYXJlIHN0b3JlZAoraW4gYSBjb21wYWN0IGZvcm0gYXQgdGhlIHN0YXJ0IG9mIGVhY2ggYmxvY2suIFRoZSBibG9ja3MgY2FuIGhhdmUgYW55CitzaXplIChleGNlcHQgdGhhdCB0aGUgY29tcHJlc3NlZCBkYXRhIGZvciBvbmUgYmxvY2sgbXVzdCBmaXQgaW4KK2F2YWlsYWJsZSBtZW1vcnkpLiBBIGJsb2NrIGlzIHRlcm1pbmF0ZWQgd2hlbiBkZWZsYXRlKCkgZGV0ZXJtaW5lcyB0aGF0CitpdCB3b3VsZCBiZSB1c2VmdWwgdG8gc3RhcnQgYW5vdGhlciBibG9jayB3aXRoIGZyZXNoIHRyZWVzLiAoVGhpcyBpcworc29tZXdoYXQgc2ltaWxhciB0byB0aGUgYmVoYXZpb3Igb2YgTFpXLWJhc2VkIF9jb21wcmVzc18uKQorCitEdXBsaWNhdGVkIHN0cmluZ3MgYXJlIGZvdW5kIHVzaW5nIGEgaGFzaCB0YWJsZS4gQWxsIGlucHV0IHN0cmluZ3Mgb2YKK2xlbmd0aCAzIGFyZSBpbnNlcnRlZCBpbiB0aGUgaGFzaCB0YWJsZS4gQSBoYXNoIGluZGV4IGlzIGNvbXB1dGVkIGZvcgordGhlIG5leHQgMyBieXRlcy4gSWYgdGhlIGhhc2ggY2hhaW4gZm9yIHRoaXMgaW5kZXggaXMgbm90IGVtcHR5LCBhbGwKK3N0cmluZ3MgaW4gdGhlIGNoYWluIGFyZSBjb21wYXJlZCB3aXRoIHRoZSBjdXJyZW50IGlucHV0IHN0cmluZywgYW5kCit0aGUgbG9uZ2VzdCBtYXRjaCBpcyBzZWxlY3RlZC4KKworVGhlIGhhc2ggY2hhaW5zIGFyZSBzZWFyY2hlZCBzdGFydGluZyB3aXRoIHRoZSBtb3N0IHJlY2VudCBzdHJpbmdzLCB0bworZmF2b3Igc21hbGwgZGlzdGFuY2VzIGFuZCB0aHVzIHRha2UgYWR2YW50YWdlIG9mIHRoZSBIdWZmbWFuIGVuY29kaW5nLgorVGhlIGhhc2ggY2hhaW5zIGFyZSBzaW5nbHkgbGlua2VkLiBUaGVyZSBhcmUgbm8gZGVsZXRpb25zIGZyb20gdGhlCitoYXNoIGNoYWlucywgdGhlIGFsZ29yaXRobSBzaW1wbHkgZGlzY2FyZHMgbWF0Y2hlcyB0aGF0IGFyZSB0b28gb2xkLgorCitUbyBhdm9pZCBhIHdvcnN0LWNhc2Ugc2l0dWF0aW9uLCB2ZXJ5IGxvbmcgaGFzaCBjaGFpbnMgYXJlIGFyYml0cmFyaWx5Cit0cnVuY2F0ZWQgYXQgYSBjZXJ0YWluIGxlbmd0aCwgZGV0ZXJtaW5lZCBieSBhIHJ1bnRpbWUgb3B0aW9uIChsZXZlbAorcGFyYW1ldGVyIG9mIGRlZmxhdGVJbml0KS4gU28gZGVmbGF0ZSgpIGRvZXMgbm90IGFsd2F5cyBmaW5kIHRoZSBsb25nZXN0Citwb3NzaWJsZSBtYXRjaCBidXQgZ2VuZXJhbGx5IGZpbmRzIGEgbWF0Y2ggd2hpY2ggaXMgbG9uZyBlbm91Z2guCisKK2RlZmxhdGUoKSBhbHNvIGRlZmVycyB0aGUgc2VsZWN0aW9uIG9mIG1hdGNoZXMgd2l0aCBhIGxhenkgZXZhbHVhdGlvbgorbWVjaGFuaXNtLiBBZnRlciBhIG1hdGNoIG9mIGxlbmd0aCBOIGhhcyBiZWVuIGZvdW5kLCBkZWZsYXRlKCkgc2VhcmNoZXMgZm9yCithIGxvbmdlciBtYXRjaCBhdCB0aGUgbmV4dCBpbnB1dCBieXRlLiBJZiBhIGxvbmdlciBtYXRjaCBpcyBmb3VuZCwgdGhlCitwcmV2aW91cyBtYXRjaCBpcyB0cnVuY2F0ZWQgdG8gYSBsZW5ndGggb2Ygb25lICh0aHVzIHByb2R1Y2luZyBhIHNpbmdsZQorbGl0ZXJhbCBieXRlKSBhbmQgdGhlIHByb2Nlc3Mgb2YgbGF6eSBldmFsdWF0aW9uIGJlZ2lucyBhZ2Fpbi4gT3RoZXJ3aXNlLAordGhlIG9yaWdpbmFsIG1hdGNoIGlzIGtlcHQsIGFuZCB0aGUgbmV4dCBtYXRjaCBzZWFyY2ggaXMgYXR0ZW1wdGVkIG9ubHkgTgorc3RlcHMgbGF0ZXIuCisKK1RoZSBsYXp5IG1hdGNoIGV2YWx1YXRpb24gaXMgYWxzbyBzdWJqZWN0IHRvIGEgcnVudGltZSBwYXJhbWV0ZXIuIElmCit0aGUgY3VycmVudCBtYXRjaCBpcyBsb25nIGVub3VnaCwgZGVmbGF0ZSgpIHJlZHVjZXMgdGhlIHNlYXJjaCBmb3IgYSBsb25nZXIKK21hdGNoLCB0aHVzIHNwZWVkaW5nIHVwIHRoZSB3aG9sZSBwcm9jZXNzLiBJZiBjb21wcmVzc2lvbiByYXRpbyBpcyBtb3JlCitpbXBvcnRhbnQgdGhhbiBzcGVlZCwgZGVmbGF0ZSgpIGF0dGVtcHRzIGEgY29tcGxldGUgc2Vjb25kIHNlYXJjaCBldmVuIGlmCit0aGUgZmlyc3QgbWF0Y2ggaXMgYWxyZWFkeSBsb25nIGVub3VnaC4KKworVGhlIGxhenkgbWF0Y2ggZXZhbHVhdGlvbiBpcyBub3QgcGVyZm9ybWVkIGZvciB0aGUgZmFzdGVzdCBjb21wcmVzc2lvbgorbW9kZXMgKGxldmVsIHBhcmFtZXRlciAxIHRvIDMpLiBGb3IgdGhlc2UgZmFzdCBtb2RlcywgbmV3IHN0cmluZ3MKK2FyZSBpbnNlcnRlZCBpbiB0aGUgaGFzaCB0YWJsZSBvbmx5IHdoZW4gbm8gbWF0Y2ggd2FzIGZvdW5kLCBvcgord2hlbiB0aGUgbWF0Y2ggaXMgbm90IHRvbyBsb25nLiBUaGlzIGRlZ3JhZGVzIHRoZSBjb21wcmVzc2lvbiByYXRpbworYnV0IHNhdmVzIHRpbWUgc2luY2UgdGhlcmUgYXJlIGJvdGggZmV3ZXIgaW5zZXJ0aW9ucyBhbmQgZmV3ZXIgc2VhcmNoZXMuCisKKworMi4gRGVjb21wcmVzc2lvbiBhbGdvcml0aG0gKGluZmxhdGUpCisKKzIuMSBJbnRyb2R1Y3Rpb24KKworVGhlIGtleSBxdWVzdGlvbiBpcyBob3cgdG8gcmVwcmVzZW50IGEgSHVmZm1hbiBjb2RlIChvciBhbnkgcHJlZml4IGNvZGUpIHNvCit0aGF0IHlvdSBjYW4gZGVjb2RlIGZhc3QuICBUaGUgbW9zdCBpbXBvcnRhbnQgY2hhcmFjdGVyaXN0aWMgaXMgdGhhdCBzaG9ydGVyCitjb2RlcyBhcmUgbXVjaCBtb3JlIGNvbW1vbiB0aGFuIGxvbmdlciBjb2Rlcywgc28gcGF5IGF0dGVudGlvbiB0byBkZWNvZGluZyB0aGUKK3Nob3J0IGNvZGVzIGZhc3QsIGFuZCBsZXQgdGhlIGxvbmcgY29kZXMgdGFrZSBsb25nZXIgdG8gZGVjb2RlLgorCitpbmZsYXRlKCkgc2V0cyB1cCBhIGZpcnN0IGxldmVsIHRhYmxlIHRoYXQgY292ZXJzIHNvbWUgbnVtYmVyIG9mIGJpdHMgb2YKK2lucHV0IGxlc3MgdGhhbiB0aGUgbGVuZ3RoIG9mIGxvbmdlc3QgY29kZS4gIEl0IGdldHMgdGhhdCBtYW55IGJpdHMgZnJvbSB0aGUKK3N0cmVhbSwgYW5kIGxvb2tzIGl0IHVwIGluIHRoZSB0YWJsZS4gIFRoZSB0YWJsZSB3aWxsIHRlbGwgaWYgdGhlIG5leHQKK2NvZGUgaXMgdGhhdCBtYW55IGJpdHMgb3IgbGVzcyBhbmQgaG93IG1hbnksIGFuZCBpZiBpdCBpcywgaXQgd2lsbCB0ZWxsCit0aGUgdmFsdWUsIGVsc2UgaXQgd2lsbCBwb2ludCB0byB0aGUgbmV4dCBsZXZlbCB0YWJsZSBmb3Igd2hpY2ggaW5mbGF0ZSgpCitncmFicyBtb3JlIGJpdHMgYW5kIHRyaWVzIHRvIGRlY29kZSBhIGxvbmdlciBjb2RlLgorCitIb3cgbWFueSBiaXRzIHRvIG1ha2UgdGhlIGZpcnN0IGxvb2t1cCBpcyBhIHRyYWRlb2ZmIGJldHdlZW4gdGhlIHRpbWUgaXQKK3Rha2VzIHRvIGRlY29kZSBhbmQgdGhlIHRpbWUgaXQgdGFrZXMgdG8gYnVpbGQgdGhlIHRhYmxlLiAgSWYgYnVpbGRpbmcgdGhlCit0YWJsZSB0b29rIG5vIHRpbWUgKGFuZCBpZiB5b3UgaGFkIGluZmluaXRlIG1lbW9yeSksIHRoZW4gdGhlcmUgd291bGQgb25seQorYmUgYSBmaXJzdCBsZXZlbCB0YWJsZSB0byBjb3ZlciBhbGwgdGhlIHdheSB0byB0aGUgbG9uZ2VzdCBjb2RlLiAgSG93ZXZlciwKK2J1aWxkaW5nIHRoZSB0YWJsZSBlbmRzIHVwIHRha2luZyBhIGxvdCBsb25nZXIgZm9yIG1vcmUgYml0cyBzaW5jZSBzaG9ydAorY29kZXMgYXJlIHJlcGxpY2F0ZWQgbWFueSB0aW1lcyBpbiBzdWNoIGEgdGFibGUuICBXaGF0IGluZmxhdGUoKSBkb2VzIGlzCitzaW1wbHkgdG8gbWFrZSB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIGZpcnN0IHRhYmxlIGEgdmFyaWFibGUsIGFuZCAgdGhlbgordG8gc2V0IHRoYXQgdmFyaWFibGUgZm9yIHRoZSBtYXhpbXVtIHNwZWVkLgorCitGb3IgaW5mbGF0ZSwgd2hpY2ggaGFzIDI4NiBwb3NzaWJsZSBjb2RlcyBmb3IgdGhlIGxpdGVyYWwvbGVuZ3RoIHRyZWUsIHRoZSBzaXplCitvZiB0aGUgZmlyc3QgdGFibGUgaXMgbmluZSBiaXRzLiAgQWxzbyB0aGUgZGlzdGFuY2UgdHJlZXMgaGF2ZSAzMCBwb3NzaWJsZQordmFsdWVzLCBhbmQgdGhlIHNpemUgb2YgdGhlIGZpcnN0IHRhYmxlIGlzIHNpeCBiaXRzLiAgTm90ZSB0aGF0IGZvciBlYWNoIG9mCit0aG9zZSBjYXNlcywgdGhlIHRhYmxlIGVuZGVkIHVwIG9uZSBiaXQgbG9uZ2VyIHRoYW4gdGhlIGBgYXZlcmFnZScnIGNvZGUKK2xlbmd0aCwgaS5lLiB0aGUgY29kZSBsZW5ndGggb2YgYW4gYXBwcm94aW1hdGVseSBmbGF0IGNvZGUgd2hpY2ggd291bGQgYmUgYQorbGl0dGxlIG1vcmUgdGhhbiBlaWdodCBiaXRzIGZvciAyODYgc3ltYm9scyBhbmQgYSBsaXR0bGUgbGVzcyB0aGFuIGZpdmUgYml0cworZm9yIDMwIHN5bWJvbHMuCisKKworMi4yIE1vcmUgZGV0YWlscyBvbiB0aGUgaW5mbGF0ZSB0YWJsZSBsb29rdXAKKworT2ssIHlvdSB3YW50IHRvIGtub3cgd2hhdCB0aGlzIGNsZXZlcmx5IG9iZnVzY2F0ZWQgaW5mbGF0ZSB0cmVlIGFjdHVhbGx5Citsb29rcyBsaWtlLiAgWW91IGFyZSBjb3JyZWN0IHRoYXQgaXQncyBub3QgYSBIdWZmbWFuIHRyZWUuICBJdCBpcyBzaW1wbHkgYQorbG9va3VwIHRhYmxlIGZvciB0aGUgZmlyc3QsIGxldCdzIHNheSwgbmluZSBiaXRzIG9mIGEgSHVmZm1hbiBzeW1ib2wuICBUaGUKK3N5bWJvbCBjb3VsZCBiZSBhcyBzaG9ydCBhcyBvbmUgYml0IG9yIGFzIGxvbmcgYXMgMTUgYml0cy4gIElmIGEgcGFydGljdWxhcgorc3ltYm9sIGlzIHNob3J0ZXIgdGhhbiBuaW5lIGJpdHMsIHRoZW4gdGhhdCBzeW1ib2wncyB0cmFuc2xhdGlvbiBpcyBkdXBsaWNhdGVkCitpbiBhbGwgdGhvc2UgZW50cmllcyB0aGF0IHN0YXJ0IHdpdGggdGhhdCBzeW1ib2wncyBiaXRzLiAgRm9yIGV4YW1wbGUsIGlmIHRoZQorc3ltYm9sIGlzIGZvdXIgYml0cywgdGhlbiBpdCdzIGR1cGxpY2F0ZWQgMzIgdGltZXMgaW4gYSBuaW5lLWJpdCB0YWJsZS4gIElmIGEKK3N5bWJvbCBpcyBuaW5lIGJpdHMgbG9uZywgaXQgYXBwZWFycyBpbiB0aGUgdGFibGUgb25jZS4KKworSWYgdGhlIHN5bWJvbCBpcyBsb25nZXIgdGhhbiBuaW5lIGJpdHMsIHRoZW4gdGhhdCBlbnRyeSBpbiB0aGUgdGFibGUgcG9pbnRzCit0byBhbm90aGVyIHNpbWlsYXIgdGFibGUgZm9yIHRoZSByZW1haW5pbmcgYml0cy4gIEFnYWluLCB0aGVyZSBhcmUgZHVwbGljYXRlZAorZW50cmllcyBhcyBuZWVkZWQuICBUaGUgaWRlYSBpcyB0aGF0IG1vc3Qgb2YgdGhlIHRpbWUgdGhlIHN5bWJvbCB3aWxsIGJlIHNob3J0CithbmQgdGhlcmUgd2lsbCBvbmx5IGJlIG9uZSB0YWJsZSBsb29rIHVwLiAgKFRoYXQncyB3aG9sZSBpZGVhIGJlaGluZCBkYXRhCitjb21wcmVzc2lvbiBpbiB0aGUgZmlyc3QgcGxhY2UuKSAgRm9yIHRoZSBsZXNzIGZyZXF1ZW50IGxvbmcgc3ltYm9scywgdGhlcmUKK3dpbGwgYmUgdHdvIGxvb2t1cHMuICBJZiB5b3UgaGFkIGEgY29tcHJlc3Npb24gbWV0aG9kIHdpdGggcmVhbGx5IGxvbmcKK3N5bWJvbHMsIHlvdSBjb3VsZCBoYXZlIGFzIG1hbnkgbGV2ZWxzIG9mIGxvb2t1cHMgYXMgaXMgZWZmaWNpZW50LiAgRm9yCitpbmZsYXRlLCB0d28gaXMgZW5vdWdoLgorCitTbyBhIHRhYmxlIGVudHJ5IGVpdGhlciBwb2ludHMgdG8gYW5vdGhlciB0YWJsZSAoaW4gd2hpY2ggY2FzZSBuaW5lIGJpdHMgaW4KK3RoZSBhYm92ZSBleGFtcGxlIGFyZSBnb2JibGVkKSwgb3IgaXQgY29udGFpbnMgdGhlIHRyYW5zbGF0aW9uIGZvciB0aGUgc3ltYm9sCithbmQgdGhlIG51bWJlciBvZiBiaXRzIHRvIGdvYmJsZS4gIFRoZW4geW91IHN0YXJ0IGFnYWluIHdpdGggdGhlIG5leHQKK3VuZ29iYmxlZCBiaXQuCisKK1lvdSBtYXkgd29uZGVyOiB3aHkgbm90IGp1c3QgaGF2ZSBvbmUgbG9va3VwIHRhYmxlIGZvciBob3cgZXZlciBtYW55IGJpdHMgdGhlCitsb25nZXN0IHN5bWJvbCBpcz8gIFRoZSByZWFzb24gaXMgdGhhdCBpZiB5b3UgZG8gdGhhdCwgeW91IGVuZCB1cCBzcGVuZGluZworbW9yZSB0aW1lIGZpbGxpbmcgaW4gZHVwbGljYXRlIHN5bWJvbCBlbnRyaWVzIHRoYW4geW91IGRvIGFjdHVhbGx5IGRlY29kaW5nLgorQXQgbGVhc3QgZm9yIGRlZmxhdGUncyBvdXRwdXQgdGhhdCBnZW5lcmF0ZXMgbmV3IHRyZWVzIGV2ZXJ5IHNldmVyYWwgMTAncyBvZgora2J5dGVzLiAgWW91IGNhbiBpbWFnaW5lIHRoYXQgZmlsbGluZyBpbiBhIDJeMTUgZW50cnkgdGFibGUgZm9yIGEgMTUtYml0IGNvZGUKK3dvdWxkIHRha2UgdG9vIGxvbmcgaWYgeW91J3JlIG9ubHkgZGVjb2Rpbmcgc2V2ZXJhbCB0aG91c2FuZCBzeW1ib2xzLiAgQXQgdGhlCitvdGhlciBleHRyZW1lLCB5b3UgY291bGQgbWFrZSBhIG5ldyB0YWJsZSBmb3IgZXZlcnkgYml0IGluIHRoZSBjb2RlLiAgSW4gZmFjdCwKK3RoYXQncyBlc3NlbnRpYWxseSBhIEh1ZmZtYW4gdHJlZS4gIEJ1dCB0aGVuIHlvdSBzcGVuZCB0b28gbXVjaCB0aW1lCit0cmF2ZXJzaW5nIHRoZSB0cmVlIHdoaWxlIGRlY29kaW5nLCBldmVuIGZvciBzaG9ydCBzeW1ib2xzLgorCitTbyB0aGUgbnVtYmVyIG9mIGJpdHMgZm9yIHRoZSBmaXJzdCBsb29rdXAgdGFibGUgaXMgYSB0cmFkZSBvZiB0aGUgdGltZSB0bworZmlsbCBvdXQgdGhlIHRhYmxlIHZzLiB0aGUgdGltZSBzcGVudCBsb29raW5nIGF0IHRoZSBzZWNvbmQgbGV2ZWwgYW5kIGFib3ZlIG9mCit0aGUgdGFibGUuCisKK0hlcmUgaXMgYW4gZXhhbXBsZSwgc2NhbGVkIGRvd246CisKK1RoZSBjb2RlIGJlaW5nIGRlY29kZWQsIHdpdGggMTAgc3ltYm9scywgZnJvbSAxIHRvIDYgYml0cyBsb25nOgorCitBOiAwCitCOiAxMAorQzogMTEwMAorRDogMTEwMTAKK0U6IDExMDExCitGOiAxMTEwMAorRzogMTExMDEKK0g6IDExMTEwCitJOiAxMTExMTAKK0o6IDExMTExMQorCitMZXQncyBtYWtlIHRoZSBmaXJzdCB0YWJsZSB0aHJlZSBiaXRzIGxvbmcgKGVpZ2h0IGVudHJpZXMpOgorCiswMDA6IEEsMQorMDAxOiBBLDEKKzAxMDogQSwxCiswMTE6IEEsMQorMTAwOiBCLDIKKzEwMTogQiwyCisxMTA6IC0+IHRhYmxlIFggKGdvYmJsZSAzIGJpdHMpCisxMTE6IC0+IHRhYmxlIFkgKGdvYmJsZSAzIGJpdHMpCisKK0VhY2ggZW50cnkgaXMgd2hhdCB0aGUgYml0cyBkZWNvZGUgYXMgYW5kIGhvdyBtYW55IGJpdHMgdGhhdCBpcywgaS5lLiBob3cKK21hbnkgYml0cyB0byBnb2JibGUuICBPciB0aGUgZW50cnkgcG9pbnRzIHRvIGFub3RoZXIgdGFibGUsIHdpdGggdGhlIG51bWJlciBvZgorYml0cyB0byBnb2JibGUgaW1wbGljaXQgaW4gdGhlIHNpemUgb2YgdGhlIHRhYmxlLgorCitUYWJsZSBYIGlzIHR3byBiaXRzIGxvbmcgc2luY2UgdGhlIGxvbmdlc3QgY29kZSBzdGFydGluZyB3aXRoIDExMCBpcyBmaXZlIGJpdHMKK2xvbmc6CisKKzAwOiBDLDEKKzAxOiBDLDEKKzEwOiBELDIKKzExOiBFLDIKKworVGFibGUgWSBpcyB0aHJlZSBiaXRzIGxvbmcgc2luY2UgdGhlIGxvbmdlc3QgY29kZSBzdGFydGluZyB3aXRoIDExMSBpcyBzaXgKK2JpdHMgbG9uZzoKKworMDAwOiBGLDIKKzAwMTogRiwyCiswMTA6IEcsMgorMDExOiBHLDIKKzEwMDogSCwyCisxMDE6IEgsMgorMTEwOiBJLDMKKzExMTogSiwzCisKK1NvIHdoYXQgd2UgaGF2ZSBoZXJlIGFyZSB0aHJlZSB0YWJsZXMgd2l0aCBhIHRvdGFsIG9mIDIwIGVudHJpZXMgdGhhdCBoYWQgdG8KK2JlIGNvbnN0cnVjdGVkLiAgVGhhdCdzIGNvbXBhcmVkIHRvIDY0IGVudHJpZXMgZm9yIGEgc2luZ2xlIHRhYmxlLiAgT3IKK2NvbXBhcmVkIHRvIDE2IGVudHJpZXMgZm9yIGEgSHVmZm1hbiB0cmVlIChzaXggdHdvIGVudHJ5IHRhYmxlcyBhbmQgb25lIGZvdXIKK2VudHJ5IHRhYmxlKS4gIEFzc3VtaW5nIHRoYXQgdGhlIGNvZGUgaWRlYWxseSByZXByZXNlbnRzIHRoZSBwcm9iYWJpbGl0eSBvZgordGhlIHN5bWJvbHMsIGl0IHRha2VzIG9uIHRoZSBhdmVyYWdlIDEuMjUgbG9va3VwcyBwZXIgc3ltYm9sLiAgVGhhdCdzIGNvbXBhcmVkCit0byBvbmUgbG9va3VwIGZvciB0aGUgc2luZ2xlIHRhYmxlLCBvciAxLjY2IGxvb2t1cHMgcGVyIHN5bWJvbCBmb3IgdGhlCitIdWZmbWFuIHRyZWUuCisKK1RoZXJlLCBJIHRoaW5rIHRoYXQgZ2l2ZXMgeW91IGEgcGljdHVyZSBvZiB3aGF0J3MgZ29pbmcgb24uICBGb3IgaW5mbGF0ZSwgdGhlCittZWFuaW5nIG9mIGEgcGFydGljdWxhciBzeW1ib2wgaXMgb2Z0ZW4gbW9yZSB0aGFuIGp1c3QgYSBsZXR0ZXIuICBJdCBjYW4gYmUgYQorYnl0ZSAoYSAibGl0ZXJhbCIpLCBvciBpdCBjYW4gYmUgZWl0aGVyIGEgbGVuZ3RoIG9yIGEgZGlzdGFuY2Ugd2hpY2gKK2luZGljYXRlcyBhIGJhc2UgdmFsdWUgYW5kIGEgbnVtYmVyIG9mIGJpdHMgdG8gZmV0Y2ggYWZ0ZXIgdGhlIGNvZGUgdGhhdCBpcworYWRkZWQgdG8gdGhlIGJhc2UgdmFsdWUuICBPciBpdCBtaWdodCBiZSB0aGUgc3BlY2lhbCBlbmQtb2YtYmxvY2sgY29kZS4gIFRoZQorZGF0YSBzdHJ1Y3R1cmVzIGNyZWF0ZWQgaW4gaW5mdHJlZXMuYyB0cnkgdG8gZW5jb2RlIGFsbCB0aGF0IGluZm9ybWF0aW9uCitjb21wYWN0bHkgaW4gdGhlIHRhYmxlcy4KKworCitKZWFuLWxvdXAgR2FpbGx5ICAgICAgICBNYXJrIEFkbGVyCitqbG91cEBnemlwLm9yZyAgICAgICAgICBtYWRsZXJAYWx1bW5pLmNhbHRlY2guZWR1CisKKworUmVmZXJlbmNlczoKKworW0xaNzddIFppdiBKLiwgTGVtcGVsIEEuLCBgYEEgVW5pdmVyc2FsIEFsZ29yaXRobSBmb3IgU2VxdWVudGlhbCBEYXRhCitDb21wcmVzc2lvbiwnJyBJRUVFIFRyYW5zYWN0aW9ucyBvbiBJbmZvcm1hdGlvbiBUaGVvcnksIFZvbC4gMjMsIE5vLiAzLAorcHAuIDMzNy0zNDMuCisKK2BgREVGTEFURSBDb21wcmVzc2VkIERhdGEgRm9ybWF0IFNwZWNpZmljYXRpb24nJyBhdmFpbGFibGUgaW4KK2h0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzE5NTEKZGlmZiAtLWdpdCBhL3psaWItMS4yLjYvZG9jL3JmYzE5NTAudHh0IGIvemxpYi0xLjIuNi9kb2MvcmZjMTk1MC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U2NDI4YQotLS0gL2Rldi9udWxsCisrKyBiL3psaWItMS4yLjYvZG9jL3JmYzE5NTAudHh0CkBAIC0wLDAgKzEsNjE5IEBACisKKworCisKKworCitOZXR3b3JrIFdvcmtpbmcgR3JvdXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFAuIERldXRzY2gKK1JlcXVlc3QgZm9yIENvbW1lbnRzOiAxOTUwICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxhZGRpbiBFbnRlcnByaXNlcworQ2F0ZWdvcnk6IEluZm9ybWF0aW9uYWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEotTC4gR2FpbGx5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5mby1aSVAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXkgMTk5NgorCisKKyAgICAgICAgIFpMSUIgQ29tcHJlc3NlZCBEYXRhIEZvcm1hdCBTcGVjaWZpY2F0aW9uIHZlcnNpb24gMy4zCisKK1N0YXR1cyBvZiBUaGlzIE1lbW8KKworICAgVGhpcyBtZW1vIHByb3ZpZGVzIGluZm9ybWF0aW9uIGZvciB0aGUgSW50ZXJuZXQgY29tbXVuaXR5LiAgVGhpcyBtZW1vCisgICBkb2VzIG5vdCBzcGVjaWZ5IGFuIEludGVybmV0IHN0YW5kYXJkIG9mIGFueSBraW5kLiAgRGlzdHJpYnV0aW9uIG9mCisgICB0aGlzIG1lbW8gaXMgdW5saW1pdGVkLgorCitJRVNHIE5vdGU6CisKKyAgIFRoZSBJRVNHIHRha2VzIG5vIHBvc2l0aW9uIG9uIHRoZSB2YWxpZGl0eSBvZiBhbnkgSW50ZWxsZWN0dWFsCisgICBQcm9wZXJ0eSBSaWdodHMgc3RhdGVtZW50cyBjb250YWluZWQgaW4gdGhpcyBkb2N1bWVudC4KKworTm90aWNlcworCisgICBDb3B5cmlnaHQgKGMpIDE5OTYgTC4gUGV0ZXIgRGV1dHNjaCBhbmQgSmVhbi1Mb3VwIEdhaWxseQorCisgICBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGlzIGRvY3VtZW50IGZvciBhbnkKKyAgIHB1cnBvc2UgYW5kIHdpdGhvdXQgY2hhcmdlLCBpbmNsdWRpbmcgdHJhbnNsYXRpb25zIGludG8gb3RoZXIKKyAgIGxhbmd1YWdlcyBhbmQgaW5jb3Jwb3JhdGlvbiBpbnRvIGNvbXBpbGF0aW9ucywgcHJvdmlkZWQgdGhhdCB0aGUKKyAgIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgbm90aWNlIGFyZSBwcmVzZXJ2ZWQsIGFuZCB0aGF0IGFueQorICAgc3Vic3RhbnRpdmUgY2hhbmdlcyBvciBkZWxldGlvbnMgZnJvbSB0aGUgb3JpZ2luYWwgYXJlIGNsZWFybHkKKyAgIG1hcmtlZC4KKworICAgQSBwb2ludGVyIHRvIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGlzIGFuZCByZWxhdGVkIGRvY3VtZW50YXRpb24gaW4KKyAgIEhUTUwgZm9ybWF0IGNhbiBiZSBmb3VuZCBhdCB0aGUgVVJMCisgICA8ZnRwOi8vZnRwLnV1Lm5ldC9ncmFwaGljcy9wbmcvZG9jdW1lbnRzL3psaWIvemRvYy1pbmRleC5odG1sPi4KKworQWJzdHJhY3QKKworICAgVGhpcyBzcGVjaWZpY2F0aW9uIGRlZmluZXMgYSBsb3NzbGVzcyBjb21wcmVzc2VkIGRhdGEgZm9ybWF0LiAgVGhlCisgICBkYXRhIGNhbiBiZSBwcm9kdWNlZCBvciBjb25zdW1lZCwgZXZlbiBmb3IgYW4gYXJiaXRyYXJpbHkgbG9uZworICAgc2VxdWVudGlhbGx5IHByZXNlbnRlZCBpbnB1dCBkYXRhIHN0cmVhbSwgdXNpbmcgb25seSBhbiBhIHByaW9yaQorICAgYm91bmRlZCBhbW91bnQgb2YgaW50ZXJtZWRpYXRlIHN0b3JhZ2UuICBUaGUgZm9ybWF0IHByZXNlbnRseSB1c2VzCisgICB0aGUgREVGTEFURSBjb21wcmVzc2lvbiBtZXRob2QgYnV0IGNhbiBiZSBlYXNpbHkgZXh0ZW5kZWQgdG8gdXNlCisgICBvdGhlciBjb21wcmVzc2lvbiBtZXRob2RzLiAgSXQgY2FuIGJlIGltcGxlbWVudGVkIHJlYWRpbHkgaW4gYSBtYW5uZXIKKyAgIG5vdCBjb3ZlcmVkIGJ5IHBhdGVudHMuICBUaGlzIHNwZWNpZmljYXRpb24gYWxzbyBkZWZpbmVzIHRoZSBBRExFUi0zMgorICAgY2hlY2tzdW0gKGFuIGV4dGVuc2lvbiBhbmQgaW1wcm92ZW1lbnQgb2YgdGhlIEZsZXRjaGVyIGNoZWNrc3VtKSwKKyAgIHVzZWQgZm9yIGRldGVjdGlvbiBvZiBkYXRhIGNvcnJ1cHRpb24sIGFuZCBwcm92aWRlcyBhbiBhbGdvcml0aG0gZm9yCisgICBjb21wdXRpbmcgaXQuCisKKworCisKK0RldXRzY2ggJiBHYWlsbHkgICAgICAgICAgICAgSW5mb3JtYXRpb25hbCAgICAgICAgICAgICAgICAgICAgICBbUGFnZSAxXQorDAorUkZDIDE5NTAgICAgICAgWkxJQiBDb21wcmVzc2VkIERhdGEgRm9ybWF0IFNwZWNpZmljYXRpb24gICAgICAgIE1heSAxOTk2CisKKworVGFibGUgb2YgQ29udGVudHMKKworICAgMS4gSW50cm9kdWN0aW9uIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAyCisgICAgICAxLjEuIFB1cnBvc2UgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIDIKKyAgICAgIDEuMi4gSW50ZW5kZWQgYXVkaWVuY2UgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gMworICAgICAgMS4zLiBTY29wZSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAzCisgICAgICAxLjQuIENvbXBsaWFuY2UgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIDMKKyAgICAgIDEuNS4gIERlZmluaXRpb25zIG9mIHRlcm1zIGFuZCBjb252ZW50aW9ucyB1c2VkIC4uLi4uLi4uLi4uLi4uLi4gMworICAgICAgMS42LiBDaGFuZ2VzIGZyb20gcHJldmlvdXMgdmVyc2lvbnMgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAzCisgICAyLiBEZXRhaWxlZCBzcGVjaWZpY2F0aW9uIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIDMKKyAgICAgIDIuMS4gT3ZlcmFsbCBjb252ZW50aW9ucyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gMworICAgICAgMi4yLiBEYXRhIGZvcm1hdCAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiA0CisgICAgICAyLjMuIENvbXBsaWFuY2UgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIDcKKyAgIDMuIFJlZmVyZW5jZXMgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gNworICAgNC4gU291cmNlIGNvZGUgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiA4CisgICA1LiBTZWN1cml0eSBDb25zaWRlcmF0aW9ucyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIDgKKyAgIDYuIEFja25vd2xlZGdlbWVudHMgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gOAorICAgNy4gQXV0aG9ycycgQWRkcmVzc2VzIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiA4CisgICA4LiBBcHBlbmRpeDogUmF0aW9uYWxlIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIDkKKyAgIDkuIEFwcGVuZGl4OiBTYW1wbGUgY29kZSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4xMAorCisxLiBJbnRyb2R1Y3Rpb24KKworICAgMS4xLiBQdXJwb3NlCisKKyAgICAgIFRoZSBwdXJwb3NlIG9mIHRoaXMgc3BlY2lmaWNhdGlvbiBpcyB0byBkZWZpbmUgYSBsb3NzbGVzcworICAgICAgY29tcHJlc3NlZCBkYXRhIGZvcm1hdCB0aGF0OgorCisgICAgICAgICAgKiBJcyBpbmRlcGVuZGVudCBvZiBDUFUgdHlwZSwgb3BlcmF0aW5nIHN5c3RlbSwgZmlsZSBzeXN0ZW0sCisgICAgICAgICAgICBhbmQgY2hhcmFjdGVyIHNldCwgYW5kIGhlbmNlIGNhbiBiZSB1c2VkIGZvciBpbnRlcmNoYW5nZTsKKworICAgICAgICAgICogQ2FuIGJlIHByb2R1Y2VkIG9yIGNvbnN1bWVkLCBldmVuIGZvciBhbiBhcmJpdHJhcmlseSBsb25nCisgICAgICAgICAgICBzZXF1ZW50aWFsbHkgcHJlc2VudGVkIGlucHV0IGRhdGEgc3RyZWFtLCB1c2luZyBvbmx5IGFuIGEKKyAgICAgICAgICAgIHByaW9yaSBib3VuZGVkIGFtb3VudCBvZiBpbnRlcm1lZGlhdGUgc3RvcmFnZSwgYW5kIGhlbmNlIGNhbgorICAgICAgICAgICAgYmUgdXNlZCBpbiBkYXRhIGNvbW11bmljYXRpb25zIG9yIHNpbWlsYXIgc3RydWN0dXJlcyBzdWNoIGFzCisgICAgICAgICAgICBVbml4IGZpbHRlcnM7CisKKyAgICAgICAgICAqIENhbiB1c2UgYSBudW1iZXIgb2YgZGlmZmVyZW50IGNvbXByZXNzaW9uIG1ldGhvZHM7CisKKyAgICAgICAgICAqIENhbiBiZSBpbXBsZW1lbnRlZCByZWFkaWx5IGluIGEgbWFubmVyIG5vdCBjb3ZlcmVkIGJ5CisgICAgICAgICAgICBwYXRlbnRzLCBhbmQgaGVuY2UgY2FuIGJlIHByYWN0aWNlZCBmcmVlbHkuCisKKyAgICAgIFRoZSBkYXRhIGZvcm1hdCBkZWZpbmVkIGJ5IHRoaXMgc3BlY2lmaWNhdGlvbiBkb2VzIG5vdCBhdHRlbXB0IHRvCisgICAgICBhbGxvdyByYW5kb20gYWNjZXNzIHRvIGNvbXByZXNzZWQgZGF0YS4KKworCisKKworCisKKworRGV1dHNjaCAmIEdhaWxseSAgICAgICAgICAgICBJbmZvcm1hdGlvbmFsICAgICAgICAgICAgICAgICAgICAgIFtQYWdlIDJdCisMCitSRkMgMTk1MCAgICAgICBaTElCIENvbXByZXNzZWQgRGF0YSBGb3JtYXQgU3BlY2lmaWNhdGlvbiAgICAgICAgTWF5IDE5OTYKKworCisgICAxLjIuIEludGVuZGVkIGF1ZGllbmNlCisKKyAgICAgIFRoaXMgc3BlY2lmaWNhdGlvbiBpcyBpbnRlbmRlZCBmb3IgdXNlIGJ5IGltcGxlbWVudG9ycyBvZiBzb2Z0d2FyZQorICAgICAgdG8gY29tcHJlc3MgZGF0YSBpbnRvIHpsaWIgZm9ybWF0IGFuZC9vciBkZWNvbXByZXNzIGRhdGEgZnJvbSB6bGliCisgICAgICBmb3JtYXQuCisKKyAgICAgIFRoZSB0ZXh0IG9mIHRoZSBzcGVjaWZpY2F0aW9uIGFzc3VtZXMgYSBiYXNpYyBiYWNrZ3JvdW5kIGluCisgICAgICBwcm9ncmFtbWluZyBhdCB0aGUgbGV2ZWwgb2YgYml0cyBhbmQgb3RoZXIgcHJpbWl0aXZlIGRhdGEKKyAgICAgIHJlcHJlc2VudGF0aW9ucy4KKworICAgMS4zLiBTY29wZQorCisgICAgICBUaGUgc3BlY2lmaWNhdGlvbiBzcGVjaWZpZXMgYSBjb21wcmVzc2VkIGRhdGEgZm9ybWF0IHRoYXQgY2FuIGJlCisgICAgICB1c2VkIGZvciBpbi1tZW1vcnkgY29tcHJlc3Npb24gb2YgYSBzZXF1ZW5jZSBvZiBhcmJpdHJhcnkgYnl0ZXMuCisKKyAgIDEuNC4gQ29tcGxpYW5jZQorCisgICAgICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgYSBjb21wbGlhbnQgZGVjb21wcmVzc29yIG11c3QgYmUKKyAgICAgIGFibGUgdG8gYWNjZXB0IGFuZCBkZWNvbXByZXNzIGFueSBkYXRhIHNldCB0aGF0IGNvbmZvcm1zIHRvIGFsbAorICAgICAgdGhlIHNwZWNpZmljYXRpb25zIHByZXNlbnRlZCBoZXJlOyBhIGNvbXBsaWFudCBjb21wcmVzc29yIG11c3QKKyAgICAgIHByb2R1Y2UgZGF0YSBzZXRzIHRoYXQgY29uZm9ybSB0byBhbGwgdGhlIHNwZWNpZmljYXRpb25zIHByZXNlbnRlZAorICAgICAgaGVyZS4KKworICAgMS41LiAgRGVmaW5pdGlvbnMgb2YgdGVybXMgYW5kIGNvbnZlbnRpb25zIHVzZWQKKworICAgICAgYnl0ZTogOCBiaXRzIHN0b3JlZCBvciB0cmFuc21pdHRlZCBhcyBhIHVuaXQgKHNhbWUgYXMgYW4gb2N0ZXQpLgorICAgICAgKEZvciB0aGlzIHNwZWNpZmljYXRpb24sIGEgYnl0ZSBpcyBleGFjdGx5IDggYml0cywgZXZlbiBvbgorICAgICAgbWFjaGluZXMgd2hpY2ggc3RvcmUgYSBjaGFyYWN0ZXIgb24gYSBudW1iZXIgb2YgYml0cyBkaWZmZXJlbnQKKyAgICAgIGZyb20gOC4pIFNlZSBiZWxvdywgZm9yIHRoZSBudW1iZXJpbmcgb2YgYml0cyB3aXRoaW4gYSBieXRlLgorCisgICAxLjYuIENoYW5nZXMgZnJvbSBwcmV2aW91cyB2ZXJzaW9ucworCisgICAgICBWZXJzaW9uIDMuMSB3YXMgdGhlIGZpcnN0IHB1YmxpYyByZWxlYXNlIG9mIHRoaXMgc3BlY2lmaWNhdGlvbi4KKyAgICAgIEluIHZlcnNpb24gMy4yLCBzb21lIHRlcm1pbm9sb2d5IHdhcyBjaGFuZ2VkIGFuZCB0aGUgQWRsZXItMzIKKyAgICAgIHNhbXBsZSBjb2RlIHdhcyByZXdyaXR0ZW4gZm9yIGNsYXJpdHkuICBJbiB2ZXJzaW9uIDMuMywgdGhlCisgICAgICBzdXBwb3J0IGZvciBhIHByZXNldCBkaWN0aW9uYXJ5IHdhcyBpbnRyb2R1Y2VkLCBhbmQgdGhlCisgICAgICBzcGVjaWZpY2F0aW9uIHdhcyBjb252ZXJ0ZWQgdG8gUkZDIHN0eWxlLgorCisyLiBEZXRhaWxlZCBzcGVjaWZpY2F0aW9uCisKKyAgIDIuMS4gT3ZlcmFsbCBjb252ZW50aW9ucworCisgICAgICBJbiB0aGUgZGlhZ3JhbXMgYmVsb3csIGEgYm94IGxpa2UgdGhpczoKKworICAgICAgICAgKy0tLSsKKyAgICAgICAgIHwgICB8IDwtLSB0aGUgdmVydGljYWwgYmFycyBtaWdodCBiZSBtaXNzaW5nCisgICAgICAgICArLS0tKworCisKKworCitEZXV0c2NoICYgR2FpbGx5ICAgICAgICAgICAgIEluZm9ybWF0aW9uYWwgICAgICAgICAgICAgICAgICAgICAgW1BhZ2UgM10KKwwKK1JGQyAxOTUwICAgICAgIFpMSUIgQ29tcHJlc3NlZCBEYXRhIEZvcm1hdCBTcGVjaWZpY2F0aW9uICAgICAgICBNYXkgMTk5NgorCisKKyAgICAgIHJlcHJlc2VudHMgb25lIGJ5dGU7IGEgYm94IGxpa2UgdGhpczoKKworICAgICAgICAgKz09PT09PT09PT09PT09KworICAgICAgICAgfCAgICAgICAgICAgICAgfAorICAgICAgICAgKz09PT09PT09PT09PT09KworCisgICAgICByZXByZXNlbnRzIGEgdmFyaWFibGUgbnVtYmVyIG9mIGJ5dGVzLgorCisgICAgICBCeXRlcyBzdG9yZWQgd2l0aGluIGEgY29tcHV0ZXIgZG8gbm90IGhhdmUgYSAiYml0IG9yZGVyIiwgc2luY2UKKyAgICAgIHRoZXkgYXJlIGFsd2F5cyB0cmVhdGVkIGFzIGEgdW5pdC4gIEhvd2V2ZXIsIGEgYnl0ZSBjb25zaWRlcmVkIGFzCisgICAgICBhbiBpbnRlZ2VyIGJldHdlZW4gMCBhbmQgMjU1IGRvZXMgaGF2ZSBhIG1vc3QtIGFuZCBsZWFzdC0KKyAgICAgIHNpZ25pZmljYW50IGJpdCwgYW5kIHNpbmNlIHdlIHdyaXRlIG51bWJlcnMgd2l0aCB0aGUgbW9zdC0KKyAgICAgIHNpZ25pZmljYW50IGRpZ2l0IG9uIHRoZSBsZWZ0LCB3ZSBhbHNvIHdyaXRlIGJ5dGVzIHdpdGggdGhlIG1vc3QtCisgICAgICBzaWduaWZpY2FudCBiaXQgb24gdGhlIGxlZnQuICBJbiB0aGUgZGlhZ3JhbXMgYmVsb3csIHdlIG51bWJlciB0aGUKKyAgICAgIGJpdHMgb2YgYSBieXRlIHNvIHRoYXQgYml0IDAgaXMgdGhlIGxlYXN0LXNpZ25pZmljYW50IGJpdCwgaS5lLiwKKyAgICAgIHRoZSBiaXRzIGFyZSBudW1iZXJlZDoKKworICAgICAgICAgKy0tLS0tLS0tKworICAgICAgICAgfDc2NTQzMjEwfAorICAgICAgICAgKy0tLS0tLS0tKworCisgICAgICBXaXRoaW4gYSBjb21wdXRlciwgYSBudW1iZXIgbWF5IG9jY3VweSBtdWx0aXBsZSBieXRlcy4gIEFsbAorICAgICAgbXVsdGktYnl0ZSBudW1iZXJzIGluIHRoZSBmb3JtYXQgZGVzY3JpYmVkIGhlcmUgYXJlIHN0b3JlZCB3aXRoCisgICAgICB0aGUgTU9TVC1zaWduaWZpY2FudCBieXRlIGZpcnN0IChhdCB0aGUgbG93ZXIgbWVtb3J5IGFkZHJlc3MpLgorICAgICAgRm9yIGV4YW1wbGUsIHRoZSBkZWNpbWFsIG51bWJlciA1MjAgaXMgc3RvcmVkIGFzOgorCisgICAgICAgICAgICAgMCAgICAgMQorICAgICAgICAgKy0tLS0tLS0tKy0tLS0tLS0tKworICAgICAgICAgfDAwMDAwMDEwfDAwMDAxMDAwfAorICAgICAgICAgKy0tLS0tLS0tKy0tLS0tLS0tKworICAgICAgICAgIF4gICAgICAgIF4KKyAgICAgICAgICB8ICAgICAgICB8CisgICAgICAgICAgfCAgICAgICAgKyBsZXNzIHNpZ25pZmljYW50IGJ5dGUgPSA4CisgICAgICAgICAgKyBtb3JlIHNpZ25pZmljYW50IGJ5dGUgPSAyIHggMjU2CisKKyAgIDIuMi4gRGF0YSBmb3JtYXQKKworICAgICAgQSB6bGliIHN0cmVhbSBoYXMgdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmU6CisKKyAgICAgICAgICAgMCAgIDEKKyAgICAgICAgICstLS0rLS0tKworICAgICAgICAgfENNRnxGTEd8ICAgKG1vcmUtLT4pCisgICAgICAgICArLS0tKy0tLSsKKworCisKKworCisKKworCitEZXV0c2NoICYgR2FpbGx5ICAgICAgICAgICAgIEluZm9ybWF0aW9uYWwgICAgICAgICAgICAgICAgICAgICAgW1BhZ2UgNF0KKwwKK1JGQyAxOTUwICAgICAgIFpMSUIgQ29tcHJlc3NlZCBEYXRhIEZvcm1hdCBTcGVjaWZpY2F0aW9uICAgICAgICBNYXkgMTk5NgorCisKKyAgICAgIChpZiBGTEcuRkRJQ1Qgc2V0KQorCisgICAgICAgICAgIDAgICAxICAgMiAgIDMKKyAgICAgICAgICstLS0rLS0tKy0tLSstLS0rCisgICAgICAgICB8ICAgICBESUNUSUQgICAgfCAgIChtb3JlLS0+KQorICAgICAgICAgKy0tLSstLS0rLS0tKy0tLSsKKworICAgICAgICAgKz09PT09PT09PT09PT09PT09PT09PSstLS0rLS0tKy0tLSstLS0rCisgICAgICAgICB8Li4uY29tcHJlc3NlZCBkYXRhLi4ufCAgICBBRExFUjMyICAgIHwKKyAgICAgICAgICs9PT09PT09PT09PT09PT09PT09PT0rLS0tKy0tLSstLS0rLS0tKworCisgICAgICBBbnkgZGF0YSB3aGljaCBtYXkgYXBwZWFyIGFmdGVyIEFETEVSMzIgYXJlIG5vdCBwYXJ0IG9mIHRoZSB6bGliCisgICAgICBzdHJlYW0uCisKKyAgICAgIENNRiAoQ29tcHJlc3Npb24gTWV0aG9kIGFuZCBmbGFncykKKyAgICAgICAgIFRoaXMgYnl0ZSBpcyBkaXZpZGVkIGludG8gYSA0LWJpdCBjb21wcmVzc2lvbiBtZXRob2QgYW5kIGEgNC0KKyAgICAgICAgIGJpdCBpbmZvcm1hdGlvbiBmaWVsZCBkZXBlbmRpbmcgb24gdGhlIGNvbXByZXNzaW9uIG1ldGhvZC4KKworICAgICAgICAgICAgYml0cyAwIHRvIDMgIENNICAgICBDb21wcmVzc2lvbiBtZXRob2QKKyAgICAgICAgICAgIGJpdHMgNCB0byA3ICBDSU5GTyAgQ29tcHJlc3Npb24gaW5mbworCisgICAgICBDTSAoQ29tcHJlc3Npb24gbWV0aG9kKQorICAgICAgICAgVGhpcyBpZGVudGlmaWVzIHRoZSBjb21wcmVzc2lvbiBtZXRob2QgdXNlZCBpbiB0aGUgZmlsZS4gQ00gPSA4CisgICAgICAgICBkZW5vdGVzIHRoZSAiZGVmbGF0ZSIgY29tcHJlc3Npb24gbWV0aG9kIHdpdGggYSB3aW5kb3cgc2l6ZSB1cAorICAgICAgICAgdG8gMzJLLiAgVGhpcyBpcyB0aGUgbWV0aG9kIHVzZWQgYnkgZ3ppcCBhbmQgUE5HIChzZWUKKyAgICAgICAgIHJlZmVyZW5jZXMgWzFdIGFuZCBbMl0gaW4gQ2hhcHRlciAzLCBiZWxvdywgZm9yIHRoZSByZWZlcmVuY2UKKyAgICAgICAgIGRvY3VtZW50cykuICBDTSA9IDE1IGlzIHJlc2VydmVkLiAgSXQgbWlnaHQgYmUgdXNlZCBpbiBhIGZ1dHVyZQorICAgICAgICAgdmVyc2lvbiBvZiB0aGlzIHNwZWNpZmljYXRpb24gdG8gaW5kaWNhdGUgdGhlIHByZXNlbmNlIG9mIGFuCisgICAgICAgICBleHRyYSBmaWVsZCBiZWZvcmUgdGhlIGNvbXByZXNzZWQgZGF0YS4KKworICAgICAgQ0lORk8gKENvbXByZXNzaW9uIGluZm8pCisgICAgICAgICBGb3IgQ00gPSA4LCBDSU5GTyBpcyB0aGUgYmFzZS0yIGxvZ2FyaXRobSBvZiB0aGUgTFo3NyB3aW5kb3cKKyAgICAgICAgIHNpemUsIG1pbnVzIGVpZ2h0IChDSU5GTz03IGluZGljYXRlcyBhIDMySyB3aW5kb3cgc2l6ZSkuIFZhbHVlcworICAgICAgICAgb2YgQ0lORk8gYWJvdmUgNyBhcmUgbm90IGFsbG93ZWQgaW4gdGhpcyB2ZXJzaW9uIG9mIHRoZQorICAgICAgICAgc3BlY2lmaWNhdGlvbi4gIENJTkZPIGlzIG5vdCBkZWZpbmVkIGluIHRoaXMgc3BlY2lmaWNhdGlvbiBmb3IKKyAgICAgICAgIENNIG5vdCBlcXVhbCB0byA4LgorCisgICAgICBGTEcgKEZMYUdzKQorICAgICAgICAgVGhpcyBmbGFnIGJ5dGUgaXMgZGl2aWRlZCBhcyBmb2xsb3dzOgorCisgICAgICAgICAgICBiaXRzIDAgdG8gNCAgRkNIRUNLICAoY2hlY2sgYml0cyBmb3IgQ01GIGFuZCBGTEcpCisgICAgICAgICAgICBiaXQgIDUgICAgICAgRkRJQ1QgICAocHJlc2V0IGRpY3Rpb25hcnkpCisgICAgICAgICAgICBiaXRzIDYgdG8gNyAgRkxFVkVMICAoY29tcHJlc3Npb24gbGV2ZWwpCisKKyAgICAgICAgIFRoZSBGQ0hFQ0sgdmFsdWUgbXVzdCBiZSBzdWNoIHRoYXQgQ01GIGFuZCBGTEcsIHdoZW4gdmlld2VkIGFzCisgICAgICAgICBhIDE2LWJpdCB1bnNpZ25lZCBpbnRlZ2VyIHN0b3JlZCBpbiBNU0Igb3JkZXIgKENNRioyNTYgKyBGTEcpLAorICAgICAgICAgaXMgYSBtdWx0aXBsZSBvZiAzMS4KKworCisKKworRGV1dHNjaCAmIEdhaWxseSAgICAgICAgICAgICBJbmZvcm1hdGlvbmFsICAgICAgICAgICAgICAgICAgICAgIFtQYWdlIDVdCisMCitSRkMgMTk1MCAgICAgICBaTElCIENvbXByZXNzZWQgRGF0YSBGb3JtYXQgU3BlY2lmaWNhdGlvbiAgICAgICAgTWF5IDE5OTYKKworCisgICAgICBGRElDVCAoUHJlc2V0IGRpY3Rpb25hcnkpCisgICAgICAgICBJZiBGRElDVCBpcyBzZXQsIGEgRElDVCBkaWN0aW9uYXJ5IGlkZW50aWZpZXIgaXMgcHJlc2VudAorICAgICAgICAgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIEZMRyBieXRlLiBUaGUgZGljdGlvbmFyeSBpcyBhIHNlcXVlbmNlIG9mCisgICAgICAgICBieXRlcyB3aGljaCBhcmUgaW5pdGlhbGx5IGZlZCB0byB0aGUgY29tcHJlc3NvciB3aXRob3V0CisgICAgICAgICBwcm9kdWNpbmcgYW55IGNvbXByZXNzZWQgb3V0cHV0LiBESUNUIGlzIHRoZSBBZGxlci0zMiBjaGVja3N1bQorICAgICAgICAgb2YgdGhpcyBzZXF1ZW5jZSBvZiBieXRlcyAoc2VlIHRoZSBkZWZpbml0aW9uIG9mIEFETEVSMzIKKyAgICAgICAgIGJlbG93KS4gIFRoZSBkZWNvbXByZXNzb3IgY2FuIHVzZSB0aGlzIGlkZW50aWZpZXIgdG8gZGV0ZXJtaW5lCisgICAgICAgICB3aGljaCBkaWN0aW9uYXJ5IGhhcyBiZWVuIHVzZWQgYnkgdGhlIGNvbXByZXNzb3IuCisKKyAgICAgIEZMRVZFTCAoQ29tcHJlc3Npb24gbGV2ZWwpCisgICAgICAgICBUaGVzZSBmbGFncyBhcmUgYXZhaWxhYmxlIGZvciB1c2UgYnkgc3BlY2lmaWMgY29tcHJlc3Npb24KKyAgICAgICAgIG1ldGhvZHMuICBUaGUgImRlZmxhdGUiIG1ldGhvZCAoQ00gPSA4KSBzZXRzIHRoZXNlIGZsYWdzIGFzCisgICAgICAgICBmb2xsb3dzOgorCisgICAgICAgICAgICAwIC0gY29tcHJlc3NvciB1c2VkIGZhc3Rlc3QgYWxnb3JpdGhtCisgICAgICAgICAgICAxIC0gY29tcHJlc3NvciB1c2VkIGZhc3QgYWxnb3JpdGhtCisgICAgICAgICAgICAyIC0gY29tcHJlc3NvciB1c2VkIGRlZmF1bHQgYWxnb3JpdGhtCisgICAgICAgICAgICAzIC0gY29tcHJlc3NvciB1c2VkIG1heGltdW0gY29tcHJlc3Npb24sIHNsb3dlc3QgYWxnb3JpdGhtCisKKyAgICAgICAgIFRoZSBpbmZvcm1hdGlvbiBpbiBGTEVWRUwgaXMgbm90IG5lZWRlZCBmb3IgZGVjb21wcmVzc2lvbjsgaXQKKyAgICAgICAgIGlzIHRoZXJlIHRvIGluZGljYXRlIGlmIHJlY29tcHJlc3Npb24gbWlnaHQgYmUgd29ydGh3aGlsZS4KKworICAgICAgY29tcHJlc3NlZCBkYXRhCisgICAgICAgICBGb3IgY29tcHJlc3Npb24gbWV0aG9kIDgsIHRoZSBjb21wcmVzc2VkIGRhdGEgaXMgc3RvcmVkIGluIHRoZQorICAgICAgICAgZGVmbGF0ZSBjb21wcmVzc2VkIGRhdGEgZm9ybWF0IGFzIGRlc2NyaWJlZCBpbiB0aGUgZG9jdW1lbnQKKyAgICAgICAgICJERUZMQVRFIENvbXByZXNzZWQgRGF0YSBGb3JtYXQgU3BlY2lmaWNhdGlvbiIgYnkgTC4gUGV0ZXIKKyAgICAgICAgIERldXRzY2guIChTZWUgcmVmZXJlbmNlIFszXSBpbiBDaGFwdGVyIDMsIGJlbG93KQorCisgICAgICAgICBPdGhlciBjb21wcmVzc2VkIGRhdGEgZm9ybWF0cyBhcmUgbm90IHNwZWNpZmllZCBpbiB0aGlzIHZlcnNpb24KKyAgICAgICAgIG9mIHRoZSB6bGliIHNwZWNpZmljYXRpb24uCisKKyAgICAgIEFETEVSMzIgKEFkbGVyLTMyIGNoZWNrc3VtKQorICAgICAgICAgVGhpcyBjb250YWlucyBhIGNoZWNrc3VtIHZhbHVlIG9mIHRoZSB1bmNvbXByZXNzZWQgZGF0YQorICAgICAgICAgKGV4Y2x1ZGluZyBhbnkgZGljdGlvbmFyeSBkYXRhKSBjb21wdXRlZCBhY2NvcmRpbmcgdG8gQWRsZXItMzIKKyAgICAgICAgIGFsZ29yaXRobS4gVGhpcyBhbGdvcml0aG0gaXMgYSAzMi1iaXQgZXh0ZW5zaW9uIGFuZCBpbXByb3ZlbWVudAorICAgICAgICAgb2YgdGhlIEZsZXRjaGVyIGFsZ29yaXRobSwgdXNlZCBpbiB0aGUgSVRVLVQgWC4yMjQgLyBJU08gODA3MworICAgICAgICAgc3RhbmRhcmQuIFNlZSByZWZlcmVuY2VzIFs0XSBhbmQgWzVdIGluIENoYXB0ZXIgMywgYmVsb3cpCisKKyAgICAgICAgIEFkbGVyLTMyIGlzIGNvbXBvc2VkIG9mIHR3byBzdW1zIGFjY3VtdWxhdGVkIHBlciBieXRlOiBzMSBpcworICAgICAgICAgdGhlIHN1bSBvZiBhbGwgYnl0ZXMsIHMyIGlzIHRoZSBzdW0gb2YgYWxsIHMxIHZhbHVlcy4gQm90aCBzdW1zCisgICAgICAgICBhcmUgZG9uZSBtb2R1bG8gNjU1MjEuIHMxIGlzIGluaXRpYWxpemVkIHRvIDEsIHMyIHRvIHplcm8uICBUaGUKKyAgICAgICAgIEFkbGVyLTMyIGNoZWNrc3VtIGlzIHN0b3JlZCBhcyBzMio2NTUzNiArIHMxIGluIG1vc3QtCisgICAgICAgICBzaWduaWZpY2FudC1ieXRlIGZpcnN0IChuZXR3b3JrKSBvcmRlci4KKworCisKKworCisKKworCitEZXV0c2NoICYgR2FpbGx5ICAgICAgICAgICAgIEluZm9ybWF0aW9uYWwgICAgICAgICAgICAgICAgICAgICAgW1BhZ2UgNl0KKwwKK1JGQyAxOTUwICAgICAgIFpMSUIgQ29tcHJlc3NlZCBEYXRhIEZvcm1hdCBTcGVjaWZpY2F0aW9uICAgICAgICBNYXkgMTk5NgorCisKKyAgIDIuMy4gQ29tcGxpYW5jZQorCisgICAgICBBIGNvbXBsaWFudCBjb21wcmVzc29yIG11c3QgcHJvZHVjZSBzdHJlYW1zIHdpdGggY29ycmVjdCBDTUYsIEZMRworICAgICAgYW5kIEFETEVSMzIsIGJ1dCBuZWVkIG5vdCBzdXBwb3J0IHByZXNldCBkaWN0aW9uYXJpZXMuICBXaGVuIHRoZQorICAgICAgemxpYiBkYXRhIGZvcm1hdCBpcyB1c2VkIGFzIHBhcnQgb2YgYW5vdGhlciBzdGFuZGFyZCBkYXRhIGZvcm1hdCwKKyAgICAgIHRoZSBjb21wcmVzc29yIG1heSB1c2Ugb25seSBwcmVzZXQgZGljdGlvbmFyaWVzIHRoYXQgYXJlIHNwZWNpZmllZAorICAgICAgYnkgdGhpcyBvdGhlciBkYXRhIGZvcm1hdC4gIElmIHRoaXMgb3RoZXIgZm9ybWF0IGRvZXMgbm90IHVzZSB0aGUKKyAgICAgIHByZXNldCBkaWN0aW9uYXJ5IGZlYXR1cmUsIHRoZSBjb21wcmVzc29yIG11c3Qgbm90IHNldCB0aGUgRkRJQ1QKKyAgICAgIGZsYWcuCisKKyAgICAgIEEgY29tcGxpYW50IGRlY29tcHJlc3NvciBtdXN0IGNoZWNrIENNRiwgRkxHLCBhbmQgQURMRVIzMiwgYW5kCisgICAgICBwcm92aWRlIGFuIGVycm9yIGluZGljYXRpb24gaWYgYW55IG9mIHRoZXNlIGhhdmUgaW5jb3JyZWN0IHZhbHVlcy4KKyAgICAgIEEgY29tcGxpYW50IGRlY29tcHJlc3NvciBtdXN0IGdpdmUgYW4gZXJyb3IgaW5kaWNhdGlvbiBpZiBDTSBpcworICAgICAgbm90IG9uZSBvZiB0aGUgdmFsdWVzIGRlZmluZWQgaW4gdGhpcyBzcGVjaWZpY2F0aW9uIChvbmx5IHRoZQorICAgICAgdmFsdWUgOCBpcyBwZXJtaXR0ZWQgaW4gdGhpcyB2ZXJzaW9uKSwgc2luY2UgYW5vdGhlciB2YWx1ZSBjb3VsZAorICAgICAgaW5kaWNhdGUgdGhlIHByZXNlbmNlIG9mIG5ldyBmZWF0dXJlcyB0aGF0IHdvdWxkIGNhdXNlIHN1YnNlcXVlbnQKKyAgICAgIGRhdGEgdG8gYmUgaW50ZXJwcmV0ZWQgaW5jb3JyZWN0bHkuICBBIGNvbXBsaWFudCBkZWNvbXByZXNzb3IgbXVzdAorICAgICAgZ2l2ZSBhbiBlcnJvciBpbmRpY2F0aW9uIGlmIEZESUNUIGlzIHNldCBhbmQgRElDVElEIGlzIG5vdCB0aGUKKyAgICAgIGlkZW50aWZpZXIgb2YgYSBrbm93biBwcmVzZXQgZGljdGlvbmFyeS4gIEEgZGVjb21wcmVzc29yIG1heQorICAgICAgaWdub3JlIEZMRVZFTCBhbmQgc3RpbGwgYmUgY29tcGxpYW50LiAgV2hlbiB0aGUgemxpYiBkYXRhIGZvcm1hdAorICAgICAgaXMgYmVpbmcgdXNlZCBhcyBhIHBhcnQgb2YgYW5vdGhlciBzdGFuZGFyZCBmb3JtYXQsIGEgY29tcGxpYW50CisgICAgICBkZWNvbXByZXNzb3IgbXVzdCBzdXBwb3J0IGFsbCB0aGUgcHJlc2V0IGRpY3Rpb25hcmllcyBzcGVjaWZpZWQgYnkKKyAgICAgIHRoZSBvdGhlciBmb3JtYXQuIFdoZW4gdGhlIG90aGVyIGZvcm1hdCBkb2VzIG5vdCB1c2UgdGhlIHByZXNldAorICAgICAgZGljdGlvbmFyeSBmZWF0dXJlLCBhIGNvbXBsaWFudCBkZWNvbXByZXNzb3IgbXVzdCByZWplY3QgYW55CisgICAgICBzdHJlYW0gaW4gd2hpY2ggdGhlIEZESUNUIGZsYWcgaXMgc2V0LgorCiszLiBSZWZlcmVuY2VzCisKKyAgIFsxXSBEZXV0c2NoLCBMLlAuLCJHWklQIENvbXByZXNzZWQgRGF0YSBGb3JtYXQgU3BlY2lmaWNhdGlvbiIsCisgICAgICAgYXZhaWxhYmxlIGluIGZ0cDovL2Z0cC51dS5uZXQvcHViL2FyY2hpdmluZy96aXAvZG9jLworCisgICBbMl0gVGhvbWFzIEJvdXRlbGwsICJQTkcgKFBvcnRhYmxlIE5ldHdvcmsgR3JhcGhpY3MpIHNwZWNpZmljYXRpb24iLAorICAgICAgIGF2YWlsYWJsZSBpbiBmdHA6Ly9mdHAudXUubmV0L2dyYXBoaWNzL3BuZy9kb2N1bWVudHMvCisKKyAgIFszXSBEZXV0c2NoLCBMLlAuLCJERUZMQVRFIENvbXByZXNzZWQgRGF0YSBGb3JtYXQgU3BlY2lmaWNhdGlvbiIsCisgICAgICAgYXZhaWxhYmxlIGluIGZ0cDovL2Z0cC51dS5uZXQvcHViL2FyY2hpdmluZy96aXAvZG9jLworCisgICBbNF0gRmxldGNoZXIsIEouIEcuLCAiQW4gQXJpdGhtZXRpYyBDaGVja3N1bSBmb3IgU2VyaWFsCisgICAgICAgVHJhbnNtaXNzaW9ucywiIElFRUUgVHJhbnNhY3Rpb25zIG9uIENvbW11bmljYXRpb25zLCBWb2wuIENPTS0zMCwKKyAgICAgICBOby4gMSwgSmFudWFyeSAxOTgyLCBwcC4gMjQ3LTI1Mi4KKworICAgWzVdIElUVS1UIFJlY29tbWVuZGF0aW9uIFguMjI0LCBBbm5leCBELCAiQ2hlY2tzdW0gQWxnb3JpdGhtcywiCisgICAgICAgTm92ZW1iZXIsIDE5OTMsIHBwLiAxNDQsIDE0NS4gKEF2YWlsYWJsZSBmcm9tCisgICAgICAgZ29waGVyOi8vaW5mby5pdHUuY2gpLiBJVFUtVCBYLjI0NCBpcyBhbHNvIHRoZSBzYW1lIGFzIElTTyA4MDczLgorCisKKworCisKKworCitEZXV0c2NoICYgR2FpbGx5ICAgICAgICAgICAgIEluZm9ybWF0aW9uYWwgICAgICAgICAgICAgICAgICAgICAgW1BhZ2UgN10KKwwKK1JGQyAxOTUwICAgICAgIFpMSUIgQ29tcHJlc3NlZCBEYXRhIEZvcm1hdCBTcGVjaWZpY2F0aW9uICAgICAgICBNYXkgMTk5NgorCisKKzQuIFNvdXJjZSBjb2RlCisKKyAgIFNvdXJjZSBjb2RlIGZvciBhIEMgbGFuZ3VhZ2UgaW1wbGVtZW50YXRpb24gb2YgYSAiemxpYiIgY29tcGxpYW50CisgICBsaWJyYXJ5IGlzIGF2YWlsYWJsZSBhdCBmdHA6Ly9mdHAudXUubmV0L3B1Yi9hcmNoaXZpbmcvemlwL3psaWIvLgorCis1LiBTZWN1cml0eSBDb25zaWRlcmF0aW9ucworCisgICBBIGRlY29kZXIgdGhhdCBmYWlscyB0byBjaGVjayB0aGUgQURMRVIzMiBjaGVja3N1bSB2YWx1ZSBtYXkgYmUKKyAgIHN1YmplY3QgdG8gdW5kZXRlY3RlZCBkYXRhIGNvcnJ1cHRpb24uCisKKzYuIEFja25vd2xlZGdlbWVudHMKKworICAgVHJhZGVtYXJrcyBjaXRlZCBpbiB0aGlzIGRvY3VtZW50IGFyZSB0aGUgcHJvcGVydHkgb2YgdGhlaXIKKyAgIHJlc3BlY3RpdmUgb3duZXJzLgorCisgICBKZWFuLUxvdXAgR2FpbGx5IGFuZCBNYXJrIEFkbGVyIGRlc2lnbmVkIHRoZSB6bGliIGZvcm1hdCBhbmQgd3JvdGUKKyAgIHRoZSByZWxhdGVkIHNvZnR3YXJlIGRlc2NyaWJlZCBpbiB0aGlzIHNwZWNpZmljYXRpb24uICBHbGVubgorICAgUmFuZGVycy1QZWhyc29uIGNvbnZlcnRlZCB0aGlzIGRvY3VtZW50IHRvIFJGQyBhbmQgSFRNTCBmb3JtYXQuCisKKzcuIEF1dGhvcnMnIEFkZHJlc3NlcworCisgICBMLiBQZXRlciBEZXV0c2NoCisgICBBbGFkZGluIEVudGVycHJpc2VzCisgICAyMDMgU2FudGEgTWFyZ2FyaXRhIEF2ZS4KKyAgIE1lbmxvIFBhcmssIENBIDk0MDI1CisKKyAgIFBob25lOiAoNDE1KSAzMjItMDEwMyAoQU0gb25seSkKKyAgIEZBWDogICAoNDE1KSAzMjItMTczNAorICAgRU1haWw6IDxnaG9zdEBhbGFkZGluLmNvbT4KKworCisgICBKZWFuLUxvdXAgR2FpbGx5CisKKyAgIEVNYWlsOiA8Z3ppcEBwcmVwLmFpLm1pdC5lZHU+CisKKyAgIFF1ZXN0aW9ucyBhYm91dCB0aGUgdGVjaG5pY2FsIGNvbnRlbnQgb2YgdGhpcyBzcGVjaWZpY2F0aW9uIGNhbiBiZQorICAgc2VudCBieSBlbWFpbCB0bworCisgICBKZWFuLUxvdXAgR2FpbGx5IDxnemlwQHByZXAuYWkubWl0LmVkdT4gYW5kCisgICBNYXJrIEFkbGVyIDxtYWRsZXJAYWx1bW5pLmNhbHRlY2guZWR1PgorCisgICBFZGl0b3JpYWwgY29tbWVudHMgb24gdGhpcyBzcGVjaWZpY2F0aW9uIGNhbiBiZSBzZW50IGJ5IGVtYWlsIHRvCisKKyAgIEwuIFBldGVyIERldXRzY2ggPGdob3N0QGFsYWRkaW4uY29tPiBhbmQKKyAgIEdsZW5uIFJhbmRlcnMtUGVocnNvbiA8cmFuZGVnQGFsdW1uaS5ycGkuZWR1PgorCisKKworCisKKworRGV1dHNjaCAmIEdhaWxseSAgICAgICAgICAgICBJbmZvcm1hdGlvbmFsICAgICAgICAgICAgICAgICAgICAgIFtQYWdlIDhdCisMCitSRkMgMTk1MCAgICAgICBaTElCIENvbXByZXNzZWQgRGF0YSBGb3JtYXQgU3BlY2lmaWNhdGlvbiAgICAgICAgTWF5IDE5OTYKKworCis4LiBBcHBlbmRpeDogUmF0aW9uYWxlCisKKyAgIDguMS4gUHJlc2V0IGRpY3Rpb25hcmllcworCisgICAgICBBIHByZXNldCBkaWN0aW9uYXJ5IGlzIHNwZWNpYWxseSB1c2VmdWwgdG8gY29tcHJlc3Mgc2hvcnQgaW5wdXQKKyAgICAgIHNlcXVlbmNlcy4gVGhlIGNvbXByZXNzb3IgY2FuIHRha2UgYWR2YW50YWdlIG9mIHRoZSBkaWN0aW9uYXJ5CisgICAgICBjb250ZXh0IHRvIGVuY29kZSB0aGUgaW5wdXQgaW4gYSBtb3JlIGNvbXBhY3QgbWFubmVyLiBUaGUKKyAgICAgIGRlY29tcHJlc3NvciBjYW4gYmUgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgYXBwcm9wcmlhdGUgY29udGV4dCBieQorICAgICAgdmlydHVhbGx5IGRlY29tcHJlc3NpbmcgYSBjb21wcmVzc2VkIHZlcnNpb24gb2YgdGhlIGRpY3Rpb25hcnkKKyAgICAgIHdpdGhvdXQgcHJvZHVjaW5nIGFueSBvdXRwdXQuIEhvd2V2ZXIgZm9yIGNlcnRhaW4gY29tcHJlc3Npb24KKyAgICAgIGFsZ29yaXRobXMgc3VjaCBhcyB0aGUgZGVmbGF0ZSBhbGdvcml0aG0gdGhpcyBvcGVyYXRpb24gY2FuIGJlCisgICAgICBhY2hpZXZlZCB3aXRob3V0IGFjdHVhbGx5IHBlcmZvcm1pbmcgYW55IGRlY29tcHJlc3Npb24uCisKKyAgICAgIFRoZSBjb21wcmVzc29yIGFuZCB0aGUgZGVjb21wcmVzc29yIG11c3QgdXNlIGV4YWN0bHkgdGhlIHNhbWUKKyAgICAgIGRpY3Rpb25hcnkuIFRoZSBkaWN0aW9uYXJ5IG1heSBiZSBmaXhlZCBvciBtYXkgYmUgY2hvc2VuIGFtb25nIGEKKyAgICAgIGNlcnRhaW4gbnVtYmVyIG9mIHByZWRlZmluZWQgZGljdGlvbmFyaWVzLCBhY2NvcmRpbmcgdG8gdGhlIGtpbmQKKyAgICAgIG9mIGlucHV0IGRhdGEuIFRoZSBkZWNvbXByZXNzb3IgY2FuIGRldGVybWluZSB3aGljaCBkaWN0aW9uYXJ5IGhhcworICAgICAgYmVlbiBjaG9zZW4gYnkgdGhlIGNvbXByZXNzb3IgYnkgY2hlY2tpbmcgdGhlIGRpY3Rpb25hcnkKKyAgICAgIGlkZW50aWZpZXIuIFRoaXMgZG9jdW1lbnQgZG9lcyBub3Qgc3BlY2lmeSB0aGUgY29udGVudHMgb2YKKyAgICAgIHByZWRlZmluZWQgZGljdGlvbmFyaWVzLCBzaW5jZSB0aGUgb3B0aW1hbCBkaWN0aW9uYXJpZXMgYXJlCisgICAgICBhcHBsaWNhdGlvbiBzcGVjaWZpYy4gU3RhbmRhcmQgZGF0YSBmb3JtYXRzIHVzaW5nIHRoaXMgZmVhdHVyZSBvZgorICAgICAgdGhlIHpsaWIgc3BlY2lmaWNhdGlvbiBtdXN0IHByZWNpc2VseSBkZWZpbmUgdGhlIGFsbG93ZWQKKyAgICAgIGRpY3Rpb25hcmllcy4KKworICAgOC4yLiBUaGUgQWRsZXItMzIgYWxnb3JpdGhtCisKKyAgICAgIFRoZSBBZGxlci0zMiBhbGdvcml0aG0gaXMgbXVjaCBmYXN0ZXIgdGhhbiB0aGUgQ1JDMzIgYWxnb3JpdGhtIHlldAorICAgICAgc3RpbGwgcHJvdmlkZXMgYW4gZXh0cmVtZWx5IGxvdyBwcm9iYWJpbGl0eSBvZiB1bmRldGVjdGVkIGVycm9ycy4KKworICAgICAgVGhlIG1vZHVsbyBvbiB1bnNpZ25lZCBsb25nIGFjY3VtdWxhdG9ycyBjYW4gYmUgZGVsYXllZCBmb3IgNTU1MgorICAgICAgYnl0ZXMsIHNvIHRoZSBtb2R1bG8gb3BlcmF0aW9uIHRpbWUgaXMgbmVnbGlnaWJsZS4gIElmIHRoZSBieXRlcworICAgICAgYXJlIGEsIGIsIGMsIHRoZSBzZWNvbmQgc3VtIGlzIDNhICsgMmIgKyBjICsgMywgYW5kIHNvIGlzIHBvc2l0aW9uCisgICAgICBhbmQgb3JkZXIgc2Vuc2l0aXZlLCB1bmxpa2UgdGhlIGZpcnN0IHN1bSwgd2hpY2ggaXMganVzdCBhCisgICAgICBjaGVja3N1bS4gIFRoYXQgNjU1MjEgaXMgcHJpbWUgaXMgaW1wb3J0YW50IHRvIGF2b2lkIGEgcG9zc2libGUKKyAgICAgIGxhcmdlIGNsYXNzIG9mIHR3by1ieXRlIGVycm9ycyB0aGF0IGxlYXZlIHRoZSBjaGVjayB1bmNoYW5nZWQuCisgICAgICAoVGhlIEZsZXRjaGVyIGNoZWNrc3VtIHVzZXMgMjU1LCB3aGljaCBpcyBub3QgcHJpbWUgYW5kIHdoaWNoIGFsc28KKyAgICAgIG1ha2VzIHRoZSBGbGV0Y2hlciBjaGVjayBpbnNlbnNpdGl2ZSB0byBzaW5nbGUgYnl0ZSBjaGFuZ2VzIDAgPC0+CisgICAgICAyNTUuKQorCisgICAgICBUaGUgc3VtIHMxIGlzIGluaXRpYWxpemVkIHRvIDEgaW5zdGVhZCBvZiB6ZXJvIHRvIG1ha2UgdGhlIGxlbmd0aAorICAgICAgb2YgdGhlIHNlcXVlbmNlIHBhcnQgb2YgczIsIHNvIHRoYXQgdGhlIGxlbmd0aCBkb2VzIG5vdCBoYXZlIHRvIGJlCisgICAgICBjaGVja2VkIHNlcGFyYXRlbHkuIChBbnkgc2VxdWVuY2Ugb2YgemVyb2VzIGhhcyBhIEZsZXRjaGVyCisgICAgICBjaGVja3N1bSBvZiB6ZXJvLikKKworCisKKworCisKKworCitEZXV0c2NoICYgR2FpbGx5ICAgICAgICAgICAgIEluZm9ybWF0aW9uYWwgICAgICAgICAgICAgICAgICAgICAgW1BhZ2UgOV0KKwwKK1JGQyAxOTUwICAgICAgIFpMSUIgQ29tcHJlc3NlZCBEYXRhIEZvcm1hdCBTcGVjaWZpY2F0aW9uICAgICAgICBNYXkgMTk5NgorCisKKzkuIEFwcGVuZGl4OiBTYW1wbGUgY29kZQorCisgICBUaGUgZm9sbG93aW5nIEMgY29kZSBjb21wdXRlcyB0aGUgQWRsZXItMzIgY2hlY2tzdW0gb2YgYSBkYXRhIGJ1ZmZlci4KKyAgIEl0IGlzIHdyaXR0ZW4gZm9yIGNsYXJpdHksIG5vdCBmb3Igc3BlZWQuICBUaGUgc2FtcGxlIGNvZGUgaXMgaW4gdGhlCisgICBBTlNJIEMgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UuIE5vbiBDIHVzZXJzIG1heSBmaW5kIGl0IGVhc2llciB0byByZWFkCisgICB3aXRoIHRoZXNlIGhpbnRzOgorCisgICAgICAmICAgICAgQml0d2lzZSBBTkQgb3BlcmF0b3IuCisgICAgICA+PiAgICAgQml0d2lzZSByaWdodCBzaGlmdCBvcGVyYXRvci4gV2hlbiBhcHBsaWVkIHRvIGFuCisgICAgICAgICAgICAgdW5zaWduZWQgcXVhbnRpdHksIGFzIGhlcmUsIHJpZ2h0IHNoaWZ0IGluc2VydHMgemVybyBiaXQocykKKyAgICAgICAgICAgICBhdCB0aGUgbGVmdC4KKyAgICAgIDw8ICAgICBCaXR3aXNlIGxlZnQgc2hpZnQgb3BlcmF0b3IuIExlZnQgc2hpZnQgaW5zZXJ0cyB6ZXJvCisgICAgICAgICAgICAgYml0KHMpIGF0IHRoZSByaWdodC4KKyAgICAgICsrICAgICAibisrIiBpbmNyZW1lbnRzIHRoZSB2YXJpYWJsZSBuLgorICAgICAgJSAgICAgIG1vZHVsbyBvcGVyYXRvcjogYSAlIGIgaXMgdGhlIHJlbWFpbmRlciBvZiBhIGRpdmlkZWQgYnkgYi4KKworICAgICAgI2RlZmluZSBCQVNFIDY1NTIxIC8qIGxhcmdlc3QgcHJpbWUgc21hbGxlciB0aGFuIDY1NTM2ICovCisKKyAgICAgIC8qCisgICAgICAgICBVcGRhdGUgYSBydW5uaW5nIEFkbGVyLTMyIGNoZWNrc3VtIHdpdGggdGhlIGJ5dGVzIGJ1ZlswLi5sZW4tMV0KKyAgICAgICBhbmQgcmV0dXJuIHRoZSB1cGRhdGVkIGNoZWNrc3VtLiBUaGUgQWRsZXItMzIgY2hlY2tzdW0gc2hvdWxkIGJlCisgICAgICAgaW5pdGlhbGl6ZWQgdG8gMS4KKworICAgICAgIFVzYWdlIGV4YW1wbGU6CisKKyAgICAgICAgIHVuc2lnbmVkIGxvbmcgYWRsZXIgPSAxTDsKKworICAgICAgICAgd2hpbGUgKHJlYWRfYnVmZmVyKGJ1ZmZlciwgbGVuZ3RoKSAhPSBFT0YpIHsKKyAgICAgICAgICAgYWRsZXIgPSB1cGRhdGVfYWRsZXIzMihhZGxlciwgYnVmZmVyLCBsZW5ndGgpOworICAgICAgICAgfQorICAgICAgICAgaWYgKGFkbGVyICE9IG9yaWdpbmFsX2FkbGVyKSBlcnJvcigpOworICAgICAgKi8KKyAgICAgIHVuc2lnbmVkIGxvbmcgdXBkYXRlX2FkbGVyMzIodW5zaWduZWQgbG9uZyBhZGxlciwKKyAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGxlbikKKyAgICAgIHsKKyAgICAgICAgdW5zaWduZWQgbG9uZyBzMSA9IGFkbGVyICYgMHhmZmZmOworICAgICAgICB1bnNpZ25lZCBsb25nIHMyID0gKGFkbGVyID4+IDE2KSAmIDB4ZmZmZjsKKyAgICAgICAgaW50IG47CisKKyAgICAgICAgZm9yIChuID0gMDsgbiA8IGxlbjsgbisrKSB7CisgICAgICAgICAgczEgPSAoczEgKyBidWZbbl0pICUgQkFTRTsKKyAgICAgICAgICBzMiA9IChzMiArIHMxKSAgICAgJSBCQVNFOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoczIgPDwgMTYpICsgczE7CisgICAgICB9CisKKyAgICAgIC8qIFJldHVybiB0aGUgYWRsZXIzMiBvZiB0aGUgYnl0ZXMgYnVmWzAuLmxlbi0xXSAqLworCisKKworCitEZXV0c2NoICYgR2FpbGx5ICAgICAgICAgICAgIEluZm9ybWF0aW9uYWwgICAgICAgICAgICAgICAgICAgICBbUGFnZSAxMF0KKwwKK1JGQyAxOTUwICAgICAgIFpMSUIgQ29tcHJlc3NlZCBEYXRhIEZvcm1hdCBTcGVjaWZpY2F0aW9uICAgICAgICBNYXkgMTk5NgorCisKKyAgICAgIHVuc2lnbmVkIGxvbmcgYWRsZXIzMih1bnNpZ25lZCBjaGFyICpidWYsIGludCBsZW4pCisgICAgICB7CisgICAgICAgIHJldHVybiB1cGRhdGVfYWRsZXIzMigxTCwgYnVmLCBsZW4pOworICAgICAgfQorCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKK0RldXRzY2ggJiBHYWlsbHkgICAgICAgICAgICAgSW5mb3JtYXRpb25hbCAgICAgICAgICAgICAgICAgICAgIFtQYWdlIDExXQorDApkaWZmIC0tZ2l0IGEvemxpYi0xLjIuNi9kb2MvcmZjMTk1MS50eHQgYi96bGliLTEuMi42L2RvYy9yZmMxOTUxLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDNjOGM3Ci0tLSAvZGV2L251bGwKKysrIGIvemxpYi0xLjIuNi9kb2MvcmZjMTk1MS50eHQKQEAgLTAsMCArMSw5NTUgQEAKKworCisKKworCisKK05ldHdvcmsgV29ya2luZyBHcm91cCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUC4gRGV1dHNjaAorUmVxdWVzdCBmb3IgQ29tbWVudHM6IDE5NTEgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGFkZGluIEVudGVycHJpc2VzCitDYXRlZ29yeTogSW5mb3JtYXRpb25hbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF5IDE5OTYKKworCisgICAgICAgIERFRkxBVEUgQ29tcHJlc3NlZCBEYXRhIEZvcm1hdCBTcGVjaWZpY2F0aW9uIHZlcnNpb24gMS4zCisKK1N0YXR1cyBvZiBUaGlzIE1lbW8KKworICAgVGhpcyBtZW1vIHByb3ZpZGVzIGluZm9ybWF0aW9uIGZvciB0aGUgSW50ZXJuZXQgY29tbXVuaXR5LiAgVGhpcyBtZW1vCisgICBkb2VzIG5vdCBzcGVjaWZ5IGFuIEludGVybmV0IHN0YW5kYXJkIG9mIGFueSBraW5kLiAgRGlzdHJpYnV0aW9uIG9mCisgICB0aGlzIG1lbW8gaXMgdW5saW1pdGVkLgorCitJRVNHIE5vdGU6CisKKyAgIFRoZSBJRVNHIHRha2VzIG5vIHBvc2l0aW9uIG9uIHRoZSB2YWxpZGl0eSBvZiBhbnkgSW50ZWxsZWN0dWFsCisgICBQcm9wZXJ0eSBSaWdodHMgc3RhdGVtZW50cyBjb250YWluZWQgaW4gdGhpcyBkb2N1bWVudC4KKworTm90aWNlcworCisgICBDb3B5cmlnaHQgKGMpIDE5OTYgTC4gUGV0ZXIgRGV1dHNjaAorCisgICBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGlzIGRvY3VtZW50IGZvciBhbnkKKyAgIHB1cnBvc2UgYW5kIHdpdGhvdXQgY2hhcmdlLCBpbmNsdWRpbmcgdHJhbnNsYXRpb25zIGludG8gb3RoZXIKKyAgIGxhbmd1YWdlcyBhbmQgaW5jb3Jwb3JhdGlvbiBpbnRvIGNvbXBpbGF0aW9ucywgcHJvdmlkZWQgdGhhdCB0aGUKKyAgIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgbm90aWNlIGFyZSBwcmVzZXJ2ZWQsIGFuZCB0aGF0IGFueQorICAgc3Vic3RhbnRpdmUgY2hhbmdlcyBvciBkZWxldGlvbnMgZnJvbSB0aGUgb3JpZ2luYWwgYXJlIGNsZWFybHkKKyAgIG1hcmtlZC4KKworICAgQSBwb2ludGVyIHRvIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGlzIGFuZCByZWxhdGVkIGRvY3VtZW50YXRpb24gaW4KKyAgIEhUTUwgZm9ybWF0IGNhbiBiZSBmb3VuZCBhdCB0aGUgVVJMCisgICA8ZnRwOi8vZnRwLnV1Lm5ldC9ncmFwaGljcy9wbmcvZG9jdW1lbnRzL3psaWIvemRvYy1pbmRleC5odG1sPi4KKworQWJzdHJhY3QKKworICAgVGhpcyBzcGVjaWZpY2F0aW9uIGRlZmluZXMgYSBsb3NzbGVzcyBjb21wcmVzc2VkIGRhdGEgZm9ybWF0IHRoYXQKKyAgIGNvbXByZXNzZXMgZGF0YSB1c2luZyBhIGNvbWJpbmF0aW9uIG9mIHRoZSBMWjc3IGFsZ29yaXRobSBhbmQgSHVmZm1hbgorICAgY29kaW5nLCB3aXRoIGVmZmljaWVuY3kgY29tcGFyYWJsZSB0byB0aGUgYmVzdCBjdXJyZW50bHkgYXZhaWxhYmxlCisgICBnZW5lcmFsLXB1cnBvc2UgY29tcHJlc3Npb24gbWV0aG9kcy4gIFRoZSBkYXRhIGNhbiBiZSBwcm9kdWNlZCBvcgorICAgY29uc3VtZWQsIGV2ZW4gZm9yIGFuIGFyYml0cmFyaWx5IGxvbmcgc2VxdWVudGlhbGx5IHByZXNlbnRlZCBpbnB1dAorICAgZGF0YSBzdHJlYW0sIHVzaW5nIG9ubHkgYW4gYSBwcmlvcmkgYm91bmRlZCBhbW91bnQgb2YgaW50ZXJtZWRpYXRlCisgICBzdG9yYWdlLiAgVGhlIGZvcm1hdCBjYW4gYmUgaW1wbGVtZW50ZWQgcmVhZGlseSBpbiBhIG1hbm5lciBub3QKKyAgIGNvdmVyZWQgYnkgcGF0ZW50cy4KKworCisKKworCisKKworCitEZXV0c2NoICAgICAgICAgICAgICAgICAgICAgIEluZm9ybWF0aW9uYWwgICAgICAgICAgICAgICAgICAgICAgW1BhZ2UgMV0KKwwKK1JGQyAxOTUxICAgICAgREVGTEFURSBDb21wcmVzc2VkIERhdGEgRm9ybWF0IFNwZWNpZmljYXRpb24gICAgICBNYXkgMTk5NgorCisKK1RhYmxlIG9mIENvbnRlbnRzCisKKyAgIDEuIEludHJvZHVjdGlvbiAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gMgorICAgICAgMS4xLiBQdXJwb3NlIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAyCisgICAgICAxLjIuIEludGVuZGVkIGF1ZGllbmNlIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIDMKKyAgICAgIDEuMy4gU2NvcGUgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gMworICAgICAgMS40LiBDb21wbGlhbmNlIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAzCisgICAgICAxLjUuICBEZWZpbml0aW9ucyBvZiB0ZXJtcyBhbmQgY29udmVudGlvbnMgdXNlZCAuLi4uLi4uLi4uLi4uLi4uIDMKKyAgICAgIDEuNi4gQ2hhbmdlcyBmcm9tIHByZXZpb3VzIHZlcnNpb25zIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gNAorICAgMi4gQ29tcHJlc3NlZCByZXByZXNlbnRhdGlvbiBvdmVydmlldyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiA0CisgICAzLiBEZXRhaWxlZCBzcGVjaWZpY2F0aW9uIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIDUKKyAgICAgIDMuMS4gT3ZlcmFsbCBjb252ZW50aW9ucyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gNQorICAgICAgICAgIDMuMS4xLiBQYWNraW5nIGludG8gYnl0ZXMgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiA1CisgICAgICAzLjIuIENvbXByZXNzZWQgYmxvY2sgZm9ybWF0IC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIDYKKyAgICAgICAgICAzLjIuMS4gU3lub3BzaXMgb2YgcHJlZml4IGFuZCBIdWZmbWFuIGNvZGluZyAuLi4uLi4uLi4uLi4uLi4gNgorICAgICAgICAgIDMuMi4yLiBVc2Ugb2YgSHVmZm1hbiBjb2RpbmcgaW4gdGhlICJkZWZsYXRlIiBmb3JtYXQgLi4uLi4uLiA3CisgICAgICAgICAgMy4yLjMuIERldGFpbHMgb2YgYmxvY2sgZm9ybWF0IC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIDkKKyAgICAgICAgICAzLjIuNC4gTm9uLWNvbXByZXNzZWQgYmxvY2tzIChCVFlQRT0wMCkgLi4uLi4uLi4uLi4uLi4uLi4uLiAxMQorICAgICAgICAgIDMuMi41LiBDb21wcmVzc2VkIGJsb2NrcyAobGVuZ3RoIGFuZCBkaXN0YW5jZSBjb2RlcykgLi4uLi4uIDExCisgICAgICAgICAgMy4yLjYuIENvbXByZXNzaW9uIHdpdGggZml4ZWQgSHVmZm1hbiBjb2RlcyAoQlRZUEU9MDEpIC4uLi4gMTIKKyAgICAgICAgICAzLjIuNy4gQ29tcHJlc3Npb24gd2l0aCBkeW5hbWljIEh1ZmZtYW4gY29kZXMgKEJUWVBFPTEwKSAuLiAxMworICAgICAgMy4zLiBDb21wbGlhbmNlIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIDE0CisgICA0LiBDb21wcmVzc2lvbiBhbGdvcml0aG0gZGV0YWlscyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gMTQKKyAgIDUuIFJlZmVyZW5jZXMgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAxNgorICAgNi4gU2VjdXJpdHkgQ29uc2lkZXJhdGlvbnMgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIDE2CisgICA3LiBTb3VyY2UgY29kZSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gMTYKKyAgIDguIEFja25vd2xlZGdlbWVudHMgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAxNgorICAgOS4gQXV0aG9yJ3MgQWRkcmVzcyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIDE3CisKKzEuIEludHJvZHVjdGlvbgorCisgICAxLjEuIFB1cnBvc2UKKworICAgICAgVGhlIHB1cnBvc2Ugb2YgdGhpcyBzcGVjaWZpY2F0aW9uIGlzIHRvIGRlZmluZSBhIGxvc3NsZXNzCisgICAgICBjb21wcmVzc2VkIGRhdGEgZm9ybWF0IHRoYXQ6CisgICAgICAgICAgKiBJcyBpbmRlcGVuZGVudCBvZiBDUFUgdHlwZSwgb3BlcmF0aW5nIHN5c3RlbSwgZmlsZSBzeXN0ZW0sCisgICAgICAgICAgICBhbmQgY2hhcmFjdGVyIHNldCwgYW5kIGhlbmNlIGNhbiBiZSB1c2VkIGZvciBpbnRlcmNoYW5nZTsKKyAgICAgICAgICAqIENhbiBiZSBwcm9kdWNlZCBvciBjb25zdW1lZCwgZXZlbiBmb3IgYW4gYXJiaXRyYXJpbHkgbG9uZworICAgICAgICAgICAgc2VxdWVudGlhbGx5IHByZXNlbnRlZCBpbnB1dCBkYXRhIHN0cmVhbSwgdXNpbmcgb25seSBhbiBhCisgICAgICAgICAgICBwcmlvcmkgYm91bmRlZCBhbW91bnQgb2YgaW50ZXJtZWRpYXRlIHN0b3JhZ2UsIGFuZCBoZW5jZQorICAgICAgICAgICAgY2FuIGJlIHVzZWQgaW4gZGF0YSBjb21tdW5pY2F0aW9ucyBvciBzaW1pbGFyIHN0cnVjdHVyZXMKKyAgICAgICAgICAgIHN1Y2ggYXMgVW5peCBmaWx0ZXJzOworICAgICAgICAgICogQ29tcHJlc3NlcyBkYXRhIHdpdGggZWZmaWNpZW5jeSBjb21wYXJhYmxlIHRvIHRoZSBiZXN0CisgICAgICAgICAgICBjdXJyZW50bHkgYXZhaWxhYmxlIGdlbmVyYWwtcHVycG9zZSBjb21wcmVzc2lvbiBtZXRob2RzLAorICAgICAgICAgICAgYW5kIGluIHBhcnRpY3VsYXIgY29uc2lkZXJhYmx5IGJldHRlciB0aGFuIHRoZSAiY29tcHJlc3MiCisgICAgICAgICAgICBwcm9ncmFtOworICAgICAgICAgICogQ2FuIGJlIGltcGxlbWVudGVkIHJlYWRpbHkgaW4gYSBtYW5uZXIgbm90IGNvdmVyZWQgYnkKKyAgICAgICAgICAgIHBhdGVudHMsIGFuZCBoZW5jZSBjYW4gYmUgcHJhY3RpY2VkIGZyZWVseTsKKworCisKK0RldXRzY2ggICAgICAgICAgICAgICAgICAgICAgSW5mb3JtYXRpb25hbCAgICAgICAgICAgICAgICAgICAgICBbUGFnZSAyXQorDAorUkZDIDE5NTEgICAgICBERUZMQVRFIENvbXByZXNzZWQgRGF0YSBGb3JtYXQgU3BlY2lmaWNhdGlvbiAgICAgIE1heSAxOTk2CisKKworICAgICAgICAgICogSXMgY29tcGF0aWJsZSB3aXRoIHRoZSBmaWxlIGZvcm1hdCBwcm9kdWNlZCBieSB0aGUgY3VycmVudAorICAgICAgICAgICAgd2lkZWx5IHVzZWQgZ3ppcCB1dGlsaXR5LCBpbiB0aGF0IGNvbmZvcm1pbmcgZGVjb21wcmVzc29ycworICAgICAgICAgICAgd2lsbCBiZSBhYmxlIHRvIHJlYWQgZGF0YSBwcm9kdWNlZCBieSB0aGUgZXhpc3RpbmcgZ3ppcAorICAgICAgICAgICAgY29tcHJlc3Nvci4KKworICAgICAgVGhlIGRhdGEgZm9ybWF0IGRlZmluZWQgYnkgdGhpcyBzcGVjaWZpY2F0aW9uIGRvZXMgbm90IGF0dGVtcHQgdG86CisKKyAgICAgICAgICAqIEFsbG93IHJhbmRvbSBhY2Nlc3MgdG8gY29tcHJlc3NlZCBkYXRhOworICAgICAgICAgICogQ29tcHJlc3Mgc3BlY2lhbGl6ZWQgZGF0YSAoZS5nLiwgcmFzdGVyIGdyYXBoaWNzKSBhcyB3ZWxsCisgICAgICAgICAgICBhcyB0aGUgYmVzdCBjdXJyZW50bHkgYXZhaWxhYmxlIHNwZWNpYWxpemVkIGFsZ29yaXRobXMuCisKKyAgICAgIEEgc2ltcGxlIGNvdW50aW5nIGFyZ3VtZW50IHNob3dzIHRoYXQgbm8gbG9zc2xlc3MgY29tcHJlc3Npb24KKyAgICAgIGFsZ29yaXRobSBjYW4gY29tcHJlc3MgZXZlcnkgcG9zc2libGUgaW5wdXQgZGF0YSBzZXQuICBGb3IgdGhlCisgICAgICBmb3JtYXQgZGVmaW5lZCBoZXJlLCB0aGUgd29yc3QgY2FzZSBleHBhbnNpb24gaXMgNSBieXRlcyBwZXIgMzJLLQorICAgICAgYnl0ZSBibG9jaywgaS5lLiwgYSBzaXplIGluY3JlYXNlIG9mIDAuMDE1JSBmb3IgbGFyZ2UgZGF0YSBzZXRzLgorICAgICAgRW5nbGlzaCB0ZXh0IHVzdWFsbHkgY29tcHJlc3NlcyBieSBhIGZhY3RvciBvZiAyLjUgdG8gMzsKKyAgICAgIGV4ZWN1dGFibGUgZmlsZXMgdXN1YWxseSBjb21wcmVzcyBzb21ld2hhdCBsZXNzOyBncmFwaGljYWwgZGF0YQorICAgICAgc3VjaCBhcyByYXN0ZXIgaW1hZ2VzIG1heSBjb21wcmVzcyBtdWNoIG1vcmUuCisKKyAgIDEuMi4gSW50ZW5kZWQgYXVkaWVuY2UKKworICAgICAgVGhpcyBzcGVjaWZpY2F0aW9uIGlzIGludGVuZGVkIGZvciB1c2UgYnkgaW1wbGVtZW50b3JzIG9mIHNvZnR3YXJlCisgICAgICB0byBjb21wcmVzcyBkYXRhIGludG8gImRlZmxhdGUiIGZvcm1hdCBhbmQvb3IgZGVjb21wcmVzcyBkYXRhIGZyb20KKyAgICAgICJkZWZsYXRlIiBmb3JtYXQuCisKKyAgICAgIFRoZSB0ZXh0IG9mIHRoZSBzcGVjaWZpY2F0aW9uIGFzc3VtZXMgYSBiYXNpYyBiYWNrZ3JvdW5kIGluCisgICAgICBwcm9ncmFtbWluZyBhdCB0aGUgbGV2ZWwgb2YgYml0cyBhbmQgb3RoZXIgcHJpbWl0aXZlIGRhdGEKKyAgICAgIHJlcHJlc2VudGF0aW9ucy4gIEZhbWlsaWFyaXR5IHdpdGggdGhlIHRlY2huaXF1ZSBvZiBIdWZmbWFuIGNvZGluZworICAgICAgaXMgaGVscGZ1bCBidXQgbm90IHJlcXVpcmVkLgorCisgICAxLjMuIFNjb3BlCisKKyAgICAgIFRoZSBzcGVjaWZpY2F0aW9uIHNwZWNpZmllcyBhIG1ldGhvZCBmb3IgcmVwcmVzZW50aW5nIGEgc2VxdWVuY2UKKyAgICAgIG9mIGJ5dGVzIGFzIGEgKHVzdWFsbHkgc2hvcnRlcikgc2VxdWVuY2Ugb2YgYml0cywgYW5kIGEgbWV0aG9kIGZvcgorICAgICAgcGFja2luZyB0aGUgbGF0dGVyIGJpdCBzZXF1ZW5jZSBpbnRvIGJ5dGVzLgorCisgICAxLjQuIENvbXBsaWFuY2UKKworICAgICAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIGEgY29tcGxpYW50IGRlY29tcHJlc3NvciBtdXN0IGJlCisgICAgICBhYmxlIHRvIGFjY2VwdCBhbmQgZGVjb21wcmVzcyBhbnkgZGF0YSBzZXQgdGhhdCBjb25mb3JtcyB0byBhbGwKKyAgICAgIHRoZSBzcGVjaWZpY2F0aW9ucyBwcmVzZW50ZWQgaGVyZTsgYSBjb21wbGlhbnQgY29tcHJlc3NvciBtdXN0CisgICAgICBwcm9kdWNlIGRhdGEgc2V0cyB0aGF0IGNvbmZvcm0gdG8gYWxsIHRoZSBzcGVjaWZpY2F0aW9ucyBwcmVzZW50ZWQKKyAgICAgIGhlcmUuCisKKyAgIDEuNS4gIERlZmluaXRpb25zIG9mIHRlcm1zIGFuZCBjb252ZW50aW9ucyB1c2VkCisKKyAgICAgIEJ5dGU6IDggYml0cyBzdG9yZWQgb3IgdHJhbnNtaXR0ZWQgYXMgYSB1bml0IChzYW1lIGFzIGFuIG9jdGV0KS4KKyAgICAgIEZvciB0aGlzIHNwZWNpZmljYXRpb24sIGEgYnl0ZSBpcyBleGFjdGx5IDggYml0cywgZXZlbiBvbiBtYWNoaW5lcworCisKKworRGV1dHNjaCAgICAgICAgICAgICAgICAgICAgICBJbmZvcm1hdGlvbmFsICAgICAgICAgICAgICAgICAgICAgIFtQYWdlIDNdCisMCitSRkMgMTk1MSAgICAgIERFRkxBVEUgQ29tcHJlc3NlZCBEYXRhIEZvcm1hdCBTcGVjaWZpY2F0aW9uICAgICAgTWF5IDE5OTYKKworCisgICAgICB3aGljaCBzdG9yZSBhIGNoYXJhY3RlciBvbiBhIG51bWJlciBvZiBiaXRzIGRpZmZlcmVudCBmcm9tIGVpZ2h0LgorICAgICAgU2VlIGJlbG93LCBmb3IgdGhlIG51bWJlcmluZyBvZiBiaXRzIHdpdGhpbiBhIGJ5dGUuCisKKyAgICAgIFN0cmluZzogYSBzZXF1ZW5jZSBvZiBhcmJpdHJhcnkgYnl0ZXMuCisKKyAgIDEuNi4gQ2hhbmdlcyBmcm9tIHByZXZpb3VzIHZlcnNpb25zCisKKyAgICAgIFRoZXJlIGhhdmUgYmVlbiBubyB0ZWNobmljYWwgY2hhbmdlcyB0byB0aGUgZGVmbGF0ZSBmb3JtYXQgc2luY2UKKyAgICAgIHZlcnNpb24gMS4xIG9mIHRoaXMgc3BlY2lmaWNhdGlvbi4gIEluIHZlcnNpb24gMS4yLCBzb21lCisgICAgICB0ZXJtaW5vbG9neSB3YXMgY2hhbmdlZC4gIFZlcnNpb24gMS4zIGlzIGEgY29udmVyc2lvbiBvZiB0aGUKKyAgICAgIHNwZWNpZmljYXRpb24gdG8gUkZDIHN0eWxlLgorCisyLiBDb21wcmVzc2VkIHJlcHJlc2VudGF0aW9uIG92ZXJ2aWV3CisKKyAgIEEgY29tcHJlc3NlZCBkYXRhIHNldCBjb25zaXN0cyBvZiBhIHNlcmllcyBvZiBibG9ja3MsIGNvcnJlc3BvbmRpbmcKKyAgIHRvIHN1Y2Nlc3NpdmUgYmxvY2tzIG9mIGlucHV0IGRhdGEuICBUaGUgYmxvY2sgc2l6ZXMgYXJlIGFyYml0cmFyeSwKKyAgIGV4Y2VwdCB0aGF0IG5vbi1jb21wcmVzc2libGUgYmxvY2tzIGFyZSBsaW1pdGVkIHRvIDY1LDUzNSBieXRlcy4KKworICAgRWFjaCBibG9jayBpcyBjb21wcmVzc2VkIHVzaW5nIGEgY29tYmluYXRpb24gb2YgdGhlIExaNzcgYWxnb3JpdGhtCisgICBhbmQgSHVmZm1hbiBjb2RpbmcuIFRoZSBIdWZmbWFuIHRyZWVzIGZvciBlYWNoIGJsb2NrIGFyZSBpbmRlcGVuZGVudAorICAgb2YgdGhvc2UgZm9yIHByZXZpb3VzIG9yIHN1YnNlcXVlbnQgYmxvY2tzOyB0aGUgTFo3NyBhbGdvcml0aG0gbWF5CisgICB1c2UgYSByZWZlcmVuY2UgdG8gYSBkdXBsaWNhdGVkIHN0cmluZyBvY2N1cnJpbmcgaW4gYSBwcmV2aW91cyBibG9jaywKKyAgIHVwIHRvIDMySyBpbnB1dCBieXRlcyBiZWZvcmUuCisKKyAgIEVhY2ggYmxvY2sgY29uc2lzdHMgb2YgdHdvIHBhcnRzOiBhIHBhaXIgb2YgSHVmZm1hbiBjb2RlIHRyZWVzIHRoYXQKKyAgIGRlc2NyaWJlIHRoZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgY29tcHJlc3NlZCBkYXRhIHBhcnQsIGFuZCBhCisgICBjb21wcmVzc2VkIGRhdGEgcGFydC4gIChUaGUgSHVmZm1hbiB0cmVlcyB0aGVtc2VsdmVzIGFyZSBjb21wcmVzc2VkCisgICB1c2luZyBIdWZmbWFuIGVuY29kaW5nLikgIFRoZSBjb21wcmVzc2VkIGRhdGEgY29uc2lzdHMgb2YgYSBzZXJpZXMgb2YKKyAgIGVsZW1lbnRzIG9mIHR3byB0eXBlczogbGl0ZXJhbCBieXRlcyAob2Ygc3RyaW5ncyB0aGF0IGhhdmUgbm90IGJlZW4KKyAgIGRldGVjdGVkIGFzIGR1cGxpY2F0ZWQgd2l0aGluIHRoZSBwcmV2aW91cyAzMksgaW5wdXQgYnl0ZXMpLCBhbmQKKyAgIHBvaW50ZXJzIHRvIGR1cGxpY2F0ZWQgc3RyaW5ncywgd2hlcmUgYSBwb2ludGVyIGlzIHJlcHJlc2VudGVkIGFzIGEKKyAgIHBhaXIgPGxlbmd0aCwgYmFja3dhcmQgZGlzdGFuY2U+LiAgVGhlIHJlcHJlc2VudGF0aW9uIHVzZWQgaW4gdGhlCisgICAiZGVmbGF0ZSIgZm9ybWF0IGxpbWl0cyBkaXN0YW5jZXMgdG8gMzJLIGJ5dGVzIGFuZCBsZW5ndGhzIHRvIDI1OAorICAgYnl0ZXMsIGJ1dCBkb2VzIG5vdCBsaW1pdCB0aGUgc2l6ZSBvZiBhIGJsb2NrLCBleGNlcHQgZm9yCisgICB1bmNvbXByZXNzaWJsZSBibG9ja3MsIHdoaWNoIGFyZSBsaW1pdGVkIGFzIG5vdGVkIGFib3ZlLgorCisgICBFYWNoIHR5cGUgb2YgdmFsdWUgKGxpdGVyYWxzLCBkaXN0YW5jZXMsIGFuZCBsZW5ndGhzKSBpbiB0aGUKKyAgIGNvbXByZXNzZWQgZGF0YSBpcyByZXByZXNlbnRlZCB1c2luZyBhIEh1ZmZtYW4gY29kZSwgdXNpbmcgb25lIGNvZGUKKyAgIHRyZWUgZm9yIGxpdGVyYWxzIGFuZCBsZW5ndGhzIGFuZCBhIHNlcGFyYXRlIGNvZGUgdHJlZSBmb3IgZGlzdGFuY2VzLgorICAgVGhlIGNvZGUgdHJlZXMgZm9yIGVhY2ggYmxvY2sgYXBwZWFyIGluIGEgY29tcGFjdCBmb3JtIGp1c3QgYmVmb3JlCisgICB0aGUgY29tcHJlc3NlZCBkYXRhIGZvciB0aGF0IGJsb2NrLgorCisKKworCisKKworCisKKworCitEZXV0c2NoICAgICAgICAgICAgICAgICAgICAgIEluZm9ybWF0aW9uYWwgICAgICAgICAgICAgICAgICAgICAgW1BhZ2UgNF0KKwwKK1JGQyAxOTUxICAgICAgREVGTEFURSBDb21wcmVzc2VkIERhdGEgRm9ybWF0IFNwZWNpZmljYXRpb24gICAgICBNYXkgMTk5NgorCisKKzMuIERldGFpbGVkIHNwZWNpZmljYXRpb24KKworICAgMy4xLiBPdmVyYWxsIGNvbnZlbnRpb25zIEluIHRoZSBkaWFncmFtcyBiZWxvdywgYSBib3ggbGlrZSB0aGlzOgorCisgICAgICAgICArLS0tKworICAgICAgICAgfCAgIHwgPC0tIHRoZSB2ZXJ0aWNhbCBiYXJzIG1pZ2h0IGJlIG1pc3NpbmcKKyAgICAgICAgICstLS0rCisKKyAgICAgIHJlcHJlc2VudHMgb25lIGJ5dGU7IGEgYm94IGxpa2UgdGhpczoKKworICAgICAgICAgKz09PT09PT09PT09PT09KworICAgICAgICAgfCAgICAgICAgICAgICAgfAorICAgICAgICAgKz09PT09PT09PT09PT09KworCisgICAgICByZXByZXNlbnRzIGEgdmFyaWFibGUgbnVtYmVyIG9mIGJ5dGVzLgorCisgICAgICBCeXRlcyBzdG9yZWQgd2l0aGluIGEgY29tcHV0ZXIgZG8gbm90IGhhdmUgYSAiYml0IG9yZGVyIiwgc2luY2UKKyAgICAgIHRoZXkgYXJlIGFsd2F5cyB0cmVhdGVkIGFzIGEgdW5pdC4gIEhvd2V2ZXIsIGEgYnl0ZSBjb25zaWRlcmVkIGFzCisgICAgICBhbiBpbnRlZ2VyIGJldHdlZW4gMCBhbmQgMjU1IGRvZXMgaGF2ZSBhIG1vc3QtIGFuZCBsZWFzdC0KKyAgICAgIHNpZ25pZmljYW50IGJpdCwgYW5kIHNpbmNlIHdlIHdyaXRlIG51bWJlcnMgd2l0aCB0aGUgbW9zdC0KKyAgICAgIHNpZ25pZmljYW50IGRpZ2l0IG9uIHRoZSBsZWZ0LCB3ZSBhbHNvIHdyaXRlIGJ5dGVzIHdpdGggdGhlIG1vc3QtCisgICAgICBzaWduaWZpY2FudCBiaXQgb24gdGhlIGxlZnQuICBJbiB0aGUgZGlhZ3JhbXMgYmVsb3csIHdlIG51bWJlciB0aGUKKyAgICAgIGJpdHMgb2YgYSBieXRlIHNvIHRoYXQgYml0IDAgaXMgdGhlIGxlYXN0LXNpZ25pZmljYW50IGJpdCwgaS5lLiwKKyAgICAgIHRoZSBiaXRzIGFyZSBudW1iZXJlZDoKKworICAgICAgICAgKy0tLS0tLS0tKworICAgICAgICAgfDc2NTQzMjEwfAorICAgICAgICAgKy0tLS0tLS0tKworCisgICAgICBXaXRoaW4gYSBjb21wdXRlciwgYSBudW1iZXIgbWF5IG9jY3VweSBtdWx0aXBsZSBieXRlcy4gIEFsbAorICAgICAgbXVsdGktYnl0ZSBudW1iZXJzIGluIHRoZSBmb3JtYXQgZGVzY3JpYmVkIGhlcmUgYXJlIHN0b3JlZCB3aXRoCisgICAgICB0aGUgbGVhc3Qtc2lnbmlmaWNhbnQgYnl0ZSBmaXJzdCAoYXQgdGhlIGxvd2VyIG1lbW9yeSBhZGRyZXNzKS4KKyAgICAgIEZvciBleGFtcGxlLCB0aGUgZGVjaW1hbCBudW1iZXIgNTIwIGlzIHN0b3JlZCBhczoKKworICAgICAgICAgICAgIDAgICAgICAgIDEKKyAgICAgICAgICstLS0tLS0tLSstLS0tLS0tLSsKKyAgICAgICAgIHwwMDAwMTAwMHwwMDAwMDAxMHwKKyAgICAgICAgICstLS0tLS0tLSstLS0tLS0tLSsKKyAgICAgICAgICBeICAgICAgICBeCisgICAgICAgICAgfCAgICAgICAgfAorICAgICAgICAgIHwgICAgICAgICsgbW9yZSBzaWduaWZpY2FudCBieXRlID0gMiB4IDI1NgorICAgICAgICAgICsgbGVzcyBzaWduaWZpY2FudCBieXRlID0gOAorCisgICAgICAzLjEuMS4gUGFja2luZyBpbnRvIGJ5dGVzCisKKyAgICAgICAgIFRoaXMgZG9jdW1lbnQgZG9lcyBub3QgYWRkcmVzcyB0aGUgaXNzdWUgb2YgdGhlIG9yZGVyIGluIHdoaWNoCisgICAgICAgICBiaXRzIG9mIGEgYnl0ZSBhcmUgdHJhbnNtaXR0ZWQgb24gYSBiaXQtc2VxdWVudGlhbCBtZWRpdW0sCisgICAgICAgICBzaW5jZSB0aGUgZmluYWwgZGF0YSBmb3JtYXQgZGVzY3JpYmVkIGhlcmUgaXMgYnl0ZS0gcmF0aGVyIHRoYW4KKworCisKK0RldXRzY2ggICAgICAgICAgICAgICAgICAgICAgSW5mb3JtYXRpb25hbCAgICAgICAgICAgICAgICAgICAgICBbUGFnZSA1XQorDAorUkZDIDE5NTEgICAgICBERUZMQVRFIENvbXByZXNzZWQgRGF0YSBGb3JtYXQgU3BlY2lmaWNhdGlvbiAgICAgIE1heSAxOTk2CisKKworICAgICAgICAgYml0LW9yaWVudGVkLiAgSG93ZXZlciwgd2UgZGVzY3JpYmUgdGhlIGNvbXByZXNzZWQgYmxvY2sgZm9ybWF0CisgICAgICAgICBpbiBiZWxvdywgYXMgYSBzZXF1ZW5jZSBvZiBkYXRhIGVsZW1lbnRzIG9mIHZhcmlvdXMgYml0CisgICAgICAgICBsZW5ndGhzLCBub3QgYSBzZXF1ZW5jZSBvZiBieXRlcy4gIFdlIG11c3QgdGhlcmVmb3JlIHNwZWNpZnkKKyAgICAgICAgIGhvdyB0byBwYWNrIHRoZXNlIGRhdGEgZWxlbWVudHMgaW50byBieXRlcyB0byBmb3JtIHRoZSBmaW5hbAorICAgICAgICAgY29tcHJlc3NlZCBieXRlIHNlcXVlbmNlOgorCisgICAgICAgICAgICAgKiBEYXRhIGVsZW1lbnRzIGFyZSBwYWNrZWQgaW50byBieXRlcyBpbiBvcmRlciBvZgorICAgICAgICAgICAgICAgaW5jcmVhc2luZyBiaXQgbnVtYmVyIHdpdGhpbiB0aGUgYnl0ZSwgaS5lLiwgc3RhcnRpbmcKKyAgICAgICAgICAgICAgIHdpdGggdGhlIGxlYXN0LXNpZ25pZmljYW50IGJpdCBvZiB0aGUgYnl0ZS4KKyAgICAgICAgICAgICAqIERhdGEgZWxlbWVudHMgb3RoZXIgdGhhbiBIdWZmbWFuIGNvZGVzIGFyZSBwYWNrZWQKKyAgICAgICAgICAgICAgIHN0YXJ0aW5nIHdpdGggdGhlIGxlYXN0LXNpZ25pZmljYW50IGJpdCBvZiB0aGUgZGF0YQorICAgICAgICAgICAgICAgZWxlbWVudC4KKyAgICAgICAgICAgICAqIEh1ZmZtYW4gY29kZXMgYXJlIHBhY2tlZCBzdGFydGluZyB3aXRoIHRoZSBtb3N0LQorICAgICAgICAgICAgICAgc2lnbmlmaWNhbnQgYml0IG9mIHRoZSBjb2RlLgorCisgICAgICAgICBJbiBvdGhlciB3b3JkcywgaWYgb25lIHdlcmUgdG8gcHJpbnQgb3V0IHRoZSBjb21wcmVzc2VkIGRhdGEgYXMKKyAgICAgICAgIGEgc2VxdWVuY2Ugb2YgYnl0ZXMsIHN0YXJ0aW5nIHdpdGggdGhlIGZpcnN0IGJ5dGUgYXQgdGhlCisgICAgICAgICAqcmlnaHQqIG1hcmdpbiBhbmQgcHJvY2VlZGluZyB0byB0aGUgKmxlZnQqLCB3aXRoIHRoZSBtb3N0LQorICAgICAgICAgc2lnbmlmaWNhbnQgYml0IG9mIGVhY2ggYnl0ZSBvbiB0aGUgbGVmdCBhcyB1c3VhbCwgb25lIHdvdWxkIGJlCisgICAgICAgICBhYmxlIHRvIHBhcnNlIHRoZSByZXN1bHQgZnJvbSByaWdodCB0byBsZWZ0LCB3aXRoIGZpeGVkLXdpZHRoCisgICAgICAgICBlbGVtZW50cyBpbiB0aGUgY29ycmVjdCBNU0ItdG8tTFNCIG9yZGVyIGFuZCBIdWZmbWFuIGNvZGVzIGluCisgICAgICAgICBiaXQtcmV2ZXJzZWQgb3JkZXIgKGkuZS4sIHdpdGggdGhlIGZpcnN0IGJpdCBvZiB0aGUgY29kZSBpbiB0aGUKKyAgICAgICAgIHJlbGF0aXZlIExTQiBwb3NpdGlvbikuCisKKyAgIDMuMi4gQ29tcHJlc3NlZCBibG9jayBmb3JtYXQKKworICAgICAgMy4yLjEuIFN5bm9wc2lzIG9mIHByZWZpeCBhbmQgSHVmZm1hbiBjb2RpbmcKKworICAgICAgICAgUHJlZml4IGNvZGluZyByZXByZXNlbnRzIHN5bWJvbHMgZnJvbSBhbiBhIHByaW9yaSBrbm93bgorICAgICAgICAgYWxwaGFiZXQgYnkgYml0IHNlcXVlbmNlcyAoY29kZXMpLCBvbmUgY29kZSBmb3IgZWFjaCBzeW1ib2wsIGluCisgICAgICAgICBhIG1hbm5lciBzdWNoIHRoYXQgZGlmZmVyZW50IHN5bWJvbHMgbWF5IGJlIHJlcHJlc2VudGVkIGJ5IGJpdAorICAgICAgICAgc2VxdWVuY2VzIG9mIGRpZmZlcmVudCBsZW5ndGhzLCBidXQgYSBwYXJzZXIgY2FuIGFsd2F5cyBwYXJzZQorICAgICAgICAgYW4gZW5jb2RlZCBzdHJpbmcgdW5hbWJpZ3VvdXNseSBzeW1ib2wtYnktc3ltYm9sLgorCisgICAgICAgICBXZSBkZWZpbmUgYSBwcmVmaXggY29kZSBpbiB0ZXJtcyBvZiBhIGJpbmFyeSB0cmVlIGluIHdoaWNoIHRoZQorICAgICAgICAgdHdvIGVkZ2VzIGRlc2NlbmRpbmcgZnJvbSBlYWNoIG5vbi1sZWFmIG5vZGUgYXJlIGxhYmVsZWQgMCBhbmQKKyAgICAgICAgIDEgYW5kIGluIHdoaWNoIHRoZSBsZWFmIG5vZGVzIGNvcnJlc3BvbmQgb25lLWZvci1vbmUgd2l0aCAoYXJlCisgICAgICAgICBsYWJlbGVkIHdpdGgpIHRoZSBzeW1ib2xzIG9mIHRoZSBhbHBoYWJldDsgdGhlbiB0aGUgY29kZSBmb3IgYQorICAgICAgICAgc3ltYm9sIGlzIHRoZSBzZXF1ZW5jZSBvZiAwJ3MgYW5kIDEncyBvbiB0aGUgZWRnZXMgbGVhZGluZyBmcm9tCisgICAgICAgICB0aGUgcm9vdCB0byB0aGUgbGVhZiBsYWJlbGVkIHdpdGggdGhhdCBzeW1ib2wuICBGb3IgZXhhbXBsZToKKworCisKKworCisKKworCisKKworCitEZXV0c2NoICAgICAgICAgICAgICAgICAgICAgIEluZm9ybWF0aW9uYWwgICAgICAgICAgICAgICAgICAgICAgW1BhZ2UgNl0KKwwKK1JGQyAxOTUxICAgICAgREVGTEFURSBDb21wcmVzc2VkIERhdGEgRm9ybWF0IFNwZWNpZmljYXRpb24gICAgICBNYXkgMTk5NgorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgL1wgICAgICAgICAgICAgIFN5bWJvbCAgICBDb2RlCisgICAgICAgICAgICAgICAgICAgICAgICAgMCAgMSAgICAgICAgICAgICAtLS0tLS0gICAgLS0tLQorICAgICAgICAgICAgICAgICAgICAgICAgLyAgICBcICAgICAgICAgICAgICAgIEEgICAgICAwMAorICAgICAgICAgICAgICAgICAgICAgICAvXCAgICAgQiAgICAgICAgICAgICAgIEIgICAgICAgMQorICAgICAgICAgICAgICAgICAgICAgIDAgIDEgICAgICAgICAgICAgICAgICAgIEMgICAgIDAxMQorICAgICAgICAgICAgICAgICAgICAgLyAgICBcICAgICAgICAgICAgICAgICAgIEQgICAgIDAxMAorICAgICAgICAgICAgICAgICAgICBBICAgICAvXAorICAgICAgICAgICAgICAgICAgICAgICAgIDAgIDEKKyAgICAgICAgICAgICAgICAgICAgICAgIC8gICAgXAorICAgICAgICAgICAgICAgICAgICAgICBEICAgICAgQworCisgICAgICAgICBBIHBhcnNlciBjYW4gZGVjb2RlIHRoZSBuZXh0IHN5bWJvbCBmcm9tIGFuIGVuY29kZWQgaW5wdXQKKyAgICAgICAgIHN0cmVhbSBieSB3YWxraW5nIGRvd24gdGhlIHRyZWUgZnJvbSB0aGUgcm9vdCwgYXQgZWFjaCBzdGVwCisgICAgICAgICBjaG9vc2luZyB0aGUgZWRnZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBuZXh0IGlucHV0IGJpdC4KKworICAgICAgICAgR2l2ZW4gYW4gYWxwaGFiZXQgd2l0aCBrbm93biBzeW1ib2wgZnJlcXVlbmNpZXMsIHRoZSBIdWZmbWFuCisgICAgICAgICBhbGdvcml0aG0gYWxsb3dzIHRoZSBjb25zdHJ1Y3Rpb24gb2YgYW4gb3B0aW1hbCBwcmVmaXggY29kZQorICAgICAgICAgKG9uZSB3aGljaCByZXByZXNlbnRzIHN0cmluZ3Mgd2l0aCB0aG9zZSBzeW1ib2wgZnJlcXVlbmNpZXMKKyAgICAgICAgIHVzaW5nIHRoZSBmZXdlc3QgYml0cyBvZiBhbnkgcG9zc2libGUgcHJlZml4IGNvZGVzIGZvciB0aGF0CisgICAgICAgICBhbHBoYWJldCkuICBTdWNoIGEgY29kZSBpcyBjYWxsZWQgYSBIdWZmbWFuIGNvZGUuICAoU2VlCisgICAgICAgICByZWZlcmVuY2UgWzFdIGluIENoYXB0ZXIgNSwgcmVmZXJlbmNlcyBmb3IgYWRkaXRpb25hbAorICAgICAgICAgaW5mb3JtYXRpb24gb24gSHVmZm1hbiBjb2Rlcy4pCisKKyAgICAgICAgIE5vdGUgdGhhdCBpbiB0aGUgImRlZmxhdGUiIGZvcm1hdCwgdGhlIEh1ZmZtYW4gY29kZXMgZm9yIHRoZQorICAgICAgICAgdmFyaW91cyBhbHBoYWJldHMgbXVzdCBub3QgZXhjZWVkIGNlcnRhaW4gbWF4aW11bSBjb2RlIGxlbmd0aHMuCisgICAgICAgICBUaGlzIGNvbnN0cmFpbnQgY29tcGxpY2F0ZXMgdGhlIGFsZ29yaXRobSBmb3IgY29tcHV0aW5nIGNvZGUKKyAgICAgICAgIGxlbmd0aHMgZnJvbSBzeW1ib2wgZnJlcXVlbmNpZXMuICBBZ2Fpbiwgc2VlIENoYXB0ZXIgNSwKKyAgICAgICAgIHJlZmVyZW5jZXMgZm9yIGRldGFpbHMuCisKKyAgICAgIDMuMi4yLiBVc2Ugb2YgSHVmZm1hbiBjb2RpbmcgaW4gdGhlICJkZWZsYXRlIiBmb3JtYXQKKworICAgICAgICAgVGhlIEh1ZmZtYW4gY29kZXMgdXNlZCBmb3IgZWFjaCBhbHBoYWJldCBpbiB0aGUgImRlZmxhdGUiCisgICAgICAgICBmb3JtYXQgaGF2ZSB0d28gYWRkaXRpb25hbCBydWxlczoKKworICAgICAgICAgICAgICogQWxsIGNvZGVzIG9mIGEgZ2l2ZW4gYml0IGxlbmd0aCBoYXZlIGxleGljb2dyYXBoaWNhbGx5CisgICAgICAgICAgICAgICBjb25zZWN1dGl2ZSB2YWx1ZXMsIGluIHRoZSBzYW1lIG9yZGVyIGFzIHRoZSBzeW1ib2xzCisgICAgICAgICAgICAgICB0aGV5IHJlcHJlc2VudDsKKworICAgICAgICAgICAgICogU2hvcnRlciBjb2RlcyBsZXhpY29ncmFwaGljYWxseSBwcmVjZWRlIGxvbmdlciBjb2Rlcy4KKworCisKKworCisKKworCisKKworCisKK0RldXRzY2ggICAgICAgICAgICAgICAgICAgICAgSW5mb3JtYXRpb25hbCAgICAgICAgICAgICAgICAgICAgICBbUGFnZSA3XQorDAorUkZDIDE5NTEgICAgICBERUZMQVRFIENvbXByZXNzZWQgRGF0YSBGb3JtYXQgU3BlY2lmaWNhdGlvbiAgICAgIE1heSAxOTk2CisKKworICAgICAgICAgV2UgY291bGQgcmVjb2RlIHRoZSBleGFtcGxlIGFib3ZlIHRvIGZvbGxvdyB0aGlzIHJ1bGUgYXMKKyAgICAgICAgIGZvbGxvd3MsIGFzc3VtaW5nIHRoYXQgdGhlIG9yZGVyIG9mIHRoZSBhbHBoYWJldCBpcyBBQkNEOgorCisgICAgICAgICAgICBTeW1ib2wgIENvZGUKKyAgICAgICAgICAgIC0tLS0tLSAgLS0tLQorICAgICAgICAgICAgQSAgICAgICAxMAorICAgICAgICAgICAgQiAgICAgICAwCisgICAgICAgICAgICBDICAgICAgIDExMAorICAgICAgICAgICAgRCAgICAgICAxMTEKKworICAgICAgICAgSS5lLiwgMCBwcmVjZWRlcyAxMCB3aGljaCBwcmVjZWRlcyAxMXgsIGFuZCAxMTAgYW5kIDExMSBhcmUKKyAgICAgICAgIGxleGljb2dyYXBoaWNhbGx5IGNvbnNlY3V0aXZlLgorCisgICAgICAgICBHaXZlbiB0aGlzIHJ1bGUsIHdlIGNhbiBkZWZpbmUgdGhlIEh1ZmZtYW4gY29kZSBmb3IgYW4gYWxwaGFiZXQKKyAgICAgICAgIGp1c3QgYnkgZ2l2aW5nIHRoZSBiaXQgbGVuZ3RocyBvZiB0aGUgY29kZXMgZm9yIGVhY2ggc3ltYm9sIG9mCisgICAgICAgICB0aGUgYWxwaGFiZXQgaW4gb3JkZXI7IHRoaXMgaXMgc3VmZmljaWVudCB0byBkZXRlcm1pbmUgdGhlCisgICAgICAgICBhY3R1YWwgY29kZXMuICBJbiBvdXIgZXhhbXBsZSwgdGhlIGNvZGUgaXMgY29tcGxldGVseSBkZWZpbmVkCisgICAgICAgICBieSB0aGUgc2VxdWVuY2Ugb2YgYml0IGxlbmd0aHMgKDIsIDEsIDMsIDMpLiAgVGhlIGZvbGxvd2luZworICAgICAgICAgYWxnb3JpdGhtIGdlbmVyYXRlcyB0aGUgY29kZXMgYXMgaW50ZWdlcnMsIGludGVuZGVkIHRvIGJlIHJlYWQKKyAgICAgICAgIGZyb20gbW9zdC0gdG8gbGVhc3Qtc2lnbmlmaWNhbnQgYml0LiAgVGhlIGNvZGUgbGVuZ3RocyBhcmUKKyAgICAgICAgIGluaXRpYWxseSBpbiB0cmVlW0ldLkxlbjsgdGhlIGNvZGVzIGFyZSBwcm9kdWNlZCBpbgorICAgICAgICAgdHJlZVtJXS5Db2RlLgorCisgICAgICAgICAxKSAgQ291bnQgdGhlIG51bWJlciBvZiBjb2RlcyBmb3IgZWFjaCBjb2RlIGxlbmd0aC4gIExldAorICAgICAgICAgICAgIGJsX2NvdW50W05dIGJlIHRoZSBudW1iZXIgb2YgY29kZXMgb2YgbGVuZ3RoIE4sIE4gPj0gMS4KKworICAgICAgICAgMikgIEZpbmQgdGhlIG51bWVyaWNhbCB2YWx1ZSBvZiB0aGUgc21hbGxlc3QgY29kZSBmb3IgZWFjaAorICAgICAgICAgICAgIGNvZGUgbGVuZ3RoOgorCisgICAgICAgICAgICAgICAgY29kZSA9IDA7CisgICAgICAgICAgICAgICAgYmxfY291bnRbMF0gPSAwOworICAgICAgICAgICAgICAgIGZvciAoYml0cyA9IDE7IGJpdHMgPD0gTUFYX0JJVFM7IGJpdHMrKykgeworICAgICAgICAgICAgICAgICAgICBjb2RlID0gKGNvZGUgKyBibF9jb3VudFtiaXRzLTFdKSA8PCAxOworICAgICAgICAgICAgICAgICAgICBuZXh0X2NvZGVbYml0c10gPSBjb2RlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgMykgIEFzc2lnbiBudW1lcmljYWwgdmFsdWVzIHRvIGFsbCBjb2RlcywgdXNpbmcgY29uc2VjdXRpdmUKKyAgICAgICAgICAgICB2YWx1ZXMgZm9yIGFsbCBjb2RlcyBvZiB0aGUgc2FtZSBsZW5ndGggd2l0aCB0aGUgYmFzZQorICAgICAgICAgICAgIHZhbHVlcyBkZXRlcm1pbmVkIGF0IHN0ZXAgMi4gQ29kZXMgdGhhdCBhcmUgbmV2ZXIgdXNlZAorICAgICAgICAgICAgICh3aGljaCBoYXZlIGEgYml0IGxlbmd0aCBvZiB6ZXJvKSBtdXN0IG5vdCBiZSBhc3NpZ25lZCBhCisgICAgICAgICAgICAgdmFsdWUuCisKKyAgICAgICAgICAgICAgICBmb3IgKG4gPSAwOyAgbiA8PSBtYXhfY29kZTsgbisrKSB7CisgICAgICAgICAgICAgICAgICAgIGxlbiA9IHRyZWVbbl0uTGVuOworICAgICAgICAgICAgICAgICAgICBpZiAobGVuICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyZWVbbl0uQ29kZSA9IG5leHRfY29kZVtsZW5dOworICAgICAgICAgICAgICAgICAgICAgICAgbmV4dF9jb2RlW2xlbl0rKzsKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKworRGV1dHNjaCAgICAgICAgICAgICAgICAgICAgICBJbmZvcm1hdGlvbmFsICAgICAgICAgICAgICAgICAgICAgIFtQYWdlIDhdCisMCitSRkMgMTk1MSAgICAgIERFRkxBVEUgQ29tcHJlc3NlZCBEYXRhIEZvcm1hdCBTcGVjaWZpY2F0aW9uICAgICAgTWF5IDE5OTYKKworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICBFeGFtcGxlOgorCisgICAgICAgICBDb25zaWRlciB0aGUgYWxwaGFiZXQgQUJDREVGR0gsIHdpdGggYml0IGxlbmd0aHMgKDMsIDMsIDMsIDMsCisgICAgICAgICAzLCAyLCA0LCA0KS4gIEFmdGVyIHN0ZXAgMSwgd2UgaGF2ZToKKworICAgICAgICAgICAgTiAgICAgIGJsX2NvdW50W05dCisgICAgICAgICAgICAtICAgICAgLS0tLS0tLS0tLS0KKyAgICAgICAgICAgIDIgICAgICAxCisgICAgICAgICAgICAzICAgICAgNQorICAgICAgICAgICAgNCAgICAgIDIKKworICAgICAgICAgU3RlcCAyIGNvbXB1dGVzIHRoZSBmb2xsb3dpbmcgbmV4dF9jb2RlIHZhbHVlczoKKworICAgICAgICAgICAgTiAgICAgIG5leHRfY29kZVtOXQorICAgICAgICAgICAgLSAgICAgIC0tLS0tLS0tLS0tLQorICAgICAgICAgICAgMSAgICAgIDAKKyAgICAgICAgICAgIDIgICAgICAwCisgICAgICAgICAgICAzICAgICAgMgorICAgICAgICAgICAgNCAgICAgIDE0CisKKyAgICAgICAgIFN0ZXAgMyBwcm9kdWNlcyB0aGUgZm9sbG93aW5nIGNvZGUgdmFsdWVzOgorCisgICAgICAgICAgICBTeW1ib2wgTGVuZ3RoICAgQ29kZQorICAgICAgICAgICAgLS0tLS0tIC0tLS0tLSAgIC0tLS0KKyAgICAgICAgICAgIEEgICAgICAgMyAgICAgICAgMDEwCisgICAgICAgICAgICBCICAgICAgIDMgICAgICAgIDAxMQorICAgICAgICAgICAgQyAgICAgICAzICAgICAgICAxMDAKKyAgICAgICAgICAgIEQgICAgICAgMyAgICAgICAgMTAxCisgICAgICAgICAgICBFICAgICAgIDMgICAgICAgIDExMAorICAgICAgICAgICAgRiAgICAgICAyICAgICAgICAgMDAKKyAgICAgICAgICAgIEcgICAgICAgNCAgICAgICAxMTEwCisgICAgICAgICAgICBIICAgICAgIDQgICAgICAgMTExMQorCisgICAgICAzLjIuMy4gRGV0YWlscyBvZiBibG9jayBmb3JtYXQKKworICAgICAgICAgRWFjaCBibG9jayBvZiBjb21wcmVzc2VkIGRhdGEgYmVnaW5zIHdpdGggMyBoZWFkZXIgYml0cworICAgICAgICAgY29udGFpbmluZyB0aGUgZm9sbG93aW5nIGRhdGE6CisKKyAgICAgICAgICAgIGZpcnN0IGJpdCAgICAgICBCRklOQUwKKyAgICAgICAgICAgIG5leHQgMiBiaXRzICAgICBCVFlQRQorCisgICAgICAgICBOb3RlIHRoYXQgdGhlIGhlYWRlciBiaXRzIGRvIG5vdCBuZWNlc3NhcmlseSBiZWdpbiBvbiBhIGJ5dGUKKyAgICAgICAgIGJvdW5kYXJ5LCBzaW5jZSBhIGJsb2NrIGRvZXMgbm90IG5lY2Vzc2FyaWx5IG9jY3VweSBhbiBpbnRlZ3JhbAorICAgICAgICAgbnVtYmVyIG9mIGJ5dGVzLgorCisKKworCisKK0RldXRzY2ggICAgICAgICAgICAgICAgICAgICAgSW5mb3JtYXRpb25hbCAgICAgICAgICAgICAgICAgICAgICBbUGFnZSA5XQorDAorUkZDIDE5NTEgICAgICBERUZMQVRFIENvbXByZXNzZWQgRGF0YSBGb3JtYXQgU3BlY2lmaWNhdGlvbiAgICAgIE1heSAxOTk2CisKKworICAgICAgICAgQkZJTkFMIGlzIHNldCBpZiBhbmQgb25seSBpZiB0aGlzIGlzIHRoZSBsYXN0IGJsb2NrIG9mIHRoZSBkYXRhCisgICAgICAgICBzZXQuCisKKyAgICAgICAgIEJUWVBFIHNwZWNpZmllcyBob3cgdGhlIGRhdGEgYXJlIGNvbXByZXNzZWQsIGFzIGZvbGxvd3M6CisKKyAgICAgICAgICAgIDAwIC0gbm8gY29tcHJlc3Npb24KKyAgICAgICAgICAgIDAxIC0gY29tcHJlc3NlZCB3aXRoIGZpeGVkIEh1ZmZtYW4gY29kZXMKKyAgICAgICAgICAgIDEwIC0gY29tcHJlc3NlZCB3aXRoIGR5bmFtaWMgSHVmZm1hbiBjb2RlcworICAgICAgICAgICAgMTEgLSByZXNlcnZlZCAoZXJyb3IpCisKKyAgICAgICAgIFRoZSBvbmx5IGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgdHdvIGNvbXByZXNzZWQgY2FzZXMgaXMgaG93IHRoZQorICAgICAgICAgSHVmZm1hbiBjb2RlcyBmb3IgdGhlIGxpdGVyYWwvbGVuZ3RoIGFuZCBkaXN0YW5jZSBhbHBoYWJldHMgYXJlCisgICAgICAgICBkZWZpbmVkLgorCisgICAgICAgICBJbiBhbGwgY2FzZXMsIHRoZSBkZWNvZGluZyBhbGdvcml0aG0gZm9yIHRoZSBhY3R1YWwgZGF0YSBpcyBhcworICAgICAgICAgZm9sbG93czoKKworICAgICAgICAgICAgZG8KKyAgICAgICAgICAgICAgIHJlYWQgYmxvY2sgaGVhZGVyIGZyb20gaW5wdXQgc3RyZWFtLgorICAgICAgICAgICAgICAgaWYgc3RvcmVkIHdpdGggbm8gY29tcHJlc3Npb24KKyAgICAgICAgICAgICAgICAgIHNraXAgYW55IHJlbWFpbmluZyBiaXRzIGluIGN1cnJlbnQgcGFydGlhbGx5CisgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzZWQgYnl0ZQorICAgICAgICAgICAgICAgICAgcmVhZCBMRU4gYW5kIE5MRU4gKHNlZSBuZXh0IHNlY3Rpb24pCisgICAgICAgICAgICAgICAgICBjb3B5IExFTiBieXRlcyBvZiBkYXRhIHRvIG91dHB1dAorICAgICAgICAgICAgICAgb3RoZXJ3aXNlCisgICAgICAgICAgICAgICAgICBpZiBjb21wcmVzc2VkIHdpdGggZHluYW1pYyBIdWZmbWFuIGNvZGVzCisgICAgICAgICAgICAgICAgICAgICByZWFkIHJlcHJlc2VudGF0aW9uIG9mIGNvZGUgdHJlZXMgKHNlZQorICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2VjdGlvbiBiZWxvdykKKyAgICAgICAgICAgICAgICAgIGxvb3AgKHVudGlsIGVuZCBvZiBibG9jayBjb2RlIHJlY29nbml6ZWQpCisgICAgICAgICAgICAgICAgICAgICBkZWNvZGUgbGl0ZXJhbC9sZW5ndGggdmFsdWUgZnJvbSBpbnB1dCBzdHJlYW0KKyAgICAgICAgICAgICAgICAgICAgIGlmIHZhbHVlIDwgMjU2CisgICAgICAgICAgICAgICAgICAgICAgICBjb3B5IHZhbHVlIChsaXRlcmFsIGJ5dGUpIHRvIG91dHB1dCBzdHJlYW0KKyAgICAgICAgICAgICAgICAgICAgIG90aGVyd2lzZQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgdmFsdWUgPSBlbmQgb2YgYmxvY2sgKDI1NikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIGZyb20gbG9vcAorICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJ3aXNlICh2YWx1ZSA9IDI1Ny4uMjg1KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlIGRpc3RhbmNlIGZyb20gaW5wdXQgc3RyZWFtCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdmUgYmFja3dhcmRzIGRpc3RhbmNlIGJ5dGVzIGluIHRoZSBvdXRwdXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSwgYW5kIGNvcHkgbGVuZ3RoIGJ5dGVzIGZyb20gdGhpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gdG8gdGhlIG91dHB1dCBzdHJlYW0uCisgICAgICAgICAgICAgICAgICBlbmQgbG9vcAorICAgICAgICAgICAgd2hpbGUgbm90IGxhc3QgYmxvY2sKKworICAgICAgICAgTm90ZSB0aGF0IGEgZHVwbGljYXRlZCBzdHJpbmcgcmVmZXJlbmNlIG1heSByZWZlciB0byBhIHN0cmluZworICAgICAgICAgaW4gYSBwcmV2aW91cyBibG9jazsgaS5lLiwgdGhlIGJhY2t3YXJkIGRpc3RhbmNlIG1heSBjcm9zcyBvbmUKKyAgICAgICAgIG9yIG1vcmUgYmxvY2sgYm91bmRhcmllcy4gIEhvd2V2ZXIgYSBkaXN0YW5jZSBjYW5ub3QgcmVmZXIgcGFzdAorICAgICAgICAgdGhlIGJlZ2lubmluZyBvZiB0aGUgb3V0cHV0IHN0cmVhbS4gIChBbiBhcHBsaWNhdGlvbiB1c2luZyBhCisKKworCitEZXV0c2NoICAgICAgICAgICAgICAgICAgICAgIEluZm9ybWF0aW9uYWwgICAgICAgICAgICAgICAgICAgICBbUGFnZSAxMF0KKwwKK1JGQyAxOTUxICAgICAgREVGTEFURSBDb21wcmVzc2VkIERhdGEgRm9ybWF0IFNwZWNpZmljYXRpb24gICAgICBNYXkgMTk5NgorCisKKyAgICAgICAgIHByZXNldCBkaWN0aW9uYXJ5IG1pZ2h0IGRpc2NhcmQgcGFydCBvZiB0aGUgb3V0cHV0IHN0cmVhbTsgYQorICAgICAgICAgZGlzdGFuY2UgY2FuIHJlZmVyIHRvIHRoYXQgcGFydCBvZiB0aGUgb3V0cHV0IHN0cmVhbSBhbnl3YXkpCisgICAgICAgICBOb3RlIGFsc28gdGhhdCB0aGUgcmVmZXJlbmNlZCBzdHJpbmcgbWF5IG92ZXJsYXAgdGhlIGN1cnJlbnQKKyAgICAgICAgIHBvc2l0aW9uOyBmb3IgZXhhbXBsZSwgaWYgdGhlIGxhc3QgMiBieXRlcyBkZWNvZGVkIGhhdmUgdmFsdWVzCisgICAgICAgICBYIGFuZCBZLCBhIHN0cmluZyByZWZlcmVuY2Ugd2l0aCA8bGVuZ3RoID0gNSwgZGlzdGFuY2UgPSAyPgorICAgICAgICAgYWRkcyBYLFksWCxZLFggdG8gdGhlIG91dHB1dCBzdHJlYW0uCisKKyAgICAgICAgIFdlIG5vdyBzcGVjaWZ5IGVhY2ggY29tcHJlc3Npb24gbWV0aG9kIGluIHR1cm4uCisKKyAgICAgIDMuMi40LiBOb24tY29tcHJlc3NlZCBibG9ja3MgKEJUWVBFPTAwKQorCisgICAgICAgICBBbnkgYml0cyBvZiBpbnB1dCB1cCB0byB0aGUgbmV4dCBieXRlIGJvdW5kYXJ5IGFyZSBpZ25vcmVkLgorICAgICAgICAgVGhlIHJlc3Qgb2YgdGhlIGJsb2NrIGNvbnNpc3RzIG9mIHRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb246CisKKyAgICAgICAgICAgICAgMCAgIDEgICAyICAgMyAgIDQuLi4KKyAgICAgICAgICAgICstLS0rLS0tKy0tLSstLS0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rCisgICAgICAgICAgICB8ICBMRU4gIHwgTkxFTiAgfC4uLiBMRU4gYnl0ZXMgb2YgbGl0ZXJhbCBkYXRhLi4ufAorICAgICAgICAgICAgKy0tLSstLS0rLS0tKy0tLSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSsKKworICAgICAgICAgTEVOIGlzIHRoZSBudW1iZXIgb2YgZGF0YSBieXRlcyBpbiB0aGUgYmxvY2suICBOTEVOIGlzIHRoZQorICAgICAgICAgb25lJ3MgY29tcGxlbWVudCBvZiBMRU4uCisKKyAgICAgIDMuMi41LiBDb21wcmVzc2VkIGJsb2NrcyAobGVuZ3RoIGFuZCBkaXN0YW5jZSBjb2RlcykKKworICAgICAgICAgQXMgbm90ZWQgYWJvdmUsIGVuY29kZWQgZGF0YSBibG9ja3MgaW4gdGhlICJkZWZsYXRlIiBmb3JtYXQKKyAgICAgICAgIGNvbnNpc3Qgb2Ygc2VxdWVuY2VzIG9mIHN5bWJvbHMgZHJhd24gZnJvbSB0aHJlZSBjb25jZXB0dWFsbHkKKyAgICAgICAgIGRpc3RpbmN0IGFscGhhYmV0czogZWl0aGVyIGxpdGVyYWwgYnl0ZXMsIGZyb20gdGhlIGFscGhhYmV0IG9mCisgICAgICAgICBieXRlIHZhbHVlcyAoMC4uMjU1KSwgb3IgPGxlbmd0aCwgYmFja3dhcmQgZGlzdGFuY2U+IHBhaXJzLAorICAgICAgICAgd2hlcmUgdGhlIGxlbmd0aCBpcyBkcmF3biBmcm9tICgzLi4yNTgpIGFuZCB0aGUgZGlzdGFuY2UgaXMKKyAgICAgICAgIGRyYXduIGZyb20gKDEuLjMyLDc2OCkuICBJbiBmYWN0LCB0aGUgbGl0ZXJhbCBhbmQgbGVuZ3RoCisgICAgICAgICBhbHBoYWJldHMgYXJlIG1lcmdlZCBpbnRvIGEgc2luZ2xlIGFscGhhYmV0ICgwLi4yODUpLCB3aGVyZQorICAgICAgICAgdmFsdWVzIDAuLjI1NSByZXByZXNlbnQgbGl0ZXJhbCBieXRlcywgdGhlIHZhbHVlIDI1NiBpbmRpY2F0ZXMKKyAgICAgICAgIGVuZC1vZi1ibG9jaywgYW5kIHZhbHVlcyAyNTcuLjI4NSByZXByZXNlbnQgbGVuZ3RoIGNvZGVzCisgICAgICAgICAocG9zc2libHkgaW4gY29uanVuY3Rpb24gd2l0aCBleHRyYSBiaXRzIGZvbGxvd2luZyB0aGUgc3ltYm9sCisgICAgICAgICBjb2RlKSBhcyBmb2xsb3dzOgorCisKKworCisKKworCisKKworCisKKworCisKKworCitEZXV0c2NoICAgICAgICAgICAgICAgICAgICAgIEluZm9ybWF0aW9uYWwgICAgICAgICAgICAgICAgICAgICBbUGFnZSAxMV0KKwwKK1JGQyAxOTUxICAgICAgREVGTEFURSBDb21wcmVzc2VkIERhdGEgRm9ybWF0IFNwZWNpZmljYXRpb24gICAgICBNYXkgMTk5NgorCisKKyAgICAgICAgICAgICAgICAgRXh0cmEgICAgICAgICAgICAgICBFeHRyYSAgICAgICAgICAgICAgIEV4dHJhCisgICAgICAgICAgICBDb2RlIEJpdHMgTGVuZ3RoKHMpIENvZGUgQml0cyBMZW5ndGhzICAgQ29kZSBCaXRzIExlbmd0aChzKQorICAgICAgICAgICAgLS0tLSAtLS0tIC0tLS0tLSAgICAgLS0tLSAtLS0tIC0tLS0tLS0gICAtLS0tIC0tLS0gLS0tLS0tLQorICAgICAgICAgICAgIDI1NyAgIDAgICAgIDMgICAgICAgMjY3ICAgMSAgIDE1LDE2ICAgICAyNzcgICA0ICAgNjctODIKKyAgICAgICAgICAgICAyNTggICAwICAgICA0ICAgICAgIDI2OCAgIDEgICAxNywxOCAgICAgMjc4ICAgNCAgIDgzLTk4CisgICAgICAgICAgICAgMjU5ICAgMCAgICAgNSAgICAgICAyNjkgICAyICAgMTktMjIgICAgIDI3OSAgIDQgICA5OS0xMTQKKyAgICAgICAgICAgICAyNjAgICAwICAgICA2ICAgICAgIDI3MCAgIDIgICAyMy0yNiAgICAgMjgwICAgNCAgMTE1LTEzMAorICAgICAgICAgICAgIDI2MSAgIDAgICAgIDcgICAgICAgMjcxICAgMiAgIDI3LTMwICAgICAyODEgICA1ICAxMzEtMTYyCisgICAgICAgICAgICAgMjYyICAgMCAgICAgOCAgICAgICAyNzIgICAyICAgMzEtMzQgICAgIDI4MiAgIDUgIDE2My0xOTQKKyAgICAgICAgICAgICAyNjMgICAwICAgICA5ICAgICAgIDI3MyAgIDMgICAzNS00MiAgICAgMjgzICAgNSAgMTk1LTIyNgorICAgICAgICAgICAgIDI2NCAgIDAgICAgMTAgICAgICAgMjc0ICAgMyAgIDQzLTUwICAgICAyODQgICA1ICAyMjctMjU3CisgICAgICAgICAgICAgMjY1ICAgMSAgMTEsMTIgICAgICAyNzUgICAzICAgNTEtNTggICAgIDI4NSAgIDAgICAgMjU4CisgICAgICAgICAgICAgMjY2ICAgMSAgMTMsMTQgICAgICAyNzYgICAzICAgNTktNjYKKworICAgICAgICAgVGhlIGV4dHJhIGJpdHMgc2hvdWxkIGJlIGludGVycHJldGVkIGFzIGEgbWFjaGluZSBpbnRlZ2VyCisgICAgICAgICBzdG9yZWQgd2l0aCB0aGUgbW9zdC1zaWduaWZpY2FudCBiaXQgZmlyc3QsIGUuZy4sIGJpdHMgMTExMAorICAgICAgICAgcmVwcmVzZW50IHRoZSB2YWx1ZSAxNC4KKworICAgICAgICAgICAgICAgICAgRXh0cmEgICAgICAgICAgIEV4dHJhICAgICAgICAgICAgICAgRXh0cmEKKyAgICAgICAgICAgICBDb2RlIEJpdHMgRGlzdCAgQ29kZSBCaXRzICAgRGlzdCAgICAgQ29kZSBCaXRzIERpc3RhbmNlCisgICAgICAgICAgICAgLS0tLSAtLS0tIC0tLS0gIC0tLS0gLS0tLSAgLS0tLS0tICAgIC0tLS0gLS0tLSAtLS0tLS0tLQorICAgICAgICAgICAgICAgMCAgIDAgICAgMSAgICAgMTAgICA0ICAgICAzMy00OCAgICAyMCAgICA5ICAgMTAyNS0xNTM2CisgICAgICAgICAgICAgICAxICAgMCAgICAyICAgICAxMSAgIDQgICAgIDQ5LTY0ICAgIDIxICAgIDkgICAxNTM3LTIwNDgKKyAgICAgICAgICAgICAgIDIgICAwICAgIDMgICAgIDEyICAgNSAgICAgNjUtOTYgICAgMjIgICAxMCAgIDIwNDktMzA3MgorICAgICAgICAgICAgICAgMyAgIDAgICAgNCAgICAgMTMgICA1ICAgICA5Ny0xMjggICAyMyAgIDEwICAgMzA3My00MDk2CisgICAgICAgICAgICAgICA0ICAgMSAgIDUsNiAgICAxNCAgIDYgICAgMTI5LTE5MiAgIDI0ICAgMTEgICA0MDk3LTYxNDQKKyAgICAgICAgICAgICAgIDUgICAxICAgNyw4ICAgIDE1ICAgNiAgICAxOTMtMjU2ICAgMjUgICAxMSAgIDYxNDUtODE5MgorICAgICAgICAgICAgICAgNiAgIDIgICA5LTEyICAgMTYgICA3ICAgIDI1Ny0zODQgICAyNiAgIDEyICA4MTkzLTEyMjg4CisgICAgICAgICAgICAgICA3ICAgMiAgMTMtMTYgICAxNyAgIDcgICAgMzg1LTUxMiAgIDI3ICAgMTIgMTIyODktMTYzODQKKyAgICAgICAgICAgICAgIDggICAzICAxNy0yNCAgIDE4ICAgOCAgICA1MTMtNzY4ICAgMjggICAxMyAxNjM4NS0yNDU3NgorICAgICAgICAgICAgICAgOSAgIDMgIDI1LTMyICAgMTkgICA4ICAgNzY5LTEwMjQgICAyOSAgIDEzIDI0NTc3LTMyNzY4CisKKyAgICAgIDMuMi42LiBDb21wcmVzc2lvbiB3aXRoIGZpeGVkIEh1ZmZtYW4gY29kZXMgKEJUWVBFPTAxKQorCisgICAgICAgICBUaGUgSHVmZm1hbiBjb2RlcyBmb3IgdGhlIHR3byBhbHBoYWJldHMgYXJlIGZpeGVkLCBhbmQgYXJlIG5vdAorICAgICAgICAgcmVwcmVzZW50ZWQgZXhwbGljaXRseSBpbiB0aGUgZGF0YS4gIFRoZSBIdWZmbWFuIGNvZGUgbGVuZ3RocworICAgICAgICAgZm9yIHRoZSBsaXRlcmFsL2xlbmd0aCBhbHBoYWJldCBhcmU6CisKKyAgICAgICAgICAgICAgICAgICBMaXQgVmFsdWUgICAgQml0cyAgICAgICAgQ29kZXMKKyAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0gICAgLS0tLSAgICAgICAgLS0tLS0KKyAgICAgICAgICAgICAgICAgICAgIDAgLSAxNDMgICAgIDggICAgICAgICAgMDAxMTAwMDAgdGhyb3VnaAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDExMTExMQorICAgICAgICAgICAgICAgICAgIDE0NCAtIDI1NSAgICAgOSAgICAgICAgICAxMTAwMTAwMDAgdGhyb3VnaAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTExMTExMTEKKyAgICAgICAgICAgICAgICAgICAyNTYgLSAyNzkgICAgIDcgICAgICAgICAgMDAwMDAwMCB0aHJvdWdoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAwMTAxMTEKKyAgICAgICAgICAgICAgICAgICAyODAgLSAyODcgICAgIDggICAgICAgICAgMTEwMDAwMDAgdGhyb3VnaAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTAwMDExMQorCisKKworRGV1dHNjaCAgICAgICAgICAgICAgICAgICAgICBJbmZvcm1hdGlvbmFsICAgICAgICAgICAgICAgICAgICAgW1BhZ2UgMTJdCisMCitSRkMgMTk1MSAgICAgIERFRkxBVEUgQ29tcHJlc3NlZCBEYXRhIEZvcm1hdCBTcGVjaWZpY2F0aW9uICAgICAgTWF5IDE5OTYKKworCisgICAgICAgICBUaGUgY29kZSBsZW5ndGhzIGFyZSBzdWZmaWNpZW50IHRvIGdlbmVyYXRlIHRoZSBhY3R1YWwgY29kZXMsCisgICAgICAgICBhcyBkZXNjcmliZWQgYWJvdmU7IHdlIHNob3cgdGhlIGNvZGVzIGluIHRoZSB0YWJsZSBmb3IgYWRkZWQKKyAgICAgICAgIGNsYXJpdHkuICBMaXRlcmFsL2xlbmd0aCB2YWx1ZXMgMjg2LTI4NyB3aWxsIG5ldmVyIGFjdHVhbGx5CisgICAgICAgICBvY2N1ciBpbiB0aGUgY29tcHJlc3NlZCBkYXRhLCBidXQgcGFydGljaXBhdGUgaW4gdGhlIGNvZGUKKyAgICAgICAgIGNvbnN0cnVjdGlvbi4KKworICAgICAgICAgRGlzdGFuY2UgY29kZXMgMC0zMSBhcmUgcmVwcmVzZW50ZWQgYnkgKGZpeGVkLWxlbmd0aCkgNS1iaXQKKyAgICAgICAgIGNvZGVzLCB3aXRoIHBvc3NpYmxlIGFkZGl0aW9uYWwgYml0cyBhcyBzaG93biBpbiB0aGUgdGFibGUKKyAgICAgICAgIHNob3duIGluIFBhcmFncmFwaCAzLjIuNSwgYWJvdmUuICBOb3RlIHRoYXQgZGlzdGFuY2UgY29kZXMgMzAtCisgICAgICAgICAzMSB3aWxsIG5ldmVyIGFjdHVhbGx5IG9jY3VyIGluIHRoZSBjb21wcmVzc2VkIGRhdGEuCisKKyAgICAgIDMuMi43LiBDb21wcmVzc2lvbiB3aXRoIGR5bmFtaWMgSHVmZm1hbiBjb2RlcyAoQlRZUEU9MTApCisKKyAgICAgICAgIFRoZSBIdWZmbWFuIGNvZGVzIGZvciB0aGUgdHdvIGFscGhhYmV0cyBhcHBlYXIgaW4gdGhlIGJsb2NrCisgICAgICAgICBpbW1lZGlhdGVseSBhZnRlciB0aGUgaGVhZGVyIGJpdHMgYW5kIGJlZm9yZSB0aGUgYWN0dWFsCisgICAgICAgICBjb21wcmVzc2VkIGRhdGEsIGZpcnN0IHRoZSBsaXRlcmFsL2xlbmd0aCBjb2RlIGFuZCB0aGVuIHRoZQorICAgICAgICAgZGlzdGFuY2UgY29kZS4gIEVhY2ggY29kZSBpcyBkZWZpbmVkIGJ5IGEgc2VxdWVuY2Ugb2YgY29kZQorICAgICAgICAgbGVuZ3RocywgYXMgZGlzY3Vzc2VkIGluIFBhcmFncmFwaCAzLjIuMiwgYWJvdmUuICBGb3IgZXZlbgorICAgICAgICAgZ3JlYXRlciBjb21wYWN0bmVzcywgdGhlIGNvZGUgbGVuZ3RoIHNlcXVlbmNlcyB0aGVtc2VsdmVzIGFyZQorICAgICAgICAgY29tcHJlc3NlZCB1c2luZyBhIEh1ZmZtYW4gY29kZS4gIFRoZSBhbHBoYWJldCBmb3IgY29kZSBsZW5ndGhzCisgICAgICAgICBpcyBhcyBmb2xsb3dzOgorCisgICAgICAgICAgICAgICAwIC0gMTU6IFJlcHJlc2VudCBjb2RlIGxlbmd0aHMgb2YgMCAtIDE1CisgICAgICAgICAgICAgICAgICAgMTY6IENvcHkgdGhlIHByZXZpb3VzIGNvZGUgbGVuZ3RoIDMgLSA2IHRpbWVzLgorICAgICAgICAgICAgICAgICAgICAgICBUaGUgbmV4dCAyIGJpdHMgaW5kaWNhdGUgcmVwZWF0IGxlbmd0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMCA9IDMsIC4uLiAsIDMgPSA2KQorICAgICAgICAgICAgICAgICAgICAgICAgICBFeGFtcGxlOiAgQ29kZXMgOCwgMTYgKCsyIGJpdHMgMTEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYgKCsyIGJpdHMgMTApIHdpbGwgZXhwYW5kIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMiBjb2RlIGxlbmd0aHMgb2YgOCAoMSArIDYgKyA1KQorICAgICAgICAgICAgICAgICAgIDE3OiBSZXBlYXQgYSBjb2RlIGxlbmd0aCBvZiAwIGZvciAzIC0gMTAgdGltZXMuCisgICAgICAgICAgICAgICAgICAgICAgICgzIGJpdHMgb2YgbGVuZ3RoKQorICAgICAgICAgICAgICAgICAgIDE4OiBSZXBlYXQgYSBjb2RlIGxlbmd0aCBvZiAwIGZvciAxMSAtIDEzOCB0aW1lcworICAgICAgICAgICAgICAgICAgICAgICAoNyBiaXRzIG9mIGxlbmd0aCkKKworICAgICAgICAgQSBjb2RlIGxlbmd0aCBvZiAwIGluZGljYXRlcyB0aGF0IHRoZSBjb3JyZXNwb25kaW5nIHN5bWJvbCBpbgorICAgICAgICAgdGhlIGxpdGVyYWwvbGVuZ3RoIG9yIGRpc3RhbmNlIGFscGhhYmV0IHdpbGwgbm90IG9jY3VyIGluIHRoZQorICAgICAgICAgYmxvY2ssIGFuZCBzaG91bGQgbm90IHBhcnRpY2lwYXRlIGluIHRoZSBIdWZmbWFuIGNvZGUKKyAgICAgICAgIGNvbnN0cnVjdGlvbiBhbGdvcml0aG0gZ2l2ZW4gZWFybGllci4gIElmIG9ubHkgb25lIGRpc3RhbmNlCisgICAgICAgICBjb2RlIGlzIHVzZWQsIGl0IGlzIGVuY29kZWQgdXNpbmcgb25lIGJpdCwgbm90IHplcm8gYml0czsgaW4KKyAgICAgICAgIHRoaXMgY2FzZSB0aGVyZSBpcyBhIHNpbmdsZSBjb2RlIGxlbmd0aCBvZiBvbmUsIHdpdGggb25lIHVudXNlZAorICAgICAgICAgY29kZS4gIE9uZSBkaXN0YW5jZSBjb2RlIG9mIHplcm8gYml0cyBtZWFucyB0aGF0IHRoZXJlIGFyZSBubworICAgICAgICAgZGlzdGFuY2UgY29kZXMgdXNlZCBhdCBhbGwgKHRoZSBkYXRhIGlzIGFsbCBsaXRlcmFscykuCisKKyAgICAgICAgIFdlIGNhbiBub3cgZGVmaW5lIHRoZSBmb3JtYXQgb2YgdGhlIGJsb2NrOgorCisgICAgICAgICAgICAgICA1IEJpdHM6IEhMSVQsICMgb2YgTGl0ZXJhbC9MZW5ndGggY29kZXMgLSAyNTcgKDI1NyAtIDI4NikKKyAgICAgICAgICAgICAgIDUgQml0czogSERJU1QsICMgb2YgRGlzdGFuY2UgY29kZXMgLSAxICAgICAgICAoMSAtIDMyKQorICAgICAgICAgICAgICAgNCBCaXRzOiBIQ0xFTiwgIyBvZiBDb2RlIExlbmd0aCBjb2RlcyAtIDQgICAgICg0IC0gMTkpCisKKworCitEZXV0c2NoICAgICAgICAgICAgICAgICAgICAgIEluZm9ybWF0aW9uYWwgICAgICAgICAgICAgICAgICAgICBbUGFnZSAxM10KKwwKK1JGQyAxOTUxICAgICAgREVGTEFURSBDb21wcmVzc2VkIERhdGEgRm9ybWF0IFNwZWNpZmljYXRpb24gICAgICBNYXkgMTk5NgorCisKKyAgICAgICAgICAgICAgIChIQ0xFTiArIDQpIHggMyBiaXRzOiBjb2RlIGxlbmd0aHMgZm9yIHRoZSBjb2RlIGxlbmd0aAorICAgICAgICAgICAgICAgICAgYWxwaGFiZXQgZ2l2ZW4ganVzdCBhYm92ZSwgaW4gdGhlIG9yZGVyOiAxNiwgMTcsIDE4LAorICAgICAgICAgICAgICAgICAgMCwgOCwgNywgOSwgNiwgMTAsIDUsIDExLCA0LCAxMiwgMywgMTMsIDIsIDE0LCAxLCAxNQorCisgICAgICAgICAgICAgICAgICBUaGVzZSBjb2RlIGxlbmd0aHMgYXJlIGludGVycHJldGVkIGFzIDMtYml0IGludGVnZXJzCisgICAgICAgICAgICAgICAgICAoMC03KTsgYXMgYWJvdmUsIGEgY29kZSBsZW5ndGggb2YgMCBtZWFucyB0aGUKKyAgICAgICAgICAgICAgICAgIGNvcnJlc3BvbmRpbmcgc3ltYm9sIChsaXRlcmFsL2xlbmd0aCBvciBkaXN0YW5jZSBjb2RlCisgICAgICAgICAgICAgICAgICBsZW5ndGgpIGlzIG5vdCB1c2VkLgorCisgICAgICAgICAgICAgICBITElUICsgMjU3IGNvZGUgbGVuZ3RocyBmb3IgdGhlIGxpdGVyYWwvbGVuZ3RoIGFscGhhYmV0LAorICAgICAgICAgICAgICAgICAgZW5jb2RlZCB1c2luZyB0aGUgY29kZSBsZW5ndGggSHVmZm1hbiBjb2RlCisKKyAgICAgICAgICAgICAgIEhESVNUICsgMSBjb2RlIGxlbmd0aHMgZm9yIHRoZSBkaXN0YW5jZSBhbHBoYWJldCwKKyAgICAgICAgICAgICAgICAgIGVuY29kZWQgdXNpbmcgdGhlIGNvZGUgbGVuZ3RoIEh1ZmZtYW4gY29kZQorCisgICAgICAgICAgICAgICBUaGUgYWN0dWFsIGNvbXByZXNzZWQgZGF0YSBvZiB0aGUgYmxvY2ssCisgICAgICAgICAgICAgICAgICBlbmNvZGVkIHVzaW5nIHRoZSBsaXRlcmFsL2xlbmd0aCBhbmQgZGlzdGFuY2UgSHVmZm1hbgorICAgICAgICAgICAgICAgICAgY29kZXMKKworICAgICAgICAgICAgICAgVGhlIGxpdGVyYWwvbGVuZ3RoIHN5bWJvbCAyNTYgKGVuZCBvZiBkYXRhKSwKKyAgICAgICAgICAgICAgICAgIGVuY29kZWQgdXNpbmcgdGhlIGxpdGVyYWwvbGVuZ3RoIEh1ZmZtYW4gY29kZQorCisgICAgICAgICBUaGUgY29kZSBsZW5ndGggcmVwZWF0IGNvZGVzIGNhbiBjcm9zcyBmcm9tIEhMSVQgKyAyNTcgdG8gdGhlCisgICAgICAgICBIRElTVCArIDEgY29kZSBsZW5ndGhzLiAgSW4gb3RoZXIgd29yZHMsIGFsbCBjb2RlIGxlbmd0aHMgZm9ybQorICAgICAgICAgYSBzaW5nbGUgc2VxdWVuY2Ugb2YgSExJVCArIEhESVNUICsgMjU4IHZhbHVlcy4KKworICAgMy4zLiBDb21wbGlhbmNlCisKKyAgICAgIEEgY29tcHJlc3NvciBtYXkgbGltaXQgZnVydGhlciB0aGUgcmFuZ2VzIG9mIHZhbHVlcyBzcGVjaWZpZWQgaW4KKyAgICAgIHRoZSBwcmV2aW91cyBzZWN0aW9uIGFuZCBzdGlsbCBiZSBjb21wbGlhbnQ7IGZvciBleGFtcGxlLCBpdCBtYXkKKyAgICAgIGxpbWl0IHRoZSByYW5nZSBvZiBiYWNrd2FyZCBwb2ludGVycyB0byBzb21lIHZhbHVlIHNtYWxsZXIgdGhhbgorICAgICAgMzJLLiAgU2ltaWxhcmx5LCBhIGNvbXByZXNzb3IgbWF5IGxpbWl0IHRoZSBzaXplIG9mIGJsb2NrcyBzbyB0aGF0CisgICAgICBhIGNvbXByZXNzaWJsZSBibG9jayBmaXRzIGluIG1lbW9yeS4KKworICAgICAgQSBjb21wbGlhbnQgZGVjb21wcmVzc29yIG11c3QgYWNjZXB0IHRoZSBmdWxsIHJhbmdlIG9mIHBvc3NpYmxlCisgICAgICB2YWx1ZXMgZGVmaW5lZCBpbiB0aGUgcHJldmlvdXMgc2VjdGlvbiwgYW5kIG11c3QgYWNjZXB0IGJsb2NrcyBvZgorICAgICAgYXJiaXRyYXJ5IHNpemUuCisKKzQuIENvbXByZXNzaW9uIGFsZ29yaXRobSBkZXRhaWxzCisKKyAgIFdoaWxlIGl0IGlzIHRoZSBpbnRlbnQgb2YgdGhpcyBkb2N1bWVudCB0byBkZWZpbmUgdGhlICJkZWZsYXRlIgorICAgY29tcHJlc3NlZCBkYXRhIGZvcm1hdCB3aXRob3V0IHJlZmVyZW5jZSB0byBhbnkgcGFydGljdWxhcgorICAgY29tcHJlc3Npb24gYWxnb3JpdGhtLCB0aGUgZm9ybWF0IGlzIHJlbGF0ZWQgdG8gdGhlIGNvbXByZXNzZWQKKyAgIGZvcm1hdHMgcHJvZHVjZWQgYnkgTFo3NyAoTGVtcGVsLVppdiAxOTc3LCBzZWUgcmVmZXJlbmNlIFsyXSBiZWxvdyk7CisgICBzaW5jZSBtYW55IHZhcmlhdGlvbnMgb2YgTFo3NyBhcmUgcGF0ZW50ZWQsIGl0IGlzIHN0cm9uZ2x5CisgICByZWNvbW1lbmRlZCB0aGF0IHRoZSBpbXBsZW1lbnRvciBvZiBhIGNvbXByZXNzb3IgZm9sbG93IHRoZSBnZW5lcmFsCisgICBhbGdvcml0aG0gcHJlc2VudGVkIGhlcmUsIHdoaWNoIGlzIGtub3duIG5vdCB0byBiZSBwYXRlbnRlZCBwZXIgc2UuCisgICBUaGUgbWF0ZXJpYWwgaW4gdGhpcyBzZWN0aW9uIGlzIG5vdCBwYXJ0IG9mIHRoZSBkZWZpbml0aW9uIG9mIHRoZQorCisKKworRGV1dHNjaCAgICAgICAgICAgICAgICAgICAgICBJbmZvcm1hdGlvbmFsICAgICAgICAgICAgICAgICAgICAgW1BhZ2UgMTRdCisMCitSRkMgMTk1MSAgICAgIERFRkxBVEUgQ29tcHJlc3NlZCBEYXRhIEZvcm1hdCBTcGVjaWZpY2F0aW9uICAgICAgTWF5IDE5OTYKKworCisgICBzcGVjaWZpY2F0aW9uIHBlciBzZSwgYW5kIGEgY29tcHJlc3NvciBuZWVkIG5vdCBmb2xsb3cgaXQgaW4gb3JkZXIgdG8KKyAgIGJlIGNvbXBsaWFudC4KKworICAgVGhlIGNvbXByZXNzb3IgdGVybWluYXRlcyBhIGJsb2NrIHdoZW4gaXQgZGV0ZXJtaW5lcyB0aGF0IHN0YXJ0aW5nIGEKKyAgIG5ldyBibG9jayB3aXRoIGZyZXNoIHRyZWVzIHdvdWxkIGJlIHVzZWZ1bCwgb3Igd2hlbiB0aGUgYmxvY2sgc2l6ZQorICAgZmlsbHMgdXAgdGhlIGNvbXByZXNzb3IncyBibG9jayBidWZmZXIuCisKKyAgIFRoZSBjb21wcmVzc29yIHVzZXMgYSBjaGFpbmVkIGhhc2ggdGFibGUgdG8gZmluZCBkdXBsaWNhdGVkIHN0cmluZ3MsCisgICB1c2luZyBhIGhhc2ggZnVuY3Rpb24gdGhhdCBvcGVyYXRlcyBvbiAzLWJ5dGUgc2VxdWVuY2VzLiAgQXQgYW55CisgICBnaXZlbiBwb2ludCBkdXJpbmcgY29tcHJlc3Npb24sIGxldCBYWVogYmUgdGhlIG5leHQgMyBpbnB1dCBieXRlcyB0bworICAgYmUgZXhhbWluZWQgKG5vdCBuZWNlc3NhcmlseSBhbGwgZGlmZmVyZW50LCBvZiBjb3Vyc2UpLiAgRmlyc3QsIHRoZQorICAgY29tcHJlc3NvciBleGFtaW5lcyB0aGUgaGFzaCBjaGFpbiBmb3IgWFlaLiAgSWYgdGhlIGNoYWluIGlzIGVtcHR5LAorICAgdGhlIGNvbXByZXNzb3Igc2ltcGx5IHdyaXRlcyBvdXQgWCBhcyBhIGxpdGVyYWwgYnl0ZSBhbmQgYWR2YW5jZXMgb25lCisgICBieXRlIGluIHRoZSBpbnB1dC4gIElmIHRoZSBoYXNoIGNoYWluIGlzIG5vdCBlbXB0eSwgaW5kaWNhdGluZyB0aGF0CisgICB0aGUgc2VxdWVuY2UgWFlaIChvciwgaWYgd2UgYXJlIHVubHVja3ksIHNvbWUgb3RoZXIgMyBieXRlcyB3aXRoIHRoZQorICAgc2FtZSBoYXNoIGZ1bmN0aW9uIHZhbHVlKSBoYXMgb2NjdXJyZWQgcmVjZW50bHksIHRoZSBjb21wcmVzc29yCisgICBjb21wYXJlcyBhbGwgc3RyaW5ncyBvbiB0aGUgWFlaIGhhc2ggY2hhaW4gd2l0aCB0aGUgYWN0dWFsIGlucHV0IGRhdGEKKyAgIHNlcXVlbmNlIHN0YXJ0aW5nIGF0IHRoZSBjdXJyZW50IHBvaW50LCBhbmQgc2VsZWN0cyB0aGUgbG9uZ2VzdAorICAgbWF0Y2guCisKKyAgIFRoZSBjb21wcmVzc29yIHNlYXJjaGVzIHRoZSBoYXNoIGNoYWlucyBzdGFydGluZyB3aXRoIHRoZSBtb3N0IHJlY2VudAorICAgc3RyaW5ncywgdG8gZmF2b3Igc21hbGwgZGlzdGFuY2VzIGFuZCB0aHVzIHRha2UgYWR2YW50YWdlIG9mIHRoZQorICAgSHVmZm1hbiBlbmNvZGluZy4gIFRoZSBoYXNoIGNoYWlucyBhcmUgc2luZ2x5IGxpbmtlZC4gVGhlcmUgYXJlIG5vCisgICBkZWxldGlvbnMgZnJvbSB0aGUgaGFzaCBjaGFpbnM7IHRoZSBhbGdvcml0aG0gc2ltcGx5IGRpc2NhcmRzIG1hdGNoZXMKKyAgIHRoYXQgYXJlIHRvbyBvbGQuICBUbyBhdm9pZCBhIHdvcnN0LWNhc2Ugc2l0dWF0aW9uLCB2ZXJ5IGxvbmcgaGFzaAorICAgY2hhaW5zIGFyZSBhcmJpdHJhcmlseSB0cnVuY2F0ZWQgYXQgYSBjZXJ0YWluIGxlbmd0aCwgZGV0ZXJtaW5lZCBieSBhCisgICBydW4tdGltZSBwYXJhbWV0ZXIuCisKKyAgIFRvIGltcHJvdmUgb3ZlcmFsbCBjb21wcmVzc2lvbiwgdGhlIGNvbXByZXNzb3Igb3B0aW9uYWxseSBkZWZlcnMgdGhlCisgICBzZWxlY3Rpb24gb2YgbWF0Y2hlcyAoImxhenkgbWF0Y2hpbmciKTogYWZ0ZXIgYSBtYXRjaCBvZiBsZW5ndGggTiBoYXMKKyAgIGJlZW4gZm91bmQsIHRoZSBjb21wcmVzc29yIHNlYXJjaGVzIGZvciBhIGxvbmdlciBtYXRjaCBzdGFydGluZyBhdAorICAgdGhlIG5leHQgaW5wdXQgYnl0ZS4gIElmIGl0IGZpbmRzIGEgbG9uZ2VyIG1hdGNoLCBpdCB0cnVuY2F0ZXMgdGhlCisgICBwcmV2aW91cyBtYXRjaCB0byBhIGxlbmd0aCBvZiBvbmUgKHRodXMgcHJvZHVjaW5nIGEgc2luZ2xlIGxpdGVyYWwKKyAgIGJ5dGUpIGFuZCB0aGVuIGVtaXRzIHRoZSBsb25nZXIgbWF0Y2guICBPdGhlcndpc2UsIGl0IGVtaXRzIHRoZQorICAgb3JpZ2luYWwgbWF0Y2gsIGFuZCwgYXMgZGVzY3JpYmVkIGFib3ZlLCBhZHZhbmNlcyBOIGJ5dGVzIGJlZm9yZQorICAgY29udGludWluZy4KKworICAgUnVuLXRpbWUgcGFyYW1ldGVycyBhbHNvIGNvbnRyb2wgdGhpcyAibGF6eSBtYXRjaCIgcHJvY2VkdXJlLiAgSWYKKyAgIGNvbXByZXNzaW9uIHJhdGlvIGlzIG1vc3QgaW1wb3J0YW50LCB0aGUgY29tcHJlc3NvciBhdHRlbXB0cyBhCisgICBjb21wbGV0ZSBzZWNvbmQgc2VhcmNoIHJlZ2FyZGxlc3Mgb2YgdGhlIGxlbmd0aCBvZiB0aGUgZmlyc3QgbWF0Y2guCisgICBJbiB0aGUgbm9ybWFsIGNhc2UsIGlmIHRoZSBjdXJyZW50IG1hdGNoIGlzICJsb25nIGVub3VnaCIsIHRoZQorICAgY29tcHJlc3NvciByZWR1Y2VzIHRoZSBzZWFyY2ggZm9yIGEgbG9uZ2VyIG1hdGNoLCB0aHVzIHNwZWVkaW5nIHVwCisgICB0aGUgcHJvY2Vzcy4gIElmIHNwZWVkIGlzIG1vc3QgaW1wb3J0YW50LCB0aGUgY29tcHJlc3NvciBpbnNlcnRzIG5ldworICAgc3RyaW5ncyBpbiB0aGUgaGFzaCB0YWJsZSBvbmx5IHdoZW4gbm8gbWF0Y2ggd2FzIGZvdW5kLCBvciB3aGVuIHRoZQorICAgbWF0Y2ggaXMgbm90ICJ0b28gbG9uZyIuICBUaGlzIGRlZ3JhZGVzIHRoZSBjb21wcmVzc2lvbiByYXRpbyBidXQKKyAgIHNhdmVzIHRpbWUgc2luY2UgdGhlcmUgYXJlIGJvdGggZmV3ZXIgaW5zZXJ0aW9ucyBhbmQgZmV3ZXIgc2VhcmNoZXMuCisKKworCisKKworRGV1dHNjaCAgICAgICAgICAgICAgICAgICAgICBJbmZvcm1hdGlvbmFsICAgICAgICAgICAgICAgICAgICAgW1BhZ2UgMTVdCisMCitSRkMgMTk1MSAgICAgIERFRkxBVEUgQ29tcHJlc3NlZCBEYXRhIEZvcm1hdCBTcGVjaWZpY2F0aW9uICAgICAgTWF5IDE5OTYKKworCis1LiBSZWZlcmVuY2VzCisKKyAgIFsxXSBIdWZmbWFuLCBELiBBLiwgIkEgTWV0aG9kIGZvciB0aGUgQ29uc3RydWN0aW9uIG9mIE1pbmltdW0KKyAgICAgICBSZWR1bmRhbmN5IENvZGVzIiwgUHJvY2VlZGluZ3Mgb2YgdGhlIEluc3RpdHV0ZSBvZiBSYWRpbworICAgICAgIEVuZ2luZWVycywgU2VwdGVtYmVyIDE5NTIsIFZvbHVtZSA0MCwgTnVtYmVyIDksIHBwLiAxMDk4LTExMDEuCisKKyAgIFsyXSBaaXYgSi4sIExlbXBlbCBBLiwgIkEgVW5pdmVyc2FsIEFsZ29yaXRobSBmb3IgU2VxdWVudGlhbCBEYXRhCisgICAgICAgQ29tcHJlc3Npb24iLCBJRUVFIFRyYW5zYWN0aW9ucyBvbiBJbmZvcm1hdGlvbiBUaGVvcnksIFZvbC4gMjMsCisgICAgICAgTm8uIDMsIHBwLiAzMzctMzQzLgorCisgICBbM10gR2FpbGx5LCBKLi1MLiwgYW5kIEFkbGVyLCBNLiwgWkxJQiBkb2N1bWVudGF0aW9uIGFuZCBzb3VyY2VzLAorICAgICAgIGF2YWlsYWJsZSBpbiBmdHA6Ly9mdHAudXUubmV0L3B1Yi9hcmNoaXZpbmcvemlwL2RvYy8KKworICAgWzRdIEdhaWxseSwgSi4tTC4sIGFuZCBBZGxlciwgTS4sIEdaSVAgZG9jdW1lbnRhdGlvbiBhbmQgc291cmNlcywKKyAgICAgICBhdmFpbGFibGUgYXMgZ3ppcC0qLnRhciBpbiBmdHA6Ly9wcmVwLmFpLm1pdC5lZHUvcHViL2dudS8KKworICAgWzVdIFNjaHdhcnR6LCBFLiBTLiwgYW5kIEthbGxpY2ssIEIuICJHZW5lcmF0aW5nIGEgY2Fub25pY2FsIHByZWZpeAorICAgICAgIGVuY29kaW5nLiIgQ29tbS4gQUNNLCA3LDMgKE1hci4gMTk2NCksIHBwLiAxNjYtMTY5LgorCisgICBbNl0gSGlyc2NoYmVyZyBhbmQgTGVsZXdlciwgIkVmZmljaWVudCBkZWNvZGluZyBvZiBwcmVmaXggY29kZXMsIgorICAgICAgIENvbW0uIEFDTSwgMzMsNCwgQXByaWwgMTk5MCwgcHAuIDQ0OS00NTkuCisKKzYuIFNlY3VyaXR5IENvbnNpZGVyYXRpb25zCisKKyAgIEFueSBkYXRhIGNvbXByZXNzaW9uIG1ldGhvZCBpbnZvbHZlcyB0aGUgcmVkdWN0aW9uIG9mIHJlZHVuZGFuY3kgaW4KKyAgIHRoZSBkYXRhLiAgQ29uc2VxdWVudGx5LCBhbnkgY29ycnVwdGlvbiBvZiB0aGUgZGF0YSBpcyBsaWtlbHkgdG8gaGF2ZQorICAgc2V2ZXJlIGVmZmVjdHMgYW5kIGJlIGRpZmZpY3VsdCB0byBjb3JyZWN0LiAgVW5jb21wcmVzc2VkIHRleHQsIG9uCisgICB0aGUgb3RoZXIgaGFuZCwgd2lsbCBwcm9iYWJseSBzdGlsbCBiZSByZWFkYWJsZSBkZXNwaXRlIHRoZSBwcmVzZW5jZQorICAgb2Ygc29tZSBjb3JydXB0ZWQgYnl0ZXMuCisKKyAgIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgc3lzdGVtcyB1c2luZyB0aGlzIGRhdGEgZm9ybWF0IHByb3ZpZGUgc29tZQorICAgbWVhbnMgb2YgdmFsaWRhdGluZyB0aGUgaW50ZWdyaXR5IG9mIHRoZSBjb21wcmVzc2VkIGRhdGEuICBTZWUKKyAgIHJlZmVyZW5jZSBbM10sIGZvciBleGFtcGxlLgorCis3LiBTb3VyY2UgY29kZQorCisgICBTb3VyY2UgY29kZSBmb3IgYSBDIGxhbmd1YWdlIGltcGxlbWVudGF0aW9uIG9mIGEgImRlZmxhdGUiIGNvbXBsaWFudAorICAgY29tcHJlc3NvciBhbmQgZGVjb21wcmVzc29yIGlzIGF2YWlsYWJsZSB3aXRoaW4gdGhlIHpsaWIgcGFja2FnZSBhdAorICAgZnRwOi8vZnRwLnV1Lm5ldC9wdWIvYXJjaGl2aW5nL3ppcC96bGliLy4KKworOC4gQWNrbm93bGVkZ2VtZW50cworCisgICBUcmFkZW1hcmtzIGNpdGVkIGluIHRoaXMgZG9jdW1lbnQgYXJlIHRoZSBwcm9wZXJ0eSBvZiB0aGVpcgorICAgcmVzcGVjdGl2ZSBvd25lcnMuCisKKyAgIFBoaWwgS2F0eiBkZXNpZ25lZCB0aGUgZGVmbGF0ZSBmb3JtYXQuICBKZWFuLUxvdXAgR2FpbGx5IGFuZCBNYXJrCisgICBBZGxlciB3cm90ZSB0aGUgcmVsYXRlZCBzb2Z0d2FyZSBkZXNjcmliZWQgaW4gdGhpcyBzcGVjaWZpY2F0aW9uLgorICAgR2xlbm4gUmFuZGVycy1QZWhyc29uIGNvbnZlcnRlZCB0aGlzIGRvY3VtZW50IHRvIFJGQyBhbmQgSFRNTCBmb3JtYXQuCisKKworCitEZXV0c2NoICAgICAgICAgICAgICAgICAgICAgIEluZm9ybWF0aW9uYWwgICAgICAgICAgICAgICAgICAgICBbUGFnZSAxNl0KKwwKK1JGQyAxOTUxICAgICAgREVGTEFURSBDb21wcmVzc2VkIERhdGEgRm9ybWF0IFNwZWNpZmljYXRpb24gICAgICBNYXkgMTk5NgorCisKKzkuIEF1dGhvcidzIEFkZHJlc3MKKworICAgTC4gUGV0ZXIgRGV1dHNjaAorICAgQWxhZGRpbiBFbnRlcnByaXNlcworICAgMjAzIFNhbnRhIE1hcmdhcml0YSBBdmUuCisgICBNZW5sbyBQYXJrLCBDQSA5NDAyNQorCisgICBQaG9uZTogKDQxNSkgMzIyLTAxMDMgKEFNIG9ubHkpCisgICBGQVg6ICAgKDQxNSkgMzIyLTE3MzQKKyAgIEVNYWlsOiA8Z2hvc3RAYWxhZGRpbi5jb20+CisKKyAgIFF1ZXN0aW9ucyBhYm91dCB0aGUgdGVjaG5pY2FsIGNvbnRlbnQgb2YgdGhpcyBzcGVjaWZpY2F0aW9uIGNhbiBiZQorICAgc2VudCBieSBlbWFpbCB0bzoKKworICAgSmVhbi1Mb3VwIEdhaWxseSA8Z3ppcEBwcmVwLmFpLm1pdC5lZHU+IGFuZAorICAgTWFyayBBZGxlciA8bWFkbGVyQGFsdW1uaS5jYWx0ZWNoLmVkdT4KKworICAgRWRpdG9yaWFsIGNvbW1lbnRzIG9uIHRoaXMgc3BlY2lmaWNhdGlvbiBjYW4gYmUgc2VudCBieSBlbWFpbCB0bzoKKworICAgTC4gUGV0ZXIgRGV1dHNjaCA8Z2hvc3RAYWxhZGRpbi5jb20+IGFuZAorICAgR2xlbm4gUmFuZGVycy1QZWhyc29uIDxyYW5kZWdAYWx1bW5pLnJwaS5lZHU+CisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCitEZXV0c2NoICAgICAgICAgICAgICAgICAgICAgIEluZm9ybWF0aW9uYWwgICAgICAgICAgICAgICAgICAgICBbUGFnZSAxN10KKwwKZGlmZiAtLWdpdCBhL3psaWItMS4yLjYvZG9jL3JmYzE5NTIudHh0IGIvemxpYi0xLjIuNi9kb2MvcmZjMTk1Mi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThlNTFiNAotLS0gL2Rldi9udWxsCisrKyBiL3psaWItMS4yLjYvZG9jL3JmYzE5NTIudHh0CkBAIC0wLDAgKzEsNjc1IEBACisKKworCisKKworCitOZXR3b3JrIFdvcmtpbmcgR3JvdXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFAuIERldXRzY2gKK1JlcXVlc3QgZm9yIENvbW1lbnRzOiAxOTUyICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxhZGRpbiBFbnRlcnByaXNlcworQ2F0ZWdvcnk6IEluZm9ybWF0aW9uYWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1heSAxOTk2CisKKworICAgICAgICAgICAgICAgR1pJUCBmaWxlIGZvcm1hdCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gNC4zCisKK1N0YXR1cyBvZiBUaGlzIE1lbW8KKworICAgVGhpcyBtZW1vIHByb3ZpZGVzIGluZm9ybWF0aW9uIGZvciB0aGUgSW50ZXJuZXQgY29tbXVuaXR5LiAgVGhpcyBtZW1vCisgICBkb2VzIG5vdCBzcGVjaWZ5IGFuIEludGVybmV0IHN0YW5kYXJkIG9mIGFueSBraW5kLiAgRGlzdHJpYnV0aW9uIG9mCisgICB0aGlzIG1lbW8gaXMgdW5saW1pdGVkLgorCitJRVNHIE5vdGU6CisKKyAgIFRoZSBJRVNHIHRha2VzIG5vIHBvc2l0aW9uIG9uIHRoZSB2YWxpZGl0eSBvZiBhbnkgSW50ZWxsZWN0dWFsCisgICBQcm9wZXJ0eSBSaWdodHMgc3RhdGVtZW50cyBjb250YWluZWQgaW4gdGhpcyBkb2N1bWVudC4KKworTm90aWNlcworCisgICBDb3B5cmlnaHQgKGMpIDE5OTYgTC4gUGV0ZXIgRGV1dHNjaAorCisgICBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGlzIGRvY3VtZW50IGZvciBhbnkKKyAgIHB1cnBvc2UgYW5kIHdpdGhvdXQgY2hhcmdlLCBpbmNsdWRpbmcgdHJhbnNsYXRpb25zIGludG8gb3RoZXIKKyAgIGxhbmd1YWdlcyBhbmQgaW5jb3Jwb3JhdGlvbiBpbnRvIGNvbXBpbGF0aW9ucywgcHJvdmlkZWQgdGhhdCB0aGUKKyAgIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgbm90aWNlIGFyZSBwcmVzZXJ2ZWQsIGFuZCB0aGF0IGFueQorICAgc3Vic3RhbnRpdmUgY2hhbmdlcyBvciBkZWxldGlvbnMgZnJvbSB0aGUgb3JpZ2luYWwgYXJlIGNsZWFybHkKKyAgIG1hcmtlZC4KKworICAgQSBwb2ludGVyIHRvIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGlzIGFuZCByZWxhdGVkIGRvY3VtZW50YXRpb24gaW4KKyAgIEhUTUwgZm9ybWF0IGNhbiBiZSBmb3VuZCBhdCB0aGUgVVJMCisgICA8ZnRwOi8vZnRwLnV1Lm5ldC9ncmFwaGljcy9wbmcvZG9jdW1lbnRzL3psaWIvemRvYy1pbmRleC5odG1sPi4KKworQWJzdHJhY3QKKworICAgVGhpcyBzcGVjaWZpY2F0aW9uIGRlZmluZXMgYSBsb3NzbGVzcyBjb21wcmVzc2VkIGRhdGEgZm9ybWF0IHRoYXQgaXMKKyAgIGNvbXBhdGlibGUgd2l0aCB0aGUgd2lkZWx5IHVzZWQgR1pJUCB1dGlsaXR5LiAgVGhlIGZvcm1hdCBpbmNsdWRlcyBhCisgICBjeWNsaWMgcmVkdW5kYW5jeSBjaGVjayB2YWx1ZSBmb3IgZGV0ZWN0aW5nIGRhdGEgY29ycnVwdGlvbi4gIFRoZQorICAgZm9ybWF0IHByZXNlbnRseSB1c2VzIHRoZSBERUZMQVRFIG1ldGhvZCBvZiBjb21wcmVzc2lvbiBidXQgY2FuIGJlCisgICBlYXNpbHkgZXh0ZW5kZWQgdG8gdXNlIG90aGVyIGNvbXByZXNzaW9uIG1ldGhvZHMuICBUaGUgZm9ybWF0IGNhbiBiZQorICAgaW1wbGVtZW50ZWQgcmVhZGlseSBpbiBhIG1hbm5lciBub3QgY292ZXJlZCBieSBwYXRlbnRzLgorCisKKworCisKKworCisKKworCitEZXV0c2NoICAgICAgICAgICAgICAgICAgICAgIEluZm9ybWF0aW9uYWwgICAgICAgICAgICAgICAgICAgICAgW1BhZ2UgMV0KKwwKK1JGQyAxOTUyICAgICAgICAgICAgIEdaSVAgRmlsZSBGb3JtYXQgU3BlY2lmaWNhdGlvbiAgICAgICAgICAgICBNYXkgMTk5NgorCisKK1RhYmxlIG9mIENvbnRlbnRzCisKKyAgIDEuIEludHJvZHVjdGlvbiAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gMgorICAgICAgMS4xLiBQdXJwb3NlIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAyCisgICAgICAxLjIuIEludGVuZGVkIGF1ZGllbmNlIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIDMKKyAgICAgIDEuMy4gU2NvcGUgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gMworICAgICAgMS40LiBDb21wbGlhbmNlIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAzCisgICAgICAxLjUuIERlZmluaXRpb25zIG9mIHRlcm1zIGFuZCBjb252ZW50aW9ucyB1c2VkIC4uLi4uLi4uLi4uLi4uLi4uIDMKKyAgICAgIDEuNi4gQ2hhbmdlcyBmcm9tIHByZXZpb3VzIHZlcnNpb25zIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gMworICAgMi4gRGV0YWlsZWQgc3BlY2lmaWNhdGlvbiAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiA0CisgICAgICAyLjEuIE92ZXJhbGwgY29udmVudGlvbnMgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIDQKKyAgICAgIDIuMi4gRmlsZSBmb3JtYXQgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gNQorICAgICAgMi4zLiBNZW1iZXIgZm9ybWF0IC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiA1CisgICAgICAgICAgMi4zLjEuIE1lbWJlciBoZWFkZXIgYW5kIHRyYWlsZXIgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIDYKKyAgICAgICAgICAgICAgMi4zLjEuMS4gRXh0cmEgZmllbGQgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gOAorICAgICAgICAgICAgICAyLjMuMS4yLiBDb21wbGlhbmNlIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiA5CisgICAgICAzLiBSZWZlcmVuY2VzIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIDkKKyAgICAgIDQuIFNlY3VyaXR5IENvbnNpZGVyYXRpb25zIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAxMAorICAgICAgNS4gQWNrbm93bGVkZ2VtZW50cyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIDEwCisgICAgICA2LiBBdXRob3IncyBBZGRyZXNzIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gMTAKKyAgICAgIDcuIEFwcGVuZGl4OiBKZWFuLUxvdXAgR2FpbGx5J3MgZ3ppcCB1dGlsaXR5IC4uLi4uLi4uLi4uLi4uLi4uLiAxMQorICAgICAgOC4gQXBwZW5kaXg6IFNhbXBsZSBDUkMgQ29kZSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIDExCisKKzEuIEludHJvZHVjdGlvbgorCisgICAxLjEuIFB1cnBvc2UKKworICAgICAgVGhlIHB1cnBvc2Ugb2YgdGhpcyBzcGVjaWZpY2F0aW9uIGlzIHRvIGRlZmluZSBhIGxvc3NsZXNzCisgICAgICBjb21wcmVzc2VkIGRhdGEgZm9ybWF0IHRoYXQ6CisKKyAgICAgICAgICAqIElzIGluZGVwZW5kZW50IG9mIENQVSB0eXBlLCBvcGVyYXRpbmcgc3lzdGVtLCBmaWxlIHN5c3RlbSwKKyAgICAgICAgICAgIGFuZCBjaGFyYWN0ZXIgc2V0LCBhbmQgaGVuY2UgY2FuIGJlIHVzZWQgZm9yIGludGVyY2hhbmdlOworICAgICAgICAgICogQ2FuIGNvbXByZXNzIG9yIGRlY29tcHJlc3MgYSBkYXRhIHN0cmVhbSAoYXMgb3Bwb3NlZCB0byBhCisgICAgICAgICAgICByYW5kb21seSBhY2Nlc3NpYmxlIGZpbGUpIHRvIHByb2R1Y2UgYW5vdGhlciBkYXRhIHN0cmVhbSwKKyAgICAgICAgICAgIHVzaW5nIG9ubHkgYW4gYSBwcmlvcmkgYm91bmRlZCBhbW91bnQgb2YgaW50ZXJtZWRpYXRlCisgICAgICAgICAgICBzdG9yYWdlLCBhbmQgaGVuY2UgY2FuIGJlIHVzZWQgaW4gZGF0YSBjb21tdW5pY2F0aW9ucyBvcgorICAgICAgICAgICAgc2ltaWxhciBzdHJ1Y3R1cmVzIHN1Y2ggYXMgVW5peCBmaWx0ZXJzOworICAgICAgICAgICogQ29tcHJlc3NlcyBkYXRhIHdpdGggZWZmaWNpZW5jeSBjb21wYXJhYmxlIHRvIHRoZSBiZXN0CisgICAgICAgICAgICBjdXJyZW50bHkgYXZhaWxhYmxlIGdlbmVyYWwtcHVycG9zZSBjb21wcmVzc2lvbiBtZXRob2RzLAorICAgICAgICAgICAgYW5kIGluIHBhcnRpY3VsYXIgY29uc2lkZXJhYmx5IGJldHRlciB0aGFuIHRoZSAiY29tcHJlc3MiCisgICAgICAgICAgICBwcm9ncmFtOworICAgICAgICAgICogQ2FuIGJlIGltcGxlbWVudGVkIHJlYWRpbHkgaW4gYSBtYW5uZXIgbm90IGNvdmVyZWQgYnkKKyAgICAgICAgICAgIHBhdGVudHMsIGFuZCBoZW5jZSBjYW4gYmUgcHJhY3RpY2VkIGZyZWVseTsKKyAgICAgICAgICAqIElzIGNvbXBhdGlibGUgd2l0aCB0aGUgZmlsZSBmb3JtYXQgcHJvZHVjZWQgYnkgdGhlIGN1cnJlbnQKKyAgICAgICAgICAgIHdpZGVseSB1c2VkIGd6aXAgdXRpbGl0eSwgaW4gdGhhdCBjb25mb3JtaW5nIGRlY29tcHJlc3NvcnMKKyAgICAgICAgICAgIHdpbGwgYmUgYWJsZSB0byByZWFkIGRhdGEgcHJvZHVjZWQgYnkgdGhlIGV4aXN0aW5nIGd6aXAKKyAgICAgICAgICAgIGNvbXByZXNzb3IuCisKKworCisKK0RldXRzY2ggICAgICAgICAgICAgICAgICAgICAgSW5mb3JtYXRpb25hbCAgICAgICAgICAgICAgICAgICAgICBbUGFnZSAyXQorDAorUkZDIDE5NTIgICAgICAgICAgICAgR1pJUCBGaWxlIEZvcm1hdCBTcGVjaWZpY2F0aW9uICAgICAgICAgICAgIE1heSAxOTk2CisKKworICAgICAgVGhlIGRhdGEgZm9ybWF0IGRlZmluZWQgYnkgdGhpcyBzcGVjaWZpY2F0aW9uIGRvZXMgbm90IGF0dGVtcHQgdG86CisKKyAgICAgICAgICAqIFByb3ZpZGUgcmFuZG9tIGFjY2VzcyB0byBjb21wcmVzc2VkIGRhdGE7CisgICAgICAgICAgKiBDb21wcmVzcyBzcGVjaWFsaXplZCBkYXRhIChlLmcuLCByYXN0ZXIgZ3JhcGhpY3MpIGFzIHdlbGwgYXMKKyAgICAgICAgICAgIHRoZSBiZXN0IGN1cnJlbnRseSBhdmFpbGFibGUgc3BlY2lhbGl6ZWQgYWxnb3JpdGhtcy4KKworICAgMS4yLiBJbnRlbmRlZCBhdWRpZW5jZQorCisgICAgICBUaGlzIHNwZWNpZmljYXRpb24gaXMgaW50ZW5kZWQgZm9yIHVzZSBieSBpbXBsZW1lbnRvcnMgb2Ygc29mdHdhcmUKKyAgICAgIHRvIGNvbXByZXNzIGRhdGEgaW50byBnemlwIGZvcm1hdCBhbmQvb3IgZGVjb21wcmVzcyBkYXRhIGZyb20gZ3ppcAorICAgICAgZm9ybWF0LgorCisgICAgICBUaGUgdGV4dCBvZiB0aGUgc3BlY2lmaWNhdGlvbiBhc3N1bWVzIGEgYmFzaWMgYmFja2dyb3VuZCBpbgorICAgICAgcHJvZ3JhbW1pbmcgYXQgdGhlIGxldmVsIG9mIGJpdHMgYW5kIG90aGVyIHByaW1pdGl2ZSBkYXRhCisgICAgICByZXByZXNlbnRhdGlvbnMuCisKKyAgIDEuMy4gU2NvcGUKKworICAgICAgVGhlIHNwZWNpZmljYXRpb24gc3BlY2lmaWVzIGEgY29tcHJlc3Npb24gbWV0aG9kIGFuZCBhIGZpbGUgZm9ybWF0CisgICAgICAodGhlIGxhdHRlciBhc3N1bWluZyBvbmx5IHRoYXQgYSBmaWxlIGNhbiBzdG9yZSBhIHNlcXVlbmNlIG9mCisgICAgICBhcmJpdHJhcnkgYnl0ZXMpLiAgSXQgZG9lcyBub3Qgc3BlY2lmeSBhbnkgcGFydGljdWxhciBpbnRlcmZhY2UgdG8KKyAgICAgIGEgZmlsZSBzeXN0ZW0gb3IgYW55dGhpbmcgYWJvdXQgY2hhcmFjdGVyIHNldHMgb3IgZW5jb2RpbmdzCisgICAgICAoZXhjZXB0IGZvciBmaWxlIG5hbWVzIGFuZCBjb21tZW50cywgd2hpY2ggYXJlIG9wdGlvbmFsKS4KKworICAgMS40LiBDb21wbGlhbmNlCisKKyAgICAgIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCBhIGNvbXBsaWFudCBkZWNvbXByZXNzb3IgbXVzdCBiZQorICAgICAgYWJsZSB0byBhY2NlcHQgYW5kIGRlY29tcHJlc3MgYW55IGZpbGUgdGhhdCBjb25mb3JtcyB0byBhbGwgdGhlCisgICAgICBzcGVjaWZpY2F0aW9ucyBwcmVzZW50ZWQgaGVyZTsgYSBjb21wbGlhbnQgY29tcHJlc3NvciBtdXN0IHByb2R1Y2UKKyAgICAgIGZpbGVzIHRoYXQgY29uZm9ybSB0byBhbGwgdGhlIHNwZWNpZmljYXRpb25zIHByZXNlbnRlZCBoZXJlLiAgVGhlCisgICAgICBtYXRlcmlhbCBpbiB0aGUgYXBwZW5kaWNlcyBpcyBub3QgcGFydCBvZiB0aGUgc3BlY2lmaWNhdGlvbiBwZXIgc2UKKyAgICAgIGFuZCBpcyBub3QgcmVsZXZhbnQgdG8gY29tcGxpYW5jZS4KKworICAgMS41LiBEZWZpbml0aW9ucyBvZiB0ZXJtcyBhbmQgY29udmVudGlvbnMgdXNlZAorCisgICAgICBieXRlOiA4IGJpdHMgc3RvcmVkIG9yIHRyYW5zbWl0dGVkIGFzIGEgdW5pdCAoc2FtZSBhcyBhbiBvY3RldCkuCisgICAgICAoRm9yIHRoaXMgc3BlY2lmaWNhdGlvbiwgYSBieXRlIGlzIGV4YWN0bHkgOCBiaXRzLCBldmVuIG9uCisgICAgICBtYWNoaW5lcyB3aGljaCBzdG9yZSBhIGNoYXJhY3RlciBvbiBhIG51bWJlciBvZiBiaXRzIGRpZmZlcmVudAorICAgICAgZnJvbSA4LikgIFNlZSBiZWxvdyBmb3IgdGhlIG51bWJlcmluZyBvZiBiaXRzIHdpdGhpbiBhIGJ5dGUuCisKKyAgIDEuNi4gQ2hhbmdlcyBmcm9tIHByZXZpb3VzIHZlcnNpb25zCisKKyAgICAgIFRoZXJlIGhhdmUgYmVlbiBubyB0ZWNobmljYWwgY2hhbmdlcyB0byB0aGUgZ3ppcCBmb3JtYXQgc2luY2UKKyAgICAgIHZlcnNpb24gNC4xIG9mIHRoaXMgc3BlY2lmaWNhdGlvbi4gIEluIHZlcnNpb24gNC4yLCBzb21lCisgICAgICB0ZXJtaW5vbG9neSB3YXMgY2hhbmdlZCwgYW5kIHRoZSBzYW1wbGUgQ1JDIGNvZGUgd2FzIHJld3JpdHRlbiBmb3IKKyAgICAgIGNsYXJpdHkgYW5kIHRvIGVsaW1pbmF0ZSB0aGUgcmVxdWlyZW1lbnQgZm9yIHRoZSBjYWxsZXIgdG8gZG8gcHJlLQorICAgICAgYW5kIHBvc3QtY29uZGl0aW9uaW5nLiAgVmVyc2lvbiA0LjMgaXMgYSBjb252ZXJzaW9uIG9mIHRoZQorICAgICAgc3BlY2lmaWNhdGlvbiB0byBSRkMgc3R5bGUuCisKKworCitEZXV0c2NoICAgICAgICAgICAgICAgICAgICAgIEluZm9ybWF0aW9uYWwgICAgICAgICAgICAgICAgICAgICAgW1BhZ2UgM10KKwwKK1JGQyAxOTUyICAgICAgICAgICAgIEdaSVAgRmlsZSBGb3JtYXQgU3BlY2lmaWNhdGlvbiAgICAgICAgICAgICBNYXkgMTk5NgorCisKKzIuIERldGFpbGVkIHNwZWNpZmljYXRpb24KKworICAgMi4xLiBPdmVyYWxsIGNvbnZlbnRpb25zCisKKyAgICAgIEluIHRoZSBkaWFncmFtcyBiZWxvdywgYSBib3ggbGlrZSB0aGlzOgorCisgICAgICAgICArLS0tKworICAgICAgICAgfCAgIHwgPC0tIHRoZSB2ZXJ0aWNhbCBiYXJzIG1pZ2h0IGJlIG1pc3NpbmcKKyAgICAgICAgICstLS0rCisKKyAgICAgIHJlcHJlc2VudHMgb25lIGJ5dGU7IGEgYm94IGxpa2UgdGhpczoKKworICAgICAgICAgKz09PT09PT09PT09PT09KworICAgICAgICAgfCAgICAgICAgICAgICAgfAorICAgICAgICAgKz09PT09PT09PT09PT09KworCisgICAgICByZXByZXNlbnRzIGEgdmFyaWFibGUgbnVtYmVyIG9mIGJ5dGVzLgorCisgICAgICBCeXRlcyBzdG9yZWQgd2l0aGluIGEgY29tcHV0ZXIgZG8gbm90IGhhdmUgYSAiYml0IG9yZGVyIiwgc2luY2UKKyAgICAgIHRoZXkgYXJlIGFsd2F5cyB0cmVhdGVkIGFzIGEgdW5pdC4gIEhvd2V2ZXIsIGEgYnl0ZSBjb25zaWRlcmVkIGFzCisgICAgICBhbiBpbnRlZ2VyIGJldHdlZW4gMCBhbmQgMjU1IGRvZXMgaGF2ZSBhIG1vc3QtIGFuZCBsZWFzdC0KKyAgICAgIHNpZ25pZmljYW50IGJpdCwgYW5kIHNpbmNlIHdlIHdyaXRlIG51bWJlcnMgd2l0aCB0aGUgbW9zdC0KKyAgICAgIHNpZ25pZmljYW50IGRpZ2l0IG9uIHRoZSBsZWZ0LCB3ZSBhbHNvIHdyaXRlIGJ5dGVzIHdpdGggdGhlIG1vc3QtCisgICAgICBzaWduaWZpY2FudCBiaXQgb24gdGhlIGxlZnQuICBJbiB0aGUgZGlhZ3JhbXMgYmVsb3csIHdlIG51bWJlciB0aGUKKyAgICAgIGJpdHMgb2YgYSBieXRlIHNvIHRoYXQgYml0IDAgaXMgdGhlIGxlYXN0LXNpZ25pZmljYW50IGJpdCwgaS5lLiwKKyAgICAgIHRoZSBiaXRzIGFyZSBudW1iZXJlZDoKKworICAgICAgICAgKy0tLS0tLS0tKworICAgICAgICAgfDc2NTQzMjEwfAorICAgICAgICAgKy0tLS0tLS0tKworCisgICAgICBUaGlzIGRvY3VtZW50IGRvZXMgbm90IGFkZHJlc3MgdGhlIGlzc3VlIG9mIHRoZSBvcmRlciBpbiB3aGljaAorICAgICAgYml0cyBvZiBhIGJ5dGUgYXJlIHRyYW5zbWl0dGVkIG9uIGEgYml0LXNlcXVlbnRpYWwgbWVkaXVtLCBzaW5jZQorICAgICAgdGhlIGRhdGEgZm9ybWF0IGRlc2NyaWJlZCBoZXJlIGlzIGJ5dGUtIHJhdGhlciB0aGFuIGJpdC1vcmllbnRlZC4KKworICAgICAgV2l0aGluIGEgY29tcHV0ZXIsIGEgbnVtYmVyIG1heSBvY2N1cHkgbXVsdGlwbGUgYnl0ZXMuICBBbGwKKyAgICAgIG11bHRpLWJ5dGUgbnVtYmVycyBpbiB0aGUgZm9ybWF0IGRlc2NyaWJlZCBoZXJlIGFyZSBzdG9yZWQgd2l0aAorICAgICAgdGhlIGxlYXN0LXNpZ25pZmljYW50IGJ5dGUgZmlyc3QgKGF0IHRoZSBsb3dlciBtZW1vcnkgYWRkcmVzcykuCisgICAgICBGb3IgZXhhbXBsZSwgdGhlIGRlY2ltYWwgbnVtYmVyIDUyMCBpcyBzdG9yZWQgYXM6CisKKyAgICAgICAgICAgICAwICAgICAgICAxCisgICAgICAgICArLS0tLS0tLS0rLS0tLS0tLS0rCisgICAgICAgICB8MDAwMDEwMDB8MDAwMDAwMTB8CisgICAgICAgICArLS0tLS0tLS0rLS0tLS0tLS0rCisgICAgICAgICAgXiAgICAgICAgXgorICAgICAgICAgIHwgICAgICAgIHwKKyAgICAgICAgICB8ICAgICAgICArIG1vcmUgc2lnbmlmaWNhbnQgYnl0ZSA9IDIgeCAyNTYKKyAgICAgICAgICArIGxlc3Mgc2lnbmlmaWNhbnQgYnl0ZSA9IDgKKworCisKK0RldXRzY2ggICAgICAgICAgICAgICAgICAgICAgSW5mb3JtYXRpb25hbCAgICAgICAgICAgICAgICAgICAgICBbUGFnZSA0XQorDAorUkZDIDE5NTIgICAgICAgICAgICAgR1pJUCBGaWxlIEZvcm1hdCBTcGVjaWZpY2F0aW9uICAgICAgICAgICAgIE1heSAxOTk2CisKKworICAgMi4yLiBGaWxlIGZvcm1hdAorCisgICAgICBBIGd6aXAgZmlsZSBjb25zaXN0cyBvZiBhIHNlcmllcyBvZiAibWVtYmVycyIgKGNvbXByZXNzZWQgZGF0YQorICAgICAgc2V0cykuICBUaGUgZm9ybWF0IG9mIGVhY2ggbWVtYmVyIGlzIHNwZWNpZmllZCBpbiB0aGUgZm9sbG93aW5nCisgICAgICBzZWN0aW9uLiAgVGhlIG1lbWJlcnMgc2ltcGx5IGFwcGVhciBvbmUgYWZ0ZXIgYW5vdGhlciBpbiB0aGUgZmlsZSwKKyAgICAgIHdpdGggbm8gYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBiZWZvcmUsIGJldHdlZW4sIG9yIGFmdGVyIHRoZW0uCisKKyAgIDIuMy4gTWVtYmVyIGZvcm1hdAorCisgICAgICBFYWNoIG1lbWJlciBoYXMgdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmU6CisKKyAgICAgICAgICstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rCisgICAgICAgICB8SUQxfElEMnxDTSB8RkxHfCAgICAgTVRJTUUgICAgIHxYRkx8T1MgfCAobW9yZS0tPikKKyAgICAgICAgICstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rCisKKyAgICAgIChpZiBGTEcuRkVYVFJBIHNldCkKKworICAgICAgICAgKy0tLSstLS0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09KworICAgICAgICAgfCBYTEVOICB8Li4uWExFTiBieXRlcyBvZiAiZXh0cmEgZmllbGQiLi4ufCAobW9yZS0tPikKKyAgICAgICAgICstLS0rLS0tKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSsKKworICAgICAgKGlmIEZMRy5GTkFNRSBzZXQpCisKKyAgICAgICAgICs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSsKKyAgICAgICAgIHwuLi5vcmlnaW5hbCBmaWxlIG5hbWUsIHplcm8tdGVybWluYXRlZC4uLnwgKG1vcmUtLT4pCisgICAgICAgICArPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rCisKKyAgICAgIChpZiBGTEcuRkNPTU1FTlQgc2V0KQorCisgICAgICAgICArPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rCisgICAgICAgICB8Li4uZmlsZSBjb21tZW50LCB6ZXJvLXRlcm1pbmF0ZWQuLi58IChtb3JlLS0+KQorICAgICAgICAgKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09KworCisgICAgICAoaWYgRkxHLkZIQ1JDIHNldCkKKworICAgICAgICAgKy0tLSstLS0rCisgICAgICAgICB8IENSQzE2IHwKKyAgICAgICAgICstLS0rLS0tKworCisgICAgICAgICArPT09PT09PT09PT09PT09PT09PT09PT0rCisgICAgICAgICB8Li4uY29tcHJlc3NlZCBibG9ja3MuLi58IChtb3JlLS0+KQorICAgICAgICAgKz09PT09PT09PT09PT09PT09PT09PT09KworCisgICAgICAgICAgIDAgICAxICAgMiAgIDMgICA0ICAgNSAgIDYgICA3CisgICAgICAgICArLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSsKKyAgICAgICAgIHwgICAgIENSQzMyICAgICB8ICAgICBJU0laRSAgICAgfAorICAgICAgICAgKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rCisKKworCisKK0RldXRzY2ggICAgICAgICAgICAgICAgICAgICAgSW5mb3JtYXRpb25hbCAgICAgICAgICAgICAgICAgICAgICBbUGFnZSA1XQorDAorUkZDIDE5NTIgICAgICAgICAgICAgR1pJUCBGaWxlIEZvcm1hdCBTcGVjaWZpY2F0aW9uICAgICAgICAgICAgIE1heSAxOTk2CisKKworICAgICAgMi4zLjEuIE1lbWJlciBoZWFkZXIgYW5kIHRyYWlsZXIKKworICAgICAgICAgSUQxIChJRGVudGlmaWNhdGlvbiAxKQorICAgICAgICAgSUQyIChJRGVudGlmaWNhdGlvbiAyKQorICAgICAgICAgICAgVGhlc2UgaGF2ZSB0aGUgZml4ZWQgdmFsdWVzIElEMSA9IDMxICgweDFmLCBcMDM3KSwgSUQyID0gMTM5CisgICAgICAgICAgICAoMHg4YiwgXDIxMyksIHRvIGlkZW50aWZ5IHRoZSBmaWxlIGFzIGJlaW5nIGluIGd6aXAgZm9ybWF0LgorCisgICAgICAgICBDTSAoQ29tcHJlc3Npb24gTWV0aG9kKQorICAgICAgICAgICAgVGhpcyBpZGVudGlmaWVzIHRoZSBjb21wcmVzc2lvbiBtZXRob2QgdXNlZCBpbiB0aGUgZmlsZS4gIENNCisgICAgICAgICAgICA9IDAtNyBhcmUgcmVzZXJ2ZWQuICBDTSA9IDggZGVub3RlcyB0aGUgImRlZmxhdGUiCisgICAgICAgICAgICBjb21wcmVzc2lvbiBtZXRob2QsIHdoaWNoIGlzIHRoZSBvbmUgY3VzdG9tYXJpbHkgdXNlZCBieQorICAgICAgICAgICAgZ3ppcCBhbmQgd2hpY2ggaXMgZG9jdW1lbnRlZCBlbHNld2hlcmUuCisKKyAgICAgICAgIEZMRyAoRkxhR3MpCisgICAgICAgICAgICBUaGlzIGZsYWcgYnl0ZSBpcyBkaXZpZGVkIGludG8gaW5kaXZpZHVhbCBiaXRzIGFzIGZvbGxvd3M6CisKKyAgICAgICAgICAgICAgIGJpdCAwICAgRlRFWFQKKyAgICAgICAgICAgICAgIGJpdCAxICAgRkhDUkMKKyAgICAgICAgICAgICAgIGJpdCAyICAgRkVYVFJBCisgICAgICAgICAgICAgICBiaXQgMyAgIEZOQU1FCisgICAgICAgICAgICAgICBiaXQgNCAgIEZDT01NRU5UCisgICAgICAgICAgICAgICBiaXQgNSAgIHJlc2VydmVkCisgICAgICAgICAgICAgICBiaXQgNiAgIHJlc2VydmVkCisgICAgICAgICAgICAgICBiaXQgNyAgIHJlc2VydmVkCisKKyAgICAgICAgICAgIElmIEZURVhUIGlzIHNldCwgdGhlIGZpbGUgaXMgcHJvYmFibHkgQVNDSUkgdGV4dC4gIFRoaXMgaXMKKyAgICAgICAgICAgIGFuIG9wdGlvbmFsIGluZGljYXRpb24sIHdoaWNoIHRoZSBjb21wcmVzc29yIG1heSBzZXQgYnkKKyAgICAgICAgICAgIGNoZWNraW5nIGEgc21hbGwgYW1vdW50IG9mIHRoZSBpbnB1dCBkYXRhIHRvIHNlZSB3aGV0aGVyIGFueQorICAgICAgICAgICAgbm9uLUFTQ0lJIGNoYXJhY3RlcnMgYXJlIHByZXNlbnQuICBJbiBjYXNlIG9mIGRvdWJ0LCBGVEVYVAorICAgICAgICAgICAgaXMgY2xlYXJlZCwgaW5kaWNhdGluZyBiaW5hcnkgZGF0YS4gRm9yIHN5c3RlbXMgd2hpY2ggaGF2ZQorICAgICAgICAgICAgZGlmZmVyZW50IGZpbGUgZm9ybWF0cyBmb3IgYXNjaWkgdGV4dCBhbmQgYmluYXJ5IGRhdGEsIHRoZQorICAgICAgICAgICAgZGVjb21wcmVzc29yIGNhbiB1c2UgRlRFWFQgdG8gY2hvb3NlIHRoZSBhcHByb3ByaWF0ZSBmb3JtYXQuCisgICAgICAgICAgICBXZSBkZWxpYmVyYXRlbHkgZG8gbm90IHNwZWNpZnkgdGhlIGFsZ29yaXRobSB1c2VkIHRvIHNldAorICAgICAgICAgICAgdGhpcyBiaXQsIHNpbmNlIGEgY29tcHJlc3NvciBhbHdheXMgaGFzIHRoZSBvcHRpb24gb2YKKyAgICAgICAgICAgIGxlYXZpbmcgaXQgY2xlYXJlZCBhbmQgYSBkZWNvbXByZXNzb3IgYWx3YXlzIGhhcyB0aGUgb3B0aW9uCisgICAgICAgICAgICBvZiBpZ25vcmluZyBpdCBhbmQgbGV0dGluZyBzb21lIG90aGVyIHByb2dyYW0gaGFuZGxlIGlzc3VlcworICAgICAgICAgICAgb2YgZGF0YSBjb252ZXJzaW9uLgorCisgICAgICAgICAgICBJZiBGSENSQyBpcyBzZXQsIGEgQ1JDMTYgZm9yIHRoZSBnemlwIGhlYWRlciBpcyBwcmVzZW50LAorICAgICAgICAgICAgaW1tZWRpYXRlbHkgYmVmb3JlIHRoZSBjb21wcmVzc2VkIGRhdGEuIFRoZSBDUkMxNiBjb25zaXN0cworICAgICAgICAgICAgb2YgdGhlIHR3byBsZWFzdCBzaWduaWZpY2FudCBieXRlcyBvZiB0aGUgQ1JDMzIgZm9yIGFsbAorICAgICAgICAgICAgYnl0ZXMgb2YgdGhlIGd6aXAgaGVhZGVyIHVwIHRvIGFuZCBub3QgaW5jbHVkaW5nIHRoZSBDUkMxNi4KKyAgICAgICAgICAgIFtUaGUgRkhDUkMgYml0IHdhcyBuZXZlciBzZXQgYnkgdmVyc2lvbnMgb2YgZ3ppcCB1cCB0bworICAgICAgICAgICAgMS4yLjQsIGV2ZW4gdGhvdWdoIGl0IHdhcyBkb2N1bWVudGVkIHdpdGggYSBkaWZmZXJlbnQKKyAgICAgICAgICAgIG1lYW5pbmcgaW4gZ3ppcCAxLjIuNC5dCisKKyAgICAgICAgICAgIElmIEZFWFRSQSBpcyBzZXQsIG9wdGlvbmFsIGV4dHJhIGZpZWxkcyBhcmUgcHJlc2VudCwgYXMKKyAgICAgICAgICAgIGRlc2NyaWJlZCBpbiBhIGZvbGxvd2luZyBzZWN0aW9uLgorCisKKworRGV1dHNjaCAgICAgICAgICAgICAgICAgICAgICBJbmZvcm1hdGlvbmFsICAgICAgICAgICAgICAgICAgICAgIFtQYWdlIDZdCisMCitSRkMgMTk1MiAgICAgICAgICAgICBHWklQIEZpbGUgRm9ybWF0IFNwZWNpZmljYXRpb24gICAgICAgICAgICAgTWF5IDE5OTYKKworCisgICAgICAgICAgICBJZiBGTkFNRSBpcyBzZXQsIGFuIG9yaWdpbmFsIGZpbGUgbmFtZSBpcyBwcmVzZW50LAorICAgICAgICAgICAgdGVybWluYXRlZCBieSBhIHplcm8gYnl0ZS4gIFRoZSBuYW1lIG11c3QgY29uc2lzdCBvZiBJU08KKyAgICAgICAgICAgIDg4NTktMSAoTEFUSU4tMSkgY2hhcmFjdGVyczsgb24gb3BlcmF0aW5nIHN5c3RlbXMgdXNpbmcKKyAgICAgICAgICAgIEVCQ0RJQyBvciBhbnkgb3RoZXIgY2hhcmFjdGVyIHNldCBmb3IgZmlsZSBuYW1lcywgdGhlIG5hbWUKKyAgICAgICAgICAgIG11c3QgYmUgdHJhbnNsYXRlZCB0byB0aGUgSVNPIExBVElOLTEgY2hhcmFjdGVyIHNldC4gIFRoaXMKKyAgICAgICAgICAgIGlzIHRoZSBvcmlnaW5hbCBuYW1lIG9mIHRoZSBmaWxlIGJlaW5nIGNvbXByZXNzZWQsIHdpdGggYW55CisgICAgICAgICAgICBkaXJlY3RvcnkgY29tcG9uZW50cyByZW1vdmVkLCBhbmQsIGlmIHRoZSBmaWxlIGJlaW5nCisgICAgICAgICAgICBjb21wcmVzc2VkIGlzIG9uIGEgZmlsZSBzeXN0ZW0gd2l0aCBjYXNlIGluc2Vuc2l0aXZlIG5hbWVzLAorICAgICAgICAgICAgZm9yY2VkIHRvIGxvd2VyIGNhc2UuIFRoZXJlIGlzIG5vIG9yaWdpbmFsIGZpbGUgbmFtZSBpZiB0aGUKKyAgICAgICAgICAgIGRhdGEgd2FzIGNvbXByZXNzZWQgZnJvbSBhIHNvdXJjZSBvdGhlciB0aGFuIGEgbmFtZWQgZmlsZTsKKyAgICAgICAgICAgIGZvciBleGFtcGxlLCBpZiB0aGUgc291cmNlIHdhcyBzdGRpbiBvbiBhIFVuaXggc3lzdGVtLCB0aGVyZQorICAgICAgICAgICAgaXMgbm8gZmlsZSBuYW1lLgorCisgICAgICAgICAgICBJZiBGQ09NTUVOVCBpcyBzZXQsIGEgemVyby10ZXJtaW5hdGVkIGZpbGUgY29tbWVudCBpcworICAgICAgICAgICAgcHJlc2VudC4gIFRoaXMgY29tbWVudCBpcyBub3QgaW50ZXJwcmV0ZWQ7IGl0IGlzIG9ubHkKKyAgICAgICAgICAgIGludGVuZGVkIGZvciBodW1hbiBjb25zdW1wdGlvbi4gIFRoZSBjb21tZW50IG11c3QgY29uc2lzdCBvZgorICAgICAgICAgICAgSVNPIDg4NTktMSAoTEFUSU4tMSkgY2hhcmFjdGVycy4gIExpbmUgYnJlYWtzIHNob3VsZCBiZQorICAgICAgICAgICAgZGVub3RlZCBieSBhIHNpbmdsZSBsaW5lIGZlZWQgY2hhcmFjdGVyICgxMCBkZWNpbWFsKS4KKworICAgICAgICAgICAgUmVzZXJ2ZWQgRkxHIGJpdHMgbXVzdCBiZSB6ZXJvLgorCisgICAgICAgICBNVElNRSAoTW9kaWZpY2F0aW9uIFRJTUUpCisgICAgICAgICAgICBUaGlzIGdpdmVzIHRoZSBtb3N0IHJlY2VudCBtb2RpZmljYXRpb24gdGltZSBvZiB0aGUgb3JpZ2luYWwKKyAgICAgICAgICAgIGZpbGUgYmVpbmcgY29tcHJlc3NlZC4gIFRoZSB0aW1lIGlzIGluIFVuaXggZm9ybWF0LCBpLmUuLAorICAgICAgICAgICAgc2Vjb25kcyBzaW5jZSAwMDowMDowMCBHTVQsIEphbi4gIDEsIDE5NzAuICAoTm90ZSB0aGF0IHRoaXMKKyAgICAgICAgICAgIG1heSBjYXVzZSBwcm9ibGVtcyBmb3IgTVMtRE9TIGFuZCBvdGhlciBzeXN0ZW1zIHRoYXQgdXNlCisgICAgICAgICAgICBsb2NhbCByYXRoZXIgdGhhbiBVbml2ZXJzYWwgdGltZS4pICBJZiB0aGUgY29tcHJlc3NlZCBkYXRhCisgICAgICAgICAgICBkaWQgbm90IGNvbWUgZnJvbSBhIGZpbGUsIE1USU1FIGlzIHNldCB0byB0aGUgdGltZSBhdCB3aGljaAorICAgICAgICAgICAgY29tcHJlc3Npb24gc3RhcnRlZC4gIE1USU1FID0gMCBtZWFucyBubyB0aW1lIHN0YW1wIGlzCisgICAgICAgICAgICBhdmFpbGFibGUuCisKKyAgICAgICAgIFhGTCAoZVh0cmEgRkxhZ3MpCisgICAgICAgICAgICBUaGVzZSBmbGFncyBhcmUgYXZhaWxhYmxlIGZvciB1c2UgYnkgc3BlY2lmaWMgY29tcHJlc3Npb24KKyAgICAgICAgICAgIG1ldGhvZHMuICBUaGUgImRlZmxhdGUiIG1ldGhvZCAoQ00gPSA4KSBzZXRzIHRoZXNlIGZsYWdzIGFzCisgICAgICAgICAgICBmb2xsb3dzOgorCisgICAgICAgICAgICAgICBYRkwgPSAyIC0gY29tcHJlc3NvciB1c2VkIG1heGltdW0gY29tcHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgc2xvd2VzdCBhbGdvcml0aG0KKyAgICAgICAgICAgICAgIFhGTCA9IDQgLSBjb21wcmVzc29yIHVzZWQgZmFzdGVzdCBhbGdvcml0aG0KKworICAgICAgICAgT1MgKE9wZXJhdGluZyBTeXN0ZW0pCisgICAgICAgICAgICBUaGlzIGlkZW50aWZpZXMgdGhlIHR5cGUgb2YgZmlsZSBzeXN0ZW0gb24gd2hpY2ggY29tcHJlc3Npb24KKyAgICAgICAgICAgIHRvb2sgcGxhY2UuICBUaGlzIG1heSBiZSB1c2VmdWwgaW4gZGV0ZXJtaW5pbmcgZW5kLW9mLWxpbmUKKyAgICAgICAgICAgIGNvbnZlbnRpb24gZm9yIHRleHQgZmlsZXMuICBUaGUgY3VycmVudGx5IGRlZmluZWQgdmFsdWVzIGFyZQorICAgICAgICAgICAgYXMgZm9sbG93czoKKworCisKKworCisKK0RldXRzY2ggICAgICAgICAgICAgICAgICAgICAgSW5mb3JtYXRpb25hbCAgICAgICAgICAgICAgICAgICAgICBbUGFnZSA3XQorDAorUkZDIDE5NTIgICAgICAgICAgICAgR1pJUCBGaWxlIEZvcm1hdCBTcGVjaWZpY2F0aW9uICAgICAgICAgICAgIE1heSAxOTk2CisKKworICAgICAgICAgICAgICAgICAwIC0gRkFUIGZpbGVzeXN0ZW0gKE1TLURPUywgT1MvMiwgTlQvV2luMzIpCisgICAgICAgICAgICAgICAgIDEgLSBBbWlnYQorICAgICAgICAgICAgICAgICAyIC0gVk1TIChvciBPcGVuVk1TKQorICAgICAgICAgICAgICAgICAzIC0gVW5peAorICAgICAgICAgICAgICAgICA0IC0gVk0vQ01TCisgICAgICAgICAgICAgICAgIDUgLSBBdGFyaSBUT1MKKyAgICAgICAgICAgICAgICAgNiAtIEhQRlMgZmlsZXN5c3RlbSAoT1MvMiwgTlQpCisgICAgICAgICAgICAgICAgIDcgLSBNYWNpbnRvc2gKKyAgICAgICAgICAgICAgICAgOCAtIFotU3lzdGVtCisgICAgICAgICAgICAgICAgIDkgLSBDUC9NCisgICAgICAgICAgICAgICAgMTAgLSBUT1BTLTIwCisgICAgICAgICAgICAgICAgMTEgLSBOVEZTIGZpbGVzeXN0ZW0gKE5UKQorICAgICAgICAgICAgICAgIDEyIC0gUURPUworICAgICAgICAgICAgICAgIDEzIC0gQWNvcm4gUklTQ09TCisgICAgICAgICAgICAgICAyNTUgLSB1bmtub3duCisKKyAgICAgICAgIFhMRU4gKGVYdHJhIExFTmd0aCkKKyAgICAgICAgICAgIElmIEZMRy5GRVhUUkEgaXMgc2V0LCB0aGlzIGdpdmVzIHRoZSBsZW5ndGggb2YgdGhlIG9wdGlvbmFsCisgICAgICAgICAgICBleHRyYSBmaWVsZC4gIFNlZSBiZWxvdyBmb3IgZGV0YWlscy4KKworICAgICAgICAgQ1JDMzIgKENSQy0zMikKKyAgICAgICAgICAgIFRoaXMgY29udGFpbnMgYSBDeWNsaWMgUmVkdW5kYW5jeSBDaGVjayB2YWx1ZSBvZiB0aGUKKyAgICAgICAgICAgIHVuY29tcHJlc3NlZCBkYXRhIGNvbXB1dGVkIGFjY29yZGluZyB0byBDUkMtMzIgYWxnb3JpdGhtCisgICAgICAgICAgICB1c2VkIGluIHRoZSBJU08gMzMwOSBzdGFuZGFyZCBhbmQgaW4gc2VjdGlvbiA4LjEuMS42LjIgb2YKKyAgICAgICAgICAgIElUVS1UIHJlY29tbWVuZGF0aW9uIFYuNDIuICAoU2VlIGh0dHA6Ly93d3cuaXNvLmNoIGZvcgorICAgICAgICAgICAgb3JkZXJpbmcgSVNPIGRvY3VtZW50cy4gU2VlIGdvcGhlcjovL2luZm8uaXR1LmNoIGZvciBhbgorICAgICAgICAgICAgb25saW5lIHZlcnNpb24gb2YgSVRVLVQgVi40Mi4pCisKKyAgICAgICAgIElTSVpFIChJbnB1dCBTSVpFKQorICAgICAgICAgICAgVGhpcyBjb250YWlucyB0aGUgc2l6ZSBvZiB0aGUgb3JpZ2luYWwgKHVuY29tcHJlc3NlZCkgaW5wdXQKKyAgICAgICAgICAgIGRhdGEgbW9kdWxvIDJeMzIuCisKKyAgICAgIDIuMy4xLjEuIEV4dHJhIGZpZWxkCisKKyAgICAgICAgIElmIHRoZSBGTEcuRkVYVFJBIGJpdCBpcyBzZXQsIGFuICJleHRyYSBmaWVsZCIgaXMgcHJlc2VudCBpbgorICAgICAgICAgdGhlIGhlYWRlciwgd2l0aCB0b3RhbCBsZW5ndGggWExFTiBieXRlcy4gIEl0IGNvbnNpc3RzIG9mIGEKKyAgICAgICAgIHNlcmllcyBvZiBzdWJmaWVsZHMsIGVhY2ggb2YgdGhlIGZvcm06CisKKyAgICAgICAgICAgICstLS0rLS0tKy0tLSstLS0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSsKKyAgICAgICAgICAgIHxTSTF8U0kyfCAgTEVOICB8Li4uIExFTiBieXRlcyBvZiBzdWJmaWVsZCBkYXRhIC4uLnwKKyAgICAgICAgICAgICstLS0rLS0tKy0tLSstLS0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSsKKworICAgICAgICAgU0kxIGFuZCBTSTIgcHJvdmlkZSBhIHN1YmZpZWxkIElELCB0eXBpY2FsbHkgdHdvIEFTQ0lJIGxldHRlcnMKKyAgICAgICAgIHdpdGggc29tZSBtbmVtb25pYyB2YWx1ZS4gIEplYW4tTG91cCBHYWlsbHkKKyAgICAgICAgIDxnemlwQHByZXAuYWkubWl0LmVkdT4gaXMgbWFpbnRhaW5pbmcgYSByZWdpc3RyeSBvZiBzdWJmaWVsZAorICAgICAgICAgSURzOyBwbGVhc2Ugc2VuZCBoaW0gYW55IHN1YmZpZWxkIElEIHlvdSB3aXNoIHRvIHVzZS4gIFN1YmZpZWxkCisgICAgICAgICBJRHMgd2l0aCBTSTIgPSAwIGFyZSByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS4gIFRoZSBmb2xsb3dpbmcKKyAgICAgICAgIElEcyBhcmUgY3VycmVudGx5IGRlZmluZWQ6CisKKworCitEZXV0c2NoICAgICAgICAgICAgICAgICAgICAgIEluZm9ybWF0aW9uYWwgICAgICAgICAgICAgICAgICAgICAgW1BhZ2UgOF0KKwwKK1JGQyAxOTUyICAgICAgICAgICAgIEdaSVAgRmlsZSBGb3JtYXQgU3BlY2lmaWNhdGlvbiAgICAgICAgICAgICBNYXkgMTk5NgorCisKKyAgICAgICAgICAgIFNJMSAgICAgICAgIFNJMiAgICAgICAgIERhdGEKKyAgICAgICAgICAgIC0tLS0tLS0tLS0gIC0tLS0tLS0tLS0gIC0tLS0KKyAgICAgICAgICAgIDB4NDEgKCdBJykgIDB4NzAgKCdQJykgIEFwb2xsbyBmaWxlIHR5cGUgaW5mb3JtYXRpb24KKworICAgICAgICAgTEVOIGdpdmVzIHRoZSBsZW5ndGggb2YgdGhlIHN1YmZpZWxkIGRhdGEsIGV4Y2x1ZGluZyB0aGUgNAorICAgICAgICAgaW5pdGlhbCBieXRlcy4KKworICAgICAgMi4zLjEuMi4gQ29tcGxpYW5jZQorCisgICAgICAgICBBIGNvbXBsaWFudCBjb21wcmVzc29yIG11c3QgcHJvZHVjZSBmaWxlcyB3aXRoIGNvcnJlY3QgSUQxLAorICAgICAgICAgSUQyLCBDTSwgQ1JDMzIsIGFuZCBJU0laRSwgYnV0IG1heSBzZXQgYWxsIHRoZSBvdGhlciBmaWVsZHMgaW4KKyAgICAgICAgIHRoZSBmaXhlZC1sZW5ndGggcGFydCBvZiB0aGUgaGVhZGVyIHRvIGRlZmF1bHQgdmFsdWVzICgyNTUgZm9yCisgICAgICAgICBPUywgMCBmb3IgYWxsIG90aGVycykuICBUaGUgY29tcHJlc3NvciBtdXN0IHNldCBhbGwgcmVzZXJ2ZWQKKyAgICAgICAgIGJpdHMgdG8gemVyby4KKworICAgICAgICAgQSBjb21wbGlhbnQgZGVjb21wcmVzc29yIG11c3QgY2hlY2sgSUQxLCBJRDIsIGFuZCBDTSwgYW5kCisgICAgICAgICBwcm92aWRlIGFuIGVycm9yIGluZGljYXRpb24gaWYgYW55IG9mIHRoZXNlIGhhdmUgaW5jb3JyZWN0CisgICAgICAgICB2YWx1ZXMuICBJdCBtdXN0IGV4YW1pbmUgRkVYVFJBL1hMRU4sIEZOQU1FLCBGQ09NTUVOVCBhbmQgRkhDUkMKKyAgICAgICAgIGF0IGxlYXN0IHNvIGl0IGNhbiBza2lwIG92ZXIgdGhlIG9wdGlvbmFsIGZpZWxkcyBpZiB0aGV5IGFyZQorICAgICAgICAgcHJlc2VudC4gIEl0IG5lZWQgbm90IGV4YW1pbmUgYW55IG90aGVyIHBhcnQgb2YgdGhlIGhlYWRlciBvcgorICAgICAgICAgdHJhaWxlcjsgaW4gcGFydGljdWxhciwgYSBkZWNvbXByZXNzb3IgbWF5IGlnbm9yZSBGVEVYVCBhbmQgT1MKKyAgICAgICAgIGFuZCBhbHdheXMgcHJvZHVjZSBiaW5hcnkgb3V0cHV0LCBhbmQgc3RpbGwgYmUgY29tcGxpYW50LiAgQQorICAgICAgICAgY29tcGxpYW50IGRlY29tcHJlc3NvciBtdXN0IGdpdmUgYW4gZXJyb3IgaW5kaWNhdGlvbiBpZiBhbnkKKyAgICAgICAgIHJlc2VydmVkIGJpdCBpcyBub24temVybywgc2luY2Ugc3VjaCBhIGJpdCBjb3VsZCBpbmRpY2F0ZSB0aGUKKyAgICAgICAgIHByZXNlbmNlIG9mIGEgbmV3IGZpZWxkIHRoYXQgd291bGQgY2F1c2Ugc3Vic2VxdWVudCBkYXRhIHRvIGJlCisgICAgICAgICBpbnRlcnByZXRlZCBpbmNvcnJlY3RseS4KKworMy4gUmVmZXJlbmNlcworCisgICBbMV0gIkluZm9ybWF0aW9uIFByb2Nlc3NpbmcgLSA4LWJpdCBzaW5nbGUtYnl0ZSBjb2RlZCBncmFwaGljCisgICAgICAgY2hhcmFjdGVyIHNldHMgLSBQYXJ0IDE6IExhdGluIGFscGhhYmV0IE5vLjEiIChJU08gODg1OS0xOjE5ODcpLgorICAgICAgIFRoZSBJU08gODg1OS0xIChMYXRpbi0xKSBjaGFyYWN0ZXIgc2V0IGlzIGEgc3VwZXJzZXQgb2YgNy1iaXQKKyAgICAgICBBU0NJSS4gRmlsZXMgZGVmaW5pbmcgdGhpcyBjaGFyYWN0ZXIgc2V0IGFyZSBhdmFpbGFibGUgYXMKKyAgICAgICBpc29fODg1OS0xLiogaW4gZnRwOi8vZnRwLnV1Lm5ldC9ncmFwaGljcy9wbmcvZG9jdW1lbnRzLworCisgICBbMl0gSVNPIDMzMDkKKworICAgWzNdIElUVS1UIHJlY29tbWVuZGF0aW9uIFYuNDIKKworICAgWzRdIERldXRzY2gsIEwuUC4sIkRFRkxBVEUgQ29tcHJlc3NlZCBEYXRhIEZvcm1hdCBTcGVjaWZpY2F0aW9uIiwKKyAgICAgICBhdmFpbGFibGUgaW4gZnRwOi8vZnRwLnV1Lm5ldC9wdWIvYXJjaGl2aW5nL3ppcC9kb2MvCisKKyAgIFs1XSBHYWlsbHksIEouLUwuLCBHWklQIGRvY3VtZW50YXRpb24sIGF2YWlsYWJsZSBhcyBnemlwLSoudGFyIGluCisgICAgICAgZnRwOi8vcHJlcC5haS5taXQuZWR1L3B1Yi9nbnUvCisKKyAgIFs2XSBTYXJ3YXRlLCBELlYuLCAiQ29tcHV0YXRpb24gb2YgQ3ljbGljIFJlZHVuZGFuY3kgQ2hlY2tzIHZpYSBUYWJsZQorICAgICAgIExvb2stVXAiLCBDb21tdW5pY2F0aW9ucyBvZiB0aGUgQUNNLCAzMSg4KSwgcHAuMTAwOC0xMDEzLgorCisKKworCitEZXV0c2NoICAgICAgICAgICAgICAgICAgICAgIEluZm9ybWF0aW9uYWwgICAgICAgICAgICAgICAgICAgICAgW1BhZ2UgOV0KKwwKK1JGQyAxOTUyICAgICAgICAgICAgIEdaSVAgRmlsZSBGb3JtYXQgU3BlY2lmaWNhdGlvbiAgICAgICAgICAgICBNYXkgMTk5NgorCisKKyAgIFs3XSBTY2h3YWRlcmVyLCBXLkQuLCAiQ1JDIENhbGN1bGF0aW9uIiwgQXByaWwgODUgUEMgVGVjaCBKb3VybmFsLAorICAgICAgIHBwLjExOC0xMzMuCisKKyAgIFs4XSBmdHA6Ly9mdHAuYWRlbGFpZGUuZWR1LmF1L3B1Yi9yb2Nrc29mdC9wYXBlcnMvY3JjX3YzLnR4dCwKKyAgICAgICBkZXNjcmliaW5nIHRoZSBDUkMgY29uY2VwdC4KKworNC4gU2VjdXJpdHkgQ29uc2lkZXJhdGlvbnMKKworICAgQW55IGRhdGEgY29tcHJlc3Npb24gbWV0aG9kIGludm9sdmVzIHRoZSByZWR1Y3Rpb24gb2YgcmVkdW5kYW5jeSBpbgorICAgdGhlIGRhdGEuICBDb25zZXF1ZW50bHksIGFueSBjb3JydXB0aW9uIG9mIHRoZSBkYXRhIGlzIGxpa2VseSB0byBoYXZlCisgICBzZXZlcmUgZWZmZWN0cyBhbmQgYmUgZGlmZmljdWx0IHRvIGNvcnJlY3QuICBVbmNvbXByZXNzZWQgdGV4dCwgb24KKyAgIHRoZSBvdGhlciBoYW5kLCB3aWxsIHByb2JhYmx5IHN0aWxsIGJlIHJlYWRhYmxlIGRlc3BpdGUgdGhlIHByZXNlbmNlCisgICBvZiBzb21lIGNvcnJ1cHRlZCBieXRlcy4KKworICAgSXQgaXMgcmVjb21tZW5kZWQgdGhhdCBzeXN0ZW1zIHVzaW5nIHRoaXMgZGF0YSBmb3JtYXQgcHJvdmlkZSBzb21lCisgICBtZWFucyBvZiB2YWxpZGF0aW5nIHRoZSBpbnRlZ3JpdHkgb2YgdGhlIGNvbXByZXNzZWQgZGF0YSwgc3VjaCBhcyBieQorICAgc2V0dGluZyBhbmQgY2hlY2tpbmcgdGhlIENSQy0zMiBjaGVjayB2YWx1ZS4KKworNS4gQWNrbm93bGVkZ2VtZW50cworCisgICBUcmFkZW1hcmtzIGNpdGVkIGluIHRoaXMgZG9jdW1lbnQgYXJlIHRoZSBwcm9wZXJ0eSBvZiB0aGVpcgorICAgcmVzcGVjdGl2ZSBvd25lcnMuCisKKyAgIEplYW4tTG91cCBHYWlsbHkgZGVzaWduZWQgdGhlIGd6aXAgZm9ybWF0IGFuZCB3cm90ZSwgd2l0aCBNYXJrIEFkbGVyLAorICAgdGhlIHJlbGF0ZWQgc29mdHdhcmUgZGVzY3JpYmVkIGluIHRoaXMgc3BlY2lmaWNhdGlvbi4gIEdsZW5uCisgICBSYW5kZXJzLVBlaHJzb24gY29udmVydGVkIHRoaXMgZG9jdW1lbnQgdG8gUkZDIGFuZCBIVE1MIGZvcm1hdC4KKworNi4gQXV0aG9yJ3MgQWRkcmVzcworCisgICBMLiBQZXRlciBEZXV0c2NoCisgICBBbGFkZGluIEVudGVycHJpc2VzCisgICAyMDMgU2FudGEgTWFyZ2FyaXRhIEF2ZS4KKyAgIE1lbmxvIFBhcmssIENBIDk0MDI1CisKKyAgIFBob25lOiAoNDE1KSAzMjItMDEwMyAoQU0gb25seSkKKyAgIEZBWDogICAoNDE1KSAzMjItMTczNAorICAgRU1haWw6IDxnaG9zdEBhbGFkZGluLmNvbT4KKworICAgUXVlc3Rpb25zIGFib3V0IHRoZSB0ZWNobmljYWwgY29udGVudCBvZiB0aGlzIHNwZWNpZmljYXRpb24gY2FuIGJlCisgICBzZW50IGJ5IGVtYWlsIHRvOgorCisgICBKZWFuLUxvdXAgR2FpbGx5IDxnemlwQHByZXAuYWkubWl0LmVkdT4gYW5kCisgICBNYXJrIEFkbGVyIDxtYWRsZXJAYWx1bW5pLmNhbHRlY2guZWR1PgorCisgICBFZGl0b3JpYWwgY29tbWVudHMgb24gdGhpcyBzcGVjaWZpY2F0aW9uIGNhbiBiZSBzZW50IGJ5IGVtYWlsIHRvOgorCisgICBMLiBQZXRlciBEZXV0c2NoIDxnaG9zdEBhbGFkZGluLmNvbT4gYW5kCisgICBHbGVubiBSYW5kZXJzLVBlaHJzb24gPHJhbmRlZ0BhbHVtbmkucnBpLmVkdT4KKworCisKK0RldXRzY2ggICAgICAgICAgICAgICAgICAgICAgSW5mb3JtYXRpb25hbCAgICAgICAgICAgICAgICAgICAgIFtQYWdlIDEwXQorDAorUkZDIDE5NTIgICAgICAgICAgICAgR1pJUCBGaWxlIEZvcm1hdCBTcGVjaWZpY2F0aW9uICAgICAgICAgICAgIE1heSAxOTk2CisKKworNy4gQXBwZW5kaXg6IEplYW4tTG91cCBHYWlsbHkncyBnemlwIHV0aWxpdHkKKworICAgVGhlIG1vc3Qgd2lkZWx5IHVzZWQgaW1wbGVtZW50YXRpb24gb2YgZ3ppcCBjb21wcmVzc2lvbiwgYW5kIHRoZQorICAgb3JpZ2luYWwgZG9jdW1lbnRhdGlvbiBvbiB3aGljaCB0aGlzIHNwZWNpZmljYXRpb24gaXMgYmFzZWQsIHdlcmUKKyAgIGNyZWF0ZWQgYnkgSmVhbi1Mb3VwIEdhaWxseSA8Z3ppcEBwcmVwLmFpLm1pdC5lZHU+LiAgU2luY2UgdGhpcworICAgaW1wbGVtZW50YXRpb24gaXMgYSBkZSBmYWN0byBzdGFuZGFyZCwgd2UgbWVudGlvbiBzb21lIG1vcmUgb2YgaXRzCisgICBmZWF0dXJlcyBoZXJlLiAgQWdhaW4sIHRoZSBtYXRlcmlhbCBpbiB0aGlzIHNlY3Rpb24gaXMgbm90IHBhcnQgb2YKKyAgIHRoZSBzcGVjaWZpY2F0aW9uIHBlciBzZSwgYW5kIGltcGxlbWVudGF0aW9ucyBuZWVkIG5vdCBmb2xsb3cgaXQgdG8KKyAgIGJlIGNvbXBsaWFudC4KKworICAgV2hlbiBjb21wcmVzc2luZyBvciBkZWNvbXByZXNzaW5nIGEgZmlsZSwgZ3ppcCBwcmVzZXJ2ZXMgdGhlCisgICBwcm90ZWN0aW9uLCBvd25lcnNoaXAsIGFuZCBtb2RpZmljYXRpb24gdGltZSBhdHRyaWJ1dGVzIG9uIHRoZSBsb2NhbAorICAgZmlsZSBzeXN0ZW0sIHNpbmNlIHRoZXJlIGlzIG5vIHByb3Zpc2lvbiBmb3IgcmVwcmVzZW50aW5nIHByb3RlY3Rpb24KKyAgIGF0dHJpYnV0ZXMgaW4gdGhlIGd6aXAgZmlsZSBmb3JtYXQgaXRzZWxmLiAgU2luY2UgdGhlIGZpbGUgZm9ybWF0CisgICBpbmNsdWRlcyBhIG1vZGlmaWNhdGlvbiB0aW1lLCB0aGUgZ3ppcCBkZWNvbXByZXNzb3IgcHJvdmlkZXMgYQorICAgY29tbWFuZCBsaW5lIHN3aXRjaCB0aGF0IGFzc2lnbnMgdGhlIG1vZGlmaWNhdGlvbiB0aW1lIGZyb20gdGhlIGZpbGUsCisgICByYXRoZXIgdGhhbiB0aGUgbG9jYWwgbW9kaWZpY2F0aW9uIHRpbWUgb2YgdGhlIGNvbXByZXNzZWQgaW5wdXQsIHRvCisgICB0aGUgZGVjb21wcmVzc2VkIG91dHB1dC4KKworOC4gQXBwZW5kaXg6IFNhbXBsZSBDUkMgQ29kZQorCisgICBUaGUgZm9sbG93aW5nIHNhbXBsZSBjb2RlIHJlcHJlc2VudHMgYSBwcmFjdGljYWwgaW1wbGVtZW50YXRpb24gb2YKKyAgIHRoZSBDUkMgKEN5Y2xpYyBSZWR1bmRhbmN5IENoZWNrKS4gKFNlZSBhbHNvIElTTyAzMzA5IGFuZCBJVFUtVCBWLjQyCisgICBmb3IgYSBmb3JtYWwgc3BlY2lmaWNhdGlvbi4pCisKKyAgIFRoZSBzYW1wbGUgY29kZSBpcyBpbiB0aGUgQU5TSSBDIHByb2dyYW1taW5nIGxhbmd1YWdlLiBOb24gQyB1c2VycworICAgbWF5IGZpbmQgaXQgZWFzaWVyIHRvIHJlYWQgd2l0aCB0aGVzZSBoaW50czoKKworICAgICAgJiAgICAgIEJpdHdpc2UgQU5EIG9wZXJhdG9yLgorICAgICAgXiAgICAgIEJpdHdpc2UgZXhjbHVzaXZlLU9SIG9wZXJhdG9yLgorICAgICAgPj4gICAgIEJpdHdpc2UgcmlnaHQgc2hpZnQgb3BlcmF0b3IuIFdoZW4gYXBwbGllZCB0byBhbgorICAgICAgICAgICAgIHVuc2lnbmVkIHF1YW50aXR5LCBhcyBoZXJlLCByaWdodCBzaGlmdCBpbnNlcnRzIHplcm8KKyAgICAgICAgICAgICBiaXQocykgYXQgdGhlIGxlZnQuCisgICAgICAhICAgICAgTG9naWNhbCBOT1Qgb3BlcmF0b3IuCisgICAgICArKyAgICAgIm4rKyIgaW5jcmVtZW50cyB0aGUgdmFyaWFibGUgbi4KKyAgICAgIDB4Tk5OICAweCBpbnRyb2R1Y2VzIGEgaGV4YWRlY2ltYWwgKGJhc2UgMTYpIGNvbnN0YW50LgorICAgICAgICAgICAgIFN1ZmZpeCBMIGluZGljYXRlcyBhIGxvbmcgdmFsdWUgKGF0IGxlYXN0IDMyIGJpdHMpLgorCisgICAgICAvKiBUYWJsZSBvZiBDUkNzIG9mIGFsbCA4LWJpdCBtZXNzYWdlcy4gKi8KKyAgICAgIHVuc2lnbmVkIGxvbmcgY3JjX3RhYmxlWzI1Nl07CisKKyAgICAgIC8qIEZsYWc6IGhhcyB0aGUgdGFibGUgYmVlbiBjb21wdXRlZD8gSW5pdGlhbGx5IGZhbHNlLiAqLworICAgICAgaW50IGNyY190YWJsZV9jb21wdXRlZCA9IDA7CisKKyAgICAgIC8qIE1ha2UgdGhlIHRhYmxlIGZvciBhIGZhc3QgQ1JDLiAqLworICAgICAgdm9pZCBtYWtlX2NyY190YWJsZSh2b2lkKQorICAgICAgeworICAgICAgICB1bnNpZ25lZCBsb25nIGM7CisKKworCitEZXV0c2NoICAgICAgICAgICAgICAgICAgICAgIEluZm9ybWF0aW9uYWwgICAgICAgICAgICAgICAgICAgICBbUGFnZSAxMV0KKwwKK1JGQyAxOTUyICAgICAgICAgICAgIEdaSVAgRmlsZSBGb3JtYXQgU3BlY2lmaWNhdGlvbiAgICAgICAgICAgICBNYXkgMTk5NgorCisKKyAgICAgICAgaW50IG4sIGs7CisgICAgICAgIGZvciAobiA9IDA7IG4gPCAyNTY7IG4rKykgeworICAgICAgICAgIGMgPSAodW5zaWduZWQgbG9uZykgbjsKKyAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgODsgaysrKSB7CisgICAgICAgICAgICBpZiAoYyAmIDEpIHsKKyAgICAgICAgICAgICAgYyA9IDB4ZWRiODgzMjBMIF4gKGMgPj4gMSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBjID0gYyA+PiAxOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBjcmNfdGFibGVbbl0gPSBjOworICAgICAgICB9CisgICAgICAgIGNyY190YWJsZV9jb21wdXRlZCA9IDE7CisgICAgICB9CisKKyAgICAgIC8qCisgICAgICAgICBVcGRhdGUgYSBydW5uaW5nIGNyYyB3aXRoIHRoZSBieXRlcyBidWZbMC4ubGVuLTFdIGFuZCByZXR1cm4KKyAgICAgICB0aGUgdXBkYXRlZCBjcmMuIFRoZSBjcmMgc2hvdWxkIGJlIGluaXRpYWxpemVkIHRvIHplcm8uIFByZS0gYW5kCisgICAgICAgcG9zdC1jb25kaXRpb25pbmcgKG9uZSdzIGNvbXBsZW1lbnQpIGlzIHBlcmZvcm1lZCB3aXRoaW4gdGhpcworICAgICAgIGZ1bmN0aW9uIHNvIGl0IHNob3VsZG4ndCBiZSBkb25lIGJ5IHRoZSBjYWxsZXIuIFVzYWdlIGV4YW1wbGU6CisKKyAgICAgICAgIHVuc2lnbmVkIGxvbmcgY3JjID0gMEw7CisKKyAgICAgICAgIHdoaWxlIChyZWFkX2J1ZmZlcihidWZmZXIsIGxlbmd0aCkgIT0gRU9GKSB7CisgICAgICAgICAgIGNyYyA9IHVwZGF0ZV9jcmMoY3JjLCBidWZmZXIsIGxlbmd0aCk7CisgICAgICAgICB9CisgICAgICAgICBpZiAoY3JjICE9IG9yaWdpbmFsX2NyYykgZXJyb3IoKTsKKyAgICAgICovCisgICAgICB1bnNpZ25lZCBsb25nIHVwZGF0ZV9jcmModW5zaWduZWQgbG9uZyBjcmMsCisgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgbGVuKQorICAgICAgeworICAgICAgICB1bnNpZ25lZCBsb25nIGMgPSBjcmMgXiAweGZmZmZmZmZmTDsKKyAgICAgICAgaW50IG47CisKKyAgICAgICAgaWYgKCFjcmNfdGFibGVfY29tcHV0ZWQpCisgICAgICAgICAgbWFrZV9jcmNfdGFibGUoKTsKKyAgICAgICAgZm9yIChuID0gMDsgbiA8IGxlbjsgbisrKSB7CisgICAgICAgICAgYyA9IGNyY190YWJsZVsoYyBeIGJ1ZltuXSkgJiAweGZmXSBeIChjID4+IDgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjIF4gMHhmZmZmZmZmZkw7CisgICAgICB9CisKKyAgICAgIC8qIFJldHVybiB0aGUgQ1JDIG9mIHRoZSBieXRlcyBidWZbMC4ubGVuLTFdLiAqLworICAgICAgdW5zaWduZWQgbG9uZyBjcmModW5zaWduZWQgY2hhciAqYnVmLCBpbnQgbGVuKQorICAgICAgeworICAgICAgICByZXR1cm4gdXBkYXRlX2NyYygwTCwgYnVmLCBsZW4pOworICAgICAgfQorCisKKworCitEZXV0c2NoICAgICAgICAgICAgICAgICAgICAgIEluZm9ybWF0aW9uYWwgICAgICAgICAgICAgICAgICAgICBbUGFnZSAxMl0KKwwKZGlmZiAtLWdpdCBhL3psaWItMS4yLjYvZG9jL3R4dHZzYmluLnR4dCBiL3psaWItMS4yLjYvZG9jL3R4dHZzYmluLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDBmMDYzCi0tLSAvZGV2L251bGwKKysrIGIvemxpYi0xLjIuNi9kb2MvdHh0dnNiaW4udHh0CkBAIC0wLDAgKzEsMTA3IEBACitBIEZhc3QgTWV0aG9kIGZvciBJZGVudGlmeWluZyBQbGFpbiBUZXh0IEZpbGVzCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKworSW50cm9kdWN0aW9uCistLS0tLS0tLS0tLS0KKworR2l2ZW4gYSBmaWxlIGNvbWluZyBmcm9tIGFuIHVua25vd24gc291cmNlLCBpdCBpcyBzb21ldGltZXMgZGVzaXJhYmxlCit0byBmaW5kIG91dCB3aGV0aGVyIHRoZSBmb3JtYXQgb2YgdGhhdCBmaWxlIGlzIHBsYWluIHRleHQuICBBbHRob3VnaAordGhpcyBtYXkgYXBwZWFyIGxpa2UgYSBzaW1wbGUgdGFzaywgYSBmdWxseSBhY2N1cmF0ZSBkZXRlY3Rpb24gb2YgdGhlCitmaWxlIHR5cGUgcmVxdWlyZXMgaGVhdnktZHV0eSBzZW1hbnRpYyBhbmFseXNpcyBvbiB0aGUgZmlsZSBjb250ZW50cy4KK0l0IGlzLCBob3dldmVyLCBwb3NzaWJsZSB0byBvYnRhaW4gc2F0aXNmYWN0b3J5IHJlc3VsdHMgYnkgZW1wbG95aW5nCit2YXJpb3VzIGhldXJpc3RpY3MuCisKK1ByZXZpb3VzIHZlcnNpb25zIG9mIFBLWmlwIGFuZCBvdGhlciB6aXAtY29tcGF0aWJsZSBjb21wcmVzc2lvbiB0b29scword2VyZSB1c2luZyBhIGNydWRlIGRldGVjdGlvbiBzY2hlbWU6IGlmIG1vcmUgdGhhbiA4MCUgKDQvNSkgb2YgdGhlIGJ5dGVzCitmb3VuZCBpbiBhIGNlcnRhaW4gYnVmZmVyIGFyZSB3aXRoaW4gdGhlIHJhbmdlIFs3Li4xMjddLCB0aGUgZmlsZSBpcworbGFiZWxlZCBhcyBwbGFpbiB0ZXh0LCBvdGhlcndpc2UgaXQgaXMgbGFiZWxlZCBhcyBiaW5hcnkuICBBIHByb21pbmVudAorbGltaXRhdGlvbiBvZiB0aGlzIHNjaGVtZSBpcyB0aGUgcmVzdHJpY3Rpb24gdG8gTGF0aW4tYmFzZWQgYWxwaGFiZXRzLgorT3RoZXIgYWxwaGFiZXRzLCBsaWtlIEdyZWVrLCBDeXJpbGxpYyBvciBBc2lhbiwgbWFrZSBleHRlbnNpdmUgdXNlIG9mCit0aGUgYnl0ZXMgd2l0aGluIHRoZSByYW5nZSBbMTI4Li4yNTVdLCBhbmQgdGV4dHMgdXNpbmcgdGhlc2UgYWxwaGFiZXRzCithcmUgbW9zdCBvZnRlbiBtaXNpZGVudGlmaWVkIGJ5IHRoaXMgc2NoZW1lOyBpbiBvdGhlciB3b3JkcywgdGhlIHJhdGUKK29mIGZhbHNlIG5lZ2F0aXZlcyBpcyBzb21ldGltZXMgdG9vIGhpZ2gsIHdoaWNoIG1lYW5zIHRoYXQgdGhlIHJlY2FsbAoraXMgbG93LiAgQW5vdGhlciB3ZWFrbmVzcyBvZiB0aGlzIHNjaGVtZSBpcyBhIHJlZHVjZWQgcHJlY2lzaW9uLCBkdWUgdG8KK3RoZSBmYWxzZSBwb3NpdGl2ZXMgdGhhdCBtYXkgb2NjdXIgd2hlbiBiaW5hcnkgZmlsZXMgY29udGFpbmluZyBsYXJnZQorYW1vdW50cyBvZiB0ZXh0dWFsIGNoYXJhY3RlcnMgYXJlIG1pc2lkZW50aWZpZWQgYXMgcGxhaW4gdGV4dC4KKworSW4gdGhpcyBhcnRpY2xlIHdlIHByb3Bvc2UgYSBuZXcsIHNpbXBsZSBkZXRlY3Rpb24gc2NoZW1lIHRoYXQgZmVhdHVyZXMKK2EgbXVjaCBpbmNyZWFzZWQgcHJlY2lzaW9uIGFuZCBhIG5lYXItMTAwJSByZWNhbGwuICBUaGlzIHNjaGVtZSBpcworZGVzaWduZWQgdG8gd29yayBvbiBBU0NJSSwgVW5pY29kZSBhbmQgb3RoZXIgQVNDSUktZGVyaXZlZCBhbHBoYWJldHMsCithbmQgaXQgaGFuZGxlcyBzaW5nbGUtYnl0ZSBlbmNvZGluZ3MgKElTTy04ODU5LCBNYWNSb21hbiwgS09JOCwgZXRjLikKK2FuZCB2YXJpYWJsZS1zaXplZCBlbmNvZGluZ3MgKElTTy0yMDIyLCBVVEYtOCwgZXRjLikuICBXaWRlciBlbmNvZGluZ3MKKyhVQ1MtMi9VVEYtMTYgYW5kIFVDUy00L1VURi0zMikgYXJlIG5vdCBoYW5kbGVkLCBob3dldmVyLgorCisKK1RoZSBBbGdvcml0aG0KKy0tLS0tLS0tLS0tLS0KKworVGhlIGFsZ29yaXRobSB3b3JrcyBieSBkaXZpZGluZyB0aGUgc2V0IG9mIGJ5dGVjb2RlcyBbMC4uMjU1XSBpbnRvIHRocmVlCitjYXRlZ29yaWVzOgorLSBUaGUgd2hpdGUgbGlzdCBvZiB0ZXh0dWFsIGJ5dGVjb2RlczoKKyAgOSAoVEFCKSwgMTAgKExGKSwgMTMgKENSKSwgMzIgKFNQQUNFKSB0byAyNTUuCistIFRoZSBncmF5IGxpc3Qgb2YgdG9sZXJhdGVkIGJ5dGVjb2RlczoKKyAgNyAoQkVMKSwgOCAoQlMpLCAxMSAoVlQpLCAxMiAoRkYpLCAyNiAoU1VCKSwgMjcgKEVTQykuCistIFRoZSBibGFjayBsaXN0IG9mIHVuZGVzaXJlZCwgbm9uLXRleHR1YWwgYnl0ZWNvZGVzOgorICAwIChOVUwpIHRvIDYsIDE0IHRvIDMxLgorCitJZiBhIGZpbGUgY29udGFpbnMgYXQgbGVhc3Qgb25lIGJ5dGUgdGhhdCBiZWxvbmdzIHRvIHRoZSB3aGl0ZSBsaXN0IGFuZAorbm8gYnl0ZSB0aGF0IGJlbG9uZ3MgdG8gdGhlIGJsYWNrIGxpc3QsIHRoZW4gdGhlIGZpbGUgaXMgY2F0ZWdvcml6ZWQgYXMKK3BsYWluIHRleHQ7IG90aGVyd2lzZSwgaXQgaXMgY2F0ZWdvcml6ZWQgYXMgYmluYXJ5LiAgKFRoZSBib3VuZGFyeSBjYXNlLAord2hlbiB0aGUgZmlsZSBpcyBlbXB0eSwgYXV0b21hdGljYWxseSBmYWxscyBpbnRvIHRoZSBsYXR0ZXIgY2F0ZWdvcnkuKQorCisKK1JhdGlvbmFsZQorLS0tLS0tLS0tCisKK1RoZSBpZGVhIGJlaGluZCB0aGlzIGFsZ29yaXRobSByZWxpZXMgb24gdHdvIG9ic2VydmF0aW9ucy4KKworVGhlIGZpcnN0IG9ic2VydmF0aW9uIGlzIHRoYXQsIGFsdGhvdWdoIHRoZSBmdWxsIHJhbmdlIG9mIDctYml0IGNvZGVzCitbMC4uMTI3XSBpcyBwcm9wZXJseSBzcGVjaWZpZWQgYnkgdGhlIEFTQ0lJIHN0YW5kYXJkLCBtb3N0IGNvbnRyb2wKK2NoYXJhY3RlcnMgaW4gdGhlIHJhbmdlIFswLi4zMV0gYXJlIG5vdCB1c2VkIGluIHByYWN0aWNlLiAgVGhlIG9ubHkKK3dpZGVseS11c2VkLCBhbG1vc3QgdW5pdmVyc2FsbHktcG9ydGFibGUgY29udHJvbCBjb2RlcyBhcmUgOSAoVEFCKSwKKzEwIChMRikgYW5kIDEzIChDUikuICBUaGVyZSBhcmUgYSBmZXcgbW9yZSBjb250cm9sIGNvZGVzIHRoYXQgYXJlCityZWNvZ25pemVkIG9uIGEgcmVkdWNlZCByYW5nZSBvZiBwbGF0Zm9ybXMgYW5kIHRleHQgdmlld2Vycy9lZGl0b3JzOgorNyAoQkVMKSwgOCAoQlMpLCAxMSAoVlQpLCAxMiAoRkYpLCAyNiAoU1VCKSBhbmQgMjcgKEVTQyk7IGJ1dCB0aGVzZQorY29kZXMgYXJlIHJhcmVseSAoaWYgZXZlcikgdXNlZCBhbG9uZSwgd2l0aG91dCBiZWluZyBhY2NvbXBhbmllZCBieQorc29tZSBwcmludGFibGUgdGV4dC4gIEV2ZW4gdGhlIG5ld2VyLCBwb3J0YWJsZSB0ZXh0IGZvcm1hdHMgc3VjaCBhcworWE1MIGF2b2lkIHVzaW5nIGNvbnRyb2wgY2hhcmFjdGVycyBvdXRzaWRlIHRoZSBsaXN0IG1lbnRpb25lZCBoZXJlLgorCitUaGUgc2Vjb25kIG9ic2VydmF0aW9uIGlzIHRoYXQgbW9zdCBvZiB0aGUgYmluYXJ5IGZpbGVzIHRlbmQgdG8gY29udGFpbgorY29udHJvbCBjaGFyYWN0ZXJzLCBlc3BlY2lhbGx5IDAgKE5VTCkuICBFdmVuIHRob3VnaCB0aGUgb2xkZXIgdGV4dAorZGV0ZWN0aW9uIHNjaGVtZXMgb2JzZXJ2ZSB0aGUgcHJlc2VuY2Ugb2Ygbm9uLUFTQ0lJIGNvZGVzIGZyb20gdGhlIHJhbmdlCitbMTI4Li4yNTVdLCB0aGUgcHJlY2lzaW9uIHJhcmVseSBoYXMgdG8gc3VmZmVyIGlmIHRoaXMgdXBwZXIgcmFuZ2UgaXMKK2xhYmVsZWQgYXMgdGV4dHVhbCwgYmVjYXVzZSB0aGUgZmlsZXMgdGhhdCBhcmUgZ2VudWluZWx5IGJpbmFyeSB0ZW5kIHRvCitjb250YWluIGJvdGggY29udHJvbCBjaGFyYWN0ZXJzIGFuZCBjb2RlcyBmcm9tIHRoZSB1cHBlciByYW5nZS4gIE9uIHRoZQorb3RoZXIgaGFuZCwgdGhlIHVwcGVyIHJhbmdlIG5lZWRzIHRvIGJlIGxhYmVsZWQgYXMgdGV4dHVhbCwgYmVjYXVzZSBpdAoraXMgdXNlZCBieSB2aXJ0dWFsbHkgYWxsIEFTQ0lJIGV4dGVuc2lvbnMuICBJbiBwYXJ0aWN1bGFyLCB0aGlzIHJhbmdlIGlzCit1c2VkIGZvciBlbmNvZGluZyBub24tTGF0aW4gc2NyaXB0cy4KKworU2luY2UgdGhlcmUgaXMgbm8gY291bnRpbmcgaW52b2x2ZWQsIG90aGVyIHRoYW4gc2ltcGx5IG9ic2VydmluZyB0aGUKK3ByZXNlbmNlIG9yIHRoZSBhYnNlbmNlIG9mIHNvbWUgYnl0ZSB2YWx1ZXMsIHRoZSBhbGdvcml0aG0gcHJvZHVjZXMKK2NvbnNpc3RlbnQgcmVzdWx0cywgcmVnYXJkbGVzcyB3aGF0IGFscGhhYmV0IGVuY29kaW5nIGlzIGJlaW5nIHVzZWQuCisoSWYgY291bnRpbmcgd2VyZSBpbnZvbHZlZCwgaXQgY291bGQgYmUgcG9zc2libGUgdG8gb2J0YWluIGRpZmZlcmVudAorcmVzdWx0cyBvbiBhIHRleHQgZW5jb2RlZCwgc2F5LCB1c2luZyBJU08tODg1OS0xNiB2ZXJzdXMgVVRGLTguKQorCitUaGVyZSBpcyBhbiBleHRyYSBjYXRlZ29yeSBvZiBwbGFpbiB0ZXh0IGZpbGVzIHRoYXQgYXJlICJwb2xsdXRlZCIgd2l0aAorb25lIG9yIG1vcmUgYmxhY2stbGlzdGVkIGNvZGVzLCBlaXRoZXIgYnkgbWlzdGFrZSBvciBieSBwZWN1bGlhciBkZXNpZ24KK2NvbnNpZGVyYXRpb25zLiAgSW4gc3VjaCBjYXNlcywgYSBzY2hlbWUgdGhhdCB0b2xlcmF0ZXMgYSBzbWFsbCBmcmFjdGlvbgorb2YgYmxhY2stbGlzdGVkIGNvZGVzIHdvdWxkIHByb3ZpZGUgYW4gaW5jcmVhc2VkIHJlY2FsbCAoaS5lLiBtb3JlIHRydWUKK3Bvc2l0aXZlcykuICBUaGlzLCBob3dldmVyLCBpbmN1cnMgYSByZWR1Y2VkIHByZWNpc2lvbiBvdmVyYWxsLCBzaW5jZQorZmFsc2UgcG9zaXRpdmVzIGFyZSBtb3JlIGxpa2VseSB0byBhcHBlYXIgaW4gYmluYXJ5IGZpbGVzIHRoYXQgY29udGFpbgorbGFyZ2UgY2h1bmtzIG9mIHRleHR1YWwgZGF0YS4gIEZ1cnRoZXJtb3JlLCAicG9sbHV0ZWQiIHBsYWluIHRleHQgc2hvdWxkCitiZSByZWdhcmRlZCBhcyBiaW5hcnkgYnkgZ2VuZXJhbC1wdXJwb3NlIHRleHQgZGV0ZWN0aW9uIHNjaGVtZXMsIGJlY2F1c2UKK2dlbmVyYWwtcHVycG9zZSB0ZXh0IHByb2Nlc3NpbmcgYWxnb3JpdGhtcyBtaWdodCBub3QgYmUgYXBwbGljYWJsZS4KK1VuZGVyIHRoaXMgcHJlbWlzZSwgaXQgaXMgc2FmZSB0byBzYXkgdGhhdCBvdXIgZGV0ZWN0aW9uIG1ldGhvZCBwcm92aWRlcworYSBuZWFyLTEwMCUgcmVjYWxsLgorCitFeHBlcmltZW50cyBoYXZlIGJlZW4gcnVuIG9uIG1hbnkgZmlsZXMgY29taW5nIGZyb20gdmFyaW91cyBwbGF0Zm9ybXMKK2FuZCBhcHBsaWNhdGlvbnMuICBXZSB0cmllZCBwbGFpbiB0ZXh0IGZpbGVzLCBzeXN0ZW0gbG9ncywgc291cmNlIGNvZGUsCitmb3JtYXR0ZWQgb2ZmaWNlIGRvY3VtZW50cywgY29tcGlsZWQgb2JqZWN0IGNvZGUsIGV0Yy4gIFRoZSByZXN1bHRzCitjb25maXJtIHRoZSBvcHRpbWlzdGljIGFzc3VtcHRpb25zIGFib3V0IHRoZSBjYXBhYmlsaXRpZXMgb2YgdGhpcworYWxnb3JpdGhtLgorCisKKy0tCitDb3NtaW4gVHJ1dGEKK0xhc3QgdXBkYXRlZDogMjAwNi1NYXktMjgKZGlmZiAtLWdpdCBhL3psaWItMS4yLjYvZXhhbXBsZXMvUkVBRE1FLmV4YW1wbGVzIGIvemxpYi0xLjIuNi9leGFtcGxlcy9SRUFETUUuZXhhbXBsZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZhMzE3MQotLS0gL2Rldi9udWxsCisrKyBiL3psaWItMS4yLjYvZXhhbXBsZXMvUkVBRE1FLmV4YW1wbGVzCkBAIC0wLDAgKzEsNDkgQEAKK1RoaXMgZGlyZWN0b3J5IGNvbnRhaW5zIGV4YW1wbGVzIG9mIHRoZSB1c2Ugb2YgemxpYiBhbmQgb3RoZXIgcmVsZXZhbnQKK3Byb2dyYW1zIGFuZCBkb2N1bWVudGF0aW9uLgorCitlbm91Z2guYworICAgIGNhbGN1bGF0aW9uIGFuZCBqdXN0aWZpY2F0aW9uIG9mIEVOT1VHSCBwYXJhbWV0ZXIgaW4gaW5mdHJlZXMuaAorICAgIC0gY2FsY3VsYXRlcyB0aGUgbWF4aW11bSB0YWJsZSBzcGFjZSB1c2VkIGluIGluZmxhdGUgdHJlZQorICAgICAgY29uc3RydWN0aW9uIG92ZXIgYWxsIHBvc3NpYmxlIEh1ZmZtYW4gY29kZXMKKworZml0YmxrLmMKKyAgICBjb21wcmVzcyBqdXN0IGVub3VnaCBpbnB1dCB0byBuZWFybHkgZmlsbCBhIHJlcXVlc3RlZCBvdXRwdXQgc2l6ZQorICAgIC0gemxpYiBpc24ndCBkZXNpZ25lZCB0byBkbyB0aGlzLCBidXQgZml0YmxrIGRvZXMgaXQgYW55d2F5CisKK2d1bi5jCisgICAgdW5jb21wcmVzcyBhIGd6aXAgZmlsZQorICAgIC0gaWxsdXN0cmF0ZXMgdGhlIHVzZSBvZiBpbmZsYXRlQmFjaygpIGZvciBoaWdoIHNwZWVkIGZpbGUtdG8tZmlsZQorICAgICAgZGVjb21wcmVzc2lvbiB1c2luZyBjYWxsLWJhY2sgZnVuY3Rpb25zCisgICAgLSBpcyBhcHByb3hpbWF0ZWx5IHR3aWNlIGFzIGZhc3QgYXMgZ3ppcCAtZAorICAgIC0gYWxzbyBwcm92aWRlcyBVbml4IHVuY29tcHJlc3MgZnVuY3Rpb25hbGl0eSwgYWdhaW4gdHdpY2UgYXMgZmFzdAorCitnemFwcGVuZC5jCisgICAgYXBwZW5kIHRvIGEgZ3ppcCBmaWxlCisgICAgLSBpbGx1c3RyYXRlcyB0aGUgdXNlIG9mIHRoZSBaX0JMT0NLIGZsdXNoIHBhcmFtZXRlciBmb3IgaW5mbGF0ZSgpCisgICAgLSBpbGx1c3RyYXRlcyB0aGUgdXNlIG9mIGRlZmxhdGVQcmltZSgpIHRvIHN0YXJ0IGF0IGFueSBiaXQKKworZ3pqb2luLmMKKyAgICBqb2luIGd6aXAgZmlsZXMgd2l0aG91dCByZWNhbGN1bGF0aW5nIHRoZSBjcmMgb3IgcmVjb21wcmVzc2luZworICAgIC0gaWxsdXN0cmF0ZXMgdGhlIHVzZSBvZiB0aGUgWl9CTE9DSyBmbHVzaCBwYXJhbWV0ZXIgZm9yIGluZmxhdGUoKQorICAgIC0gaWxsdXN0cmF0ZXMgdGhlIHVzZSBvZiBjcmMzMl9jb21iaW5lKCkKKworZ3psb2cuYworZ3psb2cuaAorICAgIGVmZmljaWVudGx5IGFuZCByb2J1c3RseSBtYWludGFpbiBhIG1lc3NhZ2UgbG9nIGZpbGUgaW4gZ3ppcCBmb3JtYXQKKyAgICAtIGlsbHVzdHJhdGVzIHVzZSBvZiByYXcgZGVmbGF0ZSwgWl9QQVJUSUFMX0ZMVVNILCBkZWZsYXRlUHJpbWUoKSwKKyAgICAgIGFuZCBkZWZsYXRlU2V0RGljdGlvbmFyeSgpCisgICAgLSBpbGx1c3RyYXRlcyB1c2Ugb2YgYSBnemlwIGhlYWRlciBleHRyYSBmaWVsZAorCit6bGliX2hvdy5odG1sCisgICAgcGFpbmZ1bGx5IGNvbXByZWhlbnNpdmUgZGVzY3JpcHRpb24gb2YgenBpcGUuYyAoc2VlIGJlbG93KQorICAgIC0gZGVzY3JpYmVzIGluIGV4Y3J1Y2lhdGluZyBkZXRhaWwgdGhlIHVzZSBvZiBkZWZsYXRlKCkgYW5kIGluZmxhdGUoKQorCit6cGlwZS5jCisgICAgcmVhZHMgYW5kIHdyaXRlcyB6bGliIHN0cmVhbXMgZnJvbSBzdGRpbiB0byBzdGRvdXQKKyAgICAtIGlsbHVzdHJhdGVzIHRoZSBwcm9wZXIgdXNlIG9mIGRlZmxhdGUoKSBhbmQgaW5mbGF0ZSgpCisgICAgLSBkZWVwbHkgY29tbWVudGVkIGluIHpsaWJfaG93Lmh0bWwgKHNlZSBhYm92ZSkKKworenJhbi5jCisgICAgaW5kZXggYSB6bGliIG9yIGd6aXAgc3RyZWFtIGFuZCByYW5kb21seSBhY2Nlc3MgaXQKKyAgICAtIGlsbHVzdHJhdGVzIHRoZSB1c2Ugb2YgWl9CTE9DSywgaW5mbGF0ZVByaW1lKCksIGFuZAorICAgICAgaW5mbGF0ZVNldERpY3Rpb25hcnkoKSB0byBwcm92aWRlIHJhbmRvbSBhY2Nlc3MKZGlmZiAtLWdpdCBhL3psaWItMS4yLjYvZXhhbXBsZXMvZW5vdWdoLmMgYi96bGliLTEuMi42L2V4YW1wbGVzL2Vub3VnaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0MDQxMGIKLS0tIC9kZXYvbnVsbAorKysgYi96bGliLTEuMi42L2V4YW1wbGVzL2Vub3VnaC5jCkBAIC0wLDAgKzEsNTY5IEBACisvKiBlbm91Z2guYyAtLSBkZXRlcm1pbmUgdGhlIG1heGltdW0gc2l6ZSBvZiBpbmZsYXRlJ3MgSHVmZm1hbiBjb2RlIHRhYmxlcyBvdmVyCisgKiBhbGwgcG9zc2libGUgdmFsaWQgYW5kIGNvbXBsZXRlIEh1ZmZtYW4gY29kZXMsIHN1YmplY3QgdG8gYSBsZW5ndGggbGltaXQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcsIDIwMDggTWFyayBBZGxlcgorICogVmVyc2lvbiAxLjMgIDE3IEZlYnJ1YXJ5IDIwMDggIE1hcmsgQWRsZXIKKyAqLworCisvKiBWZXJzaW9uIGhpc3Rvcnk6CisgICAxLjAgICAzIEphbiAyMDA3ICBGaXJzdCB2ZXJzaW9uIChkZXJpdmVkIGZyb20gY29kZWNvdW50LmMgdmVyc2lvbiAxLjQpCisgICAxLjEgICA0IEphbiAyMDA3ICBVc2UgZmFzdGVyIGluY3JlbWVudGFsIHRhYmxlIHVzYWdlIGNvbXB1dGF0aW9uCisgICAgICAgICAgICAgICAgICAgICBQcnVuZSBleGFtaW5lKCkgc2VhcmNoIG9uIHByZXZpb3VzbHkgdmlzaXRlZCBzdGF0ZXMKKyAgIDEuMiAgIDUgSmFuIDIwMDcgIENvbW1lbnRzIGNsZWFuIHVwCisgICAgICAgICAgICAgICAgICAgICBBcyBpbmZsYXRlIGRvZXMsIGRlY3JlYXNlIHJvb3QgZm9yIHNob3J0IGNvZGVzCisgICAgICAgICAgICAgICAgICAgICBSZWZ1c2UgY2FzZXMgd2hlcmUgaW5mbGF0ZSB3b3VsZCBpbmNyZWFzZSByb290CisgICAxLjMgIDE3IEZlYiAyMDA4ICBBZGQgYXJndW1lbnQgZm9yIGluaXRpYWwgcm9vdCB0YWJsZSBzaXplCisgICAgICAgICAgICAgICAgICAgICBGaXggYnVnIGZvciBpbml0aWFsIHJvb3QgdGFibGUgc2l6ZSA9PSBtYXggLSAxCisgICAgICAgICAgICAgICAgICAgICBVc2UgYSBtYWNybyB0byBjb21wdXRlIHRoZSBoaXN0b3J5IGluZGV4CisgKi8KKworLyoKKyAgIEV4YW1pbmUgYWxsIHBvc3NpYmxlIEh1ZmZtYW4gY29kZXMgZm9yIGEgZ2l2ZW4gbnVtYmVyIG9mIHN5bWJvbHMgYW5kIGEKKyAgIG1heGltdW0gY29kZSBsZW5ndGggaW4gYml0cyB0byBkZXRlcm1pbmUgdGhlIG1heGltdW0gdGFibGUgc2l6ZSBmb3IgemlsYidzCisgICBpbmZsYXRlLiAgT25seSBjb21wbGV0ZSBIdWZmbWFuIGNvZGVzIGFyZSBjb3VudGVkLgorCisgICBUd28gY29kZXMgYXJlIGNvbnNpZGVyZWQgZGlzdGluY3QgaWYgdGhlIHZlY3RvcnMgb2YgdGhlIG51bWJlciBvZiBjb2RlcyBwZXIKKyAgIGxlbmd0aCBhcmUgbm90IGlkZW50aWNhbC4gIFNvIHBlcm11dGF0aW9ucyBvZiB0aGUgc3ltYm9sIGFzc2lnbm1lbnRzIHJlc3VsdAorICAgaW4gdGhlIHNhbWUgY29kZSBmb3IgdGhlIGNvdW50aW5nLCBhcyBkbyBwZXJtdXRhdGlvbnMgb2YgdGhlIGFzc2lnbm1lbnRzIG9mCisgICB0aGUgYml0IHZhbHVlcyB0byB0aGUgY29kZXMgKGkuZS4gb25seSBjYW5vbmljYWwgY29kZXMgYXJlIGNvdW50ZWQpLgorCisgICBXZSBidWlsZCBhIGNvZGUgZnJvbSBzaG9ydGVyIHRvIGxvbmdlciBsZW5ndGhzLCBkZXRlcm1pbmluZyBob3cgbWFueSBzeW1ib2xzCisgICBhcmUgY29kZWQgYXQgZWFjaCBsZW5ndGguICBBdCBlYWNoIHN0ZXAsIHdlIGhhdmUgaG93IG1hbnkgc3ltYm9scyByZW1haW4gdG8KKyAgIGJlIGNvZGVkLCB3aGF0IHRoZSBsYXN0IGNvZGUgbGVuZ3RoIHVzZWQgd2FzLCBhbmQgaG93IG1hbnkgYml0IHBhdHRlcm5zIG9mCisgICB0aGF0IGxlbmd0aCByZW1haW4gdW51c2VkLiBUaGVuIHdlIGFkZCBvbmUgdG8gdGhlIGNvZGUgbGVuZ3RoIGFuZCBkb3VibGUgdGhlCisgICBudW1iZXIgb2YgdW51c2VkIHBhdHRlcm5zIHRvIGdyYWR1YXRlIHRvIHRoZSBuZXh0IGNvZGUgbGVuZ3RoLiAgV2UgdGhlbgorICAgYXNzaWduIGFsbCBwb3J0aW9ucyBvZiB0aGUgcmVtYWluaW5nIHN5bWJvbHMgdG8gdGhhdCBjb2RlIGxlbmd0aCB0aGF0CisgICBwcmVzZXJ2ZSB0aGUgcHJvcGVydGllcyBvZiBhIGNvcnJlY3QgYW5kIGV2ZW50dWFsbHkgY29tcGxldGUgY29kZS4gIFRob3NlCisgICBwcm9wZXJ0aWVzIGFyZTogd2UgY2Fubm90IHVzZSBtb3JlIGJpdCBwYXR0ZXJucyB0aGFuIGFyZSBhdmFpbGFibGU7IGFuZCB3aGVuCisgICBhbGwgdGhlIHN5bWJvbHMgYXJlIHVzZWQsIHRoZXJlIGFyZSBleGFjdGx5IHplcm8gcG9zc2libGUgYml0IHBhdHRlcm5zCisgICByZW1haW5pbmcuCisKKyAgIFRoZSBpbmZsYXRlIEh1ZmZtYW4gZGVjb2RpbmcgYWxnb3JpdGhtIHVzZXMgdHdvLWxldmVsIGxvb2t1cCB0YWJsZXMgZm9yCisgICBzcGVlZC4gIFRoZXJlIGlzIGEgc2luZ2xlIGZpcnN0LWxldmVsIHRhYmxlIHRvIGRlY29kZSBjb2RlcyB1cCB0byByb290IGJpdHMKKyAgIGluIGxlbmd0aCAocm9vdCA9PSA5IGluIHRoZSBjdXJyZW50IGluZmxhdGUgaW1wbGVtZW50YXRpb24pLiAgVGhlIHRhYmxlCisgICBoYXMgMSA8PCByb290IGVudHJpZXMgYW5kIGlzIGluZGV4ZWQgYnkgdGhlIG5leHQgcm9vdCBiaXRzIG9mIGlucHV0LiAgQ29kZXMKKyAgIHNob3J0ZXIgdGhhbiByb290IGJpdHMgaGF2ZSByZXBsaWNhdGVkIHRhYmxlIGVudHJpZXMsIHNvIHRoYXQgdGhlIGNvcnJlY3QKKyAgIGVudHJ5IGlzIHBvaW50ZWQgdG8gcmVnYXJkbGVzcyBvZiB0aGUgYml0cyB0aGF0IGZvbGxvdyB0aGUgc2hvcnQgY29kZS4gIElmCisgICB0aGUgY29kZSBpcyBsb25nZXIgdGhhbiByb290IGJpdHMsIHRoZW4gdGhlIHRhYmxlIGVudHJ5IHBvaW50cyB0byBhIHNlY29uZC0KKyAgIGxldmVsIHRhYmxlLiAgVGhlIHNpemUgb2YgdGhhdCB0YWJsZSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBsb25nZXN0IGNvZGUgd2l0aAorICAgdGhhdCByb290LWJpdCBwcmVmaXguICBJZiB0aGF0IGxvbmdlc3QgY29kZSBoYXMgbGVuZ3RoIGxlbiwgdGhlbiB0aGUgdGFibGUKKyAgIGhhcyBzaXplIDEgPDwgKGxlbiAtIHJvb3QpLCB0byBpbmRleCB0aGUgcmVtYWluaW5nIGJpdHMgaW4gdGhhdCBzZXQgb2YKKyAgIGNvZGVzLiAgRWFjaCBzdWJzZXF1ZW50IHJvb3QtYml0IHByZWZpeCB0aGVuIGhhcyBpdHMgb3duIHN1Yi10YWJsZS4gIFRoZQorICAgdG90YWwgbnVtYmVyIG9mIHRhYmxlIGVudHJpZXMgcmVxdWlyZWQgYnkgdGhlIGNvZGUgaXMgY2FsY3VsYXRlZAorICAgaW5jcmVtZW50YWxseSBhcyB0aGUgbnVtYmVyIG9mIGNvZGVzIGF0IGVhY2ggYml0IGxlbmd0aCBpcyBwb3B1bGF0ZWQuICBXaGVuCisgICBhbGwgb2YgdGhlIGNvZGVzIGFyZSBzaG9ydGVyIHRoYW4gcm9vdCBiaXRzLCB0aGVuIHJvb3QgaXMgcmVkdWNlZCB0byB0aGUKKyAgIGxvbmdlc3QgY29kZSBsZW5ndGgsIHJlc3VsdGluZyBpbiBhIHNpbmdsZSwgc21hbGxlciwgb25lLWxldmVsIHRhYmxlLgorCisgICBUaGUgaW5mbGF0ZSBhbGdvcml0aG0gYWxzbyBwcm92aWRlcyBmb3Igc21hbGwgdmFsdWVzIG9mIHJvb3QgKHJlbGF0aXZlIHRvCisgICB0aGUgbG9nMiBvZiB0aGUgbnVtYmVyIG9mIHN5bWJvbHMpLCB3aGVyZSB0aGUgc2hvcnRlc3QgY29kZSBoYXMgbW9yZSBiaXRzCisgICB0aGFuIHJvb3QuICBJbiB0aGF0IGNhc2UsIHJvb3QgaXMgaW5jcmVhc2VkIHRvIHRoZSBsZW5ndGggb2YgdGhlIHNob3J0ZXN0CisgICBjb2RlLiAgVGhpcyBwcm9ncmFtLCBieSBkZXNpZ24sIGRvZXMgbm90IGhhbmRsZSB0aGF0IGNhc2UsIHNvIGl0IGlzIHZlcmlmaWVkCisgICB0aGF0IHRoZSBudW1iZXIgb2Ygc3ltYm9scyBpcyBsZXNzIHRoYW4gMl4ocm9vdCArIDEpLgorCisgICBJbiBvcmRlciB0byBzcGVlZCB1cCB0aGUgZXhhbWluYXRpb24gKGJ5IGFib3V0IHRlbiBvcmRlcnMgb2YgbWFnbml0dWRlIGZvcgorICAgdGhlIGRlZmF1bHQgYXJndW1lbnRzKSwgdGhlIGludGVybWVkaWF0ZSBzdGF0ZXMgaW4gdGhlIGJ1aWxkLXVwIG9mIGEgY29kZQorICAgYXJlIHJlbWVtYmVyZWQgYW5kIHByZXZpb3VzbHkgdmlzaXRlZCBicmFuY2hlcyBhcmUgcHJ1bmVkLiAgVGhlIG1lbW9yeQorICAgcmVxdWlyZWQgZm9yIHRoaXMgd2lsbCBpbmNyZWFzZSByYXBpZGx5IHdpdGggdGhlIHRvdGFsIG51bWJlciBvZiBzeW1ib2xzIGFuZAorICAgdGhlIG1heGltdW0gY29kZSBsZW5ndGggaW4gYml0cy4gIEhvd2V2ZXIgdGhpcyBpcyBhIHZlcnkgc21hbGwgcHJpY2UgdG8gcGF5CisgICBmb3IgdGhlIHZhc3Qgc3BlZWR1cC4KKworICAgRmlyc3QsIGFsbCBvZiB0aGUgcG9zc2libGUgSHVmZm1hbiBjb2RlcyBhcmUgY291bnRlZCwgYW5kIHJlYWNoYWJsZQorICAgaW50ZXJtZWRpYXRlIHN0YXRlcyBhcmUgbm90ZWQgYnkgYSBub24temVybyBjb3VudCBpbiBhIHNhdmVkLXJlc3VsdHMgYXJyYXkuCisgICBTZWNvbmQsIHRoZSBpbnRlcm1lZGlhdGUgc3RhdGVzIHRoYXQgbGVhZCB0byAocm9vdCArIDEpIGJpdCBvciBsb25nZXIgY29kZXMKKyAgIGFyZSB1c2VkIHRvIGxvb2sgYXQgYWxsIHN1Yi1jb2RlcyBmcm9tIHRob3NlIGp1bmN0dXJlcyBmb3IgdGhlaXIgaW5mbGF0ZQorICAgbWVtb3J5IHVzYWdlLiAgKFRoZSBhbW91bnQgb2YgbWVtb3J5IHVzZWQgaXMgbm90IGFmZmVjdGVkIGJ5IHRoZSBudW1iZXIgb2YKKyAgIGNvZGVzIG9mIHJvb3QgYml0cyBvciBsZXNzIGluIGxlbmd0aC4pICBUaGlyZCwgdGhlIHZpc2l0ZWQgc3RhdGVzIGluIHRoZQorICAgY29uc3RydWN0aW9uIG9mIHRob3NlIHN1Yi1jb2RlcyBhbmQgdGhlIGFzc29jaWF0ZWQgY2FsY3VsYXRpb24gb2YgdGhlIHRhYmxlCisgICBzaXplIGlzIHJlY2FsbGVkIGluIG9yZGVyIHRvIGF2b2lkIHJlY2FsY3VsYXRpbmcgZnJvbSB0aGUgc2FtZSBqdW5jdHVyZS4KKyAgIEJlZ2lubmluZyB0aGUgY29kZSBleGFtaW5hdGlvbiBhdCAocm9vdCArIDEpIGJpdCBjb2Rlcywgd2hpY2ggaXMgZW5hYmxlZCBieQorICAgaWRlbnRpZnlpbmcgdGhlIHJlYWNoYWJsZSBub2RlcywgYWNjb3VudHMgZm9yIGFib3V0IHNpeCBvZiB0aGUgb3JkZXJzIG9mCisgICBtYWduaXR1ZGUgb2YgaW1wcm92ZW1lbnQgZm9yIHRoZSBkZWZhdWx0IGFyZ3VtZW50cy4gIEFib3V0IGFub3RoZXIgZm91cgorICAgb3JkZXJzIG9mIG1hZ25pdHVkZSBjb21lIGZyb20gbm90IHJldmlzaXRpbmcgcHJldmlvdXMgc3RhdGVzLiAgT3V0IG9mCisgICBhcHByb3hpbWF0ZWx5IDJ4MTBeMTYgcG9zc2libGUgSHVmZm1hbiBjb2Rlcywgb25seSBhYm91dCAyeDEwXjYgc3ViLWNvZGVzCisgICBuZWVkIHRvIGJlIGV4YW1pbmVkIHRvIGNvdmVyIGFsbCBvZiB0aGUgcG9zc2libGUgdGFibGUgbWVtb3J5IHVzYWdlIGNhc2VzCisgICBmb3IgdGhlIGRlZmF1bHQgYXJndW1lbnRzIG9mIDI4NiBzeW1ib2xzIGxpbWl0ZWQgdG8gMTUtYml0IGNvZGVzLgorCisgICBOb3RlIHRoYXQgYW4gdW5zaWduZWQgbG9uZyBsb25nIHR5cGUgaXMgdXNlZCBmb3IgY291bnRpbmcuICBJdCBpcyBxdWl0ZSBlYXN5CisgICB0byBleGNlZWQgdGhlIGNhcGFjaXR5IG9mIGFuIGVpZ2h0LWJ5dGUgaW50ZWdlciB3aXRoIGEgbGFyZ2UgbnVtYmVyIG9mCisgICBzeW1ib2xzIGFuZCBhIGxhcmdlIG1heGltdW0gY29kZSBsZW5ndGgsIHNvIG11bHRpcGxlLXByZWNpc2lvbiBhcml0aG1ldGljCisgICB3b3VsZCBuZWVkIHRvIHJlcGxhY2UgdGhlIHVuc2lnbmVkIGxvbmcgbG9uZyBhcml0aG1ldGljIGluIHRoYXQgY2FzZS4gIFRoaXMKKyAgIHByb2dyYW0gd2lsbCBhYm9ydCBpZiBhbiBvdmVyZmxvdyBvY2N1cnMuICBUaGUgYmlnX3QgdHlwZSBpZGVudGlmaWVzIHdoZXJlCisgICB0aGUgY291bnRpbmcgdGFrZXMgcGxhY2UuCisKKyAgIEFuIHVuc2lnbmVkIGxvbmcgbG9uZyB0eXBlIGlzIGFsc28gdXNlZCBmb3IgY2FsY3VsYXRpbmcgdGhlIG51bWJlciBvZgorICAgcG9zc2libGUgY29kZXMgcmVtYWluaW5nIGF0IHRoZSBtYXhpbXVtIGxlbmd0aC4gIFRoaXMgbGltaXRzIHRoZSBtYXhpbXVtCisgICBjb2RlIGxlbmd0aCB0byB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gYSBsb25nIGxvbmcgbWludXMgdGhlIG51bWJlciBvZiBiaXRzCisgICBuZWVkZWQgdG8gcmVwcmVzZW50IHRoZSBzeW1ib2xzIGluIGEgZmxhdCBjb2RlLiAgVGhlIGNvZGVfdCB0eXBlIGlkZW50aWZpZXMKKyAgIHdoZXJlIHRoZSBiaXQgcGF0dGVybiBjb3VudGluZyB0YWtlcyBwbGFjZS4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworI2RlZmluZSBsb2NhbCBzdGF0aWMKKworLyogc3BlY2lhbCBkYXRhIHR5cGVzICovCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBiaWdfdDsgICAvKiB0eXBlIGZvciBjb2RlIGNvdW50aW5nICovCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBjb2RlX3Q7ICAvKiB0eXBlIGZvciBiaXQgcGF0dGVybiBjb3VudGluZyAqLworc3RydWN0IHRhYiB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogdHlwZSBmb3IgYmVlbiBoZXJlIGNoZWNrICovCisgICAgc2l6ZV90IGxlbjsgICAgICAgICAvKiBsZW5ndGggb2YgYml0IHZlY3RvciBpbiBjaGFyJ3MgKi8KKyAgICBjaGFyICp2ZWM7ICAgICAgICAgIC8qIGFsbG9jYXRlZCBiaXQgdmVjdG9yICovCit9OworCisvKiBUaGUgYXJyYXkgZm9yIHNhdmluZyByZXN1bHRzLCBudW1bXSwgaXMgaW5kZXhlZCB3aXRoIHRoaXMgdHJpcGxldDoKKworICAgICAgc3ltczogbnVtYmVyIG9mIHN5bWJvbHMgcmVtYWluaW5nIHRvIGNvZGUKKyAgICAgIGxlZnQ6IG51bWJlciBvZiBhdmFpbGFibGUgYml0IHBhdHRlcm5zIGF0IGxlbmd0aCBsZW4KKyAgICAgIGxlbjogbnVtYmVyIG9mIGJpdHMgaW4gdGhlIGNvZGVzIGN1cnJlbnRseSBiZWluZyBhc3NpZ25lZAorCisgICBUaG9zZSBpbmRpY2VzIGFyZSBjb25zdHJhaW5lZCB0aHVzbHkgd2hlbiBzYXZpbmcgcmVzdWx0czoKKworICAgICAgc3ltczogMy4udG90c3ltICh0b3RzeW0gPT0gdG90YWwgc3ltYm9scyB0byBjb2RlKQorICAgICAgbGVmdDogMi4uc3ltcyAtIDEsIGJ1dCBvbmx5IHRoZSBldmVucyAoc28gc3ltcyA9PSA4IC0+IDIsIDQsIDYpCisgICAgICBsZW46IDEuLm1heCAtIDEgKG1heCA9PSBtYXhpbXVtIGNvZGUgbGVuZ3RoIGluIGJpdHMpCisKKyAgIHN5bXMgPT0gMiBpcyBub3Qgc2F2ZWQgc2luY2UgdGhhdCBpbW1lZGlhdGVseSBsZWFkcyB0byBhIHNpbmdsZSBjb2RlLiAgbGVmdAorICAgbXVzdCBiZSBldmVuLCBzaW5jZSBpdCByZXByZXNlbnRzIHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIGJpdCBwYXR0ZXJucyBhdAorICAgdGhlIGN1cnJlbnQgbGVuZ3RoLCB3aGljaCBpcyBkb3VibGUgdGhlIG51bWJlciBhdCB0aGUgcHJldmlvdXMgbGVuZ3RoLgorICAgbGVmdCBlbmRzIGF0IHN5bXMtMSBzaW5jZSBsZWZ0ID09IHN5bXMgaW1tZWRpYXRlbHkgcmVzdWx0cyBpbiBhIHNpbmdsZSBjb2RlLgorICAgKGxlZnQgPiBzeW0gaXMgbm90IGFsbG93ZWQgc2luY2UgdGhhdCB3b3VsZCByZXN1bHQgaW4gYW4gaW5jb21wbGV0ZSBjb2RlLikKKyAgIGxlbiBpcyBsZXNzIHRoYW4gbWF4LCBzaW5jZSB0aGUgY29kZSBjb21wbGV0ZXMgaW1tZWRpYXRlbHkgd2hlbiBsZW4gPT0gbWF4LgorCisgICBUaGUgb2Zmc2V0IGludG8gdGhlIGFycmF5IGlzIGNhbGN1bGF0ZWQgZm9yIHRoZSB0aHJlZSBpbmRpY2VzIHdpdGggdGhlCisgICBmaXJzdCBvbmUgKHN5bXMpIGJlaW5nIG91dGVybW9zdCwgYW5kIHRoZSBsYXN0IG9uZSAobGVuKSBiZWluZyBpbm5lcm1vc3QuCisgICBXZSBidWlsZCB0aGUgYXJyYXkgd2l0aCBsZW5ndGggbWF4LTEgbGlzdHMgZm9yIHRoZSBsZW4gaW5kZXgsIHdpdGggc3ltcy0zCisgICBvZiB0aG9zZSBmb3IgZWFjaCBzeW1ib2wuICBUaGVyZSBhcmUgdG90c3ltLTIgb2YgdGhvc2UsIHdpdGggZWFjaCBvbmUKKyAgIHZhcnlpbmcgaW4gbGVuZ3RoIGFzIGEgZnVuY3Rpb24gb2Ygc3ltLiAgU2VlIHRoZSBjYWxjdWxhdGlvbiBvZiBpbmRleCBpbgorICAgY291bnQoKSBmb3IgdGhlIGluZGV4LCBhbmQgdGhlIGNhbGN1bGF0aW9uIG9mIHNpemUgaW4gbWFpbigpIGZvciB0aGUgc2l6ZQorICAgb2YgdGhlIGFycmF5LgorCisgICBGb3IgdGhlIGRlZmxhdGUgZXhhbXBsZSBvZiAyODYgc3ltYm9scyBsaW1pdGVkIHRvIDE1LWJpdCBjb2RlcywgdGhlIGFycmF5CisgICBoYXMgMjg0LDI4NCBlbnRyaWVzLCB0YWtpbmcgdXAgMi4xNyBNQiBmb3IgYW4gOC1ieXRlIGJpZ190LiAgTW9yZSB0aGFuCisgICBoYWxmIG9mIHRoZSBzcGFjZSBhbGxvY2F0ZWQgZm9yIHNhdmVkIHJlc3VsdHMgaXMgYWN0dWFsbHkgdXNlZCAtLSBub3QgYWxsCisgICBwb3NzaWJsZSB0cmlwbGV0cyBhcmUgcmVhY2hlZCBpbiB0aGUgZ2VuZXJhdGlvbiBvZiB2YWxpZCBIdWZmbWFuIGNvZGVzLgorICovCisKKy8qIFRoZSBhcnJheSBmb3IgdHJhY2tpbmcgdmlzaXRlZCBzdGF0ZXMsIGRvbmVbXSwgaXMgaXRzZWxmIGluZGV4ZWQgaWRlbnRpY2FsbHkKKyAgIHRvIHRoZSBudW1bXSBhcnJheSBhcyBkZXNjcmliZWQgYWJvdmUgZm9yIHRoZSAoc3ltcywgbGVmdCwgbGVuKSB0cmlwbGV0LgorICAgRWFjaCBlbGVtZW50IGluIHRoZSBhcnJheSBpcyBmdXJ0aGVyIGluZGV4ZWQgYnkgdGhlIChtZW0sIHJlbSkgZG91YmxldCwKKyAgIHdoZXJlIG1lbSBpcyB0aGUgYW1vdW50IG9mIGluZmxhdGUgdGFibGUgc3BhY2UgdXNlZCBzbyBmYXIsIGFuZCByZW0gaXMgdGhlCisgICByZW1haW5pbmcgdW51c2VkIGVudHJpZXMgaW4gdGhlIGN1cnJlbnQgaW5mbGF0ZSBzdWItdGFibGUuICBFYWNoIGluZGV4ZWQKKyAgIGVsZW1lbnQgaXMgc2ltcGx5IG9uZSBiaXQgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBzdGF0ZSBoYXMgYmVlbiB2aXNpdGVkIG9yCisgICBub3QuICBTaW5jZSB0aGUgcmFuZ2VzIGZvciBtZW0gYW5kIHJlbSBhcmUgbm90IGtub3duIGEgcHJpb3JpLCBlYWNoIGJpdAorICAgdmVjdG9yIGlzIG9mIGEgdmFyaWFibGUgc2l6ZSwgYW5kIGdyb3dzIGFzIG5lZWRlZCB0byBhY2NvbW1vZGF0ZSB0aGUgdmlzaXRlZAorICAgc3RhdGVzLiAgbWVtIGFuZCByZW0gYXJlIHVzZWQgdG8gY2FsY3VsYXRlIGEgc2luZ2xlIGluZGV4IGluIGEgdHJpYW5ndWxhcgorICAgYXJyYXkuICBTaW5jZSB0aGUgcmFuZ2Ugb2YgbWVtIGlzIGV4cGVjdGVkIGluIHRoZSBkZWZhdWx0IGNhc2UgdG8gYmUgYWJvdXQKKyAgIHRlbiB0aW1lcyBsYXJnZXIgdGhhbiB0aGUgcmFuZ2Ugb2YgcmVtLCB0aGUgYXJyYXkgaXMgc2tld2VkIHRvIHJlZHVjZSB0aGUKKyAgIG1lbW9yeSB1c2FnZSwgd2l0aCBlaWdodCB0aW1lcyB0aGUgcmFuZ2UgZm9yIG1lbSB0aGFuIGZvciByZW0uICBTZWUgdGhlCisgICBjYWxjdWxhdGlvbnMgZm9yIG9mZnNldCBhbmQgYml0IGluIGJlZW5oZXJlKCkgZm9yIHRoZSBkZXRhaWxzLgorCisgICBGb3IgdGhlIGRlZmxhdGUgZXhhbXBsZSBvZiAyODYgc3ltYm9scyBsaW1pdGVkIHRvIDE1LWJpdCBjb2RlcywgdGhlIGJpdAorICAgdmVjdG9ycyBncm93IHRvIHRvdGFsIGFwcHJveGltYXRlbHkgMjEgTUIsIGluIGFkZGl0aW9uIHRvIHRoZSA0LjMgTUIgZG9uZVtdCisgICBhcnJheSBpdHNlbGYuCisgKi8KKworLyogR2xvYmFscyB0byBhdm9pZCBwcm9wYWdhdGluZyBjb25zdGFudHMgb3IgY29uc3RhbnQgcG9pbnRlcnMgcmVjdXJzaXZlbHkgKi8KK2xvY2FsIGludCBtYXg7ICAgICAgICAgIC8qIG1heGltdW0gYWxsb3dlZCBiaXQgbGVuZ3RoIGZvciB0aGUgY29kZXMgKi8KK2xvY2FsIGludCByb290OyAgICAgICAgIC8qIHNpemUgb2YgYmFzZSBjb2RlIHRhYmxlIGluIGJpdHMgKi8KK2xvY2FsIGludCBsYXJnZTsgICAgICAgIC8qIGxhcmdlc3QgY29kZSB0YWJsZSBzbyBmYXIgKi8KK2xvY2FsIHNpemVfdCBzaXplOyAgICAgIC8qIG51bWJlciBvZiBlbGVtZW50cyBpbiBudW0gYW5kIGRvbmUgKi8KK2xvY2FsIGludCAqY29kZTsgICAgICAgIC8qIG51bWJlciBvZiBzeW1ib2xzIGFzc2lnbmVkIHRvIGVhY2ggYml0IGxlbmd0aCAqLworbG9jYWwgYmlnX3QgKm51bTsgICAgICAgLyogc2F2ZWQgcmVzdWx0cyBhcnJheSBmb3IgY29kZSBjb3VudGluZyAqLworbG9jYWwgc3RydWN0IHRhYiAqZG9uZTsgLyogc3RhdGVzIGFscmVhZHkgZXZhbHVhdGVkIGFycmF5ICovCisKKy8qIEluZGV4IGZ1bmN0aW9uIGZvciBudW1bXSBhbmQgZG9uZVtdICovCisjZGVmaW5lIElOREVYKGksaixrKSAoKChzaXplX3QpKChpLTEpPj4xKSooKGktMik+PjEpKyhqPj4xKS0xKSoobWF4LTEpK2stMSkKKworLyogRnJlZSBhbGxvY2F0ZWQgc3BhY2UuICBVc2VzIGdsb2JhbHMgY29kZSwgbnVtLCBhbmQgZG9uZS4gKi8KK2xvY2FsIHZvaWQgY2xlYW51cCh2b2lkKQoreworICAgIHNpemVfdCBuOworCisgICAgaWYgKGRvbmUgIT0gTlVMTCkgeworICAgICAgICBmb3IgKG4gPSAwOyBuIDwgc2l6ZTsgbisrKQorICAgICAgICAgICAgaWYgKGRvbmVbbl0ubGVuKQorICAgICAgICAgICAgICAgIGZyZWUoZG9uZVtuXS52ZWMpOworICAgICAgICBmcmVlKGRvbmUpOworICAgIH0KKyAgICBpZiAobnVtICE9IE5VTEwpCisgICAgICAgIGZyZWUobnVtKTsKKyAgICBpZiAoY29kZSAhPSBOVUxMKQorICAgICAgICBmcmVlKGNvZGUpOworfQorCisvKiBSZXR1cm4gdGhlIG51bWJlciBvZiBwb3NzaWJsZSBIdWZmbWFuIGNvZGVzIHVzaW5nIGJpdCBwYXR0ZXJucyBvZiBsZW5ndGhzCisgICBsZW4gdGhyb3VnaCBtYXggaW5jbHVzaXZlLCBjb2Rpbmcgc3ltcyBzeW1ib2xzLCB3aXRoIGxlZnQgYml0IHBhdHRlcm5zIG9mCisgICBsZW5ndGggbGVuIHVudXNlZCAtLSByZXR1cm4gLTEgaWYgdGhlcmUgaXMgYW4gb3ZlcmZsb3cgaW4gdGhlIGNvdW50aW5nLgorICAgS2VlcCBhIHJlY29yZCBvZiBwcmV2aW91cyByZXN1bHRzIGluIG51bSB0byBwcmV2ZW50IHJlcGVhdGluZyB0aGUgc2FtZQorICAgY2FsY3VsYXRpb24uICBVc2VzIHRoZSBnbG9iYWxzIG1heCBhbmQgbnVtLiAqLworbG9jYWwgYmlnX3QgY291bnQoaW50IHN5bXMsIGludCBsZW4sIGludCBsZWZ0KQoreworICAgIGJpZ190IHN1bTsgICAgICAgICAgLyogbnVtYmVyIG9mIHBvc3NpYmxlIGNvZGVzIGZyb20gdGhpcyBqdW5jdHVyZSAqLworICAgIGJpZ190IGdvdDsgICAgICAgICAgLyogdmFsdWUgcmV0dXJuZWQgZnJvbSBjb3VudCgpICovCisgICAgaW50IGxlYXN0OyAgICAgICAgICAvKiBsZWFzdCBudW1iZXIgb2Ygc3ltcyB0byB1c2UgYXQgdGhpcyBqdW5jdHVyZSAqLworICAgIGludCBtb3N0OyAgICAgICAgICAgLyogbW9zdCBudW1iZXIgb2Ygc3ltcyB0byB1c2UgYXQgdGhpcyBqdW5jdHVyZSAqLworICAgIGludCB1c2U7ICAgICAgICAgICAgLyogbnVtYmVyIG9mIGJpdCBwYXR0ZXJucyB0byB1c2UgaW4gbmV4dCBjYWxsICovCisgICAgc2l6ZV90IGluZGV4OyAgICAgICAvKiBpbmRleCBvZiB0aGlzIGNhc2UgaW4gKm51bSAqLworCisgICAgLyogc2VlIGlmIG9ubHkgb25lIHBvc3NpYmxlIGNvZGUgKi8KKyAgICBpZiAoc3ltcyA9PSBsZWZ0KQorICAgICAgICByZXR1cm4gMTsKKworICAgIC8qIG5vdGUgYW5kIHZlcmlmeSB0aGUgZXhwZWN0ZWQgc3RhdGUgKi8KKyAgICBhc3NlcnQoc3ltcyA+IGxlZnQgJiYgbGVmdCA+IDAgJiYgbGVuIDwgbWF4KTsKKworICAgIC8qIHNlZSBpZiB3ZSd2ZSBkb25lIHRoaXMgb25lIGFscmVhZHkgKi8KKyAgICBpbmRleCA9IElOREVYKHN5bXMsIGxlZnQsIGxlbik7CisgICAgZ290ID0gbnVtW2luZGV4XTsKKyAgICBpZiAoZ290KQorICAgICAgICByZXR1cm4gZ290OyAgICAgICAgIC8qIHdlIGhhdmUgLS0gcmV0dXJuIHRoZSBzYXZlZCByZXN1bHQgKi8KKworICAgIC8qIHdlIG5lZWQgdG8gdXNlIGF0IGxlYXN0IHRoaXMgbWFueSBiaXQgcGF0dGVybnMgc28gdGhhdCB0aGUgY29kZSB3b24ndCBiZQorICAgICAgIGluY29tcGxldGUgYXQgdGhlIG5leHQgbGVuZ3RoIChtb3JlIGJpdCBwYXR0ZXJucyB0aGFuIHN5bWJvbHMpICovCisgICAgbGVhc3QgPSAobGVmdCA8PCAxKSAtIHN5bXM7CisgICAgaWYgKGxlYXN0IDwgMCkKKyAgICAgICAgbGVhc3QgPSAwOworCisgICAgLyogd2UgY2FuIHVzZSBhdCBtb3N0IHRoaXMgbWFueSBiaXQgcGF0dGVybnMsIGxlc3QgdGhlcmUgbm90IGJlIGVub3VnaAorICAgICAgIGF2YWlsYWJsZSBmb3IgdGhlIHJlbWFpbmluZyBzeW1ib2xzIGF0IHRoZSBtYXhpbXVtIGxlbmd0aCAoaWYgdGhlcmUgd2VyZQorICAgICAgIG5vIGxpbWl0IHRvIHRoZSBjb2RlIGxlbmd0aCwgdGhpcyB3b3VsZCBiZWNvbWU6IG1vc3QgPSBsZWZ0IC0gMSkgKi8KKyAgICBtb3N0ID0gKCgoY29kZV90KWxlZnQgPDwgKG1heCAtIGxlbikpIC0gc3ltcykgLworICAgICAgICAgICAgKCgoY29kZV90KTEgPDwgKG1heCAtIGxlbikpIC0gMSk7CisKKyAgICAvKiBjb3VudCBhbGwgcG9zc2libGUgY29kZXMgZnJvbSB0aGlzIGp1bmN0dXJlIGFuZCBhZGQgdGhlbSB1cCAqLworICAgIHN1bSA9IDA7CisgICAgZm9yICh1c2UgPSBsZWFzdDsgdXNlIDw9IG1vc3Q7IHVzZSsrKSB7CisgICAgICAgIGdvdCA9IGNvdW50KHN5bXMgLSB1c2UsIGxlbiArIDEsIChsZWZ0IC0gdXNlKSA8PCAxKTsKKyAgICAgICAgc3VtICs9IGdvdDsKKyAgICAgICAgaWYgKGdvdCA9PSAtMSB8fCBzdW0gPCBnb3QpICAgICAgICAgLyogb3ZlcmZsb3cgKi8KKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvKiB2ZXJpZnkgdGhhdCBhbGwgcmVjdXJzaXZlIGNhbGxzIGFyZSBwcm9kdWN0aXZlICovCisgICAgYXNzZXJ0KHN1bSAhPSAwKTsKKworICAgIC8qIHNhdmUgdGhlIHJlc3VsdCBhbmQgcmV0dXJuIGl0ICovCisgICAgbnVtW2luZGV4XSA9IHN1bTsKKyAgICByZXR1cm4gc3VtOworfQorCisvKiBSZXR1cm4gdHJ1ZSBpZiB3ZSd2ZSBiZWVuIGhlcmUgYmVmb3JlLCBzZXQgdG8gdHJ1ZSBpZiBub3QuICBTZXQgYSBiaXQgaW4gYQorICAgYml0IHZlY3RvciB0byBpbmRpY2F0ZSB2aXNpdGluZyB0aGlzIHN0YXRlLiAgRWFjaCAoc3ltcyxsZW4sbGVmdCkgc3RhdGUKKyAgIGhhcyBhIHZhcmlhYmxlIHNpemUgYml0IHZlY3RvciBpbmRleGVkIGJ5IChtZW0scmVtKS4gIFRoZSBiaXQgdmVjdG9yIGlzCisgICBsZW5ndGhlbmVkIGlmIG5lZWRlZCB0byBhbGxvdyBzZXR0aW5nIHRoZSAobWVtLHJlbSkgYml0LiAqLworbG9jYWwgaW50IGJlZW5oZXJlKGludCBzeW1zLCBpbnQgbGVuLCBpbnQgbGVmdCwgaW50IG1lbSwgaW50IHJlbSkKK3sKKyAgICBzaXplX3QgaW5kZXg7ICAgICAgIC8qIGluZGV4IGZvciB0aGlzIHN0YXRlJ3MgYml0IHZlY3RvciAqLworICAgIHNpemVfdCBvZmZzZXQ7ICAgICAgLyogb2Zmc2V0IGluIHRoaXMgc3RhdGUncyBiaXQgdmVjdG9yICovCisgICAgaW50IGJpdDsgICAgICAgICAgICAvKiBtYXNrIGZvciB0aGlzIHN0YXRlJ3MgYml0ICovCisgICAgc2l6ZV90IGxlbmd0aDsgICAgICAvKiBsZW5ndGggb2YgdGhlIGJpdCB2ZWN0b3IgaW4gYnl0ZXMgKi8KKyAgICBjaGFyICp2ZWN0b3I7ICAgICAgIC8qIG5ldyBvciBlbmxhcmdlZCBiaXQgdmVjdG9yICovCisKKyAgICAvKiBwb2ludCB0byB2ZWN0b3IgZm9yIChzeW1zLGxlZnQsbGVuKSwgYml0IGluIHZlY3RvciBmb3IgKG1lbSxyZW0pICovCisgICAgaW5kZXggPSBJTkRFWChzeW1zLCBsZWZ0LCBsZW4pOworICAgIG1lbSAtPSAxIDw8IHJvb3Q7CisgICAgb2Zmc2V0ID0gKG1lbSA+PiAzKSArIHJlbTsKKyAgICBvZmZzZXQgPSAoKG9mZnNldCAqIChvZmZzZXQgKyAxKSkgPj4gMSkgKyByZW07CisgICAgYml0ID0gMSA8PCAobWVtICYgNyk7CisKKyAgICAvKiBzZWUgaWYgd2UndmUgYmVlbiBoZXJlICovCisgICAgbGVuZ3RoID0gZG9uZVtpbmRleF0ubGVuOworICAgIGlmIChvZmZzZXQgPCBsZW5ndGggJiYgKGRvbmVbaW5kZXhdLnZlY1tvZmZzZXRdICYgYml0KSAhPSAwKQorICAgICAgICByZXR1cm4gMTsgICAgICAgLyogZG9uZSB0aGlzISAqLworCisgICAgLyogd2UgaGF2ZW4ndCBiZWVuIGhlcmUgYmVmb3JlIC0tIHNldCB0aGUgYml0IHRvIHNob3cgd2UgaGF2ZSBub3cgKi8KKworICAgIC8qIHNlZSBpZiB3ZSBuZWVkIHRvIGxlbmd0aGVuIHRoZSB2ZWN0b3IgaW4gb3JkZXIgdG8gc2V0IHRoZSBiaXQgKi8KKyAgICBpZiAobGVuZ3RoIDw9IG9mZnNldCkgeworICAgICAgICAvKiBpZiB3ZSBoYXZlIG9uZSBhbHJlYWR5LCBlbmxhcmdlIGl0LCB6ZXJvIG91dCB0aGUgYXBwZW5kZWQgc3BhY2UgKi8KKyAgICAgICAgaWYgKGxlbmd0aCkgeworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGxlbmd0aCA8PD0gMTsKKyAgICAgICAgICAgIH0gd2hpbGUgKGxlbmd0aCA8PSBvZmZzZXQpOworICAgICAgICAgICAgdmVjdG9yID0gcmVhbGxvYyhkb25lW2luZGV4XS52ZWMsIGxlbmd0aCk7CisgICAgICAgICAgICBpZiAodmVjdG9yICE9IE5VTEwpCisgICAgICAgICAgICAgICAgbWVtc2V0KHZlY3RvciArIGRvbmVbaW5kZXhdLmxlbiwgMCwgbGVuZ3RoIC0gZG9uZVtpbmRleF0ubGVuKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIG90aGVyd2lzZSB3ZSBuZWVkIHRvIG1ha2UgYSBuZXcgdmVjdG9yIGFuZCB6ZXJvIGl0IG91dCAqLworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGxlbmd0aCA9IDEgPDwgKGxlbiAtIHJvb3QpOworICAgICAgICAgICAgd2hpbGUgKGxlbmd0aCA8PSBvZmZzZXQpCisgICAgICAgICAgICAgICAgbGVuZ3RoIDw8PSAxOworICAgICAgICAgICAgdmVjdG9yID0gY2FsbG9jKGxlbmd0aCwgc2l6ZW9mKGNoYXIpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGluIGVpdGhlciBjYXNlLCBiYWlsIGlmIHdlIGNhbid0IGdldCB0aGUgbWVtb3J5ICovCisgICAgICAgIGlmICh2ZWN0b3IgPT0gTlVMTCkgeworICAgICAgICAgICAgZnB1dHMoImFib3J0OiB1bmFibGUgdG8gYWxsb2NhdGUgZW5vdWdoIG1lbW9yeVxuIiwgc3RkZXJyKTsKKyAgICAgICAgICAgIGNsZWFudXAoKTsKKyAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgIH0KKworICAgICAgICAvKiBpbnN0YWxsIHRoZSBuZXcgdmVjdG9yICovCisgICAgICAgIGRvbmVbaW5kZXhdLmxlbiA9IGxlbmd0aDsKKyAgICAgICAgZG9uZVtpbmRleF0udmVjID0gdmVjdG9yOworICAgIH0KKworICAgIC8qIHNldCB0aGUgYml0ICovCisgICAgZG9uZVtpbmRleF0udmVjW29mZnNldF0gfD0gYml0OworICAgIHJldHVybiAwOworfQorCisvKiBFeGFtaW5lIGFsbCBwb3NzaWJsZSBjb2RlcyBmcm9tIHRoZSBnaXZlbiBub2RlIChzeW1zLCBsZW4sIGxlZnQpLiAgQ29tcHV0ZQorICAgdGhlIGFtb3VudCBvZiBtZW1vcnkgcmVxdWlyZWQgdG8gYnVpbGQgaW5mbGF0ZSdzIGRlY29kaW5nIHRhYmxlcywgd2hlcmUgdGhlCisgICBudW1iZXIgb2YgY29kZSBzdHJ1Y3R1cmVzIHVzZWQgc28gZmFyIGlzIG1lbSwgYW5kIHRoZSBudW1iZXIgcmVtYWluaW5nIGluCisgICB0aGUgY3VycmVudCBzdWItdGFibGUgaXMgcmVtLiAgVXNlcyB0aGUgZ2xvYmFscyBtYXgsIGNvZGUsIHJvb3QsIGxhcmdlLCBhbmQKKyAgIGRvbmUuICovCitsb2NhbCB2b2lkIGV4YW1pbmUoaW50IHN5bXMsIGludCBsZW4sIGludCBsZWZ0LCBpbnQgbWVtLCBpbnQgcmVtKQoreworICAgIGludCBsZWFzdDsgICAgICAgICAgLyogbGVhc3QgbnVtYmVyIG9mIHN5bXMgdG8gdXNlIGF0IHRoaXMganVuY3R1cmUgKi8KKyAgICBpbnQgbW9zdDsgICAgICAgICAgIC8qIG1vc3QgbnVtYmVyIG9mIHN5bXMgdG8gdXNlIGF0IHRoaXMganVuY3R1cmUgKi8KKyAgICBpbnQgdXNlOyAgICAgICAgICAgIC8qIG51bWJlciBvZiBiaXQgcGF0dGVybnMgdG8gdXNlIGluIG5leHQgY2FsbCAqLworCisgICAgLyogc2VlIGlmIHdlIGhhdmUgYSBjb21wbGV0ZSBjb2RlICovCisgICAgaWYgKHN5bXMgPT0gbGVmdCkgeworICAgICAgICAvKiBzZXQgdGhlIGxhc3QgY29kZSBlbnRyeSAqLworICAgICAgICBjb2RlW2xlbl0gPSBsZWZ0OworCisgICAgICAgIC8qIGNvbXBsZXRlIGNvbXB1dGF0aW9uIG9mIG1lbW9yeSB1c2VkIGJ5IHRoaXMgY29kZSAqLworICAgICAgICB3aGlsZSAocmVtIDwgbGVmdCkgeworICAgICAgICAgICAgbGVmdCAtPSByZW07CisgICAgICAgICAgICByZW0gPSAxIDw8IChsZW4gLSByb290KTsKKyAgICAgICAgICAgIG1lbSArPSByZW07CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0KHJlbSA9PSBsZWZ0KTsKKworICAgICAgICAvKiBpZiB0aGlzIGlzIGEgbmV3IG1heGltdW0sIHNob3cgdGhlIGVudHJpZXMgdXNlZCBhbmQgdGhlIHN1Yi1jb2RlICovCisgICAgICAgIGlmIChtZW0gPiBsYXJnZSkgeworICAgICAgICAgICAgbGFyZ2UgPSBtZW07CisgICAgICAgICAgICBwcmludGYoIm1heCAlZDogIiwgbWVtKTsKKyAgICAgICAgICAgIGZvciAodXNlID0gcm9vdCArIDE7IHVzZSA8PSBtYXg7IHVzZSsrKQorICAgICAgICAgICAgICAgIGlmIChjb2RlW3VzZV0pCisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiJWRbJWRdICIsIGNvZGVbdXNlXSwgdXNlKTsKKyAgICAgICAgICAgIHB1dGNoYXIoJ1xuJyk7CisgICAgICAgICAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHJlbW92ZSBlbnRyaWVzIGFzIHdlIGRyb3AgYmFjayBkb3duIGluIHRoZSByZWN1cnNpb24gKi8KKyAgICAgICAgY29kZVtsZW5dID0gMDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIHBydW5lIHRoZSB0cmVlIGlmIHdlIGNhbiAqLworICAgIGlmIChiZWVuaGVyZShzeW1zLCBsZW4sIGxlZnQsIG1lbSwgcmVtKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgLyogd2UgbmVlZCB0byB1c2UgYXQgbGVhc3QgdGhpcyBtYW55IGJpdCBwYXR0ZXJucyBzbyB0aGF0IHRoZSBjb2RlIHdvbid0IGJlCisgICAgICAgaW5jb21wbGV0ZSBhdCB0aGUgbmV4dCBsZW5ndGggKG1vcmUgYml0IHBhdHRlcm5zIHRoYW4gc3ltYm9scykgKi8KKyAgICBsZWFzdCA9IChsZWZ0IDw8IDEpIC0gc3ltczsKKyAgICBpZiAobGVhc3QgPCAwKQorICAgICAgICBsZWFzdCA9IDA7CisKKyAgICAvKiB3ZSBjYW4gdXNlIGF0IG1vc3QgdGhpcyBtYW55IGJpdCBwYXR0ZXJucywgbGVzdCB0aGVyZSBub3QgYmUgZW5vdWdoCisgICAgICAgYXZhaWxhYmxlIGZvciB0aGUgcmVtYWluaW5nIHN5bWJvbHMgYXQgdGhlIG1heGltdW0gbGVuZ3RoIChpZiB0aGVyZSB3ZXJlCisgICAgICAgbm8gbGltaXQgdG8gdGhlIGNvZGUgbGVuZ3RoLCB0aGlzIHdvdWxkIGJlY29tZTogbW9zdCA9IGxlZnQgLSAxKSAqLworICAgIG1vc3QgPSAoKChjb2RlX3QpbGVmdCA8PCAobWF4IC0gbGVuKSkgLSBzeW1zKSAvCisgICAgICAgICAgICAoKChjb2RlX3QpMSA8PCAobWF4IC0gbGVuKSkgLSAxKTsKKworICAgIC8qIG9jY3VweSBsZWFzdCB0YWJsZSBzcGFjZXMsIGNyZWF0aW5nIG5ldyBzdWItdGFibGVzIGFzIG5lZWRlZCAqLworICAgIHVzZSA9IGxlYXN0OworICAgIHdoaWxlIChyZW0gPCB1c2UpIHsKKyAgICAgICAgdXNlIC09IHJlbTsKKyAgICAgICAgcmVtID0gMSA8PCAobGVuIC0gcm9vdCk7CisgICAgICAgIG1lbSArPSByZW07CisgICAgfQorICAgIHJlbSAtPSB1c2U7CisKKyAgICAvKiBleGFtaW5lIGNvZGVzIGZyb20gaGVyZSwgdXBkYXRpbmcgdGFibGUgc3BhY2UgYXMgd2UgZ28gKi8KKyAgICBmb3IgKHVzZSA9IGxlYXN0OyB1c2UgPD0gbW9zdDsgdXNlKyspIHsKKyAgICAgICAgY29kZVtsZW5dID0gdXNlOworICAgICAgICBleGFtaW5lKHN5bXMgLSB1c2UsIGxlbiArIDEsIChsZWZ0IC0gdXNlKSA8PCAxLAorICAgICAgICAgICAgICAgIG1lbSArIChyZW0gPyAxIDw8IChsZW4gLSByb290KSA6IDApLCByZW0gPDwgMSk7CisgICAgICAgIGlmIChyZW0gPT0gMCkgeworICAgICAgICAgICAgcmVtID0gMSA8PCAobGVuIC0gcm9vdCk7CisgICAgICAgICAgICBtZW0gKz0gcmVtOworICAgICAgICB9CisgICAgICAgIHJlbS0tOworICAgIH0KKworICAgIC8qIHJlbW92ZSBlbnRyaWVzIGFzIHdlIGRyb3AgYmFjayBkb3duIGluIHRoZSByZWN1cnNpb24gKi8KKyAgICBjb2RlW2xlbl0gPSAwOworfQorCisvKiBMb29rIGF0IGFsbCBzdWItY29kZXMgc3RhcnRpbmcgd2l0aCByb290ICsgMSBiaXRzLiAgTG9vayBhdCBvbmx5IHRoZSB2YWxpZAorICAgaW50ZXJtZWRpYXRlIGNvZGUgc3RhdGVzIChzeW1zLCBsZWZ0LCBsZW4pLiAgRm9yIGVhY2ggY29tcGxldGVkIGNvZGUsCisgICBjYWxjdWxhdGUgdGhlIGFtb3VudCBvZiBtZW1vcnkgcmVxdWlyZWQgYnkgaW5mbGF0ZSB0byBidWlsZCB0aGUgZGVjb2RpbmcKKyAgIHRhYmxlcy4gRmluZCB0aGUgbWF4aW11bSBhbW91bnQgb2YgbWVtb3J5IHJlcXVpcmVkIGFuZCBzaG93IHRoZSBjb2RlIHRoYXQKKyAgIHJlcXVpcmVzIHRoYXQgbWF4aW11bS4gIFVzZXMgdGhlIGdsb2JhbHMgbWF4LCByb290LCBhbmQgbnVtLiAqLworbG9jYWwgdm9pZCBlbm91Z2goaW50IHN5bXMpCit7CisgICAgaW50IG47ICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgcmVtYWluZyBzeW1ib2xzIGZvciB0aGlzIG5vZGUgKi8KKyAgICBpbnQgbGVmdDsgICAgICAgICAgIC8qIG51bWJlciBvZiB1bnVzZWQgYml0IHBhdHRlcm5zIGF0IHRoaXMgbGVuZ3RoICovCisgICAgc2l6ZV90IGluZGV4OyAgICAgICAvKiBpbmRleCBvZiB0aGlzIGNhc2UgaW4gKm51bSAqLworCisgICAgLyogY2xlYXIgY29kZSAqLworICAgIGZvciAobiA9IDA7IG4gPD0gbWF4OyBuKyspCisgICAgICAgIGNvZGVbbl0gPSAwOworCisgICAgLyogbG9vayBhdCBhbGwgKHJvb3QgKyAxKSBiaXQgYW5kIGxvbmdlciBjb2RlcyAqLworICAgIGxhcmdlID0gMSA8PCByb290OyAgICAgICAgICAgICAgLyogYmFzZSB0YWJsZSAqLworICAgIGlmIChyb290IDwgbWF4KSAgICAgICAgICAgICAgICAgLyogb3RoZXJ3aXNlLCB0aGVyZSdzIG9ubHkgYSBiYXNlIHRhYmxlICovCisgICAgICAgIGZvciAobiA9IDM7IG4gPD0gc3ltczsgbisrKQorICAgICAgICAgICAgZm9yIChsZWZ0ID0gMjsgbGVmdCA8IG47IGxlZnQgKz0gMikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBsb29rIGF0IGFsbCByZWFjaGFibGUgKHJvb3QgKyAxKSBiaXQgbm9kZXMsIGFuZCB0aGUKKyAgICAgICAgICAgICAgICAgICByZXN1bHRpbmcgY29kZXMgKGNvbXBsZXRlIGF0IHJvb3QgKyAyIG9yIG1vcmUpICovCisgICAgICAgICAgICAgICAgaW5kZXggPSBJTkRFWChuLCBsZWZ0LCByb290ICsgMSk7CisgICAgICAgICAgICAgICAgaWYgKHJvb3QgKyAxIDwgbWF4ICYmIG51bVtpbmRleF0pICAgICAgIC8qIHJlYWNoYWJsZSBub2RlICovCisgICAgICAgICAgICAgICAgICAgIGV4YW1pbmUobiwgcm9vdCArIDEsIGxlZnQsIDEgPDwgcm9vdCwgMCk7CisKKyAgICAgICAgICAgICAgICAvKiBhbHNvIGxvb2sgYXQgcm9vdCBiaXQgY29kZXMgd2l0aCBjb21wbGV0aW9ucyBhdCByb290ICsgMQorICAgICAgICAgICAgICAgICAgIGJpdHMgKG5vdCBzYXZlZCBpbiBudW0sIHNpbmNlIGNvbXBsZXRlKSwganVzdCBpbiBjYXNlICovCisgICAgICAgICAgICAgICAgaWYgKG51bVtpbmRleCAtIDFdICYmIG4gPD0gbGVmdCA8PCAxKQorICAgICAgICAgICAgICAgICAgICBleGFtaW5lKChuIC0gbGVmdCkgPDwgMSwgcm9vdCArIDEsIChuIC0gbGVmdCkgPDwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAxIDw8IHJvb3QsIDApOworICAgICAgICAgICAgfQorCisgICAgLyogZG9uZSAqLworICAgIHByaW50ZigiZG9uZTogbWF4aW11bSBvZiAlZCB0YWJsZSBlbnRyaWVzXG4iLCBsYXJnZSk7Cit9CisKKy8qCisgICBFeGFtaW5lIGFuZCBzaG93IHRoZSB0b3RhbCBudW1iZXIgb2YgcG9zc2libGUgSHVmZm1hbiBjb2RlcyBmb3IgYSBnaXZlbgorICAgbWF4aW11bSBudW1iZXIgb2Ygc3ltYm9scywgaW5pdGlhbCByb290IHRhYmxlIHNpemUsIGFuZCBtYXhpbXVtIGNvZGUgbGVuZ3RoCisgICBpbiBiaXRzIC0tIHRob3NlIGFyZSB0aGUgY29tbWFuZCBhcmd1bWVudHMgaW4gdGhhdCBvcmRlci4gIFRoZSBkZWZhdWx0CisgICB2YWx1ZXMgYXJlIDI4NiwgOSwgYW5kIDE1IHJlc3BlY3RpdmVseSwgZm9yIHRoZSBkZWZsYXRlIGxpdGVyYWwvbGVuZ3RoIGNvZGUuCisgICBUaGUgcG9zc2libGUgY29kZXMgYXJlIGNvdW50ZWQgZm9yIGVhY2ggbnVtYmVyIG9mIGNvZGVkIHN5bWJvbHMgZnJvbSB0d28gdG8KKyAgIHRoZSBtYXhpbXVtLiAgVGhlIGNvdW50cyBmb3IgZWFjaCBvZiB0aG9zZSBhbmQgdGhlIHRvdGFsIG51bWJlciBvZiBjb2RlcyBhcmUKKyAgIHNob3duLiAgVGhlIG1heGltdW0gbnVtYmVyIG9mIGluZmxhdGUgdGFibGUgZW50aXJlcyBpcyB0aGVuIGNhbGN1bGF0ZWQKKyAgIGFjcm9zcyBhbGwgcG9zc2libGUgY29kZXMuICBFYWNoIG5ldyBtYXhpbXVtIG51bWJlciBvZiB0YWJsZSBlbnRyaWVzIGFuZCB0aGUKKyAgIGFzc29jaWF0ZWQgc3ViLWNvZGUgKHN0YXJ0aW5nIGF0IHJvb3QgKyAxID09IDEwIGJpdHMpIGlzIHNob3duLgorCisgICBUbyBjb3VudCBhbmQgZXhhbWluZSBIdWZmbWFuIGNvZGVzIHRoYXQgYXJlIG5vdCBsZW5ndGgtbGltaXRlZCwgcHJvdmlkZSBhCisgICBtYXhpbXVtIGxlbmd0aCBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIHN5bWJvbHMgbWludXMgb25lLgorCisgICBGb3IgdGhlIGRlZmxhdGUgbGl0ZXJhbC9sZW5ndGggY29kZSwgdXNlICJlbm91Z2giLiAgRm9yIHRoZSBkZWZsYXRlIGRpc3RhbmNlCisgICBjb2RlLCB1c2UgImVub3VnaCAzMCA2Ii4KKworICAgVGhpcyB1c2VzIHRoZSAlbGx1IHByaW50ZiBmb3JtYXQgdG8gcHJpbnQgYmlnX3QgbnVtYmVycywgd2hpY2ggYXNzdW1lcyB0aGF0CisgICBiaWdfdCBpcyBhbiB1bnNpZ25lZCBsb25nIGxvbmcuICBJZiB0aGUgYmlnX3QgdHlwZSBpcyBjaGFuZ2VkIChmb3IgZXhhbXBsZQorICAgdG8gYSBtdWx0aXBsZSBwcmVjaXNpb24gdHlwZSksIHRoZSBtZXRob2Qgb2YgcHJpbnRpbmcgd2lsbCBhbHNvIG5lZWQgdG8gYmUKKyAgIHVwZGF0ZWQuCisgKi8KK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgICBpbnQgc3ltczsgICAgICAgICAgIC8qIHRvdGFsIG51bWJlciBvZiBzeW1ib2xzIHRvIGNvZGUgKi8KKyAgICBpbnQgbjsgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBzeW1ib2xzIHRvIGNvZGUgZm9yIHRoaXMgcnVuICovCisgICAgYmlnX3QgZ290OyAgICAgICAgICAvKiByZXR1cm4gdmFsdWUgb2YgY291bnQoKSAqLworICAgIGJpZ190IHN1bTsgICAgICAgICAgLyogYWNjdW11bGF0ZWQgbnVtYmVyIG9mIGNvZGVzIG92ZXIgbiAqLworCisgICAgLyogc2V0IHVwIGdsb2JhbHMgZm9yIGNsZWFudXAoKSAqLworICAgIGNvZGUgPSBOVUxMOworICAgIG51bSA9IE5VTEw7CisgICAgZG9uZSA9IE5VTEw7CisKKyAgICAvKiBnZXQgYXJndW1lbnRzIC0tIGRlZmF1bHQgdG8gdGhlIGRlZmxhdGUgbGl0ZXJhbC9sZW5ndGggY29kZSAqLworICAgIHN5bXMgPSAyODY7CisgICAgICAgIHJvb3QgPSA5OworICAgIG1heCA9IDE1OworICAgIGlmIChhcmdjID4gMSkgeworICAgICAgICBzeW1zID0gYXRvaShhcmd2WzFdKTsKKyAgICAgICAgaWYgKGFyZ2MgPiAyKSB7CisgICAgICAgICAgICByb290ID0gYXRvaShhcmd2WzJdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcmdjID4gMykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4ID0gYXRvaShhcmd2WzNdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgfQorICAgIGlmIChhcmdjID4gNCB8fCBzeW1zIDwgMiB8fCByb290IDwgMSB8fCBtYXggPCAxKSB7CisgICAgICAgIGZwdXRzKCJpbnZhbGlkIGFyZ3VtZW50cywgbmVlZDogW3N5bSA+PSAyIFtyb290ID49IDEgW21heCA+PSAxXV1dXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRlcnIpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICAvKiBpZiBub3QgcmVzdHJpY3RpbmcgdGhlIGNvZGUgbGVuZ3RoLCB0aGUgbG9uZ2VzdCBpcyBzeW1zIC0gMSAqLworICAgIGlmIChtYXggPiBzeW1zIC0gMSkKKyAgICAgICAgbWF4ID0gc3ltcyAtIDE7CisKKyAgICAvKiBkZXRlcm1pbmUgdGhlIG51bWJlciBvZiBiaXRzIGluIGEgY29kZV90ICovCisgICAgbiA9IDA7CisgICAgd2hpbGUgKCgoY29kZV90KTEgPDwgbikgIT0gMCkKKyAgICAgICAgbisrOworCisgICAgLyogbWFrZSBzdXJlIHRoYXQgdGhlIGNhbGN1bGF0aW9uIG9mIG1vc3Qgd2lsbCBub3Qgb3ZlcmZsb3cgKi8KKyAgICBpZiAobWF4ID4gbiB8fCBzeW1zIC0gMiA+PSAoKChjb2RlX3QpMCAtIDEpID4+IChtYXggLSAxKSkpIHsKKyAgICAgICAgZnB1dHMoImFib3J0OiBjb2RlIGxlbmd0aCB0b28gbG9uZyBmb3IgaW50ZXJuYWwgdHlwZXNcbiIsIHN0ZGVycik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIC8qIHJlamVjdCBpbXBvc3NpYmxlIGNvZGUgcmVxdWVzdHMgKi8KKyAgICBpZiAoc3ltcyAtIDEgPiAoKGNvZGVfdCkxIDw8IG1heCkgLSAxKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJWQgc3ltYm9scyBjYW5ub3QgYmUgY29kZWQgaW4gJWQgYml0c1xuIiwKKyAgICAgICAgICAgICAgICBzeW1zLCBtYXgpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICAvKiBhbGxvY2F0ZSBjb2RlIHZlY3RvciAqLworICAgIGNvZGUgPSBjYWxsb2MobWF4ICsgMSwgc2l6ZW9mKGludCkpOworICAgIGlmIChjb2RlID09IE5VTEwpIHsKKyAgICAgICAgZnB1dHMoImFib3J0OiB1bmFibGUgdG8gYWxsb2NhdGUgZW5vdWdoIG1lbW9yeVxuIiwgc3RkZXJyKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgLyogZGV0ZXJtaW5lIHNpemUgb2Ygc2F2ZWQgcmVzdWx0cyBhcnJheSwgY2hlY2tpbmcgZm9yIG92ZXJmbG93cywKKyAgICAgICBhbGxvY2F0ZSBhbmQgY2xlYXIgdGhlIGFycmF5IChzZXQgYWxsIHRvIHplcm8gd2l0aCBjYWxsb2MoKSkgKi8KKyAgICBpZiAoc3ltcyA9PSAyKSAgICAgICAgICAgICAgLyogaWZmIG1heCA9PSAxICovCisgICAgICAgIG51bSA9IE5VTEw7ICAgICAgICAgICAgIC8qIHdvbid0IGJlIHNhdmluZyBhbnkgcmVzdWx0cyAqLworICAgIGVsc2UgeworICAgICAgICBzaXplID0gc3ltcyA+PiAxOworICAgICAgICBpZiAoc2l6ZSA+ICgoc2l6ZV90KTAgLSAxKSAvIChuID0gKHN5bXMgLSAxKSA+PiAxKSB8fAorICAgICAgICAgICAgICAgIChzaXplICo9IG4sIHNpemUgPiAoKHNpemVfdCkwIC0gMSkgLyAobiA9IG1heCAtIDEpKSB8fAorICAgICAgICAgICAgICAgIChzaXplICo9IG4sIHNpemUgPiAoKHNpemVfdCkwIC0gMSkgLyBzaXplb2YoYmlnX3QpKSB8fAorICAgICAgICAgICAgICAgIChudW0gPSBjYWxsb2Moc2l6ZSwgc2l6ZW9mKGJpZ190KSkpID09IE5VTEwpIHsKKyAgICAgICAgICAgIGZwdXRzKCJhYm9ydDogdW5hYmxlIHRvIGFsbG9jYXRlIGVub3VnaCBtZW1vcnlcbiIsIHN0ZGVycik7CisgICAgICAgICAgICBjbGVhbnVwKCk7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGNvdW50IHBvc3NpYmxlIGNvZGVzIGZvciBhbGwgbnVtYmVycyBvZiBzeW1ib2xzLCBhZGQgdXAgY291bnRzICovCisgICAgc3VtID0gMDsKKyAgICBmb3IgKG4gPSAyOyBuIDw9IHN5bXM7IG4rKykgeworICAgICAgICBnb3QgPSBjb3VudChuLCAxLCAyKTsKKyAgICAgICAgc3VtICs9IGdvdDsKKyAgICAgICAgaWYgKGdvdCA9PSAtMSB8fCBzdW0gPCBnb3QpIHsgICAgICAgLyogb3ZlcmZsb3cgKi8KKyAgICAgICAgICAgIGZwdXRzKCJhYm9ydDogY2FuJ3QgY291bnQgdGhhdCBoaWdoIVxuIiwgc3RkZXJyKTsKKyAgICAgICAgICAgIGNsZWFudXAoKTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICAgIHByaW50ZigiJWxsdSAlZC1jb2Rlc1xuIiwgZ290LCBuKTsKKyAgICB9CisgICAgcHJpbnRmKCIlbGx1IHRvdGFsIGNvZGVzIGZvciAyIHRvICVkIHN5bWJvbHMiLCBzdW0sIHN5bXMpOworICAgIGlmIChtYXggPCBzeW1zIC0gMSkKKyAgICAgICAgcHJpbnRmKCIgKCVkLWJpdCBsZW5ndGggbGltaXQpXG4iLCBtYXgpOworICAgIGVsc2UKKyAgICAgICAgcHV0cygiIChubyBsZW5ndGggbGltaXQpIik7CisKKyAgICAvKiBhbGxvY2F0ZSBhbmQgY2xlYXIgZG9uZSBhcnJheSBmb3IgYmVlbmhlcmUoKSAqLworICAgIGlmIChzeW1zID09IDIpCisgICAgICAgIGRvbmUgPSBOVUxMOworICAgIGVsc2UgaWYgKHNpemUgPiAoKHNpemVfdCkwIC0gMSkgLyBzaXplb2Yoc3RydWN0IHRhYikgfHwKKyAgICAgICAgICAgICAoZG9uZSA9IGNhbGxvYyhzaXplLCBzaXplb2Yoc3RydWN0IHRhYikpKSA9PSBOVUxMKSB7CisgICAgICAgIGZwdXRzKCJhYm9ydDogdW5hYmxlIHRvIGFsbG9jYXRlIGVub3VnaCBtZW1vcnlcbiIsIHN0ZGVycik7CisgICAgICAgIGNsZWFudXAoKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgLyogZmluZCBhbmQgc2hvdyBtYXhpbXVtIGluZmxhdGUgdGFibGUgdXNhZ2UgKi8KKyAgICAgICAgaWYgKHJvb3QgPiBtYXgpICAgICAgICAgICAgICAgICAvKiByZWR1Y2Ugcm9vdCB0byBtYXggbGVuZ3RoICovCisgICAgICAgICAgICAgICAgcm9vdCA9IG1heDsKKyAgICBpZiAoc3ltcyA8ICgoY29kZV90KTEgPDwgKHJvb3QgKyAxKSkpCisgICAgICAgIGVub3VnaChzeW1zKTsKKyAgICBlbHNlCisgICAgICAgIHB1dHMoImNhbm5vdCBoYW5kbGUgbWluaW11bSBjb2RlIGxlbmd0aHMgPiByb290Iik7CisKKyAgICAvKiBkb25lICovCisgICAgY2xlYW51cCgpOworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvemxpYi0xLjIuNi9leGFtcGxlcy9maXRibGsuYyBiL3psaWItMS4yLjYvZXhhbXBsZXMvZml0YmxrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzYxZGU1YwotLS0gL2Rldi9udWxsCisrKyBiL3psaWItMS4yLjYvZXhhbXBsZXMvZml0YmxrLmMKQEAgLTAsMCArMSwyMzMgQEAKKy8qIGZpdGJsay5jOiBleGFtcGxlIG9mIGZpdHRpbmcgY29tcHJlc3NlZCBvdXRwdXQgdG8gYSBzcGVjaWZpZWQgc2l6ZQorICAgTm90IGNvcHlyaWdodGVkIC0tIHByb3ZpZGVkIHRvIHRoZSBwdWJsaWMgZG9tYWluCisgICBWZXJzaW9uIDEuMSAgMjUgTm92ZW1iZXIgMjAwNCAgTWFyayBBZGxlciAqLworCisvKiBWZXJzaW9uIGhpc3Rvcnk6CisgICAxLjAgIDI0IE5vdiAyMDA0ICBGaXJzdCB2ZXJzaW9uCisgICAxLjEgIDI1IE5vdiAyMDA0ICBDaGFuZ2UgZGVmbGF0ZUluaXQyKCkgdG8gZGVmbGF0ZUluaXQoKQorICAgICAgICAgICAgICAgICAgICAgVXNlIGZpeGVkLXNpemUsIHN0YWNrLWFsbG9jYXRlZCByYXcgYnVmZmVycworICAgICAgICAgICAgICAgICAgICAgU2ltcGxpZnkgY29kZSBtb3ZpbmcgY29tcHJlc3Npb24gdG8gc3Vicm91dGluZXMKKyAgICAgICAgICAgICAgICAgICAgIFVzZSBhc3NlcnQoKSBmb3IgaW50ZXJuYWwgZXJyb3JzCisgICAgICAgICAgICAgICAgICAgICBBZGQgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgYXBwcm9hY2gKKyAqLworCisvKiBBcHByb2FjaCB0byBqdXN0IGZpdHRpbmcgYSByZXF1ZXN0ZWQgY29tcHJlc3NlZCBzaXplOgorCisgICBmaXRibGsgcGVyZm9ybXMgdGhyZWUgY29tcHJlc3Npb24gcGFzc2VzIG9uIGEgcG9ydGlvbiBvZiB0aGUgaW5wdXQKKyAgIGRhdGEgaW4gb3JkZXIgdG8gZGV0ZXJtaW5lIGhvdyBtdWNoIG9mIHRoYXQgaW5wdXQgd2lsbCBjb21wcmVzcyB0bworICAgbmVhcmx5IHRoZSByZXF1ZXN0ZWQgb3V0cHV0IGJsb2NrIHNpemUuICBUaGUgZmlyc3QgcGFzcyBnZW5lcmF0ZXMKKyAgIGVub3VnaCBkZWZsYXRlIGJsb2NrcyB0byBwcm9kdWNlIG91dHB1dCB0byBmaWxsIHRoZSByZXF1ZXN0ZWQKKyAgIG91dHB1dCBzaXplIHBsdXMgYSBzcGVjZmllZCBleGNlc3MgYW1vdW50IChzZWUgdGhlIEVYQ0VTUyBkZWZpbmUKKyAgIGJlbG93KS4gIFRoZSBsYXN0IGRlZmxhdGUgYmxvY2sgbWF5IGdvIHF1aXRlIGEgYml0IHBhc3QgdGhhdCwgYnV0CisgICBpcyBkaXNjYXJkZWQuICBUaGUgc2Vjb25kIHBhc3MgZGVjb21wcmVzc2VzIGFuZCByZWNvbXByZXNzZXMganVzdAorICAgdGhlIGNvbXByZXNzZWQgZGF0YSB0aGF0IGZpdCBpbiB0aGUgcmVxdWVzdGVkIHBsdXMgZXhjZXNzIHNpemVkCisgICBidWZmZXIuICBUaGUgZGVmbGF0ZSBwcm9jZXNzIGlzIHRlcm1pbmF0ZWQgYWZ0ZXIgdGhhdCBhbW91bnQgb2YKKyAgIGlucHV0LCB3aGljaCBpcyBsZXNzIHRoYW4gdGhlIGFtb3VudCBjb25zdW1lZCBvbiB0aGUgZmlyc3QgcGFzcy4KKyAgIFRoZSBsYXN0IGRlZmxhdGUgYmxvY2sgb2YgdGhlIHJlc3VsdCB3aWxsIGJlIG9mIGEgY29tcGFyYWJsZSBzaXplCisgICB0byB0aGUgZmluYWwgcHJvZHVjdCwgc28gdGhhdCB0aGUgaGVhZGVyIGZvciB0aGF0IGRlZmxhdGUgYmxvY2sgYW5kCisgICB0aGUgY29tcHJlc3Npb24gcmF0aW8gZm9yIHRoYXQgYmxvY2sgd2lsbCBiZSBhYm91dCB0aGUgc2FtZSBhcyBpbgorICAgdGhlIGZpbmFsIHByb2R1Y3QuICBUaGUgdGhpcmQgY29tcHJlc3Npb24gcGFzcyBkZWNvbXByZXNzZXMgdGhlCisgICByZXN1bHQgb2YgdGhlIHNlY29uZCBzdGVwLCBidXQgb25seSB0aGUgY29tcHJlc3NlZCBkYXRhIHVwIHRvIHRoZQorICAgcmVxdWVzdGVkIHNpemUgbWludXMgYW4gYW1vdW50IHRvIGFsbG93IHRoZSBjb21wcmVzc2VkIHN0cmVhbSB0bworICAgY29tcGxldGUgKHNlZSB0aGUgTUFSR0lOIGRlZmluZSBiZWxvdykuICBUaGF0IHdpbGwgcmVzdWx0IGluIGEKKyAgIGZpbmFsIGNvbXByZXNzZWQgc3RyZWFtIHdob3NlIGxlbmd0aCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlCisgICByZXF1ZXN0ZWQgc2l6ZS4gIEFzc3VtaW5nIHN1ZmZpY2llbnQgaW5wdXQgYW5kIGEgcmVxdWVzdGVkIHNpemUKKyAgIGdyZWF0ZXIgdGhhbiBhIGZldyBodW5kcmVkIGJ5dGVzLCB0aGUgc2hvcnRmYWxsIHdpbGwgdHlwaWNhbGx5IGJlCisgICBsZXNzIHRoYW4gdGVuIGJ5dGVzLgorCisgICBJZiB0aGUgaW5wdXQgaXMgc2hvcnQgZW5vdWdoIHRoYXQgdGhlIGZpcnN0IGNvbXByZXNzaW9uIGNvbXBsZXRlcworICAgYmVmb3JlIGZpbGxpbmcgdGhlIHJlcXVlc3RlZCBvdXRwdXQgc2l6ZSwgdGhlbiB0aGF0IGNvbXByZXNzZWQKKyAgIHN0cmVhbSBpcyByZXR1cm4gd2l0aCBubyByZWNvbXByZXNzaW9uLgorCisgICBFWENFU1MgaXMgY2hvc2VuIHRvIGJlIGp1c3QgZ3JlYXRlciB0aGFuIHRoZSBzaG9ydGZhbGwgc2VlbiBpbiBhCisgICB0d28gcGFzcyBhcHByb2FjaCBzaW1pbGFyIHRvIHRoZSBhYm92ZS4gIFRoYXQgc2hvcnRmYWxsIGlzIGR1ZSB0bworICAgdGhlIGxhc3QgZGVmbGF0ZSBibG9jayBjb21wcmVzc2luZyBtb3JlIGVmZmljaWVudGx5IHdpdGggYSBzbWFsbGVyCisgICBoZWFkZXIgb24gdGhlIHNlY29uZCBwYXNzLiAgRVhDRVNTIGlzIHNldCB0byBiZSBsYXJnZSBlbm91Z2ggc28KKyAgIHRoYXQgdGhlcmUgaXMgZW5vdWdoIHVuY29tcHJlc3NlZCBkYXRhIGZvciB0aGUgc2Vjb25kIHBhc3MgdG8gZmlsbAorICAgb3V0IHRoZSByZXF1ZXN0ZWQgc2l6ZSwgYW5kIHNtYWxsIGVub3VnaCBzbyB0aGF0IHRoZSBmaW5hbCBkZWZsYXRlCisgICBibG9jayBvZiB0aGUgc2Vjb25kIHBhc3Mgd2lsbCBiZSBjbG9zZSBpbiBzaXplIHRvIHRoZSBmaW5hbCBkZWZsYXRlCisgICBibG9jayBvZiB0aGUgdGhpcmQgYW5kIGZpbmFsIHBhc3MuICBNQVJHSU4gaXMgY2hvc2VuIHRvIGJlIGp1c3QKKyAgIGxhcmdlIGVub3VnaCB0byBhc3N1cmUgdGhhdCB0aGUgZmluYWwgY29tcHJlc3Npb24gaGFzIGVub3VnaCByb29tCisgICB0byBjb21wbGV0ZSBpbiBhbGwgY2FzZXMuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSAiemxpYi5oIgorCisjZGVmaW5lIGxvY2FsIHN0YXRpYworCisvKiBwcmludCBuYXN0eWdyYW0gYW5kIGxlYXZlICovCitsb2NhbCB2b2lkIHF1aXQoY2hhciAqd2h5KQoreworICAgIGZwcmludGYoc3RkZXJyLCAiZml0YmxrIGFib3J0OiAlc1xuIiwgd2h5KTsKKyAgICBleGl0KDEpOworfQorCisjZGVmaW5lIFJBV0xFTiA0MDk2ICAgIC8qIGludGVybWVkaWF0ZSB1bmNvbXByZXNzZWQgYnVmZmVyIHNpemUgKi8KKworLyogY29tcHJlc3MgZnJvbSBmaWxlIHRvIGRlZiB1bnRpbCBwcm92aWRlZCBidWZmZXIgaXMgZnVsbCBvciBlbmQgb2YKKyAgIGlucHV0IHJlYWNoZWQ7IHJldHVybiBsYXN0IGRlZmxhdGUoKSByZXR1cm4gdmFsdWUsIG9yIFpfRVJSTk8gaWYKKyAgIHRoZXJlIHdhcyByZWFkIGVycm9yIG9uIHRoZSBmaWxlICovCitsb2NhbCBpbnQgcGFydGNvbXByZXNzKEZJTEUgKmluLCB6X3N0cmVhbXAgZGVmKQoreworICAgIGludCByZXQsIGZsdXNoOworICAgIHVuc2lnbmVkIGNoYXIgcmF3W1JBV0xFTl07CisKKyAgICBmbHVzaCA9IFpfTk9fRkxVU0g7CisgICAgZG8geworICAgICAgICBkZWYtPmF2YWlsX2luID0gZnJlYWQocmF3LCAxLCBSQVdMRU4sIGluKTsKKyAgICAgICAgaWYgKGZlcnJvcihpbikpCisgICAgICAgICAgICByZXR1cm4gWl9FUlJOTzsKKyAgICAgICAgZGVmLT5uZXh0X2luID0gcmF3OworICAgICAgICBpZiAoZmVvZihpbikpCisgICAgICAgICAgICBmbHVzaCA9IFpfRklOSVNIOworICAgICAgICByZXQgPSBkZWZsYXRlKGRlZiwgZmx1c2gpOworICAgICAgICBhc3NlcnQocmV0ICE9IFpfU1RSRUFNX0VSUk9SKTsKKyAgICB9IHdoaWxlIChkZWYtPmF2YWlsX291dCAhPSAwICYmIGZsdXNoID09IFpfTk9fRkxVU0gpOworICAgIHJldHVybiByZXQ7Cit9CisKKy8qIHJlY29tcHJlc3MgZnJvbSBpbmYncyBpbnB1dCB0byBkZWYncyBvdXRwdXQ7IHRoZSBpbnB1dCBmb3IgaW5mIGFuZAorICAgdGhlIG91dHB1dCBmb3IgZGVmIGFyZSBzZXQgaW4gdGhvc2Ugc3RydWN0dXJlcyBiZWZvcmUgY2FsbGluZzsKKyAgIHJldHVybiBsYXN0IGRlZmxhdGUoKSByZXR1cm4gdmFsdWUsIG9yIFpfTUVNX0VSUk9SIGlmIGluZmxhdGUoKQorICAgd2FzIG5vdCBhYmxlIHRvIGFsbG9jYXRlIGVub3VnaCBtZW1vcnkgd2hlbiBpdCBuZWVkZWQgdG8gKi8KK2xvY2FsIGludCByZWNvbXByZXNzKHpfc3RyZWFtcCBpbmYsIHpfc3RyZWFtcCBkZWYpCit7CisgICAgaW50IHJldCwgZmx1c2g7CisgICAgdW5zaWduZWQgY2hhciByYXdbUkFXTEVOXTsKKworICAgIGZsdXNoID0gWl9OT19GTFVTSDsKKyAgICBkbyB7CisgICAgICAgIC8qIGRlY29tcHJlc3MgKi8KKyAgICAgICAgaW5mLT5hdmFpbF9vdXQgPSBSQVdMRU47CisgICAgICAgIGluZi0+bmV4dF9vdXQgPSByYXc7CisgICAgICAgIHJldCA9IGluZmxhdGUoaW5mLCBaX05PX0ZMVVNIKTsKKyAgICAgICAgYXNzZXJ0KHJldCAhPSBaX1NUUkVBTV9FUlJPUiAmJiByZXQgIT0gWl9EQVRBX0VSUk9SICYmCisgICAgICAgICAgICAgICByZXQgIT0gWl9ORUVEX0RJQ1QpOworICAgICAgICBpZiAocmV0ID09IFpfTUVNX0VSUk9SKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICAvKiBjb21wcmVzcyB3aGF0IHdhcyBkZWNvbXByZXNlZCB1bnRpbCBkb25lIG9yIG5vIHJvb20gKi8KKyAgICAgICAgZGVmLT5hdmFpbF9pbiA9IFJBV0xFTiAtIGluZi0+YXZhaWxfb3V0OworICAgICAgICBkZWYtPm5leHRfaW4gPSByYXc7CisgICAgICAgIGlmIChpbmYtPmF2YWlsX291dCAhPSAwKQorICAgICAgICAgICAgZmx1c2ggPSBaX0ZJTklTSDsKKyAgICAgICAgcmV0ID0gZGVmbGF0ZShkZWYsIGZsdXNoKTsKKyAgICAgICAgYXNzZXJ0KHJldCAhPSBaX1NUUkVBTV9FUlJPUik7CisgICAgfSB3aGlsZSAocmV0ICE9IFpfU1RSRUFNX0VORCAmJiBkZWYtPmF2YWlsX291dCAhPSAwKTsKKyAgICByZXR1cm4gcmV0OworfQorCisjZGVmaW5lIEVYQ0VTUyAyNTYgICAgICAvKiBlbXBpcmljYWxseSBkZXRlcm1pbmVkIHN0cmVhbSBvdmVyYWdlICovCisjZGVmaW5lIE1BUkdJTiA4ICAgICAgICAvKiBhbW91bnQgdG8gYmFjayBvZmYgZm9yIGNvbXBsZXRpb24gKi8KKworLyogY29tcHJlc3MgZnJvbSBzdGRpbiB0byBmaXhlZC1zaXplIGJsb2NrIG9uIHN0ZG91dCAqLworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICAgIGludCByZXQ7ICAgICAgICAgICAgICAgIC8qIHJldHVybiBjb2RlICovCisgICAgdW5zaWduZWQgc2l6ZTsgICAgICAgICAgLyogcmVxdWVzdGVkIGZpeGVkIG91dHB1dCBibG9jayBzaXplICovCisgICAgdW5zaWduZWQgaGF2ZTsgICAgICAgICAgLyogYnl0ZXMgd3JpdHRlbiBieSBkZWZsYXRlKCkgY2FsbCAqLworICAgIHVuc2lnbmVkIGNoYXIgKmJsazsgICAgIC8qIGludGVybWVkaWF0ZSBhbmQgZmluYWwgc3RyZWFtICovCisgICAgdW5zaWduZWQgY2hhciAqdG1wOyAgICAgLyogY2xvc2UgdG8gZGVzaXJlZCBzaXplIHN0cmVhbSAqLworICAgIHpfc3RyZWFtIGRlZiwgaW5mOyAgICAgIC8qIHpsaWIgZGVmbGF0ZSBhbmQgaW5mbGF0ZSBzdGF0ZXMgKi8KKworICAgIC8qIGdldCByZXF1ZXN0ZWQgb3V0cHV0IHNpemUgKi8KKyAgICBpZiAoYXJnYyAhPSAyKQorICAgICAgICBxdWl0KCJuZWVkIG9uZSBhcmd1bWVudDogc2l6ZSBvZiBvdXRwdXQgYmxvY2siKTsKKyAgICByZXQgPSBzdHJ0b2woYXJndlsxXSwgYXJndiArIDEsIDEwKTsKKyAgICBpZiAoYXJndlsxXVswXSAhPSAwKQorICAgICAgICBxdWl0KCJhcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyIik7CisgICAgaWYgKHJldCA8IDgpICAgICAgICAgICAgLyogOCBpcyBtaW5pbXVtIHpsaWIgc3RyZWFtIHNpemUgKi8KKyAgICAgICAgcXVpdCgibmVlZCBwb3NpdGl2ZSBzaXplIG9mIDggb3IgZ3JlYXRlciIpOworICAgIHNpemUgPSAodW5zaWduZWQpcmV0OworCisgICAgLyogYWxsb2NhdGUgbWVtb3J5IGZvciBidWZmZXJzIGFuZCBjb21wcmVzc2lvbiBlbmdpbmUgKi8KKyAgICBibGsgPSBtYWxsb2Moc2l6ZSArIEVYQ0VTUyk7CisgICAgZGVmLnphbGxvYyA9IFpfTlVMTDsKKyAgICBkZWYuemZyZWUgPSBaX05VTEw7CisgICAgZGVmLm9wYXF1ZSA9IFpfTlVMTDsKKyAgICByZXQgPSBkZWZsYXRlSW5pdCgmZGVmLCBaX0RFRkFVTFRfQ09NUFJFU1NJT04pOworICAgIGlmIChyZXQgIT0gWl9PSyB8fCBibGsgPT0gTlVMTCkKKyAgICAgICAgcXVpdCgib3V0IG9mIG1lbW9yeSIpOworCisgICAgLyogY29tcHJlc3MgZnJvbSBzdGRpbiB1bnRpbCBvdXRwdXQgZnVsbCwgb3Igbm8gbW9yZSBpbnB1dCAqLworICAgIGRlZi5hdmFpbF9vdXQgPSBzaXplICsgRVhDRVNTOworICAgIGRlZi5uZXh0X291dCA9IGJsazsKKyAgICByZXQgPSBwYXJ0Y29tcHJlc3Moc3RkaW4sICZkZWYpOworICAgIGlmIChyZXQgPT0gWl9FUlJOTykKKyAgICAgICAgcXVpdCgiZXJyb3IgcmVhZGluZyBpbnB1dCIpOworCisgICAgLyogaWYgaXQgYWxsIGZpdCwgdGhlbiBzaXplIHdhcyB1bmRlcnN1YnNjcmliZWQgLS0gZG9uZSEgKi8KKyAgICBpZiAocmV0ID09IFpfU1RSRUFNX0VORCAmJiBkZWYuYXZhaWxfb3V0ID49IEVYQ0VTUykgeworICAgICAgICAvKiB3cml0ZSBibG9jayB0byBzdGRvdXQgKi8KKyAgICAgICAgaGF2ZSA9IHNpemUgKyBFWENFU1MgLSBkZWYuYXZhaWxfb3V0OworICAgICAgICBpZiAoZndyaXRlKGJsaywgMSwgaGF2ZSwgc3Rkb3V0KSAhPSBoYXZlIHx8IGZlcnJvcihzdGRvdXQpKQorICAgICAgICAgICAgcXVpdCgiZXJyb3Igd3JpdGluZyBvdXRwdXQiKTsKKworICAgICAgICAvKiBjbGVhbiB1cCBhbmQgcHJpbnQgcmVzdWx0cyB0byBzdGRlcnIgKi8KKyAgICAgICAgcmV0ID0gZGVmbGF0ZUVuZCgmZGVmKTsKKyAgICAgICAgYXNzZXJ0KHJldCAhPSBaX1NUUkVBTV9FUlJPUik7CisgICAgICAgIGZyZWUoYmxrKTsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAgICAgIiV1IGJ5dGVzIHVudXNlZCBvdXQgb2YgJXUgcmVxdWVzdGVkIChhbGwgaW5wdXQpXG4iLAorICAgICAgICAgICAgICAgIHNpemUgLSBoYXZlLCBzaXplKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLyogaXQgZGlkbid0IGFsbCBmaXQgLS0gc2V0IHVwIGZvciByZWNvbXByZXNzaW9uICovCisgICAgaW5mLnphbGxvYyA9IFpfTlVMTDsKKyAgICBpbmYuemZyZWUgPSBaX05VTEw7CisgICAgaW5mLm9wYXF1ZSA9IFpfTlVMTDsKKyAgICBpbmYuYXZhaWxfaW4gPSAwOworICAgIGluZi5uZXh0X2luID0gWl9OVUxMOworICAgIHJldCA9IGluZmxhdGVJbml0KCZpbmYpOworICAgIHRtcCA9IG1hbGxvYyhzaXplICsgRVhDRVNTKTsKKyAgICBpZiAocmV0ICE9IFpfT0sgfHwgdG1wID09IE5VTEwpCisgICAgICAgIHF1aXQoIm91dCBvZiBtZW1vcnkiKTsKKyAgICByZXQgPSBkZWZsYXRlUmVzZXQoJmRlZik7CisgICAgYXNzZXJ0KHJldCAhPSBaX1NUUkVBTV9FUlJPUik7CisKKyAgICAvKiBkbyBmaXJzdCByZWNvbXByZXNzaW9uIGNsb3NlIHRvIHRoZSByaWdodCBhbW91bnQgKi8KKyAgICBpbmYuYXZhaWxfaW4gPSBzaXplICsgRVhDRVNTOworICAgIGluZi5uZXh0X2luID0gYmxrOworICAgIGRlZi5hdmFpbF9vdXQgPSBzaXplICsgRVhDRVNTOworICAgIGRlZi5uZXh0X291dCA9IHRtcDsKKyAgICByZXQgPSByZWNvbXByZXNzKCZpbmYsICZkZWYpOworICAgIGlmIChyZXQgPT0gWl9NRU1fRVJST1IpCisgICAgICAgIHF1aXQoIm91dCBvZiBtZW1vcnkiKTsKKworICAgIC8qIHNldCB1cCBmb3IgbmV4dCByZW9jbXByZXNzaW9uICovCisgICAgcmV0ID0gaW5mbGF0ZVJlc2V0KCZpbmYpOworICAgIGFzc2VydChyZXQgIT0gWl9TVFJFQU1fRVJST1IpOworICAgIHJldCA9IGRlZmxhdGVSZXNldCgmZGVmKTsKKyAgICBhc3NlcnQocmV0ICE9IFpfU1RSRUFNX0VSUk9SKTsKKworICAgIC8qIGRvIHNlY29uZCBhbmQgZmluYWwgcmVjb21wcmVzc2lvbiAodGhpcmQgY29tcHJlc3Npb24pICovCisgICAgaW5mLmF2YWlsX2luID0gc2l6ZSAtIE1BUkdJTjsgICAvKiBhc3N1cmUgc3RyZWFtIHdpbGwgY29tcGxldGUgKi8KKyAgICBpbmYubmV4dF9pbiA9IHRtcDsKKyAgICBkZWYuYXZhaWxfb3V0ID0gc2l6ZTsKKyAgICBkZWYubmV4dF9vdXQgPSBibGs7CisgICAgcmV0ID0gcmVjb21wcmVzcygmaW5mLCAmZGVmKTsKKyAgICBpZiAocmV0ID09IFpfTUVNX0VSUk9SKQorICAgICAgICBxdWl0KCJvdXQgb2YgbWVtb3J5Iik7CisgICAgYXNzZXJ0KHJldCA9PSBaX1NUUkVBTV9FTkQpOyAgICAvKiBvdGhlcndpc2UgTUFSR0lOIHRvbyBzbWFsbCAqLworCisgICAgLyogZG9uZSAtLSB3cml0ZSBibG9jayB0byBzdGRvdXQgKi8KKyAgICBoYXZlID0gc2l6ZSAtIGRlZi5hdmFpbF9vdXQ7CisgICAgaWYgKGZ3cml0ZShibGssIDEsIGhhdmUsIHN0ZG91dCkgIT0gaGF2ZSB8fCBmZXJyb3Ioc3Rkb3V0KSkKKyAgICAgICAgcXVpdCgiZXJyb3Igd3JpdGluZyBvdXRwdXQiKTsKKworICAgIC8qIGNsZWFuIHVwIGFuZCBwcmludCByZXN1bHRzIHRvIHN0ZGVyciAqLworICAgIGZyZWUodG1wKTsKKyAgICByZXQgPSBpbmZsYXRlRW5kKCZpbmYpOworICAgIGFzc2VydChyZXQgIT0gWl9TVFJFQU1fRVJST1IpOworICAgIHJldCA9IGRlZmxhdGVFbmQoJmRlZik7CisgICAgYXNzZXJ0KHJldCAhPSBaX1NUUkVBTV9FUlJPUik7CisgICAgZnJlZShibGspOworICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgIiV1IGJ5dGVzIHVudXNlZCBvdXQgb2YgJXUgcmVxdWVzdGVkICglbHUgaW5wdXQpXG4iLAorICAgICAgICAgICAgc2l6ZSAtIGhhdmUsIHNpemUsIGRlZi50b3RhbF9pbik7CisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS96bGliLTEuMi42L2V4YW1wbGVzL2d1bi5jIGIvemxpYi0xLjIuNi9leGFtcGxlcy9ndW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MmIwODgyCi0tLSAvZGV2L251bGwKKysrIGIvemxpYi0xLjIuNi9leGFtcGxlcy9ndW4uYwpAQCAtMCwwICsxLDcwMSBAQAorLyogZ3VuLmMgLS0gc2ltcGxlIGd1bnppcCB0byBnaXZlIGFuIGV4YW1wbGUgb2YgdGhlIHVzZSBvZiBpbmZsYXRlQmFjaygpCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDUsIDIwMDgsIDIwMTAgTWFyayBBZGxlcgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAorICAgVmVyc2lvbiAxLjYgIDE3IEphbnVhcnkgMjAxMCAgTWFyayBBZGxlciAqLworCisvKiBWZXJzaW9uIGhpc3Rvcnk6CisgICAxLjAgIDE2IEZlYiAyMDAzICBGaXJzdCB2ZXJzaW9uIGZvciB0ZXN0aW5nIG9mIGluZmxhdGVCYWNrKCkKKyAgIDEuMSAgMjEgRmViIDIwMDUgIERlY29tcHJlc3MgY29uY2F0ZW5hdGVkIGd6aXAgc3RyZWFtcworICAgICAgICAgICAgICAgICAgICAgUmVtb3ZlIHVzZSBvZiAidGhpcyIgdmFyaWFibGUgKEMrKyBrZXl3b3JkKQorICAgICAgICAgICAgICAgICAgICAgRml4IHJldHVybiB2YWx1ZSBmb3IgaW4oKQorICAgICAgICAgICAgICAgICAgICAgSW1wcm92ZSBhbGxvY2F0aW9uIGZhaWx1cmUgY2hlY2tpbmcKKyAgICAgICAgICAgICAgICAgICAgIEFkZCB0eXBlY2FzdGluZyBmb3Igdm9pZCAqIHN0cnVjdHVyZXMKKyAgICAgICAgICAgICAgICAgICAgIEFkZCAtaCBvcHRpb24gZm9yIGNvbW1hbmQgdmVyc2lvbiBhbmQgdXNhZ2UKKyAgICAgICAgICAgICAgICAgICAgIEFkZCBhIGJ1bmNoIG9mIGNvbW1lbnRzCisgICAxLjIgIDIwIE1hciAyMDA1ICBBZGQgVW5peCBjb21wcmVzcyAoTFpXKSBkZWNvbXByZXNzaW9uCisgICAgICAgICAgICAgICAgICAgICBDb3B5IGZpbGUgYXR0cmlidXRlcyBmcm9tIGlucHV0IGZpbGUgdG8gb3V0cHV0IGZpbGUKKyAgIDEuMyAgMTIgSnVuIDIwMDUgIEFkZCBjYXN0cyBmb3IgZXJyb3IgbWVzc2FnZXMgW09iZXJodW1lcl0KKyAgIDEuNCAgIDggRGVjIDIwMDYgIExaVyBkZWNvbXByZXNzaW9uIHNwZWVkIGltcHJvdmVtZW50cworICAgMS41ICAgOSBGZWIgMjAwOCAgQXZvaWQgd2FybmluZyBpbiBsYXRlc3QgdmVyc2lvbiBvZiBnY2MKKyAgIDEuNiAgMTcgSmFuIDIwMTAgIEF2b2lkIHNpZ25lZC91bnNpZ25lZCBjb21wYXJpc29uIHdhcm5pbmdzCisgKi8KKworLyoKKyAgIGd1biBbIC10IF0gWyBuYW1lIC4uLiBdCisKKyAgIGRlY29tcHJlc3NlcyB0aGUgZGF0YSBpbiB0aGUgbmFtZWQgZ3ppcCBmaWxlcy4gIElmIG5vIGFyZ3VtZW50cyBhcmUgZ2l2ZW4sCisgICBndW4gd2lsbCBkZWNvbXByZXNzIGZyb20gc3RkaW4gdG8gc3Rkb3V0LiAgVGhlIG5hbWVzIG11c3QgZW5kIGluIC5neiwgLWd6LAorICAgLnosIC16LCBfeiwgb3IgLlouICBUaGUgdW5jb21wcmVzc2VkIGRhdGEgd2lsbCBiZSB3cml0dGVuIHRvIGEgZmlsZSBuYW1lCisgICB3aXRoIHRoZSBzdWZmaXggc3RyaXBwZWQuICBPbiBzdWNjZXNzLCB0aGUgb3JpZ2luYWwgZmlsZSBpcyBkZWxldGVkLiAgT24KKyAgIGZhaWx1cmUsIHRoZSBvdXRwdXQgZmlsZSBpcyBkZWxldGVkLiAgRm9yIG1vc3QgZmFpbHVyZXMsIHRoZSBjb21tYW5kIHdpbGwKKyAgIGNvbnRpbnVlIHRvIHByb2Nlc3MgdGhlIHJlbWFpbmluZyBuYW1lcyBvbiB0aGUgY29tbWFuZCBsaW5lLiAgQSBtZW1vcnkKKyAgIGFsbG9jYXRpb24gZmFpbHVyZSB3aWxsIGFib3J0IHRoZSBjb21tYW5kLiAgSWYgLXQgaXMgc3BlY2lmaWVkLCB0aGVuIHRoZQorICAgbGlzdGVkIGZpbGVzIG9yIHN0ZGluIHdpbGwgYmUgdGVzdGVkIGFzIGd6aXAgZmlsZXMgZm9yIGludGVncml0eSAod2l0aG91dAorICAgY2hlY2tpbmcgZm9yIGEgcHJvcGVyIHN1ZmZpeCksIG5vIG91dHB1dCB3aWxsIGJlIHdyaXR0ZW4sIGFuZCBubyBmaWxlcworICAgd2lsbCBiZSBkZWxldGVkLgorCisgICBMaWtlIGd6aXAsIGd1biBhbGxvd3MgY29uY2F0ZW5hdGVkIGd6aXAgc3RyZWFtcyBhbmQgd2lsbCBkZWNvbXByZXNzIHRoZW0sCisgICB3cml0aW5nIGFsbCBvZiB0aGUgdW5jb21wcmVzc2VkIGRhdGEgdG8gdGhlIG91dHB1dC4gIFVubGlrZSBnemlwLCBndW4gYWxsb3dzCisgICBhbiBlbXB0eSBmaWxlIG9uIGlucHV0LCBhbmQgd2lsbCBwcm9kdWNlIG5vIGVycm9yIHdyaXRpbmcgYW4gZW1wdHkgb3V0cHV0CisgICBmaWxlLgorCisgICBndW4gd2lsbCBhbHNvIGRlY29tcHJlc3MgZmlsZXMgbWFkZSBieSBVbml4IGNvbXByZXNzLCB3aGljaCB1c2VzIExaVworICAgY29tcHJlc3Npb24uICBUaGVzZSBmaWxlcyBhcmUgYXV0b21hdGljYWxseSBkZXRlY3RlZCBieSB2aXJ0dWUgb2YgdGhlaXIKKyAgIG1hZ2ljIGhlYWRlciBieXRlcy4gIFNpbmNlIHRoZSBlbmQgb2YgVW5peCBjb21wcmVzcyBzdHJlYW0gaXMgbWFya2VkIGJ5IHRoZQorICAgZW5kLW9mLWZpbGUsIHRoZXkgY2Fubm90IGJlIGNvbmNhbnRlbmF0ZWQuICBJZiBhIFVuaXggY29tcHJlc3Mgc3RyZWFtIGlzCisgICBlbmNvdW50ZXJlZCBpbiBhbiBpbnB1dCBmaWxlLCBpdCBpcyB0aGUgbGFzdCBzdHJlYW0gaW4gdGhhdCBmaWxlLgorCisgICBMaWtlIGd1bnppcCBhbmQgdW5jb21wcmVzcywgdGhlIGZpbGUgYXR0cmlidXRlcyBvZiB0aGUgb3JpZ25hbCBjb21wcmVzc2VkCisgICBmaWxlIGFyZSBtYWludGFpbmVkIGluIHRoZSBmaW5hbCB1bmNvbXByZXNzZWQgZmlsZSwgdG8gdGhlIGV4dGVudCB0aGF0IHRoZQorICAgdXNlciBwZXJtaXNzaW9ucyBhbGxvdyBpdC4KKworICAgT24gbXkgTWFjIE9TIFggUG93ZXJQQyBHNCwgZ3VuIGlzIGFsbW9zdCB0d2ljZSBhcyBmYXN0IGFzIGd1bnppcCAodmVyc2lvbgorICAgMS4yLjQpIGlzIG9uIHRoZSBzYW1lIGZpbGUsIHdoZW4gZ3VuIGlzIGxpbmtlZCB3aXRoIHpsaWIgMS4yLjIuICBBbHNvIHRoZQorICAgTFpXIGRlY29tcHJlc3Npb24gcHJvdmlkZWQgYnkgZ3VuIGlzIGFib3V0IHR3aWNlIGFzIGZhc3QgYXMgdGhlIHN0YW5kYXJkCisgICBVbml4IHVuY29tcHJlc3MgY29tbWFuZC4KKyAqLworCisvKiBleHRlcm5hbCBmdW5jdGlvbnMgYW5kIHJlbGF0ZWQgdHlwZXMgYW5kIGNvbnN0YW50cyAqLworI2luY2x1ZGUgPHN0ZGlvLmg+ICAgICAgICAgIC8qIGZwcmludGYoKSAqLworI2luY2x1ZGUgPHN0ZGxpYi5oPiAgICAgICAgIC8qIG1hbGxvYygpLCBmcmVlKCkgKi8KKyNpbmNsdWRlIDxzdHJpbmcuaD4gICAgICAgICAvKiBzdHJlcnJvcigpLCBzdHJjbXAoKSwgc3RybGVuKCksIG1lbWNweSgpICovCisjaW5jbHVkZSA8ZXJybm8uaD4gICAgICAgICAgLyogZXJybm8gKi8KKyNpbmNsdWRlIDxmY250bC5oPiAgICAgICAgICAvKiBvcGVuKCkgKi8KKyNpbmNsdWRlIDx1bmlzdGQuaD4gICAgICAgICAvKiByZWFkKCksIHdyaXRlKCksIGNsb3NlKCksIGNob3duKCksIHVubGluaygpICovCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4gICAgICAgLyogc3RhdCgpLCBjaG1vZCgpICovCisjaW5jbHVkZSA8dXRpbWUuaD4gICAgICAgICAgLyogdXRpbWUoKSAqLworI2luY2x1ZGUgInpsaWIuaCIgICAgICAgICAgIC8qIGluZmxhdGVCYWNrSW5pdCgpLCBpbmZsYXRlQmFjaygpLCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluZmxhdGVCYWNrRW5kKCksIGNyYzMyKCkgKi8KKworLyogZnVuY3Rpb24gZGVjbGFyYXRpb24gKi8KKyNkZWZpbmUgbG9jYWwgc3RhdGljCisKKy8qIGJ1ZmZlciBjb25zdGFudHMgKi8KKyNkZWZpbmUgU0laRSAzMjc2OFUgICAgICAgICAvKiBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlciBzaXplcyAqLworI2RlZmluZSBQSUVDRSAxNjM4NCAgICAgICAgIC8qIGxpbWl0cyBpL28gY2h1bmtzIGZvciAxNi1iaXQgaW50IGNhc2UgKi8KKworLyogc3RydWN0dXJlIGZvciBpbmZiYWNrKCkgdG8gcGFzcyB0byBpbnB1dCBmdW5jdGlvbiBpbigpIC0tIGl0IG1haW50YWlucyB0aGUKKyAgIGlucHV0IGZpbGUgYW5kIGEgYnVmZmVyIG9mIHNpemUgU0laRSAqLworc3RydWN0IGluZCB7CisgICAgaW50IGluZmlsZTsKKyAgICB1bnNpZ25lZCBjaGFyICppbmJ1ZjsKK307CisKKy8qIExvYWQgaW5wdXQgYnVmZmVyLCBhc3N1bWVkIHRvIGJlIGVtcHR5LCBhbmQgcmV0dXJuIGJ5dGVzIGxvYWRlZCBhbmQgYQorICAgcG9pbnRlciB0byB0aGVtLiAgcmVhZCgpIGlzIGNhbGxlZCB1bnRpbCB0aGUgYnVmZmVyIGlzIGZ1bGwsIG9yIHVudGlsIGl0CisgICByZXR1cm5zIGVuZC1vZi1maWxlIG9yIGVycm9yLiAgUmV0dXJuIDAgb24gZXJyb3IuICovCitsb2NhbCB1bnNpZ25lZCBpbih2b2lkICppbl9kZXNjLCB1bnNpZ25lZCBjaGFyICoqYnVmKQoreworICAgIGludCByZXQ7CisgICAgdW5zaWduZWQgbGVuOworICAgIHVuc2lnbmVkIGNoYXIgKm5leHQ7CisgICAgc3RydWN0IGluZCAqbWUgPSAoc3RydWN0IGluZCAqKWluX2Rlc2M7CisKKyAgICBuZXh0ID0gbWUtPmluYnVmOworICAgICpidWYgPSBuZXh0OworICAgIGxlbiA9IDA7CisgICAgZG8geworICAgICAgICByZXQgPSBQSUVDRTsKKyAgICAgICAgaWYgKCh1bnNpZ25lZClyZXQgPiBTSVpFIC0gbGVuKQorICAgICAgICAgICAgcmV0ID0gKGludCkoU0laRSAtIGxlbik7CisgICAgICAgIHJldCA9IChpbnQpcmVhZChtZS0+aW5maWxlLCBuZXh0LCByZXQpOworICAgICAgICBpZiAocmV0ID09IC0xKSB7CisgICAgICAgICAgICBsZW4gPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgbmV4dCArPSByZXQ7CisgICAgICAgIGxlbiArPSByZXQ7CisgICAgfSB3aGlsZSAocmV0ICE9IDAgJiYgbGVuIDwgU0laRSk7CisgICAgcmV0dXJuIGxlbjsKK30KKworLyogc3RydWN0dXJlIGZvciBpbmZiYWNrKCkgdG8gcGFzcyB0byBvdXRwdXQgZnVuY3Rpb24gb3V0KCkgLS0gaXQgbWFpbnRhaW5zIHRoZQorICAgb3V0cHV0IGZpbGUsIGEgcnVubmluZyBDUkMtMzIgY2hlY2sgb24gdGhlIG91dHB1dCBhbmQgdGhlIHRvdGFsIG51bWJlciBvZgorICAgYnl0ZXMgb3V0cHV0LCBib3RoIGZvciBjaGVja2luZyBhZ2FpbnN0IHRoZSBnemlwIHRyYWlsZXIuICAoVGhlIGxlbmd0aCBpbgorICAgdGhlIGd6aXAgdHJhaWxlciBpcyBzdG9yZWQgbW9kdWxvIDJeMzIsIHNvIGl0J3Mgb2sgaWYgYSBsb25nIGlzIDMyIGJpdHMgYW5kCisgICB0aGUgb3V0cHV0IGlzIGdyZWF0ZXIgdGhhbiA0IEdCLikgKi8KK3N0cnVjdCBvdXRkIHsKKyAgICBpbnQgb3V0ZmlsZTsKKyAgICBpbnQgY2hlY2s7ICAgICAgICAgICAgICAgICAgLyogdHJ1ZSBpZiBjaGVja2luZyBjcmMgYW5kIHRvdGFsICovCisgICAgdW5zaWduZWQgbG9uZyBjcmM7CisgICAgdW5zaWduZWQgbG9uZyB0b3RhbDsKK307CisKKy8qIFdyaXRlIG91dHB1dCBidWZmZXIgYW5kIHVwZGF0ZSB0aGUgQ1JDLTMyIGFuZCB0b3RhbCBieXRlcyB3cml0dGVuLiAgd3JpdGUoKQorICAgaXMgY2FsbGVkIHVudGlsIGFsbCBvZiB0aGUgb3V0cHV0IGlzIHdyaXR0ZW4gb3IgYW4gZXJyb3IgaXMgZW5jb3VudGVyZWQuCisgICBPbiBzdWNjZXNzIG91dCgpIHJldHVybnMgMC4gIEZvciBhIHdyaXRlIGZhaWx1cmUsIG91dCgpIHJldHVybnMgMS4gIElmIHRoZQorICAgb3V0cHV0IGZpbGUgZGVzY3JpcHRvciBpcyAtMSwgdGhlbiBub3RoaW5nIGlzIHdyaXR0ZW4uCisgKi8KK2xvY2FsIGludCBvdXQodm9pZCAqb3V0X2Rlc2MsIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgdW5zaWduZWQgbGVuKQoreworICAgIGludCByZXQ7CisgICAgc3RydWN0IG91dGQgKm1lID0gKHN0cnVjdCBvdXRkICopb3V0X2Rlc2M7CisKKyAgICBpZiAobWUtPmNoZWNrKSB7CisgICAgICAgIG1lLT5jcmMgPSBjcmMzMihtZS0+Y3JjLCBidWYsIGxlbik7CisgICAgICAgIG1lLT50b3RhbCArPSBsZW47CisgICAgfQorICAgIGlmIChtZS0+b3V0ZmlsZSAhPSAtMSkKKyAgICAgICAgZG8geworICAgICAgICAgICAgcmV0ID0gUElFQ0U7CisgICAgICAgICAgICBpZiAoKHVuc2lnbmVkKXJldCA+IGxlbikKKyAgICAgICAgICAgICAgICByZXQgPSAoaW50KWxlbjsKKyAgICAgICAgICAgIHJldCA9IChpbnQpd3JpdGUobWUtPm91dGZpbGUsIGJ1ZiwgcmV0KTsKKyAgICAgICAgICAgIGlmIChyZXQgPT0gLTEpCisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICBidWYgKz0gcmV0OworICAgICAgICAgICAgbGVuIC09IHJldDsKKyAgICAgICAgfSB3aGlsZSAobGVuICE9IDApOworICAgIHJldHVybiAwOworfQorCisvKiBuZXh0IGlucHV0IGJ5dGUgbWFjcm8gZm9yIHVzZSBpbnNpZGUgbHVucGlwZSgpIGFuZCBndW5waXBlKCkgKi8KKyNkZWZpbmUgTkVYVCgpIChoYXZlID8gMCA6IChoYXZlID0gaW4oaW5kcCwgJm5leHQpKSwgXAorICAgICAgICAgICAgICAgIGxhc3QgPSBoYXZlID8gKGhhdmUtLSwgKGludCkoKm5leHQrKykpIDogLTEpCisKKy8qIG1lbW9yeSBmb3IgZ3VucGlwZSgpIGFuZCBsdW5waXBlKCkgLS0KKyAgIHRoZSBmaXJzdCAyNTYgZW50cmllcyBvZiBwcmVmaXhbXSBhbmQgc3VmZml4W10gYXJlIG5ldmVyIHVzZWQsIGNvdWxkCisgICBoYXZlIG9mZnNldCB0aGUgaW5kZXgsIGJ1dCBpdCdzIGZhc3RlciB0byB3YXN0ZSB0aGUgbWVtb3J5ICovCit1bnNpZ25lZCBjaGFyIGluYnVmW1NJWkVdOyAgICAgICAgICAgICAgLyogaW5wdXQgYnVmZmVyICovCit1bnNpZ25lZCBjaGFyIG91dGJ1ZltTSVpFXTsgICAgICAgICAgICAgLyogb3V0cHV0IGJ1ZmZlciAqLwordW5zaWduZWQgc2hvcnQgcHJlZml4WzY1NTM2XTsgICAgICAgICAgIC8qIGluZGV4IHRvIExaVyBwcmVmaXggc3RyaW5nICovCit1bnNpZ25lZCBjaGFyIHN1ZmZpeFs2NTUzNl07ICAgICAgICAgICAgLyogb25lLWNoYXJhY3RlciBMWlcgc3VmZml4ICovCit1bnNpZ25lZCBjaGFyIG1hdGNoWzY1MjgwICsgMl07ICAgICAgICAgLyogYnVmZmVyIGZvciByZXZlcnNlZCBtYXRjaCBvciBnemlwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzJLIHNsaWRpbmcgd2luZG93ICovCisKKy8qIHRocm93IG91dCB3aGF0J3MgbGVmdCBpbiB0aGUgY3VycmVudCBiaXRzIGJ5dGUgYnVmZmVyICh0aGlzIGlzIGEgdmVzdGlnaWFsCisgICBhc3BlY3Qgb2YgdGhlIGNvbXByZXNzZWQgZGF0YSBmb3JtYXQgZGVyaXZlZCBmcm9tIGFuIGltcGxlbWVudGF0aW9uIHRoYXQKKyAgIG1hZGUgdXNlIG9mIGEgc3BlY2lhbCBWQVggbWFjaGluZSBpbnN0cnVjdGlvbiEpICovCisjZGVmaW5lIEZMVVNIQ09ERSgpIFwKKyAgICBkbyB7IFwKKyAgICAgICAgbGVmdCA9IDA7IFwKKyAgICAgICAgcmVtID0gMDsgXAorICAgICAgICBpZiAoY2h1bmsgPiBoYXZlKSB7IFwKKyAgICAgICAgICAgIGNodW5rIC09IGhhdmU7IFwKKyAgICAgICAgICAgIGhhdmUgPSAwOyBcCisgICAgICAgICAgICBpZiAoTkVYVCgpID09IC0xKSBcCisgICAgICAgICAgICAgICAgYnJlYWs7IFwKKyAgICAgICAgICAgIGNodW5rLS07IFwKKyAgICAgICAgICAgIGlmIChjaHVuayA+IGhhdmUpIHsgXAorICAgICAgICAgICAgICAgIGNodW5rID0gaGF2ZSA9IDA7IFwKKyAgICAgICAgICAgICAgICBicmVhazsgXAorICAgICAgICAgICAgfSBcCisgICAgICAgIH0gXAorICAgICAgICBoYXZlIC09IGNodW5rOyBcCisgICAgICAgIG5leHQgKz0gY2h1bms7IFwKKyAgICAgICAgY2h1bmsgPSAwOyBcCisgICAgfSB3aGlsZSAoMCkKKworLyogRGVjb21wcmVzcyBhIGNvbXByZXNzIChMWlcpIGZpbGUgZnJvbSBpbmRwIHRvIG91dGZpbGUuICBUaGUgY29tcHJlc3MgbWFnaWMKKyAgIGhlYWRlciAodHdvIGJ5dGVzKSBoYXMgYWxyZWFkeSBiZWVuIHJlYWQgYW5kIHZlcmlmaWVkLiAgVGhlcmUgYXJlIGhhdmUgYnl0ZXMKKyAgIG9mIGJ1ZmZlcmVkIGlucHV0IGF0IG5leHQuICBzdHJtIGlzIHVzZWQgZm9yIHBhc3NpbmcgZXJyb3IgaW5mb3JtYXRpb24gYmFjaworICAgdG8gZ3VucGlwZSgpLgorCisgICBsdW5waXBlKCkgd2lsbCByZXR1cm4gWl9PSyBvbiBzdWNjZXNzLCBaX0JVRl9FUlJPUiBmb3IgYW4gdW5leHBlY3RlZCBlbmQgb2YKKyAgIGZpbGUsIHJlYWQgZXJyb3IsIG9yIHdyaXRlIGVycm9yIChhIHdyaXRlIGVycm9yIGluZGljYXRlZCBieSBzdHJtLT5uZXh0X2luCisgICBub3QgZXF1YWwgdG8gWl9OVUxMKSwgb3IgWl9EQVRBX0VSUk9SIGZvciBpbnZhbGlkIGlucHV0LgorICovCitsb2NhbCBpbnQgbHVucGlwZSh1bnNpZ25lZCBoYXZlLCB1bnNpZ25lZCBjaGFyICpuZXh0LCBzdHJ1Y3QgaW5kICppbmRwLAorICAgICAgICAgICAgICAgICAgaW50IG91dGZpbGUsIHpfc3RyZWFtICpzdHJtKQoreworICAgIGludCBsYXN0OyAgICAgICAgICAgICAgICAgICAvKiBsYXN0IGJ5dGUgcmVhZCBieSBORVhUKCksIG9yIC0xIGlmIEVPRiAqLworICAgIHVuc2lnbmVkIGNodW5rOyAgICAgICAgICAgICAvKiBieXRlcyBsZWZ0IGluIGN1cnJlbnQgY2h1bmsgKi8KKyAgICBpbnQgbGVmdDsgICAgICAgICAgICAgICAgICAgLyogYml0cyBsZWZ0IGluIHJlbSAqLworICAgIHVuc2lnbmVkIHJlbTsgICAgICAgICAgICAgICAvKiB1bnVzZWQgYml0cyBmcm9tIGlucHV0ICovCisgICAgaW50IGJpdHM7ICAgICAgICAgICAgICAgICAgIC8qIGN1cnJlbnQgYml0cyBwZXIgY29kZSAqLworICAgIHVuc2lnbmVkIGNvZGU7ICAgICAgICAgICAgICAvKiBjb2RlLCB0YWJsZSB0cmF2ZXJzYWwgaW5kZXggKi8KKyAgICB1bnNpZ25lZCBtYXNrOyAgICAgICAgICAgICAgLyogbWFzayBmb3IgY3VycmVudCBiaXRzIGNvZGVzICovCisgICAgaW50IG1heDsgICAgICAgICAgICAgICAgICAgIC8qIG1heGltdW0gYml0cyBwZXIgY29kZSBmb3IgdGhpcyBzdHJlYW0gKi8KKyAgICB1bnNpZ25lZCBmbGFnczsgICAgICAgICAgICAgLyogY29tcHJlc3MgZmxhZ3MsIHRoZW4gYmxvY2sgY29tcHJlc3MgZmxhZyAqLworICAgIHVuc2lnbmVkIGVuZDsgICAgICAgICAgICAgICAvKiBsYXN0IHZhbGlkIGVudHJ5IGluIHByZWZpeC9zdWZmaXggdGFibGVzICovCisgICAgdW5zaWduZWQgdGVtcDsgICAgICAgICAgICAgIC8qIGN1cnJlbnQgY29kZSAqLworICAgIHVuc2lnbmVkIHByZXY7ICAgICAgICAgICAgICAvKiBwcmV2aW91cyBjb2RlICovCisgICAgdW5zaWduZWQgZmluYWw7ICAgICAgICAgICAgIC8qIGxhc3QgY2hhcmFjdGVyIHdyaXR0ZW4gZm9yIHByZXZpb3VzIGNvZGUgKi8KKyAgICB1bnNpZ25lZCBzdGFjazsgICAgICAgICAgICAgLyogbmV4dCBwb3NpdGlvbiBmb3IgcmV2ZXJzZWQgc3RyaW5nICovCisgICAgdW5zaWduZWQgb3V0Y250OyAgICAgICAgICAgIC8qIGJ5dGVzIGluIG91dHB1dCBidWZmZXIgKi8KKyAgICBzdHJ1Y3Qgb3V0ZCBvdXRkOyAgICAgICAgICAgLyogb3V0cHV0IHN0cnVjdHVyZSAqLworICAgIHVuc2lnbmVkIGNoYXIgKnA7CisKKyAgICAvKiBzZXQgdXAgb3V0cHV0ICovCisgICAgb3V0ZC5vdXRmaWxlID0gb3V0ZmlsZTsKKyAgICBvdXRkLmNoZWNrID0gMDsKKworICAgIC8qIHByb2Nlc3MgcmVtYWluZGVyIG9mIGNvbXByZXNzIGhlYWRlciAtLSBhIGZsYWdzIGJ5dGUgKi8KKyAgICBmbGFncyA9IE5FWFQoKTsKKyAgICBpZiAobGFzdCA9PSAtMSkKKyAgICAgICAgcmV0dXJuIFpfQlVGX0VSUk9SOworICAgIGlmIChmbGFncyAmIDB4NjApIHsKKyAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikidW5rbm93biBsencgZmxhZ3Mgc2V0IjsKKyAgICAgICAgcmV0dXJuIFpfREFUQV9FUlJPUjsKKyAgICB9CisgICAgbWF4ID0gZmxhZ3MgJiAweDFmOworICAgIGlmIChtYXggPCA5IHx8IG1heCA+IDE2KSB7CisgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImx6dyBiaXRzIG91dCBvZiByYW5nZSI7CisgICAgICAgIHJldHVybiBaX0RBVEFfRVJST1I7CisgICAgfQorICAgIGlmIChtYXggPT0gOSkgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA5IGRvZXNuJ3QgcmVhbGx5IG1lYW4gOSAqLworICAgICAgICBtYXggPSAxMDsKKyAgICBmbGFncyAmPSAweDgwOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHJ1ZSBpZiBibG9jayBjb21wcmVzcyAqLworCisgICAgLyogY2xlYXIgdGFibGUgKi8KKyAgICBiaXRzID0gOTsKKyAgICBtYXNrID0gMHgxZmY7CisgICAgZW5kID0gZmxhZ3MgPyAyNTYgOiAyNTU7CisKKyAgICAvKiBzZXQgdXA6IGdldCBmaXJzdCA5LWJpdCBjb2RlLCB3aGljaCBpcyB0aGUgZmlyc3QgZGVjb21wcmVzc2VkIGJ5dGUsIGJ1dAorICAgICAgIGRvbid0IGNyZWF0ZSBhIHRhYmxlIGVudHJ5IHVudGlsIHRoZSBuZXh0IGNvZGUgKi8KKyAgICBpZiAoTkVYVCgpID09IC0xKSAgICAgICAgICAgICAgICAgICAgICAgLyogbm8gY29tcHJlc3NlZCBkYXRhIGlzIG9rICovCisgICAgICAgIHJldHVybiBaX09LOworICAgIGZpbmFsID0gcHJldiA9ICh1bnNpZ25lZClsYXN0OyAgICAgICAgICAvKiBsb3cgOCBiaXRzIG9mIGNvZGUgKi8KKyAgICBpZiAoTkVYVCgpID09IC0xKSAgICAgICAgICAgICAgICAgICAgICAgLyogbWlzc2luZyBhIGJpdCAqLworICAgICAgICByZXR1cm4gWl9CVUZfRVJST1I7CisgICAgaWYgKGxhc3QgJiAxKSB7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvZGUgbXVzdCBiZSA8IDI1NiAqLworICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGx6dyBjb2RlIjsKKyAgICAgICAgcmV0dXJuIFpfREFUQV9FUlJPUjsKKyAgICB9CisgICAgcmVtID0gKHVuc2lnbmVkKWxhc3QgPj4gMTsgICAgICAgICAgICAgIC8qIHJlbWFpbmluZyA3IGJpdHMgKi8KKyAgICBsZWZ0ID0gNzsKKyAgICBjaHVuayA9IGJpdHMgLSAyOyAgICAgICAgICAgICAgICAgICAgICAgLyogNyBieXRlcyBsZWZ0IGluIHRoaXMgY2h1bmsgKi8KKyAgICBvdXRidWZbMF0gPSAodW5zaWduZWQgY2hhcilmaW5hbDsgICAgICAgLyogd3JpdGUgZmlyc3QgZGVjb21wcmVzc2VkIGJ5dGUgKi8KKyAgICBvdXRjbnQgPSAxOworCisgICAgLyogZGVjb2RlIGNvZGVzICovCisgICAgc3RhY2sgPSAwOworICAgIGZvciAoOzspIHsKKyAgICAgICAgLyogaWYgdGhlIHRhYmxlIHdpbGwgYmUgZnVsbCBhZnRlciB0aGlzLCBpbmNyZW1lbnQgdGhlIGNvZGUgc2l6ZSAqLworICAgICAgICBpZiAoZW5kID49IG1hc2sgJiYgYml0cyA8IG1heCkgeworICAgICAgICAgICAgRkxVU0hDT0RFKCk7CisgICAgICAgICAgICBiaXRzKys7CisgICAgICAgICAgICBtYXNrIDw8PSAxOworICAgICAgICAgICAgbWFzaysrOworICAgICAgICB9CisKKyAgICAgICAgLyogZ2V0IGEgY29kZSBvZiBsZW5ndGggYml0cyAqLworICAgICAgICBpZiAoY2h1bmsgPT0gMCkgICAgICAgICAgICAgICAgICAgICAvKiBkZWNyZW1lbnQgY2h1bmsgbW9kdWxvIGJpdHMgKi8KKyAgICAgICAgICAgIGNodW5rID0gYml0czsKKyAgICAgICAgY29kZSA9IHJlbTsgICAgICAgICAgICAgICAgICAgICAgICAgLyogbG93IGJpdHMgb2YgY29kZSAqLworICAgICAgICBpZiAoTkVYVCgpID09IC0xKSB7ICAgICAgICAgICAgICAgICAvKiBFT0YgaXMgZW5kIG9mIGNvbXByZXNzZWQgZGF0YSAqLworICAgICAgICAgICAgLyogd3JpdGUgcmVtYWluaW5nIGJ1ZmZlcmVkIG91dHB1dCAqLworICAgICAgICAgICAgaWYgKG91dGNudCAmJiBvdXQoJm91dGQsIG91dGJ1Ziwgb3V0Y250KSkgeworICAgICAgICAgICAgICAgIHN0cm0tPm5leHRfaW4gPSBvdXRidWY7ICAgICAvKiBzaWduYWwgd3JpdGUgZXJyb3IgKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gWl9CVUZfRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gWl9PSzsKKyAgICAgICAgfQorICAgICAgICBjb2RlICs9ICh1bnNpZ25lZClsYXN0IDw8IGxlZnQ7ICAgICAvKiBtaWRkbGUgKG9yIGhpZ2gpIGJpdHMgb2YgY29kZSAqLworICAgICAgICBsZWZ0ICs9IDg7CisgICAgICAgIGNodW5rLS07CisgICAgICAgIGlmIChiaXRzID4gbGVmdCkgeyAgICAgICAgICAgICAgICAgIC8qIG5lZWQgbW9yZSBiaXRzICovCisgICAgICAgICAgICBpZiAoTkVYVCgpID09IC0xKSAgICAgICAgICAgICAgIC8qIGNhbid0IGVuZCBpbiBtaWRkbGUgb2YgY29kZSAqLworICAgICAgICAgICAgICAgIHJldHVybiBaX0JVRl9FUlJPUjsKKyAgICAgICAgICAgIGNvZGUgKz0gKHVuc2lnbmVkKWxhc3QgPDwgbGVmdDsgLyogaGlnaCBiaXRzIG9mIGNvZGUgKi8KKyAgICAgICAgICAgIGxlZnQgKz0gODsKKyAgICAgICAgICAgIGNodW5rLS07CisgICAgICAgIH0KKyAgICAgICAgY29kZSAmPSBtYXNrOyAgICAgICAgICAgICAgICAgICAgICAgLyogbWFzayB0byBjdXJyZW50IGNvZGUgbGVuZ3RoICovCisgICAgICAgIGxlZnQgLT0gYml0czsgICAgICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiB1bnVzZWQgYml0cyAqLworICAgICAgICByZW0gPSAodW5zaWduZWQpbGFzdCA+PiAoOCAtIGxlZnQpOyAvKiB1bnVzZWQgYml0cyBmcm9tIGxhc3QgYnl0ZSAqLworCisgICAgICAgIC8qIHByb2Nlc3MgY2xlYXIgY29kZSAoMjU2KSAqLworICAgICAgICBpZiAoY29kZSA9PSAyNTYgJiYgZmxhZ3MpIHsKKyAgICAgICAgICAgIEZMVVNIQ09ERSgpOworICAgICAgICAgICAgYml0cyA9IDk7ICAgICAgICAgICAgICAgICAgICAgICAvKiBpbml0aWFsaXplIGJpdHMgYW5kIG1hc2sgKi8KKyAgICAgICAgICAgIG1hc2sgPSAweDFmZjsKKyAgICAgICAgICAgIGVuZCA9IDI1NTsgICAgICAgICAgICAgICAgICAgICAgLyogZW1wdHkgdGFibGUgKi8KKyAgICAgICAgICAgIGNvbnRpbnVlOyAgICAgICAgICAgICAgICAgICAgICAgLyogZ2V0IG5leHQgY29kZSAqLworICAgICAgICB9CisKKyAgICAgICAgLyogc3BlY2lhbCBjb2RlIHRvIHJldXNlIGxhc3QgbWF0Y2ggKi8KKyAgICAgICAgdGVtcCA9IGNvZGU7ICAgICAgICAgICAgICAgICAgICAgICAgLyogc2F2ZSB0aGUgY3VycmVudCBjb2RlICovCisgICAgICAgIGlmIChjb2RlID4gZW5kKSB7CisgICAgICAgICAgICAvKiBCZSBwaWNreSBvbiB0aGUgYWxsb3dlZCBjb2RlIGhlcmUsIGFuZCBtYWtlIHN1cmUgdGhhdCB0aGUgY29kZQorICAgICAgICAgICAgICAgd2UgZHJvcCB0aHJvdWdoIChwcmV2KSB3aWxsIGJlIGEgdmFsaWQgaW5kZXggc28gdGhhdCByYW5kb20KKyAgICAgICAgICAgICAgIGlucHV0IGRvZXMgbm90IGNhdXNlIGFuIGV4Y2VwdGlvbi4gIFRoZSBjb2RlICE9IGVuZCArIDEgY2hlY2sgaXMKKyAgICAgICAgICAgICAgIGVtcGlyaWNhbGx5IGRlcml2ZWQsIGFuZCBub3QgY2hlY2tlZCBpbiB0aGUgb3JpZ2luYWwgdW5jb21wcmVzcworICAgICAgICAgICAgICAgY29kZS4gIElmIHRoaXMgZXZlciBjYXVzZXMgYSBwcm9ibGVtLCB0aGF0IGNoZWNrIGNvdWxkIGJlIHNhZmVseQorICAgICAgICAgICAgICAgcmVtb3ZlZC4gIExlYXZpbmcgdGhpcyBjaGVjayBpbiBncmVhdGx5IGltcHJvdmVzIGd1bidzIGFiaWxpdHkKKyAgICAgICAgICAgICAgIHRvIGRldGVjdCByYW5kb20gb3IgY29ycnVwdGVkIGlucHV0IGFmdGVyIGEgY29tcHJlc3MgaGVhZGVyLgorICAgICAgICAgICAgICAgSW4gYW55IGNhc2UsIHRoZSBwcmV2ID4gZW5kIGNoZWNrIG11c3QgYmUgcmV0YWluZWQuICovCisgICAgICAgICAgICBpZiAoY29kZSAhPSBlbmQgKyAxIHx8IHByZXYgPiBlbmQpIHsKKyAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGx6dyBjb2RlIjsKKyAgICAgICAgICAgICAgICByZXR1cm4gWl9EQVRBX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2hbc3RhY2srK10gPSAodW5zaWduZWQgY2hhcilmaW5hbDsKKyAgICAgICAgICAgIGNvZGUgPSBwcmV2OworICAgICAgICB9CisKKyAgICAgICAgLyogd2FsayB0aHJvdWdoIGxpbmtlZCBsaXN0IHRvIGdlbmVyYXRlIG91dHB1dCBpbiByZXZlcnNlIG9yZGVyICovCisgICAgICAgIHAgPSBtYXRjaCArIHN0YWNrOworICAgICAgICB3aGlsZSAoY29kZSA+PSAyNTYpIHsKKyAgICAgICAgICAgICpwKysgPSBzdWZmaXhbY29kZV07CisgICAgICAgICAgICBjb2RlID0gcHJlZml4W2NvZGVdOworICAgICAgICB9CisgICAgICAgIHN0YWNrID0gcCAtIG1hdGNoOworICAgICAgICBtYXRjaFtzdGFjaysrXSA9ICh1bnNpZ25lZCBjaGFyKWNvZGU7CisgICAgICAgIGZpbmFsID0gY29kZTsKKworICAgICAgICAvKiBsaW5rIG5ldyB0YWJsZSBlbnRyeSAqLworICAgICAgICBpZiAoZW5kIDwgbWFzaykgeworICAgICAgICAgICAgZW5kKys7CisgICAgICAgICAgICBwcmVmaXhbZW5kXSA9ICh1bnNpZ25lZCBzaG9ydClwcmV2OworICAgICAgICAgICAgc3VmZml4W2VuZF0gPSAodW5zaWduZWQgY2hhcilmaW5hbDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHNldCBwcmV2aW91cyBjb2RlIGZvciBuZXh0IGl0ZXJhdGlvbiAqLworICAgICAgICBwcmV2ID0gdGVtcDsKKworICAgICAgICAvKiB3cml0ZSBvdXRwdXQgaW4gZm9yd2FyZCBvcmRlciAqLworICAgICAgICB3aGlsZSAoc3RhY2sgPiBTSVpFIC0gb3V0Y250KSB7CisgICAgICAgICAgICB3aGlsZSAob3V0Y250IDwgU0laRSkKKyAgICAgICAgICAgICAgICBvdXRidWZbb3V0Y250KytdID0gbWF0Y2hbLS1zdGFja107CisgICAgICAgICAgICBpZiAob3V0KCZvdXRkLCBvdXRidWYsIG91dGNudCkpIHsKKyAgICAgICAgICAgICAgICBzdHJtLT5uZXh0X2luID0gb3V0YnVmOyAvKiBzaWduYWwgd3JpdGUgZXJyb3IgKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gWl9CVUZfRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdXRjbnQgPSAwOworICAgICAgICB9CisgICAgICAgIHAgPSBtYXRjaCArIHN0YWNrOworICAgICAgICBkbyB7CisgICAgICAgICAgICBvdXRidWZbb3V0Y250KytdID0gKi0tcDsKKyAgICAgICAgfSB3aGlsZSAocCA+IG1hdGNoKTsKKyAgICAgICAgc3RhY2sgPSAwOworCisgICAgICAgIC8qIGxvb3AgZm9yIG5leHQgY29kZSB3aXRoIGZpbmFsIGFuZCBwcmV2IGFzIHRoZSBsYXN0IG1hdGNoLCByZW0gYW5kCisgICAgICAgICAgIGxlZnQgcHJvdmlkZSB0aGUgZmlyc3QgMC4uNyBiaXRzIG9mIHRoZSBuZXh0IGNvZGUsIGVuZCBpcyB0aGUgbGFzdAorICAgICAgICAgICB2YWxpZCB0YWJsZSBlbnRyeSAqLworICAgIH0KK30KKworLyogRGVjb21wcmVzcyBhIGd6aXAgZmlsZSBmcm9tIGluZmlsZSB0byBvdXRmaWxlLiAgc3RybSBpcyBhc3N1bWVkIHRvIGhhdmUgYmVlbgorICAgc3VjY2Vzc2Z1bGx5IGluaXRpYWxpemVkIHdpdGggaW5mbGF0ZUJhY2tJbml0KCkuICBUaGUgaW5wdXQgZmlsZSBtYXkgY29uc2lzdAorICAgb2YgYSBzZXJpZXMgb2YgZ3ppcCBzdHJlYW1zLCBpbiB3aGljaCBjYXNlIGFsbCBvZiB0aGVtIHdpbGwgYmUgZGVjb21wcmVzc2VkCisgICB0byB0aGUgb3V0cHV0IGZpbGUuICBJZiBvdXRmaWxlIGlzIC0xLCB0aGVuIHRoZSBnemlwIHN0cmVhbShzKSBpbnRlZ3JpdHkgaXMKKyAgIGNoZWNrZWQgYW5kIG5vdGhpbmcgaXMgd3JpdHRlbi4KKworICAgVGhlIHJldHVybiB2YWx1ZSBpcyBhIHpsaWIgZXJyb3IgY29kZTogWl9NRU1fRVJST1IgaWYgb3V0IG9mIG1lbW9yeSwKKyAgIFpfREFUQV9FUlJPUiBpZiB0aGUgaGVhZGVyIG9yIHRoZSBjb21wcmVzc2VkIGRhdGEgaXMgaW52YWxpZCwgb3IgaWYgdGhlCisgICB0cmFpbGVyIENSQy0zMiBjaGVjayBvciBsZW5ndGggZG9lc24ndCBtYXRjaCwgWl9CVUZfRVJST1IgaWYgdGhlIGlucHV0IGVuZHMKKyAgIHByZW1hdHVyZWx5IG9yIGEgd3JpdGUgZXJyb3Igb2NjdXJzLCBvciBaX0VSUk5PIGlmIGp1bmsgKG5vdCBhIGFub3RoZXIgZ3ppcAorICAgc3RyZWFtKSBmb2xsb3dzIGEgdmFsaWQgZ3ppcCBzdHJlYW0uCisgKi8KK2xvY2FsIGludCBndW5waXBlKHpfc3RyZWFtICpzdHJtLCBpbnQgaW5maWxlLCBpbnQgb3V0ZmlsZSkKK3sKKyAgICBpbnQgcmV0LCBmaXJzdCwgbGFzdDsKKyAgICB1bnNpZ25lZCBoYXZlLCBmbGFncywgbGVuOworICAgIHVuc2lnbmVkIGNoYXIgKm5leHQgPSBOVUxMOworICAgIHN0cnVjdCBpbmQgaW5kLCAqaW5kcDsKKyAgICBzdHJ1Y3Qgb3V0ZCBvdXRkOworCisgICAgLyogc2V0dXAgaW5wdXQgYnVmZmVyICovCisgICAgaW5kLmluZmlsZSA9IGluZmlsZTsKKyAgICBpbmQuaW5idWYgPSBpbmJ1ZjsKKyAgICBpbmRwID0gJmluZDsKKworICAgIC8qIGRlY29tcHJlc3MgY29uY2F0ZW5hdGVkIGd6aXAgc3RyZWFtcyAqLworICAgIGhhdmUgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBubyBpbnB1dCBkYXRhIHJlYWQgaW4geWV0ICovCisgICAgZmlyc3QgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxvb2tpbmcgZm9yIGZpcnN0IGd6aXAgaGVhZGVyICovCisgICAgc3RybS0+bmV4dF9pbiA9IFpfTlVMTDsgICAgICAgICAgICAgICAgIC8qIHNvIFpfQlVGX0VSUk9SIG1lYW5zIEVPRiAqLworICAgIGZvciAoOzspIHsKKyAgICAgICAgLyogbG9vayBmb3IgdGhlIHR3byBtYWdpYyBoZWFkZXIgYnl0ZXMgZm9yIGEgZ3ppcCBzdHJlYW0gKi8KKyAgICAgICAgaWYgKE5FWFQoKSA9PSAtMSkgeworICAgICAgICAgICAgcmV0ID0gWl9PSzsKKyAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZW1wdHkgZ3ppcCBzdHJlYW0gaXMgb2sgKi8KKyAgICAgICAgfQorICAgICAgICBpZiAobGFzdCAhPSAzMSB8fCAoTkVYVCgpICE9IDEzOSAmJiBsYXN0ICE9IDE1NykpIHsKKyAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImluY29ycmVjdCBoZWFkZXIgY2hlY2siOworICAgICAgICAgICAgcmV0ID0gZmlyc3QgPyBaX0RBVEFfRVJST1IgOiBaX0VSUk5POworICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBub3QgYSBnemlwIG9yIGNvbXByZXNzIGhlYWRlciAqLworICAgICAgICB9CisgICAgICAgIGZpcnN0ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5leHQgbm9uLWhlYWRlciBpcyBqdW5rICovCisKKyAgICAgICAgLyogcHJvY2VzcyBhIGNvbXByZXNzIChMWlcpIGZpbGUgLS0gY2FuJ3QgYmUgY29uY2F0ZW5hdGVkIGFmdGVyIHRoaXMgKi8KKyAgICAgICAgaWYgKGxhc3QgPT0gMTU3KSB7CisgICAgICAgICAgICByZXQgPSBsdW5waXBlKGhhdmUsIG5leHQsIGluZHAsIG91dGZpbGUsIHN0cm0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvKiBwcm9jZXNzIHJlbWFpbmRlciBvZiBnemlwIGhlYWRlciAqLworICAgICAgICByZXQgPSBaX0JVRl9FUlJPUjsKKyAgICAgICAgaWYgKE5FWFQoKSAhPSA4KSB7ICAgICAgICAgICAgICAgICAgLyogb25seSBkZWZsYXRlIG1ldGhvZCBhbGxvd2VkICovCisgICAgICAgICAgICBpZiAobGFzdCA9PSAtMSkgYnJlYWs7CisgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJ1bmtub3duIGNvbXByZXNzaW9uIG1ldGhvZCI7CisgICAgICAgICAgICByZXQgPSBaX0RBVEFfRVJST1I7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBmbGFncyA9IE5FWFQoKTsgICAgICAgICAgICAgICAgICAgICAvKiBoZWFkZXIgZmxhZ3MgKi8KKyAgICAgICAgTkVYVCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGlzY2FyZCBtb2QgdGltZSwgeGZsZ3MsIG9zICovCisgICAgICAgIE5FWFQoKTsKKyAgICAgICAgTkVYVCgpOworICAgICAgICBORVhUKCk7CisgICAgICAgIE5FWFQoKTsKKyAgICAgICAgTkVYVCgpOworICAgICAgICBpZiAobGFzdCA9PSAtMSkgYnJlYWs7CisgICAgICAgIGlmIChmbGFncyAmIDB4ZTApIHsKKyAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopInVua25vd24gaGVhZGVyIGZsYWdzIHNldCI7CisgICAgICAgICAgICByZXQgPSBaX0RBVEFfRVJST1I7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoZmxhZ3MgJiA0KSB7ICAgICAgICAgICAgICAgICAgICAvKiBleHRyYSBmaWVsZCAqLworICAgICAgICAgICAgbGVuID0gTkVYVCgpOworICAgICAgICAgICAgbGVuICs9ICh1bnNpZ25lZCkoTkVYVCgpKSA8PCA4OworICAgICAgICAgICAgaWYgKGxhc3QgPT0gLTEpIGJyZWFrOworICAgICAgICAgICAgd2hpbGUgKGxlbiA+IGhhdmUpIHsKKyAgICAgICAgICAgICAgICBsZW4gLT0gaGF2ZTsKKyAgICAgICAgICAgICAgICBoYXZlID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoTkVYVCgpID09IC0xKSBicmVhazsKKyAgICAgICAgICAgICAgICBsZW4tLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChsYXN0ID09IC0xKSBicmVhazsKKyAgICAgICAgICAgIGhhdmUgLT0gbGVuOworICAgICAgICAgICAgbmV4dCArPSBsZW47CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZsYWdzICYgOCkgICAgICAgICAgICAgICAgICAgICAgLyogZmlsZSBuYW1lICovCisgICAgICAgICAgICB3aGlsZSAoTkVYVCgpICE9IDAgJiYgbGFzdCAhPSAtMSkKKyAgICAgICAgICAgICAgICA7CisgICAgICAgIGlmIChmbGFncyAmIDE2KSAgICAgICAgICAgICAgICAgICAgIC8qIGNvbW1lbnQgKi8KKyAgICAgICAgICAgIHdoaWxlIChORVhUKCkgIT0gMCAmJiBsYXN0ICE9IC0xKQorICAgICAgICAgICAgICAgIDsKKyAgICAgICAgaWYgKGZsYWdzICYgMikgeyAgICAgICAgICAgICAgICAgICAgLyogaGVhZGVyIGNyYyAqLworICAgICAgICAgICAgTkVYVCgpOworICAgICAgICAgICAgTkVYVCgpOworICAgICAgICB9CisgICAgICAgIGlmIChsYXN0ID09IC0xKSBicmVhazsKKworICAgICAgICAvKiBzZXQgdXAgb3V0cHV0ICovCisgICAgICAgIG91dGQub3V0ZmlsZSA9IG91dGZpbGU7CisgICAgICAgIG91dGQuY2hlY2sgPSAxOworICAgICAgICBvdXRkLmNyYyA9IGNyYzMyKDBMLCBaX05VTEwsIDApOworICAgICAgICBvdXRkLnRvdGFsID0gMDsKKworICAgICAgICAvKiBkZWNvbXByZXNzIGRhdGEgdG8gb3V0cHV0ICovCisgICAgICAgIHN0cm0tPm5leHRfaW4gPSBuZXh0OworICAgICAgICBzdHJtLT5hdmFpbF9pbiA9IGhhdmU7CisgICAgICAgIHJldCA9IGluZmxhdGVCYWNrKHN0cm0sIGluLCBpbmRwLCBvdXQsICZvdXRkKTsKKyAgICAgICAgaWYgKHJldCAhPSBaX1NUUkVBTV9FTkQpIGJyZWFrOworICAgICAgICBuZXh0ID0gc3RybS0+bmV4dF9pbjsKKyAgICAgICAgaGF2ZSA9IHN0cm0tPmF2YWlsX2luOworICAgICAgICBzdHJtLT5uZXh0X2luID0gWl9OVUxMOyAgICAgICAgICAgICAvKiBzbyBaX0JVRl9FUlJPUiBtZWFucyBFT0YgKi8KKworICAgICAgICAvKiBjaGVjayB0cmFpbGVyICovCisgICAgICAgIHJldCA9IFpfQlVGX0VSUk9SOworICAgICAgICBpZiAoTkVYVCgpICE9IChpbnQpKG91dGQuY3JjICYgMHhmZikgfHwKKyAgICAgICAgICAgIE5FWFQoKSAhPSAoaW50KSgob3V0ZC5jcmMgPj4gOCkgJiAweGZmKSB8fAorICAgICAgICAgICAgTkVYVCgpICE9IChpbnQpKChvdXRkLmNyYyA+PiAxNikgJiAweGZmKSB8fAorICAgICAgICAgICAgTkVYVCgpICE9IChpbnQpKChvdXRkLmNyYyA+PiAyNCkgJiAweGZmKSkgeworICAgICAgICAgICAgLyogY3JjIGVycm9yICovCisgICAgICAgICAgICBpZiAobGFzdCAhPSAtMSkgeworICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImluY29ycmVjdCBkYXRhIGNoZWNrIjsKKyAgICAgICAgICAgICAgICByZXQgPSBaX0RBVEFfRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoTkVYVCgpICE9IChpbnQpKG91dGQudG90YWwgJiAweGZmKSB8fAorICAgICAgICAgICAgTkVYVCgpICE9IChpbnQpKChvdXRkLnRvdGFsID4+IDgpICYgMHhmZikgfHwKKyAgICAgICAgICAgIE5FWFQoKSAhPSAoaW50KSgob3V0ZC50b3RhbCA+PiAxNikgJiAweGZmKSB8fAorICAgICAgICAgICAgTkVYVCgpICE9IChpbnQpKChvdXRkLnRvdGFsID4+IDI0KSAmIDB4ZmYpKSB7CisgICAgICAgICAgICAvKiBsZW5ndGggZXJyb3IgKi8KKyAgICAgICAgICAgIGlmIChsYXN0ICE9IC0xKSB7CisgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW5jb3JyZWN0IGxlbmd0aCBjaGVjayI7CisgICAgICAgICAgICAgICAgcmV0ID0gWl9EQVRBX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvKiBnbyBiYWNrIGFuZCBsb29rIGZvciBhbm90aGVyIGd6aXAgc3RyZWFtICovCisgICAgfQorCisgICAgLyogY2xlYW4gdXAgYW5kIHJldHVybiAqLworICAgIHJldHVybiByZXQ7Cit9CisKKy8qIENvcHkgZmlsZSBhdHRyaWJ1dGVzLCBmcm9tIC0+IHRvLCBhcyBiZXN0IHdlIGNhbi4gIFRoaXMgaXMgYmVzdCBlZmZvcnQsIHNvCisgICBubyBlcnJvcnMgYXJlIHJlcG9ydGVkLiAgVGhlIG1vZGUgYml0cywgaW5jbHVkaW5nIHN1aWQsIHNnaWQsIGFuZCB0aGUgc3RpY2t5CisgICBiaXQgYXJlIGNvcGllZCAoaWYgYWxsb3dlZCksIHRoZSBvd25lcidzIHVzZXIgaWQgYW5kIGdyb3VwIGlkIGFyZSBjb3BpZWQKKyAgIChhZ2FpbiBpZiBhbGxvd2VkKSwgYW5kIHRoZSBhY2Nlc3MgYW5kIG1vZGlmeSB0aW1lcyBhcmUgY29waWVkLiAqLworbG9jYWwgdm9pZCBjb3B5bWV0YShjaGFyICpmcm9tLCBjaGFyICp0bykKK3sKKyAgICBzdHJ1Y3Qgc3RhdCB3YXM7CisgICAgc3RydWN0IHV0aW1idWYgd2hlbjsKKworICAgIC8qIGdldCBhbGwgb2YgZnJvbSdzIFVuaXggbWV0YSBkYXRhLCByZXR1cm4gaWYgbm90IGEgcmVndWxhciBmaWxlICovCisgICAgaWYgKHN0YXQoZnJvbSwgJndhcykgIT0gMCB8fCAod2FzLnN0X21vZGUgJiBTX0lGTVQpICE9IFNfSUZSRUcpCisgICAgICAgIHJldHVybjsKKworICAgIC8qIHNldCB0bydzIG1vZGUgYml0cywgaWdub3JlIGVycm9ycyAqLworICAgICh2b2lkKWNobW9kKHRvLCB3YXMuc3RfbW9kZSAmIDA3Nzc3KTsKKworICAgIC8qIGNvcHkgb3duZXIncyB1c2VyIGFuZCBncm91cCwgaWdub3JlIGVycm9ycyAqLworICAgICh2b2lkKWNob3duKHRvLCB3YXMuc3RfdWlkLCB3YXMuc3RfZ2lkKTsKKworICAgIC8qIGNvcHkgYWNjZXNzIGFuZCBtb2RpZnkgdGltZXMsIGlnbm9yZSBlcnJvcnMgKi8KKyAgICB3aGVuLmFjdGltZSA9IHdhcy5zdF9hdGltZTsKKyAgICB3aGVuLm1vZHRpbWUgPSB3YXMuc3RfbXRpbWU7CisgICAgKHZvaWQpdXRpbWUodG8sICZ3aGVuKTsKK30KKworLyogRGVjb21wcmVzcyB0aGUgZmlsZSBpbm5hbWUgdG8gdGhlIGZpbGUgb3V0bm5hbWUsIG9mIGlmIHRlc3QgaXMgdHJ1ZSwganVzdAorICAgZGVjb21wcmVzcyB3aXRob3V0IHdyaXRpbmcgYW5kIGNoZWNrIHRoZSBnemlwIHRyYWlsZXIgZm9yIGludGVncml0eS4gIElmCisgICBpbm5hbWUgaXMgTlVMTCBvciBhbiBlbXB0eSBzdHJpbmcsIHJlYWQgZnJvbSBzdGRpbi4gIElmIG91dG5hbWUgaXMgTlVMTCBvcgorICAgYW4gZW1wdHkgc3RyaW5nLCB3cml0ZSB0byBzdGRvdXQuICBzdHJtIGlzIGEgcHJlLWluaXRpYWxpemVkIGluZmxhdGVCYWNrCisgICBzdHJ1Y3R1cmUuICBXaGVuIGFwcHJvcHJpYXRlLCBjb3B5IHRoZSBmaWxlIGF0dHJpYnV0ZXMgZnJvbSBpbm5hbWUgdG8KKyAgIG91dG5hbWUuCisKKyAgIGd1bnppcCgpIHJldHVybnMgMSBpZiB0aGVyZSBpcyBhbiBvdXQtb2YtbWVtb3J5IGVycm9yIG9yIGFuIHVuZXhwZWN0ZWQKKyAgIHJldHVybiBjb2RlIGZyb20gZ3VucGlwZSgpLiAgT3RoZXJ3aXNlIGl0IHJldHVybnMgMC4KKyAqLworbG9jYWwgaW50IGd1bnppcCh6X3N0cmVhbSAqc3RybSwgY2hhciAqaW5uYW1lLCBjaGFyICpvdXRuYW1lLCBpbnQgdGVzdCkKK3sKKyAgICBpbnQgcmV0OworICAgIGludCBpbmZpbGUsIG91dGZpbGU7CisKKyAgICAvKiBvcGVuIGZpbGVzICovCisgICAgaWYgKGlubmFtZSA9PSBOVUxMIHx8ICppbm5hbWUgPT0gMCkgeworICAgICAgICBpbm5hbWUgPSAiLSI7CisgICAgICAgIGluZmlsZSA9IDA7ICAgICAvKiBzdGRpbiAqLworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaW5maWxlID0gb3Blbihpbm5hbWUsIE9fUkRPTkxZLCAwKTsKKyAgICAgICAgaWYgKGluZmlsZSA9PSAtMSkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJndW4gY2Fubm90IG9wZW4gJXNcbiIsIGlubmFtZSk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAodGVzdCkKKyAgICAgICAgb3V0ZmlsZSA9IC0xOworICAgIGVsc2UgaWYgKG91dG5hbWUgPT0gTlVMTCB8fCAqb3V0bmFtZSA9PSAwKSB7CisgICAgICAgIG91dG5hbWUgPSAiLSI7CisgICAgICAgIG91dGZpbGUgPSAxOyAgICAvKiBzdGRvdXQgKi8KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIG91dGZpbGUgPSBvcGVuKG91dG5hbWUsIE9fQ1JFQVQgfCBPX1RSVU5DIHwgT19XUk9OTFksIDA2NjYpOworICAgICAgICBpZiAob3V0ZmlsZSA9PSAtMSkgeworICAgICAgICAgICAgY2xvc2UoaW5maWxlKTsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ3VuIGNhbm5vdCBjcmVhdGUgJXNcbiIsIG91dG5hbWUpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisgICAgZXJybm8gPSAwOworCisgICAgLyogZGVjb21wcmVzcyAqLworICAgIHJldCA9IGd1bnBpcGUoc3RybSwgaW5maWxlLCBvdXRmaWxlKTsKKyAgICBpZiAob3V0ZmlsZSA+IDIpIGNsb3NlKG91dGZpbGUpOworICAgIGlmIChpbmZpbGUgPiAyKSBjbG9zZShpbmZpbGUpOworCisgICAgLyogaW50ZXJwcmV0IHJlc3VsdCAqLworICAgIHN3aXRjaCAocmV0KSB7CisgICAgY2FzZSBaX09LOgorICAgIGNhc2UgWl9FUlJOTzoKKyAgICAgICAgaWYgKGluZmlsZSA+IDIgJiYgb3V0ZmlsZSA+IDIpIHsKKyAgICAgICAgICAgIGNvcHltZXRhKGlubmFtZSwgb3V0bmFtZSk7ICAgICAgICAgIC8qIGNvcHkgYXR0cmlidXRlcyAqLworICAgICAgICAgICAgdW5saW5rKGlubmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJldCA9PSBaX0VSUk5PKQorICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJndW4gd2FybmluZzogdHJhaWxpbmcgZ2FyYmFnZSBpZ25vcmVkIGluICVzXG4iLAorICAgICAgICAgICAgICAgICAgICBpbm5hbWUpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFpfREFUQV9FUlJPUjoKKyAgICAgICAgaWYgKG91dGZpbGUgPiAyKSB1bmxpbmsob3V0bmFtZSk7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ3VuIGRhdGEgZXJyb3Igb24gJXM6ICVzXG4iLCBpbm5hbWUsIHN0cm0tPm1zZyk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgWl9NRU1fRVJST1I6CisgICAgICAgIGlmIChvdXRmaWxlID4gMikgdW5saW5rKG91dG5hbWUpOworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImd1biBvdXQgb2YgbWVtb3J5IGVycm9yLS1hYm9ydGluZ1xuIik7CisgICAgICAgIHJldHVybiAxOworICAgIGNhc2UgWl9CVUZfRVJST1I6CisgICAgICAgIGlmIChvdXRmaWxlID4gMikgdW5saW5rKG91dG5hbWUpOworICAgICAgICBpZiAoc3RybS0+bmV4dF9pbiAhPSBaX05VTEwpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ3VuIHdyaXRlIGVycm9yIG9uICVzOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgb3V0bmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChlcnJubykgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJndW4gcmVhZCBlcnJvciBvbiAlczogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgIGlubmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ3VuIHVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUgb24gJXNcbiIsCisgICAgICAgICAgICAgICAgICAgIGlubmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgaWYgKG91dGZpbGUgPiAyKSB1bmxpbmsob3V0bmFtZSk7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ3VuIGludGVybmFsIGVycm9yLS1hYm9ydGluZ1xuIik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLyogUHJvY2VzcyB0aGUgZ3VuIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuICBTZWUgdGhlIGNvbW1hbmQgc3ludGF4IG5lYXIgdGhlCisgICBiZWdpbm5pbmcgb2YgdGhpcyBzb3VyY2UgZmlsZS4gKi8KK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgICBpbnQgcmV0LCBsZW4sIHRlc3Q7CisgICAgY2hhciAqb3V0bmFtZTsKKyAgICB1bnNpZ25lZCBjaGFyICp3aW5kb3c7CisgICAgel9zdHJlYW0gc3RybTsKKworICAgIC8qIGluaXRpYWxpemUgaW5mbGF0ZUJhY2sgc3RhdGUgZm9yIHJlcGVhdGVkIHVzZSAqLworICAgIHdpbmRvdyA9IG1hdGNoOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZXVzZSBMWlcgbWF0Y2ggYnVmZmVyICovCisgICAgc3RybS56YWxsb2MgPSBaX05VTEw7CisgICAgc3RybS56ZnJlZSA9IFpfTlVMTDsKKyAgICBzdHJtLm9wYXF1ZSA9IFpfTlVMTDsKKyAgICByZXQgPSBpbmZsYXRlQmFja0luaXQoJnN0cm0sIDE1LCB3aW5kb3cpOworICAgIGlmIChyZXQgIT0gWl9PSykgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImd1biBvdXQgb2YgbWVtb3J5IGVycm9yLS1hYm9ydGluZ1xuIik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIC8qIGRlY29tcHJlc3MgZWFjaCBmaWxlIHRvIHRoZSBzYW1lIG5hbWUgd2l0aCB0aGUgc3VmZml4IHJlbW92ZWQgKi8KKyAgICBhcmdjLS07CisgICAgYXJndisrOworICAgIHRlc3QgPSAwOworICAgIGlmIChhcmdjICYmIHN0cmNtcCgqYXJndiwgIi1oIikgPT0gMCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImd1biAxLjYgKDE3IEphbiAyMDEwKVxuIik7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ29weXJpZ2h0IChDKSAyMDAzLTIwMTAgTWFyayBBZGxlclxuIik7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAidXNhZ2U6IGd1biBbLXRdIFtmaWxlMS5neiBbZmlsZTIuWiAuLi5dXVxuIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoYXJnYyAmJiBzdHJjbXAoKmFyZ3YsICItdCIpID09IDApIHsKKyAgICAgICAgdGVzdCA9IDE7CisgICAgICAgIGFyZ2MtLTsKKyAgICAgICAgYXJndisrOworICAgIH0KKyAgICBpZiAoYXJnYykKKyAgICAgICAgZG8geworICAgICAgICAgICAgaWYgKHRlc3QpCisgICAgICAgICAgICAgICAgb3V0bmFtZSA9IE5VTEw7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBsZW4gPSAoaW50KXN0cmxlbigqYXJndik7CisgICAgICAgICAgICAgICAgaWYgKHN0cmNtcCgqYXJndiArIGxlbiAtIDMsICIuZ3oiKSA9PSAwIHx8CisgICAgICAgICAgICAgICAgICAgIHN0cmNtcCgqYXJndiArIGxlbiAtIDMsICItZ3oiKSA9PSAwKQorICAgICAgICAgICAgICAgICAgICBsZW4gLT0gMzsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChzdHJjbXAoKmFyZ3YgKyBsZW4gLSAyLCAiLnoiKSA9PSAwIHx8CisgICAgICAgICAgICAgICAgICAgIHN0cmNtcCgqYXJndiArIGxlbiAtIDIsICIteiIpID09IDAgfHwKKyAgICAgICAgICAgICAgICAgICAgc3RyY21wKCphcmd2ICsgbGVuIC0gMiwgIl96IikgPT0gMCB8fAorICAgICAgICAgICAgICAgICAgICBzdHJjbXAoKmFyZ3YgKyBsZW4gLSAyLCAiLloiKSA9PSAwKQorICAgICAgICAgICAgICAgICAgICBsZW4gLT0gMjsKKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJndW4gZXJyb3I6IG5vIGd6IHR5cGUgb24gJXMtLXNraXBwaW5nXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICphcmd2KTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG91dG5hbWUgPSBtYWxsb2MobGVuICsgMSk7CisgICAgICAgICAgICAgICAgaWYgKG91dG5hbWUgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImd1biBvdXQgb2YgbWVtb3J5IGVycm9yLS1hYm9ydGluZ1xuIik7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IDE7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtZW1jcHkob3V0bmFtZSwgKmFyZ3YsIGxlbik7CisgICAgICAgICAgICAgICAgb3V0bmFtZVtsZW5dID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldCA9IGd1bnppcCgmc3RybSwgKmFyZ3YsIG91dG5hbWUsIHRlc3QpOworICAgICAgICAgICAgaWYgKG91dG5hbWUgIT0gTlVMTCkgZnJlZShvdXRuYW1lKTsKKyAgICAgICAgICAgIGlmIChyZXQpIGJyZWFrOworICAgICAgICB9IHdoaWxlIChhcmd2KyssIC0tYXJnYyk7CisgICAgZWxzZQorICAgICAgICByZXQgPSBndW56aXAoJnN0cm0sIE5VTEwsIE5VTEwsIHRlc3QpOworCisgICAgLyogY2xlYW4gdXAgKi8KKyAgICBpbmZsYXRlQmFja0VuZCgmc3RybSk7CisgICAgcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL3psaWItMS4yLjYvZXhhbXBsZXMvZ3phcHBlbmQuYyBiL3psaWItMS4yLjYvZXhhbXBsZXMvZ3phcHBlbmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOWU4NzhlCi0tLSAvZGV2L251bGwKKysrIGIvemxpYi0xLjIuNi9leGFtcGxlcy9nemFwcGVuZC5jCkBAIC0wLDAgKzEsNTAwIEBACisvKiBnemFwcGVuZCAtLSBjb21tYW5kIHRvIGFwcGVuZCB0byBhIGd6aXAgZmlsZQorCisgIENvcHlyaWdodCAoQykgMjAwMyBNYXJrIEFkbGVyLCBhbGwgcmlnaHRzIHJlc2VydmVkCisgIHZlcnNpb24gMS4xLCA0IE5vdiAyMDAzCisKKyAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKKyAgd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3IgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCisgIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCisKKyAgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCisgIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKKyAgZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgorCisgIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90CisgICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCisgICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQorICAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgorICAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQorICAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCisgIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCisKKyAgTWFyayBBZGxlciAgICBtYWRsZXJAYWx1bW5pLmNhbHRlY2guZWR1CisgKi8KKworLyoKKyAqIENoYW5nZSBoaXN0b3J5OgorICoKKyAqIDEuMCAgMTkgT2N0IDIwMDMgICAgIC0gRmlyc3QgdmVyc2lvbgorICogMS4xICAgNCBOb3YgMjAwMyAgICAgLSBFeHBhbmQgYW5kIGNsYXJpZnkgc29tZSBjb21tZW50cyBhbmQgbm90ZXMKKyAqICAgICAgICAgICAgICAgICAgICAgIC0gQWRkIHZlcnNpb24gYW5kIGNvcHlyaWdodCB0byBoZWxwCisgKiAgICAgICAgICAgICAgICAgICAgICAtIFNlbmQgaGVscCB0byBzdGRvdXQgaW5zdGVhZCBvZiBzdGRlcnIKKyAqICAgICAgICAgICAgICAgICAgICAgIC0gQWRkIHNvbWUgcHJlZW1wdGl2ZSB0eXBlY2FzdHMKKyAqICAgICAgICAgICAgICAgICAgICAgIC0gQWRkIEwgdG8gY29uc3RhbnRzIGluIGxzZWVrKCkgY2FsbHMKKyAqICAgICAgICAgICAgICAgICAgICAgIC0gUmVtb3ZlIHNvbWUgZGVidWdnaW5nIGluZm9ybWF0aW9uIGluIGVycm9yIG1lc3NhZ2VzCisgKiAgICAgICAgICAgICAgICAgICAgICAtIFVzZSBuZXcgZGF0YV90eXBlIGRlZmluaXRpb24gZm9yIHpsaWIgMS4yLjEKKyAqICAgICAgICAgICAgICAgICAgICAgIC0gU2ltcGxmeSBhbmQgdW5pZnkgZmlsZSBvcGVyYXRpb25zCisgKiAgICAgICAgICAgICAgICAgICAgICAtIEZpbmlzaCBvZmYgZ3ppcCBmaWxlIGluIGd6dGFjaygpCisgKiAgICAgICAgICAgICAgICAgICAgICAtIFVzZSBkZWZsYXRlUHJpbWUoKSBpbnN0ZWFkIG9mIGFkZGluZyBlbXB0eSBibG9ja3MKKyAqICAgICAgICAgICAgICAgICAgICAgIC0gS2VlcCBnemlwIGZpbGUgY2xlYW4gb24gYXBwZW5kZWQgZmlsZSByZWFkIGVycm9ycworICogICAgICAgICAgICAgICAgICAgICAgLSBVc2UgaW4tcGxhY2Ugcm90YXRlIGluc3RlYWQgb2YgYXV4aWxpYXJ5IGJ1ZmZlcgorICogICAgICAgICAgICAgICAgICAgICAgICAoV2h5IHlvdSBhc2s/ICBCZWNhdXNlIGl0IHdhcyBmdW4gdG8gd3JpdGUhKQorICovCisKKy8qCisgICBnemFwcGVuZCB0YWtlcyBhIGd6aXAgZmlsZSBhbmQgYXBwZW5kcyB0byBpdCwgY29tcHJlc3NpbmcgZmlsZXMgZnJvbSB0aGUKKyAgIGNvbW1hbmQgbGluZSBvciBkYXRhIGZyb20gc3RkaW4uICBUaGUgZ3ppcCBmaWxlIGlzIHdyaXR0ZW4gdG8gZGlyZWN0bHksIHRvCisgICBhdm9pZCBjb3B5aW5nIHRoYXQgZmlsZSwgaW4gY2FzZSBpdCdzIGxhcmdlLiAgTm90ZSB0aGF0IHRoaXMgcmVzdWx0cyBpbiB0aGUKKyAgIHVuZnJpZW5kbHkgYmVoYXZpb3IgdGhhdCBpZiBnemFwcGVuZCBmYWlscywgdGhlIGd6aXAgZmlsZSBpcyBjb3JydXB0ZWQuCisKKyAgIFRoaXMgcHJvZ3JhbSB3YXMgd3JpdHRlbiB0byBpbGx1c3RyYXRlIHRoZSB1c2Ugb2YgdGhlIG5ldyBaX0JMT0NLIG9wdGlvbiBvZgorICAgemxpYiAxLjIueCdzIGluZmxhdGUoKSBmdW5jdGlvbi4gIFRoaXMgb3B0aW9uIHJldHVybnMgZnJvbSBpbmZsYXRlKCkgYXQgZWFjaAorICAgYmxvY2sgYm91bmRhcnkgdG8gZmFjaWxpdGF0ZSBsb2NhdGluZyBhbmQgbW9kaWZ5aW5nIHRoZSBsYXN0IGJsb2NrIGJpdCBhdAorICAgdGhlIHN0YXJ0IG9mIHRoZSBmaW5hbCBkZWZsYXRlIGJsb2NrLiAgQWxzbyB3aGV0aGVyIHVzaW5nIFpfQkxPQ0sgb3Igbm90LAorICAgYW5vdGhlciByZXF1aXJlZCBmZWF0dXJlIG9mIHpsaWIgMS4yLnggaXMgdGhhdCBpbmZsYXRlKCkgbm93IHByb3ZpZGVzIHRoZQorICAgbnVtYmVyIG9mIHVudXN1ZWQgYml0cyBpbiB0aGUgbGFzdCBpbnB1dCBieXRlIHVzZWQuICBnemFwcGVuZCB3aWxsIG5vdCB3b3JrCisgICB3aXRoIHZlcnNpb25zIG9mIHpsaWIgZWFybGllciB0aGFuIDEuMi4xLgorCisgICBnemFwcGVuZCBmaXJzdCBkZWNvbXByZXNzZXMgdGhlIGd6aXAgZmlsZSBpbnRlcm5hbGx5LCBkaXNjYXJkaW5nIGFsbCBidXQKKyAgIHRoZSBsYXN0IDMySyBvZiB1bmNvbXByZXNzZWQgZGF0YSwgYW5kIG5vdGluZyB0aGUgbG9jYXRpb24gb2YgdGhlIGxhc3QgYmxvY2sKKyAgIGJpdCBhbmQgdGhlIG51bWJlciBvZiB1bnVzZWQgYml0cyBpbiB0aGUgbGFzdCBieXRlIG9mIHRoZSBjb21wcmVzc2VkIGRhdGEuCisgICBUaGUgZ3ppcCB0cmFpbGVyIGNvbnRhaW5pbmcgdGhlIENSQy0zMiBhbmQgbGVuZ3RoIG9mIHRoZSB1bmNvbXByZXNzZWQgZGF0YQorICAgaXMgdmVyaWZpZWQuICBUaGlzIHRyYWlsZXIgd2lsbCBiZSBsYXRlciBvdmVyd3JpdHRlbi4KKworICAgVGhlbiB0aGUgbGFzdCBibG9jayBiaXQgaXMgY2xlYXJlZCBieSBzZWVraW5nIGJhY2sgaW4gdGhlIGZpbGUgYW5kIHJld3JpdGluZworICAgdGhlIGJ5dGUgdGhhdCBjb250YWlucyBpdC4gIFNlZWtpbmcgZm9yd2FyZCwgdGhlIGxhc3QgYnl0ZSBvZiB0aGUgY29tcHJlc3NlZAorICAgZGF0YSBpcyBzYXZlZCBhbG9uZyB3aXRoIHRoZSBudW1iZXIgb2YgdW51c2VkIGJpdHMgdG8gaW5pdGlhbGl6ZSBkZWZsYXRlLgorCisgICBBIGRlZmxhdGUgcHJvY2VzcyBpcyBpbml0aWFsaXplZCwgdXNpbmcgdGhlIGxhc3QgMzJLIG9mIHRoZSB1bmNvbXByZXNzZWQKKyAgIGRhdGEgZnJvbSB0aGUgZ3ppcCBmaWxlIHRvIGluaXRpYWxpemUgdGhlIGRpY3Rpb25hcnkuICBJZiB0aGUgdG90YWwKKyAgIHVuY29tcHJlc3NlZCBkYXRhIHdhcyBsZXNzIHRoYW4gMzJLLCB0aGVuIGFsbCBvZiBpdCBpcyB1c2VkIHRvIGluaXRpYWxpemUKKyAgIHRoZSBkaWN0aW9uYXJ5LiAgVGhlIGRlZmxhdGUgb3V0cHV0IGJpdCBidWZmZXIgaXMgYWxzbyBpbml0aWFsaXplZCB3aXRoIHRoZQorICAgbGFzdCBiaXRzIGZyb20gdGhlIG9yaWdpbmFsIGRlZmxhdGUgc3RyZWFtLiAgRnJvbSBoZXJlIG9uLCB0aGUgZGF0YSB0bworICAgYXBwZW5kIGlzIHNpbXBseSBjb21wcmVzc2VkIHVzaW5nIGRlZmxhdGUsIGFuZCB3cml0dGVuIHRvIHRoZSBnemlwIGZpbGUuCisgICBXaGVuIHRoYXQgaXMgY29tcGxldGUsIHRoZSBuZXcgQ1JDLTMyIGFuZCB1bmNvbXByZXNzZWQgbGVuZ3RoIGFyZSB3cml0dGVuCisgICBhcyB0aGUgdHJhaWxlciBvZiB0aGUgZ3ppcCBmaWxlLgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSAiemxpYi5oIgorCisjZGVmaW5lIGxvY2FsIHN0YXRpYworI2RlZmluZSBMR0NIVU5LIDE0CisjZGVmaW5lIENIVU5LICgxVSA8PCBMR0NIVU5LKQorI2RlZmluZSBEU0laRSAzMjc2OFUKKworLyogcHJpbnQgYW4gZXJyb3IgbWVzc2FnZSBhbmQgdGVybWluYXRlIHdpdGggZXh0cmVtZSBwcmVqdWRpY2UgKi8KK2xvY2FsIHZvaWQgYnllKGNoYXIgKm1zZzEsIGNoYXIgKm1zZzIpCit7CisgICAgZnByaW50ZihzdGRlcnIsICJnemFwcGVuZCBlcnJvcjogJXMlc1xuIiwgbXNnMSwgbXNnMik7CisgICAgZXhpdCgxKTsKK30KKworLyogcmV0dXJuIHRoZSBncmVhdGVzdCBjb21tb24gZGl2aXNvciBvZiBhIGFuZCBiIHVzaW5nIEV1Y2xpZCdzIGFsZ29yaXRobSwKKyAgIG1vZGlmaWVkIHRvIGJlIGZhc3Qgd2hlbiBvbmUgYXJndW1lbnQgbXVjaCBncmVhdGVyIHRoYW4gdGhlIG90aGVyLCBhbmQKKyAgIGNvZGVkIHRvIGF2b2lkIHVubmVjZXNzYXJ5IHN3YXBwaW5nICovCitsb2NhbCB1bnNpZ25lZCBnY2QodW5zaWduZWQgYSwgdW5zaWduZWQgYikKK3sKKyAgICB1bnNpZ25lZCBjOworCisgICAgd2hpbGUgKGEgJiYgYikKKyAgICAgICAgaWYgKGEgPiBiKSB7CisgICAgICAgICAgICBjID0gYjsKKyAgICAgICAgICAgIHdoaWxlIChhIC0gYyA+PSBjKQorICAgICAgICAgICAgICAgIGMgPDw9IDE7CisgICAgICAgICAgICBhIC09IGM7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBjID0gYTsKKyAgICAgICAgICAgIHdoaWxlIChiIC0gYyA+PSBjKQorICAgICAgICAgICAgICAgIGMgPDw9IDE7CisgICAgICAgICAgICBiIC09IGM7CisgICAgICAgIH0KKyAgICByZXR1cm4gYSArIGI7Cit9CisKKy8qIHJvdGF0ZSBsaXN0WzAuLmxlbi0xXSBsZWZ0IGJ5IHJvdCBwb3NpdGlvbnMsIGluIHBsYWNlICovCitsb2NhbCB2b2lkIHJvdGF0ZSh1bnNpZ25lZCBjaGFyICpsaXN0LCB1bnNpZ25lZCBsZW4sIHVuc2lnbmVkIHJvdCkKK3sKKyAgICB1bnNpZ25lZCBjaGFyIHRtcDsKKyAgICB1bnNpZ25lZCBjeWNsZXM7CisgICAgdW5zaWduZWQgY2hhciAqc3RhcnQsICpsYXN0LCAqdG8sICpmcm9tOworCisgICAgLyogbm9ybWFsaXplIHJvdCBhbmQgaGFuZGxlIGRlZ2VuZXJhdGUgY2FzZXMgKi8KKyAgICBpZiAobGVuIDwgMikgcmV0dXJuOworICAgIGlmIChyb3QgPj0gbGVuKSByb3QgJT0gbGVuOworICAgIGlmIChyb3QgPT0gMCkgcmV0dXJuOworCisgICAgLyogcG9pbnRlciB0byBsYXN0IGVudHJ5IGluIGxpc3QgKi8KKyAgICBsYXN0ID0gbGlzdCArIChsZW4gLSAxKTsKKworICAgIC8qIGRvIHNpbXBsZSBsZWZ0IHNoaWZ0IGJ5IG9uZSAqLworICAgIGlmIChyb3QgPT0gMSkgeworICAgICAgICB0bXAgPSAqbGlzdDsKKyAgICAgICAgbWVtY3B5KGxpc3QsIGxpc3QgKyAxLCBsZW4gLSAxKTsKKyAgICAgICAgKmxhc3QgPSB0bXA7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiBkbyBzaW1wbGUgcmlnaHQgc2hpZnQgYnkgb25lICovCisgICAgaWYgKHJvdCA9PSBsZW4gLSAxKSB7CisgICAgICAgIHRtcCA9ICpsYXN0OworICAgICAgICBtZW1tb3ZlKGxpc3QgKyAxLCBsaXN0LCBsZW4gLSAxKTsKKyAgICAgICAgKmxpc3QgPSB0bXA7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiBvdGhlcndpc2UgZG8gcm90YXRlIGFzIGEgc2V0IG9mIGN5Y2xlcyBpbiBwbGFjZSAqLworICAgIGN5Y2xlcyA9IGdjZChsZW4sIHJvdCk7ICAgICAgICAgICAgIC8qIG51bWJlciBvZiBjeWNsZXMgKi8KKyAgICBkbyB7CisgICAgICAgIHN0YXJ0ID0gZnJvbSA9IGxpc3QgKyBjeWNsZXM7ICAgLyogc3RhcnQgaW5kZXggaXMgYXJiaXRyYXJ5ICovCisgICAgICAgIHRtcCA9ICpmcm9tOyAgICAgICAgICAgICAgICAgICAgLyogc2F2ZSBlbnRyeSB0byBiZSBvdmVyd3JpdHRlbiAqLworICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICB0byA9IGZyb207ICAgICAgICAgICAgICAgICAgLyogbmV4dCBzdGVwIGluIGN5Y2xlICovCisgICAgICAgICAgICBmcm9tICs9IHJvdDsgICAgICAgICAgICAgICAgLyogZ28gcmlnaHQgcm90IHBvc2l0aW9ucyAqLworICAgICAgICAgICAgaWYgKGZyb20gPiBsYXN0KSBmcm9tIC09IGxlbjsgICAvKiAocG9pbnRlciBiZXR0ZXIgbm90IHdyYXApICovCisgICAgICAgICAgICBpZiAoZnJvbSA9PSBzdGFydCkgYnJlYWs7ICAgLyogYWxsIGJ1dCBvbmUgc2hpZnRlZCAqLworICAgICAgICAgICAgKnRvID0gKmZyb207ICAgICAgICAgICAgICAgIC8qIHNoaWZ0IGxlZnQgKi8KKyAgICAgICAgfQorICAgICAgICAqdG8gPSB0bXA7ICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbXBsZXRlIHRoZSBjaXJjbGUgKi8KKyAgICB9IHdoaWxlICgtLWN5Y2xlcyk7Cit9CisKKy8qIHN0cnVjdHVyZSBmb3IgZ3ppcCBmaWxlIHJlYWQgb3BlcmF0aW9ucyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCBmZDsgICAgICAgICAgICAgICAgICAgICAvKiBmaWxlIGRlc2NyaXB0b3IgKi8KKyAgICBpbnQgc2l6ZTsgICAgICAgICAgICAgICAgICAgLyogMSA8PCBzaXplIGlzIGJ5dGVzIGluIGJ1ZiAqLworICAgIHVuc2lnbmVkIGxlZnQ7ICAgICAgICAgICAgICAvKiBieXRlcyBhdmFpbGFibGUgYXQgbmV4dCAqLworICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZjsgICAgICAgICAvKiBidWZmZXIgKi8KKyAgICB1bnNpZ25lZCBjaGFyICpuZXh0OyAgICAgICAgLyogbmV4dCBieXRlIGluIGJ1ZmZlciAqLworICAgIGNoYXIgKm5hbWU7ICAgICAgICAgICAgICAgICAvKiBmaWxlIG5hbWUgZm9yIGVycm9yIG1lc3NhZ2VzICovCit9IGZpbGU7CisKKy8qIHJlbG9hZCBidWZmZXIgKi8KK2xvY2FsIGludCByZWFkaW4oZmlsZSAqaW4pCit7CisgICAgaW50IGxlbjsKKworICAgIGxlbiA9IHJlYWQoaW4tPmZkLCBpbi0+YnVmLCAxIDw8IGluLT5zaXplKTsKKyAgICBpZiAobGVuID09IC0xKSBieWUoImVycm9yIHJlYWRpbmcgIiwgaW4tPm5hbWUpOworICAgIGluLT5sZWZ0ID0gKHVuc2lnbmVkKWxlbjsKKyAgICBpbi0+bmV4dCA9IGluLT5idWY7CisgICAgcmV0dXJuIGxlbjsKK30KKworLyogcmVhZCBmcm9tIGZpbGUgaW4sIGV4aXQgaWYgZW5kLW9mLWZpbGUgKi8KK2xvY2FsIGludCByZWFkbW9yZShmaWxlICppbikKK3sKKyAgICBpZiAocmVhZGluKGluKSA9PSAwKSBieWUoInVuZXhwZWN0ZWQgZW5kIG9mICIsIGluLT5uYW1lKTsKKyAgICByZXR1cm4gMDsKK30KKworI2RlZmluZSByZWFkMShpbikgKGluLT5sZWZ0ID09IDAgPyByZWFkbW9yZShpbikgOiAwLCBcCisgICAgICAgICAgICAgICAgICAgaW4tPmxlZnQtLSwgKihpbi0+bmV4dCkrKykKKworLyogc2tpcCBvdmVyIG4gYnl0ZXMgb2YgaW4gKi8KK2xvY2FsIHZvaWQgc2tpcChmaWxlICppbiwgdW5zaWduZWQgbikKK3sKKyAgICB1bnNpZ25lZCBieXBhc3M7CisKKyAgICBpZiAobiA+IGluLT5sZWZ0KSB7CisgICAgICAgIG4gLT0gaW4tPmxlZnQ7CisgICAgICAgIGJ5cGFzcyA9IG4gJiB+KCgxVSA8PCBpbi0+c2l6ZSkgLSAxKTsKKyAgICAgICAgaWYgKGJ5cGFzcykgeworICAgICAgICAgICAgaWYgKGxzZWVrKGluLT5mZCwgKG9mZl90KWJ5cGFzcywgU0VFS19DVVIpID09IC0xKQorICAgICAgICAgICAgICAgIGJ5ZSgic2Vla2luZyAiLCBpbi0+bmFtZSk7CisgICAgICAgICAgICBuIC09IGJ5cGFzczsKKyAgICAgICAgfQorICAgICAgICByZWFkbW9yZShpbik7CisgICAgICAgIGlmIChuID4gaW4tPmxlZnQpCisgICAgICAgICAgICBieWUoInVuZXhwZWN0ZWQgZW5kIG9mICIsIGluLT5uYW1lKTsKKyAgICB9CisgICAgaW4tPmxlZnQgLT0gbjsKKyAgICBpbi0+bmV4dCArPSBuOworfQorCisvKiByZWFkIGEgZm91ci1ieXRlIHVuc2lnbmVkIGludGVnZXIsIGxpdHRsZS1lbmRpYW4sIGZyb20gaW4gKi8KK3Vuc2lnbmVkIGxvbmcgcmVhZDQoZmlsZSAqaW4pCit7CisgICAgdW5zaWduZWQgbG9uZyB2YWw7CisKKyAgICB2YWwgPSByZWFkMShpbik7CisgICAgdmFsICs9ICh1bnNpZ25lZClyZWFkMShpbikgPDwgODsKKyAgICB2YWwgKz0gKHVuc2lnbmVkIGxvbmcpcmVhZDEoaW4pIDw8IDE2OworICAgIHZhbCArPSAodW5zaWduZWQgbG9uZylyZWFkMShpbikgPDwgMjQ7CisgICAgcmV0dXJuIHZhbDsKK30KKworLyogc2tpcCBvdmVyIGd6aXAgaGVhZGVyICovCitsb2NhbCB2b2lkIGd6aGVhZGVyKGZpbGUgKmluKQoreworICAgIGludCBmbGFnczsKKyAgICB1bnNpZ25lZCBuOworCisgICAgaWYgKHJlYWQxKGluKSAhPSAzMSB8fCByZWFkMShpbikgIT0gMTM5KSBieWUoaW4tPm5hbWUsICIgbm90IGEgZ3ppcCBmaWxlIik7CisgICAgaWYgKHJlYWQxKGluKSAhPSA4KSBieWUoInVua25vd24gY29tcHJlc3Npb24gbWV0aG9kIGluIiwgaW4tPm5hbWUpOworICAgIGZsYWdzID0gcmVhZDEoaW4pOworICAgIGlmIChmbGFncyAmIDB4ZTApIGJ5ZSgidW5rbm93biBoZWFkZXIgZmxhZ3Mgc2V0IGluIiwgaW4tPm5hbWUpOworICAgIHNraXAoaW4sIDYpOworICAgIGlmIChmbGFncyAmIDQpIHsKKyAgICAgICAgbiA9IHJlYWQxKGluKTsKKyAgICAgICAgbiArPSAodW5zaWduZWQpKHJlYWQxKGluKSkgPDwgODsKKyAgICAgICAgc2tpcChpbiwgbik7CisgICAgfQorICAgIGlmIChmbGFncyAmIDgpIHdoaWxlIChyZWFkMShpbikgIT0gMCkgOworICAgIGlmIChmbGFncyAmIDE2KSB3aGlsZSAocmVhZDEoaW4pICE9IDApIDsKKyAgICBpZiAoZmxhZ3MgJiAyKSBza2lwKGluLCAyKTsKK30KKworLyogZGVjb21wcmVzcyBnemlwIGZpbGUgIm5hbWUiLCByZXR1cm4gc3RybSB3aXRoIGEgZGVmbGF0ZSBzdHJlYW0gcmVhZHkgdG8KKyAgIGNvbnRpbnVlIGNvbXByZXNzaW9uIG9mIHRoZSBkYXRhIGluIHRoZSBnemlwIGZpbGUsIGFuZCByZXR1cm4gYSBmaWxlCisgICBkZXNjcmlwdG9yIHBvaW50aW5nIHRvIHdoZXJlIHRvIHdyaXRlIHRoZSBjb21wcmVzc2VkIGRhdGEgLS0gdGhlIGRlZmxhdGUKKyAgIHN0cmVhbSBpcyBpbml0aWFsaXplZCB0byBjb21wcmVzcyB1c2luZyBsZXZlbCAibGV2ZWwiICovCitsb2NhbCBpbnQgZ3pzY2FuKGNoYXIgKm5hbWUsIHpfc3RyZWFtICpzdHJtLCBpbnQgbGV2ZWwpCit7CisgICAgaW50IHJldCwgbGFzdGJpdCwgbGVmdCwgZnVsbDsKKyAgICB1bnNpZ25lZCBoYXZlOworICAgIHVuc2lnbmVkIGxvbmcgY3JjLCB0b3Q7CisgICAgdW5zaWduZWQgY2hhciAqd2luZG93OworICAgIG9mZl90IGxhc3RvZmYsIGVuZDsKKyAgICBmaWxlIGd6OworCisgICAgLyogb3BlbiBnemlwIGZpbGUgKi8KKyAgICBnei5uYW1lID0gbmFtZTsKKyAgICBnei5mZCA9IG9wZW4obmFtZSwgT19SRFdSLCAwKTsKKyAgICBpZiAoZ3ouZmQgPT0gLTEpIGJ5ZSgiY2Fubm90IG9wZW4gIiwgbmFtZSk7CisgICAgZ3ouYnVmID0gbWFsbG9jKENIVU5LKTsKKyAgICBpZiAoZ3ouYnVmID09IE5VTEwpIGJ5ZSgib3V0IG9mIG1lbW9yeSIsICIiKTsKKyAgICBnei5zaXplID0gTEdDSFVOSzsKKyAgICBnei5sZWZ0ID0gMDsKKworICAgIC8qIHNraXAgZ3ppcCBoZWFkZXIgKi8KKyAgICBnemhlYWRlcigmZ3opOworCisgICAgLyogcHJlcGFyZSB0byBkZWNvbXByZXNzICovCisgICAgd2luZG93ID0gbWFsbG9jKERTSVpFKTsKKyAgICBpZiAod2luZG93ID09IE5VTEwpIGJ5ZSgib3V0IG9mIG1lbW9yeSIsICIiKTsKKyAgICBzdHJtLT56YWxsb2MgPSBaX05VTEw7CisgICAgc3RybS0+emZyZWUgPSBaX05VTEw7CisgICAgc3RybS0+b3BhcXVlID0gWl9OVUxMOworICAgIHJldCA9IGluZmxhdGVJbml0MihzdHJtLCAtMTUpOworICAgIGlmIChyZXQgIT0gWl9PSykgYnllKCJvdXQgb2YgbWVtb3J5IiwgIiBvciBsaWJyYXJ5IG1pc21hdGNoIik7CisKKyAgICAvKiBkZWNvbXByZXNzIHRoZSBkZWZsYXRlIHN0cmVhbSwgc2F2aW5nIGFwcGVuZCBpbmZvcm1hdGlvbiAqLworICAgIGxhc3RiaXQgPSAwOworICAgIGxhc3RvZmYgPSBsc2Vlayhnei5mZCwgMEwsIFNFRUtfQ1VSKSAtIGd6LmxlZnQ7CisgICAgbGVmdCA9IDA7CisgICAgc3RybS0+YXZhaWxfaW4gPSBnei5sZWZ0OworICAgIHN0cm0tPm5leHRfaW4gPSBnei5uZXh0OworICAgIGNyYyA9IGNyYzMyKDBMLCBaX05VTEwsIDApOworICAgIGhhdmUgPSBmdWxsID0gMDsKKyAgICBkbyB7CisgICAgICAgIC8qIGlmIG5lZWRlZCwgZ2V0IG1vcmUgaW5wdXQgKi8KKyAgICAgICAgaWYgKHN0cm0tPmF2YWlsX2luID09IDApIHsKKyAgICAgICAgICAgIHJlYWRtb3JlKCZneik7CisgICAgICAgICAgICBzdHJtLT5hdmFpbF9pbiA9IGd6LmxlZnQ7CisgICAgICAgICAgICBzdHJtLT5uZXh0X2luID0gZ3oubmV4dDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHNldCB1cCBvdXRwdXQgdG8gbmV4dCBhdmFpbGFibGUgc2VjdGlvbiBvZiBzbGlkaW5nIHdpbmRvdyAqLworICAgICAgICBzdHJtLT5hdmFpbF9vdXQgPSBEU0laRSAtIGhhdmU7CisgICAgICAgIHN0cm0tPm5leHRfb3V0ID0gd2luZG93ICsgaGF2ZTsKKworICAgICAgICAvKiBpbmZsYXRlIGFuZCBjaGVjayBmb3IgZXJyb3JzICovCisgICAgICAgIHJldCA9IGluZmxhdGUoc3RybSwgWl9CTE9DSyk7CisgICAgICAgIGlmIChyZXQgPT0gWl9TVFJFQU1fRVJST1IpIGJ5ZSgiaW50ZXJuYWwgc3RyZWFtIGVycm9yISIsICIiKTsKKyAgICAgICAgaWYgKHJldCA9PSBaX01FTV9FUlJPUikgYnllKCJvdXQgb2YgbWVtb3J5IiwgIiIpOworICAgICAgICBpZiAocmV0ID09IFpfREFUQV9FUlJPUikKKyAgICAgICAgICAgIGJ5ZSgiaW52YWxpZCBjb21wcmVzc2VkIGRhdGEtLWZvcm1hdCB2aW9sYXRlZCBpbiIsIG5hbWUpOworCisgICAgICAgIC8qIHVwZGF0ZSBjcmMgYW5kIHNsaWRpbmcgd2luZG93IHBvaW50ZXIgKi8KKyAgICAgICAgY3JjID0gY3JjMzIoY3JjLCB3aW5kb3cgKyBoYXZlLCBEU0laRSAtIGhhdmUgLSBzdHJtLT5hdmFpbF9vdXQpOworICAgICAgICBpZiAoc3RybS0+YXZhaWxfb3V0KQorICAgICAgICAgICAgaGF2ZSA9IERTSVpFIC0gc3RybS0+YXZhaWxfb3V0OworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGhhdmUgPSAwOworICAgICAgICAgICAgZnVsbCA9IDE7CisgICAgICAgIH0KKworICAgICAgICAvKiBwcm9jZXNzIGVuZCBvZiBibG9jayAqLworICAgICAgICBpZiAoc3RybS0+ZGF0YV90eXBlICYgMTI4KSB7CisgICAgICAgICAgICBpZiAoc3RybS0+ZGF0YV90eXBlICYgNjQpCisgICAgICAgICAgICAgICAgbGVmdCA9IHN0cm0tPmRhdGFfdHlwZSAmIDB4MWY7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBsYXN0Yml0ID0gc3RybS0+ZGF0YV90eXBlICYgMHgxZjsKKyAgICAgICAgICAgICAgICBsYXN0b2ZmID0gbHNlZWsoZ3ouZmQsIDBMLCBTRUVLX0NVUikgLSBzdHJtLT5hdmFpbF9pbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gd2hpbGUgKHJldCAhPSBaX1NUUkVBTV9FTkQpOworICAgIGluZmxhdGVFbmQoc3RybSk7CisgICAgZ3oubGVmdCA9IHN0cm0tPmF2YWlsX2luOworICAgIGd6Lm5leHQgPSBzdHJtLT5uZXh0X2luOworCisgICAgLyogc2F2ZSB0aGUgbG9jYXRpb24gb2YgdGhlIGVuZCBvZiB0aGUgY29tcHJlc3NlZCBkYXRhICovCisgICAgZW5kID0gbHNlZWsoZ3ouZmQsIDBMLCBTRUVLX0NVUikgLSBnei5sZWZ0OworCisgICAgLyogY2hlY2sgZ3ppcCB0cmFpbGVyIGFuZCBzYXZlIHRvdGFsIGZvciBkZWZsYXRlICovCisgICAgaWYgKGNyYyAhPSByZWFkNCgmZ3opKQorICAgICAgICBieWUoImludmFsaWQgY29tcHJlc3NlZCBkYXRhLS1jcmMgbWlzbWF0Y2ggaW4gIiwgbmFtZSk7CisgICAgdG90ID0gc3RybS0+dG90YWxfb3V0OworICAgIGlmICgodG90ICYgMHhmZmZmZmZmZlVMKSAhPSByZWFkNCgmZ3opKQorICAgICAgICBieWUoImludmFsaWQgY29tcHJlc3NlZCBkYXRhLS1sZW5ndGggbWlzbWF0Y2ggaW4iLCBuYW1lKTsKKworICAgIC8qIGlmIG5vdCBhdCBlbmQgb2YgZmlsZSwgd2FybiAqLworICAgIGlmIChnei5sZWZ0IHx8IHJlYWRpbigmZ3opKQorICAgICAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICJnemFwcGVuZCB3YXJuaW5nOiBqdW5rIGF0IGVuZCBvZiBnemlwIGZpbGUgb3ZlcndyaXR0ZW5cbiIpOworCisgICAgLyogY2xlYXIgbGFzdCBibG9jayBiaXQgKi8KKyAgICBsc2Vlayhnei5mZCwgbGFzdG9mZiAtIChsYXN0Yml0ICE9IDApLCBTRUVLX1NFVCk7CisgICAgaWYgKHJlYWQoZ3ouZmQsIGd6LmJ1ZiwgMSkgIT0gMSkgYnllKCJyZWFkaW5nIGFmdGVyIHNlZWsgb24gIiwgbmFtZSk7CisgICAgKmd6LmJ1ZiA9ICh1bnNpZ25lZCBjaGFyKSgqZ3ouYnVmIF4gKDEgPDwgKCg4IC0gbGFzdGJpdCkgJiA3KSkpOworICAgIGxzZWVrKGd6LmZkLCAtMUwsIFNFRUtfQ1VSKTsKKyAgICBpZiAod3JpdGUoZ3ouZmQsIGd6LmJ1ZiwgMSkgIT0gMSkgYnllKCJ3cml0aW5nIGFmdGVyIHNlZWsgdG8gIiwgbmFtZSk7CisKKyAgICAvKiBpZiB3aW5kb3cgd3JhcHBlZCwgYnVpbGQgZGljdGlvbmFyeSBmcm9tIHdpbmRvdyBieSByb3RhdGluZyAqLworICAgIGlmIChmdWxsKSB7CisgICAgICAgIHJvdGF0ZSh3aW5kb3csIERTSVpFLCBoYXZlKTsKKyAgICAgICAgaGF2ZSA9IERTSVpFOworICAgIH0KKworICAgIC8qIHNldCB1cCBkZWZsYXRlIHN0cmVhbSB3aXRoIHdpbmRvdywgY3JjLCB0b3RhbF9pbiwgYW5kIGxlZnRvdmVyIGJpdHMgKi8KKyAgICByZXQgPSBkZWZsYXRlSW5pdDIoc3RybSwgbGV2ZWwsIFpfREVGTEFURUQsIC0xNSwgOCwgWl9ERUZBVUxUX1NUUkFURUdZKTsKKyAgICBpZiAocmV0ICE9IFpfT0spIGJ5ZSgib3V0IG9mIG1lbW9yeSIsICIiKTsKKyAgICBkZWZsYXRlU2V0RGljdGlvbmFyeShzdHJtLCB3aW5kb3csIGhhdmUpOworICAgIHN0cm0tPmFkbGVyID0gY3JjOworICAgIHN0cm0tPnRvdGFsX2luID0gdG90OworICAgIGlmIChsZWZ0KSB7CisgICAgICAgIGxzZWVrKGd6LmZkLCAtLWVuZCwgU0VFS19TRVQpOworICAgICAgICBpZiAocmVhZChnei5mZCwgZ3ouYnVmLCAxKSAhPSAxKSBieWUoInJlYWRpbmcgYWZ0ZXIgc2VlayBvbiAiLCBuYW1lKTsKKyAgICAgICAgZGVmbGF0ZVByaW1lKHN0cm0sIDggLSBsZWZ0LCAqZ3ouYnVmKTsKKyAgICB9CisgICAgbHNlZWsoZ3ouZmQsIGVuZCwgU0VFS19TRVQpOworCisgICAgLyogY2xlYW4gdXAgYW5kIHJldHVybiAqLworICAgIGZyZWUod2luZG93KTsKKyAgICBmcmVlKGd6LmJ1Zik7CisgICAgcmV0dXJuIGd6LmZkOworfQorCisvKiBhcHBlbmQgZmlsZSAibmFtZSIgdG8gZ3ppcCBmaWxlIGdkIHVzaW5nIGRlZmxhdGUgc3RyZWFtIHN0cm0gLS0gaWYgbGFzdAorICAgaXMgdHJ1ZSwgdGhlbiBmaW5pc2ggb2ZmIHRoZSBkZWZsYXRlIHN0cmVhbSBhdCB0aGUgZW5kICovCitsb2NhbCB2b2lkIGd6dGFjayhjaGFyICpuYW1lLCBpbnQgZ2QsIHpfc3RyZWFtICpzdHJtLCBpbnQgbGFzdCkKK3sKKyAgICBpbnQgZmQsIGxlbiwgcmV0OworICAgIHVuc2lnbmVkIGxlZnQ7CisgICAgdW5zaWduZWQgY2hhciAqaW4sICpvdXQ7CisKKyAgICAvKiBvcGVuIGZpbGUgdG8gY29tcHJlc3MgYW5kIGFwcGVuZCAqLworICAgIGZkID0gMDsKKyAgICBpZiAobmFtZSAhPSBOVUxMKSB7CisgICAgICAgIGZkID0gb3BlbihuYW1lLCBPX1JET05MWSwgMCk7CisgICAgICAgIGlmIChmZCA9PSAtMSkKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ3phcHBlbmQgd2FybmluZzogJXMgbm90IGZvdW5kLCBza2lwcGluZyAuLi5cbiIsCisgICAgICAgICAgICAgICAgICAgIG5hbWUpOworICAgIH0KKworICAgIC8qIGFsbG9jYXRlIGJ1ZmZlcnMgKi8KKyAgICBpbiA9IGZkID09IC0xID8gTlVMTCA6IG1hbGxvYyhDSFVOSyk7CisgICAgb3V0ID0gbWFsbG9jKENIVU5LKTsKKyAgICBpZiAob3V0ID09IE5VTEwpIGJ5ZSgib3V0IG9mIG1lbW9yeSIsICIiKTsKKworICAgIC8qIGNvbXByZXNzIGlucHV0IGZpbGUgYW5kIGFwcGVuZCB0byBnemlwIGZpbGUgKi8KKyAgICBkbyB7CisgICAgICAgIC8qIGdldCBtb3JlIGlucHV0ICovCisgICAgICAgIGxlbiA9IGZkID09IC0xID8gMCA6IHJlYWQoZmQsIGluLCBDSFVOSyk7CisgICAgICAgIGlmIChsZW4gPT0gLTEpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgICAgICAgICAiZ3phcHBlbmQgd2FybmluZzogZXJyb3IgcmVhZGluZyAlcywgc2tpcHBpbmcgcmVzdCAuLi5cbiIsCisgICAgICAgICAgICAgICAgICAgIG5hbWUpOworICAgICAgICAgICAgbGVuID0gMDsKKyAgICAgICAgfQorICAgICAgICBzdHJtLT5hdmFpbF9pbiA9ICh1bnNpZ25lZClsZW47CisgICAgICAgIHN0cm0tPm5leHRfaW4gPSBpbjsKKyAgICAgICAgaWYgKGxlbikgc3RybS0+YWRsZXIgPSBjcmMzMihzdHJtLT5hZGxlciwgaW4sICh1bnNpZ25lZClsZW4pOworCisgICAgICAgIC8qIGNvbXByZXNzIGFuZCB3cml0ZSBhbGwgYXZhaWxhYmxlIG91dHB1dCAqLworICAgICAgICBkbyB7CisgICAgICAgICAgICBzdHJtLT5hdmFpbF9vdXQgPSBDSFVOSzsKKyAgICAgICAgICAgIHN0cm0tPm5leHRfb3V0ID0gb3V0OworICAgICAgICAgICAgcmV0ID0gZGVmbGF0ZShzdHJtLCBsYXN0ICYmIGxlbiA9PSAwID8gWl9GSU5JU0ggOiBaX05PX0ZMVVNIKTsKKyAgICAgICAgICAgIGxlZnQgPSBDSFVOSyAtIHN0cm0tPmF2YWlsX291dDsKKyAgICAgICAgICAgIHdoaWxlIChsZWZ0KSB7CisgICAgICAgICAgICAgICAgbGVuID0gd3JpdGUoZ2QsIG91dCArIENIVU5LIC0gc3RybS0+YXZhaWxfb3V0IC0gbGVmdCwgbGVmdCk7CisgICAgICAgICAgICAgICAgaWYgKGxlbiA9PSAtMSkgYnllKCJ3cml0aW5nIGd6aXAgZmlsZSIsICIiKTsKKyAgICAgICAgICAgICAgICBsZWZ0IC09ICh1bnNpZ25lZClsZW47CisgICAgICAgICAgICB9CisgICAgICAgIH0gd2hpbGUgKHN0cm0tPmF2YWlsX291dCA9PSAwICYmIHJldCAhPSBaX1NUUkVBTV9FTkQpOworICAgIH0gd2hpbGUgKGxlbiAhPSAwKTsKKworICAgIC8qIHdyaXRlIHRyYWlsZXIgYWZ0ZXIgbGFzdCBlbnRyeSAqLworICAgIGlmIChsYXN0KSB7CisgICAgICAgIGRlZmxhdGVFbmQoc3RybSk7CisgICAgICAgIG91dFswXSA9ICh1bnNpZ25lZCBjaGFyKShzdHJtLT5hZGxlcik7CisgICAgICAgIG91dFsxXSA9ICh1bnNpZ25lZCBjaGFyKShzdHJtLT5hZGxlciA+PiA4KTsKKyAgICAgICAgb3V0WzJdID0gKHVuc2lnbmVkIGNoYXIpKHN0cm0tPmFkbGVyID4+IDE2KTsKKyAgICAgICAgb3V0WzNdID0gKHVuc2lnbmVkIGNoYXIpKHN0cm0tPmFkbGVyID4+IDI0KTsKKyAgICAgICAgb3V0WzRdID0gKHVuc2lnbmVkIGNoYXIpKHN0cm0tPnRvdGFsX2luKTsKKyAgICAgICAgb3V0WzVdID0gKHVuc2lnbmVkIGNoYXIpKHN0cm0tPnRvdGFsX2luID4+IDgpOworICAgICAgICBvdXRbNl0gPSAodW5zaWduZWQgY2hhcikoc3RybS0+dG90YWxfaW4gPj4gMTYpOworICAgICAgICBvdXRbN10gPSAodW5zaWduZWQgY2hhcikoc3RybS0+dG90YWxfaW4gPj4gMjQpOworICAgICAgICBsZW4gPSA4OworICAgICAgICBkbyB7CisgICAgICAgICAgICByZXQgPSB3cml0ZShnZCwgb3V0ICsgOCAtIGxlbiwgbGVuKTsKKyAgICAgICAgICAgIGlmIChyZXQgPT0gLTEpIGJ5ZSgid3JpdGluZyBnemlwIGZpbGUiLCAiIik7CisgICAgICAgICAgICBsZW4gLT0gcmV0OworICAgICAgICB9IHdoaWxlIChsZW4pOworICAgICAgICBjbG9zZShnZCk7CisgICAgfQorCisgICAgLyogY2xlYW4gdXAgYW5kIHJldHVybiAqLworICAgIGZyZWUob3V0KTsKKyAgICBpZiAoaW4gIT0gTlVMTCkgZnJlZShpbik7CisgICAgaWYgKGZkID4gMCkgY2xvc2UoZmQpOworfQorCisvKiBwcm9jZXNzIHRoZSBjb21wcmVzc2lvbiBsZXZlbCBvcHRpb24gaWYgcHJlc2VudCwgc2NhbiB0aGUgZ3ppcCBmaWxlLCBhbmQKKyAgIGFwcGVuZCB0aGUgc3BlY2lmaWVkIGZpbGVzLCBvciBhcHBlbmQgdGhlIGRhdGEgZnJvbSBzdGRpbiBpZiBubyBvdGhlciBmaWxlCisgICBuYW1lcyBhcmUgcHJvdmlkZWQgb24gdGhlIGNvbW1hbmQgbGluZSAtLSB0aGUgZ3ppcCBmaWxlIG11c3QgYmUgd3JpdGFibGUKKyAgIGFuZCBzZWVrYWJsZSAqLworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICAgIGludCBnZCwgbGV2ZWw7CisgICAgel9zdHJlYW0gc3RybTsKKworICAgIC8qIGlnbm9yZSBjb21tYW5kIG5hbWUgKi8KKyAgICBhcmd2Kys7CisKKyAgICAvKiBwcm92aWRlIHVzYWdlIGlmIG5vIGFyZ3VtZW50cyAqLworICAgIGlmICgqYXJndiA9PSBOVUxMKSB7CisgICAgICAgIHByaW50ZigiZ3phcHBlbmQgMS4xICg0IE5vdiAyMDAzKSBDb3B5cmlnaHQgKEMpIDIwMDMgTWFyayBBZGxlclxuIik7CisgICAgICAgIHByaW50ZigKKyAgICAgICAgICAgICJ1c2FnZTogZ3phcHBlbmQgWy1sZXZlbF0gZmlsZS5neiBbIGFkZHRoaXMgWyBhbmR0aGlzIC4uLiBdXVxuIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qIHNldCBjb21wcmVzc2lvbiBsZXZlbCAqLworICAgIGxldmVsID0gWl9ERUZBVUxUX0NPTVBSRVNTSU9OOworICAgIGlmIChhcmd2WzBdWzBdID09ICctJykgeworICAgICAgICBpZiAoYXJndlswXVsxXSA8ICcwJyB8fCBhcmd2WzBdWzFdID4gJzknIHx8IGFyZ3ZbMF1bMl0gIT0gMCkKKyAgICAgICAgICAgIGJ5ZSgiaW52YWxpZCBjb21wcmVzc2lvbiBsZXZlbCIsICIiKTsKKyAgICAgICAgbGV2ZWwgPSBhcmd2WzBdWzFdIC0gJzAnOworICAgICAgICBpZiAoKisrYXJndiA9PSBOVUxMKSBieWUoIm5vIGd6aXAgZmlsZSBuYW1lIGFmdGVyIG9wdGlvbnMiLCAiIik7CisgICAgfQorCisgICAgLyogcHJlcGFyZSB0byBhcHBlbmQgdG8gZ3ppcCBmaWxlICovCisgICAgZ2QgPSBnenNjYW4oKmFyZ3YrKywgJnN0cm0sIGxldmVsKTsKKworICAgIC8qIGFwcGVuZCBmaWxlcyBvbiBjb21tYW5kIGxpbmUsIG9yIGZyb20gc3RkaW4gaWYgbm9uZSAqLworICAgIGlmICgqYXJndiA9PSBOVUxMKQorICAgICAgICBnenRhY2soTlVMTCwgZ2QsICZzdHJtLCAxKTsKKyAgICBlbHNlCisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGd6dGFjaygqYXJndiwgZ2QsICZzdHJtLCBhcmd2WzFdID09IE5VTEwpOworICAgICAgICB9IHdoaWxlICgqKythcmd2ICE9IE5VTEwpOworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvemxpYi0xLjIuNi9leGFtcGxlcy9nempvaW4uYyBiL3psaWItMS4yLjYvZXhhbXBsZXMvZ3pqb2luLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI5MzQ3YwotLS0gL2Rldi9udWxsCisrKyBiL3psaWItMS4yLjYvZXhhbXBsZXMvZ3pqb2luLmMKQEAgLTAsMCArMSw0NDggQEAKKy8qIGd6am9pbiAtLSBjb21tYW5kIHRvIGpvaW4gZ3ppcCBmaWxlcyBpbnRvIG9uZSBnemlwIGZpbGUKKworICBDb3B5cmlnaHQgKEMpIDIwMDQgTWFyayBBZGxlciwgYWxsIHJpZ2h0cyByZXNlcnZlZAorICB2ZXJzaW9uIDEuMCwgMTEgRGVjIDIwMDQKKworICBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAorICB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvciBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKKyAgYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KKworICBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKKyAgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAorICBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CisKKyAgMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKKyAgICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKKyAgICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCisgICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCisgIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCisgICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KKyAgMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KKworICBNYXJrIEFkbGVyICAgIG1hZGxlckBhbHVtbmkuY2FsdGVjaC5lZHUKKyAqLworCisvKgorICogQ2hhbmdlIGhpc3Rvcnk6CisgKgorICogMS4wICAxMSBEZWMgMjAwNCAgICAgLSBGaXJzdCB2ZXJzaW9uCisgKiAxLjEgIDEyIEp1biAyMDA1ICAgICAtIENoYW5nZWQgc3NpemVfdCB0byBsb25nIGZvciBwb3J0YWJpbGl0eQorICovCisKKy8qCisgICBnempvaW4gdGFrZXMgb25lIG9yIG1vcmUgZ3ppcCBmaWxlcyBvbiB0aGUgY29tbWFuZCBsaW5lIGFuZCB3cml0ZXMgb3V0IGEKKyAgIHNpbmdsZSBnemlwIGZpbGUgdGhhdCB3aWxsIHVuY29tcHJlc3MgdG8gdGhlIGNvbmNhdGVuYXRpb24gb2YgdGhlCisgICB1bmNvbXByZXNzZWQgZGF0YSBmcm9tIHRoZSBpbmRpdmlkdWFsIGd6aXAgZmlsZXMuICBnempvaW4gZG9lcyB0aGlzIHdpdGhvdXQKKyAgIGhhdmluZyB0byByZWNvbXByZXNzIGFueSBvZiB0aGUgZGF0YSBhbmQgd2l0aG91dCBoYXZpbmcgdG8gY2FsY3VsYXRlIGEgbmV3CisgICBjcmMzMiBmb3IgdGhlIGNvbmNhdGVuYXRlZCB1bmNvbXByZXNzZWQgZGF0YS4gIGd6am9pbiBkb2VzIGhvd2V2ZXIgaGF2ZSB0bworICAgZGVjb21wcmVzcyBhbGwgb2YgdGhlIGlucHV0IGRhdGEgaW4gb3JkZXIgdG8gZmluZCB0aGUgYml0cyBpbiB0aGUgY29tcHJlc3NlZAorICAgZGF0YSB0aGF0IG5lZWQgdG8gYmUgbW9kaWZpZWQgdG8gY29uY2F0ZW5hdGUgdGhlIHN0cmVhbXMuCisKKyAgIGd6am9pbiBkb2VzIG5vdCBkbyBhbiBpbnRlZ3JpdHkgY2hlY2sgb24gdGhlIGlucHV0IGd6aXAgZmlsZXMgb3RoZXIgdGhhbgorICAgY2hlY2tpbmcgdGhlIGd6aXAgaGVhZGVyIGFuZCBkZWNvbXByZXNzaW5nIHRoZSBjb21wcmVzc2VkIGRhdGEuICBUaGV5IGFyZQorICAgb3RoZXJ3aXNlIGFzc3VtZWQgdG8gYmUgY29tcGxldGUgYW5kIGNvcnJlY3QuCisKKyAgIEVhY2ggam9pbnQgYmV0d2VlbiBnemlwIGZpbGVzIHJlbW92ZXMgYXQgbGVhc3QgMTggYnl0ZXMgb2YgcHJldmlvdXMgdHJhaWxlcgorICAgYW5kIHN1YnNlcXVlbnQgaGVhZGVyLCBhbmQgaW5zZXJ0cyBhbiBhdmVyYWdlIG9mIGFib3V0IHRocmVlIGJ5dGVzIHRvIHRoZQorICAgY29tcHJlc3NlZCBkYXRhIGluIG9yZGVyIHRvIGNvbm5lY3QgdGhlIHN0cmVhbXMuICBUaGUgb3V0cHV0IGd6aXAgZmlsZQorICAgaGFzIGEgbWluaW1hbCB0ZW4tYnl0ZSBnemlwIGhlYWRlciB3aXRoIG5vIGZpbGUgbmFtZSBvciBtb2RpZmljYXRpb24gdGltZS4KKworICAgVGhpcyBwcm9ncmFtIHdhcyB3cml0dGVuIHRvIGlsbHVzdHJhdGUgdGhlIHVzZSBvZiB0aGUgWl9CTE9DSyBvcHRpb24gb2YKKyAgIGluZmxhdGUoKSBhbmQgdGhlIGNyYzMyX2NvbWJpbmUoKSBmdW5jdGlvbi4gIGd6am9pbiB3aWxsIG5vdCBjb21waWxlIHdpdGgKKyAgIHZlcnNpb25zIG9mIHpsaWIgZWFybGllciB0aGFuIDEuMi4zLgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPiAgICAgIC8qIGZwdXRzKCksIGZwcmludGYoKSwgZndyaXRlKCksIHB1dGMoKSAqLworI2luY2x1ZGUgPHN0ZGxpYi5oPiAgICAgLyogZXhpdCgpLCBtYWxsb2MoKSwgZnJlZSgpICovCisjaW5jbHVkZSA8ZmNudGwuaD4gICAgICAvKiBvcGVuKCkgKi8KKyNpbmNsdWRlIDx1bmlzdGQuaD4gICAgIC8qIGNsb3NlKCksIHJlYWQoKSwgbHNlZWsoKSAqLworI2luY2x1ZGUgInpsaWIuaCIKKyAgICAvKiBjcmMzMigpLCBjcmMzMl9jb21iaW5lKCksIGluZmxhdGVJbml0MigpLCBpbmZsYXRlKCksIGluZmxhdGVFbmQoKSAqLworCisjZGVmaW5lIGxvY2FsIHN0YXRpYworCisvKiBleGl0IHdpdGggYW4gZXJyb3IgKHJldHVybiBhIHZhbHVlIHRvIGFsbG93IHVzZSBpbiBhbiBleHByZXNzaW9uKSAqLworbG9jYWwgaW50IGJhaWwoY2hhciAqd2h5MSwgY2hhciAqd2h5MikKK3sKKyAgICBmcHJpbnRmKHN0ZGVyciwgImd6am9pbiBlcnJvcjogJXMlcywgb3V0cHV0IGluY29tcGxldGVcbiIsIHdoeTEsIHdoeTIpOworICAgIGV4aXQoMSk7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qIC0tIHNpbXBsZSBidWZmZXJlZCBmaWxlIGlucHV0IHdpdGggYWNjZXNzIHRvIHRoZSBidWZmZXIgLS0gKi8KKworI2RlZmluZSBDSFVOSyAzMjc2OCAgICAgICAgIC8qIG11c3QgYmUgYSBwb3dlciBvZiB0d28gYW5kIGZpdCBpbiB1bnNpZ25lZCAqLworCisvKiBiaW4gYnVmZmVyZWQgaW5wdXQgZmlsZSB0eXBlICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY2hhciAqbmFtZTsgICAgICAgICAgICAgLyogbmFtZSBvZiBmaWxlIGZvciBlcnJvciBtZXNzYWdlcyAqLworICAgIGludCBmZDsgICAgICAgICAgICAgICAgIC8qIGZpbGUgZGVzY3JpcHRvciAqLworICAgIHVuc2lnbmVkIGxlZnQ7ICAgICAgICAgIC8qIGJ5dGVzIHJlbWFpbmluZyBhdCBuZXh0ICovCisgICAgdW5zaWduZWQgY2hhciAqbmV4dDsgICAgLyogbmV4dCBieXRlIHRvIHJlYWQgKi8KKyAgICB1bnNpZ25lZCBjaGFyICpidWY7ICAgICAvKiBhbGxvY2F0ZWQgYnVmZmVyIG9mIGxlbmd0aCBDSFVOSyAqLworfSBiaW47CisKKy8qIGNsb3NlIGEgYnVmZmVyZWQgZmlsZSBhbmQgZnJlZSBhbGxvY2F0ZWQgbWVtb3J5ICovCitsb2NhbCB2b2lkIGJjbG9zZShiaW4gKmluKQoreworICAgIGlmIChpbiAhPSBOVUxMKSB7CisgICAgICAgIGlmIChpbi0+ZmQgIT0gLTEpCisgICAgICAgICAgICBjbG9zZShpbi0+ZmQpOworICAgICAgICBpZiAoaW4tPmJ1ZiAhPSBOVUxMKQorICAgICAgICAgICAgZnJlZShpbi0+YnVmKTsKKyAgICAgICAgZnJlZShpbik7CisgICAgfQorfQorCisvKiBvcGVuIGEgYnVmZmVyZWQgZmlsZSBmb3IgaW5wdXQsIHJldHVybiBhIHBvaW50ZXIgdG8gdHlwZSBiaW4sIG9yIE5VTEwgb24KKyAgIGZhaWx1cmUgKi8KK2xvY2FsIGJpbiAqYm9wZW4oY2hhciAqbmFtZSkKK3sKKyAgICBiaW4gKmluOworCisgICAgaW4gPSBtYWxsb2Moc2l6ZW9mKGJpbikpOworICAgIGlmIChpbiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpbi0+YnVmID0gbWFsbG9jKENIVU5LKTsKKyAgICBpbi0+ZmQgPSBvcGVuKG5hbWUsIE9fUkRPTkxZLCAwKTsKKyAgICBpZiAoaW4tPmJ1ZiA9PSBOVUxMIHx8IGluLT5mZCA9PSAtMSkgeworICAgICAgICBiY2xvc2UoaW4pOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaW4tPmxlZnQgPSAwOworICAgIGluLT5uZXh0ID0gaW4tPmJ1ZjsKKyAgICBpbi0+bmFtZSA9IG5hbWU7CisgICAgcmV0dXJuIGluOworfQorCisvKiBsb2FkIGJ1ZmZlciBmcm9tIGZpbGUsIHJldHVybiAtMSBvbiByZWFkIGVycm9yLCAwIG9yIDEgb24gc3VjY2Vzcywgd2l0aAorICAgMSBpbmRpY2F0aW5nIHRoYXQgZW5kLW9mLWZpbGUgd2FzIHJlYWNoZWQgKi8KK2xvY2FsIGludCBibG9hZChiaW4gKmluKQoreworICAgIGxvbmcgbGVuOworCisgICAgaWYgKGluID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAoaW4tPmxlZnQgIT0gMCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaW4tPm5leHQgPSBpbi0+YnVmOworICAgIGRvIHsKKyAgICAgICAgbGVuID0gKGxvbmcpcmVhZChpbi0+ZmQsIGluLT5idWYgKyBpbi0+bGVmdCwgQ0hVTksgLSBpbi0+bGVmdCk7CisgICAgICAgIGlmIChsZW4gPCAwKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBpbi0+bGVmdCArPSAodW5zaWduZWQpbGVuOworICAgIH0gd2hpbGUgKGxlbiAhPSAwICYmIGluLT5sZWZ0IDwgQ0hVTkspOworICAgIHJldHVybiBsZW4gPT0gMCA/IDEgOiAwOworfQorCisvKiBnZXQgYSBieXRlIGZyb20gdGhlIGZpbGUsIGJhaWwgaWYgZW5kIG9mIGZpbGUgKi8KKyNkZWZpbmUgYmdldChpbikgKGluLT5sZWZ0ID8gMCA6IGJsb2FkKGluKSwgXAorICAgICAgICAgICAgICAgICAgaW4tPmxlZnQgPyAoaW4tPmxlZnQtLSwgKihpbi0+bmV4dCkrKykgOiBcCisgICAgICAgICAgICAgICAgICAgIGJhaWwoInVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUgb24gIiwgaW4tPm5hbWUpKQorCisvKiBnZXQgYSBmb3VyLWJ5dGUgbGl0dGxlLWVuZGlhbiB1bnNpZ25lZCBpbnRlZ2VyIGZyb20gZmlsZSAqLworbG9jYWwgdW5zaWduZWQgbG9uZyBiZ2V0NChiaW4gKmluKQoreworICAgIHVuc2lnbmVkIGxvbmcgdmFsOworCisgICAgdmFsID0gYmdldChpbik7CisgICAgdmFsICs9ICh1bnNpZ25lZCBsb25nKShiZ2V0KGluKSkgPDwgODsKKyAgICB2YWwgKz0gKHVuc2lnbmVkIGxvbmcpKGJnZXQoaW4pKSA8PCAxNjsKKyAgICB2YWwgKz0gKHVuc2lnbmVkIGxvbmcpKGJnZXQoaW4pKSA8PCAyNDsKKyAgICByZXR1cm4gdmFsOworfQorCisvKiBza2lwIGJ5dGVzIGluIGZpbGUgKi8KK2xvY2FsIHZvaWQgYnNraXAoYmluICppbiwgdW5zaWduZWQgc2tpcCkKK3sKKyAgICAvKiBjaGVjayBwb2ludGVyICovCisgICAgaWYgKGluID09IE5VTEwpCisgICAgICAgIHJldHVybjsKKworICAgIC8qIGVhc3kgY2FzZSAtLSBza2lwIGJ5dGVzIGluIGJ1ZmZlciAqLworICAgIGlmIChza2lwIDw9IGluLT5sZWZ0KSB7CisgICAgICAgIGluLT5sZWZ0IC09IHNraXA7CisgICAgICAgIGluLT5uZXh0ICs9IHNraXA7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiBza2lwIHdoYXQncyBpbiBidWZmZXIsIGRpc2NhcmQgYnVmZmVyIGNvbnRlbnRzICovCisgICAgc2tpcCAtPSBpbi0+bGVmdDsKKyAgICBpbi0+bGVmdCA9IDA7CisKKyAgICAvKiBzZWVrIHBhc3QgbXVsdGlwbGVzIG9mIENIVU5LIGJ5dGVzICovCisgICAgaWYgKHNraXAgPiBDSFVOSykgeworICAgICAgICB1bnNpZ25lZCBsZWZ0OworCisgICAgICAgIGxlZnQgPSBza2lwICYgKENIVU5LIC0gMSk7CisgICAgICAgIGlmIChsZWZ0ID09IDApIHsKKyAgICAgICAgICAgIC8qIGV4YWN0IG51bWJlciBvZiBjaHVua3M6IHNlZWsgYWxsIHRoZSB3YXkgbWludXMgb25lIGJ5dGUgdG8gY2hlY2sKKyAgICAgICAgICAgICAgIGZvciBlbmQtb2YtZmlsZSB3aXRoIGEgcmVhZCAqLworICAgICAgICAgICAgbHNlZWsoaW4tPmZkLCBza2lwIC0gMSwgU0VFS19DVVIpOworICAgICAgICAgICAgaWYgKHJlYWQoaW4tPmZkLCBpbi0+YnVmLCAxKSAhPSAxKQorICAgICAgICAgICAgICAgIGJhaWwoInVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUgb24gIiwgaW4tPm5hbWUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLyogc2tpcCB0aGUgaW50ZWdyYWwgY2h1bmtzLCB1cGRhdGUgc2tpcCB3aXRoIHJlbWFpbmRlciAqLworICAgICAgICBsc2Vlayhpbi0+ZmQsIHNraXAgLSBsZWZ0LCBTRUVLX0NVUik7CisgICAgICAgIHNraXAgPSBsZWZ0OworICAgIH0KKworICAgIC8qIHJlYWQgbW9yZSBpbnB1dCBhbmQgc2tpcCByZW1haW5kZXIgKi8KKyAgICBibG9hZChpbik7CisgICAgaWYgKHNraXAgPiBpbi0+bGVmdCkKKyAgICAgICAgYmFpbCgidW5leHBlY3RlZCBlbmQgb2YgZmlsZSBvbiAiLCBpbi0+bmFtZSk7CisgICAgaW4tPmxlZnQgLT0gc2tpcDsKKyAgICBpbi0+bmV4dCArPSBza2lwOworfQorCisvKiAtLSBlbmQgb2YgYnVmZmVyZWQgaW5wdXQgZnVuY3Rpb25zIC0tICovCisKKy8qIHNraXAgdGhlIGd6aXAgaGVhZGVyIGZyb20gZmlsZSBpbiAqLworbG9jYWwgdm9pZCBnemhlYWQoYmluICppbikKK3sKKyAgICBpbnQgZmxhZ3M7CisKKyAgICAvKiB2ZXJpZnkgZ3ppcCBtYWdpYyBoZWFkZXIgYW5kIGNvbXByZXNzaW9uIG1ldGhvZCAqLworICAgIGlmIChiZ2V0KGluKSAhPSAweDFmIHx8IGJnZXQoaW4pICE9IDB4OGIgfHwgYmdldChpbikgIT0gOCkKKyAgICAgICAgYmFpbChpbi0+bmFtZSwgIiBpcyBub3QgYSB2YWxpZCBnemlwIGZpbGUiKTsKKworICAgIC8qIGdldCBhbmQgdmVyaWZ5IGZsYWdzICovCisgICAgZmxhZ3MgPSBiZ2V0KGluKTsKKyAgICBpZiAoKGZsYWdzICYgMHhlMCkgIT0gMCkKKyAgICAgICAgYmFpbCgidW5rbm93biByZXNlcnZlZCBiaXRzIHNldCBpbiAiLCBpbi0+bmFtZSk7CisKKyAgICAvKiBza2lwIG1vZGlmaWNhdGlvbiB0aW1lLCBleHRyYSBmbGFncywgYW5kIG9zICovCisgICAgYnNraXAoaW4sIDYpOworCisgICAgLyogc2tpcCBleHRyYSBmaWVsZCBpZiBwcmVzZW50ICovCisgICAgaWYgKGZsYWdzICYgNCkgeworICAgICAgICB1bnNpZ25lZCBsZW47CisKKyAgICAgICAgbGVuID0gYmdldChpbik7CisgICAgICAgIGxlbiArPSAodW5zaWduZWQpKGJnZXQoaW4pKSA8PCA4OworICAgICAgICBic2tpcChpbiwgbGVuKTsKKyAgICB9CisKKyAgICAvKiBza2lwIGZpbGUgbmFtZSBpZiBwcmVzZW50ICovCisgICAgaWYgKGZsYWdzICYgOCkKKyAgICAgICAgd2hpbGUgKGJnZXQoaW4pICE9IDApCisgICAgICAgICAgICA7CisKKyAgICAvKiBza2lwIGNvbW1lbnQgaWYgcHJlc2VudCAqLworICAgIGlmIChmbGFncyAmIDE2KQorICAgICAgICB3aGlsZSAoYmdldChpbikgIT0gMCkKKyAgICAgICAgICAgIDsKKworICAgIC8qIHNraXAgaGVhZGVyIGNyYyBpZiBwcmVzZW50ICovCisgICAgaWYgKGZsYWdzICYgMikKKyAgICAgICAgYnNraXAoaW4sIDIpOworfQorCisvKiB3cml0ZSBhIGZvdXItYnl0ZSBsaXR0bGUtZW5kaWFuIHVuc2lnbmVkIGludGVnZXIgdG8gb3V0ICovCitsb2NhbCB2b2lkIHB1dDQodW5zaWduZWQgbG9uZyB2YWwsIEZJTEUgKm91dCkKK3sKKyAgICBwdXRjKHZhbCAmIDB4ZmYsIG91dCk7CisgICAgcHV0YygodmFsID4+IDgpICYgMHhmZiwgb3V0KTsKKyAgICBwdXRjKCh2YWwgPj4gMTYpICYgMHhmZiwgb3V0KTsKKyAgICBwdXRjKCh2YWwgPj4gMjQpICYgMHhmZiwgb3V0KTsKK30KKworLyogTG9hZCB1cCB6bGliIHN0cmVhbSBmcm9tIGJ1ZmZlcmVkIGlucHV0LCBiYWlsIGlmIGVuZCBvZiBmaWxlICovCitsb2NhbCB2b2lkIHpwdWxsKHpfc3RyZWFtcCBzdHJtLCBiaW4gKmluKQoreworICAgIGlmIChpbi0+bGVmdCA9PSAwKQorICAgICAgICBibG9hZChpbik7CisgICAgaWYgKGluLT5sZWZ0ID09IDApCisgICAgICAgIGJhaWwoInVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUgb24gIiwgaW4tPm5hbWUpOworICAgIHN0cm0tPmF2YWlsX2luID0gaW4tPmxlZnQ7CisgICAgc3RybS0+bmV4dF9pbiA9IGluLT5uZXh0OworfQorCisvKiBXcml0ZSBoZWFkZXIgZm9yIGd6aXAgZmlsZSB0byBvdXQgYW5kIGluaXRpYWxpemUgdHJhaWxlci4gKi8KK2xvY2FsIHZvaWQgZ3ppbml0KHVuc2lnbmVkIGxvbmcgKmNyYywgdW5zaWduZWQgbG9uZyAqdG90LCBGSUxFICpvdXQpCit7CisgICAgZndyaXRlKCJceDFmXHg4Ylx4MDhcMFwwXDBcMFwwXDBceGZmIiwgMSwgMTAsIG91dCk7CisgICAgKmNyYyA9IGNyYzMyKDBMLCBaX05VTEwsIDApOworICAgICp0b3QgPSAwOworfQorCisvKiBDb3B5IHRoZSBjb21wcmVzc2VkIGRhdGEgZnJvbSBuYW1lLCB6ZXJvaW5nIHRoZSBsYXN0IGJsb2NrIGJpdCBvZiB0aGUgbGFzdAorICAgYmxvY2sgaWYgY2xyIGlzIHRydWUsIGFuZCBhZGRpbmcgZW1wdHkgYmxvY2tzIGFzIG5lZWRlZCB0byBnZXQgdG8gYSBieXRlCisgICBib3VuZGFyeS4gIElmIGNsciBpcyBmYWxzZSwgdGhlbiB0aGUgbGFzdCBibG9jayBiZWNvbWVzIHRoZSBsYXN0IGJsb2NrIG9mCisgICB0aGUgb3V0cHV0LCBhbmQgdGhlIGd6aXAgdHJhaWxlciBpcyB3cml0dGVuLiAgY3JjIGFuZCB0b3QgbWFpbnRhaW5zIHRoZQorICAgY3JjIGFuZCBsZW5ndGggKG1vZHVsbyAyXjMyKSBvZiB0aGUgb3V0cHV0IGZvciB0aGUgdHJhaWxlci4gIFRoZSByZXN1bHRpbmcKKyAgIGd6aXAgZmlsZSBpcyB3cml0dGVuIHRvIG91dC4gIGd6aW5pdCgpIG11c3QgYmUgY2FsbGVkIGJlZm9yZSB0aGUgZmlyc3QgY2FsbAorICAgb2YgZ3pjb3B5KCkgdG8gd3JpdGUgdGhlIGd6aXAgaGVhZGVyIGFuZCB0byBpbml0aWFsaXplIGNyYyBhbmQgdG90LiAqLworbG9jYWwgdm9pZCBnemNvcHkoY2hhciAqbmFtZSwgaW50IGNsciwgdW5zaWduZWQgbG9uZyAqY3JjLCB1bnNpZ25lZCBsb25nICp0b3QsCisgICAgICAgICAgICAgICAgICBGSUxFICpvdXQpCit7CisgICAgaW50IHJldDsgICAgICAgICAgICAgICAgLyogcmV0dXJuIHZhbHVlIGZyb20gemxpYiBmdW5jdGlvbnMgKi8KKyAgICBpbnQgcG9zOyAgICAgICAgICAgICAgICAvKiB3aGVyZSB0aGUgImxhc3QgYmxvY2siIGJpdCBpcyBpbiBieXRlICovCisgICAgaW50IGxhc3Q7ICAgICAgICAgICAgICAgLyogdHJ1ZSBpZiBwcm9jZXNzaW5nIHRoZSBsYXN0IGJsb2NrICovCisgICAgYmluICppbjsgICAgICAgICAgICAgICAgLyogYnVmZmVyZWQgaW5wdXQgZmlsZSAqLworICAgIHVuc2lnbmVkIGNoYXIgKnN0YXJ0OyAgIC8qIHN0YXJ0IG9mIGNvbXByZXNzZWQgZGF0YSBpbiBidWZmZXIgKi8KKyAgICB1bnNpZ25lZCBjaGFyICpqdW5rOyAgICAvKiBidWZmZXIgZm9yIHVuY29tcHJlc3NlZCBkYXRhIC0tIGRpc2NhcmRlZCAqLworICAgIHpfb2ZmX3QgbGVuOyAgICAgICAgICAgIC8qIGxlbmd0aCBvZiB1bmNvbXByZXNzZWQgZGF0YSAoc3VwcG9ydCA+IDQgR0IpICovCisgICAgel9zdHJlYW0gc3RybTsgICAgICAgICAgLyogemxpYiBpbmZsYXRlIHN0cmVhbSAqLworCisgICAgLyogb3BlbiBnemlwIGZpbGUgYW5kIHNraXAgaGVhZGVyICovCisgICAgaW4gPSBib3BlbihuYW1lKTsKKyAgICBpZiAoaW4gPT0gTlVMTCkKKyAgICAgICAgYmFpbCgiY291bGQgbm90IG9wZW4gIiwgbmFtZSk7CisgICAgZ3poZWFkKGluKTsKKworICAgIC8qIGFsbG9jYXRlIGJ1ZmZlciBmb3IgdW5jb21wcmVzc2VkIGRhdGEgYW5kIGluaXRpYWxpemUgcmF3IGluZmxhdGUKKyAgICAgICBzdHJlYW0gKi8KKyAgICBqdW5rID0gbWFsbG9jKENIVU5LKTsKKyAgICBzdHJtLnphbGxvYyA9IFpfTlVMTDsKKyAgICBzdHJtLnpmcmVlID0gWl9OVUxMOworICAgIHN0cm0ub3BhcXVlID0gWl9OVUxMOworICAgIHN0cm0uYXZhaWxfaW4gPSAwOworICAgIHN0cm0ubmV4dF9pbiA9IFpfTlVMTDsKKyAgICByZXQgPSBpbmZsYXRlSW5pdDIoJnN0cm0sIC0xNSk7CisgICAgaWYgKGp1bmsgPT0gTlVMTCB8fCByZXQgIT0gWl9PSykKKyAgICAgICAgYmFpbCgib3V0IG9mIG1lbW9yeSIsICIiKTsKKworICAgIC8qIGluZmxhdGUgYW5kIGNvcHkgY29tcHJlc3NlZCBkYXRhLCBjbGVhciBsYXN0LWJsb2NrIGJpdCBpZiByZXF1ZXN0ZWQgKi8KKyAgICBsZW4gPSAwOworICAgIHpwdWxsKCZzdHJtLCBpbik7CisgICAgc3RhcnQgPSBzdHJtLm5leHRfaW47CisgICAgbGFzdCA9IHN0YXJ0WzBdICYgMTsKKyAgICBpZiAobGFzdCAmJiBjbHIpCisgICAgICAgIHN0YXJ0WzBdICY9IH4xOworICAgIHN0cm0uYXZhaWxfb3V0ID0gMDsKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIC8qIGlmIGlucHV0IHVzZWQgYW5kIG91dHB1dCBkb25lLCB3cml0ZSB1c2VkIGlucHV0IGFuZCBnZXQgbW9yZSAqLworICAgICAgICBpZiAoc3RybS5hdmFpbF9pbiA9PSAwICYmIHN0cm0uYXZhaWxfb3V0ICE9IDApIHsKKyAgICAgICAgICAgIGZ3cml0ZShzdGFydCwgMSwgc3RybS5uZXh0X2luIC0gc3RhcnQsIG91dCk7CisgICAgICAgICAgICBzdGFydCA9IGluLT5idWY7CisgICAgICAgICAgICBpbi0+bGVmdCA9IDA7CisgICAgICAgICAgICB6cHVsbCgmc3RybSwgaW4pOworICAgICAgICB9CisKKyAgICAgICAgLyogZGVjb21wcmVzcyAtLSByZXR1cm4gZWFybHkgd2hlbiBlbmQtb2YtYmxvY2sgcmVhY2hlZCAqLworICAgICAgICBzdHJtLmF2YWlsX291dCA9IENIVU5LOworICAgICAgICBzdHJtLm5leHRfb3V0ID0ganVuazsKKyAgICAgICAgcmV0ID0gaW5mbGF0ZSgmc3RybSwgWl9CTE9DSyk7CisgICAgICAgIHN3aXRjaCAocmV0KSB7CisgICAgICAgIGNhc2UgWl9NRU1fRVJST1I6CisgICAgICAgICAgICBiYWlsKCJvdXQgb2YgbWVtb3J5IiwgIiIpOworICAgICAgICBjYXNlIFpfREFUQV9FUlJPUjoKKyAgICAgICAgICAgIGJhaWwoImludmFsaWQgY29tcHJlc3NlZCBkYXRhIGluICIsIGluLT5uYW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHVwZGF0ZSBsZW5ndGggb2YgdW5jb21wcmVzc2VkIGRhdGEgKi8KKyAgICAgICAgbGVuICs9IENIVU5LIC0gc3RybS5hdmFpbF9vdXQ7CisKKyAgICAgICAgLyogY2hlY2sgZm9yIGJsb2NrIGJvdW5kYXJ5IChvbmx5IGdldCB0aGlzIHdoZW4gYmxvY2sgY29waWVkIG91dCkgKi8KKyAgICAgICAgaWYgKHN0cm0uZGF0YV90eXBlICYgMTI4KSB7CisgICAgICAgICAgICAvKiBpZiB0aGF0IHdhcyB0aGUgbGFzdCBibG9jaywgdGhlbiBkb25lICovCisgICAgICAgICAgICBpZiAobGFzdCkKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgLyogbnVtYmVyIG9mIHVudXNlZCBiaXRzIGluIGxhc3QgYnl0ZSAqLworICAgICAgICAgICAgcG9zID0gc3RybS5kYXRhX3R5cGUgJiA3OworCisgICAgICAgICAgICAvKiBmaW5kIHRoZSBuZXh0IGxhc3QtYmxvY2sgYml0ICovCisgICAgICAgICAgICBpZiAocG9zICE9IDApIHsKKyAgICAgICAgICAgICAgICAvKiBuZXh0IGxhc3QtYmxvY2sgYml0IGlzIGluIGxhc3QgdXNlZCBieXRlICovCisgICAgICAgICAgICAgICAgcG9zID0gMHgxMDAgPj4gcG9zOworICAgICAgICAgICAgICAgIGxhc3QgPSBzdHJtLm5leHRfaW5bLTFdICYgcG9zOworICAgICAgICAgICAgICAgIGlmIChsYXN0ICYmIGNscikKKyAgICAgICAgICAgICAgICAgICAgc3RybS5uZXh0X2luWy0xXSAmPSB+cG9zOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgLyogbmV4dCBsYXN0LWJsb2NrIGJpdCBpcyBpbiBuZXh0IHVudXNlZCBieXRlICovCisgICAgICAgICAgICAgICAgaWYgKHN0cm0uYXZhaWxfaW4gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAvKiBkb24ndCBoYXZlIHRoYXQgYnl0ZSB5ZXQgLS0gZ2V0IGl0ICovCisgICAgICAgICAgICAgICAgICAgIGZ3cml0ZShzdGFydCwgMSwgc3RybS5uZXh0X2luIC0gc3RhcnQsIG91dCk7CisgICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gaW4tPmJ1ZjsKKyAgICAgICAgICAgICAgICAgICAgaW4tPmxlZnQgPSAwOworICAgICAgICAgICAgICAgICAgICB6cHVsbCgmc3RybSwgaW4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsYXN0ID0gc3RybS5uZXh0X2luWzBdICYgMTsKKyAgICAgICAgICAgICAgICBpZiAobGFzdCAmJiBjbHIpCisgICAgICAgICAgICAgICAgICAgIHN0cm0ubmV4dF9pblswXSAmPSB+MTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIHVwZGF0ZSBidWZmZXIgd2l0aCB1bnVzZWQgaW5wdXQgKi8KKyAgICBpbi0+bGVmdCA9IHN0cm0uYXZhaWxfaW47CisgICAgaW4tPm5leHQgPSBzdHJtLm5leHRfaW47CisKKyAgICAvKiBjb3B5IHVzZWQgaW5wdXQsIHdyaXRlIGVtcHR5IGJsb2NrcyB0byBnZXQgdG8gYnl0ZSBib3VuZGFyeSAqLworICAgIHBvcyA9IHN0cm0uZGF0YV90eXBlICYgNzsKKyAgICBmd3JpdGUoc3RhcnQsIDEsIGluLT5uZXh0IC0gc3RhcnQgLSAxLCBvdXQpOworICAgIGxhc3QgPSBpbi0+bmV4dFstMV07CisgICAgaWYgKHBvcyA9PSAwIHx8ICFjbHIpCisgICAgICAgIC8qIGFscmVhZHkgYXQgYnl0ZSBib3VuZGFyeSwgb3IgbGFzdCBmaWxlOiB3cml0ZSBsYXN0IGJ5dGUgKi8KKyAgICAgICAgcHV0YyhsYXN0LCBvdXQpOworICAgIGVsc2UgeworICAgICAgICAvKiBhcHBlbmQgZW1wdHkgYmxvY2tzIHRvIGxhc3QgYnl0ZSAqLworICAgICAgICBsYXN0ICY9ICgoMHgxMDAgPj4gcG9zKSAtIDEpOyAgICAgICAvKiBhc3N1cmUgdW51c2VkIGJpdHMgYXJlIHplcm8gKi8KKyAgICAgICAgaWYgKHBvcyAmIDEpIHsKKyAgICAgICAgICAgIC8qIG9kZCAtLSBhcHBlbmQgYW4gZW1wdHkgc3RvcmVkIGJsb2NrICovCisgICAgICAgICAgICBwdXRjKGxhc3QsIG91dCk7CisgICAgICAgICAgICBpZiAocG9zID09IDEpCisgICAgICAgICAgICAgICAgcHV0YygwLCBvdXQpOyAgICAgICAgICAgICAgIC8qIHR3byBtb3JlIGJpdHMgaW4gYmxvY2sgaGVhZGVyICovCisgICAgICAgICAgICBmd3JpdGUoIlwwXDBceGZmXHhmZiIsIDEsIDQsIG91dCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvKiBldmVuIC0tIGFwcGVuZCAxLCAyLCBvciAzIGVtcHR5IGZpeGVkIGJsb2NrcyAqLworICAgICAgICAgICAgc3dpdGNoIChwb3MpIHsKKyAgICAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgICAgICBwdXRjKGxhc3QgfCA4LCBvdXQpOworICAgICAgICAgICAgICAgIGxhc3QgPSAwOworICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgIHB1dGMobGFzdCB8IDB4MjAsIG91dCk7CisgICAgICAgICAgICAgICAgbGFzdCA9IDA7CisgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgcHV0YyhsYXN0IHwgMHg4MCwgb3V0KTsKKyAgICAgICAgICAgICAgICBwdXRjKDAsIG91dCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiB1cGRhdGUgY3JjIGFuZCB0b3QgKi8KKyAgICAqY3JjID0gY3JjMzJfY29tYmluZSgqY3JjLCBiZ2V0NChpbiksIGxlbik7CisgICAgKnRvdCArPSAodW5zaWduZWQgbG9uZylsZW47CisKKyAgICAvKiBjbGVhbiB1cCAqLworICAgIGluZmxhdGVFbmQoJnN0cm0pOworICAgIGZyZWUoanVuayk7CisgICAgYmNsb3NlKGluKTsKKworICAgIC8qIHdyaXRlIHRyYWlsZXIgaWYgdGhpcyBpcyB0aGUgbGFzdCBnemlwIGZpbGUgKi8KKyAgICBpZiAoIWNscikgeworICAgICAgICBwdXQ0KCpjcmMsIG91dCk7CisgICAgICAgIHB1dDQoKnRvdCwgb3V0KTsKKyAgICB9Cit9CisKKy8qIGpvaW4gdGhlIGd6aXAgZmlsZXMgb24gdGhlIGNvbW1hbmQgbGluZSwgd3JpdGUgcmVzdWx0IHRvIHN0ZG91dCAqLworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICAgIHVuc2lnbmVkIGxvbmcgY3JjLCB0b3Q7ICAgICAvKiBydW5uaW5nIGNyYyBhbmQgdG90YWwgdW5jb21wcmVzc2VkIGxlbmd0aCAqLworCisgICAgLyogc2tpcCBjb21tYW5kIG5hbWUgKi8KKyAgICBhcmdjLS07CisgICAgYXJndisrOworCisgICAgLyogc2hvdyB1c2FnZSBpZiBubyBhcmd1bWVudHMgKi8KKyAgICBpZiAoYXJnYyA9PSAwKSB7CisgICAgICAgIGZwdXRzKCJnempvaW4gdXNhZ2U6IGd6am9pbiBmMS5neiBbZjIuZ3ogW2YzLmd6IC4uLl1dID4gZmpvaW4uZ3pcbiIsCisgICAgICAgICAgICAgIHN0ZGVycik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qIGpvaW4gZ3ppcCBmaWxlcyBvbiBjb21tYW5kIGxpbmUgYW5kIHdyaXRlIHRvIHN0ZG91dCAqLworICAgIGd6aW5pdCgmY3JjLCAmdG90LCBzdGRvdXQpOworICAgIHdoaWxlIChhcmdjLS0pCisgICAgICAgIGd6Y29weSgqYXJndisrLCBhcmdjLCAmY3JjLCAmdG90LCBzdGRvdXQpOworCisgICAgLyogZG9uZSAqLworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvemxpYi0xLjIuNi9leGFtcGxlcy9nemxvZy5jIGIvemxpYi0xLjIuNi9leGFtcGxlcy9nemxvZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3MGFhY2EKLS0tIC9kZXYvbnVsbAorKysgYi96bGliLTEuMi42L2V4YW1wbGVzL2d6bG9nLmMKQEAgLTAsMCArMSwxMDU4IEBACisvKgorICogZ3psb2cuYworICogQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA4IE1hcmsgQWRsZXIsIGFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiBnemxvZy5oCisgKiB2ZXJzaW9uIDIuMCwgMjUgQXByIDIwMDgKKyAqLworCisvKgorICAgZ3psb2cgcHJvdmlkZXMgYSBtZWNoYW5pc20gZm9yIGZyZXF1ZW50bHkgYXBwZW5kaW5nIHNob3J0IHN0cmluZ3MgdG8gYSBnemlwCisgICBmaWxlIHRoYXQgaXMgZWZmaWNpZW50IGJvdGggaW4gZXhlY3V0aW9uIHRpbWUgYW5kIGNvbXByZXNzaW9uIHJhdGlvLiAgVGhlCisgICBzdHJhdGVneSBpcyB0byB3cml0ZSB0aGUgc2hvcnQgc3RyaW5ncyBpbiBhbiB1bmNvbXByZXNzZWQgZm9ybSB0byB0aGUgZW5kIG9mCisgICB0aGUgZ3ppcCBmaWxlLCBvbmx5IGNvbXByZXNzaW5nIHdoZW4gdGhlIGFtb3VudCBvZiB1bmNvbXByZXNzZWQgZGF0YSBoYXMKKyAgIHJlYWNoZWQgYSBnaXZlbiB0aHJlc2hvbGQuCisKKyAgIGd6bG9nIGFsc28gcHJvdmlkZXMgcHJvdGVjdGlvbiBhZ2FpbnN0IGludGVycnVwdGlvbnMgaW4gdGhlIHByb2Nlc3MgZHVlIHRvCisgICBzeXN0ZW0gY3Jhc2hlcy4gIFRoZSBzdGF0dXMgb2YgdGhlIG9wZXJhdGlvbiBpcyByZWNvcmRlZCBpbiBhbiBleHRyYSBmaWVsZAorICAgaW4gdGhlIGd6aXAgZmlsZSwgYW5kIGlzIG9ubHkgdXBkYXRlZCBvbmNlIHRoZSBnemlwIGZpbGUgaXMgYnJvdWdodCB0byBhCisgICB2YWxpZCBzdGF0ZS4gIFRoZSBsYXN0IGRhdGEgdG8gYmUgYXBwZW5kZWQgb3IgY29tcHJlc3NlZCBpcyBzYXZlZCBpbiBhbgorICAgYXV4aWxpYXJ5IGZpbGUsIHNvIHRoYXQgaWYgdGhlIG9wZXJhdGlvbiBpcyBpbnRlcnJ1cHRlZCwgaXQgY2FuIGJlIGNvbXBsZXRlZAorICAgdGhlIG5leHQgdGltZSBhbiBhcHBlbmQgb3BlcmF0aW9uIGlzIGF0dGVtcHRlZC4KKworICAgZ3psb2cgbWFpbnRhaW5zIGFub3RoZXIgYXV4aWxpYXJ5IGZpbGUgd2l0aCB0aGUgbGFzdCAzMksgb2YgZGF0YSBmcm9tIHRoZQorICAgY29tcHJlc3NlZCBwb3J0aW9uLCB3aGljaCBpcyBwcmVsb2FkZWQgZm9yIHRoZSBjb21wcmVzc2lvbiBvZiB0aGUgc3Vic2VxdWVudAorICAgZGF0YS4gIFRoaXMgbWluaW1pemVzIHRoZSBpbXBhY3QgdG8gdGhlIGNvbXByZXNzaW9uIHJhdGlvIG9mIGFwcGVuZGluZy4KKyAqLworCisvKgorICAgT3BlcmF0aW9ucyBDb25jZXB0OgorCisgICBGaWxlcyAobG9nIG5hbWUgImZvbyIpOgorICAgZm9vLmd6IC0tIGd6aXAgZmlsZSB3aXRoIHRoZSBjb21wbGV0ZSBsb2cKKyAgIGZvby5hZGQgLS0gbGFzdCBtZXNzYWdlIHRvIGFwcGVuZCBvciBsYXN0IGRhdGEgdG8gY29tcHJlc3MKKyAgIGZvby5kaWN0IC0tIGRpY3Rpb25hcnkgb2YgdGhlIGxhc3QgMzJLIG9mIGRhdGEgZm9yIG5leHQgY29tcHJlc3Npb24KKyAgIGZvby50ZW1wIC0tIHRlbXBvcmFyeSBkaWN0aW9uYXJ5IGZpbGUgZm9yIGNvbXByZXNzaW9uIGFmdGVyIHRoaXMgb25lCisgICBmb28ubG9jayAtLSBsb2NrIGZpbGUgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcgdGhlIG90aGVyIGZpbGVzCisgICBmb28ucmVwYWlycyAtLSBsb2cgZmlsZSBmb3IgbG9nIGZpbGUgcmVjb3Zlcnkgb3BlcmF0aW9ucyAobm90IGNvbXByZXNzZWQpCisKKyAgIGd6aXAgZmlsZSBzdHJ1Y3R1cmU6CisgICAtIGZpeGVkLWxlbmd0aCAobm8gZmlsZSBuYW1lKSBoZWFkZXIgd2l0aCBleHRyYSBmaWVsZCAoc2VlIGJlbG93KQorICAgLSBjb21wcmVzc2VkIGRhdGEgZW5kaW5nIGluaXRpYWxseSB3aXRoIGVtcHR5IHN0b3JlZCBibG9jaworICAgLSB1bmNvbXByZXNzZWQgZGF0YSBmaWxsaW5nIG91dCBvcmlnaW5hbGx5IGVtcHR5IHN0b3JlZCBibG9jayBhbmQKKyAgICAgc3Vic2VxdWVudCBzdG9yZWQgYmxvY2tzIGFzIG5lZWRlZCAoMTZLIG1heCBlYWNoKQorICAgLSBnemlwIHRyYWlsZXIKKyAgIC0gbm8ganVuayBhdCBlbmQgKG5vIG90aGVyIGd6aXAgc3RyZWFtcykKKworICAgV2hlbiBhcHBlbmRpbmcgZGF0YSwgdGhlIGluZm9ybWF0aW9uIGluIHRoZSBmaXJzdCB0aHJlZSBpdGVtcyBhYm92ZSBwbHVzIHRoZQorICAgZm9vLmFkZCBmaWxlIGFyZSBzdWZmaWNpZW50IHRvIHJlY292ZXIgYW4gaW50ZXJydXB0ZWQgYXBwZW5kIG9wZXJhdGlvbi4gIFRoZQorICAgZXh0cmEgZmllbGQgaGFzIHRoZSBuZWNlc3NhcnkgaW5mb3JtYXRpb24gdG8gcmVzdG9yZSB0aGUgc3RhcnQgb2YgdGhlIGxhc3QKKyAgIHN0b3JlZCBibG9jayBhbmQgZGV0ZXJtaW5lIHdoZXJlIHRvIGFwcGVuZCB0aGUgZGF0YSBpbiB0aGUgZm9vLmFkZCBmaWxlLCBhcworICAgd2VsbCBhcyB0aGUgY3JjIGFuZCBsZW5ndGggb2YgdGhlIGd6aXAgZGF0YSBiZWZvcmUgdGhlIGFwcGVuZCBvcGVyYXRpb24uCisKKyAgIFRoZSBmb28uYWRkIGZpbGUgaXMgY3JlYXRlZCBiZWZvcmUgdGhlIGd6aXAgZmlsZSBpcyBtYXJrZWQgZm9yIGFwcGVuZCwgYW5kCisgICBkZWxldGVkIGFmdGVyIHRoZSBnemlwIGZpbGUgaXMgbWFya2VkIGFzIGNvbXBsZXRlLiAgU28gaWYgdGhlIGFwcGVuZAorICAgb3BlcmF0aW9uIGlzIGludGVycnVwdGVkLCB0aGUgZGF0YSB0byBhZGQgd2lsbCBzdGlsbCBiZSB0aGVyZS4gIElmIGR1ZSB0bworICAgc29tZSBleHRlcm5hbCBmb3JjZSwgdGhlIGZvby5hZGQgZmlsZSBnZXRzIGRlbGV0ZWQgYmV0d2VlbiB3aGVuIHRoZSBhcHBlbmQKKyAgIG9wZXJhdGlvbiB3YXMgaW50ZXJydXB0ZWQgYW5kIHdoZW4gcmVjb3ZlcnkgaXMgYXR0ZW1wdGVkLCB0aGUgZ3ppcCBmaWxlIHdpbGwKKyAgIHN0aWxsIGJlIHJlc3RvcmVkLCBidXQgd2l0aG91dCB0aGUgYXBwZW5kZWQgZGF0YS4KKworICAgV2hlbiBjb21wcmVzc2luZyBkYXRhLCB0aGUgaW5mb3JtYXRpb24gaW4gdGhlIGZpcnN0IHR3byBpdGVtcyBhYm92ZSBwbHVzIHRoZQorICAgZm9vLmFkZCBmaWxlIGFyZSBzdWZmaWNpZW50IHRvIHJlY292ZXIgYW4gaW50ZXJydXB0ZWQgY29tcHJlc3Mgb3BlcmF0aW9uLgorICAgVGhlIGV4dHJhIGZpZWxkIGhhcyB0aGUgbmVjZXNzYXJ5IGluZm9ybWF0aW9uIHRvIGZpbmQgdGhlIGVuZCBvZiB0aGUKKyAgIGNvbXByZXNzZWQgZGF0YSwgYW5kIGNvbnRhaW5zIGJvdGggdGhlIGNyYyBhbmQgbGVuZ3RoIG9mIGp1c3QgdGhlIGNvbXByZXNzZWQKKyAgIGRhdGEgYW5kIG9mIHRoZSBjb21wbGV0ZSBzZXQgb2YgZGF0YSBpbmNsdWRpbmcgdGhlIGNvbnRlbnRzIG9mIHRoZSBmb28uYWRkCisgICBmaWxlLgorCisgICBBZ2FpbiwgdGhlIGZvby5hZGQgZmlsZSBpcyBtYWludGFpbmVkIGR1cmluZyB0aGUgY29tcHJlc3Mgb3BlcmF0aW9uIGluIGNhc2UKKyAgIG9mIGFuIGludGVycnVwdGlvbi4gIElmIGluIHRoZSB1bmxpa2VseSBldmVudCB0aGUgZm9vLmFkZCBmaWxlIHdpdGggdGhlIGRhdGEKKyAgIHRvIGJlIGNvbXByZXNzZWQgaXMgbWlzc2luZyBkdWUgdG8gc29tZSBleHRlcm5hbCBmb3JjZSwgYSBnemlwIGZpbGUgd2l0aAorICAganVzdCB0aGUgcHJldmlvdXMgY29tcHJlc3NlZCBkYXRhIHdpbGwgYmUgcmVjb25zdHJ1Y3RlZC4gIEluIHRoaXMgY2FzZSwgYWxsCisgICBvZiB0aGUgZGF0YSB0aGF0IHdhcyB0byBiZSBjb21wcmVzc2VkIGlzIGxvc3QgKGFwcHJveGltYXRlbHkgb25lIG1lZ2FieXRlKS4KKyAgIFRoaXMgd2lsbCBub3Qgb2NjdXIgaWYgYWxsIHRoYXQgaGFwcGVuZWQgd2FzIGFuIGludGVycnVwdGlvbiBvZiB0aGUgY29tcHJlc3MKKyAgIG9wZXJhdGlvbi4KKworICAgVGhlIHRoaXJkIHN0YXRlIHRoYXQgaXMgbWFya2VkIGlzIHRoZSByZXBsYWNlbWVudCBvZiB0aGUgb2xkIGRpY3Rpb25hcnkgd2l0aAorICAgdGhlIG5ldyBkaWN0aW9uYXJ5IGFmdGVyIGEgY29tcHJlc3Mgb3BlcmF0aW9uLiAgT25jZSBjb21wcmVzc2lvbiBpcworICAgY29tcGxldGUsIHRoZSBnemlwIGZpbGUgaXMgbWFya2VkIGFzIGJlaW5nIGluIHRoZSByZXBsYWNlIHN0YXRlLiAgVGhpcworICAgY29tcGxldGVzIHRoZSBnemlwIGZpbGUsIHNvIGFuIGludGVycnVwdCBhZnRlciBiZWluZyBzbyBtYXJrZWQgZG9lcyBub3QKKyAgIHJlc3VsdCBpbiByZWNvbXByZXNzaW9uLiAgVGhlbiB0aGUgZGljdGlvbmFyeSBmaWxlIGlzIHJlcGxhY2VkLCBhbmQgdGhlIGd6aXAKKyAgIGZpbGUgaXMgbWFya2VkIGFzIGNvbXBsZXRlZC4gIFRoaXMgc3RhdGUgcHJldmVudHMgdGhlIHBvc3NpYmlsaXR5IG9mCisgICByZXN0YXJ0aW5nIGNvbXByZXNzaW9uIHdpdGggdGhlIHdyb25nIGRpY3Rpb25hcnkgZmlsZS4KKworICAgQWxsIHRocmVlIG9wZXJhdGlvbnMgYXJlIHdyYXBwZWQgYnkgYSBsb2NrL3VubG9jayBwcm9jZWR1cmUuICBJbiBvcmRlciB0bworICAgZ2FpbiBleGNsdXNpdmUgYWNjZXNzIHRvIHRoZSBsb2cgZmlsZXMsIGZpcnN0IGEgZm9vLmxvY2sgZmlsZSBtdXN0IGJlCisgICBleGNsdXNpdmVseSBjcmVhdGVkLiAgV2hlbiBhbGwgb3BlcmF0aW9ucyBhcmUgY29tcGxldGUsIHRoZSBsb2NrIGlzCisgICByZWxlYXNlZCBieSBkZWxldGluZyB0aGUgZm9vLmxvY2sgZmlsZS4gIElmIHdoZW4gYXR0ZW1wdGluZyB0byBjcmVhdGUgdGhlCisgICBsb2NrIGZpbGUsIGl0IGFscmVhZHkgZXhpc3RzIGFuZCB0aGUgbW9kaWZ5IHRpbWUgb2YgdGhlIGxvY2sgZmlsZSBpcyBtb3JlCisgICB0aGFuIGZpdmUgbWludXRlcyBvbGQgKHNldCBieSB0aGUgUEFUSUVOQ0UgZGVmaW5lIGJlbG93KSwgdGhlbiB0aGUgb2xkCisgICBsb2NrIGZpbGUgaXMgY29uc2lkZXJlZCBzdGFsZSBhbmQgZGVsZXRlZCwgYW5kIHRoZSBleGNsdXNpdmUgY3JlYXRpb24gb2YKKyAgIHRoZSBsb2NrIGZpbGUgaXMgcmV0cmllZC4gIFRvIGFzc3VyZSB0aGF0IHRoZXJlIGFyZSBubyBmYWxzZSBhc3Nlc3NtZW50cworICAgb2YgdGhlIHN0YWxlbmVzcyBvZiB0aGUgbG9jayBmaWxlLCB0aGUgb3BlcmF0aW9ucyBwZXJpb2RpY2FsbHkgdG91Y2ggdGhlCisgICBsb2NrIGZpbGUgdG8gdXBkYXRlIHRoZSBtb2RpZmllZCBkYXRlLgorCisgICBGb2xsb3dpbmcgaXMgdGhlIGRlZmluaXRpb24gb2YgdGhlIGV4dHJhIGZpZWxkIHdpdGggYWxsIG9mIHRoZSBpbmZvcm1hdGlvbgorICAgcmVxdWlyZWQgdG8gZW5hYmxlIHRoZSBhYm92ZSBhcHBlbmQgYW5kIGNvbXByZXNzIG9wZXJhdGlvbnMgYW5kIHRoZWlyCisgICByZWNvdmVyeSBpZiBpbnRlcnJ1cHRlZC4gIE11bHRpLWJ5dGUgdmFsdWVzIGFyZSBzdG9yZWQgbGl0dGxlIGVuZGlhbgorICAgKGNvbnNpc3RlbnQgd2l0aCB0aGUgZ3ppcCBmb3JtYXQpLiAgRmlsZSBwb2ludGVycyBhcmUgZWlnaHQgYnl0ZXMgbG9uZy4KKyAgIFRoZSBjcmMncyBhbmQgbGVuZ3RocyBmb3IgdGhlIGd6aXAgdHJhaWxlciBhcmUgZm91ciBieXRlcyBsb25nLiAgKE5vdGUgdGhhdAorICAgdGhlIGxlbmd0aCBhdCB0aGUgZW5kIG9mIGEgZ3ppcCBmaWxlIGlzIHVzZWQgZm9yIGVycm9yIGNoZWNraW5nIG9ubHksIGFuZAorICAgZm9yIGxhcmdlIGZpbGVzIGlzIGFjdHVhbGx5IHRoZSBsZW5ndGggbW9kdWxvIDJeMzIuKSAgVGhlIHN0b3JlZCBibG9jaworICAgbGVuZ3RoIGlzIHR3byBieXRlcyBsb25nLiAgVGhlIGd6aXAgZXh0cmEgZmllbGQgdHdvLWJ5dGUgaWRlbnRpZmljYXRpb24gaXMKKyAgICJhcCIgZm9yIGFwcGVuZC4gIEl0IGlzIGFzc3VtZWQgdGhhdCB3cml0aW5nIHRoZSBleHRyYSBmaWVsZCB0byB0aGUgZmlsZSBpcworICAgYW4gImF0b21pYyIgb3BlcmF0aW9uLiAgVGhhdCBpcywgZWl0aGVyIGFsbCBvZiB0aGUgZXh0cmEgZmllbGQgaXMgd3JpdHRlbgorICAgdG8gdGhlIGZpbGUsIG9yIG5vbmUgb2YgaXQgaXMsIGlmIHRoZSBvcGVyYXRpb24gaXMgaW50ZXJydXB0ZWQgcmlnaHQgYXQgdGhlCisgICBwb2ludCBvZiB1cGRhdGluZyB0aGUgZXh0cmEgZmllbGQuICBUaGlzIGlzIGEgcmVhc29uYWJsZSBhc3N1bXB0aW9uLCBzaW5jZQorICAgdGhlIGV4dHJhIGZpZWxkIGlzIHdpdGhpbiB0aGUgZmlyc3QgNTIgYnl0ZXMgb2YgdGhlIGZpbGUsIHdoaWNoIGlzIHNtYWxsZXIKKyAgIHRoYW4gYW55IGV4cGVjdGVkIGJsb2NrIHNpemUgZm9yIGEgbWFzcyBzdG9yYWdlIGRldmljZSAodXN1YWxseSA1MTIgYnl0ZXMgb3IKKyAgIGxhcmdlcikuCisKKyAgIEV4dHJhIGZpZWxkICgzNSBieXRlcyk6CisgICAtIFBvaW50ZXIgdG8gZmlyc3Qgc3RvcmVkIGJsb2NrIGxlbmd0aCAtLSB0aGlzIHBvaW50cyB0byB0aGUgdHdvLWJ5dGUgbGVuZ3RoCisgICAgIG9mIHRoZSBmaXJzdCBzdG9yZWQgYmxvY2ssIHdoaWNoIGlzIGZvbGxvd2VkIGJ5IHRoZSB0d28tYnl0ZSwgb25lJ3MKKyAgICAgY29tcGxlbWVudCBvZiB0aGF0IGxlbmd0aC4gIFRoZSBzdG9yZWQgYmxvY2sgbGVuZ3RoIGlzIHByZWNlZGVkIGJ5IHRoZQorICAgICB0aHJlZS1iaXQgaGVhZGVyIG9mIHRoZSBzdG9yZWQgYmxvY2ssIHdoaWNoIGlzIHRoZSBhY3R1YWwgc3RhcnQgb2YgdGhlCisgICAgIHN0b3JlZCBibG9jayBpbiB0aGUgZGVmbGF0ZSBmb3JtYXQuICBTZWUgdGhlIGJpdCBvZmZzZXQgZmllbGQgYmVsb3cuCisgICAtIFBvaW50ZXIgdG8gdGhlIGxhc3Qgc3RvcmVkIGJsb2NrIGxlbmd0aC4gIFRoaXMgaXMgdGhlIHNhbWUgYXMgYWJvdmUsIGJ1dAorICAgICBmb3IgdGhlIGxhc3Qgc3RvcmVkIGJsb2NrIG9mIHRoZSB1bmNvbXByZXNzZWQgZGF0YSBpbiB0aGUgZ3ppcCBmaWxlLgorICAgICBJbml0aWFsbHkgdGhpcyBpcyB0aGUgc2FtZSBhcyB0aGUgZmlyc3Qgc3RvcmVkIGJsb2NrIGxlbmd0aCBwb2ludGVyLgorICAgICBXaGVuIHRoZSBzdG9yZWQgYmxvY2sgZ2V0cyB0byAxNksgKHNlZSB0aGUgTUFYX1NUT1JFIGRlZmluZSksIHRoZW4gYSBuZXcKKyAgICAgc3RvcmVkIGJsb2NrIGFzIGFkZGVkLCBhdCB3aGljaCBwb2ludCB0aGUgbGFzdCBzdG9yZWQgYmxvY2sgbGVuZ3RoIHBvaW50ZXIKKyAgICAgaXMgZGlmZmVyZW50IGZyb20gdGhlIGZpcnN0IHN0b3JlZCBibG9jayBsZW5ndGggcG9pbnRlci4gIFdoZW4gdGhleSBhcmUKKyAgICAgZGlmZmVyZW50LCB0aGUgZmlyc3QgYml0IG9mIHRoZSBsYXN0IHN0b3JlZCBibG9jayBoZWFkZXIgaXMgZWlnaHQgYml0cywgb3IKKyAgICAgb25lIGJ5dGUgYmFjayBmcm9tIHRoZSBibG9jayBsZW5ndGguCisgICAtIENvbXByZXNzZWQgZGF0YSBjcmMgYW5kIGxlbmd0aC4gIFRoaXMgaXMgdGhlIGNyYyBhbmQgbGVuZ3RoIG9mIHRoZSBkYXRhCisgICAgIHRoYXQgaXMgaW4gdGhlIGNvbXByZXNzZWQgcG9ydGlvbiBvZiB0aGUgZGVmbGF0ZSBzdHJlYW0uICBUaGVzZSBhcmUgdXNlZAorICAgICBvbmx5IGluIHRoZSBldmVudCB0aGF0IHRoZSBmb28uYWRkIGZpbGUgY29udGFpbmluZyB0aGUgZGF0YSB0byBjb21wcmVzcyBpcworICAgICBsb3N0IGFmdGVyIGEgY29tcHJlc3Mgb3BlcmF0aW9uIGlzIGludGVycnVwdGVkLgorICAgLSBUb3RhbCBkYXRhIGNyYyBhbmQgbGVuZ3RoLiAgVGhpcyBpcyB0aGUgY3JjIGFuZCBsZW5ndGggb2YgYWxsIG9mIHRoZSBkYXRhCisgICAgIHN0b3JlZCBpbiB0aGUgZ3ppcCBmaWxlLCBjb21wcmVzc2VkIGFuZCB1bmNvbXByZXNzZWQuICBJdCBpcyB1c2VkIHRvCisgICAgIHJlY29uc3RydWN0IHRoZSBnemlwIHRyYWlsZXIgd2hlbiBjb21wcmVzc2luZywgYXMgd2VsbCBhcyB3aGVuIHJlY292ZXJpbmcKKyAgICAgaW50ZXJydXB0ZWQgb3BlcmF0aW9ucy4KKyAgIC0gRmluYWwgc3RvcmVkIGJsb2NrIGxlbmd0aC4gIFRoaXMgaXMgdXNlZCB0byBxdWlja2x5IGZpbmQgd2hlcmUgdG8gYXBwZW5kLAorICAgICBhbmQgYWxsb3dzIHRoZSByZXN0b3JhdGlvbiBvZiB0aGUgb3JpZ2luYWwgZmluYWwgc3RvcmVkIGJsb2NrIHN0YXRlIHdoZW4KKyAgICAgYW4gYXBwZW5kIG9wZXJhdGlvbiBpcyBpbnRlcnJ1cHRlZC4KKyAgIC0gRmlyc3Qgc3RvcmVkIGJsb2NrIHN0YXJ0IGFzIHRoZSBudW1iZXIgb2YgYml0cyBiYWNrIGZyb20gdGhlIGZpbmFsIHN0b3JlZAorICAgICBibG9jayBmaXJzdCBsZW5ndGggYnl0ZS4gIFRoaXMgdmFsdWUgaXMgaW4gdGhlIHJhbmdlIG9mIDMuLjEwLCBhbmQgaXMKKyAgICAgc3RvcmVkIGFzIHRoZSBsb3cgdGhyZWUgYml0cyBvZiB0aGUgZmluYWwgYnl0ZSBvZiB0aGUgZXh0cmEgZmllbGQgYWZ0ZXIKKyAgICAgc3VidHJhY3RpbmcgdGhyZWUgKDAuLjcpLiAgVGhpcyBhbGxvd3MgdGhlIGxhc3QtYmxvY2sgYml0IG9mIHRoZSBzdG9yZWQKKyAgICAgYmxvY2sgaGVhZGVyIHRvIGJlIHVwZGF0ZWQgd2hlbiBhIG5ldyBzdG9yZWQgYmxvY2sgaXMgYWRkZWQsIGZvciB0aGUgY2FzZQorICAgICB3aGVuIHRoZSBmaXJzdCBzdG9yZWQgYmxvY2sgYW5kIHRoZSBsYXN0IHN0b3JlZCBibG9jayBhcmUgdGhlIHNhbWUuICAoV2hlbgorICAgICB0aGV5IGFyZSBkaWZmZXJlbnQsIHRoZSBudW1iZXJzIG9mIGJpdHMgYmFjayBpcyBrbm93biB0byBiZSBlaWdodC4pICBUaGlzCisgICAgIGFsc28gYWxsb3dzIGZvciBuZXcgY29tcHJlc3NlZCBkYXRhIHRvIGJlIGFwcGVuZGVkIHRvIHRoZSBvbGQgY29tcHJlc3NlZAorICAgICBkYXRhIGluIHRoZSBjb21wcmVzcyBvcGVyYXRpb24sIG92ZXJ3cml0aW5nIHRoZSBwcmV2aW91cyBmaXJzdCBzdG9yZWQKKyAgICAgYmxvY2ssIG9yIGZvciB0aGUgY29tcHJlc3NlZCBkYXRhIHRvIGJlIHRlcm1pbmF0ZWQgYW5kIGEgdmFsaWQgZ3ppcCBmaWxlCisgICAgIHJlY29uc3RydWN0ZWQgb24gdGhlIG9mZiBjaGFuY2UgdGhhdCBhIGNvbXByZXNzaW9uIG9wZXJhdGlvbiB3YXMKKyAgICAgaW50ZXJydXB0ZWQgYW5kIHRoZSBkYXRhIHRvIGNvbXByZXNzIGluIHRoZSBmb28uYWRkIGZpbGUgd2FzIGRlbGV0ZWQuCisgICAtIFRoZSBvcGVyYXRpb24gaW4gcHJvY2Vzcy4gIFRoaXMgaXMgdGhlIG5leHQgdHdvIGJpdHMgaW4gdGhlIGxhc3QgYnl0ZSAodGhlCisgICAgIGJpdHMgdW5kZXIgdGhlIG1hc2sgMHgxOCkuICBUaGUgYXJlIGludGVycHJldGVkIGFzIDA6IG5vdGhpbmcgaW4gcHJvY2VzcywKKyAgICAgMTogYXBwZW5kIGluIHByb2Nlc3MsIDI6IGNvbXByZXNzIGluIHByb2Nlc3MsIDM6IHJlcGxhY2UgaW4gcHJvY2Vzcy4KKyAgIC0gVGhlIHRvcCB0aHJlZSBiaXRzIG9mIHRoZSBsYXN0IGJ5dGUgaW4gdGhlIGV4dHJhIGZpZWxkIGFyZSByZXNlcnZlZCBhbmQKKyAgICAgYXJlIGN1cnJlbnRseSBzZXQgdG8gemVyby4KKworICAgTWFpbiBwcm9jZWR1cmU6CisgICAtIEV4Y2x1c2l2ZWx5IGNyZWF0ZSB0aGUgZm9vLmxvY2sgZmlsZSB1c2luZyB0aGUgT19DUkVBVCBhbmQgT19FWENMIG1vZGVzIG9mCisgICAgIHRoZSBzeXN0ZW0gb3BlbigpIGNhbGwuICBJZiB0aGUgbW9kaWZ5IHRpbWUgb2YgYW4gZXhpc3RpbmcgbG9jayBmaWxlIGlzCisgICAgIG1vcmUgdGhhbiBQQVRJRU5DRSBzZWNvbmRzIG9sZCwgdGhlbiB0aGUgbG9jayBmaWxlIGlzIGRlbGV0ZWQgYW5kIHRoZQorICAgICBleGNsdXNpdmUgY3JlYXRlIGlzIHJldHJpZWQuCisgICAtIExvYWQgdGhlIGV4dHJhIGZpZWxkIGZyb20gdGhlIGZvby5neiBmaWxlLCBhbmQgc2VlIGlmIGFuIG9wZXJhdGlvbiB3YXMgaW4KKyAgICAgcHJvZ3Jlc3MgYnV0IG5vdCBjb21wbGV0ZWQuICBJZiBzbywgYXBwbHkgdGhlIHJlY292ZXJ5IHByb2NlZHVyZSBiZWxvdy4KKyAgIC0gUGVyZm9ybSB0aGUgYXBwZW5kIHByb2NlZHVyZSB3aXRoIHRoZSBwcm92aWRlZCBkYXRhLgorICAgLSBJZiB0aGUgdW5jb21wcmVzc2VkIGRhdGEgaW4gdGhlIGZvby5neiBmaWxlIGlzIDFNQiBvciBtb3JlLCBhcHBseSB0aGUKKyAgICAgY29tcHJlc3MgcHJvY2VkdXJlLgorICAgLSBEZWxldGUgdGhlIGZvby5sb2NrIGZpbGUuCisKKyAgIEFwcGVuZCBwcm9jZWR1cmU6CisgICAtIFB1dCB3aGF0IHRvIGFwcGVuZCBpbiB0aGUgZm9vLmFkZCBmaWxlIHNvIHRoYXQgdGhlIG9wZXJhdGlvbiBjYW4gYmUKKyAgICAgcmVzdGFydGVkIGlmIHRoaXMgcHJvY2VkdXJlIGlzIGludGVycnVwdGVkLgorICAgLSBNYXJrIHRoZSBmb28uZ3ogZXh0cmEgZmllbGQgd2l0aCB0aGUgYXBwZW5kIG9wZXJhdGlvbiBpbiBwcm9ncmVzcy4KKyAgICsgUmVzdG9yZSB0aGUgb3JpZ2luYWwgbGFzdC1ibG9jayBiaXQgYW5kIHN0b3JlZCBibG9jayBsZW5ndGggb2YgdGhlIGxhc3QKKyAgICAgc3RvcmVkIGJsb2NrIGZyb20gdGhlIGluZm9ybWF0aW9uIGluIHRoZSBleHRyYSBmaWVsZCwgaW4gY2FzZSBhIHByZXZpb3VzCisgICAgIGFwcGVuZCBvcGVyYXRpb24gd2FzIGludGVycnVwdGVkLgorICAgLSBBcHBlbmQgdGhlIHByb3ZpZGVkIGRhdGEgdG8gdGhlIGxhc3Qgc3RvcmVkIGJsb2NrLCBjcmVhdGluZyBuZXcgc3RvcmVkCisgICAgIGJsb2NrcyBhcyBuZWVkZWQgYW5kIHVwZGF0aW5nIHRoZSBzdG9yZWQgYmxvY2tzIGxhc3QtYmxvY2sgYml0cyBhbmQKKyAgICAgbGVuZ3Rocy4KKyAgIC0gVXBkYXRlIHRoZSBjcmMgYW5kIGxlbmd0aCB3aXRoIHRoZSBuZXcgZGF0YSwgYW5kIHdyaXRlIHRoZSBnemlwIHRyYWlsZXIuCisgICAtIFdyaXRlIG92ZXIgdGhlIGV4dHJhIGZpZWxkICh3aXRoIGEgc2luZ2xlIHdyaXRlIG9wZXJhdGlvbikgd2l0aCB0aGUgbmV3CisgICAgIHBvaW50ZXJzLCBsZW5ndGhzLCBhbmQgY3JjJ3MsIGFuZCBtYXJrIHRoZSBnemlwIGZpbGUgYXMgbm90IGluIHByb2Nlc3MuCisgICAgIFRob3VnaCB0aGVyZSBpcyBzdGlsbCBhIGZvby5hZGQgZmlsZSwgaXQgd2lsbCBiZSBpZ25vcmVkIHNpbmNlIG5vdGhpbmcKKyAgICAgaXMgaW4gcHJvY2Vzcy4gIElmIGEgZm9vLmFkZCBmaWxlIGlzIGxlZnRvdmVyIGZyb20gYSBwcmV2aW91c2x5CisgICAgIGNvbXBsZXRlZCBvcGVyYXRpb24sIGl0IGlzIHRydW5jYXRlZCB3aGVuIHdyaXRpbmcgbmV3IGRhdGEgdG8gaXQuCisgICAtIERlbGV0ZSB0aGUgZm9vLmFkZCBmaWxlLgorCisgICBDb21wcmVzcyBhbmQgcmVwbGFjZSBwcm9jZWR1cmVzOgorICAgLSBSZWFkIGFsbCBvZiB0aGUgdW5jb21wcmVzc2VkIGRhdGEgaW4gdGhlIHN0b3JlZCBibG9ja3MgaW4gZm9vLmd6IGFuZCB3cml0ZQorICAgICBpdCB0byBmb28uYWRkLiAgQWxzbyB3cml0ZSBmb28udGVtcCB3aXRoIHRoZSBsYXN0IDMySyBvZiB0aGF0IGRhdGEgdG8KKyAgICAgcHJvdmlkZSBhIGRpY3Rpb25hcnkgZm9yIHRoZSBuZXh0IGludm9jYXRpb24gb2YgdGhpcyBwcm9jZWR1cmUuCisgICAtIFJld3JpdGUgdGhlIGV4dHJhIGZpZWxkIG1hcmtpbmcgZm9vLmd6IHdpdGggYSBjb21wcmVzc2lvbiBpbiBwcm9jZXNzLgorICAgKiBJZiB0aGVyZSBpcyBubyBkYXRhIHByb3ZpZGVkIHRvIGNvbXByZXNzIChkdWUgdG8gYSBtaXNzaW5nIGZvby5hZGQgZmlsZQorICAgICB3aGVuIHJlY292ZXJpbmcpLCByZWNvbnN0cnVjdCBhbmQgdHJ1bmNhdGUgdGhlIGZvby5neiBmaWxlIHRvIGNvbnRhaW4KKyAgICAgb25seSB0aGUgcHJldmlvdXMgY29tcHJlc3NlZCBkYXRhIGFuZCBwcm9jZWVkIHRvIHRoZSBzdGVwIGFmdGVyIHRoZSBuZXh0CisgICAgIG9uZS4gIE90aGVyd2lzZSAuLi4KKyAgIC0gQ29tcHJlc3MgdGhlIGRhdGEgd2l0aCB0aGUgZGljdGlvbmFyeSBpbiBmb28uZGljdCwgYW5kIHdyaXRlIHRvIHRoZQorICAgICBmb28uZ3ogZmlsZSBzdGFydGluZyBhdCB0aGUgYml0IGltbWVkaWF0ZWx5IGZvbGxvd2luZyB0aGUgbGFzdCBwcmV2aW91c2x5CisgICAgIGNvbXByZXNzZWQgYmxvY2suICBJZiB0aGVyZSBpcyBubyBmb28uZGljdCwgcHJvY2VlZCBhbnl3YXkgd2l0aCB0aGUKKyAgICAgY29tcHJlc3Npb24gYXQgc2xpZ2h0bHkgcmVkdWNlZCBlZmZpY2llbmN5LiAgKEZvciB0aGUgZm9vLmRpY3QgZmlsZSB0byBiZQorICAgICBtaXNzaW5nIHJlcXVpcmVzIHNvbWUgZXh0ZXJuYWwgZmFpbHVyZSBiZXlvbmQgc2ltcGx5IHRoZSBpbnRlcnJ1cHRpb24gb2YKKyAgICAgYSBjb21wcmVzcyBvcGVyYXRpb24uKSAgRHVyaW5nIHRoaXMgcHJvY2VzcywgdGhlIGZvby5sb2NrIGZpbGUgaXMKKyAgICAgcGVyaW9kaWNhbGx5IHRvdWNoZWQgdG8gYXNzdXJlIHRoYXQgdGhhdCBmaWxlIGlzIG5vdCBjb25zaWRlcmVkIHN0YWxlIGJ5CisgICAgIGFub3RoZXIgcHJvY2VzcyBiZWZvcmUgd2UncmUgZG9uZS4gIFRoZSBkZWZsYXRpb24gaXMgdGVybWluYXRlZCB3aXRoIGEKKyAgICAgbm9uLWxhc3QgZW1wdHkgc3RhdGljIGJsb2NrICgxMCBiaXRzIGxvbmcpLCB0aGF0IGlzIHRoZW4gbG9jYXRlZCBhbmQKKyAgICAgd3JpdHRlbiBvdmVyIGJ5IGEgbGFzdC1iaXQtc2V0IGVtcHR5IHN0b3JlZCBibG9jay4KKyAgIC0gQXBwZW5kIHRoZSBjcmMgYW5kIGxlbmd0aCBvZiB0aGUgZGF0YSBpbiB0aGUgZ3ppcCBmaWxlIChwcmV2aW91c2x5CisgICAgIGNhbGN1bGF0ZWQgZHVyaW5nIHRoZSBhcHBlbmQgb3BlcmF0aW9ucykuCisgICAtIFdyaXRlIG92ZXIgdGhlIGV4dHJhIGZpZWxkIHdpdGggdGhlIHVwZGF0ZWQgc3RvcmVkIGJsb2NrIG9mZnNldHMsIGJpdHMKKyAgICAgYmFjaywgY3JjJ3MsIGFuZCBsZW5ndGhzLCBhbmQgbWFyayBmb28uZ3ogYXMgaW4gcHJvY2VzcyBmb3IgYSByZXBsYWNlbWVudAorICAgICBvZiB0aGUgZGljdGlvbmFyeS4KKyAgIEAgRGVsZXRlIHRoZSBmb28uYWRkIGZpbGUuCisgICAtIFJlcGxhY2UgZm9vLmRpY3Qgd2l0aCBmb28udGVtcC4KKyAgIC0gV3JpdGUgb3ZlciB0aGUgZXh0cmEgZmllbGQsIG1hcmtpbmcgZm9vLmd6IGFzIGNvbXBsZXRlLgorCisgICBSZWNvdmVyeSBwcm9jZWR1cmU6CisgICAtIElmIG5vdCBhIHJlcGxhY2UgcmVjb3ZlcnksIHJlYWQgaW4gdGhlIGZvby5hZGQgZmlsZSwgYW5kIHByb3ZpZGUgdGhhdCBkYXRhCisgICAgIHRvIHRoZSBhcHByb3ByaWF0ZSByZWNvdmVyeSBiZWxvdy4gIElmIHRoZXJlIGlzIG5vIGZvby5hZGQgZmlsZSwgcHJvdmlkZQorICAgICBhIHplcm8gZGF0YSBsZW5ndGggdG8gdGhlIHJlY292ZXJ5LiAgSW4gdGhhdCBjYXNlLCB0aGUgYXBwZW5kIHJlY292ZXJ5CisgICAgIHJlc3RvcmVzIHRoZSBmb28uZ3ogdG8gdGhlIHByZXZpb3VzIGNvbXByZXNzZWQgKyB1bmNvbXByZXNzZWQgZGF0YSBzdGF0ZS4KKyAgICAgRm9yIHRoZSB0aGUgY29tcHJlc3MgcmVjb3ZlcnksIGEgbWlzc2luZyBmb28uYWRkIGZpbGUgcmVzdWx0cyBpbiBmb28uZ3oKKyAgICAgYmVpbmcgcmVzdG9yZWQgdG8gdGhlIHByZXZpb3VzIGNvbXByZXNzZWQtb25seSBkYXRhIHN0YXRlLgorICAgLSBBcHBlbmQgcmVjb3Zlcnk6CisgICAgIC0gUGljayB1cCBhcHBlbmQgYXQgKyBzdGVwIGFib3ZlCisgICAtIENvbXByZXNzIHJlY292ZXJ5OgorICAgICAtIFBpY2sgdXAgY29tcHJlc3MgYXQgKiBzdGVwIGFib3ZlCisgICAtIFJlcGxhY2UgcmVjb3Zlcnk6CisgICAgIC0gUGljayB1cCBjb21wcmVzcyBhdCBAIHN0ZXAgYWJvdmUKKyAgIC0gTG9nIHRoZSByZXBhaXIgd2l0aCBhIGRhdGUgc3RhbXAgaW4gZm9vLnJlcGFpcnMKKyAqLworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4gICAgICAvKiByZW5hbWUsIGZvcGVuLCBmcHJpbnRmLCBmY2xvc2UgKi8KKyNpbmNsdWRlIDxzdGRsaWIuaD4gICAgIC8qIG1hbGxvYywgZnJlZSAqLworI2luY2x1ZGUgPHN0cmluZy5oPiAgICAgLyogc3RybGVuLCBzdHJyY2hyLCBzdHJjcHksIHN0cm5jcHksIHN0cmNtcCAqLworI2luY2x1ZGUgPGZjbnRsLmg+ICAgICAgLyogb3BlbiAqLworI2luY2x1ZGUgPHVuaXN0ZC5oPiAgICAgLyogbHNlZWssIHJlYWQsIHdyaXRlLCBjbG9zZSwgdW5saW5rLCBzbGVlcCwgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZ0cnVuY2F0ZSwgZnN5bmMgKi8KKyNpbmNsdWRlIDxlcnJuby5oPiAgICAgIC8qIGVycm5vICovCisjaW5jbHVkZSA8dGltZS5oPiAgICAgICAvKiB0aW1lLCBjdGltZSAqLworI2luY2x1ZGUgPHN5cy9zdGF0Lmg+ICAgLyogc3RhdCAqLworI2luY2x1ZGUgPHN5cy90aW1lLmg+ICAgLyogdXRpbWVzICovCisjaW5jbHVkZSAiemxpYi5oIiAgICAgICAvKiBjcmMzMiAqLworCisjaW5jbHVkZSAiZ3psb2cuaCIgICAgICAvKiBoZWFkZXIgZm9yIGV4dGVybmFsIGFjY2VzcyAqLworCisjZGVmaW5lIGxvY2FsIHN0YXRpYwordHlwZWRlZiB1bnNpZ25lZCBpbnQgdWludDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyB1bG9uZzsKKworLyogTWFjcm8gZm9yIGRlYnVnZ2luZyB0byBkZXRlcm1pbmlzdGljYWxseSBmb3JjZSByZWNvdmVyeSBvcGVyYXRpb25zICovCisjaWZkZWYgREVCVUcKKyAgICAjaW5jbHVkZSA8c2V0am1wLmg+ICAgICAgICAgLyogbG9uZ2ptcCAqLworICAgIGptcF9idWYgZ3psb2dfanVtcDsgICAgICAgICAvKiB3aGVyZSB0byBnbyBiYWNrIHRvICovCisgICAgaW50IGd6bG9nX2JhaWwgPSAwOyAgICAgICAgIC8qIHdoaWNoIHBvaW50IHRvIGJhaWwgYXQgKDEuLjgpICovCisgICAgaW50IGd6bG9nX2NvdW50ID0gLTE7ICAgICAgIC8qIG51bWJlciBvZiB0aW1lcyB0aHJvdWdoIHRvIHdhaXQgKi8KKyMgICBkZWZpbmUgQkFJTChuKSBkbyB7IGlmIChuID09IGd6bG9nX2JhaWwgJiYgZ3psb2dfY291bnQtLSA9PSAwKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZ2ptcChnemxvZ19qdW1wLCBnemxvZ19iYWlsKTsgfSB3aGlsZSAoMCkKKyNlbHNlCisjICAgZGVmaW5lIEJBSUwobikKKyNlbmRpZgorCisvKiBob3cgb2xkIHRoZSBsb2NrIGZpbGUgY2FuIGJlIGluIHNlY29uZHMgYmVmb3JlIGNvbnNpZGVyaW5nIGl0IHN0YWxlICovCisjZGVmaW5lIFBBVElFTkNFIDMwMAorCisvKiBtYXhpbXVtIHN0b3JlZCBibG9jayBzaXplIGluIEtieXRlcyAtLSBtdXN0IGJlIGluIDEuLjYzICovCisjZGVmaW5lIE1BWF9TVE9SRSAxNgorCisvKiBudW1iZXIgb2Ygc3RvcmVkIEtieXRlcyB0byB0cmlnZ2VyIGNvbXByZXNzaW9uIChtdXN0IGJlID49IDMyIHRvIGFsbG93CisgICBkaWN0aW9uYXJ5IGNvbnN0cnVjdGlvbiwgYW5kIDw9IDIwNCAqIE1BWF9TVE9SRSwgaW4gb3JkZXIgZm9yID4+IDEwIHRvCisgICBkaXNjYXJkIHRoZSBzdG9yZWQgYmxvY2sgaGVhZGVycyBjb250cmlidXRpb24gb2YgZml2ZSBieXRlcyBlYWNoKSAqLworI2RlZmluZSBUUklHR0VSIDEwMjQKKworLyogc2l6ZSBvZiBhIGRlZmxhdGUgZGljdGlvbmFyeSAodGhpcyBjYW5ub3QgYmUgY2hhbmdlZCkgKi8KKyNkZWZpbmUgRElDVCAzMjc2OFUKKworLyogdmFsdWVzIGZvciB0aGUgb3BlcmF0aW9uICgyIGJpdHMpICovCisjZGVmaW5lIE5PX09QIDAKKyNkZWZpbmUgQVBQRU5EX09QIDEKKyNkZWZpbmUgQ09NUFJFU1NfT1AgMgorI2RlZmluZSBSRVBMQUNFX09QIDMKKworLyogbWFjcm9zIHRvIGV4dHJhY3QgbGl0dGxlLWVuZGlhbiBpbnRlZ2VycyBmcm9tIGFuIHVuc2lnbmVkIGJ5dGUgYnVmZmVyICovCisjZGVmaW5lIFBVTEwyKHApICgocClbMF0rKCh1aW50KSgocClbMV0pPDw4KSkKKyNkZWZpbmUgUFVMTDQocCkgKFBVTEwyKHApKygodWxvbmcpUFVMTDIocCsyKTw8MTYpKQorI2RlZmluZSBQVUxMOChwKSAoUFVMTDQocCkrKChvZmZfdClQVUxMNChwKzQpPDwzMikpCisKKy8qIG1hY3JvcyB0byBzdG9yZSBpbnRlZ2VycyBpbnRvIGEgYnl0ZSBidWZmZXIgaW4gbGl0dGxlLWVuZGlhbiBvcmRlciAqLworI2RlZmluZSBQVVQyKHAsYSkgZG8geyhwKVswXT1hOyhwKVsxXT0oYSk+Pjg7fSB3aGlsZSgwKQorI2RlZmluZSBQVVQ0KHAsYSkgZG8ge1BVVDIocCxhKTtQVVQyKHArMixhPj4xNik7fSB3aGlsZSgwKQorI2RlZmluZSBQVVQ4KHAsYSkgZG8ge1BVVDQocCxhKTtQVVQ0KHArNCxhPj4zMik7fSB3aGlsZSgwKQorCisvKiBpbnRlcm5hbCBzdHJ1Y3R1cmUgZm9yIGxvZyBpbmZvcm1hdGlvbiAqLworI2RlZmluZSBMT0dJRCAiXDEwNlwwMzVcMTcyIiAgICAvKiBzaG91bGQgYmUgdGhyZWUgbm9uLXplcm8gY2hhcmFjdGVycyAqLworc3RydWN0IGxvZyB7CisgICAgY2hhciBpZFs0XTsgICAgIC8qIGNvbnRhaW5zIExPR0lEIHRvIGRldGVjdCBpbmFkdmVydGVudCBvdmVyd3JpdGVzICovCisgICAgaW50IGZkOyAgICAgICAgIC8qIGZpbGUgZGVzY3JpcHRvciBmb3IgLmd6IGZpbGUsIG9wZW5lZCByZWFkL3dyaXRlICovCisgICAgY2hhciAqcGF0aDsgICAgIC8qIGFsbG9jYXRlZCBwYXRoLCBlLmcuICIvdmFyL2xvZy9mb28iIG9yICJmb28iICovCisgICAgY2hhciAqZW5kOyAgICAgIC8qIGVuZCBvZiBwYXRoLCBmb3IgYXBwZW5kaW5nIHN1ZmZpY2VzIHN1Y2ggYXMgIi5neiIgKi8KKyAgICBvZmZfdCBmaXJzdDsgICAgLyogb2Zmc2V0IG9mIGZpcnN0IHN0b3JlZCBibG9jayBmaXJzdCBsZW5ndGggYnl0ZSAqLworICAgIGludCBiYWNrOyAgICAgICAvKiBsb2NhdGlvbiBvZiBmaXJzdCBibG9jayBpZCBpbiBiaXRzIGJhY2sgZnJvbSBmaXJzdCAqLworICAgIHVpbnQgc3RvcmVkOyAgICAvKiBieXRlcyBjdXJyZW50bHkgaW4gbGFzdCBzdG9yZWQgYmxvY2sgKi8KKyAgICBvZmZfdCBsYXN0OyAgICAgLyogb2Zmc2V0IG9mIGxhc3Qgc3RvcmVkIGJsb2NrIGZpcnN0IGxlbmd0aCBieXRlICovCisgICAgdWxvbmcgY2NyYzsgICAgIC8qIGNyYyBvZiBjb21wcmVzc2VkIGRhdGEgKi8KKyAgICB1bG9uZyBjbGVuOyAgICAgLyogbGVuZ3RoIChtb2R1bG8gMl4zMikgb2YgY29tcHJlc3NlZCBkYXRhICovCisgICAgdWxvbmcgdGNyYzsgICAgIC8qIGNyYyBvZiB0b3RhbCBkYXRhICovCisgICAgdWxvbmcgdGxlbjsgICAgIC8qIGxlbmd0aCAobW9kdWxvIDJeMzIpIG9mIHRvdGFsIGRhdGEgKi8KKyAgICB0aW1lX3QgbG9jazsgICAgLyogbGFzdCBtb2RpZnkgdGltZSBvZiBvdXIgbG9jayBmaWxlICovCit9OworCisvKiBnemlwIGhlYWRlciBmb3IgZ3psb2cgKi8KK2xvY2FsIHVuc2lnbmVkIGNoYXIgbG9nX2d6aGVhZFtdID0geworICAgIDB4MWYsIDB4OGIsICAgICAgICAgICAgICAgICAvKiBtYWdpYyBnemlwIGlkICovCisgICAgOCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbXByZXNzaW9uIG1ldGhvZCBpcyBkZWZsYXRlICovCisgICAgNCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoZXJlIGlzIGFuIGV4dHJhIGZpZWxkIChubyBmaWxlIG5hbWUpICovCisgICAgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgIC8qIG5vIG1vZGlmaWNhdGlvbiB0aW1lIHByb3ZpZGVkICovCisgICAgMCwgMHhmZiwgICAgICAgICAgICAgICAgICAgIC8qIG5vIGV4dHJhIGZsYWdzLCBubyBPUyBzcGVjaWZpZWQgKi8KKyAgICAzOSwgMCwgJ2EnLCAncCcsIDM1LCAwICAgICAgLyogZXh0cmEgZmllbGQgd2l0aCAiYXAiIHN1YmZpZWxkICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDM1IGlzIEVYVFJBLCAzOSBpcyBFWFRSQSArIDQgKi8KK307CisKKyNkZWZpbmUgSEVBRCBzaXplb2YobG9nX2d6aGVhZCkgICAgIC8qIHNob3VsZCBiZSAxNiAqLworCisvKiBpbml0aWFsIGd6aXAgZXh0cmEgZmllbGQgY29udGVudCAoNTIgPT0gSEVBRCArIEVYVFJBICsgMSkgKi8KK2xvY2FsIHVuc2lnbmVkIGNoYXIgbG9nX2d6ZXh0W10gPSB7CisgICAgNTIsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgIC8qIG9mZnNldCBvZiBmaXJzdCBzdG9yZWQgYmxvY2sgbGVuZ3RoICovCisgICAgNTIsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgIC8qIG9mZnNldCBvZiBsYXN0IHN0b3JlZCBibG9jayBsZW5ndGggKi8KKyAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgLyogY29tcHJlc3NlZCBkYXRhIGNyYyBhbmQgbGVuZ3RoICovCisgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgIC8qIHRvdGFsIGRhdGEgY3JjIGFuZCBsZW5ndGggKi8KKyAgICAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgLyogZmluYWwgc3RvcmVkIGJsb2NrIGRhdGEgbGVuZ3RoICovCisgICAgNSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9wIGlzIE5PX09QLCBsYXN0IGJpdCA4IGJpdHMgYmFjayAqLworfTsKKworI2RlZmluZSBFWFRSQSBzaXplb2YobG9nX2d6ZXh0KSAgICAgLyogc2hvdWxkIGJlIDM1ICovCisKKy8qIGluaXRpYWwgZ3ppcCBkYXRhIGFuZCB0cmFpbGVyICovCitsb2NhbCB1bnNpZ25lZCBjaGFyIGxvZ19nemJvZHlbXSA9IHsKKyAgICAxLCAwLCAwLCAweGZmLCAweGZmLCAgICAgICAgLyogZW1wdHkgc3RvcmVkIGJsb2NrIChsYXN0KSAqLworICAgIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAvKiBjcmMgKi8KKyAgICAwLCAwLCAwLCAwICAgICAgICAgICAgICAgICAgLyogdW5jb21wcmVzc2VkIGxlbmd0aCAqLworfTsKKworI2RlZmluZSBCT0RZIHNpemVvZihsb2dfZ3pib2R5KQorCisvKiBFeGNsdXNpdmVseSBjcmVhdGUgZm9vLmxvY2sgaW4gb3JkZXIgdG8gbmVnb3RpYXRlIGV4Y2x1c2l2ZSBhY2Nlc3MgdG8gdGhlCisgICBmb28uKiBmaWxlcy4gIElmIHRoZSBtb2RpZnkgdGltZSBvZiBhbiBleGlzdGluZyBsb2NrIGZpbGUgaXMgZ3JlYXRlciB0aGFuCisgICBQQVRJRU5DRSBzZWNvbmRzIGluIHRoZSBwYXN0LCB0aGVuIGNvbnNpZGVyIHRoZSBsb2NrIGZpbGUgdG8gaGF2ZSBiZWVuCisgICBhYmFuZG9uZWQsIGRlbGV0ZSBpdCwgYW5kIHRyeSB0aGUgZXhjbHVzaXZlIGNyZWF0ZSBhZ2Fpbi4gIFNhdmUgdGhlIGxvY2sKKyAgIGZpbGUgbW9kaWZ5IHRpbWUgZm9yIHZlcmlmaWNhdGlvbiBvZiBvd25lcnNoaXAuICBSZXR1cm4gMCBvbiBzdWNjZXNzLCBvciAtMQorICAgb24gZmFpbHVyZSwgdXN1YWxseSBkdWUgdG8gYW4gYWNjZXNzIHJlc3RyaWN0aW9uIG9yIGludmFsaWQgcGF0aC4gIE5vdGUgdGhhdAorICAgaWYgc3RhdCgpIG9yIHVubGluaygpIGZhaWxzLCBpdCBtYXkgYmUgZHVlIHRvIGFub3RoZXIgcHJvY2VzcyBub3RpY2luZyB0aGUKKyAgIGFiYW5kb25lZCBsb2NrIGZpbGUgYSBzbWlkZ2Ugc29vbmVyIGFuZCBkZWxldGluZyBpdCwgc28gdGhvc2UgYXJlIG5vdAorICAgZmxhZ2dlZCBhcyBhbiBlcnJvci4gKi8KK2xvY2FsIGludCBsb2dfbG9jayhzdHJ1Y3QgbG9nICpsb2cpCit7CisgICAgaW50IGZkOworICAgIHN0cnVjdCBzdGF0IHN0OworCisgICAgc3RyY3B5KGxvZy0+ZW5kLCAiLmxvY2siKTsKKyAgICB3aGlsZSAoKGZkID0gb3Blbihsb2ctPnBhdGgsIE9fQ1JFQVQgfCBPX0VYQ0wsIDA2NDQpKSA8IDApIHsKKyAgICAgICAgaWYgKGVycm5vICE9IEVFWElTVCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgaWYgKHN0YXQobG9nLT5wYXRoLCAmc3QpID09IDAgJiYgdGltZShOVUxMKSAtIHN0LnN0X210aW1lID4gUEFUSUVOQ0UpIHsKKyAgICAgICAgICAgIHVubGluayhsb2ctPnBhdGgpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgc2xlZXAoMik7ICAgICAgIC8qIHJlbGlucXVpc2ggdGhlIENQVSBmb3IgdHdvIHNlY29uZHMgd2hpbGUgd2FpdGluZyAqLworICAgIH0KKyAgICBjbG9zZShmZCk7CisgICAgaWYgKHN0YXQobG9nLT5wYXRoLCAmc3QpID09IDApCisgICAgICAgIGxvZy0+bG9jayA9IHN0LnN0X210aW1lOworICAgIHJldHVybiAwOworfQorCisvKiBVcGRhdGUgdGhlIG1vZGlmeSB0aW1lIG9mIHRoZSBsb2NrIGZpbGUgdG8gbm93LCBpbiBvcmRlciB0byBwcmV2ZW50IGFub3RoZXIKKyAgIHRhc2sgZnJvbSB0aGlua2luZyB0aGF0IHRoZSBsb2NrIGlzIHN0YWxlLiAgU2F2ZSB0aGUgbG9jayBmaWxlIG1vZGlmeSB0aW1lCisgICBmb3IgdmVyaWZpY2F0aW9uIG9mIG93bmVyc2hpcC4gKi8KK2xvY2FsIHZvaWQgbG9nX3RvdWNoKHN0cnVjdCBsb2cgKmxvZykKK3sKKyAgICBzdHJ1Y3Qgc3RhdCBzdDsKKworICAgIHN0cmNweShsb2ctPmVuZCwgIi5sb2NrIik7CisgICAgdXRpbWVzKGxvZy0+cGF0aCwgTlVMTCk7CisgICAgaWYgKHN0YXQobG9nLT5wYXRoLCAmc3QpID09IDApCisgICAgICAgIGxvZy0+bG9jayA9IHN0LnN0X210aW1lOworfQorCisvKiBDaGVjayB0aGUgbG9nIGZpbGUgbW9kaWZ5IHRpbWUgYWdhaW5zdCB3aGF0IGlzIGV4cGVjdGVkLiAgUmV0dXJuIHRydWUgaWYKKyAgIHRoaXMgaXMgbm90IG91ciBsb2NrLiAgSWYgaXQgaXMgb3VyIGxvY2ssIHRvdWNoIGl0IHRvIGtlZXAgaXQuICovCitsb2NhbCBpbnQgbG9nX2NoZWNrKHN0cnVjdCBsb2cgKmxvZykKK3sKKyAgICBzdHJ1Y3Qgc3RhdCBzdDsKKworICAgIHN0cmNweShsb2ctPmVuZCwgIi5sb2NrIik7CisgICAgaWYgKHN0YXQobG9nLT5wYXRoLCAmc3QpIHx8IHN0LnN0X210aW1lICE9IGxvZy0+bG9jaykKKyAgICAgICAgcmV0dXJuIDE7CisgICAgbG9nX3RvdWNoKGxvZyk7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qIFVubG9jayBhIHByZXZpb3VzbHkgYWNxdWlyZWQgbG9jaywgYnV0IG9ubHkgaWYgaXQncyBvdXJzLiAqLworbG9jYWwgdm9pZCBsb2dfdW5sb2NrKHN0cnVjdCBsb2cgKmxvZykKK3sKKyAgICBpZiAobG9nX2NoZWNrKGxvZykpCisgICAgICAgIHJldHVybjsKKyAgICBzdHJjcHkobG9nLT5lbmQsICIubG9jayIpOworICAgIHVubGluayhsb2ctPnBhdGgpOworICAgIGxvZy0+bG9jayA9IDA7Cit9CisKKy8qIENoZWNrIHRoZSBnemlwIGhlYWRlciBhbmQgcmVhZCBpbiB0aGUgZXh0cmEgZmllbGQsIGZpbGxpbmcgaW4gdGhlIHZhbHVlcyBpbgorICAgdGhlIGxvZyBzdHJ1Y3R1cmUuICBSZXR1cm4gb3Agb24gc3VjY2VzcyBvciAtMSBpZiB0aGUgZ3ppcCBoZWFkZXIgd2FzIG5vdCBhcworICAgZXhwZWN0ZWQuICBvcCBpcyB0aGUgY3VycmVudCBvcGVyYXRpb24gaW4gcHJvZ3Jlc3MgbGFzdCB3cml0dGVuIHRvIHRoZSBleHRyYQorICAgZmllbGQuICBUaGlzIGFzc3VtZXMgdGhhdCB0aGUgZ3ppcCBmaWxlIGhhcyBhbHJlYWR5IGJlZW4gb3BlbmVkLCB3aXRoIHRoZQorICAgZmlsZSBkZXNjcmlwdG9yIGxvZy0+ZmQuICovCitsb2NhbCBpbnQgbG9nX2hlYWQoc3RydWN0IGxvZyAqbG9nKQoreworICAgIGludCBvcDsKKyAgICB1bnNpZ25lZCBjaGFyIGJ1ZltIRUFEICsgRVhUUkFdOworCisgICAgaWYgKGxzZWVrKGxvZy0+ZmQsIDAsIFNFRUtfU0VUKSA8IDAgfHwKKyAgICAgICAgcmVhZChsb2ctPmZkLCBidWYsIEhFQUQgKyBFWFRSQSkgIT0gSEVBRCArIEVYVFJBIHx8CisgICAgICAgIG1lbWNtcChidWYsIGxvZ19nemhlYWQsIEhFQUQpKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgbG9nLT5maXJzdCA9IFBVTEw4KGJ1ZiArIEhFQUQpOworICAgIGxvZy0+bGFzdCA9IFBVTEw4KGJ1ZiArIEhFQUQgKyA4KTsKKyAgICBsb2ctPmNjcmMgPSBQVUxMNChidWYgKyBIRUFEICsgMTYpOworICAgIGxvZy0+Y2xlbiA9IFBVTEw0KGJ1ZiArIEhFQUQgKyAyMCk7CisgICAgbG9nLT50Y3JjID0gUFVMTDQoYnVmICsgSEVBRCArIDI0KTsKKyAgICBsb2ctPnRsZW4gPSBQVUxMNChidWYgKyBIRUFEICsgMjgpOworICAgIGxvZy0+c3RvcmVkID0gUFVMTDIoYnVmICsgSEVBRCArIDMyKTsKKyAgICBsb2ctPmJhY2sgPSAzICsgKGJ1ZltIRUFEICsgMzRdICYgNyk7CisgICAgb3AgPSAoYnVmW0hFQUQgKyAzNF0gPj4gMykgJiAzOworICAgIHJldHVybiBvcDsKK30KKworLyogV3JpdGUgb3ZlciB0aGUgZXh0cmEgZmllbGQgY29udGVudHMsIG1hcmtpbmcgdGhlIG9wZXJhdGlvbiBhcyBvcC4gIFVzZSBmc3luYworICAgdG8gYXNzdXJlIHRoYXQgdGhlIGRldmljZSBpcyB3cml0dGVuIHRvLCBhbmQgaW4gdGhlIHJlcXVlc3RlZCBvcmRlci4gIFRoaXMKKyAgIG9wZXJhdGlvbiwgYW5kIG9ubHkgdGhpcyBvcGVyYXRpb24sIGlzIGFzc3VtZWQgdG8gYmUgYXRvbWljIGluIG9yZGVyIHRvCisgICBhc3N1cmUgdGhhdCB0aGUgbG9nIGlzIHJlY292ZXJhYmxlIGluIHRoZSBldmVudCBvZiBhbiBpbnRlcnJ1cHRpb24gYXQgYW55CisgICBwb2ludCBpbiB0aGUgcHJvY2Vzcy4gIFJldHVybiAtMSBpZiB0aGUgd3JpdGUgdG8gZm9vLmd6IGZhaWxlZC4gKi8KK2xvY2FsIGludCBsb2dfbWFyayhzdHJ1Y3QgbG9nICpsb2csIGludCBvcCkKK3sKKyAgICBpbnQgcmV0OworICAgIHVuc2lnbmVkIGNoYXIgZXh0W0VYVFJBXTsKKworICAgIFBVVDgoZXh0LCBsb2ctPmZpcnN0KTsKKyAgICBQVVQ4KGV4dCArIDgsIGxvZy0+bGFzdCk7CisgICAgUFVUNChleHQgKyAxNiwgbG9nLT5jY3JjKTsKKyAgICBQVVQ0KGV4dCArIDIwLCBsb2ctPmNsZW4pOworICAgIFBVVDQoZXh0ICsgMjQsIGxvZy0+dGNyYyk7CisgICAgUFVUNChleHQgKyAyOCwgbG9nLT50bGVuKTsKKyAgICBQVVQyKGV4dCArIDMyLCBsb2ctPnN0b3JlZCk7CisgICAgZXh0WzM0XSA9IGxvZy0+YmFjayAtIDMgKyAob3AgPDwgMyk7CisgICAgZnN5bmMobG9nLT5mZCk7CisgICAgcmV0ID0gbHNlZWsobG9nLT5mZCwgSEVBRCwgU0VFS19TRVQpIDwgMCB8fAorICAgICAgICAgIHdyaXRlKGxvZy0+ZmQsIGV4dCwgRVhUUkEpICE9IEVYVFJBID8gLTEgOiAwOworICAgIGZzeW5jKGxvZy0+ZmQpOworICAgIHJldHVybiByZXQ7Cit9CisKKy8qIFJld3JpdGUgdGhlIGxhc3QgYmxvY2sgaGVhZGVyIGJpdHMgYW5kIHN1YnNlcXVlbnQgemVybyBiaXRzIHRvIGdldCB0byBhIGJ5dGUKKyAgIGJvdW5kYXJ5LCBzZXR0aW5nIHRoZSBsYXN0IGJsb2NrIGJpdCBpZiBsYXN0IGlzIHRydWUsIGFuZCB0aGVuIHdyaXRlIHRoZQorICAgcmVtYWluZGVyIG9mIHRoZSBzdG9yZWQgYmxvY2sgaGVhZGVyIChsZW5ndGggYW5kIG9uZSdzIGNvbXBsZW1lbnQpLiAgTGVhdmUKKyAgIHRoZSBmaWxlIHBvaW50ZXIgYWZ0ZXIgdGhlIGVuZCBvZiB0aGUgbGFzdCBzdG9yZWQgYmxvY2sgZGF0YS4gIFJldHVybiAtMSBpZgorICAgdGhlcmUgaXMgYSByZWFkIG9yIHdyaXRlIGZhaWx1cmUgb24gdGhlIGZvby5neiBmaWxlICovCitsb2NhbCBpbnQgbG9nX2xhc3Qoc3RydWN0IGxvZyAqbG9nLCBpbnQgbGFzdCkKK3sKKyAgICBpbnQgYmFjaywgbGVuLCBtYXNrOworICAgIHVuc2lnbmVkIGNoYXIgYnVmWzZdOworCisgICAgLyogZGV0ZXJtaW5lIHRoZSBsb2NhdGlvbnMgb2YgdGhlIGJ5dGVzIGFuZCBiaXRzIHRvIG1vZGlmeSAqLworICAgIGJhY2sgPSBsb2ctPmxhc3QgPT0gbG9nLT5maXJzdCA/IGxvZy0+YmFjayA6IDg7CisgICAgbGVuID0gYmFjayA+IDggPyAyIDogMTsgICAgICAgICAgICAgICAgIC8qIGJ5dGVzIGJhY2sgZnJvbSBsb2ctPmxhc3QgKi8KKyAgICBtYXNrID0gMHg4MCA+PiAoKGJhY2sgLSAxKSAmIDcpOyAgICAgICAgLyogbWFzayBmb3IgYmxvY2sgbGFzdC1iaXQgKi8KKworICAgIC8qIGdldCB0aGUgYnl0ZSB0byBtb2RpZnkgKG9uZSBvciB0d28gYmFjaykgaW50byBidWZbMF0gLS0gZG9uJ3QgbmVlZCB0bworICAgICAgIHJlYWQgdGhlIGJ5dGUgaWYgdGhlIGxhc3QtYml0IGlzIGVpZ2h0IGJpdHMgYmFjaywgc2luY2UgaW4gdGhhdCBjYXNlCisgICAgICAgdGhlIGVudGlyZSBieXRlIHdpbGwgYmUgbW9kaWZpZWQgKi8KKyAgICBidWZbMF0gPSAwOworICAgIGlmIChiYWNrICE9IDggJiYgKGxzZWVrKGxvZy0+ZmQsIGxvZy0+bGFzdCAtIGxlbiwgU0VFS19TRVQpIDwgMCB8fAorICAgICAgICAgICAgICAgICAgICAgIHJlYWQobG9nLT5mZCwgYnVmLCAxKSAhPSAxKSkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgLyogY2hhbmdlIHRoZSBsYXN0LWJpdCBvZiB0aGUgbGFzdCBzdG9yZWQgYmxvY2sgYXMgcmVxdWVzdGVkIC0tIG5vdGUKKyAgICAgICB0aGF0IGFsbCBiaXRzIGFib3ZlIHRoZSBsYXN0LWJpdCBhcmUgc2V0IHRvIHplcm8sIHBlciB0aGUgdHlwZSBiaXRzCisgICAgICAgb2YgYSBzdG9yZWQgYmxvY2sgYmVpbmcgMDAgYW5kIHBlciB0aGUgY29udmVudGlvbiB0aGF0IHRoZSBiaXRzIHRvCisgICAgICAgYnJpbmcgdGhlIHN0cmVhbSB0byBhIGJ5dGUgYm91bmRhcnkgYXJlIGFsc28gemVyb3MgKi8KKyAgICBidWZbMV0gPSAwOworICAgIGJ1ZlsyIC0gbGVuXSA9ICgqYnVmICYgKG1hc2sgLSAxKSkgKyAobGFzdCA/IG1hc2sgOiAwKTsKKworICAgIC8qIHdyaXRlIHRoZSBtb2RpZmllZCBzdG9yZWQgYmxvY2sgaGVhZGVyIGFuZCBsZW5ndGhzLCBtb3ZlIHRoZSBmaWxlCisgICAgICAgcG9pbnRlciB0byBhZnRlciB0aGUgbGFzdCBzdG9yZWQgYmxvY2sgZGF0YSAqLworICAgIFBVVDIoYnVmICsgMiwgbG9nLT5zdG9yZWQpOworICAgIFBVVDIoYnVmICsgNCwgbG9nLT5zdG9yZWQgXiAweGZmZmYpOworICAgIHJldHVybiBsc2Vlayhsb2ctPmZkLCBsb2ctPmxhc3QgLSBsZW4sIFNFRUtfU0VUKSA8IDAgfHwKKyAgICAgICAgICAgd3JpdGUobG9nLT5mZCwgYnVmICsgMiAtIGxlbiwgbGVuICsgNCkgIT0gbGVuICsgNCB8fAorICAgICAgICAgICBsc2Vlayhsb2ctPmZkLCBsb2ctPnN0b3JlZCwgU0VFS19DVVIpIDwgMCA/IC0xIDogMDsKK30KKworLyogQXBwZW5kIGxlbiBieXRlcyBmcm9tIGRhdGEgdG8gdGhlIGxvY2tlZCBhbmQgb3BlbiBsb2cgZmlsZS4gIGxlbiBtYXkgYmUgemVybworICAgaWYgcmVjb3ZlcmluZyBhbmQgbm8gLmFkZCBmaWxlIHdhcyBmb3VuZC4gIEluIHRoYXQgY2FzZSwgdGhlIHByZXZpb3VzIHN0YXRlCisgICBvZiB0aGUgZm9vLmd6IGZpbGUgaXMgcmVzdG9yZWQuICBUaGUgZGF0YSBpcyBhcHBlbmRlZCB1bmNvbXByZXNzZWQgaW4KKyAgIGRlZmxhdGUgc3RvcmVkIGJsb2Nrcy4gIFJldHVybiAtMSBpZiB0aGVyZSB3YXMgYW4gZXJyb3IgcmVhZGluZyBvciB3cml0aW5nCisgICB0aGUgZm9vLmd6IGZpbGUuICovCitsb2NhbCBpbnQgbG9nX2FwcGVuZChzdHJ1Y3QgbG9nICpsb2csIHVuc2lnbmVkIGNoYXIgKmRhdGEsIHNpemVfdCBsZW4pCit7CisgICAgdWludCBwdXQ7CisgICAgb2ZmX3QgZW5kOworICAgIHVuc2lnbmVkIGNoYXIgYnVmWzhdOworCisgICAgLyogc2V0IHRoZSBsYXN0IGJsb2NrIGxhc3QtYml0IGFuZCBsZW5ndGgsIGluIGNhc2UgcmVjb3ZlcmluZyBhbgorICAgICAgIGludGVycnVwdGVkIGFwcGVuZCwgdGhlbiBwb3NpdGlvbiB0aGUgZmlsZSBwb2ludGVyIHRvIGFwcGVuZCB0byB0aGUKKyAgICAgICBibG9jayAqLworICAgIGlmIChsb2dfbGFzdChsb2csIDEpKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICAvKiBhcHBlbmQsIGFkZGluZyBzdG9yZWQgYmxvY2tzIGFuZCB1cGRhdGluZyB0aGUgb2Zmc2V0IG9mIHRoZSBsYXN0IHN0b3JlZAorICAgICAgIGJsb2NrIGFzIG5lZWRlZCwgYW5kIHVwZGF0ZSB0aGUgdG90YWwgY3JjIGFuZCBsZW5ndGggKi8KKyAgICB3aGlsZSAobGVuKSB7CisgICAgICAgIC8qIGFwcGVuZCBhcyBtdWNoIGFzIHdlIGNhbiB0byB0aGUgbGFzdCBibG9jayAqLworICAgICAgICBwdXQgPSAoTUFYX1NUT1JFIDw8IDEwKSAtIGxvZy0+c3RvcmVkOworICAgICAgICBpZiAocHV0ID4gbGVuKQorICAgICAgICAgICAgcHV0ID0gKHVpbnQpbGVuOworICAgICAgICBpZiAocHV0KSB7CisgICAgICAgICAgICBpZiAod3JpdGUobG9nLT5mZCwgZGF0YSwgcHV0KSAhPSBwdXQpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgQkFJTCgxKTsKKyAgICAgICAgICAgIGxvZy0+dGNyYyA9IGNyYzMyKGxvZy0+dGNyYywgZGF0YSwgcHV0KTsKKyAgICAgICAgICAgIGxvZy0+dGxlbiArPSBwdXQ7CisgICAgICAgICAgICBsb2ctPnN0b3JlZCArPSBwdXQ7CisgICAgICAgICAgICBkYXRhICs9IHB1dDsKKyAgICAgICAgICAgIGxlbiAtPSBwdXQ7CisgICAgICAgIH0KKworICAgICAgICAvKiBpZiB3ZSBuZWVkIHRvLCBhZGQgYSBuZXcgZW1wdHkgc3RvcmVkIGJsb2NrICovCisgICAgICAgIGlmIChsZW4pIHsKKyAgICAgICAgICAgIC8qIG1hcmsgY3VycmVudCBibG9jayBhcyBub3QgbGFzdCAqLworICAgICAgICAgICAgaWYgKGxvZ19sYXN0KGxvZywgMCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworCisgICAgICAgICAgICAvKiBwb2ludCB0byBuZXcsIGVtcHR5IHN0b3JlZCBibG9jayAqLworICAgICAgICAgICAgbG9nLT5sYXN0ICs9IDQgKyBsb2ctPnN0b3JlZCArIDE7CisgICAgICAgICAgICBsb2ctPnN0b3JlZCA9IDA7CisgICAgICAgIH0KKworICAgICAgICAvKiBtYXJrIGxhc3QgYmxvY2sgYXMgbGFzdCwgdXBkYXRlIGl0cyBsZW5ndGggKi8KKyAgICAgICAgaWYgKGxvZ19sYXN0KGxvZywgMSkpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIEJBSUwoMik7CisgICAgfQorCisgICAgLyogd3JpdGUgdGhlIG5ldyBjcmMgYW5kIGxlbmd0aCB0cmFpbGVyLCBhbmQgdHJ1bmNhdGUganVzdCBpbiBjYXNlIChjb3VsZAorICAgICAgIGJlIHJlY292ZXJpbmcgZnJvbSBwYXJ0aWFsIGFwcGVuZCB3aXRoIGEgbWlzc2luZyBmb28uYWRkIGZpbGUpICovCisgICAgUFVUNChidWYsIGxvZy0+dGNyYyk7CisgICAgUFVUNChidWYgKyA0LCBsb2ctPnRsZW4pOworICAgIGlmICh3cml0ZShsb2ctPmZkLCBidWYsIDgpICE9IDggfHwKKyAgICAgICAgKGVuZCA9IGxzZWVrKGxvZy0+ZmQsIDAsIFNFRUtfQ1VSKSkgPCAwIHx8IGZ0cnVuY2F0ZShsb2ctPmZkLCBlbmQpKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICAvKiB3cml0ZSB0aGUgZXh0cmEgZmllbGQsIG1hcmtpbmcgdGhlIGxvZyBmaWxlIGFzIGRvbmUsIGRlbGV0ZSAuYWRkIGZpbGUgKi8KKyAgICBpZiAobG9nX21hcmsobG9nLCBOT19PUCkpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBzdHJjcHkobG9nLT5lbmQsICIuYWRkIik7CisgICAgdW5saW5rKGxvZy0+cGF0aCk7ICAgICAgICAgIC8qIGlnbm9yZSBlcnJvciwgc2luY2UgbWF5IG5vdCBleGlzdCAqLworICAgIHJldHVybiAwOworfQorCisvKiBSZXBsYWNlIHRoZSBmb28uZGljdCBmaWxlIHdpdGggdGhlIGZvby50ZW1wIGZpbGUuICBBbHNvIGRlbGV0ZSB0aGUgZm9vLmFkZAorICAgZmlsZSwgc2luY2UgdGhlIGNvbXByZXNzIG9wZXJhdGlvbiBtYXkgaGF2ZSBiZWVuIGludGVycnVwdGVkIGJlZm9yZSB0aGF0IHdhcworICAgZG9uZS4gIFJldHVybnMgMSBpZiBtZW1vcnkgY291bGQgbm90IGJlIGFsbG9jYXRlZCwgb3IgLTEgaWYgcmVhZGluZyBvcgorICAgd3JpdGluZyBmb28uZ3ogZmFpbHMsIG9yIGlmIHRoZSByZW5hbWUgZmFpbHMgZm9yIHNvbWUgcmVhc29uIG90aGVyIHRoYW4KKyAgIGZvby50ZW1wIG5vdCBleGlzdGluZy4gIGZvby50ZW1wIG5vdCBleGlzdGluZyBpcyBhIHBlcm1pdHRlZCBlcnJvciwgc2luY2UKKyAgIHRoZSByZXBsYWNlIG9wZXJhdGlvbiBtYXkgaGF2ZSBiZWVuIGludGVycnVwdGVkIGFmdGVyIHRoZSByZW5hbWUgaXMgZG9uZSwKKyAgIGJ1dCBiZWZvcmUgZm9vLmd6IGlzIG1hcmtlZCBhcyBjb21wbGV0ZS4gKi8KK2xvY2FsIGludCBsb2dfcmVwbGFjZShzdHJ1Y3QgbG9nICpsb2cpCit7CisgICAgaW50IHJldDsKKyAgICBjaGFyICpkZXN0OworCisgICAgLyogZGVsZXRlIGZvby5hZGQgZmlsZSAqLworICAgIHN0cmNweShsb2ctPmVuZCwgIi5hZGQiKTsKKyAgICB1bmxpbmsobG9nLT5wYXRoKTsgICAgICAgICAvKiBpZ25vcmUgZXJyb3IsIHNpbmNlIG1heSBub3QgZXhpc3QgKi8KKyAgICBCQUlMKDMpOworCisgICAgLyogcmVuYW1lIGZvby5uYW1lIHRvIGZvby5kaWN0LCByZXBsYWNpbmcgZm9vLmRpY3QgaWYgaXQgZXhpc3RzICovCisgICAgc3RyY3B5KGxvZy0+ZW5kLCAiLmRpY3QiKTsKKyAgICBkZXN0ID0gbWFsbG9jKHN0cmxlbihsb2ctPnBhdGgpICsgMSk7CisgICAgaWYgKGRlc3QgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0yOworICAgIHN0cmNweShkZXN0LCBsb2ctPnBhdGgpOworICAgIHN0cmNweShsb2ctPmVuZCwgIi50ZW1wIik7CisgICAgcmV0ID0gcmVuYW1lKGxvZy0+cGF0aCwgZGVzdCk7CisgICAgZnJlZShkZXN0KTsKKyAgICBpZiAocmV0ICYmIGVycm5vICE9IEVOT0VOVCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIEJBSUwoNCk7CisKKyAgICAvKiBtYXJrIHRoZSBmb28uZ3ogZmlsZSBhcyBkb25lICovCisgICAgcmV0dXJuIGxvZ19tYXJrKGxvZywgTk9fT1ApOworfQorCisvKiBDb21wcmVzcyB0aGUgbGVuIGJ5dGVzIGF0IGRhdGEgYW5kIGFwcGVuZCB0aGUgY29tcHJlc3NlZCBkYXRhIHRvIHRoZQorICAgZm9vLmd6IGRlZmxhdGUgZGF0YSBpbW1lZGlhdGVseSBhZnRlciB0aGUgcHJldmlvdXMgY29tcHJlc3NlZCBkYXRhLiAgVGhpcworICAgb3ZlcndyaXRlcyB0aGUgcHJldmlvdXMgdW5jb21wcmVzc2VkIGRhdGEsIHdoaWNoIHdhcyBzdG9yZWQgaW4gZm9vLmFkZAorICAgYW5kIGlzIHRoZSBkYXRhIHByb3ZpZGVkIGluIGRhdGFbMC4ubGVuLTFdLiAgSWYgdGhpcyBvcGVyYXRpb24gaXMKKyAgIGludGVycnVwdGVkLCBpdCBwaWNrcyB1cCBhdCB0aGUgc3RhcnQgb2YgdGhpcyByb3V0aW5lLCB3aXRoIHRoZSBmb28uYWRkCisgICBmaWxlIHJlYWQgaW4gYWdhaW4uICBJZiB0aGVyZSBpcyBubyBkYXRhIHRvIGNvbXByZXNzIChsZW4gPT0gMCksIHRoZW4gd2UKKyAgIHNpbXBseSB0ZXJtaW5hdGUgdGhlIGZvby5neiBmaWxlIGFmdGVyIHRoZSBwcmV2aW91c2x5IGNvbXByZXNzZWQgZGF0YSwKKyAgIGFwcGVuZGluZyBhIGZpbmFsIGVtcHR5IHN0b3JlZCBibG9jayBhbmQgdGhlIGd6aXAgdHJhaWxlci4gIFJldHVybiAtMSBpZgorICAgcmVhZGluZyBvciB3cml0aW5nIHRoZSBsb2cuZ3ogZmlsZSBmYWlsZWQsIG9yIC0yIGlmIHRoZXJlIHdhcyBhIG1lbW9yeQorICAgYWxsb2NhdGlvbiBmYWlsdXJlLiAqLworbG9jYWwgaW50IGxvZ19jb21wcmVzcyhzdHJ1Y3QgbG9nICpsb2csIHVuc2lnbmVkIGNoYXIgKmRhdGEsIHNpemVfdCBsZW4pCit7CisgICAgaW50IGZkOworICAgIHVpbnQgZ290LCBtYXg7CisgICAgc3NpemVfdCBkaWN0OworICAgIG9mZl90IGVuZDsKKyAgICB6X3N0cmVhbSBzdHJtOworICAgIHVuc2lnbmVkIGNoYXIgYnVmW0RJQ1RdOworCisgICAgLyogY29tcHJlc3MgYW5kIGFwcGVuZCBjb21wcmVzc2VkIGRhdGEgKi8KKyAgICBpZiAobGVuKSB7CisgICAgICAgIC8qIHNldCB1cCBmb3IgZGVmbGF0ZSwgYWxsb2NhdGluZyBtZW1vcnkgKi8KKyAgICAgICAgc3RybS56YWxsb2MgPSBaX05VTEw7CisgICAgICAgIHN0cm0uemZyZWUgPSBaX05VTEw7CisgICAgICAgIHN0cm0ub3BhcXVlID0gWl9OVUxMOworICAgICAgICBpZiAoZGVmbGF0ZUluaXQyKCZzdHJtLCBaX0RFRkFVTFRfQ09NUFJFU1NJT04sIFpfREVGTEFURUQsIC0xNSwgOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBaX0RFRkFVTFRfU1RSQVRFR1kpICE9IFpfT0spCisgICAgICAgICAgICByZXR1cm4gLTI7CisKKyAgICAgICAgLyogcmVhZCBpbiBkaWN0aW9uYXJ5IChsYXN0IDMySyBvZiBkYXRhIHRoYXQgd2FzIGNvbXByZXNzZWQpICovCisgICAgICAgIHN0cmNweShsb2ctPmVuZCwgIi5kaWN0Iik7CisgICAgICAgIGZkID0gb3Blbihsb2ctPnBhdGgsIE9fUkRPTkxZLCAwKTsKKyAgICAgICAgaWYgKGZkID49IDApIHsKKyAgICAgICAgICAgIGRpY3QgPSByZWFkKGZkLCBidWYsIERJQ1QpOworICAgICAgICAgICAgY2xvc2UoZmQpOworICAgICAgICAgICAgaWYgKGRpY3QgPCAwKSB7CisgICAgICAgICAgICAgICAgZGVmbGF0ZUVuZCgmc3RybSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGRpY3QpCisgICAgICAgICAgICAgICAgZGVmbGF0ZVNldERpY3Rpb25hcnkoJnN0cm0sIGJ1ZiwgKHVpbnQpZGljdCk7CisgICAgICAgIH0KKyAgICAgICAgbG9nX3RvdWNoKGxvZyk7CisKKyAgICAgICAgLyogcHJpbWUgZGVmbGF0ZSB3aXRoIGxhc3QgYml0cyBvZiBwcmV2aW91cyBibG9jaywgcG9zaXRpb24gd3JpdGUKKyAgICAgICAgICAgcG9pbnRlciB0byB3cml0ZSB0aG9zZSBiaXRzIGFuZCBvdmVyd3JpdGUgd2hhdCBmb2xsb3dzICovCisgICAgICAgIGlmIChsc2Vlayhsb2ctPmZkLCBsb2ctPmZpcnN0IC0gKGxvZy0+YmFjayA+IDggPyAyIDogMSksCisgICAgICAgICAgICAgICAgU0VFS19TRVQpIDwgMCB8fAorICAgICAgICAgICAgcmVhZChsb2ctPmZkLCBidWYsIDEpICE9IDEgfHwgbHNlZWsobG9nLT5mZCwgLTEsIFNFRUtfQ1VSKSA8IDApIHsKKyAgICAgICAgICAgIGRlZmxhdGVFbmQoJnN0cm0pOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGRlZmxhdGVQcmltZSgmc3RybSwgKDggLSBsb2ctPmJhY2spICYgNywgKmJ1Zik7CisKKyAgICAgICAgLyogY29tcHJlc3MsIGZpbmlzaGluZyB3aXRoIGEgcGFydGlhbCBub24tbGFzdCBlbXB0eSBzdGF0aWMgYmxvY2sgKi8KKyAgICAgICAgc3RybS5uZXh0X2luID0gZGF0YTsKKyAgICAgICAgbWF4ID0gKCgodWludCkwIC0gMSkgPj4gMSkgKyAxOyAvKiBpbiBjYXNlIGludCBzbWFsbGVyIHRoYW4gc2l6ZV90ICovCisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHN0cm0uYXZhaWxfaW4gPSBsZW4gPiBtYXggPyBtYXggOiAodWludClsZW47CisgICAgICAgICAgICBsZW4gLT0gc3RybS5hdmFpbF9pbjsKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBzdHJtLmF2YWlsX291dCA9IERJQ1Q7CisgICAgICAgICAgICAgICAgc3RybS5uZXh0X291dCA9IGJ1ZjsKKyAgICAgICAgICAgICAgICBkZWZsYXRlKCZzdHJtLCBsZW4gPyBaX05PX0ZMVVNIIDogWl9QQVJUSUFMX0ZMVVNIKTsKKyAgICAgICAgICAgICAgICBnb3QgPSBESUNUIC0gc3RybS5hdmFpbF9vdXQ7CisgICAgICAgICAgICAgICAgaWYgKGdvdCAmJiB3cml0ZShsb2ctPmZkLCBidWYsIGdvdCkgIT0gZ290KSB7CisgICAgICAgICAgICAgICAgICAgIGRlZmxhdGVFbmQoJnN0cm0pOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxvZ190b3VjaChsb2cpOworICAgICAgICAgICAgfSB3aGlsZSAoc3RybS5hdmFpbF9vdXQgPT0gMCk7CisgICAgICAgIH0gd2hpbGUgKGxlbik7CisgICAgICAgIGRlZmxhdGVFbmQoJnN0cm0pOworICAgICAgICBCQUlMKDUpOworCisgICAgICAgIC8qIGZpbmQgc3RhcnQgb2YgZW1wdHkgc3RhdGljIGJsb2NrIC0tIHNjYW5uaW5nIGJhY2t3YXJkcyB0aGUgZmlyc3Qgb25lCisgICAgICAgICAgIGJpdCBpcyB0aGUgc2Vjb25kIGJpdCBvZiB0aGUgYmxvY2ssIGlmIHRoZSBsYXN0IGJ5dGUgaXMgemVybywgdGhlbgorICAgICAgICAgICB3ZSBrbm93IHRoZSBieXRlIGJlZm9yZSB0aGF0IGhhcyBhIG9uZSBpbiB0aGUgdG9wIGJpdCwgc2luY2UgYW4KKyAgICAgICAgICAgZW1wdHkgc3RhdGljIGJsb2NrIGlzIHRlbiBiaXRzIGxvbmcgKi8KKyAgICAgICAgaWYgKChsb2ctPmZpcnN0ID0gbHNlZWsobG9nLT5mZCwgLTEsIFNFRUtfQ1VSKSkgPCAwIHx8CisgICAgICAgICAgICByZWFkKGxvZy0+ZmQsIGJ1ZiwgMSkgIT0gMSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgbG9nLT5maXJzdCsrOworICAgICAgICBpZiAoKmJ1ZikgeworICAgICAgICAgICAgbG9nLT5iYWNrID0gMTsKKyAgICAgICAgICAgIHdoaWxlICgoKmJ1ZiAmICgodWludCkxIDw8ICg4IC0gbG9nLT5iYWNrKyspKSkgPT0gMCkKKyAgICAgICAgICAgICAgICA7ICAgICAgIC8qIGd1YXJhbnRlZWQgdG8gdGVybWluYXRlLCBzaW5jZSAqYnVmICE9IDAgKi8KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBsb2ctPmJhY2sgPSAxMDsKKworICAgICAgICAvKiB1cGRhdGUgY29tcHJlc3NlZCBjcmMgYW5kIGxlbmd0aCAqLworICAgICAgICBsb2ctPmNjcmMgPSBsb2ctPnRjcmM7CisgICAgICAgIGxvZy0+Y2xlbiA9IGxvZy0+dGxlbjsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8qIG5vIGRhdGEgdG8gY29tcHJlc3MgLS0gZml4IHVwIGV4aXN0aW5nIGd6aXAgc3RyZWFtICovCisgICAgICAgIGxvZy0+dGNyYyA9IGxvZy0+Y2NyYzsKKyAgICAgICAgbG9nLT50bGVuID0gbG9nLT5jbGVuOworICAgIH0KKworICAgIC8qIGNvbXBsZXRlIGFuZCB0cnVuY2F0ZSBnemlwIHN0cmVhbSAqLworICAgIGxvZy0+bGFzdCA9IGxvZy0+Zmlyc3Q7CisgICAgbG9nLT5zdG9yZWQgPSAwOworICAgIFBVVDQoYnVmLCBsb2ctPnRjcmMpOworICAgIFBVVDQoYnVmICsgNCwgbG9nLT50bGVuKTsKKyAgICBpZiAobG9nX2xhc3QobG9nLCAxKSB8fCB3cml0ZShsb2ctPmZkLCBidWYsIDgpICE9IDggfHwKKyAgICAgICAgKGVuZCA9IGxzZWVrKGxvZy0+ZmQsIDAsIFNFRUtfQ1VSKSkgPCAwIHx8IGZ0cnVuY2F0ZShsb2ctPmZkLCBlbmQpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgQkFJTCg2KTsKKworICAgIC8qIG1hcmsgYXMgYmVpbmcgaW4gdGhlIHJlcGxhY2Ugb3BlcmF0aW9uICovCisgICAgaWYgKGxvZ19tYXJrKGxvZywgUkVQTEFDRV9PUCkpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIC8qIGV4ZWN1dGUgdGhlIHJlcGxhY2Ugb3BlcmF0aW9uIGFuZCBtYXJrIHRoZSBmaWxlIGFzIGRvbmUgKi8KKyAgICByZXR1cm4gbG9nX3JlcGxhY2UobG9nKTsKK30KKworLyogbG9nIGEgcmVwYWlyIHJlY29yZCB0byB0aGUgLnJlcGFpcnMgZmlsZSAqLworbG9jYWwgdm9pZCBsb2dfbG9nKHN0cnVjdCBsb2cgKmxvZywgaW50IG9wLCBjaGFyICpyZWNvcmQpCit7CisgICAgdGltZV90IG5vdzsKKyAgICBGSUxFICpyZWM7CisKKyAgICBub3cgPSB0aW1lKE5VTEwpOworICAgIHN0cmNweShsb2ctPmVuZCwgIi5yZXBhaXJzIik7CisgICAgcmVjID0gZm9wZW4obG9nLT5wYXRoLCAiYSIpOworICAgIGlmIChyZWMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOworICAgIGZwcmludGYocmVjLCAiJS4yNHMgJXMgcmVjb3Zlcnk6ICVzXG4iLCBjdGltZSgmbm93KSwgb3AgPT0gQVBQRU5EX09QID8KKyAgICAgICAgICAgICJhcHBlbmQiIDogKG9wID09IENPTVBSRVNTX09QID8gImNvbXByZXNzIiA6ICJyZXBsYWNlIiksIHJlY29yZCk7CisgICAgZmNsb3NlKHJlYyk7CisgICAgcmV0dXJuOworfQorCisvKiBSZWNvdmVyIHRoZSBpbnRlcnJ1cHRlZCBvcGVyYXRpb24gb3AuICBGaXJzdCByZWFkIGZvby5hZGQgZm9yIHJlY292ZXJpbmcgYW4KKyAgIGFwcGVuZCBvciBjb21wcmVzcyBvcGVyYXRpb24uICBSZXR1cm4gLTEgaWYgdGhlcmUgd2FzIGFuIGVycm9yIHJlYWRpbmcgb3IKKyAgIHdyaXRpbmcgZm9vLmd6IG9yIHJlYWRpbmcgYW4gZXhpc3RpbmcgZm9vLmFkZCwgb3IgLTIgaWYgdGhlcmUgd2FzIGEgbWVtb3J5CisgICBhbGxvY2F0aW9uIGZhaWx1cmUuICovCitsb2NhbCBpbnQgbG9nX3JlY292ZXIoc3RydWN0IGxvZyAqbG9nLCBpbnQgb3ApCit7CisgICAgaW50IGZkLCByZXQgPSAwOworICAgIHVuc2lnbmVkIGNoYXIgKmRhdGEgPSBOVUxMOworICAgIHNpemVfdCBsZW4gPSAwOworICAgIHN0cnVjdCBzdGF0IHN0OworCisgICAgLyogbG9nIHJlY292ZXJ5ICovCisgICAgbG9nX2xvZyhsb2csIG9wLCAic3RhcnQiKTsKKworICAgIC8qIGxvYWQgZm9vLmFkZCBmaWxlIGlmIGV4cGVjdGVkIGFuZCBwcmVzZW50ICovCisgICAgaWYgKG9wID09IEFQUEVORF9PUCB8fCBvcCA9PSBDT01QUkVTU19PUCkgeworICAgICAgICBzdHJjcHkobG9nLT5lbmQsICIuYWRkIik7CisgICAgICAgIGlmIChzdGF0KGxvZy0+cGF0aCwgJnN0KSA9PSAwICYmIHN0LnN0X3NpemUpIHsKKyAgICAgICAgICAgIGxlbiA9IChzaXplX3QpKHN0LnN0X3NpemUpOworICAgICAgICAgICAgaWYgKGxlbiAhPSBzdC5zdF9zaXplIHx8IChkYXRhID0gbWFsbG9jKHN0LnN0X3NpemUpKSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgbG9nX2xvZyhsb2csIG9wLCAiYWxsb2NhdGlvbiBmYWlsdXJlIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0yOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKChmZCA9IG9wZW4obG9nLT5wYXRoLCBPX1JET05MWSwgMCkpIDwgMCkgeworICAgICAgICAgICAgICAgIGxvZ19sb2cobG9nLCBvcCwgIi5hZGQgZmlsZSByZWFkIGZhaWx1cmUiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXQgPSByZWFkKGZkLCBkYXRhLCBsZW4pICE9IGxlbjsKKyAgICAgICAgICAgIGNsb3NlKGZkKTsKKyAgICAgICAgICAgIGlmIChyZXQpIHsKKyAgICAgICAgICAgICAgICBsb2dfbG9nKGxvZywgb3AsICIuYWRkIGZpbGUgcmVhZCBmYWlsdXJlIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbG9nX2xvZyhsb2csIG9wLCAibG9hZGVkIC5hZGQgZmlsZSIpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGxvZ19sb2cobG9nLCBvcCwgIm1pc3NpbmcgLmFkZCBmaWxlISIpOworICAgIH0KKworICAgIC8qIHJlY292ZXIgdGhlIGludGVycnVwdGVkIG9wZXJhdGlvbiAqLworICAgIHN3aXRjaCAob3ApIHsKKyAgICBjYXNlIEFQUEVORF9PUDoKKyAgICAgICAgcmV0ID0gbG9nX2FwcGVuZChsb2csIGRhdGEsIGxlbik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ09NUFJFU1NfT1A6CisgICAgICAgIHJldCA9IGxvZ19jb21wcmVzcyhsb2csIGRhdGEsIGxlbik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUkVQTEFDRV9PUDoKKyAgICAgICAgcmV0ID0gbG9nX3JlcGxhY2UobG9nKTsKKyAgICB9CisKKyAgICAvKiBsb2cgc3RhdHVzICovCisgICAgbG9nX2xvZyhsb2csIG9wLCByZXQgPyAiZmFpbHVyZSIgOiAiY29tcGxldGUiKTsKKworICAgIC8qIGNsZWFuIHVwICovCisgICAgaWYgKGRhdGEgIT0gTlVMTCkKKyAgICAgICAgZnJlZShkYXRhKTsKKyAgICByZXR1cm4gcmV0OworfQorCisvKiBDbG9zZSB0aGUgZm9vLmd6IGZpbGUgKGlmIG9wZW4pIGFuZCByZWxlYXNlIHRoZSBsb2NrLiAqLworbG9jYWwgdm9pZCBsb2dfY2xvc2Uoc3RydWN0IGxvZyAqbG9nKQoreworICAgIGlmIChsb2ctPmZkID49IDApCisgICAgICAgIGNsb3NlKGxvZy0+ZmQpOworICAgIGxvZy0+ZmQgPSAtMTsKKyAgICBsb2dfdW5sb2NrKGxvZyk7Cit9CisKKy8qIE9wZW4gZm9vLmd6LCB2ZXJpZnkgdGhlIGhlYWRlciwgYW5kIGxvYWQgdGhlIGV4dHJhIGZpZWxkIGNvbnRlbnRzLCBhZnRlcgorICAgZmlyc3QgY3JlYXRpbmcgdGhlIGZvby5sb2NrIGZpbGUgdG8gZ2FpbiBleGNsdXNpdmUgYWNjZXNzIHRvIHRoZSBmb28uKgorICAgZmlsZXMuICBJZiBmb28uZ3ogZG9lcyBub3QgZXhpc3Qgb3IgaXMgZW1wdHksIHRoZW4gd3JpdGUgdGhlIGluaXRpYWwgaGVhZGVyLAorICAgZXh0cmEsIGFuZCBib2R5IGNvbnRlbnQgb2YgYW4gZW1wdHkgZm9vLmd6IGxvZyBmaWxlLiAgSWYgdGhlcmUgaXMgYW4gZXJyb3IKKyAgIGNyZWF0aW5nIHRoZSBsb2NrIGZpbGUgZHVlIHRvIGFjY2VzcyByZXN0cmljdGlvbnMsIG9yIGFuIGVycm9yIHJlYWRpbmcgb3IKKyAgIHdyaXRpbmcgdGhlIGZvby5neiBmaWxlLCBvciBpZiB0aGUgZm9vLmd6IGZpbGUgaXMgbm90IGEgcHJvcGVyIGxvZyBmaWxlIGZvcgorICAgdGhpcyBvYmplY3QgKGUuZy4gbm90IGEgZ3ppcCBmaWxlIG9yIGRvZXMgbm90IGNvbnRhaW4gdGhlIGV4cGVjdGVkIGV4dHJhCisgICBmaWVsZCksIHRoZW4gcmV0dXJuIHRydWUuICBJZiB0aGVyZSBpcyBhbiBlcnJvciwgdGhlIGxvY2sgaXMgcmVsZWFzZWQuCisgICBPdGhlcndpc2UsIHRoZSBsb2NrIGlzIGxlZnQgaW4gcGxhY2UuICovCitsb2NhbCBpbnQgbG9nX29wZW4oc3RydWN0IGxvZyAqbG9nKQoreworICAgIGludCBvcDsKKworICAgIC8qIHJlbGVhc2Ugb3BlbiBmaWxlIHJlc291cmNlIGlmIGxlZnQgb3ZlciAtLSBjYW4gb2NjdXIgaWYgbG9jayBsb3N0CisgICAgICAgYmV0d2VlbiBnemxvZ19vcGVuKCkgYW5kIGd6bG9nX3dyaXRlKCkgKi8KKyAgICBpZiAobG9nLT5mZCA+PSAwKQorICAgICAgICBjbG9zZShsb2ctPmZkKTsKKyAgICBsb2ctPmZkID0gLTE7CisKKyAgICAvKiBuZWdvdGlhdGUgZXhjbHVzaXZlIGFjY2VzcyAqLworICAgIGlmIChsb2dfbG9jayhsb2cpIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgLyogb3BlbiB0aGUgbG9nIGZpbGUsIGZvby5neiAqLworICAgIHN0cmNweShsb2ctPmVuZCwgIi5neiIpOworICAgIGxvZy0+ZmQgPSBvcGVuKGxvZy0+cGF0aCwgT19SRFdSIHwgT19DUkVBVCwgMDY0NCk7CisgICAgaWYgKGxvZy0+ZmQgPCAwKSB7CisgICAgICAgIGxvZ19jbG9zZShsb2cpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLyogaWYgbmV3LCBpbml0aWFsaXplIGZvby5neiB3aXRoIGFuIGVtcHR5IGxvZywgZGVsZXRlIG9sZCBkaWN0aW9uYXJ5ICovCisgICAgaWYgKGxzZWVrKGxvZy0+ZmQsIDAsIFNFRUtfRU5EKSA9PSAwKSB7CisgICAgICAgIGlmICh3cml0ZShsb2ctPmZkLCBsb2dfZ3poZWFkLCBIRUFEKSAhPSBIRUFEIHx8CisgICAgICAgICAgICB3cml0ZShsb2ctPmZkLCBsb2dfZ3pleHQsIEVYVFJBKSAhPSBFWFRSQSB8fAorICAgICAgICAgICAgd3JpdGUobG9nLT5mZCwgbG9nX2d6Ym9keSwgQk9EWSkgIT0gQk9EWSkgeworICAgICAgICAgICAgbG9nX2Nsb3NlKGxvZyk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgc3RyY3B5KGxvZy0+ZW5kLCAiLmRpY3QiKTsKKyAgICAgICAgdW5saW5rKGxvZy0+cGF0aCk7CisgICAgfQorCisgICAgLyogdmVyaWZ5IGxvZyBmaWxlIGFuZCBsb2FkIGV4dHJhIGZpZWxkIGluZm9ybWF0aW9uICovCisgICAgaWYgKChvcCA9IGxvZ19oZWFkKGxvZykpIDwgMCkgeworICAgICAgICBsb2dfY2xvc2UobG9nKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qIGNoZWNrIGZvciBpbnRlcnJ1cHRlZCBwcm9jZXNzIGFuZCBpZiBzbywgcmVjb3ZlciAqLworICAgIGlmIChvcCAhPSBOT19PUCAmJiBsb2dfcmVjb3Zlcihsb2csIG9wKSkgeworICAgICAgICBsb2dfY2xvc2UobG9nKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qIHRvdWNoIHRoZSBsb2NrIGZpbGUgdG8gcHJldmVudCBhbm90aGVyIHByb2Nlc3MgZnJvbSBncmFiYmluZyBpdCAqLworICAgIGxvZ190b3VjaChsb2cpOworICAgIHJldHVybiAwOworfQorCisvKiBTZWUgZ3psb2cuaCBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBleHRlcm5hbCBtZXRob2RzIGJlbG93ICovCitnemxvZyAqZ3psb2dfb3BlbihjaGFyICpwYXRoKQoreworICAgIHNpemVfdCBuOworICAgIHN0cnVjdCBsb2cgKmxvZzsKKworICAgIC8qIGNoZWNrIGFyZ3VtZW50cyAqLworICAgIGlmIChwYXRoID09IE5VTEwgfHwgKnBhdGggPT0gMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICAvKiBhbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBsb2cgc3RydWN0dXJlICovCisgICAgbG9nID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgbG9nKSk7CisgICAgaWYgKGxvZyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBzdHJjcHkobG9nLT5pZCwgTE9HSUQpOworICAgIGxvZy0+ZmQgPSAtMTsKKworICAgIC8qIHNhdmUgcGF0aCBhbmQgZW5kIG9mIHBhdGggZm9yIG5hbWUgY29uc3RydWN0aW9uICovCisgICAgbiA9IHN0cmxlbihwYXRoKTsKKyAgICBsb2ctPnBhdGggPSBtYWxsb2MobiArIDkpOyAgICAgICAgICAgICAgLyogYWxsb3cgZm9yICIucmVwYWlycyIgKi8KKyAgICBpZiAobG9nLT5wYXRoID09IE5VTEwpIHsKKyAgICAgICAgZnJlZShsb2cpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgc3RyY3B5KGxvZy0+cGF0aCwgcGF0aCk7CisgICAgbG9nLT5lbmQgPSBsb2ctPnBhdGggKyBuOworCisgICAgLyogZ2FpbiBleGNsdXNpdmUgYWNjZXNzIGFuZCB2ZXJpZnkgbG9nIGZpbGUgLS0gbWF5IHBlcmZvcm0gYQorICAgICAgIHJlY292ZXJ5IG9wZXJhdGlvbiBpZiBuZWVkZWQgKi8KKyAgICBpZiAobG9nX29wZW4obG9nKSkgeworICAgICAgICBmcmVlKGxvZy0+cGF0aCk7CisgICAgICAgIGZyZWUobG9nKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgLyogcmV0dXJuIHBvaW50ZXIgdG8gbG9nIHN0cnVjdHVyZSAqLworICAgIHJldHVybiBsb2c7Cit9CisKKy8qIGd6bG9nX2NvbXByZXNzKCkgcmV0dXJuIHZhbHVlczoKKyAgICAwOiBhbGwgZ29vZAorICAgLTE6IGZpbGUgaS9vIGVycm9yICh1c3VhbGx5IGFjY2VzcyBpc3N1ZSkKKyAgIC0yOiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlCisgICAtMzogaW52YWxpZCBsb2cgcG9pbnRlciBhcmd1bWVudCAqLworaW50IGd6bG9nX2NvbXByZXNzKGd6bG9nICpsb2dkKQoreworICAgIGludCBmZCwgcmV0OworICAgIHVpbnQgYmxvY2s7CisgICAgc2l6ZV90IGxlbiwgbmV4dDsKKyAgICB1bnNpZ25lZCBjaGFyICpkYXRhLCBidWZbNV07CisgICAgc3RydWN0IGxvZyAqbG9nID0gbG9nZDsKKworICAgIC8qIGNoZWNrIGFyZ3VtZW50cyAqLworICAgIGlmIChsb2cgPT0gTlVMTCB8fCBzdHJjbXAobG9nLT5pZCwgTE9HSUQpIHx8IGxlbiA8IDApCisgICAgICAgIHJldHVybiAtMzsKKworICAgIC8qIHNlZSBpZiB3ZSBsb3N0IHRoZSBsb2NrIC0tIGlmIHNvIGdldCBpdCBhZ2FpbiBhbmQgcmVsb2FkIHRoZSBleHRyYQorICAgICAgIGZpZWxkIGluZm9ybWF0aW9uIChpdCBwcm9iYWJseSBjaGFuZ2VkKSwgcmVjb3ZlciBsYXN0IG9wZXJhdGlvbiBpZgorICAgICAgIG5lY2Vzc2FyeSAqLworICAgIGlmIChsb2dfY2hlY2sobG9nKSAmJiBsb2dfb3Blbihsb2cpKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICAvKiBjcmVhdGUgc3BhY2UgZm9yIHVuY29tcHJlc3NlZCBkYXRhICovCisgICAgbGVuID0gKChzaXplX3QpKGxvZy0+bGFzdCAtIGxvZy0+Zmlyc3QpICYgfigoKHNpemVfdCkxIDw8IDEwKSAtIDEpKSArCisgICAgICAgICAgbG9nLT5zdG9yZWQ7CisgICAgaWYgKChkYXRhID0gbWFsbG9jKGxlbikpID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMjsKKworICAgIC8qIGRvIHN0YXRlbWVudCBoZXJlIGlzIGp1c3QgYSBjaGVhcCB0cmljayBmb3IgZXJyb3IgaGFuZGxpbmcgKi8KKyAgICBkbyB7CisgICAgICAgIC8qIHJlYWQgaW4gdGhlIHVuY29tcHJlc3NlZCBkYXRhICovCisgICAgICAgIGlmIChsc2Vlayhsb2ctPmZkLCBsb2ctPmZpcnN0IC0gMSwgU0VFS19TRVQpIDwgMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBuZXh0ID0gMDsKKyAgICAgICAgd2hpbGUgKG5leHQgPCBsZW4pIHsKKyAgICAgICAgICAgIGlmIChyZWFkKGxvZy0+ZmQsIGJ1ZiwgNSkgIT0gNSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGJsb2NrID0gUFVMTDIoYnVmICsgMSk7CisgICAgICAgICAgICBpZiAobmV4dCArIGJsb2NrID4gbGVuIHx8CisgICAgICAgICAgICAgICAgcmVhZChsb2ctPmZkLCAoY2hhciAqKWRhdGEgKyBuZXh0LCBibG9jaykgIT0gYmxvY2spCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBuZXh0ICs9IGJsb2NrOworICAgICAgICB9CisgICAgICAgIGlmIChsc2Vlayhsb2ctPmZkLCAwLCBTRUVLX0NVUikgIT0gbG9nLT5sYXN0ICsgNCArIGxvZy0+c3RvcmVkKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGxvZ190b3VjaChsb2cpOworCisgICAgICAgIC8qIHdyaXRlIHRoZSB1bmNvbXByZXNzZWQgZGF0YSB0byB0aGUgLmFkZCBmaWxlICovCisgICAgICAgIHN0cmNweShsb2ctPmVuZCwgIi5hZGQiKTsKKyAgICAgICAgZmQgPSBvcGVuKGxvZy0+cGF0aCwgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19UUlVOQywgMDY0NCk7CisgICAgICAgIGlmIChmZCA8IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgcmV0ID0gd3JpdGUoZmQsIGRhdGEsIGxlbikgIT0gbGVuOworICAgICAgICBpZiAocmV0IHwgY2xvc2UoZmQpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGxvZ190b3VjaChsb2cpOworCisgICAgICAgIC8qIHdyaXRlIHRoZSBkaWN0aW9uYXJ5IGZvciB0aGUgbmV4dCBjb21wcmVzcyB0byB0aGUgLnRlbXAgZmlsZSAqLworICAgICAgICBzdHJjcHkobG9nLT5lbmQsICIudGVtcCIpOworICAgICAgICBmZCA9IG9wZW4obG9nLT5wYXRoLCBPX1dST05MWSB8IE9fQ1JFQVQgfCBPX1RSVU5DLCAwNjQ0KTsKKyAgICAgICAgaWYgKGZkIDwgMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBuZXh0ID0gRElDVCA+IGxlbiA/IGxlbiA6IERJQ1Q7CisgICAgICAgIHJldCA9IHdyaXRlKGZkLCAoY2hhciAqKWRhdGEgKyBsZW4gLSBuZXh0LCBuZXh0KSAhPSBuZXh0OworICAgICAgICBpZiAocmV0IHwgY2xvc2UoZmQpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGxvZ190b3VjaChsb2cpOworCisgICAgICAgIC8qIHJvbGwgYmFjayB0byBjb21wcmVzc2VkIGRhdGEsIG1hcmsgdGhlIGNvbXByZXNzIGluIHByb2dyZXNzICovCisgICAgICAgIGxvZy0+bGFzdCA9IGxvZy0+Zmlyc3Q7CisgICAgICAgIGxvZy0+c3RvcmVkID0gMDsKKyAgICAgICAgaWYgKGxvZ19tYXJrKGxvZywgQ09NUFJFU1NfT1ApKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIEJBSUwoNyk7CisKKyAgICAgICAgLyogY29tcHJlc3MgYW5kIGFwcGVuZCB0aGUgZGF0YSAoY2xlYXJzIG1hcmspICovCisgICAgICAgIHJldCA9IGxvZ19jb21wcmVzcyhsb2csIGRhdGEsIGxlbik7CisgICAgICAgIGZyZWUoZGF0YSk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfSB3aGlsZSAoMCk7CisKKyAgICAvKiBicm9rZSBvdXQgb2YgZG8gYWJvdmUgb24gaS9vIGVycm9yICovCisgICAgZnJlZShkYXRhKTsKKyAgICByZXR1cm4gLTE7Cit9CisKKy8qIGd6bG9nX3dyaXRlKCkgcmV0dXJuIHZhbHVlczoKKyAgICAwOiBhbGwgZ29vZAorICAgLTE6IGZpbGUgaS9vIGVycm9yICh1c3VhbGx5IGFjY2VzcyBpc3N1ZSkKKyAgIC0yOiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlCisgICAtMzogaW52YWxpZCBsb2cgcG9pbnRlciBhcmd1bWVudCAqLworaW50IGd6bG9nX3dyaXRlKGd6bG9nICpsb2dkLCB2b2lkICpkYXRhLCBzaXplX3QgbGVuKQoreworICAgIGludCBmZCwgcmV0OworICAgIHN0cnVjdCBsb2cgKmxvZyA9IGxvZ2Q7CisKKyAgICAvKiBjaGVjayBhcmd1bWVudHMgKi8KKyAgICBpZiAobG9nID09IE5VTEwgfHwgc3RyY21wKGxvZy0+aWQsIExPR0lEKSB8fCBsZW4gPCAwKQorICAgICAgICByZXR1cm4gLTM7CisgICAgaWYgKGRhdGEgPT0gTlVMTCB8fCBsZW4gPT0gMCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICAvKiBzZWUgaWYgd2UgbG9zdCB0aGUgbG9jayAtLSBpZiBzbyBnZXQgaXQgYWdhaW4gYW5kIHJlbG9hZCB0aGUgZXh0cmEKKyAgICAgICBmaWVsZCBpbmZvcm1hdGlvbiAoaXQgcHJvYmFibHkgY2hhbmdlZCksIHJlY292ZXIgbGFzdCBvcGVyYXRpb24gaWYKKyAgICAgICBuZWNlc3NhcnkgKi8KKyAgICBpZiAobG9nX2NoZWNrKGxvZykgJiYgbG9nX29wZW4obG9nKSkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgLyogY3JlYXRlIGFuZCB3cml0ZSAuYWRkIGZpbGUgKi8KKyAgICBzdHJjcHkobG9nLT5lbmQsICIuYWRkIik7CisgICAgZmQgPSBvcGVuKGxvZy0+cGF0aCwgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19UUlVOQywgMDY0NCk7CisgICAgaWYgKGZkIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHJldCA9IHdyaXRlKGZkLCBkYXRhLCBsZW4pICE9IGxlbjsKKyAgICBpZiAocmV0IHwgY2xvc2UoZmQpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgbG9nX3RvdWNoKGxvZyk7CisKKyAgICAvKiBtYXJrIGxvZyBmaWxlIHdpdGggYXBwZW5kIGluIHByb2dyZXNzICovCisgICAgaWYgKGxvZ19tYXJrKGxvZywgQVBQRU5EX09QKSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIEJBSUwoOCk7CisKKyAgICAvKiBhcHBlbmQgZGF0YSAoY2xlYXJzIG1hcmspICovCisgICAgaWYgKGxvZ19hcHBlbmQobG9nLCBkYXRhLCBsZW4pKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICAvKiBjaGVjayB0byBzZWUgaWYgaXQncyB0aW1lIHRvIGNvbXByZXNzIC0tIGlmIG5vdCwgdGhlbiBkb25lICovCisgICAgaWYgKCgobG9nLT5sYXN0IC0gbG9nLT5maXJzdCkgPj4gMTApICsgKGxvZy0+c3RvcmVkID4+IDEwKSA8IFRSSUdHRVIpCisgICAgICAgIHJldHVybiAwOworCisgICAgLyogdGltZSB0byBjb21wcmVzcyAqLworICAgIHJldHVybiBnemxvZ19jb21wcmVzcyhsb2cpOworfQorCisvKiBnemxvZ19jbG9zZSgpIHJldHVybiB2YWx1ZXM6CisgICAgMDogb2sKKyAgIC0zOiBpbnZhbGlkIGxvZyBwb2ludGVyIGFyZ3VtZW50ICovCitpbnQgZ3psb2dfY2xvc2UoZ3psb2cgKmxvZ2QpCit7CisgICAgc3RydWN0IGxvZyAqbG9nID0gbG9nZDsKKworICAgIC8qIGNoZWNrIGFyZ3VtZW50cyAqLworICAgIGlmIChsb2cgPT0gTlVMTCB8fCBzdHJjbXAobG9nLT5pZCwgTE9HSUQpKQorICAgICAgICByZXR1cm4gLTM7CisKKyAgICAvKiBjbG9zZSB0aGUgbG9nIGZpbGUgYW5kIHJlbGVhc2UgdGhlIGxvY2sgKi8KKyAgICBsb2dfY2xvc2UobG9nKTsKKworICAgIC8qIGZyZWUgc3RydWN0dXJlIGFuZCByZXR1cm4gKi8KKyAgICBpZiAobG9nLT5wYXRoICE9IE5VTEwpCisgICAgICAgIGZyZWUobG9nLT5wYXRoKTsKKyAgICBzdHJjcHkobG9nLT5pZCwgImJhZCIpOworICAgIGZyZWUobG9nKTsKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3psaWItMS4yLjYvZXhhbXBsZXMvZ3psb2cuaCBiL3psaWItMS4yLjYvZXhhbXBsZXMvZ3psb2cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDYxNDI2Ci0tLSAvZGV2L251bGwKKysrIGIvemxpYi0xLjIuNi9leGFtcGxlcy9nemxvZy5oCkBAIC0wLDAgKzEsODkgQEAKKy8qIGd6bG9nLmgKKyAgQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA4IE1hcmsgQWRsZXIsIGFsbCByaWdodHMgcmVzZXJ2ZWQKKyAgdmVyc2lvbiAyLjAsIDI1IEFwciAyMDA4CisKKyAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKKyAgd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3IgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCisgIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCisKKyAgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCisgIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKKyAgZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgorCisgIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90CisgICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCisgICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQorICAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgorICAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQorICAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCisgIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCisKKyAgTWFyayBBZGxlciAgICBtYWRsZXJAYWx1bW5pLmNhbHRlY2guZWR1CisgKi8KKworLyogVmVyc2lvbiBIaXN0b3J5OgorICAgMS4wICAyNiBOb3YgMjAwNCAgRmlyc3QgdmVyc2lvbgorICAgMi4wICAyNSBBcHIgMjAwOCAgQ29tcGxldGUgcmVkZXNpZ24gZm9yIHJlY292ZXJ5IG9mIGludGVycnVwdGVkIG9wZXJhdGlvbnMKKyAgICAgICAgICAgICAgICAgICAgIEludGVyZmFjZSBjaGFuZ2VkIHNsaWdodGx5IGluIHRoYXQgbm93IHBhdGggaXMgYSBwcmVmaXgKKyAgICAgICAgICAgICAgICAgICAgIENvbXByZXNzaW9uIG5vdyBvY2N1cnMgYXMgbmVlZGVkIGR1cmluZyBnemxvZ193cml0ZSgpCisgICAgICAgICAgICAgICAgICAgICBnemxvZ193cml0ZSgpIG5vdyBhbHdheXMgbGVhdmVzIHRoZSBsb2cgZmlsZSBhcyB2YWxpZCBnemlwCisgKi8KKworLyoKKyAgIFRoZSBnemxvZyBvYmplY3QgYWxsb3dzIHdyaXRpbmcgc2hvcnQgbWVzc2FnZXMgdG8gYSBnemlwcGVkIGxvZyBmaWxlLAorICAgb3BlbmluZyB0aGUgbG9nIGZpbGUgbG9ja2VkIGZvciBzbWFsbCBidXJzdHMsIGFuZCB0aGVuIGNsb3NpbmcgaXQuICBUaGUgbG9nCisgICBvYmplY3Qgd29ya3MgYnkgYXBwZW5kaW5nIHN0b3JlZCAodW5jb21wcmVzc2VkKSBkYXRhIHRvIHRoZSBnemlwIGZpbGUgdW50aWwKKyAgIDEgTUIgaGFzIGJlZW4gYWNjdW11bGF0ZWQuICBBdCB0aGF0IHRpbWUsIHRoZSBzdG9yZWQgZGF0YSBpcyBjb21wcmVzc2VkLCBhbmQKKyAgIHJlcGxhY2VzIHRoZSB1bmNvbXByZXNzZWQgZGF0YSBpbiB0aGUgZmlsZS4gIFRoZSBsb2cgZmlsZSBpcyB0cnVuY2F0ZWQgdG8KKyAgIGl0cyBuZXcgc2l6ZSBhdCB0aGF0IHRpbWUuICBBZnRlciBlYWNoIHdyaXRlIG9wZXJhdGlvbiwgdGhlIGxvZyBmaWxlIGlzIGEKKyAgIHZhbGlkIGd6aXAgZmlsZSB0aGF0IGNhbiBkZWNvbXByZXNzZWQgdG8gcmVjb3ZlciB3aGF0IHdhcyB3cml0dGVuLgorCisgICBUaGUgZ3psb2cgb3BlcmF0aW9ucyBjYW4gYmUgaW50ZXJ1cHRlZCBhdCBhbnkgcG9pbnQgZHVlIHRvIGFuIGFwcGxpY2F0aW9uIG9yCisgICBzeXN0ZW0gY3Jhc2gsIGFuZCB0aGUgbG9nIGZpbGUgd2lsbCBiZSByZWNvdmVyZWQgdGhlIG5leHQgdGltZSB0aGUgbG9nIGlzCisgICBvcGVuZWQgd2l0aCBnemxvZ19vcGVuKCkuCisgKi8KKworI2lmbmRlZiBHWkxPR19ICisjZGVmaW5lIEdaTE9HX0gKKworLyogZ3psb2cgb2JqZWN0IHR5cGUgKi8KK3R5cGVkZWYgdm9pZCBnemxvZzsKKworLyogT3BlbiBhIGd6bG9nIG9iamVjdCwgY3JlYXRpbmcgdGhlIGxvZyBmaWxlIGlmIGl0IGRvZXMgbm90IGV4aXN0LiAgUmV0dXJuCisgICBOVUxMIG9uIGVycm9yLiAgTm90ZSB0aGF0IGd6bG9nX29wZW4oKSBjb3VsZCB0YWtlIGEgd2hpbGUgdG8gY29tcGxldGUgaWYgaXQKKyAgIGhhcyB0byB3YWl0IHRvIHZlcmlmeSB0aGF0IGEgbG9jayBpcyBzdGFsZSAocG9zc2libHkgZm9yIGZpdmUgbWludXRlcyksIG9yCisgICBpZiB0aGVyZSBpcyBzaWduaWZpY2FudCBjb250ZW50aW9uIHdpdGggb3RoZXIgaW5zdGFudGlhdGlvbnMgb2YgdGhpcyBvYmplY3QKKyAgIHdoZW4gbG9ja2luZyB0aGUgcmVzb3VyY2UuICBwYXRoIGlzIHRoZSBwcmVmaXggb2YgdGhlIGZpbGUgbmFtZXMgY3JlYXRlZCBieQorICAgdGhpcyBvYmplY3QuICBJZiBwYXRoIGlzICJmb28iLCB0aGVuIHRoZSBsb2cgZmlsZSB3aWxsIGJlICJmb28uZ3oiLCBhbmQKKyAgIG90aGVyIGF1eGlsaWFyeSBmaWxlcyB3aWxsIGJlIGNyZWF0ZWQgYW5kIGRlc3Ryb3llZCBkdXJpbmcgdGhlIHByb2Nlc3M6CisgICAiZm9vLmRpY3QiIGZvciBhIGNvbXByZXNzaW9uIGRpY3Rpb25hcnksICJmb28udGVtcCIgZm9yIGEgdGVtcG9yYXJ5IChuZXh0KQorICAgZGljdGlvbmFyeSwgImZvby5hZGQiIGZvciBkYXRhIGJlaW5nIGFkZGVkIG9yIGNvbXByZXNzZWQsICJmb28ubG9jayIgZm9yIHRoZQorICAgbG9jayBmaWxlLCBhbmQgImZvby5yZXBhaXJzIiB0byBsb2cgcmVjb3Zlcnkgb3BlcmF0aW9ucyBwZXJmb3JtZWQgZHVlIHRvCisgICBpbnRlcnJ1cHRlZCBnemxvZyBvcGVyYXRpb25zLiAgQSBnemxvZ19vcGVuKCkgZm9sbG93ZWQgYnkgYSBnemxvZ19jbG9zZSgpCisgICB3aWxsIHJlY292ZXIgYSBwcmV2aW91c2x5IGludGVycnVwdGVkIG9wZXJhdGlvbiwgaWYgYW55LiAqLworZ3psb2cgKmd6bG9nX29wZW4oY2hhciAqcGF0aCk7CisKKy8qIFdyaXRlIHRvIGEgZ3psb2cgb2JqZWN0LiAgUmV0dXJuIHplcm8gb24gc3VjY2VzcywgLTEgaWYgdGhlcmUgaXMgYSBmaWxlIGkvbworICAgZXJyb3Igb24gYW55IG9mIHRoZSBnemxvZyBmaWxlcyAodGhpcyBzaG91bGQgbm90IGhhcHBlbiBpZiBnemxvZ19vcGVuKCkKKyAgIHN1Y2NlZWRlZCwgdW5sZXNzIHRoZSBkZXZpY2UgaGFzIHJ1biBvdXQgb2Ygc3BhY2Ugb3IgbGVmdG92ZXIgYXV4aWxpYXJ5CisgICBmaWxlcyBoYXZlIHBlcm1pc3Npb25zIG9yIG93bmVyc2hpcCB0aGF0IHByZXZlbnQgdGhlaXIgdXNlKSwgLTIgaWYgdGhlcmUgaXMKKyAgIGEgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZSwgb3IgLTMgaWYgdGhlIGxvZyBhcmd1bWVudCBpcyBpbnZhbGlkIChlLmcuIGlmCisgICBpdCB3YXMgbm90IGNyZWF0ZWQgYnkgZ3psb2dfb3BlbigpKS4gIFRoaXMgZnVuY3Rpb24gd2lsbCB3cml0ZSBkYXRhIHRvIHRoZQorICAgZmlsZSB1bmNvbXByZXNzZWQsIHVudGlsIDEgTUIgaGFzIGJlZW4gYWNjdW11bGF0ZWQsIGF0IHdoaWNoIHRpbWUgdGhhdCBkYXRhCisgICB3aWxsIGJlIGNvbXByZXNzZWQuICBUaGUgbG9nIGZpbGUgd2lsbCBiZSBhIHZhbGlkIGd6aXAgZmlsZSB1cG9uIHN1Y2Nlc3NmdWwKKyAgIHJldHVybi4gKi8KK2ludCBnemxvZ193cml0ZShnemxvZyAqbG9nLCB2b2lkICpkYXRhLCBzaXplX3QgbGVuKTsKKworLyogRm9yY2UgY29tcHJlc3Npb24gb2YgYW55IHVuY29tcHJlc3NlZCBkYXRhIGluIHRoZSBsb2cuICBUaGlzIHNob3VsZCBiZSB1c2VkCisgICBzcGFyaW5nbHksIGlmIGF0IGFsbC4gIFRoZSBtYWluIGFwcGxpY2F0aW9uIHdvdWxkIGJlIHdoZW4gYSBsb2cgZmlsZSB3aWxsCisgICBub3QgYmUgYXBwZW5kZWQgdG8gYWdhaW4uICBJZiB0aGlzIGlzIHVzZWQgdG8gY29tcHJlc3MgZnJlcXVlbnRseSB3aGlsZQorICAgYXBwZW5kaW5nLCBpdCB3aWxsIGJvdGggc2lnbmlmaWNhbnRseSBpbmNyZWFzZSB0aGUgZXhlY3V0aW9uIHRpbWUgYW5kCisgICByZWR1Y2UgdGhlIGNvbXByZXNzaW9uIHJhdGlvLiAgVGhlIHJldHVybiBjb2RlcyBhcmUgdGhlIHNhbWUgYXMgZm9yCisgICBnemxvZ193cml0ZSgpLiAqLworaW50IGd6bG9nX2NvbXByZXNzKGd6bG9nICpsb2cpOworCisvKiBDbG9zZSBhIGd6bG9nIG9iamVjdC4gIFJldHVybiB6ZXJvIG9uIHN1Y2Nlc3MsIC0zIGlmIHRoZSBsb2cgYXJndW1lbnQgaXMKKyAgIGludmFsaWQuICBUaGUgbG9nIG9iamVjdCBpcyBmcmVlZCwgYW5kIHNvIGNhbm5vdCBiZSByZWZlcmVuY2VkIGFnYWluLiAqLworaW50IGd6bG9nX2Nsb3NlKGd6bG9nICpsb2cpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3psaWItMS4yLjYvZXhhbXBsZXMvemxpYl9ob3cuaHRtbCBiL3psaWItMS4yLjYvZXhhbXBsZXMvemxpYl9ob3cuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDRmZjFjCi0tLSAvZGV2L251bGwKKysrIGIvemxpYi0xLjIuNi9leGFtcGxlcy96bGliX2hvdy5odG1sCkBAIC0wLDAgKzEsNTQ1IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iCisgICJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwL2xvb3NlLmR0ZCI+Cis8aHRtbD4KKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Cis8dGl0bGU+emxpYiBVc2FnZSBFeGFtcGxlPC90aXRsZT4KKzwhLS0gIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBNYXJrIEFkbGVyLiAgLS0+Cis8L2hlYWQ+Cis8Ym9keSBiZ2NvbG9yPSIjRkZGRkZGIiB0ZXh0PSIjMDAwMDAwIiBsaW5rPSIjMDAwMEZGIiB2bGluaz0iIzAwQTAwMCI+Cis8aDIgYWxpZ249ImNlbnRlciI+IHpsaWIgVXNhZ2UgRXhhbXBsZSA8L2gyPgorV2Ugb2Z0ZW4gZ2V0IHF1ZXN0aW9ucyBhYm91dCBob3cgdGhlIDx0dD5kZWZsYXRlKCk8L3R0PiBhbmQgPHR0PmluZmxhdGUoKTwvdHQ+IGZ1bmN0aW9ucyBzaG91bGQgYmUgdXNlZC4KK1VzZXJzIHdvbmRlciB3aGVuIHRoZXkgc2hvdWxkIHByb3ZpZGUgbW9yZSBpbnB1dCwgd2hlbiB0aGV5IHNob3VsZCB1c2UgbW9yZSBvdXRwdXQsCit3aGF0IHRvIGRvIHdpdGggYSA8dHQ+Wl9CVUZfRVJST1I8L3R0PiwgaG93IHRvIG1ha2Ugc3VyZSB0aGUgcHJvY2VzcyB0ZXJtaW5hdGVzIHByb3Blcmx5LCBhbmQKK3NvIG9uLiAgU28gZm9yIHRob3NlIHdobyBoYXZlIHJlYWQgPHR0PnpsaWIuaDwvdHQ+IChhIGZldyB0aW1lcyksIGFuZAord291bGQgbGlrZSBmdXJ0aGVyIGVkaWZpY2F0aW9uLCBiZWxvdyBpcyBhbiBhbm5vdGF0ZWQgZXhhbXBsZSBpbiBDIG9mIHNpbXBsZSByb3V0aW5lcyB0byBjb21wcmVzcyBhbmQgZGVjb21wcmVzcworZnJvbSBhbiBpbnB1dCBmaWxlIHRvIGFuIG91dHB1dCBmaWxlIHVzaW5nIDx0dD5kZWZsYXRlKCk8L3R0PiBhbmQgPHR0PmluZmxhdGUoKTwvdHQ+IHJlc3BlY3RpdmVseS4gIFRoZQorYW5ub3RhdGlvbnMgYXJlIGludGVyc3BlcnNlZCBiZXR3ZWVuIGxpbmVzIG9mIHRoZSBjb2RlLiAgU28gcGxlYXNlIHJlYWQgYmV0d2VlbiB0aGUgbGluZXMuCitXZSBob3BlIHRoaXMgaGVscHMgZXhwbGFpbiBzb21lIG9mIHRoZSBpbnRyaWNhY2llcyBvZiA8ZW0+emxpYjwvZW0+LgorPHA+CitXaXRob3V0IGZ1cnRoZXIgYWRpZXUsIGhlcmUgaXMgdGhlIHByb2dyYW0gPGEgaHJlZj0ienBpcGUuYyI+PHR0PnpwaXBlLmM8L3R0PjwvYT46Cis8cHJlPjxiPgorLyogenBpcGUuYzogZXhhbXBsZSBvZiBwcm9wZXIgdXNlIG9mIHpsaWIncyBpbmZsYXRlKCkgYW5kIGRlZmxhdGUoKQorICAgTm90IGNvcHlyaWdodGVkIC0tIHByb3ZpZGVkIHRvIHRoZSBwdWJsaWMgZG9tYWluCisgICBWZXJzaW9uIDEuNCAgMTEgRGVjZW1iZXIgMjAwNSAgTWFyayBBZGxlciAqLworCisvKiBWZXJzaW9uIGhpc3Rvcnk6CisgICAxLjAgIDMwIE9jdCAyMDA0ICBGaXJzdCB2ZXJzaW9uCisgICAxLjEgICA4IE5vdiAyMDA0ICBBZGQgdm9pZCBjYXN0aW5nIGZvciB1bnVzZWQgcmV0dXJuIHZhbHVlcworICAgICAgICAgICAgICAgICAgICAgVXNlIHN3aXRjaCBzdGF0ZW1lbnQgZm9yIGluZmxhdGUoKSByZXR1cm4gdmFsdWVzCisgICAxLjIgICA5IE5vdiAyMDA0ICBBZGQgYXNzZXJ0aW9ucyB0byBkb2N1bWVudCB6bGliIGd1YXJhbnRlZXMKKyAgIDEuMyAgIDYgQXByIDIwMDUgIFJlbW92ZSBpbmNvcnJlY3QgYXNzZXJ0aW9uIGluIGluZigpCisgICAxLjQgIDExIERlYyAyMDA1ICBBZGQgaGFjayB0byBhdm9pZCBNU0RPUyBlbmQtb2YtbGluZSBjb252ZXJzaW9ucworICAgICAgICAgICAgICAgICAgICAgQXZvaWQgc29tZSBjb21waWxlciB3YXJuaW5ncyBmb3IgaW5wdXQgYW5kIG91dHB1dCBidWZmZXJzCisgKi8KKzwvYj48L3ByZT48IS0tIC0tPgorV2Ugbm93IGluY2x1ZGUgdGhlIGhlYWRlciBmaWxlcyBmb3IgdGhlIHJlcXVpcmVkIGRlZmluaXRpb25zLiAgRnJvbQorPHR0PnN0ZGlvLmg8L3R0PiB3ZSB1c2UgPHR0PmZvcGVuKCk8L3R0PiwgPHR0PmZyZWFkKCk8L3R0PiwgPHR0PmZ3cml0ZSgpPC90dD4sCis8dHQ+ZmVvZigpPC90dD4sIDx0dD5mZXJyb3IoKTwvdHQ+LCBhbmQgPHR0PmZjbG9zZSgpPC90dD4gZm9yIGZpbGUgaS9vLCBhbmQKKzx0dD5mcHV0cygpPC90dD4gZm9yIGVycm9yIG1lc3NhZ2VzLiAgRnJvbSA8dHQ+c3RyaW5nLmg8L3R0PiB3ZSB1c2UKKzx0dD5zdHJjbXAoKTwvdHQ+IGZvciBjb21tYW5kIGxpbmUgYXJndW1lbnQgcHJvY2Vzc2luZy4KK0Zyb20gPHR0PmFzc2VydC5oPC90dD4gd2UgdXNlIHRoZSA8dHQ+YXNzZXJ0KCk8L3R0PiBtYWNyby4KK0Zyb20gPHR0PnpsaWIuaDwvdHQ+Cit3ZSB1c2UgdGhlIGJhc2ljIGNvbXByZXNzaW9uIGZ1bmN0aW9ucyA8dHQ+ZGVmbGF0ZUluaXQoKTwvdHQ+LAorPHR0PmRlZmxhdGUoKTwvdHQ+LCBhbmQgPHR0PmRlZmxhdGVFbmQoKTwvdHQ+LCBhbmQgdGhlIGJhc2ljIGRlY29tcHJlc3Npb24KK2Z1bmN0aW9ucyA8dHQ+aW5mbGF0ZUluaXQoKTwvdHQ+LCA8dHQ+aW5mbGF0ZSgpPC90dD4sIGFuZAorPHR0PmluZmxhdGVFbmQoKTwvdHQ+LgorPHByZT48Yj4KKyNpbmNsdWRlICZsdDtzdGRpby5oJmd0OworI2luY2x1ZGUgJmx0O3N0cmluZy5oJmd0OworI2luY2x1ZGUgJmx0O2Fzc2VydC5oJmd0OworI2luY2x1ZGUgInpsaWIuaCIKKzwvYj48L3ByZT48IS0tIC0tPgorVGhpcyBpcyBhbiB1Z2x5IGhhY2sgcmVxdWlyZWQgdG8gYXZvaWQgY29ycnVwdGlvbiBvZiB0aGUgaW5wdXQgYW5kIG91dHB1dCBkYXRhIG9uCitXaW5kb3dzL01TLURPUyBzeXN0ZW1zLiAgV2l0aG91dCB0aGlzLCB0aG9zZSBzeXN0ZW1zIHdvdWxkIGFzc3VtZSB0aGF0IHRoZSBpbnB1dCBhbmQgb3V0cHV0CitmaWxlcyBhcmUgdGV4dCwgYW5kIHRyeSB0byBjb252ZXJ0IHRoZSBlbmQtb2YtbGluZSBjaGFyYWN0ZXJzIGZyb20gb25lIHN0YW5kYXJkIHRvCithbm90aGVyLiAgVGhhdCB3b3VsZCBjb3JydXB0IGJpbmFyeSBkYXRhLCBhbmQgaW4gcGFydGljdWxhciB3b3VsZCByZW5kZXIgdGhlIGNvbXByZXNzZWQgZGF0YSB1bnVzYWJsZS4KK1RoaXMgc2V0cyB0aGUgaW5wdXQgYW5kIG91dHB1dCB0byBiaW5hcnkgd2hpY2ggc3VwcHJlc3NlcyB0aGUgZW5kLW9mLWxpbmUgY29udmVyc2lvbnMuCis8dHQ+U0VUX0JJTkFSWV9NT0RFKCk8L3R0PiB3aWxsIGJlIHVzZWQgbGF0ZXIgb24gPHR0PnN0ZGluPC90dD4gYW5kIDx0dD5zdGRvdXQ8L3R0PiwgYXQgdGhlIGJlZ2lubmluZyBvZiA8dHQ+bWFpbigpPC90dD4uCis8cHJlPjxiPgorI2lmIGRlZmluZWQoTVNET1MpIHx8IGRlZmluZWQoT1MyKSB8fCBkZWZpbmVkKFdJTjMyKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCisjICBpbmNsdWRlICZsdDtmY250bC5oJmd0OworIyAgaW5jbHVkZSAmbHQ7aW8uaCZndDsKKyMgIGRlZmluZSBTRVRfQklOQVJZX01PREUoZmlsZSkgc2V0bW9kZShmaWxlbm8oZmlsZSksIE9fQklOQVJZKQorI2Vsc2UKKyMgIGRlZmluZSBTRVRfQklOQVJZX01PREUoZmlsZSkKKyNlbmRpZgorPC9iPjwvcHJlPjwhLS0gLS0+Cis8dHQ+Q0hVTks8L3R0PiBpcyBzaW1wbHkgdGhlIGJ1ZmZlciBzaXplIGZvciBmZWVkaW5nIGRhdGEgdG8gYW5kIHB1bGxpbmcgZGF0YQorZnJvbSB0aGUgPGVtPnpsaWI8L2VtPiByb3V0aW5lcy4gIExhcmdlciBidWZmZXIgc2l6ZXMgd291bGQgYmUgbW9yZSBlZmZpY2llbnQsCitlc3BlY2lhbGx5IGZvciA8dHQ+aW5mbGF0ZSgpPC90dD4uICBJZiB0aGUgbWVtb3J5IGlzIGF2YWlsYWJsZSwgYnVmZmVycyBzaXplcworb24gdGhlIG9yZGVyIG9mIDEyOEsgb3IgMjU2SyBieXRlcyBzaG91bGQgYmUgdXNlZC4KKzxwcmU+PGI+CisjZGVmaW5lIENIVU5LIDE2Mzg0Cis8L2I+PC9wcmU+PCEtLSAtLT4KK1RoZSA8dHQ+ZGVmKCk8L3R0PiByb3V0aW5lIGNvbXByZXNzZXMgZGF0YSBmcm9tIGFuIGlucHV0IGZpbGUgdG8gYW4gb3V0cHV0IGZpbGUuICBUaGUgb3V0cHV0IGRhdGEKK3dpbGwgYmUgaW4gdGhlIDxlbT56bGliPC9lbT4gZm9ybWF0LCB3aGljaCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgPGVtPmd6aXA8L2VtPiBvciA8ZW0+emlwPC9lbT4KK2Zvcm1hdHMuICBUaGUgPGVtPnpsaWI8L2VtPiBmb3JtYXQgaGFzIGEgdmVyeSBzbWFsbCBoZWFkZXIgb2Ygb25seSB0d28gYnl0ZXMgdG8gaWRlbnRpZnkgaXQgYXMKK2EgPGVtPnpsaWI8L2VtPiBzdHJlYW0gYW5kIHRvIHByb3ZpZGUgZGVjb2RpbmcgaW5mb3JtYXRpb24sIGFuZCBhIGZvdXItYnl0ZSB0cmFpbGVyIHdpdGggYSBmYXN0CitjaGVjayB2YWx1ZSB0byB2ZXJpZnkgdGhlIGludGVncml0eSBvZiB0aGUgdW5jb21wcmVzc2VkIGRhdGEgYWZ0ZXIgZGVjb2RpbmcuCis8cHJlPjxiPgorLyogQ29tcHJlc3MgZnJvbSBmaWxlIHNvdXJjZSB0byBmaWxlIGRlc3QgdW50aWwgRU9GIG9uIHNvdXJjZS4KKyAgIGRlZigpIHJldHVybnMgWl9PSyBvbiBzdWNjZXNzLCBaX01FTV9FUlJPUiBpZiBtZW1vcnkgY291bGQgbm90IGJlCisgICBhbGxvY2F0ZWQgZm9yIHByb2Nlc3NpbmcsIFpfU1RSRUFNX0VSUk9SIGlmIGFuIGludmFsaWQgY29tcHJlc3Npb24KKyAgIGxldmVsIGlzIHN1cHBsaWVkLCBaX1ZFUlNJT05fRVJST1IgaWYgdGhlIHZlcnNpb24gb2YgemxpYi5oIGFuZCB0aGUKKyAgIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkgbGlua2VkIGRvIG5vdCBtYXRjaCwgb3IgWl9FUlJOTyBpZiB0aGVyZSBpcworICAgYW4gZXJyb3IgcmVhZGluZyBvciB3cml0aW5nIHRoZSBmaWxlcy4gKi8KK2ludCBkZWYoRklMRSAqc291cmNlLCBGSUxFICpkZXN0LCBpbnQgbGV2ZWwpCit7Cis8L2I+PC9wcmU+CitIZXJlIGFyZSB0aGUgbG9jYWwgdmFyaWFibGVzIGZvciA8dHQ+ZGVmKCk8L3R0Pi4gIDx0dD5yZXQ8L3R0PiB3aWxsIGJlIHVzZWQgZm9yIDxlbT56bGliPC9lbT4KK3JldHVybiBjb2Rlcy4gIDx0dD5mbHVzaDwvdHQ+IHdpbGwga2VlcCB0cmFjayBvZiB0aGUgY3VycmVudCBmbHVzaGluZyBzdGF0ZSBmb3IgPHR0PmRlZmxhdGUoKTwvdHQ+LAord2hpY2ggaXMgZWl0aGVyIG5vIGZsdXNoaW5nLCBvciBmbHVzaCB0byBjb21wbGV0aW9uIGFmdGVyIHRoZSBlbmQgb2YgdGhlIGlucHV0IGZpbGUgaXMgcmVhY2hlZC4KKzx0dD5oYXZlPC90dD4gaXMgdGhlIGFtb3VudCBvZiBkYXRhIHJldHVybmVkIGZyb20gPHR0PmRlZmxhdGUoKTwvdHQ+LiAgVGhlIDx0dD5zdHJtPC90dD4gc3RydWN0dXJlCitpcyB1c2VkIHRvIHBhc3MgaW5mb3JtYXRpb24gdG8gYW5kIGZyb20gdGhlIDxlbT56bGliPC9lbT4gcm91dGluZXMsIGFuZCB0byBtYWludGFpbiB0aGUKKzx0dD5kZWZsYXRlKCk8L3R0PiBzdGF0ZS4gIDx0dD5pbjwvdHQ+IGFuZCA8dHQ+b3V0PC90dD4gYXJlIHRoZSBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMgZm9yCis8dHQ+ZGVmbGF0ZSgpPC90dD4uCis8cHJlPjxiPgorICAgIGludCByZXQsIGZsdXNoOworICAgIHVuc2lnbmVkIGhhdmU7CisgICAgel9zdHJlYW0gc3RybTsKKyAgICB1bnNpZ25lZCBjaGFyIGluW0NIVU5LXTsKKyAgICB1bnNpZ25lZCBjaGFyIG91dFtDSFVOS107Cis8L2I+PC9wcmU+PCEtLSAtLT4KK1RoZSBmaXJzdCB0aGluZyB3ZSBkbyBpcyB0byBpbml0aWFsaXplIHRoZSA8ZW0+emxpYjwvZW0+IHN0YXRlIGZvciBjb21wcmVzc2lvbiB1c2luZworPHR0PmRlZmxhdGVJbml0KCk8L3R0Pi4gIFRoaXMgbXVzdCBiZSBkb25lIGJlZm9yZSB0aGUgZmlyc3QgdXNlIG9mIDx0dD5kZWZsYXRlKCk8L3R0Pi4KK1RoZSA8dHQ+emFsbG9jPC90dD4sIDx0dD56ZnJlZTwvdHQ+LCBhbmQgPHR0Pm9wYXF1ZTwvdHQ+IGZpZWxkcyBpbiB0aGUgPHR0PnN0cm08L3R0Pgorc3RydWN0dXJlIG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIGNhbGxpbmcgPHR0PmRlZmxhdGVJbml0KCk8L3R0Pi4gIEhlcmUgdGhleSBhcmUKK3NldCB0byB0aGUgPGVtPnpsaWI8L2VtPiBjb25zdGFudCA8dHQ+Wl9OVUxMPC90dD4gdG8gcmVxdWVzdCB0aGF0IDxlbT56bGliPC9lbT4gdXNlCit0aGUgZGVmYXVsdCBtZW1vcnkgYWxsb2NhdGlvbiByb3V0aW5lcy4gIEFuIGFwcGxpY2F0aW9uIG1heSBhbHNvIGNob29zZSB0byBwcm92aWRlCitjdXN0b20gbWVtb3J5IGFsbG9jYXRpb24gcm91dGluZXMgaGVyZS4gIDx0dD5kZWZsYXRlSW5pdCgpPC90dD4gd2lsbCBhbGxvY2F0ZSBvbiB0aGUKK29yZGVyIG9mIDI1NksgYnl0ZXMgZm9yIHRoZSBpbnRlcm5hbCBzdGF0ZS4KKyhTZWUgPGEgaHJlZj0iemxpYl90ZWNoLmh0bWwiPjxlbT56bGliIFRlY2huaWNhbCBEZXRhaWxzPC9lbT48L2E+LikKKzxwPgorPHR0PmRlZmxhdGVJbml0KCk8L3R0PiBpcyBjYWxsZWQgd2l0aCBhIHBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSB0byBiZSBpbml0aWFsaXplZCBhbmQKK3RoZSBjb21wcmVzc2lvbiBsZXZlbCwgd2hpY2ggaXMgYW4gaW50ZWdlciBpbiB0aGUgcmFuZ2Ugb2YgLTEgdG8gOS4gIExvd2VyIGNvbXByZXNzaW9uCitsZXZlbHMgcmVzdWx0IGluIGZhc3RlciBleGVjdXRpb24sIGJ1dCBsZXNzIGNvbXByZXNzaW9uLiAgSGlnaGVyIGxldmVscyByZXN1bHQgaW4KK2dyZWF0ZXIgY29tcHJlc3Npb24sIGJ1dCBzbG93ZXIgZXhlY3V0aW9uLiAgVGhlIDxlbT56bGliPC9lbT4gY29uc3RhbnQgWl9ERUZBVUxUX0NPTVBSRVNTSU9OLAorZXF1YWwgdG8gLTEsCitwcm92aWRlcyBhIGdvb2QgY29tcHJvbWlzZSBiZXR3ZWVuIGNvbXByZXNzaW9uIGFuZCBzcGVlZCBhbmQgaXMgZXF1aXZhbGVudCB0byBsZXZlbCA2LgorTGV2ZWwgMCBhY3R1YWxseSBkb2VzIG5vIGNvbXByZXNzaW9uIGF0IGFsbCwgYW5kIGluIGZhY3QgZXhwYW5kcyB0aGUgZGF0YSBzbGlnaHRseSB0byBwcm9kdWNlCit0aGUgPGVtPnpsaWI8L2VtPiBmb3JtYXQgKGl0IGlzIG5vdCBhIGJ5dGUtZm9yLWJ5dGUgY29weSBvZiB0aGUgaW5wdXQpLgorTW9yZSBhZHZhbmNlZCBhcHBsaWNhdGlvbnMgb2YgPGVtPnpsaWI8L2VtPgorbWF5IHVzZSA8dHQ+ZGVmbGF0ZUluaXQyKCk8L3R0PiBoZXJlIGluc3RlYWQuICBTdWNoIGFuIGFwcGxpY2F0aW9uIG1heSB3YW50IHRvIHJlZHVjZSBob3cKK211Y2ggbWVtb3J5IHdpbGwgYmUgdXNlZCwgYXQgc29tZSBwcmljZSBpbiBjb21wcmVzc2lvbi4gIE9yIGl0IG1heSBuZWVkIHRvIHJlcXVlc3QgYQorPGVtPmd6aXA8L2VtPiBoZWFkZXIgYW5kIHRyYWlsZXIgaW5zdGVhZCBvZiBhIDxlbT56bGliPC9lbT4gaGVhZGVyIGFuZCB0cmFpbGVyLCBvciByYXcKK2VuY29kaW5nIHdpdGggbm8gaGVhZGVyIG9yIHRyYWlsZXIgYXQgYWxsLgorPHA+CitXZSBtdXN0IGNoZWNrIHRoZSByZXR1cm4gdmFsdWUgb2YgPHR0PmRlZmxhdGVJbml0KCk8L3R0PiBhZ2FpbnN0IHRoZSA8ZW0+emxpYjwvZW0+IGNvbnN0YW50Cis8dHQ+Wl9PSzwvdHQ+IHRvIG1ha2Ugc3VyZSB0aGF0IGl0IHdhcyBhYmxlIHRvCithbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBpbnRlcm5hbCBzdGF0ZSwgYW5kIHRoYXQgdGhlIHByb3ZpZGVkIGFyZ3VtZW50cyB3ZXJlIHZhbGlkLgorPHR0PmRlZmxhdGVJbml0KCk8L3R0PiB3aWxsIGFsc28gY2hlY2sgdGhhdCB0aGUgdmVyc2lvbiBvZiA8ZW0+emxpYjwvZW0+IHRoYXQgdGhlIDx0dD56bGliLmg8L3R0PgorZmlsZSBjYW1lIGZyb20gbWF0Y2hlcyB0aGUgdmVyc2lvbiBvZiA8ZW0+emxpYjwvZW0+IGFjdHVhbGx5IGxpbmtlZCB3aXRoIHRoZSBwcm9ncmFtLiAgVGhpcworaXMgZXNwZWNpYWxseSBpbXBvcnRhbnQgZm9yIGVudmlyb25tZW50cyBpbiB3aGljaCA8ZW0+emxpYjwvZW0+IGlzIGEgc2hhcmVkIGxpYnJhcnkuCis8cD4KK05vdGUgdGhhdCBhbiBhcHBsaWNhdGlvbiBjYW4gaW5pdGlhbGl6ZSBtdWx0aXBsZSwgaW5kZXBlbmRlbnQgPGVtPnpsaWI8L2VtPiBzdHJlYW1zLCB3aGljaCBjYW4KK29wZXJhdGUgaW4gcGFyYWxsZWwuICBUaGUgc3RhdGUgaW5mb3JtYXRpb24gbWFpbnRhaW5lZCBpbiB0aGUgc3RydWN0dXJlIGFsbG93cyB0aGUgPGVtPnpsaWI8L2VtPgorcm91dGluZXMgdG8gYmUgcmVlbnRyYW50LgorPHByZT48Yj4KKyAgICAvKiBhbGxvY2F0ZSBkZWZsYXRlIHN0YXRlICovCisgICAgc3RybS56YWxsb2MgPSBaX05VTEw7CisgICAgc3RybS56ZnJlZSA9IFpfTlVMTDsKKyAgICBzdHJtLm9wYXF1ZSA9IFpfTlVMTDsKKyAgICByZXQgPSBkZWZsYXRlSW5pdCgmYW1wO3N0cm0sIGxldmVsKTsKKyAgICBpZiAocmV0ICE9IFpfT0spCisgICAgICAgIHJldHVybiByZXQ7Cis8L2I+PC9wcmU+PCEtLSAtLT4KK1dpdGggdGhlIHBsZWFzYW50cmllcyBvdXQgb2YgdGhlIHdheSwgbm93IHdlIGNhbiBnZXQgZG93biB0byBidXNpbmVzcy4gIFRoZSBvdXRlciA8dHQ+ZG88L3R0Pi1sb29wCityZWFkcyBhbGwgb2YgdGhlIGlucHV0IGZpbGUgYW5kIGV4aXRzIGF0IHRoZSBib3R0b20gb2YgdGhlIGxvb3Agb25jZSBlbmQtb2YtZmlsZSBpcyByZWFjaGVkLgorVGhpcyBsb29wIGNvbnRhaW5zIHRoZSBvbmx5IGNhbGwgb2YgPHR0PmRlZmxhdGUoKTwvdHQ+LiAgU28gd2UgbXVzdCBtYWtlIHN1cmUgdGhhdCBhbGwgb2YgdGhlCitpbnB1dCBkYXRhIGhhcyBiZWVuIHByb2Nlc3NlZCBhbmQgdGhhdCBhbGwgb2YgdGhlIG91dHB1dCBkYXRhIGhhcyBiZWVuIGdlbmVyYXRlZCBhbmQgY29uc3VtZWQKK2JlZm9yZSB3ZSBmYWxsIG91dCBvZiB0aGUgbG9vcCBhdCB0aGUgYm90dG9tLgorPHByZT48Yj4KKyAgICAvKiBjb21wcmVzcyB1bnRpbCBlbmQgb2YgZmlsZSAqLworICAgIGRvIHsKKzwvYj48L3ByZT4KK1dlIHN0YXJ0IG9mZiBieSByZWFkaW5nIGRhdGEgZnJvbSB0aGUgaW5wdXQgZmlsZS4gIFRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZCBpcyBwdXQgZGlyZWN0bHkKK2ludG8gPHR0PmF2YWlsX2luPC90dD4sIGFuZCBhIHBvaW50ZXIgdG8gdGhvc2UgYnl0ZXMgaXMgcHV0IGludG8gPHR0Pm5leHRfaW48L3R0Pi4gIFdlIGFsc28KK2NoZWNrIHRvIHNlZSBpZiBlbmQtb2YtZmlsZSBvbiB0aGUgaW5wdXQgaGFzIGJlZW4gcmVhY2hlZC4gIElmIHdlIGFyZSBhdCB0aGUgZW5kIG9mIGZpbGUsIHRoZW4gPHR0PmZsdXNoPC90dD4gaXMgc2V0IHRvIHRoZQorPGVtPnpsaWI8L2VtPiBjb25zdGFudCA8dHQ+Wl9GSU5JU0g8L3R0Piwgd2hpY2ggaXMgbGF0ZXIgcGFzc2VkIHRvIDx0dD5kZWZsYXRlKCk8L3R0PiB0bworaW5kaWNhdGUgdGhhdCB0aGlzIGlzIHRoZSBsYXN0IGNodW5rIG9mIGlucHV0IGRhdGEgdG8gY29tcHJlc3MuICBXZSBuZWVkIHRvIHVzZSA8dHQ+ZmVvZigpPC90dD4KK3RvIGNoZWNrIGZvciBlbmQtb2YtZmlsZSBhcyBvcHBvc2VkIHRvIHNlZWluZyBpZiBmZXdlciB0aGFuIDx0dD5DSFVOSzwvdHQ+IGJ5dGVzIGhhdmUgYmVlbiByZWFkLiAgVGhlCityZWFzb24gaXMgdGhhdCBpZiB0aGUgaW5wdXQgZmlsZSBsZW5ndGggaXMgYW4gZXhhY3QgbXVsdGlwbGUgb2YgPHR0PkNIVU5LPC90dD4sIHdlIHdpbGwgbWlzcwordGhlIGZhY3QgdGhhdCB3ZSBnb3QgdG8gdGhlIGVuZC1vZi1maWxlLCBhbmQgbm90IGtub3cgdG8gdGVsbCA8dHQ+ZGVmbGF0ZSgpPC90dD4gdG8gZmluaXNoCit1cCB0aGUgY29tcHJlc3NlZCBzdHJlYW0uICBJZiB3ZSBhcmUgbm90IHlldCBhdCB0aGUgZW5kIG9mIHRoZSBpbnB1dCwgdGhlbiB0aGUgPGVtPnpsaWI8L2VtPgorY29uc3RhbnQgPHR0PlpfTk9fRkxVU0g8L3R0PiB3aWxsIGJlIHBhc3NlZCB0byA8dHQ+ZGVmbGF0ZTwvdHQ+IHRvIGluZGljYXRlIHRoYXQgd2UgYXJlIHN0aWxsCitpbiB0aGUgbWlkZGxlIG9mIHRoZSB1bmNvbXByZXNzZWQgZGF0YS4KKzxwPgorSWYgdGhlcmUgaXMgYW4gZXJyb3IgaW4gcmVhZGluZyBmcm9tIHRoZSBpbnB1dCBmaWxlLCB0aGUgcHJvY2VzcyBpcyBhYm9ydGVkIHdpdGgKKzx0dD5kZWZsYXRlRW5kKCk8L3R0PiBiZWluZyBjYWxsZWQgdG8gZnJlZSB0aGUgYWxsb2NhdGVkIDxlbT56bGliPC9lbT4gc3RhdGUgYmVmb3JlIHJldHVybmluZwordGhlIGVycm9yLiAgV2Ugd291bGRuJ3Qgd2FudCBhIG1lbW9yeSBsZWFrLCBub3cgd291bGQgd2U/ICA8dHQ+ZGVmbGF0ZUVuZCgpPC90dD4gY2FuIGJlIGNhbGxlZAorYXQgYW55IHRpbWUgYWZ0ZXIgdGhlIHN0YXRlIGhhcyBiZWVuIGluaXRpYWxpemVkLiAgT25jZSB0aGF0J3MgZG9uZSwgPHR0PmRlZmxhdGVJbml0KCk8L3R0PiAob3IKKzx0dD5kZWZsYXRlSW5pdDIoKTwvdHQ+KSB3b3VsZCBoYXZlIHRvIGJlIGNhbGxlZCB0byBzdGFydCBhIG5ldyBjb21wcmVzc2lvbiBwcm9jZXNzLiAgVGhlcmUgaXMKK25vIHBvaW50IGhlcmUgaW4gY2hlY2tpbmcgdGhlIDx0dD5kZWZsYXRlRW5kKCk8L3R0PiByZXR1cm4gY29kZS4gIFRoZSBkZWFsbG9jYXRpb24gY2FuJ3QgZmFpbC4KKzxwcmU+PGI+CisgICAgICAgIHN0cm0uYXZhaWxfaW4gPSBmcmVhZChpbiwgMSwgQ0hVTkssIHNvdXJjZSk7CisgICAgICAgIGlmIChmZXJyb3Ioc291cmNlKSkgeworICAgICAgICAgICAgKHZvaWQpZGVmbGF0ZUVuZCgmYW1wO3N0cm0pOworICAgICAgICAgICAgcmV0dXJuIFpfRVJSTk87CisgICAgICAgIH0KKyAgICAgICAgZmx1c2ggPSBmZW9mKHNvdXJjZSkgPyBaX0ZJTklTSCA6IFpfTk9fRkxVU0g7CisgICAgICAgIHN0cm0ubmV4dF9pbiA9IGluOworPC9iPjwvcHJlPjwhLS0gLS0+CitUaGUgaW5uZXIgPHR0PmRvPC90dD4tbG9vcCBwYXNzZXMgb3VyIGNodW5rIG9mIGlucHV0IGRhdGEgdG8gPHR0PmRlZmxhdGUoKTwvdHQ+LCBhbmQgdGhlbgora2VlcHMgY2FsbGluZyA8dHQ+ZGVmbGF0ZSgpPC90dD4gdW50aWwgaXQgaXMgZG9uZSBwcm9kdWNpbmcgb3V0cHV0LiAgT25jZSB0aGVyZSBpcyBubyBtb3JlCituZXcgb3V0cHV0LCA8dHQ+ZGVmbGF0ZSgpPC90dD4gaXMgZ3VhcmFudGVlZCB0byBoYXZlIGNvbnN1bWVkIGFsbCBvZiB0aGUgaW5wdXQsIGkuZS4sCis8dHQ+YXZhaWxfaW48L3R0PiB3aWxsIGJlIHplcm8uCis8cHJlPjxiPgorICAgICAgICAvKiBydW4gZGVmbGF0ZSgpIG9uIGlucHV0IHVudGlsIG91dHB1dCBidWZmZXIgbm90IGZ1bGwsIGZpbmlzaAorICAgICAgICAgICBjb21wcmVzc2lvbiBpZiBhbGwgb2Ygc291cmNlIGhhcyBiZWVuIHJlYWQgaW4gKi8KKyAgICAgICAgZG8geworPC9iPjwvcHJlPgorT3V0cHV0IHNwYWNlIGlzIHByb3ZpZGVkIHRvIDx0dD5kZWZsYXRlKCk8L3R0PiBieSBzZXR0aW5nIDx0dD5hdmFpbF9vdXQ8L3R0PiB0byB0aGUgbnVtYmVyCitvZiBhdmFpbGFibGUgb3V0cHV0IGJ5dGVzIGFuZCA8dHQ+bmV4dF9vdXQ8L3R0PiB0byBhIHBvaW50ZXIgdG8gdGhhdCBzcGFjZS4KKzxwcmU+PGI+CisgICAgICAgICAgICBzdHJtLmF2YWlsX291dCA9IENIVU5LOworICAgICAgICAgICAgc3RybS5uZXh0X291dCA9IG91dDsKKzwvYj48L3ByZT4KK05vdyB3ZSBjYWxsIHRoZSBjb21wcmVzc2lvbiBlbmdpbmUgaXRzZWxmLCA8dHQ+ZGVmbGF0ZSgpPC90dD4uICBJdCB0YWtlcyBhcyBtYW55IG9mIHRoZQorPHR0PmF2YWlsX2luPC90dD4gYnl0ZXMgYXQgPHR0Pm5leHRfaW48L3R0PiBhcyBpdCBjYW4gcHJvY2VzcywgYW5kIHdyaXRlcyBhcyBtYW55IGFzCis8dHQ+YXZhaWxfb3V0PC90dD4gYnl0ZXMgdG8gPHR0Pm5leHRfb3V0PC90dD4uICBUaG9zZSBjb3VudGVycyBhbmQgcG9pbnRlcnMgYXJlIHRoZW4KK3VwZGF0ZWQgcGFzdCB0aGUgaW5wdXQgZGF0YSBjb25zdW1lZCBhbmQgdGhlIG91dHB1dCBkYXRhIHdyaXR0ZW4uICBJdCBpcyB0aGUgYW1vdW50IG9mCitvdXRwdXQgc3BhY2UgYXZhaWxhYmxlIHRoYXQgbWF5IGxpbWl0IGhvdyBtdWNoIGlucHV0IGlzIGNvbnN1bWVkLgorSGVuY2UgdGhlIGlubmVyIGxvb3AgdG8gbWFrZSBzdXJlIHRoYXQKK2FsbCBvZiB0aGUgaW5wdXQgaXMgY29uc3VtZWQgYnkgcHJvdmlkaW5nIG1vcmUgb3V0cHV0IHNwYWNlIGVhY2ggdGltZS4gIFNpbmNlIDx0dD5hdmFpbF9pbjwvdHQ+CithbmQgPHR0Pm5leHRfaW48L3R0PiBhcmUgdXBkYXRlZCBieSA8dHQ+ZGVmbGF0ZSgpPC90dD4sIHdlIGRvbid0IGhhdmUgdG8gbWVzcyB3aXRoIHRob3NlCitiZXR3ZWVuIDx0dD5kZWZsYXRlKCk8L3R0PiBjYWxscyB1bnRpbCBpdCdzIGFsbCB1c2VkIHVwLgorPHA+CitUaGUgcGFyYW1ldGVycyB0byA8dHQ+ZGVmbGF0ZSgpPC90dD4gYXJlIGEgcG9pbnRlciB0byB0aGUgPHR0PnN0cm08L3R0PiBzdHJ1Y3R1cmUgY29udGFpbmluZwordGhlIGlucHV0IGFuZCBvdXRwdXQgaW5mb3JtYXRpb24gYW5kIHRoZSBpbnRlcm5hbCBjb21wcmVzc2lvbiBlbmdpbmUgc3RhdGUsIGFuZCBhIHBhcmFtZXRlcgoraW5kaWNhdGluZyB3aGV0aGVyIGFuZCBob3cgdG8gZmx1c2ggZGF0YSB0byB0aGUgb3V0cHV0LiAgTm9ybWFsbHkgPHR0PmRlZmxhdGU8L3R0PiB3aWxsIGNvbnN1bWUKK3NldmVyYWwgSyBieXRlcyBvZiBpbnB1dCBkYXRhIGJlZm9yZSBwcm9kdWNpbmcgYW55IG91dHB1dCAoZXhjZXB0IGZvciB0aGUgaGVhZGVyKSwgaW4gb3JkZXIKK3RvIGFjY3VtdWxhdGUgc3RhdGlzdGljcyBvbiB0aGUgZGF0YSBmb3Igb3B0aW11bSBjb21wcmVzc2lvbi4gIEl0IHdpbGwgdGhlbiBwdXQgb3V0IGEgYnVyc3Qgb2YKK2NvbXByZXNzZWQgZGF0YSwgYW5kIHByb2NlZWQgdG8gY29uc3VtZSBtb3JlIGlucHV0IGJlZm9yZSB0aGUgbmV4dCBidXJzdC4gIEV2ZW50dWFsbHksCis8dHQ+ZGVmbGF0ZSgpPC90dD4KK211c3QgYmUgdG9sZCB0byB0ZXJtaW5hdGUgdGhlIHN0cmVhbSwgY29tcGxldGUgdGhlIGNvbXByZXNzaW9uIHdpdGggcHJvdmlkZWQgaW5wdXQgZGF0YSwgYW5kCit3cml0ZSBvdXQgdGhlIHRyYWlsZXIgY2hlY2sgdmFsdWUuICA8dHQ+ZGVmbGF0ZSgpPC90dD4gd2lsbCBjb250aW51ZSB0byBjb21wcmVzcyBub3JtYWxseSBhcyBsb25nCithcyB0aGUgZmx1c2ggcGFyYW1ldGVyIGlzIDx0dD5aX05PX0ZMVVNIPC90dD4uICBPbmNlIHRoZSA8dHQ+Wl9GSU5JU0g8L3R0PiBwYXJhbWV0ZXIgaXMgcHJvdmlkZWQsCis8dHQ+ZGVmbGF0ZSgpPC90dD4gd2lsbCBiZWdpbiB0byBjb21wbGV0ZSB0aGUgY29tcHJlc3NlZCBvdXRwdXQgc3RyZWFtLiAgSG93ZXZlciBkZXBlbmRpbmcgb24gaG93CittdWNoIG91dHB1dCBzcGFjZSBpcyBwcm92aWRlZCwgPHR0PmRlZmxhdGUoKTwvdHQ+IG1heSBoYXZlIHRvIGJlIGNhbGxlZCBzZXZlcmFsIHRpbWVzIHVudGlsIGl0CitoYXMgcHJvdmlkZWQgdGhlIGNvbXBsZXRlIGNvbXByZXNzZWQgc3RyZWFtLCBldmVuIGFmdGVyIGl0IGhhcyBjb25zdW1lZCBhbGwgb2YgdGhlIGlucHV0LiAgVGhlIGZsdXNoCitwYXJhbWV0ZXIgbXVzdCBjb250aW51ZSB0byBiZSA8dHQ+Wl9GSU5JU0g8L3R0PiBmb3IgdGhvc2Ugc3Vic2VxdWVudCBjYWxscy4KKzxwPgorVGhlcmUgYXJlIG90aGVyIHZhbHVlcyBvZiB0aGUgZmx1c2ggcGFyYW1ldGVyIHRoYXQgYXJlIHVzZWQgaW4gbW9yZSBhZHZhbmNlZCBhcHBsaWNhdGlvbnMuICBZb3UgY2FuCitmb3JjZSA8dHQ+ZGVmbGF0ZSgpPC90dD4gdG8gcHJvZHVjZSBhIGJ1cnN0IG9mIG91dHB1dCB0aGF0IGVuY29kZXMgYWxsIG9mIHRoZSBpbnB1dCBkYXRhIHByb3ZpZGVkCitzbyBmYXIsIGV2ZW4gaWYgaXQgd291bGRuJ3QgaGF2ZSBvdGhlcndpc2UsIGZvciBleGFtcGxlIHRvIGNvbnRyb2wgZGF0YSBsYXRlbmN5IG9uIGEgbGluayB3aXRoCitjb21wcmVzc2VkIGRhdGEuICBZb3UgY2FuIGFsc28gYXNrIHRoYXQgPHR0PmRlZmxhdGUoKTwvdHQ+IGRvIHRoYXQgYXMgd2VsbCBhcyBlcmFzZSBhbnkgaGlzdG9yeSB1cCB0bwordGhhdCBwb2ludCBzbyB0aGF0IHdoYXQgZm9sbG93cyBjYW4gYmUgZGVjb21wcmVzc2VkIGluZGVwZW5kZW50bHksIGZvciBleGFtcGxlIGZvciByYW5kb20gYWNjZXNzCithcHBsaWNhdGlvbnMuICBCb3RoIHJlcXVlc3RzIHdpbGwgZGVncmFkZSBjb21wcmVzc2lvbiBieSBhbiBhbW91bnQgZGVwZW5kaW5nIG9uIGhvdyBvZnRlbiBzdWNoCityZXF1ZXN0cyBhcmUgbWFkZS4KKzxwPgorPHR0PmRlZmxhdGUoKTwvdHQ+IGhhcyBhIHJldHVybiB2YWx1ZSB0aGF0IGNhbiBpbmRpY2F0ZSBlcnJvcnMsIHlldCB3ZSBkbyBub3QgY2hlY2sgaXQgaGVyZS4gIFdoeQorbm90PyAgV2VsbCwgaXQgdHVybnMgb3V0IHRoYXQgPHR0PmRlZmxhdGUoKTwvdHQ+IGNhbiBkbyBubyB3cm9uZyBoZXJlLiAgTGV0J3MgZ28gdGhyb3VnaAorPHR0PmRlZmxhdGUoKTwvdHQ+J3MgcmV0dXJuIHZhbHVlcyBhbmQgZGlzcGVuc2Ugd2l0aCB0aGVtIG9uZSBieSBvbmUuICBUaGUgcG9zc2libGUgdmFsdWVzIGFyZQorPHR0PlpfT0s8L3R0PiwgPHR0PlpfU1RSRUFNX0VORDwvdHQ+LCA8dHQ+Wl9TVFJFQU1fRVJST1I8L3R0Piwgb3IgPHR0PlpfQlVGX0VSUk9SPC90dD4uICA8dHQ+Wl9PSzwvdHQ+Citpcywgd2VsbCwgb2suICA8dHQ+Wl9TVFJFQU1fRU5EPC90dD4gaXMgYWxzbyBvayBhbmQgd2lsbCBiZSByZXR1cm5lZCBmb3IgdGhlIGxhc3QgY2FsbCBvZgorPHR0PmRlZmxhdGUoKTwvdHQ+LiAgVGhpcyBpcyBhbHJlYWR5IGd1YXJhbnRlZWQgYnkgY2FsbGluZyA8dHQ+ZGVmbGF0ZSgpPC90dD4gd2l0aCA8dHQ+Wl9GSU5JU0g8L3R0PgordW50aWwgaXQgaGFzIG5vIG1vcmUgb3V0cHV0LiAgPHR0PlpfU1RSRUFNX0VSUk9SPC90dD4gaXMgb25seSBwb3NzaWJsZSBpZiB0aGUgc3RyZWFtIGlzIG5vdAoraW5pdGlhbGl6ZWQgcHJvcGVybHksIGJ1dCB3ZSBkaWQgaW5pdGlhbGl6ZSBpdCBwcm9wZXJseS4gIFRoZXJlIGlzIG5vIGhhcm0gaW4gY2hlY2tpbmcgZm9yCis8dHQ+Wl9TVFJFQU1fRVJST1I8L3R0PiBoZXJlLCBmb3IgZXhhbXBsZSB0byBjaGVjayBmb3IgdGhlIHBvc3NpYmlsaXR5IHRoYXQgc29tZQorb3RoZXIgcGFydCBvZiB0aGUgYXBwbGljYXRpb24gaW5hZHZlcnRlbnRseSBjbG9iYmVyZWQgdGhlIG1lbW9yeSBjb250YWluaW5nIHRoZSA8ZW0+emxpYjwvZW0+IHN0YXRlLgorPHR0PlpfQlVGX0VSUk9SPC90dD4gd2lsbCBiZSBleHBsYWluZWQgZnVydGhlciBiZWxvdywgYnV0CitzdWZmaWNlIGl0IHRvIHNheSB0aGF0IHRoaXMgaXMgc2ltcGx5IGFuIGluZGljYXRpb24gdGhhdCA8dHQ+ZGVmbGF0ZSgpPC90dD4gY291bGQgbm90IGNvbnN1bWUKK21vcmUgaW5wdXQgb3IgcHJvZHVjZSBtb3JlIG91dHB1dC4gIDx0dD5kZWZsYXRlKCk8L3R0PiBjYW4gYmUgY2FsbGVkIGFnYWluIHdpdGggbW9yZSBvdXRwdXQgc3BhY2UKK29yIG1vcmUgYXZhaWxhYmxlIGlucHV0LCB3aGljaCBpdCB3aWxsIGJlIGluIHRoaXMgY29kZS4KKzxwcmU+PGI+CisgICAgICAgICAgICByZXQgPSBkZWZsYXRlKCZhbXA7c3RybSwgZmx1c2gpOyAgICAvKiBubyBiYWQgcmV0dXJuIHZhbHVlICovCisgICAgICAgICAgICBhc3NlcnQocmV0ICE9IFpfU1RSRUFNX0VSUk9SKTsgIC8qIHN0YXRlIG5vdCBjbG9iYmVyZWQgKi8KKzwvYj48L3ByZT4KK05vdyB3ZSBjb21wdXRlIGhvdyBtdWNoIG91dHB1dCA8dHQ+ZGVmbGF0ZSgpPC90dD4gcHJvdmlkZWQgb24gdGhlIGxhc3QgY2FsbCwgd2hpY2ggaXMgdGhlCitkaWZmZXJlbmNlIGJldHdlZW4gaG93IG11Y2ggc3BhY2Ugd2FzIHByb3ZpZGVkIGJlZm9yZSB0aGUgY2FsbCwgYW5kIGhvdyBtdWNoIG91dHB1dCBzcGFjZQoraXMgc3RpbGwgYXZhaWxhYmxlIGFmdGVyIHRoZSBjYWxsLiAgVGhlbiB0aGF0IGRhdGEsIGlmIGFueSwgaXMgd3JpdHRlbiB0byB0aGUgb3V0cHV0IGZpbGUuCitXZSBjYW4gdGhlbiByZXVzZSB0aGUgb3V0cHV0IGJ1ZmZlciBmb3IgdGhlIG5leHQgY2FsbCBvZiA8dHQ+ZGVmbGF0ZSgpPC90dD4uICBBZ2FpbiBpZiB0aGVyZQoraXMgYSBmaWxlIGkvbyBlcnJvciwgd2UgY2FsbCA8dHQ+ZGVmbGF0ZUVuZCgpPC90dD4gYmVmb3JlIHJldHVybmluZyB0byBhdm9pZCBhIG1lbW9yeSBsZWFrLgorPHByZT48Yj4KKyAgICAgICAgICAgIGhhdmUgPSBDSFVOSyAtIHN0cm0uYXZhaWxfb3V0OworICAgICAgICAgICAgaWYgKGZ3cml0ZShvdXQsIDEsIGhhdmUsIGRlc3QpICE9IGhhdmUgfHwgZmVycm9yKGRlc3QpKSB7CisgICAgICAgICAgICAgICAgKHZvaWQpZGVmbGF0ZUVuZCgmYW1wO3N0cm0pOworICAgICAgICAgICAgICAgIHJldHVybiBaX0VSUk5POworICAgICAgICAgICAgfQorPC9iPjwvcHJlPgorVGhlIGlubmVyIDx0dD5kbzwvdHQ+LWxvb3AgaXMgcmVwZWF0ZWQgdW50aWwgdGhlIGxhc3QgPHR0PmRlZmxhdGUoKTwvdHQ+IGNhbGwgZmFpbHMgdG8gZmlsbCB0aGUKK3Byb3ZpZGVkIG91dHB1dCBidWZmZXIuICBUaGVuIHdlIGtub3cgdGhhdCA8dHQ+ZGVmbGF0ZSgpPC90dD4gaGFzIGRvbmUgYXMgbXVjaCBhcyBpdCBjYW4gd2l0aAordGhlIHByb3ZpZGVkIGlucHV0LCBhbmQgdGhhdCBhbGwgb2YgdGhhdCBpbnB1dCBoYXMgYmVlbiBjb25zdW1lZC4gIFdlIGNhbiB0aGVuIGZhbGwgb3V0IG9mIHRoaXMKK2xvb3AgYW5kIHJldXNlIHRoZSBpbnB1dCBidWZmZXIuCis8cD4KK1RoZSB3YXkgd2UgdGVsbCB0aGF0IDx0dD5kZWZsYXRlKCk8L3R0PiBoYXMgbm8gbW9yZSBvdXRwdXQgaXMgYnkgc2VlaW5nIHRoYXQgaXQgZGlkIG5vdCBmaWxsCit0aGUgb3V0cHV0IGJ1ZmZlciwgbGVhdmluZyA8dHQ+YXZhaWxfb3V0PC90dD4gZ3JlYXRlciB0aGFuIHplcm8uICBIb3dldmVyIHN1cHBvc2UgdGhhdAorPHR0PmRlZmxhdGUoKTwvdHQ+IGhhcyBubyBtb3JlIG91dHB1dCwgYnV0IGp1c3Qgc28gaGFwcGVuZWQgdG8gZXhhY3RseSBmaWxsIHRoZSBvdXRwdXQgYnVmZmVyIQorPHR0PmF2YWlsX291dDwvdHQ+IGlzIHplcm8sIGFuZCB3ZSBjYW4ndCB0ZWxsIHRoYXQgPHR0PmRlZmxhdGUoKTwvdHQ+IGhhcyBkb25lIGFsbCBpdCBjYW4uCitBcyBmYXIgYXMgd2Uga25vdywgPHR0PmRlZmxhdGUoKTwvdHQ+CitoYXMgbW9yZSBvdXRwdXQgZm9yIHVzLiAgU28gd2UgY2FsbCBpdCBhZ2Fpbi4gIEJ1dCBub3cgPHR0PmRlZmxhdGUoKTwvdHQ+IHByb2R1Y2VzIG5vIG91dHB1dAorYXQgYWxsLCBhbmQgPHR0PmF2YWlsX291dDwvdHQ+IHJlbWFpbnMgdW5jaGFuZ2VkIGFzIDx0dD5DSFVOSzwvdHQ+LiAgVGhhdCA8dHQ+ZGVmbGF0ZSgpPC90dD4gY2FsbAord2Fzbid0IGFibGUgdG8gZG8gYW55dGhpbmcsIGVpdGhlciBjb25zdW1lIGlucHV0IG9yIHByb2R1Y2Ugb3V0cHV0LCBhbmQgc28gaXQgcmV0dXJucworPHR0PlpfQlVGX0VSUk9SPC90dD4uICAoU2VlLCBJIHRvbGQgeW91IEknZCBjb3ZlciB0aGlzIGxhdGVyLikgIEhvd2V2ZXIgdGhpcyBpcyBub3QgYSBwcm9ibGVtIGF0CithbGwuICBOb3cgd2UgZmluYWxseSBoYXZlIHRoZSBkZXNpcmVkIGluZGljYXRpb24gdGhhdCA8dHQ+ZGVmbGF0ZSgpPC90dD4gaXMgcmVhbGx5IGRvbmUsCithbmQgc28gd2UgZHJvcCBvdXQgb2YgdGhlIGlubmVyIGxvb3AgdG8gcHJvdmlkZSBtb3JlIGlucHV0IHRvIDx0dD5kZWZsYXRlKCk8L3R0Pi4KKzxwPgorV2l0aCA8dHQ+Zmx1c2g8L3R0PiBzZXQgdG8gPHR0PlpfRklOSVNIPC90dD4sIHRoaXMgZmluYWwgc2V0IG9mIDx0dD5kZWZsYXRlKCk8L3R0PiBjYWxscyB3aWxsCitjb21wbGV0ZSB0aGUgb3V0cHV0IHN0cmVhbS4gIE9uY2UgdGhhdCBpcyBkb25lLCBzdWJzZXF1ZW50IGNhbGxzIG9mIDx0dD5kZWZsYXRlKCk8L3R0PiB3b3VsZCByZXR1cm4KKzx0dD5aX1NUUkVBTV9FUlJPUjwvdHQ+IGlmIHRoZSBmbHVzaCBwYXJhbWV0ZXIgaXMgbm90IDx0dD5aX0ZJTklTSDwvdHQ+LCBhbmQgZG8gbm8gbW9yZSBwcm9jZXNzaW5nCit1bnRpbCB0aGUgc3RhdGUgaXMgcmVpbml0aWFsaXplZC4KKzxwPgorU29tZSBhcHBsaWNhdGlvbnMgb2YgPGVtPnpsaWI8L2VtPiBoYXZlIHR3byBsb29wcyB0aGF0IGNhbGwgPHR0PmRlZmxhdGUoKTwvdHQ+CitpbnN0ZWFkIG9mIHRoZSBzaW5nbGUgaW5uZXIgbG9vcCB3ZSBoYXZlIGhlcmUuICBUaGUgZmlyc3QgbG9vcCB3b3VsZCBjYWxsCit3aXRob3V0IGZsdXNoaW5nIGFuZCBmZWVkIGFsbCBvZiB0aGUgZGF0YSB0byA8dHQ+ZGVmbGF0ZSgpPC90dD4uICBUaGUgc2Vjb25kIGxvb3Agd291bGQgY2FsbAorPHR0PmRlZmxhdGUoKTwvdHQ+IHdpdGggbm8gbW9yZQorZGF0YSBhbmQgdGhlIDx0dD5aX0ZJTklTSDwvdHQ+IHBhcmFtZXRlciB0byBjb21wbGV0ZSB0aGUgcHJvY2Vzcy4gIEFzIHlvdSBjYW4gc2VlIGZyb20gdGhpcworZXhhbXBsZSwgdGhhdCBjYW4gYmUgYXZvaWRlZCBieSBzaW1wbHkga2VlcGluZyB0cmFjayBvZiB0aGUgY3VycmVudCBmbHVzaCBzdGF0ZS4KKzxwcmU+PGI+CisgICAgICAgIH0gd2hpbGUgKHN0cm0uYXZhaWxfb3V0ID09IDApOworICAgICAgICBhc3NlcnQoc3RybS5hdmFpbF9pbiA9PSAwKTsgICAgIC8qIGFsbCBpbnB1dCB3aWxsIGJlIHVzZWQgKi8KKzwvYj48L3ByZT48IS0tIC0tPgorTm93IHdlIGNoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIGFscmVhZHkgcHJvY2Vzc2VkIGFsbCBvZiB0aGUgaW5wdXQgZmlsZS4gIFRoYXQgaW5mb3JtYXRpb24gd2FzCitzYXZlZCBpbiB0aGUgPHR0PmZsdXNoPC90dD4gdmFyaWFibGUsIHNvIHdlIHNlZSBpZiB0aGF0IHdhcyBzZXQgdG8gPHR0PlpfRklOSVNIPC90dD4uICBJZiBzbywKK3RoZW4gd2UncmUgZG9uZSBhbmQgd2UgZmFsbCBvdXQgb2YgdGhlIG91dGVyIGxvb3AuICBXZSdyZSBndWFyYW50ZWVkIHRvIGdldCA8dHQ+Wl9TVFJFQU1fRU5EPC90dD4KK2Zyb20gdGhlIGxhc3QgPHR0PmRlZmxhdGUoKTwvdHQ+IGNhbGwsIHNpbmNlIHdlIHJhbiBpdCB1bnRpbCB0aGUgbGFzdCBjaHVuayBvZiBpbnB1dCB3YXMKK2NvbnN1bWVkIGFuZCBhbGwgb2YgdGhlIG91dHB1dCB3YXMgZ2VuZXJhdGVkLgorPHByZT48Yj4KKyAgICAgICAgLyogZG9uZSB3aGVuIGxhc3QgZGF0YSBpbiBmaWxlIHByb2Nlc3NlZCAqLworICAgIH0gd2hpbGUgKGZsdXNoICE9IFpfRklOSVNIKTsKKyAgICBhc3NlcnQocmV0ID09IFpfU1RSRUFNX0VORCk7ICAgICAgICAvKiBzdHJlYW0gd2lsbCBiZSBjb21wbGV0ZSAqLworPC9iPjwvcHJlPjwhLS0gLS0+CitUaGUgcHJvY2VzcyBpcyBjb21wbGV0ZSwgYnV0IHdlIHN0aWxsIG5lZWQgdG8gZGVhbGxvY2F0ZSB0aGUgc3RhdGUgdG8gYXZvaWQgYSBtZW1vcnkgbGVhaworKG9yIHJhdGhlciBtb3JlIGxpa2UgYSBtZW1vcnkgaGVtb3JyaGFnZSBpZiB5b3UgZGlkbid0IGRvIHRoaXMpLiAgVGhlbgorZmluYWxseSB3ZSBjYW4gcmV0dXJuIHdpdGggYSBoYXBweSByZXR1cm4gdmFsdWUuCis8cHJlPjxiPgorICAgIC8qIGNsZWFuIHVwIGFuZCByZXR1cm4gKi8KKyAgICAodm9pZClkZWZsYXRlRW5kKCZhbXA7c3RybSk7CisgICAgcmV0dXJuIFpfT0s7Cit9Cis8L2I+PC9wcmU+PCEtLSAtLT4KK05vdyB3ZSBkbyB0aGUgc2FtZSB0aGluZyBmb3IgZGVjb21wcmVzc2lvbiBpbiB0aGUgPHR0PmluZigpPC90dD4gcm91dGluZS4gPHR0PmluZigpPC90dD4KK2RlY29tcHJlc3NlcyB3aGF0IGlzIGhvcGVmdWxseSBhIHZhbGlkIDxlbT56bGliPC9lbT4gc3RyZWFtIGZyb20gdGhlIGlucHV0IGZpbGUgYW5kIHdyaXRlcyB0aGUKK3VuY29tcHJlc3NlZCBkYXRhIHRvIHRoZSBvdXRwdXQgZmlsZS4gIE11Y2ggb2YgdGhlIGRpc2N1c3Npb24gYWJvdmUgZm9yIDx0dD5kZWYoKTwvdHQ+CithcHBsaWVzIHRvIDx0dD5pbmYoKTwvdHQ+IGFzIHdlbGwsIHNvIHRoZSBkaXNjdXNzaW9uIGhlcmUgd2lsbCBmb2N1cyBvbiB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbgordGhlIHR3by4KKzxwcmU+PGI+CisvKiBEZWNvbXByZXNzIGZyb20gZmlsZSBzb3VyY2UgdG8gZmlsZSBkZXN0IHVudGlsIHN0cmVhbSBlbmRzIG9yIEVPRi4KKyAgIGluZigpIHJldHVybnMgWl9PSyBvbiBzdWNjZXNzLCBaX01FTV9FUlJPUiBpZiBtZW1vcnkgY291bGQgbm90IGJlCisgICBhbGxvY2F0ZWQgZm9yIHByb2Nlc3NpbmcsIFpfREFUQV9FUlJPUiBpZiB0aGUgZGVmbGF0ZSBkYXRhIGlzCisgICBpbnZhbGlkIG9yIGluY29tcGxldGUsIFpfVkVSU0lPTl9FUlJPUiBpZiB0aGUgdmVyc2lvbiBvZiB6bGliLmggYW5kCisgICB0aGUgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSBsaW5rZWQgZG8gbm90IG1hdGNoLCBvciBaX0VSUk5PIGlmIHRoZXJlCisgICBpcyBhbiBlcnJvciByZWFkaW5nIG9yIHdyaXRpbmcgdGhlIGZpbGVzLiAqLworaW50IGluZihGSUxFICpzb3VyY2UsIEZJTEUgKmRlc3QpCit7Cis8L2I+PC9wcmU+CitUaGUgbG9jYWwgdmFyaWFibGVzIGhhdmUgdGhlIHNhbWUgZnVuY3Rpb25hbGl0eSBhcyB0aGV5IGRvIGZvciA8dHQ+ZGVmKCk8L3R0Pi4gIFRoZQorb25seSBkaWZmZXJlbmNlIGlzIHRoYXQgdGhlcmUgaXMgbm8gPHR0PmZsdXNoPC90dD4gdmFyaWFibGUsIHNpbmNlIDx0dD5pbmZsYXRlKCk8L3R0PgorY2FuIHRlbGwgZnJvbSB0aGUgPGVtPnpsaWI8L2VtPiBzdHJlYW0gaXRzZWxmIHdoZW4gdGhlIHN0cmVhbSBpcyBjb21wbGV0ZS4KKzxwcmU+PGI+CisgICAgaW50IHJldDsKKyAgICB1bnNpZ25lZCBoYXZlOworICAgIHpfc3RyZWFtIHN0cm07CisgICAgdW5zaWduZWQgY2hhciBpbltDSFVOS107CisgICAgdW5zaWduZWQgY2hhciBvdXRbQ0hVTktdOworPC9iPjwvcHJlPjwhLS0gLS0+CitUaGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHN0YXRlIGlzIHRoZSBzYW1lLCBleGNlcHQgdGhhdCB0aGVyZSBpcyBubyBjb21wcmVzc2lvbiBsZXZlbCwKK29mIGNvdXJzZSwgYW5kIHR3byBtb3JlIGVsZW1lbnRzIG9mIHRoZSBzdHJ1Y3R1cmUgYXJlIGluaXRpYWxpemVkLiAgPHR0PmF2YWlsX2luPC90dD4KK2FuZCA8dHQ+bmV4dF9pbjwvdHQ+IG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIGNhbGxpbmcgPHR0PmluZmxhdGVJbml0KCk8L3R0Pi4gIFRoaXMKK2lzIGJlY2F1c2UgdGhlIGFwcGxpY2F0aW9uIGhhcyB0aGUgb3B0aW9uIHRvIHByb3ZpZGUgdGhlIHN0YXJ0IG9mIHRoZSB6bGliIHN0cmVhbSBpbgorb3JkZXIgZm9yIDx0dD5pbmZsYXRlSW5pdCgpPC90dD4gdG8gaGF2ZSBhY2Nlc3MgdG8gaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbXByZXNzaW9uCittZXRob2QgdG8gYWlkIGluIG1lbW9yeSBhbGxvY2F0aW9uLiAgSW4gdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gb2YgPGVtPnpsaWI8L2VtPgorKHVwIHRocm91Z2ggdmVyc2lvbnMgMS4yLngpLCB0aGUgbWV0aG9kLWRlcGVuZGVudCBtZW1vcnkgYWxsb2NhdGlvbnMgYXJlIGRlZmVycmVkIHRvIHRoZSBmaXJzdCBjYWxsIG9mCis8dHQ+aW5mbGF0ZSgpPC90dD4gYW55d2F5LiAgSG93ZXZlciB0aG9zZSBmaWVsZHMgbXVzdCBiZSBpbml0aWFsaXplZCBzaW5jZSBsYXRlciB2ZXJzaW9ucworb2YgPGVtPnpsaWI8L2VtPiB0aGF0IHByb3ZpZGUgbW9yZSBjb21wcmVzc2lvbiBtZXRob2RzIG1heSB0YWtlIGFkdmFudGFnZSBvZiB0aGlzIGludGVyZmFjZS4KK0luIGFueSBjYXNlLCBubyBkZWNvbXByZXNzaW9uIGlzIHBlcmZvcm1lZCBieSA8dHQ+aW5mbGF0ZUluaXQoKTwvdHQ+LCBzbyB0aGUKKzx0dD5hdmFpbF9vdXQ8L3R0PiBhbmQgPHR0Pm5leHRfb3V0PC90dD4gZmllbGRzIGRvIG5vdCBuZWVkIHRvIGJlIGluaXRpYWxpemVkIGJlZm9yZSBjYWxsaW5nLgorPHA+CitIZXJlIDx0dD5hdmFpbF9pbjwvdHQ+IGlzIHNldCB0byB6ZXJvIGFuZCA8dHQ+bmV4dF9pbjwvdHQ+IGlzIHNldCB0byA8dHQ+Wl9OVUxMPC90dD4gdG8KK2luZGljYXRlIHRoYXQgbm8gaW5wdXQgZGF0YSBpcyBiZWluZyBwcm92aWRlZC4KKzxwcmU+PGI+CisgICAgLyogYWxsb2NhdGUgaW5mbGF0ZSBzdGF0ZSAqLworICAgIHN0cm0uemFsbG9jID0gWl9OVUxMOworICAgIHN0cm0uemZyZWUgPSBaX05VTEw7CisgICAgc3RybS5vcGFxdWUgPSBaX05VTEw7CisgICAgc3RybS5hdmFpbF9pbiA9IDA7CisgICAgc3RybS5uZXh0X2luID0gWl9OVUxMOworICAgIHJldCA9IGluZmxhdGVJbml0KCZhbXA7c3RybSk7CisgICAgaWYgKHJldCAhPSBaX09LKQorICAgICAgICByZXR1cm4gcmV0OworPC9iPjwvcHJlPjwhLS0gLS0+CitUaGUgb3V0ZXIgPHR0PmRvPC90dD4tbG9vcCBkZWNvbXByZXNzZXMgaW5wdXQgdW50aWwgPHR0PmluZmxhdGUoKTwvdHQ+IGluZGljYXRlcwordGhhdCBpdCBoYXMgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBjb21wcmVzc2VkIGRhdGEgYW5kIGhhcyBwcm9kdWNlZCBhbGwgb2YgdGhlIHVuY29tcHJlc3NlZAorb3V0cHV0LiAgVGhpcyBpcyBpbiBjb250cmFzdCB0byA8dHQ+ZGVmKCk8L3R0PiB3aGljaCBwcm9jZXNzZXMgYWxsIG9mIHRoZSBpbnB1dCBmaWxlLgorSWYgZW5kLW9mLWZpbGUgaXMgcmVhY2hlZCBiZWZvcmUgdGhlIGNvbXByZXNzZWQgZGF0YSBzZWxmLXRlcm1pbmF0ZXMsIHRoZW4gdGhlIGNvbXByZXNzZWQKK2RhdGEgaXMgaW5jb21wbGV0ZSBhbmQgYW4gZXJyb3IgaXMgcmV0dXJuZWQuCis8cHJlPjxiPgorICAgIC8qIGRlY29tcHJlc3MgdW50aWwgZGVmbGF0ZSBzdHJlYW0gZW5kcyBvciBlbmQgb2YgZmlsZSAqLworICAgIGRvIHsKKzwvYj48L3ByZT4KK1dlIHJlYWQgaW5wdXQgZGF0YSBhbmQgc2V0IHRoZSA8dHQ+c3RybTwvdHQ+IHN0cnVjdHVyZSBhY2NvcmRpbmdseS4gIElmIHdlJ3ZlIHJlYWNoZWQgdGhlCitlbmQgb2YgdGhlIGlucHV0IGZpbGUsIHRoZW4gd2UgbGVhdmUgdGhlIG91dGVyIGxvb3AgYW5kIHJlcG9ydCBhbiBlcnJvciwgc2luY2UgdGhlCitjb21wcmVzc2VkIGRhdGEgaXMgaW5jb21wbGV0ZS4gIE5vdGUgdGhhdCB3ZSBtYXkgcmVhZCBtb3JlIGRhdGEgdGhhbiBpcyBldmVudHVhbGx5IGNvbnN1bWVkCitieSA8dHQ+aW5mbGF0ZSgpPC90dD4sIGlmIHRoZSBpbnB1dCBmaWxlIGNvbnRpbnVlcyBwYXN0IHRoZSA8ZW0+emxpYjwvZW0+IHN0cmVhbS4KK0ZvciBhcHBsaWNhdGlvbnMgd2hlcmUgPGVtPnpsaWI8L2VtPiBzdHJlYW1zIGFyZSBlbWJlZGRlZCBpbiBvdGhlciBkYXRhLCB0aGlzIHJvdXRpbmUgd291bGQKK25lZWQgdG8gYmUgbW9kaWZpZWQgdG8gcmV0dXJuIHRoZSB1bnVzZWQgZGF0YSwgb3IgYXQgbGVhc3QgaW5kaWNhdGUgaG93IG11Y2ggb2YgdGhlIGlucHV0CitkYXRhIHdhcyBub3QgdXNlZCwgc28gdGhlIGFwcGxpY2F0aW9uIHdvdWxkIGtub3cgd2hlcmUgdG8gcGljayB1cCBhZnRlciB0aGUgPGVtPnpsaWI8L2VtPiBzdHJlYW0uCis8cHJlPjxiPgorICAgICAgICBzdHJtLmF2YWlsX2luID0gZnJlYWQoaW4sIDEsIENIVU5LLCBzb3VyY2UpOworICAgICAgICBpZiAoZmVycm9yKHNvdXJjZSkpIHsKKyAgICAgICAgICAgICh2b2lkKWluZmxhdGVFbmQoJmFtcDtzdHJtKTsKKyAgICAgICAgICAgIHJldHVybiBaX0VSUk5POworICAgICAgICB9CisgICAgICAgIGlmIChzdHJtLmF2YWlsX2luID09IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgc3RybS5uZXh0X2luID0gaW47Cis8L2I+PC9wcmU+PCEtLSAtLT4KK1RoZSBpbm5lciA8dHQ+ZG88L3R0Pi1sb29wIGhhcyB0aGUgc2FtZSBmdW5jdGlvbiBpdCBkaWQgaW4gPHR0PmRlZigpPC90dD4sIHdoaWNoIGlzIHRvCitrZWVwIGNhbGxpbmcgPHR0PmluZmxhdGUoKTwvdHQ+IHVudGlsIGhhcyBnZW5lcmF0ZWQgYWxsIG9mIHRoZSBvdXRwdXQgaXQgY2FuIHdpdGggdGhlCitwcm92aWRlZCBpbnB1dC4KKzxwcmU+PGI+CisgICAgICAgIC8qIHJ1biBpbmZsYXRlKCkgb24gaW5wdXQgdW50aWwgb3V0cHV0IGJ1ZmZlciBub3QgZnVsbCAqLworICAgICAgICBkbyB7Cis8L2I+PC9wcmU+CitKdXN0IGxpa2UgaW4gPHR0PmRlZigpPC90dD4sIHRoZSBzYW1lIG91dHB1dCBzcGFjZSBpcyBwcm92aWRlZCBmb3IgZWFjaCBjYWxsIG9mIDx0dD5pbmZsYXRlKCk8L3R0Pi4KKzxwcmU+PGI+CisgICAgICAgICAgICBzdHJtLmF2YWlsX291dCA9IENIVU5LOworICAgICAgICAgICAgc3RybS5uZXh0X291dCA9IG91dDsKKzwvYj48L3ByZT4KK05vdyB3ZSBydW4gdGhlIGRlY29tcHJlc3Npb24gZW5naW5lIGl0c2VsZi4gIFRoZXJlIGlzIG5vIG5lZWQgdG8gYWRqdXN0IHRoZSBmbHVzaCBwYXJhbWV0ZXIsIHNpbmNlCit0aGUgPGVtPnpsaWI8L2VtPiBmb3JtYXQgaXMgc2VsZi10ZXJtaW5hdGluZy4gVGhlIG1haW4gZGlmZmVyZW5jZSBoZXJlIGlzIHRoYXQgdGhlcmUgYXJlCityZXR1cm4gdmFsdWVzIHRoYXQgd2UgbmVlZCB0byBwYXkgYXR0ZW50aW9uIHRvLiAgPHR0PlpfREFUQV9FUlJPUjwvdHQ+CitpbmRpY2F0ZXMgdGhhdCA8dHQ+aW5mbGF0ZSgpPC90dD4gZGV0ZWN0ZWQgYW4gZXJyb3IgaW4gdGhlIDxlbT56bGliPC9lbT4gY29tcHJlc3NlZCBkYXRhIGZvcm1hdCwKK3doaWNoIG1lYW5zIHRoYXQgZWl0aGVyIHRoZSBkYXRhIGlzIG5vdCBhIDxlbT56bGliPC9lbT4gc3RyZWFtIHRvIGJlZ2luIHdpdGgsIG9yIHRoYXQgdGhlIGRhdGEgd2FzCitjb3JydXB0ZWQgc29tZXdoZXJlIGFsb25nIHRoZSB3YXkgc2luY2UgaXQgd2FzIGNvbXByZXNzZWQuICBUaGUgb3RoZXIgZXJyb3IgdG8gYmUgcHJvY2Vzc2VkIGlzCis8dHQ+Wl9NRU1fRVJST1I8L3R0Piwgd2hpY2ggY2FuIG9jY3VyIHNpbmNlIG1lbW9yeSBhbGxvY2F0aW9uIGlzIGRlZmVycmVkIHVudGlsIDx0dD5pbmZsYXRlKCk8L3R0PgorbmVlZHMgaXQsIHVubGlrZSA8dHQ+ZGVmbGF0ZSgpPC90dD4sIHdob3NlIG1lbW9yeSBpcyBhbGxvY2F0ZWQgYXQgdGhlIHN0YXJ0IGJ5IDx0dD5kZWZsYXRlSW5pdCgpPC90dD4uCis8cD4KK0FkdmFuY2VkIGFwcGxpY2F0aW9ucyBtYXkgdXNlCis8dHQ+ZGVmbGF0ZVNldERpY3Rpb25hcnkoKTwvdHQ+IHRvIHByaW1lIDx0dD5kZWZsYXRlKCk8L3R0PiB3aXRoIGEgc2V0IG9mIGxpa2VseSBkYXRhIHRvIGltcHJvdmUgdGhlCitmaXJzdCAzMksgb3Igc28gb2YgY29tcHJlc3Npb24uICBUaGlzIGlzIG5vdGVkIGluIHRoZSA8ZW0+emxpYjwvZW0+IGhlYWRlciwgc28gPHR0PmluZmxhdGUoKTwvdHQ+CityZXF1ZXN0cyB0aGF0IHRoYXQgZGljdGlvbmFyeSBiZSBwcm92aWRlZCBiZWZvcmUgaXQgY2FuIHN0YXJ0IHRvIGRlY29tcHJlc3MuICBXaXRob3V0IHRoZSBkaWN0aW9uYXJ5LAorY29ycmVjdCBkZWNvbXByZXNzaW9uIGlzIG5vdCBwb3NzaWJsZS4gIEZvciB0aGlzIHJvdXRpbmUsIHdlIGhhdmUgbm8gaWRlYSB3aGF0IHRoZSBkaWN0aW9uYXJ5IGlzLAorc28gdGhlIDx0dD5aX05FRURfRElDVDwvdHQ+IGluZGljYXRpb24gaXMgY29udmVydGVkIHRvIGEgPHR0PlpfREFUQV9FUlJPUjwvdHQ+LgorPHA+Cis8dHQ+aW5mbGF0ZSgpPC90dD4gY2FuIGFsc28gcmV0dXJuIDx0dD5aX1NUUkVBTV9FUlJPUjwvdHQ+LCB3aGljaCBzaG91bGQgbm90IGJlIHBvc3NpYmxlIGhlcmUsCitidXQgY291bGQgYmUgY2hlY2tlZCBmb3IgYXMgbm90ZWQgYWJvdmUgZm9yIDx0dD5kZWYoKTwvdHQ+LiAgPHR0PlpfQlVGX0VSUk9SPC90dD4gZG9lcyBub3QgbmVlZCB0byBiZQorY2hlY2tlZCBmb3IgaGVyZSwgZm9yIHRoZSBzYW1lIHJlYXNvbnMgbm90ZWQgZm9yIDx0dD5kZWYoKTwvdHQ+LiAgPHR0PlpfU1RSRUFNX0VORDwvdHQ+IHdpbGwgYmUKK2NoZWNrZWQgZm9yIGxhdGVyLgorPHByZT48Yj4KKyAgICAgICAgICAgIHJldCA9IGluZmxhdGUoJmFtcDtzdHJtLCBaX05PX0ZMVVNIKTsKKyAgICAgICAgICAgIGFzc2VydChyZXQgIT0gWl9TVFJFQU1fRVJST1IpOyAgLyogc3RhdGUgbm90IGNsb2JiZXJlZCAqLworICAgICAgICAgICAgc3dpdGNoIChyZXQpIHsKKyAgICAgICAgICAgIGNhc2UgWl9ORUVEX0RJQ1Q6CisgICAgICAgICAgICAgICAgcmV0ID0gWl9EQVRBX0VSUk9SOyAgICAgLyogYW5kIGZhbGwgdGhyb3VnaCAqLworICAgICAgICAgICAgY2FzZSBaX0RBVEFfRVJST1I6CisgICAgICAgICAgICBjYXNlIFpfTUVNX0VSUk9SOgorICAgICAgICAgICAgICAgICh2b2lkKWluZmxhdGVFbmQoJmFtcDtzdHJtKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgfQorPC9iPjwvcHJlPgorVGhlIG91dHB1dCBvZiA8dHQ+aW5mbGF0ZSgpPC90dD4gaXMgaGFuZGxlZCBpZGVudGljYWxseSB0byB0aGF0IG9mIDx0dD5kZWZsYXRlKCk8L3R0Pi4KKzxwcmU+PGI+CisgICAgICAgICAgICBoYXZlID0gQ0hVTksgLSBzdHJtLmF2YWlsX291dDsKKyAgICAgICAgICAgIGlmIChmd3JpdGUob3V0LCAxLCBoYXZlLCBkZXN0KSAhPSBoYXZlIHx8IGZlcnJvcihkZXN0KSkgeworICAgICAgICAgICAgICAgICh2b2lkKWluZmxhdGVFbmQoJmFtcDtzdHJtKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gWl9FUlJOTzsKKyAgICAgICAgICAgIH0KKzwvYj48L3ByZT4KK1RoZSBpbm5lciA8dHQ+ZG88L3R0Pi1sb29wIGVuZHMgd2hlbiA8dHQ+aW5mbGF0ZSgpPC90dD4gaGFzIG5vIG1vcmUgb3V0cHV0IGFzIGluZGljYXRlZAorYnkgbm90IGZpbGxpbmcgdGhlIG91dHB1dCBidWZmZXIsIGp1c3QgYXMgZm9yIDx0dD5kZWZsYXRlKCk8L3R0Pi4gIEluIHRoaXMgY2FzZSwgd2UgY2Fubm90Cithc3NlcnQgdGhhdCA8dHQ+c3RybS5hdmFpbF9pbjwvdHQ+IHdpbGwgYmUgemVybywgc2luY2UgdGhlIGRlZmxhdGUgc3RyZWFtIG1heSBlbmQgYmVmb3JlIHRoZSBmaWxlCitkb2VzLgorPHByZT48Yj4KKyAgICAgICAgfSB3aGlsZSAoc3RybS5hdmFpbF9vdXQgPT0gMCk7Cis8L2I+PC9wcmU+PCEtLSAtLT4KK1RoZSBvdXRlciA8dHQ+ZG88L3R0Pi1sb29wIGVuZHMgd2hlbiA8dHQ+aW5mbGF0ZSgpPC90dD4gcmVwb3J0cyB0aGF0IGl0IGhhcyByZWFjaGVkIHRoZQorZW5kIG9mIHRoZSBpbnB1dCA8ZW0+emxpYjwvZW0+IHN0cmVhbSwgaGFzIGNvbXBsZXRlZCB0aGUgZGVjb21wcmVzc2lvbiBhbmQgaW50ZWdyaXR5CitjaGVjaywgYW5kIGhhcyBwcm92aWRlZCBhbGwgb2YgdGhlIG91dHB1dC4gIFRoaXMgaXMgaW5kaWNhdGVkIGJ5IHRoZSA8dHQ+aW5mbGF0ZSgpPC90dD4KK3JldHVybiB2YWx1ZSA8dHQ+Wl9TVFJFQU1fRU5EPC90dD4uICBUaGUgaW5uZXIgbG9vcCBpcyBndWFyYW50ZWVkIHRvIGxlYXZlIDx0dD5yZXQ8L3R0PgorZXF1YWwgdG8gPHR0PlpfU1RSRUFNX0VORDwvdHQ+IGlmIHRoZSBsYXN0IGNodW5rIG9mIHRoZSBpbnB1dCBmaWxlIHJlYWQgY29udGFpbmVkIHRoZSBlbmQKK29mIHRoZSA8ZW0+emxpYjwvZW0+IHN0cmVhbS4gIFNvIGlmIHRoZSByZXR1cm4gdmFsdWUgaXMgbm90IDx0dD5aX1NUUkVBTV9FTkQ8L3R0PiwgdGhlCitsb29wIGNvbnRpbnVlcyB0byByZWFkIG1vcmUgaW5wdXQuCis8cHJlPjxiPgorICAgICAgICAvKiBkb25lIHdoZW4gaW5mbGF0ZSgpIHNheXMgaXQncyBkb25lICovCisgICAgfSB3aGlsZSAocmV0ICE9IFpfU1RSRUFNX0VORCk7Cis8L2I+PC9wcmU+PCEtLSAtLT4KK0F0IHRoaXMgcG9pbnQsIGRlY29tcHJlc3Npb24gc3VjY2Vzc2Z1bGx5IGNvbXBsZXRlZCwgb3Igd2UgYnJva2Ugb3V0IG9mIHRoZSBsb29wIGR1ZSB0byBubworbW9yZSBkYXRhIGJlaW5nIGF2YWlsYWJsZSBmcm9tIHRoZSBpbnB1dCBmaWxlLiAgSWYgdGhlIGxhc3QgPHR0PmluZmxhdGUoKTwvdHQ+IHJldHVybiB2YWx1ZQoraXMgbm90IDx0dD5aX1NUUkVBTV9FTkQ8L3R0PiwgdGhlbiB0aGUgPGVtPnpsaWI8L2VtPiBzdHJlYW0gd2FzIGluY29tcGxldGUgYW5kIGEgZGF0YSBlcnJvcgoraXMgcmV0dXJuZWQuICBPdGhlcndpc2UsIHdlIHJldHVybiB3aXRoIGEgaGFwcHkgcmV0dXJuIHZhbHVlLiAgT2YgY291cnNlLCA8dHQ+aW5mbGF0ZUVuZCgpPC90dD4KK2lzIGNhbGxlZCBmaXJzdCB0byBhdm9pZCBhIG1lbW9yeSBsZWFrLgorPHByZT48Yj4KKyAgICAvKiBjbGVhbiB1cCBhbmQgcmV0dXJuICovCisgICAgKHZvaWQpaW5mbGF0ZUVuZCgmYW1wO3N0cm0pOworICAgIHJldHVybiByZXQgPT0gWl9TVFJFQU1fRU5EID8gWl9PSyA6IFpfREFUQV9FUlJPUjsKK30KKzwvYj48L3ByZT48IS0tIC0tPgorVGhhdCBlbmRzIHRoZSByb3V0aW5lcyB0aGF0IGRpcmVjdGx5IHVzZSA8ZW0+emxpYjwvZW0+LiAgVGhlIGZvbGxvd2luZyByb3V0aW5lcyBtYWtlIHRoaXMKK2EgY29tbWFuZC1saW5lIHByb2dyYW0gYnkgcnVubmluZyBkYXRhIHRocm91Z2ggdGhlIGFib3ZlIHJvdXRpbmVzIGZyb20gPHR0PnN0ZGluPC90dD4gdG8KKzx0dD5zdGRvdXQ8L3R0PiwgYW5kIGhhbmRsaW5nIGFueSBlcnJvcnMgcmVwb3J0ZWQgYnkgPHR0PmRlZigpPC90dD4gb3IgPHR0PmluZigpPC90dD4uCis8cD4KKzx0dD56ZXJyKCk8L3R0PiBpcyB1c2VkIHRvIGludGVycHJldCB0aGUgcG9zc2libGUgZXJyb3IgY29kZXMgZnJvbSA8dHQ+ZGVmKCk8L3R0PgorYW5kIDx0dD5pbmYoKTwvdHQ+LCBhcyBkZXRhaWxlZCBpbiB0aGVpciBjb21tZW50cyBhYm92ZSwgYW5kIHByaW50IG91dCBhbiBlcnJvciBtZXNzYWdlLgorTm90ZSB0aGF0IHRoZXNlIGFyZSBvbmx5IGEgc3Vic2V0IG9mIHRoZSBwb3NzaWJsZSByZXR1cm4gdmFsdWVzIGZyb20gPHR0PmRlZmxhdGUoKTwvdHQ+CithbmQgPHR0PmluZmxhdGUoKTwvdHQ+LgorPHByZT48Yj4KKy8qIHJlcG9ydCBhIHpsaWIgb3IgaS9vIGVycm9yICovCit2b2lkIHplcnIoaW50IHJldCkKK3sKKyAgICBmcHV0cygienBpcGU6ICIsIHN0ZGVycik7CisgICAgc3dpdGNoIChyZXQpIHsKKyAgICBjYXNlIFpfRVJSTk86CisgICAgICAgIGlmIChmZXJyb3Ioc3RkaW4pKQorICAgICAgICAgICAgZnB1dHMoImVycm9yIHJlYWRpbmcgc3RkaW5cbiIsIHN0ZGVycik7CisgICAgICAgIGlmIChmZXJyb3Ioc3Rkb3V0KSkKKyAgICAgICAgICAgIGZwdXRzKCJlcnJvciB3cml0aW5nIHN0ZG91dFxuIiwgc3RkZXJyKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBaX1NUUkVBTV9FUlJPUjoKKyAgICAgICAgZnB1dHMoImludmFsaWQgY29tcHJlc3Npb24gbGV2ZWxcbiIsIHN0ZGVycik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgWl9EQVRBX0VSUk9SOgorICAgICAgICBmcHV0cygiaW52YWxpZCBvciBpbmNvbXBsZXRlIGRlZmxhdGUgZGF0YVxuIiwgc3RkZXJyKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBaX01FTV9FUlJPUjoKKyAgICAgICAgZnB1dHMoIm91dCBvZiBtZW1vcnlcbiIsIHN0ZGVycik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgWl9WRVJTSU9OX0VSUk9SOgorICAgICAgICBmcHV0cygiemxpYiB2ZXJzaW9uIG1pc21hdGNoIVxuIiwgc3RkZXJyKTsKKyAgICB9Cit9Cis8L2I+PC9wcmU+PCEtLSAtLT4KK0hlcmUgaXMgdGhlIDx0dD5tYWluKCk8L3R0PiByb3V0aW5lIHVzZWQgdG8gdGVzdCA8dHQ+ZGVmKCk8L3R0PiBhbmQgPHR0PmluZigpPC90dD4uICBUaGUKKzx0dD56cGlwZTwvdHQ+IGNvbW1hbmQgaXMgc2ltcGx5IGEgY29tcHJlc3Npb24gcGlwZSBmcm9tIDx0dD5zdGRpbjwvdHQ+IHRvIDx0dD5zdGRvdXQ8L3R0PiwgaWYKK25vIGFyZ3VtZW50cyBhcmUgZ2l2ZW4sIG9yIGl0IGlzIGEgZGVjb21wcmVzc2lvbiBwaXBlIGlmIDx0dD56cGlwZSAtZDwvdHQ+IGlzIHVzZWQuICBJZiBhbnkgb3RoZXIKK2FyZ3VtZW50cyBhcmUgcHJvdmlkZWQsIG5vIGNvbXByZXNzaW9uIG9yIGRlY29tcHJlc3Npb24gaXMgcGVyZm9ybWVkLiAgSW5zdGVhZCBhIHVzYWdlCittZXNzYWdlIGlzIGRpc3BsYXllZC4gIEV4YW1wbGVzIGFyZSA8dHQ+enBpcGUgPCBmb28udHh0ID4gZm9vLnR4dC56PC90dD4gdG8gY29tcHJlc3MsIGFuZAorPHR0PnpwaXBlIC1kIDwgZm9vLnR4dC56ID4gZm9vLnR4dDwvdHQ+IHRvIGRlY29tcHJlc3MuCis8cHJlPjxiPgorLyogY29tcHJlc3Mgb3IgZGVjb21wcmVzcyBmcm9tIHN0ZGluIHRvIHN0ZG91dCAqLworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICAgIGludCByZXQ7CisKKyAgICAvKiBhdm9pZCBlbmQtb2YtbGluZSBjb252ZXJzaW9ucyAqLworICAgIFNFVF9CSU5BUllfTU9ERShzdGRpbik7CisgICAgU0VUX0JJTkFSWV9NT0RFKHN0ZG91dCk7CisKKyAgICAvKiBkbyBjb21wcmVzc2lvbiBpZiBubyBhcmd1bWVudHMgKi8KKyAgICBpZiAoYXJnYyA9PSAxKSB7CisgICAgICAgIHJldCA9IGRlZihzdGRpbiwgc3Rkb3V0LCBaX0RFRkFVTFRfQ09NUFJFU1NJT04pOworICAgICAgICBpZiAocmV0ICE9IFpfT0spCisgICAgICAgICAgICB6ZXJyKHJldCk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgLyogZG8gZGVjb21wcmVzc2lvbiBpZiAtZCBzcGVjaWZpZWQgKi8KKyAgICBlbHNlIGlmIChhcmdjID09IDIgJmFtcDsmYW1wOyBzdHJjbXAoYXJndlsxXSwgIi1kIikgPT0gMCkgeworICAgICAgICByZXQgPSBpbmYoc3RkaW4sIHN0ZG91dCk7CisgICAgICAgIGlmIChyZXQgIT0gWl9PSykKKyAgICAgICAgICAgIHplcnIocmV0KTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICAvKiBvdGhlcndpc2UsIHJlcG9ydCB1c2FnZSAqLworICAgIGVsc2UgeworICAgICAgICBmcHV0cygienBpcGUgdXNhZ2U6IHpwaXBlIFstZF0gJmx0OyBzb3VyY2UgJmd0OyBkZXN0XG4iLCBzdGRlcnIpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9Cit9Cis8L2I+PC9wcmU+Cis8aHI+Cis8aT5Db3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgYnkgTWFyayBBZGxlcjxicj5MYXN0IG1vZGlmaWVkIDExIERlY2VtYmVyIDIwMDU8L2k+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS96bGliLTEuMi42L2V4YW1wbGVzL3pwaXBlLmMgYi96bGliLTEuMi42L2V4YW1wbGVzL3pwaXBlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM1MzVkMQotLS0gL2Rldi9udWxsCisrKyBiL3psaWItMS4yLjYvZXhhbXBsZXMvenBpcGUuYwpAQCAtMCwwICsxLDIwNSBAQAorLyogenBpcGUuYzogZXhhbXBsZSBvZiBwcm9wZXIgdXNlIG9mIHpsaWIncyBpbmZsYXRlKCkgYW5kIGRlZmxhdGUoKQorICAgTm90IGNvcHlyaWdodGVkIC0tIHByb3ZpZGVkIHRvIHRoZSBwdWJsaWMgZG9tYWluCisgICBWZXJzaW9uIDEuNCAgMTEgRGVjZW1iZXIgMjAwNSAgTWFyayBBZGxlciAqLworCisvKiBWZXJzaW9uIGhpc3Rvcnk6CisgICAxLjAgIDMwIE9jdCAyMDA0ICBGaXJzdCB2ZXJzaW9uCisgICAxLjEgICA4IE5vdiAyMDA0ICBBZGQgdm9pZCBjYXN0aW5nIGZvciB1bnVzZWQgcmV0dXJuIHZhbHVlcworICAgICAgICAgICAgICAgICAgICAgVXNlIHN3aXRjaCBzdGF0ZW1lbnQgZm9yIGluZmxhdGUoKSByZXR1cm4gdmFsdWVzCisgICAxLjIgICA5IE5vdiAyMDA0ICBBZGQgYXNzZXJ0aW9ucyB0byBkb2N1bWVudCB6bGliIGd1YXJhbnRlZXMKKyAgIDEuMyAgIDYgQXByIDIwMDUgIFJlbW92ZSBpbmNvcnJlY3QgYXNzZXJ0aW9uIGluIGluZigpCisgICAxLjQgIDExIERlYyAyMDA1ICBBZGQgaGFjayB0byBhdm9pZCBNU0RPUyBlbmQtb2YtbGluZSBjb252ZXJzaW9ucworICAgICAgICAgICAgICAgICAgICAgQXZvaWQgc29tZSBjb21waWxlciB3YXJuaW5ncyBmb3IgaW5wdXQgYW5kIG91dHB1dCBidWZmZXJzCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSAiemxpYi5oIgorCisjaWYgZGVmaW5lZChNU0RPUykgfHwgZGVmaW5lZChPUzIpIHx8IGRlZmluZWQoV0lOMzIpIHx8IGRlZmluZWQoX19DWUdXSU5fXykKKyMgIGluY2x1ZGUgPGZjbnRsLmg+CisjICBpbmNsdWRlIDxpby5oPgorIyAgZGVmaW5lIFNFVF9CSU5BUllfTU9ERShmaWxlKSBzZXRtb2RlKGZpbGVubyhmaWxlKSwgT19CSU5BUlkpCisjZWxzZQorIyAgZGVmaW5lIFNFVF9CSU5BUllfTU9ERShmaWxlKQorI2VuZGlmCisKKyNkZWZpbmUgQ0hVTksgMTYzODQKKworLyogQ29tcHJlc3MgZnJvbSBmaWxlIHNvdXJjZSB0byBmaWxlIGRlc3QgdW50aWwgRU9GIG9uIHNvdXJjZS4KKyAgIGRlZigpIHJldHVybnMgWl9PSyBvbiBzdWNjZXNzLCBaX01FTV9FUlJPUiBpZiBtZW1vcnkgY291bGQgbm90IGJlCisgICBhbGxvY2F0ZWQgZm9yIHByb2Nlc3NpbmcsIFpfU1RSRUFNX0VSUk9SIGlmIGFuIGludmFsaWQgY29tcHJlc3Npb24KKyAgIGxldmVsIGlzIHN1cHBsaWVkLCBaX1ZFUlNJT05fRVJST1IgaWYgdGhlIHZlcnNpb24gb2YgemxpYi5oIGFuZCB0aGUKKyAgIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkgbGlua2VkIGRvIG5vdCBtYXRjaCwgb3IgWl9FUlJOTyBpZiB0aGVyZSBpcworICAgYW4gZXJyb3IgcmVhZGluZyBvciB3cml0aW5nIHRoZSBmaWxlcy4gKi8KK2ludCBkZWYoRklMRSAqc291cmNlLCBGSUxFICpkZXN0LCBpbnQgbGV2ZWwpCit7CisgICAgaW50IHJldCwgZmx1c2g7CisgICAgdW5zaWduZWQgaGF2ZTsKKyAgICB6X3N0cmVhbSBzdHJtOworICAgIHVuc2lnbmVkIGNoYXIgaW5bQ0hVTktdOworICAgIHVuc2lnbmVkIGNoYXIgb3V0W0NIVU5LXTsKKworICAgIC8qIGFsbG9jYXRlIGRlZmxhdGUgc3RhdGUgKi8KKyAgICBzdHJtLnphbGxvYyA9IFpfTlVMTDsKKyAgICBzdHJtLnpmcmVlID0gWl9OVUxMOworICAgIHN0cm0ub3BhcXVlID0gWl9OVUxMOworICAgIHJldCA9IGRlZmxhdGVJbml0KCZzdHJtLCBsZXZlbCk7CisgICAgaWYgKHJldCAhPSBaX09LKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgLyogY29tcHJlc3MgdW50aWwgZW5kIG9mIGZpbGUgKi8KKyAgICBkbyB7CisgICAgICAgIHN0cm0uYXZhaWxfaW4gPSBmcmVhZChpbiwgMSwgQ0hVTkssIHNvdXJjZSk7CisgICAgICAgIGlmIChmZXJyb3Ioc291cmNlKSkgeworICAgICAgICAgICAgKHZvaWQpZGVmbGF0ZUVuZCgmc3RybSk7CisgICAgICAgICAgICByZXR1cm4gWl9FUlJOTzsKKyAgICAgICAgfQorICAgICAgICBmbHVzaCA9IGZlb2Yoc291cmNlKSA/IFpfRklOSVNIIDogWl9OT19GTFVTSDsKKyAgICAgICAgc3RybS5uZXh0X2luID0gaW47CisKKyAgICAgICAgLyogcnVuIGRlZmxhdGUoKSBvbiBpbnB1dCB1bnRpbCBvdXRwdXQgYnVmZmVyIG5vdCBmdWxsLCBmaW5pc2gKKyAgICAgICAgICAgY29tcHJlc3Npb24gaWYgYWxsIG9mIHNvdXJjZSBoYXMgYmVlbiByZWFkIGluICovCisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHN0cm0uYXZhaWxfb3V0ID0gQ0hVTks7CisgICAgICAgICAgICBzdHJtLm5leHRfb3V0ID0gb3V0OworICAgICAgICAgICAgcmV0ID0gZGVmbGF0ZSgmc3RybSwgZmx1c2gpOyAgICAvKiBubyBiYWQgcmV0dXJuIHZhbHVlICovCisgICAgICAgICAgICBhc3NlcnQocmV0ICE9IFpfU1RSRUFNX0VSUk9SKTsgIC8qIHN0YXRlIG5vdCBjbG9iYmVyZWQgKi8KKyAgICAgICAgICAgIGhhdmUgPSBDSFVOSyAtIHN0cm0uYXZhaWxfb3V0OworICAgICAgICAgICAgaWYgKGZ3cml0ZShvdXQsIDEsIGhhdmUsIGRlc3QpICE9IGhhdmUgfHwgZmVycm9yKGRlc3QpKSB7CisgICAgICAgICAgICAgICAgKHZvaWQpZGVmbGF0ZUVuZCgmc3RybSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFpfRVJSTk87CisgICAgICAgICAgICB9CisgICAgICAgIH0gd2hpbGUgKHN0cm0uYXZhaWxfb3V0ID09IDApOworICAgICAgICBhc3NlcnQoc3RybS5hdmFpbF9pbiA9PSAwKTsgICAgIC8qIGFsbCBpbnB1dCB3aWxsIGJlIHVzZWQgKi8KKworICAgICAgICAvKiBkb25lIHdoZW4gbGFzdCBkYXRhIGluIGZpbGUgcHJvY2Vzc2VkICovCisgICAgfSB3aGlsZSAoZmx1c2ggIT0gWl9GSU5JU0gpOworICAgIGFzc2VydChyZXQgPT0gWl9TVFJFQU1fRU5EKTsgICAgICAgIC8qIHN0cmVhbSB3aWxsIGJlIGNvbXBsZXRlICovCisKKyAgICAvKiBjbGVhbiB1cCBhbmQgcmV0dXJuICovCisgICAgKHZvaWQpZGVmbGF0ZUVuZCgmc3RybSk7CisgICAgcmV0dXJuIFpfT0s7Cit9CisKKy8qIERlY29tcHJlc3MgZnJvbSBmaWxlIHNvdXJjZSB0byBmaWxlIGRlc3QgdW50aWwgc3RyZWFtIGVuZHMgb3IgRU9GLgorICAgaW5mKCkgcmV0dXJucyBaX09LIG9uIHN1Y2Nlc3MsIFpfTUVNX0VSUk9SIGlmIG1lbW9yeSBjb3VsZCBub3QgYmUKKyAgIGFsbG9jYXRlZCBmb3IgcHJvY2Vzc2luZywgWl9EQVRBX0VSUk9SIGlmIHRoZSBkZWZsYXRlIGRhdGEgaXMKKyAgIGludmFsaWQgb3IgaW5jb21wbGV0ZSwgWl9WRVJTSU9OX0VSUk9SIGlmIHRoZSB2ZXJzaW9uIG9mIHpsaWIuaCBhbmQKKyAgIHRoZSB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5IGxpbmtlZCBkbyBub3QgbWF0Y2gsIG9yIFpfRVJSTk8gaWYgdGhlcmUKKyAgIGlzIGFuIGVycm9yIHJlYWRpbmcgb3Igd3JpdGluZyB0aGUgZmlsZXMuICovCitpbnQgaW5mKEZJTEUgKnNvdXJjZSwgRklMRSAqZGVzdCkKK3sKKyAgICBpbnQgcmV0OworICAgIHVuc2lnbmVkIGhhdmU7CisgICAgel9zdHJlYW0gc3RybTsKKyAgICB1bnNpZ25lZCBjaGFyIGluW0NIVU5LXTsKKyAgICB1bnNpZ25lZCBjaGFyIG91dFtDSFVOS107CisKKyAgICAvKiBhbGxvY2F0ZSBpbmZsYXRlIHN0YXRlICovCisgICAgc3RybS56YWxsb2MgPSBaX05VTEw7CisgICAgc3RybS56ZnJlZSA9IFpfTlVMTDsKKyAgICBzdHJtLm9wYXF1ZSA9IFpfTlVMTDsKKyAgICBzdHJtLmF2YWlsX2luID0gMDsKKyAgICBzdHJtLm5leHRfaW4gPSBaX05VTEw7CisgICAgcmV0ID0gaW5mbGF0ZUluaXQoJnN0cm0pOworICAgIGlmIChyZXQgIT0gWl9PSykKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIC8qIGRlY29tcHJlc3MgdW50aWwgZGVmbGF0ZSBzdHJlYW0gZW5kcyBvciBlbmQgb2YgZmlsZSAqLworICAgIGRvIHsKKyAgICAgICAgc3RybS5hdmFpbF9pbiA9IGZyZWFkKGluLCAxLCBDSFVOSywgc291cmNlKTsKKyAgICAgICAgaWYgKGZlcnJvcihzb3VyY2UpKSB7CisgICAgICAgICAgICAodm9pZClpbmZsYXRlRW5kKCZzdHJtKTsKKyAgICAgICAgICAgIHJldHVybiBaX0VSUk5POworICAgICAgICB9CisgICAgICAgIGlmIChzdHJtLmF2YWlsX2luID09IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgc3RybS5uZXh0X2luID0gaW47CisKKyAgICAgICAgLyogcnVuIGluZmxhdGUoKSBvbiBpbnB1dCB1bnRpbCBvdXRwdXQgYnVmZmVyIG5vdCBmdWxsICovCisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHN0cm0uYXZhaWxfb3V0ID0gQ0hVTks7CisgICAgICAgICAgICBzdHJtLm5leHRfb3V0ID0gb3V0OworICAgICAgICAgICAgcmV0ID0gaW5mbGF0ZSgmc3RybSwgWl9OT19GTFVTSCk7CisgICAgICAgICAgICBhc3NlcnQocmV0ICE9IFpfU1RSRUFNX0VSUk9SKTsgIC8qIHN0YXRlIG5vdCBjbG9iYmVyZWQgKi8KKyAgICAgICAgICAgIHN3aXRjaCAocmV0KSB7CisgICAgICAgICAgICBjYXNlIFpfTkVFRF9ESUNUOgorICAgICAgICAgICAgICAgIHJldCA9IFpfREFUQV9FUlJPUjsgICAgIC8qIGFuZCBmYWxsIHRocm91Z2ggKi8KKyAgICAgICAgICAgIGNhc2UgWl9EQVRBX0VSUk9SOgorICAgICAgICAgICAgY2FzZSBaX01FTV9FUlJPUjoKKyAgICAgICAgICAgICAgICAodm9pZClpbmZsYXRlRW5kKCZzdHJtKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaGF2ZSA9IENIVU5LIC0gc3RybS5hdmFpbF9vdXQ7CisgICAgICAgICAgICBpZiAoZndyaXRlKG91dCwgMSwgaGF2ZSwgZGVzdCkgIT0gaGF2ZSB8fCBmZXJyb3IoZGVzdCkpIHsKKyAgICAgICAgICAgICAgICAodm9pZClpbmZsYXRlRW5kKCZzdHJtKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gWl9FUlJOTzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSB3aGlsZSAoc3RybS5hdmFpbF9vdXQgPT0gMCk7CisKKyAgICAgICAgLyogZG9uZSB3aGVuIGluZmxhdGUoKSBzYXlzIGl0J3MgZG9uZSAqLworICAgIH0gd2hpbGUgKHJldCAhPSBaX1NUUkVBTV9FTkQpOworCisgICAgLyogY2xlYW4gdXAgYW5kIHJldHVybiAqLworICAgICh2b2lkKWluZmxhdGVFbmQoJnN0cm0pOworICAgIHJldHVybiByZXQgPT0gWl9TVFJFQU1fRU5EID8gWl9PSyA6IFpfREFUQV9FUlJPUjsKK30KKworLyogcmVwb3J0IGEgemxpYiBvciBpL28gZXJyb3IgKi8KK3ZvaWQgemVycihpbnQgcmV0KQoreworICAgIGZwdXRzKCJ6cGlwZTogIiwgc3RkZXJyKTsKKyAgICBzd2l0Y2ggKHJldCkgeworICAgIGNhc2UgWl9FUlJOTzoKKyAgICAgICAgaWYgKGZlcnJvcihzdGRpbikpCisgICAgICAgICAgICBmcHV0cygiZXJyb3IgcmVhZGluZyBzdGRpblxuIiwgc3RkZXJyKTsKKyAgICAgICAgaWYgKGZlcnJvcihzdGRvdXQpKQorICAgICAgICAgICAgZnB1dHMoImVycm9yIHdyaXRpbmcgc3Rkb3V0XG4iLCBzdGRlcnIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFpfU1RSRUFNX0VSUk9SOgorICAgICAgICBmcHV0cygiaW52YWxpZCBjb21wcmVzc2lvbiBsZXZlbFxuIiwgc3RkZXJyKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBaX0RBVEFfRVJST1I6CisgICAgICAgIGZwdXRzKCJpbnZhbGlkIG9yIGluY29tcGxldGUgZGVmbGF0ZSBkYXRhXG4iLCBzdGRlcnIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFpfTUVNX0VSUk9SOgorICAgICAgICBmcHV0cygib3V0IG9mIG1lbW9yeVxuIiwgc3RkZXJyKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBaX1ZFUlNJT05fRVJST1I6CisgICAgICAgIGZwdXRzKCJ6bGliIHZlcnNpb24gbWlzbWF0Y2ghXG4iLCBzdGRlcnIpOworICAgIH0KK30KKworLyogY29tcHJlc3Mgb3IgZGVjb21wcmVzcyBmcm9tIHN0ZGluIHRvIHN0ZG91dCAqLworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICAgIGludCByZXQ7CisKKyAgICAvKiBhdm9pZCBlbmQtb2YtbGluZSBjb252ZXJzaW9ucyAqLworICAgIFNFVF9CSU5BUllfTU9ERShzdGRpbik7CisgICAgU0VUX0JJTkFSWV9NT0RFKHN0ZG91dCk7CisKKyAgICAvKiBkbyBjb21wcmVzc2lvbiBpZiBubyBhcmd1bWVudHMgKi8KKyAgICBpZiAoYXJnYyA9PSAxKSB7CisgICAgICAgIHJldCA9IGRlZihzdGRpbiwgc3Rkb3V0LCBaX0RFRkFVTFRfQ09NUFJFU1NJT04pOworICAgICAgICBpZiAocmV0ICE9IFpfT0spCisgICAgICAgICAgICB6ZXJyKHJldCk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgLyogZG8gZGVjb21wcmVzc2lvbiBpZiAtZCBzcGVjaWZpZWQgKi8KKyAgICBlbHNlIGlmIChhcmdjID09IDIgJiYgc3RyY21wKGFyZ3ZbMV0sICItZCIpID09IDApIHsKKyAgICAgICAgcmV0ID0gaW5mKHN0ZGluLCBzdGRvdXQpOworICAgICAgICBpZiAocmV0ICE9IFpfT0spCisgICAgICAgICAgICB6ZXJyKHJldCk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgLyogb3RoZXJ3aXNlLCByZXBvcnQgdXNhZ2UgKi8KKyAgICBlbHNlIHsKKyAgICAgICAgZnB1dHMoInpwaXBlIHVzYWdlOiB6cGlwZSBbLWRdIDwgc291cmNlID4gZGVzdFxuIiwgc3RkZXJyKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvemxpYi0xLjIuNi9leGFtcGxlcy96cmFuLmMgYi96bGliLTEuMi42L2V4YW1wbGVzL3pyYW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTdhMTMwCi0tLSAvZGV2L251bGwKKysrIGIvemxpYi0xLjIuNi9leGFtcGxlcy96cmFuLmMKQEAgLTAsMCArMSw0MDQgQEAKKy8qIHpyYW4uYyAtLSBleGFtcGxlIG9mIHpsaWIvZ3ppcCBzdHJlYW0gaW5kZXhpbmcgYW5kIHJhbmRvbSBhY2Nlc3MKKyAqIENvcHlyaWdodCAoQykgMjAwNSBNYXJrIEFkbGVyCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCisgICBWZXJzaW9uIDEuMCAgMjkgTWF5IDIwMDUgIE1hcmsgQWRsZXIgKi8KKworLyogSWxsdXN0cmF0ZSB0aGUgdXNlIG9mIFpfQkxPQ0ssIGluZmxhdGVQcmltZSgpLCBhbmQgaW5mbGF0ZVNldERpY3Rpb25hcnkoKQorICAgZm9yIHJhbmRvbSBhY2Nlc3Mgb2YgYSBjb21wcmVzc2VkIGZpbGUuICBBIGZpbGUgY29udGFpbmluZyBhIHpsaWIgb3IgZ3ppcAorICAgc3RyZWFtIGlzIHByb3ZpZGVkIG9uIHRoZSBjb21tYW5kIGxpbmUuICBUaGUgY29tcHJlc3NlZCBzdHJlYW0gaXMgZGVjb2RlZCBpbgorICAgaXRzIGVudGlyZXR5LCBhbmQgYW4gaW5kZXggYnVpbHQgd2l0aCBhY2Nlc3MgcG9pbnRzIGFib3V0IGV2ZXJ5IFNQQU4gYnl0ZXMKKyAgIGluIHRoZSB1bmNvbXByZXNzZWQgb3V0cHV0LiAgVGhlIGNvbXByZXNzZWQgZmlsZSBpcyBsZWZ0IG9wZW4sIGFuZCBjYW4gdGhlbgorICAgYmUgcmVhZCByYW5kb21seSwgaGF2aW5nIHRvIGRlY29tcHJlc3Mgb24gdGhlIGF2ZXJhZ2UgU1BBTi8yIHVuY29tcHJlc3NlZAorICAgYnl0ZXMgYmVmb3JlIGdldHRpbmcgdG8gdGhlIGRlc2lyZWQgYmxvY2sgb2YgZGF0YS4KKworICAgQW4gYWNjZXNzIHBvaW50IGNhbiBiZSBjcmVhdGVkIGF0IHRoZSBzdGFydCBvZiBhbnkgZGVmbGF0ZSBibG9jaywgYnkgc2F2aW5nCisgICB0aGUgc3RhcnRpbmcgZmlsZSBvZmZzZXQgYW5kIGJpdCBvZiB0aGF0IGJsb2NrLCBhbmQgdGhlIDMySyBieXRlcyBvZgorICAgdW5jb21wcmVzc2VkIGRhdGEgdGhhdCBwcmVjZWRlIHRoYXQgYmxvY2suICBBbHNvIHRoZSB1bmNvbXByZXNzZWQgb2Zmc2V0IG9mCisgICB0aGF0IGJsb2NrIGlzIHNhdmVkIHRvIHByb3ZpZGUgYSByZWZlcmVjZSBmb3IgbG9jYXRpbmcgYSBkZXNpcmVkIHN0YXJ0aW5nCisgICBwb2ludCBpbiB0aGUgdW5jb21wcmVzc2VkIHN0cmVhbS4gIGJ1aWxkX2luZGV4KCkgd29ya3MgYnkgZGVjb21wcmVzc2luZyB0aGUKKyAgIGlucHV0IHpsaWIgb3IgZ3ppcCBzdHJlYW0gYSBibG9jayBhdCBhIHRpbWUsIGFuZCBhdCB0aGUgZW5kIG9mIGVhY2ggYmxvY2sKKyAgIGRlY2lkaW5nIGlmIGVub3VnaCB1bmNvbXByZXNzZWQgZGF0YSBoYXMgZ29uZSBieSB0byBqdXN0aWZ5IHRoZSBjcmVhdGlvbiBvZgorICAgYSBuZXcgYWNjZXNzIHBvaW50LiAgSWYgc28sIHRoYXQgcG9pbnQgaXMgc2F2ZWQgaW4gYSBkYXRhIHN0cnVjdHVyZSB0aGF0CisgICBncm93cyBhcyBuZWVkZWQgdG8gYWNjb21tb2RhdGUgdGhlIHBvaW50cy4KKworICAgVG8gdXNlIHRoZSBpbmRleCwgYW4gb2Zmc2V0IGluIHRoZSB1bmNvbXByZXNzZWQgZGF0YSBpcyBwcm92aWRlZCwgZm9yIHdoaWNoCisgICB0aGUgbGF0ZXN0IGFjY2VlcyBwb2ludCBhdCBvciBwcmVjZWRpbmcgdGhhdCBvZmZzZXQgaXMgbG9jYXRlZCBpbiB0aGUgaW5kZXguCisgICBUaGUgaW5wdXQgZmlsZSBpcyBwb3NpdGlvbmVkIHRvIHRoZSBzcGVjaWZpZWQgbG9jYXRpb24gaW4gdGhlIGluZGV4LCBhbmQgaWYKKyAgIG5lY2Vzc2FyeSB0aGUgZmlyc3QgZmV3IGJpdHMgb2YgdGhlIGNvbXByZXNzZWQgZGF0YSBpcyByZWFkIGZyb20gdGhlIGZpbGUuCisgICBpbmZsYXRlIGlzIGluaXRpYWxpemVkIHdpdGggdGhvc2UgYml0cyBhbmQgdGhlIDMySyBvZiB1bmNvbXByZXNzZWQgZGF0YSwgYW5kCisgICB0aGUgZGVjb21wcmVzc2lvbiB0aGVuIHByb2NlZWRzIHVudGlsIHRoZSBkZXNpcmVkIG9mZnNldCBpbiB0aGUgZmlsZSBpcworICAgcmVhY2hlZC4gIFRoZW4gdGhlIGRlY29tcHJlc3Npb24gY29udGludWVzIHRvIHJlYWQgdGhlIGRlc2lyZWQgdW5jb21wcmVzc2VkCisgICBkYXRhIGZyb20gdGhlIGZpbGUuCisKKyAgIEFub3RoZXIgYXBwcm9hY2ggd291bGQgYmUgdG8gZ2VuZXJhdGUgdGhlIGluZGV4IG9uIGRlbWFuZC4gIEluIHRoYXQgY2FzZSwKKyAgIHJlcXVlc3RzIGZvciByYW5kb20gYWNjZXNzIHJlYWRzIGZyb20gdGhlIGNvbXByZXNzZWQgZGF0YSB3b3VsZCB0cnkgdG8gdXNlCisgICB0aGUgaW5kZXgsIGJ1dCBpZiBhIHJlYWQgZmFyIGVub3VnaCBwYXN0IHRoZSBlbmQgb2YgdGhlIGluZGV4IGlzIHJlcXVpcmVkLAorICAgdGhlbiBmdXJ0aGVyIGluZGV4IGVudHJpZXMgd291bGQgYmUgZ2VuZXJhdGVkIGFuZCBhZGRlZC4KKworICAgVGhlcmUgaXMgc29tZSBmYWlyIGJpdCBvZiBvdmVyaGVhZCB0byBzdGFydGluZyBpbmZsYXRpb24gZm9yIHRoZSByYW5kb20KKyAgIGFjY2VzcywgbWFpbmx5IGNvcHlpbmcgdGhlIDMySyBieXRlIGRpY3Rpb25hcnkuICBTbyBpZiBzbWFsbCBwaWVjZXMgb2YgdGhlCisgICBmaWxlIGFyZSBiZWluZyBhY2Nlc3NlZCwgaXQgd291bGQgbWFrZSBzZW5zZSB0byBpbXBsZW1lbnQgYSBjYWNoZSB0byBob2xkCisgICBzb21lIGxvb2thaGVhZCBhbmQgYXZvaWQgbWFueSBjYWxscyB0byBleHRyYWN0KCkgZm9yIHNtYWxsIGxlbmd0aHMuCisKKyAgIEFub3RoZXIgd2F5IHRvIGJ1aWxkIGFuIGluZGV4IHdvdWxkIGJlIHRvIHVzZSBpbmZsYXRlQ29weSgpLiAgVGhhdCB3b3VsZAorICAgbm90IGJlIGNvbnN0cmFpbmVkIHRvIGhhdmUgYWNjZXNzIHBvaW50cyBhdCBibG9jayBib3VuZGFyaWVzLCBidXQgcmVxdWlyZXMKKyAgIG1vcmUgbWVtb3J5IHBlciBhY2Nlc3MgcG9pbnQsIGFuZCBhbHNvIGNhbm5vdCBiZSBzYXZlZCB0byBmaWxlIGR1ZSB0byB0aGUKKyAgIHVzZSBvZiBwb2ludGVycyBpbiB0aGUgc3RhdGUuICBUaGUgYXBwcm9hY2ggaGVyZSBhbGxvd3MgZm9yIHN0b3JhZ2Ugb2YgdGhlCisgICBpbmRleCBpbiBhIGZpbGUuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAiemxpYi5oIgorCisjZGVmaW5lIGxvY2FsIHN0YXRpYworCisjZGVmaW5lIFNQQU4gMTA0ODU3NkwgICAgICAgLyogZGVzaXJlZCBkaXN0YW5jZSBiZXR3ZWVuIGFjY2VzcyBwb2ludHMgKi8KKyNkZWZpbmUgV0lOU0laRSAzMjc2OFUgICAgICAvKiBzbGlkaW5nIHdpbmRvdyBzaXplICovCisjZGVmaW5lIENIVU5LIDE2Mzg0ICAgICAgICAgLyogZmlsZSBpbnB1dCBidWZmZXIgc2l6ZSAqLworCisvKiBhY2Nlc3MgcG9pbnQgZW50cnkgKi8KK3N0cnVjdCBwb2ludCB7CisgICAgb2ZmX3Qgb3V0OyAgICAgICAgICAvKiBjb3JyZXNwb25kaW5nIG9mZnNldCBpbiB1bmNvbXByZXNzZWQgZGF0YSAqLworICAgIG9mZl90IGluOyAgICAgICAgICAgLyogb2Zmc2V0IGluIGlucHV0IGZpbGUgb2YgZmlyc3QgZnVsbCBieXRlICovCisgICAgaW50IGJpdHM7ICAgICAgICAgICAvKiBudW1iZXIgb2YgYml0cyAoMS03KSBmcm9tIGJ5dGUgYXQgaW4gLSAxLCBvciAwICovCisgICAgdW5zaWduZWQgY2hhciB3aW5kb3dbV0lOU0laRV07ICAvKiBwcmVjZWRpbmcgMzJLIG9mIHVuY29tcHJlc3NlZCBkYXRhICovCit9OworCisvKiBhY2Nlc3MgcG9pbnQgbGlzdCAqLworc3RydWN0IGFjY2VzcyB7CisgICAgaW50IGhhdmU7ICAgICAgICAgICAvKiBudW1iZXIgb2YgbGlzdCBlbnRyaWVzIGZpbGxlZCBpbiAqLworICAgIGludCBzaXplOyAgICAgICAgICAgLyogbnVtYmVyIG9mIGxpc3QgZW50cmllcyBhbGxvY2F0ZWQgKi8KKyAgICBzdHJ1Y3QgcG9pbnQgKmxpc3Q7IC8qIGFsbG9jYXRlZCBsaXN0ICovCit9OworCisvKiBEZWFsbG9jYXRlIGFuIGluZGV4IGJ1aWx0IGJ5IGJ1aWxkX2luZGV4KCkgKi8KK2xvY2FsIHZvaWQgZnJlZV9pbmRleChzdHJ1Y3QgYWNjZXNzICppbmRleCkKK3sKKyAgICBpZiAoaW5kZXggIT0gTlVMTCkgeworICAgICAgICBmcmVlKGluZGV4LT5saXN0KTsKKyAgICAgICAgZnJlZShpbmRleCk7CisgICAgfQorfQorCisvKiBBZGQgYW4gZW50cnkgdG8gdGhlIGFjY2VzcyBwb2ludCBsaXN0LiAgSWYgb3V0IG9mIG1lbW9yeSwgZGVhbGxvY2F0ZSB0aGUKKyAgIGV4aXN0aW5nIGxpc3QgYW5kIHJldHVybiBOVUxMLiAqLworbG9jYWwgc3RydWN0IGFjY2VzcyAqYWRkcG9pbnQoc3RydWN0IGFjY2VzcyAqaW5kZXgsIGludCBiaXRzLAorICAgIG9mZl90IGluLCBvZmZfdCBvdXQsIHVuc2lnbmVkIGxlZnQsIHVuc2lnbmVkIGNoYXIgKndpbmRvdykKK3sKKyAgICBzdHJ1Y3QgcG9pbnQgKm5leHQ7CisKKyAgICAvKiBpZiBsaXN0IGlzIGVtcHR5LCBjcmVhdGUgaXQgKHN0YXJ0IHdpdGggZWlnaHQgcG9pbnRzKSAqLworICAgIGlmIChpbmRleCA9PSBOVUxMKSB7CisgICAgICAgIGluZGV4ID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgYWNjZXNzKSk7CisgICAgICAgIGlmIChpbmRleCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAgICAgaW5kZXgtPmxpc3QgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBwb2ludCkgPDwgMyk7CisgICAgICAgIGlmIChpbmRleC0+bGlzdCA9PSBOVUxMKSB7CisgICAgICAgICAgICBmcmVlKGluZGV4KTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGluZGV4LT5zaXplID0gODsKKyAgICAgICAgaW5kZXgtPmhhdmUgPSAwOworICAgIH0KKworICAgIC8qIGlmIGxpc3QgaXMgZnVsbCwgbWFrZSBpdCBiaWdnZXIgKi8KKyAgICBlbHNlIGlmIChpbmRleC0+aGF2ZSA9PSBpbmRleC0+c2l6ZSkgeworICAgICAgICBpbmRleC0+c2l6ZSA8PD0gMTsKKyAgICAgICAgbmV4dCA9IHJlYWxsb2MoaW5kZXgtPmxpc3QsIHNpemVvZihzdHJ1Y3QgcG9pbnQpICogaW5kZXgtPnNpemUpOworICAgICAgICBpZiAobmV4dCA9PSBOVUxMKSB7CisgICAgICAgICAgICBmcmVlX2luZGV4KGluZGV4KTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGluZGV4LT5saXN0ID0gbmV4dDsKKyAgICB9CisKKyAgICAvKiBmaWxsIGluIGVudHJ5IGFuZCBpbmNyZW1lbnQgaG93IG1hbnkgd2UgaGF2ZSAqLworICAgIG5leHQgPSBpbmRleC0+bGlzdCArIGluZGV4LT5oYXZlOworICAgIG5leHQtPmJpdHMgPSBiaXRzOworICAgIG5leHQtPmluID0gaW47CisgICAgbmV4dC0+b3V0ID0gb3V0OworICAgIGlmIChsZWZ0KQorICAgICAgICBtZW1jcHkobmV4dC0+d2luZG93LCB3aW5kb3cgKyBXSU5TSVpFIC0gbGVmdCwgbGVmdCk7CisgICAgaWYgKGxlZnQgPCBXSU5TSVpFKQorICAgICAgICBtZW1jcHkobmV4dC0+d2luZG93ICsgbGVmdCwgd2luZG93LCBXSU5TSVpFIC0gbGVmdCk7CisgICAgaW5kZXgtPmhhdmUrKzsKKworICAgIC8qIHJldHVybiBsaXN0LCBwb3NzaWJseSByZWFsbG9jYXRlZCAqLworICAgIHJldHVybiBpbmRleDsKK30KKworLyogTWFrZSBvbmUgZW50aXJlIHBhc3MgdGhyb3VnaCB0aGUgY29tcHJlc3NlZCBzdHJlYW0gYW5kIGJ1aWxkIGFuIGluZGV4LCB3aXRoCisgICBhY2Nlc3MgcG9pbnRzIGFib3V0IGV2ZXJ5IHNwYW4gYnl0ZXMgb2YgdW5jb21wcmVzc2VkIG91dHB1dCAtLSBzcGFuIGlzCisgICBjaG9zZW4gdG8gYmFsYW5jZSB0aGUgc3BlZWQgb2YgcmFuZG9tIGFjY2VzcyBhZ2FpbnN0IHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzCisgICBvZiB0aGUgbGlzdCwgYWJvdXQgMzJLIGJ5dGVzIHBlciBhY2Nlc3MgcG9pbnQuICBOb3RlIHRoYXQgZGF0YSBhZnRlciB0aGUgZW5kCisgICBvZiB0aGUgZmlyc3QgemxpYiBvciBnemlwIHN0cmVhbSBpbiB0aGUgZmlsZSBpcyBpZ25vcmVkLiAgYnVpbGRfaW5kZXgoKQorICAgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGFjY2VzcyBwb2ludHMgb24gc3VjY2VzcyAoPj0gMSksIFpfTUVNX0VSUk9SIGZvciBvdXQKKyAgIG9mIG1lbW9yeSwgWl9EQVRBX0VSUk9SIGZvciBhbiBlcnJvciBpbiB0aGUgaW5wdXQgZmlsZSwgb3IgWl9FUlJOTyBmb3IgYQorICAgZmlsZSByZWFkIGVycm9yLiAgT24gc3VjY2VzcywgKmJ1aWx0IHBvaW50cyB0byB0aGUgcmVzdWx0aW5nIGluZGV4LiAqLworbG9jYWwgaW50IGJ1aWxkX2luZGV4KEZJTEUgKmluLCBvZmZfdCBzcGFuLCBzdHJ1Y3QgYWNjZXNzICoqYnVpbHQpCit7CisgICAgaW50IHJldDsKKyAgICBvZmZfdCB0b3RpbiwgdG90b3V0OyAgICAgICAgLyogb3VyIG93biB0b3RhbCBjb3VudGVycyB0byBhdm9pZCA0R0IgbGltaXQgKi8KKyAgICBvZmZfdCBsYXN0OyAgICAgICAgICAgICAgICAgLyogdG90b3V0IHZhbHVlIG9mIGxhc3QgYWNjZXNzIHBvaW50ICovCisgICAgc3RydWN0IGFjY2VzcyAqaW5kZXg7ICAgICAgIC8qIGFjY2VzcyBwb2ludHMgYmVpbmcgZ2VuZXJhdGVkICovCisgICAgel9zdHJlYW0gc3RybTsKKyAgICB1bnNpZ25lZCBjaGFyIGlucHV0W0NIVU5LXTsKKyAgICB1bnNpZ25lZCBjaGFyIHdpbmRvd1tXSU5TSVpFXTsKKworICAgIC8qIGluaXRpYWxpemUgaW5mbGF0ZSAqLworICAgIHN0cm0uemFsbG9jID0gWl9OVUxMOworICAgIHN0cm0uemZyZWUgPSBaX05VTEw7CisgICAgc3RybS5vcGFxdWUgPSBaX05VTEw7CisgICAgc3RybS5hdmFpbF9pbiA9IDA7CisgICAgc3RybS5uZXh0X2luID0gWl9OVUxMOworICAgIHJldCA9IGluZmxhdGVJbml0Migmc3RybSwgNDcpOyAgICAgIC8qIGF1dG9tYXRpYyB6bGliIG9yIGd6aXAgZGVjb2RpbmcgKi8KKyAgICBpZiAocmV0ICE9IFpfT0spCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAvKiBpbmZsYXRlIHRoZSBpbnB1dCwgbWFpbnRhaW4gYSBzbGlkaW5nIHdpbmRvdywgYW5kIGJ1aWxkIGFuIGluZGV4IC0tIHRoaXMKKyAgICAgICBhbHNvIHZhbGlkYXRlcyB0aGUgaW50ZWdyaXR5IG9mIHRoZSBjb21wcmVzc2VkIGRhdGEgdXNpbmcgdGhlIGNoZWNrCisgICAgICAgaW5mb3JtYXRpb24gYXQgdGhlIGVuZCBvZiB0aGUgZ3ppcCBvciB6bGliIHN0cmVhbSAqLworICAgIHRvdGluID0gdG90b3V0ID0gbGFzdCA9IDA7CisgICAgaW5kZXggPSBOVUxMOyAgICAgICAgICAgICAgIC8qIHdpbGwgYmUgYWxsb2NhdGVkIGJ5IGZpcnN0IGFkZHBvaW50KCkgKi8KKyAgICBzdHJtLmF2YWlsX291dCA9IDA7CisgICAgZG8geworICAgICAgICAvKiBnZXQgc29tZSBjb21wcmVzc2VkIGRhdGEgZnJvbSBpbnB1dCBmaWxlICovCisgICAgICAgIHN0cm0uYXZhaWxfaW4gPSBmcmVhZChpbnB1dCwgMSwgQ0hVTkssIGluKTsKKyAgICAgICAgaWYgKGZlcnJvcihpbikpIHsKKyAgICAgICAgICAgIHJldCA9IFpfRVJSTk87CisgICAgICAgICAgICBnb3RvIGJ1aWxkX2luZGV4X2Vycm9yOworICAgICAgICB9CisgICAgICAgIGlmIChzdHJtLmF2YWlsX2luID09IDApIHsKKyAgICAgICAgICAgIHJldCA9IFpfREFUQV9FUlJPUjsKKyAgICAgICAgICAgIGdvdG8gYnVpbGRfaW5kZXhfZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgc3RybS5uZXh0X2luID0gaW5wdXQ7CisKKyAgICAgICAgLyogcHJvY2VzcyBhbGwgb2YgdGhhdCwgb3IgdW50aWwgZW5kIG9mIHN0cmVhbSAqLworICAgICAgICBkbyB7CisgICAgICAgICAgICAvKiByZXNldCBzbGlkaW5nIHdpbmRvdyBpZiBuZWNlc3NhcnkgKi8KKyAgICAgICAgICAgIGlmIChzdHJtLmF2YWlsX291dCA9PSAwKSB7CisgICAgICAgICAgICAgICAgc3RybS5hdmFpbF9vdXQgPSBXSU5TSVpFOworICAgICAgICAgICAgICAgIHN0cm0ubmV4dF9vdXQgPSB3aW5kb3c7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIGluZmxhdGUgdW50aWwgb3V0IG9mIGlucHV0LCBvdXRwdXQsIG9yIGF0IGVuZCBvZiBibG9jayAtLQorICAgICAgICAgICAgICAgdXBkYXRlIHRoZSB0b3RhbCBpbnB1dCBhbmQgb3V0cHV0IGNvdW50ZXJzICovCisgICAgICAgICAgICB0b3RpbiArPSBzdHJtLmF2YWlsX2luOworICAgICAgICAgICAgdG90b3V0ICs9IHN0cm0uYXZhaWxfb3V0OworICAgICAgICAgICAgcmV0ID0gaW5mbGF0ZSgmc3RybSwgWl9CTE9DSyk7ICAgICAgLyogcmV0dXJuIGF0IGVuZCBvZiBibG9jayAqLworICAgICAgICAgICAgdG90aW4gLT0gc3RybS5hdmFpbF9pbjsKKyAgICAgICAgICAgIHRvdG91dCAtPSBzdHJtLmF2YWlsX291dDsKKyAgICAgICAgICAgIGlmIChyZXQgPT0gWl9ORUVEX0RJQ1QpCisgICAgICAgICAgICAgICAgcmV0ID0gWl9EQVRBX0VSUk9SOworICAgICAgICAgICAgaWYgKHJldCA9PSBaX01FTV9FUlJPUiB8fCByZXQgPT0gWl9EQVRBX0VSUk9SKQorICAgICAgICAgICAgICAgIGdvdG8gYnVpbGRfaW5kZXhfZXJyb3I7CisgICAgICAgICAgICBpZiAocmV0ID09IFpfU1RSRUFNX0VORCkKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgLyogaWYgYXQgZW5kIG9mIGJsb2NrLCBjb25zaWRlciBhZGRpbmcgYW4gaW5kZXggZW50cnkgKG5vdGUgdGhhdCBpZgorICAgICAgICAgICAgICAgZGF0YV90eXBlIGluZGljYXRlcyBhbiBlbmQtb2YtYmxvY2ssIHRoZW4gYWxsIG9mIHRoZQorICAgICAgICAgICAgICAgdW5jb21wcmVzc2VkIGRhdGEgZnJvbSB0aGF0IGJsb2NrIGhhcyBiZWVuIGRlbGl2ZXJlZCwgYW5kIG5vbmUKKyAgICAgICAgICAgICAgIG9mIHRoZSBjb21wcmVzc2VkIGRhdGEgYWZ0ZXIgdGhhdCBibG9jayBoYXMgYmVlbiBjb25zdW1lZCwKKyAgICAgICAgICAgICAgIGV4Y2VwdCBmb3IgdXAgdG8gc2V2ZW4gYml0cykgLS0gdGhlIHRvdG91dCA9PSAwIHByb3ZpZGVzIGFuCisgICAgICAgICAgICAgICBlbnRyeSBwb2ludCBhZnRlciB0aGUgemxpYiBvciBnemlwIGhlYWRlciwgYW5kIGFzc3VyZXMgdGhhdCB0aGUKKyAgICAgICAgICAgICAgIGluZGV4IGFsd2F5cyBoYXMgYXQgbGVhc3Qgb25lIGFjY2VzcyBwb2ludDsgd2UgYXZvaWQgY3JlYXRpbmcgYW4KKyAgICAgICAgICAgICAgIGFjY2VzcyBwb2ludCBhZnRlciB0aGUgbGFzdCBibG9jayBieSBjaGVja2luZyBiaXQgNiBvZiBkYXRhX3R5cGUKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKChzdHJtLmRhdGFfdHlwZSAmIDEyOCkgJiYgIShzdHJtLmRhdGFfdHlwZSAmIDY0KSAmJgorICAgICAgICAgICAgICAgICh0b3RvdXQgPT0gMCB8fCB0b3RvdXQgLSBsYXN0ID4gc3BhbikpIHsKKyAgICAgICAgICAgICAgICBpbmRleCA9IGFkZHBvaW50KGluZGV4LCBzdHJtLmRhdGFfdHlwZSAmIDcsIHRvdGluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90b3V0LCBzdHJtLmF2YWlsX291dCwgd2luZG93KTsKKyAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICByZXQgPSBaX01FTV9FUlJPUjsKKyAgICAgICAgICAgICAgICAgICAgZ290byBidWlsZF9pbmRleF9lcnJvcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbGFzdCA9IHRvdG91dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSB3aGlsZSAoc3RybS5hdmFpbF9pbiAhPSAwKTsKKyAgICB9IHdoaWxlIChyZXQgIT0gWl9TVFJFQU1fRU5EKTsKKworICAgIC8qIGNsZWFuIHVwIGFuZCByZXR1cm4gaW5kZXggKHJlbGVhc2UgdW51c2VkIGVudHJpZXMgaW4gbGlzdCkgKi8KKyAgICAodm9pZClpbmZsYXRlRW5kKCZzdHJtKTsKKyAgICBpbmRleCA9IHJlYWxsb2MoaW5kZXgsIHNpemVvZihzdHJ1Y3QgcG9pbnQpICogaW5kZXgtPmhhdmUpOworICAgIGluZGV4LT5zaXplID0gaW5kZXgtPmhhdmU7CisgICAgKmJ1aWx0ID0gaW5kZXg7CisgICAgcmV0dXJuIGluZGV4LT5zaXplOworCisgICAgLyogcmV0dXJuIGVycm9yICovCisgIGJ1aWxkX2luZGV4X2Vycm9yOgorICAgICh2b2lkKWluZmxhdGVFbmQoJnN0cm0pOworICAgIGlmIChpbmRleCAhPSBOVUxMKQorICAgICAgICBmcmVlX2luZGV4KGluZGV4KTsKKyAgICByZXR1cm4gcmV0OworfQorCisvKiBVc2UgdGhlIGluZGV4IHRvIHJlYWQgbGVuIGJ5dGVzIGZyb20gb2Zmc2V0IGludG8gYnVmLCByZXR1cm4gYnl0ZXMgcmVhZCBvcgorICAgbmVnYXRpdmUgZm9yIGVycm9yIChaX0RBVEFfRVJST1Igb3IgWl9NRU1fRVJST1IpLiAgSWYgZGF0YSBpcyByZXF1ZXN0ZWQgcGFzdAorICAgdGhlIGVuZCBvZiB0aGUgdW5jb21wcmVzc2VkIGRhdGEsIHRoZW4gZXh0cmFjdCgpIHdpbGwgcmV0dXJuIGEgdmFsdWUgbGVzcworICAgdGhhbiBsZW4sIGluZGljYXRpbmcgaG93IG11Y2ggYXMgYWN0dWFsbHkgcmVhZCBpbnRvIGJ1Zi4gIFRoaXMgZnVuY3Rpb24KKyAgIHNob3VsZCBub3QgcmV0dXJuIGEgZGF0YSBlcnJvciB1bmxlc3MgdGhlIGZpbGUgd2FzIG1vZGlmaWVkIHNpbmNlIHRoZSBpbmRleAorICAgd2FzIGdlbmVyYXRlZC4gIGV4dHJhY3QoKSBtYXkgYWxzbyByZXR1cm4gWl9FUlJOTyBpZiB0aGVyZSBpcyBhbiBlcnJvciBvbgorICAgcmVhZGluZyBvciBzZWVraW5nIHRoZSBpbnB1dCBmaWxlLiAqLworbG9jYWwgaW50IGV4dHJhY3QoRklMRSAqaW4sIHN0cnVjdCBhY2Nlc3MgKmluZGV4LCBvZmZfdCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpidWYsIGludCBsZW4pCit7CisgICAgaW50IHJldCwgc2tpcDsKKyAgICB6X3N0cmVhbSBzdHJtOworICAgIHN0cnVjdCBwb2ludCAqaGVyZTsKKyAgICB1bnNpZ25lZCBjaGFyIGlucHV0W0NIVU5LXTsKKyAgICB1bnNpZ25lZCBjaGFyIGRpc2NhcmRbV0lOU0laRV07CisKKyAgICAvKiBwcm9jZWVkIG9ubHkgaWYgc29tZXRoaW5nIHJlYXNvbmFibGUgdG8gZG8gKi8KKyAgICBpZiAobGVuIDwgMCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICAvKiBmaW5kIHdoZXJlIGluIHN0cmVhbSB0byBzdGFydCAqLworICAgIGhlcmUgPSBpbmRleC0+bGlzdDsKKyAgICByZXQgPSBpbmRleC0+aGF2ZTsKKyAgICB3aGlsZSAoLS1yZXQgJiYgaGVyZVsxXS5vdXQgPD0gb2Zmc2V0KQorICAgICAgICBoZXJlKys7CisKKyAgICAvKiBpbml0aWFsaXplIGZpbGUgYW5kIGluZmxhdGUgc3RhdGUgdG8gc3RhcnQgdGhlcmUgKi8KKyAgICBzdHJtLnphbGxvYyA9IFpfTlVMTDsKKyAgICBzdHJtLnpmcmVlID0gWl9OVUxMOworICAgIHN0cm0ub3BhcXVlID0gWl9OVUxMOworICAgIHN0cm0uYXZhaWxfaW4gPSAwOworICAgIHN0cm0ubmV4dF9pbiA9IFpfTlVMTDsKKyAgICByZXQgPSBpbmZsYXRlSW5pdDIoJnN0cm0sIC0xNSk7ICAgICAgICAgLyogcmF3IGluZmxhdGUgKi8KKyAgICBpZiAocmV0ICE9IFpfT0spCisgICAgICAgIHJldHVybiByZXQ7CisgICAgcmV0ID0gZnNlZWtvKGluLCBoZXJlLT5pbiAtIChoZXJlLT5iaXRzID8gMSA6IDApLCBTRUVLX1NFVCk7CisgICAgaWYgKHJldCA9PSAtMSkKKyAgICAgICAgZ290byBleHRyYWN0X3JldDsKKyAgICBpZiAoaGVyZS0+Yml0cykgeworICAgICAgICByZXQgPSBnZXRjKGluKTsKKyAgICAgICAgaWYgKHJldCA9PSAtMSkgeworICAgICAgICAgICAgcmV0ID0gZmVycm9yKGluKSA/IFpfRVJSTk8gOiBaX0RBVEFfRVJST1I7CisgICAgICAgICAgICBnb3RvIGV4dHJhY3RfcmV0OworICAgICAgICB9CisgICAgICAgICh2b2lkKWluZmxhdGVQcmltZSgmc3RybSwgaGVyZS0+Yml0cywgcmV0ID4+ICg4IC0gaGVyZS0+Yml0cykpOworICAgIH0KKyAgICAodm9pZClpbmZsYXRlU2V0RGljdGlvbmFyeSgmc3RybSwgaGVyZS0+d2luZG93LCBXSU5TSVpFKTsKKworICAgIC8qIHNraXAgdW5jb21wcmVzc2VkIGJ5dGVzIHVudGlsIG9mZnNldCByZWFjaGVkLCB0aGVuIHNhdGlzZnkgcmVxdWVzdCAqLworICAgIG9mZnNldCAtPSBoZXJlLT5vdXQ7CisgICAgc3RybS5hdmFpbF9pbiA9IDA7CisgICAgc2tpcCA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdoaWxlIHNraXBwaW5nIHRvIG9mZnNldCAqLworICAgIGRvIHsKKyAgICAgICAgLyogZGVmaW5lIHdoZXJlIHRvIHB1dCB1bmNvbXByZXNzZWQgZGF0YSwgYW5kIGhvdyBtdWNoICovCisgICAgICAgIGlmIChvZmZzZXQgPT0gMCAmJiBza2lwKSB7ICAgICAgICAgIC8qIGF0IG9mZnNldCBub3cgKi8KKyAgICAgICAgICAgIHN0cm0uYXZhaWxfb3V0ID0gbGVuOworICAgICAgICAgICAgc3RybS5uZXh0X291dCA9IGJ1ZjsKKyAgICAgICAgICAgIHNraXAgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgLyogb25seSBkbyB0aGlzIG9uY2UgKi8KKyAgICAgICAgfQorICAgICAgICBpZiAob2Zmc2V0ID4gV0lOU0laRSkgeyAgICAgICAgICAgICAvKiBza2lwIFdJTlNJWkUgYnl0ZXMgKi8KKyAgICAgICAgICAgIHN0cm0uYXZhaWxfb3V0ID0gV0lOU0laRTsKKyAgICAgICAgICAgIHN0cm0ubmV4dF9vdXQgPSBkaXNjYXJkOworICAgICAgICAgICAgb2Zmc2V0IC09IFdJTlNJWkU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAob2Zmc2V0ICE9IDApIHsgICAgICAgICAgICAgLyogbGFzdCBza2lwICovCisgICAgICAgICAgICBzdHJtLmF2YWlsX291dCA9ICh1bnNpZ25lZClvZmZzZXQ7CisgICAgICAgICAgICBzdHJtLm5leHRfb3V0ID0gZGlzY2FyZDsKKyAgICAgICAgICAgIG9mZnNldCA9IDA7CisgICAgICAgIH0KKworICAgICAgICAvKiB1bmNvbXByZXNzIHVudGlsIGF2YWlsX291dCBmaWxsZWQsIG9yIGVuZCBvZiBzdHJlYW0gKi8KKyAgICAgICAgZG8geworICAgICAgICAgICAgaWYgKHN0cm0uYXZhaWxfaW4gPT0gMCkgeworICAgICAgICAgICAgICAgIHN0cm0uYXZhaWxfaW4gPSBmcmVhZChpbnB1dCwgMSwgQ0hVTkssIGluKTsKKyAgICAgICAgICAgICAgICBpZiAoZmVycm9yKGluKSkgeworICAgICAgICAgICAgICAgICAgICByZXQgPSBaX0VSUk5POworICAgICAgICAgICAgICAgICAgICBnb3RvIGV4dHJhY3RfcmV0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoc3RybS5hdmFpbF9pbiA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IFpfREFUQV9FUlJPUjsKKyAgICAgICAgICAgICAgICAgICAgZ290byBleHRyYWN0X3JldDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3RybS5uZXh0X2luID0gaW5wdXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXQgPSBpbmZsYXRlKCZzdHJtLCBaX05PX0ZMVVNIKTsgICAgICAgLyogbm9ybWFsIGluZmxhdGUgKi8KKyAgICAgICAgICAgIGlmIChyZXQgPT0gWl9ORUVEX0RJQ1QpCisgICAgICAgICAgICAgICAgcmV0ID0gWl9EQVRBX0VSUk9SOworICAgICAgICAgICAgaWYgKHJldCA9PSBaX01FTV9FUlJPUiB8fCByZXQgPT0gWl9EQVRBX0VSUk9SKQorICAgICAgICAgICAgICAgIGdvdG8gZXh0cmFjdF9yZXQ7CisgICAgICAgICAgICBpZiAocmV0ID09IFpfU1RSRUFNX0VORCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfSB3aGlsZSAoc3RybS5hdmFpbF9vdXQgIT0gMCk7CisKKyAgICAgICAgLyogaWYgcmVhY2ggZW5kIG9mIHN0cmVhbSwgdGhlbiBkb24ndCBrZWVwIHRyeWluZyB0byBnZXQgbW9yZSAqLworICAgICAgICBpZiAocmV0ID09IFpfU1RSRUFNX0VORCkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIC8qIGRvIHVudGlsIG9mZnNldCByZWFjaGVkIGFuZCByZXF1ZXN0ZWQgZGF0YSByZWFkLCBvciBzdHJlYW0gZW5kcyAqLworICAgIH0gd2hpbGUgKHNraXApOworCisgICAgLyogY29tcHV0ZSBudW1iZXIgb2YgdW5jb21wcmVzc2VkIGJ5dGVzIHJlYWQgYWZ0ZXIgb2Zmc2V0ICovCisgICAgcmV0ID0gc2tpcCA/IDAgOiBsZW4gLSBzdHJtLmF2YWlsX291dDsKKworICAgIC8qIGNsZWFuIHVwIGFuZCByZXR1cm4gYnl0ZXMgcmVhZCBvciBlcnJvciAqLworICBleHRyYWN0X3JldDoKKyAgICAodm9pZClpbmZsYXRlRW5kKCZzdHJtKTsKKyAgICByZXR1cm4gcmV0OworfQorCisvKiBEZW1vbnN0cmF0ZSB0aGUgdXNlIG9mIGJ1aWxkX2luZGV4KCkgYW5kIGV4dHJhY3QoKSBieSBwcm9jZXNzaW5nIHRoZSBmaWxlCisgICBwcm92aWRlZCBvbiB0aGUgY29tbWFuZCBsaW5lLCBhbmQgdGhlIGV4dHJhY3RpbmcgMTZLIGZyb20gYWJvdXQgMi8zcmRzIG9mCisgICB0aGUgd2F5IHRocm91Z2ggdGhlIHVuY29tcHJlc3NlZCBvdXRwdXQsIGFuZCB3cml0aW5nIHRoYXQgdG8gc3Rkb3V0LiAqLworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICAgIGludCBsZW47CisgICAgb2ZmX3Qgb2Zmc2V0OworICAgIEZJTEUgKmluOworICAgIHN0cnVjdCBhY2Nlc3MgKmluZGV4ID0gTlVMTDsKKyAgICB1bnNpZ25lZCBjaGFyIGJ1ZltDSFVOS107CisKKyAgICAvKiBvcGVuIGlucHV0IGZpbGUgKi8KKyAgICBpZiAoYXJnYyAhPSAyKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAidXNhZ2U6IHpyYW4gZmlsZS5nelxuIik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpbiA9IGZvcGVuKGFyZ3ZbMV0sICJyYiIpOworICAgIGlmIChpbiA9PSBOVUxMKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAienJhbjogY291bGQgbm90IG9wZW4gJXMgZm9yIHJlYWRpbmdcbiIsIGFyZ3ZbMV0pOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICAvKiBidWlsZCBpbmRleCAqLworICAgIGxlbiA9IGJ1aWxkX2luZGV4KGluLCBTUEFOLCAmaW5kZXgpOworICAgIGlmIChsZW4gPCAwKSB7CisgICAgICAgIGZjbG9zZShpbik7CisgICAgICAgIHN3aXRjaCAobGVuKSB7CisgICAgICAgIGNhc2UgWl9NRU1fRVJST1I6CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInpyYW46IG91dCBvZiBtZW1vcnlcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgWl9EQVRBX0VSUk9SOgorICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJ6cmFuOiBjb21wcmVzc2VkIGRhdGEgZXJyb3IgaW4gJXNcbiIsIGFyZ3ZbMV0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgWl9FUlJOTzoKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAienJhbjogcmVhZCBlcnJvciBvbiAlc1xuIiwgYXJndlsxXSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAienJhbjogZXJyb3IgJWQgd2hpbGUgYnVpbGRpbmcgaW5kZXhcbiIsIGxlbik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGZwcmludGYoc3RkZXJyLCAienJhbjogYnVpbHQgaW5kZXggd2l0aCAlZCBhY2Nlc3MgcG9pbnRzXG4iLCBsZW4pOworCisgICAgLyogdXNlIGluZGV4IGJ5IHJlYWRpbmcgc29tZSBieXRlcyBmcm9tIGFuIGFyYml0cmFyeSBvZmZzZXQgKi8KKyAgICBvZmZzZXQgPSAoaW5kZXgtPmxpc3RbaW5kZXgtPmhhdmUgLSAxXS5vdXQgPDwgMSkgLyAzOworICAgIGxlbiA9IGV4dHJhY3QoaW4sIGluZGV4LCBvZmZzZXQsIGJ1ZiwgQ0hVTkspOworICAgIGlmIChsZW4gPCAwKQorICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInpyYW46IGV4dHJhY3Rpb24gZmFpbGVkOiAlcyBlcnJvclxuIiwKKyAgICAgICAgICAgICAgICBsZW4gPT0gWl9NRU1fRVJST1IgPyAib3V0IG9mIG1lbW9yeSIgOiAiaW5wdXQgY29ycnVwdGVkIik7CisgICAgZWxzZSB7CisgICAgICAgIGZ3cml0ZShidWYsIDEsIGxlbiwgc3Rkb3V0KTsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJ6cmFuOiBleHRyYWN0ZWQgJWQgYnl0ZXMgYXQgJWxsdVxuIiwgbGVuLCBvZmZzZXQpOworICAgIH0KKworICAgIC8qIGNsZWFuIHVwIGFuZCBleGl0ICovCisgICAgZnJlZV9pbmRleChpbmRleCk7CisgICAgZmNsb3NlKGluKTsKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3psaWItMS4yLjYvZ3pjbG9zZS5jIGIvemxpYi0xLjIuNi9nemNsb3NlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FlYjk5YQotLS0gL2Rldi9udWxsCisrKyBiL3psaWItMS4yLjYvZ3pjbG9zZS5jCkBAIC0wLDAgKzEsMjUgQEAKKy8qIGd6Y2xvc2UuYyAtLSB6bGliIGd6Y2xvc2UoKSBmdW5jdGlvbgorICogQ29weXJpZ2h0IChDKSAyMDA0LCAyMDEwIE1hcmsgQWRsZXIKKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKKyAqLworCisjaW5jbHVkZSAiZ3pndXRzLmgiCisKKy8qIGd6Y2xvc2UoKSBpcyBpbiBhIHNlcGFyYXRlIGZpbGUgc28gdGhhdCBpdCBpcyBsaW5rZWQgaW4gb25seSBpZiBpdCBpcyB1c2VkLgorICAgVGhhdCB3YXkgdGhlIG90aGVyIGd6Y2xvc2UgZnVuY3Rpb25zIGNhbiBiZSB1c2VkIGluc3RlYWQgdG8gYXZvaWQgbGlua2luZyBpbgorICAgdW5uZWVkZWQgY29tcHJlc3Npb24gb3IgZGVjb21wcmVzc2lvbiByb3V0aW5lcy4gKi8KK2ludCBaRVhQT1JUIGd6Y2xvc2UoZmlsZSkKKyAgICBnekZpbGUgZmlsZTsKK3sKKyNpZm5kZWYgTk9fR1pDT01QUkVTUworICAgIGd6X3N0YXRlcCBzdGF0ZTsKKworICAgIGlmIChmaWxlID09IE5VTEwpCisgICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKyAgICBzdGF0ZSA9IChnel9zdGF0ZXApZmlsZTsKKworICAgIHJldHVybiBzdGF0ZS0+bW9kZSA9PSBHWl9SRUFEID8gZ3pjbG9zZV9yKGZpbGUpIDogZ3pjbG9zZV93KGZpbGUpOworI2Vsc2UKKyAgICByZXR1cm4gZ3pjbG9zZV9yKGZpbGUpOworI2VuZGlmCit9CmRpZmYgLS1naXQgYS96bGliLTEuMi42L2d6Z3V0cy5oIGIvemxpYi0xLjIuNi9nemd1dHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTA3YzM2Ci0tLSAvZGV2L251bGwKKysrIGIvemxpYi0xLjIuNi9nemd1dHMuaApAQCAtMCwwICsxLDE5MCBAQAorLyogZ3pndXRzLmggLS0gemxpYiBpbnRlcm5hbCBoZWFkZXIgZGVmaW5pdGlvbnMgZm9yIGd6KiBvcGVyYXRpb25zCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDUsIDIwMTAsIDIwMTEsIDIwMTIgTWFyayBBZGxlcgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAorICovCisKKyNpZmRlZiBfTEFSR0VGSUxFNjRfU09VUkNFCisjICBpZm5kZWYgX0xBUkdFRklMRV9TT1VSQ0UKKyMgICAgZGVmaW5lIF9MQVJHRUZJTEVfU09VUkNFIDEKKyMgIGVuZGlmCisjICBpZmRlZiBfRklMRV9PRkZTRVRfQklUUworIyAgICB1bmRlZiBfRklMRV9PRkZTRVRfQklUUworIyAgZW5kaWYKKyNlbmRpZgorCisjaWYgKChfX0dOVUNfXy0wKSAqIDEwICsgX19HTlVDX01JTk9SX18tMCA+PSAzMykgJiYgIWRlZmluZWQoTk9fVklaKQorIyAgZGVmaW5lIFpMSUJfSU5URVJOQUwgX19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eSAoImhpZGRlbiIpKSkKKyNlbHNlCisjICBkZWZpbmUgWkxJQl9JTlRFUk5BTAorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgInpsaWIuaCIKKyNpZmRlZiBTVERDCisjICBpbmNsdWRlIDxzdHJpbmcuaD4KKyMgIGluY2x1ZGUgPHN0ZGxpYi5oPgorIyAgaW5jbHVkZSA8bGltaXRzLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxmY250bC5oPgorCisjaWZkZWYgX19UVVJCT0NfXworIyAgaW5jbHVkZSA8aW8uaD4KKyNlbmRpZgorCisjaWZkZWYgTk9fREVGTEFURSAgICAgICAvKiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG9sZCBkZWZpbml0aW9uICovCisjICBkZWZpbmUgTk9fR1pDT01QUkVTUworI2VuZGlmCisKKyNpZiBkZWZpbmVkKFNUREM5OSkgfHwgKGRlZmluZWQoX19UVVJCT0NfXykgJiYgX19UVVJCT0NfXyA+PSAweDU1MCkKKyMgIGlmbmRlZiBIQVZFX1ZTTlBSSU5URgorIyAgICBkZWZpbmUgSEFWRV9WU05QUklOVEYKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19DWUdXSU5fXykKKyMgIGlmbmRlZiBIQVZFX1ZTTlBSSU5URgorIyAgICBkZWZpbmUgSEFWRV9WU05QUklOVEYKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQoTVNET1MpICYmIGRlZmluZWQoX19CT1JMQU5EQ19fKSAmJiAoQk9STEFOREMgPiAweDQxMCkKKyMgIGlmbmRlZiBIQVZFX1ZTTlBSSU5URgorIyAgICBkZWZpbmUgSEFWRV9WU05QUklOVEYKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmbmRlZiBIQVZFX1ZTTlBSSU5URgorIyAgaWZkZWYgTVNET1MKKy8qIHZzbnByaW50ZiBtYXkgZXhpc3Qgb24gc29tZSBNUy1ET1MgY29tcGlsZXJzIChESkdQUD8pLAorIGJ1dCBmb3Igbm93IHdlIGp1c3QgYXNzdW1lIGl0IGRvZXNuJ3QuICovCisjICAgIGRlZmluZSBOT192c25wcmludGYKKyMgIGVuZGlmCisjICBpZmRlZiBfX1RVUkJPQ19fCisjICAgIGRlZmluZSBOT192c25wcmludGYKKyMgIGVuZGlmCisjICBpZmRlZiBXSU4zMgorLyogSW4gV2luMzIsIHZzbnByaW50ZiBpcyBhdmFpbGFibGUgYXMgdGhlICJub24tQU5TSSIgX3ZzbnByaW50Zi4gKi8KKyMgICAgaWYgIWRlZmluZWQodnNucHJpbnRmKSAmJiAhZGVmaW5lZChOT192c25wcmludGYpCisjICAgICAgaWYgIWRlZmluZWQoX01TQ19WRVIpIHx8ICggZGVmaW5lZChfTVNDX1ZFUikgJiYgX01TQ19WRVIgPCAxNTAwICkKKyMgICAgICAgICBpbmNsdWRlIDxpby5oPgorIyAgICAgICAgIGRlZmluZSB2c25wcmludGYgX3ZzbnByaW50ZgorIyAgICAgIGVuZGlmCisjICAgIGVuZGlmCisjICBlbmRpZgorIyAgaWZkZWYgX19TQVNDCisjICAgIGRlZmluZSBOT192c25wcmludGYKKyMgIGVuZGlmCisjICBpZmRlZiBWTVMKKyMgICAgZGVmaW5lIE5PX3ZzbnByaW50ZgorIyAgZW5kaWYKKyMgIGlmZGVmIF9fT1M0MDBfXworIyAgICBkZWZpbmUgTk9fdnNucHJpbnRmCisjICBlbmRpZgorIyAgaWZkZWYgX19NVlNfXworIyAgICBkZWZpbmUgTk9fdnNucHJpbnRmCisjICBlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgbG9jYWwKKyMgIGRlZmluZSBsb2NhbCBzdGF0aWMKKyNlbmRpZgorLyogY29tcGlsZSB3aXRoIC1EbG9jYWwgaWYgeW91ciBkZWJ1Z2dlciBjYW4ndCBmaW5kIHN0YXRpYyBzeW1ib2xzICovCisKKy8qIGd6KiBmdW5jdGlvbnMgYWx3YXlzIHVzZSBsaWJyYXJ5IGFsbG9jYXRpb24gZnVuY3Rpb25zICovCisjaWZuZGVmIFNUREMKKyAgZXh0ZXJuIHZvaWRwICBtYWxsb2MgT0YoKHVJbnQgc2l6ZSkpOworICBleHRlcm4gdm9pZCAgIGZyZWUgICBPRigodm9pZHBmIHB0cikpOworI2VuZGlmCisKKy8qIGdldCBlcnJubyBhbmQgc3RyZXJyb3IgZGVmaW5pdGlvbiAqLworI2lmIGRlZmluZWQgVU5ERVJfQ0UKKyMgIGluY2x1ZGUgPHdpbmRvd3MuaD4KKyMgIGRlZmluZSB6c3RyZXJyb3IoKSBnel9zdHJ3aW5lcnJvcigoRFdPUkQpR2V0TGFzdEVycm9yKCkpCisjZWxzZQorIyAgaWZkZWYgU1REQworIyAgICBpbmNsdWRlIDxlcnJuby5oPgorIyAgICBkZWZpbmUgenN0cmVycm9yKCkgc3RyZXJyb3IoZXJybm8pCisjICBlbHNlCisjICAgIGRlZmluZSB6c3RyZXJyb3IoKSAic3RkaW8gZXJyb3IgKGNvbnN1bHQgZXJybm8pIgorIyAgZW5kaWYKKyNlbmRpZgorCisvKiBwcm92aWRlIHByb3RvdHlwZXMgZm9yIHRoZXNlIHdoZW4gYnVpbGRpbmcgemxpYiB3aXRob3V0IExGUyAqLworI2lmICFkZWZpbmVkKF9MQVJHRUZJTEU2NF9TT1VSQ0UpIHx8IF9MRlM2NF9MQVJHRUZJTEUtMCA9PSAwCisgICAgWkVYVEVSTiBnekZpbGUgWkVYUE9SVCBnem9wZW42NCBPRigoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopKTsKKyAgICBaRVhURVJOIHpfb2ZmNjRfdCBaRVhQT1JUIGd6c2VlazY0IE9GKChnekZpbGUsIHpfb2ZmNjRfdCwgaW50KSk7CisgICAgWkVYVEVSTiB6X29mZjY0X3QgWkVYUE9SVCBnenRlbGw2NCBPRigoZ3pGaWxlKSk7CisgICAgWkVYVEVSTiB6X29mZjY0X3QgWkVYUE9SVCBnem9mZnNldDY0IE9GKChnekZpbGUpKTsKKyNlbmRpZgorCisvKiBkZWZhdWx0IG1lbUxldmVsICovCisjaWYgTUFYX01FTV9MRVZFTCA+PSA4CisjICBkZWZpbmUgREVGX01FTV9MRVZFTCA4CisjZWxzZQorIyAgZGVmaW5lIERFRl9NRU1fTEVWRUwgIE1BWF9NRU1fTEVWRUwKKyNlbmRpZgorCisvKiBkZWZhdWx0IGkvbyBidWZmZXIgc2l6ZSAtLSBkb3VibGUgdGhpcyBmb3Igb3V0cHV0IHdoZW4gcmVhZGluZyAqLworI2RlZmluZSBHWkJVRlNJWkUgODE5MgorCisvKiBnemlwIG1vZGVzLCBhbHNvIHByb3ZpZGUgYSBsaXR0bGUgaW50ZWdyaXR5IGNoZWNrIG9uIHRoZSBwYXNzZWQgc3RydWN0dXJlICovCisjZGVmaW5lIEdaX05PTkUgMAorI2RlZmluZSBHWl9SRUFEIDcyNDcKKyNkZWZpbmUgR1pfV1JJVEUgMzExNTMKKyNkZWZpbmUgR1pfQVBQRU5EIDEgICAgIC8qIG1vZGUgc2V0IHRvIEdaX1dSSVRFIGFmdGVyIHRoZSBmaWxlIGlzIG9wZW5lZCAqLworCisvKiB2YWx1ZXMgZm9yIGd6X3N0YXRlIGhvdyAqLworI2RlZmluZSBMT09LIDAgICAgICAvKiBsb29rIGZvciBhIGd6aXAgaGVhZGVyICovCisjZGVmaW5lIENPUFkgMSAgICAgIC8qIGNvcHkgaW5wdXQgZGlyZWN0bHkgKi8KKyNkZWZpbmUgR1pJUCAyICAgICAgLyogZGVjb21wcmVzcyBhIGd6aXAgc3RyZWFtICovCisKKy8qIGludGVybmFsIGd6aXAgZmlsZSBzdGF0ZSBkYXRhIHN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgICAgICAvKiBleHBvc2VkIGNvbnRlbnRzIGZvciBnemdldGMoKSBtYWNybyAqLworICAgIHN0cnVjdCBnekZpbGVfcyB4OyAgICAgIC8qICJ4IiBmb3IgZXhwb3NlZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHguaGF2ZTogbnVtYmVyIG9mIGJ5dGVzIGF2YWlsYWJsZSBhdCB4Lm5leHQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB4Lm5leHQ6IG5leHQgb3V0cHV0IGRhdGEgdG8gZGVsaXZlciBvciB3cml0ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHgucG9zOiBjdXJyZW50IHBvc2l0aW9uIGluIHVuY29tcHJlc3NlZCBkYXRhICovCisgICAgICAgIC8qIHVzZWQgZm9yIGJvdGggcmVhZGluZyBhbmQgd3JpdGluZyAqLworICAgIGludCBtb2RlOyAgICAgICAgICAgICAgIC8qIHNlZSBnemlwIG1vZGVzIGFib3ZlICovCisgICAgaW50IGZkOyAgICAgICAgICAgICAgICAgLyogZmlsZSBkZXNjcmlwdG9yICovCisgICAgY2hhciAqcGF0aDsgICAgICAgICAgICAgLyogcGF0aCBvciBmZCBmb3IgZXJyb3IgbWVzc2FnZXMgKi8KKyAgICB1bnNpZ25lZCBzaXplOyAgICAgICAgICAvKiBidWZmZXIgc2l6ZSwgemVybyBpZiBub3QgYWxsb2NhdGVkIHlldCAqLworICAgIHVuc2lnbmVkIHdhbnQ7ICAgICAgICAgIC8qIHJlcXVlc3RlZCBidWZmZXIgc2l6ZSwgZGVmYXVsdCBpcyBHWkJVRlNJWkUgKi8KKyAgICB1bnNpZ25lZCBjaGFyICppbjsgICAgICAvKiBpbnB1dCBidWZmZXIgKi8KKyAgICB1bnNpZ25lZCBjaGFyICpvdXQ7ICAgICAvKiBvdXRwdXQgYnVmZmVyIChkb3VibGUtc2l6ZWQgd2hlbiByZWFkaW5nKSAqLworICAgIGludCBkaXJlY3Q7ICAgICAgICAgICAgIC8qIDAgaWYgcHJvY2Vzc2luZyBnemlwLCAxIGlmIHRyYW5zcGFyZW50ICovCisgICAgICAgIC8qIGp1c3QgZm9yIHJlYWRpbmcgKi8KKyAgICBpbnQgaG93OyAgICAgICAgICAgICAgICAvKiAwOiBnZXQgaGVhZGVyLCAxOiBjb3B5LCAyOiBkZWNvbXByZXNzICovCisgICAgel9vZmY2NF90IHN0YXJ0OyAgICAgICAgLyogd2hlcmUgdGhlIGd6aXAgZGF0YSBzdGFydGVkLCBmb3IgcmV3aW5kaW5nICovCisgICAgaW50IGVvZjsgICAgICAgICAgICAgICAgLyogdHJ1ZSBpZiBlbmQgb2YgaW5wdXQgZmlsZSByZWFjaGVkICovCisgICAgaW50IHBhc3Q7ICAgICAgICAgICAgICAgLyogdHJ1ZSBpZiByZWFkIHJlcXVlc3RlZCBwYXN0IGVuZCAqLworICAgICAgICAvKiBqdXN0IGZvciB3cml0aW5nICovCisgICAgaW50IGxldmVsOyAgICAgICAgICAgICAgLyogY29tcHJlc3Npb24gbGV2ZWwgKi8KKyAgICBpbnQgc3RyYXRlZ3k7ICAgICAgICAgICAvKiBjb21wcmVzc2lvbiBzdHJhdGVneSAqLworICAgICAgICAvKiBzZWVrIHJlcXVlc3QgKi8KKyAgICB6X29mZjY0X3Qgc2tpcDsgICAgICAgICAvKiBhbW91bnQgdG8gc2tpcCAoYWxyZWFkeSByZXdvdW5kIGlmIGJhY2t3YXJkcykgKi8KKyAgICBpbnQgc2VlazsgICAgICAgICAgICAgICAvKiB0cnVlIGlmIHNlZWsgcmVxdWVzdCBwZW5kaW5nICovCisgICAgICAgIC8qIGVycm9yIGluZm9ybWF0aW9uICovCisgICAgaW50IGVycjsgICAgICAgICAgICAgICAgLyogZXJyb3IgY29kZSAqLworICAgIGNoYXIgKm1zZzsgICAgICAgICAgICAgIC8qIGVycm9yIG1lc3NhZ2UgKi8KKyAgICAgICAgLyogemxpYiBpbmZsYXRlIG9yIGRlZmxhdGUgc3RyZWFtICovCisgICAgel9zdHJlYW0gc3RybTsgICAgICAgICAgLyogc3RyZWFtIHN0cnVjdHVyZSBpbi1wbGFjZSAobm90IGEgcG9pbnRlcikgKi8KK30gZ3pfc3RhdGU7Cit0eXBlZGVmIGd6X3N0YXRlIEZBUiAqZ3pfc3RhdGVwOworCisvKiBzaGFyZWQgZnVuY3Rpb25zICovCit2b2lkIFpMSUJfSU5URVJOQUwgZ3pfZXJyb3IgT0YoKGd6X3N0YXRlcCwgaW50LCBjb25zdCBjaGFyICopKTsKKyNpZiBkZWZpbmVkIFVOREVSX0NFCitjaGFyIFpMSUJfSU5URVJOQUwgKmd6X3N0cndpbmVycm9yIE9GKChEV09SRCBlcnJvcikpOworI2VuZGlmCisKKy8qIEdUX09GRih4KSwgd2hlcmUgeCBpcyBhbiB1bnNpZ25lZCB2YWx1ZSwgaXMgdHJ1ZSBpZiB4ID4gbWF4aW11bSB6X29mZjY0X3QKKyAgIHZhbHVlIC0tIG5lZWRlZCB3aGVuIGNvbXBhcmluZyB1bnNpZ25lZCB0byB6X29mZjY0X3QsIHdoaWNoIGlzIHNpZ25lZAorICAgKHBvc3NpYmxlIHpfb2ZmNjRfdCB0eXBlcyBvZmZfdCwgb2ZmNjRfdCwgYW5kIGxvbmcgYXJlIGFsbCBzaWduZWQpICovCisjaWZkZWYgSU5UX01BWAorIyAgZGVmaW5lIEdUX09GRih4KSAoc2l6ZW9mKGludCkgPT0gc2l6ZW9mKHpfb2ZmNjRfdCkgJiYgKHgpID4gSU5UX01BWCkKKyNlbHNlCit1bnNpZ25lZCBaTElCX0lOVEVSTkFMIGd6X2ludG1heCBPRigodm9pZCkpOworIyAgZGVmaW5lIEdUX09GRih4KSAoc2l6ZW9mKGludCkgPT0gc2l6ZW9mKHpfb2ZmNjRfdCkgJiYgKHgpID4gZ3pfaW50bWF4KCkpCisjZW5kaWYKZGlmZiAtLWdpdCBhL3psaWItMS4yLjYvZ3psaWIuYyBiL3psaWItMS4yLjYvZ3psaWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWVkYWI4Ci0tLSAvZGV2L251bGwKKysrIGIvemxpYi0xLjIuNi9nemxpYi5jCkBAIC0wLDAgKzEsNTY0IEBACisvKiBnemxpYi5jIC0tIHpsaWIgZnVuY3Rpb25zIGNvbW1vbiB0byByZWFkaW5nIGFuZCB3cml0aW5nIGd6aXAgZmlsZXMKKyAqIENvcHlyaWdodCAoQykgMjAwNCwgMjAxMCwgMjAxMSBNYXJrIEFkbGVyCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCisgKi8KKworI2luY2x1ZGUgImd6Z3V0cy5oIgorCisjaWYgZGVmaW5lZChfV0lOMzIpICYmICFkZWZpbmVkKF9fQk9STEFORENfXykKKyMgIGRlZmluZSBMU0VFSyBfbHNlZWtpNjQKKyNlbHNlCisjaWYgZGVmaW5lZChfTEFSR0VGSUxFNjRfU09VUkNFKSAmJiBfTEZTNjRfTEFSR0VGSUxFLTAKKyMgIGRlZmluZSBMU0VFSyBsc2VlazY0CisjZWxzZQorIyAgZGVmaW5lIExTRUVLIGxzZWVrCisjZW5kaWYKKyNlbmRpZgorCisvKiBMb2NhbCBmdW5jdGlvbnMgKi8KK2xvY2FsIHZvaWQgZ3pfcmVzZXQgT0YoKGd6X3N0YXRlcCkpOworbG9jYWwgZ3pGaWxlIGd6X29wZW4gT0YoKGNvbnN0IGNoYXIgKiwgaW50LCBjb25zdCBjaGFyICopKTsKKworI2lmIGRlZmluZWQgVU5ERVJfQ0UKKworLyogTWFwIHRoZSBXaW5kb3dzIGVycm9yIG51bWJlciBpbiBFUlJPUiB0byBhIGxvY2FsZS1kZXBlbmRlbnQgZXJyb3IgbWVzc2FnZQorICAgc3RyaW5nIGFuZCByZXR1cm4gYSBwb2ludGVyIHRvIGl0LiAgVHlwaWNhbGx5LCB0aGUgdmFsdWVzIGZvciBFUlJPUiBjb21lCisgICBmcm9tIEdldExhc3RFcnJvci4KKworICAgVGhlIHN0cmluZyBwb2ludGVkIHRvIHNoYWxsIG5vdCBiZSBtb2RpZmllZCBieSB0aGUgYXBwbGljYXRpb24sIGJ1dCBtYXkgYmUKKyAgIG92ZXJ3cml0dGVuIGJ5IGEgc3Vic2VxdWVudCBjYWxsIHRvIGd6X3N0cndpbmVycm9yCisKKyAgIFRoZSBnel9zdHJ3aW5lcnJvciBmdW5jdGlvbiBkb2VzIG5vdCBjaGFuZ2UgdGhlIGN1cnJlbnQgc2V0dGluZyBvZgorICAgR2V0TGFzdEVycm9yLiAqLworY2hhciBaTElCX0lOVEVSTkFMICpnel9zdHJ3aW5lcnJvciAoZXJyb3IpCisgICAgIERXT1JEIGVycm9yOworeworICAgIHN0YXRpYyBjaGFyIGJ1ZlsxMDI0XTsKKworICAgIHdjaGFyX3QgKm1zZ2J1ZjsKKyAgICBEV09SRCBsYXN0ZXJyID0gR2V0TGFzdEVycm9yKCk7CisgICAgRFdPUkQgY2hhcnMgPSBGb3JtYXRNZXNzYWdlKEZPUk1BVF9NRVNTQUdFX0ZST01fU1lTVEVNCisgICAgICAgIHwgRk9STUFUX01FU1NBR0VfQUxMT0NBVEVfQlVGRkVSLAorICAgICAgICBOVUxMLAorICAgICAgICBlcnJvciwKKyAgICAgICAgMCwgLyogRGVmYXVsdCBsYW5ndWFnZSAqLworICAgICAgICAoTFBWT0lEKSZtc2didWYsCisgICAgICAgIDAsCisgICAgICAgIE5VTEwpOworICAgIGlmIChjaGFycyAhPSAwKSB7CisgICAgICAgIC8qIElmIHRoZXJlIGlzIGFuIFxyXG4gYXBwZW5kZWQsIHphcCBpdC4gICovCisgICAgICAgIGlmIChjaGFycyA+PSAyCisgICAgICAgICAgICAmJiBtc2didWZbY2hhcnMgLSAyXSA9PSAnXHInICYmIG1zZ2J1ZltjaGFycyAtIDFdID09ICdcbicpIHsKKyAgICAgICAgICAgIGNoYXJzIC09IDI7CisgICAgICAgICAgICBtc2didWZbY2hhcnNdID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjaGFycyA+IHNpemVvZiAoYnVmKSAtIDEpIHsKKyAgICAgICAgICAgIGNoYXJzID0gc2l6ZW9mIChidWYpIC0gMTsKKyAgICAgICAgICAgIG1zZ2J1ZltjaGFyc10gPSAwOworICAgICAgICB9CisKKyAgICAgICAgd2NzdG9tYnMoYnVmLCBtc2didWYsIGNoYXJzICsgMSk7CisgICAgICAgIExvY2FsRnJlZShtc2didWYpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgc3ByaW50ZihidWYsICJ1bmtub3duIHdpbjMyIGVycm9yICglbGQpIiwgZXJyb3IpOworICAgIH0KKworICAgIFNldExhc3RFcnJvcihsYXN0ZXJyKTsKKyAgICByZXR1cm4gYnVmOworfQorCisjZW5kaWYgLyogVU5ERVJfQ0UgKi8KKworLyogUmVzZXQgZ3ppcCBmaWxlIHN0YXRlICovCitsb2NhbCB2b2lkIGd6X3Jlc2V0KHN0YXRlKQorICAgIGd6X3N0YXRlcCBzdGF0ZTsKK3sKKyAgICBzdGF0ZS0+eC5oYXZlID0gMDsgICAgICAgICAgICAgIC8qIG5vIG91dHB1dCBkYXRhIGF2YWlsYWJsZSAqLworICAgIGlmIChzdGF0ZS0+bW9kZSA9PSBHWl9SRUFEKSB7ICAgLyogZm9yIHJlYWRpbmcgLi4uICovCisgICAgICAgIHN0YXRlLT5lb2YgPSAwOyAgICAgICAgICAgICAvKiBub3QgYXQgZW5kIG9mIGZpbGUgKi8KKyAgICAgICAgc3RhdGUtPnBhc3QgPSAwOyAgICAgICAgICAgIC8qIGhhdmUgbm90IHJlYWQgcGFzdCBlbmQgeWV0ICovCisgICAgICAgIHN0YXRlLT5ob3cgPSBMT09LOyAgICAgICAgICAvKiBsb29rIGZvciBnemlwIGhlYWRlciAqLworICAgIH0KKyAgICBzdGF0ZS0+c2VlayA9IDA7ICAgICAgICAgICAgICAgIC8qIG5vIHNlZWsgcmVxdWVzdCBwZW5kaW5nICovCisgICAgZ3pfZXJyb3Ioc3RhdGUsIFpfT0ssIE5VTEwpOyAgICAvKiBjbGVhciBlcnJvciAqLworICAgIHN0YXRlLT54LnBvcyA9IDA7ICAgICAgICAgICAgICAgLyogbm8gdW5jb21wcmVzc2VkIGRhdGEgeWV0ICovCisgICAgc3RhdGUtPnN0cm0uYXZhaWxfaW4gPSAwOyAgICAgICAvKiBubyBpbnB1dCBkYXRhIHlldCAqLworfQorCisvKiBPcGVuIGEgZ3ppcCBmaWxlIGVpdGhlciBieSBuYW1lIG9yIGZpbGUgZGVzY3JpcHRvci4gKi8KK2xvY2FsIGd6RmlsZSBnel9vcGVuKHBhdGgsIGZkLCBtb2RlKQorICAgIGNvbnN0IGNoYXIgKnBhdGg7CisgICAgaW50IGZkOworICAgIGNvbnN0IGNoYXIgKm1vZGU7Cit7CisgICAgZ3pfc3RhdGVwIHN0YXRlOworCisgICAgLyogY2hlY2sgaW5wdXQgKi8KKyAgICBpZiAocGF0aCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIC8qIGFsbG9jYXRlIGd6RmlsZSBzdHJ1Y3R1cmUgdG8gcmV0dXJuICovCisgICAgc3RhdGUgPSBtYWxsb2Moc2l6ZW9mKGd6X3N0YXRlKSk7CisgICAgaWYgKHN0YXRlID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHN0YXRlLT5zaXplID0gMDsgICAgICAgICAgICAvKiBubyBidWZmZXJzIGFsbG9jYXRlZCB5ZXQgKi8KKyAgICBzdGF0ZS0+d2FudCA9IEdaQlVGU0laRTsgICAgLyogcmVxdWVzdGVkIGJ1ZmZlciBzaXplICovCisgICAgc3RhdGUtPm1zZyA9IE5VTEw7ICAgICAgICAgIC8qIG5vIGVycm9yIG1lc3NhZ2UgeWV0ICovCisKKyAgICAvKiBpbnRlcnByZXQgbW9kZSAqLworICAgIHN0YXRlLT5tb2RlID0gR1pfTk9ORTsKKyAgICBzdGF0ZS0+bGV2ZWwgPSBaX0RFRkFVTFRfQ09NUFJFU1NJT047CisgICAgc3RhdGUtPnN0cmF0ZWd5ID0gWl9ERUZBVUxUX1NUUkFURUdZOworICAgIHN0YXRlLT5kaXJlY3QgPSAwOworICAgIHdoaWxlICgqbW9kZSkgeworICAgICAgICBpZiAoKm1vZGUgPj0gJzAnICYmICptb2RlIDw9ICc5JykKKyAgICAgICAgICAgIHN0YXRlLT5sZXZlbCA9ICptb2RlIC0gJzAnOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzd2l0Y2ggKCptb2RlKSB7CisgICAgICAgICAgICBjYXNlICdyJzoKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEdaX1JFQUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisjaWZuZGVmIE5PX0daQ09NUFJFU1MKKyAgICAgICAgICAgIGNhc2UgJ3cnOgorICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gR1pfV1JJVEU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdhJzoKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEdaX0FQUEVORDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyNlbmRpZgorICAgICAgICAgICAgY2FzZSAnKyc6ICAgICAgIC8qIGNhbid0IHJlYWQgYW5kIHdyaXRlIGF0IHRoZSBzYW1lIHRpbWUgKi8KKyAgICAgICAgICAgICAgICBmcmVlKHN0YXRlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIGNhc2UgJ2InOiAgICAgICAvKiBpZ25vcmUgLS0gd2lsbCByZXF1ZXN0IGJpbmFyeSBhbnl3YXkgKi8KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ2YnOgorICAgICAgICAgICAgICAgIHN0YXRlLT5zdHJhdGVneSA9IFpfRklMVEVSRUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdoJzoKKyAgICAgICAgICAgICAgICBzdGF0ZS0+c3RyYXRlZ3kgPSBaX0hVRkZNQU5fT05MWTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ1InOgorICAgICAgICAgICAgICAgIHN0YXRlLT5zdHJhdGVneSA9IFpfUkxFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnRic6CisgICAgICAgICAgICAgICAgc3RhdGUtPnN0cmF0ZWd5ID0gWl9GSVhFRDsKKyAgICAgICAgICAgIGNhc2UgJ1QnOgorICAgICAgICAgICAgICAgIHN0YXRlLT5kaXJlY3QgPSAxOworICAgICAgICAgICAgZGVmYXVsdDogICAgICAgIC8qIGNvdWxkIGNvbnNpZGVyIGFzIGFuIGVycm9yLCBidXQganVzdCBpZ25vcmUgKi8KKyAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICB9CisgICAgICAgIG1vZGUrKzsKKyAgICB9CisKKyAgICAvKiBtdXN0IHByb3ZpZGUgYW4gInIiLCAidyIsIG9yICJhIiAqLworICAgIGlmIChzdGF0ZS0+bW9kZSA9PSBHWl9OT05FKSB7CisgICAgICAgIGZyZWUoc3RhdGUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICAvKiBjYW4ndCBmb3JjZSB0cmFuc3BhcmVudCByZWFkICovCisgICAgaWYgKHN0YXRlLT5tb2RlID09IEdaX1JFQUQpIHsKKyAgICAgICAgaWYgKHN0YXRlLT5kaXJlY3QpIHsKKyAgICAgICAgICAgIGZyZWUoc3RhdGUpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgc3RhdGUtPmRpcmVjdCA9IDE7ICAgICAgLyogZm9yIGVtcHR5IGZpbGUgKi8KKyAgICB9CisKKyAgICAvKiBzYXZlIHRoZSBwYXRoIG5hbWUgZm9yIGVycm9yIG1lc3NhZ2VzICovCisgICAgc3RhdGUtPnBhdGggPSBtYWxsb2Moc3RybGVuKHBhdGgpICsgMSk7CisgICAgaWYgKHN0YXRlLT5wYXRoID09IE5VTEwpIHsKKyAgICAgICAgZnJlZShzdGF0ZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBzdHJjcHkoc3RhdGUtPnBhdGgsIHBhdGgpOworCisgICAgLyogb3BlbiB0aGUgZmlsZSB3aXRoIHRoZSBhcHByb3ByaWF0ZSBtb2RlIChvciBqdXN0IHVzZSBmZCkgKi8KKyAgICBzdGF0ZS0+ZmQgPSBmZCAhPSAtMSA/IGZkIDoKKyAgICAgICAgb3BlbihwYXRoLAorI2lmZGVmIE9fTEFSR0VGSUxFCisgICAgICAgICAgICBPX0xBUkdFRklMRSB8CisjZW5kaWYKKyNpZmRlZiBPX0JJTkFSWQorICAgICAgICAgICAgT19CSU5BUlkgfAorI2VuZGlmCisgICAgICAgICAgICAoc3RhdGUtPm1vZGUgPT0gR1pfUkVBRCA/CisgICAgICAgICAgICAgICAgT19SRE9OTFkgOgorICAgICAgICAgICAgICAgIChPX1dST05MWSB8IE9fQ1JFQVQgfCAoCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID09IEdaX1dSSVRFID8KKyAgICAgICAgICAgICAgICAgICAgICAgIE9fVFJVTkMgOgorICAgICAgICAgICAgICAgICAgICAgICAgT19BUFBFTkQpKSksCisgICAgICAgICAgICAwNjY2KTsKKyAgICBpZiAoc3RhdGUtPmZkID09IC0xKSB7CisgICAgICAgIGZyZWUoc3RhdGUtPnBhdGgpOworICAgICAgICBmcmVlKHN0YXRlKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChzdGF0ZS0+bW9kZSA9PSBHWl9BUFBFTkQpCisgICAgICAgIHN0YXRlLT5tb2RlID0gR1pfV1JJVEU7ICAgICAgICAgLyogc2ltcGxpZnkgbGF0ZXIgY2hlY2tzICovCisKKyAgICAvKiBzYXZlIHRoZSBjdXJyZW50IHBvc2l0aW9uIGZvciByZXdpbmRpbmcgKG9ubHkgaWYgcmVhZGluZykgKi8KKyAgICBpZiAoc3RhdGUtPm1vZGUgPT0gR1pfUkVBRCkgeworICAgICAgICBzdGF0ZS0+c3RhcnQgPSBMU0VFSyhzdGF0ZS0+ZmQsIDAsIFNFRUtfQ1VSKTsKKyAgICAgICAgaWYgKHN0YXRlLT5zdGFydCA9PSAtMSkgc3RhdGUtPnN0YXJ0ID0gMDsKKyAgICB9CisKKyAgICAvKiBpbml0aWFsaXplIHN0cmVhbSAqLworICAgIGd6X3Jlc2V0KHN0YXRlKTsKKworICAgIC8qIHJldHVybiBzdHJlYW0gKi8KKyAgICByZXR1cm4gKGd6RmlsZSlzdGF0ZTsKK30KKworLyogLS0gc2VlIHpsaWIuaCAtLSAqLworZ3pGaWxlIFpFWFBPUlQgZ3pvcGVuKHBhdGgsIG1vZGUpCisgICAgY29uc3QgY2hhciAqcGF0aDsKKyAgICBjb25zdCBjaGFyICptb2RlOworeworICAgIHJldHVybiBnel9vcGVuKHBhdGgsIC0xLCBtb2RlKTsKK30KKworLyogLS0gc2VlIHpsaWIuaCAtLSAqLworZ3pGaWxlIFpFWFBPUlQgZ3pvcGVuNjQocGF0aCwgbW9kZSkKKyAgICBjb25zdCBjaGFyICpwYXRoOworICAgIGNvbnN0IGNoYXIgKm1vZGU7Cit7CisgICAgcmV0dXJuIGd6X29wZW4ocGF0aCwgLTEsIG1vZGUpOworfQorCisvKiAtLSBzZWUgemxpYi5oIC0tICovCitnekZpbGUgWkVYUE9SVCBnemRvcGVuKGZkLCBtb2RlKQorICAgIGludCBmZDsKKyAgICBjb25zdCBjaGFyICptb2RlOworeworICAgIGNoYXIgKnBhdGg7ICAgICAgICAgLyogaWRlbnRpZmllciBmb3IgZXJyb3IgbWVzc2FnZXMgKi8KKyAgICBnekZpbGUgZ3o7CisKKyAgICBpZiAoZmQgPT0gLTEgfHwgKHBhdGggPSBtYWxsb2MoNyArIDMgKiBzaXplb2YoaW50KSkpID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHNwcmludGYocGF0aCwgIjxmZDolZD4iLCBmZCk7ICAgLyogZm9yIGRlYnVnZ2luZyAqLworICAgIGd6ID0gZ3pfb3BlbihwYXRoLCBmZCwgbW9kZSk7CisgICAgZnJlZShwYXRoKTsKKyAgICByZXR1cm4gZ3o7Cit9CisKKy8qIC0tIHNlZSB6bGliLmggLS0gKi8KK2ludCBaRVhQT1JUIGd6YnVmZmVyKGZpbGUsIHNpemUpCisgICAgZ3pGaWxlIGZpbGU7CisgICAgdW5zaWduZWQgc2l6ZTsKK3sKKyAgICBnel9zdGF0ZXAgc3RhdGU7CisKKyAgICAvKiBnZXQgaW50ZXJuYWwgc3RydWN0dXJlIGFuZCBjaGVjayBpbnRlZ3JpdHkgKi8KKyAgICBpZiAoZmlsZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisgICAgc3RhdGUgPSAoZ3pfc3RhdGVwKWZpbGU7CisgICAgaWYgKHN0YXRlLT5tb2RlICE9IEdaX1JFQUQgJiYgc3RhdGUtPm1vZGUgIT0gR1pfV1JJVEUpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIC8qIG1ha2Ugc3VyZSB3ZSBoYXZlbid0IGFscmVhZHkgYWxsb2NhdGVkIG1lbW9yeSAqLworICAgIGlmIChzdGF0ZS0+c2l6ZSAhPSAwKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICAvKiBjaGVjayBhbmQgc2V0IHJlcXVlc3RlZCBzaXplICovCisgICAgaWYgKHNpemUgPCAyKQorICAgICAgICBzaXplID0gMjsgICAgICAgICAgICAgICAvKiBuZWVkIHR3byBieXRlcyB0byBjaGVjayBtYWdpYyBoZWFkZXIgKi8KKyAgICBzdGF0ZS0+d2FudCA9IHNpemU7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qIC0tIHNlZSB6bGliLmggLS0gKi8KK2ludCBaRVhQT1JUIGd6cmV3aW5kKGZpbGUpCisgICAgZ3pGaWxlIGZpbGU7Cit7CisgICAgZ3pfc3RhdGVwIHN0YXRlOworCisgICAgLyogZ2V0IGludGVybmFsIHN0cnVjdHVyZSAqLworICAgIGlmIChmaWxlID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBzdGF0ZSA9IChnel9zdGF0ZXApZmlsZTsKKworICAgIC8qIGNoZWNrIHRoYXQgd2UncmUgcmVhZGluZyBhbmQgdGhhdCB0aGVyZSdzIG5vIGVycm9yICovCisgICAgaWYgKHN0YXRlLT5tb2RlICE9IEdaX1JFQUQgfHwKKyAgICAgICAgICAgIChzdGF0ZS0+ZXJyICE9IFpfT0sgJiYgc3RhdGUtPmVyciAhPSBaX0JVRl9FUlJPUikpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIC8qIGJhY2sgdXAgYW5kIHN0YXJ0IG92ZXIgKi8KKyAgICBpZiAoTFNFRUsoc3RhdGUtPmZkLCBzdGF0ZS0+c3RhcnQsIFNFRUtfU0VUKSA9PSAtMSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGd6X3Jlc2V0KHN0YXRlKTsKKyAgICByZXR1cm4gMDsKK30KKworLyogLS0gc2VlIHpsaWIuaCAtLSAqLworel9vZmY2NF90IFpFWFBPUlQgZ3pzZWVrNjQoZmlsZSwgb2Zmc2V0LCB3aGVuY2UpCisgICAgZ3pGaWxlIGZpbGU7CisgICAgel9vZmY2NF90IG9mZnNldDsKKyAgICBpbnQgd2hlbmNlOworeworICAgIHVuc2lnbmVkIG47CisgICAgel9vZmY2NF90IHJldDsKKyAgICBnel9zdGF0ZXAgc3RhdGU7CisKKyAgICAvKiBnZXQgaW50ZXJuYWwgc3RydWN0dXJlIGFuZCBjaGVjayBpbnRlZ3JpdHkgKi8KKyAgICBpZiAoZmlsZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisgICAgc3RhdGUgPSAoZ3pfc3RhdGVwKWZpbGU7CisgICAgaWYgKHN0YXRlLT5tb2RlICE9IEdaX1JFQUQgJiYgc3RhdGUtPm1vZGUgIT0gR1pfV1JJVEUpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIC8qIGNoZWNrIHRoYXQgdGhlcmUncyBubyBlcnJvciAqLworICAgIGlmIChzdGF0ZS0+ZXJyICE9IFpfT0sgJiYgc3RhdGUtPmVyciAhPSBaX0JVRl9FUlJPUikKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgLyogY2FuIG9ubHkgc2VlayBmcm9tIHN0YXJ0IG9yIHJlbGF0aXZlIHRvIGN1cnJlbnQgcG9zaXRpb24gKi8KKyAgICBpZiAod2hlbmNlICE9IFNFRUtfU0VUICYmIHdoZW5jZSAhPSBTRUVLX0NVUikKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgLyogbm9ybWFsaXplIG9mZnNldCB0byBhIFNFRUtfQ1VSIHNwZWNpZmljYXRpb24gKi8KKyAgICBpZiAod2hlbmNlID09IFNFRUtfU0VUKQorICAgICAgICBvZmZzZXQgLT0gc3RhdGUtPngucG9zOworICAgIGVsc2UgaWYgKHN0YXRlLT5zZWVrKQorICAgICAgICBvZmZzZXQgKz0gc3RhdGUtPnNraXA7CisgICAgc3RhdGUtPnNlZWsgPSAwOworCisgICAgLyogaWYgd2l0aGluIHJhdyBhcmVhIHdoaWxlIHJlYWRpbmcsIGp1c3QgZ28gdGhlcmUgKi8KKyAgICBpZiAoc3RhdGUtPm1vZGUgPT0gR1pfUkVBRCAmJiBzdGF0ZS0+aG93ID09IENPUFkgJiYKKyAgICAgICAgICAgIHN0YXRlLT54LnBvcyArIG9mZnNldCA+PSAwKSB7CisgICAgICAgIHJldCA9IExTRUVLKHN0YXRlLT5mZCwgb2Zmc2V0IC0gc3RhdGUtPnguaGF2ZSwgU0VFS19DVVIpOworICAgICAgICBpZiAocmV0ID09IC0xKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBzdGF0ZS0+eC5oYXZlID0gMDsKKyAgICAgICAgc3RhdGUtPmVvZiA9IDA7CisgICAgICAgIHN0YXRlLT5wYXN0ID0gMDsKKyAgICAgICAgc3RhdGUtPnNlZWsgPSAwOworICAgICAgICBnel9lcnJvcihzdGF0ZSwgWl9PSywgTlVMTCk7CisgICAgICAgIHN0YXRlLT5zdHJtLmF2YWlsX2luID0gMDsKKyAgICAgICAgc3RhdGUtPngucG9zICs9IG9mZnNldDsKKyAgICAgICAgcmV0dXJuIHN0YXRlLT54LnBvczsKKyAgICB9CisKKyAgICAvKiBjYWxjdWxhdGUgc2tpcCBhbW91bnQsIHJld2luZGluZyBpZiBuZWVkZWQgZm9yIGJhY2sgc2VlayB3aGVuIHJlYWRpbmcgKi8KKyAgICBpZiAob2Zmc2V0IDwgMCkgeworICAgICAgICBpZiAoc3RhdGUtPm1vZGUgIT0gR1pfUkVBRCkgICAgICAgICAvKiB3cml0aW5nIC0tIGNhbid0IGdvIGJhY2t3YXJkcyAqLworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBvZmZzZXQgKz0gc3RhdGUtPngucG9zOworICAgICAgICBpZiAob2Zmc2V0IDwgMCkgICAgICAgICAgICAgICAgICAgICAvKiBiZWZvcmUgc3RhcnQgb2YgZmlsZSEgKi8KKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgaWYgKGd6cmV3aW5kKGZpbGUpID09IC0xKSAgICAgICAgICAgLyogcmV3aW5kLCB0aGVuIHNraXAgdG8gb2Zmc2V0ICovCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLyogaWYgcmVhZGluZywgc2tpcCB3aGF0J3MgaW4gb3V0cHV0IGJ1ZmZlciAob25lIGxlc3MgZ3pnZXRjKCkgY2hlY2spICovCisgICAgaWYgKHN0YXRlLT5tb2RlID09IEdaX1JFQUQpIHsKKyAgICAgICAgbiA9IEdUX09GRihzdGF0ZS0+eC5oYXZlKSB8fCAoel9vZmY2NF90KXN0YXRlLT54LmhhdmUgPiBvZmZzZXQgPworICAgICAgICAgICAgKHVuc2lnbmVkKW9mZnNldCA6IHN0YXRlLT54LmhhdmU7CisgICAgICAgIHN0YXRlLT54LmhhdmUgLT0gbjsKKyAgICAgICAgc3RhdGUtPngubmV4dCArPSBuOworICAgICAgICBzdGF0ZS0+eC5wb3MgKz0gbjsKKyAgICAgICAgb2Zmc2V0IC09IG47CisgICAgfQorCisgICAgLyogcmVxdWVzdCBza2lwIChpZiBub3QgemVybykgKi8KKyAgICBpZiAob2Zmc2V0KSB7CisgICAgICAgIHN0YXRlLT5zZWVrID0gMTsKKyAgICAgICAgc3RhdGUtPnNraXAgPSBvZmZzZXQ7CisgICAgfQorICAgIHJldHVybiBzdGF0ZS0+eC5wb3MgKyBvZmZzZXQ7Cit9CisKKy8qIC0tIHNlZSB6bGliLmggLS0gKi8KK3pfb2ZmX3QgWkVYUE9SVCBnenNlZWsoZmlsZSwgb2Zmc2V0LCB3aGVuY2UpCisgICAgZ3pGaWxlIGZpbGU7CisgICAgel9vZmZfdCBvZmZzZXQ7CisgICAgaW50IHdoZW5jZTsKK3sKKyAgICB6X29mZjY0X3QgcmV0OworCisgICAgcmV0ID0gZ3pzZWVrNjQoZmlsZSwgKHpfb2ZmNjRfdClvZmZzZXQsIHdoZW5jZSk7CisgICAgcmV0dXJuIHJldCA9PSAoel9vZmZfdClyZXQgPyAoel9vZmZfdClyZXQgOiAtMTsKK30KKworLyogLS0gc2VlIHpsaWIuaCAtLSAqLworel9vZmY2NF90IFpFWFBPUlQgZ3p0ZWxsNjQoZmlsZSkKKyAgICBnekZpbGUgZmlsZTsKK3sKKyAgICBnel9zdGF0ZXAgc3RhdGU7CisKKyAgICAvKiBnZXQgaW50ZXJuYWwgc3RydWN0dXJlIGFuZCBjaGVjayBpbnRlZ3JpdHkgKi8KKyAgICBpZiAoZmlsZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisgICAgc3RhdGUgPSAoZ3pfc3RhdGVwKWZpbGU7CisgICAgaWYgKHN0YXRlLT5tb2RlICE9IEdaX1JFQUQgJiYgc3RhdGUtPm1vZGUgIT0gR1pfV1JJVEUpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIC8qIHJldHVybiBwb3NpdGlvbiAqLworICAgIHJldHVybiBzdGF0ZS0+eC5wb3MgKyAoc3RhdGUtPnNlZWsgPyBzdGF0ZS0+c2tpcCA6IDApOworfQorCisvKiAtLSBzZWUgemxpYi5oIC0tICovCit6X29mZl90IFpFWFBPUlQgZ3p0ZWxsKGZpbGUpCisgICAgZ3pGaWxlIGZpbGU7Cit7CisgICAgel9vZmY2NF90IHJldDsKKworICAgIHJldCA9IGd6dGVsbDY0KGZpbGUpOworICAgIHJldHVybiByZXQgPT0gKHpfb2ZmX3QpcmV0ID8gKHpfb2ZmX3QpcmV0IDogLTE7Cit9CisKKy8qIC0tIHNlZSB6bGliLmggLS0gKi8KK3pfb2ZmNjRfdCBaRVhQT1JUIGd6b2Zmc2V0NjQoZmlsZSkKKyAgICBnekZpbGUgZmlsZTsKK3sKKyAgICB6X29mZjY0X3Qgb2Zmc2V0OworICAgIGd6X3N0YXRlcCBzdGF0ZTsKKworICAgIC8qIGdldCBpbnRlcm5hbCBzdHJ1Y3R1cmUgYW5kIGNoZWNrIGludGVncml0eSAqLworICAgIGlmIChmaWxlID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBzdGF0ZSA9IChnel9zdGF0ZXApZmlsZTsKKyAgICBpZiAoc3RhdGUtPm1vZGUgIT0gR1pfUkVBRCAmJiBzdGF0ZS0+bW9kZSAhPSBHWl9XUklURSkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgLyogY29tcHV0ZSBhbmQgcmV0dXJuIGVmZmVjdGl2ZSBvZmZzZXQgaW4gZmlsZSAqLworICAgIG9mZnNldCA9IExTRUVLKHN0YXRlLT5mZCwgMCwgU0VFS19DVVIpOworICAgIGlmIChvZmZzZXQgPT0gLTEpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAoc3RhdGUtPm1vZGUgPT0gR1pfUkVBRCkgICAgICAgICAgICAgLyogcmVhZGluZyAqLworICAgICAgICBvZmZzZXQgLT0gc3RhdGUtPnN0cm0uYXZhaWxfaW47ICAgICAvKiBkb24ndCBjb3VudCBidWZmZXJlZCBpbnB1dCAqLworICAgIHJldHVybiBvZmZzZXQ7Cit9CisKKy8qIC0tIHNlZSB6bGliLmggLS0gKi8KK3pfb2ZmX3QgWkVYUE9SVCBnem9mZnNldChmaWxlKQorICAgIGd6RmlsZSBmaWxlOworeworICAgIHpfb2ZmNjRfdCByZXQ7CisKKyAgICByZXQgPSBnem9mZnNldDY0KGZpbGUpOworICAgIHJldHVybiByZXQgPT0gKHpfb2ZmX3QpcmV0ID8gKHpfb2ZmX3QpcmV0IDogLTE7Cit9CisKKy8qIC0tIHNlZSB6bGliLmggLS0gKi8KK2ludCBaRVhQT1JUIGd6ZW9mKGZpbGUpCisgICAgZ3pGaWxlIGZpbGU7Cit7CisgICAgZ3pfc3RhdGVwIHN0YXRlOworCisgICAgLyogZ2V0IGludGVybmFsIHN0cnVjdHVyZSBhbmQgY2hlY2sgaW50ZWdyaXR5ICovCisgICAgaWYgKGZpbGUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgc3RhdGUgPSAoZ3pfc3RhdGVwKWZpbGU7CisgICAgaWYgKHN0YXRlLT5tb2RlICE9IEdaX1JFQUQgJiYgc3RhdGUtPm1vZGUgIT0gR1pfV1JJVEUpCisgICAgICAgIHJldHVybiAwOworCisgICAgLyogcmV0dXJuIGVuZC1vZi1maWxlIHN0YXRlICovCisgICAgcmV0dXJuIHN0YXRlLT5tb2RlID09IEdaX1JFQUQgPyBzdGF0ZS0+cGFzdCA6IDA7Cit9CisKKy8qIC0tIHNlZSB6bGliLmggLS0gKi8KK2NvbnN0IGNoYXIgKiBaRVhQT1JUIGd6ZXJyb3IoZmlsZSwgZXJybnVtKQorICAgIGd6RmlsZSBmaWxlOworICAgIGludCAqZXJybnVtOworeworICAgIGd6X3N0YXRlcCBzdGF0ZTsKKworICAgIC8qIGdldCBpbnRlcm5hbCBzdHJ1Y3R1cmUgYW5kIGNoZWNrIGludGVncml0eSAqLworICAgIGlmIChmaWxlID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHN0YXRlID0gKGd6X3N0YXRlcClmaWxlOworICAgIGlmIChzdGF0ZS0+bW9kZSAhPSBHWl9SRUFEICYmIHN0YXRlLT5tb2RlICE9IEdaX1dSSVRFKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIC8qIHJldHVybiBlcnJvciBpbmZvcm1hdGlvbiAqLworICAgIGlmIChlcnJudW0gIT0gTlVMTCkKKyAgICAgICAgKmVycm51bSA9IHN0YXRlLT5lcnI7CisgICAgcmV0dXJuIHN0YXRlLT5tc2cgPT0gTlVMTCA/ICIiIDogc3RhdGUtPm1zZzsKK30KKworLyogLS0gc2VlIHpsaWIuaCAtLSAqLwordm9pZCBaRVhQT1JUIGd6Y2xlYXJlcnIoZmlsZSkKKyAgICBnekZpbGUgZmlsZTsKK3sKKyAgICBnel9zdGF0ZXAgc3RhdGU7CisKKyAgICAvKiBnZXQgaW50ZXJuYWwgc3RydWN0dXJlIGFuZCBjaGVjayBpbnRlZ3JpdHkgKi8KKyAgICBpZiAoZmlsZSA9PSBOVUxMKQorICAgICAgICByZXR1cm47CisgICAgc3RhdGUgPSAoZ3pfc3RhdGVwKWZpbGU7CisgICAgaWYgKHN0YXRlLT5tb2RlICE9IEdaX1JFQUQgJiYgc3RhdGUtPm1vZGUgIT0gR1pfV1JJVEUpCisgICAgICAgIHJldHVybjsKKworICAgIC8qIGNsZWFyIGVycm9yIGFuZCBlbmQtb2YtZmlsZSAqLworICAgIGlmIChzdGF0ZS0+bW9kZSA9PSBHWl9SRUFEKSB7CisgICAgICAgIHN0YXRlLT5lb2YgPSAwOworICAgICAgICBzdGF0ZS0+cGFzdCA9IDA7CisgICAgfQorICAgIGd6X2Vycm9yKHN0YXRlLCBaX09LLCBOVUxMKTsKK30KKworLyogQ3JlYXRlIGFuIGVycm9yIG1lc3NhZ2UgaW4gYWxsb2NhdGVkIG1lbW9yeSBhbmQgc2V0IHN0YXRlLT5lcnIgYW5kCisgICBzdGF0ZS0+bXNnIGFjY29yZGluZ2x5LiAgRnJlZSBhbnkgcHJldmlvdXMgZXJyb3IgbWVzc2FnZSBhbHJlYWR5IHRoZXJlLiAgRG8KKyAgIG5vdCB0cnkgdG8gZnJlZSBvciBhbGxvY2F0ZSBzcGFjZSBpZiB0aGUgZXJyb3IgaXMgWl9NRU1fRVJST1IgKG91dCBvZgorICAgbWVtb3J5KS4gIFNpbXBseSBzYXZlIHRoZSBlcnJvciBtZXNzYWdlIGFzIGEgc3RhdGljIHN0cmluZy4gIElmIHRoZXJlIGlzIGFuCisgICBhbGxvY2F0aW9uIGZhaWx1cmUgY29uc3RydWN0aW5nIHRoZSBlcnJvciBtZXNzYWdlLCB0aGVuIGNvbnZlcnQgdGhlIGVycm9yIHRvCisgICBvdXQgb2YgbWVtb3J5LiAqLwordm9pZCBaTElCX0lOVEVSTkFMIGd6X2Vycm9yKHN0YXRlLCBlcnIsIG1zZykKKyAgICBnel9zdGF0ZXAgc3RhdGU7CisgICAgaW50IGVycjsKKyAgICBjb25zdCBjaGFyICptc2c7Cit7CisgICAgLyogZnJlZSBwcmV2aW91c2x5IGFsbG9jYXRlZCBtZXNzYWdlIGFuZCBjbGVhciAqLworICAgIGlmIChzdGF0ZS0+bXNnICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKHN0YXRlLT5lcnIgIT0gWl9NRU1fRVJST1IpCisgICAgICAgICAgICBmcmVlKHN0YXRlLT5tc2cpOworICAgICAgICBzdGF0ZS0+bXNnID0gTlVMTDsKKyAgICB9CisKKyAgICAvKiBpZiBmYXRhbCwgc2V0IHN0YXRlLT54LmhhdmUgdG8gMCBzbyB0aGF0IHRoZSBnemdldGMoKSBtYWNybyBmYWlscyAqLworICAgIGlmIChlcnIgIT0gWl9PSyAmJiBlcnIgIT0gWl9CVUZfRVJST1IpCisgICAgICAgIHN0YXRlLT54LmhhdmUgPSAwOworCisgICAgLyogc2V0IGVycm9yIGNvZGUsIGFuZCBpZiBubyBtZXNzYWdlLCB0aGVuIGRvbmUgKi8KKyAgICBzdGF0ZS0+ZXJyID0gZXJyOworICAgIGlmIChtc2cgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOworCisgICAgLyogZm9yIGFuIG91dCBvZiBtZW1vcnkgZXJyb3IsIHNhdmUgYXMgc3RhdGljIHN0cmluZyAqLworICAgIGlmIChlcnIgPT0gWl9NRU1fRVJST1IpIHsKKyAgICAgICAgc3RhdGUtPm1zZyA9IChjaGFyICopbXNnOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyogY29uc3RydWN0IGVycm9yIG1lc3NhZ2Ugd2l0aCBwYXRoICovCisgICAgaWYgKChzdGF0ZS0+bXNnID0gbWFsbG9jKHN0cmxlbihzdGF0ZS0+cGF0aCkgKyBzdHJsZW4obXNnKSArIDMpKSA9PSBOVUxMKSB7CisgICAgICAgIHN0YXRlLT5lcnIgPSBaX01FTV9FUlJPUjsKKyAgICAgICAgc3RhdGUtPm1zZyA9IChjaGFyICopIm91dCBvZiBtZW1vcnkiOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHN0cmNweShzdGF0ZS0+bXNnLCBzdGF0ZS0+cGF0aCk7CisgICAgc3RyY2F0KHN0YXRlLT5tc2csICI6ICIpOworICAgIHN0cmNhdChzdGF0ZS0+bXNnLCBtc2cpOworICAgIHJldHVybjsKK30KKworI2lmbmRlZiBJTlRfTUFYCisvKiBwb3J0YWJseSByZXR1cm4gbWF4aW11bSB2YWx1ZSBmb3IgYW4gaW50ICh3aGVuIGxpbWl0cy5oIHByZXN1bWVkIG5vdAorICAgYXZhaWxhYmxlKSAtLSB3ZSBuZWVkIHRvIGRvIHRoaXMgdG8gY292ZXIgY2FzZXMgd2hlcmUgMidzIGNvbXBsZW1lbnQgbm90CisgICB1c2VkLCBzaW5jZSBDIHN0YW5kYXJkIHBlcm1pdHMgMSdzIGNvbXBsZW1lbnQgYW5kIHNpZ24tYml0IHJlcHJlc2VudGF0aW9ucywKKyAgIG90aGVyd2lzZSB3ZSBjb3VsZCBqdXN0IHVzZSAoKHVuc2lnbmVkKS0xKSA+PiAxICovCit1bnNpZ25lZCBaTElCX0lOVEVSTkFMIGd6X2ludG1heCgpCit7CisgICAgdW5zaWduZWQgcCwgcTsKKworICAgIHAgPSAxOworICAgIGRvIHsKKyAgICAgICAgcSA9IHA7CisgICAgICAgIHAgPDw9IDE7CisgICAgICAgIHArKzsKKyAgICB9IHdoaWxlIChwID4gcSk7CisgICAgcmV0dXJuIHEgPj4gMTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvemxpYi0xLjIuNi9nenJlYWQuYyBiL3psaWItMS4yLjYvZ3pyZWFkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZkNDBlMAotLS0gL2Rldi9udWxsCisrKyBiL3psaWItMS4yLjYvZ3pyZWFkLmMKQEAgLTAsMCArMSw1ODQgQEAKKy8qIGd6cmVhZC5jIC0tIHpsaWIgZnVuY3Rpb25zIGZvciByZWFkaW5nIGd6aXAgZmlsZXMKKyAqIENvcHlyaWdodCAoQykgMjAwNCwgMjAwNSwgMjAxMCwgMjAxMSBNYXJrIEFkbGVyCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCisgKi8KKworI2luY2x1ZGUgImd6Z3V0cy5oIgorCisvKiBMb2NhbCBmdW5jdGlvbnMgKi8KK2xvY2FsIGludCBnel9sb2FkIE9GKChnel9zdGF0ZXAsIHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQsIHVuc2lnbmVkICopKTsKK2xvY2FsIGludCBnel9hdmFpbCBPRigoZ3pfc3RhdGVwKSk7Citsb2NhbCBpbnQgZ3pfbG9vayBPRigoZ3pfc3RhdGVwKSk7Citsb2NhbCBpbnQgZ3pfZGVjb21wIE9GKChnel9zdGF0ZXApKTsKK2xvY2FsIGludCBnel9mZXRjaCBPRigoZ3pfc3RhdGVwKSk7Citsb2NhbCBpbnQgZ3pfc2tpcCBPRigoZ3pfc3RhdGVwLCB6X29mZjY0X3QpKTsKKworLyogVXNlIHJlYWQoKSB0byBsb2FkIGEgYnVmZmVyIC0tIHJldHVybiAtMSBvbiBlcnJvciwgb3RoZXJ3aXNlIDAuICBSZWFkIGZyb20KKyAgIHN0YXRlLT5mZCwgYW5kIHVwZGF0ZSBzdGF0ZS0+ZW9mLCBzdGF0ZS0+ZXJyLCBhbmQgc3RhdGUtPm1zZyBhcyBhcHByb3ByaWF0ZS4KKyAgIFRoaXMgZnVuY3Rpb24gbmVlZHMgdG8gbG9vcCBvbiByZWFkKCksIHNpbmNlIHJlYWQoKSBpcyBub3QgZ3VhcmFudGVlZCB0bworICAgcmVhZCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlcXVlc3RlZCwgZGVwZW5kaW5nIG9uIHRoZSB0eXBlIG9mIGRlc2NyaXB0b3IuICovCitsb2NhbCBpbnQgZ3pfbG9hZChzdGF0ZSwgYnVmLCBsZW4sIGhhdmUpCisgICAgZ3pfc3RhdGVwIHN0YXRlOworICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZjsKKyAgICB1bnNpZ25lZCBsZW47CisgICAgdW5zaWduZWQgKmhhdmU7Cit7CisgICAgaW50IHJldDsKKworICAgICpoYXZlID0gMDsKKyAgICBkbyB7CisgICAgICAgIHJldCA9IHJlYWQoc3RhdGUtPmZkLCBidWYgKyAqaGF2ZSwgbGVuIC0gKmhhdmUpOworICAgICAgICBpZiAocmV0IDw9IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgKmhhdmUgKz0gcmV0OworICAgIH0gd2hpbGUgKCpoYXZlIDwgbGVuKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBnel9lcnJvcihzdGF0ZSwgWl9FUlJOTywgenN0cmVycm9yKCkpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChyZXQgPT0gMCkKKyAgICAgICAgc3RhdGUtPmVvZiA9IDE7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qIExvYWQgdXAgaW5wdXQgYnVmZmVyIGFuZCBzZXQgZW9mIGZsYWcgaWYgbGFzdCBkYXRhIGxvYWRlZCAtLSByZXR1cm4gLTEgb24KKyAgIGVycm9yLCAwIG90aGVyd2lzZS4gIE5vdGUgdGhhdCB0aGUgZW9mIGZsYWcgaXMgc2V0IHdoZW4gdGhlIGVuZCBvZiB0aGUgaW5wdXQKKyAgIGZpbGUgaXMgcmVhY2hlZCwgZXZlbiB0aG91Z2ggdGhlcmUgbWF5IGJlIHVudXNlZCBkYXRhIGluIHRoZSBidWZmZXIuICBPbmNlCisgICB0aGF0IGRhdGEgaGFzIGJlZW4gdXNlZCwgbm8gbW9yZSBhdHRlbXB0cyB3aWxsIGJlIG1hZGUgdG8gcmVhZCB0aGUgZmlsZS4KKyAgIElmIHN0cm0tPmF2YWlsX2luICE9IDAsIHRoZW4gdGhlIGN1cnJlbnQgZGF0YSBpcyBtb3ZlZCB0byB0aGUgYmVnaW5uaW5nIG9mCisgICB0aGUgaW5wdXQgYnVmZmVyLCBhbmQgdGhlbiB0aGUgcmVtYWluZGVyIG9mIHRoZSBidWZmZXIgaXMgbG9hZGVkIHdpdGggdGhlCisgICBhdmFpbGFibGUgZGF0YSBmcm9tIHRoZSBpbnB1dCBmaWxlLiAqLworbG9jYWwgaW50IGd6X2F2YWlsKHN0YXRlKQorICAgIGd6X3N0YXRlcCBzdGF0ZTsKK3sKKyAgICB1bnNpZ25lZCBnb3Q7CisgICAgel9zdHJlYW1wIHN0cm0gPSAmKHN0YXRlLT5zdHJtKTsKKworICAgIGlmIChzdGF0ZS0+ZXJyICE9IFpfT0sgJiYgc3RhdGUtPmVyciAhPSBaX0JVRl9FUlJPUikKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmIChzdGF0ZS0+ZW9mID09IDApIHsKKyAgICAgICAgaWYgKHN0cm0tPmF2YWlsX2luKQorICAgICAgICAgICAgbWVtbW92ZShzdGF0ZS0+aW4sIHN0cm0tPm5leHRfaW4sIHN0cm0tPmF2YWlsX2luKTsKKyAgICAgICAgaWYgKGd6X2xvYWQoc3RhdGUsIHN0YXRlLT5pbiArIHN0cm0tPmF2YWlsX2luLAorICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+c2l6ZSAtIHN0cm0tPmF2YWlsX2luLCAmZ290KSA9PSAtMSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgc3RybS0+YXZhaWxfaW4gKz0gZ290OworICAgICAgICBzdHJtLT5uZXh0X2luID0gc3RhdGUtPmluOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLyogTG9vayBmb3IgZ3ppcCBoZWFkZXIsIHNldCB1cCBmb3IgaW5mbGF0ZSBvciBjb3B5LiAgc3RhdGUtPnguaGF2ZSBtdXN0IGJlIDAuCisgICBJZiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIGluLCBhbGxvY2F0ZSByZXF1aXJlZCBtZW1vcnkuICBzdGF0ZS0+aG93IHdpbGwgYmUKKyAgIGxlZnQgdW5jaGFuZ2VkIGlmIHRoZXJlIGlzIG5vIG1vcmUgaW5wdXQgZGF0YSBhdmFpbGFibGUsIHdpbGwgYmUgc2V0IHRvIENPUFkKKyAgIGlmIHRoZXJlIGlzIG5vIGd6aXAgaGVhZGVyIGFuZCBkaXJlY3QgY29weWluZyB3aWxsIGJlIHBlcmZvcm1lZCwgb3IgaXQgd2lsbAorICAgYmUgc2V0IHRvIEdaSVAgZm9yIGRlY29tcHJlc3Npb24uICBJZiBkaXJlY3QgY29weWluZywgdGhlbiBsZWZ0b3ZlciBpbnB1dAorICAgZGF0YSBmcm9tIHRoZSBpbnB1dCBidWZmZXIgd2lsbCBiZSBjb3BpZWQgdG8gdGhlIG91dHB1dCBidWZmZXIuICBJbiB0aGF0CisgICBjYXNlLCBhbGwgZnVydGhlciBmaWxlIHJlYWRzIHdpbGwgYmUgZGlyZWN0bHkgdG8gZWl0aGVyIHRoZSBvdXRwdXQgYnVmZmVyIG9yCisgICBhIHVzZXIgYnVmZmVyLiAgSWYgZGVjb21wcmVzc2luZywgdGhlIGluZmxhdGUgc3RhdGUgd2lsbCBiZSBpbml0aWFsaXplZC4KKyAgIGd6X2xvb2soKSB3aWxsIHJldHVybiAwIG9uIHN1Y2Nlc3Mgb3IgLTEgb24gZmFpbHVyZS4gKi8KK2xvY2FsIGludCBnel9sb29rKHN0YXRlKQorICAgIGd6X3N0YXRlcCBzdGF0ZTsKK3sKKyAgICB6X3N0cmVhbXAgc3RybSA9ICYoc3RhdGUtPnN0cm0pOworCisgICAgLyogYWxsb2NhdGUgcmVhZCBidWZmZXJzIGFuZCBpbmZsYXRlIG1lbW9yeSAqLworICAgIGlmIChzdGF0ZS0+c2l6ZSA9PSAwKSB7CisgICAgICAgIC8qIGFsbG9jYXRlIGJ1ZmZlcnMgKi8KKyAgICAgICAgc3RhdGUtPmluID0gbWFsbG9jKHN0YXRlLT53YW50KTsKKyAgICAgICAgc3RhdGUtPm91dCA9IG1hbGxvYyhzdGF0ZS0+d2FudCA8PCAxKTsKKyAgICAgICAgaWYgKHN0YXRlLT5pbiA9PSBOVUxMIHx8IHN0YXRlLT5vdXQgPT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKHN0YXRlLT5vdXQgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICBmcmVlKHN0YXRlLT5vdXQpOworICAgICAgICAgICAgaWYgKHN0YXRlLT5pbiAhPSBOVUxMKQorICAgICAgICAgICAgICAgIGZyZWUoc3RhdGUtPmluKTsKKyAgICAgICAgICAgIGd6X2Vycm9yKHN0YXRlLCBaX01FTV9FUlJPUiwgIm91dCBvZiBtZW1vcnkiKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBzdGF0ZS0+c2l6ZSA9IHN0YXRlLT53YW50OworCisgICAgICAgIC8qIGFsbG9jYXRlIGluZmxhdGUgbWVtb3J5ICovCisgICAgICAgIHN0YXRlLT5zdHJtLnphbGxvYyA9IFpfTlVMTDsKKyAgICAgICAgc3RhdGUtPnN0cm0uemZyZWUgPSBaX05VTEw7CisgICAgICAgIHN0YXRlLT5zdHJtLm9wYXF1ZSA9IFpfTlVMTDsKKyAgICAgICAgc3RhdGUtPnN0cm0uYXZhaWxfaW4gPSAwOworICAgICAgICBzdGF0ZS0+c3RybS5uZXh0X2luID0gWl9OVUxMOworICAgICAgICBpZiAoaW5mbGF0ZUluaXQyKCYoc3RhdGUtPnN0cm0pLCAxNSArIDE2KSAhPSBaX09LKSB7ICAgIC8qIGd1bnppcCAqLworICAgICAgICAgICAgZnJlZShzdGF0ZS0+b3V0KTsKKyAgICAgICAgICAgIGZyZWUoc3RhdGUtPmluKTsKKyAgICAgICAgICAgIHN0YXRlLT5zaXplID0gMDsKKyAgICAgICAgICAgIGd6X2Vycm9yKHN0YXRlLCBaX01FTV9FUlJPUiwgIm91dCBvZiBtZW1vcnkiKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGdldCBhdCBsZWFzdCB0aGUgbWFnaWMgYnl0ZXMgaW4gdGhlIGlucHV0IGJ1ZmZlciAqLworICAgIGlmIChzdHJtLT5hdmFpbF9pbiA8IDIpIHsKKyAgICAgICAgaWYgKGd6X2F2YWlsKHN0YXRlKSA9PSAtMSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgaWYgKHN0cm0tPmF2YWlsX2luID09IDApCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKiBsb29rIGZvciBnemlwIG1hZ2ljIGJ5dGVzIC0tIGlmIHRoZXJlLCBkbyBnemlwIGRlY29kaW5nIChub3RlOiB0aGVyZSBpcworICAgICAgIGEgbG9naWNhbCBkaWxlbW1hIGhlcmUgd2hlbiBjb25zaWRlcmluZyB0aGUgY2FzZSBvZiBhIHBhcnRpYWxseSB3cml0dGVuCisgICAgICAgZ3ppcCBmaWxlLCB0byB3aXQsIGlmIGEgc2luZ2xlIDMxIGJ5dGUgaXMgd3JpdHRlbiwgdGhlbiB3ZSBjYW5ub3QgdGVsbAorICAgICAgIHdoZXRoZXIgdGhpcyBpcyBhIHNpbmdsZS1ieXRlIGZpbGUsIG9yIGp1c3QgYSBwYXJ0aWFsbHkgd3JpdHRlbiBnemlwCisgICAgICAgZmlsZSAtLSBmb3IgaGVyZSB3ZSBhc3N1bWUgdGhhdCBpZiBhIGd6aXAgZmlsZSBpcyBiZWluZyB3cml0dGVuLCB0aGVuCisgICAgICAgdGhlIGhlYWRlciB3aWxsIGJlIHdyaXR0ZW4gaW4gYSBzaW5nbGUgb3BlcmF0aW9uLCBzbyB0aGF0IHJlYWRpbmcgYQorICAgICAgIHNpbmdsZSBieXRlIGlzIHN1ZmZpY2llbnQgaW5kaWNhdGlvbiB0aGF0IGl0IGlzIG5vdCBhIGd6aXAgZmlsZSkgKi8KKyAgICBpZiAoc3RybS0+YXZhaWxfaW4gPiAxICYmCisgICAgICAgICAgICBzdHJtLT5uZXh0X2luWzBdID09IDMxICYmIHN0cm0tPm5leHRfaW5bMV0gPT0gMTM5KSB7CisgICAgICAgIGluZmxhdGVSZXNldChzdHJtKTsKKyAgICAgICAgc3RhdGUtPmhvdyA9IEdaSVA7CisgICAgICAgIHN0YXRlLT5kaXJlY3QgPSAwOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKiBubyBnemlwIGhlYWRlciAtLSBpZiB3ZSB3ZXJlIGRlY29kaW5nIGd6aXAgYmVmb3JlLCB0aGVuIHRoaXMgaXMgdHJhaWxpbmcKKyAgICAgICBnYXJiYWdlLiAgSWdub3JlIHRoZSB0cmFpbGluZyBnYXJiYWdlIGFuZCBmaW5pc2guICovCisgICAgaWYgKHN0YXRlLT5kaXJlY3QgPT0gMCkgeworICAgICAgICBzdHJtLT5hdmFpbF9pbiA9IDA7CisgICAgICAgIHN0YXRlLT5lb2YgPSAxOworICAgICAgICBzdGF0ZS0+eC5oYXZlID0gMDsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLyogZG9pbmcgcmF3IGkvbywgY29weSBhbnkgbGVmdG92ZXIgaW5wdXQgdG8gb3V0cHV0IC0tIHRoaXMgYXNzdW1lcyB0aGF0CisgICAgICAgdGhlIG91dHB1dCBidWZmZXIgaXMgbGFyZ2VyIHRoYW4gdGhlIGlucHV0IGJ1ZmZlciwgd2hpY2ggYWxzbyBhc3N1cmVzCisgICAgICAgc3BhY2UgZm9yIGd6dW5nZXRjKCkgKi8KKyAgICBzdGF0ZS0+eC5uZXh0ID0gc3RhdGUtPm91dDsKKyAgICBpZiAoc3RybS0+YXZhaWxfaW4pIHsKKyAgICAgICAgbWVtY3B5KHN0YXRlLT54Lm5leHQsIHN0cm0tPm5leHRfaW4sIHN0cm0tPmF2YWlsX2luKTsKKyAgICAgICAgc3RhdGUtPnguaGF2ZSA9IHN0cm0tPmF2YWlsX2luOworICAgICAgICBzdHJtLT5hdmFpbF9pbiA9IDA7CisgICAgfQorICAgIHN0YXRlLT5ob3cgPSBDT1BZOworICAgIHN0YXRlLT5kaXJlY3QgPSAxOworICAgIHJldHVybiAwOworfQorCisvKiBEZWNvbXByZXNzIGZyb20gaW5wdXQgdG8gdGhlIHByb3ZpZGVkIG5leHRfb3V0IGFuZCBhdmFpbF9vdXQgaW4gdGhlIHN0YXRlLgorICAgT24gcmV0dXJuLCBzdGF0ZS0+eC5oYXZlIGFuZCBzdGF0ZS0+eC5uZXh0IHBvaW50IHRvIHRoZSBqdXN0IGRlY29tcHJlc3NlZAorICAgZGF0YS4gIElmIHRoZSBnemlwIHN0cmVhbSBjb21wbGV0ZXMsIHN0YXRlLT5ob3cgaXMgcmVzZXQgdG8gTE9PSyB0byBsb29rIGZvcgorICAgdGhlIG5leHQgZ3ppcCBzdHJlYW0gb3IgcmF3IGRhdGEsIG9uY2Ugc3RhdGUtPnguaGF2ZSBpcyBkZXBsZXRlZC4gIFJldHVybnMgMAorICAgb24gc3VjY2VzcywgLTEgb24gZmFpbHVyZS4gKi8KK2xvY2FsIGludCBnel9kZWNvbXAoc3RhdGUpCisgICAgZ3pfc3RhdGVwIHN0YXRlOworeworICAgIGludCByZXQgPSBaX09LOworICAgIHVuc2lnbmVkIGhhZDsKKyAgICB6X3N0cmVhbXAgc3RybSA9ICYoc3RhdGUtPnN0cm0pOworCisgICAgLyogZmlsbCBvdXRwdXQgYnVmZmVyIHVwIHRvIGVuZCBvZiBkZWZsYXRlIHN0cmVhbSAqLworICAgIGhhZCA9IHN0cm0tPmF2YWlsX291dDsKKyAgICBkbyB7CisgICAgICAgIC8qIGdldCBtb3JlIGlucHV0IGZvciBpbmZsYXRlKCkgKi8KKyAgICAgICAgaWYgKHN0cm0tPmF2YWlsX2luID09IDAgJiYgZ3pfYXZhaWwoc3RhdGUpID09IC0xKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBpZiAoc3RybS0+YXZhaWxfaW4gPT0gMCkgeworICAgICAgICAgICAgZ3pfZXJyb3Ioc3RhdGUsIFpfQlVGX0VSUk9SLCAidW5leHBlY3RlZCBlbmQgb2YgZmlsZSIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvKiBkZWNvbXByZXNzIGFuZCBoYW5kbGUgZXJyb3JzICovCisgICAgICAgIHJldCA9IGluZmxhdGUoc3RybSwgWl9OT19GTFVTSCk7CisgICAgICAgIGlmIChyZXQgPT0gWl9TVFJFQU1fRVJST1IgfHwgcmV0ID09IFpfTkVFRF9ESUNUKSB7CisgICAgICAgICAgICBnel9lcnJvcihzdGF0ZSwgWl9TVFJFQU1fRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAiaW50ZXJuYWwgZXJyb3I6IGluZmxhdGUgc3RyZWFtIGNvcnJ1cHQiKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBpZiAocmV0ID09IFpfTUVNX0VSUk9SKSB7CisgICAgICAgICAgICBnel9lcnJvcihzdGF0ZSwgWl9NRU1fRVJST1IsICJvdXQgb2YgbWVtb3J5Iik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJldCA9PSBaX0RBVEFfRVJST1IpIHsgICAgICAgICAgICAgIC8qIGRlZmxhdGUgc3RyZWFtIGludmFsaWQgKi8KKyAgICAgICAgICAgIGd6X2Vycm9yKHN0YXRlLCBaX0RBVEFfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPT0gTlVMTCA/ICJjb21wcmVzc2VkIGRhdGEgZXJyb3IiIDogc3RybS0+bXNnKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0gd2hpbGUgKHN0cm0tPmF2YWlsX291dCAmJiByZXQgIT0gWl9TVFJFQU1fRU5EKTsKKworICAgIC8qIHVwZGF0ZSBhdmFpbGFibGUgb3V0cHV0ICovCisgICAgc3RhdGUtPnguaGF2ZSA9IGhhZCAtIHN0cm0tPmF2YWlsX291dDsKKyAgICBzdGF0ZS0+eC5uZXh0ID0gc3RybS0+bmV4dF9vdXQgLSBzdGF0ZS0+eC5oYXZlOworCisgICAgLyogaWYgdGhlIGd6aXAgc3RyZWFtIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHksIGxvb2sgZm9yIGFub3RoZXIgKi8KKyAgICBpZiAocmV0ID09IFpfU1RSRUFNX0VORCkKKyAgICAgICAgc3RhdGUtPmhvdyA9IExPT0s7CisKKyAgICAvKiBnb29kIGRlY29tcHJlc3Npb24gKi8KKyAgICByZXR1cm4gMDsKK30KKworLyogRmV0Y2ggZGF0YSBhbmQgcHV0IGl0IGluIHRoZSBvdXRwdXQgYnVmZmVyLiAgQXNzdW1lcyBzdGF0ZS0+eC5oYXZlIGlzIDAuCisgICBEYXRhIGlzIGVpdGhlciBjb3BpZWQgZnJvbSB0aGUgaW5wdXQgZmlsZSBvciBkZWNvbXByZXNzZWQgZnJvbSB0aGUgaW5wdXQKKyAgIGZpbGUgZGVwZW5kaW5nIG9uIHN0YXRlLT5ob3cuICBJZiBzdGF0ZS0+aG93IGlzIExPT0ssIHRoZW4gYSBnemlwIGhlYWRlciBpcworICAgbG9va2VkIGZvciB0byBkZXRlcm1pbmUgd2hldGhlciB0byBjb3B5IG9yIGRlY29tcHJlc3MuICBSZXR1cm5zIC0xIG9uIGVycm9yLAorICAgb3RoZXJ3aXNlIDAuICBnel9mZXRjaCgpIHdpbGwgbGVhdmUgc3RhdGUtPmhvdyBhcyBDT1BZIG9yIEdaSVAgdW5sZXNzIHRoZQorICAgZW5kIG9mIHRoZSBpbnB1dCBmaWxlIGhhcyBiZWVuIHJlYWNoZWQgYW5kIGFsbCBkYXRhIGhhcyBiZWVuIHByb2Nlc3NlZC4gICovCitsb2NhbCBpbnQgZ3pfZmV0Y2goc3RhdGUpCisgICAgZ3pfc3RhdGVwIHN0YXRlOworeworICAgIHpfc3RyZWFtcCBzdHJtID0gJihzdGF0ZS0+c3RybSk7CisKKyAgICBkbyB7CisgICAgICAgIHN3aXRjaChzdGF0ZS0+aG93KSB7CisgICAgICAgIGNhc2UgTE9PSzogICAgICAvKiAtPiBMT09LLCBDT1BZIChvbmx5IGlmIG5ldmVyIEdaSVApLCBvciBHWklQICovCisgICAgICAgICAgICBpZiAoZ3pfbG9vayhzdGF0ZSkgPT0gLTEpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgaWYgKHN0YXRlLT5ob3cgPT0gTE9PSykKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENPUFk6ICAgICAgLyogLT4gQ09QWSAqLworICAgICAgICAgICAgaWYgKGd6X2xvYWQoc3RhdGUsIHN0YXRlLT5vdXQsIHN0YXRlLT5zaXplIDw8IDEsICYoc3RhdGUtPnguaGF2ZSkpCisgICAgICAgICAgICAgICAgICAgID09IC0xKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIHN0YXRlLT54Lm5leHQgPSBzdGF0ZS0+b3V0OworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGNhc2UgR1pJUDogICAgICAvKiAtPiBHWklQIG9yIExPT0sgKGlmIGVuZCBvZiBnemlwIHN0cmVhbSkgKi8KKyAgICAgICAgICAgIHN0cm0tPmF2YWlsX291dCA9IHN0YXRlLT5zaXplIDw8IDE7CisgICAgICAgICAgICBzdHJtLT5uZXh0X291dCA9IHN0YXRlLT5vdXQ7CisgICAgICAgICAgICBpZiAoZ3pfZGVjb21wKHN0YXRlKSA9PSAtMSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9IHdoaWxlIChzdGF0ZS0+eC5oYXZlID09IDAgJiYgKCFzdGF0ZS0+ZW9mIHx8IHN0cm0tPmF2YWlsX2luKSk7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qIFNraXAgbGVuIHVuY29tcHJlc3NlZCBieXRlcyBvZiBvdXRwdXQuICBSZXR1cm4gLTEgb24gZXJyb3IsIDAgb24gc3VjY2Vzcy4gKi8KK2xvY2FsIGludCBnel9za2lwKHN0YXRlLCBsZW4pCisgICAgZ3pfc3RhdGVwIHN0YXRlOworICAgIHpfb2ZmNjRfdCBsZW47Cit7CisgICAgdW5zaWduZWQgbjsKKworICAgIC8qIHNraXAgb3ZlciBsZW4gYnl0ZXMgb3IgcmVhY2ggZW5kLW9mLWZpbGUsIHdoaWNoZXZlciBjb21lcyBmaXJzdCAqLworICAgIHdoaWxlIChsZW4pCisgICAgICAgIC8qIHNraXAgb3ZlciB3aGF0ZXZlciBpcyBpbiBvdXRwdXQgYnVmZmVyICovCisgICAgICAgIGlmIChzdGF0ZS0+eC5oYXZlKSB7CisgICAgICAgICAgICBuID0gR1RfT0ZGKHN0YXRlLT54LmhhdmUpIHx8ICh6X29mZjY0X3Qpc3RhdGUtPnguaGF2ZSA+IGxlbiA/CisgICAgICAgICAgICAgICAgKHVuc2lnbmVkKWxlbiA6IHN0YXRlLT54LmhhdmU7CisgICAgICAgICAgICBzdGF0ZS0+eC5oYXZlIC09IG47CisgICAgICAgICAgICBzdGF0ZS0+eC5uZXh0ICs9IG47CisgICAgICAgICAgICBzdGF0ZS0+eC5wb3MgKz0gbjsKKyAgICAgICAgICAgIGxlbiAtPSBuOworICAgICAgICB9CisKKyAgICAgICAgLyogb3V0cHV0IGJ1ZmZlciBlbXB0eSAtLSByZXR1cm4gaWYgd2UncmUgYXQgdGhlIGVuZCBvZiB0aGUgaW5wdXQgKi8KKyAgICAgICAgZWxzZSBpZiAoc3RhdGUtPmVvZiAmJiBzdGF0ZS0+c3RybS5hdmFpbF9pbiA9PSAwKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLyogbmVlZCBtb3JlIGRhdGEgdG8gc2tpcCAtLSBsb2FkIHVwIG91dHB1dCBidWZmZXIgKi8KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvKiBnZXQgbW9yZSBvdXRwdXQsIGxvb2tpbmcgZm9yIGhlYWRlciBpZiByZXF1aXJlZCAqLworICAgICAgICAgICAgaWYgKGd6X2ZldGNoKHN0YXRlKSA9PSAtMSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLyogLS0gc2VlIHpsaWIuaCAtLSAqLworaW50IFpFWFBPUlQgZ3pyZWFkKGZpbGUsIGJ1ZiwgbGVuKQorICAgIGd6RmlsZSBmaWxlOworICAgIHZvaWRwIGJ1ZjsKKyAgICB1bnNpZ25lZCBsZW47Cit7CisgICAgdW5zaWduZWQgZ290LCBuOworICAgIGd6X3N0YXRlcCBzdGF0ZTsKKyAgICB6X3N0cmVhbXAgc3RybTsKKworICAgIC8qIGdldCBpbnRlcm5hbCBzdHJ1Y3R1cmUgKi8KKyAgICBpZiAoZmlsZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisgICAgc3RhdGUgPSAoZ3pfc3RhdGVwKWZpbGU7CisgICAgc3RybSA9ICYoc3RhdGUtPnN0cm0pOworCisgICAgLyogY2hlY2sgdGhhdCB3ZSdyZSByZWFkaW5nIGFuZCB0aGF0IHRoZXJlJ3Mgbm8gKHNlcmlvdXMpIGVycm9yICovCisgICAgaWYgKHN0YXRlLT5tb2RlICE9IEdaX1JFQUQgfHwKKyAgICAgICAgICAgIChzdGF0ZS0+ZXJyICE9IFpfT0sgJiYgc3RhdGUtPmVyciAhPSBaX0JVRl9FUlJPUikpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIC8qIHNpbmNlIGFuIGludCBpcyByZXR1cm5lZCwgbWFrZSBzdXJlIGxlbiBmaXRzIGluIG9uZSwgb3RoZXJ3aXNlIHJldHVybgorICAgICAgIHdpdGggYW4gZXJyb3IgKHRoaXMgYXZvaWRzIHRoZSBmbGF3IGluIHRoZSBpbnRlcmZhY2UpICovCisgICAgaWYgKChpbnQpbGVuIDwgMCkgeworICAgICAgICBnel9lcnJvcihzdGF0ZSwgWl9EQVRBX0VSUk9SLCAicmVxdWVzdGVkIGxlbmd0aCBkb2VzIG5vdCBmaXQgaW4gaW50Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvKiBpZiBsZW4gaXMgemVybywgYXZvaWQgdW5uZWNlc3Nhcnkgb3BlcmF0aW9ucyAqLworICAgIGlmIChsZW4gPT0gMCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICAvKiBwcm9jZXNzIGEgc2tpcCByZXF1ZXN0ICovCisgICAgaWYgKHN0YXRlLT5zZWVrKSB7CisgICAgICAgIHN0YXRlLT5zZWVrID0gMDsKKyAgICAgICAgaWYgKGd6X3NraXAoc3RhdGUsIHN0YXRlLT5za2lwKSA9PSAtMSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvKiBnZXQgbGVuIGJ5dGVzIHRvIGJ1Ziwgb3IgbGVzcyB0aGFuIGxlbiBpZiBhdCB0aGUgZW5kICovCisgICAgZ290ID0gMDsKKyAgICBkbyB7CisgICAgICAgIC8qIGZpcnN0IGp1c3QgdHJ5IGNvcHlpbmcgZGF0YSBmcm9tIHRoZSBvdXRwdXQgYnVmZmVyICovCisgICAgICAgIGlmIChzdGF0ZS0+eC5oYXZlKSB7CisgICAgICAgICAgICBuID0gc3RhdGUtPnguaGF2ZSA+IGxlbiA/IGxlbiA6IHN0YXRlLT54LmhhdmU7CisgICAgICAgICAgICBtZW1jcHkoYnVmLCBzdGF0ZS0+eC5uZXh0LCBuKTsKKyAgICAgICAgICAgIHN0YXRlLT54Lm5leHQgKz0gbjsKKyAgICAgICAgICAgIHN0YXRlLT54LmhhdmUgLT0gbjsKKyAgICAgICAgfQorCisgICAgICAgIC8qIG91dHB1dCBidWZmZXIgZW1wdHkgLS0gcmV0dXJuIGlmIHdlJ3JlIGF0IHRoZSBlbmQgb2YgdGhlIGlucHV0ICovCisgICAgICAgIGVsc2UgaWYgKHN0YXRlLT5lb2YgJiYgc3RybS0+YXZhaWxfaW4gPT0gMCkgeworICAgICAgICAgICAgc3RhdGUtPnBhc3QgPSAxOyAgICAgICAgLyogdHJpZWQgdG8gcmVhZCBwYXN0IGVuZCAqLworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvKiBuZWVkIG91dHB1dCBkYXRhIC0tIGZvciBzbWFsbCBsZW4gb3IgbmV3IHN0cmVhbSBsb2FkIHVwIG91ciBvdXRwdXQKKyAgICAgICAgICAgYnVmZmVyICovCisgICAgICAgIGVsc2UgaWYgKHN0YXRlLT5ob3cgPT0gTE9PSyB8fCBsZW4gPCAoc3RhdGUtPnNpemUgPDwgMSkpIHsKKyAgICAgICAgICAgIC8qIGdldCBtb3JlIG91dHB1dCwgbG9va2luZyBmb3IgaGVhZGVyIGlmIHJlcXVpcmVkICovCisgICAgICAgICAgICBpZiAoZ3pfZmV0Y2goc3RhdGUpID09IC0xKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIGNvbnRpbnVlOyAgICAgICAvKiBubyBwcm9ncmVzcyB5ZXQgLS0gZ28gYmFjayB0byBtZW1jcHkoKSBhYm92ZSAqLworICAgICAgICAgICAgLyogdGhlIGNvcHkgYWJvdmUgYXNzdXJlcyB0aGF0IHdlIHdpbGwgbGVhdmUgd2l0aCBzcGFjZSBpbiB0aGUKKyAgICAgICAgICAgICAgIG91dHB1dCBidWZmZXIsIGFsbG93aW5nIGF0IGxlYXN0IG9uZSBnenVuZ2V0YygpIHRvIHN1Y2NlZWQgKi8KKyAgICAgICAgfQorCisgICAgICAgIC8qIGxhcmdlIGxlbiAtLSByZWFkIGRpcmVjdGx5IGludG8gdXNlciBidWZmZXIgKi8KKyAgICAgICAgZWxzZSBpZiAoc3RhdGUtPmhvdyA9PSBDT1BZKSB7ICAgICAgLyogcmVhZCBkaXJlY3RseSAqLworICAgICAgICAgICAgaWYgKGd6X2xvYWQoc3RhdGUsIGJ1ZiwgbGVuLCAmbikgPT0gLTEpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgLyogbGFyZ2UgbGVuIC0tIGRlY29tcHJlc3MgZGlyZWN0bHkgaW50byB1c2VyIGJ1ZmZlciAqLworICAgICAgICBlbHNlIHsgIC8qIHN0YXRlLT5ob3cgPT0gR1pJUCAqLworICAgICAgICAgICAgc3RybS0+YXZhaWxfb3V0ID0gbGVuOworICAgICAgICAgICAgc3RybS0+bmV4dF9vdXQgPSBidWY7CisgICAgICAgICAgICBpZiAoZ3pfZGVjb21wKHN0YXRlKSA9PSAtMSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICBuID0gc3RhdGUtPnguaGF2ZTsKKyAgICAgICAgICAgIHN0YXRlLT54LmhhdmUgPSAwOworICAgICAgICB9CisKKyAgICAgICAgLyogdXBkYXRlIHByb2dyZXNzICovCisgICAgICAgIGxlbiAtPSBuOworICAgICAgICBidWYgPSAoY2hhciAqKWJ1ZiArIG47CisgICAgICAgIGdvdCArPSBuOworICAgICAgICBzdGF0ZS0+eC5wb3MgKz0gbjsKKyAgICB9IHdoaWxlIChsZW4pOworCisgICAgLyogcmV0dXJuIG51bWJlciBvZiBieXRlcyByZWFkIGludG8gdXNlciBidWZmZXIgKHdpbGwgZml0IGluIGludCkgKi8KKyAgICByZXR1cm4gKGludClnb3Q7Cit9CisKKy8qIC0tIHNlZSB6bGliLmggLS0gKi8KK2ludCBaRVhQT1JUIGd6Z2V0Y18oZmlsZSkKKyAgICBnekZpbGUgZmlsZTsKK3sKKyAgICBpbnQgcmV0OworICAgIHVuc2lnbmVkIGNoYXIgYnVmWzFdOworICAgIGd6X3N0YXRlcCBzdGF0ZTsKKworICAgIC8qIGdldCBpbnRlcm5hbCBzdHJ1Y3R1cmUgKi8KKyAgICBpZiAoZmlsZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisgICAgc3RhdGUgPSAoZ3pfc3RhdGVwKWZpbGU7CisKKyAgICAvKiBjaGVjayB0aGF0IHdlJ3JlIHJlYWRpbmcgYW5kIHRoYXQgdGhlcmUncyBubyAoc2VyaW91cykgZXJyb3IgKi8KKyAgICBpZiAoc3RhdGUtPm1vZGUgIT0gR1pfUkVBRCB8fAorICAgICAgICAoc3RhdGUtPmVyciAhPSBaX09LICYmIHN0YXRlLT5lcnIgIT0gWl9CVUZfRVJST1IpKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICAvKiB0cnkgb3V0cHV0IGJ1ZmZlciAobm8gbmVlZCB0byBjaGVjayBmb3Igc2tpcCByZXF1ZXN0KSAqLworICAgIGlmIChzdGF0ZS0+eC5oYXZlKSB7CisgICAgICAgIHN0YXRlLT54LmhhdmUtLTsKKyAgICAgICAgc3RhdGUtPngucG9zKys7CisgICAgICAgIHJldHVybiAqKHN0YXRlLT54Lm5leHQpKys7CisgICAgfQorCisgICAgLyogbm90aGluZyB0aGVyZSAtLSB0cnkgZ3pyZWFkKCkgKi8KKyAgICByZXQgPSBnenJlYWQoZmlsZSwgYnVmLCAxKTsKKyAgICByZXR1cm4gcmV0IDwgMSA/IC0xIDogYnVmWzBdOworfQorCisjdW5kZWYgZ3pnZXRjCitpbnQgWkVYUE9SVCBnemdldGMoZmlsZSkKK2d6RmlsZSBmaWxlOworeworICAgIHJldHVybiBnemdldGNfKGZpbGUpOworfSAgICAKKworLyogLS0gc2VlIHpsaWIuaCAtLSAqLworaW50IFpFWFBPUlQgZ3p1bmdldGMoYywgZmlsZSkKKyAgICBpbnQgYzsKKyAgICBnekZpbGUgZmlsZTsKK3sKKyAgICBnel9zdGF0ZXAgc3RhdGU7CisKKyAgICAvKiBnZXQgaW50ZXJuYWwgc3RydWN0dXJlICovCisgICAgaWYgKGZpbGUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHN0YXRlID0gKGd6X3N0YXRlcClmaWxlOworCisgICAgLyogY2hlY2sgdGhhdCB3ZSdyZSByZWFkaW5nIGFuZCB0aGF0IHRoZXJlJ3Mgbm8gKHNlcmlvdXMpIGVycm9yICovCisgICAgaWYgKHN0YXRlLT5tb2RlICE9IEdaX1JFQUQgfHwKKyAgICAgICAgKHN0YXRlLT5lcnIgIT0gWl9PSyAmJiBzdGF0ZS0+ZXJyICE9IFpfQlVGX0VSUk9SKSkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgLyogcHJvY2VzcyBhIHNraXAgcmVxdWVzdCAqLworICAgIGlmIChzdGF0ZS0+c2VlaykgeworICAgICAgICBzdGF0ZS0+c2VlayA9IDA7CisgICAgICAgIGlmIChnel9za2lwKHN0YXRlLCBzdGF0ZS0+c2tpcCkgPT0gLTEpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLyogY2FuJ3QgcHVzaCBFT0YgKi8KKyAgICBpZiAoYyA8IDApCisgICAgICAgIHJldHVybiAtMTsKKworICAgIC8qIGlmIG91dHB1dCBidWZmZXIgZW1wdHksIHB1dCBieXRlIGF0IGVuZCAoYWxsb3dzIG1vcmUgcHVzaGluZykgKi8KKyAgICBpZiAoc3RhdGUtPnguaGF2ZSA9PSAwKSB7CisgICAgICAgIHN0YXRlLT54LmhhdmUgPSAxOworICAgICAgICBzdGF0ZS0+eC5uZXh0ID0gc3RhdGUtPm91dCArIChzdGF0ZS0+c2l6ZSA8PCAxKSAtIDE7CisgICAgICAgIHN0YXRlLT54Lm5leHRbMF0gPSBjOworICAgICAgICBzdGF0ZS0+eC5wb3MtLTsKKyAgICAgICAgc3RhdGUtPnBhc3QgPSAwOworICAgICAgICByZXR1cm4gYzsKKyAgICB9CisKKyAgICAvKiBpZiBubyByb29tLCBnaXZlIHVwIChtdXN0IGhhdmUgYWxyZWFkeSBkb25lIGEgZ3p1bmdldGMoKSkgKi8KKyAgICBpZiAoc3RhdGUtPnguaGF2ZSA9PSAoc3RhdGUtPnNpemUgPDwgMSkpIHsKKyAgICAgICAgZ3pfZXJyb3Ioc3RhdGUsIFpfREFUQV9FUlJPUiwgIm91dCBvZiByb29tIHRvIHB1c2ggY2hhcmFjdGVycyIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLyogc2xpZGUgb3V0cHV0IGRhdGEgaWYgbmVlZGVkIGFuZCBpbnNlcnQgYnl0ZSBiZWZvcmUgZXhpc3RpbmcgZGF0YSAqLworICAgIGlmIChzdGF0ZS0+eC5uZXh0ID09IHN0YXRlLT5vdXQpIHsKKyAgICAgICAgdW5zaWduZWQgY2hhciAqc3JjID0gc3RhdGUtPm91dCArIHN0YXRlLT54LmhhdmU7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgKmRlc3QgPSBzdGF0ZS0+b3V0ICsgKHN0YXRlLT5zaXplIDw8IDEpOworICAgICAgICB3aGlsZSAoc3JjID4gc3RhdGUtPm91dCkKKyAgICAgICAgICAgICotLWRlc3QgPSAqLS1zcmM7CisgICAgICAgIHN0YXRlLT54Lm5leHQgPSBkZXN0OworICAgIH0KKyAgICBzdGF0ZS0+eC5oYXZlKys7CisgICAgc3RhdGUtPngubmV4dC0tOworICAgIHN0YXRlLT54Lm5leHRbMF0gPSBjOworICAgIHN0YXRlLT54LnBvcy0tOworICAgIHN0YXRlLT5wYXN0ID0gMDsKKyAgICByZXR1cm4gYzsKK30KKworLyogLS0gc2VlIHpsaWIuaCAtLSAqLworY2hhciAqIFpFWFBPUlQgZ3pnZXRzKGZpbGUsIGJ1ZiwgbGVuKQorICAgIGd6RmlsZSBmaWxlOworICAgIGNoYXIgKmJ1ZjsKKyAgICBpbnQgbGVuOworeworICAgIHVuc2lnbmVkIGxlZnQsIG47CisgICAgY2hhciAqc3RyOworICAgIHVuc2lnbmVkIGNoYXIgKmVvbDsKKyAgICBnel9zdGF0ZXAgc3RhdGU7CisKKyAgICAvKiBjaGVjayBwYXJhbWV0ZXJzIGFuZCBnZXQgaW50ZXJuYWwgc3RydWN0dXJlICovCisgICAgaWYgKGZpbGUgPT0gTlVMTCB8fCBidWYgPT0gTlVMTCB8fCBsZW4gPCAxKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBzdGF0ZSA9IChnel9zdGF0ZXApZmlsZTsKKworICAgIC8qIGNoZWNrIHRoYXQgd2UncmUgcmVhZGluZyBhbmQgdGhhdCB0aGVyZSdzIG5vIChzZXJpb3VzKSBlcnJvciAqLworICAgIGlmIChzdGF0ZS0+bW9kZSAhPSBHWl9SRUFEIHx8CisgICAgICAgIChzdGF0ZS0+ZXJyICE9IFpfT0sgJiYgc3RhdGUtPmVyciAhPSBaX0JVRl9FUlJPUikpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgLyogcHJvY2VzcyBhIHNraXAgcmVxdWVzdCAqLworICAgIGlmIChzdGF0ZS0+c2VlaykgeworICAgICAgICBzdGF0ZS0+c2VlayA9IDA7CisgICAgICAgIGlmIChnel9za2lwKHN0YXRlLCBzdGF0ZS0+c2tpcCkgPT0gLTEpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICAvKiBjb3B5IG91dHB1dCBieXRlcyB1cCB0byBuZXcgbGluZSBvciBsZW4gLSAxLCB3aGljaGV2ZXIgY29tZXMgZmlyc3QgLS0KKyAgICAgICBhcHBlbmQgYSB0ZXJtaW5hdGluZyB6ZXJvIHRvIHRoZSBzdHJpbmcgKHdlIGRvbid0IGNoZWNrIGZvciBhIHplcm8gaW4KKyAgICAgICB0aGUgY29udGVudHMsIGxldCB0aGUgdXNlciB3b3JyeSBhYm91dCB0aGF0KSAqLworICAgIHN0ciA9IGJ1ZjsKKyAgICBsZWZ0ID0gKHVuc2lnbmVkKWxlbiAtIDE7CisgICAgaWYgKGxlZnQpIGRvIHsKKyAgICAgICAgLyogYXNzdXJlIHRoYXQgc29tZXRoaW5nIGlzIGluIHRoZSBvdXRwdXQgYnVmZmVyICovCisgICAgICAgIGlmIChzdGF0ZS0+eC5oYXZlID09IDAgJiYgZ3pfZmV0Y2goc3RhdGUpID09IC0xKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7ICAgICAgICAgICAgICAgIC8qIGVycm9yICovCisgICAgICAgIGlmIChzdGF0ZS0+eC5oYXZlID09IDApIHsgICAgICAgLyogZW5kIG9mIGZpbGUgKi8KKyAgICAgICAgICAgIHN0YXRlLT5wYXN0ID0gMTsgICAgICAgICAgICAvKiByZWFkIHBhc3QgZW5kICovCisgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgLyogcmV0dXJuIHdoYXQgd2UgaGF2ZSAqLworICAgICAgICB9CisKKyAgICAgICAgLyogbG9vayBmb3IgZW5kLW9mLWxpbmUgaW4gY3VycmVudCBvdXRwdXQgYnVmZmVyICovCisgICAgICAgIG4gPSBzdGF0ZS0+eC5oYXZlID4gbGVmdCA/IGxlZnQgOiBzdGF0ZS0+eC5oYXZlOworICAgICAgICBlb2wgPSBtZW1jaHIoc3RhdGUtPngubmV4dCwgJ1xuJywgbik7CisgICAgICAgIGlmIChlb2wgIT0gTlVMTCkKKyAgICAgICAgICAgIG4gPSAodW5zaWduZWQpKGVvbCAtIHN0YXRlLT54Lm5leHQpICsgMTsKKworICAgICAgICAvKiBjb3B5IHRocm91Z2ggZW5kLW9mLWxpbmUsIG9yIHJlbWFpbmRlciBpZiBub3QgZm91bmQgKi8KKyAgICAgICAgbWVtY3B5KGJ1Ziwgc3RhdGUtPngubmV4dCwgbik7CisgICAgICAgIHN0YXRlLT54LmhhdmUgLT0gbjsKKyAgICAgICAgc3RhdGUtPngubmV4dCArPSBuOworICAgICAgICBzdGF0ZS0+eC5wb3MgKz0gbjsKKyAgICAgICAgbGVmdCAtPSBuOworICAgICAgICBidWYgKz0gbjsKKyAgICB9IHdoaWxlIChsZWZ0ICYmIGVvbCA9PSBOVUxMKTsKKworICAgIC8qIHJldHVybiB0ZXJtaW5hdGVkIHN0cmluZywgb3IgaWYgbm90aGluZywgZW5kIG9mIGZpbGUgKi8KKyAgICBpZiAoYnVmID09IHN0cikKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYnVmWzBdID0gMDsKKyAgICByZXR1cm4gc3RyOworfQorCisvKiAtLSBzZWUgemxpYi5oIC0tICovCitpbnQgWkVYUE9SVCBnemRpcmVjdChmaWxlKQorICAgIGd6RmlsZSBmaWxlOworeworICAgIGd6X3N0YXRlcCBzdGF0ZTsKKworICAgIC8qIGdldCBpbnRlcm5hbCBzdHJ1Y3R1cmUgKi8KKyAgICBpZiAoZmlsZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gMDsKKyAgICBzdGF0ZSA9IChnel9zdGF0ZXApZmlsZTsKKworICAgIC8qIGlmIHRoZSBzdGF0ZSBpcyBub3Qga25vd24sIGJ1dCB3ZSBjYW4gZmluZCBvdXQsIHRoZW4gZG8gc28gKHRoaXMgaXMKKyAgICAgICBtYWlubHkgZm9yIHJpZ2h0IGFmdGVyIGEgZ3pvcGVuKCkgb3IgZ3pkb3BlbigpKSAqLworICAgIGlmIChzdGF0ZS0+bW9kZSA9PSBHWl9SRUFEICYmIHN0YXRlLT5ob3cgPT0gTE9PSyAmJiBzdGF0ZS0+eC5oYXZlID09IDApCisgICAgICAgICh2b2lkKWd6X2xvb2soc3RhdGUpOworCisgICAgLyogcmV0dXJuIDEgaWYgdHJhbnNwYXJlbnQsIDAgaWYgcHJvY2Vzc2luZyBhIGd6aXAgc3RyZWFtICovCisgICAgcmV0dXJuIHN0YXRlLT5kaXJlY3Q7Cit9CisKKy8qIC0tIHNlZSB6bGliLmggLS0gKi8KK2ludCBaRVhQT1JUIGd6Y2xvc2VfcihmaWxlKQorICAgIGd6RmlsZSBmaWxlOworeworICAgIGludCByZXQsIGVycjsKKyAgICBnel9zdGF0ZXAgc3RhdGU7CisKKyAgICAvKiBnZXQgaW50ZXJuYWwgc3RydWN0dXJlICovCisgICAgaWYgKGZpbGUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworICAgIHN0YXRlID0gKGd6X3N0YXRlcClmaWxlOworCisgICAgLyogY2hlY2sgdGhhdCB3ZSdyZSByZWFkaW5nICovCisgICAgaWYgKHN0YXRlLT5tb2RlICE9IEdaX1JFQUQpCisgICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKworICAgIC8qIGZyZWUgbWVtb3J5IGFuZCBjbG9zZSBmaWxlICovCisgICAgaWYgKHN0YXRlLT5zaXplKSB7CisgICAgICAgIGluZmxhdGVFbmQoJihzdGF0ZS0+c3RybSkpOworICAgICAgICBmcmVlKHN0YXRlLT5vdXQpOworICAgICAgICBmcmVlKHN0YXRlLT5pbik7CisgICAgfQorICAgIGVyciA9IHN0YXRlLT5lcnIgPT0gWl9CVUZfRVJST1IgPyBaX0JVRl9FUlJPUiA6IFpfT0s7CisgICAgZ3pfZXJyb3Ioc3RhdGUsIFpfT0ssIE5VTEwpOworICAgIGZyZWUoc3RhdGUtPnBhdGgpOworICAgIHJldCA9IGNsb3NlKHN0YXRlLT5mZCk7CisgICAgZnJlZShzdGF0ZSk7CisgICAgcmV0dXJuIHJldCA/IFpfRVJSTk8gOiBlcnI7Cit9CmRpZmYgLS1naXQgYS96bGliLTEuMi42L2d6d3JpdGUuYyBiL3psaWItMS4yLjYvZ3p3cml0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhYTM1YjYKLS0tIC9kZXYvbnVsbAorKysgYi96bGliLTEuMi42L2d6d3JpdGUuYwpAQCAtMCwwICsxLDU5MyBAQAorLyogZ3p3cml0ZS5jIC0tIHpsaWIgZnVuY3Rpb25zIGZvciB3cml0aW5nIGd6aXAgZmlsZXMKKyAqIENvcHlyaWdodCAoQykgMjAwNCwgMjAwNSwgMjAxMCwgMjAxMSwgMjAxMiBNYXJrIEFkbGVyCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCisgKi8KKworI2luY2x1ZGUgImd6Z3V0cy5oIgorCisvKiBMb2NhbCBmdW5jdGlvbnMgKi8KK2xvY2FsIGludCBnel9pbml0IE9GKChnel9zdGF0ZXApKTsKK2xvY2FsIGludCBnel9jb21wIE9GKChnel9zdGF0ZXAsIGludCkpOworbG9jYWwgaW50IGd6X3plcm8gT0YoKGd6X3N0YXRlcCwgel9vZmY2NF90KSk7CisKKy8qIEluaXRpYWxpemUgc3RhdGUgZm9yIHdyaXRpbmcgYSBnemlwIGZpbGUuICBNYXJrIGluaXRpYWxpemF0aW9uIGJ5IHNldHRpbmcKKyAgIHN0YXRlLT5zaXplIHRvIG5vbi16ZXJvLiAgUmV0dXJuIC0xIG9uIGZhaWx1cmUgb3IgMCBvbiBzdWNjZXNzLiAqLworbG9jYWwgaW50IGd6X2luaXQoc3RhdGUpCisgICAgZ3pfc3RhdGVwIHN0YXRlOworeworICAgIGludCByZXQ7CisgICAgel9zdHJlYW1wIHN0cm0gPSAmKHN0YXRlLT5zdHJtKTsKKworICAgIC8qIGFsbG9jYXRlIGlucHV0IGJ1ZmZlciAqLworICAgIHN0YXRlLT5pbiA9IG1hbGxvYyhzdGF0ZS0+d2FudCk7CisgICAgaWYgKHN0YXRlLT5pbiA9PSBOVUxMKSB7CisgICAgICAgIGd6X2Vycm9yKHN0YXRlLCBaX01FTV9FUlJPUiwgIm91dCBvZiBtZW1vcnkiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qIG9ubHkgbmVlZCBvdXRwdXQgYnVmZmVyIGFuZCBkZWZsYXRlIHN0YXRlIGlmIGNvbXByZXNzaW5nICovCisgICAgaWYgKCFzdGF0ZS0+ZGlyZWN0KSB7CisgICAgICAgIC8qIGFsbG9jYXRlIG91dHB1dCBidWZmZXIgKi8KKyAgICAgICAgc3RhdGUtPm91dCA9IG1hbGxvYyhzdGF0ZS0+d2FudCk7CisgICAgICAgIGlmIChzdGF0ZS0+b3V0ID09IE5VTEwpIHsKKyAgICAgICAgICAgIGZyZWUoc3RhdGUtPmluKTsKKyAgICAgICAgICAgIGd6X2Vycm9yKHN0YXRlLCBaX01FTV9FUlJPUiwgIm91dCBvZiBtZW1vcnkiKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGFsbG9jYXRlIGRlZmxhdGUgbWVtb3J5LCBzZXQgdXAgZm9yIGd6aXAgY29tcHJlc3Npb24gKi8KKyAgICAgICAgc3RybS0+emFsbG9jID0gWl9OVUxMOworICAgICAgICBzdHJtLT56ZnJlZSA9IFpfTlVMTDsKKyAgICAgICAgc3RybS0+b3BhcXVlID0gWl9OVUxMOworICAgICAgICByZXQgPSBkZWZsYXRlSW5pdDIoc3RybSwgc3RhdGUtPmxldmVsLCBaX0RFRkxBVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFYX1dCSVRTICsgMTYsIERFRl9NRU1fTEVWRUwsIHN0YXRlLT5zdHJhdGVneSk7CisgICAgICAgIGlmIChyZXQgIT0gWl9PSykgeworICAgICAgICAgICAgZnJlZShzdGF0ZS0+b3V0KTsKKyAgICAgICAgICAgIGZyZWUoc3RhdGUtPmluKTsKKyAgICAgICAgICAgIGd6X2Vycm9yKHN0YXRlLCBaX01FTV9FUlJPUiwgIm91dCBvZiBtZW1vcnkiKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIG1hcmsgc3RhdGUgYXMgaW5pdGlhbGl6ZWQgKi8KKyAgICBzdGF0ZS0+c2l6ZSA9IHN0YXRlLT53YW50OworCisgICAgLyogaW5pdGlhbGl6ZSB3cml0ZSBidWZmZXIgaWYgY29tcHJlc3NpbmcgKi8KKyAgICBpZiAoIXN0YXRlLT5kaXJlY3QpIHsKKyAgICAgICAgc3RybS0+YXZhaWxfb3V0ID0gc3RhdGUtPnNpemU7CisgICAgICAgIHN0cm0tPm5leHRfb3V0ID0gc3RhdGUtPm91dDsKKyAgICAgICAgc3RhdGUtPngubmV4dCA9IHN0cm0tPm5leHRfb3V0OworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLyogQ29tcHJlc3Mgd2hhdGV2ZXIgaXMgYXQgYXZhaWxfaW4gYW5kIG5leHRfaW4gYW5kIHdyaXRlIHRvIHRoZSBvdXRwdXQgZmlsZS4KKyAgIFJldHVybiAtMSBpZiB0aGVyZSBpcyBhbiBlcnJvciB3cml0aW5nIHRvIHRoZSBvdXRwdXQgZmlsZSwgb3RoZXJ3aXNlIDAuCisgICBmbHVzaCBpcyBhc3N1bWVkIHRvIGJlIGEgdmFsaWQgZGVmbGF0ZSgpIGZsdXNoIHZhbHVlLiAgSWYgZmx1c2ggaXMgWl9GSU5JU0gsCisgICB0aGVuIHRoZSBkZWZsYXRlKCkgc3RhdGUgaXMgcmVzZXQgdG8gc3RhcnQgYSBuZXcgZ3ppcCBzdHJlYW0uICBJZiBnei0+ZGlyZWN0CisgICBpcyB0cnVlLCB0aGVuIHNpbXBseSB3cml0ZSB0byB0aGUgb3V0cHV0IGZpbGUgd2l0aG91dCBjb21wcmVzc2luZywgYW5kCisgICBpZ25vcmUgZmx1c2guICovCitsb2NhbCBpbnQgZ3pfY29tcChzdGF0ZSwgZmx1c2gpCisgICAgZ3pfc3RhdGVwIHN0YXRlOworICAgIGludCBmbHVzaDsKK3sKKyAgICBpbnQgcmV0LCBnb3Q7CisgICAgdW5zaWduZWQgaGF2ZTsKKyAgICB6X3N0cmVhbXAgc3RybSA9ICYoc3RhdGUtPnN0cm0pOworCisgICAgLyogYWxsb2NhdGUgbWVtb3J5IGlmIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgdGhyb3VnaCAqLworICAgIGlmIChzdGF0ZS0+c2l6ZSA9PSAwICYmIGd6X2luaXQoc3RhdGUpID09IC0xKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICAvKiB3cml0ZSBkaXJlY3RseSBpZiByZXF1ZXN0ZWQgKi8KKyAgICBpZiAoc3RhdGUtPmRpcmVjdCkgeworICAgICAgICBnb3QgPSB3cml0ZShzdGF0ZS0+ZmQsIHN0cm0tPm5leHRfaW4sIHN0cm0tPmF2YWlsX2luKTsKKyAgICAgICAgaWYgKGdvdCA8IDAgfHwgKHVuc2lnbmVkKWdvdCAhPSBzdHJtLT5hdmFpbF9pbikgeworICAgICAgICAgICAgZ3pfZXJyb3Ioc3RhdGUsIFpfRVJSTk8sIHpzdHJlcnJvcigpKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBzdHJtLT5hdmFpbF9pbiA9IDA7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qIHJ1biBkZWZsYXRlKCkgb24gcHJvdmlkZWQgaW5wdXQgdW50aWwgaXQgcHJvZHVjZXMgbm8gbW9yZSBvdXRwdXQgKi8KKyAgICByZXQgPSBaX09LOworICAgIGRvIHsKKyAgICAgICAgLyogd3JpdGUgb3V0IGN1cnJlbnQgYnVmZmVyIGNvbnRlbnRzIGlmIGZ1bGwsIG9yIGlmIGZsdXNoaW5nLCBidXQgaWYKKyAgICAgICAgICAgZG9pbmcgWl9GSU5JU0ggdGhlbiBkb24ndCB3cml0ZSB1bnRpbCB3ZSBnZXQgdG8gWl9TVFJFQU1fRU5EICovCisgICAgICAgIGlmIChzdHJtLT5hdmFpbF9vdXQgPT0gMCB8fCAoZmx1c2ggIT0gWl9OT19GTFVTSCAmJgorICAgICAgICAgICAgKGZsdXNoICE9IFpfRklOSVNIIHx8IHJldCA9PSBaX1NUUkVBTV9FTkQpKSkgeworICAgICAgICAgICAgaGF2ZSA9ICh1bnNpZ25lZCkoc3RybS0+bmV4dF9vdXQgLSBzdGF0ZS0+eC5uZXh0KTsKKyAgICAgICAgICAgIGlmIChoYXZlICYmICgoZ290ID0gd3JpdGUoc3RhdGUtPmZkLCBzdGF0ZS0+eC5uZXh0LCBoYXZlKSkgPCAwIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKWdvdCAhPSBoYXZlKSkgeworICAgICAgICAgICAgICAgIGd6X2Vycm9yKHN0YXRlLCBaX0VSUk5PLCB6c3RyZXJyb3IoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN0cm0tPmF2YWlsX291dCA9PSAwKSB7CisgICAgICAgICAgICAgICAgc3RybS0+YXZhaWxfb3V0ID0gc3RhdGUtPnNpemU7CisgICAgICAgICAgICAgICAgc3RybS0+bmV4dF9vdXQgPSBzdGF0ZS0+b3V0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdGUtPngubmV4dCA9IHN0cm0tPm5leHRfb3V0OworICAgICAgICB9CisKKyAgICAgICAgLyogY29tcHJlc3MgKi8KKyAgICAgICAgaGF2ZSA9IHN0cm0tPmF2YWlsX291dDsKKyAgICAgICAgcmV0ID0gZGVmbGF0ZShzdHJtLCBmbHVzaCk7CisgICAgICAgIGlmIChyZXQgPT0gWl9TVFJFQU1fRVJST1IpIHsKKyAgICAgICAgICAgIGd6X2Vycm9yKHN0YXRlLCBaX1NUUkVBTV9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAiaW50ZXJuYWwgZXJyb3I6IGRlZmxhdGUgc3RyZWFtIGNvcnJ1cHQiKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBoYXZlIC09IHN0cm0tPmF2YWlsX291dDsKKyAgICB9IHdoaWxlIChoYXZlKTsKKworICAgIC8qIGlmIHRoYXQgY29tcGxldGVkIGEgZGVmbGF0ZSBzdHJlYW0sIGFsbG93IGFub3RoZXIgdG8gc3RhcnQgKi8KKyAgICBpZiAoZmx1c2ggPT0gWl9GSU5JU0gpCisgICAgICAgIGRlZmxhdGVSZXNldChzdHJtKTsKKworICAgIC8qIGFsbCBkb25lLCBubyBlcnJvcnMgKi8KKyAgICByZXR1cm4gMDsKK30KKworLyogQ29tcHJlc3MgbGVuIHplcm9zIHRvIG91dHB1dC4gIFJldHVybiAtMSBvbiBlcnJvciwgMCBvbiBzdWNjZXNzLiAqLworbG9jYWwgaW50IGd6X3plcm8oc3RhdGUsIGxlbikKKyAgICBnel9zdGF0ZXAgc3RhdGU7CisgICAgel9vZmY2NF90IGxlbjsKK3sKKyAgICBpbnQgZmlyc3Q7CisgICAgdW5zaWduZWQgbjsKKyAgICB6X3N0cmVhbXAgc3RybSA9ICYoc3RhdGUtPnN0cm0pOworCisgICAgLyogY29uc3VtZSB3aGF0ZXZlcidzIGxlZnQgaW4gdGhlIGlucHV0IGJ1ZmZlciAqLworICAgIGlmIChzdHJtLT5hdmFpbF9pbiAmJiBnel9jb21wKHN0YXRlLCBaX05PX0ZMVVNIKSA9PSAtMSkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgLyogY29tcHJlc3MgbGVuIHplcm9zIChsZW4gZ3VhcmFudGVlZCA+IDApICovCisgICAgZmlyc3QgPSAxOworICAgIHdoaWxlIChsZW4pIHsKKyAgICAgICAgbiA9IEdUX09GRihzdGF0ZS0+c2l6ZSkgfHwgKHpfb2ZmNjRfdClzdGF0ZS0+c2l6ZSA+IGxlbiA/CisgICAgICAgICAgICAodW5zaWduZWQpbGVuIDogc3RhdGUtPnNpemU7CisgICAgICAgIGlmIChmaXJzdCkgeworICAgICAgICAgICAgbWVtc2V0KHN0YXRlLT5pbiwgMCwgbik7CisgICAgICAgICAgICBmaXJzdCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgc3RybS0+YXZhaWxfaW4gPSBuOworICAgICAgICBzdHJtLT5uZXh0X2luID0gc3RhdGUtPmluOworICAgICAgICBzdGF0ZS0+eC5wb3MgKz0gbjsKKyAgICAgICAgaWYgKGd6X2NvbXAoc3RhdGUsIFpfTk9fRkxVU0gpID09IC0xKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBsZW4gLT0gbjsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8qIC0tIHNlZSB6bGliLmggLS0gKi8KK2ludCBaRVhQT1JUIGd6d3JpdGUoZmlsZSwgYnVmLCBsZW4pCisgICAgZ3pGaWxlIGZpbGU7CisgICAgdm9pZHBjIGJ1ZjsKKyAgICB1bnNpZ25lZCBsZW47Cit7CisgICAgdW5zaWduZWQgcHV0ID0gbGVuOworICAgIHVuc2lnbmVkIG47CisgICAgZ3pfc3RhdGVwIHN0YXRlOworICAgIHpfc3RyZWFtcCBzdHJtOworCisgICAgLyogZ2V0IGludGVybmFsIHN0cnVjdHVyZSAqLworICAgIGlmIChmaWxlID09IE5VTEwpCisgICAgICAgIHJldHVybiAwOworICAgIHN0YXRlID0gKGd6X3N0YXRlcClmaWxlOworICAgIHN0cm0gPSAmKHN0YXRlLT5zdHJtKTsKKworICAgIC8qIGNoZWNrIHRoYXQgd2UncmUgd3JpdGluZyBhbmQgdGhhdCB0aGVyZSdzIG5vIGVycm9yICovCisgICAgaWYgKHN0YXRlLT5tb2RlICE9IEdaX1dSSVRFIHx8IHN0YXRlLT5lcnIgIT0gWl9PSykKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICAvKiBzaW5jZSBhbiBpbnQgaXMgcmV0dXJuZWQsIG1ha2Ugc3VyZSBsZW4gZml0cyBpbiBvbmUsIG90aGVyd2lzZSByZXR1cm4KKyAgICAgICB3aXRoIGFuIGVycm9yICh0aGlzIGF2b2lkcyB0aGUgZmxhdyBpbiB0aGUgaW50ZXJmYWNlKSAqLworICAgIGlmICgoaW50KWxlbiA8IDApIHsKKyAgICAgICAgZ3pfZXJyb3Ioc3RhdGUsIFpfREFUQV9FUlJPUiwgInJlcXVlc3RlZCBsZW5ndGggZG9lcyBub3QgZml0IGluIGludCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKiBpZiBsZW4gaXMgemVybywgYXZvaWQgdW5uZWNlc3Nhcnkgb3BlcmF0aW9ucyAqLworICAgIGlmIChsZW4gPT0gMCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICAvKiBhbGxvY2F0ZSBtZW1vcnkgaWYgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSB0aHJvdWdoICovCisgICAgaWYgKHN0YXRlLT5zaXplID09IDAgJiYgZ3pfaW5pdChzdGF0ZSkgPT0gLTEpCisgICAgICAgIHJldHVybiAwOworCisgICAgLyogY2hlY2sgZm9yIHNlZWsgcmVxdWVzdCAqLworICAgIGlmIChzdGF0ZS0+c2VlaykgeworICAgICAgICBzdGF0ZS0+c2VlayA9IDA7CisgICAgICAgIGlmIChnel96ZXJvKHN0YXRlLCBzdGF0ZS0+c2tpcCkgPT0gLTEpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKiBmb3Igc21hbGwgbGVuLCBjb3B5IHRvIGlucHV0IGJ1ZmZlciwgb3RoZXJ3aXNlIGNvbXByZXNzIGRpcmVjdGx5ICovCisgICAgaWYgKGxlbiA8IHN0YXRlLT5zaXplKSB7CisgICAgICAgIC8qIGNvcHkgdG8gaW5wdXQgYnVmZmVyLCBjb21wcmVzcyB3aGVuIGZ1bGwgKi8KKyAgICAgICAgZG8geworICAgICAgICAgICAgaWYgKHN0cm0tPmF2YWlsX2luID09IDApCisgICAgICAgICAgICAgICAgc3RybS0+bmV4dF9pbiA9IHN0YXRlLT5pbjsKKyAgICAgICAgICAgIG4gPSBzdGF0ZS0+c2l6ZSAtIHN0cm0tPmF2YWlsX2luOworICAgICAgICAgICAgaWYgKG4gPiBsZW4pCisgICAgICAgICAgICAgICAgbiA9IGxlbjsKKyAgICAgICAgICAgIG1lbWNweShzdHJtLT5uZXh0X2luICsgc3RybS0+YXZhaWxfaW4sIGJ1Ziwgbik7CisgICAgICAgICAgICBzdHJtLT5hdmFpbF9pbiArPSBuOworICAgICAgICAgICAgc3RhdGUtPngucG9zICs9IG47CisgICAgICAgICAgICBidWYgPSAoY2hhciAqKWJ1ZiArIG47CisgICAgICAgICAgICBsZW4gLT0gbjsKKyAgICAgICAgICAgIGlmIChsZW4gJiYgZ3pfY29tcChzdGF0ZSwgWl9OT19GTFVTSCkgPT0gLTEpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0gd2hpbGUgKGxlbik7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvKiBjb25zdW1lIHdoYXRldmVyJ3MgbGVmdCBpbiB0aGUgaW5wdXQgYnVmZmVyICovCisgICAgICAgIGlmIChzdHJtLT5hdmFpbF9pbiAmJiBnel9jb21wKHN0YXRlLCBaX05PX0ZMVVNIKSA9PSAtMSkKKyAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgIC8qIGRpcmVjdGx5IGNvbXByZXNzIHVzZXIgYnVmZmVyIHRvIGZpbGUgKi8KKyAgICAgICAgc3RybS0+YXZhaWxfaW4gPSBsZW47CisgICAgICAgIHN0cm0tPm5leHRfaW4gPSAodm9pZHApYnVmOworICAgICAgICBzdGF0ZS0+eC5wb3MgKz0gbGVuOworICAgICAgICBpZiAoZ3pfY29tcChzdGF0ZSwgWl9OT19GTFVTSCkgPT0gLTEpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKiBpbnB1dCB3YXMgYWxsIGJ1ZmZlcmVkIG9yIGNvbXByZXNzZWQgKHB1dCB3aWxsIGZpdCBpbiBpbnQpICovCisgICAgcmV0dXJuIChpbnQpcHV0OworfQorCisvKiAtLSBzZWUgemxpYi5oIC0tICovCitpbnQgWkVYUE9SVCBnenB1dGMoZmlsZSwgYykKKyAgICBnekZpbGUgZmlsZTsKKyAgICBpbnQgYzsKK3sKKyAgICB1bnNpZ25lZCBjaGFyIGJ1ZlsxXTsKKyAgICBnel9zdGF0ZXAgc3RhdGU7CisgICAgel9zdHJlYW1wIHN0cm07CisKKyAgICAvKiBnZXQgaW50ZXJuYWwgc3RydWN0dXJlICovCisgICAgaWYgKGZpbGUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHN0YXRlID0gKGd6X3N0YXRlcClmaWxlOworICAgIHN0cm0gPSAmKHN0YXRlLT5zdHJtKTsKKworICAgIC8qIGNoZWNrIHRoYXQgd2UncmUgd3JpdGluZyBhbmQgdGhhdCB0aGVyZSdzIG5vIGVycm9yICovCisgICAgaWYgKHN0YXRlLT5tb2RlICE9IEdaX1dSSVRFIHx8IHN0YXRlLT5lcnIgIT0gWl9PSykKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgLyogY2hlY2sgZm9yIHNlZWsgcmVxdWVzdCAqLworICAgIGlmIChzdGF0ZS0+c2VlaykgeworICAgICAgICBzdGF0ZS0+c2VlayA9IDA7CisgICAgICAgIGlmIChnel96ZXJvKHN0YXRlLCBzdGF0ZS0+c2tpcCkgPT0gLTEpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLyogdHJ5IHdyaXRpbmcgdG8gaW5wdXQgYnVmZmVyIGZvciBzcGVlZCAoc3RhdGUtPnNpemUgPT0gMCBpZiBidWZmZXIgbm90CisgICAgICAgaW5pdGlhbGl6ZWQpICovCisgICAgaWYgKHN0cm0tPmF2YWlsX2luIDwgc3RhdGUtPnNpemUpIHsKKyAgICAgICAgaWYgKHN0cm0tPmF2YWlsX2luID09IDApCisgICAgICAgICAgICBzdHJtLT5uZXh0X2luID0gc3RhdGUtPmluOworICAgICAgICBzdHJtLT5uZXh0X2luW3N0cm0tPmF2YWlsX2luKytdID0gYzsKKyAgICAgICAgc3RhdGUtPngucG9zKys7CisgICAgICAgIHJldHVybiBjICYgMHhmZjsKKyAgICB9CisKKyAgICAvKiBubyByb29tIGluIGJ1ZmZlciBvciBub3QgaW5pdGlhbGl6ZWQsIHVzZSBnel93cml0ZSgpICovCisgICAgYnVmWzBdID0gYzsKKyAgICBpZiAoZ3p3cml0ZShmaWxlLCBidWYsIDEpICE9IDEpCisgICAgICAgIHJldHVybiAtMTsKKyAgICByZXR1cm4gYyAmIDB4ZmY7Cit9CisKKy8qIC0tIHNlZSB6bGliLmggLS0gKi8KK2ludCBaRVhQT1JUIGd6cHV0cyhmaWxlLCBzdHIpCisgICAgZ3pGaWxlIGZpbGU7CisgICAgY29uc3QgY2hhciAqc3RyOworeworICAgIGludCByZXQ7CisgICAgdW5zaWduZWQgbGVuOworCisgICAgLyogd3JpdGUgc3RyaW5nICovCisgICAgbGVuID0gKHVuc2lnbmVkKXN0cmxlbihzdHIpOworICAgIHJldCA9IGd6d3JpdGUoZmlsZSwgc3RyLCBsZW4pOworICAgIHJldHVybiByZXQgPT0gMCAmJiBsZW4gIT0gMCA/IC0xIDogcmV0OworfQorCisjaWYgZGVmaW5lZChTVERDKSB8fCBkZWZpbmVkKFpfSEFWRV9TVERBUkdfSCkKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworLyogLS0gc2VlIHpsaWIuaCAtLSAqLworaW50IFpFWFBPUlRWQSBnenByaW50ZiAoZ3pGaWxlIGZpbGUsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQoreworICAgIGludCBzaXplLCBsZW47CisgICAgZ3pfc3RhdGVwIHN0YXRlOworICAgIHpfc3RyZWFtcCBzdHJtOworICAgIHZhX2xpc3QgdmE7CisKKyAgICAvKiBnZXQgaW50ZXJuYWwgc3RydWN0dXJlICovCisgICAgaWYgKGZpbGUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHN0YXRlID0gKGd6X3N0YXRlcClmaWxlOworICAgIHN0cm0gPSAmKHN0YXRlLT5zdHJtKTsKKworICAgIC8qIGNoZWNrIHRoYXQgd2UncmUgd3JpdGluZyBhbmQgdGhhdCB0aGVyZSdzIG5vIGVycm9yICovCisgICAgaWYgKHN0YXRlLT5tb2RlICE9IEdaX1dSSVRFIHx8IHN0YXRlLT5lcnIgIT0gWl9PSykKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICAvKiBtYWtlIHN1cmUgd2UgaGF2ZSBzb21lIGJ1ZmZlciBzcGFjZSAqLworICAgIGlmIChzdGF0ZS0+c2l6ZSA9PSAwICYmIGd6X2luaXQoc3RhdGUpID09IC0xKQorICAgICAgICByZXR1cm4gMDsKKworICAgIC8qIGNoZWNrIGZvciBzZWVrIHJlcXVlc3QgKi8KKyAgICBpZiAoc3RhdGUtPnNlZWspIHsKKyAgICAgICAgc3RhdGUtPnNlZWsgPSAwOworICAgICAgICBpZiAoZ3pfemVybyhzdGF0ZSwgc3RhdGUtPnNraXApID09IC0xKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLyogY29uc3VtZSB3aGF0ZXZlcidzIGxlZnQgaW4gdGhlIGlucHV0IGJ1ZmZlciAqLworICAgIGlmIChzdHJtLT5hdmFpbF9pbiAmJiBnel9jb21wKHN0YXRlLCBaX05PX0ZMVVNIKSA9PSAtMSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICAvKiBkbyB0aGUgcHJpbnRmKCkgaW50byB0aGUgaW5wdXQgYnVmZmVyLCBwdXQgbGVuZ3RoIGluIGxlbiAqLworICAgIHNpemUgPSAoaW50KShzdGF0ZS0+c2l6ZSk7CisgICAgc3RhdGUtPmluW3NpemUgLSAxXSA9IDA7CisgICAgdmFfc3RhcnQodmEsIGZvcm1hdCk7CisjaWZkZWYgTk9fdnNucHJpbnRmCisjICBpZmRlZiBIQVNfdnNwcmludGZfdm9pZAorICAgICh2b2lkKXZzcHJpbnRmKHN0YXRlLT5pbiwgZm9ybWF0LCB2YSk7CisgICAgdmFfZW5kKHZhKTsKKyAgICBmb3IgKGxlbiA9IDA7IGxlbiA8IHNpemU7IGxlbisrKQorICAgICAgICBpZiAoc3RhdGUtPmluW2xlbl0gPT0gMCkgYnJlYWs7CisjICBlbHNlCisgICAgbGVuID0gdnNwcmludGYoc3RhdGUtPmluLCBmb3JtYXQsIHZhKTsKKyAgICB2YV9lbmQodmEpOworIyAgZW5kaWYKKyNlbHNlCisjICBpZmRlZiBIQVNfdnNucHJpbnRmX3ZvaWQKKyAgICAodm9pZCl2c25wcmludGYoc3RhdGUtPmluLCBzaXplLCBmb3JtYXQsIHZhKTsKKyAgICB2YV9lbmQodmEpOworICAgIGxlbiA9IHN0cmxlbihzdGF0ZS0+aW4pOworIyAgZWxzZQorICAgIGxlbiA9IHZzbnByaW50ZigoY2hhciAqKShzdGF0ZS0+aW4pLCBzaXplLCBmb3JtYXQsIHZhKTsKKyAgICB2YV9lbmQodmEpOworIyAgZW5kaWYKKyNlbmRpZgorCisgICAgLyogY2hlY2sgdGhhdCBwcmludGYoKSByZXN1bHRzIGZpdCBpbiBidWZmZXIgKi8KKyAgICBpZiAobGVuIDw9IDAgfHwgbGVuID49IChpbnQpc2l6ZSB8fCBzdGF0ZS0+aW5bc2l6ZSAtIDFdICE9IDApCisgICAgICAgIHJldHVybiAwOworCisgICAgLyogdXBkYXRlIGJ1ZmZlciBhbmQgcG9zaXRpb24sIGRlZmVyIGNvbXByZXNzaW9uIHVudGlsIG5lZWRlZCAqLworICAgIHN0cm0tPmF2YWlsX2luID0gKHVuc2lnbmVkKWxlbjsKKyAgICBzdHJtLT5uZXh0X2luID0gc3RhdGUtPmluOworICAgIHN0YXRlLT54LnBvcyArPSBsZW47CisgICAgcmV0dXJuIGxlbjsKK30KKworI2Vsc2UgLyogIVNUREMgJiYgIVpfSEFWRV9TVERBUkdfSCAqLworCisvKiAtLSBzZWUgemxpYi5oIC0tICovCitpbnQgWkVYUE9SVFZBIGd6cHJpbnRmIChmaWxlLCBmb3JtYXQsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTksIGExMCwKKyAgICAgICAgICAgICAgICAgICAgICAgYTExLCBhMTIsIGExMywgYTE0LCBhMTUsIGExNiwgYTE3LCBhMTgsIGExOSwgYTIwKQorICAgIGd6RmlsZSBmaWxlOworICAgIGNvbnN0IGNoYXIgKmZvcm1hdDsKKyAgICBpbnQgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSwgYTEwLAorICAgICAgICBhMTEsIGExMiwgYTEzLCBhMTQsIGExNSwgYTE2LCBhMTcsIGExOCwgYTE5LCBhMjA7Cit7CisgICAgaW50IHNpemUsIGxlbjsKKyAgICBnel9zdGF0ZXAgc3RhdGU7CisgICAgel9zdHJlYW1wIHN0cm07CisKKyAgICAvKiBnZXQgaW50ZXJuYWwgc3RydWN0dXJlICovCisgICAgaWYgKGZpbGUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHN0YXRlID0gKGd6X3N0YXRlcClmaWxlOworICAgIHN0cm0gPSAmKHN0YXRlLT5zdHJtKTsKKworICAgIC8qIGNoZWNrIHRoYXQgY2FuIHJlYWxseSBwYXNzIHBvaW50ZXIgaW4gaW50cyAqLworICAgIGlmIChzaXplb2YoaW50KSAhPSBzaXplb2Yodm9pZCAqKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICAvKiBjaGVjayB0aGF0IHdlJ3JlIHdyaXRpbmcgYW5kIHRoYXQgdGhlcmUncyBubyBlcnJvciAqLworICAgIGlmIChzdGF0ZS0+bW9kZSAhPSBHWl9XUklURSB8fCBzdGF0ZS0+ZXJyICE9IFpfT0spCisgICAgICAgIHJldHVybiAwOworCisgICAgLyogbWFrZSBzdXJlIHdlIGhhdmUgc29tZSBidWZmZXIgc3BhY2UgKi8KKyAgICBpZiAoc3RhdGUtPnNpemUgPT0gMCAmJiBnel9pbml0KHN0YXRlKSA9PSAtMSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICAvKiBjaGVjayBmb3Igc2VlayByZXF1ZXN0ICovCisgICAgaWYgKHN0YXRlLT5zZWVrKSB7CisgICAgICAgIHN0YXRlLT5zZWVrID0gMDsKKyAgICAgICAgaWYgKGd6X3plcm8oc3RhdGUsIHN0YXRlLT5za2lwKSA9PSAtMSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qIGNvbnN1bWUgd2hhdGV2ZXIncyBsZWZ0IGluIHRoZSBpbnB1dCBidWZmZXIgKi8KKyAgICBpZiAoc3RybS0+YXZhaWxfaW4gJiYgZ3pfY29tcChzdGF0ZSwgWl9OT19GTFVTSCkgPT0gLTEpCisgICAgICAgIHJldHVybiAwOworCisgICAgLyogZG8gdGhlIHByaW50ZigpIGludG8gdGhlIGlucHV0IGJ1ZmZlciwgcHV0IGxlbmd0aCBpbiBsZW4gKi8KKyAgICBzaXplID0gKGludCkoc3RhdGUtPnNpemUpOworICAgIHN0YXRlLT5pbltzaXplIC0gMV0gPSAwOworI2lmZGVmIE5PX3NucHJpbnRmCisjICBpZmRlZiBIQVNfc3ByaW50Zl92b2lkCisgICAgc3ByaW50ZihzdGF0ZS0+aW4sIGZvcm1hdCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LAorICAgICAgICAgICAgYTksIGExMCwgYTExLCBhMTIsIGExMywgYTE0LCBhMTUsIGExNiwgYTE3LCBhMTgsIGExOSwgYTIwKTsKKyAgICBmb3IgKGxlbiA9IDA7IGxlbiA8IHNpemU7IGxlbisrKQorICAgICAgICBpZiAoc3RhdGUtPmluW2xlbl0gPT0gMCkgYnJlYWs7CisjICBlbHNlCisgICAgbGVuID0gc3ByaW50ZihzdGF0ZS0+aW4sIGZvcm1hdCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LAorICAgICAgICAgICAgICAgIGE5LCBhMTAsIGExMSwgYTEyLCBhMTMsIGExNCwgYTE1LCBhMTYsIGExNywgYTE4LCBhMTksIGEyMCk7CisjICBlbmRpZgorI2Vsc2UKKyMgIGlmZGVmIEhBU19zbnByaW50Zl92b2lkCisgICAgc25wcmludGYoc3RhdGUtPmluLCBzaXplLCBmb3JtYXQsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwKKyAgICAgICAgICAgICBhOSwgYTEwLCBhMTEsIGExMiwgYTEzLCBhMTQsIGExNSwgYTE2LCBhMTcsIGExOCwgYTE5LCBhMjApOworICAgIGxlbiA9IHN0cmxlbihzdGF0ZS0+aW4pOworIyAgZWxzZQorICAgIGxlbiA9IHNucHJpbnRmKHN0YXRlLT5pbiwgc2l6ZSwgZm9ybWF0LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsCisgICAgICAgICAgICAgICAgIGE5LCBhMTAsIGExMSwgYTEyLCBhMTMsIGExNCwgYTE1LCBhMTYsIGExNywgYTE4LCBhMTksIGEyMCk7CisjICBlbmRpZgorI2VuZGlmCisKKyAgICAvKiBjaGVjayB0aGF0IHByaW50ZigpIHJlc3VsdHMgZml0IGluIGJ1ZmZlciAqLworICAgIGlmIChsZW4gPD0gMCB8fCBsZW4gPj0gKGludClzaXplIHx8IHN0YXRlLT5pbltzaXplIC0gMV0gIT0gMCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICAvKiB1cGRhdGUgYnVmZmVyIGFuZCBwb3NpdGlvbiwgZGVmZXIgY29tcHJlc3Npb24gdW50aWwgbmVlZGVkICovCisgICAgc3RybS0+YXZhaWxfaW4gPSAodW5zaWduZWQpbGVuOworICAgIHN0cm0tPm5leHRfaW4gPSBzdGF0ZS0+aW47CisgICAgc3RhdGUtPngucG9zICs9IGxlbjsKKyAgICByZXR1cm4gbGVuOworfQorCisjZW5kaWYKKworLyogLS0gc2VlIHpsaWIuaCAtLSAqLworaW50IFpFWFBPUlQgZ3pmbHVzaChmaWxlLCBmbHVzaCkKKyAgICBnekZpbGUgZmlsZTsKKyAgICBpbnQgZmx1c2g7Cit7CisgICAgZ3pfc3RhdGVwIHN0YXRlOworCisgICAgLyogZ2V0IGludGVybmFsIHN0cnVjdHVyZSAqLworICAgIGlmIChmaWxlID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBzdGF0ZSA9IChnel9zdGF0ZXApZmlsZTsKKworICAgIC8qIGNoZWNrIHRoYXQgd2UncmUgd3JpdGluZyBhbmQgdGhhdCB0aGVyZSdzIG5vIGVycm9yICovCisgICAgaWYgKHN0YXRlLT5tb2RlICE9IEdaX1dSSVRFIHx8IHN0YXRlLT5lcnIgIT0gWl9PSykKKyAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworCisgICAgLyogY2hlY2sgZmx1c2ggcGFyYW1ldGVyICovCisgICAgaWYgKGZsdXNoIDwgMCB8fCBmbHVzaCA+IFpfRklOSVNIKQorICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisKKyAgICAvKiBjaGVjayBmb3Igc2VlayByZXF1ZXN0ICovCisgICAgaWYgKHN0YXRlLT5zZWVrKSB7CisgICAgICAgIHN0YXRlLT5zZWVrID0gMDsKKyAgICAgICAgaWYgKGd6X3plcm8oc3RhdGUsIHN0YXRlLT5za2lwKSA9PSAtMSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvKiBjb21wcmVzcyByZW1haW5pbmcgZGF0YSB3aXRoIHJlcXVlc3RlZCBmbHVzaCAqLworICAgIGd6X2NvbXAoc3RhdGUsIGZsdXNoKTsKKyAgICByZXR1cm4gc3RhdGUtPmVycjsKK30KKworLyogLS0gc2VlIHpsaWIuaCAtLSAqLworaW50IFpFWFBPUlQgZ3pzZXRwYXJhbXMoZmlsZSwgbGV2ZWwsIHN0cmF0ZWd5KQorICAgIGd6RmlsZSBmaWxlOworICAgIGludCBsZXZlbDsKKyAgICBpbnQgc3RyYXRlZ3k7Cit7CisgICAgZ3pfc3RhdGVwIHN0YXRlOworICAgIHpfc3RyZWFtcCBzdHJtOworCisgICAgLyogZ2V0IGludGVybmFsIHN0cnVjdHVyZSAqLworICAgIGlmIChmaWxlID09IE5VTEwpCisgICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKyAgICBzdGF0ZSA9IChnel9zdGF0ZXApZmlsZTsKKyAgICBzdHJtID0gJihzdGF0ZS0+c3RybSk7CisKKyAgICAvKiBjaGVjayB0aGF0IHdlJ3JlIHdyaXRpbmcgYW5kIHRoYXQgdGhlcmUncyBubyBlcnJvciAqLworICAgIGlmIChzdGF0ZS0+bW9kZSAhPSBHWl9XUklURSB8fCBzdGF0ZS0+ZXJyICE9IFpfT0spCisgICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKworICAgIC8qIGlmIG5vIGNoYW5nZSBpcyByZXF1ZXN0ZWQsIHRoZW4gZG8gbm90aGluZyAqLworICAgIGlmIChsZXZlbCA9PSBzdGF0ZS0+bGV2ZWwgJiYgc3RyYXRlZ3kgPT0gc3RhdGUtPnN0cmF0ZWd5KQorICAgICAgICByZXR1cm4gWl9PSzsKKworICAgIC8qIGNoZWNrIGZvciBzZWVrIHJlcXVlc3QgKi8KKyAgICBpZiAoc3RhdGUtPnNlZWspIHsKKyAgICAgICAgc3RhdGUtPnNlZWsgPSAwOworICAgICAgICBpZiAoZ3pfemVybyhzdGF0ZSwgc3RhdGUtPnNraXApID09IC0xKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qIGNoYW5nZSBjb21wcmVzc2lvbiBwYXJhbWV0ZXJzIGZvciBzdWJzZXF1ZW50IGlucHV0ICovCisgICAgaWYgKHN0YXRlLT5zaXplKSB7CisgICAgICAgIC8qIGZsdXNoIHByZXZpb3VzIGlucHV0IHdpdGggcHJldmlvdXMgcGFyYW1ldGVycyBiZWZvcmUgY2hhbmdpbmcgKi8KKyAgICAgICAgaWYgKHN0cm0tPmF2YWlsX2luICYmIGd6X2NvbXAoc3RhdGUsIFpfUEFSVElBTF9GTFVTSCkgPT0gLTEpCisgICAgICAgICAgICByZXR1cm4gc3RhdGUtPmVycjsKKyAgICAgICAgZGVmbGF0ZVBhcmFtcyhzdHJtLCBsZXZlbCwgc3RyYXRlZ3kpOworICAgIH0KKyAgICBzdGF0ZS0+bGV2ZWwgPSBsZXZlbDsKKyAgICBzdGF0ZS0+c3RyYXRlZ3kgPSBzdHJhdGVneTsKKyAgICByZXR1cm4gWl9PSzsKK30KKworLyogLS0gc2VlIHpsaWIuaCAtLSAqLworaW50IFpFWFBPUlQgZ3pjbG9zZV93KGZpbGUpCisgICAgZ3pGaWxlIGZpbGU7Cit7CisgICAgaW50IHJldCA9IFpfT0s7CisgICAgZ3pfc3RhdGVwIHN0YXRlOworCisgICAgLyogZ2V0IGludGVybmFsIHN0cnVjdHVyZSAqLworICAgIGlmIChmaWxlID09IE5VTEwpCisgICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKyAgICBzdGF0ZSA9IChnel9zdGF0ZXApZmlsZTsKKworICAgIC8qIGNoZWNrIHRoYXQgd2UncmUgd3JpdGluZyAqLworICAgIGlmIChzdGF0ZS0+bW9kZSAhPSBHWl9XUklURSkKKyAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworCisgICAgLyogY2hlY2sgZm9yIHNlZWsgcmVxdWVzdCAqLworICAgIGlmIChzdGF0ZS0+c2VlaykgeworICAgICAgICBzdGF0ZS0+c2VlayA9IDA7CisgICAgICAgIGlmIChnel96ZXJvKHN0YXRlLCBzdGF0ZS0+c2tpcCkgPT0gLTEpCisgICAgICAgICAgICByZXQgPSBzdGF0ZS0+ZXJyOworICAgIH0KKworICAgIC8qIGZsdXNoLCBmcmVlIG1lbW9yeSwgYW5kIGNsb3NlIGZpbGUgKi8KKyAgICBpZiAoZ3pfY29tcChzdGF0ZSwgWl9GSU5JU0gpID09IC0xKQorICAgICAgICByZXQgPSBzdGF0ZS0+ZXJyOworICAgIGlmICghc3RhdGUtPmRpcmVjdCkgeworICAgICAgICAodm9pZClkZWZsYXRlRW5kKCYoc3RhdGUtPnN0cm0pKTsKKyAgICAgICAgZnJlZShzdGF0ZS0+b3V0KTsKKyAgICB9CisgICAgZnJlZShzdGF0ZS0+aW4pOworICAgIGd6X2Vycm9yKHN0YXRlLCBaX09LLCBOVUxMKTsKKyAgICBmcmVlKHN0YXRlLT5wYXRoKTsKKyAgICBpZiAoY2xvc2Uoc3RhdGUtPmZkKSA9PSAtMSkKKyAgICAgICAgcmV0ID0gWl9FUlJOTzsKKyAgICBmcmVlKHN0YXRlKTsKKyAgICByZXR1cm4gcmV0OworfQorCisvKiB1c2VkIGJ5IHpsaWJWZXJzaW9uKCkgdG8gZ2V0IHRoZSB2c25wcmludGYgc3RvcnkgZnJvbSB0aGUgaG9yc2UncyBtb3V0aCAqLwordW5zaWduZWQgbG9uZyBaRVhQT1JUIGd6ZmxhZ3MoKQoreworICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOworI2lmIGRlZmluZWQoU1REQykgfHwgZGVmaW5lZChaX0hBVkVfU1REQVJHX0gpCisjICBpZmRlZiBOT192c25wcmludGYKKyAgICBmbGFncyArPSAxTCA8PCAyNTsKKyMgICAgaWZkZWYgSEFTX3ZzcHJpbnRmX3ZvaWQKKyAgICBmbGFncyArPSAxTCA8PCAyNjsKKyMgICAgZW5kaWYKKyMgIGVsc2UKKyMgICAgaWZkZWYgSEFTX3ZzbnByaW50Zl92b2lkCisgICAgZmxhZ3MgKz0gMUwgPDwgMjY7CisjICAgIGVuZGlmCisjICBlbmRpZgorI2Vsc2UKKyAgICBmbGFncyArPSAxTCA8PCAyNDsKKyMgIGlmZGVmIE5PX3NucHJpbnRmCisgICAgZmxhZ3MgKz0gMUwgPDwgMjU7CisjICAgIGlmZGVmIEhBU19zcHJpbnRmX3ZvaWQKKyAgICBmbGFncyArPSAxTCA8PCAyNjsKKyMgICAgZW5kaWYKKyMgIGVsc2UKKyMgICAgaWZkZWYgSEFTX3NucHJpbnRmX3ZvaWQKKyAgICBmbGFncyArPSAxTCA8PCAyNjsKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjZW5kaWYKKyAgICByZXR1cm4gZmxhZ3M7Cit9CmRpZmYgLS1naXQgYS96bGliLTEuMi42L2luZmJhY2suYyBiL3psaWItMS4yLjYvaW5mYmFjay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4MWFmZjEKLS0tIC9kZXYvbnVsbAorKysgYi96bGliLTEuMi42L2luZmJhY2suYwpAQCAtMCwwICsxLDY0MCBAQAorLyogaW5mYmFjay5jIC0tIGluZmxhdGUgdXNpbmcgYSBjYWxsLWJhY2sgaW50ZXJmYWNlCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAxMSBNYXJrIEFkbGVyCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCisgKi8KKworLyoKKyAgIFRoaXMgY29kZSBpcyBsYXJnZWx5IGNvcGllZCBmcm9tIGluZmxhdGUuYy4gIE5vcm1hbGx5IGVpdGhlciBpbmZiYWNrLm8gb3IKKyAgIGluZmxhdGUubyB3b3VsZCBiZSBsaW5rZWQgaW50byBhbiBhcHBsaWNhdGlvbi0tbm90IGJvdGguICBUaGUgaW50ZXJmYWNlCisgICB3aXRoIGluZmZhc3QuYyBpcyByZXRhaW5lZCBzbyB0aGF0IG9wdGltaXplZCBhc3NlbWJsZXItY29kZWQgdmVyc2lvbnMgb2YKKyAgIGluZmxhdGVfZmFzdCgpIGNhbiBiZSB1c2VkIHdpdGggZWl0aGVyIGluZmxhdGUuYyBvciBpbmZiYWNrLmMuCisgKi8KKworI2luY2x1ZGUgInp1dGlsLmgiCisjaW5jbHVkZSAiaW5mdHJlZXMuaCIKKyNpbmNsdWRlICJpbmZsYXRlLmgiCisjaW5jbHVkZSAiaW5mZmFzdC5oIgorCisvKiBmdW5jdGlvbiBwcm90b3R5cGVzICovCitsb2NhbCB2b2lkIGZpeGVkdGFibGVzIE9GKChzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKnN0YXRlKSk7CisKKy8qCisgICBzdHJtIHByb3ZpZGVzIG1lbW9yeSBhbGxvY2F0aW9uIGZ1bmN0aW9ucyBpbiB6YWxsb2MgYW5kIHpmcmVlLCBvcgorICAgWl9OVUxMIHRvIHVzZSB0aGUgbGlicmFyeSBtZW1vcnkgYWxsb2NhdGlvbiBmdW5jdGlvbnMuCisKKyAgIHdpbmRvd0JpdHMgaXMgaW4gdGhlIHJhbmdlIDguLjE1LCBhbmQgd2luZG93IGlzIGEgdXNlci1zdXBwbGllZAorICAgd2luZG93IGFuZCBvdXRwdXQgYnVmZmVyIHRoYXQgaXMgMioqd2luZG93Qml0cyBieXRlcy4KKyAqLworaW50IFpFWFBPUlQgaW5mbGF0ZUJhY2tJbml0XyhzdHJtLCB3aW5kb3dCaXRzLCB3aW5kb3csIHZlcnNpb24sIHN0cmVhbV9zaXplKQorel9zdHJlYW1wIHN0cm07CitpbnQgd2luZG93Qml0czsKK3Vuc2lnbmVkIGNoYXIgRkFSICp3aW5kb3c7Citjb25zdCBjaGFyICp2ZXJzaW9uOworaW50IHN0cmVhbV9zaXplOworeworICAgIHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqc3RhdGU7CisKKyAgICBpZiAodmVyc2lvbiA9PSBaX05VTEwgfHwgdmVyc2lvblswXSAhPSBaTElCX1ZFUlNJT05bMF0gfHwKKyAgICAgICAgc3RyZWFtX3NpemUgIT0gKGludCkoc2l6ZW9mKHpfc3RyZWFtKSkpCisgICAgICAgIHJldHVybiBaX1ZFUlNJT05fRVJST1I7CisgICAgaWYgKHN0cm0gPT0gWl9OVUxMIHx8IHdpbmRvdyA9PSBaX05VTEwgfHwKKyAgICAgICAgd2luZG93Qml0cyA8IDggfHwgd2luZG93Qml0cyA+IDE1KQorICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisgICAgc3RybS0+bXNnID0gWl9OVUxMOyAgICAgICAgICAgICAgICAgLyogaW4gY2FzZSB3ZSByZXR1cm4gYW4gZXJyb3IgKi8KKyAgICBpZiAoc3RybS0+emFsbG9jID09IChhbGxvY19mdW5jKTApIHsKKyNpZmRlZiBaX1NPTE8KKyAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworI2Vsc2UKKyAgICAgICAgc3RybS0+emFsbG9jID0gemNhbGxvYzsKKyAgICAgICAgc3RybS0+b3BhcXVlID0gKHZvaWRwZikwOworI2VuZGlmCisgICAgfQorICAgIGlmIChzdHJtLT56ZnJlZSA9PSAoZnJlZV9mdW5jKTApCisjaWZkZWYgWl9TT0xPCisgICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKyNlbHNlCisgICAgc3RybS0+emZyZWUgPSB6Y2ZyZWU7CisjZW5kaWYKKyAgICBzdGF0ZSA9IChzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKilaQUxMT0Moc3RybSwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBpbmZsYXRlX3N0YXRlKSk7CisgICAgaWYgKHN0YXRlID09IFpfTlVMTCkgcmV0dXJuIFpfTUVNX0VSUk9SOworICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogYWxsb2NhdGVkXG4iKSk7CisgICAgc3RybS0+c3RhdGUgPSAoc3RydWN0IGludGVybmFsX3N0YXRlIEZBUiAqKXN0YXRlOworICAgIHN0YXRlLT5kbWF4ID0gMzI3NjhVOworICAgIHN0YXRlLT53Yml0cyA9IHdpbmRvd0JpdHM7CisgICAgc3RhdGUtPndzaXplID0gMVUgPDwgd2luZG93Qml0czsKKyAgICBzdGF0ZS0+d2luZG93ID0gd2luZG93OworICAgIHN0YXRlLT53bmV4dCA9IDA7CisgICAgc3RhdGUtPndoYXZlID0gMDsKKyAgICByZXR1cm4gWl9PSzsKK30KKworLyoKKyAgIFJldHVybiBzdGF0ZSB3aXRoIGxlbmd0aCBhbmQgZGlzdGFuY2UgZGVjb2RpbmcgdGFibGVzIGFuZCBpbmRleCBzaXplcyBzZXQgdG8KKyAgIGZpeGVkIGNvZGUgZGVjb2RpbmcuICBOb3JtYWxseSB0aGlzIHJldHVybnMgZml4ZWQgdGFibGVzIGZyb20gaW5mZml4ZWQuaC4KKyAgIElmIEJVSUxERklYRUQgaXMgZGVmaW5lZCwgdGhlbiBpbnN0ZWFkIHRoaXMgcm91dGluZSBidWlsZHMgdGhlIHRhYmxlcyB0aGUKKyAgIGZpcnN0IHRpbWUgaXQncyBjYWxsZWQsIGFuZCByZXR1cm5zIHRob3NlIHRhYmxlcyB0aGUgZmlyc3QgdGltZSBhbmQKKyAgIHRoZXJlYWZ0ZXIuICBUaGlzIHJlZHVjZXMgdGhlIHNpemUgb2YgdGhlIGNvZGUgYnkgYWJvdXQgMksgYnl0ZXMsIGluCisgICBleGNoYW5nZSBmb3IgYSBsaXR0bGUgZXhlY3V0aW9uIHRpbWUuICBIb3dldmVyLCBCVUlMREZJWEVEIHNob3VsZCBub3QgYmUKKyAgIHVzZWQgZm9yIHRocmVhZGVkIGFwcGxpY2F0aW9ucywgc2luY2UgdGhlIHJld3JpdGluZyBvZiB0aGUgdGFibGVzIGFuZCB2aXJnaW4KKyAgIG1heSBub3QgYmUgdGhyZWFkLXNhZmUuCisgKi8KK2xvY2FsIHZvaWQgZml4ZWR0YWJsZXMoc3RhdGUpCitzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKnN0YXRlOworeworI2lmZGVmIEJVSUxERklYRUQKKyAgICBzdGF0aWMgaW50IHZpcmdpbiA9IDE7CisgICAgc3RhdGljIGNvZGUgKmxlbmZpeCwgKmRpc3RmaXg7CisgICAgc3RhdGljIGNvZGUgZml4ZWRbNTQ0XTsKKworICAgIC8qIGJ1aWxkIGZpeGVkIGh1ZmZtYW4gdGFibGVzIGlmIGZpcnN0IGNhbGwgKG1heSBub3QgYmUgdGhyZWFkIHNhZmUpICovCisgICAgaWYgKHZpcmdpbikgeworICAgICAgICB1bnNpZ25lZCBzeW0sIGJpdHM7CisgICAgICAgIHN0YXRpYyBjb2RlICpuZXh0OworCisgICAgICAgIC8qIGxpdGVyYWwvbGVuZ3RoIHRhYmxlICovCisgICAgICAgIHN5bSA9IDA7CisgICAgICAgIHdoaWxlIChzeW0gPCAxNDQpIHN0YXRlLT5sZW5zW3N5bSsrXSA9IDg7CisgICAgICAgIHdoaWxlIChzeW0gPCAyNTYpIHN0YXRlLT5sZW5zW3N5bSsrXSA9IDk7CisgICAgICAgIHdoaWxlIChzeW0gPCAyODApIHN0YXRlLT5sZW5zW3N5bSsrXSA9IDc7CisgICAgICAgIHdoaWxlIChzeW0gPCAyODgpIHN0YXRlLT5sZW5zW3N5bSsrXSA9IDg7CisgICAgICAgIG5leHQgPSBmaXhlZDsKKyAgICAgICAgbGVuZml4ID0gbmV4dDsKKyAgICAgICAgYml0cyA9IDk7CisgICAgICAgIGluZmxhdGVfdGFibGUoTEVOUywgc3RhdGUtPmxlbnMsIDI4OCwgJihuZXh0KSwgJihiaXRzKSwgc3RhdGUtPndvcmspOworCisgICAgICAgIC8qIGRpc3RhbmNlIHRhYmxlICovCisgICAgICAgIHN5bSA9IDA7CisgICAgICAgIHdoaWxlIChzeW0gPCAzMikgc3RhdGUtPmxlbnNbc3ltKytdID0gNTsKKyAgICAgICAgZGlzdGZpeCA9IG5leHQ7CisgICAgICAgIGJpdHMgPSA1OworICAgICAgICBpbmZsYXRlX3RhYmxlKERJU1RTLCBzdGF0ZS0+bGVucywgMzIsICYobmV4dCksICYoYml0cyksIHN0YXRlLT53b3JrKTsKKworICAgICAgICAvKiBkbyB0aGlzIGp1c3Qgb25jZSAqLworICAgICAgICB2aXJnaW4gPSAwOworICAgIH0KKyNlbHNlIC8qICFCVUlMREZJWEVEICovCisjICAgaW5jbHVkZSAiaW5mZml4ZWQuaCIKKyNlbmRpZiAvKiBCVUlMREZJWEVEICovCisgICAgc3RhdGUtPmxlbmNvZGUgPSBsZW5maXg7CisgICAgc3RhdGUtPmxlbmJpdHMgPSA5OworICAgIHN0YXRlLT5kaXN0Y29kZSA9IGRpc3RmaXg7CisgICAgc3RhdGUtPmRpc3RiaXRzID0gNTsKK30KKworLyogTWFjcm9zIGZvciBpbmZsYXRlQmFjaygpOiAqLworCisvKiBMb2FkIHJldHVybmVkIHN0YXRlIGZyb20gaW5mbGF0ZV9mYXN0KCkgKi8KKyNkZWZpbmUgTE9BRCgpIFwKKyAgICBkbyB7IFwKKyAgICAgICAgcHV0ID0gc3RybS0+bmV4dF9vdXQ7IFwKKyAgICAgICAgbGVmdCA9IHN0cm0tPmF2YWlsX291dDsgXAorICAgICAgICBuZXh0ID0gc3RybS0+bmV4dF9pbjsgXAorICAgICAgICBoYXZlID0gc3RybS0+YXZhaWxfaW47IFwKKyAgICAgICAgaG9sZCA9IHN0YXRlLT5ob2xkOyBcCisgICAgICAgIGJpdHMgPSBzdGF0ZS0+Yml0czsgXAorICAgIH0gd2hpbGUgKDApCisKKy8qIFNldCBzdGF0ZSBmcm9tIHJlZ2lzdGVycyBmb3IgaW5mbGF0ZV9mYXN0KCkgKi8KKyNkZWZpbmUgUkVTVE9SRSgpIFwKKyAgICBkbyB7IFwKKyAgICAgICAgc3RybS0+bmV4dF9vdXQgPSBwdXQ7IFwKKyAgICAgICAgc3RybS0+YXZhaWxfb3V0ID0gbGVmdDsgXAorICAgICAgICBzdHJtLT5uZXh0X2luID0gbmV4dDsgXAorICAgICAgICBzdHJtLT5hdmFpbF9pbiA9IGhhdmU7IFwKKyAgICAgICAgc3RhdGUtPmhvbGQgPSBob2xkOyBcCisgICAgICAgIHN0YXRlLT5iaXRzID0gYml0czsgXAorICAgIH0gd2hpbGUgKDApCisKKy8qIENsZWFyIHRoZSBpbnB1dCBiaXQgYWNjdW11bGF0b3IgKi8KKyNkZWZpbmUgSU5JVEJJVFMoKSBcCisgICAgZG8geyBcCisgICAgICAgIGhvbGQgPSAwOyBcCisgICAgICAgIGJpdHMgPSAwOyBcCisgICAgfSB3aGlsZSAoMCkKKworLyogQXNzdXJlIHRoYXQgc29tZSBpbnB1dCBpcyBhdmFpbGFibGUuICBJZiBpbnB1dCBpcyByZXF1ZXN0ZWQsIGJ1dCBkZW5pZWQsCisgICB0aGVuIHJldHVybiBhIFpfQlVGX0VSUk9SIGZyb20gaW5mbGF0ZUJhY2soKS4gKi8KKyNkZWZpbmUgUFVMTCgpIFwKKyAgICBkbyB7IFwKKyAgICAgICAgaWYgKGhhdmUgPT0gMCkgeyBcCisgICAgICAgICAgICBoYXZlID0gaW4oaW5fZGVzYywgJm5leHQpOyBcCisgICAgICAgICAgICBpZiAoaGF2ZSA9PSAwKSB7IFwKKyAgICAgICAgICAgICAgICBuZXh0ID0gWl9OVUxMOyBcCisgICAgICAgICAgICAgICAgcmV0ID0gWl9CVUZfRVJST1I7IFwKKyAgICAgICAgICAgICAgICBnb3RvIGluZl9sZWF2ZTsgXAorICAgICAgICAgICAgfSBcCisgICAgICAgIH0gXAorICAgIH0gd2hpbGUgKDApCisKKy8qIEdldCBhIGJ5dGUgb2YgaW5wdXQgaW50byB0aGUgYml0IGFjY3VtdWxhdG9yLCBvciByZXR1cm4gZnJvbSBpbmZsYXRlQmFjaygpCisgICB3aXRoIGFuIGVycm9yIGlmIHRoZXJlIGlzIG5vIGlucHV0IGF2YWlsYWJsZS4gKi8KKyNkZWZpbmUgUFVMTEJZVEUoKSBcCisgICAgZG8geyBcCisgICAgICAgIFBVTEwoKTsgXAorICAgICAgICBoYXZlLS07IFwKKyAgICAgICAgaG9sZCArPSAodW5zaWduZWQgbG9uZykoKm5leHQrKykgPDwgYml0czsgXAorICAgICAgICBiaXRzICs9IDg7IFwKKyAgICB9IHdoaWxlICgwKQorCisvKiBBc3N1cmUgdGhhdCB0aGVyZSBhcmUgYXQgbGVhc3QgbiBiaXRzIGluIHRoZSBiaXQgYWNjdW11bGF0b3IuICBJZiB0aGVyZSBpcworICAgbm90IGVub3VnaCBhdmFpbGFibGUgaW5wdXQgdG8gZG8gdGhhdCwgdGhlbiByZXR1cm4gZnJvbSBpbmZsYXRlQmFjaygpIHdpdGgKKyAgIGFuIGVycm9yLiAqLworI2RlZmluZSBORUVEQklUUyhuKSBcCisgICAgZG8geyBcCisgICAgICAgIHdoaWxlIChiaXRzIDwgKHVuc2lnbmVkKShuKSkgXAorICAgICAgICAgICAgUFVMTEJZVEUoKTsgXAorICAgIH0gd2hpbGUgKDApCisKKy8qIFJldHVybiB0aGUgbG93IG4gYml0cyBvZiB0aGUgYml0IGFjY3VtdWxhdG9yIChuIDwgMTYpICovCisjZGVmaW5lIEJJVFMobikgXAorICAgICgodW5zaWduZWQpaG9sZCAmICgoMVUgPDwgKG4pKSAtIDEpKQorCisvKiBSZW1vdmUgbiBiaXRzIGZyb20gdGhlIGJpdCBhY2N1bXVsYXRvciAqLworI2RlZmluZSBEUk9QQklUUyhuKSBcCisgICAgZG8geyBcCisgICAgICAgIGhvbGQgPj49IChuKTsgXAorICAgICAgICBiaXRzIC09ICh1bnNpZ25lZCkobik7IFwKKyAgICB9IHdoaWxlICgwKQorCisvKiBSZW1vdmUgemVybyB0byBzZXZlbiBiaXRzIGFzIG5lZWRlZCB0byBnbyB0byBhIGJ5dGUgYm91bmRhcnkgKi8KKyNkZWZpbmUgQllURUJJVFMoKSBcCisgICAgZG8geyBcCisgICAgICAgIGhvbGQgPj49IGJpdHMgJiA3OyBcCisgICAgICAgIGJpdHMgLT0gYml0cyAmIDc7IFwKKyAgICB9IHdoaWxlICgwKQorCisvKiBBc3N1cmUgdGhhdCBzb21lIG91dHB1dCBzcGFjZSBpcyBhdmFpbGFibGUsIGJ5IHdyaXRpbmcgb3V0IHRoZSB3aW5kb3cKKyAgIGlmIGl0J3MgZnVsbC4gIElmIHRoZSB3cml0ZSBmYWlscywgcmV0dXJuIGZyb20gaW5mbGF0ZUJhY2soKSB3aXRoIGEKKyAgIFpfQlVGX0VSUk9SLiAqLworI2RlZmluZSBST09NKCkgXAorICAgIGRvIHsgXAorICAgICAgICBpZiAobGVmdCA9PSAwKSB7IFwKKyAgICAgICAgICAgIHB1dCA9IHN0YXRlLT53aW5kb3c7IFwKKyAgICAgICAgICAgIGxlZnQgPSBzdGF0ZS0+d3NpemU7IFwKKyAgICAgICAgICAgIHN0YXRlLT53aGF2ZSA9IGxlZnQ7IFwKKyAgICAgICAgICAgIGlmIChvdXQob3V0X2Rlc2MsIHB1dCwgbGVmdCkpIHsgXAorICAgICAgICAgICAgICAgIHJldCA9IFpfQlVGX0VSUk9SOyBcCisgICAgICAgICAgICAgICAgZ290byBpbmZfbGVhdmU7IFwKKyAgICAgICAgICAgIH0gXAorICAgICAgICB9IFwKKyAgICB9IHdoaWxlICgwKQorCisvKgorICAgc3RybSBwcm92aWRlcyB0aGUgbWVtb3J5IGFsbG9jYXRpb24gZnVuY3Rpb25zIGFuZCB3aW5kb3cgYnVmZmVyIG9uIGlucHV0LAorICAgYW5kIHByb3ZpZGVzIGluZm9ybWF0aW9uIG9uIHRoZSB1bnVzZWQgaW5wdXQgb24gcmV0dXJuLiAgRm9yIFpfREFUQV9FUlJPUgorICAgcmV0dXJucywgc3RybSB3aWxsIGFsc28gcHJvdmlkZSBhbiBlcnJvciBtZXNzYWdlLgorCisgICBpbigpIGFuZCBvdXQoKSBhcmUgdGhlIGNhbGwtYmFjayBpbnB1dCBhbmQgb3V0cHV0IGZ1bmN0aW9ucy4gIFdoZW4KKyAgIGluZmxhdGVCYWNrKCkgbmVlZHMgbW9yZSBpbnB1dCwgaXQgY2FsbHMgaW4oKS4gIFdoZW4gaW5mbGF0ZUJhY2soKSBoYXMKKyAgIGZpbGxlZCB0aGUgd2luZG93IHdpdGggb3V0cHV0LCBvciB3aGVuIGl0IGNvbXBsZXRlcyB3aXRoIGRhdGEgaW4gdGhlCisgICB3aW5kb3csIGl0IGNhbGxzIG91dCgpIHRvIHdyaXRlIG91dCB0aGUgZGF0YS4gIFRoZSBhcHBsaWNhdGlvbiBtdXN0IG5vdAorICAgY2hhbmdlIHRoZSBwcm92aWRlZCBpbnB1dCB1bnRpbCBpbigpIGlzIGNhbGxlZCBhZ2FpbiBvciBpbmZsYXRlQmFjaygpCisgICByZXR1cm5zLiAgVGhlIGFwcGxpY2F0aW9uIG11c3Qgbm90IGNoYW5nZSB0aGUgd2luZG93L291dHB1dCBidWZmZXIgdW50aWwKKyAgIGluZmxhdGVCYWNrKCkgcmV0dXJucy4KKworICAgaW4oKSBhbmQgb3V0KCkgYXJlIGNhbGxlZCB3aXRoIGEgZGVzY3JpcHRvciBwYXJhbWV0ZXIgcHJvdmlkZWQgaW4gdGhlCisgICBpbmZsYXRlQmFjaygpIGNhbGwuICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBzdHJ1Y3R1cmUgdGhhdCBwcm92aWRlcyB0aGUKKyAgIGluZm9ybWF0aW9uIHJlcXVpcmVkIHRvIGRvIHRoZSByZWFkIG9yIHdyaXRlLCBhcyB3ZWxsIGFzIGFjY3VtdWxhdGVkCisgICBpbmZvcm1hdGlvbiBvbiB0aGUgaW5wdXQgYW5kIG91dHB1dCBzdWNoIGFzIHRvdGFscyBhbmQgY2hlY2sgdmFsdWVzLgorCisgICBpbigpIHNob3VsZCByZXR1cm4gemVybyBvbiBmYWlsdXJlLiAgb3V0KCkgc2hvdWxkIHJldHVybiBub24temVybyBvbgorICAgZmFpbHVyZS4gIElmIGVpdGhlciBpbigpIG9yIG91dCgpIGZhaWxzLCB0aGFuIGluZmxhdGVCYWNrKCkgcmV0dXJucyBhCisgICBaX0JVRl9FUlJPUi4gIHN0cm0tPm5leHRfaW4gY2FuIGJlIGNoZWNrZWQgZm9yIFpfTlVMTCB0byBzZWUgd2hldGhlciBpdAorICAgd2FzIGluKCkgb3Igb3V0KCkgdGhhdCBjYXVzZWQgaW4gdGhlIGVycm9yLiAgT3RoZXJ3aXNlLCAgaW5mbGF0ZUJhY2soKQorICAgcmV0dXJucyBaX1NUUkVBTV9FTkQgb24gc3VjY2VzcywgWl9EQVRBX0VSUk9SIGZvciBhbiBkZWZsYXRlIGZvcm1hdAorICAgZXJyb3IsIG9yIFpfTUVNX0VSUk9SIGlmIGl0IGNvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBzdGF0ZS4KKyAgIGluZmxhdGVCYWNrKCkgY2FuIGFsc28gcmV0dXJuIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBpbnB1dCBwYXJhbWV0ZXJzCisgICBhcmUgbm90IGNvcnJlY3QsIGkuZS4gc3RybSBpcyBaX05VTEwgb3IgdGhlIHN0YXRlIHdhcyBub3QgaW5pdGlhbGl6ZWQuCisgKi8KK2ludCBaRVhQT1JUIGluZmxhdGVCYWNrKHN0cm0sIGluLCBpbl9kZXNjLCBvdXQsIG91dF9kZXNjKQorel9zdHJlYW1wIHN0cm07Citpbl9mdW5jIGluOwordm9pZCBGQVIgKmluX2Rlc2M7CitvdXRfZnVuYyBvdXQ7Cit2b2lkIEZBUiAqb3V0X2Rlc2M7Cit7CisgICAgc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICpzdGF0ZTsKKyAgICB1bnNpZ25lZCBjaGFyIEZBUiAqbmV4dDsgICAgLyogbmV4dCBpbnB1dCAqLworICAgIHVuc2lnbmVkIGNoYXIgRkFSICpwdXQ7ICAgICAvKiBuZXh0IG91dHB1dCAqLworICAgIHVuc2lnbmVkIGhhdmUsIGxlZnQ7ICAgICAgICAvKiBhdmFpbGFibGUgaW5wdXQgYW5kIG91dHB1dCAqLworICAgIHVuc2lnbmVkIGxvbmcgaG9sZDsgICAgICAgICAvKiBiaXQgYnVmZmVyICovCisgICAgdW5zaWduZWQgYml0czsgICAgICAgICAgICAgIC8qIGJpdHMgaW4gYml0IGJ1ZmZlciAqLworICAgIHVuc2lnbmVkIGNvcHk7ICAgICAgICAgICAgICAvKiBudW1iZXIgb2Ygc3RvcmVkIG9yIG1hdGNoIGJ5dGVzIHRvIGNvcHkgKi8KKyAgICB1bnNpZ25lZCBjaGFyIEZBUiAqZnJvbTsgICAgLyogd2hlcmUgdG8gY29weSBtYXRjaCBieXRlcyBmcm9tICovCisgICAgY29kZSBoZXJlOyAgICAgICAgICAgICAgICAgIC8qIGN1cnJlbnQgZGVjb2RpbmcgdGFibGUgZW50cnkgKi8KKyAgICBjb2RlIGxhc3Q7ICAgICAgICAgICAgICAgICAgLyogcGFyZW50IHRhYmxlIGVudHJ5ICovCisgICAgdW5zaWduZWQgbGVuOyAgICAgICAgICAgICAgIC8qIGxlbmd0aCB0byBjb3B5IGZvciByZXBlYXRzLCBiaXRzIHRvIGRyb3AgKi8KKyAgICBpbnQgcmV0OyAgICAgICAgICAgICAgICAgICAgLyogcmV0dXJuIGNvZGUgKi8KKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgb3JkZXJbMTldID0gLyogcGVybXV0YXRpb24gb2YgY29kZSBsZW5ndGhzICovCisgICAgICAgIHsxNiwgMTcsIDE4LCAwLCA4LCA3LCA5LCA2LCAxMCwgNSwgMTEsIDQsIDEyLCAzLCAxMywgMiwgMTQsIDEsIDE1fTsKKworICAgIC8qIENoZWNrIHRoYXQgdGhlIHN0cm0gZXhpc3RzIGFuZCB0aGF0IHRoZSBzdGF0ZSB3YXMgaW5pdGlhbGl6ZWQgKi8KKyAgICBpZiAoc3RybSA9PSBaX05VTEwgfHwgc3RybS0+c3RhdGUgPT0gWl9OVUxMKQorICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisgICAgc3RhdGUgPSAoc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICopc3RybS0+c3RhdGU7CisKKyAgICAvKiBSZXNldCB0aGUgc3RhdGUgKi8KKyAgICBzdHJtLT5tc2cgPSBaX05VTEw7CisgICAgc3RhdGUtPm1vZGUgPSBUWVBFOworICAgIHN0YXRlLT5sYXN0ID0gMDsKKyAgICBzdGF0ZS0+d2hhdmUgPSAwOworICAgIG5leHQgPSBzdHJtLT5uZXh0X2luOworICAgIGhhdmUgPSBuZXh0ICE9IFpfTlVMTCA/IHN0cm0tPmF2YWlsX2luIDogMDsKKyAgICBob2xkID0gMDsKKyAgICBiaXRzID0gMDsKKyAgICBwdXQgPSBzdGF0ZS0+d2luZG93OworICAgIGxlZnQgPSBzdGF0ZS0+d3NpemU7CisKKyAgICAvKiBJbmZsYXRlIHVudGlsIGVuZCBvZiBibG9jayBtYXJrZWQgYXMgbGFzdCAqLworICAgIGZvciAoOzspCisgICAgICAgIHN3aXRjaCAoc3RhdGUtPm1vZGUpIHsKKyAgICAgICAgY2FzZSBUWVBFOgorICAgICAgICAgICAgLyogZGV0ZXJtaW5lIGFuZCBkaXNwYXRjaCBibG9jayB0eXBlICovCisgICAgICAgICAgICBpZiAoc3RhdGUtPmxhc3QpIHsKKyAgICAgICAgICAgICAgICBCWVRFQklUUygpOworICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gRE9ORTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIE5FRURCSVRTKDMpOworICAgICAgICAgICAgc3RhdGUtPmxhc3QgPSBCSVRTKDEpOworICAgICAgICAgICAgRFJPUEJJVFMoMSk7CisgICAgICAgICAgICBzd2l0Y2ggKEJJVFMoMikpIHsKKyAgICAgICAgICAgIGNhc2UgMDogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0b3JlZCBibG9jayAqLworICAgICAgICAgICAgICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICAgIHN0b3JlZCBibG9jayVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPmxhc3QgPyAiIChsYXN0KSIgOiAiIikpOworICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gU1RPUkVEOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZml4ZWQgYmxvY2sgKi8KKyAgICAgICAgICAgICAgICBmaXhlZHRhYmxlcyhzdGF0ZSk7CisgICAgICAgICAgICAgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgZml4ZWQgY29kZXMgYmxvY2slc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5sYXN0ID8gIiAobGFzdCkiIDogIiIpKTsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IExFTjsgICAgICAgICAgICAgIC8qIGRlY29kZSBjb2RlcyAqLworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZHluYW1pYyBibG9jayAqLworICAgICAgICAgICAgICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICAgIGR5bmFtaWMgY29kZXMgYmxvY2slc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5sYXN0ID8gIiAobGFzdCkiIDogIiIpKTsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IFRBQkxFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgYmxvY2sgdHlwZSI7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBEUk9QQklUUygyKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgU1RPUkVEOgorICAgICAgICAgICAgLyogZ2V0IGFuZCB2ZXJpZnkgc3RvcmVkIGJsb2NrIGxlbmd0aCAqLworICAgICAgICAgICAgQllURUJJVFMoKTsgICAgICAgICAgICAgICAgICAgICAgICAgLyogZ28gdG8gYnl0ZSBib3VuZGFyeSAqLworICAgICAgICAgICAgTkVFREJJVFMoMzIpOworICAgICAgICAgICAgaWYgKChob2xkICYgMHhmZmZmKSAhPSAoKGhvbGQgPj4gMTYpIF4gMHhmZmZmKSkgeworICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgc3RvcmVkIGJsb2NrIGxlbmd0aHMiOworICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdGUtPmxlbmd0aCA9ICh1bnNpZ25lZClob2xkICYgMHhmZmZmOworICAgICAgICAgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgICBzdG9yZWQgbGVuZ3RoICV1XG4iLAorICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bGVuZ3RoKSk7CisgICAgICAgICAgICBJTklUQklUUygpOworCisgICAgICAgICAgICAvKiBjb3B5IHN0b3JlZCBibG9jayBmcm9tIGlucHV0IHRvIG91dHB1dCAqLworICAgICAgICAgICAgd2hpbGUgKHN0YXRlLT5sZW5ndGggIT0gMCkgeworICAgICAgICAgICAgICAgIGNvcHkgPSBzdGF0ZS0+bGVuZ3RoOworICAgICAgICAgICAgICAgIFBVTEwoKTsKKyAgICAgICAgICAgICAgICBST09NKCk7CisgICAgICAgICAgICAgICAgaWYgKGNvcHkgPiBoYXZlKSBjb3B5ID0gaGF2ZTsKKyAgICAgICAgICAgICAgICBpZiAoY29weSA+IGxlZnQpIGNvcHkgPSBsZWZ0OworICAgICAgICAgICAgICAgIHptZW1jcHkocHV0LCBuZXh0LCBjb3B5KTsKKyAgICAgICAgICAgICAgICBoYXZlIC09IGNvcHk7CisgICAgICAgICAgICAgICAgbmV4dCArPSBjb3B5OworICAgICAgICAgICAgICAgIGxlZnQgLT0gY29weTsKKyAgICAgICAgICAgICAgICBwdXQgKz0gY29weTsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bGVuZ3RoIC09IGNvcHk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6ICAgICAgIHN0b3JlZCBlbmRcbiIpKTsKKyAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gVFlQRTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgVEFCTEU6CisgICAgICAgICAgICAvKiBnZXQgZHluYW1pYyB0YWJsZSBlbnRyaWVzIGRlc2NyaXB0b3IgKi8KKyAgICAgICAgICAgIE5FRURCSVRTKDE0KTsKKyAgICAgICAgICAgIHN0YXRlLT5ubGVuID0gQklUUyg1KSArIDI1NzsKKyAgICAgICAgICAgIERST1BCSVRTKDUpOworICAgICAgICAgICAgc3RhdGUtPm5kaXN0ID0gQklUUyg1KSArIDE7CisgICAgICAgICAgICBEUk9QQklUUyg1KTsKKyAgICAgICAgICAgIHN0YXRlLT5uY29kZSA9IEJJVFMoNCkgKyA0OworICAgICAgICAgICAgRFJPUEJJVFMoNCk7CisjaWZuZGVmIFBLWklQX0JVR19XT1JLQVJPVU5ECisgICAgICAgICAgICBpZiAoc3RhdGUtPm5sZW4gPiAyODYgfHwgc3RhdGUtPm5kaXN0ID4gMzApIHsKKyAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJ0b28gbWFueSBsZW5ndGggb3IgZGlzdGFuY2Ugc3ltYm9scyI7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgdGFibGUgc2l6ZXMgb2tcbiIpKTsKKworICAgICAgICAgICAgLyogZ2V0IGNvZGUgbGVuZ3RoIGNvZGUgbGVuZ3RocyAobm90IGEgdHlwbykgKi8KKyAgICAgICAgICAgIHN0YXRlLT5oYXZlID0gMDsKKyAgICAgICAgICAgIHdoaWxlIChzdGF0ZS0+aGF2ZSA8IHN0YXRlLT5uY29kZSkgeworICAgICAgICAgICAgICAgIE5FRURCSVRTKDMpOworICAgICAgICAgICAgICAgIHN0YXRlLT5sZW5zW29yZGVyW3N0YXRlLT5oYXZlKytdXSA9ICh1bnNpZ25lZCBzaG9ydClCSVRTKDMpOworICAgICAgICAgICAgICAgIERST1BCSVRTKDMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd2hpbGUgKHN0YXRlLT5oYXZlIDwgMTkpCisgICAgICAgICAgICAgICAgc3RhdGUtPmxlbnNbb3JkZXJbc3RhdGUtPmhhdmUrK11dID0gMDsKKyAgICAgICAgICAgIHN0YXRlLT5uZXh0ID0gc3RhdGUtPmNvZGVzOworICAgICAgICAgICAgc3RhdGUtPmxlbmNvZGUgPSAoY29kZSBjb25zdCBGQVIgKikoc3RhdGUtPm5leHQpOworICAgICAgICAgICAgc3RhdGUtPmxlbmJpdHMgPSA3OworICAgICAgICAgICAgcmV0ID0gaW5mbGF0ZV90YWJsZShDT0RFUywgc3RhdGUtPmxlbnMsIDE5LCAmKHN0YXRlLT5uZXh0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihzdGF0ZS0+bGVuYml0cyksIHN0YXRlLT53b3JrKTsKKyAgICAgICAgICAgIGlmIChyZXQpIHsKKyAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGNvZGUgbGVuZ3RocyBzZXQiOworICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgICBjb2RlIGxlbmd0aHMgb2tcbiIpKTsKKworICAgICAgICAgICAgLyogZ2V0IGxlbmd0aCBhbmQgZGlzdGFuY2UgY29kZSBjb2RlIGxlbmd0aHMgKi8KKyAgICAgICAgICAgIHN0YXRlLT5oYXZlID0gMDsKKyAgICAgICAgICAgIHdoaWxlIChzdGF0ZS0+aGF2ZSA8IHN0YXRlLT5ubGVuICsgc3RhdGUtPm5kaXN0KSB7CisgICAgICAgICAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgICAgICAgICBoZXJlID0gc3RhdGUtPmxlbmNvZGVbQklUUyhzdGF0ZS0+bGVuYml0cyldOworICAgICAgICAgICAgICAgICAgICBpZiAoKHVuc2lnbmVkKShoZXJlLmJpdHMpIDw9IGJpdHMpIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBQVUxMQllURSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoaGVyZS52YWwgPCAxNikgeworICAgICAgICAgICAgICAgICAgICBEUk9QQklUUyhoZXJlLmJpdHMpOworICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bGVuc1tzdGF0ZS0+aGF2ZSsrXSA9IGhlcmUudmFsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGhlcmUudmFsID09IDE2KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBORUVEQklUUyhoZXJlLmJpdHMgKyAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIERST1BCSVRTKGhlcmUuYml0cyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUtPmhhdmUgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgYml0IGxlbmd0aCByZXBlYXQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gKHVuc2lnbmVkKShzdGF0ZS0+bGVuc1tzdGF0ZS0+aGF2ZSAtIDFdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvcHkgPSAzICsgQklUUygyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIERST1BCSVRTKDIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGhlcmUudmFsID09IDE3KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBORUVEQklUUyhoZXJlLmJpdHMgKyAzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIERST1BCSVRTKGhlcmUuYml0cyk7CisgICAgICAgICAgICAgICAgICAgICAgICBsZW4gPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgY29weSA9IDMgKyBCSVRTKDMpOworICAgICAgICAgICAgICAgICAgICAgICAgRFJPUEJJVFMoMyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBORUVEQklUUyhoZXJlLmJpdHMgKyA3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIERST1BCSVRTKGhlcmUuYml0cyk7CisgICAgICAgICAgICAgICAgICAgICAgICBsZW4gPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgY29weSA9IDExICsgQklUUyg3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIERST1BCSVRTKDcpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS0+aGF2ZSArIGNvcHkgPiBzdGF0ZS0+bmxlbiArIHN0YXRlLT5uZGlzdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBiaXQgbGVuZ3RoIHJlcGVhdCI7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChjb3B5LS0pCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bGVuc1tzdGF0ZS0+aGF2ZSsrXSA9ICh1bnNpZ25lZCBzaG9ydClsZW47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBoYW5kbGUgZXJyb3IgYnJlYWtzIGluIHdoaWxlICovCisgICAgICAgICAgICBpZiAoc3RhdGUtPm1vZGUgPT0gQkFEKSBicmVhazsKKworICAgICAgICAgICAgLyogY2hlY2sgZm9yIGVuZC1vZi1ibG9jayBjb2RlIChiZXR0ZXIgaGF2ZSBvbmUpICovCisgICAgICAgICAgICBpZiAoc3RhdGUtPmxlbnNbMjU2XSA9PSAwKSB7CisgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBjb2RlIC0tIG1pc3NpbmcgZW5kLW9mLWJsb2NrIjsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogYnVpbGQgY29kZSB0YWJsZXMgLS0gbm90ZTogZG8gbm90IGNoYW5nZSB0aGUgbGVuYml0cyBvciBkaXN0Yml0cworICAgICAgICAgICAgICAgdmFsdWVzIGhlcmUgKDkgYW5kIDYpIHdpdGhvdXQgcmVhZGluZyB0aGUgY29tbWVudHMgaW4gaW5mdHJlZXMuaAorICAgICAgICAgICAgICAgY29uY2VybmluZyB0aGUgRU5PVUdIIGNvbnN0YW50cywgd2hpY2ggZGVwZW5kIG9uIHRob3NlIHZhbHVlcyAqLworICAgICAgICAgICAgc3RhdGUtPm5leHQgPSBzdGF0ZS0+Y29kZXM7CisgICAgICAgICAgICBzdGF0ZS0+bGVuY29kZSA9IChjb2RlIGNvbnN0IEZBUiAqKShzdGF0ZS0+bmV4dCk7CisgICAgICAgICAgICBzdGF0ZS0+bGVuYml0cyA9IDk7CisgICAgICAgICAgICByZXQgPSBpbmZsYXRlX3RhYmxlKExFTlMsIHN0YXRlLT5sZW5zLCBzdGF0ZS0+bmxlbiwgJihzdGF0ZS0+bmV4dCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYoc3RhdGUtPmxlbmJpdHMpLCBzdGF0ZS0+d29yayk7CisgICAgICAgICAgICBpZiAocmV0KSB7CisgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBsaXRlcmFsL2xlbmd0aHMgc2V0IjsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXRlLT5kaXN0Y29kZSA9IChjb2RlIGNvbnN0IEZBUiAqKShzdGF0ZS0+bmV4dCk7CisgICAgICAgICAgICBzdGF0ZS0+ZGlzdGJpdHMgPSA2OworICAgICAgICAgICAgcmV0ID0gaW5mbGF0ZV90YWJsZShESVNUUywgc3RhdGUtPmxlbnMgKyBzdGF0ZS0+bmxlbiwgc3RhdGUtPm5kaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYoc3RhdGUtPm5leHQpLCAmKHN0YXRlLT5kaXN0Yml0cyksIHN0YXRlLT53b3JrKTsKKyAgICAgICAgICAgIGlmIChyZXQpIHsKKyAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGRpc3RhbmNlcyBzZXQiOworICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgICBjb2RlcyBva1xuIikpOworICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBMRU47CisKKyAgICAgICAgY2FzZSBMRU46CisgICAgICAgICAgICAvKiB1c2UgaW5mbGF0ZV9mYXN0KCkgaWYgd2UgaGF2ZSBlbm91Z2ggaW5wdXQgYW5kIG91dHB1dCAqLworICAgICAgICAgICAgaWYgKGhhdmUgPj0gNiAmJiBsZWZ0ID49IDI1OCkgeworICAgICAgICAgICAgICAgIFJFU1RPUkUoKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdGUtPndoYXZlIDwgc3RhdGUtPndzaXplKQorICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+d2hhdmUgPSBzdGF0ZS0+d3NpemUgLSBsZWZ0OworICAgICAgICAgICAgICAgIGluZmxhdGVfZmFzdChzdHJtLCBzdGF0ZS0+d3NpemUpOworICAgICAgICAgICAgICAgIExPQUQoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogZ2V0IGEgbGl0ZXJhbCwgbGVuZ3RoLCBvciBlbmQtb2YtYmxvY2sgY29kZSAqLworICAgICAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgICAgIGhlcmUgPSBzdGF0ZS0+bGVuY29kZVtCSVRTKHN0YXRlLT5sZW5iaXRzKV07CisgICAgICAgICAgICAgICAgaWYgKCh1bnNpZ25lZCkoaGVyZS5iaXRzKSA8PSBiaXRzKSBicmVhazsKKyAgICAgICAgICAgICAgICBQVUxMQllURSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGhlcmUub3AgJiYgKGhlcmUub3AgJiAweGYwKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgbGFzdCA9IGhlcmU7CisgICAgICAgICAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgICAgICAgICBoZXJlID0gc3RhdGUtPmxlbmNvZGVbbGFzdC52YWwgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCSVRTKGxhc3QuYml0cyArIGxhc3Qub3ApID4+IGxhc3QuYml0cyldOworICAgICAgICAgICAgICAgICAgICBpZiAoKHVuc2lnbmVkKShsYXN0LmJpdHMgKyBoZXJlLmJpdHMpIDw9IGJpdHMpIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBQVUxMQllURSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBEUk9QQklUUyhsYXN0LmJpdHMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRFJPUEJJVFMoaGVyZS5iaXRzKTsKKyAgICAgICAgICAgIHN0YXRlLT5sZW5ndGggPSAodW5zaWduZWQpaGVyZS52YWw7CisKKyAgICAgICAgICAgIC8qIHByb2Nlc3MgbGl0ZXJhbCAqLworICAgICAgICAgICAgaWYgKGhlcmUub3AgPT0gMCkgeworICAgICAgICAgICAgICAgIFRyYWNldnYoKHN0ZGVyciwgaGVyZS52YWwgPj0gMHgyMCAmJiBoZXJlLnZhbCA8IDB4N2YgPworICAgICAgICAgICAgICAgICAgICAgICAgImluZmxhdGU6ICAgICAgICAgbGl0ZXJhbCAnJWMnXG4iIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICJpbmZsYXRlOiAgICAgICAgIGxpdGVyYWwgMHglMDJ4XG4iLCBoZXJlLnZhbCkpOworICAgICAgICAgICAgICAgIFJPT00oKTsKKyAgICAgICAgICAgICAgICAqcHV0KysgPSAodW5zaWduZWQgY2hhcikoc3RhdGUtPmxlbmd0aCk7CisgICAgICAgICAgICAgICAgbGVmdC0tOworICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gTEVOOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBwcm9jZXNzIGVuZCBvZiBibG9jayAqLworICAgICAgICAgICAgaWYgKGhlcmUub3AgJiAzMikgeworICAgICAgICAgICAgICAgIFRyYWNldnYoKHN0ZGVyciwgImluZmxhdGU6ICAgICAgICAgZW5kIG9mIGJsb2NrXG4iKSk7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBUWVBFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBpbnZhbGlkIGNvZGUgKi8KKyAgICAgICAgICAgIGlmIChoZXJlLm9wICYgNjQpIHsKKyAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGxpdGVyYWwvbGVuZ3RoIGNvZGUiOworICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBsZW5ndGggY29kZSAtLSBnZXQgZXh0cmEgYml0cywgaWYgYW55ICovCisgICAgICAgICAgICBzdGF0ZS0+ZXh0cmEgPSAodW5zaWduZWQpKGhlcmUub3ApICYgMTU7CisgICAgICAgICAgICBpZiAoc3RhdGUtPmV4dHJhICE9IDApIHsKKyAgICAgICAgICAgICAgICBORUVEQklUUyhzdGF0ZS0+ZXh0cmEpOworICAgICAgICAgICAgICAgIHN0YXRlLT5sZW5ndGggKz0gQklUUyhzdGF0ZS0+ZXh0cmEpOworICAgICAgICAgICAgICAgIERST1BCSVRTKHN0YXRlLT5leHRyYSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBUcmFjZXZ2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgICAgIGxlbmd0aCAldVxuIiwgc3RhdGUtPmxlbmd0aCkpOworCisgICAgICAgICAgICAvKiBnZXQgZGlzdGFuY2UgY29kZSAqLworICAgICAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgICAgIGhlcmUgPSBzdGF0ZS0+ZGlzdGNvZGVbQklUUyhzdGF0ZS0+ZGlzdGJpdHMpXTsKKyAgICAgICAgICAgICAgICBpZiAoKHVuc2lnbmVkKShoZXJlLmJpdHMpIDw9IGJpdHMpIGJyZWFrOworICAgICAgICAgICAgICAgIFBVTExCWVRFKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKGhlcmUub3AgJiAweGYwKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgbGFzdCA9IGhlcmU7CisgICAgICAgICAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgICAgICAgICBoZXJlID0gc3RhdGUtPmRpc3Rjb2RlW2xhc3QudmFsICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQklUUyhsYXN0LmJpdHMgKyBsYXN0Lm9wKSA+PiBsYXN0LmJpdHMpXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCh1bnNpZ25lZCkobGFzdC5iaXRzICsgaGVyZS5iaXRzKSA8PSBiaXRzKSBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgUFVMTEJZVEUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgRFJPUEJJVFMobGFzdC5iaXRzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIERST1BCSVRTKGhlcmUuYml0cyk7CisgICAgICAgICAgICBpZiAoaGVyZS5vcCAmIDY0KSB7CisgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBkaXN0YW5jZSBjb2RlIjsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXRlLT5vZmZzZXQgPSAodW5zaWduZWQpaGVyZS52YWw7CisKKyAgICAgICAgICAgIC8qIGdldCBkaXN0YW5jZSBleHRyYSBiaXRzLCBpZiBhbnkgKi8KKyAgICAgICAgICAgIHN0YXRlLT5leHRyYSA9ICh1bnNpZ25lZCkoaGVyZS5vcCkgJiAxNTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS0+ZXh0cmEgIT0gMCkgeworICAgICAgICAgICAgICAgIE5FRURCSVRTKHN0YXRlLT5leHRyYSk7CisgICAgICAgICAgICAgICAgc3RhdGUtPm9mZnNldCArPSBCSVRTKHN0YXRlLT5leHRyYSk7CisgICAgICAgICAgICAgICAgRFJPUEJJVFMoc3RhdGUtPmV4dHJhKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdGF0ZS0+b2Zmc2V0ID4gc3RhdGUtPndzaXplIC0gKHN0YXRlLT53aGF2ZSA8IHN0YXRlLT53c2l6ZSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0IDogMCkpIHsKKyAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayI7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBUcmFjZXZ2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgICAgIGRpc3RhbmNlICV1XG4iLCBzdGF0ZS0+b2Zmc2V0KSk7CisKKyAgICAgICAgICAgIC8qIGNvcHkgbWF0Y2ggZnJvbSB3aW5kb3cgdG8gb3V0cHV0ICovCisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgUk9PTSgpOworICAgICAgICAgICAgICAgIGNvcHkgPSBzdGF0ZS0+d3NpemUgLSBzdGF0ZS0+b2Zmc2V0OworICAgICAgICAgICAgICAgIGlmIChjb3B5IDwgbGVmdCkgeworICAgICAgICAgICAgICAgICAgICBmcm9tID0gcHV0ICsgY29weTsKKyAgICAgICAgICAgICAgICAgICAgY29weSA9IGxlZnQgLSBjb3B5OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZnJvbSA9IHB1dCAtIHN0YXRlLT5vZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgIGNvcHkgPSBsZWZ0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoY29weSA+IHN0YXRlLT5sZW5ndGgpIGNvcHkgPSBzdGF0ZS0+bGVuZ3RoOworICAgICAgICAgICAgICAgIHN0YXRlLT5sZW5ndGggLT0gY29weTsKKyAgICAgICAgICAgICAgICBsZWZ0IC09IGNvcHk7CisgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICAqcHV0KysgPSAqZnJvbSsrOworICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tY29weSk7CisgICAgICAgICAgICB9IHdoaWxlIChzdGF0ZS0+bGVuZ3RoICE9IDApOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBET05FOgorICAgICAgICAgICAgLyogaW5mbGF0ZSBzdHJlYW0gdGVybWluYXRlZCBwcm9wZXJseSAtLSB3cml0ZSBsZWZ0b3ZlciBvdXRwdXQgKi8KKyAgICAgICAgICAgIHJldCA9IFpfU1RSRUFNX0VORDsKKyAgICAgICAgICAgIGlmIChsZWZ0IDwgc3RhdGUtPndzaXplKSB7CisgICAgICAgICAgICAgICAgaWYgKG91dChvdXRfZGVzYywgc3RhdGUtPndpbmRvdywgc3RhdGUtPndzaXplIC0gbGVmdCkpCisgICAgICAgICAgICAgICAgICAgIHJldCA9IFpfQlVGX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZ290byBpbmZfbGVhdmU7CisKKyAgICAgICAgY2FzZSBCQUQ6CisgICAgICAgICAgICByZXQgPSBaX0RBVEFfRVJST1I7CisgICAgICAgICAgICBnb3RvIGluZl9sZWF2ZTsKKworICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAvKiBjYW4ndCBoYXBwZW4sIGJ1dCBtYWtlcyBjb21waWxlcnMgaGFwcHkgKi8KKyAgICAgICAgICAgIHJldCA9IFpfU1RSRUFNX0VSUk9SOworICAgICAgICAgICAgZ290byBpbmZfbGVhdmU7CisgICAgICAgIH0KKworICAgIC8qIFJldHVybiB1bnVzZWQgaW5wdXQgKi8KKyAgaW5mX2xlYXZlOgorICAgIHN0cm0tPm5leHRfaW4gPSBuZXh0OworICAgIHN0cm0tPmF2YWlsX2luID0gaGF2ZTsKKyAgICByZXR1cm4gcmV0OworfQorCitpbnQgWkVYUE9SVCBpbmZsYXRlQmFja0VuZChzdHJtKQorel9zdHJlYW1wIHN0cm07Cit7CisgICAgaWYgKHN0cm0gPT0gWl9OVUxMIHx8IHN0cm0tPnN0YXRlID09IFpfTlVMTCB8fCBzdHJtLT56ZnJlZSA9PSAoZnJlZV9mdW5jKTApCisgICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKyAgICBaRlJFRShzdHJtLCBzdHJtLT5zdGF0ZSk7CisgICAgc3RybS0+c3RhdGUgPSBaX05VTEw7CisgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiBlbmRcbiIpKTsKKyAgICByZXR1cm4gWl9PSzsKK30KZGlmZiAtLWdpdCBhL3psaWItMS4yLjYvaW5mZmFzdC5jIGIvemxpYi0xLjIuNi9pbmZmYXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmYxZDYwYgotLS0gL2Rldi9udWxsCisrKyBiL3psaWItMS4yLjYvaW5mZmFzdC5jCkBAIC0wLDAgKzEsMzQwIEBACisvKiBpbmZmYXN0LmMgLS0gZmFzdCBkZWNvZGluZworICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDgsIDIwMTAgTWFyayBBZGxlcgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAorICovCisKKyNpbmNsdWRlICJ6dXRpbC5oIgorI2luY2x1ZGUgImluZnRyZWVzLmgiCisjaW5jbHVkZSAiaW5mbGF0ZS5oIgorI2luY2x1ZGUgImluZmZhc3QuaCIKKworI2lmbmRlZiBBU01JTkYKKworLyogQWxsb3cgbWFjaGluZSBkZXBlbmRlbnQgb3B0aW1pemF0aW9uIGZvciBwb3N0LWluY3JlbWVudCBvciBwcmUtaW5jcmVtZW50LgorICAgQmFzZWQgb24gdGVzdGluZyB0byBkYXRlLAorICAgUHJlLWluY3JlbWVudCBwcmVmZXJyZWQgZm9yOgorICAgLSBQb3dlclBDIEczIChBZGxlcikKKyAgIC0gTUlQUyBSNTAwMCAoUmFuZGVycy1QZWhyc29uKQorICAgUG9zdC1pbmNyZW1lbnQgcHJlZmVycmVkIGZvcjoKKyAgIC0gbm9uZQorICAgTm8gbWVhc3VyYWJsZSBkaWZmZXJlbmNlOgorICAgLSBQZW50aXVtIElJSSAoQW5kZXJzb24pCisgICAtIE02ODA2MCAoTmlrbCkKKyAqLworI2lmZGVmIFBPU1RJTkMKKyMgIGRlZmluZSBPRkYgMAorIyAgZGVmaW5lIFBVUChhKSAqKGEpKysKKyNlbHNlCisjICBkZWZpbmUgT0ZGIDEKKyMgIGRlZmluZSBQVVAoYSkgKisrKGEpCisjZW5kaWYKKworLyoKKyAgIERlY29kZSBsaXRlcmFsLCBsZW5ndGgsIGFuZCBkaXN0YW5jZSBjb2RlcyBhbmQgd3JpdGUgb3V0IHRoZSByZXN1bHRpbmcKKyAgIGxpdGVyYWwgYW5kIG1hdGNoIGJ5dGVzIHVudGlsIGVpdGhlciBub3QgZW5vdWdoIGlucHV0IG9yIG91dHB1dCBpcworICAgYXZhaWxhYmxlLCBhbiBlbmQtb2YtYmxvY2sgaXMgZW5jb3VudGVyZWQsIG9yIGEgZGF0YSBlcnJvciBpcyBlbmNvdW50ZXJlZC4KKyAgIFdoZW4gbGFyZ2UgZW5vdWdoIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVycyBhcmUgc3VwcGxpZWQgdG8gaW5mbGF0ZSgpLCBmb3IKKyAgIGV4YW1wbGUsIGEgMTZLIGlucHV0IGJ1ZmZlciBhbmQgYSA2NEsgb3V0cHV0IGJ1ZmZlciwgbW9yZSB0aGFuIDk1JSBvZiB0aGUKKyAgIGluZmxhdGUgZXhlY3V0aW9uIHRpbWUgaXMgc3BlbnQgaW4gdGhpcyByb3V0aW5lLgorCisgICBFbnRyeSBhc3N1bXB0aW9uczoKKworICAgICAgICBzdGF0ZS0+bW9kZSA9PSBMRU4KKyAgICAgICAgc3RybS0+YXZhaWxfaW4gPj0gNgorICAgICAgICBzdHJtLT5hdmFpbF9vdXQgPj0gMjU4CisgICAgICAgIHN0YXJ0ID49IHN0cm0tPmF2YWlsX291dAorICAgICAgICBzdGF0ZS0+Yml0cyA8IDgKKworICAgT24gcmV0dXJuLCBzdGF0ZS0+bW9kZSBpcyBvbmUgb2Y6CisKKyAgICAgICAgTEVOIC0tIHJhbiBvdXQgb2YgZW5vdWdoIG91dHB1dCBzcGFjZSBvciBlbm91Z2ggYXZhaWxhYmxlIGlucHV0CisgICAgICAgIFRZUEUgLS0gcmVhY2hlZCBlbmQgb2YgYmxvY2sgY29kZSwgaW5mbGF0ZSgpIHRvIGludGVycHJldCBuZXh0IGJsb2NrCisgICAgICAgIEJBRCAtLSBlcnJvciBpbiBibG9jayBkYXRhCisKKyAgIE5vdGVzOgorCisgICAgLSBUaGUgbWF4aW11bSBpbnB1dCBiaXRzIHVzZWQgYnkgYSBsZW5ndGgvZGlzdGFuY2UgcGFpciBpcyAxNSBiaXRzIGZvciB0aGUKKyAgICAgIGxlbmd0aCBjb2RlLCA1IGJpdHMgZm9yIHRoZSBsZW5ndGggZXh0cmEsIDE1IGJpdHMgZm9yIHRoZSBkaXN0YW5jZSBjb2RlLAorICAgICAgYW5kIDEzIGJpdHMgZm9yIHRoZSBkaXN0YW5jZSBleHRyYS4gIFRoaXMgdG90YWxzIDQ4IGJpdHMsIG9yIHNpeCBieXRlcy4KKyAgICAgIFRoZXJlZm9yZSBpZiBzdHJtLT5hdmFpbF9pbiA+PSA2LCB0aGVuIHRoZXJlIGlzIGVub3VnaCBpbnB1dCB0byBhdm9pZAorICAgICAgY2hlY2tpbmcgZm9yIGF2YWlsYWJsZSBpbnB1dCB3aGlsZSBkZWNvZGluZy4KKworICAgIC0gVGhlIG1heGltdW0gYnl0ZXMgdGhhdCBhIHNpbmdsZSBsZW5ndGgvZGlzdGFuY2UgcGFpciBjYW4gb3V0cHV0IGlzIDI1OAorICAgICAgYnl0ZXMsIHdoaWNoIGlzIHRoZSBtYXhpbXVtIGxlbmd0aCB0aGF0IGNhbiBiZSBjb2RlZC4gIGluZmxhdGVfZmFzdCgpCisgICAgICByZXF1aXJlcyBzdHJtLT5hdmFpbF9vdXQgPj0gMjU4IGZvciBlYWNoIGxvb3AgdG8gYXZvaWQgY2hlY2tpbmcgZm9yCisgICAgICBvdXRwdXQgc3BhY2UuCisgKi8KK3ZvaWQgWkxJQl9JTlRFUk5BTCBpbmZsYXRlX2Zhc3Qoc3RybSwgc3RhcnQpCit6X3N0cmVhbXAgc3RybTsKK3Vuc2lnbmVkIHN0YXJ0OyAgICAgICAgIC8qIGluZmxhdGUoKSdzIHN0YXJ0aW5nIHZhbHVlIGZvciBzdHJtLT5hdmFpbF9vdXQgKi8KK3sKKyAgICBzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKnN0YXRlOworICAgIHVuc2lnbmVkIGNoYXIgRkFSICppbjsgICAgICAvKiBsb2NhbCBzdHJtLT5uZXh0X2luICovCisgICAgdW5zaWduZWQgY2hhciBGQVIgKmxhc3Q7ICAgIC8qIHdoaWxlIGluIDwgbGFzdCwgZW5vdWdoIGlucHV0IGF2YWlsYWJsZSAqLworICAgIHVuc2lnbmVkIGNoYXIgRkFSICpvdXQ7ICAgICAvKiBsb2NhbCBzdHJtLT5uZXh0X291dCAqLworICAgIHVuc2lnbmVkIGNoYXIgRkFSICpiZWc7ICAgICAvKiBpbmZsYXRlKCkncyBpbml0aWFsIHN0cm0tPm5leHRfb3V0ICovCisgICAgdW5zaWduZWQgY2hhciBGQVIgKmVuZDsgICAgIC8qIHdoaWxlIG91dCA8IGVuZCwgZW5vdWdoIHNwYWNlIGF2YWlsYWJsZSAqLworI2lmZGVmIElORkxBVEVfU1RSSUNUCisgICAgdW5zaWduZWQgZG1heDsgICAgICAgICAgICAgIC8qIG1heGltdW0gZGlzdGFuY2UgZnJvbSB6bGliIGhlYWRlciAqLworI2VuZGlmCisgICAgdW5zaWduZWQgd3NpemU7ICAgICAgICAgICAgIC8qIHdpbmRvdyBzaXplIG9yIHplcm8gaWYgbm90IHVzaW5nIHdpbmRvdyAqLworICAgIHVuc2lnbmVkIHdoYXZlOyAgICAgICAgICAgICAvKiB2YWxpZCBieXRlcyBpbiB0aGUgd2luZG93ICovCisgICAgdW5zaWduZWQgd25leHQ7ICAgICAgICAgICAgIC8qIHdpbmRvdyB3cml0ZSBpbmRleCAqLworICAgIHVuc2lnbmVkIGNoYXIgRkFSICp3aW5kb3c7ICAvKiBhbGxvY2F0ZWQgc2xpZGluZyB3aW5kb3csIGlmIHdzaXplICE9IDAgKi8KKyAgICB1bnNpZ25lZCBsb25nIGhvbGQ7ICAgICAgICAgLyogbG9jYWwgc3RybS0+aG9sZCAqLworICAgIHVuc2lnbmVkIGJpdHM7ICAgICAgICAgICAgICAvKiBsb2NhbCBzdHJtLT5iaXRzICovCisgICAgY29kZSBjb25zdCBGQVIgKmxjb2RlOyAgICAgIC8qIGxvY2FsIHN0cm0tPmxlbmNvZGUgKi8KKyAgICBjb2RlIGNvbnN0IEZBUiAqZGNvZGU7ICAgICAgLyogbG9jYWwgc3RybS0+ZGlzdGNvZGUgKi8KKyAgICB1bnNpZ25lZCBsbWFzazsgICAgICAgICAgICAgLyogbWFzayBmb3IgZmlyc3QgbGV2ZWwgb2YgbGVuZ3RoIGNvZGVzICovCisgICAgdW5zaWduZWQgZG1hc2s7ICAgICAgICAgICAgIC8qIG1hc2sgZm9yIGZpcnN0IGxldmVsIG9mIGRpc3RhbmNlIGNvZGVzICovCisgICAgY29kZSBoZXJlOyAgICAgICAgICAgICAgICAgIC8qIHJldHJpZXZlZCB0YWJsZSBlbnRyeSAqLworICAgIHVuc2lnbmVkIG9wOyAgICAgICAgICAgICAgICAvKiBjb2RlIGJpdHMsIG9wZXJhdGlvbiwgZXh0cmEgYml0cywgb3IgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIHdpbmRvdyBwb3NpdGlvbiwgd2luZG93IGJ5dGVzIHRvIGNvcHkgKi8KKyAgICB1bnNpZ25lZCBsZW47ICAgICAgICAgICAgICAgLyogbWF0Y2ggbGVuZ3RoLCB1bnVzZWQgYnl0ZXMgKi8KKyAgICB1bnNpZ25lZCBkaXN0OyAgICAgICAgICAgICAgLyogbWF0Y2ggZGlzdGFuY2UgKi8KKyAgICB1bnNpZ25lZCBjaGFyIEZBUiAqZnJvbTsgICAgLyogd2hlcmUgdG8gY29weSBtYXRjaCBmcm9tICovCisKKyAgICAvKiBjb3B5IHN0YXRlIHRvIGxvY2FsIHZhcmlhYmxlcyAqLworICAgIHN0YXRlID0gKHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqKXN0cm0tPnN0YXRlOworICAgIGluID0gc3RybS0+bmV4dF9pbiAtIE9GRjsKKyAgICBsYXN0ID0gaW4gKyAoc3RybS0+YXZhaWxfaW4gLSA1KTsKKyAgICBvdXQgPSBzdHJtLT5uZXh0X291dCAtIE9GRjsKKyAgICBiZWcgPSBvdXQgLSAoc3RhcnQgLSBzdHJtLT5hdmFpbF9vdXQpOworICAgIGVuZCA9IG91dCArIChzdHJtLT5hdmFpbF9vdXQgLSAyNTcpOworI2lmZGVmIElORkxBVEVfU1RSSUNUCisgICAgZG1heCA9IHN0YXRlLT5kbWF4OworI2VuZGlmCisgICAgd3NpemUgPSBzdGF0ZS0+d3NpemU7CisgICAgd2hhdmUgPSBzdGF0ZS0+d2hhdmU7CisgICAgd25leHQgPSBzdGF0ZS0+d25leHQ7CisgICAgd2luZG93ID0gc3RhdGUtPndpbmRvdzsKKyAgICBob2xkID0gc3RhdGUtPmhvbGQ7CisgICAgYml0cyA9IHN0YXRlLT5iaXRzOworICAgIGxjb2RlID0gc3RhdGUtPmxlbmNvZGU7CisgICAgZGNvZGUgPSBzdGF0ZS0+ZGlzdGNvZGU7CisgICAgbG1hc2sgPSAoMVUgPDwgc3RhdGUtPmxlbmJpdHMpIC0gMTsKKyAgICBkbWFzayA9ICgxVSA8PCBzdGF0ZS0+ZGlzdGJpdHMpIC0gMTsKKworICAgIC8qIGRlY29kZSBsaXRlcmFscyBhbmQgbGVuZ3RoL2Rpc3RhbmNlcyB1bnRpbCBlbmQtb2YtYmxvY2sgb3Igbm90IGVub3VnaAorICAgICAgIGlucHV0IGRhdGEgb3Igb3V0cHV0IHNwYWNlICovCisgICAgZG8geworICAgICAgICBpZiAoYml0cyA8IDE1KSB7CisgICAgICAgICAgICBob2xkICs9ICh1bnNpZ25lZCBsb25nKShQVVAoaW4pKSA8PCBiaXRzOworICAgICAgICAgICAgYml0cyArPSA4OworICAgICAgICAgICAgaG9sZCArPSAodW5zaWduZWQgbG9uZykoUFVQKGluKSkgPDwgYml0czsKKyAgICAgICAgICAgIGJpdHMgKz0gODsKKyAgICAgICAgfQorICAgICAgICBoZXJlID0gbGNvZGVbaG9sZCAmIGxtYXNrXTsKKyAgICAgIGRvbGVuOgorICAgICAgICBvcCA9ICh1bnNpZ25lZCkoaGVyZS5iaXRzKTsKKyAgICAgICAgaG9sZCA+Pj0gb3A7CisgICAgICAgIGJpdHMgLT0gb3A7CisgICAgICAgIG9wID0gKHVuc2lnbmVkKShoZXJlLm9wKTsKKyAgICAgICAgaWYgKG9wID09IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxpdGVyYWwgKi8KKyAgICAgICAgICAgIFRyYWNldnYoKHN0ZGVyciwgaGVyZS52YWwgPj0gMHgyMCAmJiBoZXJlLnZhbCA8IDB4N2YgPworICAgICAgICAgICAgICAgICAgICAiaW5mbGF0ZTogICAgICAgICBsaXRlcmFsICclYydcbiIgOgorICAgICAgICAgICAgICAgICAgICAiaW5mbGF0ZTogICAgICAgICBsaXRlcmFsIDB4JTAyeFxuIiwgaGVyZS52YWwpKTsKKyAgICAgICAgICAgIFBVUChvdXQpID0gKHVuc2lnbmVkIGNoYXIpKGhlcmUudmFsKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChvcCAmIDE2KSB7ICAgICAgICAgICAgICAgICAgICAgLyogbGVuZ3RoIGJhc2UgKi8KKyAgICAgICAgICAgIGxlbiA9ICh1bnNpZ25lZCkoaGVyZS52YWwpOworICAgICAgICAgICAgb3AgJj0gMTU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGV4dHJhIGJpdHMgKi8KKyAgICAgICAgICAgIGlmIChvcCkgeworICAgICAgICAgICAgICAgIGlmIChiaXRzIDwgb3ApIHsKKyAgICAgICAgICAgICAgICAgICAgaG9sZCArPSAodW5zaWduZWQgbG9uZykoUFVQKGluKSkgPDwgYml0czsKKyAgICAgICAgICAgICAgICAgICAgYml0cyArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsZW4gKz0gKHVuc2lnbmVkKWhvbGQgJiAoKDFVIDw8IG9wKSAtIDEpOworICAgICAgICAgICAgICAgIGhvbGQgPj49IG9wOworICAgICAgICAgICAgICAgIGJpdHMgLT0gb3A7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBUcmFjZXZ2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgICAgIGxlbmd0aCAldVxuIiwgbGVuKSk7CisgICAgICAgICAgICBpZiAoYml0cyA8IDE1KSB7CisgICAgICAgICAgICAgICAgaG9sZCArPSAodW5zaWduZWQgbG9uZykoUFVQKGluKSkgPDwgYml0czsKKyAgICAgICAgICAgICAgICBiaXRzICs9IDg7CisgICAgICAgICAgICAgICAgaG9sZCArPSAodW5zaWduZWQgbG9uZykoUFVQKGluKSkgPDwgYml0czsKKyAgICAgICAgICAgICAgICBiaXRzICs9IDg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBoZXJlID0gZGNvZGVbaG9sZCAmIGRtYXNrXTsKKyAgICAgICAgICBkb2Rpc3Q6CisgICAgICAgICAgICBvcCA9ICh1bnNpZ25lZCkoaGVyZS5iaXRzKTsKKyAgICAgICAgICAgIGhvbGQgPj49IG9wOworICAgICAgICAgICAgYml0cyAtPSBvcDsKKyAgICAgICAgICAgIG9wID0gKHVuc2lnbmVkKShoZXJlLm9wKTsKKyAgICAgICAgICAgIGlmIChvcCAmIDE2KSB7ICAgICAgICAgICAgICAgICAgICAgIC8qIGRpc3RhbmNlIGJhc2UgKi8KKyAgICAgICAgICAgICAgICBkaXN0ID0gKHVuc2lnbmVkKShoZXJlLnZhbCk7CisgICAgICAgICAgICAgICAgb3AgJj0gMTU7ICAgICAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgZXh0cmEgYml0cyAqLworICAgICAgICAgICAgICAgIGlmIChiaXRzIDwgb3ApIHsKKyAgICAgICAgICAgICAgICAgICAgaG9sZCArPSAodW5zaWduZWQgbG9uZykoUFVQKGluKSkgPDwgYml0czsKKyAgICAgICAgICAgICAgICAgICAgYml0cyArPSA4OworICAgICAgICAgICAgICAgICAgICBpZiAoYml0cyA8IG9wKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBob2xkICs9ICh1bnNpZ25lZCBsb25nKShQVVAoaW4pKSA8PCBiaXRzOworICAgICAgICAgICAgICAgICAgICAgICAgYml0cyArPSA4OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRpc3QgKz0gKHVuc2lnbmVkKWhvbGQgJiAoKDFVIDw8IG9wKSAtIDEpOworI2lmZGVmIElORkxBVEVfU1RSSUNUCisgICAgICAgICAgICAgICAgaWYgKGRpc3QgPiBkbWF4KSB7CisgICAgICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrIjsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgICAgIGhvbGQgPj49IG9wOworICAgICAgICAgICAgICAgIGJpdHMgLT0gb3A7CisgICAgICAgICAgICAgICAgVHJhY2V2digoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgICBkaXN0YW5jZSAldVxuIiwgZGlzdCkpOworICAgICAgICAgICAgICAgIG9wID0gKHVuc2lnbmVkKShvdXQgLSBiZWcpOyAgICAgLyogbWF4IGRpc3RhbmNlIGluIG91dHB1dCAqLworICAgICAgICAgICAgICAgIGlmIChkaXN0ID4gb3ApIHsgICAgICAgICAgICAgICAgLyogc2VlIGlmIGNvcHkgZnJvbSB3aW5kb3cgKi8KKyAgICAgICAgICAgICAgICAgICAgb3AgPSBkaXN0IC0gb3A7ICAgICAgICAgICAgIC8qIGRpc3RhbmNlIGJhY2sgaW4gd2luZG93ICovCisgICAgICAgICAgICAgICAgICAgIGlmIChvcCA+IHdoYXZlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUtPnNhbmUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSJpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisjaWZkZWYgSU5GTEFURV9BTExPV19JTlZBTElEX0RJU1RBTkNFX1RPT0ZBUl9BUlJSCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGVuIDw9IG9wIC0gd2hhdmUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBVUChvdXQpID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICgtLWxlbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBsZW4gLT0gb3AgLSB3aGF2ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQVVAob3V0KSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICgtLW9wID4gd2hhdmUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tID0gb3V0IC0gZGlzdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBVUChvdXQpID0gUFVQKGZyb20pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGZyb20gPSB3aW5kb3cgLSBPRkY7CisgICAgICAgICAgICAgICAgICAgIGlmICh3bmV4dCA9PSAwKSB7ICAgICAgICAgICAvKiB2ZXJ5IGNvbW1vbiBjYXNlICovCisgICAgICAgICAgICAgICAgICAgICAgICBmcm9tICs9IHdzaXplIC0gb3A7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3AgPCBsZW4pIHsgICAgICAgICAvKiBzb21lIGZyb20gd2luZG93ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuIC09IG9wOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFVQKG91dCkgPSBQVVAoZnJvbSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1vcCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSA9IG91dCAtIGRpc3Q7ICAvKiByZXN0IGZyb20gb3V0cHV0ICovCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAod25leHQgPCBvcCkgeyAgICAgIC8qIHdyYXAgYXJvdW5kIHdpbmRvdyAqLworICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSArPSB3c2l6ZSArIHduZXh0IC0gb3A7CisgICAgICAgICAgICAgICAgICAgICAgICBvcCAtPSB3bmV4dDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcCA8IGxlbikgeyAgICAgICAgIC8qIHNvbWUgZnJvbSBlbmQgb2Ygd2luZG93ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuIC09IG9wOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFVQKG91dCkgPSBQVVAoZnJvbSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1vcCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSA9IHdpbmRvdyAtIE9GRjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAod25leHQgPCBsZW4pIHsgIC8qIHNvbWUgZnJvbSBzdGFydCBvZiB3aW5kb3cgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3AgPSB3bmV4dDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuIC09IG9wOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQVVAob3V0KSA9IFBVUChmcm9tKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1vcCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gPSBvdXQgLSBkaXN0OyAgICAgIC8qIHJlc3QgZnJvbSBvdXRwdXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbnRpZ3VvdXMgaW4gd2luZG93ICovCisgICAgICAgICAgICAgICAgICAgICAgICBmcm9tICs9IHduZXh0IC0gb3A7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3AgPCBsZW4pIHsgICAgICAgICAvKiBzb21lIGZyb20gd2luZG93ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuIC09IG9wOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFVQKG91dCkgPSBQVVAoZnJvbSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1vcCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSA9IG91dCAtIGRpc3Q7ICAvKiByZXN0IGZyb20gb3V0cHV0ICovCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGxlbiA+IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFBVUChvdXQpID0gUFVQKGZyb20pOworICAgICAgICAgICAgICAgICAgICAgICAgUFVQKG91dCkgPSBQVVAoZnJvbSk7CisgICAgICAgICAgICAgICAgICAgICAgICBQVVAob3V0KSA9IFBVUChmcm9tKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxlbiAtPSAzOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChsZW4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFBVUChvdXQpID0gUFVQKGZyb20pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxlbiA+IDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFVQKG91dCkgPSBQVVAoZnJvbSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGZyb20gPSBvdXQgLSBkaXN0OyAgICAgICAgICAvKiBjb3B5IGRpcmVjdCBmcm9tIG91dHB1dCAqLworICAgICAgICAgICAgICAgICAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogbWluaW11bSBsZW5ndGggaXMgdGhyZWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIFBVUChvdXQpID0gUFVQKGZyb20pOworICAgICAgICAgICAgICAgICAgICAgICAgUFVQKG91dCkgPSBQVVAoZnJvbSk7CisgICAgICAgICAgICAgICAgICAgICAgICBQVVAob3V0KSA9IFBVUChmcm9tKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxlbiAtPSAzOworICAgICAgICAgICAgICAgICAgICB9IHdoaWxlIChsZW4gPiAyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxlbikgeworICAgICAgICAgICAgICAgICAgICAgICAgUFVQKG91dCkgPSBQVVAoZnJvbSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGVuID4gMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQVVAob3V0KSA9IFBVUChmcm9tKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKChvcCAmIDY0KSA9PSAwKSB7ICAgICAgICAgIC8qIDJuZCBsZXZlbCBkaXN0YW5jZSBjb2RlICovCisgICAgICAgICAgICAgICAgaGVyZSA9IGRjb2RlW2hlcmUudmFsICsgKGhvbGQgJiAoKDFVIDw8IG9wKSAtIDEpKV07CisgICAgICAgICAgICAgICAgZ290byBkb2Rpc3Q7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGRpc3RhbmNlIGNvZGUiOworICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKChvcCAmIDY0KSA9PSAwKSB7ICAgICAgICAgICAgICAvKiAybmQgbGV2ZWwgbGVuZ3RoIGNvZGUgKi8KKyAgICAgICAgICAgIGhlcmUgPSBsY29kZVtoZXJlLnZhbCArIChob2xkICYgKCgxVSA8PCBvcCkgLSAxKSldOworICAgICAgICAgICAgZ290byBkb2xlbjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChvcCAmIDMyKSB7ICAgICAgICAgICAgICAgICAgICAgLyogZW5kLW9mLWJsb2NrICovCisgICAgICAgICAgICBUcmFjZXZ2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgICAgIGVuZCBvZiBibG9ja1xuIikpOworICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBUWVBFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGxpdGVyYWwvbGVuZ3RoIGNvZGUiOworICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0gd2hpbGUgKGluIDwgbGFzdCAmJiBvdXQgPCBlbmQpOworCisgICAgLyogcmV0dXJuIHVudXNlZCBieXRlcyAob24gZW50cnksIGJpdHMgPCA4LCBzbyBpbiB3b24ndCBnbyB0b28gZmFyIGJhY2spICovCisgICAgbGVuID0gYml0cyA+PiAzOworICAgIGluIC09IGxlbjsKKyAgICBiaXRzIC09IGxlbiA8PCAzOworICAgIGhvbGQgJj0gKDFVIDw8IGJpdHMpIC0gMTsKKworICAgIC8qIHVwZGF0ZSBzdGF0ZSBhbmQgcmV0dXJuICovCisgICAgc3RybS0+bmV4dF9pbiA9IGluICsgT0ZGOworICAgIHN0cm0tPm5leHRfb3V0ID0gb3V0ICsgT0ZGOworICAgIHN0cm0tPmF2YWlsX2luID0gKHVuc2lnbmVkKShpbiA8IGxhc3QgPyA1ICsgKGxhc3QgLSBpbikgOiA1IC0gKGluIC0gbGFzdCkpOworICAgIHN0cm0tPmF2YWlsX291dCA9ICh1bnNpZ25lZCkob3V0IDwgZW5kID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI1NyArIChlbmQgLSBvdXQpIDogMjU3IC0gKG91dCAtIGVuZCkpOworICAgIHN0YXRlLT5ob2xkID0gaG9sZDsKKyAgICBzdGF0ZS0+Yml0cyA9IGJpdHM7CisgICAgcmV0dXJuOworfQorCisvKgorICAgaW5mbGF0ZV9mYXN0KCkgc3BlZWR1cHMgdGhhdCB0dXJuZWQgb3V0IHNsb3dlciAob24gYSBQb3dlclBDIEczIDc1MENYZSk6CisgICAtIFVzaW5nIGJpdCBmaWVsZHMgZm9yIGNvZGUgc3RydWN0dXJlCisgICAtIERpZmZlcmVudCBvcCBkZWZpbml0aW9uIHRvIGF2b2lkICYgZm9yIGV4dHJhIGJpdHMgKGRvICYgZm9yIHRhYmxlIGJpdHMpCisgICAtIFRocmVlIHNlcGFyYXRlIGRlY29kaW5nIGRvLWxvb3BzIGZvciBkaXJlY3QsIHdpbmRvdywgYW5kIHduZXh0ID09IDAKKyAgIC0gU3BlY2lhbCBjYXNlIGZvciBkaXN0YW5jZSA+IDEgY29waWVzIHRvIGRvIG92ZXJsYXBwZWQgbG9hZCBhbmQgc3RvcmUgY29weQorICAgLSBFeHBsaWNpdCBicmFuY2ggcHJlZGljdGlvbnMgKGJhc2VkIG9uIG1lYXN1cmVkIGJyYW5jaCBwcm9iYWJpbGl0aWVzKQorICAgLSBEZWZlcnJpbmcgbWF0Y2ggY29weSBhbmQgaW50ZXJzcGVyc2VkIGl0IHdpdGggZGVjb2Rpbmcgc3Vic2VxdWVudCBjb2RlcworICAgLSBTd2FwcGluZyBsaXRlcmFsL2xlbmd0aCBlbHNlCisgICAtIFN3YXBwaW5nIHdpbmRvdy9kaXJlY3QgZWxzZQorICAgLSBMYXJnZXIgdW5yb2xsZWQgY29weSBsb29wcyAodGhyZWUgaXMgYWJvdXQgcmlnaHQpCisgICAtIE1vdmluZyBsZW4gLT0gMyBzdGF0ZW1lbnQgaW50byBtaWRkbGUgb2YgbG9vcAorICovCisKKyNlbmRpZiAvKiAhQVNNSU5GICovCmRpZmYgLS1naXQgYS96bGliLTEuMi42L2luZmZhc3QuaCBiL3psaWItMS4yLjYvaW5mZmFzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1YzFhYTQKLS0tIC9kZXYvbnVsbAorKysgYi96bGliLTEuMi42L2luZmZhc3QuaApAQCAtMCwwICsxLDExIEBACisvKiBpbmZmYXN0LmggLS0gaGVhZGVyIHRvIHVzZSBpbmZmYXN0LmMKKyAqIENvcHlyaWdodCAoQykgMTk5NS0yMDAzLCAyMDEwIE1hcmsgQWRsZXIKKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKKyAqLworCisvKiBXQVJOSU5HOiB0aGlzIGZpbGUgc2hvdWxkICpub3QqIGJlIHVzZWQgYnkgYXBwbGljYXRpb25zLiBJdCBpcworICAgcGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGNvbXByZXNzaW9uIGxpYnJhcnkgYW5kIGlzCisgICBzdWJqZWN0IHRvIGNoYW5nZS4gQXBwbGljYXRpb25zIHNob3VsZCBvbmx5IHVzZSB6bGliLmguCisgKi8KKwordm9pZCBaTElCX0lOVEVSTkFMIGluZmxhdGVfZmFzdCBPRigoel9zdHJlYW1wIHN0cm0sIHVuc2lnbmVkIHN0YXJ0KSk7CmRpZmYgLS1naXQgYS96bGliLTEuMi42L2luZmZpeGVkLmggYi96bGliLTEuMi42L2luZmZpeGVkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDYyODMyNwotLS0gL2Rldi9udWxsCisrKyBiL3psaWItMS4yLjYvaW5mZml4ZWQuaApAQCAtMCwwICsxLDk0IEBACisgICAgLyogaW5mZml4ZWQuaCAtLSB0YWJsZSBmb3IgZGVjb2RpbmcgZml4ZWQgY29kZXMKKyAgICAgKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBtYWtlZml4ZWQoKS4KKyAgICAgKi8KKworICAgIC8qIFdBUk5JTkc6IHRoaXMgZmlsZSBzaG91bGQgKm5vdCogYmUgdXNlZCBieSBhcHBsaWNhdGlvbnMuCisgICAgICAgSXQgaXMgcGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBsaWJyYXJ5IGFuZCBpcworICAgICAgIHN1YmplY3QgdG8gY2hhbmdlLiBBcHBsaWNhdGlvbnMgc2hvdWxkIG9ubHkgdXNlIHpsaWIuaC4KKyAgICAgKi8KKworICAgIHN0YXRpYyBjb25zdCBjb2RlIGxlbmZpeFs1MTJdID0geworICAgICAgICB7OTYsNywwfSx7MCw4LDgwfSx7MCw4LDE2fSx7MjAsOCwxMTV9LHsxOCw3LDMxfSx7MCw4LDExMn0sezAsOCw0OH0sCisgICAgICAgIHswLDksMTkyfSx7MTYsNywxMH0sezAsOCw5Nn0sezAsOCwzMn0sezAsOSwxNjB9LHswLDgsMH0sezAsOCwxMjh9LAorICAgICAgICB7MCw4LDY0fSx7MCw5LDIyNH0sezE2LDcsNn0sezAsOCw4OH0sezAsOCwyNH0sezAsOSwxNDR9LHsxOSw3LDU5fSwKKyAgICAgICAgezAsOCwxMjB9LHswLDgsNTZ9LHswLDksMjA4fSx7MTcsNywxN30sezAsOCwxMDR9LHswLDgsNDB9LHswLDksMTc2fSwKKyAgICAgICAgezAsOCw4fSx7MCw4LDEzNn0sezAsOCw3Mn0sezAsOSwyNDB9LHsxNiw3LDR9LHswLDgsODR9LHswLDgsMjB9LAorICAgICAgICB7MjEsOCwyMjd9LHsxOSw3LDQzfSx7MCw4LDExNn0sezAsOCw1Mn0sezAsOSwyMDB9LHsxNyw3LDEzfSx7MCw4LDEwMH0sCisgICAgICAgIHswLDgsMzZ9LHswLDksMTY4fSx7MCw4LDR9LHswLDgsMTMyfSx7MCw4LDY4fSx7MCw5LDIzMn0sezE2LDcsOH0sCisgICAgICAgIHswLDgsOTJ9LHswLDgsMjh9LHswLDksMTUyfSx7MjAsNyw4M30sezAsOCwxMjR9LHswLDgsNjB9LHswLDksMjE2fSwKKyAgICAgICAgezE4LDcsMjN9LHswLDgsMTA4fSx7MCw4LDQ0fSx7MCw5LDE4NH0sezAsOCwxMn0sezAsOCwxNDB9LHswLDgsNzZ9LAorICAgICAgICB7MCw5LDI0OH0sezE2LDcsM30sezAsOCw4Mn0sezAsOCwxOH0sezIxLDgsMTYzfSx7MTksNywzNX0sezAsOCwxMTR9LAorICAgICAgICB7MCw4LDUwfSx7MCw5LDE5Nn0sezE3LDcsMTF9LHswLDgsOTh9LHswLDgsMzR9LHswLDksMTY0fSx7MCw4LDJ9LAorICAgICAgICB7MCw4LDEzMH0sezAsOCw2Nn0sezAsOSwyMjh9LHsxNiw3LDd9LHswLDgsOTB9LHswLDgsMjZ9LHswLDksMTQ4fSwKKyAgICAgICAgezIwLDcsNjd9LHswLDgsMTIyfSx7MCw4LDU4fSx7MCw5LDIxMn0sezE4LDcsMTl9LHswLDgsMTA2fSx7MCw4LDQyfSwKKyAgICAgICAgezAsOSwxODB9LHswLDgsMTB9LHswLDgsMTM4fSx7MCw4LDc0fSx7MCw5LDI0NH0sezE2LDcsNX0sezAsOCw4Nn0sCisgICAgICAgIHswLDgsMjJ9LHs2NCw4LDB9LHsxOSw3LDUxfSx7MCw4LDExOH0sezAsOCw1NH0sezAsOSwyMDR9LHsxNyw3LDE1fSwKKyAgICAgICAgezAsOCwxMDJ9LHswLDgsMzh9LHswLDksMTcyfSx7MCw4LDZ9LHswLDgsMTM0fSx7MCw4LDcwfSx7MCw5LDIzNn0sCisgICAgICAgIHsxNiw3LDl9LHswLDgsOTR9LHswLDgsMzB9LHswLDksMTU2fSx7MjAsNyw5OX0sezAsOCwxMjZ9LHswLDgsNjJ9LAorICAgICAgICB7MCw5LDIyMH0sezE4LDcsMjd9LHswLDgsMTEwfSx7MCw4LDQ2fSx7MCw5LDE4OH0sezAsOCwxNH0sezAsOCwxNDJ9LAorICAgICAgICB7MCw4LDc4fSx7MCw5LDI1Mn0sezk2LDcsMH0sezAsOCw4MX0sezAsOCwxN30sezIxLDgsMTMxfSx7MTgsNywzMX0sCisgICAgICAgIHswLDgsMTEzfSx7MCw4LDQ5fSx7MCw5LDE5NH0sezE2LDcsMTB9LHswLDgsOTd9LHswLDgsMzN9LHswLDksMTYyfSwKKyAgICAgICAgezAsOCwxfSx7MCw4LDEyOX0sezAsOCw2NX0sezAsOSwyMjZ9LHsxNiw3LDZ9LHswLDgsODl9LHswLDgsMjV9LAorICAgICAgICB7MCw5LDE0Nn0sezE5LDcsNTl9LHswLDgsMTIxfSx7MCw4LDU3fSx7MCw5LDIxMH0sezE3LDcsMTd9LHswLDgsMTA1fSwKKyAgICAgICAgezAsOCw0MX0sezAsOSwxNzh9LHswLDgsOX0sezAsOCwxMzd9LHswLDgsNzN9LHswLDksMjQyfSx7MTYsNyw0fSwKKyAgICAgICAgezAsOCw4NX0sezAsOCwyMX0sezE2LDgsMjU4fSx7MTksNyw0M30sezAsOCwxMTd9LHswLDgsNTN9LHswLDksMjAyfSwKKyAgICAgICAgezE3LDcsMTN9LHswLDgsMTAxfSx7MCw4LDM3fSx7MCw5LDE3MH0sezAsOCw1fSx7MCw4LDEzM30sezAsOCw2OX0sCisgICAgICAgIHswLDksMjM0fSx7MTYsNyw4fSx7MCw4LDkzfSx7MCw4LDI5fSx7MCw5LDE1NH0sezIwLDcsODN9LHswLDgsMTI1fSwKKyAgICAgICAgezAsOCw2MX0sezAsOSwyMTh9LHsxOCw3LDIzfSx7MCw4LDEwOX0sezAsOCw0NX0sezAsOSwxODZ9LHswLDgsMTN9LAorICAgICAgICB7MCw4LDE0MX0sezAsOCw3N30sezAsOSwyNTB9LHsxNiw3LDN9LHswLDgsODN9LHswLDgsMTl9LHsyMSw4LDE5NX0sCisgICAgICAgIHsxOSw3LDM1fSx7MCw4LDExNX0sezAsOCw1MX0sezAsOSwxOTh9LHsxNyw3LDExfSx7MCw4LDk5fSx7MCw4LDM1fSwKKyAgICAgICAgezAsOSwxNjZ9LHswLDgsM30sezAsOCwxMzF9LHswLDgsNjd9LHswLDksMjMwfSx7MTYsNyw3fSx7MCw4LDkxfSwKKyAgICAgICAgezAsOCwyN30sezAsOSwxNTB9LHsyMCw3LDY3fSx7MCw4LDEyM30sezAsOCw1OX0sezAsOSwyMTR9LHsxOCw3LDE5fSwKKyAgICAgICAgezAsOCwxMDd9LHswLDgsNDN9LHswLDksMTgyfSx7MCw4LDExfSx7MCw4LDEzOX0sezAsOCw3NX0sezAsOSwyNDZ9LAorICAgICAgICB7MTYsNyw1fSx7MCw4LDg3fSx7MCw4LDIzfSx7NjQsOCwwfSx7MTksNyw1MX0sezAsOCwxMTl9LHswLDgsNTV9LAorICAgICAgICB7MCw5LDIwNn0sezE3LDcsMTV9LHswLDgsMTAzfSx7MCw4LDM5fSx7MCw5LDE3NH0sezAsOCw3fSx7MCw4LDEzNX0sCisgICAgICAgIHswLDgsNzF9LHswLDksMjM4fSx7MTYsNyw5fSx7MCw4LDk1fSx7MCw4LDMxfSx7MCw5LDE1OH0sezIwLDcsOTl9LAorICAgICAgICB7MCw4LDEyN30sezAsOCw2M30sezAsOSwyMjJ9LHsxOCw3LDI3fSx7MCw4LDExMX0sezAsOCw0N30sezAsOSwxOTB9LAorICAgICAgICB7MCw4LDE1fSx7MCw4LDE0M30sezAsOCw3OX0sezAsOSwyNTR9LHs5Niw3LDB9LHswLDgsODB9LHswLDgsMTZ9LAorICAgICAgICB7MjAsOCwxMTV9LHsxOCw3LDMxfSx7MCw4LDExMn0sezAsOCw0OH0sezAsOSwxOTN9LHsxNiw3LDEwfSx7MCw4LDk2fSwKKyAgICAgICAgezAsOCwzMn0sezAsOSwxNjF9LHswLDgsMH0sezAsOCwxMjh9LHswLDgsNjR9LHswLDksMjI1fSx7MTYsNyw2fSwKKyAgICAgICAgezAsOCw4OH0sezAsOCwyNH0sezAsOSwxNDV9LHsxOSw3LDU5fSx7MCw4LDEyMH0sezAsOCw1Nn0sezAsOSwyMDl9LAorICAgICAgICB7MTcsNywxN30sezAsOCwxMDR9LHswLDgsNDB9LHswLDksMTc3fSx7MCw4LDh9LHswLDgsMTM2fSx7MCw4LDcyfSwKKyAgICAgICAgezAsOSwyNDF9LHsxNiw3LDR9LHswLDgsODR9LHswLDgsMjB9LHsyMSw4LDIyN30sezE5LDcsNDN9LHswLDgsMTE2fSwKKyAgICAgICAgezAsOCw1Mn0sezAsOSwyMDF9LHsxNyw3LDEzfSx7MCw4LDEwMH0sezAsOCwzNn0sezAsOSwxNjl9LHswLDgsNH0sCisgICAgICAgIHswLDgsMTMyfSx7MCw4LDY4fSx7MCw5LDIzM30sezE2LDcsOH0sezAsOCw5Mn0sezAsOCwyOH0sezAsOSwxNTN9LAorICAgICAgICB7MjAsNyw4M30sezAsOCwxMjR9LHswLDgsNjB9LHswLDksMjE3fSx7MTgsNywyM30sezAsOCwxMDh9LHswLDgsNDR9LAorICAgICAgICB7MCw5LDE4NX0sezAsOCwxMn0sezAsOCwxNDB9LHswLDgsNzZ9LHswLDksMjQ5fSx7MTYsNywzfSx7MCw4LDgyfSwKKyAgICAgICAgezAsOCwxOH0sezIxLDgsMTYzfSx7MTksNywzNX0sezAsOCwxMTR9LHswLDgsNTB9LHswLDksMTk3fSx7MTcsNywxMX0sCisgICAgICAgIHswLDgsOTh9LHswLDgsMzR9LHswLDksMTY1fSx7MCw4LDJ9LHswLDgsMTMwfSx7MCw4LDY2fSx7MCw5LDIyOX0sCisgICAgICAgIHsxNiw3LDd9LHswLDgsOTB9LHswLDgsMjZ9LHswLDksMTQ5fSx7MjAsNyw2N30sezAsOCwxMjJ9LHswLDgsNTh9LAorICAgICAgICB7MCw5LDIxM30sezE4LDcsMTl9LHswLDgsMTA2fSx7MCw4LDQyfSx7MCw5LDE4MX0sezAsOCwxMH0sezAsOCwxMzh9LAorICAgICAgICB7MCw4LDc0fSx7MCw5LDI0NX0sezE2LDcsNX0sezAsOCw4Nn0sezAsOCwyMn0sezY0LDgsMH0sezE5LDcsNTF9LAorICAgICAgICB7MCw4LDExOH0sezAsOCw1NH0sezAsOSwyMDV9LHsxNyw3LDE1fSx7MCw4LDEwMn0sezAsOCwzOH0sezAsOSwxNzN9LAorICAgICAgICB7MCw4LDZ9LHswLDgsMTM0fSx7MCw4LDcwfSx7MCw5LDIzN30sezE2LDcsOX0sezAsOCw5NH0sezAsOCwzMH0sCisgICAgICAgIHswLDksMTU3fSx7MjAsNyw5OX0sezAsOCwxMjZ9LHswLDgsNjJ9LHswLDksMjIxfSx7MTgsNywyN30sezAsOCwxMTB9LAorICAgICAgICB7MCw4LDQ2fSx7MCw5LDE4OX0sezAsOCwxNH0sezAsOCwxNDJ9LHswLDgsNzh9LHswLDksMjUzfSx7OTYsNywwfSwKKyAgICAgICAgezAsOCw4MX0sezAsOCwxN30sezIxLDgsMTMxfSx7MTgsNywzMX0sezAsOCwxMTN9LHswLDgsNDl9LHswLDksMTk1fSwKKyAgICAgICAgezE2LDcsMTB9LHswLDgsOTd9LHswLDgsMzN9LHswLDksMTYzfSx7MCw4LDF9LHswLDgsMTI5fSx7MCw4LDY1fSwKKyAgICAgICAgezAsOSwyMjd9LHsxNiw3LDZ9LHswLDgsODl9LHswLDgsMjV9LHswLDksMTQ3fSx7MTksNyw1OX0sezAsOCwxMjF9LAorICAgICAgICB7MCw4LDU3fSx7MCw5LDIxMX0sezE3LDcsMTd9LHswLDgsMTA1fSx7MCw4LDQxfSx7MCw5LDE3OX0sezAsOCw5fSwKKyAgICAgICAgezAsOCwxMzd9LHswLDgsNzN9LHswLDksMjQzfSx7MTYsNyw0fSx7MCw4LDg1fSx7MCw4LDIxfSx7MTYsOCwyNTh9LAorICAgICAgICB7MTksNyw0M30sezAsOCwxMTd9LHswLDgsNTN9LHswLDksMjAzfSx7MTcsNywxM30sezAsOCwxMDF9LHswLDgsMzd9LAorICAgICAgICB7MCw5LDE3MX0sezAsOCw1fSx7MCw4LDEzM30sezAsOCw2OX0sezAsOSwyMzV9LHsxNiw3LDh9LHswLDgsOTN9LAorICAgICAgICB7MCw4LDI5fSx7MCw5LDE1NX0sezIwLDcsODN9LHswLDgsMTI1fSx7MCw4LDYxfSx7MCw5LDIxOX0sezE4LDcsMjN9LAorICAgICAgICB7MCw4LDEwOX0sezAsOCw0NX0sezAsOSwxODd9LHswLDgsMTN9LHswLDgsMTQxfSx7MCw4LDc3fSx7MCw5LDI1MX0sCisgICAgICAgIHsxNiw3LDN9LHswLDgsODN9LHswLDgsMTl9LHsyMSw4LDE5NX0sezE5LDcsMzV9LHswLDgsMTE1fSx7MCw4LDUxfSwKKyAgICAgICAgezAsOSwxOTl9LHsxNyw3LDExfSx7MCw4LDk5fSx7MCw4LDM1fSx7MCw5LDE2N30sezAsOCwzfSx7MCw4LDEzMX0sCisgICAgICAgIHswLDgsNjd9LHswLDksMjMxfSx7MTYsNyw3fSx7MCw4LDkxfSx7MCw4LDI3fSx7MCw5LDE1MX0sezIwLDcsNjd9LAorICAgICAgICB7MCw4LDEyM30sezAsOCw1OX0sezAsOSwyMTV9LHsxOCw3LDE5fSx7MCw4LDEwN30sezAsOCw0M30sezAsOSwxODN9LAorICAgICAgICB7MCw4LDExfSx7MCw4LDEzOX0sezAsOCw3NX0sezAsOSwyNDd9LHsxNiw3LDV9LHswLDgsODd9LHswLDgsMjN9LAorICAgICAgICB7NjQsOCwwfSx7MTksNyw1MX0sezAsOCwxMTl9LHswLDgsNTV9LHswLDksMjA3fSx7MTcsNywxNX0sezAsOCwxMDN9LAorICAgICAgICB7MCw4LDM5fSx7MCw5LDE3NX0sezAsOCw3fSx7MCw4LDEzNX0sezAsOCw3MX0sezAsOSwyMzl9LHsxNiw3LDl9LAorICAgICAgICB7MCw4LDk1fSx7MCw4LDMxfSx7MCw5LDE1OX0sezIwLDcsOTl9LHswLDgsMTI3fSx7MCw4LDYzfSx7MCw5LDIyM30sCisgICAgICAgIHsxOCw3LDI3fSx7MCw4LDExMX0sezAsOCw0N30sezAsOSwxOTF9LHswLDgsMTV9LHswLDgsMTQzfSx7MCw4LDc5fSwKKyAgICAgICAgezAsOSwyNTV9CisgICAgfTsKKworICAgIHN0YXRpYyBjb25zdCBjb2RlIGRpc3RmaXhbMzJdID0geworICAgICAgICB7MTYsNSwxfSx7MjMsNSwyNTd9LHsxOSw1LDE3fSx7MjcsNSw0MDk3fSx7MTcsNSw1fSx7MjUsNSwxMDI1fSwKKyAgICAgICAgezIxLDUsNjV9LHsyOSw1LDE2Mzg1fSx7MTYsNSwzfSx7MjQsNSw1MTN9LHsyMCw1LDMzfSx7MjgsNSw4MTkzfSwKKyAgICAgICAgezE4LDUsOX0sezI2LDUsMjA0OX0sezIyLDUsMTI5fSx7NjQsNSwwfSx7MTYsNSwyfSx7MjMsNSwzODV9LAorICAgICAgICB7MTksNSwyNX0sezI3LDUsNjE0NX0sezE3LDUsN30sezI1LDUsMTUzN30sezIxLDUsOTd9LHsyOSw1LDI0NTc3fSwKKyAgICAgICAgezE2LDUsNH0sezI0LDUsNzY5fSx7MjAsNSw0OX0sezI4LDUsMTIyODl9LHsxOCw1LDEzfSx7MjYsNSwzMDczfSwKKyAgICAgICAgezIyLDUsMTkzfSx7NjQsNSwwfQorICAgIH07CmRpZmYgLS1naXQgYS96bGliLTEuMi42L2luZmxhdGUuYyBiL3psaWItMS4yLjYvaW5mbGF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjODk1MTcKLS0tIC9kZXYvbnVsbAorKysgYi96bGliLTEuMi42L2luZmxhdGUuYwpAQCAtMCwwICsxLDE1MDEgQEAKKy8qIGluZmxhdGUuYyAtLSB6bGliIGRlY29tcHJlc3Npb24KKyAqIENvcHlyaWdodCAoQykgMTk5NS0yMDExIE1hcmsgQWRsZXIKKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKKyAqLworCisvKgorICogQ2hhbmdlIGhpc3Rvcnk6CisgKgorICogMS4yLmJldGEwICAgIDI0IE5vdiAyMDAyCisgKiAtIEZpcnN0IHZlcnNpb24gLS0gY29tcGxldGUgcmV3cml0ZSBvZiBpbmZsYXRlIHRvIHNpbXBsaWZ5IGNvZGUsIGF2b2lkCisgKiAgIGNyZWF0aW9uIG9mIHdpbmRvdyB3aGVuIG5vdCBuZWVkZWQsIG1pbmltaXplIHVzZSBvZiB3aW5kb3cgd2hlbiBpdCBpcworICogICBuZWVkZWQsIG1ha2UgaW5mZmFzdC5jIGV2ZW4gZmFzdGVyLCBpbXBsZW1lbnQgZ3ppcCBkZWNvZGluZywgYW5kIHRvCisgKiAgIGltcHJvdmUgY29kZSByZWFkYWJpbGl0eSBhbmQgc3R5bGUgb3ZlciB0aGUgcHJldmlvdXMgemxpYiBpbmZsYXRlIGNvZGUKKyAqCisgKiAxLjIuYmV0YTEgICAgMjUgTm92IDIwMDIKKyAqIC0gVXNlIHBvaW50ZXJzIGZvciBhdmFpbGFibGUgaW5wdXQgYW5kIG91dHB1dCBjaGVja2luZyBpbiBpbmZmYXN0LmMKKyAqIC0gUmVtb3ZlIGlucHV0IGFuZCBvdXRwdXQgY291bnRlcnMgaW4gaW5mZmFzdC5jCisgKiAtIENoYW5nZSBpbmZmYXN0LmMgZW50cnkgYW5kIGxvb3AgZnJvbSBhdmFpbF9pbiA+PSA3IHRvID49IDYKKyAqIC0gUmVtb3ZlIHVubmVjZXNzYXJ5IHNlY29uZCBieXRlIHB1bGwgZnJvbSBsZW5ndGggZXh0cmEgaW4gaW5mZmFzdC5jCisgKiAtIFVucm9sbCBkaXJlY3QgY29weSB0byB0aHJlZSBjb3BpZXMgcGVyIGxvb3AgaW4gaW5mZmFzdC5jCisgKgorICogMS4yLmJldGEyICAgIDQgRGVjIDIwMDIKKyAqIC0gQ2hhbmdlIGV4dGVybmFsIHJvdXRpbmUgbmFtZXMgdG8gcmVkdWNlIHBvdGVudGlhbCBjb25mbGljdHMKKyAqIC0gQ29ycmVjdCBmaWxlbmFtZSB0byBpbmZmaXhlZC5oIGZvciBmaXhlZCB0YWJsZXMgaW4gaW5mbGF0ZS5jCisgKiAtIE1ha2UgaGJ1ZltdIHVuc2lnbmVkIGNoYXIgdG8gbWF0Y2ggcGFyYW1ldGVyIHR5cGUgaW4gaW5mbGF0ZS5jCisgKiAtIENoYW5nZSBzdHJtLT5uZXh0X291dFstc3RhdGUtPm9mZnNldF0gdG8gKihzdHJtLT5uZXh0X291dCAtIHN0YXRlLT5vZmZzZXQpCisgKiAgIHRvIGF2b2lkIG5lZ2F0aW9uIHByb2JsZW0gb24gQWxwaGFzICg2NCBiaXQpIGluIGluZmxhdGUuYworICoKKyAqIDEuMi5iZXRhMyAgICAyMiBEZWMgMjAwMgorICogLSBBZGQgY29tbWVudHMgb24gc3RhdGUtPmJpdHMgYXNzZXJ0aW9uIGluIGluZmZhc3QuYworICogLSBBZGQgY29tbWVudHMgb24gb3AgZmllbGQgaW4gaW5mdHJlZXMuaAorICogLSBGaXggYnVnIGluIHJldXNlIG9mIGFsbG9jYXRlZCB3aW5kb3cgYWZ0ZXIgaW5mbGF0ZVJlc2V0KCkKKyAqIC0gUmVtb3ZlIGJpdCBmaWVsZHMtLWJhY2sgdG8gYnl0ZSBzdHJ1Y3R1cmUgZm9yIHNwZWVkCisgKiAtIFJlbW92ZSBkaXN0YW5jZSBleHRyYSA9PSAwIGNoZWNrIGluIGluZmxhdGVfZmFzdCgpLS1vbmx5IGhlbHBzIGZvciBsZW5ndGhzCisgKiAtIENoYW5nZSBwb3N0LWluY3JlbWVudHMgdG8gcHJlLWluY3JlbWVudHMgaW4gaW5mbGF0ZV9mYXN0KCksIFBQQyBiaWFzZWQ/CisgKiAtIEFkZCBjb21waWxlIHRpbWUgb3B0aW9uLCBQT1NUSU5DLCB0byB1c2UgcG9zdC1pbmNyZW1lbnRzIGluc3RlYWQgKEludGVsPykKKyAqIC0gTWFrZSBNQVRDSCBjb3B5IGluIGluZmxhdGUoKSBtdWNoIGZhc3RlciBmb3Igd2hlbiBpbmZsYXRlX2Zhc3QoKSBub3QgdXNlZAorICogLSBVc2UgbG9jYWwgY29waWVzIG9mIHN0cmVhbSBuZXh0IGFuZCBhdmFpbCB2YWx1ZXMsIGFzIHdlbGwgYXMgbG9jYWwgYml0CisgKiAgIGJ1ZmZlciBhbmQgYml0IGNvdW50IGluIGluZmxhdGUoKS0tZm9yIHNwZWVkIHdoZW4gaW5mbGF0ZV9mYXN0KCkgbm90IHVzZWQKKyAqCisgKiAxLjIuYmV0YTQgICAgMSBKYW4gMjAwMworICogLSBTcGxpdCBwdHIgLSAyNTcgc3RhdGVtZW50cyBpbiBpbmZsYXRlX3RhYmxlKCkgdG8gYXZvaWQgY29tcGlsZXIgd2FybmluZ3MKKyAqIC0gTW92ZSBhIGNvbW1lbnQgb24gb3V0cHV0IGJ1ZmZlciBzaXplcyBmcm9tIGluZmZhc3QuYyB0byBpbmZsYXRlLmMKKyAqIC0gQWRkIGNvbW1lbnRzIGluIGluZmZhc3QuYyB0byBpbnRyb2R1Y2UgdGhlIGluZmxhdGVfZmFzdCgpIHJvdXRpbmUKKyAqIC0gUmVhcnJhbmdlIHdpbmRvdyBjb3BpZXMgaW4gaW5mbGF0ZV9mYXN0KCkgZm9yIHNwZWVkIGFuZCBzaW1wbGlmaWNhdGlvbgorICogLSBVbnJvbGwgbGFzdCBjb3B5IGZvciB3aW5kb3cgbWF0Y2ggaW4gaW5mbGF0ZV9mYXN0KCkKKyAqIC0gVXNlIGxvY2FsIGNvcGllcyBvZiB3aW5kb3cgdmFyaWFibGVzIGluIGluZmxhdGVfZmFzdCgpIGZvciBzcGVlZAorICogLSBQdWxsIG91dCBjb21tb24gd25leHQgPT0gMCBjYXNlIGZvciBzcGVlZCBpbiBpbmZsYXRlX2Zhc3QoKQorICogLSBNYWtlIG9wIGFuZCBsZW4gaW4gaW5mbGF0ZV9mYXN0KCkgdW5zaWduZWQgZm9yIGNvbnNpc3RlbmN5CisgKiAtIEFkZCBGQVIgdG8gbGNvZGUgYW5kIGRjb2RlIGRlY2xhcmF0aW9ucyBpbiBpbmZsYXRlX2Zhc3QoKQorICogLSBTaW1wbGlmaWVkIGJhZCBkaXN0YW5jZSBjaGVjayBpbiBpbmZsYXRlX2Zhc3QoKQorICogLSBBZGRlZCBpbmZsYXRlQmFja0luaXQoKSwgaW5mbGF0ZUJhY2soKSwgYW5kIGluZmxhdGVCYWNrRW5kKCkgaW4gbmV3CisgKiAgIHNvdXJjZSBmaWxlIGluZmJhY2suYyB0byBwcm92aWRlIGEgY2FsbC1iYWNrIGludGVyZmFjZSB0byBpbmZsYXRlIGZvcgorICogICBwcm9ncmFtcyBsaWtlIGd6aXAgYW5kIHVuemlwIC0tIHVzZXMgd2luZG93IGFzIG91dHB1dCBidWZmZXIgdG8gYXZvaWQKKyAqICAgd2luZG93IGNvcHlpbmcKKyAqCisgKiAxLjIuYmV0YTUgICAgMSBKYW4gMjAwMworICogLSBJbXByb3ZlZCBpbmZsYXRlQmFjaygpIGludGVyZmFjZSB0byBhbGxvdyB0aGUgY2FsbGVyIHRvIHByb3ZpZGUgaW5pdGlhbAorICogICBpbnB1dCBpbiBzdHJtLgorICogLSBGaXhlZCBzdG9yZWQgYmxvY2tzIGJ1ZyBpbiBpbmZsYXRlQmFjaygpCisgKgorICogMS4yLmJldGE2ICAgIDQgSmFuIDIwMDMKKyAqIC0gQWRkZWQgY29tbWVudHMgaW4gaW5mZmFzdC5jIG9uIGVmZmVjdGl2ZW5lc3Mgb2YgUE9TVElOQworICogLSBUeXBlY2FzdGluZyBhbGwgYXJvdW5kIHRvIHJlZHVjZSBjb21waWxlciB3YXJuaW5ncworICogLSBDaGFuZ2VkIGxvb3BzIGZyb20gd2hpbGUgKDEpIG9yIGRvIHt9IHdoaWxlICgxKSB0byBmb3IgKDs7KSwgYWdhaW4gdG8KKyAqICAgbWFrZSBjb21waWxlcnMgaGFwcHkKKyAqIC0gQ2hhbmdlZCB0eXBlIG9mIHdpbmRvdyBpbiBpbmZsYXRlQmFja0luaXQoKSB0byB1bnNpZ25lZCBjaGFyICoKKyAqCisgKiAxLjIuYmV0YTcgICAgMjcgSmFuIDIwMDMKKyAqIC0gQ2hhbmdlZCBtYW55IHR5cGVzIHRvIHVuc2lnbmVkIG9yIHVuc2lnbmVkIHNob3J0IHRvIGF2b2lkIHdhcm5pbmdzCisgKiAtIEFkZGVkIGluZmxhdGVDb3B5KCkgZnVuY3Rpb24KKyAqCisgKiAxLjIuMCAgICAgICAgOSBNYXIgMjAwMworICogLSBDaGFuZ2VkIGluZmxhdGVCYWNrKCkgaW50ZXJmYWNlIHRvIHByb3ZpZGUgc2VwYXJhdGUgb3BhcXVlIGRlc2NyaXB0b3JzCisgKiAgIGZvciB0aGUgaW4oKSBhbmQgb3V0KCkgZnVuY3Rpb25zCisgKiAtIENoYW5nZWQgaW5mbGF0ZUJhY2soKSBhcmd1bWVudCBhbmQgaW5fZnVuYyB0eXBlZGVmIHRvIHN3YXAgdGhlIGxlbmd0aAorICogICBhbmQgYnVmZmVyIGFkZHJlc3MgcmV0dXJuIHZhbHVlcyBmb3IgdGhlIGlucHV0IGZ1bmN0aW9uCisgKiAtIENoZWNrIG5leHRfaW4gYW5kIG5leHRfb3V0IGZvciBaX05VTEwgb24gZW50cnkgdG8gaW5mbGF0ZSgpCisgKgorICogVGhlIGhpc3RvcnkgZm9yIHZlcnNpb25zIGFmdGVyIDEuMi4wIGFyZSBpbiBDaGFuZ2VMb2cgaW4gemxpYiBkaXN0cmlidXRpb24uCisgKi8KKworI2luY2x1ZGUgInp1dGlsLmgiCisjaW5jbHVkZSAiaW5mdHJlZXMuaCIKKyNpbmNsdWRlICJpbmZsYXRlLmgiCisjaW5jbHVkZSAiaW5mZmFzdC5oIgorCisjaWZkZWYgTUFLRUZJWEVECisjICBpZm5kZWYgQlVJTERGSVhFRAorIyAgICBkZWZpbmUgQlVJTERGSVhFRAorIyAgZW5kaWYKKyNlbmRpZgorCisvKiBmdW5jdGlvbiBwcm90b3R5cGVzICovCitsb2NhbCB2b2lkIGZpeGVkdGFibGVzIE9GKChzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKnN0YXRlKSk7Citsb2NhbCBpbnQgdXBkYXRld2luZG93IE9GKCh6X3N0cmVhbXAgc3RybSwgdW5zaWduZWQgb3V0KSk7CisjaWZkZWYgQlVJTERGSVhFRAorICAgdm9pZCBtYWtlZml4ZWQgT0YoKHZvaWQpKTsKKyNlbmRpZgorbG9jYWwgdW5zaWduZWQgc3luY3NlYXJjaCBPRigodW5zaWduZWQgRkFSICpoYXZlLCB1bnNpZ25lZCBjaGFyIEZBUiAqYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbGVuKSk7CisKK2ludCBaRVhQT1JUIGluZmxhdGVSZXNldEtlZXAoc3RybSkKK3pfc3RyZWFtcCBzdHJtOworeworICAgIHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqc3RhdGU7CisKKyAgICBpZiAoc3RybSA9PSBaX05VTEwgfHwgc3RybS0+c3RhdGUgPT0gWl9OVUxMKSByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisgICAgc3RhdGUgPSAoc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICopc3RybS0+c3RhdGU7CisgICAgc3RybS0+dG90YWxfaW4gPSBzdHJtLT50b3RhbF9vdXQgPSBzdGF0ZS0+dG90YWwgPSAwOworICAgIHN0cm0tPm1zZyA9IFpfTlVMTDsKKyAgICBpZiAoc3RhdGUtPndyYXApICAgICAgICAvKiB0byBzdXBwb3J0IGlsbC1jb25jZWl2ZWQgSmF2YSB0ZXN0IHN1aXRlICovCisgICAgICAgIHN0cm0tPmFkbGVyID0gc3RhdGUtPndyYXAgJiAxOworICAgIHN0YXRlLT5tb2RlID0gSEVBRDsKKyAgICBzdGF0ZS0+bGFzdCA9IDA7CisgICAgc3RhdGUtPmhhdmVkaWN0ID0gMDsKKyAgICBzdGF0ZS0+ZG1heCA9IDMyNzY4VTsKKyAgICBzdGF0ZS0+aGVhZCA9IFpfTlVMTDsKKyAgICBzdGF0ZS0+aG9sZCA9IDA7CisgICAgc3RhdGUtPmJpdHMgPSAwOworICAgIHN0YXRlLT5sZW5jb2RlID0gc3RhdGUtPmRpc3Rjb2RlID0gc3RhdGUtPm5leHQgPSBzdGF0ZS0+Y29kZXM7CisgICAgc3RhdGUtPnNhbmUgPSAxOworICAgIHN0YXRlLT5iYWNrID0gLTE7CisgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiByZXNldFxuIikpOworICAgIHJldHVybiBaX09LOworfQorCitpbnQgWkVYUE9SVCBpbmZsYXRlUmVzZXQoc3RybSkKK3pfc3RyZWFtcCBzdHJtOworeworICAgIHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqc3RhdGU7CisKKyAgICBpZiAoc3RybSA9PSBaX05VTEwgfHwgc3RybS0+c3RhdGUgPT0gWl9OVUxMKSByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisgICAgc3RhdGUgPSAoc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICopc3RybS0+c3RhdGU7CisgICAgc3RhdGUtPndzaXplID0gMDsKKyAgICBzdGF0ZS0+d2hhdmUgPSAwOworICAgIHN0YXRlLT53bmV4dCA9IDA7CisgICAgcmV0dXJuIGluZmxhdGVSZXNldEtlZXAoc3RybSk7Cit9CisKK2ludCBaRVhQT1JUIGluZmxhdGVSZXNldDIoc3RybSwgd2luZG93Qml0cykKK3pfc3RyZWFtcCBzdHJtOworaW50IHdpbmRvd0JpdHM7Cit7CisgICAgaW50IHdyYXA7CisgICAgc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICpzdGF0ZTsKKworICAgIC8qIGdldCB0aGUgc3RhdGUgKi8KKyAgICBpZiAoc3RybSA9PSBaX05VTEwgfHwgc3RybS0+c3RhdGUgPT0gWl9OVUxMKSByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisgICAgc3RhdGUgPSAoc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICopc3RybS0+c3RhdGU7CisKKyAgICAvKiBleHRyYWN0IHdyYXAgcmVxdWVzdCBmcm9tIHdpbmRvd0JpdHMgcGFyYW1ldGVyICovCisgICAgaWYgKHdpbmRvd0JpdHMgPCAwKSB7CisgICAgICAgIHdyYXAgPSAwOworICAgICAgICB3aW5kb3dCaXRzID0gLXdpbmRvd0JpdHM7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICB3cmFwID0gKHdpbmRvd0JpdHMgPj4gNCkgKyAxOworI2lmZGVmIEdVTlpJUAorICAgICAgICBpZiAod2luZG93Qml0cyA8IDQ4KQorICAgICAgICAgICAgd2luZG93Qml0cyAmPSAxNTsKKyNlbmRpZgorICAgIH0KKworICAgIC8qIHNldCBudW1iZXIgb2Ygd2luZG93IGJpdHMsIGZyZWUgd2luZG93IGlmIGRpZmZlcmVudCAqLworICAgIGlmICh3aW5kb3dCaXRzICYmICh3aW5kb3dCaXRzIDwgOCB8fCB3aW5kb3dCaXRzID4gMTUpKQorICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisgICAgaWYgKHN0YXRlLT53aW5kb3cgIT0gWl9OVUxMICYmIHN0YXRlLT53Yml0cyAhPSAodW5zaWduZWQpd2luZG93Qml0cykgeworICAgICAgICBaRlJFRShzdHJtLCBzdGF0ZS0+d2luZG93KTsKKyAgICAgICAgc3RhdGUtPndpbmRvdyA9IFpfTlVMTDsKKyAgICB9CisKKyAgICAvKiB1cGRhdGUgc3RhdGUgYW5kIHJlc2V0IHRoZSByZXN0IG9mIGl0ICovCisgICAgc3RhdGUtPndyYXAgPSB3cmFwOworICAgIHN0YXRlLT53Yml0cyA9ICh1bnNpZ25lZCl3aW5kb3dCaXRzOworICAgIHJldHVybiBpbmZsYXRlUmVzZXQoc3RybSk7Cit9CisKK2ludCBaRVhQT1JUIGluZmxhdGVJbml0Ml8oc3RybSwgd2luZG93Qml0cywgdmVyc2lvbiwgc3RyZWFtX3NpemUpCit6X3N0cmVhbXAgc3RybTsKK2ludCB3aW5kb3dCaXRzOworY29uc3QgY2hhciAqdmVyc2lvbjsKK2ludCBzdHJlYW1fc2l6ZTsKK3sKKyAgICBpbnQgcmV0OworICAgIHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqc3RhdGU7CisKKyAgICBpZiAodmVyc2lvbiA9PSBaX05VTEwgfHwgdmVyc2lvblswXSAhPSBaTElCX1ZFUlNJT05bMF0gfHwKKyAgICAgICAgc3RyZWFtX3NpemUgIT0gKGludCkoc2l6ZW9mKHpfc3RyZWFtKSkpCisgICAgICAgIHJldHVybiBaX1ZFUlNJT05fRVJST1I7CisgICAgaWYgKHN0cm0gPT0gWl9OVUxMKSByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisgICAgc3RybS0+bXNnID0gWl9OVUxMOyAgICAgICAgICAgICAgICAgLyogaW4gY2FzZSB3ZSByZXR1cm4gYW4gZXJyb3IgKi8KKyAgICBpZiAoc3RybS0+emFsbG9jID09IChhbGxvY19mdW5jKTApIHsKKyNpZmRlZiBaX1NPTE8KKyAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworI2Vsc2UKKyAgICAgICAgc3RybS0+emFsbG9jID0gemNhbGxvYzsKKyAgICAgICAgc3RybS0+b3BhcXVlID0gKHZvaWRwZikwOworI2VuZGlmCisgICAgfQorICAgIGlmIChzdHJtLT56ZnJlZSA9PSAoZnJlZV9mdW5jKTApCisjaWZkZWYgWl9TT0xPCisgICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKyNlbHNlCisgICAgICAgIHN0cm0tPnpmcmVlID0gemNmcmVlOworI2VuZGlmCisgICAgc3RhdGUgPSAoc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICopCisgICAgICAgICAgICBaQUxMT0Moc3RybSwgMSwgc2l6ZW9mKHN0cnVjdCBpbmZsYXRlX3N0YXRlKSk7CisgICAgaWYgKHN0YXRlID09IFpfTlVMTCkgcmV0dXJuIFpfTUVNX0VSUk9SOworICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogYWxsb2NhdGVkXG4iKSk7CisgICAgc3RybS0+c3RhdGUgPSAoc3RydWN0IGludGVybmFsX3N0YXRlIEZBUiAqKXN0YXRlOworICAgIHN0YXRlLT53aW5kb3cgPSBaX05VTEw7CisgICAgcmV0ID0gaW5mbGF0ZVJlc2V0MihzdHJtLCB3aW5kb3dCaXRzKTsKKyAgICBpZiAocmV0ICE9IFpfT0spIHsKKyAgICAgICAgWkZSRUUoc3RybSwgc3RhdGUpOworICAgICAgICBzdHJtLT5zdGF0ZSA9IFpfTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworaW50IFpFWFBPUlQgaW5mbGF0ZUluaXRfKHN0cm0sIHZlcnNpb24sIHN0cmVhbV9zaXplKQorel9zdHJlYW1wIHN0cm07Citjb25zdCBjaGFyICp2ZXJzaW9uOworaW50IHN0cmVhbV9zaXplOworeworICAgIHJldHVybiBpbmZsYXRlSW5pdDJfKHN0cm0sIERFRl9XQklUUywgdmVyc2lvbiwgc3RyZWFtX3NpemUpOworfQorCitpbnQgWkVYUE9SVCBpbmZsYXRlUHJpbWUoc3RybSwgYml0cywgdmFsdWUpCit6X3N0cmVhbXAgc3RybTsKK2ludCBiaXRzOworaW50IHZhbHVlOworeworICAgIHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqc3RhdGU7CisKKyAgICBpZiAoc3RybSA9PSBaX05VTEwgfHwgc3RybS0+c3RhdGUgPT0gWl9OVUxMKSByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisgICAgc3RhdGUgPSAoc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICopc3RybS0+c3RhdGU7CisgICAgaWYgKGJpdHMgPCAwKSB7CisgICAgICAgIHN0YXRlLT5ob2xkID0gMDsKKyAgICAgICAgc3RhdGUtPmJpdHMgPSAwOworICAgICAgICByZXR1cm4gWl9PSzsKKyAgICB9CisgICAgaWYgKGJpdHMgPiAxNiB8fCBzdGF0ZS0+Yml0cyArIGJpdHMgPiAzMikgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworICAgIHZhbHVlICY9ICgxTCA8PCBiaXRzKSAtIDE7CisgICAgc3RhdGUtPmhvbGQgKz0gdmFsdWUgPDwgc3RhdGUtPmJpdHM7CisgICAgc3RhdGUtPmJpdHMgKz0gYml0czsKKyAgICByZXR1cm4gWl9PSzsKK30KKworLyoKKyAgIFJldHVybiBzdGF0ZSB3aXRoIGxlbmd0aCBhbmQgZGlzdGFuY2UgZGVjb2RpbmcgdGFibGVzIGFuZCBpbmRleCBzaXplcyBzZXQgdG8KKyAgIGZpeGVkIGNvZGUgZGVjb2RpbmcuICBOb3JtYWxseSB0aGlzIHJldHVybnMgZml4ZWQgdGFibGVzIGZyb20gaW5mZml4ZWQuaC4KKyAgIElmIEJVSUxERklYRUQgaXMgZGVmaW5lZCwgdGhlbiBpbnN0ZWFkIHRoaXMgcm91dGluZSBidWlsZHMgdGhlIHRhYmxlcyB0aGUKKyAgIGZpcnN0IHRpbWUgaXQncyBjYWxsZWQsIGFuZCByZXR1cm5zIHRob3NlIHRhYmxlcyB0aGUgZmlyc3QgdGltZSBhbmQKKyAgIHRoZXJlYWZ0ZXIuICBUaGlzIHJlZHVjZXMgdGhlIHNpemUgb2YgdGhlIGNvZGUgYnkgYWJvdXQgMksgYnl0ZXMsIGluCisgICBleGNoYW5nZSBmb3IgYSBsaXR0bGUgZXhlY3V0aW9uIHRpbWUuICBIb3dldmVyLCBCVUlMREZJWEVEIHNob3VsZCBub3QgYmUKKyAgIHVzZWQgZm9yIHRocmVhZGVkIGFwcGxpY2F0aW9ucywgc2luY2UgdGhlIHJld3JpdGluZyBvZiB0aGUgdGFibGVzIGFuZCB2aXJnaW4KKyAgIG1heSBub3QgYmUgdGhyZWFkLXNhZmUuCisgKi8KK2xvY2FsIHZvaWQgZml4ZWR0YWJsZXMoc3RhdGUpCitzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKnN0YXRlOworeworI2lmZGVmIEJVSUxERklYRUQKKyAgICBzdGF0aWMgaW50IHZpcmdpbiA9IDE7CisgICAgc3RhdGljIGNvZGUgKmxlbmZpeCwgKmRpc3RmaXg7CisgICAgc3RhdGljIGNvZGUgZml4ZWRbNTQ0XTsKKworICAgIC8qIGJ1aWxkIGZpeGVkIGh1ZmZtYW4gdGFibGVzIGlmIGZpcnN0IGNhbGwgKG1heSBub3QgYmUgdGhyZWFkIHNhZmUpICovCisgICAgaWYgKHZpcmdpbikgeworICAgICAgICB1bnNpZ25lZCBzeW0sIGJpdHM7CisgICAgICAgIHN0YXRpYyBjb2RlICpuZXh0OworCisgICAgICAgIC8qIGxpdGVyYWwvbGVuZ3RoIHRhYmxlICovCisgICAgICAgIHN5bSA9IDA7CisgICAgICAgIHdoaWxlIChzeW0gPCAxNDQpIHN0YXRlLT5sZW5zW3N5bSsrXSA9IDg7CisgICAgICAgIHdoaWxlIChzeW0gPCAyNTYpIHN0YXRlLT5sZW5zW3N5bSsrXSA9IDk7CisgICAgICAgIHdoaWxlIChzeW0gPCAyODApIHN0YXRlLT5sZW5zW3N5bSsrXSA9IDc7CisgICAgICAgIHdoaWxlIChzeW0gPCAyODgpIHN0YXRlLT5sZW5zW3N5bSsrXSA9IDg7CisgICAgICAgIG5leHQgPSBmaXhlZDsKKyAgICAgICAgbGVuZml4ID0gbmV4dDsKKyAgICAgICAgYml0cyA9IDk7CisgICAgICAgIGluZmxhdGVfdGFibGUoTEVOUywgc3RhdGUtPmxlbnMsIDI4OCwgJihuZXh0KSwgJihiaXRzKSwgc3RhdGUtPndvcmspOworCisgICAgICAgIC8qIGRpc3RhbmNlIHRhYmxlICovCisgICAgICAgIHN5bSA9IDA7CisgICAgICAgIHdoaWxlIChzeW0gPCAzMikgc3RhdGUtPmxlbnNbc3ltKytdID0gNTsKKyAgICAgICAgZGlzdGZpeCA9IG5leHQ7CisgICAgICAgIGJpdHMgPSA1OworICAgICAgICBpbmZsYXRlX3RhYmxlKERJU1RTLCBzdGF0ZS0+bGVucywgMzIsICYobmV4dCksICYoYml0cyksIHN0YXRlLT53b3JrKTsKKworICAgICAgICAvKiBkbyB0aGlzIGp1c3Qgb25jZSAqLworICAgICAgICB2aXJnaW4gPSAwOworICAgIH0KKyNlbHNlIC8qICFCVUlMREZJWEVEICovCisjICAgaW5jbHVkZSAiaW5mZml4ZWQuaCIKKyNlbmRpZiAvKiBCVUlMREZJWEVEICovCisgICAgc3RhdGUtPmxlbmNvZGUgPSBsZW5maXg7CisgICAgc3RhdGUtPmxlbmJpdHMgPSA5OworICAgIHN0YXRlLT5kaXN0Y29kZSA9IGRpc3RmaXg7CisgICAgc3RhdGUtPmRpc3RiaXRzID0gNTsKK30KKworI2lmZGVmIE1BS0VGSVhFRAorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKy8qCisgICBXcml0ZSBvdXQgdGhlIGluZmZpeGVkLmggdGhhdCBpcyAjaW5jbHVkZSdkIGFib3ZlLiAgRGVmaW5pbmcgTUFLRUZJWEVEIGFsc28KKyAgIGRlZmluZXMgQlVJTERGSVhFRCwgc28gdGhlIHRhYmxlcyBhcmUgYnVpbHQgb24gdGhlIGZseS4gIG1ha2VmaXhlZCgpIHdyaXRlcworICAgdGhvc2UgdGFibGVzIHRvIHN0ZG91dCwgd2hpY2ggd291bGQgYmUgcGlwZWQgdG8gaW5mZml4ZWQuaC4gIEEgc21hbGwgcHJvZ3JhbQorICAgY2FuIHNpbXBseSBjYWxsIG1ha2VmaXhlZCB0byBkbyB0aGlzOgorCisgICAgdm9pZCBtYWtlZml4ZWQodm9pZCk7CisKKyAgICBpbnQgbWFpbih2b2lkKQorICAgIHsKKyAgICAgICAgbWFrZWZpeGVkKCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgVGhlbiB0aGF0IGNhbiBiZSBsaW5rZWQgd2l0aCB6bGliIGJ1aWx0IHdpdGggTUFLRUZJWEVEIGRlZmluZWQgYW5kIHJ1bjoKKworICAgIGEub3V0ID4gaW5mZml4ZWQuaAorICovCit2b2lkIG1ha2VmaXhlZCgpCit7CisgICAgdW5zaWduZWQgbG93LCBzaXplOworICAgIHN0cnVjdCBpbmZsYXRlX3N0YXRlIHN0YXRlOworCisgICAgZml4ZWR0YWJsZXMoJnN0YXRlKTsKKyAgICBwdXRzKCIgICAgLyogaW5mZml4ZWQuaCAtLSB0YWJsZSBmb3IgZGVjb2RpbmcgZml4ZWQgY29kZXMiKTsKKyAgICBwdXRzKCIgICAgICogR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgbWFrZWZpeGVkKCkuIik7CisgICAgcHV0cygiICAgICAqLyIpOworICAgIHB1dHMoIiIpOworICAgIHB1dHMoIiAgICAvKiBXQVJOSU5HOiB0aGlzIGZpbGUgc2hvdWxkICpub3QqIGJlIHVzZWQgYnkgYXBwbGljYXRpb25zLiIpOworICAgIHB1dHMoIiAgICAgICBJdCBpcyBwYXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGxpYnJhcnkgYW5kIGlzIik7CisgICAgcHV0cygiICAgICAgIHN1YmplY3QgdG8gY2hhbmdlLiBBcHBsaWNhdGlvbnMgc2hvdWxkIG9ubHkgdXNlIHpsaWIuaC4iKTsKKyAgICBwdXRzKCIgICAgICovIik7CisgICAgcHV0cygiIik7CisgICAgc2l6ZSA9IDFVIDw8IDk7CisgICAgcHJpbnRmKCIgICAgc3RhdGljIGNvbnN0IGNvZGUgbGVuZml4WyV1XSA9IHsiLCBzaXplKTsKKyAgICBsb3cgPSAwOworICAgIGZvciAoOzspIHsKKyAgICAgICAgaWYgKChsb3cgJSA3KSA9PSAwKSBwcmludGYoIlxuICAgICAgICAiKTsKKyAgICAgICAgcHJpbnRmKCJ7JXUsJXUsJWR9IiwgKGxvdyAmIDEyNykgPT0gOTkgPyA2NCA6IHN0YXRlLmxlbmNvZGVbbG93XS5vcCwKKyAgICAgICAgICAgICAgIHN0YXRlLmxlbmNvZGVbbG93XS5iaXRzLCBzdGF0ZS5sZW5jb2RlW2xvd10udmFsKTsKKyAgICAgICAgaWYgKCsrbG93ID09IHNpemUpIGJyZWFrOworICAgICAgICBwdXRjaGFyKCcsJyk7CisgICAgfQorICAgIHB1dHMoIlxuICAgIH07Iik7CisgICAgc2l6ZSA9IDFVIDw8IDU7CisgICAgcHJpbnRmKCJcbiAgICBzdGF0aWMgY29uc3QgY29kZSBkaXN0Zml4WyV1XSA9IHsiLCBzaXplKTsKKyAgICBsb3cgPSAwOworICAgIGZvciAoOzspIHsKKyAgICAgICAgaWYgKChsb3cgJSA2KSA9PSAwKSBwcmludGYoIlxuICAgICAgICAiKTsKKyAgICAgICAgcHJpbnRmKCJ7JXUsJXUsJWR9Iiwgc3RhdGUuZGlzdGNvZGVbbG93XS5vcCwgc3RhdGUuZGlzdGNvZGVbbG93XS5iaXRzLAorICAgICAgICAgICAgICAgc3RhdGUuZGlzdGNvZGVbbG93XS52YWwpOworICAgICAgICBpZiAoKytsb3cgPT0gc2l6ZSkgYnJlYWs7CisgICAgICAgIHB1dGNoYXIoJywnKTsKKyAgICB9CisgICAgcHV0cygiXG4gICAgfTsiKTsKK30KKyNlbmRpZiAvKiBNQUtFRklYRUQgKi8KKworLyoKKyAgIFVwZGF0ZSB0aGUgd2luZG93IHdpdGggdGhlIGxhc3Qgd3NpemUgKG5vcm1hbGx5IDMySykgYnl0ZXMgd3JpdHRlbiBiZWZvcmUKKyAgIHJldHVybmluZy4gIElmIHdpbmRvdyBkb2VzIG5vdCBleGlzdCB5ZXQsIGNyZWF0ZSBpdC4gIFRoaXMgaXMgb25seSBjYWxsZWQKKyAgIHdoZW4gYSB3aW5kb3cgaXMgYWxyZWFkeSBpbiB1c2UsIG9yIHdoZW4gb3V0cHV0IGhhcyBiZWVuIHdyaXR0ZW4gZHVyaW5nIHRoaXMKKyAgIGluZmxhdGUgY2FsbCwgYnV0IHRoZSBlbmQgb2YgdGhlIGRlZmxhdGUgc3RyZWFtIGhhcyBub3QgYmVlbiByZWFjaGVkIHlldC4KKyAgIEl0IGlzIGFsc28gY2FsbGVkIHRvIGNyZWF0ZSBhIHdpbmRvdyBmb3IgZGljdGlvbmFyeSBkYXRhIHdoZW4gYSBkaWN0aW9uYXJ5CisgICBpcyBsb2FkZWQuCisKKyAgIFByb3ZpZGluZyBvdXRwdXQgYnVmZmVycyBsYXJnZXIgdGhhbiAzMksgdG8gaW5mbGF0ZSgpIHNob3VsZCBwcm92aWRlIGEgc3BlZWQKKyAgIGFkdmFudGFnZSwgc2luY2Ugb25seSB0aGUgbGFzdCAzMksgb2Ygb3V0cHV0IGlzIGNvcGllZCB0byB0aGUgc2xpZGluZyB3aW5kb3cKKyAgIHVwb24gcmV0dXJuIGZyb20gaW5mbGF0ZSgpLCBhbmQgc2luY2UgYWxsIGRpc3RhbmNlcyBhZnRlciB0aGUgZmlyc3QgMzJLIG9mCisgICBvdXRwdXQgd2lsbCBmYWxsIGluIHRoZSBvdXRwdXQgZGF0YSwgbWFraW5nIG1hdGNoIGNvcGllcyBzaW1wbGVyIGFuZCBmYXN0ZXIuCisgICBUaGUgYWR2YW50YWdlIG1heSBiZSBkZXBlbmRlbnQgb24gdGhlIHNpemUgb2YgdGhlIHByb2Nlc3NvcidzIGRhdGEgY2FjaGVzLgorICovCitsb2NhbCBpbnQgdXBkYXRld2luZG93KHN0cm0sIG91dCkKK3pfc3RyZWFtcCBzdHJtOwordW5zaWduZWQgb3V0OworeworICAgIHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqc3RhdGU7CisgICAgdW5zaWduZWQgY29weSwgZGlzdDsKKworICAgIHN0YXRlID0gKHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqKXN0cm0tPnN0YXRlOworCisgICAgLyogaWYgaXQgaGFzbid0IGJlZW4gZG9uZSBhbHJlYWR5LCBhbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIHdpbmRvdyAqLworICAgIGlmIChzdGF0ZS0+d2luZG93ID09IFpfTlVMTCkgeworICAgICAgICBzdGF0ZS0+d2luZG93ID0gKHVuc2lnbmVkIGNoYXIgRkFSICopCisgICAgICAgICAgICAgICAgICAgICAgICBaQUxMT0Moc3RybSwgMVUgPDwgc3RhdGUtPndiaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih1bnNpZ25lZCBjaGFyKSk7CisgICAgICAgIGlmIChzdGF0ZS0+d2luZG93ID09IFpfTlVMTCkgcmV0dXJuIDE7CisgICAgfQorCisgICAgLyogaWYgd2luZG93IG5vdCBpbiB1c2UgeWV0LCBpbml0aWFsaXplICovCisgICAgaWYgKHN0YXRlLT53c2l6ZSA9PSAwKSB7CisgICAgICAgIHN0YXRlLT53c2l6ZSA9IDFVIDw8IHN0YXRlLT53Yml0czsKKyAgICAgICAgc3RhdGUtPnduZXh0ID0gMDsKKyAgICAgICAgc3RhdGUtPndoYXZlID0gMDsKKyAgICB9CisKKyAgICAvKiBjb3B5IHN0YXRlLT53c2l6ZSBvciBsZXNzIG91dHB1dCBieXRlcyBpbnRvIHRoZSBjaXJjdWxhciB3aW5kb3cgKi8KKyAgICBjb3B5ID0gb3V0IC0gc3RybS0+YXZhaWxfb3V0OworICAgIGlmIChjb3B5ID49IHN0YXRlLT53c2l6ZSkgeworICAgICAgICB6bWVtY3B5KHN0YXRlLT53aW5kb3csIHN0cm0tPm5leHRfb3V0IC0gc3RhdGUtPndzaXplLCBzdGF0ZS0+d3NpemUpOworICAgICAgICBzdGF0ZS0+d25leHQgPSAwOworICAgICAgICBzdGF0ZS0+d2hhdmUgPSBzdGF0ZS0+d3NpemU7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBkaXN0ID0gc3RhdGUtPndzaXplIC0gc3RhdGUtPnduZXh0OworICAgICAgICBpZiAoZGlzdCA+IGNvcHkpIGRpc3QgPSBjb3B5OworICAgICAgICB6bWVtY3B5KHN0YXRlLT53aW5kb3cgKyBzdGF0ZS0+d25leHQsIHN0cm0tPm5leHRfb3V0IC0gY29weSwgZGlzdCk7CisgICAgICAgIGNvcHkgLT0gZGlzdDsKKyAgICAgICAgaWYgKGNvcHkpIHsKKyAgICAgICAgICAgIHptZW1jcHkoc3RhdGUtPndpbmRvdywgc3RybS0+bmV4dF9vdXQgLSBjb3B5LCBjb3B5KTsKKyAgICAgICAgICAgIHN0YXRlLT53bmV4dCA9IGNvcHk7CisgICAgICAgICAgICBzdGF0ZS0+d2hhdmUgPSBzdGF0ZS0+d3NpemU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBzdGF0ZS0+d25leHQgKz0gZGlzdDsKKyAgICAgICAgICAgIGlmIChzdGF0ZS0+d25leHQgPT0gc3RhdGUtPndzaXplKSBzdGF0ZS0+d25leHQgPSAwOworICAgICAgICAgICAgaWYgKHN0YXRlLT53aGF2ZSA8IHN0YXRlLT53c2l6ZSkgc3RhdGUtPndoYXZlICs9IGRpc3Q7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8qIE1hY3JvcyBmb3IgaW5mbGF0ZSgpOiAqLworCisvKiBjaGVjayBmdW5jdGlvbiB0byB1c2UgYWRsZXIzMigpIGZvciB6bGliIG9yIGNyYzMyKCkgZm9yIGd6aXAgKi8KKyNpZmRlZiBHVU5aSVAKKyMgIGRlZmluZSBVUERBVEUoY2hlY2ssIGJ1ZiwgbGVuKSBcCisgICAgKHN0YXRlLT5mbGFncyA/IGNyYzMyKGNoZWNrLCBidWYsIGxlbikgOiBhZGxlcjMyKGNoZWNrLCBidWYsIGxlbikpCisjZWxzZQorIyAgZGVmaW5lIFVQREFURShjaGVjaywgYnVmLCBsZW4pIGFkbGVyMzIoY2hlY2ssIGJ1ZiwgbGVuKQorI2VuZGlmCisKKy8qIGNoZWNrIG1hY3JvcyBmb3IgaGVhZGVyIGNyYyAqLworI2lmZGVmIEdVTlpJUAorIyAgZGVmaW5lIENSQzIoY2hlY2ssIHdvcmQpIFwKKyAgICBkbyB7IFwKKyAgICAgICAgaGJ1ZlswXSA9ICh1bnNpZ25lZCBjaGFyKSh3b3JkKTsgXAorICAgICAgICBoYnVmWzFdID0gKHVuc2lnbmVkIGNoYXIpKCh3b3JkKSA+PiA4KTsgXAorICAgICAgICBjaGVjayA9IGNyYzMyKGNoZWNrLCBoYnVmLCAyKTsgXAorICAgIH0gd2hpbGUgKDApCisKKyMgIGRlZmluZSBDUkM0KGNoZWNrLCB3b3JkKSBcCisgICAgZG8geyBcCisgICAgICAgIGhidWZbMF0gPSAodW5zaWduZWQgY2hhcikod29yZCk7IFwKKyAgICAgICAgaGJ1ZlsxXSA9ICh1bnNpZ25lZCBjaGFyKSgod29yZCkgPj4gOCk7IFwKKyAgICAgICAgaGJ1ZlsyXSA9ICh1bnNpZ25lZCBjaGFyKSgod29yZCkgPj4gMTYpOyBcCisgICAgICAgIGhidWZbM10gPSAodW5zaWduZWQgY2hhcikoKHdvcmQpID4+IDI0KTsgXAorICAgICAgICBjaGVjayA9IGNyYzMyKGNoZWNrLCBoYnVmLCA0KTsgXAorICAgIH0gd2hpbGUgKDApCisjZW5kaWYKKworLyogTG9hZCByZWdpc3RlcnMgd2l0aCBzdGF0ZSBpbiBpbmZsYXRlKCkgZm9yIHNwZWVkICovCisjZGVmaW5lIExPQUQoKSBcCisgICAgZG8geyBcCisgICAgICAgIHB1dCA9IHN0cm0tPm5leHRfb3V0OyBcCisgICAgICAgIGxlZnQgPSBzdHJtLT5hdmFpbF9vdXQ7IFwKKyAgICAgICAgbmV4dCA9IHN0cm0tPm5leHRfaW47IFwKKyAgICAgICAgaGF2ZSA9IHN0cm0tPmF2YWlsX2luOyBcCisgICAgICAgIGhvbGQgPSBzdGF0ZS0+aG9sZDsgXAorICAgICAgICBiaXRzID0gc3RhdGUtPmJpdHM7IFwKKyAgICB9IHdoaWxlICgwKQorCisvKiBSZXN0b3JlIHN0YXRlIGZyb20gcmVnaXN0ZXJzIGluIGluZmxhdGUoKSAqLworI2RlZmluZSBSRVNUT1JFKCkgXAorICAgIGRvIHsgXAorICAgICAgICBzdHJtLT5uZXh0X291dCA9IHB1dDsgXAorICAgICAgICBzdHJtLT5hdmFpbF9vdXQgPSBsZWZ0OyBcCisgICAgICAgIHN0cm0tPm5leHRfaW4gPSBuZXh0OyBcCisgICAgICAgIHN0cm0tPmF2YWlsX2luID0gaGF2ZTsgXAorICAgICAgICBzdGF0ZS0+aG9sZCA9IGhvbGQ7IFwKKyAgICAgICAgc3RhdGUtPmJpdHMgPSBiaXRzOyBcCisgICAgfSB3aGlsZSAoMCkKKworLyogQ2xlYXIgdGhlIGlucHV0IGJpdCBhY2N1bXVsYXRvciAqLworI2RlZmluZSBJTklUQklUUygpIFwKKyAgICBkbyB7IFwKKyAgICAgICAgaG9sZCA9IDA7IFwKKyAgICAgICAgYml0cyA9IDA7IFwKKyAgICB9IHdoaWxlICgwKQorCisvKiBHZXQgYSBieXRlIG9mIGlucHV0IGludG8gdGhlIGJpdCBhY2N1bXVsYXRvciwgb3IgcmV0dXJuIGZyb20gaW5mbGF0ZSgpCisgICBpZiB0aGVyZSBpcyBubyBpbnB1dCBhdmFpbGFibGUuICovCisjZGVmaW5lIFBVTExCWVRFKCkgXAorICAgIGRvIHsgXAorICAgICAgICBpZiAoaGF2ZSA9PSAwKSBnb3RvIGluZl9sZWF2ZTsgXAorICAgICAgICBoYXZlLS07IFwKKyAgICAgICAgaG9sZCArPSAodW5zaWduZWQgbG9uZykoKm5leHQrKykgPDwgYml0czsgXAorICAgICAgICBiaXRzICs9IDg7IFwKKyAgICB9IHdoaWxlICgwKQorCisvKiBBc3N1cmUgdGhhdCB0aGVyZSBhcmUgYXQgbGVhc3QgbiBiaXRzIGluIHRoZSBiaXQgYWNjdW11bGF0b3IuICBJZiB0aGVyZSBpcworICAgbm90IGVub3VnaCBhdmFpbGFibGUgaW5wdXQgdG8gZG8gdGhhdCwgdGhlbiByZXR1cm4gZnJvbSBpbmZsYXRlKCkuICovCisjZGVmaW5lIE5FRURCSVRTKG4pIFwKKyAgICBkbyB7IFwKKyAgICAgICAgd2hpbGUgKGJpdHMgPCAodW5zaWduZWQpKG4pKSBcCisgICAgICAgICAgICBQVUxMQllURSgpOyBcCisgICAgfSB3aGlsZSAoMCkKKworLyogUmV0dXJuIHRoZSBsb3cgbiBiaXRzIG9mIHRoZSBiaXQgYWNjdW11bGF0b3IgKG4gPCAxNikgKi8KKyNkZWZpbmUgQklUUyhuKSBcCisgICAgKCh1bnNpZ25lZClob2xkICYgKCgxVSA8PCAobikpIC0gMSkpCisKKy8qIFJlbW92ZSBuIGJpdHMgZnJvbSB0aGUgYml0IGFjY3VtdWxhdG9yICovCisjZGVmaW5lIERST1BCSVRTKG4pIFwKKyAgICBkbyB7IFwKKyAgICAgICAgaG9sZCA+Pj0gKG4pOyBcCisgICAgICAgIGJpdHMgLT0gKHVuc2lnbmVkKShuKTsgXAorICAgIH0gd2hpbGUgKDApCisKKy8qIFJlbW92ZSB6ZXJvIHRvIHNldmVuIGJpdHMgYXMgbmVlZGVkIHRvIGdvIHRvIGEgYnl0ZSBib3VuZGFyeSAqLworI2RlZmluZSBCWVRFQklUUygpIFwKKyAgICBkbyB7IFwKKyAgICAgICAgaG9sZCA+Pj0gYml0cyAmIDc7IFwKKyAgICAgICAgYml0cyAtPSBiaXRzICYgNzsgXAorICAgIH0gd2hpbGUgKDApCisKKy8qIFJldmVyc2UgdGhlIGJ5dGVzIGluIGEgMzItYml0IHZhbHVlICovCisjZGVmaW5lIFJFVkVSU0UocSkgXAorICAgICgoKChxKSA+PiAyNCkgJiAweGZmKSArICgoKHEpID4+IDgpICYgMHhmZjAwKSArIFwKKyAgICAgKCgocSkgJiAweGZmMDApIDw8IDgpICsgKCgocSkgJiAweGZmKSA8PCAyNCkpCisKKy8qCisgICBpbmZsYXRlKCkgdXNlcyBhIHN0YXRlIG1hY2hpbmUgdG8gcHJvY2VzcyBhcyBtdWNoIGlucHV0IGRhdGEgYW5kIGdlbmVyYXRlIGFzCisgICBtdWNoIG91dHB1dCBkYXRhIGFzIHBvc3NpYmxlIGJlZm9yZSByZXR1cm5pbmcuICBUaGUgc3RhdGUgbWFjaGluZSBpcworICAgc3RydWN0dXJlZCByb3VnaGx5IGFzIGZvbGxvd3M6CisKKyAgICBmb3IgKDs7KSBzd2l0Y2ggKHN0YXRlKSB7CisgICAgLi4uCisgICAgY2FzZSBTVEFURW46CisgICAgICAgIGlmIChub3QgZW5vdWdoIGlucHV0IGRhdGEgb3Igb3V0cHV0IHNwYWNlIHRvIG1ha2UgcHJvZ3Jlc3MpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIC4uLiBtYWtlIHByb2dyZXNzIC4uLgorICAgICAgICBzdGF0ZSA9IFNUQVRFbTsKKyAgICAgICAgYnJlYWs7CisgICAgLi4uCisgICAgfQorCisgICBzbyB3aGVuIGluZmxhdGUoKSBpcyBjYWxsZWQgYWdhaW4sIHRoZSBzYW1lIGNhc2UgaXMgYXR0ZW1wdGVkIGFnYWluLCBhbmQKKyAgIGlmIHRoZSBhcHByb3ByaWF0ZSByZXNvdXJjZXMgYXJlIHByb3ZpZGVkLCB0aGUgbWFjaGluZSBwcm9jZWVkcyB0byB0aGUKKyAgIG5leHQgc3RhdGUuICBUaGUgTkVFREJJVFMoKSBtYWNybyBpcyB1c3VhbGx5IHRoZSB3YXkgdGhlIHN0YXRlIGV2YWx1YXRlcworICAgd2hldGhlciBpdCBjYW4gcHJvY2VlZCBvciBzaG91bGQgcmV0dXJuLiAgTkVFREJJVFMoKSBkb2VzIHRoZSByZXR1cm4gaWYKKyAgIHRoZSByZXF1ZXN0ZWQgYml0cyBhcmUgbm90IGF2YWlsYWJsZS4gIFRoZSB0eXBpY2FsIHVzZSBvZiB0aGUgQklUUyBtYWNyb3MKKyAgIGlzOgorCisgICAgICAgIE5FRURCSVRTKG4pOworICAgICAgICAuLi4gZG8gc29tZXRoaW5nIHdpdGggQklUUyhuKSAuLi4KKyAgICAgICAgRFJPUEJJVFMobik7CisKKyAgIHdoZXJlIE5FRURCSVRTKG4pIGVpdGhlciByZXR1cm5zIGZyb20gaW5mbGF0ZSgpIGlmIHRoZXJlIGlzbid0IGVub3VnaAorICAgaW5wdXQgbGVmdCB0byBsb2FkIG4gYml0cyBpbnRvIHRoZSBhY2N1bXVsYXRvciwgb3IgaXQgY29udGludWVzLiAgQklUUyhuKQorICAgZ2l2ZXMgdGhlIGxvdyBuIGJpdHMgaW4gdGhlIGFjY3VtdWxhdG9yLiAgV2hlbiBkb25lLCBEUk9QQklUUyhuKSBkcm9wcworICAgdGhlIGxvdyBuIGJpdHMgb2ZmIHRoZSBhY2N1bXVsYXRvci4gIElOSVRCSVRTKCkgY2xlYXJzIHRoZSBhY2N1bXVsYXRvcgorICAgYW5kIHNldHMgdGhlIG51bWJlciBvZiBhdmFpbGFibGUgYml0cyB0byB6ZXJvLiAgQllURUJJVFMoKSBkaXNjYXJkcyBqdXN0CisgICBlbm91Z2ggYml0cyB0byBwdXQgdGhlIGFjY3VtdWxhdG9yIG9uIGEgYnl0ZSBib3VuZGFyeS4gIEFmdGVyIEJZVEVCSVRTKCkKKyAgIGFuZCBhIE5FRURCSVRTKDgpLCB0aGVuIEJJVFMoOCkgd291bGQgcmV0dXJuIHRoZSBuZXh0IGJ5dGUgaW4gdGhlIHN0cmVhbS4KKworICAgTkVFREJJVFMobikgdXNlcyBQVUxMQllURSgpIHRvIGdldCBhbiBhdmFpbGFibGUgYnl0ZSBvZiBpbnB1dCwgb3IgdG8gcmV0dXJuCisgICBpZiB0aGVyZSBpcyBubyBpbnB1dCBhdmFpbGFibGUuICBUaGUgZGVjb2Rpbmcgb2YgdmFyaWFibGUgbGVuZ3RoIGNvZGVzIHVzZXMKKyAgIFBVTExCWVRFKCkgZGlyZWN0bHkgaW4gb3JkZXIgdG8gcHVsbCBqdXN0IGVub3VnaCBieXRlcyB0byBkZWNvZGUgdGhlIG5leHQKKyAgIGNvZGUsIGFuZCBubyBtb3JlLgorCisgICBTb21lIHN0YXRlcyBsb29wIHVudGlsIHRoZXkgZ2V0IGVub3VnaCBpbnB1dCwgbWFraW5nIHN1cmUgdGhhdCBlbm91Z2gKKyAgIHN0YXRlIGluZm9ybWF0aW9uIGlzIG1haW50YWluZWQgdG8gY29udGludWUgdGhlIGxvb3Agd2hlcmUgaXQgbGVmdCBvZmYKKyAgIGlmIE5FRURCSVRTKCkgcmV0dXJucyBpbiB0aGUgbG9vcC4gIEZvciBleGFtcGxlLCB3YW50LCBuZWVkLCBhbmQga2VlcAorICAgd291bGQgYWxsIGhhdmUgdG8gYWN0dWFsbHkgYmUgcGFydCBvZiB0aGUgc2F2ZWQgc3RhdGUgaW4gY2FzZSBORUVEQklUUygpCisgICByZXR1cm5zOgorCisgICAgY2FzZSBTVEFURXc6CisgICAgICAgIHdoaWxlICh3YW50IDwgbmVlZCkgeworICAgICAgICAgICAgTkVFREJJVFMobik7CisgICAgICAgICAgICBrZWVwW3dhbnQrK10gPSBCSVRTKG4pOworICAgICAgICAgICAgRFJPUEJJVFMobik7CisgICAgICAgIH0KKyAgICAgICAgc3RhdGUgPSBTVEFURXg7CisgICAgY2FzZSBTVEFURXg6CisKKyAgIEFzIHNob3duIGFib3ZlLCBpZiB0aGUgbmV4dCBzdGF0ZSBpcyBhbHNvIHRoZSBuZXh0IGNhc2UsIHRoZW4gdGhlIGJyZWFrCisgICBpcyBvbWl0dGVkLgorCisgICBBIHN0YXRlIG1heSBhbHNvIHJldHVybiBpZiB0aGVyZSBpcyBub3QgZW5vdWdoIG91dHB1dCBzcGFjZSBhdmFpbGFibGUgdG8KKyAgIGNvbXBsZXRlIHRoYXQgc3RhdGUuICBUaG9zZSBzdGF0ZXMgYXJlIGNvcHlpbmcgc3RvcmVkIGRhdGEsIHdyaXRpbmcgYQorICAgbGl0ZXJhbCBieXRlLCBhbmQgY29weWluZyBhIG1hdGNoaW5nIHN0cmluZy4KKworICAgV2hlbiByZXR1cm5pbmcsIGEgImdvdG8gaW5mX2xlYXZlIiBpcyB1c2VkIHRvIHVwZGF0ZSB0aGUgdG90YWwgY291bnRlcnMsCisgICB1cGRhdGUgdGhlIGNoZWNrIHZhbHVlLCBhbmQgZGV0ZXJtaW5lIHdoZXRoZXIgYW55IHByb2dyZXNzIGhhcyBiZWVuIG1hZGUKKyAgIGR1cmluZyB0aGF0IGluZmxhdGUoKSBjYWxsIGluIG9yZGVyIHRvIHJldHVybiB0aGUgcHJvcGVyIHJldHVybiBjb2RlLgorICAgUHJvZ3Jlc3MgaXMgZGVmaW5lZCBhcyBhIGNoYW5nZSBpbiBlaXRoZXIgc3RybS0+YXZhaWxfaW4gb3Igc3RybS0+YXZhaWxfb3V0LgorICAgV2hlbiB0aGVyZSBpcyBhIHdpbmRvdywgZ290byBpbmZfbGVhdmUgd2lsbCB1cGRhdGUgdGhlIHdpbmRvdyB3aXRoIHRoZSBsYXN0CisgICBvdXRwdXQgd3JpdHRlbi4gIElmIGEgZ290byBpbmZfbGVhdmUgb2NjdXJzIGluIHRoZSBtaWRkbGUgb2YgZGVjb21wcmVzc2lvbgorICAgYW5kIHRoZXJlIGlzIG5vIHdpbmRvdyBjdXJyZW50bHksIGdvdG8gaW5mX2xlYXZlIHdpbGwgY3JlYXRlIG9uZSBhbmQgY29weQorICAgb3V0cHV0IHRvIHRoZSB3aW5kb3cgZm9yIHRoZSBuZXh0IGNhbGwgb2YgaW5mbGF0ZSgpLgorCisgICBJbiB0aGlzIGltcGxlbWVudGF0aW9uLCB0aGUgZmx1c2ggcGFyYW1ldGVyIG9mIGluZmxhdGUoKSBvbmx5IGFmZmVjdHMgdGhlCisgICByZXR1cm4gY29kZSAocGVyIHpsaWIuaCkuICBpbmZsYXRlKCkgYWx3YXlzIHdyaXRlcyBhcyBtdWNoIGFzIHBvc3NpYmxlIHRvCisgICBzdHJtLT5uZXh0X291dCwgZ2l2ZW4gdGhlIHNwYWNlIGF2YWlsYWJsZSBhbmQgdGhlIHByb3ZpZGVkIGlucHV0LS10aGUgZWZmZWN0CisgICBkb2N1bWVudGVkIGluIHpsaWIuaCBvZiBaX1NZTkNfRkxVU0guICBGdXJ0aGVybW9yZSwgaW5mbGF0ZSgpIGFsd2F5cyBkZWZlcnMKKyAgIHRoZSBhbGxvY2F0aW9uIG9mIGFuZCBjb3B5aW5nIGludG8gYSBzbGlkaW5nIHdpbmRvdyB1bnRpbCBuZWNlc3NhcnksIHdoaWNoCisgICBwcm92aWRlcyB0aGUgZWZmZWN0IGRvY3VtZW50ZWQgaW4gemxpYi5oIGZvciBaX0ZJTklTSCB3aGVuIHRoZSBlbnRpcmUgaW5wdXQKKyAgIHN0cmVhbSBhdmFpbGFibGUuICBTbyB0aGUgb25seSB0aGluZyB0aGUgZmx1c2ggcGFyYW1ldGVyIGFjdHVhbGx5IGRvZXMgaXM6CisgICB3aGVuIGZsdXNoIGlzIHNldCB0byBaX0ZJTklTSCwgaW5mbGF0ZSgpIGNhbm5vdCByZXR1cm4gWl9PSy4gIEluc3RlYWQgaXQKKyAgIHdpbGwgcmV0dXJuIFpfQlVGX0VSUk9SIGlmIGl0IGhhcyBub3QgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBzdHJlYW0uCisgKi8KKworaW50IFpFWFBPUlQgaW5mbGF0ZShzdHJtLCBmbHVzaCkKK3pfc3RyZWFtcCBzdHJtOworaW50IGZsdXNoOworeworICAgIHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqc3RhdGU7CisgICAgdW5zaWduZWQgY2hhciBGQVIgKm5leHQ7ICAgIC8qIG5leHQgaW5wdXQgKi8KKyAgICB1bnNpZ25lZCBjaGFyIEZBUiAqcHV0OyAgICAgLyogbmV4dCBvdXRwdXQgKi8KKyAgICB1bnNpZ25lZCBoYXZlLCBsZWZ0OyAgICAgICAgLyogYXZhaWxhYmxlIGlucHV0IGFuZCBvdXRwdXQgKi8KKyAgICB1bnNpZ25lZCBsb25nIGhvbGQ7ICAgICAgICAgLyogYml0IGJ1ZmZlciAqLworICAgIHVuc2lnbmVkIGJpdHM7ICAgICAgICAgICAgICAvKiBiaXRzIGluIGJpdCBidWZmZXIgKi8KKyAgICB1bnNpZ25lZCBpbiwgb3V0OyAgICAgICAgICAgLyogc2F2ZSBzdGFydGluZyBhdmFpbGFibGUgaW5wdXQgYW5kIG91dHB1dCAqLworICAgIHVuc2lnbmVkIGNvcHk7ICAgICAgICAgICAgICAvKiBudW1iZXIgb2Ygc3RvcmVkIG9yIG1hdGNoIGJ5dGVzIHRvIGNvcHkgKi8KKyAgICB1bnNpZ25lZCBjaGFyIEZBUiAqZnJvbTsgICAgLyogd2hlcmUgdG8gY29weSBtYXRjaCBieXRlcyBmcm9tICovCisgICAgY29kZSBoZXJlOyAgICAgICAgICAgICAgICAgIC8qIGN1cnJlbnQgZGVjb2RpbmcgdGFibGUgZW50cnkgKi8KKyAgICBjb2RlIGxhc3Q7ICAgICAgICAgICAgICAgICAgLyogcGFyZW50IHRhYmxlIGVudHJ5ICovCisgICAgdW5zaWduZWQgbGVuOyAgICAgICAgICAgICAgIC8qIGxlbmd0aCB0byBjb3B5IGZvciByZXBlYXRzLCBiaXRzIHRvIGRyb3AgKi8KKyAgICBpbnQgcmV0OyAgICAgICAgICAgICAgICAgICAgLyogcmV0dXJuIGNvZGUgKi8KKyNpZmRlZiBHVU5aSVAKKyAgICB1bnNpZ25lZCBjaGFyIGhidWZbNF07ICAgICAgLyogYnVmZmVyIGZvciBnemlwIGhlYWRlciBjcmMgY2FsY3VsYXRpb24gKi8KKyNlbmRpZgorICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBvcmRlclsxOV0gPSAvKiBwZXJtdXRhdGlvbiBvZiBjb2RlIGxlbmd0aHMgKi8KKyAgICAgICAgezE2LCAxNywgMTgsIDAsIDgsIDcsIDksIDYsIDEwLCA1LCAxMSwgNCwgMTIsIDMsIDEzLCAyLCAxNCwgMSwgMTV9OworCisgICAgaWYgKHN0cm0gPT0gWl9OVUxMIHx8IHN0cm0tPnN0YXRlID09IFpfTlVMTCB8fCBzdHJtLT5uZXh0X291dCA9PSBaX05VTEwgfHwKKyAgICAgICAgKHN0cm0tPm5leHRfaW4gPT0gWl9OVUxMICYmIHN0cm0tPmF2YWlsX2luICE9IDApKQorICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisKKyAgICBzdGF0ZSA9IChzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKilzdHJtLT5zdGF0ZTsKKyAgICBpZiAoc3RhdGUtPm1vZGUgPT0gVFlQRSkgc3RhdGUtPm1vZGUgPSBUWVBFRE87ICAgICAgLyogc2tpcCBjaGVjayAqLworICAgIExPQUQoKTsKKyAgICBpbiA9IGhhdmU7CisgICAgb3V0ID0gbGVmdDsKKyAgICByZXQgPSBaX09LOworICAgIGZvciAoOzspCisgICAgICAgIHN3aXRjaCAoc3RhdGUtPm1vZGUpIHsKKyAgICAgICAgY2FzZSBIRUFEOgorICAgICAgICAgICAgaWYgKHN0YXRlLT53cmFwID09IDApIHsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IFRZUEVETzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIE5FRURCSVRTKDE2KTsKKyNpZmRlZiBHVU5aSVAKKyAgICAgICAgICAgIGlmICgoc3RhdGUtPndyYXAgJiAyKSAmJiBob2xkID09IDB4OGIxZikgeyAgLyogZ3ppcCBoZWFkZXIgKi8KKyAgICAgICAgICAgICAgICBzdGF0ZS0+Y2hlY2sgPSBjcmMzMigwTCwgWl9OVUxMLCAwKTsKKyAgICAgICAgICAgICAgICBDUkMyKHN0YXRlLT5jaGVjaywgaG9sZCk7CisgICAgICAgICAgICAgICAgSU5JVEJJVFMoKTsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEZMQUdTOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdGUtPmZsYWdzID0gMDsgICAgICAgICAgIC8qIGV4cGVjdCB6bGliIGhlYWRlciAqLworICAgICAgICAgICAgaWYgKHN0YXRlLT5oZWFkICE9IFpfTlVMTCkKKyAgICAgICAgICAgICAgICBzdGF0ZS0+aGVhZC0+ZG9uZSA9IC0xOworICAgICAgICAgICAgaWYgKCEoc3RhdGUtPndyYXAgJiAxKSB8fCAgIC8qIGNoZWNrIGlmIHpsaWIgaGVhZGVyIGFsbG93ZWQgKi8KKyNlbHNlCisgICAgICAgICAgICBpZiAoCisjZW5kaWYKKyAgICAgICAgICAgICAgICAoKEJJVFMoOCkgPDwgOCkgKyAoaG9sZCA+PiA4KSkgJSAzMSkgeworICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImluY29ycmVjdCBoZWFkZXIgY2hlY2siOworICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEJJVFMoNCkgIT0gWl9ERUZMQVRFRCkgeworICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopInVua25vd24gY29tcHJlc3Npb24gbWV0aG9kIjsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIERST1BCSVRTKDQpOworICAgICAgICAgICAgbGVuID0gQklUUyg0KSArIDg7CisgICAgICAgICAgICBpZiAoc3RhdGUtPndiaXRzID09IDApCisgICAgICAgICAgICAgICAgc3RhdGUtPndiaXRzID0gbGVuOworICAgICAgICAgICAgZWxzZSBpZiAobGVuID4gc3RhdGUtPndiaXRzKSB7CisgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCB3aW5kb3cgc2l6ZSI7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0ZS0+ZG1heCA9IDFVIDw8IGxlbjsKKyAgICAgICAgICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICB6bGliIGhlYWRlciBva1xuIikpOworICAgICAgICAgICAgc3RybS0+YWRsZXIgPSBzdGF0ZS0+Y2hlY2sgPSBhZGxlcjMyKDBMLCBaX05VTEwsIDApOworICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBob2xkICYgMHgyMDAgPyBESUNUSUQgOiBUWVBFOworICAgICAgICAgICAgSU5JVEJJVFMoKTsKKyAgICAgICAgICAgIGJyZWFrOworI2lmZGVmIEdVTlpJUAorICAgICAgICBjYXNlIEZMQUdTOgorICAgICAgICAgICAgTkVFREJJVFMoMTYpOworICAgICAgICAgICAgc3RhdGUtPmZsYWdzID0gKGludCkoaG9sZCk7CisgICAgICAgICAgICBpZiAoKHN0YXRlLT5mbGFncyAmIDB4ZmYpICE9IFpfREVGTEFURUQpIHsKKyAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJ1bmtub3duIGNvbXByZXNzaW9uIG1ldGhvZCI7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3RhdGUtPmZsYWdzICYgMHhlMDAwKSB7CisgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikidW5rbm93biBoZWFkZXIgZmxhZ3Mgc2V0IjsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdGF0ZS0+aGVhZCAhPSBaX05VTEwpCisgICAgICAgICAgICAgICAgc3RhdGUtPmhlYWQtPnRleHQgPSAoaW50KSgoaG9sZCA+PiA4KSAmIDEpOworICAgICAgICAgICAgaWYgKHN0YXRlLT5mbGFncyAmIDB4MDIwMCkgQ1JDMihzdGF0ZS0+Y2hlY2ssIGhvbGQpOworICAgICAgICAgICAgSU5JVEJJVFMoKTsKKyAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gVElNRTsKKyAgICAgICAgY2FzZSBUSU1FOgorICAgICAgICAgICAgTkVFREJJVFMoMzIpOworICAgICAgICAgICAgaWYgKHN0YXRlLT5oZWFkICE9IFpfTlVMTCkKKyAgICAgICAgICAgICAgICBzdGF0ZS0+aGVhZC0+dGltZSA9IGhvbGQ7CisgICAgICAgICAgICBpZiAoc3RhdGUtPmZsYWdzICYgMHgwMjAwKSBDUkM0KHN0YXRlLT5jaGVjaywgaG9sZCk7CisgICAgICAgICAgICBJTklUQklUUygpOworICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBPUzsKKyAgICAgICAgY2FzZSBPUzoKKyAgICAgICAgICAgIE5FRURCSVRTKDE2KTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS0+aGVhZCAhPSBaX05VTEwpIHsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+aGVhZC0+eGZsYWdzID0gKGludCkoaG9sZCAmIDB4ZmYpOworICAgICAgICAgICAgICAgIHN0YXRlLT5oZWFkLT5vcyA9IChpbnQpKGhvbGQgPj4gOCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3RhdGUtPmZsYWdzICYgMHgwMjAwKSBDUkMyKHN0YXRlLT5jaGVjaywgaG9sZCk7CisgICAgICAgICAgICBJTklUQklUUygpOworICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBFWExFTjsKKyAgICAgICAgY2FzZSBFWExFTjoKKyAgICAgICAgICAgIGlmIChzdGF0ZS0+ZmxhZ3MgJiAweDA0MDApIHsKKyAgICAgICAgICAgICAgICBORUVEQklUUygxNik7CisgICAgICAgICAgICAgICAgc3RhdGUtPmxlbmd0aCA9ICh1bnNpZ25lZCkoaG9sZCk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXRlLT5oZWFkICE9IFpfTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUtPmhlYWQtPmV4dHJhX2xlbiA9ICh1bnNpZ25lZClob2xkOworICAgICAgICAgICAgICAgIGlmIChzdGF0ZS0+ZmxhZ3MgJiAweDAyMDApIENSQzIoc3RhdGUtPmNoZWNrLCBob2xkKTsKKyAgICAgICAgICAgICAgICBJTklUQklUUygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoc3RhdGUtPmhlYWQgIT0gWl9OVUxMKQorICAgICAgICAgICAgICAgIHN0YXRlLT5oZWFkLT5leHRyYSA9IFpfTlVMTDsKKyAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gRVhUUkE7CisgICAgICAgIGNhc2UgRVhUUkE6CisgICAgICAgICAgICBpZiAoc3RhdGUtPmZsYWdzICYgMHgwNDAwKSB7CisgICAgICAgICAgICAgICAgY29weSA9IHN0YXRlLT5sZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKGNvcHkgPiBoYXZlKSBjb3B5ID0gaGF2ZTsKKyAgICAgICAgICAgICAgICBpZiAoY29weSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUtPmhlYWQgIT0gWl9OVUxMICYmCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+aGVhZC0+ZXh0cmEgIT0gWl9OVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsZW4gPSBzdGF0ZS0+aGVhZC0+ZXh0cmFfbGVuIC0gc3RhdGUtPmxlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHptZW1jcHkoc3RhdGUtPmhlYWQtPmV4dHJhICsgbGVuLCBuZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4gKyBjb3B5ID4gc3RhdGUtPmhlYWQtPmV4dHJhX21heCA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5oZWFkLT5leHRyYV9tYXggLSBsZW4gOiBjb3B5KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUtPmZsYWdzICYgMHgwMjAwKQorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPmNoZWNrID0gY3JjMzIoc3RhdGUtPmNoZWNrLCBuZXh0LCBjb3B5KTsKKyAgICAgICAgICAgICAgICAgICAgaGF2ZSAtPSBjb3B5OworICAgICAgICAgICAgICAgICAgICBuZXh0ICs9IGNvcHk7CisgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5sZW5ndGggLT0gY29weTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHN0YXRlLT5sZW5ndGgpIGdvdG8gaW5mX2xlYXZlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdGUtPmxlbmd0aCA9IDA7CisgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IE5BTUU7CisgICAgICAgIGNhc2UgTkFNRToKKyAgICAgICAgICAgIGlmIChzdGF0ZS0+ZmxhZ3MgJiAweDA4MDApIHsKKyAgICAgICAgICAgICAgICBpZiAoaGF2ZSA9PSAwKSBnb3RvIGluZl9sZWF2ZTsKKyAgICAgICAgICAgICAgICBjb3B5ID0gMDsKKyAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgIGxlbiA9ICh1bnNpZ25lZCkobmV4dFtjb3B5KytdKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLT5oZWFkICE9IFpfTlVMTCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5oZWFkLT5uYW1lICE9IFpfTlVMTCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5sZW5ndGggPCBzdGF0ZS0+aGVhZC0+bmFtZV9tYXgpCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+aGVhZC0+bmFtZVtzdGF0ZS0+bGVuZ3RoKytdID0gbGVuOworICAgICAgICAgICAgICAgIH0gd2hpbGUgKGxlbiAmJiBjb3B5IDwgaGF2ZSk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXRlLT5mbGFncyAmIDB4MDIwMCkKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUtPmNoZWNrID0gY3JjMzIoc3RhdGUtPmNoZWNrLCBuZXh0LCBjb3B5KTsKKyAgICAgICAgICAgICAgICBoYXZlIC09IGNvcHk7CisgICAgICAgICAgICAgICAgbmV4dCArPSBjb3B5OworICAgICAgICAgICAgICAgIGlmIChsZW4pIGdvdG8gaW5mX2xlYXZlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoc3RhdGUtPmhlYWQgIT0gWl9OVUxMKQorICAgICAgICAgICAgICAgIHN0YXRlLT5oZWFkLT5uYW1lID0gWl9OVUxMOworICAgICAgICAgICAgc3RhdGUtPmxlbmd0aCA9IDA7CisgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IENPTU1FTlQ7CisgICAgICAgIGNhc2UgQ09NTUVOVDoKKyAgICAgICAgICAgIGlmIChzdGF0ZS0+ZmxhZ3MgJiAweDEwMDApIHsKKyAgICAgICAgICAgICAgICBpZiAoaGF2ZSA9PSAwKSBnb3RvIGluZl9sZWF2ZTsKKyAgICAgICAgICAgICAgICBjb3B5ID0gMDsKKyAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgIGxlbiA9ICh1bnNpZ25lZCkobmV4dFtjb3B5KytdKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLT5oZWFkICE9IFpfTlVMTCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5oZWFkLT5jb21tZW50ICE9IFpfTlVMTCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5sZW5ndGggPCBzdGF0ZS0+aGVhZC0+Y29tbV9tYXgpCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+aGVhZC0+Y29tbWVudFtzdGF0ZS0+bGVuZ3RoKytdID0gbGVuOworICAgICAgICAgICAgICAgIH0gd2hpbGUgKGxlbiAmJiBjb3B5IDwgaGF2ZSk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXRlLT5mbGFncyAmIDB4MDIwMCkKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUtPmNoZWNrID0gY3JjMzIoc3RhdGUtPmNoZWNrLCBuZXh0LCBjb3B5KTsKKyAgICAgICAgICAgICAgICBoYXZlIC09IGNvcHk7CisgICAgICAgICAgICAgICAgbmV4dCArPSBjb3B5OworICAgICAgICAgICAgICAgIGlmIChsZW4pIGdvdG8gaW5mX2xlYXZlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoc3RhdGUtPmhlYWQgIT0gWl9OVUxMKQorICAgICAgICAgICAgICAgIHN0YXRlLT5oZWFkLT5jb21tZW50ID0gWl9OVUxMOworICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBIQ1JDOworICAgICAgICBjYXNlIEhDUkM6CisgICAgICAgICAgICBpZiAoc3RhdGUtPmZsYWdzICYgMHgwMjAwKSB7CisgICAgICAgICAgICAgICAgTkVFREJJVFMoMTYpOworICAgICAgICAgICAgICAgIGlmIChob2xkICE9IChzdGF0ZS0+Y2hlY2sgJiAweGZmZmYpKSB7CisgICAgICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImhlYWRlciBjcmMgbWlzbWF0Y2giOworICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIElOSVRCSVRTKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3RhdGUtPmhlYWQgIT0gWl9OVUxMKSB7CisgICAgICAgICAgICAgICAgc3RhdGUtPmhlYWQtPmhjcmMgPSAoaW50KSgoc3RhdGUtPmZsYWdzID4+IDkpICYgMSk7CisgICAgICAgICAgICAgICAgc3RhdGUtPmhlYWQtPmRvbmUgPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RybS0+YWRsZXIgPSBzdGF0ZS0+Y2hlY2sgPSBjcmMzMigwTCwgWl9OVUxMLCAwKTsKKyAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gVFlQRTsKKyAgICAgICAgICAgIGJyZWFrOworI2VuZGlmCisgICAgICAgIGNhc2UgRElDVElEOgorICAgICAgICAgICAgTkVFREJJVFMoMzIpOworICAgICAgICAgICAgc3RybS0+YWRsZXIgPSBzdGF0ZS0+Y2hlY2sgPSBSRVZFUlNFKGhvbGQpOworICAgICAgICAgICAgSU5JVEJJVFMoKTsKKyAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gRElDVDsKKyAgICAgICAgY2FzZSBESUNUOgorICAgICAgICAgICAgaWYgKHN0YXRlLT5oYXZlZGljdCA9PSAwKSB7CisgICAgICAgICAgICAgICAgUkVTVE9SRSgpOworICAgICAgICAgICAgICAgIHJldHVybiBaX05FRURfRElDVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0cm0tPmFkbGVyID0gc3RhdGUtPmNoZWNrID0gYWRsZXIzMigwTCwgWl9OVUxMLCAwKTsKKyAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gVFlQRTsKKyAgICAgICAgY2FzZSBUWVBFOgorICAgICAgICAgICAgaWYgKGZsdXNoID09IFpfQkxPQ0sgfHwgZmx1c2ggPT0gWl9UUkVFUykgZ290byBpbmZfbGVhdmU7CisgICAgICAgIGNhc2UgVFlQRURPOgorICAgICAgICAgICAgaWYgKHN0YXRlLT5sYXN0KSB7CisgICAgICAgICAgICAgICAgQllURUJJVFMoKTsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IENIRUNLOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTkVFREJJVFMoMyk7CisgICAgICAgICAgICBzdGF0ZS0+bGFzdCA9IEJJVFMoMSk7CisgICAgICAgICAgICBEUk9QQklUUygxKTsKKyAgICAgICAgICAgIHN3aXRjaCAoQklUUygyKSkgeworICAgICAgICAgICAgY2FzZSAwOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3RvcmVkIGJsb2NrICovCisgICAgICAgICAgICAgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgc3RvcmVkIGJsb2NrJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bGFzdCA/ICIgKGxhc3QpIiA6ICIiKSk7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBTVE9SRUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmaXhlZCBibG9jayAqLworICAgICAgICAgICAgICAgIGZpeGVkdGFibGVzKHN0YXRlKTsKKyAgICAgICAgICAgICAgICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6ICAgICBmaXhlZCBjb2RlcyBibG9jayVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPmxhc3QgPyAiIChsYXN0KSIgOiAiIikpOworICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gTEVOXzsgICAgICAgICAgICAgLyogZGVjb2RlIGNvZGVzICovCisgICAgICAgICAgICAgICAgaWYgKGZsdXNoID09IFpfVFJFRVMpIHsKKyAgICAgICAgICAgICAgICAgICAgRFJPUEJJVFMoMik7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gaW5mX2xlYXZlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGR5bmFtaWMgYmxvY2sgKi8KKyAgICAgICAgICAgICAgICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6ICAgICBkeW5hbWljIGNvZGVzIGJsb2NrJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bGFzdCA/ICIgKGxhc3QpIiA6ICIiKSk7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBUQUJMRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGJsb2NrIHR5cGUiOworICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRFJPUEJJVFMoMik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTVE9SRUQ6CisgICAgICAgICAgICBCWVRFQklUUygpOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBnbyB0byBieXRlIGJvdW5kYXJ5ICovCisgICAgICAgICAgICBORUVEQklUUygzMik7CisgICAgICAgICAgICBpZiAoKGhvbGQgJiAweGZmZmYpICE9ICgoaG9sZCA+PiAxNikgXiAweGZmZmYpKSB7CisgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBzdG9yZWQgYmxvY2sgbGVuZ3RocyI7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0ZS0+bGVuZ3RoID0gKHVuc2lnbmVkKWhvbGQgJiAweGZmZmY7CisgICAgICAgICAgICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6ICAgICAgIHN0b3JlZCBsZW5ndGggJXVcbiIsCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5sZW5ndGgpKTsKKyAgICAgICAgICAgIElOSVRCSVRTKCk7CisgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IENPUFlfOworICAgICAgICAgICAgaWYgKGZsdXNoID09IFpfVFJFRVMpIGdvdG8gaW5mX2xlYXZlOworICAgICAgICBjYXNlIENPUFlfOgorICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBDT1BZOworICAgICAgICBjYXNlIENPUFk6CisgICAgICAgICAgICBjb3B5ID0gc3RhdGUtPmxlbmd0aDsKKyAgICAgICAgICAgIGlmIChjb3B5KSB7CisgICAgICAgICAgICAgICAgaWYgKGNvcHkgPiBoYXZlKSBjb3B5ID0gaGF2ZTsKKyAgICAgICAgICAgICAgICBpZiAoY29weSA+IGxlZnQpIGNvcHkgPSBsZWZ0OworICAgICAgICAgICAgICAgIGlmIChjb3B5ID09IDApIGdvdG8gaW5mX2xlYXZlOworICAgICAgICAgICAgICAgIHptZW1jcHkocHV0LCBuZXh0LCBjb3B5KTsKKyAgICAgICAgICAgICAgICBoYXZlIC09IGNvcHk7CisgICAgICAgICAgICAgICAgbmV4dCArPSBjb3B5OworICAgICAgICAgICAgICAgIGxlZnQgLT0gY29weTsKKyAgICAgICAgICAgICAgICBwdXQgKz0gY29weTsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bGVuZ3RoIC09IGNvcHk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6ICAgICAgIHN0b3JlZCBlbmRcbiIpKTsKKyAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gVFlQRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFRBQkxFOgorICAgICAgICAgICAgTkVFREJJVFMoMTQpOworICAgICAgICAgICAgc3RhdGUtPm5sZW4gPSBCSVRTKDUpICsgMjU3OworICAgICAgICAgICAgRFJPUEJJVFMoNSk7CisgICAgICAgICAgICBzdGF0ZS0+bmRpc3QgPSBCSVRTKDUpICsgMTsKKyAgICAgICAgICAgIERST1BCSVRTKDUpOworICAgICAgICAgICAgc3RhdGUtPm5jb2RlID0gQklUUyg0KSArIDQ7CisgICAgICAgICAgICBEUk9QQklUUyg0KTsKKyNpZm5kZWYgUEtaSVBfQlVHX1dPUktBUk9VTkQKKyAgICAgICAgICAgIGlmIChzdGF0ZS0+bmxlbiA+IDI4NiB8fCBzdGF0ZS0+bmRpc3QgPiAzMCkgeworICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopInRvbyBtYW55IGxlbmd0aCBvciBkaXN0YW5jZSBzeW1ib2xzIjsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgICB0YWJsZSBzaXplcyBva1xuIikpOworICAgICAgICAgICAgc3RhdGUtPmhhdmUgPSAwOworICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBMRU5MRU5TOworICAgICAgICBjYXNlIExFTkxFTlM6CisgICAgICAgICAgICB3aGlsZSAoc3RhdGUtPmhhdmUgPCBzdGF0ZS0+bmNvZGUpIHsKKyAgICAgICAgICAgICAgICBORUVEQklUUygzKTsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bGVuc1tvcmRlcltzdGF0ZS0+aGF2ZSsrXV0gPSAodW5zaWduZWQgc2hvcnQpQklUUygzKTsKKyAgICAgICAgICAgICAgICBEUk9QQklUUygzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdoaWxlIChzdGF0ZS0+aGF2ZSA8IDE5KQorICAgICAgICAgICAgICAgIHN0YXRlLT5sZW5zW29yZGVyW3N0YXRlLT5oYXZlKytdXSA9IDA7CisgICAgICAgICAgICBzdGF0ZS0+bmV4dCA9IHN0YXRlLT5jb2RlczsKKyAgICAgICAgICAgIHN0YXRlLT5sZW5jb2RlID0gKGNvZGUgY29uc3QgRkFSICopKHN0YXRlLT5uZXh0KTsKKyAgICAgICAgICAgIHN0YXRlLT5sZW5iaXRzID0gNzsKKyAgICAgICAgICAgIHJldCA9IGluZmxhdGVfdGFibGUoQ09ERVMsIHN0YXRlLT5sZW5zLCAxOSwgJihzdGF0ZS0+bmV4dCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYoc3RhdGUtPmxlbmJpdHMpLCBzdGF0ZS0+d29yayk7CisgICAgICAgICAgICBpZiAocmV0KSB7CisgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBjb2RlIGxlbmd0aHMgc2V0IjsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgY29kZSBsZW5ndGhzIG9rXG4iKSk7CisgICAgICAgICAgICBzdGF0ZS0+aGF2ZSA9IDA7CisgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IENPREVMRU5TOworICAgICAgICBjYXNlIENPREVMRU5TOgorICAgICAgICAgICAgd2hpbGUgKHN0YXRlLT5oYXZlIDwgc3RhdGUtPm5sZW4gKyBzdGF0ZS0+bmRpc3QpIHsKKyAgICAgICAgICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICAgICAgICAgIGhlcmUgPSBzdGF0ZS0+bGVuY29kZVtCSVRTKHN0YXRlLT5sZW5iaXRzKV07CisgICAgICAgICAgICAgICAgICAgIGlmICgodW5zaWduZWQpKGhlcmUuYml0cykgPD0gYml0cykgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIFBVTExCWVRFKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChoZXJlLnZhbCA8IDE2KSB7CisgICAgICAgICAgICAgICAgICAgIERST1BCSVRTKGhlcmUuYml0cyk7CisgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5sZW5zW3N0YXRlLT5oYXZlKytdID0gaGVyZS52YWw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoaGVyZS52YWwgPT0gMTYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE5FRURCSVRTKGhlcmUuYml0cyArIDIpOworICAgICAgICAgICAgICAgICAgICAgICAgRFJPUEJJVFMoaGVyZS5iaXRzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS0+aGF2ZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBiaXQgbGVuZ3RoIHJlcGVhdCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBsZW4gPSBzdGF0ZS0+bGVuc1tzdGF0ZS0+aGF2ZSAtIDFdOworICAgICAgICAgICAgICAgICAgICAgICAgY29weSA9IDMgKyBCSVRTKDIpOworICAgICAgICAgICAgICAgICAgICAgICAgRFJPUEJJVFMoMik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaGVyZS52YWwgPT0gMTcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE5FRURCSVRTKGhlcmUuYml0cyArIDMpOworICAgICAgICAgICAgICAgICAgICAgICAgRFJPUEJJVFMoaGVyZS5iaXRzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxlbiA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBjb3B5ID0gMyArIEJJVFMoMyk7CisgICAgICAgICAgICAgICAgICAgICAgICBEUk9QQklUUygzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE5FRURCSVRTKGhlcmUuYml0cyArIDcpOworICAgICAgICAgICAgICAgICAgICAgICAgRFJPUEJJVFMoaGVyZS5iaXRzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxlbiA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBjb3B5ID0gMTEgKyBCSVRTKDcpOworICAgICAgICAgICAgICAgICAgICAgICAgRFJPUEJJVFMoNyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLT5oYXZlICsgY29weSA+IHN0YXRlLT5ubGVuICsgc3RhdGUtPm5kaXN0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGJpdCBsZW5ndGggcmVwZWF0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGNvcHktLSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5sZW5zW3N0YXRlLT5oYXZlKytdID0gKHVuc2lnbmVkIHNob3J0KWxlbjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIGhhbmRsZSBlcnJvciBicmVha3MgaW4gd2hpbGUgKi8KKyAgICAgICAgICAgIGlmIChzdGF0ZS0+bW9kZSA9PSBCQUQpIGJyZWFrOworCisgICAgICAgICAgICAvKiBjaGVjayBmb3IgZW5kLW9mLWJsb2NrIGNvZGUgKGJldHRlciBoYXZlIG9uZSkgKi8KKyAgICAgICAgICAgIGlmIChzdGF0ZS0+bGVuc1syNTZdID09IDApIHsKKyAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGNvZGUgLS0gbWlzc2luZyBlbmQtb2YtYmxvY2siOworICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBidWlsZCBjb2RlIHRhYmxlcyAtLSBub3RlOiBkbyBub3QgY2hhbmdlIHRoZSBsZW5iaXRzIG9yIGRpc3RiaXRzCisgICAgICAgICAgICAgICB2YWx1ZXMgaGVyZSAoOSBhbmQgNikgd2l0aG91dCByZWFkaW5nIHRoZSBjb21tZW50cyBpbiBpbmZ0cmVlcy5oCisgICAgICAgICAgICAgICBjb25jZXJuaW5nIHRoZSBFTk9VR0ggY29uc3RhbnRzLCB3aGljaCBkZXBlbmQgb24gdGhvc2UgdmFsdWVzICovCisgICAgICAgICAgICBzdGF0ZS0+bmV4dCA9IHN0YXRlLT5jb2RlczsKKyAgICAgICAgICAgIHN0YXRlLT5sZW5jb2RlID0gKGNvZGUgY29uc3QgRkFSICopKHN0YXRlLT5uZXh0KTsKKyAgICAgICAgICAgIHN0YXRlLT5sZW5iaXRzID0gOTsKKyAgICAgICAgICAgIHJldCA9IGluZmxhdGVfdGFibGUoTEVOUywgc3RhdGUtPmxlbnMsIHN0YXRlLT5ubGVuLCAmKHN0YXRlLT5uZXh0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihzdGF0ZS0+bGVuYml0cyksIHN0YXRlLT53b3JrKTsKKyAgICAgICAgICAgIGlmIChyZXQpIHsKKyAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGxpdGVyYWwvbGVuZ3RocyBzZXQiOworICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdGUtPmRpc3Rjb2RlID0gKGNvZGUgY29uc3QgRkFSICopKHN0YXRlLT5uZXh0KTsKKyAgICAgICAgICAgIHN0YXRlLT5kaXN0Yml0cyA9IDY7CisgICAgICAgICAgICByZXQgPSBpbmZsYXRlX3RhYmxlKERJU1RTLCBzdGF0ZS0+bGVucyArIHN0YXRlLT5ubGVuLCBzdGF0ZS0+bmRpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihzdGF0ZS0+bmV4dCksICYoc3RhdGUtPmRpc3RiaXRzKSwgc3RhdGUtPndvcmspOworICAgICAgICAgICAgaWYgKHJldCkgeworICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgZGlzdGFuY2VzIHNldCI7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6ICAgICAgIGNvZGVzIG9rXG4iKSk7CisgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IExFTl87CisgICAgICAgICAgICBpZiAoZmx1c2ggPT0gWl9UUkVFUykgZ290byBpbmZfbGVhdmU7CisgICAgICAgIGNhc2UgTEVOXzoKKyAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gTEVOOworICAgICAgICBjYXNlIExFTjoKKyAgICAgICAgICAgIGlmIChoYXZlID49IDYgJiYgbGVmdCA+PSAyNTgpIHsKKyAgICAgICAgICAgICAgICBSRVNUT1JFKCk7CisgICAgICAgICAgICAgICAgaW5mbGF0ZV9mYXN0KHN0cm0sIG91dCk7CisgICAgICAgICAgICAgICAgTE9BRCgpOworICAgICAgICAgICAgICAgIGlmIChzdGF0ZS0+bW9kZSA9PSBUWVBFKQorICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+YmFjayA9IC0xOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdGUtPmJhY2sgPSAwOworICAgICAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgICAgIGhlcmUgPSBzdGF0ZS0+bGVuY29kZVtCSVRTKHN0YXRlLT5sZW5iaXRzKV07CisgICAgICAgICAgICAgICAgaWYgKCh1bnNpZ25lZCkoaGVyZS5iaXRzKSA8PSBiaXRzKSBicmVhazsKKyAgICAgICAgICAgICAgICBQVUxMQllURSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGhlcmUub3AgJiYgKGhlcmUub3AgJiAweGYwKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgbGFzdCA9IGhlcmU7CisgICAgICAgICAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgICAgICAgICBoZXJlID0gc3RhdGUtPmxlbmNvZGVbbGFzdC52YWwgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCSVRTKGxhc3QuYml0cyArIGxhc3Qub3ApID4+IGxhc3QuYml0cyldOworICAgICAgICAgICAgICAgICAgICBpZiAoKHVuc2lnbmVkKShsYXN0LmJpdHMgKyBoZXJlLmJpdHMpIDw9IGJpdHMpIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBQVUxMQllURSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBEUk9QQklUUyhsYXN0LmJpdHMpOworICAgICAgICAgICAgICAgIHN0YXRlLT5iYWNrICs9IGxhc3QuYml0czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIERST1BCSVRTKGhlcmUuYml0cyk7CisgICAgICAgICAgICBzdGF0ZS0+YmFjayArPSBoZXJlLmJpdHM7CisgICAgICAgICAgICBzdGF0ZS0+bGVuZ3RoID0gKHVuc2lnbmVkKWhlcmUudmFsOworICAgICAgICAgICAgaWYgKChpbnQpKGhlcmUub3ApID09IDApIHsKKyAgICAgICAgICAgICAgICBUcmFjZXZ2KChzdGRlcnIsIGhlcmUudmFsID49IDB4MjAgJiYgaGVyZS52YWwgPCAweDdmID8KKyAgICAgICAgICAgICAgICAgICAgICAgICJpbmZsYXRlOiAgICAgICAgIGxpdGVyYWwgJyVjJ1xuIiA6CisgICAgICAgICAgICAgICAgICAgICAgICAiaW5mbGF0ZTogICAgICAgICBsaXRlcmFsIDB4JTAyeFxuIiwgaGVyZS52YWwpKTsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IExJVDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChoZXJlLm9wICYgMzIpIHsKKyAgICAgICAgICAgICAgICBUcmFjZXZ2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgICAgIGVuZCBvZiBibG9ja1xuIikpOworICAgICAgICAgICAgICAgIHN0YXRlLT5iYWNrID0gLTE7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBUWVBFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGhlcmUub3AgJiA2NCkgeworICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgbGl0ZXJhbC9sZW5ndGggY29kZSI7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0ZS0+ZXh0cmEgPSAodW5zaWduZWQpKGhlcmUub3ApICYgMTU7CisgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IExFTkVYVDsKKyAgICAgICAgY2FzZSBMRU5FWFQ6CisgICAgICAgICAgICBpZiAoc3RhdGUtPmV4dHJhKSB7CisgICAgICAgICAgICAgICAgTkVFREJJVFMoc3RhdGUtPmV4dHJhKTsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bGVuZ3RoICs9IEJJVFMoc3RhdGUtPmV4dHJhKTsKKyAgICAgICAgICAgICAgICBEUk9QQklUUyhzdGF0ZS0+ZXh0cmEpOworICAgICAgICAgICAgICAgIHN0YXRlLT5iYWNrICs9IHN0YXRlLT5leHRyYTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFRyYWNldnYoKHN0ZGVyciwgImluZmxhdGU6ICAgICAgICAgbGVuZ3RoICV1XG4iLCBzdGF0ZS0+bGVuZ3RoKSk7CisgICAgICAgICAgICBzdGF0ZS0+d2FzID0gc3RhdGUtPmxlbmd0aDsKKyAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gRElTVDsKKyAgICAgICAgY2FzZSBESVNUOgorICAgICAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgICAgIGhlcmUgPSBzdGF0ZS0+ZGlzdGNvZGVbQklUUyhzdGF0ZS0+ZGlzdGJpdHMpXTsKKyAgICAgICAgICAgICAgICBpZiAoKHVuc2lnbmVkKShoZXJlLmJpdHMpIDw9IGJpdHMpIGJyZWFrOworICAgICAgICAgICAgICAgIFBVTExCWVRFKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKGhlcmUub3AgJiAweGYwKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgbGFzdCA9IGhlcmU7CisgICAgICAgICAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgICAgICAgICBoZXJlID0gc3RhdGUtPmRpc3Rjb2RlW2xhc3QudmFsICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQklUUyhsYXN0LmJpdHMgKyBsYXN0Lm9wKSA+PiBsYXN0LmJpdHMpXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCh1bnNpZ25lZCkobGFzdC5iaXRzICsgaGVyZS5iaXRzKSA8PSBiaXRzKSBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgUFVMTEJZVEUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgRFJPUEJJVFMobGFzdC5iaXRzKTsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+YmFjayArPSBsYXN0LmJpdHM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBEUk9QQklUUyhoZXJlLmJpdHMpOworICAgICAgICAgICAgc3RhdGUtPmJhY2sgKz0gaGVyZS5iaXRzOworICAgICAgICAgICAgaWYgKGhlcmUub3AgJiA2NCkgeworICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgZGlzdGFuY2UgY29kZSI7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0ZS0+b2Zmc2V0ID0gKHVuc2lnbmVkKWhlcmUudmFsOworICAgICAgICAgICAgc3RhdGUtPmV4dHJhID0gKHVuc2lnbmVkKShoZXJlLm9wKSAmIDE1OworICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBESVNURVhUOworICAgICAgICBjYXNlIERJU1RFWFQ6CisgICAgICAgICAgICBpZiAoc3RhdGUtPmV4dHJhKSB7CisgICAgICAgICAgICAgICAgTkVFREJJVFMoc3RhdGUtPmV4dHJhKTsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+b2Zmc2V0ICs9IEJJVFMoc3RhdGUtPmV4dHJhKTsKKyAgICAgICAgICAgICAgICBEUk9QQklUUyhzdGF0ZS0+ZXh0cmEpOworICAgICAgICAgICAgICAgIHN0YXRlLT5iYWNrICs9IHN0YXRlLT5leHRyYTsKKyAgICAgICAgICAgIH0KKyNpZmRlZiBJTkZMQVRFX1NUUklDVAorICAgICAgICAgICAgaWYgKHN0YXRlLT5vZmZzZXQgPiBzdGF0ZS0+ZG1heCkgeworICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrIjsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgVHJhY2V2digoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgICBkaXN0YW5jZSAldVxuIiwgc3RhdGUtPm9mZnNldCkpOworICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBNQVRDSDsKKyAgICAgICAgY2FzZSBNQVRDSDoKKyAgICAgICAgICAgIGlmIChsZWZ0ID09IDApIGdvdG8gaW5mX2xlYXZlOworICAgICAgICAgICAgY29weSA9IG91dCAtIGxlZnQ7CisgICAgICAgICAgICBpZiAoc3RhdGUtPm9mZnNldCA+IGNvcHkpIHsgICAgICAgICAvKiBjb3B5IGZyb20gd2luZG93ICovCisgICAgICAgICAgICAgICAgY29weSA9IHN0YXRlLT5vZmZzZXQgLSBjb3B5OworICAgICAgICAgICAgICAgIGlmIChjb3B5ID4gc3RhdGUtPndoYXZlKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS0+c2FuZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2siOworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorI2lmZGVmIElORkxBVEVfQUxMT1dfSU5WQUxJRF9ESVNUQU5DRV9UT09GQVJfQVJSUgorICAgICAgICAgICAgICAgICAgICBUcmFjZSgoc3RkZXJyLCAiaW5mbGF0ZS5jIHRvbyBmYXJcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgY29weSAtPSBzdGF0ZS0+d2hhdmU7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb3B5ID4gc3RhdGUtPmxlbmd0aCkgY29weSA9IHN0YXRlLT5sZW5ndGg7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb3B5ID4gbGVmdCkgY29weSA9IGxlZnQ7CisgICAgICAgICAgICAgICAgICAgIGxlZnQgLT0gY29weTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUtPmxlbmd0aCAtPSBjb3B5OworICAgICAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgICAgICAqcHV0KysgPSAwOworICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICgtLWNvcHkpOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUtPmxlbmd0aCA9PSAwKSBzdGF0ZS0+bW9kZSA9IExFTjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGNvcHkgPiBzdGF0ZS0+d25leHQpIHsKKyAgICAgICAgICAgICAgICAgICAgY29weSAtPSBzdGF0ZS0+d25leHQ7CisgICAgICAgICAgICAgICAgICAgIGZyb20gPSBzdGF0ZS0+d2luZG93ICsgKHN0YXRlLT53c2l6ZSAtIGNvcHkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGZyb20gPSBzdGF0ZS0+d2luZG93ICsgKHN0YXRlLT53bmV4dCAtIGNvcHkpOworICAgICAgICAgICAgICAgIGlmIChjb3B5ID4gc3RhdGUtPmxlbmd0aCkgY29weSA9IHN0YXRlLT5sZW5ndGg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb3B5IGZyb20gb3V0cHV0ICovCisgICAgICAgICAgICAgICAgZnJvbSA9IHB1dCAtIHN0YXRlLT5vZmZzZXQ7CisgICAgICAgICAgICAgICAgY29weSA9IHN0YXRlLT5sZW5ndGg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY29weSA+IGxlZnQpIGNvcHkgPSBsZWZ0OworICAgICAgICAgICAgbGVmdCAtPSBjb3B5OworICAgICAgICAgICAgc3RhdGUtPmxlbmd0aCAtPSBjb3B5OworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICpwdXQrKyA9ICpmcm9tKys7CisgICAgICAgICAgICB9IHdoaWxlICgtLWNvcHkpOworICAgICAgICAgICAgaWYgKHN0YXRlLT5sZW5ndGggPT0gMCkgc3RhdGUtPm1vZGUgPSBMRU47CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBMSVQ6CisgICAgICAgICAgICBpZiAobGVmdCA9PSAwKSBnb3RvIGluZl9sZWF2ZTsKKyAgICAgICAgICAgICpwdXQrKyA9ICh1bnNpZ25lZCBjaGFyKShzdGF0ZS0+bGVuZ3RoKTsKKyAgICAgICAgICAgIGxlZnQtLTsKKyAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gTEVOOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ0hFQ0s6CisgICAgICAgICAgICBpZiAoc3RhdGUtPndyYXApIHsKKyAgICAgICAgICAgICAgICBORUVEQklUUygzMik7CisgICAgICAgICAgICAgICAgb3V0IC09IGxlZnQ7CisgICAgICAgICAgICAgICAgc3RybS0+dG90YWxfb3V0ICs9IG91dDsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+dG90YWwgKz0gb3V0OworICAgICAgICAgICAgICAgIGlmIChvdXQpCisgICAgICAgICAgICAgICAgICAgIHN0cm0tPmFkbGVyID0gc3RhdGUtPmNoZWNrID0KKyAgICAgICAgICAgICAgICAgICAgICAgIFVQREFURShzdGF0ZS0+Y2hlY2ssIHB1dCAtIG91dCwgb3V0KTsKKyAgICAgICAgICAgICAgICBvdXQgPSBsZWZ0OworICAgICAgICAgICAgICAgIGlmICgoCisjaWZkZWYgR1VOWklQCisgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+ZmxhZ3MgPyBob2xkIDoKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgUkVWRVJTRShob2xkKSkgIT0gc3RhdGUtPmNoZWNrKSB7CisgICAgICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImluY29ycmVjdCBkYXRhIGNoZWNrIjsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBJTklUQklUUygpOworICAgICAgICAgICAgICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICBjaGVjayBtYXRjaGVzIHRyYWlsZXJcbiIpKTsKKyAgICAgICAgICAgIH0KKyNpZmRlZiBHVU5aSVAKKyAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gTEVOR1RIOworICAgICAgICBjYXNlIExFTkdUSDoKKyAgICAgICAgICAgIGlmIChzdGF0ZS0+d3JhcCAmJiBzdGF0ZS0+ZmxhZ3MpIHsKKyAgICAgICAgICAgICAgICBORUVEQklUUygzMik7CisgICAgICAgICAgICAgICAgaWYgKGhvbGQgIT0gKHN0YXRlLT50b3RhbCAmIDB4ZmZmZmZmZmZVTCkpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW5jb3JyZWN0IGxlbmd0aCBjaGVjayI7CisgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgSU5JVEJJVFMoKTsKKyAgICAgICAgICAgICAgICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6ICAgbGVuZ3RoIG1hdGNoZXMgdHJhaWxlclxuIikpOworICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IERPTkU7CisgICAgICAgIGNhc2UgRE9ORToKKyAgICAgICAgICAgIHJldCA9IFpfU1RSRUFNX0VORDsKKyAgICAgICAgICAgIGdvdG8gaW5mX2xlYXZlOworICAgICAgICBjYXNlIEJBRDoKKyAgICAgICAgICAgIHJldCA9IFpfREFUQV9FUlJPUjsKKyAgICAgICAgICAgIGdvdG8gaW5mX2xlYXZlOworICAgICAgICBjYXNlIE1FTToKKyAgICAgICAgICAgIHJldHVybiBaX01FTV9FUlJPUjsKKyAgICAgICAgY2FzZSBTWU5DOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworICAgICAgICB9CisKKyAgICAvKgorICAgICAgIFJldHVybiBmcm9tIGluZmxhdGUoKSwgdXBkYXRpbmcgdGhlIHRvdGFsIGNvdW50cyBhbmQgdGhlIGNoZWNrIHZhbHVlLgorICAgICAgIElmIHRoZXJlIHdhcyBubyBwcm9ncmVzcyBkdXJpbmcgdGhlIGluZmxhdGUoKSBjYWxsLCByZXR1cm4gYSBidWZmZXIKKyAgICAgICBlcnJvci4gIENhbGwgdXBkYXRld2luZG93KCkgdG8gY3JlYXRlIGFuZC9vciB1cGRhdGUgdGhlIHdpbmRvdyBzdGF0ZS4KKyAgICAgICBOb3RlOiBhIG1lbW9yeSBlcnJvciBmcm9tIGluZmxhdGUoKSBpcyBub24tcmVjb3ZlcmFibGUuCisgICAgICovCisgIGluZl9sZWF2ZToKKyAgICBSRVNUT1JFKCk7CisgICAgaWYgKHN0YXRlLT53c2l6ZSB8fCAob3V0ICE9IHN0cm0tPmF2YWlsX291dCAmJiBzdGF0ZS0+bW9kZSA8IEJBRCAmJgorICAgICAgICAgICAgKHN0YXRlLT5tb2RlIDwgQ0hFQ0sgfHwgZmx1c2ggIT0gWl9GSU5JU0gpKSkKKyAgICAgICAgaWYgKHVwZGF0ZXdpbmRvdyhzdHJtLCBvdXQpKSB7CisgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IE1FTTsKKyAgICAgICAgICAgIHJldHVybiBaX01FTV9FUlJPUjsKKyAgICAgICAgfQorICAgIGluIC09IHN0cm0tPmF2YWlsX2luOworICAgIG91dCAtPSBzdHJtLT5hdmFpbF9vdXQ7CisgICAgc3RybS0+dG90YWxfaW4gKz0gaW47CisgICAgc3RybS0+dG90YWxfb3V0ICs9IG91dDsKKyAgICBzdGF0ZS0+dG90YWwgKz0gb3V0OworICAgIGlmIChzdGF0ZS0+d3JhcCAmJiBvdXQpCisgICAgICAgIHN0cm0tPmFkbGVyID0gc3RhdGUtPmNoZWNrID0KKyAgICAgICAgICAgIFVQREFURShzdGF0ZS0+Y2hlY2ssIHN0cm0tPm5leHRfb3V0IC0gb3V0LCBvdXQpOworICAgIHN0cm0tPmRhdGFfdHlwZSA9IHN0YXRlLT5iaXRzICsgKHN0YXRlLT5sYXN0ID8gNjQgOiAwKSArCisgICAgICAgICAgICAgICAgICAgICAgKHN0YXRlLT5tb2RlID09IFRZUEUgPyAxMjggOiAwKSArCisgICAgICAgICAgICAgICAgICAgICAgKHN0YXRlLT5tb2RlID09IExFTl8gfHwgc3RhdGUtPm1vZGUgPT0gQ09QWV8gPyAyNTYgOiAwKTsKKyAgICBpZiAoKChpbiA9PSAwICYmIG91dCA9PSAwKSB8fCBmbHVzaCA9PSBaX0ZJTklTSCkgJiYgcmV0ID09IFpfT0spCisgICAgICAgIHJldCA9IFpfQlVGX0VSUk9SOworICAgIHJldHVybiByZXQ7Cit9CisKK2ludCBaRVhQT1JUIGluZmxhdGVFbmQoc3RybSkKK3pfc3RyZWFtcCBzdHJtOworeworICAgIHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqc3RhdGU7CisgICAgaWYgKHN0cm0gPT0gWl9OVUxMIHx8IHN0cm0tPnN0YXRlID09IFpfTlVMTCB8fCBzdHJtLT56ZnJlZSA9PSAoZnJlZV9mdW5jKTApCisgICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKyAgICBzdGF0ZSA9IChzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKilzdHJtLT5zdGF0ZTsKKyAgICBpZiAoc3RhdGUtPndpbmRvdyAhPSBaX05VTEwpIFpGUkVFKHN0cm0sIHN0YXRlLT53aW5kb3cpOworICAgIFpGUkVFKHN0cm0sIHN0cm0tPnN0YXRlKTsKKyAgICBzdHJtLT5zdGF0ZSA9IFpfTlVMTDsKKyAgICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6IGVuZFxuIikpOworICAgIHJldHVybiBaX09LOworfQorCitpbnQgWkVYUE9SVCBpbmZsYXRlU2V0RGljdGlvbmFyeShzdHJtLCBkaWN0aW9uYXJ5LCBkaWN0TGVuZ3RoKQorel9zdHJlYW1wIHN0cm07Citjb25zdCBCeXRlZiAqZGljdGlvbmFyeTsKK3VJbnQgZGljdExlbmd0aDsKK3sKKyAgICBzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKnN0YXRlOworICAgIHVuc2lnbmVkIGxvbmcgaWQ7CisgICAgdW5zaWduZWQgY2hhciAqbmV4dDsKKyAgICB1bnNpZ25lZCBhdmFpbDsKKyAgICBpbnQgcmV0OworCisgICAgLyogY2hlY2sgc3RhdGUgKi8KKyAgICBpZiAoc3RybSA9PSBaX05VTEwgfHwgc3RybS0+c3RhdGUgPT0gWl9OVUxMKSByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisgICAgc3RhdGUgPSAoc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICopc3RybS0+c3RhdGU7CisgICAgaWYgKHN0YXRlLT53cmFwICE9IDAgJiYgc3RhdGUtPm1vZGUgIT0gRElDVCkKKyAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworCisgICAgLyogY2hlY2sgZm9yIGNvcnJlY3QgZGljdGlvbmFyeSBpZCAqLworICAgIGlmIChzdGF0ZS0+bW9kZSA9PSBESUNUKSB7CisgICAgICAgIGlkID0gYWRsZXIzMigwTCwgWl9OVUxMLCAwKTsKKyAgICAgICAgaWQgPSBhZGxlcjMyKGlkLCBkaWN0aW9uYXJ5LCBkaWN0TGVuZ3RoKTsKKyAgICAgICAgaWYgKGlkICE9IHN0YXRlLT5jaGVjaykKKyAgICAgICAgICAgIHJldHVybiBaX0RBVEFfRVJST1I7CisgICAgfQorCisgICAgLyogY29weSBkaWN0aW9uYXJ5IHRvIHdpbmRvdyB1c2luZyB1cGRhdGV3aW5kb3coKSwgd2hpY2ggd2lsbCBhbWVuZCB0aGUKKyAgICAgICBleGlzdGluZyBkaWN0aW9uYXJ5IGlmIGFwcHJvcHJpYXRlICovCisgICAgbmV4dCA9IHN0cm0tPm5leHRfb3V0OworICAgIGF2YWlsID0gc3RybS0+YXZhaWxfb3V0OworICAgIHN0cm0tPm5leHRfb3V0ID0gKEJ5dGVmICopZGljdGlvbmFyeSArIGRpY3RMZW5ndGg7CisgICAgc3RybS0+YXZhaWxfb3V0ID0gMDsKKyAgICByZXQgPSB1cGRhdGV3aW5kb3coc3RybSwgZGljdExlbmd0aCk7CisgICAgc3RybS0+YXZhaWxfb3V0ID0gYXZhaWw7CisgICAgc3RybS0+bmV4dF9vdXQgPSBuZXh0OworICAgIGlmIChyZXQpIHsKKyAgICAgICAgc3RhdGUtPm1vZGUgPSBNRU07CisgICAgICAgIHJldHVybiBaX01FTV9FUlJPUjsKKyAgICB9CisgICAgc3RhdGUtPmhhdmVkaWN0ID0gMTsKKyAgICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6ICAgZGljdGlvbmFyeSBzZXRcbiIpKTsKKyAgICByZXR1cm4gWl9PSzsKK30KKworaW50IFpFWFBPUlQgaW5mbGF0ZUdldEhlYWRlcihzdHJtLCBoZWFkKQorel9zdHJlYW1wIHN0cm07Citnel9oZWFkZXJwIGhlYWQ7Cit7CisgICAgc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICpzdGF0ZTsKKworICAgIC8qIGNoZWNrIHN0YXRlICovCisgICAgaWYgKHN0cm0gPT0gWl9OVUxMIHx8IHN0cm0tPnN0YXRlID09IFpfTlVMTCkgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworICAgIHN0YXRlID0gKHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqKXN0cm0tPnN0YXRlOworICAgIGlmICgoc3RhdGUtPndyYXAgJiAyKSA9PSAwKSByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisKKyAgICAvKiBzYXZlIGhlYWRlciBzdHJ1Y3R1cmUgKi8KKyAgICBzdGF0ZS0+aGVhZCA9IGhlYWQ7CisgICAgaGVhZC0+ZG9uZSA9IDA7CisgICAgcmV0dXJuIFpfT0s7Cit9CisKKy8qCisgICBTZWFyY2ggYnVmWzAuLmxlbi0xXSBmb3IgdGhlIHBhdHRlcm46IDAsIDAsIDB4ZmYsIDB4ZmYuICBSZXR1cm4gd2hlbiBmb3VuZAorICAgb3Igd2hlbiBvdXQgb2YgaW5wdXQuICBXaGVuIGNhbGxlZCwgKmhhdmUgaXMgdGhlIG51bWJlciBvZiBwYXR0ZXJuIGJ5dGVzCisgICBmb3VuZCBpbiBvcmRlciBzbyBmYXIsIGluIDAuLjMuICBPbiByZXR1cm4gKmhhdmUgaXMgdXBkYXRlZCB0byB0aGUgbmV3CisgICBzdGF0ZS4gIElmIG9uIHJldHVybiAqaGF2ZSBlcXVhbHMgZm91ciwgdGhlbiB0aGUgcGF0dGVybiB3YXMgZm91bmQgYW5kIHRoZQorICAgcmV0dXJuIHZhbHVlIGlzIGhvdyBtYW55IGJ5dGVzIHdlcmUgcmVhZCBpbmNsdWRpbmcgdGhlIGxhc3QgYnl0ZSBvZiB0aGUKKyAgIHBhdHRlcm4uICBJZiAqaGF2ZSBpcyBsZXNzIHRoYW4gZm91ciwgdGhlbiB0aGUgcGF0dGVybiBoYXMgbm90IGJlZW4gZm91bmQKKyAgIHlldCBhbmQgdGhlIHJldHVybiB2YWx1ZSBpcyBsZW4uICBJbiB0aGUgbGF0dGVyIGNhc2UsIHN5bmNzZWFyY2goKSBjYW4gYmUKKyAgIGNhbGxlZCBhZ2FpbiB3aXRoIG1vcmUgZGF0YSBhbmQgdGhlICpoYXZlIHN0YXRlLiAgKmhhdmUgaXMgaW5pdGlhbGl6ZWQgdG8KKyAgIHplcm8gZm9yIHRoZSBmaXJzdCBjYWxsLgorICovCitsb2NhbCB1bnNpZ25lZCBzeW5jc2VhcmNoKGhhdmUsIGJ1ZiwgbGVuKQordW5zaWduZWQgRkFSICpoYXZlOwordW5zaWduZWQgY2hhciBGQVIgKmJ1ZjsKK3Vuc2lnbmVkIGxlbjsKK3sKKyAgICB1bnNpZ25lZCBnb3Q7CisgICAgdW5zaWduZWQgbmV4dDsKKworICAgIGdvdCA9ICpoYXZlOworICAgIG5leHQgPSAwOworICAgIHdoaWxlIChuZXh0IDwgbGVuICYmIGdvdCA8IDQpIHsKKyAgICAgICAgaWYgKChpbnQpKGJ1ZltuZXh0XSkgPT0gKGdvdCA8IDIgPyAwIDogMHhmZikpCisgICAgICAgICAgICBnb3QrKzsKKyAgICAgICAgZWxzZSBpZiAoYnVmW25leHRdKQorICAgICAgICAgICAgZ290ID0gMDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZ290ID0gNCAtIGdvdDsKKyAgICAgICAgbmV4dCsrOworICAgIH0KKyAgICAqaGF2ZSA9IGdvdDsKKyAgICByZXR1cm4gbmV4dDsKK30KKworaW50IFpFWFBPUlQgaW5mbGF0ZVN5bmMoc3RybSkKK3pfc3RyZWFtcCBzdHJtOworeworICAgIHVuc2lnbmVkIGxlbjsgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgYnl0ZXMgdG8gbG9vayBhdCBvciBsb29rZWQgYXQgKi8KKyAgICB1bnNpZ25lZCBsb25nIGluLCBvdXQ7ICAgICAgLyogdGVtcG9yYXJ5IHRvIHNhdmUgdG90YWxfaW4gYW5kIHRvdGFsX291dCAqLworICAgIHVuc2lnbmVkIGNoYXIgYnVmWzRdOyAgICAgICAvKiB0byByZXN0b3JlIGJpdCBidWZmZXIgdG8gYnl0ZSBzdHJpbmcgKi8KKyAgICBzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKnN0YXRlOworCisgICAgLyogY2hlY2sgcGFyYW1ldGVycyAqLworICAgIGlmIChzdHJtID09IFpfTlVMTCB8fCBzdHJtLT5zdGF0ZSA9PSBaX05VTEwpIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKyAgICBzdGF0ZSA9IChzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKilzdHJtLT5zdGF0ZTsKKyAgICBpZiAoc3RybS0+YXZhaWxfaW4gPT0gMCAmJiBzdGF0ZS0+Yml0cyA8IDgpIHJldHVybiBaX0JVRl9FUlJPUjsKKworICAgIC8qIGlmIGZpcnN0IHRpbWUsIHN0YXJ0IHNlYXJjaCBpbiBiaXQgYnVmZmVyICovCisgICAgaWYgKHN0YXRlLT5tb2RlICE9IFNZTkMpIHsKKyAgICAgICAgc3RhdGUtPm1vZGUgPSBTWU5DOworICAgICAgICBzdGF0ZS0+aG9sZCA8PD0gc3RhdGUtPmJpdHMgJiA3OworICAgICAgICBzdGF0ZS0+Yml0cyAtPSBzdGF0ZS0+Yml0cyAmIDc7CisgICAgICAgIGxlbiA9IDA7CisgICAgICAgIHdoaWxlIChzdGF0ZS0+Yml0cyA+PSA4KSB7CisgICAgICAgICAgICBidWZbbGVuKytdID0gKHVuc2lnbmVkIGNoYXIpKHN0YXRlLT5ob2xkKTsKKyAgICAgICAgICAgIHN0YXRlLT5ob2xkID4+PSA4OworICAgICAgICAgICAgc3RhdGUtPmJpdHMgLT0gODsKKyAgICAgICAgfQorICAgICAgICBzdGF0ZS0+aGF2ZSA9IDA7CisgICAgICAgIHN5bmNzZWFyY2goJihzdGF0ZS0+aGF2ZSksIGJ1ZiwgbGVuKTsKKyAgICB9CisKKyAgICAvKiBzZWFyY2ggYXZhaWxhYmxlIGlucHV0ICovCisgICAgbGVuID0gc3luY3NlYXJjaCgmKHN0YXRlLT5oYXZlKSwgc3RybS0+bmV4dF9pbiwgc3RybS0+YXZhaWxfaW4pOworICAgIHN0cm0tPmF2YWlsX2luIC09IGxlbjsKKyAgICBzdHJtLT5uZXh0X2luICs9IGxlbjsKKyAgICBzdHJtLT50b3RhbF9pbiArPSBsZW47CisKKyAgICAvKiByZXR1cm4gbm8gam95IG9yIHNldCB1cCB0byByZXN0YXJ0IGluZmxhdGUoKSBvbiBhIG5ldyBibG9jayAqLworICAgIGlmIChzdGF0ZS0+aGF2ZSAhPSA0KSByZXR1cm4gWl9EQVRBX0VSUk9SOworICAgIGluID0gc3RybS0+dG90YWxfaW47ICBvdXQgPSBzdHJtLT50b3RhbF9vdXQ7CisgICAgaW5mbGF0ZVJlc2V0KHN0cm0pOworICAgIHN0cm0tPnRvdGFsX2luID0gaW47ICBzdHJtLT50b3RhbF9vdXQgPSBvdXQ7CisgICAgc3RhdGUtPm1vZGUgPSBUWVBFOworICAgIHJldHVybiBaX09LOworfQorCisvKgorICAgUmV0dXJucyB0cnVlIGlmIGluZmxhdGUgaXMgY3VycmVudGx5IGF0IHRoZSBlbmQgb2YgYSBibG9jayBnZW5lcmF0ZWQgYnkKKyAgIFpfU1lOQ19GTFVTSCBvciBaX0ZVTExfRkxVU0guIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBieSBvbmUgUFBQCisgICBpbXBsZW1lbnRhdGlvbiB0byBwcm92aWRlIGFuIGFkZGl0aW9uYWwgc2FmZXR5IGNoZWNrLiBQUFAgdXNlcworICAgWl9TWU5DX0ZMVVNIIGJ1dCByZW1vdmVzIHRoZSBsZW5ndGggYnl0ZXMgb2YgdGhlIHJlc3VsdGluZyBlbXB0eSBzdG9yZWQKKyAgIGJsb2NrLiBXaGVuIGRlY29tcHJlc3NpbmcsIFBQUCBjaGVja3MgdGhhdCBhdCB0aGUgZW5kIG9mIGlucHV0IHBhY2tldCwKKyAgIGluZmxhdGUgaXMgd2FpdGluZyBmb3IgdGhlc2UgbGVuZ3RoIGJ5dGVzLgorICovCitpbnQgWkVYUE9SVCBpbmZsYXRlU3luY1BvaW50KHN0cm0pCit6X3N0cmVhbXAgc3RybTsKK3sKKyAgICBzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKnN0YXRlOworCisgICAgaWYgKHN0cm0gPT0gWl9OVUxMIHx8IHN0cm0tPnN0YXRlID09IFpfTlVMTCkgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworICAgIHN0YXRlID0gKHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqKXN0cm0tPnN0YXRlOworICAgIHJldHVybiBzdGF0ZS0+bW9kZSA9PSBTVE9SRUQgJiYgc3RhdGUtPmJpdHMgPT0gMDsKK30KKworaW50IFpFWFBPUlQgaW5mbGF0ZUNvcHkoZGVzdCwgc291cmNlKQorel9zdHJlYW1wIGRlc3Q7Cit6X3N0cmVhbXAgc291cmNlOworeworICAgIHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqc3RhdGU7CisgICAgc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICpjb3B5OworICAgIHVuc2lnbmVkIGNoYXIgRkFSICp3aW5kb3c7CisgICAgdW5zaWduZWQgd3NpemU7CisKKyAgICAvKiBjaGVjayBpbnB1dCAqLworICAgIGlmIChkZXN0ID09IFpfTlVMTCB8fCBzb3VyY2UgPT0gWl9OVUxMIHx8IHNvdXJjZS0+c3RhdGUgPT0gWl9OVUxMIHx8CisgICAgICAgIHNvdXJjZS0+emFsbG9jID09IChhbGxvY19mdW5jKTAgfHwgc291cmNlLT56ZnJlZSA9PSAoZnJlZV9mdW5jKTApCisgICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKyAgICBzdGF0ZSA9IChzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKilzb3VyY2UtPnN0YXRlOworCisgICAgLyogYWxsb2NhdGUgc3BhY2UgKi8KKyAgICBjb3B5ID0gKHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqKQorICAgICAgICAgICBaQUxMT0Moc291cmNlLCAxLCBzaXplb2Yoc3RydWN0IGluZmxhdGVfc3RhdGUpKTsKKyAgICBpZiAoY29weSA9PSBaX05VTEwpIHJldHVybiBaX01FTV9FUlJPUjsKKyAgICB3aW5kb3cgPSBaX05VTEw7CisgICAgaWYgKHN0YXRlLT53aW5kb3cgIT0gWl9OVUxMKSB7CisgICAgICAgIHdpbmRvdyA9ICh1bnNpZ25lZCBjaGFyIEZBUiAqKQorICAgICAgICAgICAgICAgICBaQUxMT0Moc291cmNlLCAxVSA8PCBzdGF0ZS0+d2JpdHMsIHNpemVvZih1bnNpZ25lZCBjaGFyKSk7CisgICAgICAgIGlmICh3aW5kb3cgPT0gWl9OVUxMKSB7CisgICAgICAgICAgICBaRlJFRShzb3VyY2UsIGNvcHkpOworICAgICAgICAgICAgcmV0dXJuIFpfTUVNX0VSUk9SOworICAgICAgICB9CisgICAgfQorCisgICAgLyogY29weSBzdGF0ZSAqLworICAgIHptZW1jcHkoKHZvaWRwZilkZXN0LCAodm9pZHBmKXNvdXJjZSwgc2l6ZW9mKHpfc3RyZWFtKSk7CisgICAgem1lbWNweSgodm9pZHBmKWNvcHksICh2b2lkcGYpc3RhdGUsIHNpemVvZihzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSkpOworICAgIGlmIChzdGF0ZS0+bGVuY29kZSA+PSBzdGF0ZS0+Y29kZXMgJiYKKyAgICAgICAgc3RhdGUtPmxlbmNvZGUgPD0gc3RhdGUtPmNvZGVzICsgRU5PVUdIIC0gMSkgeworICAgICAgICBjb3B5LT5sZW5jb2RlID0gY29weS0+Y29kZXMgKyAoc3RhdGUtPmxlbmNvZGUgLSBzdGF0ZS0+Y29kZXMpOworICAgICAgICBjb3B5LT5kaXN0Y29kZSA9IGNvcHktPmNvZGVzICsgKHN0YXRlLT5kaXN0Y29kZSAtIHN0YXRlLT5jb2Rlcyk7CisgICAgfQorICAgIGNvcHktPm5leHQgPSBjb3B5LT5jb2RlcyArIChzdGF0ZS0+bmV4dCAtIHN0YXRlLT5jb2Rlcyk7CisgICAgaWYgKHdpbmRvdyAhPSBaX05VTEwpIHsKKyAgICAgICAgd3NpemUgPSAxVSA8PCBzdGF0ZS0+d2JpdHM7CisgICAgICAgIHptZW1jcHkod2luZG93LCBzdGF0ZS0+d2luZG93LCB3c2l6ZSk7CisgICAgfQorICAgIGNvcHktPndpbmRvdyA9IHdpbmRvdzsKKyAgICBkZXN0LT5zdGF0ZSA9IChzdHJ1Y3QgaW50ZXJuYWxfc3RhdGUgRkFSICopY29weTsKKyAgICByZXR1cm4gWl9PSzsKK30KKworaW50IFpFWFBPUlQgaW5mbGF0ZVVuZGVybWluZShzdHJtLCBzdWJ2ZXJ0KQorel9zdHJlYW1wIHN0cm07CitpbnQgc3VidmVydDsKK3sKKyAgICBzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKnN0YXRlOworCisgICAgaWYgKHN0cm0gPT0gWl9OVUxMIHx8IHN0cm0tPnN0YXRlID09IFpfTlVMTCkgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworICAgIHN0YXRlID0gKHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqKXN0cm0tPnN0YXRlOworICAgIHN0YXRlLT5zYW5lID0gIXN1YnZlcnQ7CisjaWZkZWYgSU5GTEFURV9BTExPV19JTlZBTElEX0RJU1RBTkNFX1RPT0ZBUl9BUlJSCisgICAgcmV0dXJuIFpfT0s7CisjZWxzZQorICAgIHN0YXRlLT5zYW5lID0gMTsKKyAgICByZXR1cm4gWl9EQVRBX0VSUk9SOworI2VuZGlmCit9CisKK2xvbmcgWkVYUE9SVCBpbmZsYXRlTWFyayhzdHJtKQorel9zdHJlYW1wIHN0cm07Cit7CisgICAgc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICpzdGF0ZTsKKworICAgIGlmIChzdHJtID09IFpfTlVMTCB8fCBzdHJtLT5zdGF0ZSA9PSBaX05VTEwpIHJldHVybiAtMUwgPDwgMTY7CisgICAgc3RhdGUgPSAoc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICopc3RybS0+c3RhdGU7CisgICAgcmV0dXJuICgobG9uZykoc3RhdGUtPmJhY2spIDw8IDE2KSArCisgICAgICAgIChzdGF0ZS0+bW9kZSA9PSBDT1BZID8gc3RhdGUtPmxlbmd0aCA6CisgICAgICAgICAgICAoc3RhdGUtPm1vZGUgPT0gTUFUQ0ggPyBzdGF0ZS0+d2FzIC0gc3RhdGUtPmxlbmd0aCA6IDApKTsKK30KZGlmZiAtLWdpdCBhL3psaWItMS4yLjYvaW5mbGF0ZS5oIGIvemxpYi0xLjIuNi9pbmZsYXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVmNDk4NgotLS0gL2Rldi9udWxsCisrKyBiL3psaWItMS4yLjYvaW5mbGF0ZS5oCkBAIC0wLDAgKzEsMTIyIEBACisvKiBpbmZsYXRlLmggLS0gaW50ZXJuYWwgaW5mbGF0ZSBzdGF0ZSBkZWZpbml0aW9uCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwOSBNYXJrIEFkbGVyCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCisgKi8KKworLyogV0FSTklORzogdGhpcyBmaWxlIHNob3VsZCAqbm90KiBiZSB1c2VkIGJ5IGFwcGxpY2F0aW9ucy4gSXQgaXMKKyAgIHBhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBjb21wcmVzc2lvbiBsaWJyYXJ5IGFuZCBpcworICAgc3ViamVjdCB0byBjaGFuZ2UuIEFwcGxpY2F0aW9ucyBzaG91bGQgb25seSB1c2UgemxpYi5oLgorICovCisKKy8qIGRlZmluZSBOT19HWklQIHdoZW4gY29tcGlsaW5nIGlmIHlvdSB3YW50IHRvIGRpc2FibGUgZ3ppcCBoZWFkZXIgYW5kCisgICB0cmFpbGVyIGRlY29kaW5nIGJ5IGluZmxhdGUoKS4gIE5PX0daSVAgd291bGQgYmUgdXNlZCB0byBhdm9pZCBsaW5raW5nIGluCisgICB0aGUgY3JjIGNvZGUgd2hlbiBpdCBpcyBub3QgbmVlZGVkLiAgRm9yIHNoYXJlZCBsaWJyYXJpZXMsIGd6aXAgZGVjb2RpbmcKKyAgIHNob3VsZCBiZSBsZWZ0IGVuYWJsZWQuICovCisjaWZuZGVmIE5PX0daSVAKKyMgIGRlZmluZSBHVU5aSVAKKyNlbmRpZgorCisvKiBQb3NzaWJsZSBpbmZsYXRlIG1vZGVzIGJldHdlZW4gaW5mbGF0ZSgpIGNhbGxzICovCit0eXBlZGVmIGVudW0geworICAgIEhFQUQsICAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIG1hZ2ljIGhlYWRlciAqLworICAgIEZMQUdTLCAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIG1ldGhvZCBhbmQgZmxhZ3MgKGd6aXApICovCisgICAgVElNRSwgICAgICAgLyogaTogd2FpdGluZyBmb3IgbW9kaWZpY2F0aW9uIHRpbWUgKGd6aXApICovCisgICAgT1MsICAgICAgICAgLyogaTogd2FpdGluZyBmb3IgZXh0cmEgZmxhZ3MgYW5kIG9wZXJhdGluZyBzeXN0ZW0gKGd6aXApICovCisgICAgRVhMRU4sICAgICAgLyogaTogd2FpdGluZyBmb3IgZXh0cmEgbGVuZ3RoIChnemlwKSAqLworICAgIEVYVFJBLCAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGV4dHJhIGJ5dGVzIChnemlwKSAqLworICAgIE5BTUUsICAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGVuZCBvZiBmaWxlIG5hbWUgKGd6aXApICovCisgICAgQ09NTUVOVCwgICAgLyogaTogd2FpdGluZyBmb3IgZW5kIG9mIGNvbW1lbnQgKGd6aXApICovCisgICAgSENSQywgICAgICAgLyogaTogd2FpdGluZyBmb3IgaGVhZGVyIGNyYyAoZ3ppcCkgKi8KKyAgICBESUNUSUQsICAgICAvKiBpOiB3YWl0aW5nIGZvciBkaWN0aW9uYXJ5IGNoZWNrIHZhbHVlICovCisgICAgRElDVCwgICAgICAgLyogd2FpdGluZyBmb3IgaW5mbGF0ZVNldERpY3Rpb25hcnkoKSBjYWxsICovCisgICAgICAgIFRZUEUsICAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIHR5cGUgYml0cywgaW5jbHVkaW5nIGxhc3QtZmxhZyBiaXQgKi8KKyAgICAgICAgVFlQRURPLCAgICAgLyogaTogc2FtZSwgYnV0IHNraXAgY2hlY2sgdG8gZXhpdCBpbmZsYXRlIG9uIG5ldyBibG9jayAqLworICAgICAgICBTVE9SRUQsICAgICAvKiBpOiB3YWl0aW5nIGZvciBzdG9yZWQgc2l6ZSAobGVuZ3RoIGFuZCBjb21wbGVtZW50KSAqLworICAgICAgICBDT1BZXywgICAgICAvKiBpL286IHNhbWUgYXMgQ09QWSBiZWxvdywgYnV0IG9ubHkgZmlyc3QgdGltZSBpbiAqLworICAgICAgICBDT1BZLCAgICAgICAvKiBpL286IHdhaXRpbmcgZm9yIGlucHV0IG9yIG91dHB1dCB0byBjb3B5IHN0b3JlZCBibG9jayAqLworICAgICAgICBUQUJMRSwgICAgICAvKiBpOiB3YWl0aW5nIGZvciBkeW5hbWljIGJsb2NrIHRhYmxlIGxlbmd0aHMgKi8KKyAgICAgICAgTEVOTEVOUywgICAgLyogaTogd2FpdGluZyBmb3IgY29kZSBsZW5ndGggY29kZSBsZW5ndGhzICovCisgICAgICAgIENPREVMRU5TLCAgIC8qIGk6IHdhaXRpbmcgZm9yIGxlbmd0aC9saXQgYW5kIGRpc3RhbmNlIGNvZGUgbGVuZ3RocyAqLworICAgICAgICAgICAgTEVOXywgICAgICAgLyogaTogc2FtZSBhcyBMRU4gYmVsb3csIGJ1dCBvbmx5IGZpcnN0IHRpbWUgaW4gKi8KKyAgICAgICAgICAgIExFTiwgICAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGxlbmd0aC9saXQvZW9iIGNvZGUgKi8KKyAgICAgICAgICAgIExFTkVYVCwgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGxlbmd0aCBleHRyYSBiaXRzICovCisgICAgICAgICAgICBESVNULCAgICAgICAvKiBpOiB3YWl0aW5nIGZvciBkaXN0YW5jZSBjb2RlICovCisgICAgICAgICAgICBESVNURVhULCAgICAvKiBpOiB3YWl0aW5nIGZvciBkaXN0YW5jZSBleHRyYSBiaXRzICovCisgICAgICAgICAgICBNQVRDSCwgICAgICAvKiBvOiB3YWl0aW5nIGZvciBvdXRwdXQgc3BhY2UgdG8gY29weSBzdHJpbmcgKi8KKyAgICAgICAgICAgIExJVCwgICAgICAgIC8qIG86IHdhaXRpbmcgZm9yIG91dHB1dCBzcGFjZSB0byB3cml0ZSBsaXRlcmFsICovCisgICAgQ0hFQ0ssICAgICAgLyogaTogd2FpdGluZyBmb3IgMzItYml0IGNoZWNrIHZhbHVlICovCisgICAgTEVOR1RILCAgICAgLyogaTogd2FpdGluZyBmb3IgMzItYml0IGxlbmd0aCAoZ3ppcCkgKi8KKyAgICBET05FLCAgICAgICAvKiBmaW5pc2hlZCBjaGVjaywgZG9uZSAtLSByZW1haW4gaGVyZSB1bnRpbCByZXNldCAqLworICAgIEJBRCwgICAgICAgIC8qIGdvdCBhIGRhdGEgZXJyb3IgLS0gcmVtYWluIGhlcmUgdW50aWwgcmVzZXQgKi8KKyAgICBNRU0sICAgICAgICAvKiBnb3QgYW4gaW5mbGF0ZSgpIG1lbW9yeSBlcnJvciAtLSByZW1haW4gaGVyZSB1bnRpbCByZXNldCAqLworICAgIFNZTkMgICAgICAgIC8qIGxvb2tpbmcgZm9yIHN5bmNocm9uaXphdGlvbiBieXRlcyB0byByZXN0YXJ0IGluZmxhdGUoKSAqLworfSBpbmZsYXRlX21vZGU7CisKKy8qCisgICAgU3RhdGUgdHJhbnNpdGlvbnMgYmV0d2VlbiBhYm92ZSBtb2RlcyAtCisKKyAgICAobW9zdCBtb2RlcyBjYW4gZ28gdG8gQkFEIG9yIE1FTSBvbiBlcnJvciAtLSBub3Qgc2hvd24gZm9yIGNsYXJpdHkpCisKKyAgICBQcm9jZXNzIGhlYWRlcjoKKyAgICAgICAgSEVBRCAtPiAoZ3ppcCkgb3IgKHpsaWIpIG9yIChyYXcpCisgICAgICAgIChnemlwKSAtPiBGTEFHUyAtPiBUSU1FIC0+IE9TIC0+IEVYTEVOIC0+IEVYVFJBIC0+IE5BTUUgLT4gQ09NTUVOVCAtPgorICAgICAgICAgICAgICAgICAgSENSQyAtPiBUWVBFCisgICAgICAgICh6bGliKSAtPiBESUNUSUQgb3IgVFlQRQorICAgICAgICBESUNUSUQgLT4gRElDVCAtPiBUWVBFCisgICAgICAgIChyYXcpIC0+IFRZUEVETworICAgIFJlYWQgZGVmbGF0ZSBibG9ja3M6CisgICAgICAgICAgICBUWVBFIC0+IFRZUEVETyAtPiBTVE9SRUQgb3IgVEFCTEUgb3IgTEVOXyBvciBDSEVDSworICAgICAgICAgICAgU1RPUkVEIC0+IENPUFlfIC0+IENPUFkgLT4gVFlQRQorICAgICAgICAgICAgVEFCTEUgLT4gTEVOTEVOUyAtPiBDT0RFTEVOUyAtPiBMRU5fCisgICAgICAgICAgICBMRU5fIC0+IExFTgorICAgIFJlYWQgZGVmbGF0ZSBjb2RlcyBpbiBmaXhlZCBvciBkeW5hbWljIGJsb2NrOgorICAgICAgICAgICAgICAgIExFTiAtPiBMRU5FWFQgb3IgTElUIG9yIFRZUEUKKyAgICAgICAgICAgICAgICBMRU5FWFQgLT4gRElTVCAtPiBESVNURVhUIC0+IE1BVENIIC0+IExFTgorICAgICAgICAgICAgICAgIExJVCAtPiBMRU4KKyAgICBQcm9jZXNzIHRyYWlsZXI6CisgICAgICAgIENIRUNLIC0+IExFTkdUSCAtPiBET05FCisgKi8KKworLyogc3RhdGUgbWFpbnRhaW5lZCBiZXR3ZWVuIGluZmxhdGUoKSBjYWxscy4gIEFwcHJveGltYXRlbHkgMTBLIGJ5dGVzLiAqLworc3RydWN0IGluZmxhdGVfc3RhdGUgeworICAgIGluZmxhdGVfbW9kZSBtb2RlOyAgICAgICAgICAvKiBjdXJyZW50IGluZmxhdGUgbW9kZSAqLworICAgIGludCBsYXN0OyAgICAgICAgICAgICAgICAgICAvKiB0cnVlIGlmIHByb2Nlc3NpbmcgbGFzdCBibG9jayAqLworICAgIGludCB3cmFwOyAgICAgICAgICAgICAgICAgICAvKiBiaXQgMCB0cnVlIGZvciB6bGliLCBiaXQgMSB0cnVlIGZvciBnemlwICovCisgICAgaW50IGhhdmVkaWN0OyAgICAgICAgICAgICAgIC8qIHRydWUgaWYgZGljdGlvbmFyeSBwcm92aWRlZCAqLworICAgIGludCBmbGFnczsgICAgICAgICAgICAgICAgICAvKiBnemlwIGhlYWRlciBtZXRob2QgYW5kIGZsYWdzICgwIGlmIHpsaWIpICovCisgICAgdW5zaWduZWQgZG1heDsgICAgICAgICAgICAgIC8qIHpsaWIgaGVhZGVyIG1heCBkaXN0YW5jZSAoSU5GTEFURV9TVFJJQ1QpICovCisgICAgdW5zaWduZWQgbG9uZyBjaGVjazsgICAgICAgIC8qIHByb3RlY3RlZCBjb3B5IG9mIGNoZWNrIHZhbHVlICovCisgICAgdW5zaWduZWQgbG9uZyB0b3RhbDsgICAgICAgIC8qIHByb3RlY3RlZCBjb3B5IG9mIG91dHB1dCBjb3VudCAqLworICAgIGd6X2hlYWRlcnAgaGVhZDsgICAgICAgICAgICAvKiB3aGVyZSB0byBzYXZlIGd6aXAgaGVhZGVyIGluZm9ybWF0aW9uICovCisgICAgICAgIC8qIHNsaWRpbmcgd2luZG93ICovCisgICAgdW5zaWduZWQgd2JpdHM7ICAgICAgICAgICAgIC8qIGxvZyBiYXNlIDIgb2YgcmVxdWVzdGVkIHdpbmRvdyBzaXplICovCisgICAgdW5zaWduZWQgd3NpemU7ICAgICAgICAgICAgIC8qIHdpbmRvdyBzaXplIG9yIHplcm8gaWYgbm90IHVzaW5nIHdpbmRvdyAqLworICAgIHVuc2lnbmVkIHdoYXZlOyAgICAgICAgICAgICAvKiB2YWxpZCBieXRlcyBpbiB0aGUgd2luZG93ICovCisgICAgdW5zaWduZWQgd25leHQ7ICAgICAgICAgICAgIC8qIHdpbmRvdyB3cml0ZSBpbmRleCAqLworICAgIHVuc2lnbmVkIGNoYXIgRkFSICp3aW5kb3c7ICAvKiBhbGxvY2F0ZWQgc2xpZGluZyB3aW5kb3csIGlmIG5lZWRlZCAqLworICAgICAgICAvKiBiaXQgYWNjdW11bGF0b3IgKi8KKyAgICB1bnNpZ25lZCBsb25nIGhvbGQ7ICAgICAgICAgLyogaW5wdXQgYml0IGFjY3VtdWxhdG9yICovCisgICAgdW5zaWduZWQgYml0czsgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBiaXRzIGluICJpbiIgKi8KKyAgICAgICAgLyogZm9yIHN0cmluZyBhbmQgc3RvcmVkIGJsb2NrIGNvcHlpbmcgKi8KKyAgICB1bnNpZ25lZCBsZW5ndGg7ICAgICAgICAgICAgLyogbGl0ZXJhbCBvciBsZW5ndGggb2YgZGF0YSB0byBjb3B5ICovCisgICAgdW5zaWduZWQgb2Zmc2V0OyAgICAgICAgICAgIC8qIGRpc3RhbmNlIGJhY2sgdG8gY29weSBzdHJpbmcgZnJvbSAqLworICAgICAgICAvKiBmb3IgdGFibGUgYW5kIGNvZGUgZGVjb2RpbmcgKi8KKyAgICB1bnNpZ25lZCBleHRyYTsgICAgICAgICAgICAgLyogZXh0cmEgYml0cyBuZWVkZWQgKi8KKyAgICAgICAgLyogZml4ZWQgYW5kIGR5bmFtaWMgY29kZSB0YWJsZXMgKi8KKyAgICBjb2RlIGNvbnN0IEZBUiAqbGVuY29kZTsgICAgLyogc3RhcnRpbmcgdGFibGUgZm9yIGxlbmd0aC9saXRlcmFsIGNvZGVzICovCisgICAgY29kZSBjb25zdCBGQVIgKmRpc3Rjb2RlOyAgIC8qIHN0YXJ0aW5nIHRhYmxlIGZvciBkaXN0YW5jZSBjb2RlcyAqLworICAgIHVuc2lnbmVkIGxlbmJpdHM7ICAgICAgICAgICAvKiBpbmRleCBiaXRzIGZvciBsZW5jb2RlICovCisgICAgdW5zaWduZWQgZGlzdGJpdHM7ICAgICAgICAgIC8qIGluZGV4IGJpdHMgZm9yIGRpc3Rjb2RlICovCisgICAgICAgIC8qIGR5bmFtaWMgdGFibGUgYnVpbGRpbmcgKi8KKyAgICB1bnNpZ25lZCBuY29kZTsgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGNvZGUgbGVuZ3RoIGNvZGUgbGVuZ3RocyAqLworICAgIHVuc2lnbmVkIG5sZW47ICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgbGVuZ3RoIGNvZGUgbGVuZ3RocyAqLworICAgIHVuc2lnbmVkIG5kaXN0OyAgICAgICAgICAgICAvKiBudW1iZXIgb2YgZGlzdGFuY2UgY29kZSBsZW5ndGhzICovCisgICAgdW5zaWduZWQgaGF2ZTsgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBjb2RlIGxlbmd0aHMgaW4gbGVuc1tdICovCisgICAgY29kZSBGQVIgKm5leHQ7ICAgICAgICAgICAgIC8qIG5leHQgYXZhaWxhYmxlIHNwYWNlIGluIGNvZGVzW10gKi8KKyAgICB1bnNpZ25lZCBzaG9ydCBsZW5zWzMyMF07ICAgLyogdGVtcG9yYXJ5IHN0b3JhZ2UgZm9yIGNvZGUgbGVuZ3RocyAqLworICAgIHVuc2lnbmVkIHNob3J0IHdvcmtbMjg4XTsgICAvKiB3b3JrIGFyZWEgZm9yIGNvZGUgdGFibGUgYnVpbGRpbmcgKi8KKyAgICBjb2RlIGNvZGVzW0VOT1VHSF07ICAgICAgICAgLyogc3BhY2UgZm9yIGNvZGUgdGFibGVzICovCisgICAgaW50IHNhbmU7ICAgICAgICAgICAgICAgICAgIC8qIGlmIGZhbHNlLCBhbGxvdyBpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgKi8KKyAgICBpbnQgYmFjazsgICAgICAgICAgICAgICAgICAgLyogYml0cyBiYWNrIG9mIGxhc3QgdW5wcm9jZXNzZWQgbGVuZ3RoL2xpdCAqLworICAgIHVuc2lnbmVkIHdhczsgICAgICAgICAgICAgICAvKiBpbml0aWFsIGxlbmd0aCBvZiBtYXRjaCAqLworfTsKZGlmZiAtLWdpdCBhL3psaWItMS4yLjYvaW5mdHJlZXMuYyBiL3psaWItMS4yLjYvaW5mdHJlZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGJiZDU4Ci0tLSAvZGV2L251bGwKKysrIGIvemxpYi0xLjIuNi9pbmZ0cmVlcy5jCkBAIC0wLDAgKzEsMzA2IEBACisvKiBpbmZ0cmVlcy5jIC0tIGdlbmVyYXRlIEh1ZmZtYW4gdHJlZXMgZm9yIGVmZmljaWVudCBkZWNvZGluZworICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMTIgTWFyayBBZGxlcgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAorICovCisKKyNpbmNsdWRlICJ6dXRpbC5oIgorI2luY2x1ZGUgImluZnRyZWVzLmgiCisKKyNkZWZpbmUgTUFYQklUUyAxNQorCitjb25zdCBjaGFyIGluZmxhdGVfY29weXJpZ2h0W10gPQorICAgIiBpbmZsYXRlIDEuMi42IENvcHlyaWdodCAxOTk1LTIwMTIgTWFyayBBZGxlciAiOworLyoKKyAgSWYgeW91IHVzZSB0aGUgemxpYiBsaWJyYXJ5IGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaXMgd2VsY29tZQorICBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvZiB5b3VyIHByb2R1Y3QuIElmIGZvciBzb21lIHJlYXNvbiB5b3UgY2Fubm90CisgIGluY2x1ZGUgc3VjaCBhbiBhY2tub3dsZWRnbWVudCwgSSB3b3VsZCBhcHByZWNpYXRlIHRoYXQgeW91IGtlZXAgdGhpcworICBjb3B5cmlnaHQgc3RyaW5nIGluIHRoZSBleGVjdXRhYmxlIG9mIHlvdXIgcHJvZHVjdC4KKyAqLworCisvKgorICAgQnVpbGQgYSBzZXQgb2YgdGFibGVzIHRvIGRlY29kZSB0aGUgcHJvdmlkZWQgY2Fub25pY2FsIEh1ZmZtYW4gY29kZS4KKyAgIFRoZSBjb2RlIGxlbmd0aHMgYXJlIGxlbnNbMC4uY29kZXMtMV0uICBUaGUgcmVzdWx0IHN0YXJ0cyBhdCAqdGFibGUsCisgICB3aG9zZSBpbmRpY2VzIGFyZSAwLi4yXmJpdHMtMS4gIHdvcmsgaXMgYSB3cml0YWJsZSBhcnJheSBvZiBhdCBsZWFzdAorICAgbGVucyBzaG9ydHMsIHdoaWNoIGlzIHVzZWQgYXMgYSB3b3JrIGFyZWEuICB0eXBlIGlzIHRoZSB0eXBlIG9mIGNvZGUKKyAgIHRvIGJlIGdlbmVyYXRlZCwgQ09ERVMsIExFTlMsIG9yIERJU1RTLiAgT24gcmV0dXJuLCB6ZXJvIGlzIHN1Y2Nlc3MsCisgICAtMSBpcyBhbiBpbnZhbGlkIGNvZGUsIGFuZCArMSBtZWFucyB0aGF0IEVOT1VHSCBpc24ndCBlbm91Z2guICB0YWJsZQorICAgb24gcmV0dXJuIHBvaW50cyB0byB0aGUgbmV4dCBhdmFpbGFibGUgZW50cnkncyBhZGRyZXNzLiAgYml0cyBpcyB0aGUKKyAgIHJlcXVlc3RlZCByb290IHRhYmxlIGluZGV4IGJpdHMsIGFuZCBvbiByZXR1cm4gaXQgaXMgdGhlIGFjdHVhbCByb290CisgICB0YWJsZSBpbmRleCBiaXRzLiAgSXQgd2lsbCBkaWZmZXIgaWYgdGhlIHJlcXVlc3QgaXMgZ3JlYXRlciB0aGFuIHRoZQorICAgbG9uZ2VzdCBjb2RlIG9yIGlmIGl0IGlzIGxlc3MgdGhhbiB0aGUgc2hvcnRlc3QgY29kZS4KKyAqLworaW50IFpMSUJfSU5URVJOQUwgaW5mbGF0ZV90YWJsZSh0eXBlLCBsZW5zLCBjb2RlcywgdGFibGUsIGJpdHMsIHdvcmspCitjb2RldHlwZSB0eXBlOwordW5zaWduZWQgc2hvcnQgRkFSICpsZW5zOwordW5zaWduZWQgY29kZXM7Citjb2RlIEZBUiAqIEZBUiAqdGFibGU7Cit1bnNpZ25lZCBGQVIgKmJpdHM7Cit1bnNpZ25lZCBzaG9ydCBGQVIgKndvcms7Cit7CisgICAgdW5zaWduZWQgbGVuOyAgICAgICAgICAgICAgIC8qIGEgY29kZSdzIGxlbmd0aCBpbiBiaXRzICovCisgICAgdW5zaWduZWQgc3ltOyAgICAgICAgICAgICAgIC8qIGluZGV4IG9mIGNvZGUgc3ltYm9scyAqLworICAgIHVuc2lnbmVkIG1pbiwgbWF4OyAgICAgICAgICAvKiBtaW5pbXVtIGFuZCBtYXhpbXVtIGNvZGUgbGVuZ3RocyAqLworICAgIHVuc2lnbmVkIHJvb3Q7ICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgaW5kZXggYml0cyBmb3Igcm9vdCB0YWJsZSAqLworICAgIHVuc2lnbmVkIGN1cnI7ICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgaW5kZXggYml0cyBmb3IgY3VycmVudCB0YWJsZSAqLworICAgIHVuc2lnbmVkIGRyb3A7ICAgICAgICAgICAgICAvKiBjb2RlIGJpdHMgdG8gZHJvcCBmb3Igc3ViLXRhYmxlICovCisgICAgaW50IGxlZnQ7ICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBwcmVmaXggY29kZXMgYXZhaWxhYmxlICovCisgICAgdW5zaWduZWQgdXNlZDsgICAgICAgICAgICAgIC8qIGNvZGUgZW50cmllcyBpbiB0YWJsZSB1c2VkICovCisgICAgdW5zaWduZWQgaHVmZjsgICAgICAgICAgICAgIC8qIEh1ZmZtYW4gY29kZSAqLworICAgIHVuc2lnbmVkIGluY3I7ICAgICAgICAgICAgICAvKiBmb3IgaW5jcmVtZW50aW5nIGNvZGUsIGluZGV4ICovCisgICAgdW5zaWduZWQgZmlsbDsgICAgICAgICAgICAgIC8qIGluZGV4IGZvciByZXBsaWNhdGluZyBlbnRyaWVzICovCisgICAgdW5zaWduZWQgbG93OyAgICAgICAgICAgICAgIC8qIGxvdyBiaXRzIGZvciBjdXJyZW50IHJvb3QgZW50cnkgKi8KKyAgICB1bnNpZ25lZCBtYXNrOyAgICAgICAgICAgICAgLyogbWFzayBmb3IgbG93IHJvb3QgYml0cyAqLworICAgIGNvZGUgaGVyZTsgICAgICAgICAgICAgICAgICAvKiB0YWJsZSBlbnRyeSBmb3IgZHVwbGljYXRpb24gKi8KKyAgICBjb2RlIEZBUiAqbmV4dDsgICAgICAgICAgICAgLyogbmV4dCBhdmFpbGFibGUgc3BhY2UgaW4gdGFibGUgKi8KKyAgICBjb25zdCB1bnNpZ25lZCBzaG9ydCBGQVIgKmJhc2U7ICAgICAvKiBiYXNlIHZhbHVlIHRhYmxlIHRvIHVzZSAqLworICAgIGNvbnN0IHVuc2lnbmVkIHNob3J0IEZBUiAqZXh0cmE7ICAgIC8qIGV4dHJhIGJpdHMgdGFibGUgdG8gdXNlICovCisgICAgaW50IGVuZDsgICAgICAgICAgICAgICAgICAgIC8qIHVzZSBiYXNlIGFuZCBleHRyYSBmb3Igc3ltYm9sID4gZW5kICovCisgICAgdW5zaWduZWQgc2hvcnQgY291bnRbTUFYQklUUysxXTsgICAgLyogbnVtYmVyIG9mIGNvZGVzIG9mIGVhY2ggbGVuZ3RoICovCisgICAgdW5zaWduZWQgc2hvcnQgb2Zmc1tNQVhCSVRTKzFdOyAgICAgLyogb2Zmc2V0cyBpbiB0YWJsZSBmb3IgZWFjaCBsZW5ndGggKi8KKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgbGJhc2VbMzFdID0geyAvKiBMZW5ndGggY29kZXMgMjU3Li4yODUgYmFzZSAqLworICAgICAgICAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEzLCAxNSwgMTcsIDE5LCAyMywgMjcsIDMxLAorICAgICAgICAzNSwgNDMsIDUxLCA1OSwgNjcsIDgzLCA5OSwgMTE1LCAxMzEsIDE2MywgMTk1LCAyMjcsIDI1OCwgMCwgMH07CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IGxleHRbMzFdID0geyAvKiBMZW5ndGggY29kZXMgMjU3Li4yODUgZXh0cmEgKi8KKyAgICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNywgMTcsIDE3LCAxNywgMTgsIDE4LCAxOCwgMTgsCisgICAgICAgIDE5LCAxOSwgMTksIDE5LCAyMCwgMjAsIDIwLCAyMCwgMjEsIDIxLCAyMSwgMjEsIDE2LCAyMDMsIDY5fTsKKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgZGJhc2VbMzJdID0geyAvKiBEaXN0YW5jZSBjb2RlcyAwLi4yOSBiYXNlICovCisgICAgICAgIDEsIDIsIDMsIDQsIDUsIDcsIDksIDEzLCAxNywgMjUsIDMzLCA0OSwgNjUsIDk3LCAxMjksIDE5MywKKyAgICAgICAgMjU3LCAzODUsIDUxMywgNzY5LCAxMDI1LCAxNTM3LCAyMDQ5LCAzMDczLCA0MDk3LCA2MTQ1LAorICAgICAgICA4MTkzLCAxMjI4OSwgMTYzODUsIDI0NTc3LCAwLCAwfTsKKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgZGV4dFszMl0gPSB7IC8qIERpc3RhbmNlIGNvZGVzIDAuLjI5IGV4dHJhICovCisgICAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNywgMTcsIDE4LCAxOCwgMTksIDE5LCAyMCwgMjAsIDIxLCAyMSwgMjIsIDIyLAorICAgICAgICAyMywgMjMsIDI0LCAyNCwgMjUsIDI1LCAyNiwgMjYsIDI3LCAyNywKKyAgICAgICAgMjgsIDI4LCAyOSwgMjksIDY0LCA2NH07CisKKyAgICAvKgorICAgICAgIFByb2Nlc3MgYSBzZXQgb2YgY29kZSBsZW5ndGhzIHRvIGNyZWF0ZSBhIGNhbm9uaWNhbCBIdWZmbWFuIGNvZGUuICBUaGUKKyAgICAgICBjb2RlIGxlbmd0aHMgYXJlIGxlbnNbMC4uY29kZXMtMV0uICBFYWNoIGxlbmd0aCBjb3JyZXNwb25kcyB0byB0aGUKKyAgICAgICBzeW1ib2xzIDAuLmNvZGVzLTEuICBUaGUgSHVmZm1hbiBjb2RlIGlzIGdlbmVyYXRlZCBieSBmaXJzdCBzb3J0aW5nIHRoZQorICAgICAgIHN5bWJvbHMgYnkgbGVuZ3RoIGZyb20gc2hvcnQgdG8gbG9uZywgYW5kIHJldGFpbmluZyB0aGUgc3ltYm9sIG9yZGVyCisgICAgICAgZm9yIGNvZGVzIHdpdGggZXF1YWwgbGVuZ3Rocy4gIFRoZW4gdGhlIGNvZGUgc3RhcnRzIHdpdGggYWxsIHplcm8gYml0cworICAgICAgIGZvciB0aGUgZmlyc3QgY29kZSBvZiB0aGUgc2hvcnRlc3QgbGVuZ3RoLCBhbmQgdGhlIGNvZGVzIGFyZSBpbnRlZ2VyCisgICAgICAgaW5jcmVtZW50cyBmb3IgdGhlIHNhbWUgbGVuZ3RoLCBhbmQgemVyb3MgYXJlIGFwcGVuZGVkIGFzIHRoZSBsZW5ndGgKKyAgICAgICBpbmNyZWFzZXMuICBGb3IgdGhlIGRlZmxhdGUgZm9ybWF0LCB0aGVzZSBiaXRzIGFyZSBzdG9yZWQgYmFja3dhcmRzCisgICAgICAgZnJvbSB0aGVpciBtb3JlIG5hdHVyYWwgaW50ZWdlciBpbmNyZW1lbnQgb3JkZXJpbmcsIGFuZCBzbyB3aGVuIHRoZQorICAgICAgIGRlY29kaW5nIHRhYmxlcyBhcmUgYnVpbHQgaW4gdGhlIGxhcmdlIGxvb3AgYmVsb3csIHRoZSBpbnRlZ2VyIGNvZGVzCisgICAgICAgYXJlIGluY3JlbWVudGVkIGJhY2t3YXJkcy4KKworICAgICAgIFRoaXMgcm91dGluZSBhc3N1bWVzLCBidXQgZG9lcyBub3QgY2hlY2ssIHRoYXQgYWxsIG9mIHRoZSBlbnRyaWVzIGluCisgICAgICAgbGVuc1tdIGFyZSBpbiB0aGUgcmFuZ2UgMC4uTUFYQklUUy4gIFRoZSBjYWxsZXIgbXVzdCBhc3N1cmUgdGhpcy4KKyAgICAgICAxLi5NQVhCSVRTIGlzIGludGVycHJldGVkIGFzIHRoYXQgY29kZSBsZW5ndGguICB6ZXJvIG1lYW5zIHRoYXQgdGhhdAorICAgICAgIHN5bWJvbCBkb2VzIG5vdCBvY2N1ciBpbiB0aGlzIGNvZGUuCisKKyAgICAgICBUaGUgY29kZXMgYXJlIHNvcnRlZCBieSBjb21wdXRpbmcgYSBjb3VudCBvZiBjb2RlcyBmb3IgZWFjaCBsZW5ndGgsCisgICAgICAgY3JlYXRpbmcgZnJvbSB0aGF0IGEgdGFibGUgb2Ygc3RhcnRpbmcgaW5kaWNlcyBmb3IgZWFjaCBsZW5ndGggaW4gdGhlCisgICAgICAgc29ydGVkIHRhYmxlLCBhbmQgdGhlbiBlbnRlcmluZyB0aGUgc3ltYm9scyBpbiBvcmRlciBpbiB0aGUgc29ydGVkCisgICAgICAgdGFibGUuICBUaGUgc29ydGVkIHRhYmxlIGlzIHdvcmtbXSwgd2l0aCB0aGF0IHNwYWNlIGJlaW5nIHByb3ZpZGVkIGJ5CisgICAgICAgdGhlIGNhbGxlci4KKworICAgICAgIFRoZSBsZW5ndGggY291bnRzIGFyZSB1c2VkIGZvciBvdGhlciBwdXJwb3NlcyBhcyB3ZWxsLCBpLmUuIGZpbmRpbmcKKyAgICAgICB0aGUgbWluaW11bSBhbmQgbWF4aW11bSBsZW5ndGggY29kZXMsIGRldGVybWluaW5nIGlmIHRoZXJlIGFyZSBhbnkKKyAgICAgICBjb2RlcyBhdCBhbGwsIGNoZWNraW5nIGZvciBhIHZhbGlkIHNldCBvZiBsZW5ndGhzLCBhbmQgbG9va2luZyBhaGVhZAorICAgICAgIGF0IGxlbmd0aCBjb3VudHMgdG8gZGV0ZXJtaW5lIHN1Yi10YWJsZSBzaXplcyB3aGVuIGJ1aWxkaW5nIHRoZQorICAgICAgIGRlY29kaW5nIHRhYmxlcy4KKyAgICAgKi8KKworICAgIC8qIGFjY3VtdWxhdGUgbGVuZ3RocyBmb3IgY29kZXMgKGFzc3VtZXMgbGVuc1tdIGFsbCBpbiAwLi5NQVhCSVRTKSAqLworICAgIGZvciAobGVuID0gMDsgbGVuIDw9IE1BWEJJVFM7IGxlbisrKQorICAgICAgICBjb3VudFtsZW5dID0gMDsKKyAgICBmb3IgKHN5bSA9IDA7IHN5bSA8IGNvZGVzOyBzeW0rKykKKyAgICAgICAgY291bnRbbGVuc1tzeW1dXSsrOworCisgICAgLyogYm91bmQgY29kZSBsZW5ndGhzLCBmb3JjZSByb290IHRvIGJlIHdpdGhpbiBjb2RlIGxlbmd0aHMgKi8KKyAgICByb290ID0gKmJpdHM7CisgICAgZm9yIChtYXggPSBNQVhCSVRTOyBtYXggPj0gMTsgbWF4LS0pCisgICAgICAgIGlmIChjb3VudFttYXhdICE9IDApIGJyZWFrOworICAgIGlmIChyb290ID4gbWF4KSByb290ID0gbWF4OworICAgIGlmIChtYXggPT0gMCkgeyAgICAgICAgICAgICAgICAgICAgIC8qIG5vIHN5bWJvbHMgdG8gY29kZSBhdCBhbGwgKi8KKyAgICAgICAgaGVyZS5vcCA9ICh1bnNpZ25lZCBjaGFyKTY0OyAgICAvKiBpbnZhbGlkIGNvZGUgbWFya2VyICovCisgICAgICAgIGhlcmUuYml0cyA9ICh1bnNpZ25lZCBjaGFyKTE7CisgICAgICAgIGhlcmUudmFsID0gKHVuc2lnbmVkIHNob3J0KTA7CisgICAgICAgICooKnRhYmxlKSsrID0gaGVyZTsgICAgICAgICAgICAgLyogbWFrZSBhIHRhYmxlIHRvIGZvcmNlIGFuIGVycm9yICovCisgICAgICAgICooKnRhYmxlKSsrID0gaGVyZTsKKyAgICAgICAgKmJpdHMgPSAxOworICAgICAgICByZXR1cm4gMDsgICAgIC8qIG5vIHN5bWJvbHMsIGJ1dCB3YWl0IGZvciBkZWNvZGluZyB0byByZXBvcnQgZXJyb3IgKi8KKyAgICB9CisgICAgZm9yIChtaW4gPSAxOyBtaW4gPCBtYXg7IG1pbisrKQorICAgICAgICBpZiAoY291bnRbbWluXSAhPSAwKSBicmVhazsKKyAgICBpZiAocm9vdCA8IG1pbikgcm9vdCA9IG1pbjsKKworICAgIC8qIGNoZWNrIGZvciBhbiBvdmVyLXN1YnNjcmliZWQgb3IgaW5jb21wbGV0ZSBzZXQgb2YgbGVuZ3RocyAqLworICAgIGxlZnQgPSAxOworICAgIGZvciAobGVuID0gMTsgbGVuIDw9IE1BWEJJVFM7IGxlbisrKSB7CisgICAgICAgIGxlZnQgPDw9IDE7CisgICAgICAgIGxlZnQgLT0gY291bnRbbGVuXTsKKyAgICAgICAgaWYgKGxlZnQgPCAwKSByZXR1cm4gLTE7ICAgICAgICAvKiBvdmVyLXN1YnNjcmliZWQgKi8KKyAgICB9CisgICAgaWYgKGxlZnQgPiAwICYmICh0eXBlID09IENPREVTIHx8IG1heCAhPSAxKSkKKyAgICAgICAgcmV0dXJuIC0xOyAgICAgICAgICAgICAgICAgICAgICAvKiBpbmNvbXBsZXRlIHNldCAqLworCisgICAgLyogZ2VuZXJhdGUgb2Zmc2V0cyBpbnRvIHN5bWJvbCB0YWJsZSBmb3IgZWFjaCBsZW5ndGggZm9yIHNvcnRpbmcgKi8KKyAgICBvZmZzWzFdID0gMDsKKyAgICBmb3IgKGxlbiA9IDE7IGxlbiA8IE1BWEJJVFM7IGxlbisrKQorICAgICAgICBvZmZzW2xlbiArIDFdID0gb2Zmc1tsZW5dICsgY291bnRbbGVuXTsKKworICAgIC8qIHNvcnQgc3ltYm9scyBieSBsZW5ndGgsIGJ5IHN5bWJvbCBvcmRlciB3aXRoaW4gZWFjaCBsZW5ndGggKi8KKyAgICBmb3IgKHN5bSA9IDA7IHN5bSA8IGNvZGVzOyBzeW0rKykKKyAgICAgICAgaWYgKGxlbnNbc3ltXSAhPSAwKSB3b3JrW29mZnNbbGVuc1tzeW1dXSsrXSA9ICh1bnNpZ25lZCBzaG9ydClzeW07CisKKyAgICAvKgorICAgICAgIENyZWF0ZSBhbmQgZmlsbCBpbiBkZWNvZGluZyB0YWJsZXMuICBJbiB0aGlzIGxvb3AsIHRoZSB0YWJsZSBiZWluZworICAgICAgIGZpbGxlZCBpcyBhdCBuZXh0IGFuZCBoYXMgY3VyciBpbmRleCBiaXRzLiAgVGhlIGNvZGUgYmVpbmcgdXNlZCBpcyBodWZmCisgICAgICAgd2l0aCBsZW5ndGggbGVuLiAgVGhhdCBjb2RlIGlzIGNvbnZlcnRlZCB0byBhbiBpbmRleCBieSBkcm9wcGluZyBkcm9wCisgICAgICAgYml0cyBvZmYgb2YgdGhlIGJvdHRvbS4gIEZvciBjb2RlcyB3aGVyZSBsZW4gaXMgbGVzcyB0aGFuIGRyb3AgKyBjdXJyLAorICAgICAgIHRob3NlIHRvcCBkcm9wICsgY3VyciAtIGxlbiBiaXRzIGFyZSBpbmNyZW1lbnRlZCB0aHJvdWdoIGFsbCB2YWx1ZXMgdG8KKyAgICAgICBmaWxsIHRoZSB0YWJsZSB3aXRoIHJlcGxpY2F0ZWQgZW50cmllcy4KKworICAgICAgIHJvb3QgaXMgdGhlIG51bWJlciBvZiBpbmRleCBiaXRzIGZvciB0aGUgcm9vdCB0YWJsZS4gIFdoZW4gbGVuIGV4Y2VlZHMKKyAgICAgICByb290LCBzdWItdGFibGVzIGFyZSBjcmVhdGVkIHBvaW50ZWQgdG8gYnkgdGhlIHJvb3QgZW50cnkgd2l0aCBhbiBpbmRleAorICAgICAgIG9mIHRoZSBsb3cgcm9vdCBiaXRzIG9mIGh1ZmYuICBUaGlzIGlzIHNhdmVkIGluIGxvdyB0byBjaGVjayBmb3Igd2hlbiBhCisgICAgICAgbmV3IHN1Yi10YWJsZSBzaG91bGQgYmUgc3RhcnRlZC4gIGRyb3AgaXMgemVybyB3aGVuIHRoZSByb290IHRhYmxlIGlzCisgICAgICAgYmVpbmcgZmlsbGVkLCBhbmQgZHJvcCBpcyByb290IHdoZW4gc3ViLXRhYmxlcyBhcmUgYmVpbmcgZmlsbGVkLgorCisgICAgICAgV2hlbiBhIG5ldyBzdWItdGFibGUgaXMgbmVlZGVkLCBpdCBpcyBuZWNlc3NhcnkgdG8gbG9vayBhaGVhZCBpbiB0aGUKKyAgICAgICBjb2RlIGxlbmd0aHMgdG8gZGV0ZXJtaW5lIHdoYXQgc2l6ZSBzdWItdGFibGUgaXMgbmVlZGVkLiAgVGhlIGxlbmd0aAorICAgICAgIGNvdW50cyBhcmUgdXNlZCBmb3IgdGhpcywgYW5kIHNvIGNvdW50W10gaXMgZGVjcmVtZW50ZWQgYXMgY29kZXMgYXJlCisgICAgICAgZW50ZXJlZCBpbiB0aGUgdGFibGVzLgorCisgICAgICAgdXNlZCBrZWVwcyB0cmFjayBvZiBob3cgbWFueSB0YWJsZSBlbnRyaWVzIGhhdmUgYmVlbiBhbGxvY2F0ZWQgZnJvbSB0aGUKKyAgICAgICBwcm92aWRlZCAqdGFibGUgc3BhY2UuICBJdCBpcyBjaGVja2VkIGZvciBMRU5TIGFuZCBESVNUIHRhYmxlcyBhZ2FpbnN0CisgICAgICAgdGhlIGNvbnN0YW50cyBFTk9VR0hfTEVOUyBhbmQgRU5PVUdIX0RJU1RTIHRvIGd1YXJkIGFnYWluc3QgY2hhbmdlcyBpbgorICAgICAgIHRoZSBpbml0aWFsIHJvb3QgdGFibGUgc2l6ZSBjb25zdGFudHMuICBTZWUgdGhlIGNvbW1lbnRzIGluIGluZnRyZWVzLmgKKyAgICAgICBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKworICAgICAgIHN5bSBpbmNyZW1lbnRzIHRocm91Z2ggYWxsIHN5bWJvbHMsIGFuZCB0aGUgbG9vcCB0ZXJtaW5hdGVzIHdoZW4KKyAgICAgICBhbGwgY29kZXMgb2YgbGVuZ3RoIG1heCwgaS5lLiBhbGwgY29kZXMsIGhhdmUgYmVlbiBwcm9jZXNzZWQuICBUaGlzCisgICAgICAgcm91dGluZSBwZXJtaXRzIGluY29tcGxldGUgY29kZXMsIHNvIGFub3RoZXIgbG9vcCBhZnRlciB0aGlzIG9uZSBmaWxscworICAgICAgIGluIHRoZSByZXN0IG9mIHRoZSBkZWNvZGluZyB0YWJsZXMgd2l0aCBpbnZhbGlkIGNvZGUgbWFya2Vycy4KKyAgICAgKi8KKworICAgIC8qIHNldCB1cCBmb3IgY29kZSB0eXBlICovCisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBDT0RFUzoKKyAgICAgICAgYmFzZSA9IGV4dHJhID0gd29yazsgICAgLyogZHVtbXkgdmFsdWUtLW5vdCB1c2VkICovCisgICAgICAgIGVuZCA9IDE5OworICAgICAgICBicmVhazsKKyAgICBjYXNlIExFTlM6CisgICAgICAgIGJhc2UgPSBsYmFzZTsKKyAgICAgICAgYmFzZSAtPSAyNTc7CisgICAgICAgIGV4dHJhID0gbGV4dDsKKyAgICAgICAgZXh0cmEgLT0gMjU3OworICAgICAgICBlbmQgPSAyNTY7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6ICAgICAgICAgICAgLyogRElTVFMgKi8KKyAgICAgICAgYmFzZSA9IGRiYXNlOworICAgICAgICBleHRyYSA9IGRleHQ7CisgICAgICAgIGVuZCA9IC0xOworICAgIH0KKworICAgIC8qIGluaXRpYWxpemUgc3RhdGUgZm9yIGxvb3AgKi8KKyAgICBodWZmID0gMDsgICAgICAgICAgICAgICAgICAgLyogc3RhcnRpbmcgY29kZSAqLworICAgIHN5bSA9IDA7ICAgICAgICAgICAgICAgICAgICAvKiBzdGFydGluZyBjb2RlIHN5bWJvbCAqLworICAgIGxlbiA9IG1pbjsgICAgICAgICAgICAgICAgICAvKiBzdGFydGluZyBjb2RlIGxlbmd0aCAqLworICAgIG5leHQgPSAqdGFibGU7ICAgICAgICAgICAgICAvKiBjdXJyZW50IHRhYmxlIHRvIGZpbGwgaW4gKi8KKyAgICBjdXJyID0gcm9vdDsgICAgICAgICAgICAgICAgLyogY3VycmVudCB0YWJsZSBpbmRleCBiaXRzICovCisgICAgZHJvcCA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIGN1cnJlbnQgYml0cyB0byBkcm9wIGZyb20gY29kZSBmb3IgaW5kZXggKi8KKyAgICBsb3cgPSAodW5zaWduZWQpKC0xKTsgICAgICAgLyogdHJpZ2dlciBuZXcgc3ViLXRhYmxlIHdoZW4gbGVuID4gcm9vdCAqLworICAgIHVzZWQgPSAxVSA8PCByb290OyAgICAgICAgICAvKiB1c2Ugcm9vdCB0YWJsZSBlbnRyaWVzICovCisgICAgbWFzayA9IHVzZWQgLSAxOyAgICAgICAgICAgIC8qIG1hc2sgZm9yIGNvbXBhcmluZyBsb3cgKi8KKworICAgIC8qIGNoZWNrIGF2YWlsYWJsZSB0YWJsZSBzcGFjZSAqLworICAgIGlmICgodHlwZSA9PSBMRU5TICYmIHVzZWQgPj0gRU5PVUdIX0xFTlMpIHx8CisgICAgICAgICh0eXBlID09IERJU1RTICYmIHVzZWQgPj0gRU5PVUdIX0RJU1RTKSkKKyAgICAgICAgcmV0dXJuIDE7CisKKyAgICAvKiBwcm9jZXNzIGFsbCBjb2RlcyBhbmQgbWFrZSB0YWJsZSBlbnRyaWVzICovCisgICAgZm9yICg7OykgeworICAgICAgICAvKiBjcmVhdGUgdGFibGUgZW50cnkgKi8KKyAgICAgICAgaGVyZS5iaXRzID0gKHVuc2lnbmVkIGNoYXIpKGxlbiAtIGRyb3ApOworICAgICAgICBpZiAoKGludCkod29ya1tzeW1dKSA8IGVuZCkgeworICAgICAgICAgICAgaGVyZS5vcCA9ICh1bnNpZ25lZCBjaGFyKTA7CisgICAgICAgICAgICBoZXJlLnZhbCA9IHdvcmtbc3ltXTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICgoaW50KSh3b3JrW3N5bV0pID4gZW5kKSB7CisgICAgICAgICAgICBoZXJlLm9wID0gKHVuc2lnbmVkIGNoYXIpKGV4dHJhW3dvcmtbc3ltXV0pOworICAgICAgICAgICAgaGVyZS52YWwgPSBiYXNlW3dvcmtbc3ltXV07CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBoZXJlLm9wID0gKHVuc2lnbmVkIGNoYXIpKDMyICsgNjQpOyAgICAgICAgIC8qIGVuZCBvZiBibG9jayAqLworICAgICAgICAgICAgaGVyZS52YWwgPSAwOworICAgICAgICB9CisKKyAgICAgICAgLyogcmVwbGljYXRlIGZvciB0aG9zZSBpbmRpY2VzIHdpdGggbG93IGxlbiBiaXRzIGVxdWFsIHRvIGh1ZmYgKi8KKyAgICAgICAgaW5jciA9IDFVIDw8IChsZW4gLSBkcm9wKTsKKyAgICAgICAgZmlsbCA9IDFVIDw8IGN1cnI7CisgICAgICAgIG1pbiA9IGZpbGw7ICAgICAgICAgICAgICAgICAvKiBzYXZlIG9mZnNldCB0byBuZXh0IHRhYmxlICovCisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGZpbGwgLT0gaW5jcjsKKyAgICAgICAgICAgIG5leHRbKGh1ZmYgPj4gZHJvcCkgKyBmaWxsXSA9IGhlcmU7CisgICAgICAgIH0gd2hpbGUgKGZpbGwgIT0gMCk7CisKKyAgICAgICAgLyogYmFja3dhcmRzIGluY3JlbWVudCB0aGUgbGVuLWJpdCBjb2RlIGh1ZmYgKi8KKyAgICAgICAgaW5jciA9IDFVIDw8IChsZW4gLSAxKTsKKyAgICAgICAgd2hpbGUgKGh1ZmYgJiBpbmNyKQorICAgICAgICAgICAgaW5jciA+Pj0gMTsKKyAgICAgICAgaWYgKGluY3IgIT0gMCkgeworICAgICAgICAgICAgaHVmZiAmPSBpbmNyIC0gMTsKKyAgICAgICAgICAgIGh1ZmYgKz0gaW5jcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBodWZmID0gMDsKKworICAgICAgICAvKiBnbyB0byBuZXh0IHN5bWJvbCwgdXBkYXRlIGNvdW50LCBsZW4gKi8KKyAgICAgICAgc3ltKys7CisgICAgICAgIGlmICgtLShjb3VudFtsZW5dKSA9PSAwKSB7CisgICAgICAgICAgICBpZiAobGVuID09IG1heCkgYnJlYWs7CisgICAgICAgICAgICBsZW4gPSBsZW5zW3dvcmtbc3ltXV07CisgICAgICAgIH0KKworICAgICAgICAvKiBjcmVhdGUgbmV3IHN1Yi10YWJsZSBpZiBuZWVkZWQgKi8KKyAgICAgICAgaWYgKGxlbiA+IHJvb3QgJiYgKGh1ZmYgJiBtYXNrKSAhPSBsb3cpIHsKKyAgICAgICAgICAgIC8qIGlmIGZpcnN0IHRpbWUsIHRyYW5zaXRpb24gdG8gc3ViLXRhYmxlcyAqLworICAgICAgICAgICAgaWYgKGRyb3AgPT0gMCkKKyAgICAgICAgICAgICAgICBkcm9wID0gcm9vdDsKKworICAgICAgICAgICAgLyogaW5jcmVtZW50IHBhc3QgbGFzdCB0YWJsZSAqLworICAgICAgICAgICAgbmV4dCArPSBtaW47ICAgICAgICAgICAgLyogaGVyZSBtaW4gaXMgMSA8PCBjdXJyICovCisKKyAgICAgICAgICAgIC8qIGRldGVybWluZSBsZW5ndGggb2YgbmV4dCB0YWJsZSAqLworICAgICAgICAgICAgY3VyciA9IGxlbiAtIGRyb3A7CisgICAgICAgICAgICBsZWZ0ID0gKGludCkoMSA8PCBjdXJyKTsKKyAgICAgICAgICAgIHdoaWxlIChjdXJyICsgZHJvcCA8IG1heCkgeworICAgICAgICAgICAgICAgIGxlZnQgLT0gY291bnRbY3VyciArIGRyb3BdOworICAgICAgICAgICAgICAgIGlmIChsZWZ0IDw9IDApIGJyZWFrOworICAgICAgICAgICAgICAgIGN1cnIrKzsKKyAgICAgICAgICAgICAgICBsZWZ0IDw8PSAxOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBjaGVjayBmb3IgZW5vdWdoIHNwYWNlICovCisgICAgICAgICAgICB1c2VkICs9IDFVIDw8IGN1cnI7CisgICAgICAgICAgICBpZiAoKHR5cGUgPT0gTEVOUyAmJiB1c2VkID49IEVOT1VHSF9MRU5TKSB8fAorICAgICAgICAgICAgICAgICh0eXBlID09IERJU1RTICYmIHVzZWQgPj0gRU5PVUdIX0RJU1RTKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKworICAgICAgICAgICAgLyogcG9pbnQgZW50cnkgaW4gcm9vdCB0YWJsZSB0byBzdWItdGFibGUgKi8KKyAgICAgICAgICAgIGxvdyA9IGh1ZmYgJiBtYXNrOworICAgICAgICAgICAgKCp0YWJsZSlbbG93XS5vcCA9ICh1bnNpZ25lZCBjaGFyKWN1cnI7CisgICAgICAgICAgICAoKnRhYmxlKVtsb3ddLmJpdHMgPSAodW5zaWduZWQgY2hhcilyb290OworICAgICAgICAgICAgKCp0YWJsZSlbbG93XS52YWwgPSAodW5zaWduZWQgc2hvcnQpKG5leHQgLSAqdGFibGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogZmlsbCBpbiByZW1haW5pbmcgdGFibGUgZW50cnkgaWYgY29kZSBpcyBpbmNvbXBsZXRlIChndWFyYW50ZWVkIHRvIGhhdmUKKyAgICAgICBhdCBtb3N0IG9uZSByZW1haW5pbmcgZW50cnksIHNpbmNlIGlmIHRoZSBjb2RlIGlzIGluY29tcGxldGUsIHRoZQorICAgICAgIG1heGltdW0gY29kZSBsZW5ndGggdGhhdCB3YXMgYWxsb3dlZCB0byBnZXQgdGhpcyBmYXIgaXMgb25lIGJpdCkgKi8KKyAgICBpZiAoaHVmZiAhPSAwKSB7CisgICAgICAgIGhlcmUub3AgPSAodW5zaWduZWQgY2hhcik2NDsgICAgICAgICAgICAvKiBpbnZhbGlkIGNvZGUgbWFya2VyICovCisgICAgICAgIGhlcmUuYml0cyA9ICh1bnNpZ25lZCBjaGFyKShsZW4gLSBkcm9wKTsKKyAgICAgICAgaGVyZS52YWwgPSAodW5zaWduZWQgc2hvcnQpMDsKKyAgICAgICAgbmV4dFtodWZmXSA9IGhlcmU7CisgICAgfQorCisgICAgLyogc2V0IHJldHVybiBwYXJhbWV0ZXJzICovCisgICAgKnRhYmxlICs9IHVzZWQ7CisgICAgKmJpdHMgPSByb290OworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvemxpYi0xLjIuNi9pbmZ0cmVlcy5oIGIvemxpYi0xLjIuNi9pbmZ0cmVlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhYTUzYTAKLS0tIC9kZXYvbnVsbAorKysgYi96bGliLTEuMi42L2luZnRyZWVzLmgKQEAgLTAsMCArMSw2MiBAQAorLyogaW5mdHJlZXMuaCAtLSBoZWFkZXIgdG8gdXNlIGluZnRyZWVzLmMKKyAqIENvcHlyaWdodCAoQykgMTk5NS0yMDA1LCAyMDEwIE1hcmsgQWRsZXIKKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKKyAqLworCisvKiBXQVJOSU5HOiB0aGlzIGZpbGUgc2hvdWxkICpub3QqIGJlIHVzZWQgYnkgYXBwbGljYXRpb25zLiBJdCBpcworICAgcGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGNvbXByZXNzaW9uIGxpYnJhcnkgYW5kIGlzCisgICBzdWJqZWN0IHRvIGNoYW5nZS4gQXBwbGljYXRpb25zIHNob3VsZCBvbmx5IHVzZSB6bGliLmguCisgKi8KKworLyogU3RydWN0dXJlIGZvciBkZWNvZGluZyB0YWJsZXMuICBFYWNoIGVudHJ5IHByb3ZpZGVzIGVpdGhlciB0aGUKKyAgIGluZm9ybWF0aW9uIG5lZWRlZCB0byBkbyB0aGUgb3BlcmF0aW9uIHJlcXVlc3RlZCBieSB0aGUgY29kZSB0aGF0CisgICBpbmRleGVkIHRoYXQgdGFibGUgZW50cnksIG9yIGl0IHByb3ZpZGVzIGEgcG9pbnRlciB0byBhbm90aGVyCisgICB0YWJsZSB0aGF0IGluZGV4ZXMgbW9yZSBiaXRzIG9mIHRoZSBjb2RlLiAgb3AgaW5kaWNhdGVzIHdoZXRoZXIKKyAgIHRoZSBlbnRyeSBpcyBhIHBvaW50ZXIgdG8gYW5vdGhlciB0YWJsZSwgYSBsaXRlcmFsLCBhIGxlbmd0aCBvcgorICAgZGlzdGFuY2UsIGFuIGVuZC1vZi1ibG9jaywgb3IgYW4gaW52YWxpZCBjb2RlLiAgRm9yIGEgdGFibGUKKyAgIHBvaW50ZXIsIHRoZSBsb3cgZm91ciBiaXRzIG9mIG9wIGlzIHRoZSBudW1iZXIgb2YgaW5kZXggYml0cyBvZgorICAgdGhhdCB0YWJsZS4gIEZvciBhIGxlbmd0aCBvciBkaXN0YW5jZSwgdGhlIGxvdyBmb3VyIGJpdHMgb2Ygb3AKKyAgIGlzIHRoZSBudW1iZXIgb2YgZXh0cmEgYml0cyB0byBnZXQgYWZ0ZXIgdGhlIGNvZGUuICBiaXRzIGlzCisgICB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhpcyBjb2RlIG9yIHBhcnQgb2YgdGhlIGNvZGUgdG8gZHJvcCBvZmYKKyAgIG9mIHRoZSBiaXQgYnVmZmVyLiAgdmFsIGlzIHRoZSBhY3R1YWwgYnl0ZSB0byBvdXRwdXQgaW4gdGhlIGNhc2UKKyAgIG9mIGEgbGl0ZXJhbCwgdGhlIGJhc2UgbGVuZ3RoIG9yIGRpc3RhbmNlLCBvciB0aGUgb2Zmc2V0IGZyb20KKyAgIHRoZSBjdXJyZW50IHRhYmxlIHRvIHRoZSBuZXh0IHRhYmxlLiAgRWFjaCBlbnRyeSBpcyBmb3VyIGJ5dGVzLiAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVuc2lnbmVkIGNoYXIgb3A7ICAgICAgICAgICAvKiBvcGVyYXRpb24sIGV4dHJhIGJpdHMsIHRhYmxlIGJpdHMgKi8KKyAgICB1bnNpZ25lZCBjaGFyIGJpdHM7ICAgICAgICAgLyogYml0cyBpbiB0aGlzIHBhcnQgb2YgdGhlIGNvZGUgKi8KKyAgICB1bnNpZ25lZCBzaG9ydCB2YWw7ICAgICAgICAgLyogb2Zmc2V0IGluIHRhYmxlIG9yIGNvZGUgdmFsdWUgKi8KK30gY29kZTsKKworLyogb3AgdmFsdWVzIGFzIHNldCBieSBpbmZsYXRlX3RhYmxlKCk6CisgICAgMDAwMDAwMDAgLSBsaXRlcmFsCisgICAgMDAwMHR0dHQgLSB0YWJsZSBsaW5rLCB0dHR0ICE9IDAgaXMgdGhlIG51bWJlciBvZiB0YWJsZSBpbmRleCBiaXRzCisgICAgMDAwMWVlZWUgLSBsZW5ndGggb3IgZGlzdGFuY2UsIGVlZWUgaXMgdGhlIG51bWJlciBvZiBleHRyYSBiaXRzCisgICAgMDExMDAwMDAgLSBlbmQgb2YgYmxvY2sKKyAgICAwMTAwMDAwMCAtIGludmFsaWQgY29kZQorICovCisKKy8qIE1heGltdW0gc2l6ZSBvZiB0aGUgZHluYW1pYyB0YWJsZS4gIFRoZSBtYXhpbXVtIG51bWJlciBvZiBjb2RlIHN0cnVjdHVyZXMgaXMKKyAgIDE0NDQsIHdoaWNoIGlzIHRoZSBzdW0gb2YgODUyIGZvciBsaXRlcmFsL2xlbmd0aCBjb2RlcyBhbmQgNTkyIGZvciBkaXN0YW5jZQorICAgY29kZXMuICBUaGVzZSB2YWx1ZXMgd2VyZSBmb3VuZCBieSBleGhhdXN0aXZlIHNlYXJjaGVzIHVzaW5nIHRoZSBwcm9ncmFtCisgICBleGFtcGxlcy9lbm91Z2guYyBmb3VuZCBpbiB0aGUgemxpYiBkaXN0cmlidHV0aW9uLiAgVGhlIGFyZ3VtZW50cyB0byB0aGF0CisgICBwcm9ncmFtIGFyZSB0aGUgbnVtYmVyIG9mIHN5bWJvbHMsIHRoZSBpbml0aWFsIHJvb3QgdGFibGUgc2l6ZSwgYW5kIHRoZQorICAgbWF4aW11bSBiaXQgbGVuZ3RoIG9mIGEgY29kZS4gICJlbm91Z2ggMjg2IDkgMTUiIGZvciBsaXRlcmFsL2xlbmd0aCBjb2RlcworICAgcmV0dXJucyByZXR1cm5zIDg1MiwgYW5kICJlbm91Z2ggMzAgNiAxNSIgZm9yIGRpc3RhbmNlIGNvZGVzIHJldHVybnMgNTkyLgorICAgVGhlIGluaXRpYWwgcm9vdCB0YWJsZSBzaXplICg5IG9yIDYpIGlzIGZvdW5kIGluIHRoZSBmaWZ0aCBhcmd1bWVudCBvZiB0aGUKKyAgIGluZmxhdGVfdGFibGUoKSBjYWxscyBpbiBpbmZsYXRlLmMgYW5kIGluZmJhY2suYy4gIElmIHRoZSByb290IHRhYmxlIHNpemUgaXMKKyAgIGNoYW5nZWQsIHRoZW4gdGhlc2UgbWF4aW11bSBzaXplcyB3b3VsZCBiZSBuZWVkIHRvIGJlIHJlY2FsY3VsYXRlZCBhbmQKKyAgIHVwZGF0ZWQuICovCisjZGVmaW5lIEVOT1VHSF9MRU5TIDg1MgorI2RlZmluZSBFTk9VR0hfRElTVFMgNTkyCisjZGVmaW5lIEVOT1VHSCAoRU5PVUdIX0xFTlMrRU5PVUdIX0RJU1RTKQorCisvKiBUeXBlIG9mIGNvZGUgdG8gYnVpbGQgZm9yIGluZmxhdGVfdGFibGUoKSAqLwordHlwZWRlZiBlbnVtIHsKKyAgICBDT0RFUywKKyAgICBMRU5TLAorICAgIERJU1RTCit9IGNvZGV0eXBlOworCitpbnQgWkxJQl9JTlRFUk5BTCBpbmZsYXRlX3RhYmxlIE9GKChjb2RldHlwZSB0eXBlLCB1bnNpZ25lZCBzaG9ydCBGQVIgKmxlbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNvZGVzLCBjb2RlIEZBUiAqIEZBUiAqdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEZBUiAqYml0cywgdW5zaWduZWQgc2hvcnQgRkFSICp3b3JrKSk7CmRpZmYgLS1naXQgYS96bGliLTEuMi42L21ha2Vfdm1zLmNvbSBiL3psaWItMS4yLjYvbWFrZV92bXMuY29tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExYmU1MjcKLS0tIC9kZXYvbnVsbAorKysgYi96bGliLTEuMi42L21ha2Vfdm1zLmNvbQpAQCAtMCwwICsxLDgwNCBAQAorJCEgbWFrZSBsaWJ6IHVuZGVyIFZNUyB3cml0dGVuIGJ5CiskISBNYXJ0aW4gUC5KLiBaaW5zZXIKKyQhCiskISBJbiBjYXNlIG9mIHByb2JsZW1zIHdpdGggdGhlIGluc3RhbGwgeW91IG1pZ2h0IGNvbnRhY3QgbWUgYXQKKyQhIHppbnNlckB6aW5zZXIubm8taXAuaW5mbyhwcmVmZXJyZWQpIG9yCiskISB6aW5zZXJAc3lzZGV2LmRldXRzY2hlLWJvZXJzZS5jb20gKHdvcmspCiskIQorJCEgTWFrZSBwcm9jZWR1cmUgaGlzdG9yeSBmb3IgWmxpYgorJCEKKyQhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskISBWZXJzaW9uIGhpc3RvcnkKKyQhIDAuMDEgMjAwNjAxMjAgRmlyc3QgdmVyc2lvbiB0byByZWNlaXZlIGEgbnVtYmVyCiskISAwLjAyIDIwMDYxMDA4IEFkYXB0IHRvIG5ldyBNYWtlZmlsZS5pbgorJCEgMC4wMyAyMDA5MTIyNCBBZGQgc3VwcG9ydCBmb3IgbGFyZ2UgZmlsZSBjaGVjaworJCEgMC4wNCAyMDEwMDExMCBBZGQgbmV3IGd6Y2xvc2UsIGd6bGliLCBnenJlYWQsIGd6d3JpdGUKKyQhIDAuMDUgMjAxMDAyMjEgRXhjaGFuZ2UgemxpYmRlZnMuaCBieSB6Y29uZi5oLmluCiskIQorJCBvbiBlcnJvciB0aGVuIGdvdG8gZXJyX2V4aXQKKyQgc2V0IHByb2MvcGFyc2U9ZXh0CiskIQorJCB0cnVlICA9IDEKKyQgZmFsc2UgPSAwCiskIHRtcG5hbSA9ICJ0ZW1wXyIgKyBmJGdldGpwaSgiIiwicGlkIikKKyQgdHQgPSB0bXBuYW0gKyAiLnR4dCIKKyQgdGMgPSB0bXBuYW0gKyAiLmMiCiskIHRoID0gdG1wbmFtICsgIi5oIgorJCBkZWZpbmUvbm9sb2cgdGNvbmZpZyAndGgnCiskIGl0c19kZWNjID0gZmFsc2UKKyQgaXRzX3ZheGMgPSBmYWxzZQorJCBpdHNfZ251YyA9IGZhbHNlCiskIHNfY2FzZSAgID0gRmFsc2UKKyQhCiskISBTZXR1cCB2YXJpYWJsZXMgaG9sZGluZyAiY29uZmlnIiBpbmZvcm1hdGlvbgorJCEKKyQgTWFrZSAgICA9ICIiCiskIG5hbWUgICAgID0gIlpsaWIiCiskIHZlcnNpb24gID0gIj8uPy4/IgorJCB2X3N0cmluZyA9ICJaTElCX1ZFUlNJT04iCiskIHZfZmlsZSAgID0gInpsaWIuaCIKKyQgY2NvcHQgICA9ICIiCiskIGxvcHRzICAgPSAiIgorJCBkbnNybCAgID0gIiIKKyQgYWNvbmZfaW5fZmlsZSA9ICJ6Y29uZi5oLmluI3pjb25mLmhfaW4iCiskIGNvbmZfY2hlY2tfc3RyaW5nID0gIiIKKyQgbGlua29ubHkgPSBmYWxzZQorJCBvcHRmaWxlICA9IG5hbWUgKyAiLm9wdCIKKyQgbGliZGVmcyAgPSAiIgorJCBheHAgICAgICA9IGYkZ2V0c3lpKCJIV19NT0RFTCIpLmdlLjEwMjQgLmFuZC4gZiRnZXRzeWkoIkhXX01PREVMIikubHQuNDA5NgorJCEKKyQgd2hvYW1pID0gZiRwYXJzZShmJGVudmlvcm5tZW50KCJQcm9jZWR1cmUiKSwsLCwiTk9fQ09OQ0VBTCIpCiskIG15ZGVmICA9IEYkcGFyc2Uod2hvYW1pLCwsIkRFVklDRSIpCiskIG15ZGlyICA9IGYkcGFyc2Uod2hvYW1pLCwsIkRJUkVDVE9SWSIpIC0gIl1bIgorJCBteXByb2MgPSBmJHBhcnNlKHdob2FtaSwsLCJOYW1lIikgKyBmJHBhcnNlKHdob2FtaSwsLCJ0eXBlIikKKyQhCiskISBDaGVjayBmb3IgTU1LL01NUworJCEKKyQgSWYgRiRTZWFyY2ggKCJTeXMkU3lzdGVtOk1NUy5FWEUiKSAubmVzLiAiIiBUaGVuIE1ha2UgPSAiTU1TIgorJCBJZiBGJFR5cGUgKE1NSykgLmVxcy4gIlNUUklORyIgVGhlbiBNYWtlID0gIk1NSyIKKyQhCiskIQorJCBnb3N1YiBmaW5kX3ZlcnNpb24KKyQhCiskICBvcGVuL3dyaXRlIHRvcHQgdG1wLm9wdAorJCAgb3Blbi93cml0ZSBvcHRmICdvcHRmaWxlJworJCEKKyQgZ29zdWIgY2hlY2tfb3B0cworJCEKKyQhIExvb2sgZm9yIHRoZSBjb21waWxlciB1c2VkCiskIQorJCBnb3N1YiBjaGVja19jb21waWxlcgorJCBjbG9zZSB0b3B0CiskIQorJCBpZiBpdHNfZGVjYworJCB0aGVuCiskICAgY2NvcHQgPSAiL3ByZWZpeD1hbGwiICsgY2NvcHQKKyQgICBpZiBmJHRybmxubSgiU1lTIikgLmVxcy4gIiIKKyQgICB0aGVuCiskICAgICBpZiBheHAKKyQgICAgIHRoZW4KKyQgICAgICAgZGVmaW5lIHN5cyBzeXMkbGlicmFyeToKKyQgICAgIGVsc2UKKyQgICAgICAgY2NvcHQgPSAiL2RlY2MiICsgY2NvcHQKKyQgICAgICAgZGVmaW5lIHN5cyBkZWNjJGxpYnJhcnlfaW5jbHVkZToKKyQgICAgIGVuZGlmCiskICAgZW5kaWYKKyQgZW5kaWYKKyQgaWYgaXRzX3ZheGMgLm9yLiBpdHNfZ251YworJCB0aGVuCiskICAgIGlmIGYkdHJubG5tKCJTWVMiKS5lcXMuIiIgdGhlbiBkZWZpbmUgc3lzIHN5cyRsaWJyYXJ5OgorJCBlbmRpZgorJCEKKyQhIEJ1aWxkIGEgZmFrZSBjb25maWd1cmUgaW5wdXQgaGVhZGVyCiskIQorJCBvcGVuL3dyaXRlIGNvbmZfaGluIGNvbmZpZy5oaW4KKyQgd3JpdGUgY29uZl9oaW4gIiN1bmRlZiBfTEFSR0VGSUxFNjRfU09VUkNFIgorJCBjbG9zZSBjb25mX2hpbgorJCEKKyQhCiskIGkgPSAwCiskRklORF9BQ09ORjoKKyQgZm5hbWUgPSBmJGVsZW1lbnQoaSwiIyIsYWNvbmZfaW5fZmlsZSkKKyQgaWYgZm5hbWUgLmVxcy4gIiMiIHRoZW4gZ290byBBTUlTU19FUlIKKyQgaWYgZiRzZWFyY2goZm5hbWUpIC5lcXMuICIiCiskIHRoZW4KKyQgICBpID0gaSArIDEKKyQgICBnb3RvIGZpbmRfYWNvbmYKKyQgZW5kaWYKKyQgb3Blbi9yZWFkL2Vycj1hY29uZl9lcnIgYWNvbmZfaW4gJ2ZuYW1lJworJCBvcGVuL3dyaXRlIGFjb25mIHpjb25mLmgKKyRBQ09ORl9MT09QOgorJCByZWFkL2VuZF9vZl9maWxlPWFjb25mX2V4aXQgYWNvbmZfaW4gbGluZQorJCB3b3JrID0gZiRlZGl0KGxpbmUsICJjb21wcmVzcyx0cmltIikKKyQgaWYgZiRleHRyYWN0KDAsNix3b3JrKSAubmVzLiAiI3VuZGVmIgorJCB0aGVuCiskICAgaWYgZiRleHRyYWN0KDAsMTIsd29yaykgLm5lcy4gIiNjbWFrZWRlZmluZSIKKyQgICB0aGVuCiskICAgICAgIHdyaXRlIGFjb25mIGxpbmUKKyQgICBlbmRpZgorJCBlbHNlCiskICAgY2RlZiA9IGYkZWxlbWVudCgxLCIgIix3b3JrKQorJCAgIGdvc3ViIGNoZWNrX2NvbmZpZworJCBlbmRpZgorJCBnb3RvIGFjb25mX2xvb3AKKyRBQ09ORl9FWElUOgorJCB3cml0ZSBhY29uZiAiI2RlZmluZSBWTVMgMSIKKyQgd3JpdGUgYWNvbmYgIiNpbmNsdWRlIDx1bmlzdGQuaD4iCiskIHdyaXRlIGFjb25mICIjaW5jbHVkZSA8dW5peGlvLmg+IgorJCB3cml0ZSBhY29uZiAiI2lmZGVmIF9MQVJHRUZJTEUiCiskIHdyaXRlIGFjb25mICIjZGVmaW5lIG9mZjY0X3QgX19vZmY2NF90IgorJCB3cml0ZSBhY29uZiAiI2RlZmluZSBmb3BlbjY0IGZvcGVuIgorJCB3cml0ZSBhY29uZiAiI2RlZmluZSBmc2Vla282NCBmc2Vla28iCiskIHdyaXRlIGFjb25mICIjZGVmaW5lIGxzZWVrNjQgbHNlZWsiCiskIHdyaXRlIGFjb25mICIjZGVmaW5lIGZ0ZWxsbzY0IGZ0ZWxsIgorJCB3cml0ZSBhY29uZiAiI2VuZGlmIgorJCBjbG9zZSBhY29uZl9pbgorJCBjbG9zZSBhY29uZgorJCBpZiBmJHNlYXJjaCgiJyd0aCciKSAubmVzLiAiIiB0aGVuIGRlbGV0ZSAndGgnOyoKKyQhIEJ1aWxkIHRoZSB0aGluZyBwbGFpbiBvciB3aXRoIG1tcworJCEKKyQgd3JpdGUgc3lzJG91dHB1dCAiQ29tcGlsaW5nIFpsaWIgc291cmNlcyAuLi4iCiskIGlmIG1ha2UuZXFzLiIiCiskICB0aGVuCiskICAgZGVsZSBleGFtcGxlLm9iajsqLG1pbmlnemlwLm9iajsqCiskICAgQ0FMTCBNQUtFIGFkbGVyMzIuT0JKICJDQyAnJ0NDT1BUJyBhZGxlcjMyIiAtCisgICAgICAgICAgICAgICAgYWRsZXIzMi5jIHpsaWIuaCB6Y29uZi5oCiskICAgQ0FMTCBNQUtFIGNvbXByZXNzLk9CSiAiQ0MgJydDQ09QVCcgY29tcHJlc3MiIC0KKyAgICAgICAgICAgICAgICBjb21wcmVzcy5jIHpsaWIuaCB6Y29uZi5oCiskICAgQ0FMTCBNQUtFIGNyYzMyLk9CSiAiQ0MgJydDQ09QVCcgY3JjMzIiIC0KKyAgICAgICAgICAgICAgICBjcmMzMi5jIHpsaWIuaCB6Y29uZi5oCiskICAgQ0FMTCBNQUtFIGRlZmxhdGUuT0JKICJDQyAnJ0NDT1BUJyBkZWZsYXRlIiAtCisgICAgICAgICAgICAgICAgZGVmbGF0ZS5jIGRlZmxhdGUuaCB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCiskICAgQ0FMTCBNQUtFIGd6Y2xvc2UuT0JKICJDQyAnJ0NDT1BUJyBnemNsb3NlIiAtCisgICAgICAgICAgICAgICAgZ3pjbG9zZS5jIHp1dGlsLmggemxpYi5oIHpjb25mLmgKKyQgICBDQUxMIE1BS0UgZ3psaWIuT0JKICJDQyAnJ0NDT1BUJyBnemxpYiIgLQorICAgICAgICAgICAgICAgIGd6bGliLmMgenV0aWwuaCB6bGliLmggemNvbmYuaAorJCAgIENBTEwgTUFLRSBnenJlYWQuT0JKICJDQyAnJ0NDT1BUJyBnenJlYWQiIC0KKyAgICAgICAgICAgICAgICBnenJlYWQuYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCiskICAgQ0FMTCBNQUtFIGd6d3JpdGUuT0JKICJDQyAnJ0NDT1BUJyBnendyaXRlIiAtCisgICAgICAgICAgICAgICAgZ3p3cml0ZS5jIHp1dGlsLmggemxpYi5oIHpjb25mLmgKKyQgICBDQUxMIE1BS0UgaW5mYmFjay5PQkogIkNDICcnQ0NPUFQnIGluZmJhY2siIC0KKyAgICAgICAgICAgICAgICBpbmZiYWNrLmMgenV0aWwuaCBpbmZ0cmVlcy5oIGluZmxhdGUuaCBpbmZmYXN0LmggaW5mZml4ZWQuaAorJCAgIENBTEwgTUFLRSBpbmZmYXN0Lk9CSiAiQ0MgJydDQ09QVCcgaW5mZmFzdCIgLQorICAgICAgICAgICAgICAgIGluZmZhc3QuYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZmZhc3QuaAorJCAgIENBTEwgTUFLRSBpbmZsYXRlLk9CSiAiQ0MgJydDQ09QVCcgaW5mbGF0ZSIgLQorICAgICAgICAgICAgICAgIGluZmxhdGUuYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZmJsb2NrLmgKKyQgICBDQUxMIE1BS0UgaW5mdHJlZXMuT0JKICJDQyAnJ0NDT1BUJyBpbmZ0cmVlcyIgLQorICAgICAgICAgICAgICAgIGluZnRyZWVzLmMgenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZ0cmVlcy5oCiskICAgQ0FMTCBNQUtFIHRyZWVzLk9CSiAiQ0MgJydDQ09QVCcgdHJlZXMiIC0KKyAgICAgICAgICAgICAgICB0cmVlcy5jIGRlZmxhdGUuaCB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCiskICAgQ0FMTCBNQUtFIHVuY29tcHIuT0JKICJDQyAnJ0NDT1BUJyB1bmNvbXByIiAtCisgICAgICAgICAgICAgICAgdW5jb21wci5jIHpsaWIuaCB6Y29uZi5oCiskICAgQ0FMTCBNQUtFIHp1dGlsLk9CSiAiQ0MgJydDQ09QVCcgenV0aWwiIC0KKyAgICAgICAgICAgICAgICB6dXRpbC5jIHp1dGlsLmggemxpYi5oIHpjb25mLmgKKyQgICB3cml0ZSBzeXMkb3V0cHV0ICJCdWlsZGluZyBabGliIC4uLiIKKyQgICBDQUxMIE1BS0UgbGliei5PTEIgImxpYi9jcmVhIGxpYnoub2xiICoub2JqIiAqLk9CSgorJCAgIHdyaXRlIHN5cyRvdXRwdXQgIkJ1aWxkaW5nIGV4YW1wbGUuLi4iCiskICAgQ0FMTCBNQUtFIGV4YW1wbGUuT0JKICJDQyAnJ0NDT1BUJyBleGFtcGxlIiAtCisgICAgICAgICAgICAgICAgdGVzdC9leGFtcGxlLmMgemxpYi5oIHpjb25mLmgKKyQgICBjYWxsIG1ha2UgZXhhbXBsZS5leGUgIkxJTksgZXhhbXBsZSxsaWJ6Lm9sYi9saWIiIGV4YW1wbGUub2JqIGxpYnoub2xiCiskICAgaWYgZiRzZWFyY2goIngxMXZtczp4dm1zdXRpbHMub2xiIikgLm5lcy4gIiIKKyQgICB0aGVuCiskICAgICB3cml0ZSBzeXMkb3V0cHV0ICJCdWlsZGluZyBtaW5pZ3ppcC4uLiIKKyQgICAgIENBTEwgTUFLRSBtaW5pZ3ppcC5PQkogIkNDICcnQ0NPUFQnIG1pbmlnemlwIiAtCisgICAgICAgICAgICAgICAgdGVzdC9taW5pZ3ppcC5jIHpsaWIuaCB6Y29uZi5oCiskICAgICBjYWxsIG1ha2UgbWluaWd6aXAuZXhlIC0KKyAgICAgICAgICAgICAgICAiTElOSyBtaW5pZ3ppcCxsaWJ6Lm9sYi9saWIseDExdm1zOnh2bXN1dGlscy5vbGIvbGliIiAtCisgICAgICAgICAgICAgICAgbWluaWd6aXAub2JqIGxpYnoub2xiCiskICAgZW5kaWYKKyQgIGVsc2UKKyQgICBnb3N1YiBjcmVhX21tcworJCAgIHdyaXRlIHN5cyRvdXRwdXQgIk1ha2UgJyduYW1lJyAnJ3ZlcnNpb24nIHdpdGggJydNYWtlJyAiCiskICAgJ21ha2UnCiskICBlbmRpZgorJCEKKyQhIEFscGhhIGdldHMgYSBzaGFyZWFibGUgaW1hZ2UKKyQhCiskIElmIGF4cAorJCBUaGVuCiskICAgZ29zdWIgY3JlYV9vbGlzdAorJCAgIHdyaXRlIHN5cyRvdXRwdXQgIkNyZWF0aW5nIGxpYnpzaHIuZXhlIgorJCAgIGNhbGwgYW5hbF9vYmpfYXhwIG1vZHVsZXMub3B0IF9saW5rLm9wdAorJCAgIGlmIHNfY2FzZQorJCAgIHRoZW4KKyQgICAgICBvcGVuL2FwcGVuZCBvcHRmIG1vZHVsZXMub3B0CiskICAgICAgd3JpdGUgb3B0ZiAiY2FzZV9zZW5zaXRpdmU9WUVTIgorJCAgICAgIGNsb3NlIG9wdGYKKyQgICBlbmRpZgorJCAgIExJTktfJ2xvcHRzJy9TSEFSRT1saWJ6c2hyLmV4ZSBtb2R1bGVzLm9wdC9vcHQsX2xpbmsub3B0L29wdAorJCBlbmRpZgorJCB3cml0ZSBzeXMkb3V0cHV0ICJabGliIGJ1aWxkIGNvbXBsZXRlZCIKKyQgZXhpdAorJENDX0VSUjoKKyQgd3JpdGUgc3lzJG91dHB1dCAiQyBjb21waWxlciByZXF1aXJlZCB0byBidWlsZCAnJ25hbWUnIgorJCBnb3RvIGVycl9leGl0CiskRVJSX0VYSVQ6CiskIHNldCBtZXNzYWdlL2ZhY2lsL2lkZW50L3NldmVyL3RleHQKKyQgY2xvc2Uvbm9sb2cgb3B0ZgorJCBjbG9zZS9ub2xvZyB0b3B0CiskIGNsb3NlL25vbG9nIGNvbmZfaGluCiskIGNsb3NlL25vbG9nIGFjb25mX2luCiskIGNsb3NlL25vbG9nIGFjb25mCiskIGNsb3NlL25vbG9nIG91dAorJCBjbG9zZS9ub2xvZyBtaW4KKyQgY2xvc2Uvbm9sb2cgbW9kCiskIGNsb3NlL25vbG9nIGhfaW4KKyQgd3JpdGUgc3lzJG91dHB1dCAiRXhpdGluZy4uLiIKKyQgZXhpdCAyCiskIQorJCEKKyRNQUtFOiBTVUJST1VUSU5FICAgIVNVQlJPVVRJTkUgVE8gQ0hFQ0sgREVQRU5ERU5DSUVTCiskIFYgPSAnRiRWZXJpZnkoMCkKKyQhIFAxID0gV2hhdCB3ZSBhcmUgdHJ5aW5nIHRvIG1ha2UKKyQhIFAyID0gQ29tbWFuZCB0byBtYWtlIGl0CiskISBQMyAtIFA4ICBXaGF0IGl0IGRlcGVuZHMgb24KKyQKKyQgSWYgRiRTZWFyY2goUDEpIC5FcXMuICIiIFRoZW4gR290byBNYWtlaXQKKyQgVGltZSA9IEYkQ3ZUaW1lKEYkRmlsZShQMSwiUkRUIikpCiskYXJnPTMKKyRMb29wOgorJCAgICAgICBBcmd1bWVudCA9IFAnYXJnCiskICAgICAgIElmIEFyZ3VtZW50IC5FcXMuICIiIFRoZW4gR290byBFeGl0CiskICAgICAgIEVsPTAKKyRMb29wMjoKKyQgICAgICAgRmlsZSA9IEYkRWxlbWVudChFbCwiICIsQXJndW1lbnQpCiskICAgICAgIElmIEZpbGUgLkVxcy4gIiAiIFRoZW4gR290byBFbmRsCiskICAgICAgIEFGaWxlID0gIiIKKyRMb29wMzoKKyQgICAgICAgT0ZpbGUgPSBBRmlsZQorJCAgICAgICBBRmlsZSA9IEYkU2VhcmNoKEZpbGUpCiskICAgICAgIElmIEFGaWxlIC5FcXMuICIiIC5Pci4gQUZpbGUgLkVxcy4gT0ZpbGUgVGhlbiBHb3RvIE5leHRFbAorJCAgICAgICBJZiBGJEN2VGltZShGJEZpbGUoQUZpbGUsIlJEVCIpKSAuR2VzLiBUaW1lIFRoZW4gR290byBNYWtlaXQKKyQgICAgICAgR290byBMb29wMworJE5leHRFTDoKKyQgICAgICAgRWwgPSBFbCArIDEKKyQgICAgICAgR290byBMb29wMgorJEVuZEw6CiskIGFyZz1hcmcrMQorJCBJZiBhcmcgLkxlLiA4IFRoZW4gR290byBMb29wCiskIEdvdG8gRXhpdAorJAorJE1ha2VpdDoKKyQgVlY9RiRWRVJJRlkoMCkKKyQgd3JpdGUgc3lzJG91dHB1dCBQMgorJCAnUDIKKyQgVlY9J0YkVmVyaWZ5KFZWKQorJEV4aXQ6CiskIElmIFYgVGhlbiBTZXQgVmVyaWZ5CiskRU5EU1VCUk9VVElORQorJCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQhCiskISBDaGVjayBjb21tYW5kIGxpbmUgb3B0aW9ucyBhbmQgc2V0IHN5bWJvbHMgYWNjb3JkaW5nbHkKKyQhCiskIS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCEgVmVyc2lvbiBoaXN0b3J5CiskISAwLjAxIDIwMDQxMjA2IEZpcnN0IHZlcnNpb24gdG8gcmVjZWl2ZSBhIG51bWJlcgorJCEgMC4wMiAyMDA2MDEyNiBBZGQgbmV3ICJIRUxQIiB0YXJnZXQKKyQgQ0hFQ0tfT1BUUzoKKyQgaSA9IDEKKyQgT1BUX0xPT1A6CiskIGlmIGkgLmx0LiA5CiskIHRoZW4KKyQgICBjcGFybSA9IGYkZWRpdChwJ2knLCJ1cGNhc2UiKQorJCEKKyQhIENoZWNrIGlmIHBhcmFtZXRlciBhY3R1YWxseSBjb250YWlucyBzb21ldGhpbmcKKyQhCiskICAgaWYgZiRlZGl0KGNwYXJtLCJ0cmltIikgLm5lcy4gIiIKKyQgICB0aGVuCiskICAgICBpZiBjcGFybSAuZXFzLiAiREVCVUciCiskICAgICB0aGVuCiskICAgICAgIGNjb3B0ID0gY2NvcHQgKyAiL25vb3B0L2RlYiIKKyQgICAgICAgbG9wdHMgPSBsb3B0cyArICIvZGViIgorJCAgICAgZW5kaWYKKyQgICAgIGlmIGYkbG9jYXRlKCJDQ09QVD0iLGNwYXJtKSAubHQuIGYkbGVuZ3RoKGNwYXJtKQorJCAgICAgdGhlbgorJCAgICAgICBzdGFydCA9IGYkbG9jYXRlKCI9IixjcGFybSkgKyAxCiskICAgICAgIGxlbiAgID0gZiRsZW5ndGgoY3Bhcm0pIC0gc3RhcnQKKyQgICAgICAgY2NvcHQgPSBjY29wdCArIGYkZXh0cmFjdChzdGFydCxsZW4sY3Bhcm0pCiskICAgICAgIGlmIGYkbG9jYXRlKCJBU19JUyIsZiRlZGl0KGNjb3B0LCJVUENBU0UiKSkgLmx0LiBmJGxlbmd0aChjY29wdCkgLQorICAgICAgICAgIHRoZW4gc19jYXNlID0gdHJ1ZQorJCAgICAgZW5kaWYKKyQgICAgIGlmIGNwYXJtIC5lcXMuICJMSU5LIiB0aGVuIGxpbmtvbmx5ID0gdHJ1ZQorJCAgICAgaWYgZiRsb2NhdGUoIkxPUFRTPSIsY3Bhcm0pIC5sdC4gZiRsZW5ndGgoY3Bhcm0pCiskICAgICB0aGVuCiskICAgICAgIHN0YXJ0ID0gZiRsb2NhdGUoIj0iLGNwYXJtKSArIDEKKyQgICAgICAgbGVuICAgPSBmJGxlbmd0aChjcGFybSkgLSBzdGFydAorJCAgICAgICBsb3B0cyA9IGxvcHRzICsgZiRleHRyYWN0KHN0YXJ0LGxlbixjcGFybSkKKyQgICAgIGVuZGlmCiskICAgICBpZiBmJGxvY2F0ZSgiQ0M9IixjcGFybSkgLmx0LiBmJGxlbmd0aChjcGFybSkKKyQgICAgIHRoZW4KKyQgICAgICAgc3RhcnQgID0gZiRsb2NhdGUoIj0iLGNwYXJtKSArIDEKKyQgICAgICAgbGVuICAgID0gZiRsZW5ndGgoY3Bhcm0pIC0gc3RhcnQKKyQgICAgICAgY2NfY29tID0gZiRleHRyYWN0KHN0YXJ0LGxlbixjcGFybSkKKyAgICAgICAgaWYgKGNjX2NvbSAubmVzLiAiREVDQyIpIC5hbmQuIC0KKyAgICAgICAgICAgKGNjX2NvbSAubmVzLiAiVkFYQyIpIC5hbmQuIC0KKyAgICAgICAgICAgKGNjX2NvbSAubmVzLiAiR05VQyIpCiskICAgICAgIHRoZW4KKyQgICAgICAgICB3cml0ZSBzeXMkb3V0cHV0ICJVbnN1cHBvcnRlZCBjb21waWxlciBjaG9pY2UgJydjY19jb20nIGlnbm9yZWQiCiskICAgICAgICAgd3JpdGUgc3lzJG91dHB1dCAiVXNlIERFQ0MsIFZBWEMsIG9yIEdOVUMgaW5zdGVhZCIKKyQgICAgICAgZWxzZQorJCAgICAgICAgIGlmIGNjX2NvbSAuZXFzLiAiREVDQyIgdGhlbiBpdHNfZGVjYyA9IHRydWUKKyQgICAgICAgICBpZiBjY19jb20gLmVxcy4gIlZBWEMiIHRoZW4gaXRzX3ZheGMgPSB0cnVlCiskICAgICAgICAgaWYgY2NfY29tIC5lcXMuICJHTlVDIiB0aGVuIGl0c19nbnVjID0gdHJ1ZQorJCAgICAgICBlbmRpZgorJCAgICAgZW5kaWYKKyQgICAgIGlmIGYkbG9jYXRlKCJNQUtFPSIsY3Bhcm0pIC5sdC4gZiRsZW5ndGgoY3Bhcm0pCiskICAgICB0aGVuCiskICAgICAgIHN0YXJ0ICA9IGYkbG9jYXRlKCI9IixjcGFybSkgKyAxCiskICAgICAgIGxlbiAgICA9IGYkbGVuZ3RoKGNwYXJtKSAtIHN0YXJ0CiskICAgICAgIG1ta3MgPSBmJGV4dHJhY3Qoc3RhcnQsbGVuLGNwYXJtKQorJCAgICAgICBpZiAobW1rcyAuZXFzLiAiTU1LIikgLm9yLiAobW1rcyAuZXFzLiAiTU1TIikKKyQgICAgICAgdGhlbgorJCAgICAgICAgIG1ha2UgPSBtbWtzCiskICAgICAgIGVsc2UKKyQgICAgICAgICB3cml0ZSBzeXMkb3V0cHV0ICJVbnN1cHBvcnRlZCBtYWtlIGNob2ljZSAnJ21ta3MnIGlnbm9yZWQiCiskICAgICAgICAgd3JpdGUgc3lzJG91dHB1dCAiVXNlIE1NSyBvciBNTVMgaW5zdGVhZCIKKyQgICAgICAgZW5kaWYKKyQgICAgIGVuZGlmCiskICAgICBpZiBjcGFybSAuZXFzLiAiSEVMUCIgdGhlbiBnb3N1YiBiaGVscAorJCAgIGVuZGlmCiskICAgaSA9IGkgKyAxCiskICAgZ290byBvcHRfbG9vcAorJCBlbmRpZgorJCByZXR1cm4KKyQhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIQorJCEgTG9vayBmb3IgdGhlIGNvbXBpbGVyIHVzZWQKKyQhCiskISBWZXJzaW9uIGhpc3RvcnkKKyQhIDAuMDEgMjAwNDAyMjMgRmlyc3QgdmVyc2lvbiB0byByZWNlaXZlIGEgbnVtYmVyCiskISAwLjAyIDIwMDQwMjI5IFNhdmUvc2V0IHZhbHVlIG9mIGRlY2Mkbm9fcm9vdGVkX3NlYXJjaF9saXN0cworJCEgMC4wMyAyMDA2MDIwMiBFeHRlbmQgaGFuZGxpbmcgb2YgR05VIEMKKyQhIDAuMDQgMjAwOTA0MDIgQ29tcGFxIC0+IGhwCiskQ0hFQ0tfQ09NUElMRVI6CiskIGlmICgubm90LiAoaXRzX2RlY2MgLm9yLiBpdHNfdmF4YyAub3IuIGl0c19nbnVjKSkKKyQgdGhlbgorJCAgIGl0c19kZWNjID0gKGYkc2VhcmNoKCJTWVMkU1lTVEVNOkRFQ0MkQ09NUElMRVIuRVhFIikgLm5lcy4gIiIpCiskICAgaXRzX3ZheGMgPSAubm90LiBpdHNfZGVjYyAuYW5kLiAoRiRTZWFyY2goIlNZUyRTeXN0ZW06VkFYQy5FeGUiKSAubmVzLiAiIikKKyQgICBpdHNfZ251YyA9IC5ub3QuIChpdHNfZGVjYyAub3IuIGl0c192YXhjKSAuYW5kLiAoZiR0cm5sbm0oImdudV9jYyIpIC5uZXMuICIiKQorJCBlbmRpZgorJCEKKyQhIEV4aXQgaWYgbm8gY29tcGlsZXIgYXZhaWxhYmxlCiskIQorJCBpZiAoLm5vdC4gKGl0c19kZWNjIC5vci4gaXRzX3ZheGMgLm9yLiBpdHNfZ251YykpCiskIHRoZW4gZ290byBDQ19FUlIKKyQgZWxzZQorJCAgIGlmIGl0c19kZWNjCiskICAgdGhlbgorJCAgICAgd3JpdGUgc3lzJG91dHB1dCAiQ0MgY29tcGlsZXIgY2hlY2sgLi4uIGhwIEMiCiskICAgICBpZiBmJHRybmxubSgiZGVjYyRub19yb290ZWRfc2VhcmNoX2xpc3RzIikgLm5lcy4gIiIKKyQgICAgIHRoZW4KKyQgICAgICAgZG5yc2wgPSBmJHRybmxubSgiZGVjYyRub19yb290ZWRfc2VhcmNoX2xpc3RzIikKKyQgICAgIGVuZGlmCiskICAgICBkZWZpbmUvbm9sb2cgZGVjYyRub19yb290ZWRfc2VhcmNoX2xpc3RzIDEKKyQgICBlbHNlCiskICAgICBpZiBpdHNfdmF4YyB0aGVuIHdyaXRlIHN5cyRvdXRwdXQgIkNDIGNvbXBpbGVyIGNoZWNrIC4uLiBWQVggQyIKKyQgICAgIGlmIGl0c19nbnVjCiskICAgICB0aGVuCiskICAgICAgICAgd3JpdGUgc3lzJG91dHB1dCAiQ0MgY29tcGlsZXIgY2hlY2sgLi4uIEdOVSBDIgorJCAgICAgICAgIGlmIGYkdHJubG5tKHRvcHQpIHRoZW4gd3JpdGUgdG9wdCAiZ251X2NjOlswMDAwMDBdZ2NjbGliLm9sYi9saWIiCiskICAgICAgICAgaWYgZiR0cm5sbm0ob3B0ZikgdGhlbiB3cml0ZSBvcHRmICJnbnVfY2M6WzAwMDAwMF1nY2NsaWIub2xiL2xpYiIKKyQgICAgICAgICBjYyA9ICJnY2MiCiskICAgICBlbmRpZgorJCAgICAgaWYgZiR0cm5sbm0odG9wdCkgdGhlbiB3cml0ZSB0b3B0ICJzeXMkc2hhcmU6dmF4Y3J0bC5leGUvc2hhcmUiCiskICAgICBpZiBmJHRybmxubShvcHRmKSB0aGVuIHdyaXRlIG9wdGYgInN5cyRzaGFyZTp2YXhjcnRsLmV4ZS9zaGFyZSIKKyQgICBlbmRpZgorJCBlbmRpZgorJCByZXR1cm4KKyQhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIQorJCEgSWYgTU1TL01NSyBhcmUgYXZhaWxhYmxlIGR1bXAgb3V0IHRoZSBkZXNjcmlwLm1tcyBpZiByZXF1aXJlZAorJCEKKyRDUkVBX01NUzoKKyQgd3JpdGUgc3lzJG91dHB1dCAiQ3JlYXRpbmcgZGVzY3JpcC5tbXMuLi4iCiskIGNyZWF0ZSBkZXNjcmlwLm1tcworJCBvcGVuL2FwcGVuZCBvdXQgZGVzY3JpcC5tbXMKKyQgY29weSBzeXMkaW5wdXQ6IG91dAorJCBkZWNrCisjIGRlc2NyaXAubW1zOiBNTVMgZGVzY3JpcHRpb24gZmlsZSBmb3IgYnVpbGRpbmcgemxpYiBvbiBWTVMKKyMgd3JpdHRlbiBieSBNYXJ0aW4gUC5KLiBaaW5zZXIKKyMgPHppbnNlckB6aW5zZXIubm8taXAuaW5mbyBvciB6aW5zZXJAc3lzZGV2LmRldXRzY2hlLWJvZXJzZS5jb20+CisKK09CSlMgPSBhZGxlcjMyLm9iaiwgY29tcHJlc3Mub2JqLCBjcmMzMi5vYmosIGd6Y2xvc2Uub2JqLCBnemxpYi5vYmpcCisgICAgICAgZ3pyZWFkLm9iaiwgZ3p3cml0ZS5vYmosIHVuY29tcHIub2JqLCBpbmZiYWNrLm9ialwKKyAgICAgICBkZWZsYXRlLm9iaiwgdHJlZXMub2JqLCB6dXRpbC5vYmosIGluZmxhdGUub2JqLCBcCisgICAgICAgaW5mdHJlZXMub2JqLCBpbmZmYXN0Lm9iagorCiskIGVvZAorJCB3cml0ZSBvdXQgIkNGTEFHUz0iLCBjY29wdAorJCB3cml0ZSBvdXQgIkxPUFRTPSIsIGxvcHRzCiskIGNvcHkgc3lzJGlucHV0OiBvdXQKKyQgZGVjaworCithbGwgOiBleGFtcGxlLmV4ZSBtaW5pZ3ppcC5leGUgbGliei5vbGIKKyAgICAgICAgQCB3cml0ZSBzeXMkb3V0cHV0ICIgRXhhbXBsZSBhcHBsaWNhdGlvbnMgYXZhaWxhYmxlIgorCitsaWJ6Lm9sYiA6IGxpYnoub2xiKCQoT0JKUykpCisJQCB3cml0ZSBzeXMkb3V0cHV0ICIgbGlieiBhdmFpbGFibGUiCisKK2V4YW1wbGUuZXhlIDogZXhhbXBsZS5vYmogbGliei5vbGIKKyAgICAgICAgICAgICAgbGluayAkKExPUFRTKSBleGFtcGxlLGxpYnoub2xiL2xpYgorCittaW5pZ3ppcC5leGUgOiBtaW5pZ3ppcC5vYmogbGliei5vbGIKKyAgICAgICAgICAgICAgbGluayAkKExPUFRTKSBtaW5pZ3ppcCxsaWJ6Lm9sYi9saWIseDExdm1zOnh2bXN1dGlscy5vbGIvbGliCisKK2NsZWFuIDoKKwlkZWxldGUgKi5vYmo7KixsaWJ6Lm9sYjsqLCoub3B0OyosKi5leGU7KgorCisKKyMgT3RoZXIgZGVwZW5kZW5jaWVzLgorYWRsZXIzMi5vYmogIDogYWRsZXIzMi5jIHp1dGlsLmggemxpYi5oIHpjb25mLmgKK2NvbXByZXNzLm9iaiA6IGNvbXByZXNzLmMgemxpYi5oIHpjb25mLmgKK2NyYzMyLm9iaiAgICA6IGNyYzMyLmMgenV0aWwuaCB6bGliLmggemNvbmYuaAorZGVmbGF0ZS5vYmogIDogZGVmbGF0ZS5jIGRlZmxhdGUuaCB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCitleGFtcGxlLm9iaiAgOiB0ZXN0L2V4YW1wbGUuYyB6bGliLmggemNvbmYuaAorZ3pjbG9zZS5vYmogIDogZ3pjbG9zZS5jIHp1dGlsLmggemxpYi5oIHpjb25mLmgKK2d6bGliLm9iaiAgICA6IGd6bGliLmMgenV0aWwuaCB6bGliLmggemNvbmYuaAorZ3pyZWFkLm9iaiAgIDogZ3pyZWFkLmMgenV0aWwuaCB6bGliLmggemNvbmYuaAorZ3p3cml0ZS5vYmogIDogZ3p3cml0ZS5jIHp1dGlsLmggemxpYi5oIHpjb25mLmgKK2luZmZhc3Qub2JqICA6IGluZmZhc3QuYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZnRyZWVzLmggaW5mZmFzdC5oCitpbmZsYXRlLm9iaiAgOiBpbmZsYXRlLmMgenV0aWwuaCB6bGliLmggemNvbmYuaAoraW5mdHJlZXMub2JqIDogaW5mdHJlZXMuYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZnRyZWVzLmgKK21pbmlnemlwLm9iaiA6IHRlc3QvbWluaWd6aXAuYyB6bGliLmggemNvbmYuaAordHJlZXMub2JqICAgIDogdHJlZXMuYyBkZWZsYXRlLmggenV0aWwuaCB6bGliLmggemNvbmYuaAordW5jb21wci5vYmogIDogdW5jb21wci5jIHpsaWIuaCB6Y29uZi5oCit6dXRpbC5vYmogICAgOiB6dXRpbC5jIHp1dGlsLmggemxpYi5oIHpjb25mLmgKK2luZmJhY2sub2JqICA6IGluZmJhY2suYyB6dXRpbC5oIGluZnRyZWVzLmggaW5mbGF0ZS5oIGluZmZhc3QuaCBpbmZmaXhlZC5oCiskIGVvZAorJCBjbG9zZSBvdXQKKyQgcmV0dXJuCiskIS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCEKKyQhIFJlYWQgbGlzdCBvZiBjb3JlIGxpYnJhcnkgc291cmNlcyBmcm9tIG1ha2VmaWxlLmluIGFuZCBjcmVhdGUgb3B0aW9ucworJCEgbmVlZGVkIHRvIGJ1aWxkIHNoYXJlYWJsZSBpbWFnZQorJCEKKyRDUkVBX09MSVNUOgorJCBvcGVuL3JlYWQgbWluIG1ha2VmaWxlLmluCiskIG9wZW4vd3JpdGUgbW9kIG1vZHVsZXMub3B0CiskIHNyY19jaGVjayA9ICJPQkpDID0iCiskTVJMT09QOgorJCByZWFkL2VuZD1tcmRvbmUgbWluIHJlYworJCBpZiAoZiRleHRyYWN0KDAsNixyZWMpIC5uZXMuIHNyY19jaGVjaykgdGhlbiBnb3RvIG1ybG9vcAorJCByZWMgPSByZWMgLSBzcmNfY2hlY2sKKyQgZ29zdWIgZXh0cmFfZmlsbmFtCiskIGlmIChmJGVsZW1lbnQoMSwiXCIscmVjKSAuZXFzLiAiXCIpIHRoZW4gZ290byBtcmRvbmUKKyRNUlNMT09QOgorJCByZWFkL2VuZD1tcmRvbmUgbWluIHJlYworJCBnb3N1YiBleHRyYV9maWxuYW0KKyQgaWYgKGYkZWxlbWVudCgxLCJcIixyZWMpIC5uZXMuICJcIikgdGhlbiBnb3RvIG1yc2xvb3AKKyRNUkRPTkU6CiskIGNsb3NlIG1pbgorJCBjbG9zZSBtb2QKKyQgcmV0dXJuCiskIS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCEKKyQhIFRha2UgcmVjb3JkIGV4dHJhY3RlZCBpbiBjcmVhX29saXN0IGFuZCBzcGxpdCBpdCBpbnRvIHNpbmdsZSBmaWxlbmFtZXMKKyQhCiskRVhUUkFfRklMTkFNOgorJCBteXJlYyA9IGYkZWRpdChyZWMgLSAiXCIsICJ0cmltLGNvbXByZXNzIikKKyQgaSA9IDAKKyRGRUxPT1A6CiskIHNyY2ZpbCA9IGYkZWxlbWVudChpLCIgIiwgbXlyZWMpCiskIGlmIChzcmNmaWwgLm5lcy4gIiAiKQorJCB0aGVuCiskICAgd3JpdGUgbW9kIGYkcGFyc2Uoc3JjZmlsLCwsIk5BTUUiKSwgIi5vYmoiCiskICAgaSA9IGkgKyAxCiskICAgZ290byBmZWxvb3AKKyQgZW5kaWYKKyQgcmV0dXJuCiskIS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCEKKyQhIEZpbmQgY3VycmVudCBabGliIHZlcnNpb24gbnVtYmVyCiskIQorJEZJTkRfVkVSU0lPTjoKKyQgb3Blbi9yZWFkIGhfaW4gJ3ZfZmlsZScKKyRobG9vcDoKKyQgcmVhZC9lbmQ9aGRvbmUgaF9pbiByZWMKKyQgcmVjID0gZiRlZGl0KHJlYywiVFJJTSIpCiskIGlmIChmJGV4dHJhY3QoMCwxLHJlYykgLm5lcy4gIiMiKSB0aGVuIGdvdG8gaGxvb3AKKyQgcmVjID0gZiRlZGl0KHJlYyAtICIjIiwgIlRSSU0iKQorJCBpZiBmJGVsZW1lbnQoMCwiICIscmVjKSAubmVzLiAiZGVmaW5lIiB0aGVuIGdvdG8gaGxvb3AKKyQgaWYgZiRlbGVtZW50KDEsIiAiLHJlYykgLmVxcy4gdl9zdHJpbmcKKyQgdGhlbgorJCAgIHZlcnNpb24gPSAnZiRlbGVtZW50KDIsIiAiLHJlYyknCiskICAgZ290byBoZG9uZQorJCBlbmRpZgorJCBnb3RvIGhsb29wCiskaGRvbmU6CiskIGNsb3NlIGhfaW4KKyQgcmV0dXJuCiskIS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCEKKyRDSEVDS19DT05GSUc6CiskIQorJCBpbl9sZGVmID0gZiRsb2NhdGUoY2RlZixsaWJkZWZzKQorJCBpZiAoaW5fbGRlZiAubHQuIGYkbGVuZ3RoKGxpYmRlZnMpKQorJCB0aGVuCiskICAgd3JpdGUgYWNvbmYgIiNkZWZpbmUgJydjZGVmJyAxIgorJCAgIGxpYmRlZnMgPSBmJGV4dHJhY3QoMCxpbl9sZGVmLGxpYmRlZnMpICsgLQorICAgICAgICAgICAgICBmJGV4dHJhY3QoaW5fbGRlZiArIGYkbGVuZ3RoKGNkZWYpICsgMSwgLQorICAgICAgICAgICAgICAgICAgICAgICAgZiRsZW5ndGgobGliZGVmcykgLSBpbl9sZGVmIC0gZiRsZW5ndGgoY2RlZikgLSAxLCAtCisgICAgICAgICAgICAgICAgICAgICAgICBsaWJkZWZzKQorJCBlbHNlCiskICAgaWYgKGYkdHlwZSgnY2RlZicpIC5lcXMuICJJTlRFR0VSIikKKyQgICB0aGVuCiskICAgICB3cml0ZSBhY29uZiAiI2RlZmluZSAnJ2NkZWYnICIsICdjZGVmJworJCAgIGVsc2UKKyQgICAgIGlmIChmJHR5cGUoJ2NkZWYnKSAuZXFzLiAiU1RSSU5HIikKKyQgICAgIHRoZW4KKyQgICAgICAgd3JpdGUgYWNvbmYgIiNkZWZpbmUgJydjZGVmJyAiLCAiIiIiLCAnJydjZGVmJycsICIiIiIKKyQgICAgIGVsc2UKKyQgICAgICAgZ29zdWIgY2hlY2tfY2NfZGVmCiskICAgICBlbmRpZgorJCAgIGVuZGlmCiskIGVuZGlmCiskIHJldHVybgorJCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQhCiskISBDaGVjayBpZiB0aGlzIGlzIGEgZGVmaW5lIHJlbGF0aW5nIHRvIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBDL0MrKworJCEgY29tcGlsZXIKKyQhCiskIENIRUNLX0NDX0RFRjoKKyQgaWYgKGNkZWYgLmVxcy4gIl9MQVJHRUZJTEU2NF9TT1VSQ0UiKQorJCB0aGVuCiskICAgY29weSBzeXMkaW5wdXQ6ICd0YycKKyQgICBkZWNrCisjaW5jbHVkZSAidGNvbmZpZyIKKyNkZWZpbmUgX0xBUkdFRklMRQorI2luY2x1ZGUgPHN0ZGlvLmg+CisKK2ludCBtYWluKCl7CitGSUxFICpmcDsKKyAgZnAgPSBmb3BlbigidGVtcC50eHQiLCJyIik7CisgIGZzZWVrbyhmcCwxLFNFRUtfU0VUKTsKKyAgZmNsb3NlKGZwKTsKK30KKworJCAgIGVvZAorJCAgIHRlc3RfaW52ID0gZmFsc2UKKyQgICBjb21tX2ggPSBmYWxzZQorJCAgIGdvc3ViIGNjX3Byb3BfY2hlY2sKKyQgICByZXR1cm4KKyQgZW5kaWYKKyQgd3JpdGUgYWNvbmYgIi8qICIsIGxpbmUsICIgKi8iCiskIHJldHVybgorJCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQhCiskISBDaGVjayBmb3IgcHJvcGVydGllcyBvZiBDL0MrKyBjb21waWxlcgorJCEKKyQhIFZlcnNpb24gaGlzdG9yeQorJCEgMC4wMSAyMDAzMTAyMCBGaXJzdCB2ZXJzaW9uIHRvIHJlY2VpdmUgYSBudW1iZXIKKyQhIDAuMDIgMjAwMzEwMjIgQWRkZWQgbG9naWMgZm9yIGRlZmluZXMgd2l0aCB2YWx1ZQorJCEgMC4wMyAyMDA0MDMwOSBNYWtlIHN1cmUgbG9jYWwgY29uZmlnIGZpbGUgZ2V0cyBub3QgZGVsZXRlZAorJCEgMC4wNCAyMDA0MTIzMCBBbHNvIHdyaXRlIGluY2x1ZGUgZm9yIGNvbmZpZ3VyZSBydW4KKyQhIDAuMDUgMjAwNTAxMDMgQWRkIHByb2Nlc3Npbmcgb2YgImNvbW1lbnQgZGVmaW5lcyIKKyRDQ19QUk9QX0NIRUNLOgorJCBjY19wcm9wID0gdHJ1ZQorJCBpc19uZWVkID0gZmFsc2UKKyQgaXNfbmVlZCA9IChmJGV4dHJhY3QoMCw0LGNkZWYpIC5lcXMuICJORUVEIikgLm9yLiAodGVzdF9pbnYgLmVxLiB0cnVlKQorJCBpZiBmJHNlYXJjaCh0aCkgLmVxcy4gIiIgdGhlbiBjcmVhdGUgJ3RoJworJCBzZXQgbWVzc2FnZS9ub2ZhYy9ub2lkZW50L25vc2V2ZXIvbm90ZXh0CiskIG9uIGVycm9yIHRoZW4gY29udGludWUKKyQgY2MgJ3RtcG5hbScKKyQgaWYgLm5vdC4gKCRzdGF0dXMpICB0aGVuIGNjX3Byb3AgPSBmYWxzZQorJCBvbiBlcnJvciB0aGVuIGNvbnRpbnVlCiskISBUaGUgaGVhZGVycyBtaWdodCBsaWUgYWJvdXQgdGhlIGNhcGFiaWxpdGllcyBvZiB0aGUgUlRMCiskIGxpbmsgJ3RtcG5hbScsdG1wLm9wdC9vcHQKKyQgaWYgLm5vdC4gKCRzdGF0dXMpICB0aGVuIGNjX3Byb3AgPSBmYWxzZQorJCBzZXQgbWVzc2FnZS9mYWMvaWRlbnQvc2V2ZXIvdGV4dAorJCBvbiBlcnJvciB0aGVuIGdvdG8gZXJyX2V4aXQKKyQgZGVsZXRlL25vbG9nICd0bXBuYW0nLio7Ki9leGNsdWRlPSd0aCcKKyQgaWYgKGNjX3Byb3AgLmFuZC4gLm5vdC4gaXNfbmVlZCkgLm9yLiAtCisgICAgICgubm90LiBjY19wcm9wIC5hbmQuIGlzX25lZWQpCiskIHRoZW4KKyQgICB3cml0ZSBzeXMkb3V0cHV0ICJDaGVja2luZyBmb3IgJydjZGVmJy4uLiB5ZXMiCiskICAgaWYgZiR0eXBlKCdjZGVmX3ZhbCdfeWVzKSAubmVzLiAiIgorJCAgIHRoZW4KKyQgICAgIGlmIGYkdHlwZSgnY2RlZl92YWwnX3llcykgLmVxcy4gIklOVEVHRVIiIC0KKyAgICAgICAgIHRoZW4gY2FsbCB3cml0ZV9jb25maWcgZiRmYW8oIiNkZWZpbmUgIUFTICFVTCIsY2RlZiwnY2RlZl92YWwnX3llcykKKyQgICAgIGlmIGYkdHlwZSgnY2RlZl92YWwnX3llcykgLmVxcy4gIlNUUklORyIgLQorICAgICAgICAgdGhlbiBjYWxsIHdyaXRlX2NvbmZpZyBmJGZhbygiI2RlZmluZSAhQVMgIUFTIixjZGVmLCdjZGVmX3ZhbCdfeWVzKQorJCAgIGVsc2UKKyQgICAgIGNhbGwgd3JpdGVfY29uZmlnIGYkZmFvKCIjZGVmaW5lICFBUyAxIixjZGVmKQorJCAgIGVuZGlmCiskICAgaWYgKGNkZWYgLmVxcy4gIkhBVkVfRlNFRUtPIikgLm9yLiAoY2RlZiAuZXFzLiAiX0xBUkdFX0ZJTEVTIikgLm9yLiAtCisgICAgICAgKGNkZWYgLmVxcy4gIl9MQVJHRUZJTEU2NF9TT1VSQ0UiKSB0aGVuIC0KKyAgICAgIGNhbGwgd3JpdGVfY29uZmlnIGYkc3RyaW5nKCIjZGVmaW5lIF9MQVJHRUZJTEUgMSIpCiskIGVsc2UKKyQgICB3cml0ZSBzeXMkb3V0cHV0ICJDaGVja2luZyBmb3IgJydjZGVmJy4uLiBubyIKKyQgICBpZiAoY29tbV9oKQorJCAgIHRoZW4KKyAgICAgIGNhbGwgd3JpdGVfY29uZmlnIGYkZmFvKCIvKiAhQVMgKi8iLGxpbmUpCiskICAgZWxzZQorJCAgICAgaWYgZiR0eXBlKCdjZGVmX3ZhbCdfbm8pIC5uZXMuICIiCiskICAgICB0aGVuCiskICAgICAgIGlmIGYkdHlwZSgnY2RlZl92YWwnX25vKSAuZXFzLiAiSU5URUdFUiIgLQorICAgICAgICAgICB0aGVuIGNhbGwgd3JpdGVfY29uZmlnIGYkZmFvKCIjZGVmaW5lICFBUyAhVUwiLGNkZWYsJ2NkZWZfdmFsJ19ubykKKyQgICAgICAgaWYgZiR0eXBlKCdjZGVmX3ZhbCdfbm8pIC5lcXMuICJTVFJJTkciIC0KKyAgICAgICAgICAgdGhlbiBjYWxsIHdyaXRlX2NvbmZpZyBmJGZhbygiI2RlZmluZSAhQVMgIUFTIixjZGVmLCdjZGVmX3ZhbCdfbm8pCiskICAgICBlbHNlCiskICAgICAgIGNhbGwgd3JpdGVfY29uZmlnIGYkZmFvKCIjdW5kZWYgIUFTIixjZGVmKQorJCAgICAgZW5kaWYKKyQgICBlbmRpZgorJCBlbmRpZgorJCByZXR1cm4KKyQhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIQorJCEgQ2hlY2sgZm9yIHByb3BlcnRpZXMgb2YgQy9DKysgY29tcGlsZXIgd2l0aCBtdWx0aXBsZSByZXN1bHQgdmFsdWVzCiskIQorJCEgVmVyc2lvbiBoaXN0b3J5CiskISAwLjAxIDIwMDQwMTI3IEZpcnN0IHZlcnNpb24KKyQhIDAuMDIgMjAwNTAxMDMgUmVjb25jaWxlIGNoYW5nZXMgZnJvbSBjY19wcm9wIHVwIHRvIHZlcnNpb24gMC4wNQorJENDX01QUk9QX0NIRUNLOgorJCBjY19wcm9wID0gdHJ1ZQorJCBpICAgID0gMQorJCBpZGVsID0gMQorJCBNVF9MT09QOgorJCBpZiBmJHR5cGUocmVzdWx0XydpJykgLmVxcy4gIlNUUklORyIKKyQgdGhlbgorJCAgIHNldCBtZXNzYWdlL25vZmFjL25vaWRlbnQvbm9zZXZlci9ub3RleHQKKyQgICBvbiBlcnJvciB0aGVuIGNvbnRpbnVlCiskICAgY2MgJ3RtcG5hbSdfJ2knCiskICAgaWYgLm5vdC4gKCRzdGF0dXMpICB0aGVuIGNjX3Byb3AgPSBmYWxzZQorJCAgIG9uIGVycm9yIHRoZW4gY29udGludWUKKyQhIFRoZSBoZWFkZXJzIG1pZ2h0IGxpZSBhYm91dCB0aGUgY2FwYWJpbGl0aWVzIG9mIHRoZSBSVEwKKyQgICBsaW5rICd0bXBuYW0nXydpJyx0bXAub3B0L29wdAorJCAgIGlmIC5ub3QuICgkc3RhdHVzKSAgdGhlbiBjY19wcm9wID0gZmFsc2UKKyQgICBzZXQgbWVzc2FnZS9mYWMvaWRlbnQvc2V2ZXIvdGV4dAorJCAgIG9uIGVycm9yIHRoZW4gZ290byBlcnJfZXhpdAorJCAgIGRlbGV0ZS9ub2xvZyAndG1wbmFtJ18naScuKjsqCiskICAgaWYgKGNjX3Byb3ApCiskICAgdGhlbgorJCAgICAgd3JpdGUgc3lzJG91dHB1dCAiQ2hlY2tpbmcgZm9yICcnY2RlZicuLi4gIiwgbWRlZl8naScKKyQgICAgIGlmIGYkdHlwZShtZGVmXydpJykgLmVxcy4gIklOVEVHRVIiIC0KKyAgICAgICAgIHRoZW4gY2FsbCB3cml0ZV9jb25maWcgZiRmYW8oIiNkZWZpbmUgIUFTICFVTCIsY2RlZixtZGVmXydpJykKKyQgICAgIGlmIGYkdHlwZSgnY2RlZl92YWwnX3llcykgLmVxcy4gIlNUUklORyIgLQorICAgICAgICAgdGhlbiBjYWxsIHdyaXRlX2NvbmZpZyBmJGZhbygiI2RlZmluZSAhQVMgIUFTIixjZGVmLG1kZWZfJ2knKQorJCAgICAgZ290byBtc3ltX2NsZWFuCiskICAgZWxzZQorJCAgICAgaSA9IGkgKyAxCiskICAgICBnb3RvIG10X2xvb3AKKyQgICBlbmRpZgorJCBlbmRpZgorJCB3cml0ZSBzeXMkb3V0cHV0ICJDaGVja2luZyBmb3IgJydjZGVmJy4uLiBubyIKKyQgY2FsbCB3cml0ZV9jb25maWcgZiRmYW8oIiN1bmRlZiAhQVMiLGNkZWYpCiskIE1TWU1fQ0xFQU46CiskIGlmIChpZGVsIC5sZS4gbXN5bV9tYXgpCiskIHRoZW4KKyQgICBkZWxldGUvc3ltIG1kZWZfJ2lkZWwnCiskICAgaWRlbCA9IGlkZWwgKyAxCiskICAgZ290byBtc3ltX2NsZWFuCiskIGVuZGlmCiskIHJldHVybgorJCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQhCiskISBBbmFseXplIE9iamVjdCBmaWxlcyBmb3IgT3BlblZNUyBBWFAgdG8gZXh0cmFjdCBQcm9jZWR1cmUgYW5kIERhdGEKKyQhIGluZm9ybWF0aW9uIHRvIGJ1aWxkIGEgc3ltYm9sIHZlY3RvciBmb3IgYSBzaGFyZWFibGUgaW1hZ2UKKyQhIEFsbCB0aGUgImJyYWlucyIgb2YgdGhpcyBsb2dpYyB3YXMgc3VnZ2VzdGVkIGJ5IEhhcnRtdXQgQmVja2VyCiskISAoSGFydG11dC5CZWNrZXJAY29tcGFxLmNvbSkuIEFsbCB0aGUgYnVncyB3ZXJlIGludHJvZHVjZWQgYnkgbWUKKyQhICh6aW5zZXJAemluc2VyLm5vLWlwLmluZm8pLCBzbyBpZiB5b3UgZG8gaGF2ZSBwcm9ibGVtIHJlcG9ydHMgcGxlYXNlIGRvIG5vdAorJCEgYm90aGVyIEhhcnRtdXQvSFAsIGJ1dCBnZXQgaW4gdG91Y2ggd2l0aCBtZQorJCEKKyQhIFZlcnNpb24gaGlzdG9yeQorJCEgMC4wMSAyMDA0MDQwNiBTa2lwIG92ZXIgc2hhcmVhYmxlIGltYWdlcyBpbiBvcHRpb24gZmlsZQorJCEgMC4wMiAyMDA0MTEwOSBGaXggb3B0aW9uIGZpbGUgZm9yIHNoYXJlYWJsZSBpbWFnZXMgd2l0aCBjYXNlX3NlbnNpdGl2ZT1ZRVMKKyQhIDAuMDMgMjAwNTAxMDcgU2tpcCBvdmVyIElkZW50aWZpY2F0aW9uIGxhYmVscyBpbiBvcHRpb24gZmlsZQorJCEgMC4wNCAyMDA2MDExNyBBZGQgdXBwZXJjYXNlIGFsaWFzIHRvIGNvZGUgY29tcGlsZWQgd2l0aCAvbmFtZT1hc19pcworJCEKKyQgQU5BTF9PQkpfQVhQOiBTdWJyb3V0aW5lCiskIFYgPSAnRiRWZXJpZnkoMCkKKyQgU0FZIDo9ICJXUklURV8gU1lTJE9VVFBVVCIKKyQKKyQgSUYgRiRTRUFSQ0goIicnUDEnIikgLkVRUy4gIiIKKyQgVEhFTgorJCAgICBTQVkgIkFOQUxfT0JKX0FYUC1FLU5PU1VDSEZJTEU6ICBFcnJvciwgaW5wdXRmaWxlICcncDEnIG5vdCBhdmFpbGFibGUiCiskICAgIGdvdG8gZXhpdF9hYQorJCBFTkRJRgorJCBJRiAiJydQMiciIC5FUVMuICIiCiskIFRIRU4KKyQgICAgU0FZICJBTkFMX09CSl9BWFA6ICBFcnJvciwgbm8gb3V0cHV0IGZpbGUgcHJvdmlkZWQiCiskICAgIGdvdG8gZXhpdF9hYQorJCBFTkRJRgorJAorJCBvcGVuL3JlYWQgaW4gJ3AxCiskIGNyZWF0ZSBhLnRtcAorJCBvcGVuL2FwcGVuZCBhdG1wIGEudG1wCiskIGxvb3A6CiskIHJlYWQvZW5kPWVuZF9sb29wIGluIGxpbmUKKyQgaWYgZiRsb2NhdGUoIi9TSEFSRSIsZiRlZGl0KGxpbmUsInVwY2FzZSIpKSAubHQuIGYkbGVuZ3RoKGxpbmUpCiskIHRoZW4KKyQgICB3cml0ZSBzeXMkb3V0cHV0ICJBTkFMX1NLUF9TSFItaS1za2lwc2hhcmUsICcnbGluZSciCiskICAgZ290byBsb29wCiskIGVuZGlmCiskIGlmIGYkbG9jYXRlKCJJREVOVElGSUNBVElPTj0iLGYkZWRpdChsaW5lLCJ1cGNhc2UiKSkgLmx0LiBmJGxlbmd0aChsaW5lKQorJCB0aGVuCiskICAgd3JpdGUgc3lzJG91dHB1dCAiQU5BTF9PQkpfQVhQLWktaWRlbnQ6IElkZW50aWZpY2F0aW9uICIsIC0KKyAgICAgICAgICAgICAgICAgICAgIGYkZWxlbWVudCgxLCI9IixsaW5lKQorJCAgIGdvdG8gbG9vcAorJCBlbmRpZgorJCBmPSBmJHNlYXJjaChsaW5lKQorJCBpZiBmIC5lcXMuICIiCiskIHRoZW4KKyQJd3JpdGUgc3lzJG91dHB1dCAiQU5BTF9PQkpfQVhQLXctbm9zdWNoZmlsZSwgJydsaW5lJyIKKyQJZ290byBsb29wCiskIGVuZGlmCiskIGRlZmluZS91c2VyIHN5cyRvdXRwdXQgbmw6CiskIGRlZmluZS91c2VyIHN5cyRlcnJvciBubDoKKyQgYW5hbC9vYmovZ3NkICdmIC9vdXQ9eC50bXAKKyQgb3Blbi9yZWFkIHh0bXAgeC50bXAKKyQgWExPT1A6CiskIHJlYWQvZW5kPWVuZF94bG9vcCB4dG1wIHhsaW5lCiskIHhsaW5lID0gZiRlZGl0KHhsaW5lLCJjb21wcmVzcyIpCiskIHdyaXRlIGF0bXAgeGxpbmUKKyQgZ290byB4bG9vcAorJCBFTkRfWExPT1A6CiskIGNsb3NlIHh0bXAKKyQgZ290byBsb29wCiskIGVuZF9sb29wOgorJCBjbG9zZSBpbgorJCBjbG9zZSBhdG1wCiskIGlmIGYkc2VhcmNoKCJhLnRtcCIpIC5lcXMuICIiIC0KKwl0aGVuICQgZXhpdAorJCAhIGFsbCBnbG9iYWwgZGVmaW5pdGlvbnMKKyQgc2VhcmNoIGEudG1wICJzeW1ib2w6IiwiRUdTWSRWX0RFRiAxIiwiRUdTWSRWX05PUk0gMSIvb3V0PWIudG1wCiskICEgYWxsIHByb2NlZHVyZXMKKyQgc2VhcmNoIGIudG1wICJFR1NZJFZfTk9STSAxIi93aW5kPSgwLDEpIC9vdXQ9Yy50bXAKKyQgc2VhcmNoIGMudG1wICJzeW1ib2w6Ii9vdXQ9ZC50bXAKKyQgZGVmaW5lL3VzZXIgc3lzJG91dHB1dCBubDoKKyQgZWRpdG8vZWR0L2NvbW1hbmQ9c3lzJGlucHV0IGQudG1wCitzdWIvc3ltYm9sOiAiL3N5bWJvbF92ZWN0b3I9KC93aG9sZQorc3ViLyIvPVBST0NFRFVSRSkvd2hvbGUKK2V4aXQKKyQgISBhbGwgZGF0YQorJCBzZWFyY2ggYi50bXAgIkVHU1kkVl9ERUYgMSIvd2luZD0oMCwxKSAvb3V0PWUudG1wCiskIHNlYXJjaCBlLnRtcCAic3ltYm9sOiIvb3V0PWYudG1wCiskIGRlZmluZS91c2VyIHN5cyRvdXRwdXQgbmw6CiskIGVkaXRvL2VkdC9jb21tYW5kPXN5cyRpbnB1dCBmLnRtcAorc3ViL3N5bWJvbDogIi9zeW1ib2xfdmVjdG9yPSgvd2hvbGUKK3N1Yi8iLz1EQVRBKS93aG9sZQorZXhpdAorJCBzb3J0L25vZHVwbCBkLnRtcCxmLnRtcCBnLnRtcAorJCBvcGVuL3JlYWQgcmF3X3ZlY3RvciBnLnRtcAorJCBvcGVuL3dyaXRlIGNhc2VfdmVjdG9yICdwMicKKyQgUkFXTE9PUDoKKyQgcmVhZC9lbmQ9ZW5kX3Jhd2xvb3AgcmF3X3ZlY3RvciByYXdfZWxlbWVudAorJCB3cml0ZSBjYXNlX3ZlY3RvciByYXdfZWxlbWVudAorJCBpZiBmJGxvY2F0ZSgiPVBST0NFRFVSRSkiLHJhd19lbGVtZW50KSAubHQuIGYkbGVuZ3RoKHJhd19lbGVtZW50KQorJCB0aGVuCiskICAgICBuYW1lID0gZiRlbGVtZW50KDEsIj0iLHJhd19lbGVtZW50KSAtICIoIgorJCAgICAgaWYgZiRlZGl0KG5hbWUsIlVQQ0FTRSIpIC5uZXMuIG5hbWUgdGhlbiAtCisgICAgICAgICAgd3JpdGUgY2FzZV92ZWN0b3IgZiRmYW8oIiBzeW1ib2xfdmVjdG9yPSghQVMvIUFTPVBST0NFRFVSRSkiLCAtCisJICAgICAgICAgICAgICAgICAgICAgICAgICBmJGVkaXQobmFtZSwiVVBDQVNFIiksIG5hbWUpCiskIGVuZGlmCiskIGlmIGYkbG9jYXRlKCI9REFUQSkiLHJhd19lbGVtZW50KSAubHQuIGYkbGVuZ3RoKHJhd19lbGVtZW50KQorJCB0aGVuCiskICAgICBuYW1lID0gZiRlbGVtZW50KDEsIj0iLHJhd19lbGVtZW50KSAtICIoIgorJCAgICAgaWYgZiRlZGl0KG5hbWUsIlVQQ0FTRSIpIC5uZXMuIG5hbWUgdGhlbiAtCisgICAgICAgICAgd3JpdGUgY2FzZV92ZWN0b3IgZiRmYW8oIiBzeW1ib2xfdmVjdG9yPSghQVMvIUFTPURBVEEpIiwgLQorCSAgICAgICAgICAgICAgICAgICAgICAgICAgZiRlZGl0KG5hbWUsIlVQQ0FTRSIpLCBuYW1lKQorJCBlbmRpZgorJCBnb3RvIHJhd2xvb3AKKyQgRU5EX1JBV0xPT1A6CiskIGNsb3NlIHJhd192ZWN0b3IKKyQgY2xvc2UgY2FzZV92ZWN0b3IKKyQgZGVsZXRlIGEudG1wOyosYi50bXA7KixjLnRtcDsqLGQudG1wOyosZS50bXA7KixmLnRtcDsqLGcudG1wOyoKKyQgaWYgZiRzZWFyY2goIngudG1wIikgLm5lcy4gIiIgLQorCXRoZW4gJCBkZWxldGUgeC50bXA7KgorJCEKKyQgRVhJVF9BQToKKyQgaWYgViB0aGVuIHNldCB2ZXJpZnkKKyQgZW5kc3Vicm91dGluZQorJCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQhCiskISBXcml0ZSBjb25maWd1cmF0aW9uIHRvIGJvdGggcGVybWFuZW50IGFuZCB0ZW1wb3JhcnkgY29uZmlnIGZpbGUKKyQhCiskISBWZXJzaW9uIGhpc3RvcnkKKyQhIDAuMDEgMjAwMzEwMjkgRmlyc3QgdmVyc2lvbiB0byByZWNlaXZlIGEgbnVtYmVyCiskIQorJFdSSVRFX0NPTkZJRzogU1VCUk9VVElORQorJCAgd3JpdGUgYWNvbmYgJ3AxJworJCAgb3Blbi9hcHBlbmQgY29uZmggJ3RoJworJCAgd3JpdGUgY29uZmggJ3AxJworJCAgY2xvc2UgY29uZmgKKyRFTkRTVUJST1VUSU5FCiskIS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvemxpYi0xLjIuNi9tc2Rvcy9NYWtlZmlsZS5ib3IgYi96bGliLTEuMi42L21zZG9zL01ha2VmaWxlLmJvcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDEyYTJjCi0tLSAvZGV2L251bGwKKysrIGIvemxpYi0xLjIuNi9tc2Rvcy9NYWtlZmlsZS5ib3IKQEAgLTAsMCArMSwxMTUgQEAKKyMgTWFrZWZpbGUgZm9yIHpsaWIKKyMgQm9ybGFuZCBDKysKKyMgTGFzdCB1cGRhdGVkOiAxNS1NYXItMjAwMworCisjIFRvIHVzZSwgZG8gIm1ha2UgLWZtYWtlZmlsZS5ib3IiCisjIFRvIGNvbXBpbGUgaW4gc21hbGwgbW9kZWwsIHNldCBiZWxvdzogTU9ERUw9cworCisjIFdBUk5JTkc6IHRoZSBzbWFsbCBtb2RlbCBpcyBzdXBwb3J0ZWQgYnV0IG9ubHkgZm9yIHNtYWxsIHZhbHVlcyBvZgorIyBNQVhfV0JJVFMgYW5kIE1BWF9NRU1fTEVWRUwuIEZvciBleGFtcGxlOgorIyAgICAtRE1BWF9XQklUUz0xMSAtRERFRl9XQklUUz0xMSAtRE1BWF9NRU1fTEVWRUw9MworIyBJZiB5b3Ugd2lzaCB0byByZWR1Y2UgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMgKGRlZmF1bHQgMjU2SyBmb3IgYmlnCisjIG9iamVjdHMgcGx1cyBhIGZldyBLKSwgeW91IGNhbiBhZGQgdG8gdGhlIExPQyBtYWNybyBiZWxvdzoKKyMgICAtRE1BWF9NRU1fTEVWRUw9NyAtRE1BWF9XQklUUz0xNAorIyBTZWUgemNvbmYuaCBmb3IgZGV0YWlscyBhYm91dCB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cy4KKworIyAtLS0tLS0tLS0tLS0gVHVyYm8gQysrLCBCb3JsYW5kIEMrKyAtLS0tLS0tLS0tLS0KKworIyAgICBPcHRpb25hbCBub25zdGFuZGFyZCBwcmVwcm9jZXNzb3IgZmxhZ3MgKGUuZy4gLURNQVhfTUVNX0xFVkVMPTcpCisjICAgIHNob3VsZCBiZSBhZGRlZCB0byB0aGUgZW52aXJvbm1lbnQgdmlhICJzZXQgTE9DQUxfWkxJQj0tREZPTyIgb3IgYWRkZWQKKyMgICAgdG8gdGhlIGRlY2xhcmF0aW9uIG9mIExPQyBoZXJlOgorTE9DID0gJChMT0NBTF9aTElCKQorCisjIHR5cGUgZm9yIENQVSByZXF1aXJlZDogMDogODA4NiwgMTogODAxODYsIDI6IDgwMjg2LCAzOiA4MDM4NiwgZXRjLgorQ1BVX1RZUCA9IDAKKworIyBtZW1vcnkgbW9kZWw6IG9uZSBvZiBzLCBtLCBjLCBsIChzbWFsbCwgbWVkaXVtLCBjb21wYWN0LCBsYXJnZSkKK01PREVMPWwKKworIyByZXBsYWNlIGJjYyB3aXRoIHRjYyBmb3IgVHVyYm8gQysrIDEuMCwgd2l0aCBiY2MzMiBmb3IgdGhlIDMyIGJpdCB2ZXJzaW9uCitDQz1iY2MKK0xEPWJjYworQVI9dGxpYgorCisjIGNvbXBpbGVyIGZsYWdzCisjIHJlcGxhY2UgIi1PMiIgYnkgIi1PIC1HIC1hIC1kIiBmb3IgVHVyYm8gQysrIDEuMAorQ0ZMQUdTPS1PMiAtWiAtbSQoTU9ERUwpICQoTE9DKQorCitMREZMQUdTPS1tJChNT0RFTCkgLWYtCisKKworIyB2YXJpYWJsZXMKK1pMSUJfTElCID0gemxpYl8kKE1PREVMKS5saWIKKworT0JKMSA9IGFkbGVyMzIub2JqIGNvbXByZXNzLm9iaiBjcmMzMi5vYmogZGVmbGF0ZS5vYmogZ3pjbG9zZS5vYmogZ3psaWIub2JqIGd6cmVhZC5vYmoKK09CSjIgPSBnendyaXRlLm9iaiBpbmZiYWNrLm9iaiBpbmZmYXN0Lm9iaiBpbmZsYXRlLm9iaiBpbmZ0cmVlcy5vYmogdHJlZXMub2JqIHVuY29tcHIub2JqIHp1dGlsLm9iagorT0JKUDEgPSArYWRsZXIzMi5vYmorY29tcHJlc3Mub2JqK2NyYzMyLm9iaitkZWZsYXRlLm9iaitnemNsb3NlLm9iaitnemxpYi5vYmorZ3pyZWFkLm9iagorT0JKUDIgPSArZ3p3cml0ZS5vYmoraW5mYmFjay5vYmoraW5mZmFzdC5vYmoraW5mbGF0ZS5vYmoraW5mdHJlZXMub2JqK3RyZWVzLm9iait1bmNvbXByLm9iait6dXRpbC5vYmoKKworCisjIHRhcmdldHMKK2FsbDogJChaTElCX0xJQikgZXhhbXBsZS5leGUgbWluaWd6aXAuZXhlCisKKy5jLm9iajoKKwkkKENDKSAtYyAkKENGTEFHUykgJCouYworCithZGxlcjMyLm9iajogYWRsZXIzMi5jIHpsaWIuaCB6Y29uZi5oCisKK2NvbXByZXNzLm9iajogY29tcHJlc3MuYyB6bGliLmggemNvbmYuaAorCitjcmMzMi5vYmo6IGNyYzMyLmMgemxpYi5oIHpjb25mLmggY3JjMzIuaAorCitkZWZsYXRlLm9iajogZGVmbGF0ZS5jIGRlZmxhdGUuaCB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCisKK2d6Y2xvc2Uub2JqOiBnemNsb3NlLmMgemxpYi5oIHpjb25mLmggZ3pndXRzLmgKKworZ3psaWIub2JqOiBnemxpYi5jIHpsaWIuaCB6Y29uZi5oIGd6Z3V0cy5oCisKK2d6cmVhZC5vYmo6IGd6cmVhZC5jIHpsaWIuaCB6Y29uZi5oIGd6Z3V0cy5oCisKK2d6d3JpdGUub2JqOiBnendyaXRlLmMgemxpYi5oIHpjb25mLmggZ3pndXRzLmgKKworaW5mYmFjay5vYmo6IGluZmJhY2suYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZnRyZWVzLmggaW5mbGF0ZS5oIFwKKyBpbmZmYXN0LmggaW5mZml4ZWQuaAorCitpbmZmYXN0Lm9iajogaW5mZmFzdC5jIHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mdHJlZXMuaCBpbmZsYXRlLmggXAorIGluZmZhc3QuaAorCitpbmZsYXRlLm9iajogaW5mbGF0ZS5jIHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mdHJlZXMuaCBpbmZsYXRlLmggXAorIGluZmZhc3QuaCBpbmZmaXhlZC5oCisKK2luZnRyZWVzLm9iajogaW5mdHJlZXMuYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZnRyZWVzLmgKKwordHJlZXMub2JqOiB0cmVlcy5jIHp1dGlsLmggemxpYi5oIHpjb25mLmggZGVmbGF0ZS5oIHRyZWVzLmgKKwordW5jb21wci5vYmo6IHVuY29tcHIuYyB6bGliLmggemNvbmYuaAorCit6dXRpbC5vYmo6IHp1dGlsLmMgenV0aWwuaCB6bGliLmggemNvbmYuaAorCitleGFtcGxlLm9iajogdGVzdC9leGFtcGxlLmMgemxpYi5oIHpjb25mLmgKKworbWluaWd6aXAub2JqOiB0ZXN0L21pbmlnemlwLmMgemxpYi5oIHpjb25mLmgKKworCisjIHRoZSBjb21tYW5kIGxpbmUgaXMgY3V0IHRvIGZpdCBpbiB0aGUgTVMtRE9TIDEyOCBieXRlIGxpbWl0OgorJChaTElCX0xJQik6ICQoT0JKMSkgJChPQkoyKQorCS1kZWwgJChaTElCX0xJQikKKwkkKEFSKSAkKFpMSUJfTElCKSAkKE9CSlAxKQorCSQoQVIpICQoWkxJQl9MSUIpICQoT0JKUDIpCisKK2V4YW1wbGUuZXhlOiBleGFtcGxlLm9iaiAkKFpMSUJfTElCKQorCSQoTEQpICQoTERGTEFHUykgZXhhbXBsZS5vYmogJChaTElCX0xJQikKKworbWluaWd6aXAuZXhlOiBtaW5pZ3ppcC5vYmogJChaTElCX0xJQikKKwkkKExEKSAkKExERkxBR1MpIG1pbmlnemlwLm9iaiAkKFpMSUJfTElCKQorCit0ZXN0OiBleGFtcGxlLmV4ZSBtaW5pZ3ppcC5leGUKKwlleGFtcGxlCisJZWNobyBoZWxsbyB3b3JsZCB8IG1pbmlnemlwIHwgbWluaWd6aXAgLWQKKworY2xlYW46CisJLWRlbCAqLm9iagorCS1kZWwgKi5saWIKKwktZGVsICouZXhlCisJLWRlbCB6bGliXyouYmFrCisJLWRlbCBmb28uZ3oKZGlmZiAtLWdpdCBhL3psaWItMS4yLjYvbXNkb3MvTWFrZWZpbGUuZGoyIGIvemxpYi0xLjIuNi9tc2Rvcy9NYWtlZmlsZS5kajIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjliMDM5NQotLS0gL2Rldi9udWxsCisrKyBiL3psaWItMS4yLjYvbXNkb3MvTWFrZWZpbGUuZGoyCkBAIC0wLDAgKzEsMTA0IEBACisjIE1ha2VmaWxlIGZvciB6bGliLiAgTW9kaWZpZWQgZm9yIGRqZ3BwIHYyLjAgYnkgRi4gSi4gRG9uYWhvZSwgMy8xNS85Ni4KKyMgQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggSmVhbi1sb3VwIEdhaWxseS4KKyMgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAorCisjIFRvIGNvbXBpbGUsIG9yIHRvIGNvbXBpbGUgYW5kIHRlc3QsIHR5cGU6CisjCisjICAgbWFrZSAtZm1ha2VmaWxlLmRqMjsgIG1ha2UgdGVzdCAtZm1ha2VmaWxlLmRqMgorIworIyBUbyBpbnN0YWxsIGxpYnouYSwgemNvbmYuaCBhbmQgemxpYi5oIGluIHRoZSBkamdwcCBkaXJlY3RvcmllcywgdHlwZToKKyMKKyMgICAgbWFrZSBpbnN0YWxsIC1mbWFrZWZpbGUuZGoyCisjCisjIGFmdGVyIGZpcnN0IGRlZmluaW5nIExJQlJBUllfUEFUSCBhbmQgSU5DTFVERV9QQVRIIGluIGRqZ3BwLmVudiBhcworIyBpbiB0aGUgc2FtcGxlIGJlbG93IGlmIHRoZSBwYXR0ZXJuIG9mIHRoZSBESkdQUCBkaXN0cmlidXRpb24gaXMgdG8KKyMgYmUgZm9sbG93ZWQuICBSZW1lbWJlciB0aGF0LCB3aGlsZSA8c3A+J2VzIGFyb3VuZCA8PT4gYXJlIGlnbm9yZWQgaW4KKyMgbWFrZWZpbGVzLCB0aGV5IGFyZSAqbm90KiBpbiBiYXRjaCBmaWxlcyBvciBpbiBkamdwcC5lbnYuCisjIC0gLSAtIC0gLQorIyBbbWFrZV0KKyMgSU5DTFVERV9QQVRIPSVcPjtJTkNMVURFX1BBVEglJVxESkRJUiVcaW5jbHVkZQorIyBMSUJSQVJZX1BBVEg9JVw+O0xJQlJBUllfUEFUSCUlXERKRElSJVxsaWIKKyMgQlVUVD0tbTQ4NgorIyAtIC0gLSAtIC0KKyMgQWx0ZXJuYXRlbHksIHRoZXNlIHZhcmlhYmxlcyBtYXkgYmUgZGVmaW5lZCBiZWxvdywgb3ZlcnJpZGluZyB0aGUgdmFsdWVzCisjIGluIGRqZ3BwLmVudiwgYXMKKyMgSU5DTFVERV9QQVRIPWM6XHVzclxpbmNsdWRlCisjIExJQlJBUllfUEFUSD1jOlx1c3JcbGliCisKK0NDPWdjYworCisjQ0ZMQUdTPS1NTUQgLU8KKyNDRkxBR1M9LU8gLURNQVhfV0JJVFM9MTQgLURNQVhfTUVNX0xFVkVMPTcKKyNDRkxBR1M9LU1NRCAtZyAtRERFQlVHCitDRkxBR1M9LU1NRCAtTzMgJChCVVRUKSAtV2FsbCAtV3dyaXRlLXN0cmluZ3MgLVdwb2ludGVyLWFyaXRoIC1XY29udmVyc2lvbiBcCisgICAgICAgICAgICAgLVdzdHJpY3QtcHJvdG90eXBlcyAtV21pc3NpbmctcHJvdG90eXBlcworCisjIElmIGNwLmV4ZSBpcyBhdmFpbGFibGUsIHJlcGxhY2UgImNvcHkgL1kiIHdpdGggImNwIC1mcCIgLgorQ1A9Y29weSAvWQorIyBJZiBnbnUgaW5zdGFsbC5leGUgaXMgYXZhaWxhYmxlLCByZXBsYWNlICQoQ1ApIHdpdGggZ2luc3RhbGwuCitJTlNUQUxMPSQoQ1ApCisjIFRoZSBkZWZhdWx0IHZhbHVlIG9mIFJNIGlzICJybSAtZi4iICBJZiAicm0uZXhlIiBpcyBmb3VuZCwgY29tbWVudCBvdXQ6CitSTT1kZWwKK0xETElCUz0tTC4gLWx6CitMRD0kKENDKSAtcyAtbworTERTSEFSRUQ9JChDQykKKworSU5DTD16bGliLmggemNvbmYuaAorTElCUz1saWJ6LmEKKworQVI9YXIgcmNzCisKK3ByZWZpeD0vdXNyL2xvY2FsCitleGVjX3ByZWZpeCA9ICQocHJlZml4KQorCitPQkpTID0gYWRsZXIzMi5vIGNvbXByZXNzLm8gY3JjMzIubyBnemNsb3NlLm8gZ3psaWIubyBnenJlYWQubyBnendyaXRlLm8gXAorICAgICAgIHVuY29tcHIubyBkZWZsYXRlLm8gdHJlZXMubyB6dXRpbC5vIGluZmxhdGUubyBpbmZiYWNrLm8gaW5mdHJlZXMubyBpbmZmYXN0Lm8KKworT0JKQSA9CisjIHRvIHVzZSB0aGUgYXNtIGNvZGU6IG1ha2UgT0JKQT1tYXRjaC5vCisKK1RFU1RfT0JKUyA9IGV4YW1wbGUubyBtaW5pZ3ppcC5vCisKK2FsbDogZXhhbXBsZS5leGUgbWluaWd6aXAuZXhlCisKK2NoZWNrOiB0ZXN0Cit0ZXN0OiBhbGwKKwkuL2V4YW1wbGUKKwllY2hvIGhlbGxvIHdvcmxkIHwgLlxtaW5pZ3ppcCB8IC5cbWluaWd6aXAgLWQKKworJS5vIDogJS5jCisJJChDQykgJChDRkxBR1MpIC1jICQ8IC1vICRACisKK2xpYnouYTogJChPQkpTKSAkKE9CSkEpCisJJChBUikgJEAgJChPQkpTKSAkKE9CSkEpCisKKyUuZXhlIDogJS5vICQoTElCUykKKwkkKExEKSAkQCAkPCAkKExETElCUykKKworIyBJTkNMVURFX1BBVEggYW5kIExJQlJBUllfUEFUSCB3ZXJlIHNldCBmb3IgW21ha2VdIGluIGRqZ3BwLmVudiAuCisKKy5QSE9OWSA6IHVuaW5zdGFsbCBjbGVhbgorCitpbnN0YWxsOiAkKElOQ0wpICQoTElCUykKKwktQGlmIG5vdCBleGlzdCAkKElOQ0xVREVfUEFUSClcbnVsIG1rZGlyICQoSU5DTFVERV9QQVRIKQorCS1AaWYgbm90IGV4aXN0ICQoTElCUkFSWV9QQVRIKVxudWwgbWtkaXIgJChMSUJSQVJZX1BBVEgpCisJJChJTlNUQUxMKSB6bGliLmggJChJTkNMVURFX1BBVEgpCisJJChJTlNUQUxMKSB6Y29uZi5oICQoSU5DTFVERV9QQVRIKQorCSQoSU5TVEFMTCkgbGliei5hICQoTElCUkFSWV9QQVRIKQorCit1bmluc3RhbGw6CisJJChSTSkgJChJTkNMVURFX1BBVEgpXHpsaWIuaAorCSQoUk0pICQoSU5DTFVERV9QQVRIKVx6Y29uZi5oCisJJChSTSkgJChMSUJSQVJZX1BBVEgpXGxpYnouYQorCitjbGVhbjoKKwkkKFJNKSAqLmQKKwkkKFJNKSAqLm8KKwkkKFJNKSAqLmV4ZQorCSQoUk0pIGxpYnouYQorCSQoUk0pIGZvby5negorCitERVBTIDo9ICQod2lsZGNhcmQgKi5kKQoraWZuZXEgKCQoREVQUyksKQoraW5jbHVkZSAkKERFUFMpCitlbmRpZgpkaWZmIC0tZ2l0IGEvemxpYi0xLjIuNi9tc2Rvcy9NYWtlZmlsZS5lbXggYi96bGliLTEuMi42L21zZG9zL01ha2VmaWxlLmVteApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzFiNTdhCi0tLSAvZGV2L251bGwKKysrIGIvemxpYi0xLjIuNi9tc2Rvcy9NYWtlZmlsZS5lbXgKQEAgLTAsMCArMSw2OSBAQAorIyBNYWtlZmlsZSBmb3IgemxpYi4gIE1vZGlmaWVkIGZvciBlbXggMC45YyBieSBDaHIuIFNwaWVsZXIsIDYvMTcvOTguCisjIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEplYW4tbG91cCBHYWlsbHkuCisjIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKKworIyBUbyBjb21waWxlLCBvciB0byBjb21waWxlIGFuZCB0ZXN0LCB0eXBlOgorIworIyAgIG1ha2UgLWZtYWtlZmlsZS5lbXg7ICBtYWtlIHRlc3QgLWZtYWtlZmlsZS5lbXgKKyMKKworQ0M9Z2NjCisKKyNDRkxBR1M9LU1NRCAtTworI0NGTEFHUz0tTyAtRE1BWF9XQklUUz0xNCAtRE1BWF9NRU1fTEVWRUw9NworI0NGTEFHUz0tTU1EIC1nIC1EREVCVUcKK0NGTEFHUz0tTU1EIC1PMyAkKEJVVFQpIC1XYWxsIC1Xd3JpdGUtc3RyaW5ncyAtV3BvaW50ZXItYXJpdGggLVdjb252ZXJzaW9uIFwKKyAgICAgICAgICAgICAtV3N0cmljdC1wcm90b3R5cGVzIC1XbWlzc2luZy1wcm90b3R5cGVzCisKKyMgSWYgY3AuZXhlIGlzIGF2YWlsYWJsZSwgcmVwbGFjZSAiY29weSAvWSIgd2l0aCAiY3AgLWZwIiAuCitDUD1jb3B5IC9ZCisjIElmIGdudSBpbnN0YWxsLmV4ZSBpcyBhdmFpbGFibGUsIHJlcGxhY2UgJChDUCkgd2l0aCBnaW5zdGFsbC4KK0lOU1RBTEw9JChDUCkKKyMgVGhlIGRlZmF1bHQgdmFsdWUgb2YgUk0gaXMgInJtIC1mLiIgIElmICJybS5leGUiIGlzIGZvdW5kLCBjb21tZW50IG91dDoKK1JNPWRlbAorTERMSUJTPS1MLiAtbHpsaWIKK0xEPSQoQ0MpIC1zIC1vCitMRFNIQVJFRD0kKENDKQorCitJTkNMPXpsaWIuaCB6Y29uZi5oCitMSUJTPXpsaWIuYQorCitBUj1hciByY3MKKworcHJlZml4PS91c3IvbG9jYWwKK2V4ZWNfcHJlZml4ID0gJChwcmVmaXgpCisKK09CSlMgPSBhZGxlcjMyLm8gY29tcHJlc3MubyBjcmMzMi5vIGd6Y2xvc2UubyBnemxpYi5vIGd6cmVhZC5vIGd6d3JpdGUubyBcCisgICAgICAgdW5jb21wci5vIGRlZmxhdGUubyB0cmVlcy5vIHp1dGlsLm8gaW5mbGF0ZS5vIGluZmJhY2subyBpbmZ0cmVlcy5vIGluZmZhc3QubworCitURVNUX09CSlMgPSBleGFtcGxlLm8gbWluaWd6aXAubworCithbGw6IGV4YW1wbGUuZXhlIG1pbmlnemlwLmV4ZQorCit0ZXN0OiBhbGwKKwkuL2V4YW1wbGUKKwllY2hvIGhlbGxvIHdvcmxkIHwgLlxtaW5pZ3ppcCB8IC5cbWluaWd6aXAgLWQKKworJS5vIDogJS5jCisJJChDQykgJChDRkxBR1MpIC1jICQ8IC1vICRACisKK3psaWIuYTogJChPQkpTKQorCSQoQVIpICRAICQoT0JKUykKKworJS5leGUgOiAlLm8gJChMSUJTKQorCSQoTEQpICRAICQ8ICQoTERMSUJTKQorCisKKy5QSE9OWSA6IGNsZWFuCisKK2NsZWFuOgorCSQoUk0pICouZAorCSQoUk0pICoubworCSQoUk0pICouZXhlCisJJChSTSkgemxpYi5hCisJJChSTSkgZm9vLmd6CisKK0RFUFMgOj0gJCh3aWxkY2FyZCAqLmQpCitpZm5lcSAoJChERVBTKSwpCitpbmNsdWRlICQoREVQUykKK2VuZGlmCmRpZmYgLS1naXQgYS96bGliLTEuMi42L21zZG9zL01ha2VmaWxlLm1zYyBiL3psaWItMS4yLjYvbXNkb3MvTWFrZWZpbGUubXNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlODM3ODYKLS0tIC9kZXYvbnVsbAorKysgYi96bGliLTEuMi42L21zZG9zL01ha2VmaWxlLm1zYwpAQCAtMCwwICsxLDExMiBAQAorIyBNYWtlZmlsZSBmb3IgemxpYgorIyBNaWNyb3NvZnQgQyA1LjEgb3IgbGF0ZXIKKyMgTGFzdCB1cGRhdGVkOiAxOS1NYXItMjAwMworCisjIFRvIHVzZSwgZG8gIm1ha2UgbWFrZWZpbGUubXNjIgorIyBUbyBjb21waWxlIGluIHNtYWxsIG1vZGVsLCBzZXQgYmVsb3c6IE1PREVMPVMKKworIyBJZiB5b3Ugd2lzaCB0byByZWR1Y2UgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMgKGRlZmF1bHQgMjU2SyBmb3IgYmlnCisjIG9iamVjdHMgcGx1cyBhIGZldyBLKSwgeW91IGNhbiBhZGQgdG8gdGhlIExPQyBtYWNybyBiZWxvdzoKKyMgICAtRE1BWF9NRU1fTEVWRUw9NyAtRE1BWF9XQklUUz0xNAorIyBTZWUgemNvbmYuaCBmb3IgZGV0YWlscyBhYm91dCB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cy4KKworIyAtLS0tLS0tLS0tLS0tIE1pY3Jvc29mdCBDIDUuMSBhbmQgbGF0ZXIgLS0tLS0tLS0tLS0tLQorCisjICAgIE9wdGlvbmFsIG5vbnN0YW5kYXJkIHByZXByb2Nlc3NvciBmbGFncyAoZS5nLiAtRE1BWF9NRU1fTEVWRUw9NykKKyMgICAgc2hvdWxkIGJlIGFkZGVkIHRvIHRoZSBlbnZpcm9ubWVudCB2aWEgInNldCBMT0NBTF9aTElCPS1ERk9PIiBvciBhZGRlZAorIyAgICB0byB0aGUgZGVjbGFyYXRpb24gb2YgTE9DIGhlcmU6CitMT0MgPSAkKExPQ0FMX1pMSUIpCisKKyMgVHlwZSBmb3IgQ1BVIHJlcXVpcmVkOiAwOiA4MDg2LCAxOiA4MDE4NiwgMjogODAyODYsIDM6IDgwMzg2LCBldGMuCitDUFVfVFlQID0gMAorCisjIE1lbW9yeSBtb2RlbDogb25lIG9mIFMsIE0sIEMsIEwgKHNtYWxsLCBtZWRpdW0sIGNvbXBhY3QsIGxhcmdlKQorTU9ERUw9TAorCitDQz1jbAorQ0ZMQUdTPS1ub2xvZ28gLUEkKE1PREVMKSAtRyQoQ1BVX1RZUCkgLVczIC1PYWl0IC1HcyAkKExPQykKKyMtT3ggZ2VuZXJhdGVzIGJhZCBjb2RlIHdpdGggTVNDIDUuMQorTElCX0NGTEFHUz0tWmwgJChDRkxBR1MpCisKK0xEPWxpbmsKK0xERkxBR1M9L25vaS9lL3N0OjB4MTUwMC9ub2UvZmFyY2FsbC9wYWNrY29kZQorIyAiL2ZhcmNhbGwvcGFja2NvZGUiIGFyZSBvbmx5IHVzZWZ1bCBmb3IgYGxhcmdlIGNvZGUnIG1lbW9yeSBtb2RlbHMKKyMgYnV0IHNob3VsZCBiZSBhICJuby1vcCIgZm9yIHNtYWxsIGNvZGUgbW9kZWxzLgorCisKKyMgdmFyaWFibGVzCitaTElCX0xJQiA9IHpsaWJfJChNT0RFTCkubGliCisKK09CSjEgPSBhZGxlcjMyLm9iaiBjb21wcmVzcy5vYmogY3JjMzIub2JqIGRlZmxhdGUub2JqIGd6Y2xvc2Uub2JqIGd6bGliLm9iaiBnenJlYWQub2JqCitPQkoyID0gZ3p3cml0ZS5vYmogaW5mYmFjay5vYmogaW5mZmFzdC5vYmogaW5mbGF0ZS5vYmogaW5mdHJlZXMub2JqIHRyZWVzLm9iaiB1bmNvbXByLm9iaiB6dXRpbC5vYmoKKworCisjIHRhcmdldHMKK2FsbDogICQoWkxJQl9MSUIpIGV4YW1wbGUuZXhlIG1pbmlnemlwLmV4ZQorCisuYy5vYmo6CisJJChDQykgLWMgJChMSUJfQ0ZMQUdTKSAkKi5jCisKK2FkbGVyMzIub2JqOiBhZGxlcjMyLmMgemxpYi5oIHpjb25mLmgKKworY29tcHJlc3Mub2JqOiBjb21wcmVzcy5jIHpsaWIuaCB6Y29uZi5oCisKK2NyYzMyLm9iajogY3JjMzIuYyB6bGliLmggemNvbmYuaCBjcmMzMi5oCisKK2RlZmxhdGUub2JqOiBkZWZsYXRlLmMgZGVmbGF0ZS5oIHp1dGlsLmggemxpYi5oIHpjb25mLmgKKworZ3pjbG9zZS5vYmo6IGd6Y2xvc2UuYyB6bGliLmggemNvbmYuaCBnemd1dHMuaAorCitnemxpYi5vYmo6IGd6bGliLmMgemxpYi5oIHpjb25mLmggZ3pndXRzLmgKKworZ3pyZWFkLm9iajogZ3pyZWFkLmMgemxpYi5oIHpjb25mLmggZ3pndXRzLmgKKworZ3p3cml0ZS5vYmo6IGd6d3JpdGUuYyB6bGliLmggemNvbmYuaCBnemd1dHMuaAorCitpbmZiYWNrLm9iajogaW5mYmFjay5jIHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mdHJlZXMuaCBpbmZsYXRlLmggXAorIGluZmZhc3QuaCBpbmZmaXhlZC5oCisKK2luZmZhc3Qub2JqOiBpbmZmYXN0LmMgenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZ0cmVlcy5oIGluZmxhdGUuaCBcCisgaW5mZmFzdC5oCisKK2luZmxhdGUub2JqOiBpbmZsYXRlLmMgenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZ0cmVlcy5oIGluZmxhdGUuaCBcCisgaW5mZmFzdC5oIGluZmZpeGVkLmgKKworaW5mdHJlZXMub2JqOiBpbmZ0cmVlcy5jIHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mdHJlZXMuaAorCit0cmVlcy5vYmo6IHRyZWVzLmMgenV0aWwuaCB6bGliLmggemNvbmYuaCBkZWZsYXRlLmggdHJlZXMuaAorCit1bmNvbXByLm9iajogdW5jb21wci5jIHpsaWIuaCB6Y29uZi5oCisKK3p1dGlsLm9iajogenV0aWwuYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCisKK2V4YW1wbGUub2JqOiB0ZXN0L2V4YW1wbGUuYyB6bGliLmggemNvbmYuaAorCSQoQ0MpIC1jICQoQ0ZMQUdTKSAkKi5jCisKK21pbmlnemlwLm9iajogdGVzdC9taW5pZ3ppcC5jIHpsaWIuaCB6Y29uZi5oCisJJChDQykgLWMgJChDRkxBR1MpICQqLmMKKworCisjIHRoZSBjb21tYW5kIGxpbmUgaXMgY3V0IHRvIGZpdCBpbiB0aGUgTVMtRE9TIDEyOCBieXRlIGxpbWl0OgorJChaTElCX0xJQik6ICQoT0JKMSkgJChPQkoyKQorCWlmIGV4aXN0ICQoWkxJQl9MSUIpIGRlbCAkKFpMSUJfTElCKQorCWxpYiAkKFpMSUJfTElCKSAkKE9CSjEpOworCWxpYiAkKFpMSUJfTElCKSAkKE9CSjIpOworCitleGFtcGxlLmV4ZTogZXhhbXBsZS5vYmogJChaTElCX0xJQikKKwkkKExEKSAkKExERkxBR1MpIGV4YW1wbGUub2JqLCwsJChaTElCX0xJQik7CisKK21pbmlnemlwLmV4ZTogbWluaWd6aXAub2JqICQoWkxJQl9MSUIpCisJJChMRCkgJChMREZMQUdTKSBtaW5pZ3ppcC5vYmosLCwkKFpMSUJfTElCKTsKKwordGVzdDogZXhhbXBsZS5leGUgbWluaWd6aXAuZXhlCisJZXhhbXBsZQorCWVjaG8gaGVsbG8gd29ybGQgfCBtaW5pZ3ppcCB8IG1pbmlnemlwIC1kCisKK2NsZWFuOgorCS1kZWwgKi5vYmoKKwktZGVsICoubGliCisJLWRlbCAqLmV4ZQorCS1kZWwgKi5tYXAKKwktZGVsIHpsaWJfKi5iYWsKKwktZGVsIGZvby5negpkaWZmIC0tZ2l0IGEvemxpYi0xLjIuNi9tc2Rvcy9NYWtlZmlsZS50YyBiL3psaWItMS4yLjYvbXNkb3MvTWFrZWZpbGUudGMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFlYzgyYQotLS0gL2Rldi9udWxsCisrKyBiL3psaWItMS4yLjYvbXNkb3MvTWFrZWZpbGUudGMKQEAgLTAsMCArMSwxMDAgQEAKKyMgTWFrZWZpbGUgZm9yIHpsaWIKKyMgVHVyYm8gQyAyLjAxLCBUdXJibyBDKysgMS4wMQorIyBMYXN0IHVwZGF0ZWQ6IDE1LU1hci0yMDAzCisKKyMgVG8gdXNlLCBkbyAibWFrZSAtZm1ha2VmaWxlLnRjIgorIyBUbyBjb21waWxlIGluIHNtYWxsIG1vZGVsLCBzZXQgYmVsb3c6IE1PREVMPXMKKworIyBXQVJOSU5HOiB0aGUgc21hbGwgbW9kZWwgaXMgc3VwcG9ydGVkIGJ1dCBvbmx5IGZvciBzbWFsbCB2YWx1ZXMgb2YKKyMgTUFYX1dCSVRTIGFuZCBNQVhfTUVNX0xFVkVMLiBGb3IgZXhhbXBsZToKKyMgICAgLURNQVhfV0JJVFM9MTEgLURNQVhfTUVNX0xFVkVMPTMKKyMgSWYgeW91IHdpc2ggdG8gcmVkdWNlIHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzIChkZWZhdWx0IDI1NksgZm9yIGJpZworIyBvYmplY3RzIHBsdXMgYSBmZXcgSyksIHlvdSBjYW4gYWRkIHRvIENGTEFHUyBiZWxvdzoKKyMgICAtRE1BWF9NRU1fTEVWRUw9NyAtRE1BWF9XQklUUz0xNAorIyBTZWUgemNvbmYuaCBmb3IgZGV0YWlscyBhYm91dCB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cy4KKworIyAtLS0tLS0tLS0tLS0gVHVyYm8gQyAyLjAxLCBUdXJibyBDKysgMS4wMSAtLS0tLS0tLS0tLS0KK01PREVMPWwKK0NDPXRjYworTEQ9dGNjCitBUj10bGliCisjIENGTEFHUz0tTzIgLUcgLVogLW0kKE1PREVMKSAtRE1BWF9XQklUUz0xMSAtRE1BWF9NRU1fTEVWRUw9MworQ0ZMQUdTPS1PMiAtRyAtWiAtbSQoTU9ERUwpCitMREZMQUdTPS1tJChNT0RFTCkgLWYtCisKKworIyB2YXJpYWJsZXMKK1pMSUJfTElCID0gemxpYl8kKE1PREVMKS5saWIKKworT0JKMSA9IGFkbGVyMzIub2JqIGNvbXByZXNzLm9iaiBjcmMzMi5vYmogZGVmbGF0ZS5vYmogZ3pjbG9zZS5vYmogZ3psaWIub2JqIGd6cmVhZC5vYmoKK09CSjIgPSBnendyaXRlLm9iaiBpbmZiYWNrLm9iaiBpbmZmYXN0Lm9iaiBpbmZsYXRlLm9iaiBpbmZ0cmVlcy5vYmogdHJlZXMub2JqIHVuY29tcHIub2JqIHp1dGlsLm9iagorT0JKUDEgPSArYWRsZXIzMi5vYmorY29tcHJlc3Mub2JqK2NyYzMyLm9iaitkZWZsYXRlLm9iaitnemNsb3NlLm9iaitnemxpYi5vYmorZ3pyZWFkLm9iagorT0JKUDIgPSArZ3p3cml0ZS5vYmoraW5mYmFjay5vYmoraW5mZmFzdC5vYmoraW5mbGF0ZS5vYmoraW5mdHJlZXMub2JqK3RyZWVzLm9iait1bmNvbXByLm9iait6dXRpbC5vYmoKKworCisjIHRhcmdldHMKK2FsbDogJChaTElCX0xJQikgZXhhbXBsZS5leGUgbWluaWd6aXAuZXhlCisKKy5jLm9iajoKKwkkKENDKSAtYyAkKENGTEFHUykgJCouYworCithZGxlcjMyLm9iajogYWRsZXIzMi5jIHpsaWIuaCB6Y29uZi5oCisKK2NvbXByZXNzLm9iajogY29tcHJlc3MuYyB6bGliLmggemNvbmYuaAorCitjcmMzMi5vYmo6IGNyYzMyLmMgemxpYi5oIHpjb25mLmggY3JjMzIuaAorCitkZWZsYXRlLm9iajogZGVmbGF0ZS5jIGRlZmxhdGUuaCB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCisKK2d6Y2xvc2Uub2JqOiBnemNsb3NlLmMgemxpYi5oIHpjb25mLmggZ3pndXRzLmgKKworZ3psaWIub2JqOiBnemxpYi5jIHpsaWIuaCB6Y29uZi5oIGd6Z3V0cy5oCisKK2d6cmVhZC5vYmo6IGd6cmVhZC5jIHpsaWIuaCB6Y29uZi5oIGd6Z3V0cy5oCisKK2d6d3JpdGUub2JqOiBnendyaXRlLmMgemxpYi5oIHpjb25mLmggZ3pndXRzLmgKKworaW5mYmFjay5vYmo6IGluZmJhY2suYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZnRyZWVzLmggaW5mbGF0ZS5oIFwKKyBpbmZmYXN0LmggaW5mZml4ZWQuaAorCitpbmZmYXN0Lm9iajogaW5mZmFzdC5jIHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mdHJlZXMuaCBpbmZsYXRlLmggXAorIGluZmZhc3QuaAorCitpbmZsYXRlLm9iajogaW5mbGF0ZS5jIHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mdHJlZXMuaCBpbmZsYXRlLmggXAorIGluZmZhc3QuaCBpbmZmaXhlZC5oCisKK2luZnRyZWVzLm9iajogaW5mdHJlZXMuYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZnRyZWVzLmgKKwordHJlZXMub2JqOiB0cmVlcy5jIHp1dGlsLmggemxpYi5oIHpjb25mLmggZGVmbGF0ZS5oIHRyZWVzLmgKKwordW5jb21wci5vYmo6IHVuY29tcHIuYyB6bGliLmggemNvbmYuaAorCit6dXRpbC5vYmo6IHp1dGlsLmMgenV0aWwuaCB6bGliLmggemNvbmYuaAorCitleGFtcGxlLm9iajogdGVzdC9leGFtcGxlLmMgemxpYi5oIHpjb25mLmgKKworbWluaWd6aXAub2JqOiB0ZXN0L21pbmlnemlwLmMgemxpYi5oIHpjb25mLmgKKworCisjIHRoZSBjb21tYW5kIGxpbmUgaXMgY3V0IHRvIGZpdCBpbiB0aGUgTVMtRE9TIDEyOCBieXRlIGxpbWl0OgorJChaTElCX0xJQik6ICQoT0JKMSkgJChPQkoyKQorCS1kZWwgJChaTElCX0xJQikKKwkkKEFSKSAkKFpMSUJfTElCKSAkKE9CSlAxKQorCSQoQVIpICQoWkxJQl9MSUIpICQoT0JKUDIpCisKK2V4YW1wbGUuZXhlOiBleGFtcGxlLm9iaiAkKFpMSUJfTElCKQorCSQoTEQpICQoTERGTEFHUykgZXhhbXBsZS5vYmogJChaTElCX0xJQikKKworbWluaWd6aXAuZXhlOiBtaW5pZ3ppcC5vYmogJChaTElCX0xJQikKKwkkKExEKSAkKExERkxBR1MpIG1pbmlnemlwLm9iaiAkKFpMSUJfTElCKQorCit0ZXN0OiBleGFtcGxlLmV4ZSBtaW5pZ3ppcC5leGUKKwlleGFtcGxlCisJZWNobyBoZWxsbyB3b3JsZCB8IG1pbmlnemlwIHwgbWluaWd6aXAgLWQKKworY2xlYW46CisJLWRlbCAqLm9iagorCS1kZWwgKi5saWIKKwktZGVsICouZXhlCisJLWRlbCB6bGliXyouYmFrCisJLWRlbCBmb28uZ3oKZGlmZiAtLWdpdCBhL3psaWItMS4yLjYvbmludGVuZG9kcy9NYWtlZmlsZSBiL3psaWItMS4yLjYvbmludGVuZG9kcy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTMzN2QwCi0tLSAvZGV2L251bGwKKysrIGIvemxpYi0xLjIuNi9uaW50ZW5kb2RzL01ha2VmaWxlCkBAIC0wLDAgKzEsMTI2IEBACisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisuU1VGRklYRVM6CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2lmZXEgKCQoc3RyaXAgJChERVZLSVRBUk0pKSwpCiskKGVycm9yICJQbGVhc2Ugc2V0IERFVktJVEFSTSBpbiB5b3VyIGVudmlyb25tZW50LiBleHBvcnQgREVWS0lUQVJNPTxwYXRoIHRvPmRldmtpdEFSTSIpCitlbmRpZgorCitpbmNsdWRlICQoREVWS0lUQVJNKS9kc19ydWxlcworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRBUkdFVCBpcyB0aGUgbmFtZSBvZiB0aGUgb3V0cHV0CisjIEJVSUxEIGlzIHRoZSBkaXJlY3Rvcnkgd2hlcmUgb2JqZWN0IGZpbGVzICYgaW50ZXJtZWRpYXRlIGZpbGVzIHdpbGwgYmUgcGxhY2VkCisjIFNPVVJDRVMgaXMgYSBsaXN0IG9mIGRpcmVjdG9yaWVzIGNvbnRhaW5pbmcgc291cmNlIGNvZGUKKyMgREFUQSBpcyBhIGxpc3Qgb2YgZGlyZWN0b3JpZXMgY29udGFpbmluZyBkYXRhIGZpbGVzCisjIElOQ0xVREVTIGlzIGEgbGlzdCBvZiBkaXJlY3RvcmllcyBjb250YWluaW5nIGhlYWRlciBmaWxlcworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorVEFSR0VUCQk6PQkkKHNoZWxsIGJhc2VuYW1lICQoQ1VSRElSKSkKK0JVSUxECQk6PQlidWlsZAorU09VUkNFUwkJOj0JLi4vLi4vCitEQVRBCQk6PQlkYXRhCitJTkNMVURFUwk6PQlpbmNsdWRlCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgb3B0aW9ucyBmb3IgY29kZSBnZW5lcmF0aW9uCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitBUkNICTo9CS1tdGh1bWIgLW10aHVtYi1pbnRlcndvcmsKKworQ0ZMQUdTCTo9CS1XYWxsIC1PMlwKKwkJLW1hcmNoPWFybXY1dGUgLW10dW5lPWFybTk0NmUtcyBcCisJCS1mb21pdC1mcmFtZS1wb2ludGVyIC1mZmFzdC1tYXRoIFwKKwkJJChBUkNIKQorCitDRkxBR1MJKz0JJChJTkNMVURFKSAtREFSTTkKK0NYWEZMQUdTCTo9ICQoQ0ZMQUdTKSAtZm5vLXJ0dGkgLWZuby1leGNlcHRpb25zCisKK0FTRkxBR1MJOj0JJChBUkNIKSAtbWFyY2g9YXJtdjV0ZSAtbXR1bmU9YXJtOTQ2ZS1zCitMREZMQUdTCT0JLXNwZWNzPWRzX2FybTkuc3BlY3MgLWcgJChBUkNIKSAtV2wsLU1hcCwkKG5vdGRpciAkKi5tYXApCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgbGlzdCBvZiBkaXJlY3RvcmllcyBjb250YWluaW5nIGxpYnJhcmllcywgdGhpcyBtdXN0IGJlIHRoZSB0b3AgbGV2ZWwgY29udGFpbmluZworIyBpbmNsdWRlIGFuZCBsaWIKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xJQkRJUlMJOj0JJChMSUJORFMpCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgbm8gcmVhbCBuZWVkIHRvIGVkaXQgYW55dGhpbmcgcGFzdCB0aGlzIHBvaW50IHVubGVzcyB5b3UgbmVlZCB0byBhZGQgYWRkaXRpb25hbAorIyBydWxlcyBmb3IgZGlmZmVyZW50IGZpbGUgZXh0ZW5zaW9ucworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoraWZuZXEgKCQoQlVJTEQpLCQobm90ZGlyICQoQ1VSRElSKSkpCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2V4cG9ydCBPVVRQVVQJOj0JJChDVVJESVIpL2xpYi9saWJ6LmEKKworZXhwb3J0IFZQQVRICTo9CSQoZm9yZWFjaCBkaXIsJChTT1VSQ0VTKSwkKENVUkRJUikvJChkaXIpKSBcCisJCQkkKGZvcmVhY2ggZGlyLCQoREFUQSksJChDVVJESVIpLyQoZGlyKSkKKworZXhwb3J0IERFUFNESVIJOj0JJChDVVJESVIpLyQoQlVJTEQpCisKK0NGSUxFUwkJOj0JJChmb3JlYWNoIGRpciwkKFNPVVJDRVMpLCQobm90ZGlyICQod2lsZGNhcmQgJChkaXIpLyouYykpKQorQ1BQRklMRVMJOj0JJChmb3JlYWNoIGRpciwkKFNPVVJDRVMpLCQobm90ZGlyICQod2lsZGNhcmQgJChkaXIpLyouY3BwKSkpCitTRklMRVMJCTo9CSQoZm9yZWFjaCBkaXIsJChTT1VSQ0VTKSwkKG5vdGRpciAkKHdpbGRjYXJkICQoZGlyKS8qLnMpKSkKK0JJTkZJTEVTCTo9CSQoZm9yZWFjaCBkaXIsJChEQVRBKSwkKG5vdGRpciAkKHdpbGRjYXJkICQoZGlyKS8qLiopKSkKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyB1c2UgQ1hYIGZvciBsaW5raW5nIEMrKyBwcm9qZWN0cywgQ0MgZm9yIHN0YW5kYXJkIEMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2lmZXEgKCQoc3RyaXAgJChDUFBGSUxFUykpLCkKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlleHBvcnQgTEQJOj0JJChDQykKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Vsc2UKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlleHBvcnQgTEQJOj0JJChDWFgpCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitlbmRpZgorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitleHBvcnQgT0ZJTEVTCTo9CSQoYWRkc3VmZml4IC5vLCQoQklORklMRVMpKSBcCisJCQkkKENQUEZJTEVTOi5jcHA9Lm8pICQoQ0ZJTEVTOi5jPS5vKSAkKFNGSUxFUzoucz0ubykKKworZXhwb3J0IElOQ0xVREUJOj0JJChmb3JlYWNoIGRpciwkKElOQ0xVREVTKSwtSSQoQ1VSRElSKS8kKGRpcikpIFwKKwkJCSQoZm9yZWFjaCBkaXIsJChMSUJESVJTKSwtSSQoZGlyKS9pbmNsdWRlKSBcCisJCQktSSQoQ1VSRElSKS8kKEJVSUxEKQorCisuUEhPTlk6ICQoQlVJTEQpIGNsZWFuIGFsbAorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCithbGw6ICQoQlVJTEQpCisJQFsgLWQgJEAgXSB8fCBta2RpciAtcCBpbmNsdWRlCisJQGNwIC4uLy4uLyouaCBpbmNsdWRlCisKK2xpYjoKKwlAWyAtZCAkQCBdIHx8IG1rZGlyIC1wICRACisJCiskKEJVSUxEKTogbGliCisJQFsgLWQgJEAgXSB8fCBta2RpciAtcCAkQAorCUAkKE1BS0UpIC0tbm8tcHJpbnQtZGlyZWN0b3J5IC1DICQoQlVJTEQpIC1mICQoQ1VSRElSKS9NYWtlZmlsZQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitjbGVhbjoKKwlAZWNobyBjbGVhbiAuLi4KKwlAcm0gLWZyICQoQlVJTEQpIGxpYgorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitlbHNlCisKK0RFUEVORFMJOj0JJChPRklMRVM6Lm89LmQpCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgbWFpbiB0YXJnZXRzCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskKE9VVFBVVCkJOgkkKE9GSUxFUykKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJS5iaW4ubwk6CSUuYmluCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJQGVjaG8gJChub3RkaXIgJDwpCisJQCQoYmluMm8pCisKKworLWluY2x1ZGUgJChERVBFTkRTKQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitlbmRpZgorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvemxpYi0xLjIuNi9uaW50ZW5kb2RzL1JFQURNRSBiL3psaWItMS4yLjYvbmludGVuZG9kcy9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE3YTM3ZAotLS0gL2Rldi9udWxsCisrKyBiL3psaWItMS4yLjYvbmludGVuZG9kcy9SRUFETUUKQEAgLTAsMCArMSw1IEBACitUaGlzIE1ha2VmaWxlIHJlcXVpcmVzIGRldmtpdEFSTSAoaHR0cDovL3d3dy5kZXZraXRwcm8ub3JnL2NhdGVnb3J5L2RldmtpdGFybS8pIGFuZCB3b3JrcyBpbnNpZGUgImNvbnRyaWIvbmRzIi4gSXQgaXMgYmFzZWQgb24gYSBkZXZraXRBUk0gdGVtcGxhdGUuCisKK0VkdWFyZG8gQ29zdGEgPGVkdWFyZG8ubS5jb3N0YUBnbWFpbC5jb20+CitKYW51YXJ5IDMsIDIwMDkKKwpkaWZmIC0tZ2l0IGEvemxpYi0xLjIuNi9vbGQvTWFrZWZpbGUucmlzY29zIGIvemxpYi0xLjIuNi9vbGQvTWFrZWZpbGUucmlzY29zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3ZTI5ZDMKLS0tIC9kZXYvbnVsbAorKysgYi96bGliLTEuMi42L29sZC9NYWtlZmlsZS5yaXNjb3MKQEAgLTAsMCArMSwxNTEgQEAKKyMgUHJvamVjdDogICB6bGliXzFfMDMKKyMgUGF0Y2hlZCBmb3IgemxpYiAxLjEuMiByd0BzaGFkb3cub3JnLnVrIDE5OTgwNDMwCisjIHRlc3Qgd29ya3Mgb3V0LW9mLXRoZS1ib3gsIGluc3RhbGxzIGBzb21ld2hlcmUnIG9uIGRlbWFuZAorCisjIFRvb2xmbGFnczoKK0NDZmxhZ3MgPSAtYyAtZGVwZW5kICFEZXBlbmQgLUlDOiAtZyAtdGhyb3diYWNrICAtRFJJU0NPUyAgLWZhaAorQysrZmxhZ3MgPSAtYyAtZGVwZW5kICFEZXBlbmQgLUlDOiAtdGhyb3diYWNrCitMaW5rZmxhZ3MgPSAtYWlmIC1jKysgLW8gJEAKK09iakFzbWZsYWdzID0gLXRocm93YmFjayAtTm9DYWNoZSAtZGVwZW5kICFEZXBlbmQKK0NNSEdmbGFncyA9CitMaWJGaWxlZmxhZ3MgPSAtYyAtbCAtbyAkQAorU3F1ZWV6ZWZsYWdzID0gLW8gJEAKKworIyBjaGFuZ2UgdGhlIGxpbmUgYmVsb3cgdG8gd2hlcmUgX3lvdV8gd2FudCB0aGUgbGlicmFyeSBpbnN0YWxsZWQuCitsaWJkZXN0ID0gbGliOnpsaWIKKworIyBGaW5hbCB0YXJnZXRzOgorQC5saWI6ICAgQC5vLmFkbGVyMzIgQC5vLmNvbXByZXNzIEAuby5jcmMzMiBALm8uZGVmbGF0ZSBALm8uZ3ppbyBcCisgICAgICAgIEAuby5pbmZibG9jayBALm8uaW5mY29kZXMgQC5vLmluZmZhc3QgQC5vLmluZmxhdGUgQC5vLmluZnRyZWVzIEAuby5pbmZ1dGlsIEAuby50cmVlcyBcCisgICAgICAgIEAuby51bmNvbXByIEAuby56dXRpbAorICAgICAgICBMaWJGaWxlICQoTGliRmlsZWZsYWdzKSBALm8uYWRsZXIzMiBALm8uY29tcHJlc3MgQC5vLmNyYzMyIEAuby5kZWZsYXRlIFwKKyAgICAgICAgQC5vLmd6aW8gQC5vLmluZmJsb2NrIEAuby5pbmZjb2RlcyBALm8uaW5mZmFzdCBALm8uaW5mbGF0ZSBALm8uaW5mdHJlZXMgQC5vLmluZnV0aWwgXAorICAgICAgICBALm8udHJlZXMgQC5vLnVuY29tcHIgQC5vLnp1dGlsCit0ZXN0OiAgIEAubWluaWd6aXAgQC5leGFtcGxlIEAubGliCisJQGNvcHkgQC5saWIgQC5saWJjICBBfkN+REZ+TH5OflB+UX5SU35UVgorCUBlY2hvIHJ1bm5pbmcgdGVzdHM6IGhhbmcgb24uCisJQC9ALm1pbmlnemlwIC1mIC05IGxpYmMKKwlAL0AubWluaWd6aXAgLWQgbGliYy1negorCUAvQC5taW5pZ3ppcCAtZiAtMSBsaWJjCisJQC9ALm1pbmlnemlwIC1kIGxpYmMtZ3oKKwlAL0AubWluaWd6aXAgLWggLTkgbGliYworCUAvQC5taW5pZ3ppcCAtZCBsaWJjLWd6CisJQC9ALm1pbmlnemlwIC1oIC0xIGxpYmMKKwlAL0AubWluaWd6aXAgLWQgbGliYy1negorCUAvQC5taW5pZ3ppcCAtOSBsaWJjCisJQC9ALm1pbmlnemlwIC1kIGxpYmMtZ3oKKwlAL0AubWluaWd6aXAgLTEgbGliYworCUAvQC5taW5pZ3ppcCAtZCBsaWJjLWd6CisJQGRpZmYgQC5saWIgQC5saWJjCisJQGVjaG8gdGhhdCBzaG91bGQgaGF2ZSByZXBvcnRlZCAnQC5saWIgYW5kIEAubGliYyBpZGVudGljYWwnIGlmIHlvdSBoYXZlIGRpZmYuCisJQC9ALmV4YW1wbGUgQC5mcmVkIEAuZnJlZAorCUBlY2hvIHRoYXQgd2lsbCBoYXZlIGdpdmVuIGxvdHMgb2YgaGVsbG8hJ3MuCisKK0AubWluaWd6aXA6ICAgQC5vLm1pbmlnemlwIEAubGliIEM6by5TdHVicworICAgICAgICBMaW5rICQoTGlua2ZsYWdzKSBALm8ubWluaWd6aXAgQC5saWIgQzpvLlN0dWJzCitALmV4YW1wbGU6ICAgQC5vLmV4YW1wbGUgQC5saWIgQzpvLlN0dWJzCisgICAgICAgIExpbmsgJChMaW5rZmxhZ3MpIEAuby5leGFtcGxlIEAubGliIEM6by5TdHVicworCitpbnN0YWxsOiBALmxpYgorCWNkaXIgJChsaWJkZXN0KQorCWNkaXIgJChsaWJkZXN0KS5oCisJQGNvcHkgQC5oLnpsaWIgJChsaWJkZXN0KS5oLnpsaWIgQX5DfkRGfkx+Tn5QflF+UlN+VFYKKwlAY29weSBALmguemNvbmYgJChsaWJkZXN0KS5oLnpjb25mIEF+Q35ERn5Mfk5+UH5RflJTflRWCisJQGNvcHkgQC5saWIgJChsaWJkZXN0KS5saWIgIEF+Q35ERn5Mfk5+UH5RflJTflRWCisJQGVjaG8gb2theSwgaW5zdGFsbGVkIHpsaWIgaW4gJChsaWJkZXN0KQorCitjbGVhbjo7IHJlbW92ZSBALm1pbmlnemlwCisJcmVtb3ZlIEAuZXhhbXBsZQorCXJlbW92ZSBALmxpYmMKKwktd2lwZSBALm8uKiBGfnJ+Y1YKKwlyZW1vdmUgQC5mcmVkCisKKyMgVXNlci1lZGl0YWJsZSBkZXBlbmRlbmNpZXM6CisuYy5vOgorICAgICAgICBjYyAkKGNjZmxhZ3MpIC1vICRAICQ8CisKKyMgU3RhdGljIGRlcGVuZGVuY2llczoKKworIyBEeW5hbWljIGRlcGVuZGVuY2llczoKK28uZXhhbXBsZToJYy5leGFtcGxlCitvLmV4YW1wbGU6CWguemxpYgorby5leGFtcGxlOgloLnpjb25mCitvLm1pbmlnemlwOgljLm1pbmlnemlwCitvLm1pbmlnemlwOgloLnpsaWIKK28ubWluaWd6aXA6CWguemNvbmYKK28uYWRsZXIzMjoJYy5hZGxlcjMyCitvLmFkbGVyMzI6CWguemxpYgorby5hZGxlcjMyOgloLnpjb25mCitvLmNvbXByZXNzOgljLmNvbXByZXNzCitvLmNvbXByZXNzOgloLnpsaWIKK28uY29tcHJlc3M6CWguemNvbmYKK28uY3JjMzI6CWMuY3JjMzIKK28uY3JjMzI6CWguemxpYgorby5jcmMzMjoJaC56Y29uZgorby5kZWZsYXRlOgljLmRlZmxhdGUKK28uZGVmbGF0ZToJaC5kZWZsYXRlCitvLmRlZmxhdGU6CWguenV0aWwKK28uZGVmbGF0ZToJaC56bGliCitvLmRlZmxhdGU6CWguemNvbmYKK28uZ3ppbzoJYy5nemlvCitvLmd6aW86CWguenV0aWwKK28uZ3ppbzoJaC56bGliCitvLmd6aW86CWguemNvbmYKK28uaW5mYmxvY2s6CWMuaW5mYmxvY2sKK28uaW5mYmxvY2s6CWguenV0aWwKK28uaW5mYmxvY2s6CWguemxpYgorby5pbmZibG9jazoJaC56Y29uZgorby5pbmZibG9jazoJaC5pbmZibG9jaworby5pbmZibG9jazoJaC5pbmZ0cmVlcworby5pbmZibG9jazoJaC5pbmZjb2Rlcworby5pbmZibG9jazoJaC5pbmZ1dGlsCitvLmluZmNvZGVzOgljLmluZmNvZGVzCitvLmluZmNvZGVzOgloLnp1dGlsCitvLmluZmNvZGVzOgloLnpsaWIKK28uaW5mY29kZXM6CWguemNvbmYKK28uaW5mY29kZXM6CWguaW5mdHJlZXMKK28uaW5mY29kZXM6CWguaW5mYmxvY2sKK28uaW5mY29kZXM6CWguaW5mY29kZXMKK28uaW5mY29kZXM6CWguaW5mdXRpbAorby5pbmZjb2RlczoJaC5pbmZmYXN0CitvLmluZmZhc3Q6CWMuaW5mZmFzdAorby5pbmZmYXN0OgloLnp1dGlsCitvLmluZmZhc3Q6CWguemxpYgorby5pbmZmYXN0OgloLnpjb25mCitvLmluZmZhc3Q6CWguaW5mdHJlZXMKK28uaW5mZmFzdDoJaC5pbmZibG9jaworby5pbmZmYXN0OgloLmluZmNvZGVzCitvLmluZmZhc3Q6CWguaW5mdXRpbAorby5pbmZmYXN0OgloLmluZmZhc3QKK28uaW5mbGF0ZToJYy5pbmZsYXRlCitvLmluZmxhdGU6CWguenV0aWwKK28uaW5mbGF0ZToJaC56bGliCitvLmluZmxhdGU6CWguemNvbmYKK28uaW5mbGF0ZToJaC5pbmZibG9jaworby5pbmZ0cmVlczoJYy5pbmZ0cmVlcworby5pbmZ0cmVlczoJaC56dXRpbAorby5pbmZ0cmVlczoJaC56bGliCitvLmluZnRyZWVzOgloLnpjb25mCitvLmluZnRyZWVzOgloLmluZnRyZWVzCitvLmluZnRyZWVzOgloLmluZmZpeGVkCitvLmluZnV0aWw6CWMuaW5mdXRpbAorby5pbmZ1dGlsOgloLnp1dGlsCitvLmluZnV0aWw6CWguemxpYgorby5pbmZ1dGlsOgloLnpjb25mCitvLmluZnV0aWw6CWguaW5mYmxvY2sKK28uaW5mdXRpbDoJaC5pbmZ0cmVlcworby5pbmZ1dGlsOgloLmluZmNvZGVzCitvLmluZnV0aWw6CWguaW5mdXRpbAorby50cmVlczoJYy50cmVlcworby50cmVlczoJaC5kZWZsYXRlCitvLnRyZWVzOgloLnp1dGlsCitvLnRyZWVzOgloLnpsaWIKK28udHJlZXM6CWguemNvbmYKK28udHJlZXM6CWgudHJlZXMKK28udW5jb21wcjoJYy51bmNvbXByCitvLnVuY29tcHI6CWguemxpYgorby51bmNvbXByOgloLnpjb25mCitvLnp1dGlsOgljLnp1dGlsCitvLnp1dGlsOgloLnp1dGlsCitvLnp1dGlsOgloLnpsaWIKK28uenV0aWw6CWguemNvbmYKZGlmZiAtLWdpdCBhL3psaWItMS4yLjYvb2xkL1JFQURNRSBiL3psaWItMS4yLjYvb2xkL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDBiZjA3Ci0tLSAvZGV2L251bGwKKysrIGIvemxpYi0xLjIuNi9vbGQvUkVBRE1FCkBAIC0wLDAgKzEsMyBAQAorVGhpcyBkaXJlY3RvcnkgY29udGFpbnMgZmlsZXMgdGhhdCBoYXZlIG5vdCBiZWVuIHVwZGF0ZWQgZm9yIHpsaWIgMS4yLngKKworKFZvbHVudGVlcnMgYXJlIGVuY291cmFnZWQgdG8gaGVscCBjbGVhbiB0aGlzIHVwLiAgVGhhbmtzLikKZGlmZiAtLWdpdCBhL3psaWItMS4yLjYvb2xkL2Rlc2NyaXAubW1zIGIvemxpYi0xLjIuNi9vbGQvZGVzY3JpcC5tbXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA2NmRhNQotLS0gL2Rldi9udWxsCisrKyBiL3psaWItMS4yLjYvb2xkL2Rlc2NyaXAubW1zCkBAIC0wLDAgKzEsNDggQEAKKyMgZGVzY3JpcC5tbXM6IE1NUyBkZXNjcmlwdGlvbiBmaWxlIGZvciBidWlsZGluZyB6bGliIG9uIFZNUworIyB3cml0dGVuIGJ5IE1hcnRpbiBQLkouIFppbnNlciA8bS56aW5zZXJAZ3NpLmRlPgorCitjY19kZWZzID0KK2NfZGViID0KKworLmlmZGVmIF9fREVDQ19fCitwcmVmID0gL3ByZWZpeD1hbGwKKy5lbmRpZgorCitPQkpTID0gYWRsZXIzMi5vYmosIGNvbXByZXNzLm9iaiwgY3JjMzIub2JqLCBnemlvLm9iaiwgdW5jb21wci5vYmosXAorICAgICAgIGRlZmxhdGUub2JqLCB0cmVlcy5vYmosIHp1dGlsLm9iaiwgaW5mbGF0ZS5vYmosIGluZmJsb2NrLm9iaixcCisgICAgICAgaW5mdHJlZXMub2JqLCBpbmZjb2Rlcy5vYmosIGluZnV0aWwub2JqLCBpbmZmYXN0Lm9iagorCitDRkxBR1M9ICQoQ19ERUIpICQoQ0NfREVGUykgJChQUkVGKQorCithbGwgOiBleGFtcGxlLmV4ZSBtaW5pZ3ppcC5leGUKKyAgICAgICAgQCB3cml0ZSBzeXMkb3V0cHV0ICIgRXhhbXBsZSBhcHBsaWNhdGlvbnMgYXZhaWxhYmxlIgorbGliei5vbGIgOiBsaWJ6Lm9sYigkKE9CSlMpKQorCUAgd3JpdGUgc3lzJG91dHB1dCAiIGxpYnogYXZhaWxhYmxlIgorCitleGFtcGxlLmV4ZSA6IGV4YW1wbGUub2JqIGxpYnoub2xiCisgICAgICAgICAgICAgIGxpbmsgZXhhbXBsZSxsaWJ6Lm9sYi9saWIKKworbWluaWd6aXAuZXhlIDogbWluaWd6aXAub2JqIGxpYnoub2xiCisgICAgICAgICAgICAgIGxpbmsgbWluaWd6aXAsbGliei5vbGIvbGliLHgxMXZtczp4dm1zdXRpbHMub2xiL2xpYgorCitjbGVhbiA6CisJZGVsZXRlICoub2JqOyosbGliei5vbGI7KgorCisKKyMgT3RoZXIgZGVwZW5kZW5jaWVzLgorYWRsZXIzMi5vYmogOiB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCitjb21wcmVzcy5vYmogOiB6bGliLmggemNvbmYuaAorY3JjMzIub2JqIDogenV0aWwuaCB6bGliLmggemNvbmYuaAorZGVmbGF0ZS5vYmogOiBkZWZsYXRlLmggenV0aWwuaCB6bGliLmggemNvbmYuaAorZXhhbXBsZS5vYmogOiB6bGliLmggemNvbmYuaAorZ3ppby5vYmogOiB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCitpbmZibG9jay5vYmogOiB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZmJsb2NrLmggaW5mdHJlZXMuaCBpbmZjb2Rlcy5oIGluZnV0aWwuaAoraW5mY29kZXMub2JqIDogenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZ0cmVlcy5oIGluZnV0aWwuaCBpbmZjb2Rlcy5oIGluZmZhc3QuaAoraW5mZmFzdC5vYmogOiB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZnRyZWVzLmggaW5mdXRpbC5oIGluZmZhc3QuaAoraW5mbGF0ZS5vYmogOiB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZmJsb2NrLmgKK2luZnRyZWVzLm9iaiA6IHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mdHJlZXMuaAoraW5mdXRpbC5vYmogOiB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZnRyZWVzLmggaW5mdXRpbC5oCittaW5pZ3ppcC5vYmogOiB6bGliLmggemNvbmYuaAordHJlZXMub2JqIDogZGVmbGF0ZS5oIHp1dGlsLmggemxpYi5oIHpjb25mLmgKK3VuY29tcHIub2JqIDogemxpYi5oIHpjb25mLmgKK3p1dGlsLm9iaiA6IHp1dGlsLmggemxpYi5oIHpjb25mLmgKZGlmZiAtLWdpdCBhL3psaWItMS4yLjYvb2xkL29zMi9NYWtlZmlsZS5vczIgYi96bGliLTEuMi42L29sZC9vczIvTWFrZWZpbGUub3MyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExMDVhYWEKLS0tIC9kZXYvbnVsbAorKysgYi96bGliLTEuMi42L29sZC9vczIvTWFrZWZpbGUub3MyCkBAIC0wLDAgKzEsMTM2IEBACisjIE1ha2VmaWxlIGZvciB6bGliIHVuZGVyIE9TLzIgdXNpbmcgR0NDIChQR0NDKQorIyBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCisKKyMgVG8gY29tcGlsZSBhbmQgdGVzdCwgdHlwZToKKyMgICBjcCBNYWtlZmlsZS5vczIgLi4KKyMgICBjZCAuLgorIyAgIG1ha2UgLWYgTWFrZWZpbGUub3MyIHRlc3QKKworIyBUaGlzIG1ha2VmaWxlIHdpbGwgYnVpbGQgYSBzdGF0aWMgbGlicmFyeSB6LmxpYiwgYSBzaGFyZWQgbGlicmFyeQorIyB6LmRsbCBhbmQgYSBpbXBvcnQgbGlicmFyeSB6ZGxsLmxpYi4gWW91IGNhbiB1c2UgZWl0aGVyIHoubGliIG9yCisjIHpkbGwubGliIGJ5IHNwZWNpZnlpbmcgZWl0aGVyIC1seiBvciAtbHpkbGwgb24gZ2NjJ3MgY29tbWFuZCBsaW5lCisKK0NDPWdjYyAtWm9tZiAtcworCitDRkxBR1M9LU82IC1XYWxsCisjQ0ZMQUdTPS1PIC1ETUFYX1dCSVRTPTE0IC1ETUFYX01FTV9MRVZFTD03CisjQ0ZMQUdTPS1nIC1EREVCVUcKKyNDRkxBR1M9LU8zIC1XYWxsIC1Xd3JpdGUtc3RyaW5ncyAtV3BvaW50ZXItYXJpdGggLVdjb252ZXJzaW9uIFwKKyMgICAgICAgICAgIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVdtaXNzaW5nLXByb3RvdHlwZXMKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMgQlVHIFdBUk5JTkc6ICMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMgaW5mY29kZXMuYyBoaXRzIGEgYnVnIGluIHBnY2MtMS4wLCBzbyB5b3UgaGF2ZSB0byB1c2UgZWl0aGVyCisjIyAtTyMgd2hlcmUgIyA8PSA0IG9yIG9uZSBvZiAoLWZuby1vbW1pdC1mcmFtZS1wb2ludGVyIG9yIC1mbm8tZm9yY2UtbWVtKQorIyMgVGhpcyBidWcgaXMgcmVwb3J0ZWRseSBmaXhlZCBpbiBwZ2NjID4xLjAsIGJ1dCB0aGlzIHdhcyBub3QgdGVzdGVkCitDRkxBR1MrPS1mbm8tZm9yY2UtbWVtCisKK0xERkxBR1M9LXMgLUwuIC1semRsbCAtWmNydGRsbAorTERTSEFSRUQ9JChDQykgLXMgLVpvbWYgLVpkbGwgLVpjcnRkbGwKKworVkVSPTEuMS4wCitaTElCPXoubGliCitTSEFSRURMSUI9ei5kbGwKK1NIQVJFRExJQklNUD16ZGxsLmxpYgorTElCUz0kKFpMSUIpICQoU0hBUkVETElCKSAkKFNIQVJFRExJQklNUCkKKworQVI9ZW14b21mYXIgY3IKK0lNUExJQj1lbXhpbXAKK1JBTkxJQj1lY2hvCitUQVI9dGFyCitTSEVMTD1iYXNoCisKK3ByZWZpeD0vdXNyL2xvY2FsCitleGVjX3ByZWZpeCA9ICQocHJlZml4KQorCitPQkpTID0gYWRsZXIzMi5vIGNvbXByZXNzLm8gY3JjMzIubyBnemlvLm8gdW5jb21wci5vIGRlZmxhdGUubyB0cmVlcy5vIFwKKyAgICAgICB6dXRpbC5vIGluZmxhdGUubyBpbmZibG9jay5vIGluZnRyZWVzLm8gaW5mY29kZXMubyBpbmZ1dGlsLm8gaW5mZmFzdC5vCisKK1RFU1RfT0JKUyA9IGV4YW1wbGUubyBtaW5pZ3ppcC5vCisKK0RJU1RGSUxFUyA9IFJFQURNRSBJTkRFWCBDaGFuZ2VMb2cgY29uZmlndXJlIE1ha2UqW2EtejAtOV0gKi5bY2hdIGRlc2NyaXAubW1zIFwKKyAgYWxnb3JpdGhtLnR4dCB6bGliLjMgbXNkb3MvTWFrZSpbYS16MC05XSBtc2Rvcy96bGliLmRlZiBtc2Rvcy96bGliLnJjIFwKKyAgbnQvTWFrZWZpbGUubnQgbnQvemxpYi5kbnQgIGNvbnRyaWIvUkVBRE1FLmNvbnRyaWIgY29udHJpYi8qLnR4dCBcCisgIGNvbnRyaWIvYXNtMzg2LyouYXNtIGNvbnRyaWIvYXNtMzg2LyouYyBcCisgIGNvbnRyaWIvYXNtMzg2LyouYmF0IGNvbnRyaWIvYXNtMzg2L3psaWJ2Yy5kPz8gY29udHJpYi9pb3N0cmVhbS8qLmNwcCBcCisgIGNvbnRyaWIvaW9zdHJlYW0vKi5oICBjb250cmliL2lvc3RyZWFtMi8qLmggY29udHJpYi9pb3N0cmVhbTIvKi5jcHAgXAorICBjb250cmliL3VudGd6L01ha2VmaWxlIGNvbnRyaWIvdW50Z3ovKi5jIGNvbnRyaWIvdW50Z3ovKi53MzIKKworYWxsOiBleGFtcGxlLmV4ZSBtaW5pZ3ppcC5leGUKKwordGVzdDogYWxsCisJQExEX0xJQlJBUllfUEFUSD0uOiQoTERfTElCUkFSWV9QQVRIKSA7IGV4cG9ydCBMRF9MSUJSQVJZX1BBVEg7IFwKKwllY2hvIGhlbGxvIHdvcmxkIHwgLi9taW5pZ3ppcCB8IC4vbWluaWd6aXAgLWQgfHwgXAorCSAgZWNobyAnCQkqKiogbWluaWd6aXAgdGVzdCBGQUlMRUQgKioqJyA7IFwKKwlpZiAuL2V4YW1wbGU7IHRoZW4gXAorCSAgZWNobyAnCQkqKiogemxpYiB0ZXN0IE9LICoqKic7IFwKKwllbHNlIFwKKwkgIGVjaG8gJwkJKioqIHpsaWIgdGVzdCBGQUlMRUQgKioqJzsgXAorCWZpCisKKyQoWkxJQik6ICQoT0JKUykKKwkkKEFSKSAkQCAkKE9CSlMpCisJLUAgKCQoUkFOTElCKSAkQCB8fCB0cnVlKSA+L2Rldi9udWxsIDI+JjEKKworJChTSEFSRURMSUIpOiAkKE9CSlMpIG9zMi96LmRlZgorCSQoTERTSEFSRUQpIC1vICRAICReCisKKyQoU0hBUkVETElCSU1QKTogb3MyL3ouZGVmCisJJChJTVBMSUIpIC1vICRAICReCisKK2V4YW1wbGUuZXhlOiBleGFtcGxlLm8gJChMSUJTKQorCSQoQ0MpICQoQ0ZMQUdTKSAtbyAkQCBleGFtcGxlLm8gJChMREZMQUdTKQorCittaW5pZ3ppcC5leGU6IG1pbmlnemlwLm8gJChMSUJTKQorCSQoQ0MpICQoQ0ZMQUdTKSAtbyAkQCBtaW5pZ3ppcC5vICQoTERGTEFHUykKKworY2xlYW46CisJcm0gLWYgKi5vICp+IGV4YW1wbGUgbWluaWd6aXAgbGliei5hIGxpYnouc28qIGZvby5negorCitkaXN0Y2xlYW46CWNsZWFuCisKK3ppcDoKKwltdiBNYWtlZmlsZSBNYWtlZmlsZX47IGNwIC1wIE1ha2VmaWxlLmluIE1ha2VmaWxlCisJcm0gLWYgdGVzdC5jIHp0ZXN0Ki5jCisJdj1gc2VkIC1uIC1lICdzL1wuLy9nJyAtZSAnL1ZFUlNJT04gIi9zLy4qIlwoLipcKSIuKi9cMS9wJyA8IHpsaWIuaGA7XAorCXppcCAtdWw5IHpsaWIkJHYgJChESVNURklMRVMpCisJbXYgTWFrZWZpbGV+IE1ha2VmaWxlCisKK2Rpc3Q6CisJbXYgTWFrZWZpbGUgTWFrZWZpbGV+OyBjcCAtcCBNYWtlZmlsZS5pbiBNYWtlZmlsZQorCXJtIC1mIHRlc3QuYyB6dGVzdCouYworCWQ9emxpYi1gc2VkIC1uICcvVkVSU0lPTiAiL3MvLioiXCguKlwpIi4qL1wxL3AnIDwgemxpYi5oYDtcCisJcm0gLWYgJCRkLnRhci5nejsgXAorCWlmIHRlc3QgISAtZCAuLi8kJGQ7IHRoZW4gcm0gLWYgLi4vJCRkOyBsbiAtcyBgcHdkYCAuLi8kJGQ7IGZpOyBcCisJZmlsZXM9IiI7IFwKKwlmb3IgZiBpbiAkKERJU1RGSUxFUyk7IGRvIGZpbGVzPSIkJGZpbGVzICQkZC8kJGYiOyBkb25lOyBcCisJY2QgLi47IFwKKwlHWklQPS05ICQoVEFSKSBjaG9meiAkJGQvJCRkLnRhci5neiAkJGZpbGVzOyBcCisJaWYgdGVzdCAhIC1kICQkZDsgdGhlbiBybSAtZiAkJGQ7IGZpCisJbXYgTWFrZWZpbGV+IE1ha2VmaWxlCisKK3RhZ3M6CisJZXRhZ3MgKi5bY2hdCisKK2RlcGVuZDoKKwltYWtlZGVwZW5kIC0tICQoQ0ZMQUdTKSAtLSAqLltjaF0KKworIyBETyBOT1QgREVMRVRFIFRISVMgTElORSAtLSBtYWtlIGRlcGVuZCBkZXBlbmRzIG9uIGl0LgorCithZGxlcjMyLm86IHpsaWIuaCB6Y29uZi5oCitjb21wcmVzcy5vOiB6bGliLmggemNvbmYuaAorY3JjMzIubzogemxpYi5oIHpjb25mLmgKK2RlZmxhdGUubzogZGVmbGF0ZS5oIHp1dGlsLmggemxpYi5oIHpjb25mLmgKK2V4YW1wbGUubzogemxpYi5oIHpjb25mLmgKK2d6aW8ubzogenV0aWwuaCB6bGliLmggemNvbmYuaAoraW5mYmxvY2subzogaW5mYmxvY2suaCBpbmZ0cmVlcy5oIGluZmNvZGVzLmggaW5mdXRpbC5oIHp1dGlsLmggemxpYi5oIHpjb25mLmgKK2luZmNvZGVzLm86IHp1dGlsLmggemxpYi5oIHpjb25mLmgKK2luZmNvZGVzLm86IGluZnRyZWVzLmggaW5mYmxvY2suaCBpbmZjb2Rlcy5oIGluZnV0aWwuaCBpbmZmYXN0LmgKK2luZmZhc3QubzogenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZ0cmVlcy5oCitpbmZmYXN0Lm86IGluZmJsb2NrLmggaW5mY29kZXMuaCBpbmZ1dGlsLmggaW5mZmFzdC5oCitpbmZsYXRlLm86IHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mYmxvY2suaAoraW5mdHJlZXMubzogenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZ0cmVlcy5oCitpbmZ1dGlsLm86IHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mYmxvY2suaCBpbmZ0cmVlcy5oIGluZmNvZGVzLmggaW5mdXRpbC5oCittaW5pZ3ppcC5vOiB6bGliLmggemNvbmYuaAordHJlZXMubzogZGVmbGF0ZS5oIHp1dGlsLmggemxpYi5oIHpjb25mLmggdHJlZXMuaAordW5jb21wci5vOiB6bGliLmggemNvbmYuaAorenV0aWwubzogenV0aWwuaCB6bGliLmggemNvbmYuaApkaWZmIC0tZ2l0IGEvemxpYi0xLjIuNi9vbGQvb3MyL3psaWIuZGVmIGIvemxpYi0xLjIuNi9vbGQvb3MyL3psaWIuZGVmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjNzUzZjEKLS0tIC9kZXYvbnVsbAorKysgYi96bGliLTEuMi42L29sZC9vczIvemxpYi5kZWYKQEAgLTAsMCArMSw1MSBAQAorOworOyBTbGlnaHRseSBtb2RpZmllZCB2ZXJzaW9uIG9mIC4uL250L3psaWIuZG50IDotKQorOworCitMSUJSQVJZCQlaCitERVNDUklQVElPTgkiWmxpYiBjb21wcmVzc2lvbiBsaWJyYXJ5IGZvciBPUy8yIgorQ09ERQkJUFJFTE9BRCBNT1ZFQUJMRSBESVNDQVJEQUJMRQorREFUQQkJUFJFTE9BRCBNT1ZFQUJMRSBNVUxUSVBMRQorCitFWFBPUlRTCisgICAgYWRsZXIzMgorICAgIGNvbXByZXNzCisgICAgY3JjMzIKKyAgICBkZWZsYXRlCisgICAgZGVmbGF0ZUNvcHkKKyAgICBkZWZsYXRlRW5kCisgICAgZGVmbGF0ZUluaXQyXworICAgIGRlZmxhdGVJbml0XworICAgIGRlZmxhdGVQYXJhbXMKKyAgICBkZWZsYXRlUmVzZXQKKyAgICBkZWZsYXRlU2V0RGljdGlvbmFyeQorICAgIGd6Y2xvc2UKKyAgICBnemRvcGVuCisgICAgZ3plcnJvcgorICAgIGd6Zmx1c2gKKyAgICBnem9wZW4KKyAgICBnenJlYWQKKyAgICBnendyaXRlCisgICAgaW5mbGF0ZQorICAgIGluZmxhdGVFbmQKKyAgICBpbmZsYXRlSW5pdDJfCisgICAgaW5mbGF0ZUluaXRfCisgICAgaW5mbGF0ZVJlc2V0CisgICAgaW5mbGF0ZVNldERpY3Rpb25hcnkKKyAgICBpbmZsYXRlU3luYworICAgIHVuY29tcHJlc3MKKyAgICB6bGliVmVyc2lvbgorICAgIGd6cHJpbnRmCisgICAgZ3pwdXRjCisgICAgZ3pnZXRjCisgICAgZ3pzZWVrCisgICAgZ3pyZXdpbmQKKyAgICBnenRlbGwKKyAgICBnemVvZgorICAgIGd6c2V0cGFyYW1zCisgICAgekVycm9yCisgICAgaW5mbGF0ZVN5bmNQb2ludAorICAgIGdldF9jcmNfdGFibGUKKyAgICBjb21wcmVzczIKKyAgICBnenB1dHMKKyAgICBnemdldHMKZGlmZiAtLWdpdCBhL3psaWItMS4yLjYvb2xkL3Zpc3VhbC1iYXNpYy50eHQgYi96bGliLTEuMi42L29sZC92aXN1YWwtYmFzaWMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3ZWZlNTgKLS0tIC9kZXYvbnVsbAorKysgYi96bGliLTEuMi42L29sZC92aXN1YWwtYmFzaWMudHh0CkBAIC0wLDAgKzEsMTYwIEBACitTZWUgYmVsb3cgc29tZSBmdW5jdGlvbnMgZGVjbGFyYXRpb25zIGZvciBWaXN1YWwgQmFzaWMuCisKK0ZyZXF1ZW50bHkgQXNrZWQgUXVlc3Rpb246CisKK1E6IEVhY2ggdGltZSBJIHVzZSB0aGUgY29tcHJlc3MgZnVuY3Rpb24gSSBnZXQgdGhlIC01IGVycm9yIChub3QgZW5vdWdoCisgICByb29tIGluIHRoZSBvdXRwdXQgYnVmZmVyKS4KKworQTogTWFrZSBzdXJlIHRoYXQgdGhlIGxlbmd0aCBvZiB0aGUgY29tcHJlc3NlZCBidWZmZXIgaXMgcGFzc2VkIGJ5CisgICByZWZlcmVuY2UgKCJhcyBhbnkiKSwgbm90IGJ5IHZhbHVlICgiYXMgbG9uZyIpLiBBbHNvIGNoZWNrIHRoYXQKKyAgIGJlZm9yZSB0aGUgY2FsbCBvZiBjb21wcmVzcyB0aGlzIGxlbmd0aCBpcyBlcXVhbCB0byB0aGUgdG90YWwgc2l6ZSBvZgorICAgdGhlIGNvbXByZXNzZWQgYnVmZmVyIGFuZCBub3QgemVyby4KKworCitGcm9tOiAiSm9uIENhcnVhbmEiIDxqb24tbmV0QHVzYS5uZXQ+CitTdWJqZWN0OiBSZTogSG93IHRvIHBvcnQgemxpYiBkZWNsYXJlcyB0byB2Yj8KK0RhdGU6IE1vbiwgMjggT2N0IDE5OTYgMTg6MzM6MDMgLTA2MDAKKworR290IHRoZSBhbnN3ZXIhIChJIGhhdmVuJ3QgaGFkIHRpbWUgdG8gY2hlY2sgdGhpcyBidXQgaXQncyB3aGF0IEkgZ290LCBhbmQKK2xvb2tzIGNvcnJlY3QpOgorCitIZSBoYXMgdGhlIGZvbGxvd2luZyByb3V0aW5lcyB3b3JraW5nOgorICAgICAgICBjb21wcmVzcworICAgICAgICB1bmNvbXByZXNzCisgICAgICAgIGd6b3BlbgorICAgICAgICBnendyaXRlCisgICAgICAgIGd6cmVhZAorICAgICAgICBnemNsb3NlCisKK0RlY2xhcmVzIGZvbGxvdzogKFF1b3RlZCBmcm9tIENhcmxvcyBSaW9zIDxjX3Jpb3NAc29uZGEuY2w+LCBpbiBWYjQgZm9ybSkKKworI0lmIFdpbjE2IFRoZW4gICAnVXNlIFdpbjE2IGNhbGxzLgorRGVjbGFyZSBGdW5jdGlvbiBjb21wcmVzcyBMaWIgIlpMSUIuRExMIiAoQnlWYWwgY29tcHIgQXMKKyAgICAgICAgU3RyaW5nLCBjb21wckxlbiBBcyBBbnksIEJ5VmFsIGJ1ZiBBcyBTdHJpbmcsIEJ5VmFsIGJ1ZmxlbgorICAgICAgICBBcyBMb25nKSBBcyBJbnRlZ2VyCitEZWNsYXJlIEZ1bmN0aW9uIHVuY29tcHJlc3MgTGliICJaTElCLkRMTCIgKEJ5VmFsIHVuY29tcHIKKyAgICAgICAgQXMgU3RyaW5nLCB1bmNvbXByTGVuIEFzIEFueSwgQnlWYWwgY29tcHIgQXMgU3RyaW5nLCBCeVZhbAorICAgICAgICBsY29tcHIgQXMgTG9uZykgQXMgSW50ZWdlcgorRGVjbGFyZSBGdW5jdGlvbiBnem9wZW4gTGliICJaTElCLkRMTCIgKEJ5VmFsIGZpbGVQYXRoIEFzCisgICAgICAgIFN0cmluZywgQnlWYWwgbW9kZSBBcyBTdHJpbmcpIEFzIExvbmcKK0RlY2xhcmUgRnVuY3Rpb24gZ3pyZWFkIExpYiAiWkxJQi5ETEwiIChCeVZhbCBmaWxlIEFzCisgICAgICAgIExvbmcsIEJ5VmFsIHVuY29tcHIgQXMgU3RyaW5nLCBCeVZhbCB1bmNvbXByTGVuIEFzIEludGVnZXIpCisgICAgICAgIEFzIEludGVnZXIKK0RlY2xhcmUgRnVuY3Rpb24gZ3p3cml0ZSBMaWIgIlpMSUIuRExMIiAoQnlWYWwgZmlsZSBBcworICAgICAgICBMb25nLCBCeVZhbCB1bmNvbXByIEFzIFN0cmluZywgQnlWYWwgdW5jb21wckxlbiBBcyBJbnRlZ2VyKQorICAgICAgICBBcyBJbnRlZ2VyCitEZWNsYXJlIEZ1bmN0aW9uIGd6Y2xvc2UgTGliICJaTElCLkRMTCIgKEJ5VmFsIGZpbGUgQXMKKyAgICAgICAgTG9uZykgQXMgSW50ZWdlcgorI0Vsc2UKK0RlY2xhcmUgRnVuY3Rpb24gY29tcHJlc3MgTGliICJaTElCMzIuRExMIgorICAgICAgICAoQnlWYWwgY29tcHIgQXMgU3RyaW5nLCBjb21wckxlbiBBcyBBbnksIEJ5VmFsIGJ1ZiBBcworICAgICAgICBTdHJpbmcsIEJ5VmFsIGJ1ZmxlbiBBcyBMb25nKSBBcyBJbnRlZ2VyCitEZWNsYXJlIEZ1bmN0aW9uIHVuY29tcHJlc3MgTGliICJaTElCMzIuRExMIgorICAgICAgICAoQnlWYWwgdW5jb21wciBBcyBTdHJpbmcsIHVuY29tcHJMZW4gQXMgQW55LCBCeVZhbCBjb21wciBBcworICAgICAgICBTdHJpbmcsIEJ5VmFsIGxjb21wciBBcyBMb25nKSBBcyBMb25nCitEZWNsYXJlIEZ1bmN0aW9uIGd6b3BlbiBMaWIgIlpMSUIzMi5ETEwiCisgICAgICAgIChCeVZhbCBmaWxlIEFzIFN0cmluZywgQnlWYWwgbW9kZSBBcyBTdHJpbmcpIEFzIExvbmcKK0RlY2xhcmUgRnVuY3Rpb24gZ3pyZWFkIExpYiAiWkxJQjMyLkRMTCIKKyAgICAgICAgKEJ5VmFsIGZpbGUgQXMgTG9uZywgQnlWYWwgdW5jb21wciBBcyBTdHJpbmcsIEJ5VmFsCisgICAgICAgIHVuY29tcHJMZW4gQXMgTG9uZykgQXMgTG9uZworRGVjbGFyZSBGdW5jdGlvbiBnendyaXRlIExpYiAiWkxJQjMyLkRMTCIKKyAgICAgICAgKEJ5VmFsIGZpbGUgQXMgTG9uZywgQnlWYWwgdW5jb21wciBBcyBTdHJpbmcsIEJ5VmFsCisgICAgICAgIHVuY29tcHJMZW4gQXMgTG9uZykgQXMgTG9uZworRGVjbGFyZSBGdW5jdGlvbiBnemNsb3NlIExpYiAiWkxJQjMyLkRMTCIKKyAgICAgICAgKEJ5VmFsIGZpbGUgQXMgTG9uZykgQXMgTG9uZworI0VuZCBJZgorCistSm9uIENhcnVhbmEKK2pvbi1uZXRAdXNhLm5ldAorTWljcm9zb2Z0IFNpdGVidWlsZGVyIE5ldHdvcmsgTGV2ZWwgMSBNZW1iZXIgLSBIVE1MIFdyaXRlcidzIEd1aWxkIE1lbWJlcgorCisKK0hlcmUgaXMgYW5vdGhlciBleGFtcGxlIGZyb20gTWljaGFlbCA8bWljaGFlbF9ib3Jnc3lzQGhvdG1haWwuY29tPiB0aGF0IGhlCitzYXlzIGNvbmZvcm1zIHRvIHRoZSBWQiBndWlkZWxpbmVzLCBhbmQgdGhhdCBzb2x2ZXMgdGhlIHByb2JsZW0gb2Ygbm90Citrbm93aW5nIHRoZSB1bmNvbXByZXNzZWQgc2l6ZSBieSBzdG9yaW5nIGl0IGF0IHRoZSBlbmQgb2YgdGhlIGZpbGU6CisKKydDYWxsaW5nIHRoZSBmdW5jdGlvbnM6CisnYnJhY2tldCBtZWFuaW5nOiA8cGFyYW1ldGVyPiBbb3B0aW9uYWxdIHtSYW5nZSBvZiBwb3NzaWJsZSB2YWx1ZXN9CisnQ2FsbCBzdWJDb21wcmVzc0ZpbGUoPHBhdGggd2l0aCBmaWxlbmFtZSB0byBjb21wcmVzcz4gWywgPHBhdGggd2l0aAorZmlsZW5hbWUgdG8gd3JpdGUgdG8+LCBbbGV2ZWwgb2YgY29tcHJlc3Npb24gezEuLjl9XV0pCisnQ2FsbCBzdWJVbmNvbXByZXNzRmlsZSg8cGF0aCB3aXRoIGZpbGVuYW1lIHRvIGNvbXByZXNzPikKKworT3B0aW9uIEV4cGxpY2l0CitQcml2YXRlIGxuZ3B2dFBjblNtbCBBcyBMb25nICdTdG9yZXMgdmFsdWUgZm9yICdsbmdQZXJjZW50U21hbGxlcicKK1ByaXZhdGUgQ29uc3QgU1VDQ0VTUyBBcyBMb25nID0gMAorUHJpdmF0ZSBDb25zdCBzdHJGaWxFeHQgQXMgU3RyaW5nID0gIi5jcHIiCitQcml2YXRlIERlY2xhcmUgRnVuY3Rpb24gbG5nZm5jQ3ByIExpYiAiemxpYi5kbGwiIEFsaWFzICJjb21wcmVzczIiIChCeVJlZgorZGVzdCBBcyBBbnksIEJ5UmVmIGRlc3RMZW4gQXMgQW55LCBCeVJlZiBzcmMgQXMgQW55LCBCeVZhbCBzcmNMZW4gQXMgTG9uZywKK0J5VmFsIGxldmVsIEFzIEludGVnZXIpIEFzIExvbmcKK1ByaXZhdGUgRGVjbGFyZSBGdW5jdGlvbiBsbmdmbmNVY3AgTGliICJ6bGliLmRsbCIgQWxpYXMgInVuY29tcHJlc3MiIChCeVJlZgorZGVzdCBBcyBBbnksIEJ5UmVmIGRlc3RMZW4gQXMgQW55LCBCeVJlZiBzcmMgQXMgQW55LCBCeVZhbCBzcmNMZW4gQXMgTG9uZykKK0FzIExvbmcKKworUHVibGljIFN1YiBzdWJDb21wcmVzc0ZpbGUoQnlWYWwgc3RyYXJnT3JpRmlsUHRoIEFzIFN0cmluZywgT3B0aW9uYWwgQnlWYWwKK3N0cmFyZ0NwckZpbFB0aCBBcyBTdHJpbmcsIE9wdGlvbmFsIEJ5VmFsIGludEx2bCBBcyBJbnRlZ2VyID0gOSkKKyAgICBEaW0gc3RyQ3ByUHRoIEFzIFN0cmluZworICAgIERpbSBsbmdPcmlTaXogQXMgTG9uZworICAgIERpbSBsbmdDcHJTaXogQXMgTG9uZworICAgIERpbSBieXRhcnlPcmkoKSBBcyBCeXRlCisgICAgRGltIGJ5dGFyeUNwcigpIEFzIEJ5dGUKKyAgICBsbmdPcmlTaXogPSBGaWxlTGVuKHN0cmFyZ09yaUZpbFB0aCkKKyAgICBSZURpbSBieXRhcnlPcmkobG5nT3JpU2l6IC0gMSkKKyAgICBPcGVuIHN0cmFyZ09yaUZpbFB0aCBGb3IgQmluYXJ5IEFjY2VzcyBSZWFkIEFzICMxCisgICAgICAgIEdldCAjMSwgLCBieXRhcnlPcmkoKQorICAgIENsb3NlICMxCisgICAgc3RyQ3ByUHRoID0gSUlmKHN0cmFyZ0NwckZpbFB0aCA9ICIiLCBzdHJhcmdPcmlGaWxQdGgsIHN0cmFyZ0NwckZpbFB0aCkKKydTZWxlY3QgZmlsZSBwYXRoIGFuZCBuYW1lCisgICAgc3RyQ3ByUHRoID0gc3RyQ3ByUHRoICYgSUlmKFJpZ2h0KHN0ckNwclB0aCwgTGVuKHN0ckZpbEV4dCkpID0KK3N0ckZpbEV4dCwgIiIsIHN0ckZpbEV4dCkgJ0FkZCBmaWxlIGV4dGVuc2lvbiBpZiBub3QgZXhpc3RzCisgICAgbG5nQ3ByU2l6ID0gKGxuZ09yaVNpeiAqIDEuMDEpICsgMTIgJ0NvbXByZXNzaW9uIG5lZWRzIHRlbXBvcmFyeSBhIGJpdAorbW9yZSBzcGFjZSB0aGVuIG9yaWdpbmFsIGZpbGUgc2l6ZQorICAgIFJlRGltIGJ5dGFyeUNwcihsbmdDcHJTaXogLSAxKQorICAgIElmIGxuZ2ZuY0NwcihieXRhcnlDcHIoMCksIGxuZ0NwclNpeiwgYnl0YXJ5T3JpKDApLCBsbmdPcmlTaXosIGludEx2bCkgPQorU1VDQ0VTUyBUaGVuCisgICAgICAgIGxuZ3B2dFBjblNtbCA9ICgxIyAtIChsbmdDcHJTaXogLyBsbmdPcmlTaXopKSAqIDEwMAorICAgICAgICBSZURpbSBQcmVzZXJ2ZSBieXRhcnlDcHIobG5nQ3ByU2l6IC0gMSkKKyAgICAgICAgT3BlbiBzdHJDcHJQdGggRm9yIEJpbmFyeSBBY2Nlc3MgV3JpdGUgQXMgIzEKKyAgICAgICAgICAgIFB1dCAjMSwgLCBieXRhcnlDcHIoKQorICAgICAgICAgICAgUHV0ICMxLCAsIGxuZ09yaVNpeiAnQWRkIHRoZSB0aGUgb3JpZ2luYWwgc2l6ZSB2YWx1ZSB0byB0aGUgZW5kCisobGFzdCA0IGJ5dGVzKQorICAgICAgICBDbG9zZSAjMQorICAgIEVsc2UKKyAgICAgICAgTXNnQm94ICJDb21wcmVzc2lvbiBlcnJvciIKKyAgICBFbmQgSWYKKyAgICBFcmFzZSBieXRhcnlDcHIKKyAgICBFcmFzZSBieXRhcnlPcmkKK0VuZCBTdWIKKworUHVibGljIFN1YiBzdWJVbmNvbXByZXNzRmlsZShCeVZhbCBzdHJhcmdGaWxQdGggQXMgU3RyaW5nKQorICAgIERpbSBieXRhcnlDcHIoKSBBcyBCeXRlCisgICAgRGltIGJ5dGFyeU9yaSgpIEFzIEJ5dGUKKyAgICBEaW0gbG5nT3JpU2l6IEFzIExvbmcKKyAgICBEaW0gbG5nQ3ByU2l6IEFzIExvbmcKKyAgICBEaW0gc3RyT3JpUHRoIEFzIFN0cmluZworICAgIGxuZ0NwclNpeiA9IEZpbGVMZW4oc3RyYXJnRmlsUHRoKQorICAgIFJlRGltIGJ5dGFyeUNwcihsbmdDcHJTaXogLSAxKQorICAgIE9wZW4gc3RyYXJnRmlsUHRoIEZvciBCaW5hcnkgQWNjZXNzIFJlYWQgQXMgIzEKKyAgICAgICAgR2V0ICMxLCAsIGJ5dGFyeUNwcigpCisgICAgQ2xvc2UgIzEKKyAgICAnUmVhZCB0aGUgb3JpZ2luYWwgZmlsZSBzaXplIHZhbHVlOgorICAgIGxuZ09yaVNpeiA9IGJ5dGFyeUNwcihsbmdDcHJTaXogLSAxKSAqICgyIF4gMjQpIF8KKyAgICAgICAgICAgICAgKyBieXRhcnlDcHIobG5nQ3ByU2l6IC0gMikgKiAoMiBeIDE2KSBfCisgICAgICAgICAgICAgICsgYnl0YXJ5Q3ByKGxuZ0NwclNpeiAtIDMpICogKDIgXiA4KSBfCisgICAgICAgICAgICAgICsgYnl0YXJ5Q3ByKGxuZ0NwclNpeiAtIDQpCisgICAgUmVEaW0gUHJlc2VydmUgYnl0YXJ5Q3ByKGxuZ0NwclNpeiAtIDUpICdDdXQgb2YgdGhlIG9yaWdpbmFsIHNpemUgdmFsdWUKKyAgICBSZURpbSBieXRhcnlPcmkobG5nT3JpU2l6IC0gMSkKKyAgICBJZiBsbmdmbmNVY3AoYnl0YXJ5T3JpKDApLCBsbmdPcmlTaXosIGJ5dGFyeUNwcigwKSwgbG5nQ3ByU2l6KSA9IFNVQ0NFU1MKK1RoZW4KKyAgICAgICAgc3RyT3JpUHRoID0gTGVmdChzdHJhcmdGaWxQdGgsIExlbihzdHJhcmdGaWxQdGgpIC0gTGVuKHN0ckZpbEV4dCkpCisgICAgICAgIE9wZW4gc3RyT3JpUHRoIEZvciBCaW5hcnkgQWNjZXNzIFdyaXRlIEFzICMxCisgICAgICAgICAgICBQdXQgIzEsICwgYnl0YXJ5T3JpKCkKKyAgICAgICAgQ2xvc2UgIzEKKyAgICBFbHNlCisgICAgICAgIE1zZ0JveCAiVW5jb21wcmVzc2lvbiBlcnJvciIKKyAgICBFbmQgSWYKKyAgICBFcmFzZSBieXRhcnlDcHIKKyAgICBFcmFzZSBieXRhcnlPcmkKK0VuZCBTdWIKK1B1YmxpYyBQcm9wZXJ0eSBHZXQgbG5nUGVyY2VudFNtYWxsZXIoKSBBcyBMb25nCisgICAgbG5nUGVyY2VudFNtYWxsZXIgPSBsbmdwdnRQY25TbWwKK0VuZCBQcm9wZXJ0eQpkaWZmIC0tZ2l0IGEvemxpYi0xLjIuNi9xbngvcGFja2FnZS5xcGcgYi96bGliLTEuMi42L3FueC9wYWNrYWdlLnFwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDdlYTZhCi0tLSAvZGV2L251bGwKKysrIGIvemxpYi0xLjIuNi9xbngvcGFja2FnZS5xcGcKQEAgLTAsMCArMSwxNDEgQEAKKzxRUEc6R2VuZXJhdGlvbj4KKyAgIDxRUEc6T3B0aW9ucz4KKyAgICAgIDxRUEc6VXNlciB1bmF0dGVuZGVkPSJubyIgdmVyYm9zaXR5PSIyIiBsaXN0ZmlsZXM9InllcyIvPgorICAgICAgPFFQRzpEZWZhdWx0cyB0eXBlPSJxbnhfcGFja2FnZSIvPgorICAgICAgPFFQRzpTb3VyY2U+PC9RUEc6U291cmNlPgorICAgICAgPFFQRzpSZWxlYXNlIG51bWJlcj0iKyIvPgorICAgICAgPFFQRzpCdWlsZD48L1FQRzpCdWlsZD4KKyAgICAgIDxRUEc6RmlsZVNvcnRpbmcgc3RyaXA9InllcyIvPgorICAgICAgPFFQRzpQYWNrYWdlIHRhcmdldHM9ImNvbWJpbmUiLz4KKyAgICAgIDxRUEc6UmVwb3NpdG9yeSBnZW5lcmF0ZT0ieWVzIi8+CisgICAgICA8UVBHOkZpbmFsRGlyPjwvUVBHOkZpbmFsRGlyPgorICAgICAgPFFQRzpDbGVhbnVwPjwvUVBHOkNsZWFudXA+CisgICA8L1FQRzpPcHRpb25zPgorCisgICA8UVBHOlJlc3BvbnNpYmxlPgorICAgICAgPFFQRzpDb21wYW55PjwvUVBHOkNvbXBhbnk+CisgICAgICA8UVBHOkRlcGFydG1lbnQ+PC9RUEc6RGVwYXJ0bWVudD4KKyAgICAgIDxRUEc6R3JvdXA+PC9RUEc6R3JvdXA+CisgICAgICA8UVBHOlRlYW0+PC9RUEc6VGVhbT4KKyAgICAgIDxRUEc6RW1wbG95ZWU+PC9RUEc6RW1wbG95ZWU+CisgICAgICA8UVBHOkVtYWlsQWRkcmVzcz48L1FQRzpFbWFpbEFkZHJlc3M+CisgICA8L1FQRzpSZXNwb25zaWJsZT4KKworICAgPFFQRzpWYWx1ZXM+CisgICAgICA8UVBHOkZpbGVzPgorICAgICAgICAgPFFQRzpBZGQgZmlsZT0iLi4vemNvbmYuaCIgaW5zdGFsbD0iL29wdC9pbmNsdWRlLyIgdXNlcj0icm9vdDpzeXMiIHBlcm1pc3Npb249IjY0NCIvPgorICAgICAgICAgPFFQRzpBZGQgZmlsZT0iLi4vemxpYi5oIiBpbnN0YWxsPSIvb3B0L2luY2x1ZGUvIiB1c2VyPSJyb290OnN5cyIgcGVybWlzc2lvbj0iNjQ0Ii8+CisgICAgICAgICA8UVBHOkFkZCBmaWxlPSIuLi9saWJ6LnNvLjEuMi42IiBpbnN0YWxsPSIvb3B0L2xpYi8iIHVzZXI9InJvb3Q6YmluIiBwZXJtaXNzaW9uPSI2NDQiLz4KKyAgICAgICAgIDxRUEc6QWRkIGZpbGU9ImxpYnouc28iIGluc3RhbGw9Ii9vcHQvbGliLyIgY29tcG9uZW50PSJkZXYiIGZpbGV0eXBlPSJzeW1saW5rIiBsaW5rdG89ImxpYnouc28uMS4yLjYiLz4KKyAgICAgICAgIDxRUEc6QWRkIGZpbGU9ImxpYnouc28uMSIgaW5zdGFsbD0iL29wdC9saWIvIiBmaWxldHlwZT0ic3ltbGluayIgbGlua3RvPSJsaWJ6LnNvLjEuMi42Ii8+CisgICAgICAgICA8UVBHOkFkZCBmaWxlPSIuLi9saWJ6LnNvLjEuMi42IiBpbnN0YWxsPSIvb3B0L2xpYi8iIGNvbXBvbmVudD0ic2xpYiIvPgorICAgICAgPC9RUEc6RmlsZXM+CisKKyAgICAgIDxRUEc6UGFja2FnZUZpbHRlcj4KKyAgICAgICAgIDxRUE06UGFja2FnZU1hbmlmZXN0PgorICAgICAgICAgICAgPFFQTTpQYWNrYWdlRGVzY3JpcHRpb24+CisgICAgICAgICAgICAgICA8UVBNOlBhY2thZ2VUeXBlPkxpYnJhcnk8L1FQTTpQYWNrYWdlVHlwZT4KKyAgICAgICAgICAgICAgIDxRUE06UGFja2FnZVJlbGVhc2VOb3Rlcz48L1FQTTpQYWNrYWdlUmVsZWFzZU5vdGVzPgorICAgICAgICAgICAgICAgPFFQTTpQYWNrYWdlUmVsZWFzZVVyZ2VuY3k+TWVkaXVtPC9RUE06UGFja2FnZVJlbGVhc2VVcmdlbmN5PgorICAgICAgICAgICAgICAgPFFQTTpQYWNrYWdlUmVwb3NpdG9yeT48L1FQTTpQYWNrYWdlUmVwb3NpdG9yeT4KKyAgICAgICAgICAgICAgIDxRUE06RmlsZVZlcnNpb24+Mi4wPC9RUE06RmlsZVZlcnNpb24+CisgICAgICAgICAgICA8L1FQTTpQYWNrYWdlRGVzY3JpcHRpb24+CisKKyAgICAgICAgICAgIDxRUE06UHJvZHVjdERlc2NyaXB0aW9uPgorICAgICAgICAgICAgICAgPFFQTTpQcm9kdWN0TmFtZT56bGliPC9RUE06UHJvZHVjdE5hbWU+CisgICAgICAgICAgICAgICA8UVBNOlByb2R1Y3RJZGVudGlmaWVyPnpsaWI8L1FQTTpQcm9kdWN0SWRlbnRpZmllcj4KKyAgICAgICAgICAgICAgIDxRUE06UHJvZHVjdEVtYWlsPmFsYWluLmJvbm5lZm95QGljYnQuY29tPC9RUE06UHJvZHVjdEVtYWlsPgorICAgICAgICAgICAgICAgPFFQTTpWZW5kb3JOYW1lPlB1YmxpYzwvUVBNOlZlbmRvck5hbWU+CisgICAgICAgICAgICAgICA8UVBNOlZlbmRvckluc3RhbGxOYW1lPnB1YmxpYzwvUVBNOlZlbmRvckluc3RhbGxOYW1lPgorICAgICAgICAgICAgICAgPFFQTTpWZW5kb3JVUkw+d3d3Lmd6aXAub3JnL3psaWI8L1FQTTpWZW5kb3JVUkw+CisgICAgICAgICAgICAgICA8UVBNOlZlbmRvckVtYmVkVVJMPjwvUVBNOlZlbmRvckVtYmVkVVJMPgorICAgICAgICAgICAgICAgPFFQTTpWZW5kb3JFbWFpbD48L1FQTTpWZW5kb3JFbWFpbD4KKyAgICAgICAgICAgICAgIDxRUE06QXV0aG9yTmFtZT5KZWFuLUxvdXAgR2FpbGx5LE1hcmsgQWRsZXI8L1FQTTpBdXRob3JOYW1lPgorICAgICAgICAgICAgICAgPFFQTTpBdXRob3JVUkw+d3d3Lmd6aXAub3JnL3psaWI8L1FQTTpBdXRob3JVUkw+CisgICAgICAgICAgICAgICA8UVBNOkF1dGhvckVtYmVkVVJMPjwvUVBNOkF1dGhvckVtYmVkVVJMPgorICAgICAgICAgICAgICAgPFFQTTpBdXRob3JFbWFpbD56bGliQGd6aXAub3JnPC9RUE06QXV0aG9yRW1haWw+CisgICAgICAgICAgICAgICA8UVBNOlByb2R1Y3RJY29uU21hbGw+PC9RUE06UHJvZHVjdEljb25TbWFsbD4KKyAgICAgICAgICAgICAgIDxRUE06UHJvZHVjdEljb25MYXJnZT48L1FQTTpQcm9kdWN0SWNvbkxhcmdlPgorICAgICAgICAgICAgICAgPFFQTTpQcm9kdWN0RGVzY3JpcHRpb25TaG9ydD5BIG1hc3NpdmVseSBzcGlmZnkgeWV0IGRlbGljYXRlbHkgdW5vYnRydXNpdmUgY29tcHJlc3Npb24gbGlicmFyeS48L1FQTTpQcm9kdWN0RGVzY3JpcHRpb25TaG9ydD4KKyAgICAgICAgICAgICAgIDxRUE06UHJvZHVjdERlc2NyaXB0aW9uTG9uZz56bGliIGlzIGRlc2lnbmVkIHRvIGJlIGEgZnJlZSwgZ2VuZXJhbC1wdXJwb3NlLCBsZWdhbGx5IHVuZW5jdW1iZXJlZCwgbG9zc2xlc3MgZGF0YSBjb21wcmVzc2lvbiBsaWJyYXJ5IGZvciB1c2Ugb24gdmlydHVhbGx5IGFueSBjb21wdXRlciBoYXJkd2FyZSBhbmQgb3BlcmF0aW5nIHN5c3RlbS48L1FQTTpQcm9kdWN0RGVzY3JpcHRpb25Mb25nPgorICAgICAgICAgICAgICAgPFFQTTpQcm9kdWN0RGVzY3JpcHRpb25VUkw+aHR0cDovL3d3dy5nemlwLm9yZy96bGliPC9RUE06UHJvZHVjdERlc2NyaXB0aW9uVVJMPgorICAgICAgICAgICAgICAgPFFQTTpQcm9kdWN0RGVzY3JpcHRpb25FbWJlZFVSTD48L1FQTTpQcm9kdWN0RGVzY3JpcHRpb25FbWJlZFVSTD4KKyAgICAgICAgICAgIDwvUVBNOlByb2R1Y3REZXNjcmlwdGlvbj4KKworICAgICAgICAgICAgPFFQTTpSZWxlYXNlRGVzY3JpcHRpb24+CisgICAgICAgICAgICAgICA8UVBNOlJlbGVhc2VWZXJzaW9uPjEuMi42PC9RUE06UmVsZWFzZVZlcnNpb24+CisgICAgICAgICAgICAgICA8UVBNOlJlbGVhc2VVcmdlbmN5Pk1lZGl1bTwvUVBNOlJlbGVhc2VVcmdlbmN5PgorICAgICAgICAgICAgICAgPFFQTTpSZWxlYXNlU3RhYmlsaXR5PlN0YWJsZTwvUVBNOlJlbGVhc2VTdGFiaWxpdHk+CisgICAgICAgICAgICAgICA8UVBNOlJlbGVhc2VOb3RlTWlub3I+PC9RUE06UmVsZWFzZU5vdGVNaW5vcj4KKyAgICAgICAgICAgICAgIDxRUE06UmVsZWFzZU5vdGVNYWpvcj48L1FQTTpSZWxlYXNlTm90ZU1ham9yPgorICAgICAgICAgICAgICAgPFFQTTpFeGNsdWRlQ291bnRyaWVzPgorICAgICAgICAgICAgICAgICAgPFFQTTpDb3VudHJ5PjwvUVBNOkNvdW50cnk+CisgICAgICAgICAgICAgICA8L1FQTTpFeGNsdWRlQ291bnRyaWVzPgorCisgICAgICAgICAgICAgICA8UVBNOlJlbGVhc2VDb3B5cmlnaHQ+Tm8gTGljZW5zZTwvUVBNOlJlbGVhc2VDb3B5cmlnaHQ+CisgICAgICAgICAgICA8L1FQTTpSZWxlYXNlRGVzY3JpcHRpb24+CisKKyAgICAgICAgICAgIDxRUE06Q29udGVudERlc2NyaXB0aW9uPgorICAgICAgICAgICAgICAgPFFQTTpDb250ZW50VG9waWMgeG1sbXVsdGlwbGU9InRydWUiPlNvZnR3YXJlIERldmVsb3BtZW50L0xpYnJhcmllcyBhbmQgRXh0ZW5zaW9ucy9DIExpYnJhcmllczwvUVBNOkNvbnRlbnRUb3BpYz4KKyAgICAgICAgICAgICAgIDxRUE06Q29udGVudEtleXdvcmQ+emxpYixjb21wcmVzc2lvbjwvUVBNOkNvbnRlbnRLZXl3b3JkPgorICAgICAgICAgICAgICAgPFFQTTpUYXJnZXRPUz5xbng2PC9RUE06VGFyZ2V0T1M+CisgICAgICAgICAgICAgICA8UVBNOkhvc3RPUz5xbng2PC9RUE06SG9zdE9TPgorICAgICAgICAgICAgICAgPFFQTTpEaXNwbGF5RW52aXJvbm1lbnQgeG1sbXVsdGlwbGU9InRydWUiPk5vbmU8L1FQTTpEaXNwbGF5RW52aXJvbm1lbnQ+CisgICAgICAgICAgICAgICA8UVBNOlRhcmdldEF1ZGllbmNlIHhtbG11bHRpcGxlPSJ0cnVlIj5EZXZlbG9wZXI8L1FQTTpUYXJnZXRBdWRpZW5jZT4KKyAgICAgICAgICAgIDwvUVBNOkNvbnRlbnREZXNjcmlwdGlvbj4KKyAgICAgICAgIDwvUVBNOlBhY2thZ2VNYW5pZmVzdD4KKyAgICAgIDwvUVBHOlBhY2thZ2VGaWx0ZXI+CisKKyAgICAgIDxRUEc6UGFja2FnZUZpbHRlciBwcm9jPSJub25lIiB0YXJnZXQ9Im5vbmUiPgorICAgICAgICAgPFFQTTpQYWNrYWdlTWFuaWZlc3Q+CisgICAgICAgICAgICA8UVBNOlByb2R1Y3RJbnN0YWxsYXRpb25EZXBlbmRlbmNpZXM+CisgICAgICAgICAgICAgICA8UVBNOlByb2R1Y3RSZXF1aXJlbWVudHM+PC9RUE06UHJvZHVjdFJlcXVpcmVtZW50cz4KKyAgICAgICAgICAgIDwvUVBNOlByb2R1Y3RJbnN0YWxsYXRpb25EZXBlbmRlbmNpZXM+CisKKyAgICAgICAgICAgIDxRUE06UHJvZHVjdEluc3RhbGxhdGlvblByb2NlZHVyZT4KKyAgICAgICAgICAgICAgIDxRUE06U2NyaXB0IHhtbG11bHRpcGxlPSJ0cnVlIj4KKyAgICAgICAgICAgICAgICAgIDxRUE06U2NyaXB0TmFtZT48L1FQTTpTY3JpcHROYW1lPgorICAgICAgICAgICAgICAgICAgPFFQTTpTY3JpcHRUeXBlPkluc3RhbGw8L1FQTTpTY3JpcHRUeXBlPgorICAgICAgICAgICAgICAgICAgPFFQTTpTY3JpcHRUaW1pbmc+UG9zdDwvUVBNOlNjcmlwdFRpbWluZz4KKyAgICAgICAgICAgICAgICAgIDxRUE06U2NyaXB0QmxvY2tpbmc+Tm88L1FQTTpTY3JpcHRCbG9ja2luZz4KKyAgICAgICAgICAgICAgICAgIDxRUE06U2NyaXB0UmVzdWx0Pklnbm9yZTwvUVBNOlNjcmlwdFJlc3VsdD4KKyAgICAgICAgICAgICAgICAgIDxRUE06U2hvcnREZXNjcmlwdGlvbj48L1FQTTpTaG9ydERlc2NyaXB0aW9uPgorICAgICAgICAgICAgICAgICAgPFFQTTpVc2VCaW5hcmllcz5ObzwvUVBNOlVzZUJpbmFyaWVzPgorICAgICAgICAgICAgICAgICAgPFFQTTpQcmlvcml0eT5PcHRpb25hbDwvUVBNOlByaW9yaXR5PgorICAgICAgICAgICAgICAgPC9RUE06U2NyaXB0PgorICAgICAgICAgICAgPC9RUE06UHJvZHVjdEluc3RhbGxhdGlvblByb2NlZHVyZT4KKyAgICAgICAgIDwvUVBNOlBhY2thZ2VNYW5pZmVzdD4KKworICAgICAgICAgPFFQTTpMYXVuY2g+CisgICAgICAgICA8L1FQTTpMYXVuY2g+CisgICAgICA8L1FQRzpQYWNrYWdlRmlsdGVyPgorCisgICAgICA8UVBHOlBhY2thZ2VGaWx0ZXIgdHlwZT0iY29yZSIgY29tcG9uZW50PSJub25lIj4KKyAgICAgICAgIDxRUE06UGFja2FnZU1hbmlmZXN0PgorICAgICAgICAgICAgPFFQTTpQcm9kdWN0SW5zdGFsbGF0aW9uUHJvY2VkdXJlPgorCSAgICAgICA8UVBNOk9yZGVyRGVwZW5kZW5jeSB4bWxtdWx0aXBsZT0idHJ1ZSI+CisJICAgICAgICAgIDxRUE06T3JkZXI+SW5zdGFsbE92ZXI8L1FQTTpPcmRlcj4KKwkgICAgICAgICAgPFFQTTpQcm9kdWN0PnpsaWI8L1FQTTpQcm9kdWN0PgorCSAgICAgICA8L1FQTTpPcmRlckRlcGVuZGVuY3k+CisgICAgICAgICAgICA8L1FQTTpQcm9kdWN0SW5zdGFsbGF0aW9uUHJvY2VkdXJlPgorICAgICAgICAgPC9RUE06UGFja2FnZU1hbmlmZXN0PgorCisgICAgICAgICA8UVBNOkxhdW5jaD4KKyAgICAgICAgIDwvUVBNOkxhdW5jaD4KKyAgICAgIDwvUVBHOlBhY2thZ2VGaWx0ZXI+CisKKyAgICAgIDxRUEc6UGFja2FnZUZpbHRlciB0eXBlPSJjb3JlIiBjb21wb25lbnQ9ImRldiI+CisgICAgICAgICA8UVBNOlBhY2thZ2VNYW5pZmVzdD4KKyAgICAgICAgICAgIDxRUE06UHJvZHVjdEluc3RhbGxhdGlvblByb2NlZHVyZT4KKwkgICAgICAgPFFQTTpPcmRlckRlcGVuZGVuY3kgeG1sbXVsdGlwbGU9InRydWUiPgorCSAgICAgICAgICA8UVBNOk9yZGVyPkluc3RhbGxPdmVyPC9RUE06T3JkZXI+CisJICAgICAgICAgIDxRUE06UHJvZHVjdD56bGliLWRldjwvUVBNOlByb2R1Y3Q+CisJICAgICAgIDwvUVBNOk9yZGVyRGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDwvUVBNOlByb2R1Y3RJbnN0YWxsYXRpb25Qcm9jZWR1cmU+CisgICAgICAgICA8L1FQTTpQYWNrYWdlTWFuaWZlc3Q+CisKKyAgICAgICAgIDxRUE06TGF1bmNoPgorICAgICAgICAgPC9RUE06TGF1bmNoPgorICAgICAgPC9RUEc6UGFja2FnZUZpbHRlcj4KKyAgIDwvUVBHOlZhbHVlcz4KKzwvUVBHOkdlbmVyYXRpb24+CmRpZmYgLS1naXQgYS96bGliLTEuMi42L3Rlc3QvZXhhbXBsZS5jIGIvemxpYi0xLjIuNi90ZXN0L2V4YW1wbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTE1YTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvemxpYi0xLjIuNi90ZXN0L2V4YW1wbGUuYwpAQCAtMCwwICsxLDYwMSBAQAorLyogZXhhbXBsZS5jIC0tIHVzYWdlIGV4YW1wbGUgb2YgdGhlIHpsaWIgY29tcHJlc3Npb24gbGlicmFyeQorICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDYsIDIwMTEgSmVhbi1sb3VwIEdhaWxseS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKKyAqLworCisvKiBAKCMpICRJZCQgKi8KKworI2luY2x1ZGUgInpsaWIuaCIKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaWZkZWYgU1REQworIyAgaW5jbHVkZSA8c3RyaW5nLmg+CisjICBpbmNsdWRlIDxzdGRsaWIuaD4KKyNlbmRpZgorCisjaWYgZGVmaW5lZChWTVMpIHx8IGRlZmluZWQoUklTQ09TKQorIyAgZGVmaW5lIFRFU1RGSUxFICJmb28tZ3oiCisjZWxzZQorIyAgZGVmaW5lIFRFU1RGSUxFICJmb28uZ3oiCisjZW5kaWYKKworI2RlZmluZSBDSEVDS19FUlIoZXJyLCBtc2cpIHsgXAorICAgIGlmIChlcnIgIT0gWl9PSykgeyBcCisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXMgZXJyb3I6ICVkXG4iLCBtc2csIGVycik7IFwKKyAgICAgICAgZXhpdCgxKTsgXAorICAgIH0gXAorfQorCitjb25zdCBjaGFyIGhlbGxvW10gPSAiaGVsbG8sIGhlbGxvISI7CisvKiAiaGVsbG8gd29ybGQiIHdvdWxkIGJlIG1vcmUgc3RhbmRhcmQsIGJ1dCB0aGUgcmVwZWF0ZWQgImhlbGxvIgorICogc3RyZXNzZXMgdGhlIGNvbXByZXNzaW9uIGNvZGUgYmV0dGVyLCBzb3JyeS4uLgorICovCisKK2NvbnN0IGNoYXIgZGljdGlvbmFyeVtdID0gImhlbGxvIjsKK3VMb25nIGRpY3RJZDsgLyogQWRsZXIzMiB2YWx1ZSBvZiB0aGUgZGljdGlvbmFyeSAqLworCit2b2lkIHRlc3RfZGVmbGF0ZSAgICAgICBPRigoQnl0ZSAqY29tcHIsIHVMb25nIGNvbXByTGVuKSk7Cit2b2lkIHRlc3RfaW5mbGF0ZSAgICAgICBPRigoQnl0ZSAqY29tcHIsIHVMb25nIGNvbXByTGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGUgKnVuY29tcHIsIHVMb25nIHVuY29tcHJMZW4pKTsKK3ZvaWQgdGVzdF9sYXJnZV9kZWZsYXRlIE9GKChCeXRlICpjb21wciwgdUxvbmcgY29tcHJMZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZSAqdW5jb21wciwgdUxvbmcgdW5jb21wckxlbikpOwordm9pZCB0ZXN0X2xhcmdlX2luZmxhdGUgT0YoKEJ5dGUgKmNvbXByLCB1TG9uZyBjb21wckxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlICp1bmNvbXByLCB1TG9uZyB1bmNvbXByTGVuKSk7Cit2b2lkIHRlc3RfZmx1c2ggICAgICAgICBPRigoQnl0ZSAqY29tcHIsIHVMb25nICpjb21wckxlbikpOwordm9pZCB0ZXN0X3N5bmMgICAgICAgICAgT0YoKEJ5dGUgKmNvbXByLCB1TG9uZyBjb21wckxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlICp1bmNvbXByLCB1TG9uZyB1bmNvbXByTGVuKSk7Cit2b2lkIHRlc3RfZGljdF9kZWZsYXRlICBPRigoQnl0ZSAqY29tcHIsIHVMb25nIGNvbXByTGVuKSk7Cit2b2lkIHRlc3RfZGljdF9pbmZsYXRlICBPRigoQnl0ZSAqY29tcHIsIHVMb25nIGNvbXByTGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGUgKnVuY29tcHIsIHVMb25nIHVuY29tcHJMZW4pKTsKK2ludCAgbWFpbiAgICAgICAgICAgICAgIE9GKChpbnQgYXJnYywgY2hhciAqYXJndltdKSk7CisKKworI2lmZGVmIFpfU09MTworCit2b2lkICpteWFsbG9jIE9GKCh2b2lkICosIHVuc2lnbmVkLCB1bnNpZ25lZCkpOwordm9pZCBteWZyZWUgT0YoKHZvaWQgKiwgdm9pZCAqKSk7CisKK3ZvaWQgKm15YWxsb2MocSwgbiwgbSkKKyAgICB2b2lkICpxOworICAgIHVuc2lnbmVkIG4sIG07Cit7CisgICAgcSA9IFpfTlVMTDsKKyAgICByZXR1cm4gY2FsbG9jKG4sIG0pOworfQorCit2b2lkIG15ZnJlZSh2b2lkICpxLCB2b2lkICpwKQoreworICAgIHEgPSBaX05VTEw7CisgICAgZnJlZShwKTsKK30KKworc3RhdGljIGFsbG9jX2Z1bmMgemFsbG9jID0gbXlhbGxvYzsKK3N0YXRpYyBmcmVlX2Z1bmMgemZyZWUgPSBteWZyZWU7CisKKyNlbHNlIC8qICFaX1NPTE8gKi8KKworc3RhdGljIGFsbG9jX2Z1bmMgemFsbG9jID0gKGFsbG9jX2Z1bmMpMDsKK3N0YXRpYyBmcmVlX2Z1bmMgemZyZWUgPSAoZnJlZV9mdW5jKTA7CisKK3ZvaWQgdGVzdF9jb21wcmVzcyAgICAgIE9GKChCeXRlICpjb21wciwgdUxvbmcgY29tcHJMZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZSAqdW5jb21wciwgdUxvbmcgdW5jb21wckxlbikpOwordm9pZCB0ZXN0X2d6aW8gICAgICAgICAgT0YoKGNvbnN0IGNoYXIgKmZuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGUgKnVuY29tcHIsIHVMb25nIHVuY29tcHJMZW4pKTsKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBUZXN0IGNvbXByZXNzKCkgYW5kIHVuY29tcHJlc3MoKQorICovCit2b2lkIHRlc3RfY29tcHJlc3MoY29tcHIsIGNvbXByTGVuLCB1bmNvbXByLCB1bmNvbXByTGVuKQorICAgIEJ5dGUgKmNvbXByLCAqdW5jb21wcjsKKyAgICB1TG9uZyBjb21wckxlbiwgdW5jb21wckxlbjsKK3sKKyAgICBpbnQgZXJyOworICAgIHVMb25nIGxlbiA9ICh1TG9uZylzdHJsZW4oaGVsbG8pKzE7CisKKyAgICBlcnIgPSBjb21wcmVzcyhjb21wciwgJmNvbXByTGVuLCAoY29uc3QgQnl0ZWYqKWhlbGxvLCBsZW4pOworICAgIENIRUNLX0VSUihlcnIsICJjb21wcmVzcyIpOworCisgICAgc3RyY3B5KChjaGFyKil1bmNvbXByLCAiZ2FyYmFnZSIpOworCisgICAgZXJyID0gdW5jb21wcmVzcyh1bmNvbXByLCAmdW5jb21wckxlbiwgY29tcHIsIGNvbXByTGVuKTsKKyAgICBDSEVDS19FUlIoZXJyLCAidW5jb21wcmVzcyIpOworCisgICAgaWYgKHN0cmNtcCgoY2hhciopdW5jb21wciwgaGVsbG8pKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiYmFkIHVuY29tcHJlc3NcbiIpOworICAgICAgICBleGl0KDEpOworICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZigidW5jb21wcmVzcygpOiAlc1xuIiwgKGNoYXIgKil1bmNvbXByKTsKKyAgICB9Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogVGVzdCByZWFkL3dyaXRlIG9mIC5neiBmaWxlcworICovCit2b2lkIHRlc3RfZ3ppbyhmbmFtZSwgdW5jb21wciwgdW5jb21wckxlbikKKyAgICBjb25zdCBjaGFyICpmbmFtZTsgLyogY29tcHJlc3NlZCBmaWxlIG5hbWUgKi8KKyAgICBCeXRlICp1bmNvbXByOworICAgIHVMb25nIHVuY29tcHJMZW47Cit7CisjaWZkZWYgTk9fR1pDT01QUkVTUworICAgIGZwcmludGYoc3RkZXJyLCAiTk9fR1pDT01QUkVTUyAtLSBneiogZnVuY3Rpb25zIGNhbm5vdCBjb21wcmVzc1xuIik7CisjZWxzZQorICAgIGludCBlcnI7CisgICAgaW50IGxlbiA9IChpbnQpc3RybGVuKGhlbGxvKSsxOworICAgIGd6RmlsZSBmaWxlOworICAgIHpfb2ZmX3QgcG9zOworCisgICAgZmlsZSA9IGd6b3BlbihmbmFtZSwgIndiIik7CisgICAgaWYgKGZpbGUgPT0gTlVMTCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImd6b3BlbiBlcnJvclxuIik7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorICAgIGd6cHV0YyhmaWxlLCAnaCcpOworICAgIGlmIChnenB1dHMoZmlsZSwgImVsbG8iKSAhPSA0KSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ3pwdXRzIGVycjogJXNcbiIsIGd6ZXJyb3IoZmlsZSwgJmVycikpOworICAgICAgICBleGl0KDEpOworICAgIH0KKyAgICBpZiAoZ3pwcmludGYoZmlsZSwgIiwgJXMhIiwgImhlbGxvIikgIT0gOCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImd6cHJpbnRmIGVycjogJXNcbiIsIGd6ZXJyb3IoZmlsZSwgJmVycikpOworICAgICAgICBleGl0KDEpOworICAgIH0KKyAgICBnenNlZWsoZmlsZSwgMUwsIFNFRUtfQ1VSKTsgLyogYWRkIG9uZSB6ZXJvIGJ5dGUgKi8KKyAgICBnemNsb3NlKGZpbGUpOworCisgICAgZmlsZSA9IGd6b3BlbihmbmFtZSwgInJiIik7CisgICAgaWYgKGZpbGUgPT0gTlVMTCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImd6b3BlbiBlcnJvclxuIik7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorICAgIHN0cmNweSgoY2hhciopdW5jb21wciwgImdhcmJhZ2UiKTsKKworICAgIGlmIChnenJlYWQoZmlsZSwgdW5jb21wciwgKHVuc2lnbmVkKXVuY29tcHJMZW4pICE9IGxlbikgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImd6cmVhZCBlcnI6ICVzXG4iLCBnemVycm9yKGZpbGUsICZlcnIpKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisgICAgaWYgKHN0cmNtcCgoY2hhciopdW5jb21wciwgaGVsbG8pKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiYmFkIGd6cmVhZDogJXNcbiIsIChjaGFyKil1bmNvbXByKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmludGYoImd6cmVhZCgpOiAlc1xuIiwgKGNoYXIqKXVuY29tcHIpOworICAgIH0KKworICAgIHBvcyA9IGd6c2VlayhmaWxlLCAtOEwsIFNFRUtfQ1VSKTsKKyAgICBpZiAocG9zICE9IDYgfHwgZ3p0ZWxsKGZpbGUpICE9IHBvcykgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImd6c2VlayBlcnJvciwgcG9zPSVsZCwgZ3p0ZWxsPSVsZFxuIiwKKyAgICAgICAgICAgICAgICAobG9uZylwb3MsIChsb25nKWd6dGVsbChmaWxlKSk7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorCisgICAgaWYgKGd6Z2V0YyhmaWxlKSAhPSAnICcpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJnemdldGMgZXJyb3JcbiIpOworICAgICAgICBleGl0KDEpOworICAgIH0KKworICAgIGlmIChnenVuZ2V0YygnICcsIGZpbGUpICE9ICcgJykgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImd6dW5nZXRjIGVycm9yXG4iKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisKKyAgICBnemdldHMoZmlsZSwgKGNoYXIqKXVuY29tcHIsIChpbnQpdW5jb21wckxlbik7CisgICAgaWYgKHN0cmxlbigoY2hhciopdW5jb21wcikgIT0gNykgeyAvKiAiIGhlbGxvISIgKi8KKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJnemdldHMgZXJyIGFmdGVyIGd6c2VlazogJXNcbiIsIGd6ZXJyb3IoZmlsZSwgJmVycikpOworICAgICAgICBleGl0KDEpOworICAgIH0KKyAgICBpZiAoc3RyY21wKChjaGFyKil1bmNvbXByLCBoZWxsbyArIDYpKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiYmFkIGd6Z2V0cyBhZnRlciBnenNlZWtcbiIpOworICAgICAgICBleGl0KDEpOworICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZigiZ3pnZXRzKCkgYWZ0ZXIgZ3pzZWVrOiAlc1xuIiwgKGNoYXIqKXVuY29tcHIpOworICAgIH0KKworICAgIGd6Y2xvc2UoZmlsZSk7CisjZW5kaWYKK30KKworI2VuZGlmIC8qIFpfU09MTyAqLworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFRlc3QgZGVmbGF0ZSgpIHdpdGggc21hbGwgYnVmZmVycworICovCit2b2lkIHRlc3RfZGVmbGF0ZShjb21wciwgY29tcHJMZW4pCisgICAgQnl0ZSAqY29tcHI7CisgICAgdUxvbmcgY29tcHJMZW47Cit7CisgICAgel9zdHJlYW0gY19zdHJlYW07IC8qIGNvbXByZXNzaW9uIHN0cmVhbSAqLworICAgIGludCBlcnI7CisgICAgdUxvbmcgbGVuID0gKHVMb25nKXN0cmxlbihoZWxsbykrMTsKKworICAgIGNfc3RyZWFtLnphbGxvYyA9IHphbGxvYzsKKyAgICBjX3N0cmVhbS56ZnJlZSA9IHpmcmVlOworICAgIGNfc3RyZWFtLm9wYXF1ZSA9ICh2b2lkcGYpMDsKKworICAgIGVyciA9IGRlZmxhdGVJbml0KCZjX3N0cmVhbSwgWl9ERUZBVUxUX0NPTVBSRVNTSU9OKTsKKyAgICBDSEVDS19FUlIoZXJyLCAiZGVmbGF0ZUluaXQiKTsKKworICAgIGNfc3RyZWFtLm5leHRfaW4gID0gKEJ5dGVmKiloZWxsbzsKKyAgICBjX3N0cmVhbS5uZXh0X291dCA9IGNvbXByOworCisgICAgd2hpbGUgKGNfc3RyZWFtLnRvdGFsX2luICE9IGxlbiAmJiBjX3N0cmVhbS50b3RhbF9vdXQgPCBjb21wckxlbikgeworICAgICAgICBjX3N0cmVhbS5hdmFpbF9pbiA9IGNfc3RyZWFtLmF2YWlsX291dCA9IDE7IC8qIGZvcmNlIHNtYWxsIGJ1ZmZlcnMgKi8KKyAgICAgICAgZXJyID0gZGVmbGF0ZSgmY19zdHJlYW0sIFpfTk9fRkxVU0gpOworICAgICAgICBDSEVDS19FUlIoZXJyLCAiZGVmbGF0ZSIpOworICAgIH0KKyAgICAvKiBGaW5pc2ggdGhlIHN0cmVhbSwgc3RpbGwgZm9yY2luZyBzbWFsbCBidWZmZXJzOiAqLworICAgIGZvciAoOzspIHsKKyAgICAgICAgY19zdHJlYW0uYXZhaWxfb3V0ID0gMTsKKyAgICAgICAgZXJyID0gZGVmbGF0ZSgmY19zdHJlYW0sIFpfRklOSVNIKTsKKyAgICAgICAgaWYgKGVyciA9PSBaX1NUUkVBTV9FTkQpIGJyZWFrOworICAgICAgICBDSEVDS19FUlIoZXJyLCAiZGVmbGF0ZSIpOworICAgIH0KKworICAgIGVyciA9IGRlZmxhdGVFbmQoJmNfc3RyZWFtKTsKKyAgICBDSEVDS19FUlIoZXJyLCAiZGVmbGF0ZUVuZCIpOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFRlc3QgaW5mbGF0ZSgpIHdpdGggc21hbGwgYnVmZmVycworICovCit2b2lkIHRlc3RfaW5mbGF0ZShjb21wciwgY29tcHJMZW4sIHVuY29tcHIsIHVuY29tcHJMZW4pCisgICAgQnl0ZSAqY29tcHIsICp1bmNvbXByOworICAgIHVMb25nIGNvbXByTGVuLCB1bmNvbXByTGVuOworeworICAgIGludCBlcnI7CisgICAgel9zdHJlYW0gZF9zdHJlYW07IC8qIGRlY29tcHJlc3Npb24gc3RyZWFtICovCisKKyAgICBzdHJjcHkoKGNoYXIqKXVuY29tcHIsICJnYXJiYWdlIik7CisKKyAgICBkX3N0cmVhbS56YWxsb2MgPSB6YWxsb2M7CisgICAgZF9zdHJlYW0uemZyZWUgPSB6ZnJlZTsKKyAgICBkX3N0cmVhbS5vcGFxdWUgPSAodm9pZHBmKTA7CisKKyAgICBkX3N0cmVhbS5uZXh0X2luICA9IGNvbXByOworICAgIGRfc3RyZWFtLmF2YWlsX2luID0gMDsKKyAgICBkX3N0cmVhbS5uZXh0X291dCA9IHVuY29tcHI7CisKKyAgICBlcnIgPSBpbmZsYXRlSW5pdCgmZF9zdHJlYW0pOworICAgIENIRUNLX0VSUihlcnIsICJpbmZsYXRlSW5pdCIpOworCisgICAgd2hpbGUgKGRfc3RyZWFtLnRvdGFsX291dCA8IHVuY29tcHJMZW4gJiYgZF9zdHJlYW0udG90YWxfaW4gPCBjb21wckxlbikgeworICAgICAgICBkX3N0cmVhbS5hdmFpbF9pbiA9IGRfc3RyZWFtLmF2YWlsX291dCA9IDE7IC8qIGZvcmNlIHNtYWxsIGJ1ZmZlcnMgKi8KKyAgICAgICAgZXJyID0gaW5mbGF0ZSgmZF9zdHJlYW0sIFpfTk9fRkxVU0gpOworICAgICAgICBpZiAoZXJyID09IFpfU1RSRUFNX0VORCkgYnJlYWs7CisgICAgICAgIENIRUNLX0VSUihlcnIsICJpbmZsYXRlIik7CisgICAgfQorCisgICAgZXJyID0gaW5mbGF0ZUVuZCgmZF9zdHJlYW0pOworICAgIENIRUNLX0VSUihlcnIsICJpbmZsYXRlRW5kIik7CisKKyAgICBpZiAoc3RyY21wKChjaGFyKil1bmNvbXByLCBoZWxsbykpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJiYWQgaW5mbGF0ZVxuIik7CisgICAgICAgIGV4aXQoMSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmKCJpbmZsYXRlKCk6ICVzXG4iLCAoY2hhciAqKXVuY29tcHIpOworICAgIH0KK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBUZXN0IGRlZmxhdGUoKSB3aXRoIGxhcmdlIGJ1ZmZlcnMgYW5kIGR5bmFtaWMgY2hhbmdlIG9mIGNvbXByZXNzaW9uIGxldmVsCisgKi8KK3ZvaWQgdGVzdF9sYXJnZV9kZWZsYXRlKGNvbXByLCBjb21wckxlbiwgdW5jb21wciwgdW5jb21wckxlbikKKyAgICBCeXRlICpjb21wciwgKnVuY29tcHI7CisgICAgdUxvbmcgY29tcHJMZW4sIHVuY29tcHJMZW47Cit7CisgICAgel9zdHJlYW0gY19zdHJlYW07IC8qIGNvbXByZXNzaW9uIHN0cmVhbSAqLworICAgIGludCBlcnI7CisKKyAgICBjX3N0cmVhbS56YWxsb2MgPSB6YWxsb2M7CisgICAgY19zdHJlYW0uemZyZWUgPSB6ZnJlZTsKKyAgICBjX3N0cmVhbS5vcGFxdWUgPSAodm9pZHBmKTA7CisKKyAgICBlcnIgPSBkZWZsYXRlSW5pdCgmY19zdHJlYW0sIFpfQkVTVF9TUEVFRCk7CisgICAgQ0hFQ0tfRVJSKGVyciwgImRlZmxhdGVJbml0Iik7CisKKyAgICBjX3N0cmVhbS5uZXh0X291dCA9IGNvbXByOworICAgIGNfc3RyZWFtLmF2YWlsX291dCA9ICh1SW50KWNvbXByTGVuOworCisgICAgLyogQXQgdGhpcyBwb2ludCwgdW5jb21wciBpcyBzdGlsbCBtb3N0bHkgemVyb2VzLCBzbyBpdCBzaG91bGQgY29tcHJlc3MKKyAgICAgKiB2ZXJ5IHdlbGw6CisgICAgICovCisgICAgY19zdHJlYW0ubmV4dF9pbiA9IHVuY29tcHI7CisgICAgY19zdHJlYW0uYXZhaWxfaW4gPSAodUludCl1bmNvbXByTGVuOworICAgIGVyciA9IGRlZmxhdGUoJmNfc3RyZWFtLCBaX05PX0ZMVVNIKTsKKyAgICBDSEVDS19FUlIoZXJyLCAiZGVmbGF0ZSIpOworICAgIGlmIChjX3N0cmVhbS5hdmFpbF9pbiAhPSAwKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZGVmbGF0ZSBub3QgZ3JlZWR5XG4iKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisKKyAgICAvKiBGZWVkIGluIGFscmVhZHkgY29tcHJlc3NlZCBkYXRhIGFuZCBzd2l0Y2ggdG8gbm8gY29tcHJlc3Npb246ICovCisgICAgZGVmbGF0ZVBhcmFtcygmY19zdHJlYW0sIFpfTk9fQ09NUFJFU1NJT04sIFpfREVGQVVMVF9TVFJBVEVHWSk7CisgICAgY19zdHJlYW0ubmV4dF9pbiA9IGNvbXByOworICAgIGNfc3RyZWFtLmF2YWlsX2luID0gKHVJbnQpY29tcHJMZW4vMjsKKyAgICBlcnIgPSBkZWZsYXRlKCZjX3N0cmVhbSwgWl9OT19GTFVTSCk7CisgICAgQ0hFQ0tfRVJSKGVyciwgImRlZmxhdGUiKTsKKworICAgIC8qIFN3aXRjaCBiYWNrIHRvIGNvbXByZXNzaW5nIG1vZGU6ICovCisgICAgZGVmbGF0ZVBhcmFtcygmY19zdHJlYW0sIFpfQkVTVF9DT01QUkVTU0lPTiwgWl9GSUxURVJFRCk7CisgICAgY19zdHJlYW0ubmV4dF9pbiA9IHVuY29tcHI7CisgICAgY19zdHJlYW0uYXZhaWxfaW4gPSAodUludCl1bmNvbXByTGVuOworICAgIGVyciA9IGRlZmxhdGUoJmNfc3RyZWFtLCBaX05PX0ZMVVNIKTsKKyAgICBDSEVDS19FUlIoZXJyLCAiZGVmbGF0ZSIpOworCisgICAgZXJyID0gZGVmbGF0ZSgmY19zdHJlYW0sIFpfRklOSVNIKTsKKyAgICBpZiAoZXJyICE9IFpfU1RSRUFNX0VORCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImRlZmxhdGUgc2hvdWxkIHJlcG9ydCBaX1NUUkVBTV9FTkRcbiIpOworICAgICAgICBleGl0KDEpOworICAgIH0KKyAgICBlcnIgPSBkZWZsYXRlRW5kKCZjX3N0cmVhbSk7CisgICAgQ0hFQ0tfRVJSKGVyciwgImRlZmxhdGVFbmQiKTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBUZXN0IGluZmxhdGUoKSB3aXRoIGxhcmdlIGJ1ZmZlcnMKKyAqLwordm9pZCB0ZXN0X2xhcmdlX2luZmxhdGUoY29tcHIsIGNvbXByTGVuLCB1bmNvbXByLCB1bmNvbXByTGVuKQorICAgIEJ5dGUgKmNvbXByLCAqdW5jb21wcjsKKyAgICB1TG9uZyBjb21wckxlbiwgdW5jb21wckxlbjsKK3sKKyAgICBpbnQgZXJyOworICAgIHpfc3RyZWFtIGRfc3RyZWFtOyAvKiBkZWNvbXByZXNzaW9uIHN0cmVhbSAqLworCisgICAgc3RyY3B5KChjaGFyKil1bmNvbXByLCAiZ2FyYmFnZSIpOworCisgICAgZF9zdHJlYW0uemFsbG9jID0gemFsbG9jOworICAgIGRfc3RyZWFtLnpmcmVlID0gemZyZWU7CisgICAgZF9zdHJlYW0ub3BhcXVlID0gKHZvaWRwZikwOworCisgICAgZF9zdHJlYW0ubmV4dF9pbiAgPSBjb21wcjsKKyAgICBkX3N0cmVhbS5hdmFpbF9pbiA9ICh1SW50KWNvbXByTGVuOworCisgICAgZXJyID0gaW5mbGF0ZUluaXQoJmRfc3RyZWFtKTsKKyAgICBDSEVDS19FUlIoZXJyLCAiaW5mbGF0ZUluaXQiKTsKKworICAgIGZvciAoOzspIHsKKyAgICAgICAgZF9zdHJlYW0ubmV4dF9vdXQgPSB1bmNvbXByOyAgICAgICAgICAgIC8qIGRpc2NhcmQgdGhlIG91dHB1dCAqLworICAgICAgICBkX3N0cmVhbS5hdmFpbF9vdXQgPSAodUludCl1bmNvbXByTGVuOworICAgICAgICBlcnIgPSBpbmZsYXRlKCZkX3N0cmVhbSwgWl9OT19GTFVTSCk7CisgICAgICAgIGlmIChlcnIgPT0gWl9TVFJFQU1fRU5EKSBicmVhazsKKyAgICAgICAgQ0hFQ0tfRVJSKGVyciwgImxhcmdlIGluZmxhdGUiKTsKKyAgICB9CisKKyAgICBlcnIgPSBpbmZsYXRlRW5kKCZkX3N0cmVhbSk7CisgICAgQ0hFQ0tfRVJSKGVyciwgImluZmxhdGVFbmQiKTsKKworICAgIGlmIChkX3N0cmVhbS50b3RhbF9vdXQgIT0gMip1bmNvbXByTGVuICsgY29tcHJMZW4vMikgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImJhZCBsYXJnZSBpbmZsYXRlOiAlbGRcbiIsIGRfc3RyZWFtLnRvdGFsX291dCk7CisgICAgICAgIGV4aXQoMSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmKCJsYXJnZV9pbmZsYXRlKCk6IE9LXG4iKTsKKyAgICB9Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogVGVzdCBkZWZsYXRlKCkgd2l0aCBmdWxsIGZsdXNoCisgKi8KK3ZvaWQgdGVzdF9mbHVzaChjb21wciwgY29tcHJMZW4pCisgICAgQnl0ZSAqY29tcHI7CisgICAgdUxvbmcgKmNvbXByTGVuOworeworICAgIHpfc3RyZWFtIGNfc3RyZWFtOyAvKiBjb21wcmVzc2lvbiBzdHJlYW0gKi8KKyAgICBpbnQgZXJyOworICAgIHVJbnQgbGVuID0gKHVJbnQpc3RybGVuKGhlbGxvKSsxOworCisgICAgY19zdHJlYW0uemFsbG9jID0gemFsbG9jOworICAgIGNfc3RyZWFtLnpmcmVlID0gemZyZWU7CisgICAgY19zdHJlYW0ub3BhcXVlID0gKHZvaWRwZikwOworCisgICAgZXJyID0gZGVmbGF0ZUluaXQoJmNfc3RyZWFtLCBaX0RFRkFVTFRfQ09NUFJFU1NJT04pOworICAgIENIRUNLX0VSUihlcnIsICJkZWZsYXRlSW5pdCIpOworCisgICAgY19zdHJlYW0ubmV4dF9pbiAgPSAoQnl0ZWYqKWhlbGxvOworICAgIGNfc3RyZWFtLm5leHRfb3V0ID0gY29tcHI7CisgICAgY19zdHJlYW0uYXZhaWxfaW4gPSAzOworICAgIGNfc3RyZWFtLmF2YWlsX291dCA9ICh1SW50KSpjb21wckxlbjsKKyAgICBlcnIgPSBkZWZsYXRlKCZjX3N0cmVhbSwgWl9GVUxMX0ZMVVNIKTsKKyAgICBDSEVDS19FUlIoZXJyLCAiZGVmbGF0ZSIpOworCisgICAgY29tcHJbM10rKzsgLyogZm9yY2UgYW4gZXJyb3IgaW4gZmlyc3QgY29tcHJlc3NlZCBibG9jayAqLworICAgIGNfc3RyZWFtLmF2YWlsX2luID0gbGVuIC0gMzsKKworICAgIGVyciA9IGRlZmxhdGUoJmNfc3RyZWFtLCBaX0ZJTklTSCk7CisgICAgaWYgKGVyciAhPSBaX1NUUkVBTV9FTkQpIHsKKyAgICAgICAgQ0hFQ0tfRVJSKGVyciwgImRlZmxhdGUiKTsKKyAgICB9CisgICAgZXJyID0gZGVmbGF0ZUVuZCgmY19zdHJlYW0pOworICAgIENIRUNLX0VSUihlcnIsICJkZWZsYXRlRW5kIik7CisKKyAgICAqY29tcHJMZW4gPSBjX3N0cmVhbS50b3RhbF9vdXQ7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogVGVzdCBpbmZsYXRlU3luYygpCisgKi8KK3ZvaWQgdGVzdF9zeW5jKGNvbXByLCBjb21wckxlbiwgdW5jb21wciwgdW5jb21wckxlbikKKyAgICBCeXRlICpjb21wciwgKnVuY29tcHI7CisgICAgdUxvbmcgY29tcHJMZW4sIHVuY29tcHJMZW47Cit7CisgICAgaW50IGVycjsKKyAgICB6X3N0cmVhbSBkX3N0cmVhbTsgLyogZGVjb21wcmVzc2lvbiBzdHJlYW0gKi8KKworICAgIHN0cmNweSgoY2hhciopdW5jb21wciwgImdhcmJhZ2UiKTsKKworICAgIGRfc3RyZWFtLnphbGxvYyA9IHphbGxvYzsKKyAgICBkX3N0cmVhbS56ZnJlZSA9IHpmcmVlOworICAgIGRfc3RyZWFtLm9wYXF1ZSA9ICh2b2lkcGYpMDsKKworICAgIGRfc3RyZWFtLm5leHRfaW4gID0gY29tcHI7CisgICAgZF9zdHJlYW0uYXZhaWxfaW4gPSAyOyAvKiBqdXN0IHJlYWQgdGhlIHpsaWIgaGVhZGVyICovCisKKyAgICBlcnIgPSBpbmZsYXRlSW5pdCgmZF9zdHJlYW0pOworICAgIENIRUNLX0VSUihlcnIsICJpbmZsYXRlSW5pdCIpOworCisgICAgZF9zdHJlYW0ubmV4dF9vdXQgPSB1bmNvbXByOworICAgIGRfc3RyZWFtLmF2YWlsX291dCA9ICh1SW50KXVuY29tcHJMZW47CisKKyAgICBpbmZsYXRlKCZkX3N0cmVhbSwgWl9OT19GTFVTSCk7CisgICAgQ0hFQ0tfRVJSKGVyciwgImluZmxhdGUiKTsKKworICAgIGRfc3RyZWFtLmF2YWlsX2luID0gKHVJbnQpY29tcHJMZW4tMjsgICAvKiByZWFkIGFsbCBjb21wcmVzc2VkIGRhdGEgKi8KKyAgICBlcnIgPSBpbmZsYXRlU3luYygmZF9zdHJlYW0pOyAgICAgICAgICAgLyogYnV0IHNraXAgdGhlIGRhbWFnZWQgcGFydCAqLworICAgIENIRUNLX0VSUihlcnIsICJpbmZsYXRlU3luYyIpOworCisgICAgZXJyID0gaW5mbGF0ZSgmZF9zdHJlYW0sIFpfRklOSVNIKTsKKyAgICBpZiAoZXJyICE9IFpfREFUQV9FUlJPUikgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImluZmxhdGUgc2hvdWxkIHJlcG9ydCBEQVRBX0VSUk9SXG4iKTsKKyAgICAgICAgLyogQmVjYXVzZSBvZiBpbmNvcnJlY3QgYWRsZXIzMiAqLworICAgICAgICBleGl0KDEpOworICAgIH0KKyAgICBlcnIgPSBpbmZsYXRlRW5kKCZkX3N0cmVhbSk7CisgICAgQ0hFQ0tfRVJSKGVyciwgImluZmxhdGVFbmQiKTsKKworICAgIHByaW50ZigiYWZ0ZXIgaW5mbGF0ZVN5bmMoKTogaGVsJXNcbiIsIChjaGFyICopdW5jb21wcik7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogVGVzdCBkZWZsYXRlKCkgd2l0aCBwcmVzZXQgZGljdGlvbmFyeQorICovCit2b2lkIHRlc3RfZGljdF9kZWZsYXRlKGNvbXByLCBjb21wckxlbikKKyAgICBCeXRlICpjb21wcjsKKyAgICB1TG9uZyBjb21wckxlbjsKK3sKKyAgICB6X3N0cmVhbSBjX3N0cmVhbTsgLyogY29tcHJlc3Npb24gc3RyZWFtICovCisgICAgaW50IGVycjsKKworICAgIGNfc3RyZWFtLnphbGxvYyA9IHphbGxvYzsKKyAgICBjX3N0cmVhbS56ZnJlZSA9IHpmcmVlOworICAgIGNfc3RyZWFtLm9wYXF1ZSA9ICh2b2lkcGYpMDsKKworICAgIGVyciA9IGRlZmxhdGVJbml0KCZjX3N0cmVhbSwgWl9CRVNUX0NPTVBSRVNTSU9OKTsKKyAgICBDSEVDS19FUlIoZXJyLCAiZGVmbGF0ZUluaXQiKTsKKworICAgIGVyciA9IGRlZmxhdGVTZXREaWN0aW9uYXJ5KCZjX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAoY29uc3QgQnl0ZWYqKWRpY3Rpb25hcnksIChpbnQpc2l6ZW9mKGRpY3Rpb25hcnkpKTsKKyAgICBDSEVDS19FUlIoZXJyLCAiZGVmbGF0ZVNldERpY3Rpb25hcnkiKTsKKworICAgIGRpY3RJZCA9IGNfc3RyZWFtLmFkbGVyOworICAgIGNfc3RyZWFtLm5leHRfb3V0ID0gY29tcHI7CisgICAgY19zdHJlYW0uYXZhaWxfb3V0ID0gKHVJbnQpY29tcHJMZW47CisKKyAgICBjX3N0cmVhbS5uZXh0X2luID0gKEJ5dGVmKiloZWxsbzsKKyAgICBjX3N0cmVhbS5hdmFpbF9pbiA9ICh1SW50KXN0cmxlbihoZWxsbykrMTsKKworICAgIGVyciA9IGRlZmxhdGUoJmNfc3RyZWFtLCBaX0ZJTklTSCk7CisgICAgaWYgKGVyciAhPSBaX1NUUkVBTV9FTkQpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJkZWZsYXRlIHNob3VsZCByZXBvcnQgWl9TVFJFQU1fRU5EXG4iKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisgICAgZXJyID0gZGVmbGF0ZUVuZCgmY19zdHJlYW0pOworICAgIENIRUNLX0VSUihlcnIsICJkZWZsYXRlRW5kIik7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogVGVzdCBpbmZsYXRlKCkgd2l0aCBhIHByZXNldCBkaWN0aW9uYXJ5CisgKi8KK3ZvaWQgdGVzdF9kaWN0X2luZmxhdGUoY29tcHIsIGNvbXByTGVuLCB1bmNvbXByLCB1bmNvbXByTGVuKQorICAgIEJ5dGUgKmNvbXByLCAqdW5jb21wcjsKKyAgICB1TG9uZyBjb21wckxlbiwgdW5jb21wckxlbjsKK3sKKyAgICBpbnQgZXJyOworICAgIHpfc3RyZWFtIGRfc3RyZWFtOyAvKiBkZWNvbXByZXNzaW9uIHN0cmVhbSAqLworCisgICAgc3RyY3B5KChjaGFyKil1bmNvbXByLCAiZ2FyYmFnZSIpOworCisgICAgZF9zdHJlYW0uemFsbG9jID0gemFsbG9jOworICAgIGRfc3RyZWFtLnpmcmVlID0gemZyZWU7CisgICAgZF9zdHJlYW0ub3BhcXVlID0gKHZvaWRwZikwOworCisgICAgZF9zdHJlYW0ubmV4dF9pbiAgPSBjb21wcjsKKyAgICBkX3N0cmVhbS5hdmFpbF9pbiA9ICh1SW50KWNvbXByTGVuOworCisgICAgZXJyID0gaW5mbGF0ZUluaXQoJmRfc3RyZWFtKTsKKyAgICBDSEVDS19FUlIoZXJyLCAiaW5mbGF0ZUluaXQiKTsKKworICAgIGRfc3RyZWFtLm5leHRfb3V0ID0gdW5jb21wcjsKKyAgICBkX3N0cmVhbS5hdmFpbF9vdXQgPSAodUludCl1bmNvbXByTGVuOworCisgICAgZm9yICg7OykgeworICAgICAgICBlcnIgPSBpbmZsYXRlKCZkX3N0cmVhbSwgWl9OT19GTFVTSCk7CisgICAgICAgIGlmIChlcnIgPT0gWl9TVFJFQU1fRU5EKSBicmVhazsKKyAgICAgICAgaWYgKGVyciA9PSBaX05FRURfRElDVCkgeworICAgICAgICAgICAgaWYgKGRfc3RyZWFtLmFkbGVyICE9IGRpY3RJZCkgeworICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAidW5leHBlY3RlZCBkaWN0aW9uYXJ5Iik7CisgICAgICAgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVyciA9IGluZmxhdGVTZXREaWN0aW9uYXJ5KCZkX3N0cmVhbSwgKGNvbnN0IEJ5dGVmKilkaWN0aW9uYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludClzaXplb2YoZGljdGlvbmFyeSkpOworICAgICAgICB9CisgICAgICAgIENIRUNLX0VSUihlcnIsICJpbmZsYXRlIHdpdGggZGljdCIpOworICAgIH0KKworICAgIGVyciA9IGluZmxhdGVFbmQoJmRfc3RyZWFtKTsKKyAgICBDSEVDS19FUlIoZXJyLCAiaW5mbGF0ZUVuZCIpOworCisgICAgaWYgKHN0cmNtcCgoY2hhciopdW5jb21wciwgaGVsbG8pKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiYmFkIGluZmxhdGUgd2l0aCBkaWN0XG4iKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmludGYoImluZmxhdGUgd2l0aCBkaWN0aW9uYXJ5OiAlc1xuIiwgKGNoYXIgKil1bmNvbXByKTsKKyAgICB9Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogVXNhZ2U6ICBleGFtcGxlIFtvdXRwdXQuZ3ogIFtpbnB1dC5nel1dCisgKi8KKworaW50IG1haW4oYXJnYywgYXJndikKKyAgICBpbnQgYXJnYzsKKyAgICBjaGFyICphcmd2W107Cit7CisgICAgQnl0ZSAqY29tcHIsICp1bmNvbXByOworICAgIHVMb25nIGNvbXByTGVuID0gMTAwMDAqc2l6ZW9mKGludCk7IC8qIGRvbid0IG92ZXJmbG93IG9uIE1TRE9TICovCisgICAgdUxvbmcgdW5jb21wckxlbiA9IGNvbXByTGVuOworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBteVZlcnNpb24gPSBaTElCX1ZFUlNJT047CisKKyAgICBpZiAoemxpYlZlcnNpb24oKVswXSAhPSBteVZlcnNpb25bMF0pIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJpbmNvbXBhdGlibGUgemxpYiB2ZXJzaW9uXG4iKTsKKyAgICAgICAgZXhpdCgxKTsKKworICAgIH0gZWxzZSBpZiAoc3RyY21wKHpsaWJWZXJzaW9uKCksIFpMSUJfVkVSU0lPTikgIT0gMCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIndhcm5pbmc6IGRpZmZlcmVudCB6bGliIHZlcnNpb25cbiIpOworICAgIH0KKworICAgIHByaW50ZigiemxpYiB2ZXJzaW9uICVzID0gMHglMDR4LCBjb21waWxlIGZsYWdzID0gMHglbHhcbiIsCisgICAgICAgICAgICBaTElCX1ZFUlNJT04sIFpMSUJfVkVSTlVNLCB6bGliQ29tcGlsZUZsYWdzKCkpOworCisgICAgY29tcHIgICAgPSAoQnl0ZSopY2FsbG9jKCh1SW50KWNvbXByTGVuLCAxKTsKKyAgICB1bmNvbXByICA9IChCeXRlKiljYWxsb2MoKHVJbnQpdW5jb21wckxlbiwgMSk7CisgICAgLyogY29tcHIgYW5kIHVuY29tcHIgYXJlIGNsZWFyZWQgdG8gYXZvaWQgcmVhZGluZyB1bmluaXRpYWxpemVkCisgICAgICogZGF0YSBhbmQgdG8gZW5zdXJlIHRoYXQgdW5jb21wciBjb21wcmVzc2VzIHdlbGwuCisgICAgICovCisgICAgaWYgKGNvbXByID09IFpfTlVMTCB8fCB1bmNvbXByID09IFpfTlVMTCkgeworICAgICAgICBwcmludGYoIm91dCBvZiBtZW1vcnlcbiIpOworICAgICAgICBleGl0KDEpOworICAgIH0KKworI2lmZGVmIFpfU09MTworICAgIGFyZ2MgPSBzdHJsZW4oYXJndlswXSk7CisjZWxzZQorICAgIHRlc3RfY29tcHJlc3MoY29tcHIsIGNvbXByTGVuLCB1bmNvbXByLCB1bmNvbXByTGVuKTsKKworICAgIHRlc3RfZ3ppbygoYXJnYyA+IDEgPyBhcmd2WzFdIDogVEVTVEZJTEUpLAorICAgICAgICAgICAgICB1bmNvbXByLCB1bmNvbXByTGVuKTsKKyNlbmRpZgorCisgICAgdGVzdF9kZWZsYXRlKGNvbXByLCBjb21wckxlbik7CisgICAgdGVzdF9pbmZsYXRlKGNvbXByLCBjb21wckxlbiwgdW5jb21wciwgdW5jb21wckxlbik7CisKKyAgICB0ZXN0X2xhcmdlX2RlZmxhdGUoY29tcHIsIGNvbXByTGVuLCB1bmNvbXByLCB1bmNvbXByTGVuKTsKKyAgICB0ZXN0X2xhcmdlX2luZmxhdGUoY29tcHIsIGNvbXByTGVuLCB1bmNvbXByLCB1bmNvbXByTGVuKTsKKworICAgIHRlc3RfZmx1c2goY29tcHIsICZjb21wckxlbik7CisgICAgdGVzdF9zeW5jKGNvbXByLCBjb21wckxlbiwgdW5jb21wciwgdW5jb21wckxlbik7CisgICAgY29tcHJMZW4gPSB1bmNvbXByTGVuOworCisgICAgdGVzdF9kaWN0X2RlZmxhdGUoY29tcHIsIGNvbXByTGVuKTsKKyAgICB0ZXN0X2RpY3RfaW5mbGF0ZShjb21wciwgY29tcHJMZW4sIHVuY29tcHIsIHVuY29tcHJMZW4pOworCisgICAgZnJlZShjb21wcik7CisgICAgZnJlZSh1bmNvbXByKTsKKworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvemxpYi0xLjIuNi90ZXN0L2luZmNvdmVyLmMgYi96bGliLTEuMi42L3Rlc3QvaW5mY292ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTNkOTIwCi0tLSAvZGV2L251bGwKKysrIGIvemxpYi0xLjIuNi90ZXN0L2luZmNvdmVyLmMKQEAgLTAsMCArMSw2NzEgQEAKKy8qIGluZmNvdmVyLmMgLS0gdGVzdCB6bGliJ3MgaW5mbGF0ZSByb3V0aW5lcyB3aXRoIGZ1bGwgY29kZSBjb3ZlcmFnZQorICogQ29weXJpZ2h0IChDKSAyMDExIE1hcmsgQWRsZXIKKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKKyAqLworCisvKiB0byB1c2UsIGRvOiAuL2NvbmZpZ3VyZSAtLWNvdmVyICYmIG1ha2UgY292ZXIgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSAiemxpYi5oIgorCisvKiBnZXQgZGVmaW5pdGlvbiBvZiBpbnRlcm5hbCBzdHJ1Y3R1cmUgc28gd2UgY2FuIG1lc3Mgd2l0aCBpdCAoc2VlIHB1bGwoKSksCisgICBhbmQgc28gd2UgY2FuIGNhbGwgaW5mbGF0ZV90cmVlcygpIChzZWUgY292ZXI1KCkpICovCisjZGVmaW5lIFpMSUJfSU5URVJOQUwKKyNpbmNsdWRlICJpbmZ0cmVlcy5oIgorI2luY2x1ZGUgImluZmxhdGUuaCIKKworI2RlZmluZSBsb2NhbCBzdGF0aWMKKworLyogLS0gbWVtb3J5IHRyYWNraW5nIHJvdXRpbmVzIC0tICovCisKKy8qCisgICBUaGVzZSBtZW1vcnkgdHJhY2tpbmcgcm91dGluZXMgYXJlIHByb3ZpZGVkIHRvIHpsaWIgYW5kIHRyYWNrIGFsbCBvZiB6bGliJ3MKKyAgIGFsbG9jYXRpb25zIGFuZCBkZWFsbG9jYXRpb25zLCBjaGVjayBmb3IgTElGTyBvcGVyYXRpb25zLCBrZWVwIGEgY3VycmVudAorICAgYW5kIGhpZ2ggd2F0ZXIgbWFyayBvZiB0b3RhbCBieXRlcyByZXF1ZXN0ZWQsIG9wdGlvbmFsbHkgc2V0IGEgbGltaXQgb24gdGhlCisgICB0b3RhbCBtZW1vcnkgdGhhdCBjYW4gYmUgYWxsb2NhdGVkLCBhbmQgd2hlbiBkb25lIGNoZWNrIGZvciBtZW1vcnkgbGVha3MuCisKKyAgIFRoZXkgYXJlIHVzZWQgYXMgZm9sbG93czoKKworICAgel9zdHJlYW0gc3RybTsKKyAgIG1lbV9zZXR1cCgmc3RybSkgICAgICAgICBpbml0aWFsaXplcyB0aGUgbWVtb3J5IHRyYWNraW5nIGFuZCBzZXRzIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHphbGxvYywgemZyZWUsIGFuZCBvcGFxdWUgbWVtYmVycyBvZiBzdHJtIHRvIHVzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSB0cmFja2luZyBmb3IgYWxsIHpsaWIgb3BlcmF0aW9ucyBvbiBzdHJtCisgICBtZW1fbGltaXQoJnN0cm0sIGxpbWl0KSAgc2V0cyBhIGxpbWl0IG9uIHRoZSB0b3RhbCBieXRlcyByZXF1ZXN0ZWQgLS0gYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QgdGhhdCBleGNlZWRzIHRoaXMgbGltaXQgd2lsbCByZXN1bHQgaW4gYW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0aW9uIGZhaWx1cmUgKHJldHVybnMgTlVMTCkgLS0gc2V0dGluZyB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdCB0byB6ZXJvIG1lYW5zIG5vIGxpbWl0LCB3aGljaCBpcyB0aGUgZGVmYXVsdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyIG1lbV9zZXR1cCgpCisgICBtZW1fdXNlZCgmc3RybSwgIm1zZyIpICAgcHJpbnRzIHRvIHN0ZGVyciAibXNnIiBhbmQgdGhlIHRvdGFsIGJ5dGVzIHVzZWQKKyAgIG1lbV9oaWdoKCZzdHJtLCAibXNnIikgICBwcmludHMgdG8gc3RkZXJyICJtc2ciIGFuZCB0aGUgaGlnaCB3YXRlciBtYXJrCisgICBtZW1fZG9uZSgmc3RybSwgIm1zZyIpICAgZW5kcyBtZW1vcnkgdHJhY2tpbmcsIHJlbGVhc2VzIGFsbCBhbGxvY2F0aW9ucworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciB0aGUgdHJhY2tpbmcgYXMgd2VsbCBhcyBsZWFrZWQgemxpYiBibG9ja3MsIGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW55LiAgSWYgdGhlcmUgd2FzIGFueXRoaW5nIHVudXN1YWwsIHN1Y2ggYXMgbGVha2VkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tzLCBub24tRklGTyBmcmVlcywgb3IgZnJlZXMgb2YgYWRkcmVzc2VzIG5vdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRlZCwgdGhlbiAibXNnIiBhbmQgaW5mb3JtYXRpb24gYWJvdXQgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvYmxlbSBpcyBwcmludGVkIHRvIHN0ZGVyci4gIElmIGV2ZXJ5dGhpbmcgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtYWwsIG5vdGhpbmcgaXMgcHJpbnRlZC4gbWVtX2RvbmUgcmVzZXRzIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm0gbWVtYmVycyB0byBaX05VTEwgdG8gdXNlIHRoZSBkZWZhdWx0IG1lbW9yeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRpb24gcm91dGluZXMgb24gdGhlIG5leHQgemxpYiBpbml0aWFsaXphdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzaW5nIHN0cm0uCisgKi8KKworLyogdGhlc2UgaXRlbXMgYXJlIHN0cnVuZyB0b2dldGhlciBpbiBhIGxpbmtlZCBsaXN0LCBvbmUgZm9yIGVhY2ggYWxsb2NhdGlvbiAqLworc3RydWN0IG1lbV9pdGVtIHsKKyAgICB2b2lkICpwdHI7ICAgICAgICAgICAgICAgICAgLyogcG9pbnRlciB0byBhbGxvY2F0ZWQgbWVtb3J5ICovCisgICAgc2l6ZV90IHNpemU7ICAgICAgICAgICAgICAgIC8qIHJlcXVlc3RlZCBzaXplIG9mIGFsbG9jYXRpb24gKi8KKyAgICBzdHJ1Y3QgbWVtX2l0ZW0gKm5leHQ7ICAgICAgLyogcG9pbnRlciB0byBuZXh0IGl0ZW0gaW4gbGlzdCwgb3IgTlVMTCAqLworfTsKKworLyogdGhpcyBzdHJ1Y3R1cmUgaXMgYXQgdGhlIHJvb3Qgb2YgdGhlIGxpbmtlZCBsaXN0LCBhbmQgdHJhY2tzIHN0YXRpc3RpY3MgKi8KK3N0cnVjdCBtZW1fem9uZSB7CisgICAgc3RydWN0IG1lbV9pdGVtICpmaXJzdDsgICAgIC8qIHBvaW50ZXIgdG8gZmlyc3QgaXRlbSBpbiBsaXN0LCBvciBOVUxMICovCisgICAgc2l6ZV90IHRvdGFsLCBoaWdod2F0ZXI7ICAgIC8qIHRvdGFsIGFsbG9jYXRpb25zLCBhbmQgbGFyZ2VzdCB0b3RhbCAqLworICAgIHNpemVfdCBsaW1pdDsgICAgICAgICAgICAgICAvKiBtZW1vcnkgYWxsb2NhdGlvbiBsaW1pdCwgb3IgMCBpZiBubyBsaW1pdCAqLworICAgIGludCBub3RsaWZvLCByb2d1ZTsgICAgICAgICAvKiBjb3VudHMgb2Ygbm9uLUxJRk8gZnJlZXMgYW5kIHJvZ3VlIGZyZWVzICovCit9OworCisvKiBtZW1vcnkgYWxsb2NhdGlvbiByb3V0aW5lIHRvIHBhc3MgdG8gemxpYiAqLworbG9jYWwgdm9pZCAqbWVtX2FsbG9jKHZvaWQgKm1lbSwgdW5zaWduZWQgY291bnQsIHVuc2lnbmVkIHNpemUpCit7CisgICAgdm9pZCAqcHRyOworICAgIHN0cnVjdCBtZW1faXRlbSAqaXRlbTsKKyAgICBzdHJ1Y3QgbWVtX3pvbmUgKnpvbmUgPSBtZW07CisgICAgc2l6ZV90IGxlbiA9IGNvdW50ICogKHNpemVfdClzaXplOworCisgICAgLyogaW5kdWNlZCBhbGxvY2F0aW9uIGZhaWx1cmUgKi8KKyAgICBpZiAoem9uZSA9PSBOVUxMIHx8ICh6b25lLT5saW1pdCAmJiB6b25lLT50b3RhbCArIGxlbiA+IHpvbmUtPmxpbWl0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICAvKiBwZXJmb3JtIGFsbG9jYXRpb24gdXNpbmcgdGhlIHN0YW5kYXJkIGxpYnJhcnksIGZpbGwgbWVtb3J5IHdpdGggYQorICAgICAgIG5vbi16ZXJvIHZhbHVlIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBjb2RlIGlzbid0IGRlcGVuZGluZyBvbiB6ZXJvcyAqLworICAgIHB0ciA9IG1hbGxvYyhsZW4pOworICAgIGlmIChwdHIgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbWVtc2V0KHB0ciwgMHhhNSwgbGVuKTsKKworICAgIC8qIGNyZWF0ZSBhIG5ldyBpdGVtIGZvciB0aGUgbGlzdCAqLworICAgIGl0ZW0gPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBtZW1faXRlbSkpOworICAgIGlmIChpdGVtID09IE5VTEwpIHsKKyAgICAgICAgZnJlZShwdHIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaXRlbS0+cHRyID0gcHRyOworICAgIGl0ZW0tPnNpemUgPSBsZW47CisKKyAgICAvKiBpbnNlcnQgaXRlbSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaXN0ICovCisgICAgaXRlbS0+bmV4dCA9IHpvbmUtPmZpcnN0OworICAgIHpvbmUtPmZpcnN0ID0gaXRlbTsKKworICAgIC8qIHVwZGF0ZSB0aGUgc3RhdGlzdGljcyAqLworICAgIHpvbmUtPnRvdGFsICs9IGl0ZW0tPnNpemU7CisgICAgaWYgKHpvbmUtPnRvdGFsID4gem9uZS0+aGlnaHdhdGVyKQorICAgICAgICB6b25lLT5oaWdod2F0ZXIgPSB6b25lLT50b3RhbDsKKworICAgIC8qIHJldHVybiB0aGUgYWxsb2NhdGVkIG1lbW9yeSAqLworICAgIHJldHVybiBwdHI7Cit9CisKKy8qIG1lbW9yeSBmcmVlIHJvdXRpbmUgdG8gcGFzcyB0byB6bGliICovCitsb2NhbCB2b2lkIG1lbV9mcmVlKHZvaWQgKm1lbSwgdm9pZCAqcHRyKQoreworICAgIHN0cnVjdCBtZW1faXRlbSAqaXRlbSwgKm5leHQ7CisgICAgc3RydWN0IG1lbV96b25lICp6b25lID0gbWVtOworCisgICAgLyogaWYgbm8gem9uZSwganVzdCBkbyBhIGZyZWUgKi8KKyAgICBpZiAoem9uZSA9PSBOVUxMKSB7CisgICAgICAgIGZyZWUocHRyKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIHBvaW50IG5leHQgdG8gdGhlIGl0ZW0gdGhhdCBtYXRjaGVzIHB0ciwgb3IgTlVMTCBpZiBub3QgZm91bmQgLS0gcmVtb3ZlCisgICAgICAgdGhlIGl0ZW0gZnJvbSB0aGUgbGlua2VkIGxpc3QgaWYgZm91bmQgKi8KKyAgICBuZXh0ID0gem9uZS0+Zmlyc3Q7CisgICAgaWYgKG5leHQpIHsKKyAgICAgICAgaWYgKG5leHQtPnB0ciA9PSBwdHIpCisgICAgICAgICAgICB6b25lLT5maXJzdCA9IG5leHQtPm5leHQ7ICAgLyogZmlyc3Qgb25lIGlzIGl0LCByZW1vdmUgZnJvbSBsaXN0ICovCisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNlYXJjaCB0aGUgbGlua2VkIGxpc3QgKi8KKyAgICAgICAgICAgICAgICBpdGVtID0gbmV4dDsKKyAgICAgICAgICAgICAgICBuZXh0ID0gaXRlbS0+bmV4dDsKKyAgICAgICAgICAgIH0gd2hpbGUgKG5leHQgIT0gTlVMTCAmJiBuZXh0LT5wdHIgIT0gcHRyKTsKKyAgICAgICAgICAgIGlmIChuZXh0KSB7ICAgICAgICAgICAgICAgICAvKiBpZiBmb3VuZCwgcmVtb3ZlIGZyb20gbGlua2VkIGxpc3QgKi8KKyAgICAgICAgICAgICAgICBpdGVtLT5uZXh0ID0gbmV4dC0+bmV4dDsKKyAgICAgICAgICAgICAgICB6b25lLT5ub3RsaWZvKys7ICAgICAgICAvKiBub3QgYSBMSUZPIGZyZWUgKi8KKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgZm91bmQsIHVwZGF0ZSB0aGUgc3RhdGlzdGljcyBhbmQgZnJlZSB0aGUgaXRlbSAqLworICAgIGlmIChuZXh0KSB7CisgICAgICAgIHpvbmUtPnRvdGFsIC09IG5leHQtPnNpemU7CisgICAgICAgIGZyZWUobmV4dCk7CisgICAgfQorCisgICAgLyogaWYgbm90IGZvdW5kLCB1cGRhdGUgdGhlIHJvZ3VlIGNvdW50ICovCisgICAgZWxzZQorICAgICAgICB6b25lLT5yb2d1ZSsrOworCisgICAgLyogaW4gYW55IGNhc2UsIGRvIHRoZSByZXF1ZXN0ZWQgZnJlZSB3aXRoIHRoZSBzdGFuZGFyZCBsaWJyYXJ5IGZ1bmN0aW9uICovCisgICAgZnJlZShwdHIpOworfQorCisvKiBzZXQgdXAgYSBjb250cm9sbGVkIG1lbW9yeSBhbGxvY2F0aW9uIHNwYWNlIGZvciBtb25pdG9yaW5nLCBzZXQgdGhlIHN0cmVhbQorICAgcGFyYW1ldGVycyB0byB0aGUgY29udHJvbGxlZCByb3V0aW5lcywgd2l0aCBvcGFxdWUgcG9pbnRpbmcgdG8gdGhlIHNwYWNlICovCitsb2NhbCB2b2lkIG1lbV9zZXR1cCh6X3N0cmVhbSAqc3RybSkKK3sKKyAgICBzdHJ1Y3QgbWVtX3pvbmUgKnpvbmU7CisKKyAgICB6b25lID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgbWVtX3pvbmUpKTsKKyAgICBhc3NlcnQoem9uZSAhPSBOVUxMKTsKKyAgICB6b25lLT5maXJzdCA9IE5VTEw7CisgICAgem9uZS0+dG90YWwgPSAwOworICAgIHpvbmUtPmhpZ2h3YXRlciA9IDA7CisgICAgem9uZS0+bGltaXQgPSAwOworICAgIHpvbmUtPm5vdGxpZm8gPSAwOworICAgIHpvbmUtPnJvZ3VlID0gMDsKKyAgICBzdHJtLT5vcGFxdWUgPSB6b25lOworICAgIHN0cm0tPnphbGxvYyA9IG1lbV9hbGxvYzsKKyAgICBzdHJtLT56ZnJlZSA9IG1lbV9mcmVlOworfQorCisvKiBzZXQgYSBsaW1pdCBvbiB0aGUgdG90YWwgbWVtb3J5IGFsbG9jYXRpb24sIG9yIDAgdG8gcmVtb3ZlIHRoZSBsaW1pdCAqLworbG9jYWwgdm9pZCBtZW1fbGltaXQoel9zdHJlYW0gKnN0cm0sIHNpemVfdCBsaW1pdCkKK3sKKyAgICBzdHJ1Y3QgbWVtX3pvbmUgKnpvbmUgPSBzdHJtLT5vcGFxdWU7CisKKyAgICB6b25lLT5saW1pdCA9IGxpbWl0OworfQorCisvKiBzaG93IHRoZSBjdXJyZW50IHRvdGFsIHJlcXVlc3RlZCBhbGxvY2F0aW9ucyBpbiBieXRlcyAqLworbG9jYWwgdm9pZCBtZW1fdXNlZCh6X3N0cmVhbSAqc3RybSwgY2hhciAqcHJlZml4KQoreworICAgIHN0cnVjdCBtZW1fem9uZSAqem9uZSA9IHN0cm0tPm9wYXF1ZTsKKworICAgIGZwcmludGYoc3RkZXJyLCAiJXM6ICVsdSBhbGxvY2F0ZWRcbiIsIHByZWZpeCwgem9uZS0+dG90YWwpOworfQorCisvKiBzaG93IHRoZSBoaWdoIHdhdGVyIGFsbG9jYXRpb24gaW4gYnl0ZXMgKi8KK2xvY2FsIHZvaWQgbWVtX2hpZ2goel9zdHJlYW0gKnN0cm0sIGNoYXIgKnByZWZpeCkKK3sKKyAgICBzdHJ1Y3QgbWVtX3pvbmUgKnpvbmUgPSBzdHJtLT5vcGFxdWU7CisKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiAlbHUgaGlnaCB3YXRlciBtYXJrXG4iLCBwcmVmaXgsIHpvbmUtPmhpZ2h3YXRlcik7Cit9CisKKy8qIHJlbGVhc2UgdGhlIG1lbW9yeSBhbGxvY2F0aW9uIHpvbmUgLS0gaWYgdGhlcmUgYXJlIGFueSBzdXJwcmlzZXMsIG5vdGlmeSAqLworbG9jYWwgdm9pZCBtZW1fZG9uZSh6X3N0cmVhbSAqc3RybSwgY2hhciAqcHJlZml4KQoreworICAgIGludCBjb3VudCA9IDA7CisgICAgc3RydWN0IG1lbV9pdGVtICppdGVtLCAqbmV4dDsKKyAgICBzdHJ1Y3QgbWVtX3pvbmUgKnpvbmUgPSBzdHJtLT5vcGFxdWU7CisKKyAgICAvKiBzaG93IGhpZ2ggd2F0ZXIgbWFyayAqLworICAgIG1lbV9oaWdoKHN0cm0sIHByZWZpeCk7CisKKyAgICAvKiBmcmVlIGxlZnRvdmVyIGFsbG9jYXRpb25zIGFuZCBpdGVtIHN0cnVjdHVyZXMsIGlmIGFueSAqLworICAgIGl0ZW0gPSB6b25lLT5maXJzdDsKKyAgICB3aGlsZSAoaXRlbSAhPSBOVUxMKSB7CisgICAgICAgIGZyZWUoaXRlbS0+cHRyKTsKKyAgICAgICAgbmV4dCA9IGl0ZW0tPm5leHQ7CisgICAgICAgIGZyZWUoaXRlbSk7CisgICAgICAgIGl0ZW0gPSBuZXh0OworICAgICAgICBjb3VudCsrOworICAgIH0KKworICAgIC8qIGlzc3VlIGFsZXJ0cyBhYm91dCBhbnl0aGluZyB1bmV4cGVjdGVkICovCisgICAgaWYgKGNvdW50IHx8IHpvbmUtPnRvdGFsKQorICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIioqICVzOiAlbHUgYnl0ZXMgaW4gJWQgYmxvY2tzIG5vdCBmcmVlZFxuIiwKKyAgICAgICAgICAgICAgICBwcmVmaXgsIHpvbmUtPnRvdGFsLCBjb3VudCk7CisgICAgaWYgKHpvbmUtPm5vdGxpZm8pCisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiKiogJXM6ICVkIGZyZWVzIG5vdCBMSUZPXG4iLCBwcmVmaXgsIHpvbmUtPm5vdGxpZm8pOworICAgIGlmICh6b25lLT5yb2d1ZSkKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICIqKiAlczogJWQgZnJlZXMgbm90IHJlY29nbml6ZWRcbiIsCisgICAgICAgICAgICAgICAgcHJlZml4LCB6b25lLT5yb2d1ZSk7CisKKyAgICAvKiBmcmVlIHRoZSB6b25lIGFuZCBkZWxldGUgZnJvbSB0aGUgc3RyZWFtICovCisgICAgZnJlZSh6b25lKTsKKyAgICBzdHJtLT5vcGFxdWUgPSBaX05VTEw7CisgICAgc3RybS0+emFsbG9jID0gWl9OVUxMOworICAgIHN0cm0tPnpmcmVlID0gWl9OVUxMOworfQorCisvKiAtLSBpbmZsYXRlIHRlc3Qgcm91dGluZXMgLS0gKi8KKworLyogRGVjb2RlIGEgaGV4YWRlY2ltYWwgc3RyaW5nLCBzZXQgKmxlbiB0byBsZW5ndGgsIGluW10gdG8gdGhlIGJ5dGVzLiAgVGhpcworICAgZGVjb2RlcyBsaWJlcmFsbHksIGluIHRoYXQgaGV4IGRpZ2l0cyBjYW4gYmUgYWRqYWNlbnQsIGluIHdoaWNoIGNhc2UgdHdvIGluCisgICBhIHJvdyB3cml0ZXMgYSBieXRlLiAgT3IgdGhleSBjYW4gZGVsaW1pdGVkIGJ5IGFueSBub24taGV4IGNoYXJhY3Rlciwgd2hlcmUKKyAgIHRoZSBkZWxpbWl0ZXJzIGFyZSBpZ25vcmVkIGV4Y2VwdCB3aGVuIGEgc2luZ2xlIGhleCBkaWdpdCBpcyBmb2xsb3dlZCBieSBhCisgICBkZWxpbWl0ZXIgaW4gd2hpY2ggY2FzZSB0aGF0IHNpbmdsZSBkaWdpdCB3cml0ZXMgYSBieXRlLiAgVGhlIHJldHVybmVkCisgICBkYXRhIGlzIGFsbG9jYXRlZCBhbmQgbXVzdCBldmVudHVhbGx5IGJlIGZyZWVkLiAgTlVMTCBpcyByZXR1cm5lZCBpZiBvdXQgb2YKKyAgIG1lbW9yeS4gIElmIHRoZSBsZW5ndGggaXMgbm90IG5lZWRlZCwgdGhlbiBsZW4gY2FuIGJlIE5VTEwuICovCitsb2NhbCB1bnNpZ25lZCBjaGFyICpoMmIoY29uc3QgY2hhciAqaGV4LCB1bnNpZ25lZCAqbGVuKQoreworICAgIHVuc2lnbmVkIGNoYXIgKmluOworICAgIHVuc2lnbmVkIG5leHQsIHZhbDsKKworICAgIGluID0gbWFsbG9jKChzdHJsZW4oaGV4KSArIDEpID4+IDEpOworICAgIGlmIChpbiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBuZXh0ID0gMDsKKyAgICB2YWwgPSAxOworICAgIGRvIHsKKyAgICAgICAgaWYgKCpoZXggPj0gJzAnICYmICpoZXggPD0gJzknKQorICAgICAgICAgICAgdmFsID0gKHZhbCA8PCA0KSArICpoZXggLSAnMCc7CisgICAgICAgIGVsc2UgaWYgKCpoZXggPj0gJ0EnICYmICpoZXggPD0gJ0YnKQorICAgICAgICAgICAgdmFsID0gKHZhbCA8PCA0KSArICpoZXggLSAnQScgKyAxMDsKKyAgICAgICAgZWxzZSBpZiAoKmhleCA+PSAnYScgJiYgKmhleCA8PSAnZicpCisgICAgICAgICAgICB2YWwgPSAodmFsIDw8IDQpICsgKmhleCAtICdhJyArIDEwOworICAgICAgICBlbHNlIGlmICh2YWwgIT0gMSAmJiB2YWwgPCAzMikgIC8qIG9uZSBkaWdpdCBmb2xsb3dlZCBieSBkZWxpbWl0ZXIgKi8KKyAgICAgICAgICAgIHZhbCArPSAyNDA7ICAgICAgICAgICAgICAgICAvKiBtYWtlIGl0IGxvb2sgbGlrZSB0d28gZGlnaXRzICovCisgICAgICAgIGlmICh2YWwgPiAyNTUpIHsgICAgICAgICAgICAgICAgLyogaGF2ZSB0d28gZGlnaXRzICovCisgICAgICAgICAgICBpbltuZXh0KytdID0gdmFsICYgMHhmZjsgICAgLyogc2F2ZSB0aGUgZGVjb2RlZCBieXRlICovCisgICAgICAgICAgICB2YWwgPSAxOyAgICAgICAgICAgICAgICAgICAgLyogc3RhcnQgb3ZlciAqLworICAgICAgICB9CisgICAgfSB3aGlsZSAoKmhleCsrKTsgICAgICAgLyogZ28gdGhyb3VnaCB0aGUgbG9vcCB3aXRoIHRoZSB0ZXJtaW5hdGluZyBudWxsICovCisgICAgaWYgKGxlbiAhPSBOVUxMKQorICAgICAgICAqbGVuID0gbmV4dDsKKyAgICBpbiA9IHJlYWxsb2NmKGluLCBuZXh0KTsKKyAgICByZXR1cm4gaW47Cit9CisKKy8qIGdlbmVyaWMgaW5mbGF0ZSgpIHJ1biwgd2hlcmUgaGV4IGlzIHRoZSBoZXhhZGVjaW1hbCBpbnB1dCBkYXRhLCB3aGF0IGlzIHRoZQorICAgdGV4dCB0byBpbmNsdWRlIGluIGFuIGVycm9yIG1lc3NhZ2UsIHN0ZXAgaXMgaG93IG11Y2ggaW5wdXQgZGF0YSB0byBmZWVkCisgICBpbmZsYXRlKCkgb24gZWFjaCBjYWxsLCBvciB6ZXJvIHRvIGZlZWQgaXQgYWxsLCB3aW4gaXMgdGhlIHdpbmRvdyBiaXRzCisgICBwYXJhbWV0ZXIgdG8gaW5mbGF0ZUluaXQyKCksIGxlbiBpcyB0aGUgc2l6ZSBvZiB0aGUgb3V0cHV0IGJ1ZmZlciwgYW5kIGVycgorICAgaXMgdGhlIGVycm9yIGNvZGUgZXhwZWN0ZWQgZnJvbSB0aGUgZmlyc3QgaW5mbGF0ZSgpIGNhbGwgKHRoZSBzZWNvbmQKKyAgIGluZmxhdGUoKSBjYWxsIGlzIGV4cGVjdGVkIHRvIHJldHVybiBaX1NUUkVBTV9FTkQpLiAgSWYgd2luIGlzIDQ3LCB0aGVuCisgICBoZWFkZXIgaW5mb3JtYXRpb24gaXMgY29sbGVjdGVkIHdpdGggaW5mbGF0ZUdldEhlYWRlcigpLiAgSWYgYSB6bGliIHN0cmVhbQorICAgaXMgbG9va2luZyBmb3IgYSBkaWN0aW9uYXJ5LCB0aGVuIGFuIGVtcHR5IGRpY3Rpb25hcnkgaXMgcHJvdmlkZWQuCisgICBpbmZsYXRlKCkgaXMgcnVuIHVudGlsIGFsbCBvZiB0aGUgaW5wdXQgZGF0YSBpcyBjb25zdW1lZC4gKi8KK2xvY2FsIHZvaWQgaW5mKGNoYXIgKmhleCwgY2hhciAqd2hhdCwgdW5zaWduZWQgc3RlcCwgaW50IHdpbiwgdW5zaWduZWQgbGVuLAorICAgICAgICAgICAgICAgaW50IGVycikKK3sKKyAgICBpbnQgcmV0OworICAgIHVuc2lnbmVkIGhhdmU7CisgICAgdW5zaWduZWQgY2hhciAqaW4sICpvdXQ7CisgICAgel9zdHJlYW0gc3RybSwgY29weTsKKyAgICBnel9oZWFkZXIgaGVhZDsKKworICAgIG1lbV9zZXR1cCgmc3RybSk7CisgICAgc3RybS5hdmFpbF9pbiA9IDA7CisgICAgc3RybS5uZXh0X2luID0gWl9OVUxMOworICAgIHJldCA9IGluZmxhdGVJbml0Migmc3RybSwgd2luKTsKKyAgICBpZiAocmV0ICE9IFpfT0spIHsKKyAgICAgICAgbWVtX2RvbmUoJnN0cm0sIHdoYXQpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG91dCA9IG1hbGxvYyhsZW4pOyAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KG91dCAhPSBOVUxMKTsKKyAgICBpZiAod2luID09IDQ3KSB7CisgICAgICAgIGhlYWQuZXh0cmEgPSBvdXQ7CisgICAgICAgIGhlYWQuZXh0cmFfbWF4ID0gbGVuOworICAgICAgICBoZWFkLm5hbWUgPSBvdXQ7CisgICAgICAgIGhlYWQubmFtZV9tYXggPSBsZW47CisgICAgICAgIGhlYWQuY29tbWVudCA9IG91dDsKKyAgICAgICAgaGVhZC5jb21tX21heCA9IGxlbjsKKyAgICAgICAgcmV0ID0gaW5mbGF0ZUdldEhlYWRlcigmc3RybSwgJmhlYWQpOyAgIGFzc2VydChyZXQgPT0gWl9PSyk7CisgICAgfQorICAgIGluID0gaDJiKGhleCwgJmhhdmUpOyAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KGluICE9IE5VTEwpOworICAgIGlmIChzdGVwID09IDAgfHwgc3RlcCA+IGhhdmUpCisgICAgICAgIHN0ZXAgPSBoYXZlOworICAgIHN0cm0uYXZhaWxfaW4gPSBzdGVwOworICAgIGhhdmUgLT0gc3RlcDsKKyAgICBzdHJtLm5leHRfaW4gPSBpbjsKKyAgICBkbyB7CisgICAgICAgIHN0cm0uYXZhaWxfb3V0ID0gbGVuOworICAgICAgICBzdHJtLm5leHRfb3V0ID0gb3V0OworICAgICAgICByZXQgPSBpbmZsYXRlKCZzdHJtLCBaX05PX0ZMVVNIKTsgICAgICAgYXNzZXJ0KGVyciA9PSA5IHx8IHJldCA9PSBlcnIpOworICAgICAgICBpZiAocmV0ICE9IFpfT0sgJiYgcmV0ICE9IFpfQlVGX0VSUk9SICYmIHJldCAhPSBaX05FRURfRElDVCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBpZiAocmV0ID09IFpfTkVFRF9ESUNUKSB7CisgICAgICAgICAgICByZXQgPSBpbmZsYXRlU2V0RGljdGlvbmFyeSgmc3RybSwgaW4sIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KHJldCA9PSBaX0RBVEFfRVJST1IpOworICAgICAgICAgICAgbWVtX2xpbWl0KCZzdHJtLCAxKTsKKyAgICAgICAgICAgIHJldCA9IGluZmxhdGVTZXREaWN0aW9uYXJ5KCZzdHJtLCBvdXQsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KHJldCA9PSBaX01FTV9FUlJPUik7CisgICAgICAgICAgICBtZW1fbGltaXQoJnN0cm0sIDApOworICAgICAgICAgICAgKChzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSAqKXN0cm0uc3RhdGUpLT5tb2RlID0gRElDVDsKKyAgICAgICAgICAgIHJldCA9IGluZmxhdGVTZXREaWN0aW9uYXJ5KCZzdHJtLCBvdXQsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KHJldCA9PSBaX09LKTsKKyAgICAgICAgICAgIHJldCA9IGluZmxhdGUoJnN0cm0sIFpfTk9fRkxVU0gpOyAgIGFzc2VydChyZXQgPT0gWl9CVUZfRVJST1IpOworICAgICAgICB9CisgICAgICAgIHJldCA9IGluZmxhdGVDb3B5KCZjb3B5LCAmc3RybSk7ICAgICAgICBhc3NlcnQocmV0ID09IFpfT0spOworICAgICAgICByZXQgPSBpbmZsYXRlRW5kKCZjb3B5KTsgICAgICAgICAgICAgICAgYXNzZXJ0KHJldCA9PSBaX09LKTsKKyAgICAgICAgZXJyID0gOTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBkb24ndCBjYXJlIG5leHQgdGltZSBhcm91bmQgKi8KKyAgICAgICAgaGF2ZSArPSBzdHJtLmF2YWlsX2luOworICAgICAgICBzdHJtLmF2YWlsX2luID0gc3RlcCA+IGhhdmUgPyBoYXZlIDogc3RlcDsKKyAgICAgICAgaGF2ZSAtPSBzdHJtLmF2YWlsX2luOworICAgIH0gd2hpbGUgKHN0cm0uYXZhaWxfaW4pOworICAgIGZyZWUoaW4pOworICAgIGZyZWUob3V0KTsKKyAgICByZXQgPSBpbmZsYXRlUmVzZXQyKCZzdHJtLCAtOCk7ICAgICAgICAgICAgIGFzc2VydChyZXQgPT0gWl9PSyk7CisgICAgcmV0ID0gaW5mbGF0ZUVuZCgmc3RybSk7ICAgICAgICAgICAgICAgICAgICBhc3NlcnQocmV0ID09IFpfT0spOworICAgIG1lbV9kb25lKCZzdHJtLCB3aGF0KTsKK30KKworLyogY292ZXIgYWxsIG9mIHRoZSBsaW5lcyBpbiBpbmZsYXRlLmMgdXAgdG8gaW5mbGF0ZSgpICovCitsb2NhbCB2b2lkIGNvdmVyX3N1cHBvcnQodm9pZCkKK3sKKyAgICBpbnQgcmV0OworICAgIHpfc3RyZWFtIHN0cm07CisKKyAgICBtZW1fc2V0dXAoJnN0cm0pOworICAgIHN0cm0uYXZhaWxfaW4gPSAwOworICAgIHN0cm0ubmV4dF9pbiA9IFpfTlVMTDsKKyAgICByZXQgPSBpbmZsYXRlSW5pdCgmc3RybSk7ICAgICAgICAgICAgICAgICAgIGFzc2VydChyZXQgPT0gWl9PSyk7CisgICAgbWVtX3VzZWQoJnN0cm0sICJpbmZsYXRlIGluaXQiKTsKKyAgICByZXQgPSBpbmZsYXRlUHJpbWUoJnN0cm0sIDUsIDMxKTsgICAgICAgICAgIGFzc2VydChyZXQgPT0gWl9PSyk7CisgICAgcmV0ID0gaW5mbGF0ZVByaW1lKCZzdHJtLCAtMSwgMCk7ICAgICAgICAgICBhc3NlcnQocmV0ID09IFpfT0spOworICAgIHJldCA9IGluZmxhdGVTZXREaWN0aW9uYXJ5KCZzdHJtLCBaX05VTEwsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KHJldCA9PSBaX1NUUkVBTV9FUlJPUik7CisgICAgcmV0ID0gaW5mbGF0ZUVuZCgmc3RybSk7ICAgICAgICAgICAgICAgICAgICBhc3NlcnQocmV0ID09IFpfT0spOworICAgIG1lbV9kb25lKCZzdHJtLCAicHJpbWUiKTsKKworICAgIGluZigiNjMgMCIsICJmb3JjZSB3aW5kb3cgYWxsb2NhdGlvbiIsIDAsIC0xNSwgMSwgWl9PSyk7CisgICAgaW5mKCI2MyAxOCA1IiwgImZvcmNlIHdpbmRvdyByZXBsYWNlbWVudCIsIDAsIC04LCAyNTksIFpfT0spOworICAgIGluZigiNjMgMTggNjggMzAgZDAgMCAwIiwgImZvcmNlIHNwbGl0IHdpbmRvdyB1cGRhdGUiLCA0LCAtOCwgMjU5LCBaX09LKTsKKyAgICBpbmYoIjMgMCIsICJ1c2UgZml4ZWQgYmxvY2tzIiwgMCwgLTE1LCAxLCBaX1NUUkVBTV9FTkQpOworICAgIGluZigiIiwgImJhZCB3aW5kb3cgc2l6ZSIsIDAsIDEsIDAsIFpfU1RSRUFNX0VSUk9SKTsKKworICAgIG1lbV9zZXR1cCgmc3RybSk7CisgICAgc3RybS5hdmFpbF9pbiA9IDA7CisgICAgc3RybS5uZXh0X2luID0gWl9OVUxMOworICAgIHJldCA9IGluZmxhdGVJbml0Xygmc3RybSwgWkxJQl9WRVJTSU9OIC0gMSwgKGludClzaXplb2Yoel9zdHJlYW0pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydChyZXQgPT0gWl9WRVJTSU9OX0VSUk9SKTsKKyAgICBtZW1fZG9uZSgmc3RybSwgIndyb25nIHZlcnNpb24iKTsKKworICAgIHN0cm0uYXZhaWxfaW4gPSAwOworICAgIHN0cm0ubmV4dF9pbiA9IFpfTlVMTDsKKyAgICByZXQgPSBpbmZsYXRlSW5pdCgmc3RybSk7ICAgICAgICAgICAgICAgICAgIGFzc2VydChyZXQgPT0gWl9PSyk7CisgICAgcmV0ID0gaW5mbGF0ZUVuZCgmc3RybSk7ICAgICAgICAgICAgICAgICAgICBhc3NlcnQocmV0ID09IFpfT0spOworICAgIGZwdXRzKCJpbmZsYXRlIGJ1aWx0LWluIG1lbW9yeSByb3V0aW5lc1xuIiwgc3RkZXJyKTsKK30KKworLyogY292ZXIgYWxsIGluZmxhdGUoKSBoZWFkZXIgYW5kIHRyYWlsZXIgY2FzZXMgYW5kIGNvZGUgYWZ0ZXIgaW5mbGF0ZSgpICovCitsb2NhbCB2b2lkIGNvdmVyX3dyYXAodm9pZCkKK3sKKyAgICBpbnQgcmV0OworICAgIHpfc3RyZWFtIHN0cm0sIGNvcHk7CisgICAgdW5zaWduZWQgY2hhciBkaWN0WzI1N107CisKKyAgICByZXQgPSBpbmZsYXRlKFpfTlVMTCwgMCk7ICAgICAgICAgICAgICAgICAgIGFzc2VydChyZXQgPT0gWl9TVFJFQU1fRVJST1IpOworICAgIHJldCA9IGluZmxhdGVFbmQoWl9OVUxMKTsgICAgICAgICAgICAgICAgICAgYXNzZXJ0KHJldCA9PSBaX1NUUkVBTV9FUlJPUik7CisgICAgcmV0ID0gaW5mbGF0ZUNvcHkoWl9OVUxMLCBaX05VTEwpOyAgICAgICAgICBhc3NlcnQocmV0ID09IFpfU1RSRUFNX0VSUk9SKTsKKyAgICBmcHV0cygiaW5mbGF0ZSBiYWQgcGFyYW1ldGVyc1xuIiwgc3RkZXJyKTsKKworICAgIGluZigiMWYgOGIgMCAwIiwgImJhZCBnemlwIG1ldGhvZCIsIDAsIDMxLCAwLCBaX0RBVEFfRVJST1IpOworICAgIGluZigiMWYgOGIgOCA4MCIsICJiYWQgZ3ppcCBmbGFncyIsIDAsIDMxLCAwLCBaX0RBVEFfRVJST1IpOworICAgIGluZigiNzcgODUiLCAiYmFkIHpsaWIgbWV0aG9kIiwgMCwgMTUsIDAsIFpfREFUQV9FUlJPUik7CisgICAgaW5mKCI4IDk5IiwgInNldCB3aW5kb3cgc2l6ZSBmcm9tIGhlYWRlciIsIDAsIDAsIDAsIFpfT0spOworICAgIGluZigiNzggOWMiLCAiYmFkIHpsaWIgd2luZG93IHNpemUiLCAwLCA4LCAwLCBaX0RBVEFfRVJST1IpOworICAgIGluZigiNzggOWMgNjMgMCAwIDAgMSAwIDEiLCAiY2hlY2sgYWRsZXIzMiIsIDAsIDE1LCAxLCBaX1NUUkVBTV9FTkQpOworICAgIGluZigiMWYgOGIgOCAxZSAwIDAgMCAwIDAgMCAxIDAgMCAwIDAgMCAwIiwgImJhZCBoZWFkZXIgY3JjIiwgMCwgNDcsIDEsCisgICAgICAgIFpfREFUQV9FUlJPUik7CisgICAgaW5mKCIxZiA4YiA4IDIgMCAwIDAgMCAwIDAgMWQgMjYgMyAwIDAgMCAwIDAgMCAwIDAgMCIsICJjaGVjayBnemlwIGxlbmd0aCIsCisgICAgICAgIDAsIDQ3LCAwLCBaX1NUUkVBTV9FTkQpOworICAgIGluZigiNzggOTAiLCAiYmFkIHpsaWIgaGVhZGVyIGNoZWNrIiwgMCwgNDcsIDAsIFpfREFUQV9FUlJPUik7CisgICAgaW5mKCI4IGI4IDAgMCAwIDEiLCAibmVlZCBkaWN0aW9uYXJ5IiwgMCwgOCwgMCwgWl9ORUVEX0RJQ1QpOworICAgIGluZigiNzggOWMgNjMgMCIsICJjb21wdXRlIGFkbGVyMzIiLCAwLCAxNSwgMSwgWl9PSyk7CisKKyAgICBtZW1fc2V0dXAoJnN0cm0pOworICAgIHN0cm0uYXZhaWxfaW4gPSAwOworICAgIHN0cm0ubmV4dF9pbiA9IFpfTlVMTDsKKyAgICByZXQgPSBpbmZsYXRlSW5pdDIoJnN0cm0sIC04KTsKKyAgICBzdHJtLmF2YWlsX2luID0gMjsKKyAgICBzdHJtLm5leHRfaW4gPSAodm9pZCAqKSJceDYzIjsKKyAgICBzdHJtLmF2YWlsX291dCA9IDE7CisgICAgc3RybS5uZXh0X291dCA9ICh2b2lkICopJnJldDsKKyAgICBtZW1fbGltaXQoJnN0cm0sIDEpOworICAgIHJldCA9IGluZmxhdGUoJnN0cm0sIFpfTk9fRkxVU0gpOyAgICAgICAgICAgYXNzZXJ0KHJldCA9PSBaX01FTV9FUlJPUik7CisgICAgcmV0ID0gaW5mbGF0ZSgmc3RybSwgWl9OT19GTFVTSCk7ICAgICAgICAgICBhc3NlcnQocmV0ID09IFpfTUVNX0VSUk9SKTsKKyAgICBtZW1fbGltaXQoJnN0cm0sIDApOworICAgIG1lbXNldChkaWN0LCAwLCAyNTcpOworICAgIHJldCA9IGluZmxhdGVTZXREaWN0aW9uYXJ5KCZzdHJtLCBkaWN0LCAyNTcpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KHJldCA9PSBaX09LKTsKKyAgICBtZW1fbGltaXQoJnN0cm0sIChzaXplb2Yoc3RydWN0IGluZmxhdGVfc3RhdGUpIDw8IDEpICsgMjU2KTsKKyAgICByZXQgPSBpbmZsYXRlUHJpbWUoJnN0cm0sIDE2LCAwKTsgICAgICAgICAgIGFzc2VydChyZXQgPT0gWl9PSyk7CisgICAgc3RybS5hdmFpbF9pbiA9IDI7CisgICAgc3RybS5uZXh0X2luID0gKHZvaWQgKikiXHg4MCI7CisgICAgcmV0ID0gaW5mbGF0ZVN5bmMoJnN0cm0pOyAgICAgICAgICAgICAgICAgICBhc3NlcnQocmV0ID09IFpfREFUQV9FUlJPUik7CisgICAgcmV0ID0gaW5mbGF0ZSgmc3RybSwgWl9OT19GTFVTSCk7ICAgICAgICAgICBhc3NlcnQocmV0ID09IFpfU1RSRUFNX0VSUk9SKTsKKyAgICBzdHJtLmF2YWlsX2luID0gNDsKKyAgICBzdHJtLm5leHRfaW4gPSAodm9pZCAqKSJcMFwwXHhmZlx4ZmYiOworICAgIHJldCA9IGluZmxhdGVTeW5jKCZzdHJtKTsgICAgICAgICAgICAgICAgICAgYXNzZXJ0KHJldCA9PSBaX09LKTsKKyAgICAodm9pZClpbmZsYXRlU3luY1BvaW50KCZzdHJtKTsKKyAgICByZXQgPSBpbmZsYXRlQ29weSgmY29weSwgJnN0cm0pOyAgICAgICAgICAgIGFzc2VydChyZXQgPT0gWl9NRU1fRVJST1IpOworICAgIG1lbV9saW1pdCgmc3RybSwgMCk7CisgICAgcmV0ID0gaW5mbGF0ZVVuZGVybWluZSgmc3RybSwgMSk7ICAgICAgICAgICBhc3NlcnQocmV0ID09IFpfREFUQV9FUlJPUik7CisgICAgKHZvaWQpaW5mbGF0ZU1hcmsoJnN0cm0pOworICAgIHJldCA9IGluZmxhdGVFbmQoJnN0cm0pOyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KHJldCA9PSBaX09LKTsKKyAgICBtZW1fZG9uZSgmc3RybSwgIm1pc2NlbGxhbmVvdXMsIGZvcmNlIG1lbW9yeSBlcnJvcnMiKTsKK30KKworLyogaW5wdXQgYW5kIG91dHB1dCBmdW5jdGlvbnMgZm9yIGluZmxhdGVCYWNrKCkgKi8KK2xvY2FsIHVuc2lnbmVkIHB1bGwodm9pZCAqZGVzYywgdW5zaWduZWQgY2hhciAqKmJ1ZikKK3sKKyAgICBzdGF0aWMgdW5zaWduZWQgaW50IG5leHQgPSAwOworICAgIHN0YXRpYyB1bnNpZ25lZCBjaGFyIGRhdFtdID0gezB4NjMsIDAsIDIsIDB9OworICAgIHN0cnVjdCBpbmZsYXRlX3N0YXRlICpzdGF0ZTsKKworICAgIGlmIChkZXNjID09IFpfTlVMTCkgeworICAgICAgICBuZXh0ID0gMDsKKyAgICAgICAgcmV0dXJuIDA7ICAgLyogbm8gaW5wdXQgKGFscmVhZHkgcHJvdmlkZWQgYXQgbmV4dF9pbikgKi8KKyAgICB9CisgICAgc3RhdGUgPSAodm9pZCAqKSgoel9zdHJlYW0gKilkZXNjKS0+c3RhdGU7CisgICAgaWYgKHN0YXRlICE9IFpfTlVMTCkKKyAgICAgICAgc3RhdGUtPm1vZGUgPSBTWU5DOyAgICAgLyogZm9yY2UgYW4gb3RoZXJ3aXNlIGltcG9zc2libGUgc2l0dWF0aW9uICovCisgICAgcmV0dXJuIG5leHQgPCBzaXplb2YoZGF0KSA/ICgqYnVmID0gZGF0ICsgbmV4dCsrLCAxKSA6IDA7Cit9CisKK2xvY2FsIGludCBwdXNoKHZvaWQgKmRlc2MsIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgdW5zaWduZWQgbGVuKQoreworICAgIGJ1ZiArPSBsZW47CisgICAgcmV0dXJuIGRlc2MgIT0gWl9OVUxMOyAgICAgIC8qIGZvcmNlIGVycm9yIGlmIGRlc2Mgbm90IG51bGwgKi8KK30KKworLyogY292ZXIgaW5mbGF0ZUJhY2soKSB1cCB0byBjb21tb24gZGVmbGF0ZSBkYXRhIGNhc2VzIGFuZCBhZnRlciB0aG9zZSAqLworbG9jYWwgdm9pZCBjb3Zlcl9iYWNrKHZvaWQpCit7CisgICAgaW50IHJldDsKKyAgICB6X3N0cmVhbSBzdHJtOworICAgIHVuc2lnbmVkIGNoYXIgd2luWzMyNzY4XTsKKworICAgIHJldCA9IGluZmxhdGVCYWNrSW5pdF8oWl9OVUxMLCAwLCB3aW4sIDAsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KHJldCA9PSBaX1ZFUlNJT05fRVJST1IpOworICAgIHJldCA9IGluZmxhdGVCYWNrSW5pdChaX05VTEwsIDAsIHdpbik7ICAgICAgYXNzZXJ0KHJldCA9PSBaX1NUUkVBTV9FUlJPUik7CisgICAgcmV0ID0gaW5mbGF0ZUJhY2soWl9OVUxMLCBaX05VTEwsIFpfTlVMTCwgWl9OVUxMLCBaX05VTEwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KHJldCA9PSBaX1NUUkVBTV9FUlJPUik7CisgICAgcmV0ID0gaW5mbGF0ZUJhY2tFbmQoWl9OVUxMKTsgICAgICAgICAgICAgICBhc3NlcnQocmV0ID09IFpfU1RSRUFNX0VSUk9SKTsKKyAgICBmcHV0cygiaW5mbGF0ZUJhY2sgYmFkIHBhcmFtZXRlcnNcbiIsIHN0ZGVycik7CisKKyAgICBtZW1fc2V0dXAoJnN0cm0pOworICAgIHJldCA9IGluZmxhdGVCYWNrSW5pdCgmc3RybSwgMTUsIHdpbik7ICAgICAgYXNzZXJ0KHJldCA9PSBaX09LKTsKKyAgICBzdHJtLmF2YWlsX2luID0gMjsKKyAgICBzdHJtLm5leHRfaW4gPSAodm9pZCAqKSJceDAzIjsKKyAgICByZXQgPSBpbmZsYXRlQmFjaygmc3RybSwgcHVsbCwgWl9OVUxMLCBwdXNoLCBaX05VTEwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KHJldCA9PSBaX1NUUkVBTV9FTkQpOworICAgICAgICAvKiBmb3JjZSBvdXRwdXQgZXJyb3IgKi8KKyAgICBzdHJtLmF2YWlsX2luID0gMzsKKyAgICBzdHJtLm5leHRfaW4gPSAodm9pZCAqKSJceDYzXHgwMCI7CisgICAgcmV0ID0gaW5mbGF0ZUJhY2soJnN0cm0sIHB1bGwsIFpfTlVMTCwgcHVzaCwgJnN0cm0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KHJldCA9PSBaX0JVRl9FUlJPUik7CisgICAgICAgIC8qIGZvcmNlIG1vZGUgZXJyb3IgYnkgbXVja2luZyB3aXRoIHN0YXRlICovCisgICAgcmV0ID0gaW5mbGF0ZUJhY2soJnN0cm0sIHB1bGwsICZzdHJtLCBwdXNoLCBaX05VTEwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KHJldCA9PSBaX1NUUkVBTV9FUlJPUik7CisgICAgcmV0ID0gaW5mbGF0ZUJhY2tFbmQoJnN0cm0pOyAgICAgICAgICAgICAgICBhc3NlcnQocmV0ID09IFpfT0spOworICAgIG1lbV9kb25lKCZzdHJtLCAiaW5mbGF0ZUJhY2sgYmFkIHN0YXRlIik7CisKKyAgICByZXQgPSBpbmZsYXRlQmFja0luaXQoJnN0cm0sIDE1LCB3aW4pOyAgICAgIGFzc2VydChyZXQgPT0gWl9PSyk7CisgICAgcmV0ID0gaW5mbGF0ZUJhY2tFbmQoJnN0cm0pOyAgICAgICAgICAgICAgICBhc3NlcnQocmV0ID09IFpfT0spOworICAgIGZwdXRzKCJpbmZsYXRlQmFjayBidWlsdC1pbiBtZW1vcnkgcm91dGluZXNcbiIsIHN0ZGVycik7Cit9CisKKy8qIGRvIGEgcmF3IGluZmxhdGUgb2YgZGF0YSBpbiBoZXhhZGVjaW1hbCB3aXRoIGJvdGggaW5mbGF0ZSBhbmQgaW5mbGF0ZUJhY2sgKi8KK2xvY2FsIGludCB0cnkoY2hhciAqaGV4LCBjaGFyICppZCwgaW50IGVycikKK3sKKyAgICBpbnQgcmV0OworICAgIHVuc2lnbmVkIGxlbiwgc2l6ZTsKKyAgICB1bnNpZ25lZCBjaGFyICppbiwgKm91dCwgKndpbjsKKyAgICBjaGFyICpwcmVmaXg7CisgICAgel9zdHJlYW0gc3RybTsKKworICAgIC8qIGNvbnZlcnQgdG8gaGV4ICovCisgICAgaW4gPSBoMmIoaGV4LCAmbGVuKTsKKyAgICBhc3NlcnQoaW4gIT0gTlVMTCk7CisKKyAgICAvKiBhbGxvY2F0ZSB3b3JrIGFyZWFzICovCisgICAgc2l6ZSA9IGxlbiA8PCAzOworICAgIG91dCA9IG1hbGxvYyhzaXplKTsKKyAgICBhc3NlcnQob3V0ICE9IE5VTEwpOworICAgIHdpbiA9IG1hbGxvYygzMjc2OCk7CisgICAgYXNzZXJ0KHdpbiAhPSBOVUxMKTsKKyAgICBwcmVmaXggPSBtYWxsb2Moc3RybGVuKGlkKSArIDYpOworICAgIGFzc2VydChwcmVmaXggIT0gTlVMTCk7CisKKyAgICAvKiBmaXJzdCB3aXRoIGluZmxhdGUgKi8KKyAgICBzdHJjcHkocHJlZml4LCBpZCk7CisgICAgc3RyY2F0KHByZWZpeCwgIi1sYXRlIik7CisgICAgbWVtX3NldHVwKCZzdHJtKTsKKyAgICBzdHJtLmF2YWlsX2luID0gMDsKKyAgICBzdHJtLm5leHRfaW4gPSBaX05VTEw7CisgICAgcmV0ID0gaW5mbGF0ZUluaXQyKCZzdHJtLCBlcnIgPCAwID8gNDcgOiAtMTUpOworICAgIGFzc2VydChyZXQgPT0gWl9PSyk7CisgICAgc3RybS5hdmFpbF9pbiA9IGxlbjsKKyAgICBzdHJtLm5leHRfaW4gPSBpbjsKKyAgICBkbyB7CisgICAgICAgIHN0cm0uYXZhaWxfb3V0ID0gc2l6ZTsKKyAgICAgICAgc3RybS5uZXh0X291dCA9IG91dDsKKyAgICAgICAgcmV0ID0gaW5mbGF0ZSgmc3RybSwgWl9UUkVFUyk7CisgICAgICAgIGFzc2VydChyZXQgIT0gWl9TVFJFQU1fRVJST1IgJiYgcmV0ICE9IFpfTUVNX0VSUk9SKTsKKyAgICAgICAgaWYgKHJldCA9PSBaX0RBVEFfRVJST1IgfHwgcmV0ID09IFpfTkVFRF9ESUNUKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfSB3aGlsZSAoc3RybS5hdmFpbF9pbiB8fCBzdHJtLmF2YWlsX291dCA9PSAwKTsKKyAgICBpZiAoZXJyKSB7CisgICAgICAgIGFzc2VydChyZXQgPT0gWl9EQVRBX0VSUk9SKTsKKyAgICAgICAgYXNzZXJ0KHN0cmNtcChpZCwgc3RybS5tc2cpID09IDApOworICAgIH0KKyAgICBpbmZsYXRlRW5kKCZzdHJtKTsKKyAgICBtZW1fZG9uZSgmc3RybSwgcHJlZml4KTsKKworICAgIC8qIHRoZW4gd2l0aCBpbmZsYXRlQmFjayAqLworICAgIGlmIChlcnIgPj0gMCkgeworICAgICAgICBzdHJjcHkocHJlZml4LCBpZCk7CisgICAgICAgIHN0cmNhdChwcmVmaXgsICItYmFjayIpOworICAgICAgICBtZW1fc2V0dXAoJnN0cm0pOworICAgICAgICByZXQgPSBpbmZsYXRlQmFja0luaXQoJnN0cm0sIDE1LCB3aW4pOworICAgICAgICBhc3NlcnQocmV0ID09IFpfT0spOworICAgICAgICBzdHJtLmF2YWlsX2luID0gbGVuOworICAgICAgICBzdHJtLm5leHRfaW4gPSBpbjsKKyAgICAgICAgcmV0ID0gaW5mbGF0ZUJhY2soJnN0cm0sIHB1bGwsIFpfTlVMTCwgcHVzaCwgWl9OVUxMKTsKKyAgICAgICAgYXNzZXJ0KHJldCAhPSBaX1NUUkVBTV9FUlJPUik7CisgICAgICAgIGlmIChlcnIpIHsKKyAgICAgICAgICAgIGFzc2VydChyZXQgPT0gWl9EQVRBX0VSUk9SKTsKKyAgICAgICAgICAgIGFzc2VydChzdHJjbXAoaWQsIHN0cm0ubXNnKSA9PSAwKTsKKyAgICAgICAgfQorICAgICAgICBpbmZsYXRlQmFja0VuZCgmc3RybSk7CisgICAgICAgIG1lbV9kb25lKCZzdHJtLCBwcmVmaXgpOworICAgIH0KKworICAgIC8qIGNsZWFuIHVwICovCisgICAgZnJlZShwcmVmaXgpOworICAgIGZyZWUod2luKTsKKyAgICBmcmVlKG91dCk7CisgICAgZnJlZShpbik7CisgICAgcmV0dXJuIHJldDsKK30KKworLyogY292ZXIgZGVmbGF0ZSBkYXRhIGNhc2VzIGluIGJvdGggaW5mbGF0ZSgpIGFuZCBpbmZsYXRlQmFjaygpICovCitsb2NhbCB2b2lkIGNvdmVyX2luZmxhdGUodm9pZCkKK3sKKyAgICB0cnkoIjAgMCAwIDAgMCIsICJpbnZhbGlkIHN0b3JlZCBibG9jayBsZW5ndGhzIiwgMSk7CisgICAgdHJ5KCIzIDAiLCAiZml4ZWQiLCAwKTsKKyAgICB0cnkoIjYiLCAiaW52YWxpZCBibG9jayB0eXBlIiwgMSk7CisgICAgdHJ5KCIxIDEgMCBmZSBmZiAwIiwgInN0b3JlZCIsIDApOworICAgIHRyeSgiZmMgMCAwIiwgInRvbyBtYW55IGxlbmd0aCBvciBkaXN0YW5jZSBzeW1ib2xzIiwgMSk7CisgICAgdHJ5KCI0IDAgZmUgZmYiLCAiaW52YWxpZCBjb2RlIGxlbmd0aHMgc2V0IiwgMSk7CisgICAgdHJ5KCI0IDAgMjQgNDkgMCIsICJpbnZhbGlkIGJpdCBsZW5ndGggcmVwZWF0IiwgMSk7CisgICAgdHJ5KCI0IDAgMjQgZTkgZmYgZmYiLCAiaW52YWxpZCBiaXQgbGVuZ3RoIHJlcGVhdCIsIDEpOworICAgIHRyeSgiNCAwIDI0IGU5IGZmIDZkIiwgImludmFsaWQgY29kZSAtLSBtaXNzaW5nIGVuZC1vZi1ibG9jayIsIDEpOworICAgIHRyeSgiNCA4MCA0OSA5MiAyNCA0OSA5MiAyNCA3MSBmZiBmZiA5MyAxMSAwIiwKKyAgICAgICAgImludmFsaWQgbGl0ZXJhbC9sZW5ndGhzIHNldCIsIDEpOworICAgIHRyeSgiNCA4MCA0OSA5MiAyNCA0OSA5MiAyNCBmIGI0IGZmIGZmIGMzIDg0IiwgImludmFsaWQgZGlzdGFuY2VzIHNldCIsIDEpOworICAgIHRyeSgiNCBjMCA4MSA4IDAgMCAwIDAgMjAgN2YgZWIgYiAwIDAiLCAiaW52YWxpZCBsaXRlcmFsL2xlbmd0aCBjb2RlIiwgMSk7CisgICAgdHJ5KCIyIDdlIGZmIGZmIiwgImludmFsaWQgZGlzdGFuY2UgY29kZSIsIDEpOworICAgIHRyeSgiYyBjMCA4MSAwIDAgMCAwIDAgOTAgZmYgNmIgNCAwIiwgImludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrIiwgMSk7CisKKyAgICAvKiBhbHNvIHRyYWlsZXIgbWlzbWF0Y2gganVzdCBpbiBpbmZsYXRlKCkgKi8KKyAgICB0cnkoIjFmIDhiIDggMCAwIDAgMCAwIDAgMCAzIDAgMCAwIDAgMSIsICJpbmNvcnJlY3QgZGF0YSBjaGVjayIsIC0xKTsKKyAgICB0cnkoIjFmIDhiIDggMCAwIDAgMCAwIDAgMCAzIDAgMCAwIDAgMCAwIDAgMCAxIiwKKyAgICAgICAgImluY29ycmVjdCBsZW5ndGggY2hlY2siLCAtMSk7CisgICAgdHJ5KCI1IGMwIDIxIGQgMCAwIDAgODAgYjAgZmUgNmQgMmYgOTEgNmMiLCAicHVsbCAxNyIsIDApOworICAgIHRyeSgiNSBlMCA4MSA5MSAyNCBjYiBiMiAyYyA0OSBlMiBmIDJlIDhiIDlhIDQ3IDU2IDlmIGZiIGZlIGVjIGQyIGZmIDFmIiwKKyAgICAgICAgImxvbmcgY29kZSIsIDApOworICAgIHRyeSgiZWQgYzAgMSAxIDAgMCAwIDQwIDIwIGZmIDU3IDFiIDQyIDJjIDRmIiwgImxlbmd0aCBleHRyYSIsIDApOworICAgIHRyeSgiZWQgY2YgYzEgYjEgMmMgNDcgMTAgYzQgMzAgZmEgNmYgMzUgMWQgMSA4MiA1OSAzZCBmYiBiZSAyZSAyYSBmYyBmIGMiLAorICAgICAgICAibG9uZyBkaXN0YW5jZSBhbmQgZXh0cmEiLCAwKTsKKyAgICB0cnkoImVkIGMwIDgxIDAgMCAwIDAgODAgYTAgZmQgYTkgMTcgYTkgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwICIKKyAgICAgICAgIjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDYiLCAid2luZG93IGVuZCIsIDApOworICAgIGluZigiMiA4IDIwIDgwIDAgMyAwIiwgImluZmxhdGVfZmFzdCBUWVBFIHJldHVybiIsIDAsIC0xNSwgMjU4LAorICAgICAgICBaX1NUUkVBTV9FTkQpOworICAgIGluZigiNjMgMTggNSA0MCBjIDAiLCAid2luZG93IHdyYXAiLCAzLCAtOCwgMzAwLCBaX09LKTsKK30KKworLyogY292ZXIgcmVtYWluaW5nIGxpbmVzIGluIGluZnRyZWVzLmMgKi8KK2xvY2FsIHZvaWQgY292ZXJfdHJlZXModm9pZCkKK3sKKyAgICBpbnQgcmV0OworICAgIHVuc2lnbmVkIGJpdHM7CisgICAgdW5zaWduZWQgc2hvcnQgbGVuc1sxNl0sIHdvcmtbMTZdOworICAgIGNvZGUgKm5leHQsIHRhYmxlW0VOT1VHSF9ESVNUU107CisKKyAgICAvKiB3ZSBuZWVkIHRvIGNhbGwgaW5mbGF0ZV90YWJsZSgpIGRpcmVjdGx5IGluIG9yZGVyIHRvIG1hbmlmZXN0IG5vdC0KKyAgICAgICBlbm91Z2ggZXJyb3JzLCBzaW5jZSB6bGliIGluc3VyZXMgdGhhdCBlbm91Z2ggaXMgYWx3YXlzIGVub3VnaCAqLworICAgIGZvciAoYml0cyA9IDA7IGJpdHMgPCAxNTsgYml0cysrKQorICAgICAgICBsZW5zW2JpdHNdID0gKHVuc2lnbmVkIHNob3J0KShiaXRzICsgMSk7CisgICAgbGVuc1sxNV0gPSAxNTsKKyAgICBuZXh0ID0gdGFibGU7CisgICAgYml0cyA9IDE1OworICAgIHJldCA9IGluZmxhdGVfdGFibGUoRElTVFMsIGxlbnMsIDE2LCAmbmV4dCwgJmJpdHMsIHdvcmspOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KHJldCA9PSAxKTsKKyAgICBuZXh0ID0gdGFibGU7CisgICAgYml0cyA9IDE7CisgICAgcmV0ID0gaW5mbGF0ZV90YWJsZShESVNUUywgbGVucywgMTYsICZuZXh0LCAmYml0cywgd29yayk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQocmV0ID09IDEpOworICAgIGZwdXRzKCJpbmZsYXRlX3RhYmxlIG5vdCBlbm91Z2ggZXJyb3JzXG4iLCBzdGRlcnIpOworfQorCisvKiBjb3ZlciByZW1haW5pbmcgaW5mZmFzdC5jIGRlY29kaW5nIGFuZCB3aW5kb3cgY29weWluZyAqLworbG9jYWwgdm9pZCBjb3Zlcl9mYXN0KHZvaWQpCit7CisgICAgaW5mKCJlNSBlMCA4MSBhZCA2ZCBjYiBiMiAyYyBjOSAwMSAxZSA1OSA2MyBhZSA3ZCBlZSBmYiA0ZCBmZCBiNSAzNSA0MSA2OCIKKyAgICAgICAgIiBmZiA3ZiAwZiAwIDAgMCIsICJmYXN0IGxlbmd0aCBleHRyYSBiaXRzIiwgMCwgLTgsIDI1OCwgWl9EQVRBX0VSUk9SKTsKKyAgICBpbmYoIjI1IGZkIDgxIGI1IDZkIDU5IGI2IDZhIDQ5IGVhIGFmIDM1IDYgMzQgZWIgOGMgYjkgZjYgYjkgMWUgZWYgNjcgNDkiCisgICAgICAgICIgNTAgZmUgZmYgZmYgM2YgMCAwIiwgImZhc3QgZGlzdGFuY2UgZXh0cmEgYml0cyIsIDAsIC04LCAyNTgsCisgICAgICAgIFpfREFUQV9FUlJPUik7CisgICAgaW5mKCIzIDdlIDAgMCAwIDAgMCIsICJmYXN0IGludmFsaWQgZGlzdGFuY2UgY29kZSIsIDAsIC04LCAyNTgsCisgICAgICAgIFpfREFUQV9FUlJPUik7CisgICAgaW5mKCIxYiA3IDAgMCAwIDAgMCIsICJmYXN0IGludmFsaWQgbGl0ZXJhbC9sZW5ndGggY29kZSIsIDAsIC04LCAyNTgsCisgICAgICAgIFpfREFUQV9FUlJPUik7CisgICAgaW5mKCJkIGM3IDEgYWUgZWIgMzggYyA0IDQxIGEwIDg3IDcyIGRlIGRmIGZiIDFmIGI4IDM2IGIxIDM4IDVkIGZmIGZmIDAiLAorICAgICAgICAiZmFzdCAybmQgbGV2ZWwgY29kZXMgYW5kIHRvbyBmYXIgYmFjayIsIDAsIC04LCAyNTgsIFpfREFUQV9FUlJPUik7CisgICAgaW5mKCI2MyAxOCA1IDhjIDEwIDggMCAwIDAgMCIsICJ2ZXJ5IGNvbW1vbiBjYXNlIiwgMCwgLTgsIDI1OSwgWl9PSyk7CisgICAgaW5mKCI2MyA2MCA2MCAxOCBjOSAwIDggMTggMTggMTggMjYgYzAgMjggMCAyOSAwIDAgMCIsCisgICAgICAgICJjb250aWd1b3VzIGFuZCB3cmFwIGFyb3VuZCB3aW5kb3ciLCA2LCAtOCwgMjU5LCBaX09LKTsKKyAgICBpbmYoIjYzIDAgMyAwIDAgMCAwIDAiLCAiY29weSBkaXJlY3QgZnJvbSBvdXRwdXQiLCAwLCAtOCwgMjU5LAorICAgICAgICBaX1NUUkVBTV9FTkQpOworfQorCitpbnQgbWFpbih2b2lkKQoreworICAgIGZwcmludGYoc3RkZXJyLCAiJXNcbiIsIHpsaWJWZXJzaW9uKCkpOworICAgIGNvdmVyX3N1cHBvcnQoKTsKKyAgICBjb3Zlcl93cmFwKCk7CisgICAgY292ZXJfYmFjaygpOworICAgIGNvdmVyX2luZmxhdGUoKTsKKyAgICBjb3Zlcl90cmVlcygpOworICAgIGNvdmVyX2Zhc3QoKTsKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3psaWItMS4yLjYvdGVzdC9taW5pZ3ppcC5jIGIvemxpYi0xLjIuNi90ZXN0L21pbmlnemlwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODMxNzM0NAotLS0gL2Rldi9udWxsCisrKyBiL3psaWItMS4yLjYvdGVzdC9taW5pZ3ppcC5jCkBAIC0wLDAgKzEsNjMxIEBACisvKiBtaW5pZ3ppcC5jIC0tIHNpbXVsYXRlIGd6aXAgdXNpbmcgdGhlIHpsaWIgY29tcHJlc3Npb24gbGlicmFyeQorICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDYsIDIwMTAsIDIwMTEgSmVhbi1sb3VwIEdhaWxseS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKKyAqLworCisvKgorICogbWluaWd6aXAgaXMgYSBtaW5pbWFsIGltcGxlbWVudGF0aW9uIG9mIHRoZSBnemlwIHV0aWxpdHkuIFRoaXMgaXMKKyAqIG9ubHkgYW4gZXhhbXBsZSBvZiB1c2luZyB6bGliIGFuZCBpc24ndCBtZWFudCB0byByZXBsYWNlIHRoZQorICogZnVsbC1mZWF0dXJlZCBnemlwLiBObyBhdHRlbXB0IGlzIG1hZGUgdG8gZGVhbCB3aXRoIGZpbGUgc3lzdGVtcworICogbGltaXRpbmcgbmFtZXMgdG8gMTQgb3IgOCszIGNoYXJhY3RlcnMsIGV0Yy4uLiBFcnJvciBjaGVja2luZyBpcworICogdmVyeSBsaW1pdGVkLiBTbyB1c2UgbWluaWd6aXAgb25seSBmb3IgdGVzdGluZzsgdXNlIGd6aXAgZm9yIHRoZQorICogcmVhbCB0aGluZy4gT24gTVNET1MsIHVzZSBvbmx5IG9uIGZpbGUgbmFtZXMgd2l0aG91dCBleHRlbnNpb24KKyAqIG9yIGluIHBpcGUgbW9kZS4KKyAqLworCisvKiBAKCMpICRJZCQgKi8KKworI2luY2x1ZGUgInpsaWIuaCIKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaWZkZWYgU1REQworIyAgaW5jbHVkZSA8c3RyaW5nLmg+CisjICBpbmNsdWRlIDxzdGRsaWIuaD4KKyNlbmRpZgorCisjaWZkZWYgVVNFX01NQVAKKyMgIGluY2x1ZGUgPHN5cy90eXBlcy5oPgorIyAgaW5jbHVkZSA8c3lzL21tYW4uaD4KKyMgIGluY2x1ZGUgPHN5cy9zdGF0Lmg+CisjZW5kaWYKKworI2lmIGRlZmluZWQoTVNET1MpIHx8IGRlZmluZWQoT1MyKSB8fCBkZWZpbmVkKFdJTjMyKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCisjICBpbmNsdWRlIDxmY250bC5oPgorIyAgaW5jbHVkZSA8aW8uaD4KKyMgIGlmZGVmIFVOREVSX0NFCisjICAgIGluY2x1ZGUgPHN0ZGxpYi5oPgorIyAgZW5kaWYKKyMgIGRlZmluZSBTRVRfQklOQVJZX01PREUoZmlsZSkgc2V0bW9kZShmaWxlbm8oZmlsZSksIE9fQklOQVJZKQorI2Vsc2UKKyMgIGRlZmluZSBTRVRfQklOQVJZX01PREUoZmlsZSkKKyNlbmRpZgorCisjaWZkZWYgVk1TCisjICBkZWZpbmUgdW5saW5rIGRlbGV0ZQorIyAgZGVmaW5lIEdaX1NVRkZJWCAiLWd6IgorI2VuZGlmCisjaWZkZWYgUklTQ09TCisjICBkZWZpbmUgdW5saW5rIHJlbW92ZQorIyAgZGVmaW5lIEdaX1NVRkZJWCAiLWd6IgorIyAgZGVmaW5lIGZpbGVubyhmaWxlKSBmaWxlLT5fX2ZpbGUKKyNlbmRpZgorI2lmIGRlZmluZWQoX19NV0VSS1NfXykgJiYgX19kZXN0X29zICE9IF9fYmVfb3MgJiYgX19kZXN0X29zICE9IF9fd2luMzJfb3MKKyMgIGluY2x1ZGUgPHVuaXguaD4gLyogZm9yIGZpbGVubyAqLworI2VuZGlmCisKKyNpZiAhZGVmaW5lZChaX0hBVkVfVU5JU1REX0gpICYmICFkZWZpbmVkKF9MQVJHRUZJTEU2NF9TT1VSQ0UpCisjaWZuZGVmIFdJTjMyIC8qIHVubGluayBhbHJlYWR5IGluIHN0ZGlvLmggZm9yIFdJTjMyICovCisgIGV4dGVybiBpbnQgdW5saW5rIE9GKChjb25zdCBjaGFyICopKTsKKyNlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFVOREVSX0NFKQorIyAgaW5jbHVkZSA8d2luZG93cy5oPgorIyAgZGVmaW5lIHBlcnJvcihzKSBwd2luZXJyb3IocykKKworLyogTWFwIHRoZSBXaW5kb3dzIGVycm9yIG51bWJlciBpbiBFUlJPUiB0byBhIGxvY2FsZS1kZXBlbmRlbnQgZXJyb3IKKyAgIG1lc3NhZ2Ugc3RyaW5nIGFuZCByZXR1cm4gYSBwb2ludGVyIHRvIGl0LiAgVHlwaWNhbGx5LCB0aGUgdmFsdWVzCisgICBmb3IgRVJST1IgY29tZSBmcm9tIEdldExhc3RFcnJvci4KKworICAgVGhlIHN0cmluZyBwb2ludGVkIHRvIHNoYWxsIG5vdCBiZSBtb2RpZmllZCBieSB0aGUgYXBwbGljYXRpb24sCisgICBidXQgbWF5IGJlIG92ZXJ3cml0dGVuIGJ5IGEgc3Vic2VxdWVudCBjYWxsIHRvIHN0cndpbmVycm9yCisKKyAgIFRoZSBzdHJ3aW5lcnJvciBmdW5jdGlvbiBkb2VzIG5vdCBjaGFuZ2UgdGhlIGN1cnJlbnQgc2V0dGluZworICAgb2YgR2V0TGFzdEVycm9yLiAgKi8KKworc3RhdGljIGNoYXIgKnN0cndpbmVycm9yIChlcnJvcikKKyAgICAgRFdPUkQgZXJyb3I7Cit7CisgICAgc3RhdGljIGNoYXIgYnVmWzEwMjRdOworCisgICAgd2NoYXJfdCAqbXNnYnVmOworICAgIERXT1JEIGxhc3RlcnIgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICBEV09SRCBjaGFycyA9IEZvcm1hdE1lc3NhZ2UoRk9STUFUX01FU1NBR0VfRlJPTV9TWVNURU0KKyAgICAgICAgfCBGT1JNQVRfTUVTU0FHRV9BTExPQ0FURV9CVUZGRVIsCisgICAgICAgIE5VTEwsCisgICAgICAgIGVycm9yLAorICAgICAgICAwLCAvKiBEZWZhdWx0IGxhbmd1YWdlICovCisgICAgICAgIChMUFZPSUQpJm1zZ2J1ZiwKKyAgICAgICAgMCwKKyAgICAgICAgTlVMTCk7CisgICAgaWYgKGNoYXJzICE9IDApIHsKKyAgICAgICAgLyogSWYgdGhlcmUgaXMgYW4gXHJcbiBhcHBlbmRlZCwgemFwIGl0LiAgKi8KKyAgICAgICAgaWYgKGNoYXJzID49IDIKKyAgICAgICAgICAgICYmIG1zZ2J1ZltjaGFycyAtIDJdID09ICdccicgJiYgbXNnYnVmW2NoYXJzIC0gMV0gPT0gJ1xuJykgeworICAgICAgICAgICAgY2hhcnMgLT0gMjsKKyAgICAgICAgICAgIG1zZ2J1ZltjaGFyc10gPSAwOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNoYXJzID4gc2l6ZW9mIChidWYpIC0gMSkgeworICAgICAgICAgICAgY2hhcnMgPSBzaXplb2YgKGJ1ZikgLSAxOworICAgICAgICAgICAgbXNnYnVmW2NoYXJzXSA9IDA7CisgICAgICAgIH0KKworICAgICAgICB3Y3N0b21icyhidWYsIG1zZ2J1ZiwgY2hhcnMgKyAxKTsKKyAgICAgICAgTG9jYWxGcmVlKG1zZ2J1Zik7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBzcHJpbnRmKGJ1ZiwgInVua25vd24gd2luMzIgZXJyb3IgKCVsZCkiLCBlcnJvcik7CisgICAgfQorCisgICAgU2V0TGFzdEVycm9yKGxhc3RlcnIpOworICAgIHJldHVybiBidWY7Cit9CisKK3N0YXRpYyB2b2lkIHB3aW5lcnJvciAocykKKyAgICBjb25zdCBjaGFyICpzOworeworICAgIGlmIChzICYmICpzKQorICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiAlc1xuIiwgcywgc3Ryd2luZXJyb3IoR2V0TGFzdEVycm9yICgpKSk7CisgICAgZWxzZQorICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzXG4iLCBzdHJ3aW5lcnJvcihHZXRMYXN0RXJyb3IgKCkpKTsKK30KKworI2VuZGlmIC8qIFVOREVSX0NFICovCisKKyNpZm5kZWYgR1pfU1VGRklYCisjICBkZWZpbmUgR1pfU1VGRklYICIuZ3oiCisjZW5kaWYKKyNkZWZpbmUgU1VGRklYX0xFTiAoc2l6ZW9mKEdaX1NVRkZJWCktMSkKKworI2RlZmluZSBCVUZMRU4gICAgICAxNjM4NAorI2RlZmluZSBNQVhfTkFNRV9MRU4gMTAyNAorCisjaWZkZWYgTUFYU0VHXzY0SworIyAgZGVmaW5lIGxvY2FsIHN0YXRpYworICAgLyogTmVlZGVkIGZvciBzeXN0ZW1zIHdpdGggbGltaXRhdGlvbiBvbiBzdGFjayBzaXplLiAqLworI2Vsc2UKKyMgIGRlZmluZSBsb2NhbAorI2VuZGlmCisKKyNpZmRlZiBaX1NPTE8KKy8qIGZvciBaX1NPTE8sIGNyZWF0ZSBzaW1wbGlmaWVkIGd6KiBmdW5jdGlvbnMgdXNpbmcgZGVmbGF0ZSBhbmQgaW5mbGF0ZSAqLworCisjaWYgZGVmaW5lZChaX0hBVkVfVU5JU1REX0gpIHx8IGRlZmluZWQoWl9MQVJHRSkKKyMgIGluY2x1ZGUgPHVuaXN0ZC5oPiAgICAgICAvKiBmb3IgdW5saW5rKCkgKi8KKyNlbmRpZgorCit2b2lkICpteWFsbG9jIE9GKCh2b2lkICosIHVuc2lnbmVkLCB1bnNpZ25lZCkpOwordm9pZCBteWZyZWUgT0YoKHZvaWQgKiwgdm9pZCAqKSk7CisKK3ZvaWQgKm15YWxsb2MocSwgbiwgbSkKKyAgICB2b2lkICpxOworICAgIHVuc2lnbmVkIG4sIG07Cit7CisgICAgcSA9IFpfTlVMTDsKKyAgICByZXR1cm4gY2FsbG9jKG4sIG0pOworfQorCit2b2lkIG15ZnJlZShxLCBwKQorICAgIHZvaWQgKnEsICpwOworeworICAgIHEgPSBaX05VTEw7CisgICAgZnJlZShwKTsKK30KKwordHlwZWRlZiBzdHJ1Y3QgZ3pGaWxlX3MgeworICAgIEZJTEUgKmZpbGU7CisgICAgaW50IHdyaXRlOworICAgIGludCBlcnI7CisgICAgY2hhciAqbXNnOworICAgIHpfc3RyZWFtIHN0cm07Cit9ICpnekZpbGU7CisKK2d6RmlsZSBnem9wZW4gT0YoKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKSk7CitnekZpbGUgZ3pkb3BlbiBPRigoaW50LCBjb25zdCBjaGFyICopKTsKK2d6RmlsZSBnel9vcGVuIE9GKChjb25zdCBjaGFyICosIGludCwgY29uc3QgY2hhciAqKSk7CisKK2d6RmlsZSBnem9wZW4ocGF0aCwgbW9kZSkKK2NvbnN0IGNoYXIgKnBhdGg7Citjb25zdCBjaGFyICptb2RlOworeworICAgIHJldHVybiBnel9vcGVuKHBhdGgsIC0xLCBtb2RlKTsKK30KKworZ3pGaWxlIGd6ZG9wZW4oZmQsIG1vZGUpCitpbnQgZmQ7Citjb25zdCBjaGFyICptb2RlOworeworICAgIHJldHVybiBnel9vcGVuKE5VTEwsIGZkLCBtb2RlKTsKK30KKworZ3pGaWxlIGd6X29wZW4ocGF0aCwgZmQsIG1vZGUpCisgICAgY29uc3QgY2hhciAqcGF0aDsKKyAgICBpbnQgZmQ7CisgICAgY29uc3QgY2hhciAqbW9kZTsKK3sKKyAgICBnekZpbGUgZ3o7CisgICAgaW50IHJldDsKKworICAgIGd6ID0gbWFsbG9jKHNpemVvZihnekZpbGUpKTsKKyAgICBpZiAoZ3ogPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZ3otPndyaXRlID0gc3RyY2hyKG1vZGUsICd3JykgIT0gTlVMTDsKKyAgICBnei0+c3RybS56YWxsb2MgPSBteWFsbG9jOworICAgIGd6LT5zdHJtLnpmcmVlID0gbXlmcmVlOworICAgIGd6LT5zdHJtLm9wYXF1ZSA9IFpfTlVMTDsKKyAgICBpZiAoZ3otPndyaXRlKQorICAgICAgICByZXQgPSBkZWZsYXRlSW5pdDIoJihnei0+c3RybSksIC0xLCA4LCAxNSArIDE2LCA4LCAwKTsKKyAgICBlbHNlIHsKKyAgICAgICAgZ3otPnN0cm0ubmV4dF9pbiA9IDA7CisgICAgICAgIGd6LT5zdHJtLmF2YWlsX2luID0gWl9OVUxMOworICAgICAgICByZXQgPSBpbmZsYXRlSW5pdDIoJihnei0+c3RybSksIDE1ICsgMTYpOworICAgIH0KKyAgICBpZiAocmV0ICE9IFpfT0spIHsKKyAgICAgICAgZnJlZShneik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBnei0+ZmlsZSA9IHBhdGggPT0gTlVMTCA/IGZkb3BlbihmZCwgZ3otPndyaXRlID8gIndiIiA6ICJyYiIpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcGVuKHBhdGgsIGd6LT53cml0ZSA/ICJ3YiIgOiAicmIiKTsKKyAgICBpZiAoZ3otPmZpbGUgPT0gTlVMTCkgeworICAgICAgICBnei0+d3JpdGUgPyBkZWZsYXRlRW5kKCYoZ3otPnN0cm0pKSA6IGluZmxhdGVFbmQoJihnei0+c3RybSkpOworICAgICAgICBmcmVlKGd6KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGd6LT5lcnIgPSAwOworICAgIGd6LT5tc2cgPSAiIjsKKyAgICByZXR1cm4gZ3o7Cit9CisKK2ludCBnendyaXRlIE9GKChnekZpbGUsIGNvbnN0IHZvaWQgKiwgdW5zaWduZWQpKTsKKworaW50IGd6d3JpdGUoZ3osIGJ1ZiwgbGVuKQorICAgIGd6RmlsZSBnejsKKyAgICBjb25zdCB2b2lkICpidWY7CisgICAgdW5zaWduZWQgbGVuOworeworICAgIHpfc3RyZWFtICpzdHJtOworICAgIHVuc2lnbmVkIGNoYXIgb3V0W0JVRkxFTl07CisKKyAgICBpZiAoZ3ogPT0gTlVMTCB8fCAhZ3otPndyaXRlKQorICAgICAgICByZXR1cm4gMDsKKyAgICBzdHJtID0gJihnei0+c3RybSk7CisgICAgc3RybS0+bmV4dF9pbiA9ICh2b2lkICopYnVmOworICAgIHN0cm0tPmF2YWlsX2luID0gbGVuOworICAgIGRvIHsKKyAgICAgICAgc3RybS0+bmV4dF9vdXQgPSBvdXQ7CisgICAgICAgIHN0cm0tPmF2YWlsX291dCA9IEJVRkxFTjsKKyAgICAgICAgKHZvaWQpZGVmbGF0ZShzdHJtLCBaX05PX0ZMVVNIKTsKKyAgICAgICAgZndyaXRlKG91dCwgMSwgQlVGTEVOIC0gc3RybS0+YXZhaWxfb3V0LCBnei0+ZmlsZSk7CisgICAgfSB3aGlsZSAoc3RybS0+YXZhaWxfb3V0ID09IDApOworICAgIHJldHVybiBsZW47Cit9CisKK2ludCBnenJlYWQgT0YoKGd6RmlsZSwgdm9pZCAqLCB1bnNpZ25lZCkpOworCitpbnQgZ3pyZWFkKGd6LCBidWYsIGxlbikKKyAgICBnekZpbGUgZ3o7CisgICAgdm9pZCAqYnVmOworICAgIHVuc2lnbmVkIGxlbjsKK3sKKyAgICBpbnQgcmV0OworICAgIHVuc2lnbmVkIGdvdDsKKyAgICB1bnNpZ25lZCBjaGFyIGluWzFdOworICAgIHpfc3RyZWFtICpzdHJtOworCisgICAgaWYgKGd6ID09IE5VTEwgfHwgZ3otPndyaXRlKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoZ3otPmVycikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgc3RybSA9ICYoZ3otPnN0cm0pOworICAgIHN0cm0tPm5leHRfb3V0ID0gKHZvaWQgKilidWY7CisgICAgc3RybS0+YXZhaWxfb3V0ID0gbGVuOworICAgIGRvIHsKKyAgICAgICAgZ290ID0gZnJlYWQoaW4sIDEsIDEsIGd6LT5maWxlKTsKKyAgICAgICAgaWYgKGdvdCA9PSAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIHN0cm0tPm5leHRfaW4gPSBpbjsKKyAgICAgICAgc3RybS0+YXZhaWxfaW4gPSAxOworICAgICAgICByZXQgPSBpbmZsYXRlKHN0cm0sIFpfTk9fRkxVU0gpOworICAgICAgICBpZiAocmV0ID09IFpfREFUQV9FUlJPUikgeworICAgICAgICAgICAgZ3otPmVyciA9IFpfREFUQV9FUlJPUjsKKyAgICAgICAgICAgIGd6LT5tc2cgPSBzdHJtLT5tc2c7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBpZiAocmV0ID09IFpfU1RSRUFNX0VORCkKKyAgICAgICAgICAgIGluZmxhdGVSZXNldChzdHJtKTsKKyAgICB9IHdoaWxlIChzdHJtLT5hdmFpbF9vdXQpOworICAgIHJldHVybiBsZW4gLSBzdHJtLT5hdmFpbF9vdXQ7Cit9CisKK2ludCBnemNsb3NlIE9GKChnekZpbGUpKTsKKworaW50IGd6Y2xvc2UoZ3opCisgICAgZ3pGaWxlIGd6OworeworICAgIHpfc3RyZWFtICpzdHJtOworICAgIHVuc2lnbmVkIGNoYXIgb3V0W0JVRkxFTl07CisKKyAgICBpZiAoZ3ogPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworICAgIHN0cm0gPSAmKGd6LT5zdHJtKTsKKyAgICBpZiAoZ3otPndyaXRlKSB7CisgICAgICAgIHN0cm0tPm5leHRfaW4gPSBaX05VTEw7CisgICAgICAgIHN0cm0tPmF2YWlsX2luID0gMDsKKyAgICAgICAgZG8geworICAgICAgICAgICAgc3RybS0+bmV4dF9vdXQgPSBvdXQ7CisgICAgICAgICAgICBzdHJtLT5hdmFpbF9vdXQgPSBCVUZMRU47CisgICAgICAgICAgICAodm9pZClkZWZsYXRlKHN0cm0sIFpfRklOSVNIKTsKKyAgICAgICAgICAgIGZ3cml0ZShvdXQsIDEsIEJVRkxFTiAtIHN0cm0tPmF2YWlsX291dCwgZ3otPmZpbGUpOworICAgICAgICB9IHdoaWxlIChzdHJtLT5hdmFpbF9vdXQgPT0gMCk7CisgICAgICAgIGRlZmxhdGVFbmQoc3RybSk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgaW5mbGF0ZUVuZChzdHJtKTsKKyAgICBmY2xvc2UoZ3otPmZpbGUpOworICAgIGZyZWUoZ3opOworICAgIHJldHVybiBaX09LOworfQorCitjb25zdCBjaGFyICpnemVycm9yIE9GKChnekZpbGUsIGludCAqKSk7CisKK2NvbnN0IGNoYXIgKmd6ZXJyb3IoZ3osIGVycikKKyAgICBnekZpbGUgZ3o7CisgICAgaW50ICplcnI7Cit7CisgICAgKmVyciA9IGd6LT5lcnI7CisgICAgcmV0dXJuIGd6LT5tc2c7Cit9CisKKyNlbmRpZgorCitjaGFyICpwcm9nOworCit2b2lkIGVycm9yICAgICAgICAgICAgT0YoKGNvbnN0IGNoYXIgKm1zZykpOwordm9pZCBnel9jb21wcmVzcyAgICAgIE9GKChGSUxFICAgKmluLCBnekZpbGUgb3V0KSk7CisjaWZkZWYgVVNFX01NQVAKK2ludCAgZ3pfY29tcHJlc3NfbW1hcCBPRigoRklMRSAgICppbiwgZ3pGaWxlIG91dCkpOworI2VuZGlmCit2b2lkIGd6X3VuY29tcHJlc3MgICAgT0YoKGd6RmlsZSBpbiwgRklMRSAgICpvdXQpKTsKK3ZvaWQgZmlsZV9jb21wcmVzcyAgICBPRigoY2hhciAgKmZpbGUsIGNoYXIgKm1vZGUpKTsKK3ZvaWQgZmlsZV91bmNvbXByZXNzICBPRigoY2hhciAgKmZpbGUpKTsKK2ludCAgbWFpbiAgICAgICAgICAgICBPRigoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkpOworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIERpc3BsYXkgZXJyb3IgbWVzc2FnZSBhbmQgZXhpdAorICovCit2b2lkIGVycm9yKG1zZykKKyAgICBjb25zdCBjaGFyICptc2c7Cit7CisgICAgZnByaW50ZihzdGRlcnIsICIlczogJXNcbiIsIHByb2csIG1zZyk7CisgICAgZXhpdCgxKTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb21wcmVzcyBpbnB1dCB0byBvdXRwdXQgdGhlbiBjbG9zZSBib3RoIGZpbGVzLgorICovCisKK3ZvaWQgZ3pfY29tcHJlc3MoaW4sIG91dCkKKyAgICBGSUxFICAgKmluOworICAgIGd6RmlsZSBvdXQ7Cit7CisgICAgbG9jYWwgY2hhciBidWZbQlVGTEVOXTsKKyAgICBpbnQgbGVuOworICAgIGludCBlcnI7CisKKyNpZmRlZiBVU0VfTU1BUAorICAgIC8qIFRyeSBmaXJzdCBjb21wcmVzc2luZyB3aXRoIG1tYXAuIElmIG1tYXAgZmFpbHMgKG1pbmlnemlwIHVzZWQgaW4gYQorICAgICAqIHBpcGUpLCB1c2UgdGhlIG5vcm1hbCBmcmVhZCBsb29wLgorICAgICAqLworICAgIGlmIChnel9jb21wcmVzc19tbWFwKGluLCBvdXQpID09IFpfT0spIHJldHVybjsKKyNlbmRpZgorICAgIGZvciAoOzspIHsKKyAgICAgICAgbGVuID0gKGludClmcmVhZChidWYsIDEsIHNpemVvZihidWYpLCBpbik7CisgICAgICAgIGlmIChmZXJyb3IoaW4pKSB7CisgICAgICAgICAgICBwZXJyb3IoImZyZWFkIik7CisgICAgICAgICAgICBleGl0KDEpOworICAgICAgICB9CisgICAgICAgIGlmIChsZW4gPT0gMCkgYnJlYWs7CisKKyAgICAgICAgaWYgKGd6d3JpdGUob3V0LCBidWYsICh1bnNpZ25lZClsZW4pICE9IGxlbikgZXJyb3IoZ3plcnJvcihvdXQsICZlcnIpKTsKKyAgICB9CisgICAgZmNsb3NlKGluKTsKKyAgICBpZiAoZ3pjbG9zZShvdXQpICE9IFpfT0spIGVycm9yKCJmYWlsZWQgZ3pjbG9zZSIpOworfQorCisjaWZkZWYgVVNFX01NQVAgLyogTU1BUCB2ZXJzaW9uLCBNaWd1ZWwgQWxicmVjaHQgPG1hbGJyZWNoQGVzby5vcmc+ICovCisKKy8qIFRyeSBjb21wcmVzc2luZyB0aGUgaW5wdXQgZmlsZSBhdCBvbmNlIHVzaW5nIG1tYXAuIFJldHVybiBaX09LIGlmCisgKiBpZiBzdWNjZXNzLCBaX0VSUk5PIG90aGVyd2lzZS4KKyAqLworaW50IGd6X2NvbXByZXNzX21tYXAoaW4sIG91dCkKKyAgICBGSUxFICAgKmluOworICAgIGd6RmlsZSBvdXQ7Cit7CisgICAgaW50IGxlbjsKKyAgICBpbnQgZXJyOworICAgIGludCBpZmQgPSBmaWxlbm8oaW4pOworICAgIGNhZGRyX3QgYnVmOyAgICAvKiBtbWFwJ2VkIGJ1ZmZlciBmb3IgdGhlIGVudGlyZSBpbnB1dCBmaWxlICovCisgICAgb2ZmX3QgYnVmX2xlbjsgIC8qIGxlbmd0aCBvZiB0aGUgaW5wdXQgZmlsZSAqLworICAgIHN0cnVjdCBzdGF0IHNiOworCisgICAgLyogRGV0ZXJtaW5lIHRoZSBzaXplIG9mIHRoZSBmaWxlLCBuZWVkZWQgZm9yIG1tYXA6ICovCisgICAgaWYgKGZzdGF0KGlmZCwgJnNiKSA8IDApIHJldHVybiBaX0VSUk5POworICAgIGJ1Zl9sZW4gPSBzYi5zdF9zaXplOworICAgIGlmIChidWZfbGVuIDw9IDApIHJldHVybiBaX0VSUk5POworCisgICAgLyogTm93IGRvIHRoZSBhY3R1YWwgbW1hcDogKi8KKyAgICBidWYgPSBtbWFwKChjYWRkcl90KSAwLCBidWZfbGVuLCBQUk9UX1JFQUQsIE1BUF9TSEFSRUQsIGlmZCwgKG9mZl90KTApOworICAgIGlmIChidWYgPT0gKGNhZGRyX3QpKC0xKSkgcmV0dXJuIFpfRVJSTk87CisKKyAgICAvKiBDb21wcmVzcyB0aGUgd2hvbGUgZmlsZSBhdCBvbmNlOiAqLworICAgIGxlbiA9IGd6d3JpdGUob3V0LCAoY2hhciAqKWJ1ZiwgKHVuc2lnbmVkKWJ1Zl9sZW4pOworCisgICAgaWYgKGxlbiAhPSAoaW50KWJ1Zl9sZW4pIGVycm9yKGd6ZXJyb3Iob3V0LCAmZXJyKSk7CisKKyAgICBtdW5tYXAoYnVmLCBidWZfbGVuKTsKKyAgICBmY2xvc2UoaW4pOworICAgIGlmIChnemNsb3NlKG91dCkgIT0gWl9PSykgZXJyb3IoImZhaWxlZCBnemNsb3NlIik7CisgICAgcmV0dXJuIFpfT0s7Cit9CisjZW5kaWYgLyogVVNFX01NQVAgKi8KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBVbmNvbXByZXNzIGlucHV0IHRvIG91dHB1dCB0aGVuIGNsb3NlIGJvdGggZmlsZXMuCisgKi8KK3ZvaWQgZ3pfdW5jb21wcmVzcyhpbiwgb3V0KQorICAgIGd6RmlsZSBpbjsKKyAgICBGSUxFICAgKm91dDsKK3sKKyAgICBsb2NhbCBjaGFyIGJ1ZltCVUZMRU5dOworICAgIGludCBsZW47CisgICAgaW50IGVycjsKKworICAgIGZvciAoOzspIHsKKyAgICAgICAgbGVuID0gZ3pyZWFkKGluLCBidWYsIHNpemVvZihidWYpKTsKKyAgICAgICAgaWYgKGxlbiA8IDApIGVycm9yIChnemVycm9yKGluLCAmZXJyKSk7CisgICAgICAgIGlmIChsZW4gPT0gMCkgYnJlYWs7CisKKyAgICAgICAgaWYgKChpbnQpZndyaXRlKGJ1ZiwgMSwgKHVuc2lnbmVkKWxlbiwgb3V0KSAhPSBsZW4pIHsKKyAgICAgICAgICAgIGVycm9yKCJmYWlsZWQgZndyaXRlIik7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGZjbG9zZShvdXQpKSBlcnJvcigiZmFpbGVkIGZjbG9zZSIpOworCisgICAgaWYgKGd6Y2xvc2UoaW4pICE9IFpfT0spIGVycm9yKCJmYWlsZWQgZ3pjbG9zZSIpOworfQorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29tcHJlc3MgdGhlIGdpdmVuIGZpbGU6IGNyZWF0ZSBhIGNvcnJlc3BvbmRpbmcgLmd6IGZpbGUgYW5kIHJlbW92ZSB0aGUKKyAqIG9yaWdpbmFsLgorICovCit2b2lkIGZpbGVfY29tcHJlc3MoZmlsZSwgbW9kZSkKKyAgICBjaGFyICAqZmlsZTsKKyAgICBjaGFyICAqbW9kZTsKK3sKKyAgICBsb2NhbCBjaGFyIG91dGZpbGVbTUFYX05BTUVfTEVOXTsKKyAgICBGSUxFICAqaW47CisgICAgZ3pGaWxlIG91dDsKKworICAgIGlmIChzdHJsZW4oZmlsZSkgKyBzdHJsZW4oR1pfU1VGRklYKSA+PSBzaXplb2Yob3V0ZmlsZSkpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczogZmlsZW5hbWUgdG9vIGxvbmdcbiIsIHByb2cpOworICAgICAgICBleGl0KDEpOworICAgIH0KKworICAgIHN0cmNweShvdXRmaWxlLCBmaWxlKTsKKyAgICBzdHJjYXQob3V0ZmlsZSwgR1pfU1VGRklYKTsKKworICAgIGluID0gZm9wZW4oZmlsZSwgInJiIik7CisgICAgaWYgKGluID09IE5VTEwpIHsKKyAgICAgICAgcGVycm9yKGZpbGUpOworICAgICAgICBleGl0KDEpOworICAgIH0KKyAgICBvdXQgPSBnem9wZW4ob3V0ZmlsZSwgbW9kZSk7CisgICAgaWYgKG91dCA9PSBOVUxMKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IGNhbid0IGd6b3BlbiAlc1xuIiwgcHJvZywgb3V0ZmlsZSk7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorICAgIGd6X2NvbXByZXNzKGluLCBvdXQpOworCisgICAgdW5saW5rKGZpbGUpOworfQorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogVW5jb21wcmVzcyB0aGUgZ2l2ZW4gZmlsZSBhbmQgcmVtb3ZlIHRoZSBvcmlnaW5hbC4KKyAqLwordm9pZCBmaWxlX3VuY29tcHJlc3MoZmlsZSkKKyAgICBjaGFyICAqZmlsZTsKK3sKKyAgICBsb2NhbCBjaGFyIGJ1ZltNQVhfTkFNRV9MRU5dOworICAgIGNoYXIgKmluZmlsZSwgKm91dGZpbGU7CisgICAgRklMRSAgKm91dDsKKyAgICBnekZpbGUgaW47CisgICAgc2l6ZV90IGxlbiA9IHN0cmxlbihmaWxlKTsKKworICAgIGlmIChsZW4gKyBzdHJsZW4oR1pfU1VGRklYKSA+PSBzaXplb2YoYnVmKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBmaWxlbmFtZSB0b28gbG9uZ1xuIiwgcHJvZyk7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorCisgICAgc3RyY3B5KGJ1ZiwgZmlsZSk7CisKKyAgICBpZiAobGVuID4gU1VGRklYX0xFTiAmJiBzdHJjbXAoZmlsZStsZW4tU1VGRklYX0xFTiwgR1pfU1VGRklYKSA9PSAwKSB7CisgICAgICAgIGluZmlsZSA9IGZpbGU7CisgICAgICAgIG91dGZpbGUgPSBidWY7CisgICAgICAgIG91dGZpbGVbbGVuLTNdID0gJ1wwJzsKKyAgICB9IGVsc2UgeworICAgICAgICBvdXRmaWxlID0gZmlsZTsKKyAgICAgICAgaW5maWxlID0gYnVmOworICAgICAgICBzdHJjYXQoaW5maWxlLCBHWl9TVUZGSVgpOworICAgIH0KKyAgICBpbiA9IGd6b3BlbihpbmZpbGUsICJyYiIpOworICAgIGlmIChpbiA9PSBOVUxMKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IGNhbid0IGd6b3BlbiAlc1xuIiwgcHJvZywgaW5maWxlKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisgICAgb3V0ID0gZm9wZW4ob3V0ZmlsZSwgIndiIik7CisgICAgaWYgKG91dCA9PSBOVUxMKSB7CisgICAgICAgIHBlcnJvcihmaWxlKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisKKyAgICBnel91bmNvbXByZXNzKGluLCBvdXQpOworCisgICAgdW5saW5rKGluZmlsZSk7Cit9CisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBVc2FnZTogIG1pbmlnemlwIFstY10gWy1kXSBbLWZdIFstaF0gWy1yXSBbLTEgdG8gLTldIFtmaWxlcy4uLl0KKyAqICAgLWMgOiB3cml0ZSB0byBzdGFuZGFyZCBvdXRwdXQKKyAqICAgLWQgOiBkZWNvbXByZXNzCisgKiAgIC1mIDogY29tcHJlc3Mgd2l0aCBaX0ZJTFRFUkVECisgKiAgIC1oIDogY29tcHJlc3Mgd2l0aCBaX0hVRkZNQU5fT05MWQorICogICAtciA6IGNvbXByZXNzIHdpdGggWl9STEUKKyAqICAgLTEgdG8gLTkgOiBjb21wcmVzc2lvbiBsZXZlbAorICovCisKK2ludCBtYWluKGFyZ2MsIGFyZ3YpCisgICAgaW50IGFyZ2M7CisgICAgY2hhciAqYXJndltdOworeworICAgIGludCBjb3B5b3V0ID0gMDsKKyAgICBpbnQgdW5jb21wciA9IDA7CisgICAgZ3pGaWxlIGZpbGU7CisgICAgY2hhciAqYm5hbWUsIG91dG1vZGVbMjBdOworCisgICAgc3RyY3B5KG91dG1vZGUsICJ3YjYgIik7CisKKyAgICBwcm9nID0gYXJndlswXTsKKyAgICBibmFtZSA9IHN0cnJjaHIoYXJndlswXSwgJy8nKTsKKyAgICBpZiAoYm5hbWUpCisgICAgICBibmFtZSsrOworICAgIGVsc2UKKyAgICAgIGJuYW1lID0gYXJndlswXTsKKyAgICBhcmdjLS0sIGFyZ3YrKzsKKworICAgIGlmICghc3RyY21wKGJuYW1lLCAiZ3VuemlwIikpCisgICAgICB1bmNvbXByID0gMTsKKyAgICBlbHNlIGlmICghc3RyY21wKGJuYW1lLCAiemNhdCIpKQorICAgICAgY29weW91dCA9IHVuY29tcHIgPSAxOworCisgICAgd2hpbGUgKGFyZ2MgPiAwKSB7CisgICAgICBpZiAoc3RyY21wKCphcmd2LCAiLWMiKSA9PSAwKQorICAgICAgICBjb3B5b3V0ID0gMTsKKyAgICAgIGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIi1kIikgPT0gMCkKKyAgICAgICAgdW5jb21wciA9IDE7CisgICAgICBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICItZiIpID09IDApCisgICAgICAgIG91dG1vZGVbM10gPSAnZic7CisgICAgICBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICItaCIpID09IDApCisgICAgICAgIG91dG1vZGVbM10gPSAnaCc7CisgICAgICBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICItciIpID09IDApCisgICAgICAgIG91dG1vZGVbM10gPSAnUic7CisgICAgICBlbHNlIGlmICgoKmFyZ3YpWzBdID09ICctJyAmJiAoKmFyZ3YpWzFdID49ICcxJyAmJiAoKmFyZ3YpWzFdIDw9ICc5JyAmJgorICAgICAgICAgICAgICAgKCphcmd2KVsyXSA9PSAwKQorICAgICAgICBvdXRtb2RlWzJdID0gKCphcmd2KVsxXTsKKyAgICAgIGVsc2UKKyAgICAgICAgYnJlYWs7CisgICAgICBhcmdjLS0sIGFyZ3YrKzsKKyAgICB9CisgICAgaWYgKG91dG1vZGVbM10gPT0gJyAnKQorICAgICAgICBvdXRtb2RlWzNdID0gMDsKKyAgICBpZiAoYXJnYyA9PSAwKSB7CisgICAgICAgIFNFVF9CSU5BUllfTU9ERShzdGRpbik7CisgICAgICAgIFNFVF9CSU5BUllfTU9ERShzdGRvdXQpOworICAgICAgICBpZiAodW5jb21wcikgeworICAgICAgICAgICAgZmlsZSA9IGd6ZG9wZW4oZmlsZW5vKHN0ZGluKSwgInJiIik7CisgICAgICAgICAgICBpZiAoZmlsZSA9PSBOVUxMKSBlcnJvcigiY2FuJ3QgZ3pkb3BlbiBzdGRpbiIpOworICAgICAgICAgICAgZ3pfdW5jb21wcmVzcyhmaWxlLCBzdGRvdXQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZmlsZSA9IGd6ZG9wZW4oZmlsZW5vKHN0ZG91dCksIG91dG1vZGUpOworICAgICAgICAgICAgaWYgKGZpbGUgPT0gTlVMTCkgZXJyb3IoImNhbid0IGd6ZG9wZW4gc3Rkb3V0Iik7CisgICAgICAgICAgICBnel9jb21wcmVzcyhzdGRpbiwgZmlsZSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoY29weW91dCkgeworICAgICAgICAgICAgU0VUX0JJTkFSWV9NT0RFKHN0ZG91dCk7CisgICAgICAgIH0KKyAgICAgICAgZG8geworICAgICAgICAgICAgaWYgKHVuY29tcHIpIHsKKyAgICAgICAgICAgICAgICBpZiAoY29weW91dCkgeworICAgICAgICAgICAgICAgICAgICBmaWxlID0gZ3pvcGVuKCphcmd2LCAicmIiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGUgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IGNhbid0IGd6b3BlbiAlc1xuIiwgcHJvZywgKmFyZ3YpOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBnel91bmNvbXByZXNzKGZpbGUsIHN0ZG91dCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZmlsZV91bmNvbXByZXNzKCphcmd2KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChjb3B5b3V0KSB7CisgICAgICAgICAgICAgICAgICAgIEZJTEUgKiBpbiA9IGZvcGVuKCphcmd2LCAicmIiKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoaW4gPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcGVycm9yKCphcmd2KTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUgPSBnemRvcGVuKGZpbGVubyhzdGRvdXQpLCBvdXRtb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWxlID09IE5VTEwpIGVycm9yKCJjYW4ndCBnemRvcGVuIHN0ZG91dCIpOworCisgICAgICAgICAgICAgICAgICAgICAgICBnel9jb21wcmVzcyhpbiwgZmlsZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGZpbGVfY29tcHJlc3MoKmFyZ3YsIG91dG1vZGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSB3aGlsZSAoYXJndisrLCAtLWFyZ2MpOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3psaWItMS4yLjYvdHJlZWJ1aWxkLnhtbCBiL3psaWItMS4yLjYvdHJlZWJ1aWxkLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTk2M2EwCi0tLSAvZGV2L251bGwKKysrIGIvemxpYi0xLjIuNi90cmVlYnVpbGQueG1sCkBAIC0wLDAgKzEsMTE2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiID8+Cis8cGFja2FnZSBuYW1lPSJ6bGliIiB2ZXJzaW9uPSIxLjIuNiI+CisgICAgPGxpYnJhcnkgbmFtZT0iemxpYiIgZGx2ZXJzaW9uPSIxLjIuNiIgZGxuYW1lPSJ6Ij4KKwk8cHJvcGVydHkgbmFtZT0iZGVzY3JpcHRpb24iPiB6aXAgY29tcHJlc3Npb24gbGlicmFyeSA8L3Byb3BlcnR5PgorCTxwcm9wZXJ0eSBuYW1lPSJpbmNsdWRlLXRhcmdldC1kaXIiIHZhbHVlPSIkKEBQQUNLQUdFL2luc3RhbGwtaW5jbHVkZWRpcikiIC8+CisKKwk8IS0tIGZpeG1lOiBub3QgaW1wbGVtZW50ZWQgeWV0IC0tPgorCTxwcm9wZXJ0eSBuYW1lPSJjb21waWxlci9jL2lubGluZSIgdmFsdWU9InllcyIgLz4KKworCTxpbmNsdWRlLWZpbGUgbmFtZT0iemxpYi5oIiBzY29wZT0icHVibGljIiBtb2RlPSI2NDQiIC8+CisJPGluY2x1ZGUtZmlsZSBuYW1lPSJ6Y29uZi5oIiBzY29wZT0icHVibGljIiBtb2RlPSI2NDQiIC8+CisKKwk8c291cmNlIG5hbWU9ImFkbGVyMzIuYyI+CisJICAgIDxkZXBlbmQgbmFtZT0iemxpYi5oIiAvPgorCSAgICA8ZGVwZW5kIG5hbWU9Inpjb25mLmgiIC8+CisJPC9zb3VyY2U+CisJPHNvdXJjZSBuYW1lPSJjb21wcmVzcy5jIj4KKwkgICAgPGRlcGVuZCBuYW1lPSJ6bGliLmgiIC8+CisJICAgIDxkZXBlbmQgbmFtZT0iemNvbmYuaCIgLz4KKwk8L3NvdXJjZT4KKwk8c291cmNlIG5hbWU9ImNyYzMyLmMiPgorCSAgICA8ZGVwZW5kIG5hbWU9InpsaWIuaCIgLz4KKwkgICAgPGRlcGVuZCBuYW1lPSJ6Y29uZi5oIiAvPgorCSAgICA8ZGVwZW5kIG5hbWU9ImNyYzMyLmgiIC8+CisJPC9zb3VyY2U+CisJPHNvdXJjZSBuYW1lPSJnemNsb3NlLmMiPgorCSAgICA8ZGVwZW5kIG5hbWU9InpsaWIuaCIgLz4KKwkgICAgPGRlcGVuZCBuYW1lPSJ6Y29uZi5oIiAvPgorCSAgICA8ZGVwZW5kIG5hbWU9Imd6Z3V0cy5oIiAvPgorCTwvc291cmNlPgorCTxzb3VyY2UgbmFtZT0iZ3psaWIuYyI+CisJICAgIDxkZXBlbmQgbmFtZT0iemxpYi5oIiAvPgorCSAgICA8ZGVwZW5kIG5hbWU9Inpjb25mLmgiIC8+CisJICAgIDxkZXBlbmQgbmFtZT0iZ3pndXRzLmgiIC8+CisJPC9zb3VyY2U+CisJPHNvdXJjZSBuYW1lPSJnenJlYWQuYyI+CisJICAgIDxkZXBlbmQgbmFtZT0iemxpYi5oIiAvPgorCSAgICA8ZGVwZW5kIG5hbWU9Inpjb25mLmgiIC8+CisJICAgIDxkZXBlbmQgbmFtZT0iZ3pndXRzLmgiIC8+CisJPC9zb3VyY2U+CisJPHNvdXJjZSBuYW1lPSJnendyaXRlLmMiPgorCSAgICA8ZGVwZW5kIG5hbWU9InpsaWIuaCIgLz4KKwkgICAgPGRlcGVuZCBuYW1lPSJ6Y29uZi5oIiAvPgorCSAgICA8ZGVwZW5kIG5hbWU9Imd6Z3V0cy5oIiAvPgorCTwvc291cmNlPgorCTxzb3VyY2UgbmFtZT0idW5jb21wci5jIj4KKwkgICAgPGRlcGVuZCBuYW1lPSJ6bGliLmgiIC8+CisJICAgIDxkZXBlbmQgbmFtZT0iemNvbmYuaCIgLz4KKwk8L3NvdXJjZT4KKwk8c291cmNlIG5hbWU9ImRlZmxhdGUuYyI+CisJICAgIDxkZXBlbmQgbmFtZT0iemxpYi5oIiAvPgorCSAgICA8ZGVwZW5kIG5hbWU9Inpjb25mLmgiIC8+CisJICAgIDxkZXBlbmQgbmFtZT0ienV0aWwuaCIgLz4KKwkgICAgPGRlcGVuZCBuYW1lPSJkZWZsYXRlLmgiIC8+CisJPC9zb3VyY2U+CisJPHNvdXJjZSBuYW1lPSJ0cmVlcy5jIj4KKwkgICAgPGRlcGVuZCBuYW1lPSJ6bGliLmgiIC8+CisJICAgIDxkZXBlbmQgbmFtZT0iemNvbmYuaCIgLz4KKwkgICAgPGRlcGVuZCBuYW1lPSJ6dXRpbC5oIiAvPgorCSAgICA8ZGVwZW5kIG5hbWU9ImRlZmxhdGUuaCIgLz4KKwkgICAgPGRlcGVuZCBuYW1lPSJ0cmVlcy5oIiAvPgorCTwvc291cmNlPgorCTxzb3VyY2UgbmFtZT0ienV0aWwuYyI+CisJICAgIDxkZXBlbmQgbmFtZT0iemxpYi5oIiAvPgorCSAgICA8ZGVwZW5kIG5hbWU9Inpjb25mLmgiIC8+CisJICAgIDxkZXBlbmQgbmFtZT0ienV0aWwuaCIgLz4KKwk8L3NvdXJjZT4KKwk8c291cmNlIG5hbWU9ImluZmxhdGUuYyI+CisJICAgIDxkZXBlbmQgbmFtZT0iemxpYi5oIiAvPgorCSAgICA8ZGVwZW5kIG5hbWU9Inpjb25mLmgiIC8+CisJICAgIDxkZXBlbmQgbmFtZT0ienV0aWwuaCIgLz4KKwkgICAgPGRlcGVuZCBuYW1lPSJpbmZ0cmVlcy5oIiAvPgorCSAgICA8ZGVwZW5kIG5hbWU9ImluZmxhdGUuaCIgLz4KKwkgICAgPGRlcGVuZCBuYW1lPSJpbmZmYXN0LmgiIC8+CisJPC9zb3VyY2U+CisJPHNvdXJjZSBuYW1lPSJpbmZiYWNrLmMiPgorCSAgICA8ZGVwZW5kIG5hbWU9InpsaWIuaCIgLz4KKwkgICAgPGRlcGVuZCBuYW1lPSJ6Y29uZi5oIiAvPgorCSAgICA8ZGVwZW5kIG5hbWU9Inp1dGlsLmgiIC8+CisJICAgIDxkZXBlbmQgbmFtZT0iaW5mdHJlZXMuaCIgLz4KKwkgICAgPGRlcGVuZCBuYW1lPSJpbmZsYXRlLmgiIC8+CisJICAgIDxkZXBlbmQgbmFtZT0iaW5mZmFzdC5oIiAvPgorCTwvc291cmNlPgorCTxzb3VyY2UgbmFtZT0iaW5mdHJlZXMuYyI+CisJICAgIDxkZXBlbmQgbmFtZT0iemxpYi5oIiAvPgorCSAgICA8ZGVwZW5kIG5hbWU9Inpjb25mLmgiIC8+CisJICAgIDxkZXBlbmQgbmFtZT0ienV0aWwuaCIgLz4KKwkgICAgPGRlcGVuZCBuYW1lPSJpbmZ0cmVlcy5oIiAvPgorCTwvc291cmNlPgorCTxzb3VyY2UgbmFtZT0iaW5mZmFzdC5jIj4KKwkgICAgPGRlcGVuZCBuYW1lPSJ6bGliLmgiIC8+CisJICAgIDxkZXBlbmQgbmFtZT0iemNvbmYuaCIgLz4KKwkgICAgPGRlcGVuZCBuYW1lPSJ6dXRpbC5oIiAvPgorCSAgICA8ZGVwZW5kIG5hbWU9ImluZnRyZWVzLmgiIC8+CisJICAgIDxkZXBlbmQgbmFtZT0iaW5mbGF0ZS5oIiAvPgorCSAgICA8ZGVwZW5kIG5hbWU9ImluZmZhc3QuaCIgLz4KKwk8L3NvdXJjZT4KKyAgICA8L2xpYnJhcnk+Cis8L3BhY2thZ2U+CisKKzwhLS0KK0NGTEFHUz0tTworI0NGTEFHUz0tTyAtRE1BWF9XQklUUz0xNCAtRE1BWF9NRU1fTEVWRUw9NworI0NGTEFHUz0tZyAtRERFQlVHCisjQ0ZMQUdTPS1PMyAtV2FsbCAtV3dyaXRlLXN0cmluZ3MgLVdwb2ludGVyLWFyaXRoIC1XY29udmVyc2lvbiBcCisjICAgICAgICAgICAtV3N0cmljdC1wcm90b3R5cGVzIC1XbWlzc2luZy1wcm90b3R5cGVzCisKKyMgT0JKQSA9CisjIHRvIHVzZSB0aGUgYXNtIGNvZGU6IG1ha2UgT0JKQT1tYXRjaC5vCisjCittYXRjaC5vOiBtYXRjaC5TCisJJChDUFApIG1hdGNoLlMgPiBfbWF0Y2gucworCSQoQ0MpIC1jIF9tYXRjaC5zCisJbXYgX21hdGNoLm8gbWF0Y2gubworCXJtIC1mIF9tYXRjaC5zCistLT4KZGlmZiAtLWdpdCBhL3psaWItMS4yLjYvdHJlZXMuYyBiL3psaWItMS4yLjYvdHJlZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzMyYjIxCi0tLSAvZGV2L251bGwKKysrIGIvemxpYi0xLjIuNi90cmVlcy5jCkBAIC0wLDAgKzEsMTIyNCBAQAorLyogdHJlZXMuYyAtLSBvdXRwdXQgZGVmbGF0ZWQgZGF0YSB1c2luZyBIdWZmbWFuIGNvZGluZworICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMTIgSmVhbi1sb3VwIEdhaWxseQorICogZGV0ZWN0X2RhdGFfdHlwZSgpIGZ1bmN0aW9uIHByb3ZpZGVkIGZyZWVseSBieSBDb3NtaW4gVHJ1dGEsIDIwMDYKKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKKyAqLworCisvKgorICogIEFMR09SSVRITQorICoKKyAqICAgICAgVGhlICJkZWZsYXRpb24iIHByb2Nlc3MgdXNlcyBzZXZlcmFsIEh1ZmZtYW4gdHJlZXMuIFRoZSBtb3JlCisgKiAgICAgIGNvbW1vbiBzb3VyY2UgdmFsdWVzIGFyZSByZXByZXNlbnRlZCBieSBzaG9ydGVyIGJpdCBzZXF1ZW5jZXMuCisgKgorICogICAgICBFYWNoIGNvZGUgdHJlZSBpcyBzdG9yZWQgaW4gYSBjb21wcmVzc2VkIGZvcm0gd2hpY2ggaXMgaXRzZWxmCisgKiBhIEh1ZmZtYW4gZW5jb2Rpbmcgb2YgdGhlIGxlbmd0aHMgb2YgYWxsIHRoZSBjb2RlIHN0cmluZ3MgKGluCisgKiBhc2NlbmRpbmcgb3JkZXIgYnkgc291cmNlIHZhbHVlcykuICBUaGUgYWN0dWFsIGNvZGUgc3RyaW5ncyBhcmUKKyAqIHJlY29uc3RydWN0ZWQgZnJvbSB0aGUgbGVuZ3RocyBpbiB0aGUgaW5mbGF0ZSBwcm9jZXNzLCBhcyBkZXNjcmliZWQKKyAqIGluIHRoZSBkZWZsYXRlIHNwZWNpZmljYXRpb24uCisgKgorICogIFJFRkVSRU5DRVMKKyAqCisgKiAgICAgIERldXRzY2gsIEwuUC4sIidEZWZsYXRlJyBDb21wcmVzc2VkIERhdGEgRm9ybWF0IFNwZWNpZmljYXRpb24iLgorICogICAgICBBdmFpbGFibGUgaW4gZnRwLnV1Lm5ldDovcHViL2FyY2hpdmluZy96aXAvZG9jL2RlZmxhdGUtMS4xLmRvYworICoKKyAqICAgICAgU3RvcmVyLCBKYW1lcyBBLgorICogICAgICAgICAgRGF0YSBDb21wcmVzc2lvbjogIE1ldGhvZHMgYW5kIFRoZW9yeSwgcHAuIDQ5LTUwLgorICogICAgICAgICAgQ29tcHV0ZXIgU2NpZW5jZSBQcmVzcywgMTk4OC4gIElTQk4gMC03MTY3LTgxNTYtNS4KKyAqCisgKiAgICAgIFNlZGdld2ljaywgUi4KKyAqICAgICAgICAgIEFsZ29yaXRobXMsIHAyOTAuCisgKiAgICAgICAgICBBZGRpc29uLVdlc2xleSwgMTk4My4gSVNCTiAwLTIwMS0wNjY3Mi02LgorICovCisKKy8qIEAoIykgJElkJCAqLworCisvKiAjZGVmaW5lIEdFTl9UUkVFU19IICovCisKKyNpbmNsdWRlICJkZWZsYXRlLmgiCisKKyNpZmRlZiBERUJVRworIyAgaW5jbHVkZSA8Y3R5cGUuaD4KKyNlbmRpZgorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvbnN0YW50cworICovCisKKyNkZWZpbmUgTUFYX0JMX0JJVFMgNworLyogQml0IGxlbmd0aCBjb2RlcyBtdXN0IG5vdCBleGNlZWQgTUFYX0JMX0JJVFMgYml0cyAqLworCisjZGVmaW5lIEVORF9CTE9DSyAyNTYKKy8qIGVuZCBvZiBibG9jayBsaXRlcmFsIGNvZGUgKi8KKworI2RlZmluZSBSRVBfM182ICAgICAgMTYKKy8qIHJlcGVhdCBwcmV2aW91cyBiaXQgbGVuZ3RoIDMtNiB0aW1lcyAoMiBiaXRzIG9mIHJlcGVhdCBjb3VudCkgKi8KKworI2RlZmluZSBSRVBaXzNfMTAgICAgMTcKKy8qIHJlcGVhdCBhIHplcm8gbGVuZ3RoIDMtMTAgdGltZXMgICgzIGJpdHMgb2YgcmVwZWF0IGNvdW50KSAqLworCisjZGVmaW5lIFJFUFpfMTFfMTM4ICAxOAorLyogcmVwZWF0IGEgemVybyBsZW5ndGggMTEtMTM4IHRpbWVzICAoNyBiaXRzIG9mIHJlcGVhdCBjb3VudCkgKi8KKworbG9jYWwgY29uc3QgaW50IGV4dHJhX2xiaXRzW0xFTkdUSF9DT0RFU10gLyogZXh0cmEgYml0cyBmb3IgZWFjaCBsZW5ndGggY29kZSAqLworICAgPSB7MCwwLDAsMCwwLDAsMCwwLDEsMSwxLDEsMiwyLDIsMiwzLDMsMywzLDQsNCw0LDQsNSw1LDUsNSwwfTsKKworbG9jYWwgY29uc3QgaW50IGV4dHJhX2RiaXRzW0RfQ09ERVNdIC8qIGV4dHJhIGJpdHMgZm9yIGVhY2ggZGlzdGFuY2UgY29kZSAqLworICAgPSB7MCwwLDAsMCwxLDEsMiwyLDMsMyw0LDQsNSw1LDYsNiw3LDcsOCw4LDksOSwxMCwxMCwxMSwxMSwxMiwxMiwxMywxM307CisKK2xvY2FsIGNvbnN0IGludCBleHRyYV9ibGJpdHNbQkxfQ09ERVNdLyogZXh0cmEgYml0cyBmb3IgZWFjaCBiaXQgbGVuZ3RoIGNvZGUgKi8KKyAgID0gezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMiwzLDd9OworCitsb2NhbCBjb25zdCB1Y2ggYmxfb3JkZXJbQkxfQ09ERVNdCisgICA9IHsxNiwxNywxOCwwLDgsNyw5LDYsMTAsNSwxMSw0LDEyLDMsMTMsMiwxNCwxLDE1fTsKKy8qIFRoZSBsZW5ndGhzIG9mIHRoZSBiaXQgbGVuZ3RoIGNvZGVzIGFyZSBzZW50IGluIG9yZGVyIG9mIGRlY3JlYXNpbmcKKyAqIHByb2JhYmlsaXR5LCB0byBhdm9pZCB0cmFuc21pdHRpbmcgdGhlIGxlbmd0aHMgZm9yIHVudXNlZCBiaXQgbGVuZ3RoIGNvZGVzLgorICovCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTG9jYWwgZGF0YS4gVGhlc2UgYXJlIGluaXRpYWxpemVkIG9ubHkgb25jZS4KKyAqLworCisjZGVmaW5lIERJU1RfQ09ERV9MRU4gIDUxMiAvKiBzZWUgZGVmaW5pdGlvbiBvZiBhcnJheSBkaXN0X2NvZGUgYmVsb3cgKi8KKworI2lmIGRlZmluZWQoR0VOX1RSRUVTX0gpIHx8ICFkZWZpbmVkKFNUREMpCisvKiBub24gQU5TSSBjb21waWxlcnMgbWF5IG5vdCBhY2NlcHQgdHJlZXMuaCAqLworCitsb2NhbCBjdF9kYXRhIHN0YXRpY19sdHJlZVtMX0NPREVTKzJdOworLyogVGhlIHN0YXRpYyBsaXRlcmFsIHRyZWUuIFNpbmNlIHRoZSBiaXQgbGVuZ3RocyBhcmUgaW1wb3NlZCwgdGhlcmUgaXMgbm8KKyAqIG5lZWQgZm9yIHRoZSBMX0NPREVTIGV4dHJhIGNvZGVzIHVzZWQgZHVyaW5nIGhlYXAgY29uc3RydWN0aW9uLiBIb3dldmVyCisgKiBUaGUgY29kZXMgMjg2IGFuZCAyODcgYXJlIG5lZWRlZCB0byBidWlsZCBhIGNhbm9uaWNhbCB0cmVlIChzZWUgX3RyX2luaXQKKyAqIGJlbG93KS4KKyAqLworCitsb2NhbCBjdF9kYXRhIHN0YXRpY19kdHJlZVtEX0NPREVTXTsKKy8qIFRoZSBzdGF0aWMgZGlzdGFuY2UgdHJlZS4gKEFjdHVhbGx5IGEgdHJpdmlhbCB0cmVlIHNpbmNlIGFsbCBjb2RlcyB1c2UKKyAqIDUgYml0cy4pCisgKi8KKwordWNoIF9kaXN0X2NvZGVbRElTVF9DT0RFX0xFTl07CisvKiBEaXN0YW5jZSBjb2Rlcy4gVGhlIGZpcnN0IDI1NiB2YWx1ZXMgY29ycmVzcG9uZCB0byB0aGUgZGlzdGFuY2VzCisgKiAzIC4uIDI1OCwgdGhlIGxhc3QgMjU2IHZhbHVlcyBjb3JyZXNwb25kIHRvIHRoZSB0b3AgOCBiaXRzIG9mCisgKiB0aGUgMTUgYml0IGRpc3RhbmNlcy4KKyAqLworCit1Y2ggX2xlbmd0aF9jb2RlW01BWF9NQVRDSC1NSU5fTUFUQ0grMV07CisvKiBsZW5ndGggY29kZSBmb3IgZWFjaCBub3JtYWxpemVkIG1hdGNoIGxlbmd0aCAoMCA9PSBNSU5fTUFUQ0gpICovCisKK2xvY2FsIGludCBiYXNlX2xlbmd0aFtMRU5HVEhfQ09ERVNdOworLyogRmlyc3Qgbm9ybWFsaXplZCBsZW5ndGggZm9yIGVhY2ggY29kZSAoMCA9IE1JTl9NQVRDSCkgKi8KKworbG9jYWwgaW50IGJhc2VfZGlzdFtEX0NPREVTXTsKKy8qIEZpcnN0IG5vcm1hbGl6ZWQgZGlzdGFuY2UgZm9yIGVhY2ggY29kZSAoMCA9IGRpc3RhbmNlIG9mIDEpICovCisKKyNlbHNlCisjICBpbmNsdWRlICJ0cmVlcy5oIgorI2VuZGlmIC8qIEdFTl9UUkVFU19IICovCisKK3N0cnVjdCBzdGF0aWNfdHJlZV9kZXNjX3MgeworICAgIGNvbnN0IGN0X2RhdGEgKnN0YXRpY190cmVlOyAgLyogc3RhdGljIHRyZWUgb3IgTlVMTCAqLworICAgIGNvbnN0IGludGYgKmV4dHJhX2JpdHM7ICAgICAgLyogZXh0cmEgYml0cyBmb3IgZWFjaCBjb2RlIG9yIE5VTEwgKi8KKyAgICBpbnQgICAgIGV4dHJhX2Jhc2U7ICAgICAgICAgIC8qIGJhc2UgaW5kZXggZm9yIGV4dHJhX2JpdHMgKi8KKyAgICBpbnQgICAgIGVsZW1zOyAgICAgICAgICAgICAgIC8qIG1heCBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHRyZWUgKi8KKyAgICBpbnQgICAgIG1heF9sZW5ndGg7ICAgICAgICAgIC8qIG1heCBiaXQgbGVuZ3RoIGZvciB0aGUgY29kZXMgKi8KK307CisKK2xvY2FsIHN0YXRpY190cmVlX2Rlc2MgIHN0YXRpY19sX2Rlc2MgPQore3N0YXRpY19sdHJlZSwgZXh0cmFfbGJpdHMsIExJVEVSQUxTKzEsIExfQ09ERVMsIE1BWF9CSVRTfTsKKworbG9jYWwgc3RhdGljX3RyZWVfZGVzYyAgc3RhdGljX2RfZGVzYyA9Cit7c3RhdGljX2R0cmVlLCBleHRyYV9kYml0cywgMCwgICAgICAgICAgRF9DT0RFUywgTUFYX0JJVFN9OworCitsb2NhbCBzdGF0aWNfdHJlZV9kZXNjICBzdGF0aWNfYmxfZGVzYyA9Cit7KGNvbnN0IGN0X2RhdGEgKikwLCBleHRyYV9ibGJpdHMsIDAsICAgQkxfQ09ERVMsIE1BWF9CTF9CSVRTfTsKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMb2NhbCAoc3RhdGljKSByb3V0aW5lcyBpbiB0aGlzIGZpbGUuCisgKi8KKworbG9jYWwgdm9pZCB0cl9zdGF0aWNfaW5pdCBPRigodm9pZCkpOworbG9jYWwgdm9pZCBpbml0X2Jsb2NrICAgICBPRigoZGVmbGF0ZV9zdGF0ZSAqcykpOworbG9jYWwgdm9pZCBwcWRvd25oZWFwICAgICBPRigoZGVmbGF0ZV9zdGF0ZSAqcywgY3RfZGF0YSAqdHJlZSwgaW50IGspKTsKK2xvY2FsIHZvaWQgZ2VuX2JpdGxlbiAgICAgT0YoKGRlZmxhdGVfc3RhdGUgKnMsIHRyZWVfZGVzYyAqZGVzYykpOworbG9jYWwgdm9pZCBnZW5fY29kZXMgICAgICBPRigoY3RfZGF0YSAqdHJlZSwgaW50IG1heF9jb2RlLCB1c2hmICpibF9jb3VudCkpOworbG9jYWwgdm9pZCBidWlsZF90cmVlICAgICBPRigoZGVmbGF0ZV9zdGF0ZSAqcywgdHJlZV9kZXNjICpkZXNjKSk7Citsb2NhbCB2b2lkIHNjYW5fdHJlZSAgICAgIE9GKChkZWZsYXRlX3N0YXRlICpzLCBjdF9kYXRhICp0cmVlLCBpbnQgbWF4X2NvZGUpKTsKK2xvY2FsIHZvaWQgc2VuZF90cmVlICAgICAgT0YoKGRlZmxhdGVfc3RhdGUgKnMsIGN0X2RhdGEgKnRyZWUsIGludCBtYXhfY29kZSkpOworbG9jYWwgaW50ICBidWlsZF9ibF90cmVlICBPRigoZGVmbGF0ZV9zdGF0ZSAqcykpOworbG9jYWwgdm9pZCBzZW5kX2FsbF90cmVlcyBPRigoZGVmbGF0ZV9zdGF0ZSAqcywgaW50IGxjb2RlcywgaW50IGRjb2RlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGNvZGVzKSk7Citsb2NhbCB2b2lkIGNvbXByZXNzX2Jsb2NrIE9GKChkZWZsYXRlX3N0YXRlICpzLCBjdF9kYXRhICpsdHJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0X2RhdGEgKmR0cmVlKSk7Citsb2NhbCBpbnQgIGRldGVjdF9kYXRhX3R5cGUgT0YoKGRlZmxhdGVfc3RhdGUgKnMpKTsKK2xvY2FsIHVuc2lnbmVkIGJpX3JldmVyc2UgT0YoKHVuc2lnbmVkIHZhbHVlLCBpbnQgbGVuZ3RoKSk7Citsb2NhbCB2b2lkIGJpX3dpbmR1cCAgICAgIE9GKChkZWZsYXRlX3N0YXRlICpzKSk7Citsb2NhbCB2b2lkIGJpX2ZsdXNoICAgICAgIE9GKChkZWZsYXRlX3N0YXRlICpzKSk7Citsb2NhbCB2b2lkIGNvcHlfYmxvY2sgICAgIE9GKChkZWZsYXRlX3N0YXRlICpzLCBjaGFyZiAqYnVmLCB1bnNpZ25lZCBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVhZGVyKSk7CisKKyNpZmRlZiBHRU5fVFJFRVNfSAorbG9jYWwgdm9pZCBnZW5fdHJlZXNfaGVhZGVyIE9GKCh2b2lkKSk7CisjZW5kaWYKKworI2lmbmRlZiBERUJVRworIyAgZGVmaW5lIHNlbmRfY29kZShzLCBjLCB0cmVlKSBzZW5kX2JpdHMocywgdHJlZVtjXS5Db2RlLCB0cmVlW2NdLkxlbikKKyAgIC8qIFNlbmQgYSBjb2RlIG9mIHRoZSBnaXZlbiB0cmVlLiBjIGFuZCB0cmVlIG11c3Qgbm90IGhhdmUgc2lkZSBlZmZlY3RzICovCisKKyNlbHNlIC8qIERFQlVHICovCisjICBkZWZpbmUgc2VuZF9jb2RlKHMsIGMsIHRyZWUpIFwKKyAgICAgeyBpZiAoel92ZXJib3NlPjIpIGZwcmludGYoc3RkZXJyLCJcbmNkICUzZCAiLChjKSk7IFwKKyAgICAgICBzZW5kX2JpdHMocywgdHJlZVtjXS5Db2RlLCB0cmVlW2NdLkxlbik7IH0KKyNlbmRpZgorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIE91dHB1dCBhIHNob3J0IExTQiBmaXJzdCBvbiB0aGUgc3RyZWFtLgorICogSU4gYXNzZXJ0aW9uOiB0aGVyZSBpcyBlbm91Z2ggcm9vbSBpbiBwZW5kaW5nQnVmLgorICovCisjZGVmaW5lIHB1dF9zaG9ydChzLCB3KSB7IFwKKyAgICBwdXRfYnl0ZShzLCAodWNoKSgodykgJiAweGZmKSk7IFwKKyAgICBwdXRfYnl0ZShzLCAodWNoKSgodXNoKSh3KSA+PiA4KSk7IFwKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTZW5kIGEgdmFsdWUgb24gYSBnaXZlbiBudW1iZXIgb2YgYml0cy4KKyAqIElOIGFzc2VydGlvbjogbGVuZ3RoIDw9IDE2IGFuZCB2YWx1ZSBmaXRzIGluIGxlbmd0aCBiaXRzLgorICovCisjaWZkZWYgREVCVUcKK2xvY2FsIHZvaWQgc2VuZF9iaXRzICAgICAgT0YoKGRlZmxhdGVfc3RhdGUgKnMsIGludCB2YWx1ZSwgaW50IGxlbmd0aCkpOworCitsb2NhbCB2b2lkIHNlbmRfYml0cyhzLCB2YWx1ZSwgbGVuZ3RoKQorICAgIGRlZmxhdGVfc3RhdGUgKnM7CisgICAgaW50IHZhbHVlOyAgLyogdmFsdWUgdG8gc2VuZCAqLworICAgIGludCBsZW5ndGg7IC8qIG51bWJlciBvZiBiaXRzICovCit7CisgICAgVHJhY2V2digoc3RkZXJyLCIgbCAlMmQgdiAlNHggIiwgbGVuZ3RoLCB2YWx1ZSkpOworICAgIEFzc2VydChsZW5ndGggPiAwICYmIGxlbmd0aCA8PSAxNSwgImludmFsaWQgbGVuZ3RoIik7CisgICAgcy0+Yml0c19zZW50ICs9ICh1bGcpbGVuZ3RoOworCisgICAgLyogSWYgbm90IGVub3VnaCByb29tIGluIGJpX2J1ZiwgdXNlICh2YWxpZCkgYml0cyBmcm9tIGJpX2J1ZiBhbmQKKyAgICAgKiAoMTYgLSBiaV92YWxpZCkgYml0cyBmcm9tIHZhbHVlLCBsZWF2aW5nICh3aWR0aCAtICgxNi1iaV92YWxpZCkpCisgICAgICogdW51c2VkIGJpdHMgaW4gdmFsdWUuCisgICAgICovCisgICAgaWYgKHMtPmJpX3ZhbGlkID4gKGludClCdWZfc2l6ZSAtIGxlbmd0aCkgeworICAgICAgICBzLT5iaV9idWYgfD0gKHVzaCl2YWx1ZSA8PCBzLT5iaV92YWxpZDsKKyAgICAgICAgcHV0X3Nob3J0KHMsIHMtPmJpX2J1Zik7CisgICAgICAgIHMtPmJpX2J1ZiA9ICh1c2gpdmFsdWUgPj4gKEJ1Zl9zaXplIC0gcy0+YmlfdmFsaWQpOworICAgICAgICBzLT5iaV92YWxpZCArPSBsZW5ndGggLSBCdWZfc2l6ZTsKKyAgICB9IGVsc2UgeworICAgICAgICBzLT5iaV9idWYgfD0gKHVzaCl2YWx1ZSA8PCBzLT5iaV92YWxpZDsKKyAgICAgICAgcy0+YmlfdmFsaWQgKz0gbGVuZ3RoOworICAgIH0KK30KKyNlbHNlIC8qICFERUJVRyAqLworCisjZGVmaW5lIHNlbmRfYml0cyhzLCB2YWx1ZSwgbGVuZ3RoKSBcCit7IGludCBsZW4gPSBsZW5ndGg7XAorICBpZiAocy0+YmlfdmFsaWQgPiAoaW50KUJ1Zl9zaXplIC0gbGVuKSB7XAorICAgIGludCB2YWwgPSB2YWx1ZTtcCisgICAgcy0+YmlfYnVmIHw9ICh1c2gpdmFsIDw8IHMtPmJpX3ZhbGlkO1wKKyAgICBwdXRfc2hvcnQocywgcy0+YmlfYnVmKTtcCisgICAgcy0+YmlfYnVmID0gKHVzaCl2YWwgPj4gKEJ1Zl9zaXplIC0gcy0+YmlfdmFsaWQpO1wKKyAgICBzLT5iaV92YWxpZCArPSBsZW4gLSBCdWZfc2l6ZTtcCisgIH0gZWxzZSB7XAorICAgIHMtPmJpX2J1ZiB8PSAodXNoKSh2YWx1ZSkgPDwgcy0+YmlfdmFsaWQ7XAorICAgIHMtPmJpX3ZhbGlkICs9IGxlbjtcCisgIH1cCit9CisjZW5kaWYgLyogREVCVUcgKi8KKworCisvKiB0aGUgYXJndW1lbnRzIG11c3Qgbm90IGhhdmUgc2lkZSBlZmZlY3RzICovCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogSW5pdGlhbGl6ZSB0aGUgdmFyaW91cyAnY29uc3RhbnQnIHRhYmxlcy4KKyAqLworbG9jYWwgdm9pZCB0cl9zdGF0aWNfaW5pdCgpCit7CisjaWYgZGVmaW5lZChHRU5fVFJFRVNfSCkgfHwgIWRlZmluZWQoU1REQykKKyAgICBzdGF0aWMgaW50IHN0YXRpY19pbml0X2RvbmUgPSAwOworICAgIGludCBuOyAgICAgICAgLyogaXRlcmF0ZXMgb3ZlciB0cmVlIGVsZW1lbnRzICovCisgICAgaW50IGJpdHM7ICAgICAvKiBiaXQgY291bnRlciAqLworICAgIGludCBsZW5ndGg7ICAgLyogbGVuZ3RoIHZhbHVlICovCisgICAgaW50IGNvZGU7ICAgICAvKiBjb2RlIHZhbHVlICovCisgICAgaW50IGRpc3Q7ICAgICAvKiBkaXN0YW5jZSBpbmRleCAqLworICAgIHVzaCBibF9jb3VudFtNQVhfQklUUysxXTsKKyAgICAvKiBudW1iZXIgb2YgY29kZXMgYXQgZWFjaCBiaXQgbGVuZ3RoIGZvciBhbiBvcHRpbWFsIHRyZWUgKi8KKworICAgIGlmIChzdGF0aWNfaW5pdF9kb25lKSByZXR1cm47CisKKyAgICAvKiBGb3Igc29tZSBlbWJlZGRlZCB0YXJnZXRzLCBnbG9iYWwgdmFyaWFibGVzIGFyZSBub3QgaW5pdGlhbGl6ZWQ6ICovCisjaWZkZWYgTk9fSU5JVF9HTE9CQUxfUE9JTlRFUlMKKyAgICBzdGF0aWNfbF9kZXNjLnN0YXRpY190cmVlID0gc3RhdGljX2x0cmVlOworICAgIHN0YXRpY19sX2Rlc2MuZXh0cmFfYml0cyA9IGV4dHJhX2xiaXRzOworICAgIHN0YXRpY19kX2Rlc2Muc3RhdGljX3RyZWUgPSBzdGF0aWNfZHRyZWU7CisgICAgc3RhdGljX2RfZGVzYy5leHRyYV9iaXRzID0gZXh0cmFfZGJpdHM7CisgICAgc3RhdGljX2JsX2Rlc2MuZXh0cmFfYml0cyA9IGV4dHJhX2JsYml0czsKKyNlbmRpZgorCisgICAgLyogSW5pdGlhbGl6ZSB0aGUgbWFwcGluZyBsZW5ndGggKDAuLjI1NSkgLT4gbGVuZ3RoIGNvZGUgKDAuLjI4KSAqLworICAgIGxlbmd0aCA9IDA7CisgICAgZm9yIChjb2RlID0gMDsgY29kZSA8IExFTkdUSF9DT0RFUy0xOyBjb2RlKyspIHsKKyAgICAgICAgYmFzZV9sZW5ndGhbY29kZV0gPSBsZW5ndGg7CisgICAgICAgIGZvciAobiA9IDA7IG4gPCAoMTw8ZXh0cmFfbGJpdHNbY29kZV0pOyBuKyspIHsKKyAgICAgICAgICAgIF9sZW5ndGhfY29kZVtsZW5ndGgrK10gPSAodWNoKWNvZGU7CisgICAgICAgIH0KKyAgICB9CisgICAgQXNzZXJ0IChsZW5ndGggPT0gMjU2LCAidHJfc3RhdGljX2luaXQ6IGxlbmd0aCAhPSAyNTYiKTsKKyAgICAvKiBOb3RlIHRoYXQgdGhlIGxlbmd0aCAyNTUgKG1hdGNoIGxlbmd0aCAyNTgpIGNhbiBiZSByZXByZXNlbnRlZAorICAgICAqIGluIHR3byBkaWZmZXJlbnQgd2F5czogY29kZSAyODQgKyA1IGJpdHMgb3IgY29kZSAyODUsIHNvIHdlCisgICAgICogb3ZlcndyaXRlIGxlbmd0aF9jb2RlWzI1NV0gdG8gdXNlIHRoZSBiZXN0IGVuY29kaW5nOgorICAgICAqLworICAgIF9sZW5ndGhfY29kZVtsZW5ndGgtMV0gPSAodWNoKWNvZGU7CisKKyAgICAvKiBJbml0aWFsaXplIHRoZSBtYXBwaW5nIGRpc3QgKDAuLjMySykgLT4gZGlzdCBjb2RlICgwLi4yOSkgKi8KKyAgICBkaXN0ID0gMDsKKyAgICBmb3IgKGNvZGUgPSAwIDsgY29kZSA8IDE2OyBjb2RlKyspIHsKKyAgICAgICAgYmFzZV9kaXN0W2NvZGVdID0gZGlzdDsKKyAgICAgICAgZm9yIChuID0gMDsgbiA8ICgxPDxleHRyYV9kYml0c1tjb2RlXSk7IG4rKykgeworICAgICAgICAgICAgX2Rpc3RfY29kZVtkaXN0KytdID0gKHVjaCljb2RlOworICAgICAgICB9CisgICAgfQorICAgIEFzc2VydCAoZGlzdCA9PSAyNTYsICJ0cl9zdGF0aWNfaW5pdDogZGlzdCAhPSAyNTYiKTsKKyAgICBkaXN0ID4+PSA3OyAvKiBmcm9tIG5vdyBvbiwgYWxsIGRpc3RhbmNlcyBhcmUgZGl2aWRlZCBieSAxMjggKi8KKyAgICBmb3IgKCA7IGNvZGUgPCBEX0NPREVTOyBjb2RlKyspIHsKKyAgICAgICAgYmFzZV9kaXN0W2NvZGVdID0gZGlzdCA8PCA3OworICAgICAgICBmb3IgKG4gPSAwOyBuIDwgKDE8PChleHRyYV9kYml0c1tjb2RlXS03KSk7IG4rKykgeworICAgICAgICAgICAgX2Rpc3RfY29kZVsyNTYgKyBkaXN0KytdID0gKHVjaCljb2RlOworICAgICAgICB9CisgICAgfQorICAgIEFzc2VydCAoZGlzdCA9PSAyNTYsICJ0cl9zdGF0aWNfaW5pdDogMjU2K2Rpc3QgIT0gNTEyIik7CisKKyAgICAvKiBDb25zdHJ1Y3QgdGhlIGNvZGVzIG9mIHRoZSBzdGF0aWMgbGl0ZXJhbCB0cmVlICovCisgICAgZm9yIChiaXRzID0gMDsgYml0cyA8PSBNQVhfQklUUzsgYml0cysrKSBibF9jb3VudFtiaXRzXSA9IDA7CisgICAgbiA9IDA7CisgICAgd2hpbGUgKG4gPD0gMTQzKSBzdGF0aWNfbHRyZWVbbisrXS5MZW4gPSA4LCBibF9jb3VudFs4XSsrOworICAgIHdoaWxlIChuIDw9IDI1NSkgc3RhdGljX2x0cmVlW24rK10uTGVuID0gOSwgYmxfY291bnRbOV0rKzsKKyAgICB3aGlsZSAobiA8PSAyNzkpIHN0YXRpY19sdHJlZVtuKytdLkxlbiA9IDcsIGJsX2NvdW50WzddKys7CisgICAgd2hpbGUgKG4gPD0gMjg3KSBzdGF0aWNfbHRyZWVbbisrXS5MZW4gPSA4LCBibF9jb3VudFs4XSsrOworICAgIC8qIENvZGVzIDI4NiBhbmQgMjg3IGRvIG5vdCBleGlzdCwgYnV0IHdlIG11c3QgaW5jbHVkZSB0aGVtIGluIHRoZQorICAgICAqIHRyZWUgY29uc3RydWN0aW9uIHRvIGdldCBhIGNhbm9uaWNhbCBIdWZmbWFuIHRyZWUgKGxvbmdlc3QgY29kZQorICAgICAqIGFsbCBvbmVzKQorICAgICAqLworICAgIGdlbl9jb2RlcygoY3RfZGF0YSAqKXN0YXRpY19sdHJlZSwgTF9DT0RFUysxLCBibF9jb3VudCk7CisKKyAgICAvKiBUaGUgc3RhdGljIGRpc3RhbmNlIHRyZWUgaXMgdHJpdmlhbDogKi8KKyAgICBmb3IgKG4gPSAwOyBuIDwgRF9DT0RFUzsgbisrKSB7CisgICAgICAgIHN0YXRpY19kdHJlZVtuXS5MZW4gPSA1OworICAgICAgICBzdGF0aWNfZHRyZWVbbl0uQ29kZSA9IGJpX3JldmVyc2UoKHVuc2lnbmVkKW4sIDUpOworICAgIH0KKyAgICBzdGF0aWNfaW5pdF9kb25lID0gMTsKKworIyAgaWZkZWYgR0VOX1RSRUVTX0gKKyAgICBnZW5fdHJlZXNfaGVhZGVyKCk7CisjICBlbmRpZgorI2VuZGlmIC8qIGRlZmluZWQoR0VOX1RSRUVTX0gpIHx8ICFkZWZpbmVkKFNUREMpICovCit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogR2VuZXJlcmF0ZSB0aGUgZmlsZSB0cmVlcy5oIGRlc2NyaWJpbmcgdGhlIHN0YXRpYyB0cmVlcy4KKyAqLworI2lmZGVmIEdFTl9UUkVFU19ICisjICBpZm5kZWYgREVCVUcKKyMgICAgaW5jbHVkZSA8c3RkaW8uaD4KKyMgIGVuZGlmCisKKyMgIGRlZmluZSBTRVBBUkFUT1IoaSwgbGFzdCwgd2lkdGgpIFwKKyAgICAgICgoaSkgPT0gKGxhc3QpPyAiXG59O1xuXG4iIDogICAgXAorICAgICAgICgoaSkgJSAod2lkdGgpID09ICh3aWR0aCktMSA/ICIsXG4iIDogIiwgIikpCisKK3ZvaWQgZ2VuX3RyZWVzX2hlYWRlcigpCit7CisgICAgRklMRSAqaGVhZGVyID0gZm9wZW4oInRyZWVzLmgiLCAidyIpOworICAgIGludCBpOworCisgICAgQXNzZXJ0IChoZWFkZXIgIT0gTlVMTCwgIkNhbid0IG9wZW4gdHJlZXMuaCIpOworICAgIGZwcmludGYoaGVhZGVyLAorICAgICAgICAgICAgIi8qIGhlYWRlciBjcmVhdGVkIGF1dG9tYXRpY2FsbHkgd2l0aCAtREdFTl9UUkVFU19IICovXG5cbiIpOworCisgICAgZnByaW50ZihoZWFkZXIsICJsb2NhbCBjb25zdCBjdF9kYXRhIHN0YXRpY19sdHJlZVtMX0NPREVTKzJdID0ge1xuIik7CisgICAgZm9yIChpID0gMDsgaSA8IExfQ09ERVMrMjsgaSsrKSB7CisgICAgICAgIGZwcmludGYoaGVhZGVyLCAie3slM3V9LHslM3V9fSVzIiwgc3RhdGljX2x0cmVlW2ldLkNvZGUsCisgICAgICAgICAgICAgICAgc3RhdGljX2x0cmVlW2ldLkxlbiwgU0VQQVJBVE9SKGksIExfQ09ERVMrMSwgNSkpOworICAgIH0KKworICAgIGZwcmludGYoaGVhZGVyLCAibG9jYWwgY29uc3QgY3RfZGF0YSBzdGF0aWNfZHRyZWVbRF9DT0RFU10gPSB7XG4iKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgRF9DT0RFUzsgaSsrKSB7CisgICAgICAgIGZwcmludGYoaGVhZGVyLCAie3slMnV9LHslMnV9fSVzIiwgc3RhdGljX2R0cmVlW2ldLkNvZGUsCisgICAgICAgICAgICAgICAgc3RhdGljX2R0cmVlW2ldLkxlbiwgU0VQQVJBVE9SKGksIERfQ09ERVMtMSwgNSkpOworICAgIH0KKworICAgIGZwcmludGYoaGVhZGVyLCAiY29uc3QgdWNoIFpMSUJfSU5URVJOQUwgX2Rpc3RfY29kZVtESVNUX0NPREVfTEVOXSA9IHtcbiIpOworICAgIGZvciAoaSA9IDA7IGkgPCBESVNUX0NPREVfTEVOOyBpKyspIHsKKyAgICAgICAgZnByaW50ZihoZWFkZXIsICIlMnUlcyIsIF9kaXN0X2NvZGVbaV0sCisgICAgICAgICAgICAgICAgU0VQQVJBVE9SKGksIERJU1RfQ09ERV9MRU4tMSwgMjApKTsKKyAgICB9CisKKyAgICBmcHJpbnRmKGhlYWRlciwKKyAgICAgICAgImNvbnN0IHVjaCBaTElCX0lOVEVSTkFMIF9sZW5ndGhfY29kZVtNQVhfTUFUQ0gtTUlOX01BVENIKzFdPSB7XG4iKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX01BVENILU1JTl9NQVRDSCsxOyBpKyspIHsKKyAgICAgICAgZnByaW50ZihoZWFkZXIsICIlMnUlcyIsIF9sZW5ndGhfY29kZVtpXSwKKyAgICAgICAgICAgICAgICBTRVBBUkFUT1IoaSwgTUFYX01BVENILU1JTl9NQVRDSCwgMjApKTsKKyAgICB9CisKKyAgICBmcHJpbnRmKGhlYWRlciwgImxvY2FsIGNvbnN0IGludCBiYXNlX2xlbmd0aFtMRU5HVEhfQ09ERVNdID0ge1xuIik7CisgICAgZm9yIChpID0gMDsgaSA8IExFTkdUSF9DT0RFUzsgaSsrKSB7CisgICAgICAgIGZwcmludGYoaGVhZGVyLCAiJTF1JXMiLCBiYXNlX2xlbmd0aFtpXSwKKyAgICAgICAgICAgICAgICBTRVBBUkFUT1IoaSwgTEVOR1RIX0NPREVTLTEsIDIwKSk7CisgICAgfQorCisgICAgZnByaW50ZihoZWFkZXIsICJsb2NhbCBjb25zdCBpbnQgYmFzZV9kaXN0W0RfQ09ERVNdID0ge1xuIik7CisgICAgZm9yIChpID0gMDsgaSA8IERfQ09ERVM7IGkrKykgeworICAgICAgICBmcHJpbnRmKGhlYWRlciwgIiU1dSVzIiwgYmFzZV9kaXN0W2ldLAorICAgICAgICAgICAgICAgIFNFUEFSQVRPUihpLCBEX0NPREVTLTEsIDEwKSk7CisgICAgfQorCisgICAgZmNsb3NlKGhlYWRlcik7Cit9CisjZW5kaWYgLyogR0VOX1RSRUVTX0ggKi8KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBJbml0aWFsaXplIHRoZSB0cmVlIGRhdGEgc3RydWN0dXJlcyBmb3IgYSBuZXcgemxpYiBzdHJlYW0uCisgKi8KK3ZvaWQgWkxJQl9JTlRFUk5BTCBfdHJfaW5pdChzKQorICAgIGRlZmxhdGVfc3RhdGUgKnM7Cit7CisgICAgdHJfc3RhdGljX2luaXQoKTsKKworICAgIHMtPmxfZGVzYy5keW5fdHJlZSA9IHMtPmR5bl9sdHJlZTsKKyAgICBzLT5sX2Rlc2Muc3RhdF9kZXNjID0gJnN0YXRpY19sX2Rlc2M7CisKKyAgICBzLT5kX2Rlc2MuZHluX3RyZWUgPSBzLT5keW5fZHRyZWU7CisgICAgcy0+ZF9kZXNjLnN0YXRfZGVzYyA9ICZzdGF0aWNfZF9kZXNjOworCisgICAgcy0+YmxfZGVzYy5keW5fdHJlZSA9IHMtPmJsX3RyZWU7CisgICAgcy0+YmxfZGVzYy5zdGF0X2Rlc2MgPSAmc3RhdGljX2JsX2Rlc2M7CisKKyAgICBzLT5iaV9idWYgPSAwOworICAgIHMtPmJpX3ZhbGlkID0gMDsKKyNpZmRlZiBERUJVRworICAgIHMtPmNvbXByZXNzZWRfbGVuID0gMEw7CisgICAgcy0+Yml0c19zZW50ID0gMEw7CisjZW5kaWYKKworICAgIC8qIEluaXRpYWxpemUgdGhlIGZpcnN0IGJsb2NrIG9mIHRoZSBmaXJzdCBmaWxlOiAqLworICAgIGluaXRfYmxvY2socyk7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogSW5pdGlhbGl6ZSBhIG5ldyBibG9jay4KKyAqLworbG9jYWwgdm9pZCBpbml0X2Jsb2NrKHMpCisgICAgZGVmbGF0ZV9zdGF0ZSAqczsKK3sKKyAgICBpbnQgbjsgLyogaXRlcmF0ZXMgb3ZlciB0cmVlIGVsZW1lbnRzICovCisKKyAgICAvKiBJbml0aWFsaXplIHRoZSB0cmVlcy4gKi8KKyAgICBmb3IgKG4gPSAwOyBuIDwgTF9DT0RFUzsgIG4rKykgcy0+ZHluX2x0cmVlW25dLkZyZXEgPSAwOworICAgIGZvciAobiA9IDA7IG4gPCBEX0NPREVTOyAgbisrKSBzLT5keW5fZHRyZWVbbl0uRnJlcSA9IDA7CisgICAgZm9yIChuID0gMDsgbiA8IEJMX0NPREVTOyBuKyspIHMtPmJsX3RyZWVbbl0uRnJlcSA9IDA7CisKKyAgICBzLT5keW5fbHRyZWVbRU5EX0JMT0NLXS5GcmVxID0gMTsKKyAgICBzLT5vcHRfbGVuID0gcy0+c3RhdGljX2xlbiA9IDBMOworICAgIHMtPmxhc3RfbGl0ID0gcy0+bWF0Y2hlcyA9IDA7Cit9CisKKyNkZWZpbmUgU01BTExFU1QgMQorLyogSW5kZXggd2l0aGluIHRoZSBoZWFwIGFycmF5IG9mIGxlYXN0IGZyZXF1ZW50IG5vZGUgaW4gdGhlIEh1ZmZtYW4gdHJlZSAqLworCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogUmVtb3ZlIHRoZSBzbWFsbGVzdCBlbGVtZW50IGZyb20gdGhlIGhlYXAgYW5kIHJlY3JlYXRlIHRoZSBoZWFwIHdpdGgKKyAqIG9uZSBsZXNzIGVsZW1lbnQuIFVwZGF0ZXMgaGVhcCBhbmQgaGVhcF9sZW4uCisgKi8KKyNkZWZpbmUgcHFyZW1vdmUocywgdHJlZSwgdG9wKSBcCit7XAorICAgIHRvcCA9IHMtPmhlYXBbU01BTExFU1RdOyBcCisgICAgcy0+aGVhcFtTTUFMTEVTVF0gPSBzLT5oZWFwW3MtPmhlYXBfbGVuLS1dOyBcCisgICAgcHFkb3duaGVhcChzLCB0cmVlLCBTTUFMTEVTVCk7IFwKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb21wYXJlcyB0byBzdWJ0cmVlcywgdXNpbmcgdGhlIHRyZWUgZGVwdGggYXMgdGllIGJyZWFrZXIgd2hlbgorICogdGhlIHN1YnRyZWVzIGhhdmUgZXF1YWwgZnJlcXVlbmN5LiBUaGlzIG1pbmltaXplcyB0aGUgd29yc3QgY2FzZSBsZW5ndGguCisgKi8KKyNkZWZpbmUgc21hbGxlcih0cmVlLCBuLCBtLCBkZXB0aCkgXAorICAgKHRyZWVbbl0uRnJlcSA8IHRyZWVbbV0uRnJlcSB8fCBcCisgICAodHJlZVtuXS5GcmVxID09IHRyZWVbbV0uRnJlcSAmJiBkZXB0aFtuXSA8PSBkZXB0aFttXSkpCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogUmVzdG9yZSB0aGUgaGVhcCBwcm9wZXJ0eSBieSBtb3ZpbmcgZG93biB0aGUgdHJlZSBzdGFydGluZyBhdCBub2RlIGssCisgKiBleGNoYW5naW5nIGEgbm9kZSB3aXRoIHRoZSBzbWFsbGVzdCBvZiBpdHMgdHdvIHNvbnMgaWYgbmVjZXNzYXJ5LCBzdG9wcGluZworICogd2hlbiB0aGUgaGVhcCBwcm9wZXJ0eSBpcyByZS1lc3RhYmxpc2hlZCAoZWFjaCBmYXRoZXIgc21hbGxlciB0aGFuIGl0cworICogdHdvIHNvbnMpLgorICovCitsb2NhbCB2b2lkIHBxZG93bmhlYXAocywgdHJlZSwgaykKKyAgICBkZWZsYXRlX3N0YXRlICpzOworICAgIGN0X2RhdGEgKnRyZWU7ICAvKiB0aGUgdHJlZSB0byByZXN0b3JlICovCisgICAgaW50IGs7ICAgICAgICAgICAgICAgLyogbm9kZSB0byBtb3ZlIGRvd24gKi8KK3sKKyAgICBpbnQgdiA9IHMtPmhlYXBba107CisgICAgaW50IGogPSBrIDw8IDE7ICAvKiBsZWZ0IHNvbiBvZiBrICovCisgICAgd2hpbGUgKGogPD0gcy0+aGVhcF9sZW4pIHsKKyAgICAgICAgLyogU2V0IGogdG8gdGhlIHNtYWxsZXN0IG9mIHRoZSB0d28gc29uczogKi8KKyAgICAgICAgaWYgKGogPCBzLT5oZWFwX2xlbiAmJgorICAgICAgICAgICAgc21hbGxlcih0cmVlLCBzLT5oZWFwW2orMV0sIHMtPmhlYXBbal0sIHMtPmRlcHRoKSkgeworICAgICAgICAgICAgaisrOworICAgICAgICB9CisgICAgICAgIC8qIEV4aXQgaWYgdiBpcyBzbWFsbGVyIHRoYW4gYm90aCBzb25zICovCisgICAgICAgIGlmIChzbWFsbGVyKHRyZWUsIHYsIHMtPmhlYXBbal0sIHMtPmRlcHRoKSkgYnJlYWs7CisKKyAgICAgICAgLyogRXhjaGFuZ2UgdiB3aXRoIHRoZSBzbWFsbGVzdCBzb24gKi8KKyAgICAgICAgcy0+aGVhcFtrXSA9IHMtPmhlYXBbal07ICBrID0gajsKKworICAgICAgICAvKiBBbmQgY29udGludWUgZG93biB0aGUgdHJlZSwgc2V0dGluZyBqIHRvIHRoZSBsZWZ0IHNvbiBvZiBrICovCisgICAgICAgIGogPDw9IDE7CisgICAgfQorICAgIHMtPmhlYXBba10gPSB2OworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvbXB1dGUgdGhlIG9wdGltYWwgYml0IGxlbmd0aHMgZm9yIGEgdHJlZSBhbmQgdXBkYXRlIHRoZSB0b3RhbCBiaXQgbGVuZ3RoCisgKiBmb3IgdGhlIGN1cnJlbnQgYmxvY2suCisgKiBJTiBhc3NlcnRpb246IHRoZSBmaWVsZHMgZnJlcSBhbmQgZGFkIGFyZSBzZXQsIGhlYXBbaGVhcF9tYXhdIGFuZAorICogICAgYWJvdmUgYXJlIHRoZSB0cmVlIG5vZGVzIHNvcnRlZCBieSBpbmNyZWFzaW5nIGZyZXF1ZW5jeS4KKyAqIE9VVCBhc3NlcnRpb25zOiB0aGUgZmllbGQgbGVuIGlzIHNldCB0byB0aGUgb3B0aW1hbCBiaXQgbGVuZ3RoLCB0aGUKKyAqICAgICBhcnJheSBibF9jb3VudCBjb250YWlucyB0aGUgZnJlcXVlbmNpZXMgZm9yIGVhY2ggYml0IGxlbmd0aC4KKyAqICAgICBUaGUgbGVuZ3RoIG9wdF9sZW4gaXMgdXBkYXRlZDsgc3RhdGljX2xlbiBpcyBhbHNvIHVwZGF0ZWQgaWYgc3RyZWUgaXMKKyAqICAgICBub3QgbnVsbC4KKyAqLworbG9jYWwgdm9pZCBnZW5fYml0bGVuKHMsIGRlc2MpCisgICAgZGVmbGF0ZV9zdGF0ZSAqczsKKyAgICB0cmVlX2Rlc2MgKmRlc2M7ICAgIC8qIHRoZSB0cmVlIGRlc2NyaXB0b3IgKi8KK3sKKyAgICBjdF9kYXRhICp0cmVlICAgICAgICA9IGRlc2MtPmR5bl90cmVlOworICAgIGludCBtYXhfY29kZSAgICAgICAgID0gZGVzYy0+bWF4X2NvZGU7CisgICAgY29uc3QgY3RfZGF0YSAqc3RyZWUgPSBkZXNjLT5zdGF0X2Rlc2MtPnN0YXRpY190cmVlOworICAgIGNvbnN0IGludGYgKmV4dHJhICAgID0gZGVzYy0+c3RhdF9kZXNjLT5leHRyYV9iaXRzOworICAgIGludCBiYXNlICAgICAgICAgICAgID0gZGVzYy0+c3RhdF9kZXNjLT5leHRyYV9iYXNlOworICAgIGludCBtYXhfbGVuZ3RoICAgICAgID0gZGVzYy0+c3RhdF9kZXNjLT5tYXhfbGVuZ3RoOworICAgIGludCBoOyAgICAgICAgICAgICAgLyogaGVhcCBpbmRleCAqLworICAgIGludCBuLCBtOyAgICAgICAgICAgLyogaXRlcmF0ZSBvdmVyIHRoZSB0cmVlIGVsZW1lbnRzICovCisgICAgaW50IGJpdHM7ICAgICAgICAgICAvKiBiaXQgbGVuZ3RoICovCisgICAgaW50IHhiaXRzOyAgICAgICAgICAvKiBleHRyYSBiaXRzICovCisgICAgdXNoIGY7ICAgICAgICAgICAgICAvKiBmcmVxdWVuY3kgKi8KKyAgICBpbnQgb3ZlcmZsb3cgPSAwOyAgIC8qIG51bWJlciBvZiBlbGVtZW50cyB3aXRoIGJpdCBsZW5ndGggdG9vIGxhcmdlICovCisKKyAgICBmb3IgKGJpdHMgPSAwOyBiaXRzIDw9IE1BWF9CSVRTOyBiaXRzKyspIHMtPmJsX2NvdW50W2JpdHNdID0gMDsKKworICAgIC8qIEluIGEgZmlyc3QgcGFzcywgY29tcHV0ZSB0aGUgb3B0aW1hbCBiaXQgbGVuZ3RocyAod2hpY2ggbWF5CisgICAgICogb3ZlcmZsb3cgaW4gdGhlIGNhc2Ugb2YgdGhlIGJpdCBsZW5ndGggdHJlZSkuCisgICAgICovCisgICAgdHJlZVtzLT5oZWFwW3MtPmhlYXBfbWF4XV0uTGVuID0gMDsgLyogcm9vdCBvZiB0aGUgaGVhcCAqLworCisgICAgZm9yIChoID0gcy0+aGVhcF9tYXgrMTsgaCA8IEhFQVBfU0laRTsgaCsrKSB7CisgICAgICAgIG4gPSBzLT5oZWFwW2hdOworICAgICAgICBiaXRzID0gdHJlZVt0cmVlW25dLkRhZF0uTGVuICsgMTsKKyAgICAgICAgaWYgKGJpdHMgPiBtYXhfbGVuZ3RoKSBiaXRzID0gbWF4X2xlbmd0aCwgb3ZlcmZsb3crKzsKKyAgICAgICAgdHJlZVtuXS5MZW4gPSAodXNoKWJpdHM7CisgICAgICAgIC8qIFdlIG92ZXJ3cml0ZSB0cmVlW25dLkRhZCB3aGljaCBpcyBubyBsb25nZXIgbmVlZGVkICovCisKKyAgICAgICAgaWYgKG4gPiBtYXhfY29kZSkgY29udGludWU7IC8qIG5vdCBhIGxlYWYgbm9kZSAqLworCisgICAgICAgIHMtPmJsX2NvdW50W2JpdHNdKys7CisgICAgICAgIHhiaXRzID0gMDsKKyAgICAgICAgaWYgKG4gPj0gYmFzZSkgeGJpdHMgPSBleHRyYVtuLWJhc2VdOworICAgICAgICBmID0gdHJlZVtuXS5GcmVxOworICAgICAgICBzLT5vcHRfbGVuICs9ICh1bGcpZiAqIChiaXRzICsgeGJpdHMpOworICAgICAgICBpZiAoc3RyZWUpIHMtPnN0YXRpY19sZW4gKz0gKHVsZylmICogKHN0cmVlW25dLkxlbiArIHhiaXRzKTsKKyAgICB9CisgICAgaWYgKG92ZXJmbG93ID09IDApIHJldHVybjsKKworICAgIFRyYWNlKChzdGRlcnIsIlxuYml0IGxlbmd0aCBvdmVyZmxvd1xuIikpOworICAgIC8qIFRoaXMgaGFwcGVucyBmb3IgZXhhbXBsZSBvbiBvYmoyIGFuZCBwaWMgb2YgdGhlIENhbGdhcnkgY29ycHVzICovCisKKyAgICAvKiBGaW5kIHRoZSBmaXJzdCBiaXQgbGVuZ3RoIHdoaWNoIGNvdWxkIGluY3JlYXNlOiAqLworICAgIGRvIHsKKyAgICAgICAgYml0cyA9IG1heF9sZW5ndGgtMTsKKyAgICAgICAgd2hpbGUgKHMtPmJsX2NvdW50W2JpdHNdID09IDApIGJpdHMtLTsKKyAgICAgICAgcy0+YmxfY291bnRbYml0c10tLTsgICAgICAvKiBtb3ZlIG9uZSBsZWFmIGRvd24gdGhlIHRyZWUgKi8KKyAgICAgICAgcy0+YmxfY291bnRbYml0cysxXSArPSAyOyAvKiBtb3ZlIG9uZSBvdmVyZmxvdyBpdGVtIGFzIGl0cyBicm90aGVyICovCisgICAgICAgIHMtPmJsX2NvdW50W21heF9sZW5ndGhdLS07CisgICAgICAgIC8qIFRoZSBicm90aGVyIG9mIHRoZSBvdmVyZmxvdyBpdGVtIGFsc28gbW92ZXMgb25lIHN0ZXAgdXAsCisgICAgICAgICAqIGJ1dCB0aGlzIGRvZXMgbm90IGFmZmVjdCBibF9jb3VudFttYXhfbGVuZ3RoXQorICAgICAgICAgKi8KKyAgICAgICAgb3ZlcmZsb3cgLT0gMjsKKyAgICB9IHdoaWxlIChvdmVyZmxvdyA+IDApOworCisgICAgLyogTm93IHJlY29tcHV0ZSBhbGwgYml0IGxlbmd0aHMsIHNjYW5uaW5nIGluIGluY3JlYXNpbmcgZnJlcXVlbmN5LgorICAgICAqIGggaXMgc3RpbGwgZXF1YWwgdG8gSEVBUF9TSVpFLiAoSXQgaXMgc2ltcGxlciB0byByZWNvbnN0cnVjdCBhbGwKKyAgICAgKiBsZW5ndGhzIGluc3RlYWQgb2YgZml4aW5nIG9ubHkgdGhlIHdyb25nIG9uZXMuIFRoaXMgaWRlYSBpcyB0YWtlbgorICAgICAqIGZyb20gJ2FyJyB3cml0dGVuIGJ5IEhhcnVoaWtvIE9rdW11cmEuKQorICAgICAqLworICAgIGZvciAoYml0cyA9IG1heF9sZW5ndGg7IGJpdHMgIT0gMDsgYml0cy0tKSB7CisgICAgICAgIG4gPSBzLT5ibF9jb3VudFtiaXRzXTsKKyAgICAgICAgd2hpbGUgKG4gIT0gMCkgeworICAgICAgICAgICAgbSA9IHMtPmhlYXBbLS1oXTsKKyAgICAgICAgICAgIGlmIChtID4gbWF4X2NvZGUpIGNvbnRpbnVlOworICAgICAgICAgICAgaWYgKCh1bnNpZ25lZCkgdHJlZVttXS5MZW4gIT0gKHVuc2lnbmVkKSBiaXRzKSB7CisgICAgICAgICAgICAgICAgVHJhY2UoKHN0ZGVyciwiY29kZSAlZCBiaXRzICVkLT4lZFxuIiwgbSwgdHJlZVttXS5MZW4sIGJpdHMpKTsKKyAgICAgICAgICAgICAgICBzLT5vcHRfbGVuICs9ICgobG9uZyliaXRzIC0gKGxvbmcpdHJlZVttXS5MZW4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKGxvbmcpdHJlZVttXS5GcmVxOworICAgICAgICAgICAgICAgIHRyZWVbbV0uTGVuID0gKHVzaCliaXRzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbi0tOworICAgICAgICB9CisgICAgfQorfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEdlbmVyYXRlIHRoZSBjb2RlcyBmb3IgYSBnaXZlbiB0cmVlIGFuZCBiaXQgY291bnRzICh3aGljaCBuZWVkIG5vdCBiZQorICogb3B0aW1hbCkuCisgKiBJTiBhc3NlcnRpb246IHRoZSBhcnJheSBibF9jb3VudCBjb250YWlucyB0aGUgYml0IGxlbmd0aCBzdGF0aXN0aWNzIGZvcgorICogdGhlIGdpdmVuIHRyZWUgYW5kIHRoZSBmaWVsZCBsZW4gaXMgc2V0IGZvciBhbGwgdHJlZSBlbGVtZW50cy4KKyAqIE9VVCBhc3NlcnRpb246IHRoZSBmaWVsZCBjb2RlIGlzIHNldCBmb3IgYWxsIHRyZWUgZWxlbWVudHMgb2Ygbm9uCisgKiAgICAgemVybyBjb2RlIGxlbmd0aC4KKyAqLworbG9jYWwgdm9pZCBnZW5fY29kZXMgKHRyZWUsIG1heF9jb2RlLCBibF9jb3VudCkKKyAgICBjdF9kYXRhICp0cmVlOyAgICAgICAgICAgICAvKiB0aGUgdHJlZSB0byBkZWNvcmF0ZSAqLworICAgIGludCBtYXhfY29kZTsgICAgICAgICAgICAgIC8qIGxhcmdlc3QgY29kZSB3aXRoIG5vbiB6ZXJvIGZyZXF1ZW5jeSAqLworICAgIHVzaGYgKmJsX2NvdW50OyAgICAgICAgICAgIC8qIG51bWJlciBvZiBjb2RlcyBhdCBlYWNoIGJpdCBsZW5ndGggKi8KK3sKKyAgICB1c2ggbmV4dF9jb2RlW01BWF9CSVRTKzFdOyAvKiBuZXh0IGNvZGUgdmFsdWUgZm9yIGVhY2ggYml0IGxlbmd0aCAqLworICAgIHVzaCBjb2RlID0gMDsgICAgICAgICAgICAgIC8qIHJ1bm5pbmcgY29kZSB2YWx1ZSAqLworICAgIGludCBiaXRzOyAgICAgICAgICAgICAgICAgIC8qIGJpdCBpbmRleCAqLworICAgIGludCBuOyAgICAgICAgICAgICAgICAgICAgIC8qIGNvZGUgaW5kZXggKi8KKworICAgIC8qIFRoZSBkaXN0cmlidXRpb24gY291bnRzIGFyZSBmaXJzdCB1c2VkIHRvIGdlbmVyYXRlIHRoZSBjb2RlIHZhbHVlcworICAgICAqIHdpdGhvdXQgYml0IHJldmVyc2FsLgorICAgICAqLworICAgIGZvciAoYml0cyA9IDE7IGJpdHMgPD0gTUFYX0JJVFM7IGJpdHMrKykgeworICAgICAgICBuZXh0X2NvZGVbYml0c10gPSBjb2RlID0gKGNvZGUgKyBibF9jb3VudFtiaXRzLTFdKSA8PCAxOworICAgIH0KKyAgICAvKiBDaGVjayB0aGF0IHRoZSBiaXQgY291bnRzIGluIGJsX2NvdW50IGFyZSBjb25zaXN0ZW50LiBUaGUgbGFzdCBjb2RlCisgICAgICogbXVzdCBiZSBhbGwgb25lcy4KKyAgICAgKi8KKyAgICBBc3NlcnQgKGNvZGUgKyBibF9jb3VudFtNQVhfQklUU10tMSA9PSAoMTw8TUFYX0JJVFMpLTEsCisgICAgICAgICAgICAiaW5jb25zaXN0ZW50IGJpdCBjb3VudHMiKTsKKyAgICBUcmFjZXYoKHN0ZGVyciwiXG5nZW5fY29kZXM6IG1heF9jb2RlICVkICIsIG1heF9jb2RlKSk7CisKKyAgICBmb3IgKG4gPSAwOyAgbiA8PSBtYXhfY29kZTsgbisrKSB7CisgICAgICAgIGludCBsZW4gPSB0cmVlW25dLkxlbjsKKyAgICAgICAgaWYgKGxlbiA9PSAwKSBjb250aW51ZTsKKyAgICAgICAgLyogTm93IHJldmVyc2UgdGhlIGJpdHMgKi8KKyAgICAgICAgdHJlZVtuXS5Db2RlID0gYmlfcmV2ZXJzZShuZXh0X2NvZGVbbGVuXSsrLCBsZW4pOworCisgICAgICAgIFRyYWNlY3YodHJlZSAhPSBzdGF0aWNfbHRyZWUsIChzdGRlcnIsIlxubiAlM2QgJWMgbCAlMmQgYyAlNHggKCV4KSAiLAorICAgICAgICAgICAgIG4sIChpc2dyYXBoKG4pID8gbiA6ICcgJyksIGxlbiwgdHJlZVtuXS5Db2RlLCBuZXh0X2NvZGVbbGVuXS0xKSk7CisgICAgfQorfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvbnN0cnVjdCBvbmUgSHVmZm1hbiB0cmVlIGFuZCBhc3NpZ25zIHRoZSBjb2RlIGJpdCBzdHJpbmdzIGFuZCBsZW5ndGhzLgorICogVXBkYXRlIHRoZSB0b3RhbCBiaXQgbGVuZ3RoIGZvciB0aGUgY3VycmVudCBibG9jay4KKyAqIElOIGFzc2VydGlvbjogdGhlIGZpZWxkIGZyZXEgaXMgc2V0IGZvciBhbGwgdHJlZSBlbGVtZW50cy4KKyAqIE9VVCBhc3NlcnRpb25zOiB0aGUgZmllbGRzIGxlbiBhbmQgY29kZSBhcmUgc2V0IHRvIHRoZSBvcHRpbWFsIGJpdCBsZW5ndGgKKyAqICAgICBhbmQgY29ycmVzcG9uZGluZyBjb2RlLiBUaGUgbGVuZ3RoIG9wdF9sZW4gaXMgdXBkYXRlZDsgc3RhdGljX2xlbiBpcworICogICAgIGFsc28gdXBkYXRlZCBpZiBzdHJlZSBpcyBub3QgbnVsbC4gVGhlIGZpZWxkIG1heF9jb2RlIGlzIHNldC4KKyAqLworbG9jYWwgdm9pZCBidWlsZF90cmVlKHMsIGRlc2MpCisgICAgZGVmbGF0ZV9zdGF0ZSAqczsKKyAgICB0cmVlX2Rlc2MgKmRlc2M7IC8qIHRoZSB0cmVlIGRlc2NyaXB0b3IgKi8KK3sKKyAgICBjdF9kYXRhICp0cmVlICAgICAgICAgPSBkZXNjLT5keW5fdHJlZTsKKyAgICBjb25zdCBjdF9kYXRhICpzdHJlZSAgPSBkZXNjLT5zdGF0X2Rlc2MtPnN0YXRpY190cmVlOworICAgIGludCBlbGVtcyAgICAgICAgICAgICA9IGRlc2MtPnN0YXRfZGVzYy0+ZWxlbXM7CisgICAgaW50IG4sIG07ICAgICAgICAgIC8qIGl0ZXJhdGUgb3ZlciBoZWFwIGVsZW1lbnRzICovCisgICAgaW50IG1heF9jb2RlID0gLTE7IC8qIGxhcmdlc3QgY29kZSB3aXRoIG5vbiB6ZXJvIGZyZXF1ZW5jeSAqLworICAgIGludCBub2RlOyAgICAgICAgICAvKiBuZXcgbm9kZSBiZWluZyBjcmVhdGVkICovCisKKyAgICAvKiBDb25zdHJ1Y3QgdGhlIGluaXRpYWwgaGVhcCwgd2l0aCBsZWFzdCBmcmVxdWVudCBlbGVtZW50IGluCisgICAgICogaGVhcFtTTUFMTEVTVF0uIFRoZSBzb25zIG9mIGhlYXBbbl0gYXJlIGhlYXBbMipuXSBhbmQgaGVhcFsyKm4rMV0uCisgICAgICogaGVhcFswXSBpcyBub3QgdXNlZC4KKyAgICAgKi8KKyAgICBzLT5oZWFwX2xlbiA9IDAsIHMtPmhlYXBfbWF4ID0gSEVBUF9TSVpFOworCisgICAgZm9yIChuID0gMDsgbiA8IGVsZW1zOyBuKyspIHsKKyAgICAgICAgaWYgKHRyZWVbbl0uRnJlcSAhPSAwKSB7CisgICAgICAgICAgICBzLT5oZWFwWysrKHMtPmhlYXBfbGVuKV0gPSBtYXhfY29kZSA9IG47CisgICAgICAgICAgICBzLT5kZXB0aFtuXSA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0cmVlW25dLkxlbiA9IDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBUaGUgcGt6aXAgZm9ybWF0IHJlcXVpcmVzIHRoYXQgYXQgbGVhc3Qgb25lIGRpc3RhbmNlIGNvZGUgZXhpc3RzLAorICAgICAqIGFuZCB0aGF0IGF0IGxlYXN0IG9uZSBiaXQgc2hvdWxkIGJlIHNlbnQgZXZlbiBpZiB0aGVyZSBpcyBvbmx5IG9uZQorICAgICAqIHBvc3NpYmxlIGNvZGUuIFNvIHRvIGF2b2lkIHNwZWNpYWwgY2hlY2tzIGxhdGVyIG9uIHdlIGZvcmNlIGF0IGxlYXN0CisgICAgICogdHdvIGNvZGVzIG9mIG5vbiB6ZXJvIGZyZXF1ZW5jeS4KKyAgICAgKi8KKyAgICB3aGlsZSAocy0+aGVhcF9sZW4gPCAyKSB7CisgICAgICAgIG5vZGUgPSBzLT5oZWFwWysrKHMtPmhlYXBfbGVuKV0gPSAobWF4X2NvZGUgPCAyID8gKyttYXhfY29kZSA6IDApOworICAgICAgICB0cmVlW25vZGVdLkZyZXEgPSAxOworICAgICAgICBzLT5kZXB0aFtub2RlXSA9IDA7CisgICAgICAgIHMtPm9wdF9sZW4tLTsgaWYgKHN0cmVlKSBzLT5zdGF0aWNfbGVuIC09IHN0cmVlW25vZGVdLkxlbjsKKyAgICAgICAgLyogbm9kZSBpcyAwIG9yIDEgc28gaXQgZG9lcyBub3QgaGF2ZSBleHRyYSBiaXRzICovCisgICAgfQorICAgIGRlc2MtPm1heF9jb2RlID0gbWF4X2NvZGU7CisKKyAgICAvKiBUaGUgZWxlbWVudHMgaGVhcFtoZWFwX2xlbi8yKzEgLi4gaGVhcF9sZW5dIGFyZSBsZWF2ZXMgb2YgdGhlIHRyZWUsCisgICAgICogZXN0YWJsaXNoIHN1Yi1oZWFwcyBvZiBpbmNyZWFzaW5nIGxlbmd0aHM6CisgICAgICovCisgICAgZm9yIChuID0gcy0+aGVhcF9sZW4vMjsgbiA+PSAxOyBuLS0pIHBxZG93bmhlYXAocywgdHJlZSwgbik7CisKKyAgICAvKiBDb25zdHJ1Y3QgdGhlIEh1ZmZtYW4gdHJlZSBieSByZXBlYXRlZGx5IGNvbWJpbmluZyB0aGUgbGVhc3QgdHdvCisgICAgICogZnJlcXVlbnQgbm9kZXMuCisgICAgICovCisgICAgbm9kZSA9IGVsZW1zOyAgICAgICAgICAgICAgLyogbmV4dCBpbnRlcm5hbCBub2RlIG9mIHRoZSB0cmVlICovCisgICAgZG8geworICAgICAgICBwcXJlbW92ZShzLCB0cmVlLCBuKTsgIC8qIG4gPSBub2RlIG9mIGxlYXN0IGZyZXF1ZW5jeSAqLworICAgICAgICBtID0gcy0+aGVhcFtTTUFMTEVTVF07IC8qIG0gPSBub2RlIG9mIG5leHQgbGVhc3QgZnJlcXVlbmN5ICovCisKKyAgICAgICAgcy0+aGVhcFstLShzLT5oZWFwX21heCldID0gbjsgLyoga2VlcCB0aGUgbm9kZXMgc29ydGVkIGJ5IGZyZXF1ZW5jeSAqLworICAgICAgICBzLT5oZWFwWy0tKHMtPmhlYXBfbWF4KV0gPSBtOworCisgICAgICAgIC8qIENyZWF0ZSBhIG5ldyBub2RlIGZhdGhlciBvZiBuIGFuZCBtICovCisgICAgICAgIHRyZWVbbm9kZV0uRnJlcSA9IHRyZWVbbl0uRnJlcSArIHRyZWVbbV0uRnJlcTsKKyAgICAgICAgcy0+ZGVwdGhbbm9kZV0gPSAodWNoKSgocy0+ZGVwdGhbbl0gPj0gcy0+ZGVwdGhbbV0gPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5kZXB0aFtuXSA6IHMtPmRlcHRoW21dKSArIDEpOworICAgICAgICB0cmVlW25dLkRhZCA9IHRyZWVbbV0uRGFkID0gKHVzaClub2RlOworI2lmZGVmIERVTVBfQkxfVFJFRQorICAgICAgICBpZiAodHJlZSA9PSBzLT5ibF90cmVlKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwiXG5ub2RlICVkKCVkKSwgc29ucyAlZCglZCkgJWQoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgbm9kZSwgdHJlZVtub2RlXS5GcmVxLCBuLCB0cmVlW25dLkZyZXEsIG0sIHRyZWVbbV0uRnJlcSk7CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAvKiBhbmQgaW5zZXJ0IHRoZSBuZXcgbm9kZSBpbiB0aGUgaGVhcCAqLworICAgICAgICBzLT5oZWFwW1NNQUxMRVNUXSA9IG5vZGUrKzsKKyAgICAgICAgcHFkb3duaGVhcChzLCB0cmVlLCBTTUFMTEVTVCk7CisKKyAgICB9IHdoaWxlIChzLT5oZWFwX2xlbiA+PSAyKTsKKworICAgIHMtPmhlYXBbLS0ocy0+aGVhcF9tYXgpXSA9IHMtPmhlYXBbU01BTExFU1RdOworCisgICAgLyogQXQgdGhpcyBwb2ludCwgdGhlIGZpZWxkcyBmcmVxIGFuZCBkYWQgYXJlIHNldC4gV2UgY2FuIG5vdworICAgICAqIGdlbmVyYXRlIHRoZSBiaXQgbGVuZ3Rocy4KKyAgICAgKi8KKyAgICBnZW5fYml0bGVuKHMsICh0cmVlX2Rlc2MgKilkZXNjKTsKKworICAgIC8qIFRoZSBmaWVsZCBsZW4gaXMgbm93IHNldCwgd2UgY2FuIGdlbmVyYXRlIHRoZSBiaXQgY29kZXMgKi8KKyAgICBnZW5fY29kZXMgKChjdF9kYXRhICopdHJlZSwgbWF4X2NvZGUsIHMtPmJsX2NvdW50KTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTY2FuIGEgbGl0ZXJhbCBvciBkaXN0YW5jZSB0cmVlIHRvIGRldGVybWluZSB0aGUgZnJlcXVlbmNpZXMgb2YgdGhlIGNvZGVzCisgKiBpbiB0aGUgYml0IGxlbmd0aCB0cmVlLgorICovCitsb2NhbCB2b2lkIHNjYW5fdHJlZSAocywgdHJlZSwgbWF4X2NvZGUpCisgICAgZGVmbGF0ZV9zdGF0ZSAqczsKKyAgICBjdF9kYXRhICp0cmVlOyAgIC8qIHRoZSB0cmVlIHRvIGJlIHNjYW5uZWQgKi8KKyAgICBpbnQgbWF4X2NvZGU7ICAgIC8qIGFuZCBpdHMgbGFyZ2VzdCBjb2RlIG9mIG5vbiB6ZXJvIGZyZXF1ZW5jeSAqLworeworICAgIGludCBuOyAgICAgICAgICAgICAgICAgICAgIC8qIGl0ZXJhdGVzIG92ZXIgYWxsIHRyZWUgZWxlbWVudHMgKi8KKyAgICBpbnQgcHJldmxlbiA9IC0xOyAgICAgICAgICAvKiBsYXN0IGVtaXR0ZWQgbGVuZ3RoICovCisgICAgaW50IGN1cmxlbjsgICAgICAgICAgICAgICAgLyogbGVuZ3RoIG9mIGN1cnJlbnQgY29kZSAqLworICAgIGludCBuZXh0bGVuID0gdHJlZVswXS5MZW47IC8qIGxlbmd0aCBvZiBuZXh0IGNvZGUgKi8KKyAgICBpbnQgY291bnQgPSAwOyAgICAgICAgICAgICAvKiByZXBlYXQgY291bnQgb2YgdGhlIGN1cnJlbnQgY29kZSAqLworICAgIGludCBtYXhfY291bnQgPSA3OyAgICAgICAgIC8qIG1heCByZXBlYXQgY291bnQgKi8KKyAgICBpbnQgbWluX2NvdW50ID0gNDsgICAgICAgICAvKiBtaW4gcmVwZWF0IGNvdW50ICovCisKKyAgICBpZiAobmV4dGxlbiA9PSAwKSBtYXhfY291bnQgPSAxMzgsIG1pbl9jb3VudCA9IDM7CisgICAgdHJlZVttYXhfY29kZSsxXS5MZW4gPSAodXNoKTB4ZmZmZjsgLyogZ3VhcmQgKi8KKworICAgIGZvciAobiA9IDA7IG4gPD0gbWF4X2NvZGU7IG4rKykgeworICAgICAgICBjdXJsZW4gPSBuZXh0bGVuOyBuZXh0bGVuID0gdHJlZVtuKzFdLkxlbjsKKyAgICAgICAgaWYgKCsrY291bnQgPCBtYXhfY291bnQgJiYgY3VybGVuID09IG5leHRsZW4pIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9IGVsc2UgaWYgKGNvdW50IDwgbWluX2NvdW50KSB7CisgICAgICAgICAgICBzLT5ibF90cmVlW2N1cmxlbl0uRnJlcSArPSBjb3VudDsKKyAgICAgICAgfSBlbHNlIGlmIChjdXJsZW4gIT0gMCkgeworICAgICAgICAgICAgaWYgKGN1cmxlbiAhPSBwcmV2bGVuKSBzLT5ibF90cmVlW2N1cmxlbl0uRnJlcSsrOworICAgICAgICAgICAgcy0+YmxfdHJlZVtSRVBfM182XS5GcmVxKys7CisgICAgICAgIH0gZWxzZSBpZiAoY291bnQgPD0gMTApIHsKKyAgICAgICAgICAgIHMtPmJsX3RyZWVbUkVQWl8zXzEwXS5GcmVxKys7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzLT5ibF90cmVlW1JFUFpfMTFfMTM4XS5GcmVxKys7CisgICAgICAgIH0KKyAgICAgICAgY291bnQgPSAwOyBwcmV2bGVuID0gY3VybGVuOworICAgICAgICBpZiAobmV4dGxlbiA9PSAwKSB7CisgICAgICAgICAgICBtYXhfY291bnQgPSAxMzgsIG1pbl9jb3VudCA9IDM7CisgICAgICAgIH0gZWxzZSBpZiAoY3VybGVuID09IG5leHRsZW4pIHsKKyAgICAgICAgICAgIG1heF9jb3VudCA9IDYsIG1pbl9jb3VudCA9IDM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtYXhfY291bnQgPSA3LCBtaW5fY291bnQgPSA0OworICAgICAgICB9CisgICAgfQorfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNlbmQgYSBsaXRlcmFsIG9yIGRpc3RhbmNlIHRyZWUgaW4gY29tcHJlc3NlZCBmb3JtLCB1c2luZyB0aGUgY29kZXMgaW4KKyAqIGJsX3RyZWUuCisgKi8KK2xvY2FsIHZvaWQgc2VuZF90cmVlIChzLCB0cmVlLCBtYXhfY29kZSkKKyAgICBkZWZsYXRlX3N0YXRlICpzOworICAgIGN0X2RhdGEgKnRyZWU7IC8qIHRoZSB0cmVlIHRvIGJlIHNjYW5uZWQgKi8KKyAgICBpbnQgbWF4X2NvZGU7ICAgICAgIC8qIGFuZCBpdHMgbGFyZ2VzdCBjb2RlIG9mIG5vbiB6ZXJvIGZyZXF1ZW5jeSAqLworeworICAgIGludCBuOyAgICAgICAgICAgICAgICAgICAgIC8qIGl0ZXJhdGVzIG92ZXIgYWxsIHRyZWUgZWxlbWVudHMgKi8KKyAgICBpbnQgcHJldmxlbiA9IC0xOyAgICAgICAgICAvKiBsYXN0IGVtaXR0ZWQgbGVuZ3RoICovCisgICAgaW50IGN1cmxlbjsgICAgICAgICAgICAgICAgLyogbGVuZ3RoIG9mIGN1cnJlbnQgY29kZSAqLworICAgIGludCBuZXh0bGVuID0gdHJlZVswXS5MZW47IC8qIGxlbmd0aCBvZiBuZXh0IGNvZGUgKi8KKyAgICBpbnQgY291bnQgPSAwOyAgICAgICAgICAgICAvKiByZXBlYXQgY291bnQgb2YgdGhlIGN1cnJlbnQgY29kZSAqLworICAgIGludCBtYXhfY291bnQgPSA3OyAgICAgICAgIC8qIG1heCByZXBlYXQgY291bnQgKi8KKyAgICBpbnQgbWluX2NvdW50ID0gNDsgICAgICAgICAvKiBtaW4gcmVwZWF0IGNvdW50ICovCisKKyAgICAvKiB0cmVlW21heF9jb2RlKzFdLkxlbiA9IC0xOyAqLyAgLyogZ3VhcmQgYWxyZWFkeSBzZXQgKi8KKyAgICBpZiAobmV4dGxlbiA9PSAwKSBtYXhfY291bnQgPSAxMzgsIG1pbl9jb3VudCA9IDM7CisKKyAgICBmb3IgKG4gPSAwOyBuIDw9IG1heF9jb2RlOyBuKyspIHsKKyAgICAgICAgY3VybGVuID0gbmV4dGxlbjsgbmV4dGxlbiA9IHRyZWVbbisxXS5MZW47CisgICAgICAgIGlmICgrK2NvdW50IDwgbWF4X2NvdW50ICYmIGN1cmxlbiA9PSBuZXh0bGVuKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfSBlbHNlIGlmIChjb3VudCA8IG1pbl9jb3VudCkgeworICAgICAgICAgICAgZG8geyBzZW5kX2NvZGUocywgY3VybGVuLCBzLT5ibF90cmVlKTsgfSB3aGlsZSAoLS1jb3VudCAhPSAwKTsKKworICAgICAgICB9IGVsc2UgaWYgKGN1cmxlbiAhPSAwKSB7CisgICAgICAgICAgICBpZiAoY3VybGVuICE9IHByZXZsZW4pIHsKKyAgICAgICAgICAgICAgICBzZW5kX2NvZGUocywgY3VybGVuLCBzLT5ibF90cmVlKTsgY291bnQtLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFzc2VydChjb3VudCA+PSAzICYmIGNvdW50IDw9IDYsICIgM182PyIpOworICAgICAgICAgICAgc2VuZF9jb2RlKHMsIFJFUF8zXzYsIHMtPmJsX3RyZWUpOyBzZW5kX2JpdHMocywgY291bnQtMywgMik7CisKKyAgICAgICAgfSBlbHNlIGlmIChjb3VudCA8PSAxMCkgeworICAgICAgICAgICAgc2VuZF9jb2RlKHMsIFJFUFpfM18xMCwgcy0+YmxfdHJlZSk7IHNlbmRfYml0cyhzLCBjb3VudC0zLCAzKTsKKworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2VuZF9jb2RlKHMsIFJFUFpfMTFfMTM4LCBzLT5ibF90cmVlKTsgc2VuZF9iaXRzKHMsIGNvdW50LTExLCA3KTsKKyAgICAgICAgfQorICAgICAgICBjb3VudCA9IDA7IHByZXZsZW4gPSBjdXJsZW47CisgICAgICAgIGlmIChuZXh0bGVuID09IDApIHsKKyAgICAgICAgICAgIG1heF9jb3VudCA9IDEzOCwgbWluX2NvdW50ID0gMzsKKyAgICAgICAgfSBlbHNlIGlmIChjdXJsZW4gPT0gbmV4dGxlbikgeworICAgICAgICAgICAgbWF4X2NvdW50ID0gNiwgbWluX2NvdW50ID0gMzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1heF9jb3VudCA9IDcsIG1pbl9jb3VudCA9IDQ7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29uc3RydWN0IHRoZSBIdWZmbWFuIHRyZWUgZm9yIHRoZSBiaXQgbGVuZ3RocyBhbmQgcmV0dXJuIHRoZSBpbmRleCBpbgorICogYmxfb3JkZXIgb2YgdGhlIGxhc3QgYml0IGxlbmd0aCBjb2RlIHRvIHNlbmQuCisgKi8KK2xvY2FsIGludCBidWlsZF9ibF90cmVlKHMpCisgICAgZGVmbGF0ZV9zdGF0ZSAqczsKK3sKKyAgICBpbnQgbWF4X2JsaW5kZXg7ICAvKiBpbmRleCBvZiBsYXN0IGJpdCBsZW5ndGggY29kZSBvZiBub24gemVybyBmcmVxICovCisKKyAgICAvKiBEZXRlcm1pbmUgdGhlIGJpdCBsZW5ndGggZnJlcXVlbmNpZXMgZm9yIGxpdGVyYWwgYW5kIGRpc3RhbmNlIHRyZWVzICovCisgICAgc2Nhbl90cmVlKHMsIChjdF9kYXRhICopcy0+ZHluX2x0cmVlLCBzLT5sX2Rlc2MubWF4X2NvZGUpOworICAgIHNjYW5fdHJlZShzLCAoY3RfZGF0YSAqKXMtPmR5bl9kdHJlZSwgcy0+ZF9kZXNjLm1heF9jb2RlKTsKKworICAgIC8qIEJ1aWxkIHRoZSBiaXQgbGVuZ3RoIHRyZWU6ICovCisgICAgYnVpbGRfdHJlZShzLCAodHJlZV9kZXNjICopKCYocy0+YmxfZGVzYykpKTsKKyAgICAvKiBvcHRfbGVuIG5vdyBpbmNsdWRlcyB0aGUgbGVuZ3RoIG9mIHRoZSB0cmVlIHJlcHJlc2VudGF0aW9ucywgZXhjZXB0CisgICAgICogdGhlIGxlbmd0aHMgb2YgdGhlIGJpdCBsZW5ndGhzIGNvZGVzIGFuZCB0aGUgNSs1KzQgYml0cyBmb3IgdGhlIGNvdW50cy4KKyAgICAgKi8KKworICAgIC8qIERldGVybWluZSB0aGUgbnVtYmVyIG9mIGJpdCBsZW5ndGggY29kZXMgdG8gc2VuZC4gVGhlIHBremlwIGZvcm1hdAorICAgICAqIHJlcXVpcmVzIHRoYXQgYXQgbGVhc3QgNCBiaXQgbGVuZ3RoIGNvZGVzIGJlIHNlbnQuIChhcHBub3RlLnR4dCBzYXlzCisgICAgICogMyBidXQgdGhlIGFjdHVhbCB2YWx1ZSB1c2VkIGlzIDQuKQorICAgICAqLworICAgIGZvciAobWF4X2JsaW5kZXggPSBCTF9DT0RFUy0xOyBtYXhfYmxpbmRleCA+PSAzOyBtYXhfYmxpbmRleC0tKSB7CisgICAgICAgIGlmIChzLT5ibF90cmVlW2JsX29yZGVyW21heF9ibGluZGV4XV0uTGVuICE9IDApIGJyZWFrOworICAgIH0KKyAgICAvKiBVcGRhdGUgb3B0X2xlbiB0byBpbmNsdWRlIHRoZSBiaXQgbGVuZ3RoIHRyZWUgYW5kIGNvdW50cyAqLworICAgIHMtPm9wdF9sZW4gKz0gMyoobWF4X2JsaW5kZXgrMSkgKyA1KzUrNDsKKyAgICBUcmFjZXYoKHN0ZGVyciwgIlxuZHluIHRyZWVzOiBkeW4gJWxkLCBzdGF0ICVsZCIsCisgICAgICAgICAgICBzLT5vcHRfbGVuLCBzLT5zdGF0aWNfbGVuKSk7CisKKyAgICByZXR1cm4gbWF4X2JsaW5kZXg7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU2VuZCB0aGUgaGVhZGVyIGZvciBhIGJsb2NrIHVzaW5nIGR5bmFtaWMgSHVmZm1hbiB0cmVlczogdGhlIGNvdW50cywgdGhlCisgKiBsZW5ndGhzIG9mIHRoZSBiaXQgbGVuZ3RoIGNvZGVzLCB0aGUgbGl0ZXJhbCB0cmVlIGFuZCB0aGUgZGlzdGFuY2UgdHJlZS4KKyAqIElOIGFzc2VydGlvbjogbGNvZGVzID49IDI1NywgZGNvZGVzID49IDEsIGJsY29kZXMgPj0gNC4KKyAqLworbG9jYWwgdm9pZCBzZW5kX2FsbF90cmVlcyhzLCBsY29kZXMsIGRjb2RlcywgYmxjb2RlcykKKyAgICBkZWZsYXRlX3N0YXRlICpzOworICAgIGludCBsY29kZXMsIGRjb2RlcywgYmxjb2RlczsgLyogbnVtYmVyIG9mIGNvZGVzIGZvciBlYWNoIHRyZWUgKi8KK3sKKyAgICBpbnQgcmFuazsgICAgICAgICAgICAgICAgICAgIC8qIGluZGV4IGluIGJsX29yZGVyICovCisKKyAgICBBc3NlcnQgKGxjb2RlcyA+PSAyNTcgJiYgZGNvZGVzID49IDEgJiYgYmxjb2RlcyA+PSA0LCAibm90IGVub3VnaCBjb2RlcyIpOworICAgIEFzc2VydCAobGNvZGVzIDw9IExfQ09ERVMgJiYgZGNvZGVzIDw9IERfQ09ERVMgJiYgYmxjb2RlcyA8PSBCTF9DT0RFUywKKyAgICAgICAgICAgICJ0b28gbWFueSBjb2RlcyIpOworICAgIFRyYWNldigoc3RkZXJyLCAiXG5ibCBjb3VudHM6ICIpKTsKKyAgICBzZW5kX2JpdHMocywgbGNvZGVzLTI1NywgNSk7IC8qIG5vdCArMjU1IGFzIHN0YXRlZCBpbiBhcHBub3RlLnR4dCAqLworICAgIHNlbmRfYml0cyhzLCBkY29kZXMtMSwgICA1KTsKKyAgICBzZW5kX2JpdHMocywgYmxjb2Rlcy00LCAgNCk7IC8qIG5vdCAtMyBhcyBzdGF0ZWQgaW4gYXBwbm90ZS50eHQgKi8KKyAgICBmb3IgKHJhbmsgPSAwOyByYW5rIDwgYmxjb2RlczsgcmFuaysrKSB7CisgICAgICAgIFRyYWNldigoc3RkZXJyLCAiXG5ibCBjb2RlICUyZCAiLCBibF9vcmRlcltyYW5rXSkpOworICAgICAgICBzZW5kX2JpdHMocywgcy0+YmxfdHJlZVtibF9vcmRlcltyYW5rXV0uTGVuLCAzKTsKKyAgICB9CisgICAgVHJhY2V2KChzdGRlcnIsICJcbmJsIHRyZWU6IHNlbnQgJWxkIiwgcy0+Yml0c19zZW50KSk7CisKKyAgICBzZW5kX3RyZWUocywgKGN0X2RhdGEgKilzLT5keW5fbHRyZWUsIGxjb2Rlcy0xKTsgLyogbGl0ZXJhbCB0cmVlICovCisgICAgVHJhY2V2KChzdGRlcnIsICJcbmxpdCB0cmVlOiBzZW50ICVsZCIsIHMtPmJpdHNfc2VudCkpOworCisgICAgc2VuZF90cmVlKHMsIChjdF9kYXRhICopcy0+ZHluX2R0cmVlLCBkY29kZXMtMSk7IC8qIGRpc3RhbmNlIHRyZWUgKi8KKyAgICBUcmFjZXYoKHN0ZGVyciwgIlxuZGlzdCB0cmVlOiBzZW50ICVsZCIsIHMtPmJpdHNfc2VudCkpOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNlbmQgYSBzdG9yZWQgYmxvY2sKKyAqLwordm9pZCBaTElCX0lOVEVSTkFMIF90cl9zdG9yZWRfYmxvY2socywgYnVmLCBzdG9yZWRfbGVuLCBsYXN0KQorICAgIGRlZmxhdGVfc3RhdGUgKnM7CisgICAgY2hhcmYgKmJ1ZjsgICAgICAgLyogaW5wdXQgYmxvY2sgKi8KKyAgICB1bGcgc3RvcmVkX2xlbjsgICAvKiBsZW5ndGggb2YgaW5wdXQgYmxvY2sgKi8KKyAgICBpbnQgbGFzdDsgICAgICAgICAvKiBvbmUgaWYgdGhpcyBpcyB0aGUgbGFzdCBibG9jayBmb3IgYSBmaWxlICovCit7CisgICAgc2VuZF9iaXRzKHMsIChTVE9SRURfQkxPQ0s8PDEpK2xhc3QsIDMpOyAgICAvKiBzZW5kIGJsb2NrIHR5cGUgKi8KKyNpZmRlZiBERUJVRworICAgIHMtPmNvbXByZXNzZWRfbGVuID0gKHMtPmNvbXByZXNzZWRfbGVuICsgMyArIDcpICYgKHVsZyl+N0w7CisgICAgcy0+Y29tcHJlc3NlZF9sZW4gKz0gKHN0b3JlZF9sZW4gKyA0KSA8PCAzOworI2VuZGlmCisgICAgY29weV9ibG9jayhzLCBidWYsICh1bnNpZ25lZClzdG9yZWRfbGVuLCAxKTsgLyogd2l0aCBoZWFkZXIgKi8KK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGbHVzaCB0aGUgYml0cyBpbiB0aGUgYml0IGJ1ZmZlciB0byBwZW5kaW5nIG91dHB1dCAobGVhdmVzIGF0IG1vc3QgNyBiaXRzKQorICovCit2b2lkIFpMSUJfSU5URVJOQUwgX3RyX2ZsdXNoX2JpdHMocykKKyAgICBkZWZsYXRlX3N0YXRlICpzOworeworICAgIGJpX2ZsdXNoKHMpOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNlbmQgb25lIGVtcHR5IHN0YXRpYyBibG9jayB0byBnaXZlIGVub3VnaCBsb29rYWhlYWQgZm9yIGluZmxhdGUuCisgKiBUaGlzIHRha2VzIDEwIGJpdHMsIG9mIHdoaWNoIDcgbWF5IHJlbWFpbiBpbiB0aGUgYml0IGJ1ZmZlci4KKyAqLwordm9pZCBaTElCX0lOVEVSTkFMIF90cl9hbGlnbihzKQorICAgIGRlZmxhdGVfc3RhdGUgKnM7Cit7CisgICAgc2VuZF9iaXRzKHMsIFNUQVRJQ19UUkVFUzw8MSwgMyk7CisgICAgc2VuZF9jb2RlKHMsIEVORF9CTE9DSywgc3RhdGljX2x0cmVlKTsKKyNpZmRlZiBERUJVRworICAgIHMtPmNvbXByZXNzZWRfbGVuICs9IDEwTDsgLyogMyBmb3IgYmxvY2sgdHlwZSwgNyBmb3IgRU9CICovCisjZW5kaWYKKyAgICBiaV9mbHVzaChzKTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBEZXRlcm1pbmUgdGhlIGJlc3QgZW5jb2RpbmcgZm9yIHRoZSBjdXJyZW50IGJsb2NrOiBkeW5hbWljIHRyZWVzLCBzdGF0aWMKKyAqIHRyZWVzIG9yIHN0b3JlLCBhbmQgb3V0cHV0IHRoZSBlbmNvZGVkIGJsb2NrIHRvIHRoZSB6aXAgZmlsZS4KKyAqLwordm9pZCBaTElCX0lOVEVSTkFMIF90cl9mbHVzaF9ibG9jayhzLCBidWYsIHN0b3JlZF9sZW4sIGxhc3QpCisgICAgZGVmbGF0ZV9zdGF0ZSAqczsKKyAgICBjaGFyZiAqYnVmOyAgICAgICAvKiBpbnB1dCBibG9jaywgb3IgTlVMTCBpZiB0b28gb2xkICovCisgICAgdWxnIHN0b3JlZF9sZW47ICAgLyogbGVuZ3RoIG9mIGlucHV0IGJsb2NrICovCisgICAgaW50IGxhc3Q7ICAgICAgICAgLyogb25lIGlmIHRoaXMgaXMgdGhlIGxhc3QgYmxvY2sgZm9yIGEgZmlsZSAqLworeworICAgIHVsZyBvcHRfbGVuYiwgc3RhdGljX2xlbmI7IC8qIG9wdF9sZW4gYW5kIHN0YXRpY19sZW4gaW4gYnl0ZXMgKi8KKyAgICBpbnQgbWF4X2JsaW5kZXggPSAwOyAgLyogaW5kZXggb2YgbGFzdCBiaXQgbGVuZ3RoIGNvZGUgb2Ygbm9uIHplcm8gZnJlcSAqLworCisgICAgLyogQnVpbGQgdGhlIEh1ZmZtYW4gdHJlZXMgdW5sZXNzIGEgc3RvcmVkIGJsb2NrIGlzIGZvcmNlZCAqLworICAgIGlmIChzLT5sZXZlbCA+IDApIHsKKworICAgICAgICAvKiBDaGVjayBpZiB0aGUgZmlsZSBpcyBiaW5hcnkgb3IgdGV4dCAqLworICAgICAgICBpZiAocy0+c3RybS0+ZGF0YV90eXBlID09IFpfVU5LTk9XTikKKyAgICAgICAgICAgIHMtPnN0cm0tPmRhdGFfdHlwZSA9IGRldGVjdF9kYXRhX3R5cGUocyk7CisKKyAgICAgICAgLyogQ29uc3RydWN0IHRoZSBsaXRlcmFsIGFuZCBkaXN0YW5jZSB0cmVlcyAqLworICAgICAgICBidWlsZF90cmVlKHMsICh0cmVlX2Rlc2MgKikoJihzLT5sX2Rlc2MpKSk7CisgICAgICAgIFRyYWNldigoc3RkZXJyLCAiXG5saXQgZGF0YTogZHluICVsZCwgc3RhdCAlbGQiLCBzLT5vcHRfbGVuLAorICAgICAgICAgICAgICAgIHMtPnN0YXRpY19sZW4pKTsKKworICAgICAgICBidWlsZF90cmVlKHMsICh0cmVlX2Rlc2MgKikoJihzLT5kX2Rlc2MpKSk7CisgICAgICAgIFRyYWNldigoc3RkZXJyLCAiXG5kaXN0IGRhdGE6IGR5biAlbGQsIHN0YXQgJWxkIiwgcy0+b3B0X2xlbiwKKyAgICAgICAgICAgICAgICBzLT5zdGF0aWNfbGVuKSk7CisgICAgICAgIC8qIEF0IHRoaXMgcG9pbnQsIG9wdF9sZW4gYW5kIHN0YXRpY19sZW4gYXJlIHRoZSB0b3RhbCBiaXQgbGVuZ3RocyBvZgorICAgICAgICAgKiB0aGUgY29tcHJlc3NlZCBibG9jayBkYXRhLCBleGNsdWRpbmcgdGhlIHRyZWUgcmVwcmVzZW50YXRpb25zLgorICAgICAgICAgKi8KKworICAgICAgICAvKiBCdWlsZCB0aGUgYml0IGxlbmd0aCB0cmVlIGZvciB0aGUgYWJvdmUgdHdvIHRyZWVzLCBhbmQgZ2V0IHRoZSBpbmRleAorICAgICAgICAgKiBpbiBibF9vcmRlciBvZiB0aGUgbGFzdCBiaXQgbGVuZ3RoIGNvZGUgdG8gc2VuZC4KKyAgICAgICAgICovCisgICAgICAgIG1heF9ibGluZGV4ID0gYnVpbGRfYmxfdHJlZShzKTsKKworICAgICAgICAvKiBEZXRlcm1pbmUgdGhlIGJlc3QgZW5jb2RpbmcuIENvbXB1dGUgdGhlIGJsb2NrIGxlbmd0aHMgaW4gYnl0ZXMuICovCisgICAgICAgIG9wdF9sZW5iID0gKHMtPm9wdF9sZW4rMys3KT4+MzsKKyAgICAgICAgc3RhdGljX2xlbmIgPSAocy0+c3RhdGljX2xlbiszKzcpPj4zOworCisgICAgICAgIFRyYWNldigoc3RkZXJyLCAiXG5vcHQgJWx1KCVsdSkgc3RhdCAlbHUoJWx1KSBzdG9yZWQgJWx1IGxpdCAldSAiLAorICAgICAgICAgICAgICAgIG9wdF9sZW5iLCBzLT5vcHRfbGVuLCBzdGF0aWNfbGVuYiwgcy0+c3RhdGljX2xlbiwgc3RvcmVkX2xlbiwKKyAgICAgICAgICAgICAgICBzLT5sYXN0X2xpdCkpOworCisgICAgICAgIGlmIChzdGF0aWNfbGVuYiA8PSBvcHRfbGVuYikgb3B0X2xlbmIgPSBzdGF0aWNfbGVuYjsKKworICAgIH0gZWxzZSB7CisgICAgICAgIEFzc2VydChidWYgIT0gKGNoYXIqKTAsICJsb3N0IGJ1ZiIpOworICAgICAgICBvcHRfbGVuYiA9IHN0YXRpY19sZW5iID0gc3RvcmVkX2xlbiArIDU7IC8qIGZvcmNlIGEgc3RvcmVkIGJsb2NrICovCisgICAgfQorCisjaWZkZWYgRk9SQ0VfU1RPUkVECisgICAgaWYgKGJ1ZiAhPSAoY2hhciopMCkgeyAvKiBmb3JjZSBzdG9yZWQgYmxvY2sgKi8KKyNlbHNlCisgICAgaWYgKHN0b3JlZF9sZW4rNCA8PSBvcHRfbGVuYiAmJiBidWYgIT0gKGNoYXIqKTApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgLyogNDogdHdvIHdvcmRzIGZvciB0aGUgbGVuZ3RocyAqLworI2VuZGlmCisgICAgICAgIC8qIFRoZSB0ZXN0IGJ1ZiAhPSBOVUxMIGlzIG9ubHkgbmVjZXNzYXJ5IGlmIExJVF9CVUZTSVpFID4gV1NJWkUuCisgICAgICAgICAqIE90aGVyd2lzZSB3ZSBjYW4ndCBoYXZlIHByb2Nlc3NlZCBtb3JlIHRoYW4gV1NJWkUgaW5wdXQgYnl0ZXMgc2luY2UKKyAgICAgICAgICogdGhlIGxhc3QgYmxvY2sgZmx1c2gsIGJlY2F1c2UgY29tcHJlc3Npb24gd291bGQgaGF2ZSBiZWVuCisgICAgICAgICAqIHN1Y2Nlc3NmdWwuIElmIExJVF9CVUZTSVpFIDw9IFdTSVpFLCBpdCBpcyBuZXZlciB0b28gbGF0ZSB0bworICAgICAgICAgKiB0cmFuc2Zvcm0gYSBibG9jayBpbnRvIGEgc3RvcmVkIGJsb2NrLgorICAgICAgICAgKi8KKyAgICAgICAgX3RyX3N0b3JlZF9ibG9jayhzLCBidWYsIHN0b3JlZF9sZW4sIGxhc3QpOworCisjaWZkZWYgRk9SQ0VfU1RBVElDCisgICAgfSBlbHNlIGlmIChzdGF0aWNfbGVuYiA+PSAwKSB7IC8qIGZvcmNlIHN0YXRpYyB0cmVlcyAqLworI2Vsc2UKKyAgICB9IGVsc2UgaWYgKHMtPnN0cmF0ZWd5ID09IFpfRklYRUQgfHwgc3RhdGljX2xlbmIgPT0gb3B0X2xlbmIpIHsKKyNlbmRpZgorICAgICAgICBzZW5kX2JpdHMocywgKFNUQVRJQ19UUkVFUzw8MSkrbGFzdCwgMyk7CisgICAgICAgIGNvbXByZXNzX2Jsb2NrKHMsIChjdF9kYXRhICopc3RhdGljX2x0cmVlLCAoY3RfZGF0YSAqKXN0YXRpY19kdHJlZSk7CisjaWZkZWYgREVCVUcKKyAgICAgICAgcy0+Y29tcHJlc3NlZF9sZW4gKz0gMyArIHMtPnN0YXRpY19sZW47CisjZW5kaWYKKyAgICB9IGVsc2UgeworICAgICAgICBzZW5kX2JpdHMocywgKERZTl9UUkVFUzw8MSkrbGFzdCwgMyk7CisgICAgICAgIHNlbmRfYWxsX3RyZWVzKHMsIHMtPmxfZGVzYy5tYXhfY29kZSsxLCBzLT5kX2Rlc2MubWF4X2NvZGUrMSwKKyAgICAgICAgICAgICAgICAgICAgICAgbWF4X2JsaW5kZXgrMSk7CisgICAgICAgIGNvbXByZXNzX2Jsb2NrKHMsIChjdF9kYXRhICopcy0+ZHluX2x0cmVlLCAoY3RfZGF0YSAqKXMtPmR5bl9kdHJlZSk7CisjaWZkZWYgREVCVUcKKyAgICAgICAgcy0+Y29tcHJlc3NlZF9sZW4gKz0gMyArIHMtPm9wdF9sZW47CisjZW5kaWYKKyAgICB9CisgICAgQXNzZXJ0IChzLT5jb21wcmVzc2VkX2xlbiA9PSBzLT5iaXRzX3NlbnQsICJiYWQgY29tcHJlc3NlZCBzaXplIik7CisgICAgLyogVGhlIGFib3ZlIGNoZWNrIGlzIG1hZGUgbW9kIDJeMzIsIGZvciBmaWxlcyBsYXJnZXIgdGhhbiA1MTIgTUIKKyAgICAgKiBhbmQgdUxvbmcgaW1wbGVtZW50ZWQgb24gMzIgYml0cy4KKyAgICAgKi8KKyAgICBpbml0X2Jsb2NrKHMpOworCisgICAgaWYgKGxhc3QpIHsKKyAgICAgICAgYmlfd2luZHVwKHMpOworI2lmZGVmIERFQlVHCisgICAgICAgIHMtPmNvbXByZXNzZWRfbGVuICs9IDc7ICAvKiBhbGlnbiBvbiBieXRlIGJvdW5kYXJ5ICovCisjZW5kaWYKKyAgICB9CisgICAgVHJhY2V2KChzdGRlcnIsIlxuY29tcHJsZW4gJWx1KCVsdSkgIiwgcy0+Y29tcHJlc3NlZF9sZW4+PjMsCisgICAgICAgICAgIHMtPmNvbXByZXNzZWRfbGVuLTcqbGFzdCkpOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNhdmUgdGhlIG1hdGNoIGluZm8gYW5kIHRhbGx5IHRoZSBmcmVxdWVuY3kgY291bnRzLiBSZXR1cm4gdHJ1ZSBpZgorICogdGhlIGN1cnJlbnQgYmxvY2sgbXVzdCBiZSBmbHVzaGVkLgorICovCitpbnQgWkxJQl9JTlRFUk5BTCBfdHJfdGFsbHkgKHMsIGRpc3QsIGxjKQorICAgIGRlZmxhdGVfc3RhdGUgKnM7CisgICAgdW5zaWduZWQgZGlzdDsgIC8qIGRpc3RhbmNlIG9mIG1hdGNoZWQgc3RyaW5nICovCisgICAgdW5zaWduZWQgbGM7ICAgIC8qIG1hdGNoIGxlbmd0aC1NSU5fTUFUQ0ggb3IgdW5tYXRjaGVkIGNoYXIgKGlmIGRpc3Q9PTApICovCit7CisgICAgcy0+ZF9idWZbcy0+bGFzdF9saXRdID0gKHVzaClkaXN0OworICAgIHMtPmxfYnVmW3MtPmxhc3RfbGl0KytdID0gKHVjaClsYzsKKyAgICBpZiAoZGlzdCA9PSAwKSB7CisgICAgICAgIC8qIGxjIGlzIHRoZSB1bm1hdGNoZWQgY2hhciAqLworICAgICAgICBzLT5keW5fbHRyZWVbbGNdLkZyZXErKzsKKyAgICB9IGVsc2UgeworICAgICAgICBzLT5tYXRjaGVzKys7CisgICAgICAgIC8qIEhlcmUsIGxjIGlzIHRoZSBtYXRjaCBsZW5ndGggLSBNSU5fTUFUQ0ggKi8KKyAgICAgICAgZGlzdC0tOyAgICAgICAgICAgICAvKiBkaXN0ID0gbWF0Y2ggZGlzdGFuY2UgLSAxICovCisgICAgICAgIEFzc2VydCgodXNoKWRpc3QgPCAodXNoKU1BWF9ESVNUKHMpICYmCisgICAgICAgICAgICAgICAodXNoKWxjIDw9ICh1c2gpKE1BWF9NQVRDSC1NSU5fTUFUQ0gpICYmCisgICAgICAgICAgICAgICAodXNoKWRfY29kZShkaXN0KSA8ICh1c2gpRF9DT0RFUywgICJfdHJfdGFsbHk6IGJhZCBtYXRjaCIpOworCisgICAgICAgIHMtPmR5bl9sdHJlZVtfbGVuZ3RoX2NvZGVbbGNdK0xJVEVSQUxTKzFdLkZyZXErKzsKKyAgICAgICAgcy0+ZHluX2R0cmVlW2RfY29kZShkaXN0KV0uRnJlcSsrOworICAgIH0KKworI2lmZGVmIFRSVU5DQVRFX0JMT0NLCisgICAgLyogVHJ5IHRvIGd1ZXNzIGlmIGl0IGlzIHByb2ZpdGFibGUgdG8gc3RvcCB0aGUgY3VycmVudCBibG9jayBoZXJlICovCisgICAgaWYgKChzLT5sYXN0X2xpdCAmIDB4MWZmZikgPT0gMCAmJiBzLT5sZXZlbCA+IDIpIHsKKyAgICAgICAgLyogQ29tcHV0ZSBhbiB1cHBlciBib3VuZCBmb3IgdGhlIGNvbXByZXNzZWQgbGVuZ3RoICovCisgICAgICAgIHVsZyBvdXRfbGVuZ3RoID0gKHVsZylzLT5sYXN0X2xpdCo4TDsKKyAgICAgICAgdWxnIGluX2xlbmd0aCA9ICh1bGcpKChsb25nKXMtPnN0cnN0YXJ0IC0gcy0+YmxvY2tfc3RhcnQpOworICAgICAgICBpbnQgZGNvZGU7CisgICAgICAgIGZvciAoZGNvZGUgPSAwOyBkY29kZSA8IERfQ09ERVM7IGRjb2RlKyspIHsKKyAgICAgICAgICAgIG91dF9sZW5ndGggKz0gKHVsZylzLT5keW5fZHRyZWVbZGNvZGVdLkZyZXEgKgorICAgICAgICAgICAgICAgICg1TCtleHRyYV9kYml0c1tkY29kZV0pOworICAgICAgICB9CisgICAgICAgIG91dF9sZW5ndGggPj49IDM7CisgICAgICAgIFRyYWNldigoc3RkZXJyLCJcbmxhc3RfbGl0ICV1LCBpbiAlbGQsIG91dCB+JWxkKCVsZCUlKSAiLAorICAgICAgICAgICAgICAgcy0+bGFzdF9saXQsIGluX2xlbmd0aCwgb3V0X2xlbmd0aCwKKyAgICAgICAgICAgICAgIDEwMEwgLSBvdXRfbGVuZ3RoKjEwMEwvaW5fbGVuZ3RoKSk7CisgICAgICAgIGlmIChzLT5tYXRjaGVzIDwgcy0+bGFzdF9saXQvMiAmJiBvdXRfbGVuZ3RoIDwgaW5fbGVuZ3RoLzIpIHJldHVybiAxOworICAgIH0KKyNlbmRpZgorICAgIHJldHVybiAocy0+bGFzdF9saXQgPT0gcy0+bGl0X2J1ZnNpemUtMSk7CisgICAgLyogV2UgYXZvaWQgZXF1YWxpdHkgd2l0aCBsaXRfYnVmc2l6ZSBiZWNhdXNlIG9mIHdyYXBhcm91bmQgYXQgNjRLCisgICAgICogb24gMTYgYml0IG1hY2hpbmVzIGFuZCBiZWNhdXNlIHN0b3JlZCBibG9ja3MgYXJlIHJlc3RyaWN0ZWQgdG8KKyAgICAgKiA2NEstMSBieXRlcy4KKyAgICAgKi8KK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTZW5kIHRoZSBibG9jayBkYXRhIGNvbXByZXNzZWQgdXNpbmcgdGhlIGdpdmVuIEh1ZmZtYW4gdHJlZXMKKyAqLworbG9jYWwgdm9pZCBjb21wcmVzc19ibG9jayhzLCBsdHJlZSwgZHRyZWUpCisgICAgZGVmbGF0ZV9zdGF0ZSAqczsKKyAgICBjdF9kYXRhICpsdHJlZTsgLyogbGl0ZXJhbCB0cmVlICovCisgICAgY3RfZGF0YSAqZHRyZWU7IC8qIGRpc3RhbmNlIHRyZWUgKi8KK3sKKyAgICB1bnNpZ25lZCBkaXN0OyAgICAgIC8qIGRpc3RhbmNlIG9mIG1hdGNoZWQgc3RyaW5nICovCisgICAgaW50IGxjOyAgICAgICAgICAgICAvKiBtYXRjaCBsZW5ndGggb3IgdW5tYXRjaGVkIGNoYXIgKGlmIGRpc3QgPT0gMCkgKi8KKyAgICB1bnNpZ25lZCBseCA9IDA7ICAgIC8qIHJ1bm5pbmcgaW5kZXggaW4gbF9idWYgKi8KKyAgICB1bnNpZ25lZCBjb2RlOyAgICAgIC8qIHRoZSBjb2RlIHRvIHNlbmQgKi8KKyAgICBpbnQgZXh0cmE7ICAgICAgICAgIC8qIG51bWJlciBvZiBleHRyYSBiaXRzIHRvIHNlbmQgKi8KKworICAgIGlmIChzLT5sYXN0X2xpdCAhPSAwKSBkbyB7CisgICAgICAgIGRpc3QgPSBzLT5kX2J1ZltseF07CisgICAgICAgIGxjID0gcy0+bF9idWZbbHgrK107CisgICAgICAgIGlmIChkaXN0ID09IDApIHsKKyAgICAgICAgICAgIHNlbmRfY29kZShzLCBsYywgbHRyZWUpOyAvKiBzZW5kIGEgbGl0ZXJhbCBieXRlICovCisgICAgICAgICAgICBUcmFjZWN2KGlzZ3JhcGgobGMpLCAoc3RkZXJyLCIgJyVjJyAiLCBsYykpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogSGVyZSwgbGMgaXMgdGhlIG1hdGNoIGxlbmd0aCAtIE1JTl9NQVRDSCAqLworICAgICAgICAgICAgY29kZSA9IF9sZW5ndGhfY29kZVtsY107CisgICAgICAgICAgICBzZW5kX2NvZGUocywgY29kZStMSVRFUkFMUysxLCBsdHJlZSk7IC8qIHNlbmQgdGhlIGxlbmd0aCBjb2RlICovCisgICAgICAgICAgICBleHRyYSA9IGV4dHJhX2xiaXRzW2NvZGVdOworICAgICAgICAgICAgaWYgKGV4dHJhICE9IDApIHsKKyAgICAgICAgICAgICAgICBsYyAtPSBiYXNlX2xlbmd0aFtjb2RlXTsKKyAgICAgICAgICAgICAgICBzZW5kX2JpdHMocywgbGMsIGV4dHJhKTsgICAgICAgLyogc2VuZCB0aGUgZXh0cmEgbGVuZ3RoIGJpdHMgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRpc3QtLTsgLyogZGlzdCBpcyBub3cgdGhlIG1hdGNoIGRpc3RhbmNlIC0gMSAqLworICAgICAgICAgICAgY29kZSA9IGRfY29kZShkaXN0KTsKKyAgICAgICAgICAgIEFzc2VydCAoY29kZSA8IERfQ09ERVMsICJiYWQgZF9jb2RlIik7CisKKyAgICAgICAgICAgIHNlbmRfY29kZShzLCBjb2RlLCBkdHJlZSk7ICAgICAgIC8qIHNlbmQgdGhlIGRpc3RhbmNlIGNvZGUgKi8KKyAgICAgICAgICAgIGV4dHJhID0gZXh0cmFfZGJpdHNbY29kZV07CisgICAgICAgICAgICBpZiAoZXh0cmEgIT0gMCkgeworICAgICAgICAgICAgICAgIGRpc3QgLT0gYmFzZV9kaXN0W2NvZGVdOworICAgICAgICAgICAgICAgIHNlbmRfYml0cyhzLCBkaXN0LCBleHRyYSk7ICAgLyogc2VuZCB0aGUgZXh0cmEgZGlzdGFuY2UgYml0cyAqLworICAgICAgICAgICAgfQorICAgICAgICB9IC8qIGxpdGVyYWwgb3IgbWF0Y2ggcGFpciA/ICovCisKKyAgICAgICAgLyogQ2hlY2sgdGhhdCB0aGUgb3ZlcmxheSBiZXR3ZWVuIHBlbmRpbmdfYnVmIGFuZCBkX2J1ZitsX2J1ZiBpcyBvazogKi8KKyAgICAgICAgQXNzZXJ0KCh1SW50KShzLT5wZW5kaW5nKSA8IHMtPmxpdF9idWZzaXplICsgMipseCwKKyAgICAgICAgICAgICAgICJwZW5kaW5nQnVmIG92ZXJmbG93Iik7CisKKyAgICB9IHdoaWxlIChseCA8IHMtPmxhc3RfbGl0KTsKKworICAgIHNlbmRfY29kZShzLCBFTkRfQkxPQ0ssIGx0cmVlKTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDaGVjayBpZiB0aGUgZGF0YSB0eXBlIGlzIFRFWFQgb3IgQklOQVJZLCB1c2luZyB0aGUgZm9sbG93aW5nIGFsZ29yaXRobToKKyAqIC0gVEVYVCBpZiB0aGUgdHdvIGNvbmRpdGlvbnMgYmVsb3cgYXJlIHNhdGlzZmllZDoKKyAqICAgIGEpIFRoZXJlIGFyZSBubyBub24tcG9ydGFibGUgY29udHJvbCBjaGFyYWN0ZXJzIGJlbG9uZ2luZyB0byB0aGUKKyAqICAgICAgICJibGFjayBsaXN0IiAoMC4uNiwgMTQuLjI1LCAyOC4uMzEpLgorICogICAgYikgVGhlcmUgaXMgYXQgbGVhc3Qgb25lIHByaW50YWJsZSBjaGFyYWN0ZXIgYmVsb25naW5nIHRvIHRoZQorICogICAgICAgIndoaXRlIGxpc3QiICg5IHtUQUJ9LCAxMCB7TEZ9LCAxMyB7Q1J9LCAzMi4uMjU1KS4KKyAqIC0gQklOQVJZIG90aGVyd2lzZS4KKyAqIC0gVGhlIGZvbGxvd2luZyBwYXJ0aWFsbHktcG9ydGFibGUgY29udHJvbCBjaGFyYWN0ZXJzIGZvcm0gYQorICogICAiZ3JheSBsaXN0IiB0aGF0IGlzIGlnbm9yZWQgaW4gdGhpcyBkZXRlY3Rpb24gYWxnb3JpdGhtOgorICogICAoNyB7QkVMfSwgOCB7QlN9LCAxMSB7VlR9LCAxMiB7RkZ9LCAyNiB7U1VCfSwgMjcge0VTQ30pLgorICogSU4gYXNzZXJ0aW9uOiB0aGUgZmllbGRzIEZyZXEgb2YgZHluX2x0cmVlIGFyZSBzZXQuCisgKi8KK2xvY2FsIGludCBkZXRlY3RfZGF0YV90eXBlKHMpCisgICAgZGVmbGF0ZV9zdGF0ZSAqczsKK3sKKyAgICAvKiBibGFja19tYXNrIGlzIHRoZSBiaXQgbWFzayBvZiBibGFjay1saXN0ZWQgYnl0ZXMKKyAgICAgKiBzZXQgYml0cyAwLi42LCAxNC4uMjUsIGFuZCAyOC4uMzEKKyAgICAgKiAweGYzZmZjMDdmID0gYmluYXJ5IDExMTEwMDExMTExMTExMTExMTAwMDAwMDAxMTExMTExCisgICAgICovCisgICAgdW5zaWduZWQgbG9uZyBibGFja19tYXNrID0gMHhmM2ZmYzA3ZlVMOworICAgIGludCBuOworCisgICAgLyogQ2hlY2sgZm9yIG5vbi10ZXh0dWFsICgiYmxhY2stbGlzdGVkIikgYnl0ZXMuICovCisgICAgZm9yIChuID0gMDsgbiA8PSAzMTsgbisrLCBibGFja19tYXNrID4+PSAxKQorICAgICAgICBpZiAoKGJsYWNrX21hc2sgJiAxKSAmJiAocy0+ZHluX2x0cmVlW25dLkZyZXEgIT0gMCkpCisgICAgICAgICAgICByZXR1cm4gWl9CSU5BUlk7CisKKyAgICAvKiBDaGVjayBmb3IgdGV4dHVhbCAoIndoaXRlLWxpc3RlZCIpIGJ5dGVzLiAqLworICAgIGlmIChzLT5keW5fbHRyZWVbOV0uRnJlcSAhPSAwIHx8IHMtPmR5bl9sdHJlZVsxMF0uRnJlcSAhPSAwCisgICAgICAgICAgICB8fCBzLT5keW5fbHRyZWVbMTNdLkZyZXEgIT0gMCkKKyAgICAgICAgcmV0dXJuIFpfVEVYVDsKKyAgICBmb3IgKG4gPSAzMjsgbiA8IExJVEVSQUxTOyBuKyspCisgICAgICAgIGlmIChzLT5keW5fbHRyZWVbbl0uRnJlcSAhPSAwKQorICAgICAgICAgICAgcmV0dXJuIFpfVEVYVDsKKworICAgIC8qIFRoZXJlIGFyZSBubyAiYmxhY2stbGlzdGVkIiBvciAid2hpdGUtbGlzdGVkIiBieXRlczoKKyAgICAgKiB0aGlzIHN0cmVhbSBlaXRoZXIgaXMgZW1wdHkgb3IgaGFzIHRvbGVyYXRlZCAoImdyYXktbGlzdGVkIikgYnl0ZXMgb25seS4KKyAgICAgKi8KKyAgICByZXR1cm4gWl9CSU5BUlk7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogUmV2ZXJzZSB0aGUgZmlyc3QgbGVuIGJpdHMgb2YgYSBjb2RlLCB1c2luZyBzdHJhaWdodGZvcndhcmQgY29kZSAoYSBmYXN0ZXIKKyAqIG1ldGhvZCB3b3VsZCB1c2UgYSB0YWJsZSkKKyAqIElOIGFzc2VydGlvbjogMSA8PSBsZW4gPD0gMTUKKyAqLworbG9jYWwgdW5zaWduZWQgYmlfcmV2ZXJzZShjb2RlLCBsZW4pCisgICAgdW5zaWduZWQgY29kZTsgLyogdGhlIHZhbHVlIHRvIGludmVydCAqLworICAgIGludCBsZW47ICAgICAgIC8qIGl0cyBiaXQgbGVuZ3RoICovCit7CisgICAgcmVnaXN0ZXIgdW5zaWduZWQgcmVzID0gMDsKKyAgICBkbyB7CisgICAgICAgIHJlcyB8PSBjb2RlICYgMTsKKyAgICAgICAgY29kZSA+Pj0gMSwgcmVzIDw8PSAxOworICAgIH0gd2hpbGUgKC0tbGVuID4gMCk7CisgICAgcmV0dXJuIHJlcyA+PiAxOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZsdXNoIHRoZSBiaXQgYnVmZmVyLCBrZWVwaW5nIGF0IG1vc3QgNyBiaXRzIGluIGl0LgorICovCitsb2NhbCB2b2lkIGJpX2ZsdXNoKHMpCisgICAgZGVmbGF0ZV9zdGF0ZSAqczsKK3sKKyAgICBpZiAocy0+YmlfdmFsaWQgPT0gMTYpIHsKKyAgICAgICAgcHV0X3Nob3J0KHMsIHMtPmJpX2J1Zik7CisgICAgICAgIHMtPmJpX2J1ZiA9IDA7CisgICAgICAgIHMtPmJpX3ZhbGlkID0gMDsKKyAgICB9IGVsc2UgaWYgKHMtPmJpX3ZhbGlkID49IDgpIHsKKyAgICAgICAgcHV0X2J5dGUocywgKEJ5dGUpcy0+YmlfYnVmKTsKKyAgICAgICAgcy0+YmlfYnVmID4+PSA4OworICAgICAgICBzLT5iaV92YWxpZCAtPSA4OworICAgIH0KK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGbHVzaCB0aGUgYml0IGJ1ZmZlciBhbmQgYWxpZ24gdGhlIG91dHB1dCBvbiBhIGJ5dGUgYm91bmRhcnkKKyAqLworbG9jYWwgdm9pZCBiaV93aW5kdXAocykKKyAgICBkZWZsYXRlX3N0YXRlICpzOworeworICAgIGlmIChzLT5iaV92YWxpZCA+IDgpIHsKKyAgICAgICAgcHV0X3Nob3J0KHMsIHMtPmJpX2J1Zik7CisgICAgfSBlbHNlIGlmIChzLT5iaV92YWxpZCA+IDApIHsKKyAgICAgICAgcHV0X2J5dGUocywgKEJ5dGUpcy0+YmlfYnVmKTsKKyAgICB9CisgICAgcy0+YmlfYnVmID0gMDsKKyAgICBzLT5iaV92YWxpZCA9IDA7CisjaWZkZWYgREVCVUcKKyAgICBzLT5iaXRzX3NlbnQgPSAocy0+Yml0c19zZW50KzcpICYgfjc7CisjZW5kaWYKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5IGEgc3RvcmVkIGJsb2NrLCBzdG9yaW5nIGZpcnN0IHRoZSBsZW5ndGggYW5kIGl0cworICogb25lJ3MgY29tcGxlbWVudCBpZiByZXF1ZXN0ZWQuCisgKi8KK2xvY2FsIHZvaWQgY29weV9ibG9jayhzLCBidWYsIGxlbiwgaGVhZGVyKQorICAgIGRlZmxhdGVfc3RhdGUgKnM7CisgICAgY2hhcmYgICAgKmJ1ZjsgICAgLyogdGhlIGlucHV0IGRhdGEgKi8KKyAgICB1bnNpZ25lZCBsZW47ICAgICAvKiBpdHMgbGVuZ3RoICovCisgICAgaW50ICAgICAgaGVhZGVyOyAgLyogdHJ1ZSBpZiBibG9jayBoZWFkZXIgbXVzdCBiZSB3cml0dGVuICovCit7CisgICAgYmlfd2luZHVwKHMpOyAgICAgICAgLyogYWxpZ24gb24gYnl0ZSBib3VuZGFyeSAqLworCisgICAgaWYgKGhlYWRlcikgeworICAgICAgICBwdXRfc2hvcnQocywgKHVzaClsZW4pOworICAgICAgICBwdXRfc2hvcnQocywgKHVzaCl+bGVuKTsKKyNpZmRlZiBERUJVRworICAgICAgICBzLT5iaXRzX3NlbnQgKz0gMioxNjsKKyNlbmRpZgorICAgIH0KKyNpZmRlZiBERUJVRworICAgIHMtPmJpdHNfc2VudCArPSAodWxnKWxlbjw8MzsKKyNlbmRpZgorICAgIHdoaWxlIChsZW4tLSkgeworICAgICAgICBwdXRfYnl0ZShzLCAqYnVmKyspOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3psaWItMS4yLjYvdHJlZXMuaCBiL3psaWItMS4yLjYvdHJlZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzU2MzlkCi0tLSAvZGV2L251bGwKKysrIGIvemxpYi0xLjIuNi90cmVlcy5oCkBAIC0wLDAgKzEsMTI4IEBACisvKiBoZWFkZXIgY3JlYXRlZCBhdXRvbWF0aWNhbGx5IHdpdGggLURHRU5fVFJFRVNfSCAqLworCitsb2NhbCBjb25zdCBjdF9kYXRhIHN0YXRpY19sdHJlZVtMX0NPREVTKzJdID0gewore3sgMTJ9LHsgIDh9fSwge3sxNDB9LHsgIDh9fSwge3sgNzZ9LHsgIDh9fSwge3syMDR9LHsgIDh9fSwge3sgNDR9LHsgIDh9fSwKK3t7MTcyfSx7ICA4fX0sIHt7MTA4fSx7ICA4fX0sIHt7MjM2fSx7ICA4fX0sIHt7IDI4fSx7ICA4fX0sIHt7MTU2fSx7ICA4fX0sCit7eyA5Mn0seyAgOH19LCB7ezIyMH0seyAgOH19LCB7eyA2MH0seyAgOH19LCB7ezE4OH0seyAgOH19LCB7ezEyNH0seyAgOH19LAore3syNTJ9LHsgIDh9fSwge3sgIDJ9LHsgIDh9fSwge3sxMzB9LHsgIDh9fSwge3sgNjZ9LHsgIDh9fSwge3sxOTR9LHsgIDh9fSwKK3t7IDM0fSx7ICA4fX0sIHt7MTYyfSx7ICA4fX0sIHt7IDk4fSx7ICA4fX0sIHt7MjI2fSx7ICA4fX0sIHt7IDE4fSx7ICA4fX0sCit7ezE0Nn0seyAgOH19LCB7eyA4Mn0seyAgOH19LCB7ezIxMH0seyAgOH19LCB7eyA1MH0seyAgOH19LCB7ezE3OH0seyAgOH19LAore3sxMTR9LHsgIDh9fSwge3syNDJ9LHsgIDh9fSwge3sgMTB9LHsgIDh9fSwge3sxMzh9LHsgIDh9fSwge3sgNzR9LHsgIDh9fSwKK3t7MjAyfSx7ICA4fX0sIHt7IDQyfSx7ICA4fX0sIHt7MTcwfSx7ICA4fX0sIHt7MTA2fSx7ICA4fX0sIHt7MjM0fSx7ICA4fX0sCit7eyAyNn0seyAgOH19LCB7ezE1NH0seyAgOH19LCB7eyA5MH0seyAgOH19LCB7ezIxOH0seyAgOH19LCB7eyA1OH0seyAgOH19LAore3sxODZ9LHsgIDh9fSwge3sxMjJ9LHsgIDh9fSwge3syNTB9LHsgIDh9fSwge3sgIDZ9LHsgIDh9fSwge3sxMzR9LHsgIDh9fSwKK3t7IDcwfSx7ICA4fX0sIHt7MTk4fSx7ICA4fX0sIHt7IDM4fSx7ICA4fX0sIHt7MTY2fSx7ICA4fX0sIHt7MTAyfSx7ICA4fX0sCit7ezIzMH0seyAgOH19LCB7eyAyMn0seyAgOH19LCB7ezE1MH0seyAgOH19LCB7eyA4Nn0seyAgOH19LCB7ezIxNH0seyAgOH19LAore3sgNTR9LHsgIDh9fSwge3sxODJ9LHsgIDh9fSwge3sxMTh9LHsgIDh9fSwge3syNDZ9LHsgIDh9fSwge3sgMTR9LHsgIDh9fSwKK3t7MTQyfSx7ICA4fX0sIHt7IDc4fSx7ICA4fX0sIHt7MjA2fSx7ICA4fX0sIHt7IDQ2fSx7ICA4fX0sIHt7MTc0fSx7ICA4fX0sCit7ezExMH0seyAgOH19LCB7ezIzOH0seyAgOH19LCB7eyAzMH0seyAgOH19LCB7ezE1OH0seyAgOH19LCB7eyA5NH0seyAgOH19LAore3syMjJ9LHsgIDh9fSwge3sgNjJ9LHsgIDh9fSwge3sxOTB9LHsgIDh9fSwge3sxMjZ9LHsgIDh9fSwge3syNTR9LHsgIDh9fSwKK3t7ICAxfSx7ICA4fX0sIHt7MTI5fSx7ICA4fX0sIHt7IDY1fSx7ICA4fX0sIHt7MTkzfSx7ICA4fX0sIHt7IDMzfSx7ICA4fX0sCit7ezE2MX0seyAgOH19LCB7eyA5N30seyAgOH19LCB7ezIyNX0seyAgOH19LCB7eyAxN30seyAgOH19LCB7ezE0NX0seyAgOH19LAore3sgODF9LHsgIDh9fSwge3syMDl9LHsgIDh9fSwge3sgNDl9LHsgIDh9fSwge3sxNzd9LHsgIDh9fSwge3sxMTN9LHsgIDh9fSwKK3t7MjQxfSx7ICA4fX0sIHt7ICA5fSx7ICA4fX0sIHt7MTM3fSx7ICA4fX0sIHt7IDczfSx7ICA4fX0sIHt7MjAxfSx7ICA4fX0sCit7eyA0MX0seyAgOH19LCB7ezE2OX0seyAgOH19LCB7ezEwNX0seyAgOH19LCB7ezIzM30seyAgOH19LCB7eyAyNX0seyAgOH19LAore3sxNTN9LHsgIDh9fSwge3sgODl9LHsgIDh9fSwge3syMTd9LHsgIDh9fSwge3sgNTd9LHsgIDh9fSwge3sxODV9LHsgIDh9fSwKK3t7MTIxfSx7ICA4fX0sIHt7MjQ5fSx7ICA4fX0sIHt7ICA1fSx7ICA4fX0sIHt7MTMzfSx7ICA4fX0sIHt7IDY5fSx7ICA4fX0sCit7ezE5N30seyAgOH19LCB7eyAzN30seyAgOH19LCB7ezE2NX0seyAgOH19LCB7ezEwMX0seyAgOH19LCB7ezIyOX0seyAgOH19LAore3sgMjF9LHsgIDh9fSwge3sxNDl9LHsgIDh9fSwge3sgODV9LHsgIDh9fSwge3syMTN9LHsgIDh9fSwge3sgNTN9LHsgIDh9fSwKK3t7MTgxfSx7ICA4fX0sIHt7MTE3fSx7ICA4fX0sIHt7MjQ1fSx7ICA4fX0sIHt7IDEzfSx7ICA4fX0sIHt7MTQxfSx7ICA4fX0sCit7eyA3N30seyAgOH19LCB7ezIwNX0seyAgOH19LCB7eyA0NX0seyAgOH19LCB7ezE3M30seyAgOH19LCB7ezEwOX0seyAgOH19LAore3syMzd9LHsgIDh9fSwge3sgMjl9LHsgIDh9fSwge3sxNTd9LHsgIDh9fSwge3sgOTN9LHsgIDh9fSwge3syMjF9LHsgIDh9fSwKK3t7IDYxfSx7ICA4fX0sIHt7MTg5fSx7ICA4fX0sIHt7MTI1fSx7ICA4fX0sIHt7MjUzfSx7ICA4fX0sIHt7IDE5fSx7ICA5fX0sCit7ezI3NX0seyAgOX19LCB7ezE0N30seyAgOX19LCB7ezQwM30seyAgOX19LCB7eyA4M30seyAgOX19LCB7ezMzOX0seyAgOX19LAore3syMTF9LHsgIDl9fSwge3s0Njd9LHsgIDl9fSwge3sgNTF9LHsgIDl9fSwge3szMDd9LHsgIDl9fSwge3sxNzl9LHsgIDl9fSwKK3t7NDM1fSx7ICA5fX0sIHt7MTE1fSx7ICA5fX0sIHt7MzcxfSx7ICA5fX0sIHt7MjQzfSx7ICA5fX0sIHt7NDk5fSx7ICA5fX0sCit7eyAxMX0seyAgOX19LCB7ezI2N30seyAgOX19LCB7ezEzOX0seyAgOX19LCB7ezM5NX0seyAgOX19LCB7eyA3NX0seyAgOX19LAore3szMzF9LHsgIDl9fSwge3syMDN9LHsgIDl9fSwge3s0NTl9LHsgIDl9fSwge3sgNDN9LHsgIDl9fSwge3syOTl9LHsgIDl9fSwKK3t7MTcxfSx7ICA5fX0sIHt7NDI3fSx7ICA5fX0sIHt7MTA3fSx7ICA5fX0sIHt7MzYzfSx7ICA5fX0sIHt7MjM1fSx7ICA5fX0sCit7ezQ5MX0seyAgOX19LCB7eyAyN30seyAgOX19LCB7ezI4M30seyAgOX19LCB7ezE1NX0seyAgOX19LCB7ezQxMX0seyAgOX19LAore3sgOTF9LHsgIDl9fSwge3szNDd9LHsgIDl9fSwge3syMTl9LHsgIDl9fSwge3s0NzV9LHsgIDl9fSwge3sgNTl9LHsgIDl9fSwKK3t7MzE1fSx7ICA5fX0sIHt7MTg3fSx7ICA5fX0sIHt7NDQzfSx7ICA5fX0sIHt7MTIzfSx7ICA5fX0sIHt7Mzc5fSx7ICA5fX0sCit7ezI1MX0seyAgOX19LCB7ezUwN30seyAgOX19LCB7eyAgN30seyAgOX19LCB7ezI2M30seyAgOX19LCB7ezEzNX0seyAgOX19LAore3szOTF9LHsgIDl9fSwge3sgNzF9LHsgIDl9fSwge3szMjd9LHsgIDl9fSwge3sxOTl9LHsgIDl9fSwge3s0NTV9LHsgIDl9fSwKK3t7IDM5fSx7ICA5fX0sIHt7Mjk1fSx7ICA5fX0sIHt7MTY3fSx7ICA5fX0sIHt7NDIzfSx7ICA5fX0sIHt7MTAzfSx7ICA5fX0sCit7ezM1OX0seyAgOX19LCB7ezIzMX0seyAgOX19LCB7ezQ4N30seyAgOX19LCB7eyAyM30seyAgOX19LCB7ezI3OX0seyAgOX19LAore3sxNTF9LHsgIDl9fSwge3s0MDd9LHsgIDl9fSwge3sgODd9LHsgIDl9fSwge3szNDN9LHsgIDl9fSwge3syMTV9LHsgIDl9fSwKK3t7NDcxfSx7ICA5fX0sIHt7IDU1fSx7ICA5fX0sIHt7MzExfSx7ICA5fX0sIHt7MTgzfSx7ICA5fX0sIHt7NDM5fSx7ICA5fX0sCit7ezExOX0seyAgOX19LCB7ezM3NX0seyAgOX19LCB7ezI0N30seyAgOX19LCB7ezUwM30seyAgOX19LCB7eyAxNX0seyAgOX19LAore3syNzF9LHsgIDl9fSwge3sxNDN9LHsgIDl9fSwge3szOTl9LHsgIDl9fSwge3sgNzl9LHsgIDl9fSwge3szMzV9LHsgIDl9fSwKK3t7MjA3fSx7ICA5fX0sIHt7NDYzfSx7ICA5fX0sIHt7IDQ3fSx7ICA5fX0sIHt7MzAzfSx7ICA5fX0sIHt7MTc1fSx7ICA5fX0sCit7ezQzMX0seyAgOX19LCB7ezExMX0seyAgOX19LCB7ezM2N30seyAgOX19LCB7ezIzOX0seyAgOX19LCB7ezQ5NX0seyAgOX19LAore3sgMzF9LHsgIDl9fSwge3syODd9LHsgIDl9fSwge3sxNTl9LHsgIDl9fSwge3s0MTV9LHsgIDl9fSwge3sgOTV9LHsgIDl9fSwKK3t7MzUxfSx7ICA5fX0sIHt7MjIzfSx7ICA5fX0sIHt7NDc5fSx7ICA5fX0sIHt7IDYzfSx7ICA5fX0sIHt7MzE5fSx7ICA5fX0sCit7ezE5MX0seyAgOX19LCB7ezQ0N30seyAgOX19LCB7ezEyN30seyAgOX19LCB7ezM4M30seyAgOX19LCB7ezI1NX0seyAgOX19LAore3s1MTF9LHsgIDl9fSwge3sgIDB9LHsgIDd9fSwge3sgNjR9LHsgIDd9fSwge3sgMzJ9LHsgIDd9fSwge3sgOTZ9LHsgIDd9fSwKK3t7IDE2fSx7ICA3fX0sIHt7IDgwfSx7ICA3fX0sIHt7IDQ4fSx7ICA3fX0sIHt7MTEyfSx7ICA3fX0sIHt7ICA4fSx7ICA3fX0sCit7eyA3Mn0seyAgN319LCB7eyA0MH0seyAgN319LCB7ezEwNH0seyAgN319LCB7eyAyNH0seyAgN319LCB7eyA4OH0seyAgN319LAore3sgNTZ9LHsgIDd9fSwge3sxMjB9LHsgIDd9fSwge3sgIDR9LHsgIDd9fSwge3sgNjh9LHsgIDd9fSwge3sgMzZ9LHsgIDd9fSwKK3t7MTAwfSx7ICA3fX0sIHt7IDIwfSx7ICA3fX0sIHt7IDg0fSx7ICA3fX0sIHt7IDUyfSx7ICA3fX0sIHt7MTE2fSx7ICA3fX0sCit7eyAgM30seyAgOH19LCB7ezEzMX0seyAgOH19LCB7eyA2N30seyAgOH19LCB7ezE5NX0seyAgOH19LCB7eyAzNX0seyAgOH19LAore3sxNjN9LHsgIDh9fSwge3sgOTl9LHsgIDh9fSwge3syMjd9LHsgIDh9fQorfTsKKworbG9jYWwgY29uc3QgY3RfZGF0YSBzdGF0aWNfZHRyZWVbRF9DT0RFU10gPSB7Cit7eyAwfSx7IDV9fSwge3sxNn0seyA1fX0sIHt7IDh9LHsgNX19LCB7ezI0fSx7IDV9fSwge3sgNH0seyA1fX0sCit7ezIwfSx7IDV9fSwge3sxMn0seyA1fX0sIHt7Mjh9LHsgNX19LCB7eyAyfSx7IDV9fSwge3sxOH0seyA1fX0sCit7ezEwfSx7IDV9fSwge3syNn0seyA1fX0sIHt7IDZ9LHsgNX19LCB7ezIyfSx7IDV9fSwge3sxNH0seyA1fX0sCit7ezMwfSx7IDV9fSwge3sgMX0seyA1fX0sIHt7MTd9LHsgNX19LCB7eyA5fSx7IDV9fSwge3syNX0seyA1fX0sCit7eyA1fSx7IDV9fSwge3syMX0seyA1fX0sIHt7MTN9LHsgNX19LCB7ezI5fSx7IDV9fSwge3sgM30seyA1fX0sCit7ezE5fSx7IDV9fSwge3sxMX0seyA1fX0sIHt7Mjd9LHsgNX19LCB7eyA3fSx7IDV9fSwge3syM30seyA1fX0KK307CisKK2NvbnN0IHVjaCBaTElCX0lOVEVSTkFMIF9kaXN0X2NvZGVbRElTVF9DT0RFX0xFTl0gPSB7CisgMCwgIDEsICAyLCAgMywgIDQsICA0LCAgNSwgIDUsICA2LCAgNiwgIDYsICA2LCAgNywgIDcsICA3LCAgNywgIDgsICA4LCAgOCwgIDgsCisgOCwgIDgsICA4LCAgOCwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA5LCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsCisxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsCisxMSwgMTEsIDExLCAxMSwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsCisxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTMsIDEzLCAxMywgMTMsCisxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsCisxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgIDAsICAwLCAxNiwgMTcsCisxOCwgMTgsIDE5LCAxOSwgMjAsIDIwLCAyMCwgMjAsIDIxLCAyMSwgMjEsIDIxLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsCisyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsCisyNCwgMjQsIDI0LCAyNCwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsCisyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsCisyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsCisyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsCisyNywgMjcsIDI3LCAyNywgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsCisyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsCisyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsCisyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksCisyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksCisyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksCisyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5Cit9OworCitjb25zdCB1Y2ggWkxJQl9JTlRFUk5BTCBfbGVuZ3RoX2NvZGVbTUFYX01BVENILU1JTl9NQVRDSCsxXT0geworIDAsICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3LCAgOCwgIDgsICA5LCAgOSwgMTAsIDEwLCAxMSwgMTEsIDEyLCAxMiwgMTIsIDEyLAorMTMsIDEzLCAxMywgMTMsIDE0LCAxNCwgMTQsIDE0LCAxNSwgMTUsIDE1LCAxNSwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxOCwgMTgsIDE4LCAxOCwgMTgsIDE4LCAxOCwgMTgsIDE5LCAxOSwgMTksIDE5LAorMTksIDE5LCAxOSwgMTksIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLAorMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIyLCAyMiwgMjIsIDIyLAorMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLAorMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LAorMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LAorMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LAorMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LAorMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LAorMjYsIDI2LCAyNiwgMjYsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LAorMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjgKK307CisKK2xvY2FsIGNvbnN0IGludCBiYXNlX2xlbmd0aFtMRU5HVEhfQ09ERVNdID0geworMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgMTAsIDEyLCAxNCwgMTYsIDIwLCAyNCwgMjgsIDMyLCA0MCwgNDgsIDU2LAorNjQsIDgwLCA5NiwgMTEyLCAxMjgsIDE2MCwgMTkyLCAyMjQsIDAKK307CisKK2xvY2FsIGNvbnN0IGludCBiYXNlX2Rpc3RbRF9DT0RFU10gPSB7CisgICAgMCwgICAgIDEsICAgICAyLCAgICAgMywgICAgIDQsICAgICA2LCAgICAgOCwgICAgMTIsICAgIDE2LCAgICAyNCwKKyAgIDMyLCAgICA0OCwgICAgNjQsICAgIDk2LCAgIDEyOCwgICAxOTIsICAgMjU2LCAgIDM4NCwgICA1MTIsICAgNzY4LAorIDEwMjQsICAxNTM2LCAgMjA0OCwgIDMwNzIsICA0MDk2LCAgNjE0NCwgIDgxOTIsIDEyMjg4LCAxNjM4NCwgMjQ1NzYKK307CisKZGlmZiAtLWdpdCBhL3psaWItMS4yLjYvdW5jb21wci5jIGIvemxpYi0xLjIuNi91bmNvbXByLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ5OGJlMwotLS0gL2Rldi9udWxsCisrKyBiL3psaWItMS4yLjYvdW5jb21wci5jCkBAIC0wLDAgKzEsNTkgQEAKKy8qIHVuY29tcHIuYyAtLSBkZWNvbXByZXNzIGEgbWVtb3J5IGJ1ZmZlcgorICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDMsIDIwMTAgSmVhbi1sb3VwIEdhaWxseS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKKyAqLworCisvKiBAKCMpICRJZCQgKi8KKworI2RlZmluZSBaTElCX0lOVEVSTkFMCisjaW5jbHVkZSAiemxpYi5oIgorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgRGVjb21wcmVzc2VzIHRoZSBzb3VyY2UgYnVmZmVyIGludG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4gIHNvdXJjZUxlbiBpcworICAgdGhlIGJ5dGUgbGVuZ3RoIG9mIHRoZSBzb3VyY2UgYnVmZmVyLiBVcG9uIGVudHJ5LCBkZXN0TGVuIGlzIHRoZSB0b3RhbAorICAgc2l6ZSBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyLCB3aGljaCBtdXN0IGJlIGxhcmdlIGVub3VnaCB0byBob2xkIHRoZQorICAgZW50aXJlIHVuY29tcHJlc3NlZCBkYXRhLiAoVGhlIHNpemUgb2YgdGhlIHVuY29tcHJlc3NlZCBkYXRhIG11c3QgaGF2ZQorICAgYmVlbiBzYXZlZCBwcmV2aW91c2x5IGJ5IHRoZSBjb21wcmVzc29yIGFuZCB0cmFuc21pdHRlZCB0byB0aGUgZGVjb21wcmVzc29yCisgICBieSBzb21lIG1lY2hhbmlzbSBvdXRzaWRlIHRoZSBzY29wZSBvZiB0aGlzIGNvbXByZXNzaW9uIGxpYnJhcnkuKQorICAgVXBvbiBleGl0LCBkZXN0TGVuIGlzIHRoZSBhY3R1YWwgc2l6ZSBvZiB0aGUgY29tcHJlc3NlZCBidWZmZXIuCisKKyAgICAgdW5jb21wcmVzcyByZXR1cm5zIFpfT0sgaWYgc3VjY2VzcywgWl9NRU1fRVJST1IgaWYgdGhlcmUgd2FzIG5vdAorICAgZW5vdWdoIG1lbW9yeSwgWl9CVUZfRVJST1IgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2ggcm9vbSBpbiB0aGUgb3V0cHV0CisgICBidWZmZXIsIG9yIFpfREFUQV9FUlJPUiBpZiB0aGUgaW5wdXQgZGF0YSB3YXMgY29ycnVwdGVkLgorKi8KK2ludCBaRVhQT1JUIHVuY29tcHJlc3MgKGRlc3QsIGRlc3RMZW4sIHNvdXJjZSwgc291cmNlTGVuKQorICAgIEJ5dGVmICpkZXN0OworICAgIHVMb25nZiAqZGVzdExlbjsKKyAgICBjb25zdCBCeXRlZiAqc291cmNlOworICAgIHVMb25nIHNvdXJjZUxlbjsKK3sKKyAgICB6X3N0cmVhbSBzdHJlYW07CisgICAgaW50IGVycjsKKworICAgIHN0cmVhbS5uZXh0X2luID0gKEJ5dGVmKilzb3VyY2U7CisgICAgc3RyZWFtLmF2YWlsX2luID0gKHVJbnQpc291cmNlTGVuOworICAgIC8qIENoZWNrIGZvciBzb3VyY2UgPiA2NEsgb24gMTYtYml0IG1hY2hpbmU6ICovCisgICAgaWYgKCh1TG9uZylzdHJlYW0uYXZhaWxfaW4gIT0gc291cmNlTGVuKSByZXR1cm4gWl9CVUZfRVJST1I7CisKKyAgICBzdHJlYW0ubmV4dF9vdXQgPSBkZXN0OworICAgIHN0cmVhbS5hdmFpbF9vdXQgPSAodUludCkqZGVzdExlbjsKKyAgICBpZiAoKHVMb25nKXN0cmVhbS5hdmFpbF9vdXQgIT0gKmRlc3RMZW4pIHJldHVybiBaX0JVRl9FUlJPUjsKKworICAgIHN0cmVhbS56YWxsb2MgPSAoYWxsb2NfZnVuYykwOworICAgIHN0cmVhbS56ZnJlZSA9IChmcmVlX2Z1bmMpMDsKKworICAgIGVyciA9IGluZmxhdGVJbml0KCZzdHJlYW0pOworICAgIGlmIChlcnIgIT0gWl9PSykgcmV0dXJuIGVycjsKKworICAgIGVyciA9IGluZmxhdGUoJnN0cmVhbSwgWl9GSU5JU0gpOworICAgIGlmIChlcnIgIT0gWl9TVFJFQU1fRU5EKSB7CisgICAgICAgIGluZmxhdGVFbmQoJnN0cmVhbSk7CisgICAgICAgIGlmIChlcnIgPT0gWl9ORUVEX0RJQ1QgfHwgKGVyciA9PSBaX0JVRl9FUlJPUiAmJiBzdHJlYW0uYXZhaWxfaW4gPT0gMCkpCisgICAgICAgICAgICByZXR1cm4gWl9EQVRBX0VSUk9SOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKyAgICAqZGVzdExlbiA9IHN0cmVhbS50b3RhbF9vdXQ7CisKKyAgICBlcnIgPSBpbmZsYXRlRW5kKCZzdHJlYW0pOworICAgIHJldHVybiBlcnI7Cit9CmRpZmYgLS1naXQgYS96bGliLTEuMi42L3dhdGNvbS93YXRjb21fZi5tYWsgYi96bGliLTEuMi42L3dhdGNvbS93YXRjb21fZi5tYWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdmNGQ3NAotLS0gL2Rldi9udWxsCisrKyBiL3psaWItMS4yLjYvd2F0Y29tL3dhdGNvbV9mLm1hawpAQCAtMCwwICsxLDQzIEBACisjIE1ha2VmaWxlIGZvciB6bGliCisjIE9wZW5XYXRjb20gZmxhdCBtb2RlbAorIyBMYXN0IHVwZGF0ZWQ6IDI4LURlYy0yMDA1CisKKyMgVG8gdXNlLCBkbyAid21ha2UgLWYgd2F0Y29tX2YubWFrIgorCitDX1NPVVJDRSA9ICBhZGxlcjMyLmMgIGNvbXByZXNzLmMgY3JjMzIuYyAgIGRlZmxhdGUuYyAgICAmCisJICAgIGd6Y2xvc2UuYyAgZ3psaWIuYyAgICBnenJlYWQuYyAgZ3p3cml0ZS5jICAgICYKKyAgICAgICAgICAgIGluZmJhY2suYyAgaW5mZmFzdC5jICBpbmZsYXRlLmMgaW5mdHJlZXMuYyAgICYKKyAgICAgICAgICAgIHRyZWVzLmMgICAgdW5jb21wci5jICB6dXRpbC5jCisKK09CSlMgPSAgICAgIGFkbGVyMzIub2JqICBjb21wcmVzcy5vYmogY3JjMzIub2JqICAgZGVmbGF0ZS5vYmogICAgJgorCSAgICBnemNsb3NlLm9iaiAgZ3psaWIub2JqICAgIGd6cmVhZC5vYmogIGd6d3JpdGUub2JqICAgICYKKyAgICAgICAgICAgIGluZmJhY2sub2JqICBpbmZmYXN0Lm9iaiAgaW5mbGF0ZS5vYmogaW5mdHJlZXMub2JqICAgJgorICAgICAgICAgICAgdHJlZXMub2JqICAgIHVuY29tcHIub2JqICB6dXRpbC5vYmoKKworQ0MgICAgICAgPSB3Y2MzODYKK0xJTktFUiAgID0gd2NsMzg2CitDRkxBR1MgICA9IC16cSAtbWYgLTNyIC1mcDMgLXMgLWJ0PWRvcyAtb2lscnRmbSAtZnI9bnVsIC13eAorWkxJQl9MSUIgPSB6bGliX2YubGliCisKKy5DLk9CSjoKKyAgICAgICAgJChDQykgJChDRkxBR1MpICRbQAorCithbGw6ICQoWkxJQl9MSUIpIGV4YW1wbGUuZXhlIG1pbmlnemlwLmV4ZQorCiskKFpMSUJfTElCKTogJChPQkpTKQorCXdsaWIgLWIgLWMgJChaTElCX0xJQikgLSthZGxlcjMyLm9iaiAgLStjb21wcmVzcy5vYmogLStjcmMzMi5vYmoKKwl3bGliIC1iIC1jICQoWkxJQl9MSUIpIC0rZ3pjbG9zZS5vYmogIC0rZ3psaWIub2JqICAgIC0rZ3pyZWFkLm9iaiAgIC0rZ3p3cml0ZS5vYmoKKyAgICAgICAgd2xpYiAtYiAtYyAkKFpMSUJfTElCKSAtK2RlZmxhdGUub2JqICAtK2luZmJhY2sub2JqCisgICAgICAgIHdsaWIgLWIgLWMgJChaTElCX0xJQikgLStpbmZmYXN0Lm9iaiAgLStpbmZsYXRlLm9iaiAgLStpbmZ0cmVlcy5vYmoKKyAgICAgICAgd2xpYiAtYiAtYyAkKFpMSUJfTElCKSAtK3RyZWVzLm9iaiAgICAtK3VuY29tcHIub2JqICAtK3p1dGlsLm9iagorCitleGFtcGxlLmV4ZTogJChaTElCX0xJQikgZXhhbXBsZS5vYmoKKwkkKExJTktFUikgLWxkb3MzMmEgLWZlPWV4YW1wbGUuZXhlIGV4YW1wbGUub2JqICQoWkxJQl9MSUIpCisKK21pbmlnemlwLmV4ZTogJChaTElCX0xJQikgbWluaWd6aXAub2JqCisJJChMSU5LRVIpIC1sZG9zMzJhIC1mZT1taW5pZ3ppcC5leGUgbWluaWd6aXAub2JqICQoWkxJQl9MSUIpCisKK2NsZWFuOiAuU1lNQk9MSUMKKyAgICAgICAgICBkZWwgKi5vYmoKKyAgICAgICAgICBkZWwgJChaTElCX0xJQikKKyAgICAgICAgICBAZWNobyBDbGVhbmluZyBkb25lCmRpZmYgLS1naXQgYS96bGliLTEuMi42L3dhdGNvbS93YXRjb21fbC5tYWsgYi96bGliLTEuMi42L3dhdGNvbS93YXRjb21fbC5tYWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTkzZWVkNwotLS0gL2Rldi9udWxsCisrKyBiL3psaWItMS4yLjYvd2F0Y29tL3dhdGNvbV9sLm1hawpAQCAtMCwwICsxLDQzIEBACisjIE1ha2VmaWxlIGZvciB6bGliCisjIE9wZW5XYXRjb20gbGFyZ2UgbW9kZWwKKyMgTGFzdCB1cGRhdGVkOiAyOC1EZWMtMjAwNQorCisjIFRvIHVzZSwgZG8gIndtYWtlIC1mIHdhdGNvbV9sLm1hayIKKworQ19TT1VSQ0UgPSAgYWRsZXIzMi5jICBjb21wcmVzcy5jIGNyYzMyLmMgICBkZWZsYXRlLmMgICAgJgorCSAgICBnemNsb3NlLmMgIGd6bGliLmMgICAgZ3pyZWFkLmMgIGd6d3JpdGUuYyAgICAmCisgICAgICAgICAgICBpbmZiYWNrLmMgIGluZmZhc3QuYyAgaW5mbGF0ZS5jIGluZnRyZWVzLmMgICAmCisgICAgICAgICAgICB0cmVlcy5jICAgIHVuY29tcHIuYyAgenV0aWwuYworCitPQkpTID0gICAgICBhZGxlcjMyLm9iaiAgY29tcHJlc3Mub2JqIGNyYzMyLm9iaiAgIGRlZmxhdGUub2JqICAgICYKKwkgICAgZ3pjbG9zZS5vYmogIGd6bGliLm9iaiAgICBnenJlYWQub2JqICBnendyaXRlLm9iaiAgICAmCisgICAgICAgICAgICBpbmZiYWNrLm9iaiAgaW5mZmFzdC5vYmogIGluZmxhdGUub2JqIGluZnRyZWVzLm9iaiAgICYKKyAgICAgICAgICAgIHRyZWVzLm9iaiAgICB1bmNvbXByLm9iaiAgenV0aWwub2JqCisKK0NDICAgICAgID0gd2NjCitMSU5LRVIgICA9IHdjbAorQ0ZMQUdTICAgPSAtenEgLW1sIC1zIC1idD1kb3MgLW9pbHJ0Zm0gLWZyPW51bCAtd3gKK1pMSUJfTElCID0gemxpYl9sLmxpYgorCisuQy5PQko6CisgICAgICAgICQoQ0MpICQoQ0ZMQUdTKSAkW0AKKworYWxsOiAkKFpMSUJfTElCKSBleGFtcGxlLmV4ZSBtaW5pZ3ppcC5leGUKKworJChaTElCX0xJQik6ICQoT0JKUykKKwl3bGliIC1iIC1jICQoWkxJQl9MSUIpIC0rYWRsZXIzMi5vYmogIC0rY29tcHJlc3Mub2JqIC0rY3JjMzIub2JqCisJd2xpYiAtYiAtYyAkKFpMSUJfTElCKSAtK2d6Y2xvc2Uub2JqICAtK2d6bGliLm9iaiAgICAtK2d6cmVhZC5vYmogICAtK2d6d3JpdGUub2JqCisgICAgICAgIHdsaWIgLWIgLWMgJChaTElCX0xJQikgLStkZWZsYXRlLm9iaiAgLStpbmZiYWNrLm9iagorICAgICAgICB3bGliIC1iIC1jICQoWkxJQl9MSUIpIC0raW5mZmFzdC5vYmogIC0raW5mbGF0ZS5vYmogIC0raW5mdHJlZXMub2JqCisgICAgICAgIHdsaWIgLWIgLWMgJChaTElCX0xJQikgLSt0cmVlcy5vYmogICAgLSt1bmNvbXByLm9iaiAgLSt6dXRpbC5vYmoKKworZXhhbXBsZS5leGU6ICQoWkxJQl9MSUIpIGV4YW1wbGUub2JqCisJJChMSU5LRVIpIC1mZT1leGFtcGxlLmV4ZSBleGFtcGxlLm9iaiAkKFpMSUJfTElCKQorCittaW5pZ3ppcC5leGU6ICQoWkxJQl9MSUIpIG1pbmlnemlwLm9iagorCSQoTElOS0VSKSAtZmU9bWluaWd6aXAuZXhlIG1pbmlnemlwLm9iaiAkKFpMSUJfTElCKQorCitjbGVhbjogLlNZTUJPTElDCisgICAgICAgICAgZGVsICoub2JqCisgICAgICAgICAgZGVsICQoWkxJQl9MSUIpCisgICAgICAgICAgQGVjaG8gQ2xlYW5pbmcgZG9uZQpkaWZmIC0tZ2l0IGEvemxpYi0xLjIuNi93aW4zMi9ETExfRkFRLnR4dCBiL3psaWItMS4yLjYvd2luMzIvRExMX0ZBUS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJjMDA5MAotLS0gL2Rldi9udWxsCisrKyBiL3psaWItMS4yLjYvd2luMzIvRExMX0ZBUS50eHQKQEAgLTAsMCArMSwzOTcgQEAKKworICAgICAgICAgICAgRnJlcXVlbnRseSBBc2tlZCBRdWVzdGlvbnMgYWJvdXQgWkxJQjEuRExMCisKKworVGhpcyBkb2N1bWVudCBkZXNjcmliZXMgdGhlIGRlc2lnbiwgdGhlIHJhdGlvbmFsZSwgYW5kIHRoZSB1c2FnZQorb2YgdGhlIG9mZmljaWFsIERMTCBidWlsZCBvZiB6bGliLCBuYW1lZCBaTElCMS5ETEwuICBJZiB5b3UgaGF2ZQorZ2VuZXJhbCBxdWVzdGlvbnMgYWJvdXQgemxpYiwgeW91IHNob3VsZCBzZWUgdGhlIGZpbGUgIkZBUSIgZm91bmQKK2luIHRoZSB6bGliIGRpc3RyaWJ1dGlvbiwgb3IgYXQgdGhlIGZvbGxvd2luZyBsb2NhdGlvbjoKKyAgaHR0cDovL3d3dy5nemlwLm9yZy96bGliL3psaWJfZmFxLmh0bWwKKworCisgMS4gV2hhdCBpcyBaTElCMS5ETEwsIGFuZCBob3cgY2FuIEkgZ2V0IGl0PworCisgIC0gWkxJQjEuRExMIGlzIHRoZSBvZmZpY2lhbCBidWlsZCBvZiB6bGliIGFzIGEgRExMLgorICAgIChQbGVhc2UgcmVtYXJrIHRoZSBjaGFyYWN0ZXIgJzEnIGluIHRoZSBuYW1lLikKKworICAgIFBvaW50ZXJzIHRvIGEgcHJlY29tcGlsZWQgWkxJQjEuRExMIGNhbiBiZSBmb3VuZCBpbiB0aGUgemxpYgorICAgIHdlYiBzaXRlIGF0OgorICAgICAgaHR0cDovL3d3dy56bGliLm5ldC8KKworICAgIEFwcGxpY2F0aW9ucyB0aGF0IGxpbmsgdG8gWkxJQjEuRExMIGNhbiByZWx5IG9uIHRoZSBmb2xsb3dpbmcKKyAgICBzcGVjaWZpY2F0aW9uOgorCisgICAgKiBUaGUgZXhwb3J0ZWQgc3ltYm9scyBhcmUgZXhjbHVzaXZlbHkgZGVmaW5lZCBpbiB0aGUgc291cmNlCisgICAgICBmaWxlcyAiemxpYi5oIiBhbmQgInpsaWIuZGVmIiwgZm91bmQgaW4gYW4gb2ZmaWNpYWwgemxpYgorICAgICAgc291cmNlIGRpc3RyaWJ1dGlvbi4KKyAgICAqIFRoZSBzeW1ib2xzIGFyZSBleHBvcnRlZCBieSBuYW1lLCBub3QgYnkgb3JkaW5hbC4KKyAgICAqIFRoZSBleHBvcnRlZCBuYW1lcyBhcmUgdW5kZWNvcmF0ZWQuCisgICAgKiBUaGUgY2FsbGluZyBjb252ZW50aW9uIG9mIGZ1bmN0aW9ucyBpcyAiQyIgKENERUNMKS4KKyAgICAqIFRoZSBaTElCMS5ETEwgYmluYXJ5IGlzIGxpbmtlZCB0byBNU1ZDUlQuRExMLgorCisgICAgVGhlIGFyY2hpdmUgaW4gd2hpY2ggWkxJQjEuRExMIGlzIGJ1bmRsZWQgY29udGFpbnMgY29tcGlsZWQKKyAgICB0ZXN0IHByb2dyYW1zIHRoYXQgbXVzdCBydW4gd2l0aCBhIHZhbGlkIGJ1aWxkIG9mIFpMSUIxLkRMTC4KKyAgICBJdCBpcyByZWNvbW1lbmRlZCB0byBkb3dubG9hZCB0aGUgcHJlYnVpbHQgRExMIGZyb20gdGhlIHpsaWIKKyAgICB3ZWIgc2l0ZSwgaW5zdGVhZCBvZiBidWlsZGluZyBpdCB5b3Vyc2VsZiwgdG8gYXZvaWQgcG90ZW50aWFsCisgICAgaW5jb21wYXRpYmlsaXRpZXMgdGhhdCBjb3VsZCBiZSBpbnRyb2R1Y2VkIGJ5IHlvdXIgY29tcGlsZXIKKyAgICBhbmQgYnVpbGQgc2V0dGluZ3MuICBJZiB5b3UgZG8gYnVpbGQgdGhlIERMTCB5b3Vyc2VsZiwgcGxlYXNlCisgICAgbWFrZSBzdXJlIHRoYXQgaXQgY29tcGxpZXMgd2l0aCBhbGwgdGhlIGFib3ZlIHJlcXVpcmVtZW50cywKKyAgICBhbmQgaXQgcnVucyB3aXRoIHRoZSBwcmVjb21waWxlZCB0ZXN0IHByb2dyYW1zLCBidW5kbGVkIHdpdGgKKyAgICB0aGUgb3JpZ2luYWwgWkxJQjEuRExMIGRpc3RyaWJ1dGlvbi4KKworICAgIElmLCBmb3IgYW55IHJlYXNvbiwgeW91IG5lZWQgdG8gYnVpbGQgYW4gaW5jb21wYXRpYmxlIERMTCwKKyAgICBwbGVhc2UgdXNlIGEgZGlmZmVyZW50IGZpbGUgbmFtZS4KKworCisgMi4gV2h5IGRpZCB5b3UgY2hhbmdlIHRoZSBuYW1lIG9mIHRoZSBETEwgdG8gWkxJQjEuRExMPworICAgIFdoYXQgaGFwcGVuZWQgdG8gdGhlIG9sZCBaTElCLkRMTD8KKworICAtIFRoZSBvbGQgWkxJQi5ETEwsIGJ1aWx0IGZyb20gemxpYi0xLjEuNCBvciBlYXJsaWVyLCByZXF1aXJlZAorICAgIGNvbXBpbGF0aW9uIHNldHRpbmdzIHRoYXQgd2VyZSBpbmNvbXBhdGlibGUgdG8gdGhvc2UgdXNlZCBieQorICAgIGEgc3RhdGljIGJ1aWxkLiAgVGhlIERMTCBzZXR0aW5ncyB3ZXJlIHN1cHBvc2VkIHRvIGJlIGVuYWJsZWQKKyAgICBieSBkZWZpbmluZyB0aGUgbWFjcm8gWkxJQl9ETEwsIGJlZm9yZSBpbmNsdWRpbmcgInpsaWIuaCIuCisgICAgSW5jb3JyZWN0IGhhbmRsaW5nIG9mIHRoaXMgbWFjcm8gd2FzIHNpbGVudGx5IGFjY2VwdGVkIGF0CisgICAgYnVpbGQgdGltZSwgcmVzdWx0aW5nIGluIHR3byBtYWpvciBwcm9ibGVtczoKKworICAgICogWkxJQl9ETEwgd2FzIG1pc3NpbmcgZnJvbSB0aGUgb2xkIG1ha2VmaWxlLiAgV2hlbiBidWlsZGluZworICAgICAgdGhlIERMTCwgbm90IGFsbCBwZW9wbGUgYWRkZWQgaXQgdG8gdGhlIGJ1aWxkIG9wdGlvbnMuICBJbgorICAgICAgY29uc2VxdWVuY2UsIGluY29tcGF0aWJsZSBpbmNhcm5hdGlvbnMgb2YgWkxJQi5ETEwgc3RhcnRlZAorICAgICAgdG8gY2lyY3VsYXRlIGFyb3VuZCB0aGUgbmV0LgorCisgICAgKiBXaGVuIHN3aXRjaGluZyBmcm9tIHVzaW5nIHRoZSBzdGF0aWMgbGlicmFyeSB0byB1c2luZyB0aGUKKyAgICAgIERMTCwgYXBwbGljYXRpb25zIGhhZCB0byBkZWZpbmUgdGhlIFpMSUJfRExMIG1hY3JvIGFuZAorICAgICAgdG8gcmVjb21waWxlIGFsbCB0aGUgc291cmNlcyB0aGF0IGNvbnRhaW5lZCBjYWxscyB0byB6bGliCisgICAgICBmdW5jdGlvbnMuICBGYWlsdXJlIHRvIGRvIHNvIHJlc3VsdGVkIGluIGNyZWF0aW5nIGJpbmFyaWVzCisgICAgICB0aGF0IHdlcmUgdW5hYmxlIHRvIHJ1biB3aXRoIHRoZSBvZmZpY2lhbCBaTElCLkRMTCBidWlsZC4KKworICAgIFRoZSBvbmx5IHBvc3NpYmxlIHNvbHV0aW9uIHRoYXQgd2UgY291bGQgZm9yZXNlZSB3YXMgdG8gbWFrZQorICAgIGEgYmluYXJ5LWluY29tcGF0aWJsZSBjaGFuZ2UgaW4gdGhlIERMTCBpbnRlcmZhY2UsIGluIG9yZGVyIHRvCisgICAgcmVtb3ZlIHRoZSBkZXBlbmRlbmN5IG9uIHRoZSBaTElCX0RMTCBtYWNybywgYW5kIHRvIHJlbGVhc2UKKyAgICB0aGUgbmV3IERMTCB1bmRlciBhIGRpZmZlcmVudCBuYW1lLgorCisgICAgV2UgY2hvc2UgdGhlIG5hbWUgWkxJQjEuRExMLCB3aGVyZSAnMScgaW5kaWNhdGVzIHRoZSBtYWpvcgorICAgIHpsaWIgdmVyc2lvbiBudW1iZXIuICBXZSBob3BlIHRoYXQgd2Ugd2lsbCBub3QgaGF2ZSB0byBicmVhaworICAgIHRoZSBiaW5hcnkgY29tcGF0aWJpbGl0eSBhZ2FpbiwgYXQgbGVhc3Qgbm90IGFzIGxvbmcgYXMgdGhlCisgICAgemxpYi0xLnggc2VyaWVzIHdpbGwgbGFzdC4KKworICAgIFRoZXJlIGlzIHN0aWxsIGEgWkxJQl9ETEwgbWFjcm8sIHRoYXQgY2FuIHRyaWdnZXIgYSBtb3JlCisgICAgZWZmaWNpZW50IGJ1aWxkIGFuZCB1c2Ugb2YgdGhlIERMTCwgYnV0IGNvbXBhdGliaWxpdHkgbm8KKyAgICBsb25nZXIgZGVwZW5kZW50cyBvbiBpdC4KKworCisgMy4gQ2FuIEkgYnVpbGQgWkxJQi5ETEwgZnJvbSB0aGUgbmV3IHpsaWIgc291cmNlcywgYW5kIHJlcGxhY2UKKyAgICBhbiBvbGQgWkxJQi5ETEwsIHRoYXQgd2FzIGJ1aWx0IGZyb20gemxpYi0xLjEuNCBvciBlYXJsaWVyPworCisgIC0gSW4gcHJpbmNpcGxlLCB5b3UgY2FuIGRvIGl0IGJ5IGFzc2lnbmluZyBjYWxsaW5nIGNvbnZlbnRpb24KKyAgICBrZXl3b3JkcyB0byB0aGUgbWFjcm9zIFpFWFBPUlQgYW5kIFpFWFBPUlRWQS4gIEluIHByYWN0aWNlLAorICAgIGl0IGRlcGVuZHMgb24gd2hhdCB5b3UgbWVhbiBieSAiYW4gb2xkIFpMSUIuRExMIiwgYmVjYXVzZSB0aGUKKyAgICBvbGQgRExMIGV4aXN0cyBpbiBzZXZlcmFsIG11dHVhbGx5LWluY29tcGF0aWJsZSB2ZXJzaW9ucy4KKyAgICBZb3UgaGF2ZSB0byBmaW5kIG91dCBmaXJzdCB3aGF0IGtpbmQgb2YgY2FsbGluZyBjb252ZW50aW9uIGlzCisgICAgYmVpbmcgdXNlZCBpbiB5b3VyIHBhcnRpY3VsYXIgWkxJQi5ETEwgYnVpbGQsIGFuZCB0byB1c2UgdGhlCisgICAgc2FtZSBvbmUgaW4gdGhlIG5ldyBidWlsZC4gIElmIHlvdSBkb24ndCBrbm93IHdoYXQgdGhpcyBpcyBhbGwKKyAgICBhYm91dCwgeW91IG1pZ2h0IGJlIGJldHRlciBvZmYgaWYgeW91IHdvdWxkIGp1c3QgbGVhdmUgdGhlIG9sZAorICAgIERMTCBpbnRhY3QuCisKKworIDQuIENhbiBJIGNvbXBpbGUgbXkgYXBwbGljYXRpb24gdXNpbmcgdGhlIG5ldyB6bGliIGludGVyZmFjZSwgYW5kCisgICAgbGluayBpdCB0byBhbiBvbGQgWkxJQi5ETEwsIHRoYXQgd2FzIGJ1aWx0IGZyb20gemxpYi0xLjEuNCBvcgorICAgIGVhcmxpZXI/CisKKyAgLSBUaGUgb2ZmaWNpYWwgYW5zd2VyIGlzICJubyI7IHRoZSByZWFsIGFuc3dlciBkZXBlbmRzIGFnYWluIG9uCisgICAgd2hhdCBraW5kIG9mIFpMSUIuRExMIHlvdSBoYXZlLiAgRXZlbiBpZiB5b3UgYXJlIGx1Y2t5LCB0aGlzCisgICAgY291cnNlIG9mIGFjdGlvbiBpcyB1bnJlbGlhYmxlLgorCisgICAgSWYgeW91IHJlYnVpbGQgeW91ciBhcHBsaWNhdGlvbiBhbmQgeW91IGludGVuZCB0byB1c2UgYSBuZXdlcgorICAgIHZlcnNpb24gb2YgemxpYiAocG9zdC0gMS4xLjQpLCBpdCBpcyBzdHJvbmdseSByZWNvbW1lbmRlZCB0bworICAgIGxpbmsgaXQgdG8gdGhlIG5ldyBaTElCMS5ETEwuCisKKworIDUuIFdoeSBhcmUgdGhlIHpsaWIgc3ltYm9scyBleHBvcnRlZCBieSBuYW1lLCBhbmQgbm90IGJ5IG9yZGluYWw/CisKKyAgLSBBbHRob3VnaCBleHBvcnRpbmcgc3ltYm9scyBieSBvcmRpbmFsIGlzIGEgbGl0dGxlIGZhc3RlciwgaXQKKyAgICBpcyByaXNreS4gIEFueSBzaW5nbGUgZ2xpdGNoIGluIHRoZSBtYWludGVuYW5jZSBvciB1c2Ugb2YgdGhlCisgICAgREVGIGZpbGUgdGhhdCBjb250YWlucyB0aGUgb3JkaW5hbHMgY2FuIHJlc3VsdCBpbiBpbmNvbXBhdGlibGUKKyAgICBidWlsZHMgYW5kIGZydXN0cmF0aW5nIGNyYXNoZXMuICBTaW1wbHkgcHV0LCB0aGUgYmVuZWZpdHMgb2YKKyAgICBleHBvcnRpbmcgc3ltYm9scyBieSBvcmRpbmFsIGRvIG5vdCBqdXN0aWZ5IHRoZSByaXNrcy4KKworICAgIFRlY2huaWNhbGx5LCBpdCBzaG91bGQgYmUgcG9zc2libGUgdG8gbWFpbnRhaW4gb3JkaW5hbHMgaW4KKyAgICB0aGUgREVGIGZpbGUsIGFuZCBzdGlsbCBleHBvcnQgdGhlIHN5bWJvbHMgYnkgbmFtZS4gIE9yZGluYWxzCisgICAgZXhpc3QgaW4gZXZlcnkgRExMLCBhbmQgZXZlbiBpZiB0aGUgZHluYW1pYyBsaW5raW5nIHBlcmZvcm1lZAorICAgIGF0IHRoZSBETEwgc3RhcnR1cCBpcyBzZWFyY2hpbmcgZm9yIG5hbWVzLCBvcmRpbmFscyBzZXJ2ZSBhcworICAgIGhpbnRzLCBmb3IgYSBmYXN0ZXIgbmFtZSBsb29rdXAuICBIb3dldmVyLCBpZiB0aGUgREVGIGZpbGUKKyAgICBjb250YWlucyBvcmRpbmFscywgdGhlIE1pY3Jvc29mdCBsaW5rZXIgYXV0b21hdGljYWxseSBidWlsZHMKKyAgICBhbiBpbXBsaWIgdGhhdCB3aWxsIGNhdXNlIHRoZSBleGVjdXRhYmxlcyBsaW5rZWQgdG8gaXQgdG8gdXNlCisgICAgdGhvc2Ugb3JkaW5hbHMsIGFuZCBub3QgdGhlIG5hbWVzLiAgSXQgaXMgaW50ZXJlc3RpbmcgdG8KKyAgICBub3RpY2UgdGhhdCB0aGUgR05VIGxpbmtlciBmb3IgV2luMzIgZG9lcyBub3Qgc3VmZmVyIGZyb20gdGhpcworICAgIHByb2JsZW0uCisKKyAgICBJdCBpcyBwb3NzaWJsZSB0byBhdm9pZCB0aGUgREVGIGZpbGUgaWYgdGhlIGV4cG9ydGVkIHN5bWJvbHMKKyAgICBhcmUgYWNjb21wYW5pZWQgYnkgYSAiX19kZWNsc3BlYyhkbGxleHBvcnQpIiBhdHRyaWJ1dGUgaW4gdGhlCisgICAgc291cmNlIGZpbGVzLiAgWW91IGNhbiBkbyB0aGlzIGluIHpsaWIgYnkgcHJlZGVmaW5pbmcgdGhlCisgICAgWkxJQl9ETEwgbWFjcm8uCisKKworIDYuIEkgc2VlIHRoYXQgdGhlIFpMSUIxLkRMTCBmdW5jdGlvbnMgdXNlIHRoZSAiQyIgKENERUNMKSBjYWxsaW5nCisgICAgY29udmVudGlvbi4gIFdoeSBub3QgdXNlIHRoZSBTVERDQUxMIGNvbnZlbnRpb24/CisgICAgU1REQ0FMTCBpcyB0aGUgc3RhbmRhcmQgY29udmVudGlvbiBpbiBXaW4zMiwgYW5kIEkgbmVlZCBpdCBpbgorICAgIG15IFZpc3VhbCBCYXNpYyBwcm9qZWN0IQorCisgICAgKEZvciByZWFkYWJpbGl0eSwgd2UgdXNlIENERUNMIHRvIHJlZmVyIHRvIHRoZSBjb252ZW50aW9uCisgICAgIHRyaWdnZXJlZCBieSB0aGUgIl9fY2RlY2wiIGtleXdvcmQsIFNURENBTEwgdG8gcmVmZXIgdG8KKyAgICAgdGhlIGNvbnZlbnRpb24gdHJpZ2dlcmVkIGJ5ICJfX3N0ZGNhbGwiLCBhbmQgRkFTVENBTEwgdG8KKyAgICAgcmVmZXIgdG8gdGhlIGNvbnZlbnRpb24gdHJpZ2dlcmVkIGJ5ICJfX2Zhc3RjYWxsIi4pCisKKyAgLSBNb3N0IG9mIHRoZSBuYXRpdmUgV2luZG93cyBBUEkgZnVuY3Rpb25zICh3aXRob3V0IHZhcmFyZ3MpIHVzZQorICAgIGluZGVlZCB0aGUgV0lOQVBJIGNvbnZlbnRpb24gKHdoaWNoIHRyYW5zbGF0ZXMgdG8gU1REQ0FMTCBpbgorICAgIFdpbjMyKSwgYnV0IHRoZSBzdGFuZGFyZCBDIGZ1bmN0aW9ucyB1c2UgQ0RFQ0wuICBJZiBhIHVzZXIKKyAgICBhcHBsaWNhdGlvbiBpcyBpbnRyaW5zaWNhbGx5IHRpZWQgdG8gdGhlIFdpbmRvd3MgQVBJIChlLmcuCisgICAgaXQgY2FsbHMgbmF0aXZlIFdpbmRvd3MgQVBJIGZ1bmN0aW9ucyBzdWNoIGFzIENyZWF0ZUZpbGUoKSksCisgICAgc29tZXRpbWVzIGl0IG1ha2VzIHNlbnNlIHRvIGRlY29yYXRlIGl0cyBvd24gZnVuY3Rpb25zIHdpdGgKKyAgICBXSU5BUEkuICBCdXQgaWYgQU5TSSBDIG9yIFBPU0lYIHBvcnRhYmlsaXR5IGlzIGEgZ29hbCAoZS5nLgorICAgIGl0IGNhbGxzIHN0YW5kYXJkIEMgZnVuY3Rpb25zIHN1Y2ggYXMgZm9wZW4oKSksIGl0IGlzIG5vdCBhCisgICAgc291bmQgZGVjaXNpb24gdG8gcmVxdWVzdCB0aGUgaW5jbHVzaW9uIG9mIDx3aW5kb3dzLmg+LCBvciB0bworICAgIHVzZSBub24tQU5TSSBjb25zdHJ1Y3RzLCBmb3IgdGhlIHNvbGUgcHVycG9zZSB0byBtYWtlIHRoZSB1c2VyCisgICAgZnVuY3Rpb25zIFNURENBTEwtYWJsZS4KKworICAgIFRoZSBmdW5jdGlvbmFsaXR5IG9mZmVyZWQgYnkgemxpYiBpcyBub3QgaW4gdGhlIGNhdGVnb3J5IG9mCisgICAgIldpbmRvd3MgZnVuY3Rpb25hbGl0eSIsIGJ1dCBpcyBtb3JlIGxpa2UgIkMgZnVuY3Rpb25hbGl0eSIuCisKKyAgICBUZWNobmljYWxseSwgU1REQ0FMTCBpcyBub3QgYmFkOyBpbiBmYWN0LCBpdCBpcyBzbGlnaHRseQorICAgIGZhc3RlciB0aGFuIENERUNMLCBhbmQgaXQgd29ya3Mgd2l0aCB2YXJpYWJsZS1hcmd1bWVudAorICAgIGZ1bmN0aW9ucywganVzdCBsaWtlIENERUNMLiAgSXQgaXMgdW5mb3J0dW5hdGUgdGhhdCwgaW4gc3BpdGUKKyAgICBvZiB1c2luZyBTVERDQUxMIGluIHRoZSBXaW5kb3dzIEFQSSwgaXQgaXMgbm90IHRoZSBkZWZhdWx0CisgICAgY29udmVudGlvbiB1c2VkIGJ5IHRoZSBDIGNvbXBpbGVycyB0aGF0IHJ1biB1bmRlciBXaW5kb3dzLgorICAgIFRoZSByb290cyBvZiB0aGUgcHJvYmxlbSByZXNpZGUgZGVlcCBpbnNpZGUgdGhlIHVuc2FmZXR5IG9mCisgICAgdGhlIEsmUi1zdHlsZSBmdW5jdGlvbiBwcm90b3R5cGVzLCB3aGVyZSB0aGUgYXJndW1lbnQgdHlwZXMKKyAgICBhcmUgbm90IHNwZWNpZmllZDsgYnV0IHRoYXQgaXMgYW5vdGhlciBzdG9yeSBmb3IgYW5vdGhlciBkYXkuCisKKyAgICBUaGUgcmVtYWluaW5nIGZhY3QgaXMgdGhhdCBDREVDTCBpcyB0aGUgZGVmYXVsdCBjb252ZW50aW9uLgorICAgIEV2ZW4gaWYgYW4gZXhwbGljaXQgY29udmVudGlvbiBpcyBoYXJkLWNvZGVkIGludG8gdGhlIGZ1bmN0aW9uCisgICAgcHJvdG90eXBlcyBpbnNpZGUgQyBoZWFkZXJzLCBwcm9ibGVtcyBtYXkgYXBwZWFyLiAgVGhlCisgICAgbmVjZXNzaXR5IHRvIGV4cG9zZSB0aGUgY29udmVudGlvbiBpbiB1c2VycycgY2FsbGJhY2tzIGlzIG9uZQorICAgIG9mIHRoZXNlIHByb2JsZW1zLgorCisgICAgVGhlIGNhbGxpbmcgY29udmVudGlvbiBpc3N1ZXMgYXJlIGFsc28gaW1wb3J0YW50IHdoZW4gdXNpbmcKKyAgICB6bGliIGluIG90aGVyIHByb2dyYW1taW5nIGxhbmd1YWdlcy4gIFNvbWUgb2YgdGhlbSwgbGlrZSBBZGEKKyAgICAoR05BVCkgYW5kIEZvcnRyYW4gKEdOVSBHNzcpLCBoYXZlIEMgYmluZGluZ3MgaW1wbGVtZW50ZWQKKyAgICBpbml0aWFsbHkgb24gVW5peCwgYW5kIHJlbHlpbmcgb24gdGhlIEMgY2FsbGluZyBjb252ZW50aW9uLgorICAgIE9uIHRoZSBvdGhlciBoYW5kLCB0aGUgcHJlLSAuTkVUIHZlcnNpb25zIG9mIE1pY3Jvc29mdCBWaXN1YWwKKyAgICBCYXNpYyByZXF1aXJlIFNURENBTEwsIHdoaWxlIEJvcmxhbmQgRGVscGhpIHByZWZlcnMsIGFsdGhvdWdoCisgICAgaXQgZG9lcyBub3QgcmVxdWlyZSwgRkFTVENBTEwuCisKKyAgICBJbiBmYWlybmVzcyB0byBhbGwgcG9zc2libGUgdXNlcyBvZiB6bGliIG91dHNpZGUgdGhlIEMKKyAgICBwcm9ncmFtbWluZyBsYW5ndWFnZSwgd2UgY2hvb3NlIHRoZSBkZWZhdWx0ICJDIiBjb252ZW50aW9uLgorICAgIEFueW9uZSBpbnRlcmVzdGVkIGluIGRpZmZlcmVudCBiaW5kaW5ncyBvciBjb252ZW50aW9ucyBpcworICAgIGVuY291cmFnZWQgdG8gbWFpbnRhaW4gc3BlY2lhbGl6ZWQgcHJvamVjdHMuICBUaGUgImNvbnRyaWIvIgorICAgIGRpcmVjdG9yeSBmcm9tIHRoZSB6bGliIGRpc3RyaWJ1dGlvbiBhbHJlYWR5IGhvbGRzIGEgY291cGxlCisgICAgb2YgZm9yZWlnbiBiaW5kaW5ncywgc3VjaCBhcyBBZGEsIEMrKywgYW5kIERlbHBoaS4KKworCisgNy4gSSBuZWVkIGEgRExMIGZvciBteSBWaXN1YWwgQmFzaWMgcHJvamVjdC4gIFdoYXQgY2FuIEkgZG8/CisKKyAgLSBEZWZpbmUgdGhlIFpMSUJfV0lOQVBJIG1hY3JvIGJlZm9yZSBpbmNsdWRpbmcgInpsaWIuaCIsIHdoZW4KKyAgICBidWlsZGluZyBib3RoIHRoZSBETEwgYW5kIHRoZSB1c2VyIGFwcGxpY2F0aW9uIChleGNlcHQgdGhhdAorICAgIHlvdSBkb24ndCBuZWVkIHRvIGRlZmluZSBhbnl0aGluZyB3aGVuIHVzaW5nIHRoZSBETEwgaW4gVmlzdWFsCisgICAgQmFzaWMpLiAgVGhlIFpMSUJfV0lOQVBJIG1hY3JvIHdpbGwgc3dpdGNoIG9uIHRoZSBXSU5BUEkKKyAgICAoU1REQ0FMTCkgY29udmVudGlvbi4gIFRoZSBuYW1lIG9mIHRoaXMgRExMIG11c3QgYmUgZGlmZmVyZW50CisgICAgdGhhbiB0aGUgb2ZmaWNpYWwgWkxJQjEuRExMLgorCisgICAgR2lsbGVzIFZvbGxhbnQgaGFzIGNvbnRyaWJ1dGVkIGEgYnVpbGQgbmFtZWQgWkxJQldBUEkuRExMLAorICAgIHdpdGggdGhlIFpMSUJfV0lOQVBJIG1hY3JvIHR1cm5lZCBvbiwgYW5kIHdpdGggdGhlIG1pbml6aXAKKyAgICBmdW5jdGlvbmFsaXR5IGJ1aWx0IGluLiAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHBsZWFzZSByZWFkCisgICAgdGhlIG5vdGVzIGluc2lkZSAiY29udHJpYi92c3R1ZGlvL3JlYWRtZS50eHQiLCBmb3VuZCBpbiB0aGUKKyAgICB6bGliIGRpc3RyaWJ1dGlvbi4KKworCisgOC4gSSBuZWVkIHRvIHVzZSB6bGliIGluIG15IE1pY3Jvc29mdCAuTkVUIHByb2plY3QuICBXaGF0IGNhbiBJCisgICAgZG8/CisKKyAgLSBIZW5yaWsgUmF2biBoYXMgY29udHJpYnV0ZWQgYSAuTkVUIHdyYXBwZXIgYXJvdW5kIHpsaWIuICBMb29rCisgICAgaW50byBjb250cmliL2RvdHpsaWIvLCBpbnNpZGUgdGhlIHpsaWIgZGlzdHJpYnV0aW9uLgorCisKKyA5LiBJZiBteSBhcHBsaWNhdGlvbiB1c2VzIFpMSUIxLkRMTCwgc2hvdWxkIEkgbGluayBpdCB0bworICAgIE1TVkNSVC5ETEw/ICBXaHk/CisKKyAgLSBJdCBpcyBub3QgcmVxdWlyZWQsIGJ1dCBpdCBpcyByZWNvbW1lbmRlZCB0byBsaW5rIHlvdXIKKyAgICBhcHBsaWNhdGlvbiB0byBNU1ZDUlQuRExMLCBpZiBpdCB1c2VzIFpMSUIxLkRMTC4KKworICAgIFRoZSBleGVjdXRhYmxlcyAoLkVYRSwgLkRMTCwgZXRjLikgdGhhdCBhcmUgaW52b2x2ZWQgaW4gdGhlCisgICAgc2FtZSBwcm9jZXNzIGFuZCBhcmUgdXNpbmcgdGhlIEMgcnVuLXRpbWUgbGlicmFyeSAoaS5lLiB0aGV5CisgICAgYXJlIGNhbGxpbmcgc3RhbmRhcmQgQyBmdW5jdGlvbnMpLCBtdXN0IGxpbmsgdG8gdGhlIHNhbWUKKyAgICBsaWJyYXJ5LiAgVGhlcmUgYXJlIHNldmVyYWwgbGlicmFyaWVzIGluIHRoZSBXaW4zMiBzeXN0ZW06CisgICAgQ1JURExMLkRMTCwgTVNWQ1JULkRMTCwgdGhlIHN0YXRpYyBDIGxpYnJhcmllcywgZXRjLgorICAgIFNpbmNlIFpMSUIxLkRMTCBpcyBsaW5rZWQgdG8gTVNWQ1JULkRMTCwgdGhlIGV4ZWN1dGFibGVzIHRoYXQKKyAgICBkZXBlbmQgb24gaXQgc2hvdWxkIGFsc28gYmUgbGlua2VkIHRvIE1TVkNSVC5ETEwuCisKKworMTAuIFdoeSBhcmUgeW91IHNheWluZyB0aGF0IFpMSUIxLkRMTCBhbmQgbXkgYXBwbGljYXRpb24gc2hvdWxkCisgICAgYmUgbGlua2VkIHRvIHRoZSBzYW1lIEMgcnVuLXRpbWUgKENSVCkgbGlicmFyeT8gIEkgbGlua2VkIG15CisgICAgYXBwbGljYXRpb24gYW5kIG15IERMTHMgdG8gZGlmZmVyZW50IEMgbGlicmFyaWVzIChlLmcuIG15CisgICAgYXBwbGljYXRpb24gdG8gYSBzdGF0aWMgbGlicmFyeSwgYW5kIG15IERMTHMgdG8gTVNWQ1JULkRMTCksCisgICAgYW5kIGV2ZXJ5dGhpbmcgd29ya3MgZmluZS4KKworICAtIElmIGEgdXNlciBsaWJyYXJ5IGludm9rZXMgb25seSBwdXJlIFdpbjMyIEFQSSAoYWNjZXNzaWJsZSB2aWEKKyAgICA8d2luZG93cy5oPiBhbmQgdGhlIHJlbGF0ZWQgaGVhZGVycyksIGl0cyBETEwgYnVpbGQgd2lsbCB3b3JrCisgICAgaW4gYW55IGNvbnRleHQuICBCdXQgaWYgdGhpcyBsaWJyYXJ5IGludm9rZXMgc3RhbmRhcmQgQyBBUEksCisgICAgdGhpbmdzIGdldCBtb3JlIGNvbXBsaWNhdGVkLgorCisgICAgVGhlcmUgaXMgYSBzaW5nbGUgV2luMzIgbGlicmFyeSBpbiBhIFdpbjMyIHN5c3RlbS4gIEV2ZXJ5CisgICAgZnVuY3Rpb24gaW4gdGhpcyBsaWJyYXJ5IHJlc2lkZXMgaW4gYSBzaW5nbGUgRExMIG1vZHVsZSwgdGhhdAorICAgIGlzIHNhZmUgdG8gY2FsbCBmcm9tIGFueXdoZXJlLiAgT24gdGhlIG90aGVyIGhhbmQsIHRoZXJlIGFyZQorICAgIG11bHRpcGxlIHZlcnNpb25zIG9mIHRoZSBDIGxpYnJhcnksIGFuZCBlYWNoIG9mIHRoZW0gaGFzIGl0cworICAgIG93biBzZXBhcmF0ZSBpbnRlcm5hbCBzdGF0ZS4gIFN0YW5kYWxvbmUgZXhlY3V0YWJsZXMgYW5kIHVzZXIKKyAgICBETExzIHRoYXQgY2FsbCBzdGFuZGFyZCBDIGZ1bmN0aW9ucyBtdXN0IGxpbmsgdG8gYSBDIHJ1bi10aW1lCisgICAgKENSVCkgbGlicmFyeSwgYmUgaXQgc3RhdGljIG9yIHNoYXJlZCAoRExMKS4gIEludGVybWl4aW5nCisgICAgb2NjdXJzIHdoZW4gYW4gZXhlY3V0YWJsZSAobm90IG5lY2Vzc2FyaWx5IHN0YW5kYWxvbmUpIGFuZCBhCisgICAgRExMIGFyZSBsaW5rZWQgdG8gZGlmZmVyZW50IENSVHMsIGFuZCBib3RoIGFyZSBydW5uaW5nIGluIHRoZQorICAgIHNhbWUgcHJvY2Vzcy4KKworICAgIEludGVybWl4aW5nIG11bHRpcGxlIENSVHMgaXMgcG9zc2libGUsIGFzIGxvbmcgYXMgdGhlaXIKKyAgICBpbnRlcm5hbCBzdGF0ZXMgYXJlIGtlcHQgaW50YWN0LiAgVGhlIE1pY3Jvc29mdCBLbm93bGVkZ2UgQmFzZQorICAgIGFydGljbGVzIEtCOTQyNDggIkhPV1RPOiBVc2UgdGhlIEMgUnVuLVRpbWUiIGFuZCBLQjE0MDU4NAorICAgICJIT1dUTzogTGluayB3aXRoIHRoZSBDb3JyZWN0IEMgUnVuLVRpbWUgKENSVCkgTGlicmFyeSIKKyAgICBtZW50aW9uIHRoZSBwb3RlbnRpYWwgcHJvYmxlbXMgcmFpc2VkIGJ5IGludGVybWl4aW5nLgorCisgICAgSWYgaW50ZXJtaXhpbmcgd29ya3MgZm9yIHlvdSwgaXQncyBiZWNhdXNlIHlvdXIgYXBwbGljYXRpb24KKyAgICBhbmQgRExMcyBhcmUgYXZvaWRpbmcgdGhlIGNvcnJ1cHRpb24gb2YgZWFjaCBvZiB0aGUgQ1JUcycKKyAgICBpbnRlcm5hbCBzdGF0ZXMsIG1heWJlIGJ5IGNhcmVmdWwgZGVzaWduLCBvciBtYXliZSBieSBmb3J0dW5lLgorCisgICAgQWxzbyBub3RlIHRoYXQgbGlua2luZyBaTElCMS5ETEwgdG8gbm9uLU1pY3Jvc29mdCBDUlRzLCBzdWNoCisgICAgYXMgdGhvc2UgcHJvdmlkZWQgYnkgQm9ybGFuZCwgcmFpc2VzIHNpbWlsYXIgcHJvYmxlbXMuCisKKworMTEuIFdoeSBhcmUgeW91IGxpbmtpbmcgWkxJQjEuRExMIHRvIE1TVkNSVC5ETEw/CisKKyAgLSBNU1ZDUlQuRExMIGV4aXN0cyBvbiBldmVyeSBXaW5kb3dzIDk1IHdpdGggYSBuZXcgc2VydmljZSBwYWNrCisgICAgaW5zdGFsbGVkLCBvciB3aXRoIE1pY3Jvc29mdCBJbnRlcm5ldCBFeHBsb3JlciA0IG9yIGxhdGVyLCBhbmQKKyAgICBvbiBhbGwgb3RoZXIgV2luZG93cyA0Lnggb3IgbGF0ZXIgKFdpbmRvd3MgOTgsIFdpbmRvd3MgTlQgNCwKKyAgICBvciBsYXRlcikuICBJdCBpcyBmcmVlbHkgZGlzdHJpYnV0YWJsZTsgaWYgbm90IHByZXNlbnQgaW4gdGhlCisgICAgc3lzdGVtLCBpdCBjYW4gYmUgZG93bmxvYWRlZCBmcm9tIE1pY3Jvc29mdCBvciBmcm9tIG90aGVyCisgICAgc29mdHdhcmUgcHJvdmlkZXIgZm9yIGZyZWUuCisKKyAgICBUaGUgZmFjdCB0aGF0IE1TVkNSVC5ETEwgZG9lcyBub3QgZXhpc3Qgb24gYSB2aXJnaW4gV2luZG93cyA5NQorICAgIGlzIG5vdCBzbyBwcm9ibGVtYXRpYy4gIFdpbmRvd3MgOTUgaXMgc2NhcmNlbHkgZm91bmQgbm93YWRheXMsCisgICAgTWljcm9zb2Z0IGVuZGVkIGl0cyBzdXBwb3J0IGEgbG9uZyB0aW1lIGFnbywgYW5kIG1hbnkgcmVjZW50CisgICAgYXBwbGljYXRpb25zIGZyb20gdmFyaW91cyB2ZW5kb3JzLCBpbmNsdWRpbmcgTWljcm9zb2Z0LCBkbyBub3QKKyAgICBldmVuIHJ1biBvbiBpdC4gIEZ1cnRoZXJtb3JlLCBubyBzZXJpb3VzIHVzZXIgc2hvdWxkIHJ1bgorICAgIFdpbmRvd3MgOTUgd2l0aG91dCBhIHByb3BlciB1cGRhdGUgaW5zdGFsbGVkLgorCisKKzEyLiBXaHkgYXJlIHlvdSBub3QgbGlua2luZyBaTElCMS5ETEwgdG8KKyAgICA8PG15IGZhdm9yaXRlIEMgcnVuLXRpbWUgbGlicmFyeT4+ID8KKworICAtIFdlIGNvbnNpZGVyZWQgYW5kIGFiYW5kb25lZCB0aGUgZm9sbG93aW5nIGFsdGVybmF0aXZlczoKKworICAgICogTGlua2luZyBaTElCMS5ETEwgdG8gYSBzdGF0aWMgQyBsaWJyYXJ5IChMSUJDLkxJQiwgb3IKKyAgICAgIExJQkNNVC5MSUIpIGlzIG5vdCBhIGdvb2Qgb3B0aW9uLiAgUGVvcGxlIGFyZSB1c2luZyB0aGUgRExMCisgICAgICBtYWlubHkgdG8gc2F2ZSBkaXNrIHNwYWNlLiAgSWYgeW91IGFyZSBsaW5raW5nIHlvdXIgcHJvZ3JhbQorICAgICAgdG8gYSBzdGF0aWMgQyBsaWJyYXJ5LCB5b3UgbWF5IGFzIHdlbGwgY29uc2lkZXIgbGlua2luZyB6bGliCisgICAgICBpbiBzdGF0aWNhbGx5LCB0b28uCisKKyAgICAqIExpbmtpbmcgWkxJQjEuRExMIHRvIENSVERMTC5ETEwgbG9va3MgYXBwZWFsaW5nLCBiZWNhdXNlCisgICAgICBDUlRETEwuRExMIGlzIHByZXNlbnQgb24gZXZlcnkgV2luMzIgaW5zdGFsbGF0aW9uLgorICAgICAgVW5mb3J0dW5hdGVseSwgaXQgaGFzIGEgc2VyaWVzIG9mIHByb2JsZW1zOiBpdCBkb2VzIG5vdAorICAgICAgd29yayBwcm9wZXJseSB3aXRoIE1pY3Jvc29mdCdzIEMrKyBsaWJyYXJpZXMsIGl0IGRvZXMgbm90CisgICAgICBwcm92aWRlIHN1cHBvcnQgZm9yIDY0LWJpdCBmaWxlIG9mZnNldHMsIChhbmQgc28gb24uLi4pLAorICAgICAgYW5kIE1pY3Jvc29mdCBkaXNjb250aW51ZWQgaXRzIHN1cHBvcnQgYSBsb25nIHRpbWUgYWdvLgorCisgICAgKiBMaW5raW5nIFpMSUIxLkRMTCB0byBNU1ZDUjcwLkRMTCBvciBNU1ZDUjcxLkRMTCwgc3VwcGxpZWQKKyAgICAgIHdpdGggdGhlIE1pY3Jvc29mdCAuTkVUIHBsYXRmb3JtLCBhbmQgVmlzdWFsIEMrKyA3LjAvNy4xLAorICAgICAgcmFpc2VzIHByb2JsZW1zIHJlbGF0ZWQgdG8gdGhlIHN0YXR1cyBvZiBaTElCMS5ETEwgYXMgYQorICAgICAgc3lzdGVtIGNvbXBvbmVudC4gIEFjY29yZGluZyB0byB0aGUgTWljcm9zb2Z0IEtub3dsZWRnZSBCYXNlCisgICAgICBhcnRpY2xlIEtCMzI2OTIyICJJTkZPOiBSZWRpc3RyaWJ1dGlvbiBvZiB0aGUgU2hhcmVkIEMKKyAgICAgIFJ1bnRpbWUgQ29tcG9uZW50IGluIFZpc3VhbCBDKysgLk5FVCIsIE1TVkNSNzAuRExMIGFuZAorICAgICAgTVNWQ1I3MS5ETEwgYXJlIG5vdCBzdXBwb3NlZCB0byBmdW5jdGlvbiBhcyBzeXN0ZW0gRExMcywKKyAgICAgIGJlY2F1c2UgdGhleSBtYXkgY2xhc2ggd2l0aCBNU1ZDUlQuRExMLiAgSW5zdGVhZCwgdGhlCisgICAgICBhcHBsaWNhdGlvbidzIGluc3RhbGxlciBpcyBzdXBwb3NlZCB0byBwdXQgdGhlc2UgRExMcworICAgICAgKGlmIG5lZWRlZCkgaW4gdGhlIGFwcGxpY2F0aW9uJ3MgcHJpdmF0ZSBkaXJlY3RvcnkuCisgICAgICBJZiBaTElCMS5ETEwgZGVwZW5kcyBvbiBhIG5vbi1zeXN0ZW0gcnVudGltZSwgaXQgY2Fubm90CisgICAgICBmdW5jdGlvbiBhcyBhIHJlZGlzdHJpYnV0YWJsZSBzeXN0ZW0gY29tcG9uZW50LgorCisgICAgKiBMaW5raW5nIFpMSUIxLkRMTCB0byBub24tTWljcm9zb2Z0IHJ1bnRpbWVzLCBzdWNoIGFzCisgICAgICBCb3JsYW5kJ3MsIG9yIEN5Z3dpbidzLCByYWlzZXMgcHJvYmxlbXMgcmVsYXRlZCB0byB0aGUKKyAgICAgIHJlbGlhYmxlIHByZXNlbmNlIG9mIHRoZXNlIHJ1bnRpbWVzIG9uIFdpbjMyIHN5c3RlbXMuCisgICAgICBJdCdzIGVhc2llciB0byBsZXQgdGhlIERMTCBidWlsZCBvZiB6bGliIHVwIHRvIHRoZSBwZW9wbGUKKyAgICAgIHdobyBkaXN0cmlidXRlIHRoZXNlIHJ1bnRpbWVzLCBhbmQgd2hvIG1heSBwcm9jZWVkIGFzCisgICAgICBleHBsYWluZWQgaW4gdGhlIGFuc3dlciB0byBRdWVzdGlvbiAxNC4KKworCisxMy4gSWYgWkxJQjEuRExMIGNhbm5vdCBiZSBsaW5rZWQgdG8gTVNWQ1I3MC5ETEwgb3IgTVNWQ1I3MS5ETEwsCisgICAgaG93IGNhbiBJIGJ1aWxkL3VzZSBaTElCMS5ETEwgaW4gTWljcm9zb2Z0IFZpc3VhbCBDKysgNy4wCisgICAgKFZpc3VhbCBTdHVkaW8gLk5FVCkgb3IgbmV3ZXI/CisKKyAgLSBEdWUgdG8gdGhlIHByb2JsZW1zIGV4cGxhaW5lZCBpbiB0aGUgTWljcm9zb2Z0IEtub3dsZWRnZSBCYXNlCisgICAgYXJ0aWNsZSBLQjMyNjkyMiAoc2VlIHRoZSBwcmV2aW91cyBhbnN3ZXIpLCB0aGUgQyBydW50aW1lIHRoYXQKKyAgICBjb21lcyB3aXRoIHRoZSBWQzcgZW52aXJvbm1lbnQgaXMgbm8gbG9uZ2VyIGNvbnNpZGVyZWQgYQorICAgIHN5c3RlbSBjb21wb25lbnQuICBUaGF0IGlzLCBpdCBzaG91bGQgbm90IGJlIGFzc3VtZWQgdGhhdCB0aGlzCisgICAgcnVudGltZSBleGlzdHMsIG9yIG1heSBiZSBpbnN0YWxsZWQgaW4gYSBzeXN0ZW0gZGlyZWN0b3J5LgorICAgIFNpbmNlIFpMSUIxLkRMTCBpcyBzdXBwb3NlZCB0byBiZSBhIHN5c3RlbSBjb21wb25lbnQsIGl0IG1heQorICAgIG5vdCBkZXBlbmQgb24gYSBub24tc3lzdGVtIGNvbXBvbmVudC4KKworICAgIEluIG9yZGVyIHRvIGxpbmsgWkxJQjEuRExMIGFuZCB5b3VyIGFwcGxpY2F0aW9uIHRvIE1TVkNSVC5ETEwKKyAgICBpbiBWQzcsIHlvdSBuZWVkIHRoZSBsaWJyYXJ5IG9mIFZpc3VhbCBDKysgNi4wIG9yIG9sZGVyLiAgSWYKKyAgICB5b3UgZG9uJ3QgaGF2ZSB0aGlzIGxpYnJhcnkgYXQgaGFuZCwgaXQncyBwcm9iYWJseSBiZXN0IG5vdCB0bworICAgIHVzZSBaTElCMS5ETEwuCisKKyAgICBXZSBhcmUgaG9waW5nIHRoYXQsIGluIHRoZSBmdXR1cmUsIE1pY3Jvc29mdCB3aWxsIHByb3ZpZGUgYQorICAgIHdheSB0byBidWlsZCBhcHBsaWNhdGlvbnMgbGlua2VkIHRvIGEgcHJvcGVyIHN5c3RlbSBydW50aW1lLAorICAgIGZyb20gdGhlIFZpc3VhbCBDKysgZW52aXJvbm1lbnQuICBVbnRpbCB0aGVuLCB5b3UgaGF2ZSBhCisgICAgY291cGxlIG9mIGFsdGVybmF0aXZlcywgc3VjaCBhcyBsaW5raW5nIHpsaWIgaW4gc3RhdGljYWxseS4KKyAgICBJZiB5b3VyIGFwcGxpY2F0aW9uIHJlcXVpcmVzIGR5bmFtaWMgbGlua2luZywgeW91IG1heSBwcm9jZWVkCisgICAgYXMgZXhwbGFpbmVkIGluIHRoZSBhbnN3ZXIgdG8gUXVlc3Rpb24gMTQuCisKKworMTQuIEkgbmVlZCB0byBsaW5rIG15IG93biBETEwgYnVpbGQgdG8gYSBDUlQgZGlmZmVyZW50IHRoYW4KKyAgICBNU1ZDUlQuRExMLiAgV2hhdCBjYW4gSSBkbz8KKworICAtIEZlZWwgZnJlZSB0byByZWJ1aWxkIHRoZSBETEwgZnJvbSB0aGUgemxpYiBzb3VyY2VzLCBhbmQgbGluaworICAgIGl0IHRoZSB3YXkgeW91IHdhbnQuICBZb3Ugc2hvdWxkLCBob3dldmVyLCBjbGVhcmx5IHN0YXRlIHRoYXQKKyAgICB5b3VyIGJ1aWxkIGlzIHVub2ZmaWNpYWwuICBZb3Ugc2hvdWxkIGdpdmUgaXQgYSBkaWZmZXJlbnQgZmlsZQorICAgIG5hbWUsIGFuZC9vciBpbnN0YWxsIGl0IGluIGEgcHJpdmF0ZSBkaXJlY3RvcnkgdGhhdCBjYW4gYmUKKyAgICBhY2Nlc3NlZCBieSB5b3VyIGFwcGxpY2F0aW9uIG9ubHksIGFuZCBpcyBub3QgdmlzaWJsZSB0byB0aGUKKyAgICBvdGhlcnMgKGkuZS4gaXQncyBuZWl0aGVyIGluIHRoZSBQQVRILCBub3IgaW4gdGhlIFNZU1RFTSBvcgorICAgIFNZU1RFTTMyIGRpcmVjdG9yaWVzKS4gIE90aGVyd2lzZSwgeW91ciBidWlsZCBtYXkgY2xhc2ggd2l0aAorICAgIGFwcGxpY2F0aW9ucyB0aGF0IGxpbmsgdG8gdGhlIG9mZmljaWFsIGJ1aWxkLgorCisgICAgRm9yIGV4YW1wbGUsIGluIEN5Z3dpbiwgemxpYiBpcyBsaW5rZWQgdG8gdGhlIEN5Z3dpbiBydW50aW1lCisgICAgQ1lHV0lOMS5ETEwsIGFuZCBpdCBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgbmFtZSBDWUdaLkRMTC4KKworCisxNS4gTWF5IEkgaW5jbHVkZSBhZGRpdGlvbmFsIHBpZWNlcyBvZiBjb2RlIHRoYXQgSSBmaW5kIHVzZWZ1bCwKKyAgICBsaW5rIHRoZW0gaW4gWkxJQjEuRExMLCBhbmQgZXhwb3J0IHRoZW0/CisKKyAgLSBOby4gIEEgbGVnaXRpbWF0ZSBidWlsZCBvZiBaTElCMS5ETEwgbXVzdCBub3QgaW5jbHVkZSBjb2RlCisgICAgdGhhdCBkb2VzIG5vdCBvcmlnaW5hdGUgZnJvbSB0aGUgb2ZmaWNpYWwgemxpYiBzb3VyY2UgY29kZS4KKyAgICBCdXQgeW91IGNhbiBtYWtlIHlvdXIgb3duIHByaXZhdGUgRExMIGJ1aWxkLCB1bmRlciBhIGRpZmZlcmVudAorICAgIGZpbGUgbmFtZSwgYXMgc3VnZ2VzdGVkIGluIHRoZSBwcmV2aW91cyBhbnN3ZXIuCisKKyAgICBGb3IgZXhhbXBsZSwgemxpYiBpcyBhIHBhcnQgb2YgdGhlIFZDTCBsaWJyYXJ5LCBkaXN0cmlidXRlZAorICAgIHdpdGggQm9ybGFuZCBEZWxwaGkgYW5kIEMrKyBCdWlsZGVyLiAgVGhlIERMTCBidWlsZCBvZiBWQ0wKKyAgICBpcyBhIHJlZGlzdHJpYnV0YWJsZSBmaWxlLCBuYW1lZCBWQ0x4eC5ETEwuCisKKworMTYuIE1heSBJIHJlbW92ZSBzb21lIGZ1bmN0aW9uYWxpdHkgb3V0IG9mIFpMSUIxLkRMTCwgYnkgZW5hYmxpbmcKKyAgICBtYWNyb3MgbGlrZSBOT19HWkNPTVBSRVNTIG9yIE5PX0daSVAgYXQgY29tcGlsZSB0aW1lPworCisgIC0gTm8uICBBIGxlZ2l0aW1hdGUgYnVpbGQgb2YgWkxJQjEuRExMIG11c3QgcHJvdmlkZSB0aGUgY29tcGxldGUKKyAgICB6bGliIGZ1bmN0aW9uYWxpdHksIGFzIGltcGxlbWVudGVkIGluIHRoZSBvZmZpY2lhbCB6bGliIHNvdXJjZQorICAgIGNvZGUuICBCdXQgeW91IGNhbiBtYWtlIHlvdXIgb3duIHByaXZhdGUgRExMIGJ1aWxkLCB1bmRlciBhCisgICAgZGlmZmVyZW50IGZpbGUgbmFtZSwgYXMgc3VnZ2VzdGVkIGluIHRoZSBwcmV2aW91cyBhbnN3ZXIuCisKKworMTcuIEkgbWFkZSBteSBvd24gWkxJQjEuRExMIGJ1aWxkLiAgQ2FuIEkgdGVzdCBpdCBmb3IgY29tcGxpYW5jZT8KKworICAtIFdlIHByZWZlciB0aGF0IHlvdSBkb3dubG9hZCB0aGUgb2ZmaWNpYWwgRExMIGZyb20gdGhlIHpsaWIKKyAgICB3ZWIgc2l0ZS4gIElmIHlvdSBuZWVkIHNvbWV0aGluZyBwZWN1bGlhciBmcm9tIHRoaXMgRExMLCB5b3UKKyAgICBjYW4gc2VuZCB5b3VyIHN1Z2dlc3Rpb24gdG8gdGhlIHpsaWIgbWFpbGluZyBsaXN0LgorCisgICAgSG93ZXZlciwgaW4gY2FzZSB5b3UgZG8gcmVidWlsZCB0aGUgRExMIHlvdXJzZWxmLCB5b3UgY2FuIHJ1bgorICAgIGl0IHdpdGggdGhlIHRlc3QgcHJvZ3JhbXMgZm91bmQgaW4gdGhlIERMTCBkaXN0cmlidXRpb24uCisgICAgUnVubmluZyB0aGVzZSB0ZXN0IHByb2dyYW1zIGlzIG5vdCBhIGd1YXJhbnRlZSBvZiBjb21wbGlhbmNlLAorICAgIGJ1dCBhIGZhaWx1cmUgY2FuIGltcGx5IGEgZGV0ZWN0ZWQgcHJvYmxlbS4KKworKioKKworVGhpcyBkb2N1bWVudCBpcyB3cml0dGVuIGFuZCBtYWludGFpbmVkIGJ5CitDb3NtaW4gVHJ1dGEgPGNvc21pbnRAY3MudWJiY2x1ai5ybz4KZGlmZiAtLWdpdCBhL3psaWItMS4yLjYvd2luMzIvTWFrZWZpbGUuYm9yIGIvemxpYi0xLjIuNi93aW4zMi9NYWtlZmlsZS5ib3IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE1MmJiYgotLS0gL2Rldi9udWxsCisrKyBiL3psaWItMS4yLjYvd2luMzIvTWFrZWZpbGUuYm9yCkBAIC0wLDAgKzEsMTEwIEBACisjIE1ha2VmaWxlIGZvciB6bGliCisjIEJvcmxhbmQgQysrIGZvciBXaW4zMgorIworIyBVc2FnZToKKyMgIG1ha2UgLWYgd2luMzIvTWFrZWZpbGUuYm9yCisjICBtYWtlIC1mIHdpbjMyL01ha2VmaWxlLmJvciBMT0NBTF9aTElCPS1EQVNNViBPQkpBPW1hdGNoLm9iaiBPQkpQQT0rbWF0Y2gub2JqCisKKyMgLS0tLS0tLS0tLS0tIEJvcmxhbmQgQysrIC0tLS0tLS0tLS0tLQorCisjIE9wdGlvbmFsIG5vbnN0YW5kYXJkIHByZXByb2Nlc3NvciBmbGFncyAoZS5nLiAtRE1BWF9NRU1fTEVWRUw9NykKKyMgc2hvdWxkIGJlIGFkZGVkIHRvIHRoZSBlbnZpcm9ubWVudCB2aWEgInNldCBMT0NBTF9aTElCPS1ERk9PIiBvcgorIyBhZGRlZCB0byB0aGUgZGVjbGFyYXRpb24gb2YgTE9DIGhlcmU6CitMT0MgPSAkKExPQ0FMX1pMSUIpCisKK0NDID0gYmNjMzIKK0FTID0gYmNjMzIKK0xEID0gYmNjMzIKK0FSID0gdGxpYgorQ0ZMQUdTICA9IC1hIC1kIC1rLSAtTzIgJChMT0MpCitBU0ZMQUdTID0gJChMT0MpCitMREZMQUdTID0gJChMT0MpCisKKworIyB2YXJpYWJsZXMKK1pMSUJfTElCID0gemxpYi5saWIKKworT0JKMSA9IGFkbGVyMzIub2JqIGNvbXByZXNzLm9iaiBjcmMzMi5vYmogZGVmbGF0ZS5vYmogZ3pjbG9zZS5vYmogZ3psaWIub2JqIGd6cmVhZC5vYmoKK09CSjIgPSBnendyaXRlLm9iaiBpbmZiYWNrLm9iaiBpbmZmYXN0Lm9iaiBpbmZsYXRlLm9iaiBpbmZ0cmVlcy5vYmogdHJlZXMub2JqIHVuY29tcHIub2JqIHp1dGlsLm9iagorI09CSkEgPQorT0JKUDEgPSArYWRsZXIzMi5vYmorY29tcHJlc3Mub2JqK2NyYzMyLm9iaitkZWZsYXRlLm9iaitnemNsb3NlLm9iaitnemxpYi5vYmorZ3pyZWFkLm9iagorT0JKUDIgPSArZ3p3cml0ZS5vYmoraW5mYmFjay5vYmoraW5mZmFzdC5vYmoraW5mbGF0ZS5vYmoraW5mdHJlZXMub2JqK3RyZWVzLm9iait1bmNvbXByLm9iait6dXRpbC5vYmoKKyNPQkpQQT0KKworCisjIHRhcmdldHMKK2FsbDogJChaTElCX0xJQikgZXhhbXBsZS5leGUgbWluaWd6aXAuZXhlCisKKy5jLm9iajoKKwkkKENDKSAtYyAkKENGTEFHUykgJDwKKworLmFzbS5vYmo6CisJJChBUykgLWMgJChBU0ZMQUdTKSAkPAorCithZGxlcjMyLm9iajogYWRsZXIzMi5jIHpsaWIuaCB6Y29uZi5oCisKK2NvbXByZXNzLm9iajogY29tcHJlc3MuYyB6bGliLmggemNvbmYuaAorCitjcmMzMi5vYmo6IGNyYzMyLmMgemxpYi5oIHpjb25mLmggY3JjMzIuaAorCitkZWZsYXRlLm9iajogZGVmbGF0ZS5jIGRlZmxhdGUuaCB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCisKK2d6Y2xvc2Uub2JqOiBnemNsb3NlLmMgemxpYi5oIHpjb25mLmggZ3pndXRzLmgKKworZ3psaWIub2JqOiBnemxpYi5jIHpsaWIuaCB6Y29uZi5oIGd6Z3V0cy5oCisKK2d6cmVhZC5vYmo6IGd6cmVhZC5jIHpsaWIuaCB6Y29uZi5oIGd6Z3V0cy5oCisKK2d6d3JpdGUub2JqOiBnendyaXRlLmMgemxpYi5oIHpjb25mLmggZ3pndXRzLmgKKworaW5mYmFjay5vYmo6IGluZmJhY2suYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZnRyZWVzLmggaW5mbGF0ZS5oIFwKKyBpbmZmYXN0LmggaW5mZml4ZWQuaAorCitpbmZmYXN0Lm9iajogaW5mZmFzdC5jIHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mdHJlZXMuaCBpbmZsYXRlLmggXAorIGluZmZhc3QuaAorCitpbmZsYXRlLm9iajogaW5mbGF0ZS5jIHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mdHJlZXMuaCBpbmZsYXRlLmggXAorIGluZmZhc3QuaCBpbmZmaXhlZC5oCisKK2luZnRyZWVzLm9iajogaW5mdHJlZXMuYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZnRyZWVzLmgKKwordHJlZXMub2JqOiB0cmVlcy5jIHp1dGlsLmggemxpYi5oIHpjb25mLmggZGVmbGF0ZS5oIHRyZWVzLmgKKwordW5jb21wci5vYmo6IHVuY29tcHIuYyB6bGliLmggemNvbmYuaAorCit6dXRpbC5vYmo6IHp1dGlsLmMgenV0aWwuaCB6bGliLmggemNvbmYuaAorCitleGFtcGxlLm9iajogdGVzdC9leGFtcGxlLmMgemxpYi5oIHpjb25mLmgKKworbWluaWd6aXAub2JqOiB0ZXN0L21pbmlnemlwLmMgemxpYi5oIHpjb25mLmgKKworCisjIEZvciB0aGUgc2FrZSBvZiB0aGUgb2xkIEJvcmxhbmQgbWFrZSwKKyMgdGhlIGNvbW1hbmQgbGluZSBpcyBjdXQgdG8gZml0IGluIHRoZSBNUy1ET1MgMTI4IGJ5dGUgbGltaXQ6CiskKFpMSUJfTElCKTogJChPQkoxKSAkKE9CSjIpICQoT0JKQSkKKwktZGVsICQoWkxJQl9MSUIpCisJJChBUikgJChaTElCX0xJQikgJChPQkpQMSkKKwkkKEFSKSAkKFpMSUJfTElCKSAkKE9CSlAyKQorCSQoQVIpICQoWkxJQl9MSUIpICQoT0JKUEEpCisKKworIyB0ZXN0aW5nCit0ZXN0OiBleGFtcGxlLmV4ZSBtaW5pZ3ppcC5leGUKKwlleGFtcGxlCisJZWNobyBoZWxsbyB3b3JsZCB8IG1pbmlnemlwIHwgbWluaWd6aXAgLWQKKworZXhhbXBsZS5leGU6IGV4YW1wbGUub2JqICQoWkxJQl9MSUIpCisJJChMRCkgJChMREZMQUdTKSBleGFtcGxlLm9iaiAkKFpMSUJfTElCKQorCittaW5pZ3ppcC5leGU6IG1pbmlnemlwLm9iaiAkKFpMSUJfTElCKQorCSQoTEQpICQoTERGTEFHUykgbWluaWd6aXAub2JqICQoWkxJQl9MSUIpCisKKworIyBjbGVhbnVwCitjbGVhbjoKKwktZGVsICQoWkxJQl9MSUIpCisJLWRlbCAqLm9iagorCS1kZWwgKi5leGUKKwktZGVsICoudGRzCisJLWRlbCB6bGliLmJhaworCS1kZWwgZm9vLmd6CmRpZmYgLS1naXQgYS96bGliLTEuMi42L3dpbjMyL01ha2VmaWxlLmVteCBiL3psaWItMS4yLjYvd2luMzIvTWFrZWZpbGUuZW14Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkNmFiMGUKLS0tIC9kZXYvbnVsbAorKysgYi96bGliLTEuMi42L3dpbjMyL01ha2VmaWxlLmVteApAQCAtMCwwICsxLDY5IEBACisjIE1ha2VmaWxlIGZvciB6bGliLiAgTW9kaWZpZWQgZm9yIGVteC9yc3hudCBieSBDaHIuIFNwaWVsZXIsIDYvMTYvOTguCisjIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEplYW4tbG91cCBHYWlsbHkuCisjIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKKworIyBUbyBjb21waWxlLCBvciB0byBjb21waWxlIGFuZCB0ZXN0LCB0eXBlOgorIworIyAgIG1ha2UgLWZtYWtlZmlsZS5lbXg7ICBtYWtlIHRlc3QgLWZtYWtlZmlsZS5lbXgKKyMKKworQ0M9Z2NjIC1ad2luMzIKKworI0NGTEFHUz0tTU1EIC1PCisjQ0ZMQUdTPS1PIC1ETUFYX1dCSVRTPTE0IC1ETUFYX01FTV9MRVZFTD03CisjQ0ZMQUdTPS1NTUQgLWcgLURERUJVRworQ0ZMQUdTPS1NTUQgLU8zICQoQlVUVCkgLVdhbGwgLVd3cml0ZS1zdHJpbmdzIC1XcG9pbnRlci1hcml0aCAtV2NvbnZlcnNpb24gXAorICAgICAgICAgICAgIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVdtaXNzaW5nLXByb3RvdHlwZXMKKworIyBJZiBjcC5leGUgaXMgYXZhaWxhYmxlLCByZXBsYWNlICJjb3B5IC9ZIiB3aXRoICJjcCAtZnAiIC4KK0NQPWNvcHkgL1kKKyMgSWYgZ251IGluc3RhbGwuZXhlIGlzIGF2YWlsYWJsZSwgcmVwbGFjZSAkKENQKSB3aXRoIGdpbnN0YWxsLgorSU5TVEFMTD0kKENQKQorIyBUaGUgZGVmYXVsdCB2YWx1ZSBvZiBSTSBpcyAicm0gLWYuIiAgSWYgInJtLmV4ZSIgaXMgZm91bmQsIGNvbW1lbnQgb3V0OgorUk09ZGVsCitMRExJQlM9LUwuIC1semxpYgorTEQ9JChDQykgLXMgLW8KK0xEU0hBUkVEPSQoQ0MpCisKK0lOQ0w9emxpYi5oIHpjb25mLmgKK0xJQlM9emxpYi5hCisKK0FSPWFyIHJjcworCitwcmVmaXg9L3Vzci9sb2NhbAorZXhlY19wcmVmaXggPSAkKHByZWZpeCkKKworT0JKUyA9IGFkbGVyMzIubyBjb21wcmVzcy5vIGNyYzMyLm8gZGVmbGF0ZS5vIGd6Y2xvc2UubyBnemxpYi5vIGd6cmVhZC5vIFwKKyAgICAgICBnendyaXRlLm8gaW5mYmFjay5vIGluZmZhc3QubyBpbmZsYXRlLm8gaW5mdHJlZXMubyB0cmVlcy5vIHVuY29tcHIubyB6dXRpbC5vCisKK1RFU1RfT0JKUyA9IGV4YW1wbGUubyBtaW5pZ3ppcC5vCisKK2FsbDogZXhhbXBsZS5leGUgbWluaWd6aXAuZXhlCisKK3Rlc3Q6IGFsbAorCS4vZXhhbXBsZQorCWVjaG8gaGVsbG8gd29ybGQgfCAuXG1pbmlnemlwIHwgLlxtaW5pZ3ppcCAtZAorCislLm8gOiAlLmMKKwkkKENDKSAkKENGTEFHUykgLWMgJDwgLW8gJEAKKworemxpYi5hOiAkKE9CSlMpCisJJChBUikgJEAgJChPQkpTKQorCislLmV4ZSA6ICUubyAkKExJQlMpCisJJChMRCkgJEAgJDwgJChMRExJQlMpCisKKworLlBIT05ZIDogY2xlYW4KKworY2xlYW46CisJJChSTSkgKi5kCisJJChSTSkgKi5vCisJJChSTSkgKi5leGUKKwkkKFJNKSB6bGliLmEKKwkkKFJNKSBmb28uZ3oKKworREVQUyA6PSAkKHdpbGRjYXJkICouZCkKK2lmbmVxICgkKERFUFMpLCkKK2luY2x1ZGUgJChERVBTKQorZW5kaWYKZGlmZiAtLWdpdCBhL3psaWItMS4yLjYvd2luMzIvTWFrZWZpbGUuZ2NjIGIvemxpYi0xLjIuNi93aW4zMi9NYWtlZmlsZS5nY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRhNjU4OQotLS0gL2Rldi9udWxsCisrKyBiL3psaWItMS4yLjYvd2luMzIvTWFrZWZpbGUuZ2NjCkBAIC0wLDAgKzEsMTgwIEBACisjIE1ha2VmaWxlIGZvciB6bGliLCBkZXJpdmVkIGZyb20gTWFrZWZpbGUuZGoyLgorIyBNb2RpZmllZCBmb3IgbWluZ3czMiBieSBDLiBTcGllbGVyLCA2LzE2Lzk4LgorIyBVcGRhdGVkIGZvciB6bGliIDEuMi54IGJ5IENocmlzdGlhbiBTcGllbGVyIGFuZCBDb3NtaW4gVHJ1dGEsIE1hci0yMDAzLgorIyBMYXN0IHVwZGF0ZWQ6IDEtQXVnLTIwMDMuCisjIFRlc3RlZCB1bmRlciBDeWd3aW4gYW5kIE1pbkdXLgorCisjIENvcHlyaWdodCAoQykgMTk5NS0yMDAzIEplYW4tbG91cCBHYWlsbHkuCisjIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKKworIyBUbyBjb21waWxlLCBvciB0byBjb21waWxlIGFuZCB0ZXN0LCB0eXBlOgorIworIyAgIG1ha2UgLWZtYWtlZmlsZS5nY2M7ICBtYWtlIHRlc3QgdGVzdGRsbCAtZm1ha2VmaWxlLmdjYworIworIyBUbyB1c2UgdGhlIGFzbSBjb2RlLCB0eXBlOgorIyAgIGNwIGNvbnRyaWIvYXNtPzg2L21hdGNoLlMgLi9tYXRjaC5TCisjICAgbWFrZSBMT0M9LURBU01WIE9CSkE9bWF0Y2gubyAtZm1ha2VmaWxlLmdjYworIworIyBUbyBpbnN0YWxsIGxpYnouYSwgemNvbmYuaCBhbmQgemxpYi5oIGluIHRoZSBzeXN0ZW0gZGlyZWN0b3JpZXMsIHR5cGU6CisjCisjICAgbWFrZSBpbnN0YWxsIC1mbWFrZWZpbGUuZ2NjCisKKyMgTm90ZToKKyMgSWYgdGhlIHBsYXRmb3JtIGlzICpub3QqIE1pbkdXIChlLmcuIGl0IGlzIEN5Z3dpbiBvciBVV0lOKSwKKyMgdGhlIERMTCBuYW1lIHNob3VsZCBiZSBjaGFuZ2VkIGZyb20gInpsaWIxLmRsbCIuCisKK1NUQVRJQ0xJQiA9IGxpYnouYQorU0hBUkVETElCID0gemxpYjEuZGxsCitJTVBMSUIgICAgPSBsaWJ6LmRsbC5hCisKKyMKKyMgU2V0IHRvIDEgaWYgc2hhcmVkIG9iamVjdCBuZWVkcyB0byBiZSBpbnN0YWxsZWQKKyMKK1NIQVJFRF9NT0RFPTAKKworI0xPQyA9IC1EQVNNVgorI0xPQyA9IC1EREVCVUcgLWcKKworUFJFRklYID0KK0NDID0gJChQUkVGSVgpZ2NjCitDRkxBR1MgPSAkKExPQykgLU8zIC1XYWxsCitFWFRSQV9DRkxBR1MgPSAtRE5PX1ZJWgorCitBUyA9ICQoQ0MpCitBU0ZMQUdTID0gJChMT0MpIC1XYWxsCisKK0xEID0gJChDQykKK0xERkxBR1MgPSAkKExPQykKKworQVIgPSAkKFBSRUZJWClhcgorQVJGTEFHUyA9IHJjcworCitSQyA9ICQoUFJFRklYKXdpbmRyZXMKK1JDRkxBR1MgPSAtLWRlZmluZSBHQ0NfV0lORFJFUworCitTVFJJUCA9ICQoUFJFRklYKXN0cmlwCisKK0NQID0gY3AgLWZwCisjIElmIEdOVSBpbnN0YWxsIGlzIGF2YWlsYWJsZSwgcmVwbGFjZSAkKENQKSB3aXRoIGluc3RhbGwuCitJTlNUQUxMID0gJChDUCkKK1JNID0gcm0gLWYKKworcHJlZml4ID89IC91c3IvbG9jYWwKK2V4ZWNfcHJlZml4ID0gJChwcmVmaXgpCisKK09CSlMgPSBhZGxlcjMyLm8gY29tcHJlc3MubyBjcmMzMi5vIGRlZmxhdGUubyBnemNsb3NlLm8gZ3psaWIubyBnenJlYWQubyBcCisgICAgICAgZ3p3cml0ZS5vIGluZmJhY2subyBpbmZmYXN0Lm8gaW5mbGF0ZS5vIGluZnRyZWVzLm8gdHJlZXMubyB1bmNvbXByLm8genV0aWwubworT0JKQSA9CisKK2FsbDogJChTVEFUSUNMSUIpICQoU0hBUkVETElCKSAkKElNUExJQikgZXhhbXBsZS5leGUgbWluaWd6aXAuZXhlIGV4YW1wbGVfZC5leGUgbWluaWd6aXBfZC5leGUKKwordGVzdDogZXhhbXBsZS5leGUgbWluaWd6aXAuZXhlCisJLi9leGFtcGxlCisJZWNobyBoZWxsbyB3b3JsZCB8IC4vbWluaWd6aXAgfCAuL21pbmlnemlwIC1kCisKK3Rlc3RkbGw6IGV4YW1wbGVfZC5leGUgbWluaWd6aXBfZC5leGUKKwkuL2V4YW1wbGVfZAorCWVjaG8gaGVsbG8gd29ybGQgfCAuL21pbmlnemlwX2QgfCAuL21pbmlnemlwX2QgLWQKKworLmMubzoKKwkkKENDKSAkKENGTEFHUykgJChFWFRSQV9DRkxBR1MpIC1jIC1vICRAICQ8CisKKy5TLm86CisJJChBUykgJChBU0ZMQUdTKSAtYyAtbyAkQCAkPAorCiskKFNUQVRJQ0xJQik6ICQoT0JKUykgJChPQkpBKQorCSQoQVIpICQoQVJGTEFHUykgJEAgJChPQkpTKSAkKE9CSkEpCisKKyQoSU1QTElCKTogJChTSEFSRURMSUIpCisKKyQoU0hBUkVETElCKTogd2luMzIvemxpYi5kZWYgJChPQkpTKSAkKE9CSkEpIHpsaWJyYy5vCisJJChDQykgLXNoYXJlZCAtV2wsLS1vdXQtaW1wbGliLCQoSU1QTElCKSAkKExERkxBR1MpIFwKKwktbyAkQCB3aW4zMi96bGliLmRlZiAkKE9CSlMpICQoT0JKQSkgemxpYnJjLm8KKwkkKFNUUklQKSAkQAorCitleGFtcGxlLmV4ZTogZXhhbXBsZS5vICQoU1RBVElDTElCKQorCSQoTEQpICQoTERGTEFHUykgLW8gJEAgZXhhbXBsZS5vICQoU1RBVElDTElCKQorCSQoU1RSSVApICRACisKK21pbmlnemlwLmV4ZTogbWluaWd6aXAubyAkKFNUQVRJQ0xJQikKKwkkKExEKSAkKExERkxBR1MpIC1vICRAIG1pbmlnemlwLm8gJChTVEFUSUNMSUIpCisJJChTVFJJUCkgJEAKKworZXhhbXBsZV9kLmV4ZTogZXhhbXBsZS5vICQoSU1QTElCKQorCSQoTEQpICQoTERGTEFHUykgLW8gJEAgZXhhbXBsZS5vICQoSU1QTElCKQorCSQoU1RSSVApICRACisKK21pbmlnemlwX2QuZXhlOiBtaW5pZ3ppcC5vICQoSU1QTElCKQorCSQoTEQpICQoTERGTEFHUykgLW8gJEAgbWluaWd6aXAubyAkKElNUExJQikKKwkkKFNUUklQKSAkQAorCitleGFtcGxlLm86IHRlc3QvZXhhbXBsZS5jIHpsaWIuaCB6Y29uZi5oCisJJChDQykgJChDRkxBR1MpICQoRVhUUkFfQ0ZMQUdTKSAtSS4gLWMgLW8gJEAgdGVzdC9leGFtcGxlLmMKKworbWluaWd6aXAubzogdGVzdC9taW5pZ3ppcC5jIHpsaWIuaCB6Y29uZi5oCisJJChDQykgJChDRkxBR1MpICQoRVhUUkFfQ0ZMQUdTKSAtSS4gLWMgLW8gJEAgdGVzdC9taW5pZ3ppcC5jCisKK3psaWJyYy5vOiB3aW4zMi96bGliMS5yYworCSQoUkMpICQoUkNGTEFHUykgLW8gJEAgd2luMzIvemxpYjEucmMKKworCisjIEJJTkFSWV9QQVRILCBJTkNMVURFX1BBVEggYW5kIExJQlJBUllfUEFUSCBtdXN0IGJlIHNldC4KKworLlBIT05ZOiBpbnN0YWxsIHVuaW5zdGFsbCBjbGVhbgorCitpbnN0YWxsOiB6bGliLmggemNvbmYuaCAkKFNUQVRJQ0xJQikgJChJTVBMSUIpCisJQGlmIHRlc3QgLXogIiQoSU5DTFVERV9QQVRIKSIgLW8gLXogIiQoTElCUkFSWV9QQVRIKSIgLW8gLXogIiQoQklOQVJZX1BBVEgpIjsgdGhlbiBcCisJCWVjaG8gSU5DTFVERV9QQVRILCBMSUJSQVJZX1BBVEgsIGFuZCBCSU5BUllfUEFUSCBtdXN0IGJlIHNwZWNpZmllZDsgXAorCQlleGl0IDE7IFwKKwlmaQorCS1AbWtkaXIgLXAgJChJTkNMVURFX1BBVEgpCisJLUBta2RpciAtcCAkKExJQlJBUllfUEFUSCkgJChMSUJSQVJZX1BBVEgpL3BrZ2NvbmZpZworCS1pZiBbICIkKFNIQVJFRF9NT0RFKSIgPSAiMSIgXTsgdGhlbiBcCisJCW1rZGlyIC1wICQoQklOQVJZX1BBVEgpOyBcCisJCSQoSU5TVEFMTCkgJChTSEFSRURMSUIpICQoQklOQVJZX1BBVEgpOyBcCisJCSQoSU5TVEFMTCkgJChJTVBMSUIpICQoTElCUkFSWV9QQVRIKTsgXAorCWZpCisJLSQoSU5TVEFMTCkgemxpYi5oICQoSU5DTFVERV9QQVRIKQorCS0kKElOU1RBTEwpIHpjb25mLmggJChJTkNMVURFX1BBVEgpCisJLSQoSU5TVEFMTCkgJChTVEFUSUNMSUIpICQoTElCUkFSWV9QQVRIKQorCXNlZCBcCisJCS1lICdzfEBwcmVmaXhAfCR7cHJlZml4fXxnJyBcCisJCS1lICdzfEBleGVjX3ByZWZpeEB8JHtleGVjX3ByZWZpeH18ZycgXAorCQktZSAnc3xAbGliZGlyQHwkKExJQlJBUllfUEFUSCl8ZycgXAorCQktZSAnc3xAc2hhcmVkbGliZGlyQHwkKExJQlJBUllfUEFUSCl8ZycgXAorCQktZSAnc3xAaW5jbHVkZWRpckB8JChJTkNMVURFX1BBVEgpfGcnIFwKKwkJLWUgJ3N8QFZFUlNJT05AfCdgc2VkIC1uIC1lICcvVkVSU0lPTiAiL3MvLioiXCguKlwpIi4qL1wxL3AnIHpsaWIuaGAnfGcnIFwKKwkJemxpYi5wYy5pbiA+ICQoTElCUkFSWV9QQVRIKS9wa2djb25maWcvemxpYi5wYworCit1bmluc3RhbGw6CisJLWlmIFsgIiQoU0hBUkVEX01PREUpIiA9ICIxIiBdOyB0aGVuIFwKKwkJJChSTSkgJChCSU5BUllfUEFUSCkvJChTSEFSRURMSUIpOyBcCisJCSQoUk0pICQoTElCUkFSWV9QQVRIKS8kKElNUExJQik7IFwKKwlmaQorCS0kKFJNKSAkKElOQ0xVREVfUEFUSCkvemxpYi5oCisJLSQoUk0pICQoSU5DTFVERV9QQVRIKS96Y29uZi5oCisJLSQoUk0pICQoTElCUkFSWV9QQVRIKS8kKFNUQVRJQ0xJQikKKworY2xlYW46CisJLSQoUk0pICQoU1RBVElDTElCKQorCS0kKFJNKSAkKFNIQVJFRExJQikKKwktJChSTSkgJChJTVBMSUIpCisJLSQoUk0pICoubworCS0kKFJNKSAqLmV4ZQorCS0kKFJNKSBmb28uZ3oKKworYWRsZXIzMi5vOiB6bGliLmggemNvbmYuaAorY29tcHJlc3MubzogemxpYi5oIHpjb25mLmgKK2NyYzMyLm86IGNyYzMyLmggemxpYi5oIHpjb25mLmgKK2RlZmxhdGUubzogZGVmbGF0ZS5oIHp1dGlsLmggemxpYi5oIHpjb25mLmgKK2d6Y2xvc2UubzogemxpYi5oIHpjb25mLmggZ3pndXRzLmgKK2d6bGliLm86IHpsaWIuaCB6Y29uZi5oIGd6Z3V0cy5oCitnenJlYWQubzogemxpYi5oIHpjb25mLmggZ3pndXRzLmgKK2d6d3JpdGUubzogemxpYi5oIHpjb25mLmggZ3pndXRzLmgKK2luZmZhc3QubzogenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZ0cmVlcy5oIGluZmxhdGUuaCBpbmZmYXN0LmgKK2luZmxhdGUubzogenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZ0cmVlcy5oIGluZmxhdGUuaCBpbmZmYXN0LmgKK2luZmJhY2subzogenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZ0cmVlcy5oIGluZmxhdGUuaCBpbmZmYXN0LmgKK2luZnRyZWVzLm86IHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mdHJlZXMuaAordHJlZXMubzogZGVmbGF0ZS5oIHp1dGlsLmggemxpYi5oIHpjb25mLmggdHJlZXMuaAordW5jb21wci5vOiB6bGliLmggemNvbmYuaAorenV0aWwubzogenV0aWwuaCB6bGliLmggemNvbmYuaApkaWZmIC0tZ2l0IGEvemxpYi0xLjIuNi93aW4zMi9NYWtlZmlsZS5tc2MgYi96bGliLTEuMi42L3dpbjMyL01ha2VmaWxlLm1zYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWJiMGRhCi0tLSAvZGV2L251bGwKKysrIGIvemxpYi0xLjIuNi93aW4zMi9NYWtlZmlsZS5tc2MKQEAgLTAsMCArMSwxNjAgQEAKKyMgTWFrZWZpbGUgZm9yIHpsaWIgdXNpbmcgTWljcm9zb2Z0IChWaXN1YWwpIEMKKyMgemxpYiBpcyBjb3B5cmlnaHQgKEMpIDE5OTUtMjAwNiBKZWFuLWxvdXAgR2FpbGx5IGFuZCBNYXJrIEFkbGVyCisjCisjIFVzYWdlOgorIyAgIG5tYWtlIC1mIHdpbjMyL01ha2VmaWxlLm1zYyAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0YW5kYXJkIGJ1aWxkKQorIyAgIG5tYWtlIC1mIHdpbjMyL01ha2VmaWxlLm1zYyBMT0M9LURGT08gICAgICAgICAgICAgICAgKG5vbnN0YW5kYXJkIGJ1aWxkKQorIyAgIG5tYWtlIC1mIHdpbjMyL01ha2VmaWxlLm1zYyBMT0M9Ii1EQVNNViAtREFTTUlORiIgXAorIyAgICAgICAgIE9CSkE9ImluZmZhczMyLm9iaiBtYXRjaDY4Ni5vYmoiICAgICAgICAgICAgICAgKHVzZSBBU00gY29kZSwgeDg2KQorIyAgIG5tYWtlIC1mIHdpbjMyL01ha2VmaWxlLm1zYyBBUz1tbDY0IExPQz0iLURBU01WIC1EQVNNSU5GIC1JLiIgXAorIyAgICAgICAgIE9CSkE9ImluZmZhc3g2NC5vYmogZ3ZtYXQ2NC5vYmogaW5mZmFzODY2NC5vYmoiICAodXNlIEFTTSBjb2RlLCB4NjQpCisKKyMgb3B0aW9uYWwgYnVpbGQgZmxhZ3MKK0xPQyA9CisKKyMgdmFyaWFibGVzCitTVEFUSUNMSUIgPSB6bGliLmxpYgorU0hBUkVETElCID0gemxpYjEuZGxsCitJTVBMSUIgICAgPSB6ZGxsLmxpYgorCitDQyA9IGNsCitBUyA9IG1sCitMRCA9IGxpbmsKK0FSID0gbGliCitSQyA9IHJjCitDRkxBR1MgID0gLW5vbG9nbyAtTUQgLVczIC1PMiAtT3ktIC1aaSAtRmQiemxpYiIgJChMT0MpCitXRkxBR1MgID0gLURfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEUgLURfQ1JUX05PTlNURENfTk9fREVQUkVDQVRFCitBU0ZMQUdTID0gLWNvZmYgLVppICQoTE9DKQorTERGTEFHUyA9IC1ub2xvZ28gLWRlYnVnIC1pbmNyZW1lbnRhbDpubyAtb3B0OnJlZgorQVJGTEFHUyA9IC1ub2xvZ28KK1JDRkxBR1MgPSAvZFdJTjMyIC9yCisKK09CSlMgPSBhZGxlcjMyLm9iaiBjb21wcmVzcy5vYmogY3JjMzIub2JqIGRlZmxhdGUub2JqIGd6Y2xvc2Uub2JqIGd6bGliLm9iaiBnenJlYWQub2JqIFwKKyAgICAgICBnendyaXRlLm9iaiBpbmZiYWNrLm9iaiBpbmZsYXRlLm9iaiBpbmZ0cmVlcy5vYmogaW5mZmFzdC5vYmogdHJlZXMub2JqIHVuY29tcHIub2JqIHp1dGlsLm9iagorT0JKQSA9CisKKworIyB0YXJnZXRzCithbGw6ICQoU1RBVElDTElCKSAkKFNIQVJFRExJQikgJChJTVBMSUIpIFwKKyAgICAgZXhhbXBsZS5leGUgbWluaWd6aXAuZXhlIGV4YW1wbGVfZC5leGUgbWluaWd6aXBfZC5leGUKKworJChTVEFUSUNMSUIpOiAkKE9CSlMpICQoT0JKQSkKKwkkKEFSKSAkKEFSRkxBR1MpIC1vdXQ6JEAgJChPQkpTKSAkKE9CSkEpCisKKyQoSU1QTElCKTogJChTSEFSRURMSUIpCisKKyQoU0hBUkVETElCKTogd2luMzIvemxpYi5kZWYgJChPQkpTKSAkKE9CSkEpIHpsaWIxLnJlcworCSQoTEQpICQoTERGTEFHUykgLWRlZjp3aW4zMi96bGliLmRlZiAtZGxsIC1pbXBsaWI6JChJTVBMSUIpIFwKKwkgIC1vdXQ6JEAgLWJhc2U6MHg1QTRDMDAwMCAkKE9CSlMpICQoT0JKQSkgemxpYjEucmVzCisJaWYgZXhpc3QgJEAubWFuaWZlc3QgXAorCSAgbXQgLW5vbG9nbyAtbWFuaWZlc3QgJEAubWFuaWZlc3QgLW91dHB1dHJlc291cmNlOiRAOzIKKworZXhhbXBsZS5leGU6IGV4YW1wbGUub2JqICQoU1RBVElDTElCKQorCSQoTEQpICQoTERGTEFHUykgZXhhbXBsZS5vYmogJChTVEFUSUNMSUIpCisJaWYgZXhpc3QgJEAubWFuaWZlc3QgXAorCSAgbXQgLW5vbG9nbyAtbWFuaWZlc3QgJEAubWFuaWZlc3QgLW91dHB1dHJlc291cmNlOiRAOzEKKworbWluaWd6aXAuZXhlOiBtaW5pZ3ppcC5vYmogJChTVEFUSUNMSUIpCisJJChMRCkgJChMREZMQUdTKSBtaW5pZ3ppcC5vYmogJChTVEFUSUNMSUIpCisJaWYgZXhpc3QgJEAubWFuaWZlc3QgXAorCSAgbXQgLW5vbG9nbyAtbWFuaWZlc3QgJEAubWFuaWZlc3QgLW91dHB1dHJlc291cmNlOiRAOzEKKworZXhhbXBsZV9kLmV4ZTogZXhhbXBsZS5vYmogJChJTVBMSUIpCisJJChMRCkgJChMREZMQUdTKSAtb3V0OiRAIGV4YW1wbGUub2JqICQoSU1QTElCKQorCWlmIGV4aXN0ICRALm1hbmlmZXN0IFwKKwkgIG10IC1ub2xvZ28gLW1hbmlmZXN0ICRALm1hbmlmZXN0IC1vdXRwdXRyZXNvdXJjZTokQDsxCisKK21pbmlnemlwX2QuZXhlOiBtaW5pZ3ppcC5vYmogJChJTVBMSUIpCisJJChMRCkgJChMREZMQUdTKSAtb3V0OiRAIG1pbmlnemlwLm9iaiAkKElNUExJQikKKwlpZiBleGlzdCAkQC5tYW5pZmVzdCBcCisJICBtdCAtbm9sb2dvIC1tYW5pZmVzdCAkQC5tYW5pZmVzdCAtb3V0cHV0cmVzb3VyY2U6JEA7MQorCisuYy5vYmo6CisJJChDQykgLWMgJChXRkxBR1MpICQoQ0ZMQUdTKSAkPAorCit7dGVzdH0uYy5vYmo6CisJJChDQykgLWMgLUkuICQoV0ZMQUdTKSAkKENGTEFHUykgJDwKKwore2NvbnRyaWIvbWFzbXg2NH0uYy5vYmo6CisJJChDQykgLWMgJChXRkxBR1MpICQoQ0ZMQUdTKSAkPAorCit7Y29udHJpYi9tYXNteDY0fS5hc20ub2JqOgorCSQoQVMpIC1jICQoQVNGTEFHUykgJDwKKwore2NvbnRyaWIvbWFzbXg4Nn0uYXNtLm9iajoKKwkkKEFTKSAtYyAkKEFTRkxBR1MpICQ8CisKK2FkbGVyMzIub2JqOiBhZGxlcjMyLmMgemxpYi5oIHpjb25mLmgKKworY29tcHJlc3Mub2JqOiBjb21wcmVzcy5jIHpsaWIuaCB6Y29uZi5oCisKK2NyYzMyLm9iajogY3JjMzIuYyB6bGliLmggemNvbmYuaCBjcmMzMi5oCisKK2RlZmxhdGUub2JqOiBkZWZsYXRlLmMgZGVmbGF0ZS5oIHp1dGlsLmggemxpYi5oIHpjb25mLmgKKworZ3pjbG9zZS5vYmo6IGd6Y2xvc2UuYyB6bGliLmggemNvbmYuaCBnemd1dHMuaAorCitnemxpYi5vYmo6IGd6bGliLmMgemxpYi5oIHpjb25mLmggZ3pndXRzLmgKKworZ3pyZWFkLm9iajogZ3pyZWFkLmMgemxpYi5oIHpjb25mLmggZ3pndXRzLmgKKworZ3p3cml0ZS5vYmo6IGd6d3JpdGUuYyB6bGliLmggemNvbmYuaCBnemd1dHMuaAorCitpbmZiYWNrLm9iajogaW5mYmFjay5jIHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mdHJlZXMuaCBpbmZsYXRlLmggXAorICAgICAgICAgICAgIGluZmZhc3QuaCBpbmZmaXhlZC5oCisKK2luZmZhc3Qub2JqOiBpbmZmYXN0LmMgenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZ0cmVlcy5oIGluZmxhdGUuaCBcCisgICAgICAgICAgICAgaW5mZmFzdC5oCisKK2luZmxhdGUub2JqOiBpbmZsYXRlLmMgenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZ0cmVlcy5oIGluZmxhdGUuaCBcCisgICAgICAgICAgICAgaW5mZmFzdC5oIGluZmZpeGVkLmgKKworaW5mdHJlZXMub2JqOiBpbmZ0cmVlcy5jIHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mdHJlZXMuaAorCit0cmVlcy5vYmo6IHRyZWVzLmMgenV0aWwuaCB6bGliLmggemNvbmYuaCBkZWZsYXRlLmggdHJlZXMuaAorCit1bmNvbXByLm9iajogdW5jb21wci5jIHpsaWIuaCB6Y29uZi5oCisKK3p1dGlsLm9iajogenV0aWwuYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCisKK2d2bWF0NjQub2JqOiBjb250cmliXG1hc214NjRcZ3ZtYXQ2NC5hc20KKworaW5mZmFzeDY0Lm9iajogY29udHJpYlxtYXNteDY0XGluZmZhc3g2NC5hc20KKworaW5mZmFzODY2NC5vYmo6IGNvbnRyaWJcbWFzbXg2NFxpbmZmYXM4NjY0LmMgenV0aWwuaCB6bGliLmggemNvbmYuaCBcCisJCWluZnRyZWVzLmggaW5mbGF0ZS5oIGluZmZhc3QuaAorCitpbmZmYXMzMi5vYmo6IGNvbnRyaWJcbWFzbXg4NlxpbmZmYXMzMi5hc20KKworbWF0Y2g2ODYub2JqOiBjb250cmliXG1hc214ODZcbWF0Y2g2ODYuYXNtCisKK2V4YW1wbGUub2JqOiB0ZXN0L2V4YW1wbGUuYyB6bGliLmggemNvbmYuaAorCittaW5pZ3ppcC5vYmo6IHRlc3QvbWluaWd6aXAuYyB6bGliLmggemNvbmYuaAorCit6bGliMS5yZXM6IHdpbjMyL3psaWIxLnJjCisJJChSQykgJChSQ0ZMQUdTKSAvZm8kQCB3aW4zMi96bGliMS5yYworCisKKyMgdGVzdGluZwordGVzdDogZXhhbXBsZS5leGUgbWluaWd6aXAuZXhlCisJZXhhbXBsZQorCWVjaG8gaGVsbG8gd29ybGQgfCBtaW5pZ3ppcCB8IG1pbmlnemlwIC1kCisKK3Rlc3RkbGw6IGV4YW1wbGVfZC5leGUgbWluaWd6aXBfZC5leGUKKwlleGFtcGxlX2QKKwllY2hvIGhlbGxvIHdvcmxkIHwgbWluaWd6aXBfZCB8IG1pbmlnemlwX2QgLWQKKworCisjIGNsZWFudXAKK2NsZWFuOgorCS1kZWwgJChTVEFUSUNMSUIpCisJLWRlbCAkKFNIQVJFRExJQikKKwktZGVsICQoSU1QTElCKQorCS1kZWwgKi5vYmoKKwktZGVsICoucmVzCisJLWRlbCAqLmV4cAorCS1kZWwgKi5leGUKKwktZGVsICoucGRiCisJLWRlbCAqLm1hbmlmZXN0CisJLWRlbCBmb28uZ3oKZGlmZiAtLWdpdCBhL3psaWItMS4yLjYvd2luMzIvUkVBRE1FLVdJTjMyLnR4dCBiL3psaWItMS4yLjYvd2luMzIvUkVBRE1FLVdJTjMyLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTRjMDkzCi0tLSAvZGV2L251bGwKKysrIGIvemxpYi0xLjIuNi93aW4zMi9SRUFETUUtV0lOMzIudHh0CkBAIC0wLDAgKzEsMTAzIEBACitaTElCIERBVEEgQ09NUFJFU1NJT04gTElCUkFSWQorCit6bGliIDEuMi40IGlzIGEgZ2VuZXJhbCBwdXJwb3NlIGRhdGEgY29tcHJlc3Npb24gbGlicmFyeS4gIEFsbCB0aGUgY29kZSBpcwordGhyZWFkIHNhZmUuICBUaGUgZGF0YSBmb3JtYXQgdXNlZCBieSB0aGUgemxpYiBsaWJyYXJ5IGlzIGRlc2NyaWJlZCBieSBSRkNzCisoUmVxdWVzdCBmb3IgQ29tbWVudHMpIDE5NTAgdG8gMTk1MiBpbiB0aGUgZmlsZXMKK2h0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzE5NTAudHh0ICh6bGliIGZvcm1hdCksIHJmYzE5NTEudHh0IChkZWZsYXRlIGZvcm1hdCkKK2FuZCByZmMxOTUyLnR4dCAoZ3ppcCBmb3JtYXQpLgorCitBbGwgZnVuY3Rpb25zIG9mIHRoZSBjb21wcmVzc2lvbiBsaWJyYXJ5IGFyZSBkb2N1bWVudGVkIGluIHRoZSBmaWxlIHpsaWIuaAorKHZvbHVudGVlciB0byB3cml0ZSBtYW4gcGFnZXMgd2VsY29tZSwgY29udGFjdCB6bGliQGd6aXAub3JnKS4gIFR3byBjb21waWxlZAorZXhhbXBsZXMgYXJlIGRpc3RyaWJ1dGVkIGluIHRoaXMgcGFja2FnZSwgZXhhbXBsZSBhbmQgbWluaWd6aXAuICBUaGUgZXhhbXBsZV9kCithbmQgbWluaWd6aXBfZCBmbGF2b3JzIHZhbGlkYXRlIHRoYXQgdGhlIHpsaWIxLmRsbCBmaWxlIGlzIHdvcmtpbmcgY29ycmVjdGx5LgorCitRdWVzdGlvbnMgYWJvdXQgemxpYiBzaG91bGQgYmUgc2VudCB0byA8emxpYkBnemlwLm9yZz4uICBUaGUgemxpYiBob21lIHBhZ2UKK2lzIGh0dHA6Ly96bGliLm5ldC8gLiAgQmVmb3JlIHJlcG9ydGluZyBhIHByb2JsZW0sIHBsZWFzZSBjaGVjayB0aGlzIHNpdGUgdG8KK3ZlcmlmeSB0aGF0IHlvdSBoYXZlIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB6bGliOyBvdGhlcndpc2UgZ2V0IHRoZSBsYXRlc3QKK3ZlcnNpb24gYW5kIGNoZWNrIHdoZXRoZXIgdGhlIHByb2JsZW0gc3RpbGwgZXhpc3RzIG9yIG5vdC4KKworUExFQVNFIHJlYWQgRExMX0ZBUS50eHQsIGFuZCB0aGUgdGhlIHpsaWIgRkFRIGh0dHA6Ly96bGliLm5ldC96bGliX2ZhcS5odG1sCitiZWZvcmUgYXNraW5nIGZvciBoZWxwLgorCisKK01hbmlmZXN0OgorCitUaGUgcGFja2FnZSB6bGliLTEuMi40LXdpbjMyLXg4Ni56aXAgY29udGFpbnMgdGhlIGZvbGxvd2luZyBmaWxlczoKKworICBSRUFETUUtV0lOMzIudHh0IFRoaXMgZG9jdW1lbnQKKyAgQ2hhbmdlTG9nICAgICAgICBDaGFuZ2VzIHNpbmNlIHByZXZpb3VzIHpsaWIgcGFja2FnZXMKKyAgRExMX0ZBUS50eHQgICAgICBGcmVxdWVudGx5IGFza2VkIHF1ZXN0aW9ucyBhYm91dCB6bGliMS5kbGwKKyAgemxpYi4zLnBkZiAgICAgICBEb2N1bWVudGF0aW9uIG9mIHRoaXMgbGlicmFyeSBpbiBBZG9iZSBBY3JvYmF0IGZvcm1hdAorCisgIGV4YW1wbGUuZXhlICAgICAgQSBzdGF0aWNhbGx5LWJvdW5kIGV4YW1wbGUgKHVzaW5nIHpsaWIubGliLCBub3QgdGhlIGRsbCkKKyAgZXhhbXBsZS5wZGIgICAgICBTeW1ib2xpYyBpbmZvcm1hdGlvbiBmb3IgZGVidWdnaW5nIGV4YW1wbGUuZXhlCisKKyAgZXhhbXBsZV9kLmV4ZSAgICBBIHpsaWIxLmRsbCBib3VuZCBleGFtcGxlICh1c2luZyB6ZGxsLmxpYikKKyAgZXhhbXBsZV9kLnBkYiAgICBTeW1ib2xpYyBpbmZvcm1hdGlvbiBmb3IgZGVidWdnaW5nIGV4YW1wbGVfZC5leGUKKworICBtaW5pZ3ppcC5leGUgICAgIEEgc3RhdGljYWxseS1ib3VuZCB0ZXN0IHByb2dyYW0gKHVzaW5nIHpsaWIubGliLCBub3QgdGhlIGRsbCkKKyAgbWluaWd6aXAucGRiICAgICBTeW1ib2xpYyBpbmZvcm1hdGlvbiBmb3IgZGVidWdnaW5nIG1pbmlnemlwLmV4ZQorCisgIG1pbmlnemlwX2QuZXhlICAgQSB6bGliMS5kbGwgYm91bmQgdGVzdCBwcm9ncmFtICh1c2luZyB6ZGxsLmxpYikKKyAgbWluaWd6aXBfZC5wZGIgICBTeW1ib2xpYyBpbmZvcm1hdGlvbiBmb3IgZGVidWdnaW5nIG1pbmlnemlwX2QuZXhlCisKKyAgemxpYi5oICAgICAgICAgICBJbnN0YWxsIHRoZXNlIGZpbGVzIGludG8gdGhlIGNvbXBpbGVycycgSU5DTFVERSBwYXRoIHRvCisgIHpjb25mLmggICAgICAgICAgY29tcGlsZSBwcm9ncmFtcyB3aGljaCB1c2UgemxpYi5saWIgb3IgemRsbC5saWIKKworICB6ZGxsLmxpYiAgICAgICAgIEluc3RhbGwgdGhlc2UgZmlsZXMgaW50byB0aGUgY29tcGlsZXJzJyBMSUIgcGF0aCBpZiBsaW5raW5nCisgIHpkbGwuZXhwICAgICAgICAgYSBjb21waWxlZCBwcm9ncmFtIHRvIHRoZSB6bGliMS5kbGwgYmluYXJ5CisKKyAgemxpYi5saWIgICAgICAgICBJbnN0YWxsIHRoZXNlIGZpbGVzIGludG8gdGhlIGNvbXBpbGVycycgTElCIHBhdGggdG8gbGluayB6bGliCisgIHpsaWIucGRiICAgICAgICAgaW50byBjb21waWxlZCBwcm9ncmFtcywgd2l0aG91dCB6bGliMS5kbGwgcnVudGltZSBkZXBlbmRlbmN5CisgICAgICAgICAgICAgICAgICAgKHpsaWIucGRiIHByb3ZpZGVzIGRlYnVnZ2luZyBpbmZvIHRvIHRoZSBjb21waWxlIHRpbWUgbGlua2VyKQorCisgIHpsaWIxLmRsbCAgICAgICAgSW5zdGFsbCB0aGlzIGJpbmFyeSBzaGFyZWQgbGlicmFyeSBpbnRvIHRoZSBzeXN0ZW0gUEFUSCwgb3IKKyAgICAgICAgICAgICAgICAgICB0aGUgcHJvZ3JhbSdzIHJ1bnRpbWUgZGlyZWN0b3J5ICh3aGVyZSB0aGUgLmV4ZSByZXNpZGVzKQorICB6bGliMS5wZGIgICAgICAgIEluc3RhbGwgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHpsaWIxLmRsbCwgaW4gb3JkZXIgdG8gZGVidWcKKyAgICAgICAgICAgICAgICAgICBhbiBhcHBsaWNhdGlvbiBjcmFzaCB1c2luZyBXaW5EYmcgb3Igc2ltaWxhciB0b29scy4KKworQWxsIC5wZGIgZmlsZXMgYWJvdmUgYXJlIGVudGlyZWx5IG9wdGlvbmFsLCBidXQgYXJlIHZlcnkgdXNlZnVsIHRvIGEgZGV2ZWxvcGVyCithdHRlbXB0aW5nIHRvIGRpYWdub3NlIHByb2dyYW0gbWlzYmVoYXZpb3Igb3IgYSBjcmFzaC4gIE1hbnkgYWRkaXRpb25hbAoraW1wb3J0YW50IGZpbGVzIGZvciBkZXZlbG9wZXJzIGNhbiBiZSBmb3VuZCBpbiB0aGUgemxpYjEyNC56aXAgc291cmNlIHBhY2thZ2UKK2F2YWlsYWJsZSBmcm9tIGh0dHA6Ly96bGliLm5ldC8gLSByZXZpZXcgdGhhdCBwYWNrYWdlJ3MgUkVBRE1FIGZpbGUgZm9yIGRldGFpbHMuCisKKworQWNrbm93bGVkZ21lbnRzOgorCitUaGUgZGVmbGF0ZSBmb3JtYXQgdXNlZCBieSB6bGliIHdhcyBkZWZpbmVkIGJ5IFBoaWwgS2F0ei4gIFRoZSBkZWZsYXRlIGFuZAoremxpYiBzcGVjaWZpY2F0aW9ucyB3ZXJlIHdyaXR0ZW4gYnkgTC4gIFBldGVyIERldXRzY2guICBUaGFua3MgdG8gYWxsIHRoZQorcGVvcGxlIHdobyByZXBvcnRlZCBwcm9ibGVtcyBhbmQgc3VnZ2VzdGVkIHZhcmlvdXMgaW1wcm92ZW1lbnRzIGluIHpsaWI7IHRoZXkKK2FyZSB0b28gbnVtZXJvdXMgdG8gY2l0ZSBoZXJlLgorCisKK0NvcHlyaWdodCBub3RpY2U6CisKKyAgKEMpIDE5OTUtMjAxMCBKZWFuLWxvdXAgR2FpbGx5IGFuZCBNYXJrIEFkbGVyCisKKyAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKKyAgd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcworICBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgorCisgIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAorICBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0CisgIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKKworICAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAorICAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQorICAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKKyAgICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KKyAgMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKKyAgICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgorICAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgorCisgIEplYW4tbG91cCBHYWlsbHkgICAgICAgIE1hcmsgQWRsZXIKKyAgamxvdXBAZ3ppcC5vcmcgICAgICAgICAgbWFkbGVyQGFsdW1uaS5jYWx0ZWNoLmVkdQorCitJZiB5b3UgdXNlIHRoZSB6bGliIGxpYnJhcnkgaW4gYSBwcm9kdWN0LCB3ZSB3b3VsZCBhcHByZWNpYXRlICpub3QqIHJlY2VpdmluZworbGVuZ3RoeSBsZWdhbCBkb2N1bWVudHMgdG8gc2lnbi4gIFRoZSBzb3VyY2VzIGFyZSBwcm92aWRlZCBmb3IgZnJlZSBidXQgd2l0aG91dAord2FycmFudHkgb2YgYW55IGtpbmQuICBUaGUgbGlicmFyeSBoYXMgYmVlbiBlbnRpcmVseSB3cml0dGVuIGJ5IEplYW4tbG91cAorR2FpbGx5IGFuZCBNYXJrIEFkbGVyOyBpdCBkb2VzIG5vdCBpbmNsdWRlIHRoaXJkLXBhcnR5IGNvZGUuCisKK0lmIHlvdSByZWRpc3RyaWJ1dGUgbW9kaWZpZWQgc291cmNlcywgd2Ugd291bGQgYXBwcmVjaWF0ZSB0aGF0IHlvdSBpbmNsdWRlIGluCit0aGUgZmlsZSBDaGFuZ2VMb2cgaGlzdG9yeSBpbmZvcm1hdGlvbiBkb2N1bWVudGluZyB5b3VyIGNoYW5nZXMuICBQbGVhc2UgcmVhZAordGhlIEZBUSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgZGlzdHJpYnV0aW9uIG9mIG1vZGlmaWVkIHNvdXJjZSB2ZXJzaW9ucy4KZGlmZiAtLWdpdCBhL3psaWItMS4yLjYvd2luMzIvVmlzdWFsQy50eHQgYi96bGliLTEuMi42L3dpbjMyL1Zpc3VhbEMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3OWE1ZmMKLS0tIC9kZXYvbnVsbAorKysgYi96bGliLTEuMi42L3dpbjMyL1Zpc3VhbEMudHh0CkBAIC0wLDAgKzEsMyBAQAorCitUbyBidWlsZCB6bGliIHVzaW5nIHRoZSBNaWNyb3NvZnQgVmlzdWFsIEMrKyBlbnZpcm9ubWVudCwKK3VzZSB0aGUgYXBwcm9wcmlhdGUgcHJvamVjdCBmcm9tIHRoZSBwcm9qZWN0cy8gZGlyZWN0b3J5LgpkaWZmIC0tZ2l0IGEvemxpYi0xLjIuNi93aW4zMi96bGliLmRlZiBiL3psaWItMS4yLjYvd2luMzIvemxpYi5kZWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk2YzE4YQotLS0gL2Rldi9udWxsCisrKyBiL3psaWItMS4yLjYvd2luMzIvemxpYi5kZWYKQEAgLTAsMCArMSw4NCBAQAorOyB6bGliIGRhdGEgY29tcHJlc3Npb24gbGlicmFyeQorRVhQT1JUUworOyBiYXNpYyBmdW5jdGlvbnMKKyAgICB6bGliVmVyc2lvbgorICAgIGRlZmxhdGUKKyAgICBkZWZsYXRlRW5kCisgICAgaW5mbGF0ZQorICAgIGluZmxhdGVFbmQKKzsgYWR2YW5jZWQgZnVuY3Rpb25zCisgICAgZGVmbGF0ZVNldERpY3Rpb25hcnkKKyAgICBkZWZsYXRlQ29weQorICAgIGRlZmxhdGVSZXNldAorICAgIGRlZmxhdGVQYXJhbXMKKyAgICBkZWZsYXRlVHVuZQorICAgIGRlZmxhdGVCb3VuZAorICAgIGRlZmxhdGVQZW5kaW5nCisgICAgZGVmbGF0ZVByaW1lCisgICAgZGVmbGF0ZVNldEhlYWRlcgorICAgIGluZmxhdGVTZXREaWN0aW9uYXJ5CisgICAgaW5mbGF0ZVN5bmMKKyAgICBpbmZsYXRlQ29weQorICAgIGluZmxhdGVSZXNldAorICAgIGluZmxhdGVSZXNldDIKKyAgICBpbmZsYXRlUHJpbWUKKyAgICBpbmZsYXRlTWFyaworICAgIGluZmxhdGVHZXRIZWFkZXIKKyAgICBpbmZsYXRlQmFjaworICAgIGluZmxhdGVCYWNrRW5kCisgICAgemxpYkNvbXBpbGVGbGFncworOyB1dGlsaXR5IGZ1bmN0aW9ucworICAgIGNvbXByZXNzCisgICAgY29tcHJlc3MyCisgICAgY29tcHJlc3NCb3VuZAorICAgIHVuY29tcHJlc3MKKyAgICBnem9wZW4KKyAgICBnemRvcGVuCisgICAgZ3pidWZmZXIKKyAgICBnenNldHBhcmFtcworICAgIGd6cmVhZAorICAgIGd6d3JpdGUKKyAgICBnenByaW50ZgorICAgIGd6cHV0cworICAgIGd6Z2V0cworICAgIGd6cHV0YworICAgIGd6Z2V0YworICAgIGd6dW5nZXRjCisgICAgZ3pmbHVzaAorICAgIGd6c2VlaworICAgIGd6cmV3aW5kCisgICAgZ3p0ZWxsCisgICAgZ3pvZmZzZXQKKyAgICBnemVvZgorICAgIGd6ZGlyZWN0CisgICAgZ3pjbG9zZQorICAgIGd6Y2xvc2VfcgorICAgIGd6Y2xvc2VfdworICAgIGd6ZXJyb3IKKyAgICBnemNsZWFyZXJyCis7IGxhcmdlIGZpbGUgZnVuY3Rpb25zCisgICAgZ3pvcGVuNjQKKyAgICBnenNlZWs2NAorICAgIGd6dGVsbDY0CisgICAgZ3pvZmZzZXQ2NAorICAgIGFkbGVyMzJfY29tYmluZTY0CisgICAgY3JjMzJfY29tYmluZTY0Cis7IGNoZWNrc3VtIGZ1bmN0aW9ucworICAgIGFkbGVyMzIKKyAgICBjcmMzMgorICAgIGFkbGVyMzJfY29tYmluZQorICAgIGNyYzMyX2NvbWJpbmUKKzsgdmFyaW91cyBoYWNrcywgZG9uJ3QgbG9vayA6KQorICAgIGRlZmxhdGVJbml0XworICAgIGRlZmxhdGVJbml0Ml8KKyAgICBpbmZsYXRlSW5pdF8KKyAgICBpbmZsYXRlSW5pdDJfCisgICAgaW5mbGF0ZUJhY2tJbml0XworICAgIHpFcnJvcgorICAgIGluZmxhdGVTeW5jUG9pbnQKKyAgICBnZXRfY3JjX3RhYmxlCisgICAgaW5mbGF0ZVVuZGVybWluZQorICAgIGluZmxhdGVSZXNldEtlZXAKKyAgICBkZWZsYXRlUmVzZXRLZWVwCisgICAgZ3pnZXRjXworICAgIGd6ZmxhZ3MKZGlmZiAtLWdpdCBhL3psaWItMS4yLjYvd2luMzIvemxpYjEucmMgYi96bGliLTEuMi42L3dpbjMyL3psaWIxLnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkMWQ3ZmYKLS0tIC9kZXYvbnVsbAorKysgYi96bGliLTEuMi42L3dpbjMyL3psaWIxLnJjCkBAIC0wLDAgKzEsNDAgQEAKKyNpbmNsdWRlIDx3aW52ZXIuaD4KKyNpbmNsdWRlICIuLi96bGliLmgiCisKKyNpZmRlZiBHQ0NfV0lORFJFUworVlNfVkVSU0lPTl9JTkZPCQlWRVJTSU9OSU5GTworI2Vsc2UKK1ZTX1ZFUlNJT05fSU5GTwkJVkVSU0lPTklORk8JTU9WRUFCTEUgSU1QVVJFIExPQURPTkNBTEwgRElTQ0FSREFCTEUKKyNlbmRpZgorICBGSUxFVkVSU0lPTgkJWkxJQl9WRVJfTUFKT1IsWkxJQl9WRVJfTUlOT1IsWkxJQl9WRVJfUkVWSVNJT04sMAorICBQUk9EVUNUVkVSU0lPTglaTElCX1ZFUl9NQUpPUixaTElCX1ZFUl9NSU5PUixaTElCX1ZFUl9SRVZJU0lPTiwwCisgIEZJTEVGTEFHU01BU0sJCVZTX0ZGSV9GSUxFRkxBR1NNQVNLCisjaWZkZWYgX0RFQlVHCisgIEZJTEVGTEFHUwkJMQorI2Vsc2UKKyAgRklMRUZMQUdTCQkwCisjZW5kaWYKKyAgRklMRU9TCQlWT1NfX1dJTkRPV1MzMgorICBGSUxFVFlQRQkJVkZUX0RMTAorICBGSUxFU1VCVFlQRQkJMAkvLyBub3QgdXNlZAorQkVHSU4KKyAgQkxPQ0sgIlN0cmluZ0ZpbGVJbmZvIgorICBCRUdJTgorICAgIEJMT0NLICIwNDA5MDRFNCIKKyAgICAvL2xhbmd1YWdlIElEID0gVS5TLiBFbmdsaXNoLCBjaGFyIHNldCA9IFdpbmRvd3MsIE11bHRpbGluZ3VhbAorICAgIEJFR0lOCisgICAgICBWQUxVRSAiRmlsZURlc2NyaXB0aW9uIiwJInpsaWIgZGF0YSBjb21wcmVzc2lvbiBsaWJyYXJ5XDAiCisgICAgICBWQUxVRSAiRmlsZVZlcnNpb24iLAlaTElCX1ZFUlNJT04gIlwwIgorICAgICAgVkFMVUUgIkludGVybmFsTmFtZSIsCSJ6bGliMS5kbGxcMCIKKyAgICAgIFZBTFVFICJMZWdhbENvcHlyaWdodCIsCSIoQykgMTk5NS0yMDA2IEplYW4tbG91cCBHYWlsbHkgJiBNYXJrIEFkbGVyXDAiCisgICAgICBWQUxVRSAiT3JpZ2luYWxGaWxlbmFtZSIsCSJ6bGliMS5kbGxcMCIKKyAgICAgIFZBTFVFICJQcm9kdWN0TmFtZSIsCSJ6bGliXDAiCisgICAgICBWQUxVRSAiUHJvZHVjdFZlcnNpb24iLAlaTElCX1ZFUlNJT04gIlwwIgorICAgICAgVkFMVUUgIkNvbW1lbnRzIiwJCSJGb3IgbW9yZSBpbmZvcm1hdGlvbiB2aXNpdCBodHRwOi8vd3d3LnpsaWIubmV0L1wwIgorICAgIEVORAorICBFTkQKKyAgQkxPQ0sgIlZhckZpbGVJbmZvIgorICBCRUdJTgorICAgIFZBTFVFICJUcmFuc2xhdGlvbiIsIDB4MDQwOSwgMTI1MgorICBFTkQKK0VORApkaWZmIC0tZ2l0IGEvemxpYi0xLjIuNi96Y29uZi5oIGIvemxpYi0xLjIuNi96Y29uZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxYzgwYWMKLS0tIC9kZXYvbnVsbAorKysgYi96bGliLTEuMi42L3pjb25mLmgKQEAgLTAsMCArMSw0NjYgQEAKKy8qIHpjb25mLmggLS0gY29uZmlndXJhdGlvbiBvZiB0aGUgemxpYiBjb21wcmVzc2lvbiBsaWJyYXJ5CisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAxMSBKZWFuLWxvdXAgR2FpbGx5LgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAorICovCisKKy8qIEAoIykgJElkJCAqLworCisjaWZuZGVmIFpDT05GX0gKKyNkZWZpbmUgWkNPTkZfSAorCisvKgorICogSWYgeW91ICpyZWFsbHkqIG5lZWQgYSB1bmlxdWUgcHJlZml4IGZvciBhbGwgdHlwZXMgYW5kIGxpYnJhcnkgZnVuY3Rpb25zLAorICogY29tcGlsZSB3aXRoIC1EWl9QUkVGSVguIFRoZSAic3RhbmRhcmQiIHpsaWIgc2hvdWxkIGJlIGNvbXBpbGVkIHdpdGhvdXQgaXQuCisgKiBFdmVuIGJldHRlciB0aGFuIGNvbXBpbGluZyB3aXRoIC1EWl9QUkVGSVggd291bGQgYmUgdG8gdXNlIGNvbmZpZ3VyZSB0byBzZXQKKyAqIHRoaXMgcGVybWFuZW50bHkgaW4gemNvbmYuaCB1c2luZyAiLi9jb25maWd1cmUgLS16cHJlZml4Ii4KKyAqLworI2lmZGVmIFpfUFJFRklYICAgICAvKiBtYXkgYmUgc2V0IHRvICNpZiAxIGJ5IC4vY29uZmlndXJlICovCisjICBkZWZpbmUgWl9QUkVGSVhfU0VUCisKKy8qIGFsbCBsaW5rZWQgc3ltYm9scyAqLworIyAgZGVmaW5lIF9kaXN0X2NvZGUgICAgICAgICAgICB6X19kaXN0X2NvZGUKKyMgIGRlZmluZSBfbGVuZ3RoX2NvZGUgICAgICAgICAgel9fbGVuZ3RoX2NvZGUKKyMgIGRlZmluZSBfdHJfYWxpZ24gICAgICAgICAgICAgel9fdHJfYWxpZ24KKyMgIGRlZmluZSBfdHJfZmx1c2hfYmxvY2sgICAgICAgel9fdHJfZmx1c2hfYmxvY2sKKyMgIGRlZmluZSBfdHJfaW5pdCAgICAgICAgICAgICAgel9fdHJfaW5pdAorIyAgZGVmaW5lIF90cl9zdG9yZWRfYmxvY2sgICAgICB6X190cl9zdG9yZWRfYmxvY2sKKyMgIGRlZmluZSBfdHJfdGFsbHkgICAgICAgICAgICAgel9fdHJfdGFsbHkKKyMgIGRlZmluZSBhZGxlcjMyICAgICAgICAgICAgICAgel9hZGxlcjMyCisjICBkZWZpbmUgYWRsZXIzMl9jb21iaW5lICAgICAgIHpfYWRsZXIzMl9jb21iaW5lCisjICBkZWZpbmUgYWRsZXIzMl9jb21iaW5lNjQgICAgIHpfYWRsZXIzMl9jb21iaW5lNjQKKyMgIGlmbmRlZiBaX1NPTE8KKyMgICAgZGVmaW5lIGNvbXByZXNzICAgICAgICAgICAgICB6X2NvbXByZXNzCisjICAgIGRlZmluZSBjb21wcmVzczIgICAgICAgICAgICAgel9jb21wcmVzczIKKyMgICAgZGVmaW5lIGNvbXByZXNzQm91bmQgICAgICAgICB6X2NvbXByZXNzQm91bmQKKyMgIGVuZGlmCisjICBkZWZpbmUgY3JjMzIgICAgICAgICAgICAgICAgIHpfY3JjMzIKKyMgIGRlZmluZSBjcmMzMl9jb21iaW5lICAgICAgICAgel9jcmMzMl9jb21iaW5lCisjICBkZWZpbmUgY3JjMzJfY29tYmluZTY0ICAgICAgIHpfY3JjMzJfY29tYmluZTY0CisjICBkZWZpbmUgZGVmbGF0ZSAgICAgICAgICAgICAgIHpfZGVmbGF0ZQorIyAgZGVmaW5lIGRlZmxhdGVCb3VuZCAgICAgICAgICB6X2RlZmxhdGVCb3VuZAorIyAgZGVmaW5lIGRlZmxhdGVDb3B5ICAgICAgICAgICB6X2RlZmxhdGVDb3B5CisjICBkZWZpbmUgZGVmbGF0ZUVuZCAgICAgICAgICAgIHpfZGVmbGF0ZUVuZAorIyAgZGVmaW5lIGRlZmxhdGVJbml0Ml8gICAgICAgICB6X2RlZmxhdGVJbml0Ml8KKyMgIGRlZmluZSBkZWZsYXRlSW5pdF8gICAgICAgICAgel9kZWZsYXRlSW5pdF8KKyMgIGRlZmluZSBkZWZsYXRlUGFyYW1zICAgICAgICAgel9kZWZsYXRlUGFyYW1zCisjICBkZWZpbmUgZGVmbGF0ZVBlbmRpbmcgICAgICAgIHpfZGVmbGF0ZVBlbmRpbmcKKyMgIGRlZmluZSBkZWZsYXRlUHJpbWUgICAgICAgICAgel9kZWZsYXRlUHJpbWUKKyMgIGRlZmluZSBkZWZsYXRlUmVzZXQgICAgICAgICAgel9kZWZsYXRlUmVzZXQKKyMgIGRlZmluZSBkZWZsYXRlUmVzZXRLZWVwICAgICAgel9kZWZsYXRlUmVzZXRLZWVwCisjICBkZWZpbmUgZGVmbGF0ZVNldERpY3Rpb25hcnkgIHpfZGVmbGF0ZVNldERpY3Rpb25hcnkKKyMgIGRlZmluZSBkZWZsYXRlU2V0SGVhZGVyICAgICAgel9kZWZsYXRlU2V0SGVhZGVyCisjICBkZWZpbmUgZGVmbGF0ZVR1bmUgICAgICAgICAgIHpfZGVmbGF0ZVR1bmUKKyMgIGRlZmluZSBkZWZsYXRlX2NvcHlyaWdodCAgICAgel9kZWZsYXRlX2NvcHlyaWdodAorIyAgZGVmaW5lIGdldF9jcmNfdGFibGUgICAgICAgICB6X2dldF9jcmNfdGFibGUKKyMgIGlmbmRlZiBaX1NPTE8KKyMgICAgZGVmaW5lIGd6X2Vycm9yICAgICAgICAgICAgICB6X2d6X2Vycm9yCisjICAgIGRlZmluZSBnel9pbnRtYXggICAgICAgICAgICAgel9nel9pbnRtYXgKKyMgICAgZGVmaW5lIGd6X3N0cndpbmVycm9yICAgICAgICB6X2d6X3N0cndpbmVycm9yCisjICAgIGRlZmluZSBnemJ1ZmZlciAgICAgICAgICAgICAgel9nemJ1ZmZlcgorIyAgICBkZWZpbmUgZ3pjbGVhcmVyciAgICAgICAgICAgIHpfZ3pjbGVhcmVycgorIyAgICBkZWZpbmUgZ3pjbG9zZSAgICAgICAgICAgICAgIHpfZ3pjbG9zZQorIyAgICBkZWZpbmUgZ3pjbG9zZV9yICAgICAgICAgICAgIHpfZ3pjbG9zZV9yCisjICAgIGRlZmluZSBnemNsb3NlX3cgICAgICAgICAgICAgel9nemNsb3NlX3cKKyMgICAgZGVmaW5lIGd6ZGlyZWN0ICAgICAgICAgICAgICB6X2d6ZGlyZWN0CisjICAgIGRlZmluZSBnemRvcGVuICAgICAgICAgICAgICAgel9nemRvcGVuCisjICAgIGRlZmluZSBnemVvZiAgICAgICAgICAgICAgICAgel9nemVvZgorIyAgICBkZWZpbmUgZ3plcnJvciAgICAgICAgICAgICAgIHpfZ3plcnJvcgorIyAgICBkZWZpbmUgZ3pmbGFncyAgICAgICAgICAgICAgIHpfZ3pmbGFncworIyAgICBkZWZpbmUgZ3pmbHVzaCAgICAgICAgICAgICAgIHpfZ3pmbHVzaAorIyAgICBkZWZpbmUgZ3pnZXRjICAgICAgICAgICAgICAgIHpfZ3pnZXRjCisjICAgIGRlZmluZSBnemdldGNfICAgICAgICAgICAgICAgel9nemdldGNfCisjICAgIGRlZmluZSBnemdldHMgICAgICAgICAgICAgICAgel9nemdldHMKKyMgICAgZGVmaW5lIGd6b2Zmc2V0ICAgICAgICAgICAgICB6X2d6b2Zmc2V0CisjICAgIGRlZmluZSBnem9mZnNldDY0ICAgICAgICAgICAgel9nem9mZnNldDY0CisjICAgIGRlZmluZSBnem9wZW4gICAgICAgICAgICAgICAgel9nem9wZW4KKyMgICAgZGVmaW5lIGd6b3BlbjY0ICAgICAgICAgICAgICB6X2d6b3BlbjY0CisjICAgIGRlZmluZSBnenByaW50ZiAgICAgICAgICAgICAgel9nenByaW50ZgorIyAgICBkZWZpbmUgZ3pwdXRjICAgICAgICAgICAgICAgIHpfZ3pwdXRjCisjICAgIGRlZmluZSBnenB1dHMgICAgICAgICAgICAgICAgel9nenB1dHMKKyMgICAgZGVmaW5lIGd6cmVhZCAgICAgICAgICAgICAgICB6X2d6cmVhZAorIyAgICBkZWZpbmUgZ3pyZXdpbmQgICAgICAgICAgICAgIHpfZ3pyZXdpbmQKKyMgICAgZGVmaW5lIGd6c2VlayAgICAgICAgICAgICAgICB6X2d6c2VlaworIyAgICBkZWZpbmUgZ3pzZWVrNjQgICAgICAgICAgICAgIHpfZ3pzZWVrNjQKKyMgICAgZGVmaW5lIGd6c2V0cGFyYW1zICAgICAgICAgICB6X2d6c2V0cGFyYW1zCisjICAgIGRlZmluZSBnenRlbGwgICAgICAgICAgICAgICAgel9nenRlbGwKKyMgICAgZGVmaW5lIGd6dGVsbDY0ICAgICAgICAgICAgICB6X2d6dGVsbDY0CisjICAgIGRlZmluZSBnenVuZ2V0YyAgICAgICAgICAgICAgel9nenVuZ2V0YworIyAgICBkZWZpbmUgZ3p3cml0ZSAgICAgICAgICAgICAgIHpfZ3p3cml0ZQorIyAgZW5kaWYKKyMgIGRlZmluZSBpbmZsYXRlICAgICAgICAgICAgICAgel9pbmZsYXRlCisjICBkZWZpbmUgaW5mbGF0ZUJhY2sgICAgICAgICAgIHpfaW5mbGF0ZUJhY2sKKyMgIGRlZmluZSBpbmZsYXRlQmFja0VuZCAgICAgICAgel9pbmZsYXRlQmFja0VuZAorIyAgZGVmaW5lIGluZmxhdGVCYWNrSW5pdF8gICAgICB6X2luZmxhdGVCYWNrSW5pdF8KKyMgIGRlZmluZSBpbmZsYXRlQ29weSAgICAgICAgICAgel9pbmZsYXRlQ29weQorIyAgZGVmaW5lIGluZmxhdGVFbmQgICAgICAgICAgICB6X2luZmxhdGVFbmQKKyMgIGRlZmluZSBpbmZsYXRlR2V0SGVhZGVyICAgICAgel9pbmZsYXRlR2V0SGVhZGVyCisjICBkZWZpbmUgaW5mbGF0ZUluaXQyXyAgICAgICAgIHpfaW5mbGF0ZUluaXQyXworIyAgZGVmaW5lIGluZmxhdGVJbml0XyAgICAgICAgICB6X2luZmxhdGVJbml0XworIyAgZGVmaW5lIGluZmxhdGVNYXJrICAgICAgICAgICB6X2luZmxhdGVNYXJrCisjICBkZWZpbmUgaW5mbGF0ZVByaW1lICAgICAgICAgIHpfaW5mbGF0ZVByaW1lCisjICBkZWZpbmUgaW5mbGF0ZVJlc2V0ICAgICAgICAgIHpfaW5mbGF0ZVJlc2V0CisjICBkZWZpbmUgaW5mbGF0ZVJlc2V0MiAgICAgICAgIHpfaW5mbGF0ZVJlc2V0MgorIyAgZGVmaW5lIGluZmxhdGVTZXREaWN0aW9uYXJ5ICB6X2luZmxhdGVTZXREaWN0aW9uYXJ5CisjICBkZWZpbmUgaW5mbGF0ZVN5bmMgICAgICAgICAgIHpfaW5mbGF0ZVN5bmMKKyMgIGRlZmluZSBpbmZsYXRlU3luY1BvaW50ICAgICAgel9pbmZsYXRlU3luY1BvaW50CisjICBkZWZpbmUgaW5mbGF0ZVVuZGVybWluZSAgICAgIHpfaW5mbGF0ZVVuZGVybWluZQorIyAgZGVmaW5lIGluZmxhdGVSZXNldEtlZXAgICAgICB6X2luZmxhdGVSZXNldEtlZXAKKyMgIGRlZmluZSBpbmZsYXRlX2NvcHlyaWdodCAgICAgel9pbmZsYXRlX2NvcHlyaWdodAorIyAgZGVmaW5lIGluZmxhdGVfZmFzdCAgICAgICAgICB6X2luZmxhdGVfZmFzdAorIyAgZGVmaW5lIGluZmxhdGVfdGFibGUgICAgICAgICB6X2luZmxhdGVfdGFibGUKKyMgIGlmbmRlZiBaX1NPTE8KKyMgICAgZGVmaW5lIHVuY29tcHJlc3MgICAgICAgICAgICB6X3VuY29tcHJlc3MKKyMgIGVuZGlmCisjICBkZWZpbmUgekVycm9yICAgICAgICAgICAgICAgIHpfekVycm9yCisjICBpZm5kZWYgWl9TT0xPCisjICAgIGRlZmluZSB6Y2FsbG9jICAgICAgICAgICAgICAgel96Y2FsbG9jCisjICAgIGRlZmluZSB6Y2ZyZWUgICAgICAgICAgICAgICAgel96Y2ZyZWUKKyMgIGVuZGlmCisjICBkZWZpbmUgemxpYkNvbXBpbGVGbGFncyAgICAgIHpfemxpYkNvbXBpbGVGbGFncworIyAgZGVmaW5lIHpsaWJWZXJzaW9uICAgICAgICAgICB6X3psaWJWZXJzaW9uCisKKy8qIGFsbCB6bGliIHR5cGVkZWZzIGluIHpsaWIuaCBhbmQgemNvbmYuaCAqLworIyAgZGVmaW5lIEJ5dGUgICAgICAgICAgICAgICAgICB6X0J5dGUKKyMgIGRlZmluZSBCeXRlZiAgICAgICAgICAgICAgICAgel9CeXRlZgorIyAgZGVmaW5lIGFsbG9jX2Z1bmMgICAgICAgICAgICB6X2FsbG9jX2Z1bmMKKyMgIGRlZmluZSBjaGFyZiAgICAgICAgICAgICAgICAgel9jaGFyZgorIyAgZGVmaW5lIGZyZWVfZnVuYyAgICAgICAgICAgICB6X2ZyZWVfZnVuYworIyAgaWZuZGVmIFpfU09MTworIyAgICBkZWZpbmUgZ3pGaWxlICAgICAgICAgICAgICAgIHpfZ3pGaWxlCisjICAgIGRlZmluZSBnel9oZWFkZXIgICAgICAgICAgICAgel9nel9oZWFkZXIKKyMgICAgZGVmaW5lIGd6X2hlYWRlcnAgICAgICAgICAgICB6X2d6X2hlYWRlcnAKKyMgIGVuZGlmCisjICBkZWZpbmUgaW5fZnVuYyAgICAgICAgICAgICAgIHpfaW5fZnVuYworIyAgZGVmaW5lIGludGYgICAgICAgICAgICAgICAgICB6X2ludGYKKyMgIGRlZmluZSBvdXRfZnVuYyAgICAgICAgICAgICAgel9vdXRfZnVuYworIyAgZGVmaW5lIHVJbnQgICAgICAgICAgICAgICAgICB6X3VJbnQKKyMgIGRlZmluZSB1SW50ZiAgICAgICAgICAgICAgICAgel91SW50ZgorIyAgZGVmaW5lIHVMb25nICAgICAgICAgICAgICAgICB6X3VMb25nCisjICBkZWZpbmUgdUxvbmdmICAgICAgICAgICAgICAgIHpfdUxvbmdmCisjICBkZWZpbmUgdm9pZHAgICAgICAgICAgICAgICAgIHpfdm9pZHAKKyMgIGRlZmluZSB2b2lkcGMgICAgICAgICAgICAgICAgel92b2lkcGMKKyMgIGRlZmluZSB2b2lkcGYgICAgICAgICAgICAgICAgel92b2lkcGYKKworLyogYWxsIHpsaWIgc3RydWN0cyBpbiB6bGliLmggYW5kIHpjb25mLmggKi8KKyMgIGlmbmRlZiBaX1NPTE8KKyMgICAgZGVmaW5lIGd6X2hlYWRlcl9zICAgICAgICAgICB6X2d6X2hlYWRlcl9zCisjICBlbmRpZgorIyAgZGVmaW5lIGludGVybmFsX3N0YXRlICAgICAgICB6X2ludGVybmFsX3N0YXRlCisKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX01TRE9TX18pICYmICFkZWZpbmVkKE1TRE9TKQorIyAgZGVmaW5lIE1TRE9TCisjZW5kaWYKKyNpZiAoZGVmaW5lZChPU18yKSB8fCBkZWZpbmVkKF9fT1MyX18pKSAmJiAhZGVmaW5lZChPUzIpCisjICBkZWZpbmUgT1MyCisjZW5kaWYKKyNpZiBkZWZpbmVkKF9XSU5ET1dTKSAmJiAhZGVmaW5lZChXSU5ET1dTKQorIyAgZGVmaW5lIFdJTkRPV1MKKyNlbmRpZgorI2lmIGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKF9XSU4zMl9XQ0UpIHx8IGRlZmluZWQoX19XSU4zMl9fKQorIyAgaWZuZGVmIFdJTjMyCisjICAgIGRlZmluZSBXSU4zMgorIyAgZW5kaWYKKyNlbmRpZgorI2lmIChkZWZpbmVkKE1TRE9TKSB8fCBkZWZpbmVkKE9TMikgfHwgZGVmaW5lZChXSU5ET1dTKSkgJiYgIWRlZmluZWQoV0lOMzIpCisjICBpZiAhZGVmaW5lZChfX0dOVUNfXykgJiYgIWRlZmluZWQoX19GTEFUX18pICYmICFkZWZpbmVkKF9fMzg2X18pCisjICAgIGlmbmRlZiBTWVMxNkJJVAorIyAgICAgIGRlZmluZSBTWVMxNkJJVAorIyAgICBlbmRpZgorIyAgZW5kaWYKKyNlbmRpZgorCisvKgorICogQ29tcGlsZSB3aXRoIC1ETUFYU0VHXzY0SyBpZiB0aGUgYWxsb2MgZnVuY3Rpb24gY2Fubm90IGFsbG9jYXRlIG1vcmUKKyAqIHRoYW4gNjRrIGJ5dGVzIGF0IGEgdGltZSAobmVlZGVkIG9uIHN5c3RlbXMgd2l0aCAxNi1iaXQgaW50KS4KKyAqLworI2lmZGVmIFNZUzE2QklUCisjICBkZWZpbmUgTUFYU0VHXzY0SworI2VuZGlmCisjaWZkZWYgTVNET1MKKyMgIGRlZmluZSBVTkFMSUdORURfT0sKKyNlbmRpZgorCisjaWZkZWYgX19TVERDX1ZFUlNJT05fXworIyAgaWZuZGVmIFNUREMKKyMgICAgZGVmaW5lIFNUREMKKyMgIGVuZGlmCisjICBpZiBfX1NURENfVkVSU0lPTl9fID49IDE5OTkwMUwKKyMgICAgaWZuZGVmIFNUREM5OQorIyAgICAgIGRlZmluZSBTVERDOTkKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjZW5kaWYKKyNpZiAhZGVmaW5lZChTVERDKSAmJiAoZGVmaW5lZChfX1NURENfXykgfHwgZGVmaW5lZChfX2NwbHVzcGx1cykpCisjICBkZWZpbmUgU1REQworI2VuZGlmCisjaWYgIWRlZmluZWQoU1REQykgJiYgKGRlZmluZWQoX19HTlVDX18pIHx8IGRlZmluZWQoX19CT1JMQU5EQ19fKSkKKyMgIGRlZmluZSBTVERDCisjZW5kaWYKKyNpZiAhZGVmaW5lZChTVERDKSAmJiAoZGVmaW5lZChNU0RPUykgfHwgZGVmaW5lZChXSU5ET1dTKSB8fCBkZWZpbmVkKFdJTjMyKSkKKyMgIGRlZmluZSBTVERDCisjZW5kaWYKKyNpZiAhZGVmaW5lZChTVERDKSAmJiAoZGVmaW5lZChPUzIpIHx8IGRlZmluZWQoX19IT1NfQUlYX18pKQorIyAgZGVmaW5lIFNUREMKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX09TNDAwX18pICYmICFkZWZpbmVkKFNUREMpICAgIC8qIGlTZXJpZXMgKGZvcm1lcmx5IEFTLzQwMCkuICovCisjICBkZWZpbmUgU1REQworI2VuZGlmCisKKyNpZm5kZWYgU1REQworIyAgaWZuZGVmIGNvbnN0IC8qIGNhbm5vdCB1c2UgIWRlZmluZWQoU1REQykgJiYgIWRlZmluZWQoY29uc3QpIG9uIE1hYyAqLworIyAgICBkZWZpbmUgY29uc3QgICAgICAgLyogbm90ZTogbmVlZCBhIG1vcmUgZ2VudGxlIHNvbHV0aW9uIGhlcmUgKi8KKyMgIGVuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQoWkxJQl9DT05TVCkgJiYgIWRlZmluZWQoel9jb25zdCkKKyMgIGRlZmluZSB6X2NvbnN0IGNvbnN0CisjZWxzZQorIyAgZGVmaW5lIHpfY29uc3QKKyNlbmRpZgorCisvKiBTb21lIE1hYyBjb21waWxlcnMgbWVyZ2UgYWxsIC5oIGZpbGVzIGluY29ycmVjdGx5OiAqLworI2lmIGRlZmluZWQoX19NV0VSS1NfXyl8fGRlZmluZWQoYXBwbGVjKXx8ZGVmaW5lZChUSElOS19DKXx8ZGVmaW5lZChfX1NDX18pCisjICBkZWZpbmUgTk9fRFVNTVlfREVDTAorI2VuZGlmCisKKy8qIE1heGltdW0gdmFsdWUgZm9yIG1lbUxldmVsIGluIGRlZmxhdGVJbml0MiAqLworI2lmbmRlZiBNQVhfTUVNX0xFVkVMCisjICBpZmRlZiBNQVhTRUdfNjRLCisjICAgIGRlZmluZSBNQVhfTUVNX0xFVkVMIDgKKyMgIGVsc2UKKyMgICAgZGVmaW5lIE1BWF9NRU1fTEVWRUwgOQorIyAgZW5kaWYKKyNlbmRpZgorCisvKiBNYXhpbXVtIHZhbHVlIGZvciB3aW5kb3dCaXRzIGluIGRlZmxhdGVJbml0MiBhbmQgaW5mbGF0ZUluaXQyLgorICogV0FSTklORzogcmVkdWNpbmcgTUFYX1dCSVRTIG1ha2VzIG1pbmlnemlwIHVuYWJsZSB0byBleHRyYWN0IC5neiBmaWxlcworICogY3JlYXRlZCBieSBnemlwLiAoRmlsZXMgY3JlYXRlZCBieSBtaW5pZ3ppcCBjYW4gc3RpbGwgYmUgZXh0cmFjdGVkIGJ5CisgKiBnemlwLikKKyAqLworI2lmbmRlZiBNQVhfV0JJVFMKKyMgIGRlZmluZSBNQVhfV0JJVFMgICAxNSAvKiAzMksgTFo3NyB3aW5kb3cgKi8KKyNlbmRpZgorCisvKiBUaGUgbWVtb3J5IHJlcXVpcmVtZW50cyBmb3IgZGVmbGF0ZSBhcmUgKGluIGJ5dGVzKToKKyAgICAgICAgICAgICgxIDw8ICh3aW5kb3dCaXRzKzIpKSArICAoMSA8PCAobWVtTGV2ZWwrOSkpCisgdGhhdCBpczogMTI4SyBmb3Igd2luZG93Qml0cz0xNSAgKyAgMTI4SyBmb3IgbWVtTGV2ZWwgPSA4ICAoZGVmYXVsdCB2YWx1ZXMpCisgcGx1cyBhIGZldyBraWxvYnl0ZXMgZm9yIHNtYWxsIG9iamVjdHMuIEZvciBleGFtcGxlLCBpZiB5b3Ugd2FudCB0byByZWR1Y2UKKyB0aGUgZGVmYXVsdCBtZW1vcnkgcmVxdWlyZW1lbnRzIGZyb20gMjU2SyB0byAxMjhLLCBjb21waWxlIHdpdGgKKyAgICAgbWFrZSBDRkxBR1M9Ii1PIC1ETUFYX1dCSVRTPTE0IC1ETUFYX01FTV9MRVZFTD03IgorIE9mIGNvdXJzZSB0aGlzIHdpbGwgZ2VuZXJhbGx5IGRlZ3JhZGUgY29tcHJlc3Npb24gKHRoZXJlJ3Mgbm8gZnJlZSBsdW5jaCkuCisKKyAgIFRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzIGZvciBpbmZsYXRlIGFyZSAoaW4gYnl0ZXMpIDEgPDwgd2luZG93Qml0cworIHRoYXQgaXMsIDMySyBmb3Igd2luZG93Qml0cz0xNSAoZGVmYXVsdCB2YWx1ZSkgcGx1cyBhIGZldyBraWxvYnl0ZXMKKyBmb3Igc21hbGwgb2JqZWN0cy4KKyovCisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFR5cGUgZGVjbGFyYXRpb25zICovCisKKyNpZm5kZWYgT0YgLyogZnVuY3Rpb24gcHJvdG90eXBlcyAqLworIyAgaWZkZWYgU1REQworIyAgICBkZWZpbmUgT0YoYXJncykgIGFyZ3MKKyMgIGVsc2UKKyMgICAgZGVmaW5lIE9GKGFyZ3MpICAoKQorIyAgZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIFpfQVJHIC8qIGZ1bmN0aW9uIHByb3RvdHlwZXMgZm9yIHN0ZGFyZyAqLworIyAgaWYgZGVmaW5lZChTVERDKSB8fCBkZWZpbmVkKFpfSEFWRV9TVERBUkdfSCkKKyMgICAgZGVmaW5lIFpfQVJHKGFyZ3MpICBhcmdzCisjICBlbHNlCisjICAgIGRlZmluZSBaX0FSRyhhcmdzKSAgKCkKKyMgIGVuZGlmCisjZW5kaWYKKworLyogVGhlIGZvbGxvd2luZyBkZWZpbml0aW9ucyBmb3IgRkFSIGFyZSBuZWVkZWQgb25seSBmb3IgTVNET1MgbWl4ZWQKKyAqIG1vZGVsIHByb2dyYW1taW5nIChzbWFsbCBvciBtZWRpdW0gbW9kZWwgd2l0aCBzb21lIGZhciBhbGxvY2F0aW9ucykuCisgKiBUaGlzIHdhcyB0ZXN0ZWQgb25seSB3aXRoIE1TQzsgZm9yIG90aGVyIE1TRE9TIGNvbXBpbGVycyB5b3UgbWF5IGhhdmUKKyAqIHRvIGRlZmluZSBOT19NRU1DUFkgaW4genV0aWwuaC4gIElmIHlvdSBkb24ndCBuZWVkIHRoZSBtaXhlZCBtb2RlbCwKKyAqIGp1c3QgZGVmaW5lIEZBUiB0byBiZSBlbXB0eS4KKyAqLworI2lmZGVmIFNZUzE2QklUCisjICBpZiBkZWZpbmVkKE1fSTg2U00pIHx8IGRlZmluZWQoTV9JODZNTSkKKyAgICAgLyogTVNDIHNtYWxsIG9yIG1lZGl1bSBtb2RlbCAqLworIyAgICBkZWZpbmUgU01BTExfTUVESVVNCisjICAgIGlmZGVmIF9NU0NfVkVSCisjICAgICAgZGVmaW5lIEZBUiBfZmFyCisjICAgIGVsc2UKKyMgICAgICBkZWZpbmUgRkFSIGZhcgorIyAgICBlbmRpZgorIyAgZW5kaWYKKyMgIGlmIChkZWZpbmVkKF9fU01BTExfXykgfHwgZGVmaW5lZChfX01FRElVTV9fKSkKKyAgICAgLyogVHVyYm8gQyBzbWFsbCBvciBtZWRpdW0gbW9kZWwgKi8KKyMgICAgZGVmaW5lIFNNQUxMX01FRElVTQorIyAgICBpZmRlZiBfX0JPUkxBTkRDX18KKyMgICAgICBkZWZpbmUgRkFSIF9mYXIKKyMgICAgZWxzZQorIyAgICAgIGRlZmluZSBGQVIgZmFyCisjICAgIGVuZGlmCisjICBlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFdJTkRPV1MpIHx8IGRlZmluZWQoV0lOMzIpCisgICAvKiBJZiBidWlsZGluZyBvciB1c2luZyB6bGliIGFzIGEgRExMLCBkZWZpbmUgWkxJQl9ETEwuCisgICAgKiBUaGlzIGlzIG5vdCBtYW5kYXRvcnksIGJ1dCBpdCBvZmZlcnMgYSBsaXR0bGUgcGVyZm9ybWFuY2UgaW5jcmVhc2UuCisgICAgKi8KKyMgIGlmZGVmIFpMSUJfRExMCisjICAgIGlmIGRlZmluZWQoV0lOMzIpICYmICghZGVmaW5lZChfX0JPUkxBTkRDX18pIHx8IChfX0JPUkxBTkRDX18gPj0gMHg1MDApKQorIyAgICAgIGlmZGVmIFpMSUJfSU5URVJOQUwKKyMgICAgICAgIGRlZmluZSBaRVhURVJOIGV4dGVybiBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKKyMgICAgICBlbHNlCisjICAgICAgICBkZWZpbmUgWkVYVEVSTiBleHRlcm4gX19kZWNsc3BlYyhkbGxpbXBvcnQpCisjICAgICAgZW5kaWYKKyMgICAgZW5kaWYKKyMgIGVuZGlmICAvKiBaTElCX0RMTCAqLworICAgLyogSWYgYnVpbGRpbmcgb3IgdXNpbmcgemxpYiB3aXRoIHRoZSBXSU5BUEkvV0lOQVBJViBjYWxsaW5nIGNvbnZlbnRpb24sCisgICAgKiBkZWZpbmUgWkxJQl9XSU5BUEkuCisgICAgKiBDYXV0aW9uOiB0aGUgc3RhbmRhcmQgWkxJQjEuRExMIGlzIE5PVCBjb21waWxlZCB1c2luZyBaTElCX1dJTkFQSS4KKyAgICAqLworIyAgaWZkZWYgWkxJQl9XSU5BUEkKKyMgICAgaWZkZWYgRkFSCisjICAgICAgdW5kZWYgRkFSCisjICAgIGVuZGlmCisjICAgIGluY2x1ZGUgPHdpbmRvd3MuaD4KKyAgICAgLyogTm8gbmVlZCBmb3IgX2V4cG9ydCwgdXNlIFpMSUIuREVGIGluc3RlYWQuICovCisgICAgIC8qIEZvciBjb21wbGV0ZSBXaW5kb3dzIGNvbXBhdGliaWxpdHksIHVzZSBXSU5BUEksIG5vdCBfX3N0ZGNhbGwuICovCisjICAgIGRlZmluZSBaRVhQT1JUIFdJTkFQSQorIyAgICBpZmRlZiBXSU4zMgorIyAgICAgIGRlZmluZSBaRVhQT1JUVkEgV0lOQVBJVgorIyAgICBlbHNlCisjICAgICAgZGVmaW5lIFpFWFBPUlRWQSBGQVIgQ0RFQ0wKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fQkVPU19fKQorIyAgaWZkZWYgWkxJQl9ETEwKKyMgICAgaWZkZWYgWkxJQl9JTlRFUk5BTAorIyAgICAgIGRlZmluZSBaRVhQT1JUICAgX19kZWNsc3BlYyhkbGxleHBvcnQpCisjICAgICAgZGVmaW5lIFpFWFBPUlRWQSBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKKyMgICAgZWxzZQorIyAgICAgIGRlZmluZSBaRVhQT1JUICAgX19kZWNsc3BlYyhkbGxpbXBvcnQpCisjICAgICAgZGVmaW5lIFpFWFBPUlRWQSBfX2RlY2xzcGVjKGRsbGltcG9ydCkKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmbmRlZiBaRVhURVJOCisjICBkZWZpbmUgWkVYVEVSTiBleHRlcm4KKyNlbmRpZgorI2lmbmRlZiBaRVhQT1JUCisjICBkZWZpbmUgWkVYUE9SVAorI2VuZGlmCisjaWZuZGVmIFpFWFBPUlRWQQorIyAgZGVmaW5lIFpFWFBPUlRWQQorI2VuZGlmCisKKyNpZm5kZWYgRkFSCisjICBkZWZpbmUgRkFSCisjZW5kaWYKKworI2lmICFkZWZpbmVkKF9fTUFDVFlQRVNfXykKK3R5cGVkZWYgdW5zaWduZWQgY2hhciAgQnl0ZTsgIC8qIDggYml0cyAqLworI2VuZGlmCit0eXBlZGVmIHVuc2lnbmVkIGludCAgIHVJbnQ7ICAvKiAxNiBiaXRzIG9yIG1vcmUgKi8KK3R5cGVkZWYgdW5zaWduZWQgbG9uZyAgdUxvbmc7IC8qIDMyIGJpdHMgb3IgbW9yZSAqLworCisjaWZkZWYgU01BTExfTUVESVVNCisgICAvKiBCb3JsYW5kIEMvQysrIGFuZCBzb21lIG9sZCBNU0MgdmVyc2lvbnMgaWdub3JlIEZBUiBpbnNpZGUgdHlwZWRlZiAqLworIyAgZGVmaW5lIEJ5dGVmIEJ5dGUgRkFSCisjZWxzZQorICAgdHlwZWRlZiBCeXRlICBGQVIgQnl0ZWY7CisjZW5kaWYKK3R5cGVkZWYgY2hhciAgRkFSIGNoYXJmOwordHlwZWRlZiBpbnQgICBGQVIgaW50ZjsKK3R5cGVkZWYgdUludCAgRkFSIHVJbnRmOwordHlwZWRlZiB1TG9uZyBGQVIgdUxvbmdmOworCisjaWZkZWYgU1REQworICAgdHlwZWRlZiB2b2lkIGNvbnN0ICp2b2lkcGM7CisgICB0eXBlZGVmIHZvaWQgRkFSICAgKnZvaWRwZjsKKyAgIHR5cGVkZWYgdm9pZCAgICAgICAqdm9pZHA7CisjZWxzZQorICAgdHlwZWRlZiBCeXRlIGNvbnN0ICp2b2lkcGM7CisgICB0eXBlZGVmIEJ5dGUgRkFSICAgKnZvaWRwZjsKKyAgIHR5cGVkZWYgQnl0ZSAgICAgICAqdm9pZHA7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfVU5JU1REX0ggICAgLyogbWF5IGJlIHNldCB0byAjaWYgMSBieSAuL2NvbmZpZ3VyZSAqLworIyAgZGVmaW5lIFpfSEFWRV9VTklTVERfSAorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1NUREFSR19IICAgIC8qIG1heSBiZSBzZXQgdG8gI2lmIDEgYnkgLi9jb25maWd1cmUgKi8KKyMgIGRlZmluZSBaX0hBVkVfU1REQVJHX0gKKyNlbmRpZgorCisjaWZkZWYgU1REQworIyAgaWZuZGVmIFpfU09MTworIyAgICBpbmNsdWRlIDxzeXMvdHlwZXMuaD4gICAgICAvKiBmb3Igb2ZmX3QgKi8KKyMgIGVuZGlmCisjZW5kaWYKKworLyogYSBsaXR0bGUgdHJpY2sgdG8gYWNjb21tb2RhdGUgYm90aCAiI2RlZmluZSBfTEFSR0VGSUxFNjRfU09VUkNFIiBhbmQKKyAqICIjZGVmaW5lIF9MQVJHRUZJTEU2NF9TT1VSQ0UgMSIgYXMgcmVxdWVzdGluZyA2NC1iaXQgb3BlcmF0aW9ucywgKGV2ZW4KKyAqIHRob3VnaCB0aGUgZm9ybWVyIGRvZXMgbm90IGNvbmZvcm0gdG8gdGhlIExGUyBkb2N1bWVudCksIGJ1dCBjb25zaWRlcmluZworICogYm90aCAiI3VuZGVmIF9MQVJHRUZJTEU2NF9TT1VSQ0UiIGFuZCAiI2RlZmluZSBfTEFSR0VGSUxFNjRfU09VUkNFIDAiIGFzCisgKiBlcXVpdmFsZW50bHkgcmVxdWVzdGluZyBubyA2NC1iaXQgb3BlcmF0aW9ucworICovCisjaWYgLV9MQVJHRUZJTEU2NF9TT1VSQ0UgLSAtMSA9PSAxCisjICB1bmRlZiBfTEFSR0VGSUxFNjRfU09VUkNFCisjZW5kaWYKKworI2lmIGRlZmluZWQoX0xBUkdFRklMRTY0X1NPVVJDRSkgJiYgX0xGUzY0X0xBUkdFRklMRS0wCisjICBkZWZpbmUgWl9MQVJHRQorI2VuZGlmCisKKyNpZiAoZGVmaW5lZChaX0hBVkVfVU5JU1REX0gpIHx8IGRlZmluZWQoWl9MQVJHRSkpICYmICFkZWZpbmVkKFpfU09MTykKKyMgIGluY2x1ZGUgPHVuaXN0ZC5oPiAgICAgICAvKiBmb3IgU0VFS18qIGFuZCBvZmZfdCAqLworIyAgaWZkZWYgVk1TCisjICAgIGluY2x1ZGUgPHVuaXhpby5oPiAgICAgLyogZm9yIG9mZl90ICovCisjICBlbmRpZgorIyAgaWZuZGVmIHpfb2ZmX3QKKyMgICAgZGVmaW5lIHpfb2ZmX3Qgb2ZmX3QKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmICFkZWZpbmVkKFNFRUtfU0VUKSAmJiAhZGVmaW5lZChaX1NPTE8pCisjICBkZWZpbmUgU0VFS19TRVQgICAgICAgIDAgICAgICAgLyogU2VlayBmcm9tIGJlZ2lubmluZyBvZiBmaWxlLiAgKi8KKyMgIGRlZmluZSBTRUVLX0NVUiAgICAgICAgMSAgICAgICAvKiBTZWVrIGZyb20gY3VycmVudCBwb3NpdGlvbi4gICovCisjICBkZWZpbmUgU0VFS19FTkQgICAgICAgIDIgICAgICAgLyogU2V0IGZpbGUgcG9pbnRlciB0byBFT0YgcGx1cyAib2Zmc2V0IiAqLworI2VuZGlmCisKKyNpZm5kZWYgel9vZmZfdAorIyAgZGVmaW5lIHpfb2ZmX3QgbG9uZworI2VuZGlmCisKKyNpZiAhZGVmaW5lZChfV0lOMzIpICYmIChkZWZpbmVkKF9MQVJHRUZJTEU2NF9TT1VSQ0UpICYmIF9MRlM2NF9MQVJHRUZJTEUtMCkKKyMgIGRlZmluZSB6X29mZjY0X3Qgb2ZmNjRfdAorI2Vsc2UKKyMgIGlmIGRlZmluZWQoX1dJTjMyKQorIyAgICBkZWZpbmUgel9vZmY2NF90IF9faW50NjQKKyMgIGVsc2UKKyMgIGRlZmluZSB6X29mZjY0X3Qgel9vZmZfdAorI2VuZGlmCisjZW5kaWYKKworLyogTVZTIGxpbmtlciBkb2VzIG5vdCBzdXBwb3J0IGV4dGVybmFsIG5hbWVzIGxhcmdlciB0aGFuIDggYnl0ZXMgKi8KKyNpZiBkZWZpbmVkKF9fTVZTX18pCisgICNwcmFnbWEgbWFwKGRlZmxhdGVJbml0XywiREVJTiIpCisgICNwcmFnbWEgbWFwKGRlZmxhdGVJbml0Ml8sIkRFSU4yIikKKyAgI3ByYWdtYSBtYXAoZGVmbGF0ZUVuZCwiREVFTkQiKQorICAjcHJhZ21hIG1hcChkZWZsYXRlQm91bmQsIkRFQk5EIikKKyAgI3ByYWdtYSBtYXAoaW5mbGF0ZUluaXRfLCJJTklOIikKKyAgI3ByYWdtYSBtYXAoaW5mbGF0ZUluaXQyXywiSU5JTjIiKQorICAjcHJhZ21hIG1hcChpbmZsYXRlRW5kLCJJTkVORCIpCisgICNwcmFnbWEgbWFwKGluZmxhdGVTeW5jLCJJTlNZIikKKyAgI3ByYWdtYSBtYXAoaW5mbGF0ZVNldERpY3Rpb25hcnksIklOU0VESSIpCisgICNwcmFnbWEgbWFwKGNvbXByZXNzQm91bmQsIkNNQk5EIikKKyAgI3ByYWdtYSBtYXAoaW5mbGF0ZV90YWJsZSwiSU5UQUJMIikKKyAgI3ByYWdtYSBtYXAoaW5mbGF0ZV9mYXN0LCJJTkZBIikKKyAgI3ByYWdtYSBtYXAoaW5mbGF0ZV9jb3B5cmlnaHQsIklOQ09QWSIpCisjZW5kaWYKKworI2VuZGlmIC8qIFpDT05GX0ggKi8KZGlmZiAtLWdpdCBhL3psaWItMS4yLjYvemNvbmYuaC5jbWFrZWluIGIvemxpYi0xLjIuNi96Y29uZi5oLmNtYWtlaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2VhNTUzMQotLS0gL2Rldi9udWxsCisrKyBiL3psaWItMS4yLjYvemNvbmYuaC5jbWFrZWluCkBAIC0wLDAgKzEsNDY4IEBACisvKiB6Y29uZi5oIC0tIGNvbmZpZ3VyYXRpb24gb2YgdGhlIHpsaWIgY29tcHJlc3Npb24gbGlicmFyeQorICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMTEgSmVhbi1sb3VwIEdhaWxseS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKKyAqLworCisvKiBAKCMpICRJZCQgKi8KKworI2lmbmRlZiBaQ09ORl9ICisjZGVmaW5lIFpDT05GX0gKKyNjbWFrZWRlZmluZSBaX1BSRUZJWAorI2NtYWtlZGVmaW5lIFpfSEFWRV9VTklTVERfSAorCisvKgorICogSWYgeW91ICpyZWFsbHkqIG5lZWQgYSB1bmlxdWUgcHJlZml4IGZvciBhbGwgdHlwZXMgYW5kIGxpYnJhcnkgZnVuY3Rpb25zLAorICogY29tcGlsZSB3aXRoIC1EWl9QUkVGSVguIFRoZSAic3RhbmRhcmQiIHpsaWIgc2hvdWxkIGJlIGNvbXBpbGVkIHdpdGhvdXQgaXQuCisgKiBFdmVuIGJldHRlciB0aGFuIGNvbXBpbGluZyB3aXRoIC1EWl9QUkVGSVggd291bGQgYmUgdG8gdXNlIGNvbmZpZ3VyZSB0byBzZXQKKyAqIHRoaXMgcGVybWFuZW50bHkgaW4gemNvbmYuaCB1c2luZyAiLi9jb25maWd1cmUgLS16cHJlZml4Ii4KKyAqLworI2lmZGVmIFpfUFJFRklYICAgICAvKiBtYXkgYmUgc2V0IHRvICNpZiAxIGJ5IC4vY29uZmlndXJlICovCisjICBkZWZpbmUgWl9QUkVGSVhfU0VUCisKKy8qIGFsbCBsaW5rZWQgc3ltYm9scyAqLworIyAgZGVmaW5lIF9kaXN0X2NvZGUgICAgICAgICAgICB6X19kaXN0X2NvZGUKKyMgIGRlZmluZSBfbGVuZ3RoX2NvZGUgICAgICAgICAgel9fbGVuZ3RoX2NvZGUKKyMgIGRlZmluZSBfdHJfYWxpZ24gICAgICAgICAgICAgel9fdHJfYWxpZ24KKyMgIGRlZmluZSBfdHJfZmx1c2hfYmxvY2sgICAgICAgel9fdHJfZmx1c2hfYmxvY2sKKyMgIGRlZmluZSBfdHJfaW5pdCAgICAgICAgICAgICAgel9fdHJfaW5pdAorIyAgZGVmaW5lIF90cl9zdG9yZWRfYmxvY2sgICAgICB6X190cl9zdG9yZWRfYmxvY2sKKyMgIGRlZmluZSBfdHJfdGFsbHkgICAgICAgICAgICAgel9fdHJfdGFsbHkKKyMgIGRlZmluZSBhZGxlcjMyICAgICAgICAgICAgICAgel9hZGxlcjMyCisjICBkZWZpbmUgYWRsZXIzMl9jb21iaW5lICAgICAgIHpfYWRsZXIzMl9jb21iaW5lCisjICBkZWZpbmUgYWRsZXIzMl9jb21iaW5lNjQgICAgIHpfYWRsZXIzMl9jb21iaW5lNjQKKyMgIGlmbmRlZiBaX1NPTE8KKyMgICAgZGVmaW5lIGNvbXByZXNzICAgICAgICAgICAgICB6X2NvbXByZXNzCisjICAgIGRlZmluZSBjb21wcmVzczIgICAgICAgICAgICAgel9jb21wcmVzczIKKyMgICAgZGVmaW5lIGNvbXByZXNzQm91bmQgICAgICAgICB6X2NvbXByZXNzQm91bmQKKyMgIGVuZGlmCisjICBkZWZpbmUgY3JjMzIgICAgICAgICAgICAgICAgIHpfY3JjMzIKKyMgIGRlZmluZSBjcmMzMl9jb21iaW5lICAgICAgICAgel9jcmMzMl9jb21iaW5lCisjICBkZWZpbmUgY3JjMzJfY29tYmluZTY0ICAgICAgIHpfY3JjMzJfY29tYmluZTY0CisjICBkZWZpbmUgZGVmbGF0ZSAgICAgICAgICAgICAgIHpfZGVmbGF0ZQorIyAgZGVmaW5lIGRlZmxhdGVCb3VuZCAgICAgICAgICB6X2RlZmxhdGVCb3VuZAorIyAgZGVmaW5lIGRlZmxhdGVDb3B5ICAgICAgICAgICB6X2RlZmxhdGVDb3B5CisjICBkZWZpbmUgZGVmbGF0ZUVuZCAgICAgICAgICAgIHpfZGVmbGF0ZUVuZAorIyAgZGVmaW5lIGRlZmxhdGVJbml0Ml8gICAgICAgICB6X2RlZmxhdGVJbml0Ml8KKyMgIGRlZmluZSBkZWZsYXRlSW5pdF8gICAgICAgICAgel9kZWZsYXRlSW5pdF8KKyMgIGRlZmluZSBkZWZsYXRlUGFyYW1zICAgICAgICAgel9kZWZsYXRlUGFyYW1zCisjICBkZWZpbmUgZGVmbGF0ZVBlbmRpbmcgICAgICAgIHpfZGVmbGF0ZVBlbmRpbmcKKyMgIGRlZmluZSBkZWZsYXRlUHJpbWUgICAgICAgICAgel9kZWZsYXRlUHJpbWUKKyMgIGRlZmluZSBkZWZsYXRlUmVzZXQgICAgICAgICAgel9kZWZsYXRlUmVzZXQKKyMgIGRlZmluZSBkZWZsYXRlUmVzZXRLZWVwICAgICAgel9kZWZsYXRlUmVzZXRLZWVwCisjICBkZWZpbmUgZGVmbGF0ZVNldERpY3Rpb25hcnkgIHpfZGVmbGF0ZVNldERpY3Rpb25hcnkKKyMgIGRlZmluZSBkZWZsYXRlU2V0SGVhZGVyICAgICAgel9kZWZsYXRlU2V0SGVhZGVyCisjICBkZWZpbmUgZGVmbGF0ZVR1bmUgICAgICAgICAgIHpfZGVmbGF0ZVR1bmUKKyMgIGRlZmluZSBkZWZsYXRlX2NvcHlyaWdodCAgICAgel9kZWZsYXRlX2NvcHlyaWdodAorIyAgZGVmaW5lIGdldF9jcmNfdGFibGUgICAgICAgICB6X2dldF9jcmNfdGFibGUKKyMgIGlmbmRlZiBaX1NPTE8KKyMgICAgZGVmaW5lIGd6X2Vycm9yICAgICAgICAgICAgICB6X2d6X2Vycm9yCisjICAgIGRlZmluZSBnel9pbnRtYXggICAgICAgICAgICAgel9nel9pbnRtYXgKKyMgICAgZGVmaW5lIGd6X3N0cndpbmVycm9yICAgICAgICB6X2d6X3N0cndpbmVycm9yCisjICAgIGRlZmluZSBnemJ1ZmZlciAgICAgICAgICAgICAgel9nemJ1ZmZlcgorIyAgICBkZWZpbmUgZ3pjbGVhcmVyciAgICAgICAgICAgIHpfZ3pjbGVhcmVycgorIyAgICBkZWZpbmUgZ3pjbG9zZSAgICAgICAgICAgICAgIHpfZ3pjbG9zZQorIyAgICBkZWZpbmUgZ3pjbG9zZV9yICAgICAgICAgICAgIHpfZ3pjbG9zZV9yCisjICAgIGRlZmluZSBnemNsb3NlX3cgICAgICAgICAgICAgel9nemNsb3NlX3cKKyMgICAgZGVmaW5lIGd6ZGlyZWN0ICAgICAgICAgICAgICB6X2d6ZGlyZWN0CisjICAgIGRlZmluZSBnemRvcGVuICAgICAgICAgICAgICAgel9nemRvcGVuCisjICAgIGRlZmluZSBnemVvZiAgICAgICAgICAgICAgICAgel9nemVvZgorIyAgICBkZWZpbmUgZ3plcnJvciAgICAgICAgICAgICAgIHpfZ3plcnJvcgorIyAgICBkZWZpbmUgZ3pmbGFncyAgICAgICAgICAgICAgIHpfZ3pmbGFncworIyAgICBkZWZpbmUgZ3pmbHVzaCAgICAgICAgICAgICAgIHpfZ3pmbHVzaAorIyAgICBkZWZpbmUgZ3pnZXRjICAgICAgICAgICAgICAgIHpfZ3pnZXRjCisjICAgIGRlZmluZSBnemdldGNfICAgICAgICAgICAgICAgel9nemdldGNfCisjICAgIGRlZmluZSBnemdldHMgICAgICAgICAgICAgICAgel9nemdldHMKKyMgICAgZGVmaW5lIGd6b2Zmc2V0ICAgICAgICAgICAgICB6X2d6b2Zmc2V0CisjICAgIGRlZmluZSBnem9mZnNldDY0ICAgICAgICAgICAgel9nem9mZnNldDY0CisjICAgIGRlZmluZSBnem9wZW4gICAgICAgICAgICAgICAgel9nem9wZW4KKyMgICAgZGVmaW5lIGd6b3BlbjY0ICAgICAgICAgICAgICB6X2d6b3BlbjY0CisjICAgIGRlZmluZSBnenByaW50ZiAgICAgICAgICAgICAgel9nenByaW50ZgorIyAgICBkZWZpbmUgZ3pwdXRjICAgICAgICAgICAgICAgIHpfZ3pwdXRjCisjICAgIGRlZmluZSBnenB1dHMgICAgICAgICAgICAgICAgel9nenB1dHMKKyMgICAgZGVmaW5lIGd6cmVhZCAgICAgICAgICAgICAgICB6X2d6cmVhZAorIyAgICBkZWZpbmUgZ3pyZXdpbmQgICAgICAgICAgICAgIHpfZ3pyZXdpbmQKKyMgICAgZGVmaW5lIGd6c2VlayAgICAgICAgICAgICAgICB6X2d6c2VlaworIyAgICBkZWZpbmUgZ3pzZWVrNjQgICAgICAgICAgICAgIHpfZ3pzZWVrNjQKKyMgICAgZGVmaW5lIGd6c2V0cGFyYW1zICAgICAgICAgICB6X2d6c2V0cGFyYW1zCisjICAgIGRlZmluZSBnenRlbGwgICAgICAgICAgICAgICAgel9nenRlbGwKKyMgICAgZGVmaW5lIGd6dGVsbDY0ICAgICAgICAgICAgICB6X2d6dGVsbDY0CisjICAgIGRlZmluZSBnenVuZ2V0YyAgICAgICAgICAgICAgel9nenVuZ2V0YworIyAgICBkZWZpbmUgZ3p3cml0ZSAgICAgICAgICAgICAgIHpfZ3p3cml0ZQorIyAgZW5kaWYKKyMgIGRlZmluZSBpbmZsYXRlICAgICAgICAgICAgICAgel9pbmZsYXRlCisjICBkZWZpbmUgaW5mbGF0ZUJhY2sgICAgICAgICAgIHpfaW5mbGF0ZUJhY2sKKyMgIGRlZmluZSBpbmZsYXRlQmFja0VuZCAgICAgICAgel9pbmZsYXRlQmFja0VuZAorIyAgZGVmaW5lIGluZmxhdGVCYWNrSW5pdF8gICAgICB6X2luZmxhdGVCYWNrSW5pdF8KKyMgIGRlZmluZSBpbmZsYXRlQ29weSAgICAgICAgICAgel9pbmZsYXRlQ29weQorIyAgZGVmaW5lIGluZmxhdGVFbmQgICAgICAgICAgICB6X2luZmxhdGVFbmQKKyMgIGRlZmluZSBpbmZsYXRlR2V0SGVhZGVyICAgICAgel9pbmZsYXRlR2V0SGVhZGVyCisjICBkZWZpbmUgaW5mbGF0ZUluaXQyXyAgICAgICAgIHpfaW5mbGF0ZUluaXQyXworIyAgZGVmaW5lIGluZmxhdGVJbml0XyAgICAgICAgICB6X2luZmxhdGVJbml0XworIyAgZGVmaW5lIGluZmxhdGVNYXJrICAgICAgICAgICB6X2luZmxhdGVNYXJrCisjICBkZWZpbmUgaW5mbGF0ZVByaW1lICAgICAgICAgIHpfaW5mbGF0ZVByaW1lCisjICBkZWZpbmUgaW5mbGF0ZVJlc2V0ICAgICAgICAgIHpfaW5mbGF0ZVJlc2V0CisjICBkZWZpbmUgaW5mbGF0ZVJlc2V0MiAgICAgICAgIHpfaW5mbGF0ZVJlc2V0MgorIyAgZGVmaW5lIGluZmxhdGVTZXREaWN0aW9uYXJ5ICB6X2luZmxhdGVTZXREaWN0aW9uYXJ5CisjICBkZWZpbmUgaW5mbGF0ZVN5bmMgICAgICAgICAgIHpfaW5mbGF0ZVN5bmMKKyMgIGRlZmluZSBpbmZsYXRlU3luY1BvaW50ICAgICAgel9pbmZsYXRlU3luY1BvaW50CisjICBkZWZpbmUgaW5mbGF0ZVVuZGVybWluZSAgICAgIHpfaW5mbGF0ZVVuZGVybWluZQorIyAgZGVmaW5lIGluZmxhdGVSZXNldEtlZXAgICAgICB6X2luZmxhdGVSZXNldEtlZXAKKyMgIGRlZmluZSBpbmZsYXRlX2NvcHlyaWdodCAgICAgel9pbmZsYXRlX2NvcHlyaWdodAorIyAgZGVmaW5lIGluZmxhdGVfZmFzdCAgICAgICAgICB6X2luZmxhdGVfZmFzdAorIyAgZGVmaW5lIGluZmxhdGVfdGFibGUgICAgICAgICB6X2luZmxhdGVfdGFibGUKKyMgIGlmbmRlZiBaX1NPTE8KKyMgICAgZGVmaW5lIHVuY29tcHJlc3MgICAgICAgICAgICB6X3VuY29tcHJlc3MKKyMgIGVuZGlmCisjICBkZWZpbmUgekVycm9yICAgICAgICAgICAgICAgIHpfekVycm9yCisjICBpZm5kZWYgWl9TT0xPCisjICAgIGRlZmluZSB6Y2FsbG9jICAgICAgICAgICAgICAgel96Y2FsbG9jCisjICAgIGRlZmluZSB6Y2ZyZWUgICAgICAgICAgICAgICAgel96Y2ZyZWUKKyMgIGVuZGlmCisjICBkZWZpbmUgemxpYkNvbXBpbGVGbGFncyAgICAgIHpfemxpYkNvbXBpbGVGbGFncworIyAgZGVmaW5lIHpsaWJWZXJzaW9uICAgICAgICAgICB6X3psaWJWZXJzaW9uCisKKy8qIGFsbCB6bGliIHR5cGVkZWZzIGluIHpsaWIuaCBhbmQgemNvbmYuaCAqLworIyAgZGVmaW5lIEJ5dGUgICAgICAgICAgICAgICAgICB6X0J5dGUKKyMgIGRlZmluZSBCeXRlZiAgICAgICAgICAgICAgICAgel9CeXRlZgorIyAgZGVmaW5lIGFsbG9jX2Z1bmMgICAgICAgICAgICB6X2FsbG9jX2Z1bmMKKyMgIGRlZmluZSBjaGFyZiAgICAgICAgICAgICAgICAgel9jaGFyZgorIyAgZGVmaW5lIGZyZWVfZnVuYyAgICAgICAgICAgICB6X2ZyZWVfZnVuYworIyAgaWZuZGVmIFpfU09MTworIyAgICBkZWZpbmUgZ3pGaWxlICAgICAgICAgICAgICAgIHpfZ3pGaWxlCisjICAgIGRlZmluZSBnel9oZWFkZXIgICAgICAgICAgICAgel9nel9oZWFkZXIKKyMgICAgZGVmaW5lIGd6X2hlYWRlcnAgICAgICAgICAgICB6X2d6X2hlYWRlcnAKKyMgIGVuZGlmCisjICBkZWZpbmUgaW5fZnVuYyAgICAgICAgICAgICAgIHpfaW5fZnVuYworIyAgZGVmaW5lIGludGYgICAgICAgICAgICAgICAgICB6X2ludGYKKyMgIGRlZmluZSBvdXRfZnVuYyAgICAgICAgICAgICAgel9vdXRfZnVuYworIyAgZGVmaW5lIHVJbnQgICAgICAgICAgICAgICAgICB6X3VJbnQKKyMgIGRlZmluZSB1SW50ZiAgICAgICAgICAgICAgICAgel91SW50ZgorIyAgZGVmaW5lIHVMb25nICAgICAgICAgICAgICAgICB6X3VMb25nCisjICBkZWZpbmUgdUxvbmdmICAgICAgICAgICAgICAgIHpfdUxvbmdmCisjICBkZWZpbmUgdm9pZHAgICAgICAgICAgICAgICAgIHpfdm9pZHAKKyMgIGRlZmluZSB2b2lkcGMgICAgICAgICAgICAgICAgel92b2lkcGMKKyMgIGRlZmluZSB2b2lkcGYgICAgICAgICAgICAgICAgel92b2lkcGYKKworLyogYWxsIHpsaWIgc3RydWN0cyBpbiB6bGliLmggYW5kIHpjb25mLmggKi8KKyMgIGlmbmRlZiBaX1NPTE8KKyMgICAgZGVmaW5lIGd6X2hlYWRlcl9zICAgICAgICAgICB6X2d6X2hlYWRlcl9zCisjICBlbmRpZgorIyAgZGVmaW5lIGludGVybmFsX3N0YXRlICAgICAgICB6X2ludGVybmFsX3N0YXRlCisKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX01TRE9TX18pICYmICFkZWZpbmVkKE1TRE9TKQorIyAgZGVmaW5lIE1TRE9TCisjZW5kaWYKKyNpZiAoZGVmaW5lZChPU18yKSB8fCBkZWZpbmVkKF9fT1MyX18pKSAmJiAhZGVmaW5lZChPUzIpCisjICBkZWZpbmUgT1MyCisjZW5kaWYKKyNpZiBkZWZpbmVkKF9XSU5ET1dTKSAmJiAhZGVmaW5lZChXSU5ET1dTKQorIyAgZGVmaW5lIFdJTkRPV1MKKyNlbmRpZgorI2lmIGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKF9XSU4zMl9XQ0UpIHx8IGRlZmluZWQoX19XSU4zMl9fKQorIyAgaWZuZGVmIFdJTjMyCisjICAgIGRlZmluZSBXSU4zMgorIyAgZW5kaWYKKyNlbmRpZgorI2lmIChkZWZpbmVkKE1TRE9TKSB8fCBkZWZpbmVkKE9TMikgfHwgZGVmaW5lZChXSU5ET1dTKSkgJiYgIWRlZmluZWQoV0lOMzIpCisjICBpZiAhZGVmaW5lZChfX0dOVUNfXykgJiYgIWRlZmluZWQoX19GTEFUX18pICYmICFkZWZpbmVkKF9fMzg2X18pCisjICAgIGlmbmRlZiBTWVMxNkJJVAorIyAgICAgIGRlZmluZSBTWVMxNkJJVAorIyAgICBlbmRpZgorIyAgZW5kaWYKKyNlbmRpZgorCisvKgorICogQ29tcGlsZSB3aXRoIC1ETUFYU0VHXzY0SyBpZiB0aGUgYWxsb2MgZnVuY3Rpb24gY2Fubm90IGFsbG9jYXRlIG1vcmUKKyAqIHRoYW4gNjRrIGJ5dGVzIGF0IGEgdGltZSAobmVlZGVkIG9uIHN5c3RlbXMgd2l0aCAxNi1iaXQgaW50KS4KKyAqLworI2lmZGVmIFNZUzE2QklUCisjICBkZWZpbmUgTUFYU0VHXzY0SworI2VuZGlmCisjaWZkZWYgTVNET1MKKyMgIGRlZmluZSBVTkFMSUdORURfT0sKKyNlbmRpZgorCisjaWZkZWYgX19TVERDX1ZFUlNJT05fXworIyAgaWZuZGVmIFNUREMKKyMgICAgZGVmaW5lIFNUREMKKyMgIGVuZGlmCisjICBpZiBfX1NURENfVkVSU0lPTl9fID49IDE5OTkwMUwKKyMgICAgaWZuZGVmIFNUREM5OQorIyAgICAgIGRlZmluZSBTVERDOTkKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjZW5kaWYKKyNpZiAhZGVmaW5lZChTVERDKSAmJiAoZGVmaW5lZChfX1NURENfXykgfHwgZGVmaW5lZChfX2NwbHVzcGx1cykpCisjICBkZWZpbmUgU1REQworI2VuZGlmCisjaWYgIWRlZmluZWQoU1REQykgJiYgKGRlZmluZWQoX19HTlVDX18pIHx8IGRlZmluZWQoX19CT1JMQU5EQ19fKSkKKyMgIGRlZmluZSBTVERDCisjZW5kaWYKKyNpZiAhZGVmaW5lZChTVERDKSAmJiAoZGVmaW5lZChNU0RPUykgfHwgZGVmaW5lZChXSU5ET1dTKSB8fCBkZWZpbmVkKFdJTjMyKSkKKyMgIGRlZmluZSBTVERDCisjZW5kaWYKKyNpZiAhZGVmaW5lZChTVERDKSAmJiAoZGVmaW5lZChPUzIpIHx8IGRlZmluZWQoX19IT1NfQUlYX18pKQorIyAgZGVmaW5lIFNUREMKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX09TNDAwX18pICYmICFkZWZpbmVkKFNUREMpICAgIC8qIGlTZXJpZXMgKGZvcm1lcmx5IEFTLzQwMCkuICovCisjICBkZWZpbmUgU1REQworI2VuZGlmCisKKyNpZm5kZWYgU1REQworIyAgaWZuZGVmIGNvbnN0IC8qIGNhbm5vdCB1c2UgIWRlZmluZWQoU1REQykgJiYgIWRlZmluZWQoY29uc3QpIG9uIE1hYyAqLworIyAgICBkZWZpbmUgY29uc3QgICAgICAgLyogbm90ZTogbmVlZCBhIG1vcmUgZ2VudGxlIHNvbHV0aW9uIGhlcmUgKi8KKyMgIGVuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQoWkxJQl9DT05TVCkgJiYgIWRlZmluZWQoel9jb25zdCkKKyMgIGRlZmluZSB6X2NvbnN0IGNvbnN0CisjZWxzZQorIyAgZGVmaW5lIHpfY29uc3QKKyNlbmRpZgorCisvKiBTb21lIE1hYyBjb21waWxlcnMgbWVyZ2UgYWxsIC5oIGZpbGVzIGluY29ycmVjdGx5OiAqLworI2lmIGRlZmluZWQoX19NV0VSS1NfXyl8fGRlZmluZWQoYXBwbGVjKXx8ZGVmaW5lZChUSElOS19DKXx8ZGVmaW5lZChfX1NDX18pCisjICBkZWZpbmUgTk9fRFVNTVlfREVDTAorI2VuZGlmCisKKy8qIE1heGltdW0gdmFsdWUgZm9yIG1lbUxldmVsIGluIGRlZmxhdGVJbml0MiAqLworI2lmbmRlZiBNQVhfTUVNX0xFVkVMCisjICBpZmRlZiBNQVhTRUdfNjRLCisjICAgIGRlZmluZSBNQVhfTUVNX0xFVkVMIDgKKyMgIGVsc2UKKyMgICAgZGVmaW5lIE1BWF9NRU1fTEVWRUwgOQorIyAgZW5kaWYKKyNlbmRpZgorCisvKiBNYXhpbXVtIHZhbHVlIGZvciB3aW5kb3dCaXRzIGluIGRlZmxhdGVJbml0MiBhbmQgaW5mbGF0ZUluaXQyLgorICogV0FSTklORzogcmVkdWNpbmcgTUFYX1dCSVRTIG1ha2VzIG1pbmlnemlwIHVuYWJsZSB0byBleHRyYWN0IC5neiBmaWxlcworICogY3JlYXRlZCBieSBnemlwLiAoRmlsZXMgY3JlYXRlZCBieSBtaW5pZ3ppcCBjYW4gc3RpbGwgYmUgZXh0cmFjdGVkIGJ5CisgKiBnemlwLikKKyAqLworI2lmbmRlZiBNQVhfV0JJVFMKKyMgIGRlZmluZSBNQVhfV0JJVFMgICAxNSAvKiAzMksgTFo3NyB3aW5kb3cgKi8KKyNlbmRpZgorCisvKiBUaGUgbWVtb3J5IHJlcXVpcmVtZW50cyBmb3IgZGVmbGF0ZSBhcmUgKGluIGJ5dGVzKToKKyAgICAgICAgICAgICgxIDw8ICh3aW5kb3dCaXRzKzIpKSArICAoMSA8PCAobWVtTGV2ZWwrOSkpCisgdGhhdCBpczogMTI4SyBmb3Igd2luZG93Qml0cz0xNSAgKyAgMTI4SyBmb3IgbWVtTGV2ZWwgPSA4ICAoZGVmYXVsdCB2YWx1ZXMpCisgcGx1cyBhIGZldyBraWxvYnl0ZXMgZm9yIHNtYWxsIG9iamVjdHMuIEZvciBleGFtcGxlLCBpZiB5b3Ugd2FudCB0byByZWR1Y2UKKyB0aGUgZGVmYXVsdCBtZW1vcnkgcmVxdWlyZW1lbnRzIGZyb20gMjU2SyB0byAxMjhLLCBjb21waWxlIHdpdGgKKyAgICAgbWFrZSBDRkxBR1M9Ii1PIC1ETUFYX1dCSVRTPTE0IC1ETUFYX01FTV9MRVZFTD03IgorIE9mIGNvdXJzZSB0aGlzIHdpbGwgZ2VuZXJhbGx5IGRlZ3JhZGUgY29tcHJlc3Npb24gKHRoZXJlJ3Mgbm8gZnJlZSBsdW5jaCkuCisKKyAgIFRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzIGZvciBpbmZsYXRlIGFyZSAoaW4gYnl0ZXMpIDEgPDwgd2luZG93Qml0cworIHRoYXQgaXMsIDMySyBmb3Igd2luZG93Qml0cz0xNSAoZGVmYXVsdCB2YWx1ZSkgcGx1cyBhIGZldyBraWxvYnl0ZXMKKyBmb3Igc21hbGwgb2JqZWN0cy4KKyovCisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFR5cGUgZGVjbGFyYXRpb25zICovCisKKyNpZm5kZWYgT0YgLyogZnVuY3Rpb24gcHJvdG90eXBlcyAqLworIyAgaWZkZWYgU1REQworIyAgICBkZWZpbmUgT0YoYXJncykgIGFyZ3MKKyMgIGVsc2UKKyMgICAgZGVmaW5lIE9GKGFyZ3MpICAoKQorIyAgZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIFpfQVJHIC8qIGZ1bmN0aW9uIHByb3RvdHlwZXMgZm9yIHN0ZGFyZyAqLworIyAgaWYgZGVmaW5lZChTVERDKSB8fCBkZWZpbmVkKFpfSEFWRV9TVERBUkdfSCkKKyMgICAgZGVmaW5lIFpfQVJHKGFyZ3MpICBhcmdzCisjICBlbHNlCisjICAgIGRlZmluZSBaX0FSRyhhcmdzKSAgKCkKKyMgIGVuZGlmCisjZW5kaWYKKworLyogVGhlIGZvbGxvd2luZyBkZWZpbml0aW9ucyBmb3IgRkFSIGFyZSBuZWVkZWQgb25seSBmb3IgTVNET1MgbWl4ZWQKKyAqIG1vZGVsIHByb2dyYW1taW5nIChzbWFsbCBvciBtZWRpdW0gbW9kZWwgd2l0aCBzb21lIGZhciBhbGxvY2F0aW9ucykuCisgKiBUaGlzIHdhcyB0ZXN0ZWQgb25seSB3aXRoIE1TQzsgZm9yIG90aGVyIE1TRE9TIGNvbXBpbGVycyB5b3UgbWF5IGhhdmUKKyAqIHRvIGRlZmluZSBOT19NRU1DUFkgaW4genV0aWwuaC4gIElmIHlvdSBkb24ndCBuZWVkIHRoZSBtaXhlZCBtb2RlbCwKKyAqIGp1c3QgZGVmaW5lIEZBUiB0byBiZSBlbXB0eS4KKyAqLworI2lmZGVmIFNZUzE2QklUCisjICBpZiBkZWZpbmVkKE1fSTg2U00pIHx8IGRlZmluZWQoTV9JODZNTSkKKyAgICAgLyogTVNDIHNtYWxsIG9yIG1lZGl1bSBtb2RlbCAqLworIyAgICBkZWZpbmUgU01BTExfTUVESVVNCisjICAgIGlmZGVmIF9NU0NfVkVSCisjICAgICAgZGVmaW5lIEZBUiBfZmFyCisjICAgIGVsc2UKKyMgICAgICBkZWZpbmUgRkFSIGZhcgorIyAgICBlbmRpZgorIyAgZW5kaWYKKyMgIGlmIChkZWZpbmVkKF9fU01BTExfXykgfHwgZGVmaW5lZChfX01FRElVTV9fKSkKKyAgICAgLyogVHVyYm8gQyBzbWFsbCBvciBtZWRpdW0gbW9kZWwgKi8KKyMgICAgZGVmaW5lIFNNQUxMX01FRElVTQorIyAgICBpZmRlZiBfX0JPUkxBTkRDX18KKyMgICAgICBkZWZpbmUgRkFSIF9mYXIKKyMgICAgZWxzZQorIyAgICAgIGRlZmluZSBGQVIgZmFyCisjICAgIGVuZGlmCisjICBlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFdJTkRPV1MpIHx8IGRlZmluZWQoV0lOMzIpCisgICAvKiBJZiBidWlsZGluZyBvciB1c2luZyB6bGliIGFzIGEgRExMLCBkZWZpbmUgWkxJQl9ETEwuCisgICAgKiBUaGlzIGlzIG5vdCBtYW5kYXRvcnksIGJ1dCBpdCBvZmZlcnMgYSBsaXR0bGUgcGVyZm9ybWFuY2UgaW5jcmVhc2UuCisgICAgKi8KKyMgIGlmZGVmIFpMSUJfRExMCisjICAgIGlmIGRlZmluZWQoV0lOMzIpICYmICghZGVmaW5lZChfX0JPUkxBTkRDX18pIHx8IChfX0JPUkxBTkRDX18gPj0gMHg1MDApKQorIyAgICAgIGlmZGVmIFpMSUJfSU5URVJOQUwKKyMgICAgICAgIGRlZmluZSBaRVhURVJOIGV4dGVybiBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKKyMgICAgICBlbHNlCisjICAgICAgICBkZWZpbmUgWkVYVEVSTiBleHRlcm4gX19kZWNsc3BlYyhkbGxpbXBvcnQpCisjICAgICAgZW5kaWYKKyMgICAgZW5kaWYKKyMgIGVuZGlmICAvKiBaTElCX0RMTCAqLworICAgLyogSWYgYnVpbGRpbmcgb3IgdXNpbmcgemxpYiB3aXRoIHRoZSBXSU5BUEkvV0lOQVBJViBjYWxsaW5nIGNvbnZlbnRpb24sCisgICAgKiBkZWZpbmUgWkxJQl9XSU5BUEkuCisgICAgKiBDYXV0aW9uOiB0aGUgc3RhbmRhcmQgWkxJQjEuRExMIGlzIE5PVCBjb21waWxlZCB1c2luZyBaTElCX1dJTkFQSS4KKyAgICAqLworIyAgaWZkZWYgWkxJQl9XSU5BUEkKKyMgICAgaWZkZWYgRkFSCisjICAgICAgdW5kZWYgRkFSCisjICAgIGVuZGlmCisjICAgIGluY2x1ZGUgPHdpbmRvd3MuaD4KKyAgICAgLyogTm8gbmVlZCBmb3IgX2V4cG9ydCwgdXNlIFpMSUIuREVGIGluc3RlYWQuICovCisgICAgIC8qIEZvciBjb21wbGV0ZSBXaW5kb3dzIGNvbXBhdGliaWxpdHksIHVzZSBXSU5BUEksIG5vdCBfX3N0ZGNhbGwuICovCisjICAgIGRlZmluZSBaRVhQT1JUIFdJTkFQSQorIyAgICBpZmRlZiBXSU4zMgorIyAgICAgIGRlZmluZSBaRVhQT1JUVkEgV0lOQVBJVgorIyAgICBlbHNlCisjICAgICAgZGVmaW5lIFpFWFBPUlRWQSBGQVIgQ0RFQ0wKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fQkVPU19fKQorIyAgaWZkZWYgWkxJQl9ETEwKKyMgICAgaWZkZWYgWkxJQl9JTlRFUk5BTAorIyAgICAgIGRlZmluZSBaRVhQT1JUICAgX19kZWNsc3BlYyhkbGxleHBvcnQpCisjICAgICAgZGVmaW5lIFpFWFBPUlRWQSBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKKyMgICAgZWxzZQorIyAgICAgIGRlZmluZSBaRVhQT1JUICAgX19kZWNsc3BlYyhkbGxpbXBvcnQpCisjICAgICAgZGVmaW5lIFpFWFBPUlRWQSBfX2RlY2xzcGVjKGRsbGltcG9ydCkKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmbmRlZiBaRVhURVJOCisjICBkZWZpbmUgWkVYVEVSTiBleHRlcm4KKyNlbmRpZgorI2lmbmRlZiBaRVhQT1JUCisjICBkZWZpbmUgWkVYUE9SVAorI2VuZGlmCisjaWZuZGVmIFpFWFBPUlRWQQorIyAgZGVmaW5lIFpFWFBPUlRWQQorI2VuZGlmCisKKyNpZm5kZWYgRkFSCisjICBkZWZpbmUgRkFSCisjZW5kaWYKKworI2lmICFkZWZpbmVkKF9fTUFDVFlQRVNfXykKK3R5cGVkZWYgdW5zaWduZWQgY2hhciAgQnl0ZTsgIC8qIDggYml0cyAqLworI2VuZGlmCit0eXBlZGVmIHVuc2lnbmVkIGludCAgIHVJbnQ7ICAvKiAxNiBiaXRzIG9yIG1vcmUgKi8KK3R5cGVkZWYgdW5zaWduZWQgbG9uZyAgdUxvbmc7IC8qIDMyIGJpdHMgb3IgbW9yZSAqLworCisjaWZkZWYgU01BTExfTUVESVVNCisgICAvKiBCb3JsYW5kIEMvQysrIGFuZCBzb21lIG9sZCBNU0MgdmVyc2lvbnMgaWdub3JlIEZBUiBpbnNpZGUgdHlwZWRlZiAqLworIyAgZGVmaW5lIEJ5dGVmIEJ5dGUgRkFSCisjZWxzZQorICAgdHlwZWRlZiBCeXRlICBGQVIgQnl0ZWY7CisjZW5kaWYKK3R5cGVkZWYgY2hhciAgRkFSIGNoYXJmOwordHlwZWRlZiBpbnQgICBGQVIgaW50ZjsKK3R5cGVkZWYgdUludCAgRkFSIHVJbnRmOwordHlwZWRlZiB1TG9uZyBGQVIgdUxvbmdmOworCisjaWZkZWYgU1REQworICAgdHlwZWRlZiB2b2lkIGNvbnN0ICp2b2lkcGM7CisgICB0eXBlZGVmIHZvaWQgRkFSICAgKnZvaWRwZjsKKyAgIHR5cGVkZWYgdm9pZCAgICAgICAqdm9pZHA7CisjZWxzZQorICAgdHlwZWRlZiBCeXRlIGNvbnN0ICp2b2lkcGM7CisgICB0eXBlZGVmIEJ5dGUgRkFSICAgKnZvaWRwZjsKKyAgIHR5cGVkZWYgQnl0ZSAgICAgICAqdm9pZHA7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfVU5JU1REX0ggICAgLyogbWF5IGJlIHNldCB0byAjaWYgMSBieSAuL2NvbmZpZ3VyZSAqLworIyAgZGVmaW5lIFpfSEFWRV9VTklTVERfSAorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1NUREFSR19IICAgIC8qIG1heSBiZSBzZXQgdG8gI2lmIDEgYnkgLi9jb25maWd1cmUgKi8KKyMgIGRlZmluZSBaX0hBVkVfU1REQVJHX0gKKyNlbmRpZgorCisjaWZkZWYgU1REQworIyAgaWZuZGVmIFpfU09MTworIyAgICBpbmNsdWRlIDxzeXMvdHlwZXMuaD4gICAgICAvKiBmb3Igb2ZmX3QgKi8KKyMgIGVuZGlmCisjZW5kaWYKKworLyogYSBsaXR0bGUgdHJpY2sgdG8gYWNjb21tb2RhdGUgYm90aCAiI2RlZmluZSBfTEFSR0VGSUxFNjRfU09VUkNFIiBhbmQKKyAqICIjZGVmaW5lIF9MQVJHRUZJTEU2NF9TT1VSQ0UgMSIgYXMgcmVxdWVzdGluZyA2NC1iaXQgb3BlcmF0aW9ucywgKGV2ZW4KKyAqIHRob3VnaCB0aGUgZm9ybWVyIGRvZXMgbm90IGNvbmZvcm0gdG8gdGhlIExGUyBkb2N1bWVudCksIGJ1dCBjb25zaWRlcmluZworICogYm90aCAiI3VuZGVmIF9MQVJHRUZJTEU2NF9TT1VSQ0UiIGFuZCAiI2RlZmluZSBfTEFSR0VGSUxFNjRfU09VUkNFIDAiIGFzCisgKiBlcXVpdmFsZW50bHkgcmVxdWVzdGluZyBubyA2NC1iaXQgb3BlcmF0aW9ucworICovCisjaWYgLV9MQVJHRUZJTEU2NF9TT1VSQ0UgLSAtMSA9PSAxCisjICB1bmRlZiBfTEFSR0VGSUxFNjRfU09VUkNFCisjZW5kaWYKKworI2lmIGRlZmluZWQoX0xBUkdFRklMRTY0X1NPVVJDRSkgJiYgX0xGUzY0X0xBUkdFRklMRS0wCisjICBkZWZpbmUgWl9MQVJHRQorI2VuZGlmCisKKyNpZiAoZGVmaW5lZChaX0hBVkVfVU5JU1REX0gpIHx8IGRlZmluZWQoWl9MQVJHRSkpICYmICFkZWZpbmVkKFpfU09MTykKKyMgIGluY2x1ZGUgPHVuaXN0ZC5oPiAgICAgICAvKiBmb3IgU0VFS18qIGFuZCBvZmZfdCAqLworIyAgaWZkZWYgVk1TCisjICAgIGluY2x1ZGUgPHVuaXhpby5oPiAgICAgLyogZm9yIG9mZl90ICovCisjICBlbmRpZgorIyAgaWZuZGVmIHpfb2ZmX3QKKyMgICAgZGVmaW5lIHpfb2ZmX3Qgb2ZmX3QKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmICFkZWZpbmVkKFNFRUtfU0VUKSAmJiAhZGVmaW5lZChaX1NPTE8pCisjICBkZWZpbmUgU0VFS19TRVQgICAgICAgIDAgICAgICAgLyogU2VlayBmcm9tIGJlZ2lubmluZyBvZiBmaWxlLiAgKi8KKyMgIGRlZmluZSBTRUVLX0NVUiAgICAgICAgMSAgICAgICAvKiBTZWVrIGZyb20gY3VycmVudCBwb3NpdGlvbi4gICovCisjICBkZWZpbmUgU0VFS19FTkQgICAgICAgIDIgICAgICAgLyogU2V0IGZpbGUgcG9pbnRlciB0byBFT0YgcGx1cyAib2Zmc2V0IiAqLworI2VuZGlmCisKKyNpZm5kZWYgel9vZmZfdAorIyAgZGVmaW5lIHpfb2ZmX3QgbG9uZworI2VuZGlmCisKKyNpZiAhZGVmaW5lZChfV0lOMzIpICYmIChkZWZpbmVkKF9MQVJHRUZJTEU2NF9TT1VSQ0UpICYmIF9MRlM2NF9MQVJHRUZJTEUtMCkKKyMgIGRlZmluZSB6X29mZjY0X3Qgb2ZmNjRfdAorI2Vsc2UKKyMgIGlmIGRlZmluZWQoX1dJTjMyKQorIyAgICBkZWZpbmUgel9vZmY2NF90IF9faW50NjQKKyMgIGVsc2UKKyMgIGRlZmluZSB6X29mZjY0X3Qgel9vZmZfdAorI2VuZGlmCisjZW5kaWYKKworLyogTVZTIGxpbmtlciBkb2VzIG5vdCBzdXBwb3J0IGV4dGVybmFsIG5hbWVzIGxhcmdlciB0aGFuIDggYnl0ZXMgKi8KKyNpZiBkZWZpbmVkKF9fTVZTX18pCisgICNwcmFnbWEgbWFwKGRlZmxhdGVJbml0XywiREVJTiIpCisgICNwcmFnbWEgbWFwKGRlZmxhdGVJbml0Ml8sIkRFSU4yIikKKyAgI3ByYWdtYSBtYXAoZGVmbGF0ZUVuZCwiREVFTkQiKQorICAjcHJhZ21hIG1hcChkZWZsYXRlQm91bmQsIkRFQk5EIikKKyAgI3ByYWdtYSBtYXAoaW5mbGF0ZUluaXRfLCJJTklOIikKKyAgI3ByYWdtYSBtYXAoaW5mbGF0ZUluaXQyXywiSU5JTjIiKQorICAjcHJhZ21hIG1hcChpbmZsYXRlRW5kLCJJTkVORCIpCisgICNwcmFnbWEgbWFwKGluZmxhdGVTeW5jLCJJTlNZIikKKyAgI3ByYWdtYSBtYXAoaW5mbGF0ZVNldERpY3Rpb25hcnksIklOU0VESSIpCisgICNwcmFnbWEgbWFwKGNvbXByZXNzQm91bmQsIkNNQk5EIikKKyAgI3ByYWdtYSBtYXAoaW5mbGF0ZV90YWJsZSwiSU5UQUJMIikKKyAgI3ByYWdtYSBtYXAoaW5mbGF0ZV9mYXN0LCJJTkZBIikKKyAgI3ByYWdtYSBtYXAoaW5mbGF0ZV9jb3B5cmlnaHQsIklOQ09QWSIpCisjZW5kaWYKKworI2VuZGlmIC8qIFpDT05GX0ggKi8KZGlmZiAtLWdpdCBhL3psaWItMS4yLjYvemNvbmYuaC5pbiBiL3psaWItMS4yLjYvemNvbmYuaC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWM4MGFjCi0tLSAvZGV2L251bGwKKysrIGIvemxpYi0xLjIuNi96Y29uZi5oLmluCkBAIC0wLDAgKzEsNDY2IEBACisvKiB6Y29uZi5oIC0tIGNvbmZpZ3VyYXRpb24gb2YgdGhlIHpsaWIgY29tcHJlc3Npb24gbGlicmFyeQorICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMTEgSmVhbi1sb3VwIEdhaWxseS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKKyAqLworCisvKiBAKCMpICRJZCQgKi8KKworI2lmbmRlZiBaQ09ORl9ICisjZGVmaW5lIFpDT05GX0gKKworLyoKKyAqIElmIHlvdSAqcmVhbGx5KiBuZWVkIGEgdW5pcXVlIHByZWZpeCBmb3IgYWxsIHR5cGVzIGFuZCBsaWJyYXJ5IGZ1bmN0aW9ucywKKyAqIGNvbXBpbGUgd2l0aCAtRFpfUFJFRklYLiBUaGUgInN0YW5kYXJkIiB6bGliIHNob3VsZCBiZSBjb21waWxlZCB3aXRob3V0IGl0LgorICogRXZlbiBiZXR0ZXIgdGhhbiBjb21waWxpbmcgd2l0aCAtRFpfUFJFRklYIHdvdWxkIGJlIHRvIHVzZSBjb25maWd1cmUgdG8gc2V0CisgKiB0aGlzIHBlcm1hbmVudGx5IGluIHpjb25mLmggdXNpbmcgIi4vY29uZmlndXJlIC0tenByZWZpeCIuCisgKi8KKyNpZmRlZiBaX1BSRUZJWCAgICAgLyogbWF5IGJlIHNldCB0byAjaWYgMSBieSAuL2NvbmZpZ3VyZSAqLworIyAgZGVmaW5lIFpfUFJFRklYX1NFVAorCisvKiBhbGwgbGlua2VkIHN5bWJvbHMgKi8KKyMgIGRlZmluZSBfZGlzdF9jb2RlICAgICAgICAgICAgel9fZGlzdF9jb2RlCisjICBkZWZpbmUgX2xlbmd0aF9jb2RlICAgICAgICAgIHpfX2xlbmd0aF9jb2RlCisjICBkZWZpbmUgX3RyX2FsaWduICAgICAgICAgICAgIHpfX3RyX2FsaWduCisjICBkZWZpbmUgX3RyX2ZsdXNoX2Jsb2NrICAgICAgIHpfX3RyX2ZsdXNoX2Jsb2NrCisjICBkZWZpbmUgX3RyX2luaXQgICAgICAgICAgICAgIHpfX3RyX2luaXQKKyMgIGRlZmluZSBfdHJfc3RvcmVkX2Jsb2NrICAgICAgel9fdHJfc3RvcmVkX2Jsb2NrCisjICBkZWZpbmUgX3RyX3RhbGx5ICAgICAgICAgICAgIHpfX3RyX3RhbGx5CisjICBkZWZpbmUgYWRsZXIzMiAgICAgICAgICAgICAgIHpfYWRsZXIzMgorIyAgZGVmaW5lIGFkbGVyMzJfY29tYmluZSAgICAgICB6X2FkbGVyMzJfY29tYmluZQorIyAgZGVmaW5lIGFkbGVyMzJfY29tYmluZTY0ICAgICB6X2FkbGVyMzJfY29tYmluZTY0CisjICBpZm5kZWYgWl9TT0xPCisjICAgIGRlZmluZSBjb21wcmVzcyAgICAgICAgICAgICAgel9jb21wcmVzcworIyAgICBkZWZpbmUgY29tcHJlc3MyICAgICAgICAgICAgIHpfY29tcHJlc3MyCisjICAgIGRlZmluZSBjb21wcmVzc0JvdW5kICAgICAgICAgel9jb21wcmVzc0JvdW5kCisjICBlbmRpZgorIyAgZGVmaW5lIGNyYzMyICAgICAgICAgICAgICAgICB6X2NyYzMyCisjICBkZWZpbmUgY3JjMzJfY29tYmluZSAgICAgICAgIHpfY3JjMzJfY29tYmluZQorIyAgZGVmaW5lIGNyYzMyX2NvbWJpbmU2NCAgICAgICB6X2NyYzMyX2NvbWJpbmU2NAorIyAgZGVmaW5lIGRlZmxhdGUgICAgICAgICAgICAgICB6X2RlZmxhdGUKKyMgIGRlZmluZSBkZWZsYXRlQm91bmQgICAgICAgICAgel9kZWZsYXRlQm91bmQKKyMgIGRlZmluZSBkZWZsYXRlQ29weSAgICAgICAgICAgel9kZWZsYXRlQ29weQorIyAgZGVmaW5lIGRlZmxhdGVFbmQgICAgICAgICAgICB6X2RlZmxhdGVFbmQKKyMgIGRlZmluZSBkZWZsYXRlSW5pdDJfICAgICAgICAgel9kZWZsYXRlSW5pdDJfCisjICBkZWZpbmUgZGVmbGF0ZUluaXRfICAgICAgICAgIHpfZGVmbGF0ZUluaXRfCisjICBkZWZpbmUgZGVmbGF0ZVBhcmFtcyAgICAgICAgIHpfZGVmbGF0ZVBhcmFtcworIyAgZGVmaW5lIGRlZmxhdGVQZW5kaW5nICAgICAgICB6X2RlZmxhdGVQZW5kaW5nCisjICBkZWZpbmUgZGVmbGF0ZVByaW1lICAgICAgICAgIHpfZGVmbGF0ZVByaW1lCisjICBkZWZpbmUgZGVmbGF0ZVJlc2V0ICAgICAgICAgIHpfZGVmbGF0ZVJlc2V0CisjICBkZWZpbmUgZGVmbGF0ZVJlc2V0S2VlcCAgICAgIHpfZGVmbGF0ZVJlc2V0S2VlcAorIyAgZGVmaW5lIGRlZmxhdGVTZXREaWN0aW9uYXJ5ICB6X2RlZmxhdGVTZXREaWN0aW9uYXJ5CisjICBkZWZpbmUgZGVmbGF0ZVNldEhlYWRlciAgICAgIHpfZGVmbGF0ZVNldEhlYWRlcgorIyAgZGVmaW5lIGRlZmxhdGVUdW5lICAgICAgICAgICB6X2RlZmxhdGVUdW5lCisjICBkZWZpbmUgZGVmbGF0ZV9jb3B5cmlnaHQgICAgIHpfZGVmbGF0ZV9jb3B5cmlnaHQKKyMgIGRlZmluZSBnZXRfY3JjX3RhYmxlICAgICAgICAgel9nZXRfY3JjX3RhYmxlCisjICBpZm5kZWYgWl9TT0xPCisjICAgIGRlZmluZSBnel9lcnJvciAgICAgICAgICAgICAgel9nel9lcnJvcgorIyAgICBkZWZpbmUgZ3pfaW50bWF4ICAgICAgICAgICAgIHpfZ3pfaW50bWF4CisjICAgIGRlZmluZSBnel9zdHJ3aW5lcnJvciAgICAgICAgel9nel9zdHJ3aW5lcnJvcgorIyAgICBkZWZpbmUgZ3pidWZmZXIgICAgICAgICAgICAgIHpfZ3pidWZmZXIKKyMgICAgZGVmaW5lIGd6Y2xlYXJlcnIgICAgICAgICAgICB6X2d6Y2xlYXJlcnIKKyMgICAgZGVmaW5lIGd6Y2xvc2UgICAgICAgICAgICAgICB6X2d6Y2xvc2UKKyMgICAgZGVmaW5lIGd6Y2xvc2VfciAgICAgICAgICAgICB6X2d6Y2xvc2VfcgorIyAgICBkZWZpbmUgZ3pjbG9zZV93ICAgICAgICAgICAgIHpfZ3pjbG9zZV93CisjICAgIGRlZmluZSBnemRpcmVjdCAgICAgICAgICAgICAgel9nemRpcmVjdAorIyAgICBkZWZpbmUgZ3pkb3BlbiAgICAgICAgICAgICAgIHpfZ3pkb3BlbgorIyAgICBkZWZpbmUgZ3plb2YgICAgICAgICAgICAgICAgIHpfZ3plb2YKKyMgICAgZGVmaW5lIGd6ZXJyb3IgICAgICAgICAgICAgICB6X2d6ZXJyb3IKKyMgICAgZGVmaW5lIGd6ZmxhZ3MgICAgICAgICAgICAgICB6X2d6ZmxhZ3MKKyMgICAgZGVmaW5lIGd6Zmx1c2ggICAgICAgICAgICAgICB6X2d6Zmx1c2gKKyMgICAgZGVmaW5lIGd6Z2V0YyAgICAgICAgICAgICAgICB6X2d6Z2V0YworIyAgICBkZWZpbmUgZ3pnZXRjXyAgICAgICAgICAgICAgIHpfZ3pnZXRjXworIyAgICBkZWZpbmUgZ3pnZXRzICAgICAgICAgICAgICAgIHpfZ3pnZXRzCisjICAgIGRlZmluZSBnem9mZnNldCAgICAgICAgICAgICAgel9nem9mZnNldAorIyAgICBkZWZpbmUgZ3pvZmZzZXQ2NCAgICAgICAgICAgIHpfZ3pvZmZzZXQ2NAorIyAgICBkZWZpbmUgZ3pvcGVuICAgICAgICAgICAgICAgIHpfZ3pvcGVuCisjICAgIGRlZmluZSBnem9wZW42NCAgICAgICAgICAgICAgel9nem9wZW42NAorIyAgICBkZWZpbmUgZ3pwcmludGYgICAgICAgICAgICAgIHpfZ3pwcmludGYKKyMgICAgZGVmaW5lIGd6cHV0YyAgICAgICAgICAgICAgICB6X2d6cHV0YworIyAgICBkZWZpbmUgZ3pwdXRzICAgICAgICAgICAgICAgIHpfZ3pwdXRzCisjICAgIGRlZmluZSBnenJlYWQgICAgICAgICAgICAgICAgel9nenJlYWQKKyMgICAgZGVmaW5lIGd6cmV3aW5kICAgICAgICAgICAgICB6X2d6cmV3aW5kCisjICAgIGRlZmluZSBnenNlZWsgICAgICAgICAgICAgICAgel9nenNlZWsKKyMgICAgZGVmaW5lIGd6c2VlazY0ICAgICAgICAgICAgICB6X2d6c2VlazY0CisjICAgIGRlZmluZSBnenNldHBhcmFtcyAgICAgICAgICAgel9nenNldHBhcmFtcworIyAgICBkZWZpbmUgZ3p0ZWxsICAgICAgICAgICAgICAgIHpfZ3p0ZWxsCisjICAgIGRlZmluZSBnenRlbGw2NCAgICAgICAgICAgICAgel9nenRlbGw2NAorIyAgICBkZWZpbmUgZ3p1bmdldGMgICAgICAgICAgICAgIHpfZ3p1bmdldGMKKyMgICAgZGVmaW5lIGd6d3JpdGUgICAgICAgICAgICAgICB6X2d6d3JpdGUKKyMgIGVuZGlmCisjICBkZWZpbmUgaW5mbGF0ZSAgICAgICAgICAgICAgIHpfaW5mbGF0ZQorIyAgZGVmaW5lIGluZmxhdGVCYWNrICAgICAgICAgICB6X2luZmxhdGVCYWNrCisjICBkZWZpbmUgaW5mbGF0ZUJhY2tFbmQgICAgICAgIHpfaW5mbGF0ZUJhY2tFbmQKKyMgIGRlZmluZSBpbmZsYXRlQmFja0luaXRfICAgICAgel9pbmZsYXRlQmFja0luaXRfCisjICBkZWZpbmUgaW5mbGF0ZUNvcHkgICAgICAgICAgIHpfaW5mbGF0ZUNvcHkKKyMgIGRlZmluZSBpbmZsYXRlRW5kICAgICAgICAgICAgel9pbmZsYXRlRW5kCisjICBkZWZpbmUgaW5mbGF0ZUdldEhlYWRlciAgICAgIHpfaW5mbGF0ZUdldEhlYWRlcgorIyAgZGVmaW5lIGluZmxhdGVJbml0Ml8gICAgICAgICB6X2luZmxhdGVJbml0Ml8KKyMgIGRlZmluZSBpbmZsYXRlSW5pdF8gICAgICAgICAgel9pbmZsYXRlSW5pdF8KKyMgIGRlZmluZSBpbmZsYXRlTWFyayAgICAgICAgICAgel9pbmZsYXRlTWFyaworIyAgZGVmaW5lIGluZmxhdGVQcmltZSAgICAgICAgICB6X2luZmxhdGVQcmltZQorIyAgZGVmaW5lIGluZmxhdGVSZXNldCAgICAgICAgICB6X2luZmxhdGVSZXNldAorIyAgZGVmaW5lIGluZmxhdGVSZXNldDIgICAgICAgICB6X2luZmxhdGVSZXNldDIKKyMgIGRlZmluZSBpbmZsYXRlU2V0RGljdGlvbmFyeSAgel9pbmZsYXRlU2V0RGljdGlvbmFyeQorIyAgZGVmaW5lIGluZmxhdGVTeW5jICAgICAgICAgICB6X2luZmxhdGVTeW5jCisjICBkZWZpbmUgaW5mbGF0ZVN5bmNQb2ludCAgICAgIHpfaW5mbGF0ZVN5bmNQb2ludAorIyAgZGVmaW5lIGluZmxhdGVVbmRlcm1pbmUgICAgICB6X2luZmxhdGVVbmRlcm1pbmUKKyMgIGRlZmluZSBpbmZsYXRlUmVzZXRLZWVwICAgICAgel9pbmZsYXRlUmVzZXRLZWVwCisjICBkZWZpbmUgaW5mbGF0ZV9jb3B5cmlnaHQgICAgIHpfaW5mbGF0ZV9jb3B5cmlnaHQKKyMgIGRlZmluZSBpbmZsYXRlX2Zhc3QgICAgICAgICAgel9pbmZsYXRlX2Zhc3QKKyMgIGRlZmluZSBpbmZsYXRlX3RhYmxlICAgICAgICAgel9pbmZsYXRlX3RhYmxlCisjICBpZm5kZWYgWl9TT0xPCisjICAgIGRlZmluZSB1bmNvbXByZXNzICAgICAgICAgICAgel91bmNvbXByZXNzCisjICBlbmRpZgorIyAgZGVmaW5lIHpFcnJvciAgICAgICAgICAgICAgICB6X3pFcnJvcgorIyAgaWZuZGVmIFpfU09MTworIyAgICBkZWZpbmUgemNhbGxvYyAgICAgICAgICAgICAgIHpfemNhbGxvYworIyAgICBkZWZpbmUgemNmcmVlICAgICAgICAgICAgICAgIHpfemNmcmVlCisjICBlbmRpZgorIyAgZGVmaW5lIHpsaWJDb21waWxlRmxhZ3MgICAgICB6X3psaWJDb21waWxlRmxhZ3MKKyMgIGRlZmluZSB6bGliVmVyc2lvbiAgICAgICAgICAgel96bGliVmVyc2lvbgorCisvKiBhbGwgemxpYiB0eXBlZGVmcyBpbiB6bGliLmggYW5kIHpjb25mLmggKi8KKyMgIGRlZmluZSBCeXRlICAgICAgICAgICAgICAgICAgel9CeXRlCisjICBkZWZpbmUgQnl0ZWYgICAgICAgICAgICAgICAgIHpfQnl0ZWYKKyMgIGRlZmluZSBhbGxvY19mdW5jICAgICAgICAgICAgel9hbGxvY19mdW5jCisjICBkZWZpbmUgY2hhcmYgICAgICAgICAgICAgICAgIHpfY2hhcmYKKyMgIGRlZmluZSBmcmVlX2Z1bmMgICAgICAgICAgICAgel9mcmVlX2Z1bmMKKyMgIGlmbmRlZiBaX1NPTE8KKyMgICAgZGVmaW5lIGd6RmlsZSAgICAgICAgICAgICAgICB6X2d6RmlsZQorIyAgICBkZWZpbmUgZ3pfaGVhZGVyICAgICAgICAgICAgIHpfZ3pfaGVhZGVyCisjICAgIGRlZmluZSBnel9oZWFkZXJwICAgICAgICAgICAgel9nel9oZWFkZXJwCisjICBlbmRpZgorIyAgZGVmaW5lIGluX2Z1bmMgICAgICAgICAgICAgICB6X2luX2Z1bmMKKyMgIGRlZmluZSBpbnRmICAgICAgICAgICAgICAgICAgel9pbnRmCisjICBkZWZpbmUgb3V0X2Z1bmMgICAgICAgICAgICAgIHpfb3V0X2Z1bmMKKyMgIGRlZmluZSB1SW50ICAgICAgICAgICAgICAgICAgel91SW50CisjICBkZWZpbmUgdUludGYgICAgICAgICAgICAgICAgIHpfdUludGYKKyMgIGRlZmluZSB1TG9uZyAgICAgICAgICAgICAgICAgel91TG9uZworIyAgZGVmaW5lIHVMb25nZiAgICAgICAgICAgICAgICB6X3VMb25nZgorIyAgZGVmaW5lIHZvaWRwICAgICAgICAgICAgICAgICB6X3ZvaWRwCisjICBkZWZpbmUgdm9pZHBjICAgICAgICAgICAgICAgIHpfdm9pZHBjCisjICBkZWZpbmUgdm9pZHBmICAgICAgICAgICAgICAgIHpfdm9pZHBmCisKKy8qIGFsbCB6bGliIHN0cnVjdHMgaW4gemxpYi5oIGFuZCB6Y29uZi5oICovCisjICBpZm5kZWYgWl9TT0xPCisjICAgIGRlZmluZSBnel9oZWFkZXJfcyAgICAgICAgICAgel9nel9oZWFkZXJfcworIyAgZW5kaWYKKyMgIGRlZmluZSBpbnRlcm5hbF9zdGF0ZSAgICAgICAgel9pbnRlcm5hbF9zdGF0ZQorCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19NU0RPU19fKSAmJiAhZGVmaW5lZChNU0RPUykKKyMgIGRlZmluZSBNU0RPUworI2VuZGlmCisjaWYgKGRlZmluZWQoT1NfMikgfHwgZGVmaW5lZChfX09TMl9fKSkgJiYgIWRlZmluZWQoT1MyKQorIyAgZGVmaW5lIE9TMgorI2VuZGlmCisjaWYgZGVmaW5lZChfV0lORE9XUykgJiYgIWRlZmluZWQoV0lORE9XUykKKyMgIGRlZmluZSBXSU5ET1dTCisjZW5kaWYKKyNpZiBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfV0lOMzJfV0NFKSB8fCBkZWZpbmVkKF9fV0lOMzJfXykKKyMgIGlmbmRlZiBXSU4zMgorIyAgICBkZWZpbmUgV0lOMzIKKyMgIGVuZGlmCisjZW5kaWYKKyNpZiAoZGVmaW5lZChNU0RPUykgfHwgZGVmaW5lZChPUzIpIHx8IGRlZmluZWQoV0lORE9XUykpICYmICFkZWZpbmVkKFdJTjMyKQorIyAgaWYgIWRlZmluZWQoX19HTlVDX18pICYmICFkZWZpbmVkKF9fRkxBVF9fKSAmJiAhZGVmaW5lZChfXzM4Nl9fKQorIyAgICBpZm5kZWYgU1lTMTZCSVQKKyMgICAgICBkZWZpbmUgU1lTMTZCSVQKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjZW5kaWYKKworLyoKKyAqIENvbXBpbGUgd2l0aCAtRE1BWFNFR182NEsgaWYgdGhlIGFsbG9jIGZ1bmN0aW9uIGNhbm5vdCBhbGxvY2F0ZSBtb3JlCisgKiB0aGFuIDY0ayBieXRlcyBhdCBhIHRpbWUgKG5lZWRlZCBvbiBzeXN0ZW1zIHdpdGggMTYtYml0IGludCkuCisgKi8KKyNpZmRlZiBTWVMxNkJJVAorIyAgZGVmaW5lIE1BWFNFR182NEsKKyNlbmRpZgorI2lmZGVmIE1TRE9TCisjICBkZWZpbmUgVU5BTElHTkVEX09LCisjZW5kaWYKKworI2lmZGVmIF9fU1REQ19WRVJTSU9OX18KKyMgIGlmbmRlZiBTVERDCisjICAgIGRlZmluZSBTVERDCisjICBlbmRpZgorIyAgaWYgX19TVERDX1ZFUlNJT05fXyA+PSAxOTk5MDFMCisjICAgIGlmbmRlZiBTVERDOTkKKyMgICAgICBkZWZpbmUgU1REQzk5CisjICAgIGVuZGlmCisjICBlbmRpZgorI2VuZGlmCisjaWYgIWRlZmluZWQoU1REQykgJiYgKGRlZmluZWQoX19TVERDX18pIHx8IGRlZmluZWQoX19jcGx1c3BsdXMpKQorIyAgZGVmaW5lIFNUREMKKyNlbmRpZgorI2lmICFkZWZpbmVkKFNUREMpICYmIChkZWZpbmVkKF9fR05VQ19fKSB8fCBkZWZpbmVkKF9fQk9STEFORENfXykpCisjICBkZWZpbmUgU1REQworI2VuZGlmCisjaWYgIWRlZmluZWQoU1REQykgJiYgKGRlZmluZWQoTVNET1MpIHx8IGRlZmluZWQoV0lORE9XUykgfHwgZGVmaW5lZChXSU4zMikpCisjICBkZWZpbmUgU1REQworI2VuZGlmCisjaWYgIWRlZmluZWQoU1REQykgJiYgKGRlZmluZWQoT1MyKSB8fCBkZWZpbmVkKF9fSE9TX0FJWF9fKSkKKyMgIGRlZmluZSBTVERDCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19PUzQwMF9fKSAmJiAhZGVmaW5lZChTVERDKSAgICAvKiBpU2VyaWVzIChmb3JtZXJseSBBUy80MDApLiAqLworIyAgZGVmaW5lIFNUREMKKyNlbmRpZgorCisjaWZuZGVmIFNUREMKKyMgIGlmbmRlZiBjb25zdCAvKiBjYW5ub3QgdXNlICFkZWZpbmVkKFNUREMpICYmICFkZWZpbmVkKGNvbnN0KSBvbiBNYWMgKi8KKyMgICAgZGVmaW5lIGNvbnN0ICAgICAgIC8qIG5vdGU6IG5lZWQgYSBtb3JlIGdlbnRsZSBzb2x1dGlvbiBoZXJlICovCisjICBlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFpMSUJfQ09OU1QpICYmICFkZWZpbmVkKHpfY29uc3QpCisjICBkZWZpbmUgel9jb25zdCBjb25zdAorI2Vsc2UKKyMgIGRlZmluZSB6X2NvbnN0CisjZW5kaWYKKworLyogU29tZSBNYWMgY29tcGlsZXJzIG1lcmdlIGFsbCAuaCBmaWxlcyBpbmNvcnJlY3RseTogKi8KKyNpZiBkZWZpbmVkKF9fTVdFUktTX18pfHxkZWZpbmVkKGFwcGxlYyl8fGRlZmluZWQoVEhJTktfQyl8fGRlZmluZWQoX19TQ19fKQorIyAgZGVmaW5lIE5PX0RVTU1ZX0RFQ0wKKyNlbmRpZgorCisvKiBNYXhpbXVtIHZhbHVlIGZvciBtZW1MZXZlbCBpbiBkZWZsYXRlSW5pdDIgKi8KKyNpZm5kZWYgTUFYX01FTV9MRVZFTAorIyAgaWZkZWYgTUFYU0VHXzY0SworIyAgICBkZWZpbmUgTUFYX01FTV9MRVZFTCA4CisjICBlbHNlCisjICAgIGRlZmluZSBNQVhfTUVNX0xFVkVMIDkKKyMgIGVuZGlmCisjZW5kaWYKKworLyogTWF4aW11bSB2YWx1ZSBmb3Igd2luZG93Qml0cyBpbiBkZWZsYXRlSW5pdDIgYW5kIGluZmxhdGVJbml0Mi4KKyAqIFdBUk5JTkc6IHJlZHVjaW5nIE1BWF9XQklUUyBtYWtlcyBtaW5pZ3ppcCB1bmFibGUgdG8gZXh0cmFjdCAuZ3ogZmlsZXMKKyAqIGNyZWF0ZWQgYnkgZ3ppcC4gKEZpbGVzIGNyZWF0ZWQgYnkgbWluaWd6aXAgY2FuIHN0aWxsIGJlIGV4dHJhY3RlZCBieQorICogZ3ppcC4pCisgKi8KKyNpZm5kZWYgTUFYX1dCSVRTCisjICBkZWZpbmUgTUFYX1dCSVRTICAgMTUgLyogMzJLIExaNzcgd2luZG93ICovCisjZW5kaWYKKworLyogVGhlIG1lbW9yeSByZXF1aXJlbWVudHMgZm9yIGRlZmxhdGUgYXJlIChpbiBieXRlcyk6CisgICAgICAgICAgICAoMSA8PCAod2luZG93Qml0cysyKSkgKyAgKDEgPDwgKG1lbUxldmVsKzkpKQorIHRoYXQgaXM6IDEyOEsgZm9yIHdpbmRvd0JpdHM9MTUgICsgIDEyOEsgZm9yIG1lbUxldmVsID0gOCAgKGRlZmF1bHQgdmFsdWVzKQorIHBsdXMgYSBmZXcga2lsb2J5dGVzIGZvciBzbWFsbCBvYmplY3RzLiBGb3IgZXhhbXBsZSwgaWYgeW91IHdhbnQgdG8gcmVkdWNlCisgdGhlIGRlZmF1bHQgbWVtb3J5IHJlcXVpcmVtZW50cyBmcm9tIDI1NksgdG8gMTI4SywgY29tcGlsZSB3aXRoCisgICAgIG1ha2UgQ0ZMQUdTPSItTyAtRE1BWF9XQklUUz0xNCAtRE1BWF9NRU1fTEVWRUw9NyIKKyBPZiBjb3Vyc2UgdGhpcyB3aWxsIGdlbmVyYWxseSBkZWdyYWRlIGNvbXByZXNzaW9uICh0aGVyZSdzIG5vIGZyZWUgbHVuY2gpLgorCisgICBUaGUgbWVtb3J5IHJlcXVpcmVtZW50cyBmb3IgaW5mbGF0ZSBhcmUgKGluIGJ5dGVzKSAxIDw8IHdpbmRvd0JpdHMKKyB0aGF0IGlzLCAzMksgZm9yIHdpbmRvd0JpdHM9MTUgKGRlZmF1bHQgdmFsdWUpIHBsdXMgYSBmZXcga2lsb2J5dGVzCisgZm9yIHNtYWxsIG9iamVjdHMuCisqLworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBUeXBlIGRlY2xhcmF0aW9ucyAqLworCisjaWZuZGVmIE9GIC8qIGZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KKyMgIGlmZGVmIFNUREMKKyMgICAgZGVmaW5lIE9GKGFyZ3MpICBhcmdzCisjICBlbHNlCisjICAgIGRlZmluZSBPRihhcmdzKSAgKCkKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmbmRlZiBaX0FSRyAvKiBmdW5jdGlvbiBwcm90b3R5cGVzIGZvciBzdGRhcmcgKi8KKyMgIGlmIGRlZmluZWQoU1REQykgfHwgZGVmaW5lZChaX0hBVkVfU1REQVJHX0gpCisjICAgIGRlZmluZSBaX0FSRyhhcmdzKSAgYXJncworIyAgZWxzZQorIyAgICBkZWZpbmUgWl9BUkcoYXJncykgICgpCisjICBlbmRpZgorI2VuZGlmCisKKy8qIFRoZSBmb2xsb3dpbmcgZGVmaW5pdGlvbnMgZm9yIEZBUiBhcmUgbmVlZGVkIG9ubHkgZm9yIE1TRE9TIG1peGVkCisgKiBtb2RlbCBwcm9ncmFtbWluZyAoc21hbGwgb3IgbWVkaXVtIG1vZGVsIHdpdGggc29tZSBmYXIgYWxsb2NhdGlvbnMpLgorICogVGhpcyB3YXMgdGVzdGVkIG9ubHkgd2l0aCBNU0M7IGZvciBvdGhlciBNU0RPUyBjb21waWxlcnMgeW91IG1heSBoYXZlCisgKiB0byBkZWZpbmUgTk9fTUVNQ1BZIGluIHp1dGlsLmguICBJZiB5b3UgZG9uJ3QgbmVlZCB0aGUgbWl4ZWQgbW9kZWwsCisgKiBqdXN0IGRlZmluZSBGQVIgdG8gYmUgZW1wdHkuCisgKi8KKyNpZmRlZiBTWVMxNkJJVAorIyAgaWYgZGVmaW5lZChNX0k4NlNNKSB8fCBkZWZpbmVkKE1fSTg2TU0pCisgICAgIC8qIE1TQyBzbWFsbCBvciBtZWRpdW0gbW9kZWwgKi8KKyMgICAgZGVmaW5lIFNNQUxMX01FRElVTQorIyAgICBpZmRlZiBfTVNDX1ZFUgorIyAgICAgIGRlZmluZSBGQVIgX2ZhcgorIyAgICBlbHNlCisjICAgICAgZGVmaW5lIEZBUiBmYXIKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjICBpZiAoZGVmaW5lZChfX1NNQUxMX18pIHx8IGRlZmluZWQoX19NRURJVU1fXykpCisgICAgIC8qIFR1cmJvIEMgc21hbGwgb3IgbWVkaXVtIG1vZGVsICovCisjICAgIGRlZmluZSBTTUFMTF9NRURJVU0KKyMgICAgaWZkZWYgX19CT1JMQU5EQ19fCisjICAgICAgZGVmaW5lIEZBUiBfZmFyCisjICAgIGVsc2UKKyMgICAgICBkZWZpbmUgRkFSIGZhcgorIyAgICBlbmRpZgorIyAgZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZChXSU5ET1dTKSB8fCBkZWZpbmVkKFdJTjMyKQorICAgLyogSWYgYnVpbGRpbmcgb3IgdXNpbmcgemxpYiBhcyBhIERMTCwgZGVmaW5lIFpMSUJfRExMLgorICAgICogVGhpcyBpcyBub3QgbWFuZGF0b3J5LCBidXQgaXQgb2ZmZXJzIGEgbGl0dGxlIHBlcmZvcm1hbmNlIGluY3JlYXNlLgorICAgICovCisjICBpZmRlZiBaTElCX0RMTAorIyAgICBpZiBkZWZpbmVkKFdJTjMyKSAmJiAoIWRlZmluZWQoX19CT1JMQU5EQ19fKSB8fCAoX19CT1JMQU5EQ19fID49IDB4NTAwKSkKKyMgICAgICBpZmRlZiBaTElCX0lOVEVSTkFMCisjICAgICAgICBkZWZpbmUgWkVYVEVSTiBleHRlcm4gX19kZWNsc3BlYyhkbGxleHBvcnQpCisjICAgICAgZWxzZQorIyAgICAgICAgZGVmaW5lIFpFWFRFUk4gZXh0ZXJuIF9fZGVjbHNwZWMoZGxsaW1wb3J0KQorIyAgICAgIGVuZGlmCisjICAgIGVuZGlmCisjICBlbmRpZiAgLyogWkxJQl9ETEwgKi8KKyAgIC8qIElmIGJ1aWxkaW5nIG9yIHVzaW5nIHpsaWIgd2l0aCB0aGUgV0lOQVBJL1dJTkFQSVYgY2FsbGluZyBjb252ZW50aW9uLAorICAgICogZGVmaW5lIFpMSUJfV0lOQVBJLgorICAgICogQ2F1dGlvbjogdGhlIHN0YW5kYXJkIFpMSUIxLkRMTCBpcyBOT1QgY29tcGlsZWQgdXNpbmcgWkxJQl9XSU5BUEkuCisgICAgKi8KKyMgIGlmZGVmIFpMSUJfV0lOQVBJCisjICAgIGlmZGVmIEZBUgorIyAgICAgIHVuZGVmIEZBUgorIyAgICBlbmRpZgorIyAgICBpbmNsdWRlIDx3aW5kb3dzLmg+CisgICAgIC8qIE5vIG5lZWQgZm9yIF9leHBvcnQsIHVzZSBaTElCLkRFRiBpbnN0ZWFkLiAqLworICAgICAvKiBGb3IgY29tcGxldGUgV2luZG93cyBjb21wYXRpYmlsaXR5LCB1c2UgV0lOQVBJLCBub3QgX19zdGRjYWxsLiAqLworIyAgICBkZWZpbmUgWkVYUE9SVCBXSU5BUEkKKyMgICAgaWZkZWYgV0lOMzIKKyMgICAgICBkZWZpbmUgWkVYUE9SVFZBIFdJTkFQSVYKKyMgICAgZWxzZQorIyAgICAgIGRlZmluZSBaRVhQT1JUVkEgRkFSIENERUNMCisjICAgIGVuZGlmCisjICBlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfX0JFT1NfXykKKyMgIGlmZGVmIFpMSUJfRExMCisjICAgIGlmZGVmIFpMSUJfSU5URVJOQUwKKyMgICAgICBkZWZpbmUgWkVYUE9SVCAgIF9fZGVjbHNwZWMoZGxsZXhwb3J0KQorIyAgICAgIGRlZmluZSBaRVhQT1JUVkEgX19kZWNsc3BlYyhkbGxleHBvcnQpCisjICAgIGVsc2UKKyMgICAgICBkZWZpbmUgWkVYUE9SVCAgIF9fZGVjbHNwZWMoZGxsaW1wb3J0KQorIyAgICAgIGRlZmluZSBaRVhQT1JUVkEgX19kZWNsc3BlYyhkbGxpbXBvcnQpCisjICAgIGVuZGlmCisjICBlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgWkVYVEVSTgorIyAgZGVmaW5lIFpFWFRFUk4gZXh0ZXJuCisjZW5kaWYKKyNpZm5kZWYgWkVYUE9SVAorIyAgZGVmaW5lIFpFWFBPUlQKKyNlbmRpZgorI2lmbmRlZiBaRVhQT1JUVkEKKyMgIGRlZmluZSBaRVhQT1JUVkEKKyNlbmRpZgorCisjaWZuZGVmIEZBUgorIyAgZGVmaW5lIEZBUgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChfX01BQ1RZUEVTX18pCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgIEJ5dGU7ICAvKiA4IGJpdHMgKi8KKyNlbmRpZgordHlwZWRlZiB1bnNpZ25lZCBpbnQgICB1SW50OyAgLyogMTYgYml0cyBvciBtb3JlICovCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgIHVMb25nOyAvKiAzMiBiaXRzIG9yIG1vcmUgKi8KKworI2lmZGVmIFNNQUxMX01FRElVTQorICAgLyogQm9ybGFuZCBDL0MrKyBhbmQgc29tZSBvbGQgTVNDIHZlcnNpb25zIGlnbm9yZSBGQVIgaW5zaWRlIHR5cGVkZWYgKi8KKyMgIGRlZmluZSBCeXRlZiBCeXRlIEZBUgorI2Vsc2UKKyAgIHR5cGVkZWYgQnl0ZSAgRkFSIEJ5dGVmOworI2VuZGlmCit0eXBlZGVmIGNoYXIgIEZBUiBjaGFyZjsKK3R5cGVkZWYgaW50ICAgRkFSIGludGY7Cit0eXBlZGVmIHVJbnQgIEZBUiB1SW50ZjsKK3R5cGVkZWYgdUxvbmcgRkFSIHVMb25nZjsKKworI2lmZGVmIFNUREMKKyAgIHR5cGVkZWYgdm9pZCBjb25zdCAqdm9pZHBjOworICAgdHlwZWRlZiB2b2lkIEZBUiAgICp2b2lkcGY7CisgICB0eXBlZGVmIHZvaWQgICAgICAgKnZvaWRwOworI2Vsc2UKKyAgIHR5cGVkZWYgQnl0ZSBjb25zdCAqdm9pZHBjOworICAgdHlwZWRlZiBCeXRlIEZBUiAgICp2b2lkcGY7CisgICB0eXBlZGVmIEJ5dGUgICAgICAgKnZvaWRwOworI2VuZGlmCisKKyNpZmRlZiBIQVZFX1VOSVNURF9IICAgIC8qIG1heSBiZSBzZXQgdG8gI2lmIDEgYnkgLi9jb25maWd1cmUgKi8KKyMgIGRlZmluZSBaX0hBVkVfVU5JU1REX0gKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9TVERBUkdfSCAgICAvKiBtYXkgYmUgc2V0IHRvICNpZiAxIGJ5IC4vY29uZmlndXJlICovCisjICBkZWZpbmUgWl9IQVZFX1NUREFSR19ICisjZW5kaWYKKworI2lmZGVmIFNUREMKKyMgIGlmbmRlZiBaX1NPTE8KKyMgICAgaW5jbHVkZSA8c3lzL3R5cGVzLmg+ICAgICAgLyogZm9yIG9mZl90ICovCisjICBlbmRpZgorI2VuZGlmCisKKy8qIGEgbGl0dGxlIHRyaWNrIHRvIGFjY29tbW9kYXRlIGJvdGggIiNkZWZpbmUgX0xBUkdFRklMRTY0X1NPVVJDRSIgYW5kCisgKiAiI2RlZmluZSBfTEFSR0VGSUxFNjRfU09VUkNFIDEiIGFzIHJlcXVlc3RpbmcgNjQtYml0IG9wZXJhdGlvbnMsIChldmVuCisgKiB0aG91Z2ggdGhlIGZvcm1lciBkb2VzIG5vdCBjb25mb3JtIHRvIHRoZSBMRlMgZG9jdW1lbnQpLCBidXQgY29uc2lkZXJpbmcKKyAqIGJvdGggIiN1bmRlZiBfTEFSR0VGSUxFNjRfU09VUkNFIiBhbmQgIiNkZWZpbmUgX0xBUkdFRklMRTY0X1NPVVJDRSAwIiBhcworICogZXF1aXZhbGVudGx5IHJlcXVlc3Rpbmcgbm8gNjQtYml0IG9wZXJhdGlvbnMKKyAqLworI2lmIC1fTEFSR0VGSUxFNjRfU09VUkNFIC0gLTEgPT0gMQorIyAgdW5kZWYgX0xBUkdFRklMRTY0X1NPVVJDRQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9MQVJHRUZJTEU2NF9TT1VSQ0UpICYmIF9MRlM2NF9MQVJHRUZJTEUtMAorIyAgZGVmaW5lIFpfTEFSR0UKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoWl9IQVZFX1VOSVNURF9IKSB8fCBkZWZpbmVkKFpfTEFSR0UpKSAmJiAhZGVmaW5lZChaX1NPTE8pCisjICBpbmNsdWRlIDx1bmlzdGQuaD4gICAgICAgLyogZm9yIFNFRUtfKiBhbmQgb2ZmX3QgKi8KKyMgIGlmZGVmIFZNUworIyAgICBpbmNsdWRlIDx1bml4aW8uaD4gICAgIC8qIGZvciBvZmZfdCAqLworIyAgZW5kaWYKKyMgIGlmbmRlZiB6X29mZl90CisjICAgIGRlZmluZSB6X29mZl90IG9mZl90CisjICBlbmRpZgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChTRUVLX1NFVCkgJiYgIWRlZmluZWQoWl9TT0xPKQorIyAgZGVmaW5lIFNFRUtfU0VUICAgICAgICAwICAgICAgIC8qIFNlZWsgZnJvbSBiZWdpbm5pbmcgb2YgZmlsZS4gICovCisjICBkZWZpbmUgU0VFS19DVVIgICAgICAgIDEgICAgICAgLyogU2VlayBmcm9tIGN1cnJlbnQgcG9zaXRpb24uICAqLworIyAgZGVmaW5lIFNFRUtfRU5EICAgICAgICAyICAgICAgIC8qIFNldCBmaWxlIHBvaW50ZXIgdG8gRU9GIHBsdXMgIm9mZnNldCIgKi8KKyNlbmRpZgorCisjaWZuZGVmIHpfb2ZmX3QKKyMgIGRlZmluZSB6X29mZl90IGxvbmcKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoX1dJTjMyKSAmJiAoZGVmaW5lZChfTEFSR0VGSUxFNjRfU09VUkNFKSAmJiBfTEZTNjRfTEFSR0VGSUxFLTApCisjICBkZWZpbmUgel9vZmY2NF90IG9mZjY0X3QKKyNlbHNlCisjICBpZiBkZWZpbmVkKF9XSU4zMikKKyMgICAgZGVmaW5lIHpfb2ZmNjRfdCBfX2ludDY0CisjICBlbHNlCisjICBkZWZpbmUgel9vZmY2NF90IHpfb2ZmX3QKKyNlbmRpZgorI2VuZGlmCisKKy8qIE1WUyBsaW5rZXIgZG9lcyBub3Qgc3VwcG9ydCBleHRlcm5hbCBuYW1lcyBsYXJnZXIgdGhhbiA4IGJ5dGVzICovCisjaWYgZGVmaW5lZChfX01WU19fKQorICAjcHJhZ21hIG1hcChkZWZsYXRlSW5pdF8sIkRFSU4iKQorICAjcHJhZ21hIG1hcChkZWZsYXRlSW5pdDJfLCJERUlOMiIpCisgICNwcmFnbWEgbWFwKGRlZmxhdGVFbmQsIkRFRU5EIikKKyAgI3ByYWdtYSBtYXAoZGVmbGF0ZUJvdW5kLCJERUJORCIpCisgICNwcmFnbWEgbWFwKGluZmxhdGVJbml0XywiSU5JTiIpCisgICNwcmFnbWEgbWFwKGluZmxhdGVJbml0Ml8sIklOSU4yIikKKyAgI3ByYWdtYSBtYXAoaW5mbGF0ZUVuZCwiSU5FTkQiKQorICAjcHJhZ21hIG1hcChpbmZsYXRlU3luYywiSU5TWSIpCisgICNwcmFnbWEgbWFwKGluZmxhdGVTZXREaWN0aW9uYXJ5LCJJTlNFREkiKQorICAjcHJhZ21hIG1hcChjb21wcmVzc0JvdW5kLCJDTUJORCIpCisgICNwcmFnbWEgbWFwKGluZmxhdGVfdGFibGUsIklOVEFCTCIpCisgICNwcmFnbWEgbWFwKGluZmxhdGVfZmFzdCwiSU5GQSIpCisgICNwcmFnbWEgbWFwKGluZmxhdGVfY29weXJpZ2h0LCJJTkNPUFkiKQorI2VuZGlmCisKKyNlbmRpZiAvKiBaQ09ORl9IICovCmRpZmYgLS1naXQgYS96bGliLTEuMi42L3psaWIuMyBiL3psaWItMS4yLjYvemxpYi4zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwNTFjNzkKLS0tIC9kZXYvbnVsbAorKysgYi96bGliLTEuMi42L3psaWIuMwpAQCAtMCwwICsxLDE1MSBAQAorLlRIIFpMSUIgMyAiMjkgSmFuIDIwMTIiCisuU0ggTkFNRQoremxpYiBcLSBjb21wcmVzc2lvbi9kZWNvbXByZXNzaW9uIGxpYnJhcnkKKy5TSCBTWU5PUFNJUworW3NlZQorLkkgemxpYi5oCitmb3IgZnVsbCBkZXNjcmlwdGlvbl0KKy5TSCBERVNDUklQVElPTgorVGhlCisuSSB6bGliCitsaWJyYXJ5IGlzIGEgZ2VuZXJhbCBwdXJwb3NlIGRhdGEgY29tcHJlc3Npb24gbGlicmFyeS4KK1RoZSBjb2RlIGlzIHRocmVhZCBzYWZlLCBhc3N1bWluZyB0aGF0IHRoZSBzdGFuZGFyZCBsaWJyYXJ5IGZ1bmN0aW9ucwordXNlZCBhcmUgdGhyZWFkIHNhZmUsIHN1Y2ggYXMgbWVtb3J5IGFsbG9jYXRpb24gcm91dGluZXMuCitJdCBwcm92aWRlcyBpbi1tZW1vcnkgY29tcHJlc3Npb24gYW5kIGRlY29tcHJlc3Npb24gZnVuY3Rpb25zLAoraW5jbHVkaW5nIGludGVncml0eSBjaGVja3Mgb2YgdGhlIHVuY29tcHJlc3NlZCBkYXRhLgorVGhpcyB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5IHN1cHBvcnRzIG9ubHkgb25lIGNvbXByZXNzaW9uIG1ldGhvZCAoZGVmbGF0aW9uKQorYnV0IG90aGVyIGFsZ29yaXRobXMgbWF5IGJlIGFkZGVkIGxhdGVyCit3aXRoIHRoZSBzYW1lIHN0cmVhbSBpbnRlcmZhY2UuCisuTFAKK0NvbXByZXNzaW9uIGNhbiBiZSBkb25lIGluIGEgc2luZ2xlIHN0ZXAgaWYgdGhlIGJ1ZmZlcnMgYXJlIGxhcmdlIGVub3VnaAorb3IgY2FuIGJlIGRvbmUgYnkgcmVwZWF0ZWQgY2FsbHMgb2YgdGhlIGNvbXByZXNzaW9uIGZ1bmN0aW9uLgorSW4gdGhlIGxhdHRlciBjYXNlLAordGhlIGFwcGxpY2F0aW9uIG11c3QgcHJvdmlkZSBtb3JlIGlucHV0IGFuZC9vciBjb25zdW1lIHRoZSBvdXRwdXQKKyhwcm92aWRpbmcgbW9yZSBvdXRwdXQgc3BhY2UpIGJlZm9yZSBlYWNoIGNhbGwuCisuTFAKK1RoZSBsaWJyYXJ5IGFsc28gc3VwcG9ydHMgcmVhZGluZyBhbmQgd3JpdGluZyBmaWxlcyBpbgorLklSIGd6aXAgKDEpCisoLmd6KSBmb3JtYXQKK3dpdGggYW4gaW50ZXJmYWNlIHNpbWlsYXIgdG8gdGhhdCBvZiBzdGRpby4KKy5MUAorVGhlIGxpYnJhcnkgZG9lcyBub3QgaW5zdGFsbCBhbnkgc2lnbmFsIGhhbmRsZXIuCitUaGUgZGVjb2RlciBjaGVja3MgdGhlIGNvbnNpc3RlbmN5IG9mIHRoZSBjb21wcmVzc2VkIGRhdGEsCitzbyB0aGUgbGlicmFyeSBzaG91bGQgbmV2ZXIgY3Jhc2ggZXZlbiBpbiB0aGUgY2FzZSBvZiBjb3JydXB0ZWQgaW5wdXQuCisuTFAKK0FsbCBmdW5jdGlvbnMgb2YgdGhlIGNvbXByZXNzaW9uIGxpYnJhcnkgYXJlIGRvY3VtZW50ZWQgaW4gdGhlIGZpbGUKKy5JUiB6bGliLmggLgorVGhlIGRpc3RyaWJ1dGlvbiBzb3VyY2UgaW5jbHVkZXMgZXhhbXBsZXMgb2YgdXNlIG9mIHRoZSBsaWJyYXJ5CitpbiB0aGUgZmlsZXMKKy5JIHRlc3QvZXhhbXBsZS5jCithbmQKKy5JUiB0ZXN0L21pbmlnemlwLmMsCithcyB3ZWxsIGFzIG90aGVyIGV4YW1wbGVzIGluIHRoZQorLklSIGV4YW1wbGVzLworZGlyZWN0b3J5LgorLkxQCitDaGFuZ2VzIHRvIHRoaXMgdmVyc2lvbiBhcmUgZG9jdW1lbnRlZCBpbiB0aGUgZmlsZQorLkkgQ2hhbmdlTG9nCit0aGF0IGFjY29tcGFuaWVzIHRoZSBzb3VyY2UuCisuTFAKKy5JIHpsaWIKK2lzIGF2YWlsYWJsZSBpbiBKYXZhIHVzaW5nIHRoZSBqYXZhLnV0aWwuemlwIHBhY2thZ2U6CisuSVAKK2h0dHA6Ly9qYXZhLnN1bi5jb20vZGV2ZWxvcGVyL3RlY2huaWNhbEFydGljbGVzL1Byb2dyYW1taW5nL2NvbXByZXNzaW9uLworLkxQCitBIFBlcmwgaW50ZXJmYWNlIHRvCisuSVIgemxpYiAsCit3cml0dGVuIGJ5IFBhdWwgTWFycXVlc3MgKHBtcXNAY3Bhbi5vcmcpLAoraXMgYXZhaWxhYmxlIGF0IENQQU4gKENvbXByZWhlbnNpdmUgUGVybCBBcmNoaXZlIE5ldHdvcmspIHNpdGVzLAoraW5jbHVkaW5nOgorLklQCitodHRwOi8vc2VhcmNoLmNwYW4ub3JnL35wbXFzL0lPLUNvbXByZXNzLVpsaWIvCisuTFAKK0EgUHl0aG9uIGludGVyZmFjZSB0bworLklSIHpsaWIgLAord3JpdHRlbiBieSBBLk0uIEt1Y2hsaW5nIChhbWtAbWFnbmV0LmNvbSksCitpcyBhdmFpbGFibGUgaW4gUHl0aG9uIDEuNSBhbmQgbGF0ZXIgdmVyc2lvbnM6CisuSVAKK2h0dHA6Ly9kb2NzLnB5dGhvbi5vcmcvbGlicmFyeS96bGliLmh0bWwKKy5MUAorLkkgemxpYgoraXMgYnVpbHQgaW50bworLklSIHRjbDoKKy5JUAoraHR0cDovL3dpa2kudGNsLnRrLzQ2MTAKKy5MUAorQW4gZXhwZXJpbWVudGFsIHBhY2thZ2UgdG8gcmVhZCBhbmQgd3JpdGUgZmlsZXMgaW4gLnppcCBmb3JtYXQsCit3cml0dGVuIG9uIHRvcCBvZgorLkkgemxpYgorYnkgR2lsbGVzIFZvbGxhbnQgKGluZm9Ad2luaW1hZ2UuY29tKSwKK2lzIGF2YWlsYWJsZSBhdDoKKy5JUAoraHR0cDovL3d3dy53aW5pbWFnZS5jb20vekxpYkRsbC9taW5pemlwLmh0bWwKK2FuZCBhbHNvIGluIHRoZQorLkkgY29udHJpYi9taW5pemlwCitkaXJlY3Rvcnkgb2YgdGhlIG1haW4KKy5JIHpsaWIKK3NvdXJjZSBkaXN0cmlidXRpb24uCisuU0ggIlNFRSBBTFNPIgorVGhlCisuSSB6bGliCit3ZWIgc2l0ZSBjYW4gYmUgZm91bmQgYXQ6CisuSVAKK2h0dHA6Ly96bGliLm5ldC8KKy5MUAorVGhlIGRhdGEgZm9ybWF0IHVzZWQgYnkgdGhlIHpsaWIgbGlicmFyeSBpcyBkZXNjcmliZWQgYnkgUkZDCisoUmVxdWVzdCBmb3IgQ29tbWVudHMpIDE5NTAgdG8gMTk1MiBpbiB0aGUgZmlsZXM6CisuSVAKK2h0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzE5NTAgKGZvciB0aGUgemxpYiBoZWFkZXIgYW5kIHRyYWlsZXIgZm9ybWF0KQorLmJyCitodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMxOTUxIChmb3IgdGhlIGRlZmxhdGUgY29tcHJlc3NlZCBkYXRhIGZvcm1hdCkKKy5icgoraHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMTk1MiAoZm9yIHRoZSBnemlwIGhlYWRlciBhbmQgdHJhaWxlciBmb3JtYXQpCisuTFAKK01hcmsgTmVsc29uIHdyb3RlIGFuIGFydGljbGUgYWJvdXQKKy5JIHpsaWIKK2ZvciB0aGUgSmFuLiAxOTk3IGlzc3VlIG9mICBEci4gRG9iYidzIEpvdXJuYWw7CithIGNvcHkgb2YgdGhlIGFydGljbGUgaXMgYXZhaWxhYmxlIGF0OgorLklQCitodHRwOi8vbWFya25lbHNvbi51cy8xOTk3LzAxLzAxL3psaWItZW5naW5lLworLlNIICJSRVBPUlRJTkcgUFJPQkxFTVMiCitCZWZvcmUgcmVwb3J0aW5nIGEgcHJvYmxlbSwKK3BsZWFzZSBjaGVjayB0aGUKKy5JIHpsaWIKK3dlYiBzaXRlIHRvIHZlcmlmeSB0aGF0IHlvdSBoYXZlIHRoZSBsYXRlc3QgdmVyc2lvbiBvZgorLklSIHpsaWIgOworb3RoZXJ3aXNlLAorb2J0YWluIHRoZSBsYXRlc3QgdmVyc2lvbiBhbmQgc2VlIGlmIHRoZSBwcm9ibGVtIHN0aWxsIGV4aXN0cy4KK1BsZWFzZSByZWFkIHRoZQorLkkgemxpYgorRkFRIGF0OgorLklQCitodHRwOi8vemxpYi5uZXQvemxpYl9mYXEuaHRtbAorLkxQCitiZWZvcmUgYXNraW5nIGZvciBoZWxwLgorU2VuZCBxdWVzdGlvbnMgYW5kL29yIGNvbW1lbnRzIHRvIHpsaWJAZ3ppcC5vcmcsCitvciAoZm9yIHRoZSBXaW5kb3dzIERMTCB2ZXJzaW9uKSB0byBHaWxsZXMgVm9sbGFudCAoaW5mb0B3aW5pbWFnZS5jb20pLgorLlNIIEFVVEhPUlMKK1ZlcnNpb24gMS4yLjYKK0NvcHlyaWdodCAoQykgMTk5NS0yMDEyIEplYW4tbG91cCBHYWlsbHkgKGpsb3VwQGd6aXAub3JnKQorYW5kIE1hcmsgQWRsZXIgKG1hZGxlckBhbHVtbmkuY2FsdGVjaC5lZHUpLgorLkxQCitUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICJhcy1pcywiCit3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCitJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcworYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KK1NlZSB0aGUgZGlzdHJpYnV0aW9uIGRpcmVjdG9yeSB3aXRoIHJlc3BlY3QgdG8gcmVxdWlyZW1lbnRzCitnb3Zlcm5pbmcgcmVkaXN0cmlidXRpb24uCitUaGUgZGVmbGF0ZSBmb3JtYXQgdXNlZCBieQorLkkgemxpYgord2FzIGRlZmluZWQgYnkgUGhpbCBLYXR6LgorVGhlIGRlZmxhdGUgYW5kCisuSSB6bGliCitzcGVjaWZpY2F0aW9ucyB3ZXJlIHdyaXR0ZW4gYnkgTC4gUGV0ZXIgRGV1dHNjaC4KK1RoYW5rcyB0byBhbGwgdGhlIHBlb3BsZSB3aG8gcmVwb3J0ZWQgcHJvYmxlbXMgYW5kIHN1Z2dlc3RlZCB2YXJpb3VzCitpbXByb3ZlbWVudHMgaW4KKy5JUiB6bGliIDsKK3dobyBhcmUgdG9vIG51bWVyb3VzIHRvIGNpdGUgaGVyZS4KKy5MUAorVU5JWCBtYW51YWwgcGFnZSBieSBSLiBQLiBDLiBSb2RnZXJzLAorVS5TLiBOYXRpb25hbCBMaWJyYXJ5IG9mIE1lZGljaW5lIChyb2RnZXJzQG5sbS5uaWguZ292KS4KKy5cIiBlbmQgb2YgbWFuIHBhZ2UKZGlmZiAtLWdpdCBhL3psaWItMS4yLjYvemxpYi4zLnBkZiBiL3psaWItMS4yLjYvemxpYi4zLnBkZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmEyYTc4Ci0tLSAvZGV2L251bGwKKysrIGIvemxpYi0xLjIuNi96bGliLjMucGRmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3psaWItMS4yLjYvemxpYi5oIGIvemxpYi0xLjIuNi96bGliLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzkxNDJkMQotLS0gL2Rldi9udWxsCisrKyBiL3psaWItMS4yLjYvemxpYi5oCkBAIC0wLDAgKzEsMTczMiBAQAorLyogemxpYi5oIC0tIGludGVyZmFjZSBvZiB0aGUgJ3psaWInIGdlbmVyYWwgcHVycG9zZSBjb21wcmVzc2lvbiBsaWJyYXJ5CisgIHZlcnNpb24gMS4yLjYsIEphbnVhcnkgMjl0aCwgMjAxMgorCisgIENvcHlyaWdodCAoQykgMTk5NS0yMDEyIEplYW4tbG91cCBHYWlsbHkgYW5kIE1hcmsgQWRsZXIKKworICBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAorICB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCisgIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCisKKyAgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCisgIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKKyAgZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgorCisgIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90CisgICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCisgICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQorICAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgorICAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQorICAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCisgIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCisKKyAgSmVhbi1sb3VwIEdhaWxseSAgICAgICAgTWFyayBBZGxlcgorICBqbG91cEBnemlwLm9yZyAgICAgICAgICBtYWRsZXJAYWx1bW5pLmNhbHRlY2guZWR1CisKKworICBUaGUgZGF0YSBmb3JtYXQgdXNlZCBieSB0aGUgemxpYiBsaWJyYXJ5IGlzIGRlc2NyaWJlZCBieSBSRkNzIChSZXF1ZXN0IGZvcgorICBDb21tZW50cykgMTk1MCB0byAxOTUyIGluIHRoZSBmaWxlcyBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMxOTUwCisgICh6bGliIGZvcm1hdCksIHJmYzE5NTEgKGRlZmxhdGUgZm9ybWF0KSBhbmQgcmZjMTk1MiAoZ3ppcCBmb3JtYXQpLgorKi8KKworI2lmbmRlZiBaTElCX0gKKyNkZWZpbmUgWkxJQl9ICisKKyNpbmNsdWRlICJ6Y29uZi5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNkZWZpbmUgWkxJQl9WRVJTSU9OICIxLjIuNiIKKyNkZWZpbmUgWkxJQl9WRVJOVU0gMHgxMjYwCisjZGVmaW5lIFpMSUJfVkVSX01BSk9SIDEKKyNkZWZpbmUgWkxJQl9WRVJfTUlOT1IgMgorI2RlZmluZSBaTElCX1ZFUl9SRVZJU0lPTiA2CisjZGVmaW5lIFpMSUJfVkVSX1NVQlJFVklTSU9OIDAKKworLyoKKyAgICBUaGUgJ3psaWInIGNvbXByZXNzaW9uIGxpYnJhcnkgcHJvdmlkZXMgaW4tbWVtb3J5IGNvbXByZXNzaW9uIGFuZAorICBkZWNvbXByZXNzaW9uIGZ1bmN0aW9ucywgaW5jbHVkaW5nIGludGVncml0eSBjaGVja3Mgb2YgdGhlIHVuY29tcHJlc3NlZCBkYXRhLgorICBUaGlzIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkgc3VwcG9ydHMgb25seSBvbmUgY29tcHJlc3Npb24gbWV0aG9kIChkZWZsYXRpb24pCisgIGJ1dCBvdGhlciBhbGdvcml0aG1zIHdpbGwgYmUgYWRkZWQgbGF0ZXIgYW5kIHdpbGwgaGF2ZSB0aGUgc2FtZSBzdHJlYW0KKyAgaW50ZXJmYWNlLgorCisgICAgQ29tcHJlc3Npb24gY2FuIGJlIGRvbmUgaW4gYSBzaW5nbGUgc3RlcCBpZiB0aGUgYnVmZmVycyBhcmUgbGFyZ2UgZW5vdWdoLAorICBvciBjYW4gYmUgZG9uZSBieSByZXBlYXRlZCBjYWxscyBvZiB0aGUgY29tcHJlc3Npb24gZnVuY3Rpb24uICBJbiB0aGUgbGF0dGVyCisgIGNhc2UsIHRoZSBhcHBsaWNhdGlvbiBtdXN0IHByb3ZpZGUgbW9yZSBpbnB1dCBhbmQvb3IgY29uc3VtZSB0aGUgb3V0cHV0CisgIChwcm92aWRpbmcgbW9yZSBvdXRwdXQgc3BhY2UpIGJlZm9yZSBlYWNoIGNhbGwuCisKKyAgICBUaGUgY29tcHJlc3NlZCBkYXRhIGZvcm1hdCB1c2VkIGJ5IGRlZmF1bHQgYnkgdGhlIGluLW1lbW9yeSBmdW5jdGlvbnMgaXMKKyAgdGhlIHpsaWIgZm9ybWF0LCB3aGljaCBpcyBhIHpsaWIgd3JhcHBlciBkb2N1bWVudGVkIGluIFJGQyAxOTUwLCB3cmFwcGVkCisgIGFyb3VuZCBhIGRlZmxhdGUgc3RyZWFtLCB3aGljaCBpcyBpdHNlbGYgZG9jdW1lbnRlZCBpbiBSRkMgMTk1MS4KKworICAgIFRoZSBsaWJyYXJ5IGFsc28gc3VwcG9ydHMgcmVhZGluZyBhbmQgd3JpdGluZyBmaWxlcyBpbiBnemlwICguZ3opIGZvcm1hdAorICB3aXRoIGFuIGludGVyZmFjZSBzaW1pbGFyIHRvIHRoYXQgb2Ygc3RkaW8gdXNpbmcgdGhlIGZ1bmN0aW9ucyB0aGF0IHN0YXJ0CisgIHdpdGggImd6Ii4gIFRoZSBnemlwIGZvcm1hdCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgemxpYiBmb3JtYXQuICBnemlwIGlzIGEKKyAgZ3ppcCB3cmFwcGVyLCBkb2N1bWVudGVkIGluIFJGQyAxOTUyLCB3cmFwcGVkIGFyb3VuZCBhIGRlZmxhdGUgc3RyZWFtLgorCisgICAgVGhpcyBsaWJyYXJ5IGNhbiBvcHRpb25hbGx5IHJlYWQgYW5kIHdyaXRlIGd6aXAgc3RyZWFtcyBpbiBtZW1vcnkgYXMgd2VsbC4KKworICAgIFRoZSB6bGliIGZvcm1hdCB3YXMgZGVzaWduZWQgdG8gYmUgY29tcGFjdCBhbmQgZmFzdCBmb3IgdXNlIGluIG1lbW9yeQorICBhbmQgb24gY29tbXVuaWNhdGlvbnMgY2hhbm5lbHMuICBUaGUgZ3ppcCBmb3JtYXQgd2FzIGRlc2lnbmVkIGZvciBzaW5nbGUtCisgIGZpbGUgY29tcHJlc3Npb24gb24gZmlsZSBzeXN0ZW1zLCBoYXMgYSBsYXJnZXIgaGVhZGVyIHRoYW4gemxpYiB0byBtYWludGFpbgorICBkaXJlY3RvcnkgaW5mb3JtYXRpb24sIGFuZCB1c2VzIGEgZGlmZmVyZW50LCBzbG93ZXIgY2hlY2sgbWV0aG9kIHRoYW4gemxpYi4KKworICAgIFRoZSBsaWJyYXJ5IGRvZXMgbm90IGluc3RhbGwgYW55IHNpZ25hbCBoYW5kbGVyLiAgVGhlIGRlY29kZXIgY2hlY2tzCisgIHRoZSBjb25zaXN0ZW5jeSBvZiB0aGUgY29tcHJlc3NlZCBkYXRhLCBzbyB0aGUgbGlicmFyeSBzaG91bGQgbmV2ZXIgY3Jhc2gKKyAgZXZlbiBpbiBjYXNlIG9mIGNvcnJ1cHRlZCBpbnB1dC4KKyovCisKK3R5cGVkZWYgdm9pZHBmICgqYWxsb2NfZnVuYykgT0YoKHZvaWRwZiBvcGFxdWUsIHVJbnQgaXRlbXMsIHVJbnQgc2l6ZSkpOwordHlwZWRlZiB2b2lkICAgKCpmcmVlX2Z1bmMpICBPRigodm9pZHBmIG9wYXF1ZSwgdm9pZHBmIGFkZHJlc3MpKTsKKworc3RydWN0IGludGVybmFsX3N0YXRlOworCit0eXBlZGVmIHN0cnVjdCB6X3N0cmVhbV9zIHsKKyAgICB6X2NvbnN0IEJ5dGVmICpuZXh0X2luOyAgICAgLyogbmV4dCBpbnB1dCBieXRlICovCisgICAgdUludCAgICAgYXZhaWxfaW47ICAvKiBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlIGF0IG5leHRfaW4gKi8KKyAgICB1TG9uZyAgICB0b3RhbF9pbjsgIC8qIHRvdGFsIG51bWJlciBvZiBpbnB1dCBieXRlcyByZWFkIHNvIGZhciAqLworCisgICAgQnl0ZWYgICAgKm5leHRfb3V0OyAvKiBuZXh0IG91dHB1dCBieXRlIHNob3VsZCBiZSBwdXQgdGhlcmUgKi8KKyAgICB1SW50ICAgICBhdmFpbF9vdXQ7IC8qIHJlbWFpbmluZyBmcmVlIHNwYWNlIGF0IG5leHRfb3V0ICovCisgICAgdUxvbmcgICAgdG90YWxfb3V0OyAvKiB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgb3V0cHV0IHNvIGZhciAqLworCisgICAgel9jb25zdCBjaGFyICptc2c7ICAvKiBsYXN0IGVycm9yIG1lc3NhZ2UsIE5VTEwgaWYgbm8gZXJyb3IgKi8KKyAgICBzdHJ1Y3QgaW50ZXJuYWxfc3RhdGUgRkFSICpzdGF0ZTsgLyogbm90IHZpc2libGUgYnkgYXBwbGljYXRpb25zICovCisKKyAgICBhbGxvY19mdW5jIHphbGxvYzsgIC8qIHVzZWQgdG8gYWxsb2NhdGUgdGhlIGludGVybmFsIHN0YXRlICovCisgICAgZnJlZV9mdW5jICB6ZnJlZTsgICAvKiB1c2VkIHRvIGZyZWUgdGhlIGludGVybmFsIHN0YXRlICovCisgICAgdm9pZHBmICAgICBvcGFxdWU7ICAvKiBwcml2YXRlIGRhdGEgb2JqZWN0IHBhc3NlZCB0byB6YWxsb2MgYW5kIHpmcmVlICovCisKKyAgICBpbnQgICAgIGRhdGFfdHlwZTsgIC8qIGJlc3QgZ3Vlc3MgYWJvdXQgdGhlIGRhdGEgdHlwZTogYmluYXJ5IG9yIHRleHQgKi8KKyAgICB1TG9uZyAgIGFkbGVyOyAgICAgIC8qIGFkbGVyMzIgdmFsdWUgb2YgdGhlIHVuY29tcHJlc3NlZCBkYXRhICovCisgICAgdUxvbmcgICByZXNlcnZlZDsgICAvKiByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSAqLworfSB6X3N0cmVhbTsKKwordHlwZWRlZiB6X3N0cmVhbSBGQVIgKnpfc3RyZWFtcDsKKworLyoKKyAgICAgZ3ppcCBoZWFkZXIgaW5mb3JtYXRpb24gcGFzc2VkIHRvIGFuZCBmcm9tIHpsaWIgcm91dGluZXMuICBTZWUgUkZDIDE5NTIKKyAgZm9yIG1vcmUgZGV0YWlscyBvbiB0aGUgbWVhbmluZ3Mgb2YgdGhlc2UgZmllbGRzLgorKi8KK3R5cGVkZWYgc3RydWN0IGd6X2hlYWRlcl9zIHsKKyAgICBpbnQgICAgIHRleHQ7ICAgICAgIC8qIHRydWUgaWYgY29tcHJlc3NlZCBkYXRhIGJlbGlldmVkIHRvIGJlIHRleHQgKi8KKyAgICB1TG9uZyAgIHRpbWU7ICAgICAgIC8qIG1vZGlmaWNhdGlvbiB0aW1lICovCisgICAgaW50ICAgICB4ZmxhZ3M7ICAgICAvKiBleHRyYSBmbGFncyAobm90IHVzZWQgd2hlbiB3cml0aW5nIGEgZ3ppcCBmaWxlKSAqLworICAgIGludCAgICAgb3M7ICAgICAgICAgLyogb3BlcmF0aW5nIHN5c3RlbSAqLworICAgIEJ5dGVmICAgKmV4dHJhOyAgICAgLyogcG9pbnRlciB0byBleHRyYSBmaWVsZCBvciBaX05VTEwgaWYgbm9uZSAqLworICAgIHVJbnQgICAgZXh0cmFfbGVuOyAgLyogZXh0cmEgZmllbGQgbGVuZ3RoICh2YWxpZCBpZiBleHRyYSAhPSBaX05VTEwpICovCisgICAgdUludCAgICBleHRyYV9tYXg7ICAvKiBzcGFjZSBhdCBleHRyYSAob25seSB3aGVuIHJlYWRpbmcgaGVhZGVyKSAqLworICAgIEJ5dGVmICAgKm5hbWU7ICAgICAgLyogcG9pbnRlciB0byB6ZXJvLXRlcm1pbmF0ZWQgZmlsZSBuYW1lIG9yIFpfTlVMTCAqLworICAgIHVJbnQgICAgbmFtZV9tYXg7ICAgLyogc3BhY2UgYXQgbmFtZSAob25seSB3aGVuIHJlYWRpbmcgaGVhZGVyKSAqLworICAgIEJ5dGVmICAgKmNvbW1lbnQ7ICAgLyogcG9pbnRlciB0byB6ZXJvLXRlcm1pbmF0ZWQgY29tbWVudCBvciBaX05VTEwgKi8KKyAgICB1SW50ICAgIGNvbW1fbWF4OyAgIC8qIHNwYWNlIGF0IGNvbW1lbnQgKG9ubHkgd2hlbiByZWFkaW5nIGhlYWRlcikgKi8KKyAgICBpbnQgICAgIGhjcmM7ICAgICAgIC8qIHRydWUgaWYgdGhlcmUgd2FzIG9yIHdpbGwgYmUgYSBoZWFkZXIgY3JjICovCisgICAgaW50ICAgICBkb25lOyAgICAgICAvKiB0cnVlIHdoZW4gZG9uZSByZWFkaW5nIGd6aXAgaGVhZGVyIChub3QgdXNlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlbiB3cml0aW5nIGEgZ3ppcCBmaWxlKSAqLworfSBnel9oZWFkZXI7CisKK3R5cGVkZWYgZ3pfaGVhZGVyIEZBUiAqZ3pfaGVhZGVycDsKKworLyoKKyAgICAgVGhlIGFwcGxpY2F0aW9uIG11c3QgdXBkYXRlIG5leHRfaW4gYW5kIGF2YWlsX2luIHdoZW4gYXZhaWxfaW4gaGFzIGRyb3BwZWQKKyAgIHRvIHplcm8uICBJdCBtdXN0IHVwZGF0ZSBuZXh0X291dCBhbmQgYXZhaWxfb3V0IHdoZW4gYXZhaWxfb3V0IGhhcyBkcm9wcGVkCisgICB0byB6ZXJvLiAgVGhlIGFwcGxpY2F0aW9uIG11c3QgaW5pdGlhbGl6ZSB6YWxsb2MsIHpmcmVlIGFuZCBvcGFxdWUgYmVmb3JlCisgICBjYWxsaW5nIHRoZSBpbml0IGZ1bmN0aW9uLiAgQWxsIG90aGVyIGZpZWxkcyBhcmUgc2V0IGJ5IHRoZSBjb21wcmVzc2lvbgorICAgbGlicmFyeSBhbmQgbXVzdCBub3QgYmUgdXBkYXRlZCBieSB0aGUgYXBwbGljYXRpb24uCisKKyAgICAgVGhlIG9wYXF1ZSB2YWx1ZSBwcm92aWRlZCBieSB0aGUgYXBwbGljYXRpb24gd2lsbCBiZSBwYXNzZWQgYXMgdGhlIGZpcnN0CisgICBwYXJhbWV0ZXIgZm9yIGNhbGxzIG9mIHphbGxvYyBhbmQgemZyZWUuICBUaGlzIGNhbiBiZSB1c2VmdWwgZm9yIGN1c3RvbQorICAgbWVtb3J5IG1hbmFnZW1lbnQuICBUaGUgY29tcHJlc3Npb24gbGlicmFyeSBhdHRhY2hlcyBubyBtZWFuaW5nIHRvIHRoZQorICAgb3BhcXVlIHZhbHVlLgorCisgICAgIHphbGxvYyBtdXN0IHJldHVybiBaX05VTEwgaWYgdGhlcmUgaXMgbm90IGVub3VnaCBtZW1vcnkgZm9yIHRoZSBvYmplY3QuCisgICBJZiB6bGliIGlzIHVzZWQgaW4gYSBtdWx0aS10aHJlYWRlZCBhcHBsaWNhdGlvbiwgemFsbG9jIGFuZCB6ZnJlZSBtdXN0IGJlCisgICB0aHJlYWQgc2FmZS4KKworICAgICBPbiAxNi1iaXQgc3lzdGVtcywgdGhlIGZ1bmN0aW9ucyB6YWxsb2MgYW5kIHpmcmVlIG11c3QgYmUgYWJsZSB0byBhbGxvY2F0ZQorICAgZXhhY3RseSA2NTUzNiBieXRlcywgYnV0IHdpbGwgbm90IGJlIHJlcXVpcmVkIHRvIGFsbG9jYXRlIG1vcmUgdGhhbiB0aGlzIGlmCisgICB0aGUgc3ltYm9sIE1BWFNFR182NEsgaXMgZGVmaW5lZCAoc2VlIHpjb25mLmgpLiAgV0FSTklORzogT24gTVNET1MsIHBvaW50ZXJzCisgICByZXR1cm5lZCBieSB6YWxsb2MgZm9yIG9iamVjdHMgb2YgZXhhY3RseSA2NTUzNiBieXRlcyAqbXVzdCogaGF2ZSB0aGVpcgorICAgb2Zmc2V0IG5vcm1hbGl6ZWQgdG8gemVyby4gIFRoZSBkZWZhdWx0IGFsbG9jYXRpb24gZnVuY3Rpb24gcHJvdmlkZWQgYnkgdGhpcworICAgbGlicmFyeSBlbnN1cmVzIHRoaXMgKHNlZSB6dXRpbC5jKS4gIFRvIHJlZHVjZSBtZW1vcnkgcmVxdWlyZW1lbnRzIGFuZCBhdm9pZAorICAgYW55IGFsbG9jYXRpb24gb2YgNjRLIG9iamVjdHMsIGF0IHRoZSBleHBlbnNlIG9mIGNvbXByZXNzaW9uIHJhdGlvLCBjb21waWxlCisgICB0aGUgbGlicmFyeSB3aXRoIC1ETUFYX1dCSVRTPTE0IChzZWUgemNvbmYuaCkuCisKKyAgICAgVGhlIGZpZWxkcyB0b3RhbF9pbiBhbmQgdG90YWxfb3V0IGNhbiBiZSB1c2VkIGZvciBzdGF0aXN0aWNzIG9yIHByb2dyZXNzCisgICByZXBvcnRzLiAgQWZ0ZXIgY29tcHJlc3Npb24sIHRvdGFsX2luIGhvbGRzIHRoZSB0b3RhbCBzaXplIG9mIHRoZQorICAgdW5jb21wcmVzc2VkIGRhdGEgYW5kIG1heSBiZSBzYXZlZCBmb3IgdXNlIGluIHRoZSBkZWNvbXByZXNzb3IgKHBhcnRpY3VsYXJseQorICAgaWYgdGhlIGRlY29tcHJlc3NvciB3YW50cyB0byBkZWNvbXByZXNzIGV2ZXJ5dGhpbmcgaW4gYSBzaW5nbGUgc3RlcCkuCisqLworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb25zdGFudHMgKi8KKworI2RlZmluZSBaX05PX0ZMVVNIICAgICAgMAorI2RlZmluZSBaX1BBUlRJQUxfRkxVU0ggMQorI2RlZmluZSBaX1NZTkNfRkxVU0ggICAgMgorI2RlZmluZSBaX0ZVTExfRkxVU0ggICAgMworI2RlZmluZSBaX0ZJTklTSCAgICAgICAgNAorI2RlZmluZSBaX0JMT0NLICAgICAgICAgNQorI2RlZmluZSBaX1RSRUVTICAgICAgICAgNgorLyogQWxsb3dlZCBmbHVzaCB2YWx1ZXM7IHNlZSBkZWZsYXRlKCkgYW5kIGluZmxhdGUoKSBiZWxvdyBmb3IgZGV0YWlscyAqLworCisjZGVmaW5lIFpfT0sgICAgICAgICAgICAwCisjZGVmaW5lIFpfU1RSRUFNX0VORCAgICAxCisjZGVmaW5lIFpfTkVFRF9ESUNUICAgICAyCisjZGVmaW5lIFpfRVJSTk8gICAgICAgICgtMSkKKyNkZWZpbmUgWl9TVFJFQU1fRVJST1IgKC0yKQorI2RlZmluZSBaX0RBVEFfRVJST1IgICAoLTMpCisjZGVmaW5lIFpfTUVNX0VSUk9SICAgICgtNCkKKyNkZWZpbmUgWl9CVUZfRVJST1IgICAgKC01KQorI2RlZmluZSBaX1ZFUlNJT05fRVJST1IgKC02KQorLyogUmV0dXJuIGNvZGVzIGZvciB0aGUgY29tcHJlc3Npb24vZGVjb21wcmVzc2lvbiBmdW5jdGlvbnMuIE5lZ2F0aXZlIHZhbHVlcworICogYXJlIGVycm9ycywgcG9zaXRpdmUgdmFsdWVzIGFyZSB1c2VkIGZvciBzcGVjaWFsIGJ1dCBub3JtYWwgZXZlbnRzLgorICovCisKKyNkZWZpbmUgWl9OT19DT01QUkVTU0lPTiAgICAgICAgIDAKKyNkZWZpbmUgWl9CRVNUX1NQRUVEICAgICAgICAgICAgIDEKKyNkZWZpbmUgWl9CRVNUX0NPTVBSRVNTSU9OICAgICAgIDkKKyNkZWZpbmUgWl9ERUZBVUxUX0NPTVBSRVNTSU9OICAoLTEpCisvKiBjb21wcmVzc2lvbiBsZXZlbHMgKi8KKworI2RlZmluZSBaX0ZJTFRFUkVEICAgICAgICAgICAgMQorI2RlZmluZSBaX0hVRkZNQU5fT05MWSAgICAgICAgMgorI2RlZmluZSBaX1JMRSAgICAgICAgICAgICAgICAgMworI2RlZmluZSBaX0ZJWEVEICAgICAgICAgICAgICAgNAorI2RlZmluZSBaX0RFRkFVTFRfU1RSQVRFR1kgICAgMAorLyogY29tcHJlc3Npb24gc3RyYXRlZ3k7IHNlZSBkZWZsYXRlSW5pdDIoKSBiZWxvdyBmb3IgZGV0YWlscyAqLworCisjZGVmaW5lIFpfQklOQVJZICAgMAorI2RlZmluZSBaX1RFWFQgICAgIDEKKyNkZWZpbmUgWl9BU0NJSSAgICBaX1RFWFQgICAvKiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIDEuMi4yIGFuZCBlYXJsaWVyICovCisjZGVmaW5lIFpfVU5LTk9XTiAgMgorLyogUG9zc2libGUgdmFsdWVzIG9mIHRoZSBkYXRhX3R5cGUgZmllbGQgKHRob3VnaCBzZWUgaW5mbGF0ZSgpKSAqLworCisjZGVmaW5lIFpfREVGTEFURUQgICA4CisvKiBUaGUgZGVmbGF0ZSBjb21wcmVzc2lvbiBtZXRob2QgKHRoZSBvbmx5IG9uZSBzdXBwb3J0ZWQgaW4gdGhpcyB2ZXJzaW9uKSAqLworCisjZGVmaW5lIFpfTlVMTCAgMCAgLyogZm9yIGluaXRpYWxpemluZyB6YWxsb2MsIHpmcmVlLCBvcGFxdWUgKi8KKworI2RlZmluZSB6bGliX3ZlcnNpb24gemxpYlZlcnNpb24oKQorLyogZm9yIGNvbXBhdGliaWxpdHkgd2l0aCB2ZXJzaW9ucyA8IDEuMC4yICovCisKKworICAgICAgICAgICAgICAgICAgICAgICAgLyogYmFzaWMgZnVuY3Rpb25zICovCisKK1pFWFRFUk4gY29uc3QgY2hhciAqIFpFWFBPUlQgemxpYlZlcnNpb24gT0YoKHZvaWQpKTsKKy8qIFRoZSBhcHBsaWNhdGlvbiBjYW4gY29tcGFyZSB6bGliVmVyc2lvbiBhbmQgWkxJQl9WRVJTSU9OIGZvciBjb25zaXN0ZW5jeS4KKyAgIElmIHRoZSBmaXJzdCBjaGFyYWN0ZXIgZGlmZmVycywgdGhlIGxpYnJhcnkgY29kZSBhY3R1YWxseSB1c2VkIGlzIG5vdAorICAgY29tcGF0aWJsZSB3aXRoIHRoZSB6bGliLmggaGVhZGVyIGZpbGUgdXNlZCBieSB0aGUgYXBwbGljYXRpb24uICBUaGlzIGNoZWNrCisgICBpcyBhdXRvbWF0aWNhbGx5IG1hZGUgYnkgZGVmbGF0ZUluaXQgYW5kIGluZmxhdGVJbml0LgorICovCisKKy8qCitaRVhURVJOIGludCBaRVhQT1JUIGRlZmxhdGVJbml0IE9GKCh6X3N0cmVhbXAgc3RybSwgaW50IGxldmVsKSk7CisKKyAgICAgSW5pdGlhbGl6ZXMgdGhlIGludGVybmFsIHN0cmVhbSBzdGF0ZSBmb3IgY29tcHJlc3Npb24uICBUaGUgZmllbGRzCisgICB6YWxsb2MsIHpmcmVlIGFuZCBvcGFxdWUgbXVzdCBiZSBpbml0aWFsaXplZCBiZWZvcmUgYnkgdGhlIGNhbGxlci4gIElmCisgICB6YWxsb2MgYW5kIHpmcmVlIGFyZSBzZXQgdG8gWl9OVUxMLCBkZWZsYXRlSW5pdCB1cGRhdGVzIHRoZW0gdG8gdXNlIGRlZmF1bHQKKyAgIGFsbG9jYXRpb24gZnVuY3Rpb25zLgorCisgICAgIFRoZSBjb21wcmVzc2lvbiBsZXZlbCBtdXN0IGJlIFpfREVGQVVMVF9DT01QUkVTU0lPTiwgb3IgYmV0d2VlbiAwIGFuZCA5OgorICAgMSBnaXZlcyBiZXN0IHNwZWVkLCA5IGdpdmVzIGJlc3QgY29tcHJlc3Npb24sIDAgZ2l2ZXMgbm8gY29tcHJlc3Npb24gYXQgYWxsCisgICAodGhlIGlucHV0IGRhdGEgaXMgc2ltcGx5IGNvcGllZCBhIGJsb2NrIGF0IGEgdGltZSkuICBaX0RFRkFVTFRfQ09NUFJFU1NJT04KKyAgIHJlcXVlc3RzIGEgZGVmYXVsdCBjb21wcm9taXNlIGJldHdlZW4gc3BlZWQgYW5kIGNvbXByZXNzaW9uIChjdXJyZW50bHkKKyAgIGVxdWl2YWxlbnQgdG8gbGV2ZWwgNikuCisKKyAgICAgZGVmbGF0ZUluaXQgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIFpfTUVNX0VSUk9SIGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoCisgICBtZW1vcnksIFpfU1RSRUFNX0VSUk9SIGlmIGxldmVsIGlzIG5vdCBhIHZhbGlkIGNvbXByZXNzaW9uIGxldmVsLCBvcgorICAgWl9WRVJTSU9OX0VSUk9SIGlmIHRoZSB6bGliIGxpYnJhcnkgdmVyc2lvbiAoemxpYl92ZXJzaW9uKSBpcyBpbmNvbXBhdGlibGUKKyAgIHdpdGggdGhlIHZlcnNpb24gYXNzdW1lZCBieSB0aGUgY2FsbGVyIChaTElCX1ZFUlNJT04pLiAgbXNnIGlzIHNldCB0byBudWxsCisgICBpZiB0aGVyZSBpcyBubyBlcnJvciBtZXNzYWdlLiAgZGVmbGF0ZUluaXQgZG9lcyBub3QgcGVyZm9ybSBhbnkgY29tcHJlc3Npb246CisgICB0aGlzIHdpbGwgYmUgZG9uZSBieSBkZWZsYXRlKCkuCisqLworCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgZGVmbGF0ZSBPRigoel9zdHJlYW1wIHN0cm0sIGludCBmbHVzaCkpOworLyoKKyAgICBkZWZsYXRlIGNvbXByZXNzZXMgYXMgbXVjaCBkYXRhIGFzIHBvc3NpYmxlLCBhbmQgc3RvcHMgd2hlbiB0aGUgaW5wdXQKKyAgYnVmZmVyIGJlY29tZXMgZW1wdHkgb3IgdGhlIG91dHB1dCBidWZmZXIgYmVjb21lcyBmdWxsLiAgSXQgbWF5IGludHJvZHVjZQorICBzb21lIG91dHB1dCBsYXRlbmN5IChyZWFkaW5nIGlucHV0IHdpdGhvdXQgcHJvZHVjaW5nIGFueSBvdXRwdXQpIGV4Y2VwdCB3aGVuCisgIGZvcmNlZCB0byBmbHVzaC4KKworICAgIFRoZSBkZXRhaWxlZCBzZW1hbnRpY3MgYXJlIGFzIGZvbGxvd3MuICBkZWZsYXRlIHBlcmZvcm1zIG9uZSBvciBib3RoIG9mIHRoZQorICBmb2xsb3dpbmcgYWN0aW9uczoKKworICAtIENvbXByZXNzIG1vcmUgaW5wdXQgc3RhcnRpbmcgYXQgbmV4dF9pbiBhbmQgdXBkYXRlIG5leHRfaW4gYW5kIGF2YWlsX2luCisgICAgYWNjb3JkaW5nbHkuICBJZiBub3QgYWxsIGlucHV0IGNhbiBiZSBwcm9jZXNzZWQgKGJlY2F1c2UgdGhlcmUgaXMgbm90CisgICAgZW5vdWdoIHJvb20gaW4gdGhlIG91dHB1dCBidWZmZXIpLCBuZXh0X2luIGFuZCBhdmFpbF9pbiBhcmUgdXBkYXRlZCBhbmQKKyAgICBwcm9jZXNzaW5nIHdpbGwgcmVzdW1lIGF0IHRoaXMgcG9pbnQgZm9yIHRoZSBuZXh0IGNhbGwgb2YgZGVmbGF0ZSgpLgorCisgIC0gUHJvdmlkZSBtb3JlIG91dHB1dCBzdGFydGluZyBhdCBuZXh0X291dCBhbmQgdXBkYXRlIG5leHRfb3V0IGFuZCBhdmFpbF9vdXQKKyAgICBhY2NvcmRpbmdseS4gIFRoaXMgYWN0aW9uIGlzIGZvcmNlZCBpZiB0aGUgcGFyYW1ldGVyIGZsdXNoIGlzIG5vbiB6ZXJvLgorICAgIEZvcmNpbmcgZmx1c2ggZnJlcXVlbnRseSBkZWdyYWRlcyB0aGUgY29tcHJlc3Npb24gcmF0aW8sIHNvIHRoaXMgcGFyYW1ldGVyCisgICAgc2hvdWxkIGJlIHNldCBvbmx5IHdoZW4gbmVjZXNzYXJ5IChpbiBpbnRlcmFjdGl2ZSBhcHBsaWNhdGlvbnMpLiAgU29tZQorICAgIG91dHB1dCBtYXkgYmUgcHJvdmlkZWQgZXZlbiBpZiBmbHVzaCBpcyBub3Qgc2V0LgorCisgICAgQmVmb3JlIHRoZSBjYWxsIG9mIGRlZmxhdGUoKSwgdGhlIGFwcGxpY2F0aW9uIHNob3VsZCBlbnN1cmUgdGhhdCBhdCBsZWFzdAorICBvbmUgb2YgdGhlIGFjdGlvbnMgaXMgcG9zc2libGUsIGJ5IHByb3ZpZGluZyBtb3JlIGlucHV0IGFuZC9vciBjb25zdW1pbmcgbW9yZQorICBvdXRwdXQsIGFuZCB1cGRhdGluZyBhdmFpbF9pbiBvciBhdmFpbF9vdXQgYWNjb3JkaW5nbHk7IGF2YWlsX291dCBzaG91bGQKKyAgbmV2ZXIgYmUgemVybyBiZWZvcmUgdGhlIGNhbGwuICBUaGUgYXBwbGljYXRpb24gY2FuIGNvbnN1bWUgdGhlIGNvbXByZXNzZWQKKyAgb3V0cHV0IHdoZW4gaXQgd2FudHMsIGZvciBleGFtcGxlIHdoZW4gdGhlIG91dHB1dCBidWZmZXIgaXMgZnVsbCAoYXZhaWxfb3V0CisgID09IDApLCBvciBhZnRlciBlYWNoIGNhbGwgb2YgZGVmbGF0ZSgpLiAgSWYgZGVmbGF0ZSByZXR1cm5zIFpfT0sgYW5kIHdpdGgKKyAgemVybyBhdmFpbF9vdXQsIGl0IG11c3QgYmUgY2FsbGVkIGFnYWluIGFmdGVyIG1ha2luZyByb29tIGluIHRoZSBvdXRwdXQKKyAgYnVmZmVyIGJlY2F1c2UgdGhlcmUgbWlnaHQgYmUgbW9yZSBvdXRwdXQgcGVuZGluZy4KKworICAgIE5vcm1hbGx5IHRoZSBwYXJhbWV0ZXIgZmx1c2ggaXMgc2V0IHRvIFpfTk9fRkxVU0gsIHdoaWNoIGFsbG93cyBkZWZsYXRlIHRvCisgIGRlY2lkZSBob3cgbXVjaCBkYXRhIHRvIGFjY3VtdWxhdGUgYmVmb3JlIHByb2R1Y2luZyBvdXRwdXQsIGluIG9yZGVyIHRvCisgIG1heGltaXplIGNvbXByZXNzaW9uLgorCisgICAgSWYgdGhlIHBhcmFtZXRlciBmbHVzaCBpcyBzZXQgdG8gWl9TWU5DX0ZMVVNILCBhbGwgcGVuZGluZyBvdXRwdXQgaXMKKyAgZmx1c2hlZCB0byB0aGUgb3V0cHV0IGJ1ZmZlciBhbmQgdGhlIG91dHB1dCBpcyBhbGlnbmVkIG9uIGEgYnl0ZSBib3VuZGFyeSwgc28KKyAgdGhhdCB0aGUgZGVjb21wcmVzc29yIGNhbiBnZXQgYWxsIGlucHV0IGRhdGEgYXZhaWxhYmxlIHNvIGZhci4gIChJbgorICBwYXJ0aWN1bGFyIGF2YWlsX2luIGlzIHplcm8gYWZ0ZXIgdGhlIGNhbGwgaWYgZW5vdWdoIG91dHB1dCBzcGFjZSBoYXMgYmVlbgorICBwcm92aWRlZCBiZWZvcmUgdGhlIGNhbGwuKSBGbHVzaGluZyBtYXkgZGVncmFkZSBjb21wcmVzc2lvbiBmb3Igc29tZQorICBjb21wcmVzc2lvbiBhbGdvcml0aG1zIGFuZCBzbyBpdCBzaG91bGQgYmUgdXNlZCBvbmx5IHdoZW4gbmVjZXNzYXJ5LiAgVGhpcworICBjb21wbGV0ZXMgdGhlIGN1cnJlbnQgZGVmbGF0ZSBibG9jayBhbmQgZm9sbG93cyBpdCB3aXRoIGFuIGVtcHR5IHN0b3JlZCBibG9jaworICB0aGF0IGlzIHRocmVlIGJpdHMgcGx1cyBmaWxsZXIgYml0cyB0byB0aGUgbmV4dCBieXRlLCBmb2xsb3dlZCBieSBmb3VyIGJ5dGVzCisgICgwMCAwMCBmZiBmZikuCisKKyAgICBJZiBmbHVzaCBpcyBzZXQgdG8gWl9QQVJUSUFMX0ZMVVNILCBhbGwgcGVuZGluZyBvdXRwdXQgaXMgZmx1c2hlZCB0byB0aGUKKyAgb3V0cHV0IGJ1ZmZlciwgYnV0IHRoZSBvdXRwdXQgaXMgbm90IGFsaWduZWQgdG8gYSBieXRlIGJvdW5kYXJ5LiAgQWxsIG9mIHRoZQorICBpbnB1dCBkYXRhIHNvIGZhciB3aWxsIGJlIGF2YWlsYWJsZSB0byB0aGUgZGVjb21wcmVzc29yLCBhcyBmb3IgWl9TWU5DX0ZMVVNILgorICBUaGlzIGNvbXBsZXRlcyB0aGUgY3VycmVudCBkZWZsYXRlIGJsb2NrIGFuZCBmb2xsb3dzIGl0IHdpdGggYW4gZW1wdHkgZml4ZWQKKyAgY29kZXMgYmxvY2sgdGhhdCBpcyAxMCBiaXRzIGxvbmcuICBUaGlzIGFzc3VyZXMgdGhhdCBlbm91Z2ggYnl0ZXMgYXJlIG91dHB1dAorICBpbiBvcmRlciBmb3IgdGhlIGRlY29tcHJlc3NvciB0byBmaW5pc2ggdGhlIGJsb2NrIGJlZm9yZSB0aGUgZW1wdHkgZml4ZWQgY29kZQorICBibG9jay4KKworICAgIElmIGZsdXNoIGlzIHNldCB0byBaX0JMT0NLLCBhIGRlZmxhdGUgYmxvY2sgaXMgY29tcGxldGVkIGFuZCBlbWl0dGVkLCBhcworICBmb3IgWl9TWU5DX0ZMVVNILCBidXQgdGhlIG91dHB1dCBpcyBub3QgYWxpZ25lZCBvbiBhIGJ5dGUgYm91bmRhcnksIGFuZCB1cCB0bworICBzZXZlbiBiaXRzIG9mIHRoZSBjdXJyZW50IGJsb2NrIGFyZSBoZWxkIHRvIGJlIHdyaXR0ZW4gYXMgdGhlIG5leHQgYnl0ZSBhZnRlcgorICB0aGUgbmV4dCBkZWZsYXRlIGJsb2NrIGlzIGNvbXBsZXRlZC4gIEluIHRoaXMgY2FzZSwgdGhlIGRlY29tcHJlc3NvciBtYXkgbm90CisgIGJlIHByb3ZpZGVkIGVub3VnaCBiaXRzIGF0IHRoaXMgcG9pbnQgaW4gb3JkZXIgdG8gY29tcGxldGUgZGVjb21wcmVzc2lvbiBvZgorICB0aGUgZGF0YSBwcm92aWRlZCBzbyBmYXIgdG8gdGhlIGNvbXByZXNzb3IuICBJdCBtYXkgbmVlZCB0byB3YWl0IGZvciB0aGUgbmV4dAorICBibG9jayB0byBiZSBlbWl0dGVkLiAgVGhpcyBpcyBmb3IgYWR2YW5jZWQgYXBwbGljYXRpb25zIHRoYXQgbmVlZCB0byBjb250cm9sCisgIHRoZSBlbWlzc2lvbiBvZiBkZWZsYXRlIGJsb2Nrcy4KKworICAgIElmIGZsdXNoIGlzIHNldCB0byBaX0ZVTExfRkxVU0gsIGFsbCBvdXRwdXQgaXMgZmx1c2hlZCBhcyB3aXRoCisgIFpfU1lOQ19GTFVTSCwgYW5kIHRoZSBjb21wcmVzc2lvbiBzdGF0ZSBpcyByZXNldCBzbyB0aGF0IGRlY29tcHJlc3Npb24gY2FuCisgIHJlc3RhcnQgZnJvbSB0aGlzIHBvaW50IGlmIHByZXZpb3VzIGNvbXByZXNzZWQgZGF0YSBoYXMgYmVlbiBkYW1hZ2VkIG9yIGlmCisgIHJhbmRvbSBhY2Nlc3MgaXMgZGVzaXJlZC4gIFVzaW5nIFpfRlVMTF9GTFVTSCB0b28gb2Z0ZW4gY2FuIHNlcmlvdXNseSBkZWdyYWRlCisgIGNvbXByZXNzaW9uLgorCisgICAgSWYgZGVmbGF0ZSByZXR1cm5zIHdpdGggYXZhaWxfb3V0ID09IDAsIHRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgYWdhaW4KKyAgd2l0aCB0aGUgc2FtZSB2YWx1ZSBvZiB0aGUgZmx1c2ggcGFyYW1ldGVyIGFuZCBtb3JlIG91dHB1dCBzcGFjZSAodXBkYXRlZAorICBhdmFpbF9vdXQpLCB1bnRpbCB0aGUgZmx1c2ggaXMgY29tcGxldGUgKGRlZmxhdGUgcmV0dXJucyB3aXRoIG5vbi16ZXJvCisgIGF2YWlsX291dCkuICBJbiB0aGUgY2FzZSBvZiBhIFpfRlVMTF9GTFVTSCBvciBaX1NZTkNfRkxVU0gsIG1ha2Ugc3VyZSB0aGF0CisgIGF2YWlsX291dCBpcyBncmVhdGVyIHRoYW4gc2l4IHRvIGF2b2lkIHJlcGVhdGVkIGZsdXNoIG1hcmtlcnMgZHVlIHRvCisgIGF2YWlsX291dCA9PSAwIG9uIHJldHVybi4KKworICAgIElmIHRoZSBwYXJhbWV0ZXIgZmx1c2ggaXMgc2V0IHRvIFpfRklOSVNILCBwZW5kaW5nIGlucHV0IGlzIHByb2Nlc3NlZCwKKyAgcGVuZGluZyBvdXRwdXQgaXMgZmx1c2hlZCBhbmQgZGVmbGF0ZSByZXR1cm5zIHdpdGggWl9TVFJFQU1fRU5EIGlmIHRoZXJlIHdhcworICBlbm91Z2ggb3V0cHV0IHNwYWNlOyBpZiBkZWZsYXRlIHJldHVybnMgd2l0aCBaX09LLCB0aGlzIGZ1bmN0aW9uIG11c3QgYmUKKyAgY2FsbGVkIGFnYWluIHdpdGggWl9GSU5JU0ggYW5kIG1vcmUgb3V0cHV0IHNwYWNlICh1cGRhdGVkIGF2YWlsX291dCkgYnV0IG5vCisgIG1vcmUgaW5wdXQgZGF0YSwgdW50aWwgaXQgcmV0dXJucyB3aXRoIFpfU1RSRUFNX0VORCBvciBhbiBlcnJvci4gIEFmdGVyCisgIGRlZmxhdGUgaGFzIHJldHVybmVkIFpfU1RSRUFNX0VORCwgdGhlIG9ubHkgcG9zc2libGUgb3BlcmF0aW9ucyBvbiB0aGUgc3RyZWFtCisgIGFyZSBkZWZsYXRlUmVzZXQgb3IgZGVmbGF0ZUVuZC4KKworICAgIFpfRklOSVNIIGNhbiBiZSB1c2VkIGltbWVkaWF0ZWx5IGFmdGVyIGRlZmxhdGVJbml0IGlmIGFsbCB0aGUgY29tcHJlc3Npb24KKyAgaXMgdG8gYmUgZG9uZSBpbiBhIHNpbmdsZSBzdGVwLiAgSW4gdGhpcyBjYXNlLCBhdmFpbF9vdXQgbXVzdCBiZSBhdCBsZWFzdCB0aGUKKyAgdmFsdWUgcmV0dXJuZWQgYnkgZGVmbGF0ZUJvdW5kIChzZWUgYmVsb3cpLiAgVGhlbiBkZWZsYXRlIGlzIGd1YXJhbnRlZWQgdG8KKyAgcmV0dXJuIFpfU1RSRUFNX0VORC4gIElmIG5vdCBlbm91Z2ggb3V0cHV0IHNwYWNlIGlzIHByb3ZpZGVkLCBkZWZsYXRlIHdpbGwKKyAgbm90IHJldHVybiBaX1NUUkVBTV9FTkQsIGFuZCBpdCBtdXN0IGJlIGNhbGxlZCBhZ2FpbiBhcyBkZXNjcmliZWQgYWJvdmUuCisKKyAgICBkZWZsYXRlKCkgc2V0cyBzdHJtLT5hZGxlciB0byB0aGUgYWRsZXIzMiBjaGVja3N1bSBvZiBhbGwgaW5wdXQgcmVhZAorICBzbyBmYXIgKHRoYXQgaXMsIHRvdGFsX2luIGJ5dGVzKS4KKworICAgIGRlZmxhdGUoKSBtYXkgdXBkYXRlIHN0cm0tPmRhdGFfdHlwZSBpZiBpdCBjYW4gbWFrZSBhIGdvb2QgZ3Vlc3MgYWJvdXQKKyAgdGhlIGlucHV0IGRhdGEgdHlwZSAoWl9CSU5BUlkgb3IgWl9URVhUKS4gIEluIGRvdWJ0LCB0aGUgZGF0YSBpcyBjb25zaWRlcmVkCisgIGJpbmFyeS4gIFRoaXMgZmllbGQgaXMgb25seSBmb3IgaW5mb3JtYXRpb24gcHVycG9zZXMgYW5kIGRvZXMgbm90IGFmZmVjdCB0aGUKKyAgY29tcHJlc3Npb24gYWxnb3JpdGhtIGluIGFueSBtYW5uZXIuCisKKyAgICBkZWZsYXRlKCkgcmV0dXJucyBaX09LIGlmIHNvbWUgcHJvZ3Jlc3MgaGFzIGJlZW4gbWFkZSAobW9yZSBpbnB1dAorICBwcm9jZXNzZWQgb3IgbW9yZSBvdXRwdXQgcHJvZHVjZWQpLCBaX1NUUkVBTV9FTkQgaWYgYWxsIGlucHV0IGhhcyBiZWVuCisgIGNvbnN1bWVkIGFuZCBhbGwgb3V0cHV0IGhhcyBiZWVuIHByb2R1Y2VkIChvbmx5IHdoZW4gZmx1c2ggaXMgc2V0IHRvCisgIFpfRklOSVNIKSwgWl9TVFJFQU1fRVJST1IgaWYgdGhlIHN0cmVhbSBzdGF0ZSB3YXMgaW5jb25zaXN0ZW50IChmb3IgZXhhbXBsZQorICBpZiBuZXh0X2luIG9yIG5leHRfb3V0IHdhcyBaX05VTEwpLCBaX0JVRl9FUlJPUiBpZiBubyBwcm9ncmVzcyBpcyBwb3NzaWJsZQorICAoZm9yIGV4YW1wbGUgYXZhaWxfaW4gb3IgYXZhaWxfb3V0IHdhcyB6ZXJvKS4gIE5vdGUgdGhhdCBaX0JVRl9FUlJPUiBpcyBub3QKKyAgZmF0YWwsIGFuZCBkZWZsYXRlKCkgY2FuIGJlIGNhbGxlZCBhZ2FpbiB3aXRoIG1vcmUgaW5wdXQgYW5kIG1vcmUgb3V0cHV0CisgIHNwYWNlIHRvIGNvbnRpbnVlIGNvbXByZXNzaW5nLgorKi8KKworCitaRVhURVJOIGludCBaRVhQT1JUIGRlZmxhdGVFbmQgT0YoKHpfc3RyZWFtcCBzdHJtKSk7CisvKgorICAgICBBbGwgZHluYW1pY2FsbHkgYWxsb2NhdGVkIGRhdGEgc3RydWN0dXJlcyBmb3IgdGhpcyBzdHJlYW0gYXJlIGZyZWVkLgorICAgVGhpcyBmdW5jdGlvbiBkaXNjYXJkcyBhbnkgdW5wcm9jZXNzZWQgaW5wdXQgYW5kIGRvZXMgbm90IGZsdXNoIGFueSBwZW5kaW5nCisgICBvdXRwdXQuCisKKyAgICAgZGVmbGF0ZUVuZCByZXR1cm5zIFpfT0sgaWYgc3VjY2VzcywgWl9TVFJFQU1fRVJST1IgaWYgdGhlCisgICBzdHJlYW0gc3RhdGUgd2FzIGluY29uc2lzdGVudCwgWl9EQVRBX0VSUk9SIGlmIHRoZSBzdHJlYW0gd2FzIGZyZWVkCisgICBwcmVtYXR1cmVseSAoc29tZSBpbnB1dCBvciBvdXRwdXQgd2FzIGRpc2NhcmRlZCkuICBJbiB0aGUgZXJyb3IgY2FzZSwgbXNnCisgICBtYXkgYmUgc2V0IGJ1dCB0aGVuIHBvaW50cyB0byBhIHN0YXRpYyBzdHJpbmcgKHdoaWNoIG11c3Qgbm90IGJlCisgICBkZWFsbG9jYXRlZCkuCisqLworCisKKy8qCitaRVhURVJOIGludCBaRVhQT1JUIGluZmxhdGVJbml0IE9GKCh6X3N0cmVhbXAgc3RybSkpOworCisgICAgIEluaXRpYWxpemVzIHRoZSBpbnRlcm5hbCBzdHJlYW0gc3RhdGUgZm9yIGRlY29tcHJlc3Npb24uICBUaGUgZmllbGRzCisgICBuZXh0X2luLCBhdmFpbF9pbiwgemFsbG9jLCB6ZnJlZSBhbmQgb3BhcXVlIG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIGJ5CisgICB0aGUgY2FsbGVyLiAgSWYgbmV4dF9pbiBpcyBub3QgWl9OVUxMIGFuZCBhdmFpbF9pbiBpcyBsYXJnZSBlbm91Z2ggKHRoZQorICAgZXhhY3QgdmFsdWUgZGVwZW5kcyBvbiB0aGUgY29tcHJlc3Npb24gbWV0aG9kKSwgaW5mbGF0ZUluaXQgZGV0ZXJtaW5lcyB0aGUKKyAgIGNvbXByZXNzaW9uIG1ldGhvZCBmcm9tIHRoZSB6bGliIGhlYWRlciBhbmQgYWxsb2NhdGVzIGFsbCBkYXRhIHN0cnVjdHVyZXMKKyAgIGFjY29yZGluZ2x5OyBvdGhlcndpc2UgdGhlIGFsbG9jYXRpb24gd2lsbCBiZSBkZWZlcnJlZCB0byB0aGUgZmlyc3QgY2FsbCBvZgorICAgaW5mbGF0ZS4gIElmIHphbGxvYyBhbmQgemZyZWUgYXJlIHNldCB0byBaX05VTEwsIGluZmxhdGVJbml0IHVwZGF0ZXMgdGhlbSB0bworICAgdXNlIGRlZmF1bHQgYWxsb2NhdGlvbiBmdW5jdGlvbnMuCisKKyAgICAgaW5mbGF0ZUluaXQgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIFpfTUVNX0VSUk9SIGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoCisgICBtZW1vcnksIFpfVkVSU0lPTl9FUlJPUiBpZiB0aGUgemxpYiBsaWJyYXJ5IHZlcnNpb24gaXMgaW5jb21wYXRpYmxlIHdpdGggdGhlCisgICB2ZXJzaW9uIGFzc3VtZWQgYnkgdGhlIGNhbGxlciwgb3IgWl9TVFJFQU1fRVJST1IgaWYgdGhlIHBhcmFtZXRlcnMgYXJlCisgICBpbnZhbGlkLCBzdWNoIGFzIGEgbnVsbCBwb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUuICBtc2cgaXMgc2V0IHRvIG51bGwgaWYKKyAgIHRoZXJlIGlzIG5vIGVycm9yIG1lc3NhZ2UuICBpbmZsYXRlSW5pdCBkb2VzIG5vdCBwZXJmb3JtIGFueSBkZWNvbXByZXNzaW9uCisgICBhcGFydCBmcm9tIHBvc3NpYmx5IHJlYWRpbmcgdGhlIHpsaWIgaGVhZGVyIGlmIHByZXNlbnQ6IGFjdHVhbCBkZWNvbXByZXNzaW9uCisgICB3aWxsIGJlIGRvbmUgYnkgaW5mbGF0ZSgpLiAgKFNvIG5leHRfaW4gYW5kIGF2YWlsX2luIG1heSBiZSBtb2RpZmllZCwgYnV0CisgICBuZXh0X291dCBhbmQgYXZhaWxfb3V0IGFyZSB1bnVzZWQgYW5kIHVuY2hhbmdlZC4pIFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uCisgICBvZiBpbmZsYXRlSW5pdCgpIGRvZXMgbm90IHByb2Nlc3MgYW55IGhlYWRlciBpbmZvcm1hdGlvbiAtLSB0aGF0IGlzIGRlZmVycmVkCisgICB1bnRpbCBpbmZsYXRlKCkgaXMgY2FsbGVkLgorKi8KKworCitaRVhURVJOIGludCBaRVhQT1JUIGluZmxhdGUgT0YoKHpfc3RyZWFtcCBzdHJtLCBpbnQgZmx1c2gpKTsKKy8qCisgICAgaW5mbGF0ZSBkZWNvbXByZXNzZXMgYXMgbXVjaCBkYXRhIGFzIHBvc3NpYmxlLCBhbmQgc3RvcHMgd2hlbiB0aGUgaW5wdXQKKyAgYnVmZmVyIGJlY29tZXMgZW1wdHkgb3IgdGhlIG91dHB1dCBidWZmZXIgYmVjb21lcyBmdWxsLiAgSXQgbWF5IGludHJvZHVjZQorICBzb21lIG91dHB1dCBsYXRlbmN5IChyZWFkaW5nIGlucHV0IHdpdGhvdXQgcHJvZHVjaW5nIGFueSBvdXRwdXQpIGV4Y2VwdCB3aGVuCisgIGZvcmNlZCB0byBmbHVzaC4KKworICBUaGUgZGV0YWlsZWQgc2VtYW50aWNzIGFyZSBhcyBmb2xsb3dzLiAgaW5mbGF0ZSBwZXJmb3JtcyBvbmUgb3IgYm90aCBvZiB0aGUKKyAgZm9sbG93aW5nIGFjdGlvbnM6CisKKyAgLSBEZWNvbXByZXNzIG1vcmUgaW5wdXQgc3RhcnRpbmcgYXQgbmV4dF9pbiBhbmQgdXBkYXRlIG5leHRfaW4gYW5kIGF2YWlsX2luCisgICAgYWNjb3JkaW5nbHkuICBJZiBub3QgYWxsIGlucHV0IGNhbiBiZSBwcm9jZXNzZWQgKGJlY2F1c2UgdGhlcmUgaXMgbm90CisgICAgZW5vdWdoIHJvb20gaW4gdGhlIG91dHB1dCBidWZmZXIpLCBuZXh0X2luIGlzIHVwZGF0ZWQgYW5kIHByb2Nlc3Npbmcgd2lsbAorICAgIHJlc3VtZSBhdCB0aGlzIHBvaW50IGZvciB0aGUgbmV4dCBjYWxsIG9mIGluZmxhdGUoKS4KKworICAtIFByb3ZpZGUgbW9yZSBvdXRwdXQgc3RhcnRpbmcgYXQgbmV4dF9vdXQgYW5kIHVwZGF0ZSBuZXh0X291dCBhbmQgYXZhaWxfb3V0CisgICAgYWNjb3JkaW5nbHkuICBpbmZsYXRlKCkgcHJvdmlkZXMgYXMgbXVjaCBvdXRwdXQgYXMgcG9zc2libGUsIHVudGlsIHRoZXJlIGlzCisgICAgbm8gbW9yZSBpbnB1dCBkYXRhIG9yIG5vIG1vcmUgc3BhY2UgaW4gdGhlIG91dHB1dCBidWZmZXIgKHNlZSBiZWxvdyBhYm91dAorICAgIHRoZSBmbHVzaCBwYXJhbWV0ZXIpLgorCisgICAgQmVmb3JlIHRoZSBjYWxsIG9mIGluZmxhdGUoKSwgdGhlIGFwcGxpY2F0aW9uIHNob3VsZCBlbnN1cmUgdGhhdCBhdCBsZWFzdAorICBvbmUgb2YgdGhlIGFjdGlvbnMgaXMgcG9zc2libGUsIGJ5IHByb3ZpZGluZyBtb3JlIGlucHV0IGFuZC9vciBjb25zdW1pbmcgbW9yZQorICBvdXRwdXQsIGFuZCB1cGRhdGluZyB0aGUgbmV4dF8qIGFuZCBhdmFpbF8qIHZhbHVlcyBhY2NvcmRpbmdseS4gIFRoZQorICBhcHBsaWNhdGlvbiBjYW4gY29uc3VtZSB0aGUgdW5jb21wcmVzc2VkIG91dHB1dCB3aGVuIGl0IHdhbnRzLCBmb3IgZXhhbXBsZQorICB3aGVuIHRoZSBvdXRwdXQgYnVmZmVyIGlzIGZ1bGwgKGF2YWlsX291dCA9PSAwKSwgb3IgYWZ0ZXIgZWFjaCBjYWxsIG9mCisgIGluZmxhdGUoKS4gIElmIGluZmxhdGUgcmV0dXJucyBaX09LIGFuZCB3aXRoIHplcm8gYXZhaWxfb3V0LCBpdCBtdXN0IGJlCisgIGNhbGxlZCBhZ2FpbiBhZnRlciBtYWtpbmcgcm9vbSBpbiB0aGUgb3V0cHV0IGJ1ZmZlciBiZWNhdXNlIHRoZXJlIG1pZ2h0IGJlCisgIG1vcmUgb3V0cHV0IHBlbmRpbmcuCisKKyAgICBUaGUgZmx1c2ggcGFyYW1ldGVyIG9mIGluZmxhdGUoKSBjYW4gYmUgWl9OT19GTFVTSCwgWl9TWU5DX0ZMVVNILCBaX0ZJTklTSCwKKyAgWl9CTE9DSywgb3IgWl9UUkVFUy4gIFpfU1lOQ19GTFVTSCByZXF1ZXN0cyB0aGF0IGluZmxhdGUoKSBmbHVzaCBhcyBtdWNoCisgIG91dHB1dCBhcyBwb3NzaWJsZSB0byB0aGUgb3V0cHV0IGJ1ZmZlci4gIFpfQkxPQ0sgcmVxdWVzdHMgdGhhdCBpbmZsYXRlKCkKKyAgc3RvcCBpZiBhbmQgd2hlbiBpdCBnZXRzIHRvIHRoZSBuZXh0IGRlZmxhdGUgYmxvY2sgYm91bmRhcnkuICBXaGVuIGRlY29kaW5nCisgIHRoZSB6bGliIG9yIGd6aXAgZm9ybWF0LCB0aGlzIHdpbGwgY2F1c2UgaW5mbGF0ZSgpIHRvIHJldHVybiBpbW1lZGlhdGVseQorICBhZnRlciB0aGUgaGVhZGVyIGFuZCBiZWZvcmUgdGhlIGZpcnN0IGJsb2NrLiAgV2hlbiBkb2luZyBhIHJhdyBpbmZsYXRlLAorICBpbmZsYXRlKCkgd2lsbCBnbyBhaGVhZCBhbmQgcHJvY2VzcyB0aGUgZmlyc3QgYmxvY2ssIGFuZCB3aWxsIHJldHVybiB3aGVuIGl0CisgIGdldHMgdG8gdGhlIGVuZCBvZiB0aGF0IGJsb2NrLCBvciB3aGVuIGl0IHJ1bnMgb3V0IG9mIGRhdGEuCisKKyAgICBUaGUgWl9CTE9DSyBvcHRpb24gYXNzaXN0cyBpbiBhcHBlbmRpbmcgdG8gb3IgY29tYmluaW5nIGRlZmxhdGUgc3RyZWFtcy4KKyAgQWxzbyB0byBhc3Npc3QgaW4gdGhpcywgb24gcmV0dXJuIGluZmxhdGUoKSB3aWxsIHNldCBzdHJtLT5kYXRhX3R5cGUgdG8gdGhlCisgIG51bWJlciBvZiB1bnVzZWQgYml0cyBpbiB0aGUgbGFzdCBieXRlIHRha2VuIGZyb20gc3RybS0+bmV4dF9pbiwgcGx1cyA2NCBpZgorICBpbmZsYXRlKCkgaXMgY3VycmVudGx5IGRlY29kaW5nIHRoZSBsYXN0IGJsb2NrIGluIHRoZSBkZWZsYXRlIHN0cmVhbSwgcGx1cworICAxMjggaWYgaW5mbGF0ZSgpIHJldHVybmVkIGltbWVkaWF0ZWx5IGFmdGVyIGRlY29kaW5nIGFuIGVuZC1vZi1ibG9jayBjb2RlIG9yCisgIGRlY29kaW5nIHRoZSBjb21wbGV0ZSBoZWFkZXIgdXAgdG8ganVzdCBiZWZvcmUgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIGRlZmxhdGUKKyAgc3RyZWFtLiAgVGhlIGVuZC1vZi1ibG9jayB3aWxsIG5vdCBiZSBpbmRpY2F0ZWQgdW50aWwgYWxsIG9mIHRoZSB1bmNvbXByZXNzZWQKKyAgZGF0YSBmcm9tIHRoYXQgYmxvY2sgaGFzIGJlZW4gd3JpdHRlbiB0byBzdHJtLT5uZXh0X291dC4gIFRoZSBudW1iZXIgb2YKKyAgdW51c2VkIGJpdHMgbWF5IGluIGdlbmVyYWwgYmUgZ3JlYXRlciB0aGFuIHNldmVuLCBleGNlcHQgd2hlbiBiaXQgNyBvZgorICBkYXRhX3R5cGUgaXMgc2V0LCBpbiB3aGljaCBjYXNlIHRoZSBudW1iZXIgb2YgdW51c2VkIGJpdHMgd2lsbCBiZSBsZXNzIHRoYW4KKyAgZWlnaHQuICBkYXRhX3R5cGUgaXMgc2V0IGFzIG5vdGVkIGhlcmUgZXZlcnkgdGltZSBpbmZsYXRlKCkgcmV0dXJucyBmb3IgYWxsCisgIGZsdXNoIG9wdGlvbnMsIGFuZCBzbyBjYW4gYmUgdXNlZCB0byBkZXRlcm1pbmUgdGhlIGFtb3VudCBvZiBjdXJyZW50bHkKKyAgY29uc3VtZWQgaW5wdXQgaW4gYml0cy4KKworICAgIFRoZSBaX1RSRUVTIG9wdGlvbiBiZWhhdmVzIGFzIFpfQkxPQ0sgZG9lcywgYnV0IGl0IGFsc28gcmV0dXJucyB3aGVuIHRoZQorICBlbmQgb2YgZWFjaCBkZWZsYXRlIGJsb2NrIGhlYWRlciBpcyByZWFjaGVkLCBiZWZvcmUgYW55IGFjdHVhbCBkYXRhIGluIHRoYXQKKyAgYmxvY2sgaXMgZGVjb2RlZC4gIFRoaXMgYWxsb3dzIHRoZSBjYWxsZXIgdG8gZGV0ZXJtaW5lIHRoZSBsZW5ndGggb2YgdGhlCisgIGRlZmxhdGUgYmxvY2sgaGVhZGVyIGZvciBsYXRlciB1c2UgaW4gcmFuZG9tIGFjY2VzcyB3aXRoaW4gYSBkZWZsYXRlIGJsb2NrLgorICAyNTYgaXMgYWRkZWQgdG8gdGhlIHZhbHVlIG9mIHN0cm0tPmRhdGFfdHlwZSB3aGVuIGluZmxhdGUoKSByZXR1cm5zCisgIGltbWVkaWF0ZWx5IGFmdGVyIHJlYWNoaW5nIHRoZSBlbmQgb2YgdGhlIGRlZmxhdGUgYmxvY2sgaGVhZGVyLgorCisgICAgaW5mbGF0ZSgpIHNob3VsZCBub3JtYWxseSBiZSBjYWxsZWQgdW50aWwgaXQgcmV0dXJucyBaX1NUUkVBTV9FTkQgb3IgYW4KKyAgZXJyb3IuICBIb3dldmVyIGlmIGFsbCBkZWNvbXByZXNzaW9uIGlzIHRvIGJlIHBlcmZvcm1lZCBpbiBhIHNpbmdsZSBzdGVwIChhCisgIHNpbmdsZSBjYWxsIG9mIGluZmxhdGUpLCB0aGUgcGFyYW1ldGVyIGZsdXNoIHNob3VsZCBiZSBzZXQgdG8gWl9GSU5JU0guICBJbgorICB0aGlzIGNhc2UgYWxsIHBlbmRpbmcgaW5wdXQgaXMgcHJvY2Vzc2VkIGFuZCBhbGwgcGVuZGluZyBvdXRwdXQgaXMgZmx1c2hlZDsKKyAgYXZhaWxfb3V0IG11c3QgYmUgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgYWxsIHRoZSB1bmNvbXByZXNzZWQgZGF0YS4gIChUaGUgc2l6ZQorICBvZiB0aGUgdW5jb21wcmVzc2VkIGRhdGEgbWF5IGhhdmUgYmVlbiBzYXZlZCBieSB0aGUgY29tcHJlc3NvciBmb3IgdGhpcworICBwdXJwb3NlLikgVGhlIG5leHQgb3BlcmF0aW9uIG9uIHRoaXMgc3RyZWFtIG11c3QgYmUgaW5mbGF0ZUVuZCB0byBkZWFsbG9jYXRlCisgIHRoZSBkZWNvbXByZXNzaW9uIHN0YXRlLiAgVGhlIHVzZSBvZiBaX0ZJTklTSCBpcyBub3QgcmVxdWlyZWQgdG8gcGVyZm9ybSBhbgorICBpbmZsYXRpb24gaW4gb25lIHN0ZXAuICBIb3dldmVyIGl0IG1heSBiZSB1c2VkIHRvIGluZm9ybSBpbmZsYXRlIHRoYXQgYQorICBmYXN0ZXIgYXBwcm9hY2ggY2FuIGJlIHVzZWQgZm9yIHRoZSBzaW5nbGUgaW5mbGF0ZSgpIGNhbGwuICBaX0ZJTklTSCBhbHNvCisgIGluZm9ybXMgaW5mbGF0ZSB0byBub3QgbWFpbnRhaW4gYSBzbGlkaW5nIHdpbmRvdyBpZiB0aGUgc3RyZWFtIGNvbXBsZXRlcywKKyAgd2hpY2ggcmVkdWNlcyBpbmZsYXRlJ3MgbWVtb3J5IGZvb3RwcmludC4KKworICAgICBJbiB0aGlzIGltcGxlbWVudGF0aW9uLCBpbmZsYXRlKCkgYWx3YXlzIGZsdXNoZXMgYXMgbXVjaCBvdXRwdXQgYXMKKyAgcG9zc2libGUgdG8gdGhlIG91dHB1dCBidWZmZXIsIGFuZCBhbHdheXMgdXNlcyB0aGUgZmFzdGVyIGFwcHJvYWNoIG9uIHRoZQorICBmaXJzdCBjYWxsLiAgU28gdGhlIGVmZmVjdHMgb2YgdGhlIGZsdXNoIHBhcmFtZXRlciBpbiB0aGlzIGltcGxlbWVudGF0aW9uIGFyZQorICBvbiB0aGUgcmV0dXJuIHZhbHVlIG9mIGluZmxhdGUoKSBhcyBub3RlZCBiZWxvdywgd2hlbiBpbmZsYXRlKCkgcmV0dXJucyBlYXJseQorICB3aGVuIFpfQkxPQ0sgb3IgWl9UUkVFUyBpcyB1c2VkLCBhbmQgd2hlbiBpbmZsYXRlKCkgYXZvaWRzIHRoZSBhbGxvY2F0aW9uIG9mCisgIG1lbW9yeSBmb3IgYSBzbGlkaW5nIHdpbmRvdyB3aGVuIFpfRklOSVNIIGlzIHVzZWQuCisKKyAgICAgSWYgYSBwcmVzZXQgZGljdGlvbmFyeSBpcyBuZWVkZWQgYWZ0ZXIgdGhpcyBjYWxsIChzZWUgaW5mbGF0ZVNldERpY3Rpb25hcnkKKyAgYmVsb3cpLCBpbmZsYXRlIHNldHMgc3RybS0+YWRsZXIgdG8gdGhlIEFkbGVyLTMyIGNoZWNrc3VtIG9mIHRoZSBkaWN0aW9uYXJ5CisgIGNob3NlbiBieSB0aGUgY29tcHJlc3NvciBhbmQgcmV0dXJucyBaX05FRURfRElDVDsgb3RoZXJ3aXNlIGl0IHNldHMKKyAgc3RybS0+YWRsZXIgdG8gdGhlIEFkbGVyLTMyIGNoZWNrc3VtIG9mIGFsbCBvdXRwdXQgcHJvZHVjZWQgc28gZmFyICh0aGF0IGlzLAorICB0b3RhbF9vdXQgYnl0ZXMpIGFuZCByZXR1cm5zIFpfT0ssIFpfU1RSRUFNX0VORCBvciBhbiBlcnJvciBjb2RlIGFzIGRlc2NyaWJlZAorICBiZWxvdy4gIEF0IHRoZSBlbmQgb2YgdGhlIHN0cmVhbSwgaW5mbGF0ZSgpIGNoZWNrcyB0aGF0IGl0cyBjb21wdXRlZCBhZGxlcjMyCisgIGNoZWNrc3VtIGlzIGVxdWFsIHRvIHRoYXQgc2F2ZWQgYnkgdGhlIGNvbXByZXNzb3IgYW5kIHJldHVybnMgWl9TVFJFQU1fRU5ECisgIG9ubHkgaWYgdGhlIGNoZWNrc3VtIGlzIGNvcnJlY3QuCisKKyAgICBpbmZsYXRlKCkgY2FuIGRlY29tcHJlc3MgYW5kIGNoZWNrIGVpdGhlciB6bGliLXdyYXBwZWQgb3IgZ3ppcC13cmFwcGVkCisgIGRlZmxhdGUgZGF0YS4gIFRoZSBoZWFkZXIgdHlwZSBpcyBkZXRlY3RlZCBhdXRvbWF0aWNhbGx5LCBpZiByZXF1ZXN0ZWQgd2hlbgorICBpbml0aWFsaXppbmcgd2l0aCBpbmZsYXRlSW5pdDIoKS4gIEFueSBpbmZvcm1hdGlvbiBjb250YWluZWQgaW4gdGhlIGd6aXAKKyAgaGVhZGVyIGlzIG5vdCByZXRhaW5lZCwgc28gYXBwbGljYXRpb25zIHRoYXQgbmVlZCB0aGF0IGluZm9ybWF0aW9uIHNob3VsZAorICBpbnN0ZWFkIHVzZSByYXcgaW5mbGF0ZSwgc2VlIGluZmxhdGVJbml0MigpIGJlbG93LCBvciBpbmZsYXRlQmFjaygpIGFuZAorICBwZXJmb3JtIHRoZWlyIG93biBwcm9jZXNzaW5nIG9mIHRoZSBnemlwIGhlYWRlciBhbmQgdHJhaWxlci4gIFdoZW4gcHJvY2Vzc2luZworICBnemlwLXdyYXBwZWQgZGVmbGF0ZSBkYXRhLCBzdHJtLT5hZGxlcjMyIGlzIHNldCB0byB0aGUgQ1JDLTMyIG9mIHRoZSBvdXRwdXQKKyAgcHJvZHVjdGVkIHNvIGZhci4gIFRoZSBDUkMtMzIgaXMgY2hlY2tlZCBhZ2FpbnN0IHRoZSBnemlwIHRyYWlsZXIuCisKKyAgICBpbmZsYXRlKCkgcmV0dXJucyBaX09LIGlmIHNvbWUgcHJvZ3Jlc3MgaGFzIGJlZW4gbWFkZSAobW9yZSBpbnB1dCBwcm9jZXNzZWQKKyAgb3IgbW9yZSBvdXRwdXQgcHJvZHVjZWQpLCBaX1NUUkVBTV9FTkQgaWYgdGhlIGVuZCBvZiB0aGUgY29tcHJlc3NlZCBkYXRhIGhhcworICBiZWVuIHJlYWNoZWQgYW5kIGFsbCB1bmNvbXByZXNzZWQgb3V0cHV0IGhhcyBiZWVuIHByb2R1Y2VkLCBaX05FRURfRElDVCBpZiBhCisgIHByZXNldCBkaWN0aW9uYXJ5IGlzIG5lZWRlZCBhdCB0aGlzIHBvaW50LCBaX0RBVEFfRVJST1IgaWYgdGhlIGlucHV0IGRhdGEgd2FzCisgIGNvcnJ1cHRlZCAoaW5wdXQgc3RyZWFtIG5vdCBjb25mb3JtaW5nIHRvIHRoZSB6bGliIGZvcm1hdCBvciBpbmNvcnJlY3QgY2hlY2sKKyAgdmFsdWUpLCBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgc3RyZWFtIHN0cnVjdHVyZSB3YXMgaW5jb25zaXN0ZW50IChmb3IgZXhhbXBsZQorICBuZXh0X2luIG9yIG5leHRfb3V0IHdhcyBaX05VTEwpLCBaX01FTV9FUlJPUiBpZiB0aGVyZSB3YXMgbm90IGVub3VnaCBtZW1vcnksCisgIFpfQlVGX0VSUk9SIGlmIG5vIHByb2dyZXNzIGlzIHBvc3NpYmxlIG9yIGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoIHJvb20gaW4gdGhlCisgIG91dHB1dCBidWZmZXIgd2hlbiBaX0ZJTklTSCBpcyB1c2VkLiAgTm90ZSB0aGF0IFpfQlVGX0VSUk9SIGlzIG5vdCBmYXRhbCwgYW5kCisgIGluZmxhdGUoKSBjYW4gYmUgY2FsbGVkIGFnYWluIHdpdGggbW9yZSBpbnB1dCBhbmQgbW9yZSBvdXRwdXQgc3BhY2UgdG8KKyAgY29udGludWUgZGVjb21wcmVzc2luZy4gIElmIFpfREFUQV9FUlJPUiBpcyByZXR1cm5lZCwgdGhlIGFwcGxpY2F0aW9uIG1heQorICB0aGVuIGNhbGwgaW5mbGF0ZVN5bmMoKSB0byBsb29rIGZvciBhIGdvb2QgY29tcHJlc3Npb24gYmxvY2sgaWYgYSBwYXJ0aWFsCisgIHJlY292ZXJ5IG9mIHRoZSBkYXRhIGlzIGRlc2lyZWQuCisqLworCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgaW5mbGF0ZUVuZCBPRigoel9zdHJlYW1wIHN0cm0pKTsKKy8qCisgICAgIEFsbCBkeW5hbWljYWxseSBhbGxvY2F0ZWQgZGF0YSBzdHJ1Y3R1cmVzIGZvciB0aGlzIHN0cmVhbSBhcmUgZnJlZWQuCisgICBUaGlzIGZ1bmN0aW9uIGRpc2NhcmRzIGFueSB1bnByb2Nlc3NlZCBpbnB1dCBhbmQgZG9lcyBub3QgZmx1c2ggYW55IHBlbmRpbmcKKyAgIG91dHB1dC4KKworICAgICBpbmZsYXRlRW5kIHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgc3RyZWFtIHN0YXRlCisgICB3YXMgaW5jb25zaXN0ZW50LiAgSW4gdGhlIGVycm9yIGNhc2UsIG1zZyBtYXkgYmUgc2V0IGJ1dCB0aGVuIHBvaW50cyB0byBhCisgICBzdGF0aWMgc3RyaW5nICh3aGljaCBtdXN0IG5vdCBiZSBkZWFsbG9jYXRlZCkuCisqLworCisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFkdmFuY2VkIGZ1bmN0aW9ucyAqLworCisvKgorICAgIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSBuZWVkZWQgb25seSBpbiBzb21lIHNwZWNpYWwgYXBwbGljYXRpb25zLgorKi8KKworLyoKK1pFWFRFUk4gaW50IFpFWFBPUlQgZGVmbGF0ZUluaXQyIE9GKCh6X3N0cmVhbXAgc3RybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgIGxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgbWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgd2luZG93Qml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgIG1lbUxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgc3RyYXRlZ3kpKTsKKworICAgICBUaGlzIGlzIGFub3RoZXIgdmVyc2lvbiBvZiBkZWZsYXRlSW5pdCB3aXRoIG1vcmUgY29tcHJlc3Npb24gb3B0aW9ucy4gIFRoZQorICAgZmllbGRzIG5leHRfaW4sIHphbGxvYywgemZyZWUgYW5kIG9wYXF1ZSBtdXN0IGJlIGluaXRpYWxpemVkIGJlZm9yZSBieSB0aGUKKyAgIGNhbGxlci4KKworICAgICBUaGUgbWV0aG9kIHBhcmFtZXRlciBpcyB0aGUgY29tcHJlc3Npb24gbWV0aG9kLiAgSXQgbXVzdCBiZSBaX0RFRkxBVEVEIGluCisgICB0aGlzIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkuCisKKyAgICAgVGhlIHdpbmRvd0JpdHMgcGFyYW1ldGVyIGlzIHRoZSBiYXNlIHR3byBsb2dhcml0aG0gb2YgdGhlIHdpbmRvdyBzaXplCisgICAodGhlIHNpemUgb2YgdGhlIGhpc3RvcnkgYnVmZmVyKS4gIEl0IHNob3VsZCBiZSBpbiB0aGUgcmFuZ2UgOC4uMTUgZm9yIHRoaXMKKyAgIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkuICBMYXJnZXIgdmFsdWVzIG9mIHRoaXMgcGFyYW1ldGVyIHJlc3VsdCBpbiBiZXR0ZXIKKyAgIGNvbXByZXNzaW9uIGF0IHRoZSBleHBlbnNlIG9mIG1lbW9yeSB1c2FnZS4gIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDE1IGlmCisgICBkZWZsYXRlSW5pdCBpcyB1c2VkIGluc3RlYWQuCisKKyAgICAgd2luZG93Qml0cyBjYW4gYWxzbyBiZSAtOC4uLTE1IGZvciByYXcgZGVmbGF0ZS4gIEluIHRoaXMgY2FzZSwgLXdpbmRvd0JpdHMKKyAgIGRldGVybWluZXMgdGhlIHdpbmRvdyBzaXplLiAgZGVmbGF0ZSgpIHdpbGwgdGhlbiBnZW5lcmF0ZSByYXcgZGVmbGF0ZSBkYXRhCisgICB3aXRoIG5vIHpsaWIgaGVhZGVyIG9yIHRyYWlsZXIsIGFuZCB3aWxsIG5vdCBjb21wdXRlIGFuIGFkbGVyMzIgY2hlY2sgdmFsdWUuCisKKyAgICAgd2luZG93Qml0cyBjYW4gYWxzbyBiZSBncmVhdGVyIHRoYW4gMTUgZm9yIG9wdGlvbmFsIGd6aXAgZW5jb2RpbmcuICBBZGQKKyAgIDE2IHRvIHdpbmRvd0JpdHMgdG8gd3JpdGUgYSBzaW1wbGUgZ3ppcCBoZWFkZXIgYW5kIHRyYWlsZXIgYXJvdW5kIHRoZQorICAgY29tcHJlc3NlZCBkYXRhIGluc3RlYWQgb2YgYSB6bGliIHdyYXBwZXIuICBUaGUgZ3ppcCBoZWFkZXIgd2lsbCBoYXZlIG5vCisgICBmaWxlIG5hbWUsIG5vIGV4dHJhIGRhdGEsIG5vIGNvbW1lbnQsIG5vIG1vZGlmaWNhdGlvbiB0aW1lIChzZXQgdG8gemVybyksIG5vCisgICBoZWFkZXIgY3JjLCBhbmQgdGhlIG9wZXJhdGluZyBzeXN0ZW0gd2lsbCBiZSBzZXQgdG8gMjU1ICh1bmtub3duKS4gIElmIGEKKyAgIGd6aXAgc3RyZWFtIGlzIGJlaW5nIHdyaXR0ZW4sIHN0cm0tPmFkbGVyIGlzIGEgY3JjMzIgaW5zdGVhZCBvZiBhbiBhZGxlcjMyLgorCisgICAgIFRoZSBtZW1MZXZlbCBwYXJhbWV0ZXIgc3BlY2lmaWVzIGhvdyBtdWNoIG1lbW9yeSBzaG91bGQgYmUgYWxsb2NhdGVkCisgICBmb3IgdGhlIGludGVybmFsIGNvbXByZXNzaW9uIHN0YXRlLiAgbWVtTGV2ZWw9MSB1c2VzIG1pbmltdW0gbWVtb3J5IGJ1dCBpcworICAgc2xvdyBhbmQgcmVkdWNlcyBjb21wcmVzc2lvbiByYXRpbzsgbWVtTGV2ZWw9OSB1c2VzIG1heGltdW0gbWVtb3J5IGZvcgorICAgb3B0aW1hbCBzcGVlZC4gIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDguICBTZWUgemNvbmYuaCBmb3IgdG90YWwgbWVtb3J5IHVzYWdlCisgICBhcyBhIGZ1bmN0aW9uIG9mIHdpbmRvd0JpdHMgYW5kIG1lbUxldmVsLgorCisgICAgIFRoZSBzdHJhdGVneSBwYXJhbWV0ZXIgaXMgdXNlZCB0byB0dW5lIHRoZSBjb21wcmVzc2lvbiBhbGdvcml0aG0uICBVc2UgdGhlCisgICB2YWx1ZSBaX0RFRkFVTFRfU1RSQVRFR1kgZm9yIG5vcm1hbCBkYXRhLCBaX0ZJTFRFUkVEIGZvciBkYXRhIHByb2R1Y2VkIGJ5IGEKKyAgIGZpbHRlciAob3IgcHJlZGljdG9yKSwgWl9IVUZGTUFOX09OTFkgdG8gZm9yY2UgSHVmZm1hbiBlbmNvZGluZyBvbmx5IChubworICAgc3RyaW5nIG1hdGNoKSwgb3IgWl9STEUgdG8gbGltaXQgbWF0Y2ggZGlzdGFuY2VzIHRvIG9uZSAocnVuLWxlbmd0aAorICAgZW5jb2RpbmcpLiAgRmlsdGVyZWQgZGF0YSBjb25zaXN0cyBtb3N0bHkgb2Ygc21hbGwgdmFsdWVzIHdpdGggYSBzb21ld2hhdAorICAgcmFuZG9tIGRpc3RyaWJ1dGlvbi4gIEluIHRoaXMgY2FzZSwgdGhlIGNvbXByZXNzaW9uIGFsZ29yaXRobSBpcyB0dW5lZCB0bworICAgY29tcHJlc3MgdGhlbSBiZXR0ZXIuICBUaGUgZWZmZWN0IG9mIFpfRklMVEVSRUQgaXMgdG8gZm9yY2UgbW9yZSBIdWZmbWFuCisgICBjb2RpbmcgYW5kIGxlc3Mgc3RyaW5nIG1hdGNoaW5nOyBpdCBpcyBzb21ld2hhdCBpbnRlcm1lZGlhdGUgYmV0d2VlbgorICAgWl9ERUZBVUxUX1NUUkFURUdZIGFuZCBaX0hVRkZNQU5fT05MWS4gIFpfUkxFIGlzIGRlc2lnbmVkIHRvIGJlIGFsbW9zdCBhcworICAgZmFzdCBhcyBaX0hVRkZNQU5fT05MWSwgYnV0IGdpdmUgYmV0dGVyIGNvbXByZXNzaW9uIGZvciBQTkcgaW1hZ2UgZGF0YS4gIFRoZQorICAgc3RyYXRlZ3kgcGFyYW1ldGVyIG9ubHkgYWZmZWN0cyB0aGUgY29tcHJlc3Npb24gcmF0aW8gYnV0IG5vdCB0aGUKKyAgIGNvcnJlY3RuZXNzIG9mIHRoZSBjb21wcmVzc2VkIG91dHB1dCBldmVuIGlmIGl0IGlzIG5vdCBzZXQgYXBwcm9wcmlhdGVseS4KKyAgIFpfRklYRUQgcHJldmVudHMgdGhlIHVzZSBvZiBkeW5hbWljIEh1ZmZtYW4gY29kZXMsIGFsbG93aW5nIGZvciBhIHNpbXBsZXIKKyAgIGRlY29kZXIgZm9yIHNwZWNpYWwgYXBwbGljYXRpb25zLgorCisgICAgIGRlZmxhdGVJbml0MiByZXR1cm5zIFpfT0sgaWYgc3VjY2VzcywgWl9NRU1fRVJST1IgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2gKKyAgIG1lbW9yeSwgWl9TVFJFQU1fRVJST1IgaWYgYW55IHBhcmFtZXRlciBpcyBpbnZhbGlkIChzdWNoIGFzIGFuIGludmFsaWQKKyAgIG1ldGhvZCksIG9yIFpfVkVSU0lPTl9FUlJPUiBpZiB0aGUgemxpYiBsaWJyYXJ5IHZlcnNpb24gKHpsaWJfdmVyc2lvbikgaXMKKyAgIGluY29tcGF0aWJsZSB3aXRoIHRoZSB2ZXJzaW9uIGFzc3VtZWQgYnkgdGhlIGNhbGxlciAoWkxJQl9WRVJTSU9OKS4gIG1zZyBpcworICAgc2V0IHRvIG51bGwgaWYgdGhlcmUgaXMgbm8gZXJyb3IgbWVzc2FnZS4gIGRlZmxhdGVJbml0MiBkb2VzIG5vdCBwZXJmb3JtIGFueQorICAgY29tcHJlc3Npb246IHRoaXMgd2lsbCBiZSBkb25lIGJ5IGRlZmxhdGUoKS4KKyovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgZGVmbGF0ZVNldERpY3Rpb25hcnkgT0YoKHpfc3RyZWFtcCBzdHJtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZWYgKmRpY3Rpb25hcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1SW50ICBkaWN0TGVuZ3RoKSk7CisvKgorICAgICBJbml0aWFsaXplcyB0aGUgY29tcHJlc3Npb24gZGljdGlvbmFyeSBmcm9tIHRoZSBnaXZlbiBieXRlIHNlcXVlbmNlCisgICB3aXRob3V0IHByb2R1Y2luZyBhbnkgY29tcHJlc3NlZCBvdXRwdXQuICBXaGVuIHVzaW5nIHRoZSB6bGliIGZvcm1hdCwgdGhpcworICAgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgZGVmbGF0ZUluaXQsIGRlZmxhdGVJbml0MiBvcgorICAgZGVmbGF0ZVJlc2V0LCBhbmQgYmVmb3JlIGFueSBjYWxsIG9mIGRlZmxhdGUuICBXaGVuIGRvaW5nIHJhdyBkZWZsYXRlLCB0aGlzCisgICBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBlaXRoZXIgYmVmb3JlIGFueSBjYWxsIG9mIGRlZmxhdGUsIG9yIGltbWVkaWF0ZWx5CisgICBhZnRlciB0aGUgY29tcGxldGlvbiBvZiBhIGRlZmxhdGUgYmxvY2ssIGkuZS4gYWZ0ZXIgYWxsIGlucHV0IGhhcyBiZWVuCisgICBjb25zdW1lZCBhbmQgYWxsIG91dHB1dCBoYXMgYmVlbiBkZWxpdmVyZWQgd2hlbiB1c2luZyBhbnkgb2YgdGhlIGZsdXNoCisgICBvcHRpb25zIFpfQkxPQ0ssIFpfUEFSVElBTF9GTFVTSCwgWl9TWU5DX0ZMVVNILCBvciBaX0ZVTExfRkxVU0guICBUaGUKKyAgIGNvbXByZXNzb3IgYW5kIGRlY29tcHJlc3NvciBtdXN0IHVzZSBleGFjdGx5IHRoZSBzYW1lIGRpY3Rpb25hcnkgKHNlZQorICAgaW5mbGF0ZVNldERpY3Rpb25hcnkpLgorCisgICAgIFRoZSBkaWN0aW9uYXJ5IHNob3VsZCBjb25zaXN0IG9mIHN0cmluZ3MgKGJ5dGUgc2VxdWVuY2VzKSB0aGF0IGFyZSBsaWtlbHkKKyAgIHRvIGJlIGVuY291bnRlcmVkIGxhdGVyIGluIHRoZSBkYXRhIHRvIGJlIGNvbXByZXNzZWQsIHdpdGggdGhlIG1vc3QgY29tbW9ubHkKKyAgIHVzZWQgc3RyaW5ncyBwcmVmZXJhYmx5IHB1dCB0b3dhcmRzIHRoZSBlbmQgb2YgdGhlIGRpY3Rpb25hcnkuICBVc2luZyBhCisgICBkaWN0aW9uYXJ5IGlzIG1vc3QgdXNlZnVsIHdoZW4gdGhlIGRhdGEgdG8gYmUgY29tcHJlc3NlZCBpcyBzaG9ydCBhbmQgY2FuIGJlCisgICBwcmVkaWN0ZWQgd2l0aCBnb29kIGFjY3VyYWN5OyB0aGUgZGF0YSBjYW4gdGhlbiBiZSBjb21wcmVzc2VkIGJldHRlciB0aGFuCisgICB3aXRoIHRoZSBkZWZhdWx0IGVtcHR5IGRpY3Rpb25hcnkuCisKKyAgICAgRGVwZW5kaW5nIG9uIHRoZSBzaXplIG9mIHRoZSBjb21wcmVzc2lvbiBkYXRhIHN0cnVjdHVyZXMgc2VsZWN0ZWQgYnkKKyAgIGRlZmxhdGVJbml0IG9yIGRlZmxhdGVJbml0MiwgYSBwYXJ0IG9mIHRoZSBkaWN0aW9uYXJ5IG1heSBpbiBlZmZlY3QgYmUKKyAgIGRpc2NhcmRlZCwgZm9yIGV4YW1wbGUgaWYgdGhlIGRpY3Rpb25hcnkgaXMgbGFyZ2VyIHRoYW4gdGhlIHdpbmRvdyBzaXplCisgICBwcm92aWRlZCBpbiBkZWZsYXRlSW5pdCBvciBkZWZsYXRlSW5pdDIuICBUaHVzIHRoZSBzdHJpbmdzIG1vc3QgbGlrZWx5IHRvIGJlCisgICB1c2VmdWwgc2hvdWxkIGJlIHB1dCBhdCB0aGUgZW5kIG9mIHRoZSBkaWN0aW9uYXJ5LCBub3QgYXQgdGhlIGZyb250LiAgSW4KKyAgIGFkZGl0aW9uLCB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBvZiBkZWZsYXRlIHdpbGwgdXNlIGF0IG1vc3QgdGhlIHdpbmRvdworICAgc2l6ZSBtaW51cyAyNjIgYnl0ZXMgb2YgdGhlIHByb3ZpZGVkIGRpY3Rpb25hcnkuCisKKyAgICAgVXBvbiByZXR1cm4gb2YgdGhpcyBmdW5jdGlvbiwgc3RybS0+YWRsZXIgaXMgc2V0IHRvIHRoZSBhZGxlcjMyIHZhbHVlCisgICBvZiB0aGUgZGljdGlvbmFyeTsgdGhlIGRlY29tcHJlc3NvciBtYXkgbGF0ZXIgdXNlIHRoaXMgdmFsdWUgdG8gZGV0ZXJtaW5lCisgICB3aGljaCBkaWN0aW9uYXJ5IGhhcyBiZWVuIHVzZWQgYnkgdGhlIGNvbXByZXNzb3IuICAoVGhlIGFkbGVyMzIgdmFsdWUKKyAgIGFwcGxpZXMgdG8gdGhlIHdob2xlIGRpY3Rpb25hcnkgZXZlbiBpZiBvbmx5IGEgc3Vic2V0IG9mIHRoZSBkaWN0aW9uYXJ5IGlzCisgICBhY3R1YWxseSB1c2VkIGJ5IHRoZSBjb21wcmVzc29yLikgSWYgYSByYXcgZGVmbGF0ZSB3YXMgcmVxdWVzdGVkLCB0aGVuIHRoZQorICAgYWRsZXIzMiB2YWx1ZSBpcyBub3QgY29tcHV0ZWQgYW5kIHN0cm0tPmFkbGVyIGlzIG5vdCBzZXQuCisKKyAgICAgZGVmbGF0ZVNldERpY3Rpb25hcnkgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIG9yIFpfU1RSRUFNX0VSUk9SIGlmIGEKKyAgIHBhcmFtZXRlciBpcyBpbnZhbGlkIChlLmcuICBkaWN0aW9uYXJ5IGJlaW5nIFpfTlVMTCkgb3IgdGhlIHN0cmVhbSBzdGF0ZSBpcworICAgaW5jb25zaXN0ZW50IChmb3IgZXhhbXBsZSBpZiBkZWZsYXRlIGhhcyBhbHJlYWR5IGJlZW4gY2FsbGVkIGZvciB0aGlzIHN0cmVhbQorICAgb3IgaWYgbm90IGF0IGEgYmxvY2sgYm91bmRhcnkgZm9yIHJhdyBkZWZsYXRlKS4gIGRlZmxhdGVTZXREaWN0aW9uYXJ5IGRvZXMKKyAgIG5vdCBwZXJmb3JtIGFueSBjb21wcmVzc2lvbjogdGhpcyB3aWxsIGJlIGRvbmUgYnkgZGVmbGF0ZSgpLgorKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCBkZWZsYXRlQ29weSBPRigoel9zdHJlYW1wIGRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6X3N0cmVhbXAgc291cmNlKSk7CisvKgorICAgICBTZXRzIHRoZSBkZXN0aW5hdGlvbiBzdHJlYW0gYXMgYSBjb21wbGV0ZSBjb3B5IG9mIHRoZSBzb3VyY2Ugc3RyZWFtLgorCisgICAgIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWZ1bCB3aGVuIHNldmVyYWwgY29tcHJlc3Npb24gc3RyYXRlZ2llcyB3aWxsIGJlCisgICB0cmllZCwgZm9yIGV4YW1wbGUgd2hlbiB0aGVyZSBhcmUgc2V2ZXJhbCB3YXlzIG9mIHByZS1wcm9jZXNzaW5nIHRoZSBpbnB1dAorICAgZGF0YSB3aXRoIGEgZmlsdGVyLiAgVGhlIHN0cmVhbXMgdGhhdCB3aWxsIGJlIGRpc2NhcmRlZCBzaG91bGQgdGhlbiBiZSBmcmVlZAorICAgYnkgY2FsbGluZyBkZWZsYXRlRW5kLiAgTm90ZSB0aGF0IGRlZmxhdGVDb3B5IGR1cGxpY2F0ZXMgdGhlIGludGVybmFsCisgICBjb21wcmVzc2lvbiBzdGF0ZSB3aGljaCBjYW4gYmUgcXVpdGUgbGFyZ2UsIHNvIHRoaXMgc3RyYXRlZ3kgaXMgc2xvdyBhbmQgY2FuCisgICBjb25zdW1lIGxvdHMgb2YgbWVtb3J5LgorCisgICAgIGRlZmxhdGVDb3B5IHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBaX01FTV9FUlJPUiBpZiB0aGVyZSB3YXMgbm90CisgICBlbm91Z2ggbWVtb3J5LCBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgc291cmNlIHN0cmVhbSBzdGF0ZSB3YXMgaW5jb25zaXN0ZW50CisgICAoc3VjaCBhcyB6YWxsb2MgYmVpbmcgWl9OVUxMKS4gIG1zZyBpcyBsZWZ0IHVuY2hhbmdlZCBpbiBib3RoIHNvdXJjZSBhbmQKKyAgIGRlc3RpbmF0aW9uLgorKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCBkZWZsYXRlUmVzZXQgT0YoKHpfc3RyZWFtcCBzdHJtKSk7CisvKgorICAgICBUaGlzIGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8gZGVmbGF0ZUVuZCBmb2xsb3dlZCBieSBkZWZsYXRlSW5pdCwKKyAgIGJ1dCBkb2VzIG5vdCBmcmVlIGFuZCByZWFsbG9jYXRlIGFsbCB0aGUgaW50ZXJuYWwgY29tcHJlc3Npb24gc3RhdGUuICBUaGUKKyAgIHN0cmVhbSB3aWxsIGtlZXAgdGhlIHNhbWUgY29tcHJlc3Npb24gbGV2ZWwgYW5kIGFueSBvdGhlciBhdHRyaWJ1dGVzIHRoYXQKKyAgIG1heSBoYXZlIGJlZW4gc2V0IGJ5IGRlZmxhdGVJbml0Mi4KKworICAgICBkZWZsYXRlUmVzZXQgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIG9yIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzb3VyY2UKKyAgIHN0cmVhbSBzdGF0ZSB3YXMgaW5jb25zaXN0ZW50IChzdWNoIGFzIHphbGxvYyBvciBzdGF0ZSBiZWluZyBaX05VTEwpLgorKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCBkZWZsYXRlUGFyYW1zIE9GKCh6X3N0cmVhbXAgc3RybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyYXRlZ3kpKTsKKy8qCisgICAgIER5bmFtaWNhbGx5IHVwZGF0ZSB0aGUgY29tcHJlc3Npb24gbGV2ZWwgYW5kIGNvbXByZXNzaW9uIHN0cmF0ZWd5LiAgVGhlCisgICBpbnRlcnByZXRhdGlvbiBvZiBsZXZlbCBhbmQgc3RyYXRlZ3kgaXMgYXMgaW4gZGVmbGF0ZUluaXQyLiAgVGhpcyBjYW4gYmUKKyAgIHVzZWQgdG8gc3dpdGNoIGJldHdlZW4gY29tcHJlc3Npb24gYW5kIHN0cmFpZ2h0IGNvcHkgb2YgdGhlIGlucHV0IGRhdGEsIG9yCisgICB0byBzd2l0Y2ggdG8gYSBkaWZmZXJlbnQga2luZCBvZiBpbnB1dCBkYXRhIHJlcXVpcmluZyBhIGRpZmZlcmVudCBzdHJhdGVneS4KKyAgIElmIHRoZSBjb21wcmVzc2lvbiBsZXZlbCBpcyBjaGFuZ2VkLCB0aGUgaW5wdXQgYXZhaWxhYmxlIHNvIGZhciBpcworICAgY29tcHJlc3NlZCB3aXRoIHRoZSBvbGQgbGV2ZWwgKGFuZCBtYXkgYmUgZmx1c2hlZCk7IHRoZSBuZXcgbGV2ZWwgd2lsbCB0YWtlCisgICBlZmZlY3Qgb25seSBhdCB0aGUgbmV4dCBjYWxsIG9mIGRlZmxhdGUoKS4KKworICAgICBCZWZvcmUgdGhlIGNhbGwgb2YgZGVmbGF0ZVBhcmFtcywgdGhlIHN0cmVhbSBzdGF0ZSBtdXN0IGJlIHNldCBhcyBmb3IKKyAgIGEgY2FsbCBvZiBkZWZsYXRlKCksIHNpbmNlIHRoZSBjdXJyZW50bHkgYXZhaWxhYmxlIGlucHV0IG1heSBoYXZlIHRvIGJlCisgICBjb21wcmVzc2VkIGFuZCBmbHVzaGVkLiAgSW4gcGFydGljdWxhciwgc3RybS0+YXZhaWxfb3V0IG11c3QgYmUgbm9uLXplcm8uCisKKyAgICAgZGVmbGF0ZVBhcmFtcyByZXR1cm5zIFpfT0sgaWYgc3VjY2VzcywgWl9TVFJFQU1fRVJST1IgaWYgdGhlIHNvdXJjZQorICAgc3RyZWFtIHN0YXRlIHdhcyBpbmNvbnNpc3RlbnQgb3IgaWYgYSBwYXJhbWV0ZXIgd2FzIGludmFsaWQsIFpfQlVGX0VSUk9SIGlmCisgICBzdHJtLT5hdmFpbF9vdXQgd2FzIHplcm8uCisqLworCitaRVhURVJOIGludCBaRVhQT1JUIGRlZmxhdGVUdW5lIE9GKCh6X3N0cmVhbXAgc3RybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBnb29kX2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXhfbGF6eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuaWNlX2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXhfY2hhaW4pKTsKKy8qCisgICAgIEZpbmUgdHVuZSBkZWZsYXRlJ3MgaW50ZXJuYWwgY29tcHJlc3Npb24gcGFyYW1ldGVycy4gIFRoaXMgc2hvdWxkIG9ubHkgYmUKKyAgIHVzZWQgYnkgc29tZW9uZSB3aG8gdW5kZXJzdGFuZHMgdGhlIGFsZ29yaXRobSB1c2VkIGJ5IHpsaWIncyBkZWZsYXRlIGZvcgorICAgc2VhcmNoaW5nIGZvciB0aGUgYmVzdCBtYXRjaGluZyBzdHJpbmcsIGFuZCBldmVuIHRoZW4gb25seSBieSB0aGUgbW9zdAorICAgZmFuYXRpYyBvcHRpbWl6ZXIgdHJ5aW5nIHRvIHNxdWVlemUgb3V0IHRoZSBsYXN0IGNvbXByZXNzZWQgYml0IGZvciB0aGVpcgorICAgc3BlY2lmaWMgaW5wdXQgZGF0YS4gIFJlYWQgdGhlIGRlZmxhdGUuYyBzb3VyY2UgY29kZSBmb3IgdGhlIG1lYW5pbmcgb2YgdGhlCisgICBtYXhfbGF6eSwgZ29vZF9sZW5ndGgsIG5pY2VfbGVuZ3RoLCBhbmQgbWF4X2NoYWluIHBhcmFtZXRlcnMuCisKKyAgICAgZGVmbGF0ZVR1bmUoKSBjYW4gYmUgY2FsbGVkIGFmdGVyIGRlZmxhdGVJbml0KCkgb3IgZGVmbGF0ZUluaXQyKCksIGFuZAorICAgcmV0dXJucyBaX09LIG9uIHN1Y2Nlc3MsIG9yIFpfU1RSRUFNX0VSUk9SIGZvciBhbiBpbnZhbGlkIGRlZmxhdGUgc3RyZWFtLgorICovCisKK1pFWFRFUk4gdUxvbmcgWkVYUE9SVCBkZWZsYXRlQm91bmQgT0YoKHpfc3RyZWFtcCBzdHJtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdUxvbmcgc291cmNlTGVuKSk7CisvKgorICAgICBkZWZsYXRlQm91bmQoKSByZXR1cm5zIGFuIHVwcGVyIGJvdW5kIG9uIHRoZSBjb21wcmVzc2VkIHNpemUgYWZ0ZXIKKyAgIGRlZmxhdGlvbiBvZiBzb3VyY2VMZW4gYnl0ZXMuICBJdCBtdXN0IGJlIGNhbGxlZCBhZnRlciBkZWZsYXRlSW5pdCgpIG9yCisgICBkZWZsYXRlSW5pdDIoKSwgYW5kIGFmdGVyIGRlZmxhdGVTZXRIZWFkZXIoKSwgaWYgdXNlZC4gIFRoaXMgd291bGQgYmUgdXNlZAorICAgdG8gYWxsb2NhdGUgYW4gb3V0cHV0IGJ1ZmZlciBmb3IgZGVmbGF0aW9uIGluIGEgc2luZ2xlIHBhc3MsIGFuZCBzbyB3b3VsZCBiZQorICAgY2FsbGVkIGJlZm9yZSBkZWZsYXRlKCkuICBJZiB0aGF0IGZpcnN0IGRlZmxhdGUoKSBjYWxsIGlzIHByb3ZpZGVkIHRoZQorICAgc291cmNlTGVuIGlucHV0IGJ5dGVzLCBhbiBvdXRwdXQgYnVmZmVyIGFsbG9jYXRlZCB0byB0aGUgc2l6ZSByZXR1cm5lZCBieQorICAgZGVmbGF0ZUJvdW5kKCksIGFuZCB0aGUgZmx1c2ggdmFsdWUgWl9GSU5JU0gsIHRoZW4gZGVmbGF0ZSgpIGlzIGd1YXJhbnRlZWQKKyAgIHRvIHJldHVybiBaX1NUUkVBTV9FTkQuICBOb3RlIHRoYXQgaXQgaXMgcG9zc2libGUgZm9yIHRoZSBjb21wcmVzc2VkIHNpemUgdG8KKyAgIGJlIGxhcmdlciB0aGFuIHRoZSB2YWx1ZSByZXR1cm5lZCBieSBkZWZsYXRlQm91bmQoKSBpZiBmbHVzaCBvcHRpb25zIG90aGVyCisgICB0aGFuIFpfRklOSVNIIG9yIFpfTk9fRkxVU0ggYXJlIHVzZWQuCisqLworCitaRVhURVJOIGludCBaRVhQT1JUIGRlZmxhdGVQZW5kaW5nIE9GKCh6X3N0cmVhbXAgc3RybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICpwZW5kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpiaXRzKSk7CisvKgorICAgICBkZWZsYXRlUGVuZGluZygpIHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBhbmQgYml0cyBvZiBvdXRwdXQgdGhhdCBoYXZlCisgICBiZWVuIGdlbmVyYXRlZCwgYnV0IG5vdCB5ZXQgcHJvdmlkZWQgaW4gdGhlIGF2YWlsYWJsZSBvdXRwdXQuICBUaGUgYnl0ZXMgbm90CisgICBwcm92aWRlZCB3b3VsZCBiZSBkdWUgdG8gdGhlIGF2YWlsYWJsZSBvdXRwdXQgc3BhY2UgaGF2aW5nIGJlaW5nIGNvbnN1bWVkLgorICAgVGhlIG51bWJlciBvZiBiaXRzIG9mIG91dHB1dCBub3QgcHJvdmlkZWQgYXJlIGJldHdlZW4gMCBhbmQgNywgd2hlcmUgdGhleQorICAgYXdhaXQgbW9yZSBiaXRzIHRvIGpvaW4gdGhlbSBpbiBvcmRlciB0byBmaWxsIG91dCBhIGZ1bGwgYnl0ZS4gIElmIHBlbmRpbmcKKyAgIG9yIGJpdHMgYXJlIFpfTlVMTCwgdGhlbiB0aG9zZSB2YWx1ZXMgYXJlIG5vdCBzZXQuCisKKyAgICAgZGVmbGF0ZVBlbmRpbmcgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIG9yIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzb3VyY2UKKyAgIHN0cmVhbSBzdGF0ZSB3YXMgaW5jb25zaXN0ZW50LgorICovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgZGVmbGF0ZVByaW1lIE9GKCh6X3N0cmVhbXAgc3RybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdmFsdWUpKTsKKy8qCisgICAgIGRlZmxhdGVQcmltZSgpIGluc2VydHMgYml0cyBpbiB0aGUgZGVmbGF0ZSBvdXRwdXQgc3RyZWFtLiAgVGhlIGludGVudAorICAgaXMgdGhhdCB0aGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc3RhcnQgb2ZmIHRoZSBkZWZsYXRlIG91dHB1dCB3aXRoIHRoZSBiaXRzCisgICBsZWZ0b3ZlciBmcm9tIGEgcHJldmlvdXMgZGVmbGF0ZSBzdHJlYW0gd2hlbiBhcHBlbmRpbmcgdG8gaXQuICBBcyBzdWNoLCB0aGlzCisgICBmdW5jdGlvbiBjYW4gb25seSBiZSB1c2VkIGZvciByYXcgZGVmbGF0ZSwgYW5kIG11c3QgYmUgdXNlZCBiZWZvcmUgdGhlIGZpcnN0CisgICBkZWZsYXRlKCkgY2FsbCBhZnRlciBhIGRlZmxhdGVJbml0MigpIG9yIGRlZmxhdGVSZXNldCgpLiAgYml0cyBtdXN0IGJlIGxlc3MKKyAgIHRoYW4gb3IgZXF1YWwgdG8gMTYsIGFuZCB0aGF0IG1hbnkgb2YgdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdHMgb2YgdmFsdWUKKyAgIHdpbGwgYmUgaW5zZXJ0ZWQgaW4gdGhlIG91dHB1dC4KKworICAgICBkZWZsYXRlUHJpbWUgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIFpfQlVGX0VSUk9SIGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoCisgICByb29tIGluIHRoZSBpbnRlcm5hbCBidWZmZXIgdG8gaW5zZXJ0IHRoZSBiaXRzLCBvciBaX1NUUkVBTV9FUlJPUiBpZiB0aGUKKyAgIHNvdXJjZSBzdHJlYW0gc3RhdGUgd2FzIGluY29uc2lzdGVudC4KKyovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgZGVmbGF0ZVNldEhlYWRlciBPRigoel9zdHJlYW1wIHN0cm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd6X2hlYWRlcnAgaGVhZCkpOworLyoKKyAgICAgZGVmbGF0ZVNldEhlYWRlcigpIHByb3ZpZGVzIGd6aXAgaGVhZGVyIGluZm9ybWF0aW9uIGZvciB3aGVuIGEgZ3ppcAorICAgc3RyZWFtIGlzIHJlcXVlc3RlZCBieSBkZWZsYXRlSW5pdDIoKS4gIGRlZmxhdGVTZXRIZWFkZXIoKSBtYXkgYmUgY2FsbGVkCisgICBhZnRlciBkZWZsYXRlSW5pdDIoKSBvciBkZWZsYXRlUmVzZXQoKSBhbmQgYmVmb3JlIHRoZSBmaXJzdCBjYWxsIG9mCisgICBkZWZsYXRlKCkuICBUaGUgdGV4dCwgdGltZSwgb3MsIGV4dHJhIGZpZWxkLCBuYW1lLCBhbmQgY29tbWVudCBpbmZvcm1hdGlvbgorICAgaW4gdGhlIHByb3ZpZGVkIGd6X2hlYWRlciBzdHJ1Y3R1cmUgYXJlIHdyaXR0ZW4gdG8gdGhlIGd6aXAgaGVhZGVyICh4ZmxhZyBpcworICAgaWdub3JlZCAtLSB0aGUgZXh0cmEgZmxhZ3MgYXJlIHNldCBhY2NvcmRpbmcgdG8gdGhlIGNvbXByZXNzaW9uIGxldmVsKS4gIFRoZQorICAgY2FsbGVyIG11c3QgYXNzdXJlIHRoYXQsIGlmIG5vdCBaX05VTEwsIG5hbWUgYW5kIGNvbW1lbnQgYXJlIHRlcm1pbmF0ZWQgd2l0aAorICAgYSB6ZXJvIGJ5dGUsIGFuZCB0aGF0IGlmIGV4dHJhIGlzIG5vdCBaX05VTEwsIHRoYXQgZXh0cmFfbGVuIGJ5dGVzIGFyZQorICAgYXZhaWxhYmxlIHRoZXJlLiAgSWYgaGNyYyBpcyB0cnVlLCBhIGd6aXAgaGVhZGVyIGNyYyBpcyBpbmNsdWRlZC4gIE5vdGUgdGhhdAorICAgdGhlIGN1cnJlbnQgdmVyc2lvbnMgb2YgdGhlIGNvbW1hbmQtbGluZSB2ZXJzaW9uIG9mIGd6aXAgKHVwIHRocm91Z2ggdmVyc2lvbgorICAgMS4zLngpIGRvIG5vdCBzdXBwb3J0IGhlYWRlciBjcmMncywgYW5kIHdpbGwgcmVwb3J0IHRoYXQgaXQgaXMgYSAibXVsdGktcGFydAorICAgZ3ppcCBmaWxlIiBhbmQgZ2l2ZSB1cC4KKworICAgICBJZiBkZWZsYXRlU2V0SGVhZGVyIGlzIG5vdCB1c2VkLCB0aGUgZGVmYXVsdCBnemlwIGhlYWRlciBoYXMgdGV4dCBmYWxzZSwKKyAgIHRoZSB0aW1lIHNldCB0byB6ZXJvLCBhbmQgb3Mgc2V0IHRvIDI1NSwgd2l0aCBubyBleHRyYSwgbmFtZSwgb3IgY29tbWVudAorICAgZmllbGRzLiAgVGhlIGd6aXAgaGVhZGVyIGlzIHJldHVybmVkIHRvIHRoZSBkZWZhdWx0IHN0YXRlIGJ5IGRlZmxhdGVSZXNldCgpLgorCisgICAgIGRlZmxhdGVTZXRIZWFkZXIgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIG9yIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzb3VyY2UKKyAgIHN0cmVhbSBzdGF0ZSB3YXMgaW5jb25zaXN0ZW50LgorKi8KKworLyoKK1pFWFRFUk4gaW50IFpFWFBPUlQgaW5mbGF0ZUluaXQyIE9GKCh6X3N0cmVhbXAgc3RybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgIHdpbmRvd0JpdHMpKTsKKworICAgICBUaGlzIGlzIGFub3RoZXIgdmVyc2lvbiBvZiBpbmZsYXRlSW5pdCB3aXRoIGFuIGV4dHJhIHBhcmFtZXRlci4gIFRoZQorICAgZmllbGRzIG5leHRfaW4sIGF2YWlsX2luLCB6YWxsb2MsIHpmcmVlIGFuZCBvcGFxdWUgbXVzdCBiZSBpbml0aWFsaXplZAorICAgYmVmb3JlIGJ5IHRoZSBjYWxsZXIuCisKKyAgICAgVGhlIHdpbmRvd0JpdHMgcGFyYW1ldGVyIGlzIHRoZSBiYXNlIHR3byBsb2dhcml0aG0gb2YgdGhlIG1heGltdW0gd2luZG93CisgICBzaXplICh0aGUgc2l6ZSBvZiB0aGUgaGlzdG9yeSBidWZmZXIpLiAgSXQgc2hvdWxkIGJlIGluIHRoZSByYW5nZSA4Li4xNSBmb3IKKyAgIHRoaXMgdmVyc2lvbiBvZiB0aGUgbGlicmFyeS4gIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDE1IGlmIGluZmxhdGVJbml0IGlzIHVzZWQKKyAgIGluc3RlYWQuICB3aW5kb3dCaXRzIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSB3aW5kb3dCaXRzIHZhbHVlCisgICBwcm92aWRlZCB0byBkZWZsYXRlSW5pdDIoKSB3aGlsZSBjb21wcmVzc2luZywgb3IgaXQgbXVzdCBiZSBlcXVhbCB0byAxNSBpZgorICAgZGVmbGF0ZUluaXQyKCkgd2FzIG5vdCB1c2VkLiAgSWYgYSBjb21wcmVzc2VkIHN0cmVhbSB3aXRoIGEgbGFyZ2VyIHdpbmRvdworICAgc2l6ZSBpcyBnaXZlbiBhcyBpbnB1dCwgaW5mbGF0ZSgpIHdpbGwgcmV0dXJuIHdpdGggdGhlIGVycm9yIGNvZGUKKyAgIFpfREFUQV9FUlJPUiBpbnN0ZWFkIG9mIHRyeWluZyB0byBhbGxvY2F0ZSBhIGxhcmdlciB3aW5kb3cuCisKKyAgICAgd2luZG93Qml0cyBjYW4gYWxzbyBiZSB6ZXJvIHRvIHJlcXVlc3QgdGhhdCBpbmZsYXRlIHVzZSB0aGUgd2luZG93IHNpemUgaW4KKyAgIHRoZSB6bGliIGhlYWRlciBvZiB0aGUgY29tcHJlc3NlZCBzdHJlYW0uCisKKyAgICAgd2luZG93Qml0cyBjYW4gYWxzbyBiZSAtOC4uLTE1IGZvciByYXcgaW5mbGF0ZS4gIEluIHRoaXMgY2FzZSwgLXdpbmRvd0JpdHMKKyAgIGRldGVybWluZXMgdGhlIHdpbmRvdyBzaXplLiAgaW5mbGF0ZSgpIHdpbGwgdGhlbiBwcm9jZXNzIHJhdyBkZWZsYXRlIGRhdGEsCisgICBub3QgbG9va2luZyBmb3IgYSB6bGliIG9yIGd6aXAgaGVhZGVyLCBub3QgZ2VuZXJhdGluZyBhIGNoZWNrIHZhbHVlLCBhbmQgbm90CisgICBsb29raW5nIGZvciBhbnkgY2hlY2sgdmFsdWVzIGZvciBjb21wYXJpc29uIGF0IHRoZSBlbmQgb2YgdGhlIHN0cmVhbS4gIFRoaXMKKyAgIGlzIGZvciB1c2Ugd2l0aCBvdGhlciBmb3JtYXRzIHRoYXQgdXNlIHRoZSBkZWZsYXRlIGNvbXByZXNzZWQgZGF0YSBmb3JtYXQKKyAgIHN1Y2ggYXMgemlwLiAgVGhvc2UgZm9ybWF0cyBwcm92aWRlIHRoZWlyIG93biBjaGVjayB2YWx1ZXMuICBJZiBhIGN1c3RvbQorICAgZm9ybWF0IGlzIGRldmVsb3BlZCB1c2luZyB0aGUgcmF3IGRlZmxhdGUgZm9ybWF0IGZvciBjb21wcmVzc2VkIGRhdGEsIGl0IGlzCisgICByZWNvbW1lbmRlZCB0aGF0IGEgY2hlY2sgdmFsdWUgc3VjaCBhcyBhbiBhZGxlcjMyIG9yIGEgY3JjMzIgYmUgYXBwbGllZCB0bworICAgdGhlIHVuY29tcHJlc3NlZCBkYXRhIGFzIGlzIGRvbmUgaW4gdGhlIHpsaWIsIGd6aXAsIGFuZCB6aXAgZm9ybWF0cy4gIEZvcgorICAgbW9zdCBhcHBsaWNhdGlvbnMsIHRoZSB6bGliIGZvcm1hdCBzaG91bGQgYmUgdXNlZCBhcyBpcy4gIE5vdGUgdGhhdCBjb21tZW50cworICAgYWJvdmUgb24gdGhlIHVzZSBpbiBkZWZsYXRlSW5pdDIoKSBhcHBsaWVzIHRvIHRoZSBtYWduaXR1ZGUgb2Ygd2luZG93Qml0cy4KKworICAgICB3aW5kb3dCaXRzIGNhbiBhbHNvIGJlIGdyZWF0ZXIgdGhhbiAxNSBmb3Igb3B0aW9uYWwgZ3ppcCBkZWNvZGluZy4gIEFkZAorICAgMzIgdG8gd2luZG93Qml0cyB0byBlbmFibGUgemxpYiBhbmQgZ3ppcCBkZWNvZGluZyB3aXRoIGF1dG9tYXRpYyBoZWFkZXIKKyAgIGRldGVjdGlvbiwgb3IgYWRkIDE2IHRvIGRlY29kZSBvbmx5IHRoZSBnemlwIGZvcm1hdCAodGhlIHpsaWIgZm9ybWF0IHdpbGwKKyAgIHJldHVybiBhIFpfREFUQV9FUlJPUikuICBJZiBhIGd6aXAgc3RyZWFtIGlzIGJlaW5nIGRlY29kZWQsIHN0cm0tPmFkbGVyIGlzIGEKKyAgIGNyYzMyIGluc3RlYWQgb2YgYW4gYWRsZXIzMi4KKworICAgICBpbmZsYXRlSW5pdDIgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIFpfTUVNX0VSUk9SIGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoCisgICBtZW1vcnksIFpfVkVSU0lPTl9FUlJPUiBpZiB0aGUgemxpYiBsaWJyYXJ5IHZlcnNpb24gaXMgaW5jb21wYXRpYmxlIHdpdGggdGhlCisgICB2ZXJzaW9uIGFzc3VtZWQgYnkgdGhlIGNhbGxlciwgb3IgWl9TVFJFQU1fRVJST1IgaWYgdGhlIHBhcmFtZXRlcnMgYXJlCisgICBpbnZhbGlkLCBzdWNoIGFzIGEgbnVsbCBwb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUuICBtc2cgaXMgc2V0IHRvIG51bGwgaWYKKyAgIHRoZXJlIGlzIG5vIGVycm9yIG1lc3NhZ2UuICBpbmZsYXRlSW5pdDIgZG9lcyBub3QgcGVyZm9ybSBhbnkgZGVjb21wcmVzc2lvbgorICAgYXBhcnQgZnJvbSBwb3NzaWJseSByZWFkaW5nIHRoZSB6bGliIGhlYWRlciBpZiBwcmVzZW50OiBhY3R1YWwgZGVjb21wcmVzc2lvbgorICAgd2lsbCBiZSBkb25lIGJ5IGluZmxhdGUoKS4gIChTbyBuZXh0X2luIGFuZCBhdmFpbF9pbiBtYXkgYmUgbW9kaWZpZWQsIGJ1dAorICAgbmV4dF9vdXQgYW5kIGF2YWlsX291dCBhcmUgdW51c2VkIGFuZCB1bmNoYW5nZWQuKSBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbgorICAgb2YgaW5mbGF0ZUluaXQyKCkgZG9lcyBub3QgcHJvY2VzcyBhbnkgaGVhZGVyIGluZm9ybWF0aW9uIC0tIHRoYXQgaXMKKyAgIGRlZmVycmVkIHVudGlsIGluZmxhdGUoKSBpcyBjYWxsZWQuCisqLworCitaRVhURVJOIGludCBaRVhQT1JUIGluZmxhdGVTZXREaWN0aW9uYXJ5IE9GKCh6X3N0cmVhbXAgc3RybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVmICpkaWN0aW9uYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdUludCAgZGljdExlbmd0aCkpOworLyoKKyAgICAgSW5pdGlhbGl6ZXMgdGhlIGRlY29tcHJlc3Npb24gZGljdGlvbmFyeSBmcm9tIHRoZSBnaXZlbiB1bmNvbXByZXNzZWQgYnl0ZQorICAgc2VxdWVuY2UuICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGltbWVkaWF0ZWx5IGFmdGVyIGEgY2FsbCBvZiBpbmZsYXRlLAorICAgaWYgdGhhdCBjYWxsIHJldHVybmVkIFpfTkVFRF9ESUNULiAgVGhlIGRpY3Rpb25hcnkgY2hvc2VuIGJ5IHRoZSBjb21wcmVzc29yCisgICBjYW4gYmUgZGV0ZXJtaW5lZCBmcm9tIHRoZSBhZGxlcjMyIHZhbHVlIHJldHVybmVkIGJ5IHRoYXQgY2FsbCBvZiBpbmZsYXRlLgorICAgVGhlIGNvbXByZXNzb3IgYW5kIGRlY29tcHJlc3NvciBtdXN0IHVzZSBleGFjdGx5IHRoZSBzYW1lIGRpY3Rpb25hcnkgKHNlZQorICAgZGVmbGF0ZVNldERpY3Rpb25hcnkpLiAgRm9yIHJhdyBpbmZsYXRlLCB0aGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQgYXQgYW55CisgICB0aW1lIHRvIHNldCB0aGUgZGljdGlvbmFyeS4gIElmIHRoZSBwcm92aWRlZCBkaWN0aW9uYXJ5IGlzIHNtYWxsZXIgdGhhbiB0aGUKKyAgIHdpbmRvdyBhbmQgdGhlcmUgaXMgYWxyZWFkeSBkYXRhIGluIHRoZSB3aW5kb3csIHRoZW4gdGhlIHByb3ZpZGVkIGRpY3Rpb25hcnkKKyAgIHdpbGwgYW1lbmQgd2hhdCdzIHRoZXJlLiAgVGhlIGFwcGxpY2F0aW9uIG11c3QgaW5zdXJlIHRoYXQgdGhlIGRpY3Rpb25hcnkKKyAgIHRoYXQgd2FzIHVzZWQgZm9yIGNvbXByZXNzaW9uIGlzIHByb3ZpZGVkLgorCisgICAgIGluZmxhdGVTZXREaWN0aW9uYXJ5IHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBaX1NUUkVBTV9FUlJPUiBpZiBhCisgICBwYXJhbWV0ZXIgaXMgaW52YWxpZCAoZS5nLiAgZGljdGlvbmFyeSBiZWluZyBaX05VTEwpIG9yIHRoZSBzdHJlYW0gc3RhdGUgaXMKKyAgIGluY29uc2lzdGVudCwgWl9EQVRBX0VSUk9SIGlmIHRoZSBnaXZlbiBkaWN0aW9uYXJ5IGRvZXNuJ3QgbWF0Y2ggdGhlCisgICBleHBlY3RlZCBvbmUgKGluY29ycmVjdCBhZGxlcjMyIHZhbHVlKS4gIGluZmxhdGVTZXREaWN0aW9uYXJ5IGRvZXMgbm90CisgICBwZXJmb3JtIGFueSBkZWNvbXByZXNzaW9uOiB0aGlzIHdpbGwgYmUgZG9uZSBieSBzdWJzZXF1ZW50IGNhbGxzIG9mCisgICBpbmZsYXRlKCkuCisqLworCitaRVhURVJOIGludCBaRVhQT1JUIGluZmxhdGVTeW5jIE9GKCh6X3N0cmVhbXAgc3RybSkpOworLyoKKyAgICAgU2tpcHMgaW52YWxpZCBjb21wcmVzc2VkIGRhdGEgdW50aWwgYSBwb3NzaWJsZSBmdWxsIGZsdXNoIHBvaW50IChzZWUgYWJvdmUKKyAgIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgZGVmbGF0ZSB3aXRoIFpfRlVMTF9GTFVTSCkgY2FuIGJlIGZvdW5kLCBvciB1bnRpbCBhbGwKKyAgIGF2YWlsYWJsZSBpbnB1dCBpcyBza2lwcGVkLiAgTm8gb3V0cHV0IGlzIHByb3ZpZGVkLgorCisgICAgIGluZmxhdGVTeW5jIHNlYXJjaGVzIGZvciBhIDAwIDAwIEZGIEZGIHBhdHRlcm4gaW4gdGhlIGNvbXByZXNzZWQgZGF0YS4KKyAgIEFsbCBmdWxsIGZsdXNoIHBvaW50cyBoYXZlIHRoaXMgcGF0dGVybiwgYnV0IG5vdCBhbGwgb2NjdXJlbmNlcyBvZiB0aGlzCisgICBwYXR0ZXJuIGFyZSBmdWxsIGZsdXNoIHBvaW50cy4KKworICAgICBpbmZsYXRlU3luYyByZXR1cm5zIFpfT0sgaWYgYSBwb3NzaWJsZSBmdWxsIGZsdXNoIHBvaW50IGhhcyBiZWVuIGZvdW5kLAorICAgWl9CVUZfRVJST1IgaWYgbm8gbW9yZSBpbnB1dCB3YXMgcHJvdmlkZWQsIFpfREFUQV9FUlJPUiBpZiBubyBmbHVzaCBwb2ludAorICAgaGFzIGJlZW4gZm91bmQsIG9yIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzdHJlYW0gc3RydWN0dXJlIHdhcyBpbmNvbnNpc3RlbnQuCisgICBJbiB0aGUgc3VjY2VzcyBjYXNlLCB0aGUgYXBwbGljYXRpb24gbWF5IHNhdmUgdGhlIGN1cnJlbnQgY3VycmVudCB2YWx1ZSBvZgorICAgdG90YWxfaW4gd2hpY2ggaW5kaWNhdGVzIHdoZXJlIHZhbGlkIGNvbXByZXNzZWQgZGF0YSB3YXMgZm91bmQuICBJbiB0aGUKKyAgIGVycm9yIGNhc2UsIHRoZSBhcHBsaWNhdGlvbiBtYXkgcmVwZWF0ZWRseSBjYWxsIGluZmxhdGVTeW5jLCBwcm92aWRpbmcgbW9yZQorICAgaW5wdXQgZWFjaCB0aW1lLCB1bnRpbCBzdWNjZXNzIG9yIGVuZCBvZiB0aGUgaW5wdXQgZGF0YS4KKyovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgaW5mbGF0ZUNvcHkgT0YoKHpfc3RyZWFtcCBkZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgel9zdHJlYW1wIHNvdXJjZSkpOworLyoKKyAgICAgU2V0cyB0aGUgZGVzdGluYXRpb24gc3RyZWFtIGFzIGEgY29tcGxldGUgY29weSBvZiB0aGUgc291cmNlIHN0cmVhbS4KKworICAgICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VmdWwgd2hlbiByYW5kb21seSBhY2Nlc3NpbmcgYSBsYXJnZSBzdHJlYW0uICBUaGUKKyAgIGZpcnN0IHBhc3MgdGhyb3VnaCB0aGUgc3RyZWFtIGNhbiBwZXJpb2RpY2FsbHkgcmVjb3JkIHRoZSBpbmZsYXRlIHN0YXRlLAorICAgYWxsb3dpbmcgcmVzdGFydGluZyBpbmZsYXRlIGF0IHRob3NlIHBvaW50cyB3aGVuIHJhbmRvbWx5IGFjY2Vzc2luZyB0aGUKKyAgIHN0cmVhbS4KKworICAgICBpbmZsYXRlQ29weSByZXR1cm5zIFpfT0sgaWYgc3VjY2VzcywgWl9NRU1fRVJST1IgaWYgdGhlcmUgd2FzIG5vdAorICAgZW5vdWdoIG1lbW9yeSwgWl9TVFJFQU1fRVJST1IgaWYgdGhlIHNvdXJjZSBzdHJlYW0gc3RhdGUgd2FzIGluY29uc2lzdGVudAorICAgKHN1Y2ggYXMgemFsbG9jIGJlaW5nIFpfTlVMTCkuICBtc2cgaXMgbGVmdCB1bmNoYW5nZWQgaW4gYm90aCBzb3VyY2UgYW5kCisgICBkZXN0aW5hdGlvbi4KKyovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgaW5mbGF0ZVJlc2V0IE9GKCh6X3N0cmVhbXAgc3RybSkpOworLyoKKyAgICAgVGhpcyBmdW5jdGlvbiBpcyBlcXVpdmFsZW50IHRvIGluZmxhdGVFbmQgZm9sbG93ZWQgYnkgaW5mbGF0ZUluaXQsCisgICBidXQgZG9lcyBub3QgZnJlZSBhbmQgcmVhbGxvY2F0ZSBhbGwgdGhlIGludGVybmFsIGRlY29tcHJlc3Npb24gc3RhdGUuICBUaGUKKyAgIHN0cmVhbSB3aWxsIGtlZXAgYXR0cmlidXRlcyB0aGF0IG1heSBoYXZlIGJlZW4gc2V0IGJ5IGluZmxhdGVJbml0Mi4KKworICAgICBpbmZsYXRlUmVzZXQgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIG9yIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzb3VyY2UKKyAgIHN0cmVhbSBzdGF0ZSB3YXMgaW5jb25zaXN0ZW50IChzdWNoIGFzIHphbGxvYyBvciBzdGF0ZSBiZWluZyBaX05VTEwpLgorKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlUmVzZXQyIE9GKCh6X3N0cmVhbXAgc3RybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpbmRvd0JpdHMpKTsKKy8qCisgICAgIFRoaXMgZnVuY3Rpb24gaXMgdGhlIHNhbWUgYXMgaW5mbGF0ZVJlc2V0LCBidXQgaXQgYWxzbyBwZXJtaXRzIGNoYW5naW5nCisgICB0aGUgd3JhcCBhbmQgd2luZG93IHNpemUgcmVxdWVzdHMuICBUaGUgd2luZG93Qml0cyBwYXJhbWV0ZXIgaXMgaW50ZXJwcmV0ZWQKKyAgIHRoZSBzYW1lIGFzIGl0IGlzIGZvciBpbmZsYXRlSW5pdDIuCisKKyAgICAgaW5mbGF0ZVJlc2V0MiByZXR1cm5zIFpfT0sgaWYgc3VjY2Vzcywgb3IgWl9TVFJFQU1fRVJST1IgaWYgdGhlIHNvdXJjZQorICAgc3RyZWFtIHN0YXRlIHdhcyBpbmNvbnNpc3RlbnQgKHN1Y2ggYXMgemFsbG9jIG9yIHN0YXRlIGJlaW5nIFpfTlVMTCksIG9yIGlmCisgICB0aGUgd2luZG93Qml0cyBwYXJhbWV0ZXIgaXMgaW52YWxpZC4KKyovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgaW5mbGF0ZVByaW1lIE9GKCh6X3N0cmVhbXAgc3RybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdmFsdWUpKTsKKy8qCisgICAgIFRoaXMgZnVuY3Rpb24gaW5zZXJ0cyBiaXRzIGluIHRoZSBpbmZsYXRlIGlucHV0IHN0cmVhbS4gIFRoZSBpbnRlbnQgaXMKKyAgIHRoYXQgdGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHN0YXJ0IGluZmxhdGluZyBhdCBhIGJpdCBwb3NpdGlvbiBpbiB0aGUKKyAgIG1pZGRsZSBvZiBhIGJ5dGUuICBUaGUgcHJvdmlkZWQgYml0cyB3aWxsIGJlIHVzZWQgYmVmb3JlIGFueSBieXRlcyBhcmUgdXNlZAorICAgZnJvbSBuZXh0X2luLiAgVGhpcyBmdW5jdGlvbiBzaG91bGQgb25seSBiZSB1c2VkIHdpdGggcmF3IGluZmxhdGUsIGFuZAorICAgc2hvdWxkIGJlIHVzZWQgYmVmb3JlIHRoZSBmaXJzdCBpbmZsYXRlKCkgY2FsbCBhZnRlciBpbmZsYXRlSW5pdDIoKSBvcgorICAgaW5mbGF0ZVJlc2V0KCkuICBiaXRzIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDE2LCBhbmQgdGhhdCBtYW55IG9mIHRoZQorICAgbGVhc3Qgc2lnbmlmaWNhbnQgYml0cyBvZiB2YWx1ZSB3aWxsIGJlIGluc2VydGVkIGluIHRoZSBpbnB1dC4KKworICAgICBJZiBiaXRzIGlzIG5lZ2F0aXZlLCB0aGVuIHRoZSBpbnB1dCBzdHJlYW0gYml0IGJ1ZmZlciBpcyBlbXB0aWVkLiAgVGhlbgorICAgaW5mbGF0ZVByaW1lKCkgY2FuIGJlIGNhbGxlZCBhZ2FpbiB0byBwdXQgYml0cyBpbiB0aGUgYnVmZmVyLiAgVGhpcyBpcyB1c2VkCisgICB0byBjbGVhciBvdXQgYml0cyBsZWZ0b3ZlciBhZnRlciBmZWVkaW5nIGluZmxhdGUgYSBibG9jayBkZXNjcmlwdGlvbiBwcmlvcgorICAgdG8gZmVlZGluZyBpbmZsYXRlIGNvZGVzLgorCisgICAgIGluZmxhdGVQcmltZSByZXR1cm5zIFpfT0sgaWYgc3VjY2Vzcywgb3IgWl9TVFJFQU1fRVJST1IgaWYgdGhlIHNvdXJjZQorICAgc3RyZWFtIHN0YXRlIHdhcyBpbmNvbnNpc3RlbnQuCisqLworCitaRVhURVJOIGxvbmcgWkVYUE9SVCBpbmZsYXRlTWFyayBPRigoel9zdHJlYW1wIHN0cm0pKTsKKy8qCisgICAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0d28gdmFsdWVzLCBvbmUgaW4gdGhlIGxvd2VyIDE2IGJpdHMgb2YgdGhlIHJldHVybgorICAgdmFsdWUsIGFuZCB0aGUgb3RoZXIgaW4gdGhlIHJlbWFpbmluZyB1cHBlciBiaXRzLCBvYnRhaW5lZCBieSBzaGlmdGluZyB0aGUKKyAgIHJldHVybiB2YWx1ZSBkb3duIDE2IGJpdHMuICBJZiB0aGUgdXBwZXIgdmFsdWUgaXMgLTEgYW5kIHRoZSBsb3dlciB2YWx1ZSBpcworICAgemVybywgdGhlbiBpbmZsYXRlKCkgaXMgY3VycmVudGx5IGRlY29kaW5nIGluZm9ybWF0aW9uIG91dHNpZGUgb2YgYSBibG9jay4KKyAgIElmIHRoZSB1cHBlciB2YWx1ZSBpcyAtMSBhbmQgdGhlIGxvd2VyIHZhbHVlIGlzIG5vbi16ZXJvLCB0aGVuIGluZmxhdGUgaXMgaW4KKyAgIHRoZSBtaWRkbGUgb2YgYSBzdG9yZWQgYmxvY2ssIHdpdGggdGhlIGxvd2VyIHZhbHVlIGVxdWFsaW5nIHRoZSBudW1iZXIgb2YKKyAgIGJ5dGVzIGZyb20gdGhlIGlucHV0IHJlbWFpbmluZyB0byBjb3B5LiAgSWYgdGhlIHVwcGVyIHZhbHVlIGlzIG5vdCAtMSwgdGhlbgorICAgaXQgaXMgdGhlIG51bWJlciBvZiBiaXRzIGJhY2sgZnJvbSB0aGUgY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGlucHV0IG9mCisgICB0aGUgY29kZSAobGl0ZXJhbCBvciBsZW5ndGgvZGlzdGFuY2UgcGFpcikgY3VycmVudGx5IGJlaW5nIHByb2Nlc3NlZC4gIEluCisgICB0aGF0IGNhc2UgdGhlIGxvd2VyIHZhbHVlIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgYWxyZWFkeSBlbWl0dGVkIGZvciB0aGF0CisgICBjb2RlLgorCisgICAgIEEgY29kZSBpcyBiZWluZyBwcm9jZXNzZWQgaWYgaW5mbGF0ZSBpcyB3YWl0aW5nIGZvciBtb3JlIGlucHV0IHRvIGNvbXBsZXRlCisgICBkZWNvZGluZyBvZiB0aGUgY29kZSwgb3IgaWYgaXQgaGFzIGNvbXBsZXRlZCBkZWNvZGluZyBidXQgaXMgd2FpdGluZyBmb3IKKyAgIG1vcmUgb3V0cHV0IHNwYWNlIHRvIHdyaXRlIHRoZSBsaXRlcmFsIG9yIG1hdGNoIGRhdGEuCisKKyAgICAgaW5mbGF0ZU1hcmsoKSBpcyB1c2VkIHRvIG1hcmsgbG9jYXRpb25zIGluIHRoZSBpbnB1dCBkYXRhIGZvciByYW5kb20KKyAgIGFjY2Vzcywgd2hpY2ggbWF5IGJlIGF0IGJpdCBwb3NpdGlvbnMsIGFuZCB0byBub3RlIHRob3NlIGNhc2VzIHdoZXJlIHRoZQorICAgb3V0cHV0IG9mIGEgY29kZSBtYXkgc3BhbiBib3VuZGFyaWVzIG9mIHJhbmRvbSBhY2Nlc3MgYmxvY2tzLiAgVGhlIGN1cnJlbnQKKyAgIGxvY2F0aW9uIGluIHRoZSBpbnB1dCBzdHJlYW0gY2FuIGJlIGRldGVybWluZWQgZnJvbSBhdmFpbF9pbiBhbmQgZGF0YV90eXBlCisgICBhcyBub3RlZCBpbiB0aGUgZGVzY3JpcHRpb24gZm9yIHRoZSBaX0JMT0NLIGZsdXNoIHBhcmFtZXRlciBmb3IgaW5mbGF0ZS4KKworICAgICBpbmZsYXRlTWFyayByZXR1cm5zIHRoZSB2YWx1ZSBub3RlZCBhYm92ZSBvciAtMSA8PCAxNiBpZiB0aGUgcHJvdmlkZWQKKyAgIHNvdXJjZSBzdHJlYW0gc3RhdGUgd2FzIGluY29uc2lzdGVudC4KKyovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgaW5mbGF0ZUdldEhlYWRlciBPRigoel9zdHJlYW1wIHN0cm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd6X2hlYWRlcnAgaGVhZCkpOworLyoKKyAgICAgaW5mbGF0ZUdldEhlYWRlcigpIHJlcXVlc3RzIHRoYXQgZ3ppcCBoZWFkZXIgaW5mb3JtYXRpb24gYmUgc3RvcmVkIGluIHRoZQorICAgcHJvdmlkZWQgZ3pfaGVhZGVyIHN0cnVjdHVyZS4gIGluZmxhdGVHZXRIZWFkZXIoKSBtYXkgYmUgY2FsbGVkIGFmdGVyCisgICBpbmZsYXRlSW5pdDIoKSBvciBpbmZsYXRlUmVzZXQoKSwgYW5kIGJlZm9yZSB0aGUgZmlyc3QgY2FsbCBvZiBpbmZsYXRlKCkuCisgICBBcyBpbmZsYXRlKCkgcHJvY2Vzc2VzIHRoZSBnemlwIHN0cmVhbSwgaGVhZC0+ZG9uZSBpcyB6ZXJvIHVudGlsIHRoZSBoZWFkZXIKKyAgIGlzIGNvbXBsZXRlZCwgYXQgd2hpY2ggdGltZSBoZWFkLT5kb25lIGlzIHNldCB0byBvbmUuICBJZiBhIHpsaWIgc3RyZWFtIGlzCisgICBiZWluZyBkZWNvZGVkLCB0aGVuIGhlYWQtPmRvbmUgaXMgc2V0IHRvIC0xIHRvIGluZGljYXRlIHRoYXQgdGhlcmUgd2lsbCBiZQorICAgbm8gZ3ppcCBoZWFkZXIgaW5mb3JtYXRpb24gZm9ydGhjb21pbmcuICBOb3RlIHRoYXQgWl9CTE9DSyBvciBaX1RSRUVTIGNhbiBiZQorICAgdXNlZCB0byBmb3JjZSBpbmZsYXRlKCkgdG8gcmV0dXJuIGltbWVkaWF0ZWx5IGFmdGVyIGhlYWRlciBwcm9jZXNzaW5nIGlzCisgICBjb21wbGV0ZSBhbmQgYmVmb3JlIGFueSBhY3R1YWwgZGF0YSBpcyBkZWNvbXByZXNzZWQuCisKKyAgICAgVGhlIHRleHQsIHRpbWUsIHhmbGFncywgYW5kIG9zIGZpZWxkcyBhcmUgZmlsbGVkIGluIHdpdGggdGhlIGd6aXAgaGVhZGVyCisgICBjb250ZW50cy4gIGhjcmMgaXMgc2V0IHRvIHRydWUgaWYgdGhlcmUgaXMgYSBoZWFkZXIgQ1JDLiAgKFRoZSBoZWFkZXIgQ1JDCisgICB3YXMgdmFsaWQgaWYgZG9uZSBpcyBzZXQgdG8gb25lLikgSWYgZXh0cmEgaXMgbm90IFpfTlVMTCwgdGhlbiBleHRyYV9tYXgKKyAgIGNvbnRhaW5zIHRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byB3cml0ZSB0byBleHRyYS4gIE9uY2UgZG9uZSBpcyB0cnVlLAorICAgZXh0cmFfbGVuIGNvbnRhaW5zIHRoZSBhY3R1YWwgZXh0cmEgZmllbGQgbGVuZ3RoLCBhbmQgZXh0cmEgY29udGFpbnMgdGhlCisgICBleHRyYSBmaWVsZCwgb3IgdGhhdCBmaWVsZCB0cnVuY2F0ZWQgaWYgZXh0cmFfbWF4IGlzIGxlc3MgdGhhbiBleHRyYV9sZW4uCisgICBJZiBuYW1lIGlzIG5vdCBaX05VTEwsIHRoZW4gdXAgdG8gbmFtZV9tYXggY2hhcmFjdGVycyBhcmUgd3JpdHRlbiB0aGVyZSwKKyAgIHRlcm1pbmF0ZWQgd2l0aCBhIHplcm8gdW5sZXNzIHRoZSBsZW5ndGggaXMgZ3JlYXRlciB0aGFuIG5hbWVfbWF4LiAgSWYKKyAgIGNvbW1lbnQgaXMgbm90IFpfTlVMTCwgdGhlbiB1cCB0byBjb21tX21heCBjaGFyYWN0ZXJzIGFyZSB3cml0dGVuIHRoZXJlLAorICAgdGVybWluYXRlZCB3aXRoIGEgemVybyB1bmxlc3MgdGhlIGxlbmd0aCBpcyBncmVhdGVyIHRoYW4gY29tbV9tYXguICBXaGVuIGFueQorICAgb2YgZXh0cmEsIG5hbWUsIG9yIGNvbW1lbnQgYXJlIG5vdCBaX05VTEwgYW5kIHRoZSByZXNwZWN0aXZlIGZpZWxkIGlzIG5vdAorICAgcHJlc2VudCBpbiB0aGUgaGVhZGVyLCB0aGVuIHRoYXQgZmllbGQgaXMgc2V0IHRvIFpfTlVMTCB0byBzaWduYWwgaXRzCisgICBhYnNlbmNlLiAgVGhpcyBhbGxvd3MgdGhlIHVzZSBvZiBkZWZsYXRlU2V0SGVhZGVyKCkgd2l0aCB0aGUgcmV0dXJuZWQKKyAgIHN0cnVjdHVyZSB0byBkdXBsaWNhdGUgdGhlIGhlYWRlci4gIEhvd2V2ZXIgaWYgdGhvc2UgZmllbGRzIGFyZSBzZXQgdG8KKyAgIGFsbG9jYXRlZCBtZW1vcnksIHRoZW4gdGhlIGFwcGxpY2F0aW9uIHdpbGwgbmVlZCB0byBzYXZlIHRob3NlIHBvaW50ZXJzCisgICBlbHNld2hlcmUgc28gdGhhdCB0aGV5IGNhbiBiZSBldmVudHVhbGx5IGZyZWVkLgorCisgICAgIElmIGluZmxhdGVHZXRIZWFkZXIgaXMgbm90IHVzZWQsIHRoZW4gdGhlIGhlYWRlciBpbmZvcm1hdGlvbiBpcyBzaW1wbHkKKyAgIGRpc2NhcmRlZC4gIFRoZSBoZWFkZXIgaXMgYWx3YXlzIGNoZWNrZWQgZm9yIHZhbGlkaXR5LCBpbmNsdWRpbmcgdGhlIGhlYWRlcgorICAgQ1JDIGlmIHByZXNlbnQuICBpbmZsYXRlUmVzZXQoKSB3aWxsIHJlc2V0IHRoZSBwcm9jZXNzIHRvIGRpc2NhcmQgdGhlIGhlYWRlcgorICAgaW5mb3JtYXRpb24uICBUaGUgYXBwbGljYXRpb24gd291bGQgbmVlZCB0byBjYWxsIGluZmxhdGVHZXRIZWFkZXIoKSBhZ2FpbiB0bworICAgcmV0cmlldmUgdGhlIGhlYWRlciBmcm9tIHRoZSBuZXh0IGd6aXAgc3RyZWFtLgorCisgICAgIGluZmxhdGVHZXRIZWFkZXIgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIG9yIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzb3VyY2UKKyAgIHN0cmVhbSBzdGF0ZSB3YXMgaW5jb25zaXN0ZW50LgorKi8KKworLyoKK1pFWFRFUk4gaW50IFpFWFBPUlQgaW5mbGF0ZUJhY2tJbml0IE9GKCh6X3N0cmVhbXAgc3RybSwgaW50IHdpbmRvd0JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBGQVIgKndpbmRvdykpOworCisgICAgIEluaXRpYWxpemUgdGhlIGludGVybmFsIHN0cmVhbSBzdGF0ZSBmb3IgZGVjb21wcmVzc2lvbiB1c2luZyBpbmZsYXRlQmFjaygpCisgICBjYWxscy4gIFRoZSBmaWVsZHMgemFsbG9jLCB6ZnJlZSBhbmQgb3BhcXVlIGluIHN0cm0gbXVzdCBiZSBpbml0aWFsaXplZAorICAgYmVmb3JlIHRoZSBjYWxsLiAgSWYgemFsbG9jIGFuZCB6ZnJlZSBhcmUgWl9OVUxMLCB0aGVuIHRoZSBkZWZhdWx0IGxpYnJhcnktCisgICBkZXJpdmVkIG1lbW9yeSBhbGxvY2F0aW9uIHJvdXRpbmVzIGFyZSB1c2VkLiAgd2luZG93Qml0cyBpcyB0aGUgYmFzZSB0d28KKyAgIGxvZ2FyaXRobSBvZiB0aGUgd2luZG93IHNpemUsIGluIHRoZSByYW5nZSA4Li4xNS4gIHdpbmRvdyBpcyBhIGNhbGxlcgorICAgc3VwcGxpZWQgYnVmZmVyIG9mIHRoYXQgc2l6ZS4gIEV4Y2VwdCBmb3Igc3BlY2lhbCBhcHBsaWNhdGlvbnMgd2hlcmUgaXQgaXMKKyAgIGFzc3VyZWQgdGhhdCBkZWZsYXRlIHdhcyB1c2VkIHdpdGggc21hbGwgd2luZG93IHNpemVzLCB3aW5kb3dCaXRzIG11c3QgYmUgMTUKKyAgIGFuZCBhIDMySyBieXRlIHdpbmRvdyBtdXN0IGJlIHN1cHBsaWVkIHRvIGJlIGFibGUgdG8gZGVjb21wcmVzcyBnZW5lcmFsCisgICBkZWZsYXRlIHN0cmVhbXMuCisKKyAgICAgU2VlIGluZmxhdGVCYWNrKCkgZm9yIHRoZSB1c2FnZSBvZiB0aGVzZSByb3V0aW5lcy4KKworICAgICBpbmZsYXRlQmFja0luaXQgd2lsbCByZXR1cm4gWl9PSyBvbiBzdWNjZXNzLCBaX1NUUkVBTV9FUlJPUiBpZiBhbnkgb2YKKyAgIHRoZSBwYXJhbWV0ZXJzIGFyZSBpbnZhbGlkLCBaX01FTV9FUlJPUiBpZiB0aGUgaW50ZXJuYWwgc3RhdGUgY291bGQgbm90IGJlCisgICBhbGxvY2F0ZWQsIG9yIFpfVkVSU0lPTl9FUlJPUiBpZiB0aGUgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSBkb2VzIG5vdCBtYXRjaAorICAgdGhlIHZlcnNpb24gb2YgdGhlIGhlYWRlciBmaWxlLgorKi8KKwordHlwZWRlZiB1bnNpZ25lZCAoKmluX2Z1bmMpIE9GKCh2b2lkIEZBUiAqLCB1bnNpZ25lZCBjaGFyIEZBUiAqIEZBUiAqKSk7Cit0eXBlZGVmIGludCAoKm91dF9mdW5jKSBPRigodm9pZCBGQVIgKiwgdW5zaWduZWQgY2hhciBGQVIgKiwgdW5zaWduZWQpKTsKKworWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlQmFjayBPRigoel9zdHJlYW1wIHN0cm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbl9mdW5jIGluLCB2b2lkIEZBUiAqaW5fZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dF9mdW5jIG91dCwgdm9pZCBGQVIgKm91dF9kZXNjKSk7CisvKgorICAgICBpbmZsYXRlQmFjaygpIGRvZXMgYSByYXcgaW5mbGF0ZSB3aXRoIGEgc2luZ2xlIGNhbGwgdXNpbmcgYSBjYWxsLWJhY2sKKyAgIGludGVyZmFjZSBmb3IgaW5wdXQgYW5kIG91dHB1dC4gIFRoaXMgaXMgbW9yZSBlZmZpY2llbnQgdGhhbiBpbmZsYXRlKCkgZm9yCisgICBmaWxlIGkvbyBhcHBsaWNhdGlvbnMgaW4gdGhhdCBpdCBhdm9pZHMgY29weWluZyBiZXR3ZWVuIHRoZSBvdXRwdXQgYW5kIHRoZQorICAgc2xpZGluZyB3aW5kb3cgYnkgc2ltcGx5IG1ha2luZyB0aGUgd2luZG93IGl0c2VsZiB0aGUgb3V0cHV0IGJ1ZmZlci4gIFRoaXMKKyAgIGZ1bmN0aW9uIHRydXN0cyB0aGUgYXBwbGljYXRpb24gdG8gbm90IGNoYW5nZSB0aGUgb3V0cHV0IGJ1ZmZlciBwYXNzZWQgYnkKKyAgIHRoZSBvdXRwdXQgZnVuY3Rpb24sIGF0IGxlYXN0IHVudGlsIGluZmxhdGVCYWNrKCkgcmV0dXJucy4KKworICAgICBpbmZsYXRlQmFja0luaXQoKSBtdXN0IGJlIGNhbGxlZCBmaXJzdCB0byBhbGxvY2F0ZSB0aGUgaW50ZXJuYWwgc3RhdGUKKyAgIGFuZCB0byBpbml0aWFsaXplIHRoZSBzdGF0ZSB3aXRoIHRoZSB1c2VyLXByb3ZpZGVkIHdpbmRvdyBidWZmZXIuCisgICBpbmZsYXRlQmFjaygpIG1heSB0aGVuIGJlIHVzZWQgbXVsdGlwbGUgdGltZXMgdG8gaW5mbGF0ZSBhIGNvbXBsZXRlLCByYXcKKyAgIGRlZmxhdGUgc3RyZWFtIHdpdGggZWFjaCBjYWxsLiAgaW5mbGF0ZUJhY2tFbmQoKSBpcyB0aGVuIGNhbGxlZCB0byBmcmVlIHRoZQorICAgYWxsb2NhdGVkIHN0YXRlLgorCisgICAgIEEgcmF3IGRlZmxhdGUgc3RyZWFtIGlzIG9uZSB3aXRoIG5vIHpsaWIgb3IgZ3ppcCBoZWFkZXIgb3IgdHJhaWxlci4KKyAgIFRoaXMgcm91dGluZSB3b3VsZCBub3JtYWxseSBiZSB1c2VkIGluIGEgdXRpbGl0eSB0aGF0IHJlYWRzIHppcCBvciBnemlwCisgICBmaWxlcyBhbmQgd3JpdGVzIG91dCB1bmNvbXByZXNzZWQgZmlsZXMuICBUaGUgdXRpbGl0eSB3b3VsZCBkZWNvZGUgdGhlCisgICBoZWFkZXIgYW5kIHByb2Nlc3MgdGhlIHRyYWlsZXIgb24gaXRzIG93biwgaGVuY2UgdGhpcyByb3V0aW5lIGV4cGVjdHMgb25seQorICAgdGhlIHJhdyBkZWZsYXRlIHN0cmVhbSB0byBkZWNvbXByZXNzLiAgVGhpcyBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgbm9ybWFsCisgICBiZWhhdmlvciBvZiBpbmZsYXRlKCksIHdoaWNoIGV4cGVjdHMgZWl0aGVyIGEgemxpYiBvciBnemlwIGhlYWRlciBhbmQKKyAgIHRyYWlsZXIgYXJvdW5kIHRoZSBkZWZsYXRlIHN0cmVhbS4KKworICAgICBpbmZsYXRlQmFjaygpIHVzZXMgdHdvIHN1YnJvdXRpbmVzIHN1cHBsaWVkIGJ5IHRoZSBjYWxsZXIgdGhhdCBhcmUgdGhlbgorICAgY2FsbGVkIGJ5IGluZmxhdGVCYWNrKCkgZm9yIGlucHV0IGFuZCBvdXRwdXQuICBpbmZsYXRlQmFjaygpIGNhbGxzIHRob3NlCisgICByb3V0aW5lcyB1bnRpbCBpdCByZWFkcyBhIGNvbXBsZXRlIGRlZmxhdGUgc3RyZWFtIGFuZCB3cml0ZXMgb3V0IGFsbCBvZiB0aGUKKyAgIHVuY29tcHJlc3NlZCBkYXRhLCBvciB1bnRpbCBpdCBlbmNvdW50ZXJzIGFuIGVycm9yLiAgVGhlIGZ1bmN0aW9uJ3MKKyAgIHBhcmFtZXRlcnMgYW5kIHJldHVybiB0eXBlcyBhcmUgZGVmaW5lZCBhYm92ZSBpbiB0aGUgaW5fZnVuYyBhbmQgb3V0X2Z1bmMKKyAgIHR5cGVkZWZzLiAgaW5mbGF0ZUJhY2soKSB3aWxsIGNhbGwgaW4oaW5fZGVzYywgJmJ1Zikgd2hpY2ggc2hvdWxkIHJldHVybiB0aGUKKyAgIG51bWJlciBvZiBieXRlcyBvZiBwcm92aWRlZCBpbnB1dCwgYW5kIGEgcG9pbnRlciB0byB0aGF0IGlucHV0IGluIGJ1Zi4gIElmCisgICB0aGVyZSBpcyBubyBpbnB1dCBhdmFpbGFibGUsIGluKCkgbXVzdCByZXR1cm4gemVyby0tYnVmIGlzIGlnbm9yZWQgaW4gdGhhdAorICAgY2FzZS0tYW5kIGluZmxhdGVCYWNrKCkgd2lsbCByZXR1cm4gYSBidWZmZXIgZXJyb3IuICBpbmZsYXRlQmFjaygpIHdpbGwgY2FsbAorICAgb3V0KG91dF9kZXNjLCBidWYsIGxlbikgdG8gd3JpdGUgdGhlIHVuY29tcHJlc3NlZCBkYXRhIGJ1ZlswLi5sZW4tMV0uICBvdXQoKQorICAgc2hvdWxkIHJldHVybiB6ZXJvIG9uIHN1Y2Nlc3MsIG9yIG5vbi16ZXJvIG9uIGZhaWx1cmUuICBJZiBvdXQoKSByZXR1cm5zCisgICBub24temVybywgaW5mbGF0ZUJhY2soKSB3aWxsIHJldHVybiB3aXRoIGFuIGVycm9yLiAgTmVpdGhlciBpbigpIG5vciBvdXQoKQorICAgYXJlIHBlcm1pdHRlZCB0byBjaGFuZ2UgdGhlIGNvbnRlbnRzIG9mIHRoZSB3aW5kb3cgcHJvdmlkZWQgdG8KKyAgIGluZmxhdGVCYWNrSW5pdCgpLCB3aGljaCBpcyBhbHNvIHRoZSBidWZmZXIgdGhhdCBvdXQoKSB1c2VzIHRvIHdyaXRlIGZyb20uCisgICBUaGUgbGVuZ3RoIHdyaXR0ZW4gYnkgb3V0KCkgd2lsbCBiZSBhdCBtb3N0IHRoZSB3aW5kb3cgc2l6ZS4gIEFueSBub24temVybworICAgYW1vdW50IG9mIGlucHV0IG1heSBiZSBwcm92aWRlZCBieSBpbigpLgorCisgICAgIEZvciBjb252ZW5pZW5jZSwgaW5mbGF0ZUJhY2soKSBjYW4gYmUgcHJvdmlkZWQgaW5wdXQgb24gdGhlIGZpcnN0IGNhbGwgYnkKKyAgIHNldHRpbmcgc3RybS0+bmV4dF9pbiBhbmQgc3RybS0+YXZhaWxfaW4uICBJZiB0aGF0IGlucHV0IGlzIGV4aGF1c3RlZCwgdGhlbgorICAgaW4oKSB3aWxsIGJlIGNhbGxlZC4gIFRoZXJlZm9yZSBzdHJtLT5uZXh0X2luIG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlCisgICBjYWxsaW5nIGluZmxhdGVCYWNrKCkuICBJZiBzdHJtLT5uZXh0X2luIGlzIFpfTlVMTCwgdGhlbiBpbigpIHdpbGwgYmUgY2FsbGVkCisgICBpbW1lZGlhdGVseSBmb3IgaW5wdXQuICBJZiBzdHJtLT5uZXh0X2luIGlzIG5vdCBaX05VTEwsIHRoZW4gc3RybS0+YXZhaWxfaW4KKyAgIG11c3QgYWxzbyBiZSBpbml0aWFsaXplZCwgYW5kIHRoZW4gaWYgc3RybS0+YXZhaWxfaW4gaXMgbm90IHplcm8sIGlucHV0IHdpbGwKKyAgIGluaXRpYWxseSBiZSB0YWtlbiBmcm9tIHN0cm0tPm5leHRfaW5bMCAuLiAgc3RybS0+YXZhaWxfaW4gLSAxXS4KKworICAgICBUaGUgaW5fZGVzYyBhbmQgb3V0X2Rlc2MgcGFyYW1ldGVycyBvZiBpbmZsYXRlQmFjaygpIGlzIHBhc3NlZCBhcyB0aGUKKyAgIGZpcnN0IHBhcmFtZXRlciBvZiBpbigpIGFuZCBvdXQoKSByZXNwZWN0aXZlbHkgd2hlbiB0aGV5IGFyZSBjYWxsZWQuICBUaGVzZQorICAgZGVzY3JpcHRvcnMgY2FuIGJlIG9wdGlvbmFsbHkgdXNlZCB0byBwYXNzIGFueSBpbmZvcm1hdGlvbiB0aGF0IHRoZSBjYWxsZXItCisgICBzdXBwbGllZCBpbigpIGFuZCBvdXQoKSBmdW5jdGlvbnMgbmVlZCB0byBkbyB0aGVpciBqb2IuCisKKyAgICAgT24gcmV0dXJuLCBpbmZsYXRlQmFjaygpIHdpbGwgc2V0IHN0cm0tPm5leHRfaW4gYW5kIHN0cm0tPmF2YWlsX2luIHRvCisgICBwYXNzIGJhY2sgYW55IHVudXNlZCBpbnB1dCB0aGF0IHdhcyBwcm92aWRlZCBieSB0aGUgbGFzdCBpbigpIGNhbGwuICBUaGUKKyAgIHJldHVybiB2YWx1ZXMgb2YgaW5mbGF0ZUJhY2soKSBjYW4gYmUgWl9TVFJFQU1fRU5EIG9uIHN1Y2Nlc3MsIFpfQlVGX0VSUk9SCisgICBpZiBpbigpIG9yIG91dCgpIHJldHVybmVkIGFuIGVycm9yLCBaX0RBVEFfRVJST1IgaWYgdGhlcmUgd2FzIGEgZm9ybWF0IGVycm9yCisgICBpbiB0aGUgZGVmbGF0ZSBzdHJlYW0gKGluIHdoaWNoIGNhc2Ugc3RybS0+bXNnIGlzIHNldCB0byBpbmRpY2F0ZSB0aGUgbmF0dXJlCisgICBvZiB0aGUgZXJyb3IpLCBvciBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgc3RyZWFtIHdhcyBub3QgcHJvcGVybHkgaW5pdGlhbGl6ZWQuCisgICBJbiB0aGUgY2FzZSBvZiBaX0JVRl9FUlJPUiwgYW4gaW5wdXQgb3Igb3V0cHV0IGVycm9yIGNhbiBiZSBkaXN0aW5ndWlzaGVkCisgICB1c2luZyBzdHJtLT5uZXh0X2luIHdoaWNoIHdpbGwgYmUgWl9OVUxMIG9ubHkgaWYgaW4oKSByZXR1cm5lZCBhbiBlcnJvci4gIElmCisgICBzdHJtLT5uZXh0X2luIGlzIG5vdCBaX05VTEwsIHRoZW4gdGhlIFpfQlVGX0VSUk9SIHdhcyBkdWUgdG8gb3V0KCkgcmV0dXJuaW5nCisgICBub24temVyby4gIChpbigpIHdpbGwgYWx3YXlzIGJlIGNhbGxlZCBiZWZvcmUgb3V0KCksIHNvIHN0cm0tPm5leHRfaW4gaXMKKyAgIGFzc3VyZWQgdG8gYmUgZGVmaW5lZCBpZiBvdXQoKSByZXR1cm5zIG5vbi16ZXJvLikgTm90ZSB0aGF0IGluZmxhdGVCYWNrKCkKKyAgIGNhbm5vdCByZXR1cm4gWl9PSy4KKyovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgaW5mbGF0ZUJhY2tFbmQgT0YoKHpfc3RyZWFtcCBzdHJtKSk7CisvKgorICAgICBBbGwgbWVtb3J5IGFsbG9jYXRlZCBieSBpbmZsYXRlQmFja0luaXQoKSBpcyBmcmVlZC4KKworICAgICBpbmZsYXRlQmFja0VuZCgpIHJldHVybnMgWl9PSyBvbiBzdWNjZXNzLCBvciBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgc3RyZWFtCisgICBzdGF0ZSB3YXMgaW5jb25zaXN0ZW50LgorKi8KKworWkVYVEVSTiB1TG9uZyBaRVhQT1JUIHpsaWJDb21waWxlRmxhZ3MgT0YoKHZvaWQpKTsKKy8qIFJldHVybiBmbGFncyBpbmRpY2F0aW5nIGNvbXBpbGUtdGltZSBvcHRpb25zLgorCisgICAgVHlwZSBzaXplcywgdHdvIGJpdHMgZWFjaCwgMDAgPSAxNiBiaXRzLCAwMSA9IDMyLCAxMCA9IDY0LCAxMSA9IG90aGVyOgorICAgICAxLjA6IHNpemUgb2YgdUludAorICAgICAzLjI6IHNpemUgb2YgdUxvbmcKKyAgICAgNS40OiBzaXplIG9mIHZvaWRwZiAocG9pbnRlcikKKyAgICAgNy42OiBzaXplIG9mIHpfb2ZmX3QKKworICAgIENvbXBpbGVyLCBhc3NlbWJsZXIsIGFuZCBkZWJ1ZyBvcHRpb25zOgorICAgICA4OiBERUJVRworICAgICA5OiBBU01WIG9yIEFTTUlORiAtLSB1c2UgQVNNIGNvZGUKKyAgICAgMTA6IFpMSUJfV0lOQVBJIC0tIGV4cG9ydGVkIGZ1bmN0aW9ucyB1c2UgdGhlIFdJTkFQSSBjYWxsaW5nIGNvbnZlbnRpb24KKyAgICAgMTE6IDAgKHJlc2VydmVkKQorCisgICAgT25lLXRpbWUgdGFibGUgYnVpbGRpbmcgKHNtYWxsZXIgY29kZSwgYnV0IG5vdCB0aHJlYWQtc2FmZSBpZiB0cnVlKToKKyAgICAgMTI6IEJVSUxERklYRUQgLS0gYnVpbGQgc3RhdGljIGJsb2NrIGRlY29kaW5nIHRhYmxlcyB3aGVuIG5lZWRlZAorICAgICAxMzogRFlOQU1JQ19DUkNfVEFCTEUgLS0gYnVpbGQgQ1JDIGNhbGN1bGF0aW9uIHRhYmxlcyB3aGVuIG5lZWRlZAorICAgICAxNCwxNTogMCAocmVzZXJ2ZWQpCisKKyAgICBMaWJyYXJ5IGNvbnRlbnQgKGluZGljYXRlcyBtaXNzaW5nIGZ1bmN0aW9uYWxpdHkpOgorICAgICAxNjogTk9fR1pDT01QUkVTUyAtLSBneiogZnVuY3Rpb25zIGNhbm5vdCBjb21wcmVzcyAodG8gYXZvaWQgbGlua2luZworICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZsYXRlIGNvZGUgd2hlbiBub3QgbmVlZGVkKQorICAgICAxNzogTk9fR1pJUCAtLSBkZWZsYXRlIGNhbid0IHdyaXRlIGd6aXAgc3RyZWFtcywgYW5kIGluZmxhdGUgY2FuJ3QgZGV0ZWN0CisgICAgICAgICAgICAgICAgICAgIGFuZCBkZWNvZGUgZ3ppcCBzdHJlYW1zICh0byBhdm9pZCBsaW5raW5nIGNyYyBjb2RlKQorICAgICAxOC0xOTogMCAocmVzZXJ2ZWQpCisKKyAgICBPcGVyYXRpb24gdmFyaWF0aW9ucyAoY2hhbmdlcyBpbiBsaWJyYXJ5IGZ1bmN0aW9uYWxpdHkpOgorICAgICAyMDogUEtaSVBfQlVHX1dPUktBUk9VTkQgLS0gc2xpZ2h0bHkgbW9yZSBwZXJtaXNzaXZlIGluZmxhdGUKKyAgICAgMjE6IEZBU1RFU1QgLS0gZGVmbGF0ZSBhbGdvcml0aG0gd2l0aCBvbmx5IG9uZSwgbG93ZXN0IGNvbXByZXNzaW9uIGxldmVsCisgICAgIDIyLDIzOiAwIChyZXNlcnZlZCkKKworICAgIFRoZSBzcHJpbnRmIHZhcmlhbnQgdXNlZCBieSBnenByaW50ZiAoemVybyBpcyBiZXN0KToKKyAgICAgMjQ6IDAgPSB2cyosIDEgPSBzKiAtLSAxIG1lYW5zIGxpbWl0ZWQgdG8gMjAgYXJndW1lbnRzIGFmdGVyIHRoZSBmb3JtYXQKKyAgICAgMjU6IDAgPSAqbnByaW50ZiwgMSA9ICpwcmludGYgLS0gMSBtZWFucyBnenByaW50ZigpIG5vdCBzZWN1cmUhCisgICAgIDI2OiAwID0gcmV0dXJucyB2YWx1ZSwgMSA9IHZvaWQgLS0gMSBtZWFucyBpbmZlcnJlZCBzdHJpbmcgbGVuZ3RoIHJldHVybmVkCisKKyAgICBSZW1haW5kZXI6CisgICAgIDI3LTMxOiAwIChyZXNlcnZlZCkKKyAqLworCisjaWZuZGVmIFpfU09MTworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiB1dGlsaXR5IGZ1bmN0aW9ucyAqLworCisvKgorICAgICBUaGUgZm9sbG93aW5nIHV0aWxpdHkgZnVuY3Rpb25zIGFyZSBpbXBsZW1lbnRlZCBvbiB0b3Agb2YgdGhlIGJhc2ljCisgICBzdHJlYW0tb3JpZW50ZWQgZnVuY3Rpb25zLiAgVG8gc2ltcGxpZnkgdGhlIGludGVyZmFjZSwgc29tZSBkZWZhdWx0IG9wdGlvbnMKKyAgIGFyZSBhc3N1bWVkIChjb21wcmVzc2lvbiBsZXZlbCBhbmQgbWVtb3J5IHVzYWdlLCBzdGFuZGFyZCBtZW1vcnkgYWxsb2NhdGlvbgorICAgZnVuY3Rpb25zKS4gIFRoZSBzb3VyY2UgY29kZSBvZiB0aGVzZSB1dGlsaXR5IGZ1bmN0aW9ucyBjYW4gYmUgbW9kaWZpZWQgaWYKKyAgIHlvdSBuZWVkIHNwZWNpYWwgb3B0aW9ucy4KKyovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgY29tcHJlc3MgT0YoKEJ5dGVmICpkZXN0LCAgIHVMb25nZiAqZGVzdExlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVmICpzb3VyY2UsIHVMb25nIHNvdXJjZUxlbikpOworLyoKKyAgICAgQ29tcHJlc3NlcyB0aGUgc291cmNlIGJ1ZmZlciBpbnRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIuICBzb3VyY2VMZW4gaXMKKyAgIHRoZSBieXRlIGxlbmd0aCBvZiB0aGUgc291cmNlIGJ1ZmZlci4gIFVwb24gZW50cnksIGRlc3RMZW4gaXMgdGhlIHRvdGFsIHNpemUKKyAgIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIsIHdoaWNoIG11c3QgYmUgYXQgbGVhc3QgdGhlIHZhbHVlIHJldHVybmVkIGJ5CisgICBjb21wcmVzc0JvdW5kKHNvdXJjZUxlbikuICBVcG9uIGV4aXQsIGRlc3RMZW4gaXMgdGhlIGFjdHVhbCBzaXplIG9mIHRoZQorICAgY29tcHJlc3NlZCBidWZmZXIuCisKKyAgICAgY29tcHJlc3MgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIFpfTUVNX0VSUk9SIGlmIHRoZXJlIHdhcyBub3QKKyAgIGVub3VnaCBtZW1vcnksIFpfQlVGX0VSUk9SIGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoIHJvb20gaW4gdGhlIG91dHB1dAorICAgYnVmZmVyLgorKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCBjb21wcmVzczIgT0YoKEJ5dGVmICpkZXN0LCAgIHVMb25nZiAqZGVzdExlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlZiAqc291cmNlLCB1TG9uZyBzb3VyY2VMZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxldmVsKSk7CisvKgorICAgICBDb21wcmVzc2VzIHRoZSBzb3VyY2UgYnVmZmVyIGludG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4gIFRoZSBsZXZlbAorICAgcGFyYW1ldGVyIGhhcyB0aGUgc2FtZSBtZWFuaW5nIGFzIGluIGRlZmxhdGVJbml0LiAgc291cmNlTGVuIGlzIHRoZSBieXRlCisgICBsZW5ndGggb2YgdGhlIHNvdXJjZSBidWZmZXIuICBVcG9uIGVudHJ5LCBkZXN0TGVuIGlzIHRoZSB0b3RhbCBzaXplIG9mIHRoZQorICAgZGVzdGluYXRpb24gYnVmZmVyLCB3aGljaCBtdXN0IGJlIGF0IGxlYXN0IHRoZSB2YWx1ZSByZXR1cm5lZCBieQorICAgY29tcHJlc3NCb3VuZChzb3VyY2VMZW4pLiAgVXBvbiBleGl0LCBkZXN0TGVuIGlzIHRoZSBhY3R1YWwgc2l6ZSBvZiB0aGUKKyAgIGNvbXByZXNzZWQgYnVmZmVyLgorCisgICAgIGNvbXByZXNzMiByZXR1cm5zIFpfT0sgaWYgc3VjY2VzcywgWl9NRU1fRVJST1IgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2gKKyAgIG1lbW9yeSwgWl9CVUZfRVJST1IgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2ggcm9vbSBpbiB0aGUgb3V0cHV0IGJ1ZmZlciwKKyAgIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBsZXZlbCBwYXJhbWV0ZXIgaXMgaW52YWxpZC4KKyovCisKK1pFWFRFUk4gdUxvbmcgWkVYUE9SVCBjb21wcmVzc0JvdW5kIE9GKCh1TG9uZyBzb3VyY2VMZW4pKTsKKy8qCisgICAgIGNvbXByZXNzQm91bmQoKSByZXR1cm5zIGFuIHVwcGVyIGJvdW5kIG9uIHRoZSBjb21wcmVzc2VkIHNpemUgYWZ0ZXIKKyAgIGNvbXByZXNzKCkgb3IgY29tcHJlc3MyKCkgb24gc291cmNlTGVuIGJ5dGVzLiAgSXQgd291bGQgYmUgdXNlZCBiZWZvcmUgYQorICAgY29tcHJlc3MoKSBvciBjb21wcmVzczIoKSBjYWxsIHRvIGFsbG9jYXRlIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIuCisqLworCitaRVhURVJOIGludCBaRVhQT1JUIHVuY29tcHJlc3MgT0YoKEJ5dGVmICpkZXN0LCAgIHVMb25nZiAqZGVzdExlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZWYgKnNvdXJjZSwgdUxvbmcgc291cmNlTGVuKSk7CisvKgorICAgICBEZWNvbXByZXNzZXMgdGhlIHNvdXJjZSBidWZmZXIgaW50byB0aGUgZGVzdGluYXRpb24gYnVmZmVyLiAgc291cmNlTGVuIGlzCisgICB0aGUgYnl0ZSBsZW5ndGggb2YgdGhlIHNvdXJjZSBidWZmZXIuICBVcG9uIGVudHJ5LCBkZXN0TGVuIGlzIHRoZSB0b3RhbCBzaXplCisgICBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyLCB3aGljaCBtdXN0IGJlIGxhcmdlIGVub3VnaCB0byBob2xkIHRoZSBlbnRpcmUKKyAgIHVuY29tcHJlc3NlZCBkYXRhLiAgKFRoZSBzaXplIG9mIHRoZSB1bmNvbXByZXNzZWQgZGF0YSBtdXN0IGhhdmUgYmVlbiBzYXZlZAorICAgcHJldmlvdXNseSBieSB0aGUgY29tcHJlc3NvciBhbmQgdHJhbnNtaXR0ZWQgdG8gdGhlIGRlY29tcHJlc3NvciBieSBzb21lCisgICBtZWNoYW5pc20gb3V0c2lkZSB0aGUgc2NvcGUgb2YgdGhpcyBjb21wcmVzc2lvbiBsaWJyYXJ5LikgVXBvbiBleGl0LCBkZXN0TGVuCisgICBpcyB0aGUgYWN0dWFsIHNpemUgb2YgdGhlIHVuY29tcHJlc3NlZCBidWZmZXIuCisKKyAgICAgdW5jb21wcmVzcyByZXR1cm5zIFpfT0sgaWYgc3VjY2VzcywgWl9NRU1fRVJST1IgaWYgdGhlcmUgd2FzIG5vdAorICAgZW5vdWdoIG1lbW9yeSwgWl9CVUZfRVJST1IgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2ggcm9vbSBpbiB0aGUgb3V0cHV0CisgICBidWZmZXIsIG9yIFpfREFUQV9FUlJPUiBpZiB0aGUgaW5wdXQgZGF0YSB3YXMgY29ycnVwdGVkIG9yIGluY29tcGxldGUuICBJbgorICAgdGhlIGNhc2Ugd2hlcmUgdGhlcmUgaXMgbm90IGVub3VnaCByb29tLCB1bmNvbXByZXNzKCkgd2lsbCBmaWxsIHRoZSBvdXRwdXQKKyAgIGJ1ZmZlciB3aXRoIHRoZSB1bmNvbXByZXNzZWQgZGF0YSB1cCB0byB0aGF0IHBvaW50LgorKi8KKworICAgICAgICAgICAgICAgICAgICAgICAgLyogZ3ppcCBmaWxlIGFjY2VzcyBmdW5jdGlvbnMgKi8KKworLyoKKyAgICAgVGhpcyBsaWJyYXJ5IHN1cHBvcnRzIHJlYWRpbmcgYW5kIHdyaXRpbmcgZmlsZXMgaW4gZ3ppcCAoLmd6KSBmb3JtYXQgd2l0aAorICAgYW4gaW50ZXJmYWNlIHNpbWlsYXIgdG8gdGhhdCBvZiBzdGRpbywgdXNpbmcgdGhlIGZ1bmN0aW9ucyB0aGF0IHN0YXJ0IHdpdGgKKyAgICJneiIuICBUaGUgZ3ppcCBmb3JtYXQgaXMgZGlmZmVyZW50IGZyb20gdGhlIHpsaWIgZm9ybWF0LiAgZ3ppcCBpcyBhIGd6aXAKKyAgIHdyYXBwZXIsIGRvY3VtZW50ZWQgaW4gUkZDIDE5NTIsIHdyYXBwZWQgYXJvdW5kIGEgZGVmbGF0ZSBzdHJlYW0uCisqLworCit0eXBlZGVmIHN0cnVjdCBnekZpbGVfcyAqZ3pGaWxlOyAgICAvKiBzZW1pLW9wYXF1ZSBnemlwIGZpbGUgZGVzY3JpcHRvciAqLworCisvKgorWkVYVEVSTiBnekZpbGUgWkVYUE9SVCBnem9wZW4gT0YoKGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IGNoYXIgKm1vZGUpKTsKKworICAgICBPcGVucyBhIGd6aXAgKC5neikgZmlsZSBmb3IgcmVhZGluZyBvciB3cml0aW5nLiAgVGhlIG1vZGUgcGFyYW1ldGVyIGlzIGFzCisgICBpbiBmb3BlbiAoInJiIiBvciAid2IiKSBidXQgY2FuIGFsc28gaW5jbHVkZSBhIGNvbXByZXNzaW9uIGxldmVsICgid2I5Iikgb3IKKyAgIGEgc3RyYXRlZ3k6ICdmJyBmb3IgZmlsdGVyZWQgZGF0YSBhcyBpbiAid2I2ZiIsICdoJyBmb3IgSHVmZm1hbi1vbmx5CisgICBjb21wcmVzc2lvbiBhcyBpbiAid2IxaCIsICdSJyBmb3IgcnVuLWxlbmd0aCBlbmNvZGluZyBhcyBpbiAid2IxUiIsIG9yICdGJworICAgZm9yIGZpeGVkIGNvZGUgY29tcHJlc3Npb24gYXMgaW4gIndiOUYiLiAgKFNlZSB0aGUgZGVzY3JpcHRpb24gb2YKKyAgIGRlZmxhdGVJbml0MiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3RyYXRlZ3kgcGFyYW1ldGVyLikgICdUJyB3aWxsCisgICByZXF1ZXN0IHRyYW5zcGFyZW50IHdyaXRpbmcgb3IgYXBwZW5kaW5nIHdpdGggbm8gY29tcHJlc3Npb24gYW5kIG5vdCB1c2luZworICAgdGhlIGd6aXAgZm9ybWF0LgorCisgICAgICJhIiBjYW4gYmUgdXNlZCBpbnN0ZWFkIG9mICJ3IiB0byByZXF1ZXN0IHRoYXQgdGhlIGd6aXAgc3RyZWFtIHRoYXQgd2lsbAorICAgYmUgd3JpdHRlbiBiZSBhcHBlbmRlZCB0byB0aGUgZmlsZS4gICIrIiB3aWxsIHJlc3VsdCBpbiBhbiBlcnJvciwgc2luY2UKKyAgIHJlYWRpbmcgYW5kIHdyaXRpbmcgdG8gdGhlIHNhbWUgZ3ppcCBmaWxlIGlzIG5vdCBzdXBwb3J0ZWQuCisKKyAgICAgVGhlc2UgZnVuY3Rpb25zLCBhcyB3ZWxsIGFzIGd6aXAsIHdpbGwgcmVhZCBhbmQgZGVjb2RlIGEgc2VxdWVuY2Ugb2YgZ3ppcAorICAgc3RyZWFtcyBpbiBhIGZpbGUuICBUaGUgYXBwZW5kIGZ1bmN0aW9uIG9mIGd6b3BlbigpIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZQorICAgc3VjaCBhIGZpbGUuICAoQWxzbyBzZWUgZ3pmbHVzaCgpIGZvciBhbm90aGVyIHdheSB0byBkbyB0aGlzLikgIFdoZW4KKyAgIGFwcGVuZGluZywgZ3pvcGVuIGRvZXMgbm90IHRlc3Qgd2hldGhlciB0aGUgZmlsZSBiZWdpbnMgd2l0aCBhIGd6aXAgc3RyZWFtLAorICAgbm9yIGRvZXMgaXQgbG9vayBmb3IgdGhlIGVuZCBvZiB0aGUgZ3ppcCBzdHJlYW1zIHRvIGJlZ2luIGFwcGVuZGluZy4gIGd6b3BlbgorICAgd2lsbCBzaW1wbHkgYXBwZW5kIGEgZ3ppcCBzdHJlYW0gdG8gdGhlIGV4aXN0aW5nIGZpbGUuCisKKyAgICAgZ3pvcGVuIGNhbiBiZSB1c2VkIHRvIHJlYWQgYSBmaWxlIHdoaWNoIGlzIG5vdCBpbiBnemlwIGZvcm1hdDsgaW4gdGhpcworICAgY2FzZSBnenJlYWQgd2lsbCBkaXJlY3RseSByZWFkIGZyb20gdGhlIGZpbGUgd2l0aG91dCBkZWNvbXByZXNzaW9uLiAgV2hlbgorICAgcmVhZGluZywgdGhpcyB3aWxsIGJlIGRldGVjdGVkIGF1dG9tYXRpY2FsbHkgYnkgbG9va2luZyBmb3IgdGhlIG1hZ2ljIHR3by0KKyAgIGJ5dGUgZ3ppcCBoZWFkZXIuCisKKyAgICAgZ3pvcGVuIHJldHVybnMgTlVMTCBpZiB0aGUgZmlsZSBjb3VsZCBub3QgYmUgb3BlbmVkLCBpZiB0aGVyZSB3YXMKKyAgIGluc3VmZmljaWVudCBtZW1vcnkgdG8gYWxsb2NhdGUgdGhlIGd6RmlsZSBzdGF0ZSwgb3IgaWYgYW4gaW52YWxpZCBtb2RlIHdhcworICAgc3BlY2lmaWVkIChhbiAncicsICd3Jywgb3IgJ2EnIHdhcyBub3QgcHJvdmlkZWQsIG9yICcrJyB3YXMgcHJvdmlkZWQpLgorICAgZXJybm8gY2FuIGJlIGNoZWNrZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSByZWFzb24gZ3pvcGVuIGZhaWxlZCB3YXMgdGhhdCB0aGUKKyAgIGZpbGUgY291bGQgbm90IGJlIG9wZW5lZC4KKyovCisKK1pFWFRFUk4gZ3pGaWxlIFpFWFBPUlQgZ3pkb3BlbiBPRigoaW50IGZkLCBjb25zdCBjaGFyICptb2RlKSk7CisvKgorICAgICBnemRvcGVuIGFzc29jaWF0ZXMgYSBnekZpbGUgd2l0aCB0aGUgZmlsZSBkZXNjcmlwdG9yIGZkLiAgRmlsZSBkZXNjcmlwdG9ycworICAgYXJlIG9idGFpbmVkIGZyb20gY2FsbHMgbGlrZSBvcGVuLCBkdXAsIGNyZWF0LCBwaXBlIG9yIGZpbGVubyAoaWYgdGhlIGZpbGUKKyAgIGhhcyBiZWVuIHByZXZpb3VzbHkgb3BlbmVkIHdpdGggZm9wZW4pLiAgVGhlIG1vZGUgcGFyYW1ldGVyIGlzIGFzIGluIGd6b3Blbi4KKworICAgICBUaGUgbmV4dCBjYWxsIG9mIGd6Y2xvc2Ugb24gdGhlIHJldHVybmVkIGd6RmlsZSB3aWxsIGFsc28gY2xvc2UgdGhlIGZpbGUKKyAgIGRlc2NyaXB0b3IgZmQsIGp1c3QgbGlrZSBmY2xvc2UoZmRvcGVuKGZkLCBtb2RlKSkgY2xvc2VzIHRoZSBmaWxlIGRlc2NyaXB0b3IKKyAgIGZkLiAgSWYgeW91IHdhbnQgdG8ga2VlcCBmZCBvcGVuLCB1c2UgZmQgPSBkdXAoZmRfa2VlcCk7IGd6ID0gZ3pkb3BlbihmZCwKKyAgIG1vZGUpOy4gIFRoZSBkdXBsaWNhdGVkIGRlc2NyaXB0b3Igc2hvdWxkIGJlIHNhdmVkIHRvIGF2b2lkIGEgbGVhaywgc2luY2UKKyAgIGd6ZG9wZW4gZG9lcyBub3QgY2xvc2UgZmQgaWYgaXQgZmFpbHMuICBJZiB5b3UgYXJlIHVzaW5nIGZpbGVubygpIHRvIGdldCB0aGUKKyAgIGZpbGUgZGVzY3JpcHRvciBmcm9tIGEgRklMRSAqLCB0aGVuIHlvdSB3aWxsIGhhdmUgdG8gdXNlIGR1cCgpIHRvIGF2b2lkCisgICBkb3VibGUtY2xvc2UoKWluZyB0aGUgZmlsZSBkZXNjcmlwdG9yLiAgQm90aCBnemNsb3NlKCkgYW5kIGZjbG9zZSgpIHdpbGwKKyAgIGNsb3NlIHRoZSBhc3NvY2lhdGVkIGZpbGUgZGVzY3JpcHRvciwgc28gdGhleSBuZWVkIHRvIGhhdmUgZGlmZmVyZW50IGZpbGUKKyAgIGRlc2NyaXB0b3JzLgorCisgICAgIGd6ZG9wZW4gcmV0dXJucyBOVUxMIGlmIHRoZXJlIHdhcyBpbnN1ZmZpY2llbnQgbWVtb3J5IHRvIGFsbG9jYXRlIHRoZQorICAgZ3pGaWxlIHN0YXRlLCBpZiBhbiBpbnZhbGlkIG1vZGUgd2FzIHNwZWNpZmllZCAoYW4gJ3InLCAndycsIG9yICdhJyB3YXMgbm90CisgICBwcm92aWRlZCwgb3IgJysnIHdhcyBwcm92aWRlZCksIG9yIGlmIGZkIGlzIC0xLiAgVGhlIGZpbGUgZGVzY3JpcHRvciBpcyBub3QKKyAgIHVzZWQgdW50aWwgdGhlIG5leHQgZ3oqIHJlYWQsIHdyaXRlLCBzZWVrLCBvciBjbG9zZSBvcGVyYXRpb24sIHNvIGd6ZG9wZW4KKyAgIHdpbGwgbm90IGRldGVjdCBpZiBmZCBpcyBpbnZhbGlkICh1bmxlc3MgZmQgaXMgLTEpLgorKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCBnemJ1ZmZlciBPRigoZ3pGaWxlIGZpbGUsIHVuc2lnbmVkIHNpemUpKTsKKy8qCisgICAgIFNldCB0aGUgaW50ZXJuYWwgYnVmZmVyIHNpemUgdXNlZCBieSB0aGlzIGxpYnJhcnkncyBmdW5jdGlvbnMuICBUaGUKKyAgIGRlZmF1bHQgYnVmZmVyIHNpemUgaXMgODE5MiBieXRlcy4gIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgYWZ0ZXIKKyAgIGd6b3BlbigpIG9yIGd6ZG9wZW4oKSwgYW5kIGJlZm9yZSBhbnkgb3RoZXIgY2FsbHMgdGhhdCByZWFkIG9yIHdyaXRlIHRoZQorICAgZmlsZS4gIFRoZSBidWZmZXIgbWVtb3J5IGFsbG9jYXRpb24gaXMgYWx3YXlzIGRlZmVycmVkIHRvIHRoZSBmaXJzdCByZWFkIG9yCisgICB3cml0ZS4gIFR3byBidWZmZXJzIGFyZSBhbGxvY2F0ZWQsIGVpdGhlciBib3RoIG9mIHRoZSBzcGVjaWZpZWQgc2l6ZSB3aGVuCisgICB3cml0aW5nLCBvciBvbmUgb2YgdGhlIHNwZWNpZmllZCBzaXplIGFuZCB0aGUgb3RoZXIgdHdpY2UgdGhhdCBzaXplIHdoZW4KKyAgIHJlYWRpbmcuICBBIGxhcmdlciBidWZmZXIgc2l6ZSBvZiwgZm9yIGV4YW1wbGUsIDY0SyBvciAxMjhLIGJ5dGVzIHdpbGwKKyAgIG5vdGljZWFibHkgaW5jcmVhc2UgdGhlIHNwZWVkIG9mIGRlY29tcHJlc3Npb24gKHJlYWRpbmcpLgorCisgICAgIFRoZSBuZXcgYnVmZmVyIHNpemUgYWxzbyBhZmZlY3RzIHRoZSBtYXhpbXVtIGxlbmd0aCBmb3IgZ3pwcmludGYoKS4KKworICAgICBnemJ1ZmZlcigpIHJldHVybnMgMCBvbiBzdWNjZXNzLCBvciAtMSBvbiBmYWlsdXJlLCBzdWNoIGFzIGJlaW5nIGNhbGxlZAorICAgdG9vIGxhdGUuCisqLworCitaRVhURVJOIGludCBaRVhQT1JUIGd6c2V0cGFyYW1zIE9GKChnekZpbGUgZmlsZSwgaW50IGxldmVsLCBpbnQgc3RyYXRlZ3kpKTsKKy8qCisgICAgIER5bmFtaWNhbGx5IHVwZGF0ZSB0aGUgY29tcHJlc3Npb24gbGV2ZWwgb3Igc3RyYXRlZ3kuICBTZWUgdGhlIGRlc2NyaXB0aW9uCisgICBvZiBkZWZsYXRlSW5pdDIgZm9yIHRoZSBtZWFuaW5nIG9mIHRoZXNlIHBhcmFtZXRlcnMuCisKKyAgICAgZ3pzZXRwYXJhbXMgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIG9yIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBmaWxlIHdhcyBub3QKKyAgIG9wZW5lZCBmb3Igd3JpdGluZy4KKyovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgZ3pyZWFkIE9GKChnekZpbGUgZmlsZSwgdm9pZHAgYnVmLCB1bnNpZ25lZCBsZW4pKTsKKy8qCisgICAgIFJlYWRzIHRoZSBnaXZlbiBudW1iZXIgb2YgdW5jb21wcmVzc2VkIGJ5dGVzIGZyb20gdGhlIGNvbXByZXNzZWQgZmlsZS4gIElmCisgICB0aGUgaW5wdXQgZmlsZSBpcyBub3QgaW4gZ3ppcCBmb3JtYXQsIGd6cmVhZCBjb3BpZXMgdGhlIGdpdmVuIG51bWJlciBvZgorICAgYnl0ZXMgaW50byB0aGUgYnVmZmVyIGRpcmVjdGx5IGZyb20gdGhlIGZpbGUuCisKKyAgICAgQWZ0ZXIgcmVhY2hpbmcgdGhlIGVuZCBvZiBhIGd6aXAgc3RyZWFtIGluIHRoZSBpbnB1dCwgZ3pyZWFkIHdpbGwgY29udGludWUKKyAgIHRvIHJlYWQsIGxvb2tpbmcgZm9yIGFub3RoZXIgZ3ppcCBzdHJlYW0uICBBbnkgbnVtYmVyIG9mIGd6aXAgc3RyZWFtcyBtYXkgYmUKKyAgIGNvbmNhdGVuYXRlZCBpbiB0aGUgaW5wdXQgZmlsZSwgYW5kIHdpbGwgYWxsIGJlIGRlY29tcHJlc3NlZCBieSBnenJlYWQoKS4KKyAgIElmIHNvbWV0aGluZyBvdGhlciB0aGFuIGEgZ3ppcCBzdHJlYW0gaXMgZW5jb3VudGVyZWQgYWZ0ZXIgYSBnemlwIHN0cmVhbSwKKyAgIHRoYXQgcmVtYWluaW5nIHRyYWlsaW5nIGdhcmJhZ2UgaXMgaWdub3JlZCAoYW5kIG5vIGVycm9yIGlzIHJldHVybmVkKS4KKworICAgICBnenJlYWQgY2FuIGJlIHVzZWQgdG8gcmVhZCBhIGd6aXAgZmlsZSB0aGF0IGlzIGJlaW5nIGNvbmN1cnJlbnRseSB3cml0dGVuLgorICAgVXBvbiByZWFjaGluZyB0aGUgZW5kIG9mIHRoZSBpbnB1dCwgZ3pyZWFkIHdpbGwgcmV0dXJuIHdpdGggdGhlIGF2YWlsYWJsZQorICAgZGF0YS4gIElmIHRoZSBlcnJvciBjb2RlIHJldHVybmVkIGJ5IGd6ZXJyb3IgaXMgWl9PSyBvciBaX0JVRl9FUlJPUiwgdGhlbgorICAgZ3pjbGVhcmVyciBjYW4gYmUgdXNlZCB0byBjbGVhciB0aGUgZW5kIG9mIGZpbGUgaW5kaWNhdG9yIGluIG9yZGVyIHRvIHBlcm1pdAorICAgZ3pyZWFkIHRvIGJlIHRyaWVkIGFnYWluLiAgWl9PSyBpbmRpY2F0ZXMgdGhhdCBhIGd6aXAgc3RyZWFtIHdhcyBjb21wbGV0ZWQKKyAgIG9uIHRoZSBsYXN0IGd6cmVhZC4gIFpfQlVGX0VSUk9SIGluZGljYXRlcyB0aGF0IHRoZSBpbnB1dCBmaWxlIGVuZGVkIGluIHRoZQorICAgbWlkZGxlIG9mIGEgZ3ppcCBzdHJlYW0uICBOb3RlIHRoYXQgZ3pyZWFkIGRvZXMgbm90IHJldHVybiAtMSBpbiB0aGUgZXZlbnQKKyAgIG9mIGFuIGluY29tcGxldGUgZ3ppcCBzdHJlYW0uICBUaGlzIGVycm9yIGlzIGRlZmVycmVkIHVudGlsIGd6Y2xvc2UoKSwgd2hpY2gKKyAgIHdpbGwgcmV0dXJuIFpfQlVGX0VSUk9SIGlmIHRoZSBsYXN0IGd6cmVhZCBlbmRlZCBpbiB0aGUgbWlkZGxlIG9mIGEgZ3ppcAorICAgc3RyZWFtLiAgQWx0ZXJuYXRpdmVseSwgZ3plcnJvciBjYW4gYmUgdXNlZCBiZWZvcmUgZ3pjbG9zZSB0byBkZXRlY3QgdGhpcworICAgY2FzZS4KKworICAgICBnenJlYWQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHVuY29tcHJlc3NlZCBieXRlcyBhY3R1YWxseSByZWFkLCBsZXNzIHRoYW4KKyAgIGxlbiBmb3IgZW5kIG9mIGZpbGUsIG9yIC0xIGZvciBlcnJvci4KKyovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgZ3p3cml0ZSBPRigoZ3pGaWxlIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWRwYyBidWYsIHVuc2lnbmVkIGxlbikpOworLyoKKyAgICAgV3JpdGVzIHRoZSBnaXZlbiBudW1iZXIgb2YgdW5jb21wcmVzc2VkIGJ5dGVzIGludG8gdGhlIGNvbXByZXNzZWQgZmlsZS4KKyAgIGd6d3JpdGUgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHVuY29tcHJlc3NlZCBieXRlcyB3cml0dGVuIG9yIDAgaW4gY2FzZSBvZgorICAgZXJyb3IuCisqLworCitaRVhURVJOIGludCBaRVhQT1JUVkEgZ3pwcmludGYgWl9BUkcoKGd6RmlsZSBmaWxlLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikpOworLyoKKyAgICAgQ29udmVydHMsIGZvcm1hdHMsIGFuZCB3cml0ZXMgdGhlIGFyZ3VtZW50cyB0byB0aGUgY29tcHJlc3NlZCBmaWxlIHVuZGVyCisgICBjb250cm9sIG9mIHRoZSBmb3JtYXQgc3RyaW5nLCBhcyBpbiBmcHJpbnRmLiAgZ3pwcmludGYgcmV0dXJucyB0aGUgbnVtYmVyIG9mCisgICB1bmNvbXByZXNzZWQgYnl0ZXMgYWN0dWFsbHkgd3JpdHRlbiwgb3IgMCBpbiBjYXNlIG9mIGVycm9yLiAgVGhlIG51bWJlciBvZgorICAgdW5jb21wcmVzc2VkIGJ5dGVzIHdyaXR0ZW4gaXMgbGltaXRlZCB0byA4MTkxLCBvciBvbmUgbGVzcyB0aGFuIHRoZSBidWZmZXIKKyAgIHNpemUgZ2l2ZW4gdG8gZ3pidWZmZXIoKS4gIFRoZSBjYWxsZXIgc2hvdWxkIGFzc3VyZSB0aGF0IHRoaXMgbGltaXQgaXMgbm90CisgICBleGNlZWRlZC4gIElmIGl0IGlzIGV4Y2VlZGVkLCB0aGVuIGd6cHJpbnRmKCkgd2lsbCByZXR1cm4gYW4gZXJyb3IgKDApIHdpdGgKKyAgIG5vdGhpbmcgd3JpdHRlbi4gIEluIHRoaXMgY2FzZSwgdGhlcmUgbWF5IGFsc28gYmUgYSBidWZmZXIgb3ZlcmZsb3cgd2l0aAorICAgdW5wcmVkaWN0YWJsZSBjb25zZXF1ZW5jZXMsIHdoaWNoIGlzIHBvc3NpYmxlIG9ubHkgaWYgemxpYiB3YXMgY29tcGlsZWQgd2l0aAorICAgdGhlIGluc2VjdXJlIGZ1bmN0aW9ucyBzcHJpbnRmKCkgb3IgdnNwcmludGYoKSBiZWNhdXNlIHRoZSBzZWN1cmUgc25wcmludGYoKQorICAgb3IgdnNucHJpbnRmKCkgZnVuY3Rpb25zIHdlcmUgbm90IGF2YWlsYWJsZS4gIFRoaXMgY2FuIGJlIGRldGVybWluZWQgdXNpbmcKKyAgIHpsaWJDb21waWxlRmxhZ3MoKS4KKyovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgZ3pwdXRzIE9GKChnekZpbGUgZmlsZSwgY29uc3QgY2hhciAqcykpOworLyoKKyAgICAgV3JpdGVzIHRoZSBnaXZlbiBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nIHRvIHRoZSBjb21wcmVzc2VkIGZpbGUsIGV4Y2x1ZGluZworICAgdGhlIHRlcm1pbmF0aW5nIG51bGwgY2hhcmFjdGVyLgorCisgICAgIGd6cHV0cyByZXR1cm5zIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB3cml0dGVuLCBvciAtMSBpbiBjYXNlIG9mIGVycm9yLgorKi8KKworWkVYVEVSTiBjaGFyICogWkVYUE9SVCBnemdldHMgT0YoKGd6RmlsZSBmaWxlLCBjaGFyICpidWYsIGludCBsZW4pKTsKKy8qCisgICAgIFJlYWRzIGJ5dGVzIGZyb20gdGhlIGNvbXByZXNzZWQgZmlsZSB1bnRpbCBsZW4tMSBjaGFyYWN0ZXJzIGFyZSByZWFkLCBvciBhCisgICBuZXdsaW5lIGNoYXJhY3RlciBpcyByZWFkIGFuZCB0cmFuc2ZlcnJlZCB0byBidWYsIG9yIGFuIGVuZC1vZi1maWxlCisgICBjb25kaXRpb24gaXMgZW5jb3VudGVyZWQuICBJZiBhbnkgY2hhcmFjdGVycyBhcmUgcmVhZCBvciBpZiBsZW4gPT0gMSwgdGhlCisgICBzdHJpbmcgaXMgdGVybWluYXRlZCB3aXRoIGEgbnVsbCBjaGFyYWN0ZXIuICBJZiBubyBjaGFyYWN0ZXJzIGFyZSByZWFkIGR1ZQorICAgdG8gYW4gZW5kLW9mLWZpbGUgb3IgbGVuIDwgMSwgdGhlbiB0aGUgYnVmZmVyIGlzIGxlZnQgdW50b3VjaGVkLgorCisgICAgIGd6Z2V0cyByZXR1cm5zIGJ1ZiB3aGljaCBpcyBhIG51bGwtdGVybWluYXRlZCBzdHJpbmcsIG9yIGl0IHJldHVybnMgTlVMTAorICAgZm9yIGVuZC1vZi1maWxlIG9yIGluIGNhc2Ugb2YgZXJyb3IuICBJZiB0aGVyZSB3YXMgYW4gZXJyb3IsIHRoZSBjb250ZW50cyBhdAorICAgYnVmIGFyZSBpbmRldGVybWluYXRlLgorKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCBnenB1dGMgT0YoKGd6RmlsZSBmaWxlLCBpbnQgYykpOworLyoKKyAgICAgV3JpdGVzIGMsIGNvbnZlcnRlZCB0byBhbiB1bnNpZ25lZCBjaGFyLCBpbnRvIHRoZSBjb21wcmVzc2VkIGZpbGUuICBnenB1dGMKKyAgIHJldHVybnMgdGhlIHZhbHVlIHRoYXQgd2FzIHdyaXR0ZW4sIG9yIC0xIGluIGNhc2Ugb2YgZXJyb3IuCisqLworCitaRVhURVJOIGludCBaRVhQT1JUIGd6Z2V0YyBPRigoZ3pGaWxlIGZpbGUpKTsKKy8qCisgICAgIFJlYWRzIG9uZSBieXRlIGZyb20gdGhlIGNvbXByZXNzZWQgZmlsZS4gIGd6Z2V0YyByZXR1cm5zIHRoaXMgYnl0ZSBvciAtMQorICAgaW4gY2FzZSBvZiBlbmQgb2YgZmlsZSBvciBlcnJvci4gIFRoaXMgaXMgaW1wbGVtZW50ZWQgYXMgYSBtYWNybyBmb3Igc3BlZWQuCisgICBBcyBzdWNoLCBpdCBkb2VzIG5vdCBkbyBhbGwgb2YgdGhlIGNoZWNraW5nIHRoZSBvdGhlciBmdW5jdGlvbnMgZG8uICBJLmUuCisgICBpdCBkb2VzIG5vdCBjaGVjayB0byBzZWUgaWYgZmlsZSBpcyBOVUxMLCBub3Igd2hldGhlciB0aGUgc3RydWN0dXJlIGZpbGUKKyAgIHBvaW50cyB0byBoYXMgYmVlbiBjbG9iYmVyZWQgb3Igbm90LgorKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCBnenVuZ2V0YyBPRigoaW50IGMsIGd6RmlsZSBmaWxlKSk7CisvKgorICAgICBQdXNoIG9uZSBjaGFyYWN0ZXIgYmFjayBvbnRvIHRoZSBzdHJlYW0gdG8gYmUgcmVhZCBhcyB0aGUgZmlyc3QgY2hhcmFjdGVyCisgICBvbiB0aGUgbmV4dCByZWFkLiAgQXQgbGVhc3Qgb25lIGNoYXJhY3RlciBvZiBwdXNoLWJhY2sgaXMgYWxsb3dlZC4KKyAgIGd6dW5nZXRjKCkgcmV0dXJucyB0aGUgY2hhcmFjdGVyIHB1c2hlZCwgb3IgLTEgb24gZmFpbHVyZS4gIGd6dW5nZXRjKCkgd2lsbAorICAgZmFpbCBpZiBjIGlzIC0xLCBhbmQgbWF5IGZhaWwgaWYgYSBjaGFyYWN0ZXIgaGFzIGJlZW4gcHVzaGVkIGJ1dCBub3QgcmVhZAorICAgeWV0LiAgSWYgZ3p1bmdldGMgaXMgdXNlZCBpbW1lZGlhdGVseSBhZnRlciBnem9wZW4gb3IgZ3pkb3BlbiwgYXQgbGVhc3QgdGhlCisgICBvdXRwdXQgYnVmZmVyIHNpemUgb2YgcHVzaGVkIGNoYXJhY3RlcnMgaXMgYWxsb3dlZC4gIChTZWUgZ3pidWZmZXIgYWJvdmUuKQorICAgVGhlIHB1c2hlZCBjaGFyYWN0ZXIgd2lsbCBiZSBkaXNjYXJkZWQgaWYgdGhlIHN0cmVhbSBpcyByZXBvc2l0aW9uZWQgd2l0aAorICAgZ3pzZWVrKCkgb3IgZ3pyZXdpbmQoKS4KKyovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgZ3pmbHVzaCBPRigoZ3pGaWxlIGZpbGUsIGludCBmbHVzaCkpOworLyoKKyAgICAgRmx1c2hlcyBhbGwgcGVuZGluZyBvdXRwdXQgaW50byB0aGUgY29tcHJlc3NlZCBmaWxlLiAgVGhlIHBhcmFtZXRlciBmbHVzaAorICAgaXMgYXMgaW4gdGhlIGRlZmxhdGUoKSBmdW5jdGlvbi4gIFRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIHpsaWIgZXJyb3IgbnVtYmVyCisgICAoc2VlIGZ1bmN0aW9uIGd6ZXJyb3IgYmVsb3cpLiAgZ3pmbHVzaCBpcyBvbmx5IHBlcm1pdHRlZCB3aGVuIHdyaXRpbmcuCisKKyAgICAgSWYgdGhlIGZsdXNoIHBhcmFtZXRlciBpcyBaX0ZJTklTSCwgdGhlIHJlbWFpbmluZyBkYXRhIGlzIHdyaXR0ZW4gYW5kIHRoZQorICAgZ3ppcCBzdHJlYW0gaXMgY29tcGxldGVkIGluIHRoZSBvdXRwdXQuICBJZiBnendyaXRlKCkgaXMgY2FsbGVkIGFnYWluLCBhIG5ldworICAgZ3ppcCBzdHJlYW0gd2lsbCBiZSBzdGFydGVkIGluIHRoZSBvdXRwdXQuICBnenJlYWQoKSBpcyBhYmxlIHRvIHJlYWQgc3VjaAorICAgY29uY2F0ZW50ZWQgZ3ppcCBzdHJlYW1zLgorCisgICAgIGd6Zmx1c2ggc2hvdWxkIGJlIGNhbGxlZCBvbmx5IHdoZW4gc3RyaWN0bHkgbmVjZXNzYXJ5IGJlY2F1c2UgaXQgd2lsbAorICAgZGVncmFkZSBjb21wcmVzc2lvbiBpZiBjYWxsZWQgdG9vIG9mdGVuLgorKi8KKworLyoKK1pFWFRFUk4gel9vZmZfdCBaRVhQT1JUIGd6c2VlayBPRigoZ3pGaWxlIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpfb2ZmX3Qgb2Zmc2V0LCBpbnQgd2hlbmNlKSk7CisKKyAgICAgU2V0cyB0aGUgc3RhcnRpbmcgcG9zaXRpb24gZm9yIHRoZSBuZXh0IGd6cmVhZCBvciBnendyaXRlIG9uIHRoZSBnaXZlbgorICAgY29tcHJlc3NlZCBmaWxlLiAgVGhlIG9mZnNldCByZXByZXNlbnRzIGEgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZQorICAgdW5jb21wcmVzc2VkIGRhdGEgc3RyZWFtLiAgVGhlIHdoZW5jZSBwYXJhbWV0ZXIgaXMgZGVmaW5lZCBhcyBpbiBsc2VlaygyKTsKKyAgIHRoZSB2YWx1ZSBTRUVLX0VORCBpcyBub3Qgc3VwcG9ydGVkLgorCisgICAgIElmIHRoZSBmaWxlIGlzIG9wZW5lZCBmb3IgcmVhZGluZywgdGhpcyBmdW5jdGlvbiBpcyBlbXVsYXRlZCBidXQgY2FuIGJlCisgICBleHRyZW1lbHkgc2xvdy4gIElmIHRoZSBmaWxlIGlzIG9wZW5lZCBmb3Igd3JpdGluZywgb25seSBmb3J3YXJkIHNlZWtzIGFyZQorICAgc3VwcG9ydGVkOyBnenNlZWsgdGhlbiBjb21wcmVzc2VzIGEgc2VxdWVuY2Ugb2YgemVyb2VzIHVwIHRvIHRoZSBuZXcKKyAgIHN0YXJ0aW5nIHBvc2l0aW9uLgorCisgICAgIGd6c2VlayByZXR1cm5zIHRoZSByZXN1bHRpbmcgb2Zmc2V0IGxvY2F0aW9uIGFzIG1lYXN1cmVkIGluIGJ5dGVzIGZyb20KKyAgIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHVuY29tcHJlc3NlZCBzdHJlYW0sIG9yIC0xIGluIGNhc2Ugb2YgZXJyb3IsIGluCisgICBwYXJ0aWN1bGFyIGlmIHRoZSBmaWxlIGlzIG9wZW5lZCBmb3Igd3JpdGluZyBhbmQgdGhlIG5ldyBzdGFydGluZyBwb3NpdGlvbgorICAgd291bGQgYmUgYmVmb3JlIHRoZSBjdXJyZW50IHBvc2l0aW9uLgorKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCAgICBnenJld2luZCBPRigoZ3pGaWxlIGZpbGUpKTsKKy8qCisgICAgIFJld2luZHMgdGhlIGdpdmVuIGZpbGUuIFRoaXMgZnVuY3Rpb24gaXMgc3VwcG9ydGVkIG9ubHkgZm9yIHJlYWRpbmcuCisKKyAgICAgZ3pyZXdpbmQoZmlsZSkgaXMgZXF1aXZhbGVudCB0byAoaW50KWd6c2VlayhmaWxlLCAwTCwgU0VFS19TRVQpCisqLworCisvKgorWkVYVEVSTiB6X29mZl90IFpFWFBPUlQgICAgZ3p0ZWxsIE9GKChnekZpbGUgZmlsZSkpOworCisgICAgIFJldHVybnMgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIGZvciB0aGUgbmV4dCBnenJlYWQgb3IgZ3p3cml0ZSBvbiB0aGUgZ2l2ZW4KKyAgIGNvbXByZXNzZWQgZmlsZS4gIFRoaXMgcG9zaXRpb24gcmVwcmVzZW50cyBhIG51bWJlciBvZiBieXRlcyBpbiB0aGUKKyAgIHVuY29tcHJlc3NlZCBkYXRhIHN0cmVhbSwgYW5kIGlzIHplcm8gd2hlbiBzdGFydGluZywgZXZlbiBpZiBhcHBlbmRpbmcgb3IKKyAgIHJlYWRpbmcgYSBnemlwIHN0cmVhbSBmcm9tIHRoZSBtaWRkbGUgb2YgYSBmaWxlIHVzaW5nIGd6ZG9wZW4oKS4KKworICAgICBnenRlbGwoZmlsZSkgaXMgZXF1aXZhbGVudCB0byBnenNlZWsoZmlsZSwgMEwsIFNFRUtfQ1VSKQorKi8KKworLyoKK1pFWFRFUk4gel9vZmZfdCBaRVhQT1JUIGd6b2Zmc2V0IE9GKChnekZpbGUgZmlsZSkpOworCisgICAgIFJldHVybnMgdGhlIGN1cnJlbnQgb2Zmc2V0IGluIHRoZSBmaWxlIGJlaW5nIHJlYWQgb3Igd3JpdHRlbi4gIFRoaXMgb2Zmc2V0CisgICBpbmNsdWRlcyB0aGUgY291bnQgb2YgYnl0ZXMgdGhhdCBwcmVjZWRlIHRoZSBnemlwIHN0cmVhbSwgZm9yIGV4YW1wbGUgd2hlbgorICAgYXBwZW5kaW5nIG9yIHdoZW4gdXNpbmcgZ3pkb3BlbigpIGZvciByZWFkaW5nLiAgV2hlbiByZWFkaW5nLCB0aGUgb2Zmc2V0CisgICBkb2VzIG5vdCBpbmNsdWRlIGFzIHlldCB1bnVzZWQgYnVmZmVyZWQgaW5wdXQuICBUaGlzIGluZm9ybWF0aW9uIGNhbiBiZSB1c2VkCisgICBmb3IgYSBwcm9ncmVzcyBpbmRpY2F0b3IuICBPbiBlcnJvciwgZ3pvZmZzZXQoKSByZXR1cm5zIC0xLgorKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCBnemVvZiBPRigoZ3pGaWxlIGZpbGUpKTsKKy8qCisgICAgIFJldHVybnMgdHJ1ZSAoMSkgaWYgdGhlIGVuZC1vZi1maWxlIGluZGljYXRvciBoYXMgYmVlbiBzZXQgd2hpbGUgcmVhZGluZywKKyAgIGZhbHNlICgwKSBvdGhlcndpc2UuICBOb3RlIHRoYXQgdGhlIGVuZC1vZi1maWxlIGluZGljYXRvciBpcyBzZXQgb25seSBpZiB0aGUKKyAgIHJlYWQgdHJpZWQgdG8gZ28gcGFzdCB0aGUgZW5kIG9mIHRoZSBpbnB1dCwgYnV0IGNhbWUgdXAgc2hvcnQuICBUaGVyZWZvcmUsCisgICBqdXN0IGxpa2UgZmVvZigpLCBnemVvZigpIG1heSByZXR1cm4gZmFsc2UgZXZlbiBpZiB0aGVyZSBpcyBubyBtb3JlIGRhdGEgdG8KKyAgIHJlYWQsIGluIHRoZSBldmVudCB0aGF0IHRoZSBsYXN0IHJlYWQgcmVxdWVzdCB3YXMgZm9yIHRoZSBleGFjdCBudW1iZXIgb2YKKyAgIGJ5dGVzIHJlbWFpbmluZyBpbiB0aGUgaW5wdXQgZmlsZS4gIFRoaXMgd2lsbCBoYXBwZW4gaWYgdGhlIGlucHV0IGZpbGUgc2l6ZQorICAgaXMgYW4gZXhhY3QgbXVsdGlwbGUgb2YgdGhlIGJ1ZmZlciBzaXplLgorCisgICAgIElmIGd6ZW9mKCkgcmV0dXJucyB0cnVlLCB0aGVuIHRoZSByZWFkIGZ1bmN0aW9ucyB3aWxsIHJldHVybiBubyBtb3JlIGRhdGEsCisgICB1bmxlc3MgdGhlIGVuZC1vZi1maWxlIGluZGljYXRvciBpcyByZXNldCBieSBnemNsZWFyZXJyKCkgYW5kIHRoZSBpbnB1dCBmaWxlCisgICBoYXMgZ3Jvd24gc2luY2UgdGhlIHByZXZpb3VzIGVuZCBvZiBmaWxlIHdhcyBkZXRlY3RlZC4KKyovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgZ3pkaXJlY3QgT0YoKGd6RmlsZSBmaWxlKSk7CisvKgorICAgICBSZXR1cm5zIHRydWUgKDEpIGlmIGZpbGUgaXMgYmVpbmcgY29waWVkIGRpcmVjdGx5IHdoaWxlIHJlYWRpbmcsIG9yIGZhbHNlCisgICAoMCkgaWYgZmlsZSBpcyBhIGd6aXAgc3RyZWFtIGJlaW5nIGRlY29tcHJlc3NlZC4KKworICAgICBJZiB0aGUgaW5wdXQgZmlsZSBpcyBlbXB0eSwgZ3pkaXJlY3QoKSB3aWxsIHJldHVybiB0cnVlLCBzaW5jZSB0aGUgaW5wdXQKKyAgIGRvZXMgbm90IGNvbnRhaW4gYSBnemlwIHN0cmVhbS4KKworICAgICBJZiBnemRpcmVjdCgpIGlzIHVzZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgZ3pvcGVuKCkgb3IgZ3pkb3BlbigpIGl0IHdpbGwKKyAgIGNhdXNlIGJ1ZmZlcnMgdG8gYmUgYWxsb2NhdGVkIHRvIGFsbG93IHJlYWRpbmcgdGhlIGZpbGUgdG8gZGV0ZXJtaW5lIGlmIGl0CisgICBpcyBhIGd6aXAgZmlsZS4gIFRoZXJlZm9yZSBpZiBnemJ1ZmZlcigpIGlzIHVzZWQsIGl0IHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlCisgICBnemRpcmVjdCgpLgorCisgICAgIFdoZW4gd3JpdGluZywgZ3pkaXJlY3QoKSByZXR1cm5zIHRydWUgKDEpIGlmIHRyYW5zcGFyZW50IHdyaXRpbmcgd2FzCisgICByZXF1ZXN0ZWQgKCJ3VCIgZm9yIHRoZSBnem9wZW4oKSBtb2RlKSwgb3IgZmFsc2UgKDApIG90aGVyd2lzZS4gIChOb3RlOgorICAgZ3pkaXJlY3QoKSBpcyBub3QgbmVlZGVkIHdoZW4gd3JpdGluZy4gIFRyYW5zcGFyZW50IHdyaXRpbmcgbXVzdCBiZQorICAgZXhwbGljaXRseSByZXF1ZXN0ZWQsIHNvIHRoZSBhcHBsaWNhdGlvbiBhbHJlYWR5IGtub3dzIHRoZSBhbnN3ZXIuICBXaGVuCisgICBsaW5raW5nIHN0YXRpY2FsbHksIHVzaW5nIGd6ZGlyZWN0KCkgd2lsbCBpbmNsdWRlIGFsbCBvZiB0aGUgemxpYiBjb2RlIGZvcgorICAgZ3ppcCBmaWxlIHJlYWRpbmcgYW5kIGRlY29tcHJlc3Npb24sIHdoaWNoIG1heSBub3QgYmUgZGVzaXJlZC4pCisqLworCitaRVhURVJOIGludCBaRVhQT1JUICAgIGd6Y2xvc2UgT0YoKGd6RmlsZSBmaWxlKSk7CisvKgorICAgICBGbHVzaGVzIGFsbCBwZW5kaW5nIG91dHB1dCBpZiBuZWNlc3NhcnksIGNsb3NlcyB0aGUgY29tcHJlc3NlZCBmaWxlIGFuZAorICAgZGVhbGxvY2F0ZXMgdGhlIChkZSljb21wcmVzc2lvbiBzdGF0ZS4gIE5vdGUgdGhhdCBvbmNlIGZpbGUgaXMgY2xvc2VkLCB5b3UKKyAgIGNhbm5vdCBjYWxsIGd6ZXJyb3Igd2l0aCBmaWxlLCBzaW5jZSBpdHMgc3RydWN0dXJlcyBoYXZlIGJlZW4gZGVhbGxvY2F0ZWQuCisgICBnemNsb3NlIG11c3Qgbm90IGJlIGNhbGxlZCBtb3JlIHRoYW4gb25jZSBvbiB0aGUgc2FtZSBmaWxlLCBqdXN0IGFzIGZyZWUKKyAgIG11c3Qgbm90IGJlIGNhbGxlZCBtb3JlIHRoYW4gb25jZSBvbiB0aGUgc2FtZSBhbGxvY2F0aW9uLgorCisgICAgIGd6Y2xvc2Ugd2lsbCByZXR1cm4gWl9TVFJFQU1fRVJST1IgaWYgZmlsZSBpcyBub3QgdmFsaWQsIFpfRVJSTk8gb24gYQorICAgZmlsZSBvcGVyYXRpb24gZXJyb3IsIFpfTUVNX0VSUk9SIGlmIG91dCBvZiBtZW1vcnksIFpfQlVGX0VSUk9SIGlmIHRoZQorICAgbGFzdCByZWFkIGVuZGVkIGluIHRoZSBtaWRkbGUgb2YgYSBnemlwIHN0cmVhbSwgb3IgWl9PSyBvbiBzdWNjZXNzLgorKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCBnemNsb3NlX3IgT0YoKGd6RmlsZSBmaWxlKSk7CitaRVhURVJOIGludCBaRVhQT1JUIGd6Y2xvc2VfdyBPRigoZ3pGaWxlIGZpbGUpKTsKKy8qCisgICAgIFNhbWUgYXMgZ3pjbG9zZSgpLCBidXQgZ3pjbG9zZV9yKCkgaXMgb25seSBmb3IgdXNlIHdoZW4gcmVhZGluZywgYW5kCisgICBnemNsb3NlX3coKSBpcyBvbmx5IGZvciB1c2Ugd2hlbiB3cml0aW5nIG9yIGFwcGVuZGluZy4gIFRoZSBhZHZhbnRhZ2UgdG8KKyAgIHVzaW5nIHRoZXNlIGluc3RlYWQgb2YgZ3pjbG9zZSgpIGlzIHRoYXQgdGhleSBhdm9pZCBsaW5raW5nIGluIHpsaWIKKyAgIGNvbXByZXNzaW9uIG9yIGRlY29tcHJlc3Npb24gY29kZSB0aGF0IGlzIG5vdCB1c2VkIHdoZW4gb25seSByZWFkaW5nIG9yIG9ubHkKKyAgIHdyaXRpbmcgcmVzcGVjdGl2ZWx5LiAgSWYgZ3pjbG9zZSgpIGlzIHVzZWQsIHRoZW4gYm90aCBjb21wcmVzc2lvbiBhbmQKKyAgIGRlY29tcHJlc3Npb24gY29kZSB3aWxsIGJlIGluY2x1ZGVkIHRoZSBhcHBsaWNhdGlvbiB3aGVuIGxpbmtpbmcgdG8gYSBzdGF0aWMKKyAgIHpsaWIgbGlicmFyeS4KKyovCisKK1pFWFRFUk4gY29uc3QgY2hhciAqIFpFWFBPUlQgZ3plcnJvciBPRigoZ3pGaWxlIGZpbGUsIGludCAqZXJybnVtKSk7CisvKgorICAgICBSZXR1cm5zIHRoZSBlcnJvciBtZXNzYWdlIGZvciB0aGUgbGFzdCBlcnJvciB3aGljaCBvY2N1cnJlZCBvbiB0aGUgZ2l2ZW4KKyAgIGNvbXByZXNzZWQgZmlsZS4gIGVycm51bSBpcyBzZXQgdG8gemxpYiBlcnJvciBudW1iZXIuICBJZiBhbiBlcnJvciBvY2N1cnJlZAorICAgaW4gdGhlIGZpbGUgc3lzdGVtIGFuZCBub3QgaW4gdGhlIGNvbXByZXNzaW9uIGxpYnJhcnksIGVycm51bSBpcyBzZXQgdG8KKyAgIFpfRVJSTk8gYW5kIHRoZSBhcHBsaWNhdGlvbiBtYXkgY29uc3VsdCBlcnJubyB0byBnZXQgdGhlIGV4YWN0IGVycm9yIGNvZGUuCisKKyAgICAgVGhlIGFwcGxpY2F0aW9uIG11c3Qgbm90IG1vZGlmeSB0aGUgcmV0dXJuZWQgc3RyaW5nLiAgRnV0dXJlIGNhbGxzIHRvCisgICB0aGlzIGZ1bmN0aW9uIG1heSBpbnZhbGlkYXRlIHRoZSBwcmV2aW91c2x5IHJldHVybmVkIHN0cmluZy4gIElmIGZpbGUgaXMKKyAgIGNsb3NlZCwgdGhlbiB0aGUgc3RyaW5nIHByZXZpb3VzbHkgcmV0dXJuZWQgYnkgZ3plcnJvciB3aWxsIG5vIGxvbmdlciBiZQorICAgYXZhaWxhYmxlLgorCisgICAgIGd6ZXJyb3IoKSBzaG91bGQgYmUgdXNlZCB0byBkaXN0aW5ndWlzaCBlcnJvcnMgZnJvbSBlbmQtb2YtZmlsZSBmb3IgdGhvc2UKKyAgIGZ1bmN0aW9ucyBhYm92ZSB0aGF0IGRvIG5vdCBkaXN0aW5ndWlzaCB0aG9zZSBjYXNlcyBpbiB0aGVpciByZXR1cm4gdmFsdWVzLgorKi8KKworWkVYVEVSTiB2b2lkIFpFWFBPUlQgZ3pjbGVhcmVyciBPRigoZ3pGaWxlIGZpbGUpKTsKKy8qCisgICAgIENsZWFycyB0aGUgZXJyb3IgYW5kIGVuZC1vZi1maWxlIGZsYWdzIGZvciBmaWxlLiAgVGhpcyBpcyBhbmFsb2dvdXMgdG8gdGhlCisgICBjbGVhcmVycigpIGZ1bmN0aW9uIGluIHN0ZGlvLiAgVGhpcyBpcyB1c2VmdWwgZm9yIGNvbnRpbnVpbmcgdG8gcmVhZCBhIGd6aXAKKyAgIGZpbGUgdGhhdCBpcyBiZWluZyB3cml0dGVuIGNvbmN1cnJlbnRseS4KKyovCisKKyNlbmRpZiAvKiAhWl9TT0xPICovCisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNoZWNrc3VtIGZ1bmN0aW9ucyAqLworCisvKgorICAgICBUaGVzZSBmdW5jdGlvbnMgYXJlIG5vdCByZWxhdGVkIHRvIGNvbXByZXNzaW9uIGJ1dCBhcmUgZXhwb3J0ZWQKKyAgIGFueXdheSBiZWNhdXNlIHRoZXkgbWlnaHQgYmUgdXNlZnVsIGluIGFwcGxpY2F0aW9ucyB1c2luZyB0aGUgY29tcHJlc3Npb24KKyAgIGxpYnJhcnkuCisqLworCitaRVhURVJOIHVMb25nIFpFWFBPUlQgYWRsZXIzMiBPRigodUxvbmcgYWRsZXIsIGNvbnN0IEJ5dGVmICpidWYsIHVJbnQgbGVuKSk7CisvKgorICAgICBVcGRhdGUgYSBydW5uaW5nIEFkbGVyLTMyIGNoZWNrc3VtIHdpdGggdGhlIGJ5dGVzIGJ1ZlswLi5sZW4tMV0gYW5kCisgICByZXR1cm4gdGhlIHVwZGF0ZWQgY2hlY2tzdW0uICBJZiBidWYgaXMgWl9OVUxMLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlCisgICByZXF1aXJlZCBpbml0aWFsIHZhbHVlIGZvciB0aGUgY2hlY2tzdW0uCisKKyAgICAgQW4gQWRsZXItMzIgY2hlY2tzdW0gaXMgYWxtb3N0IGFzIHJlbGlhYmxlIGFzIGEgQ1JDMzIgYnV0IGNhbiBiZSBjb21wdXRlZAorICAgbXVjaCBmYXN0ZXIuCisKKyAgIFVzYWdlIGV4YW1wbGU6CisKKyAgICAgdUxvbmcgYWRsZXIgPSBhZGxlcjMyKDBMLCBaX05VTEwsIDApOworCisgICAgIHdoaWxlIChyZWFkX2J1ZmZlcihidWZmZXIsIGxlbmd0aCkgIT0gRU9GKSB7CisgICAgICAgYWRsZXIgPSBhZGxlcjMyKGFkbGVyLCBidWZmZXIsIGxlbmd0aCk7CisgICAgIH0KKyAgICAgaWYgKGFkbGVyICE9IG9yaWdpbmFsX2FkbGVyKSBlcnJvcigpOworKi8KKworLyoKK1pFWFRFUk4gdUxvbmcgWkVYUE9SVCBhZGxlcjMyX2NvbWJpbmUgT0YoKHVMb25nIGFkbGVyMSwgdUxvbmcgYWRsZXIyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgel9vZmZfdCBsZW4yKSk7CisKKyAgICAgQ29tYmluZSB0d28gQWRsZXItMzIgY2hlY2tzdW1zIGludG8gb25lLiAgRm9yIHR3byBzZXF1ZW5jZXMgb2YgYnl0ZXMsIHNlcTEKKyAgIGFuZCBzZXEyIHdpdGggbGVuZ3RocyBsZW4xIGFuZCBsZW4yLCBBZGxlci0zMiBjaGVja3N1bXMgd2VyZSBjYWxjdWxhdGVkIGZvcgorICAgZWFjaCwgYWRsZXIxIGFuZCBhZGxlcjIuICBhZGxlcjMyX2NvbWJpbmUoKSByZXR1cm5zIHRoZSBBZGxlci0zMiBjaGVja3N1bSBvZgorICAgc2VxMSBhbmQgc2VxMiBjb25jYXRlbmF0ZWQsIHJlcXVpcmluZyBvbmx5IGFkbGVyMSwgYWRsZXIyLCBhbmQgbGVuMi4gIE5vdGUKKyAgIHRoYXQgdGhlIHpfb2ZmX3QgdHlwZSAobGlrZSBvZmZfdCkgaXMgYSBzaWduZWQgaW50ZWdlci4gIElmIGxlbjIgaXMKKyAgIG5lZ2F0aXZlLCB0aGUgcmVzdWx0IGhhcyBubyBtZWFuaW5nIG9yIHV0aWxpdHkuCisqLworCitaRVhURVJOIHVMb25nIFpFWFBPUlQgY3JjMzIgICBPRigodUxvbmcgY3JjLCBjb25zdCBCeXRlZiAqYnVmLCB1SW50IGxlbikpOworLyoKKyAgICAgVXBkYXRlIGEgcnVubmluZyBDUkMtMzIgd2l0aCB0aGUgYnl0ZXMgYnVmWzAuLmxlbi0xXSBhbmQgcmV0dXJuIHRoZQorICAgdXBkYXRlZCBDUkMtMzIuICBJZiBidWYgaXMgWl9OVUxMLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHJlcXVpcmVkCisgICBpbml0aWFsIHZhbHVlIGZvciB0aGUgZm9yIHRoZSBjcmMuICBQcmUtIGFuZCBwb3N0LWNvbmRpdGlvbmluZyAob25lJ3MKKyAgIGNvbXBsZW1lbnQpIGlzIHBlcmZvcm1lZCB3aXRoaW4gdGhpcyBmdW5jdGlvbiBzbyBpdCBzaG91bGRuJ3QgYmUgZG9uZSBieSB0aGUKKyAgIGFwcGxpY2F0aW9uLgorCisgICBVc2FnZSBleGFtcGxlOgorCisgICAgIHVMb25nIGNyYyA9IGNyYzMyKDBMLCBaX05VTEwsIDApOworCisgICAgIHdoaWxlIChyZWFkX2J1ZmZlcihidWZmZXIsIGxlbmd0aCkgIT0gRU9GKSB7CisgICAgICAgY3JjID0gY3JjMzIoY3JjLCBidWZmZXIsIGxlbmd0aCk7CisgICAgIH0KKyAgICAgaWYgKGNyYyAhPSBvcmlnaW5hbF9jcmMpIGVycm9yKCk7CisqLworCisvKgorWkVYVEVSTiB1TG9uZyBaRVhQT1JUIGNyYzMyX2NvbWJpbmUgT0YoKHVMb25nIGNyYzEsIHVMb25nIGNyYzIsIHpfb2ZmX3QgbGVuMikpOworCisgICAgIENvbWJpbmUgdHdvIENSQy0zMiBjaGVjayB2YWx1ZXMgaW50byBvbmUuICBGb3IgdHdvIHNlcXVlbmNlcyBvZiBieXRlcywKKyAgIHNlcTEgYW5kIHNlcTIgd2l0aCBsZW5ndGhzIGxlbjEgYW5kIGxlbjIsIENSQy0zMiBjaGVjayB2YWx1ZXMgd2VyZQorICAgY2FsY3VsYXRlZCBmb3IgZWFjaCwgY3JjMSBhbmQgY3JjMi4gIGNyYzMyX2NvbWJpbmUoKSByZXR1cm5zIHRoZSBDUkMtMzIKKyAgIGNoZWNrIHZhbHVlIG9mIHNlcTEgYW5kIHNlcTIgY29uY2F0ZW5hdGVkLCByZXF1aXJpbmcgb25seSBjcmMxLCBjcmMyLCBhbmQKKyAgIGxlbjIuCisqLworCisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHZhcmlvdXMgaGFja3MsIGRvbid0IGxvb2sgOikgKi8KKworLyogZGVmbGF0ZUluaXQgYW5kIGluZmxhdGVJbml0IGFyZSBtYWNyb3MgdG8gYWxsb3cgY2hlY2tpbmcgdGhlIHpsaWIgdmVyc2lvbgorICogYW5kIHRoZSBjb21waWxlcidzIHZpZXcgb2Ygel9zdHJlYW06CisgKi8KK1pFWFRFUk4gaW50IFpFWFBPUlQgZGVmbGF0ZUluaXRfIE9GKCh6X3N0cmVhbXAgc3RybSwgaW50IGxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZlcnNpb24sIGludCBzdHJlYW1fc2l6ZSkpOworWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlSW5pdF8gT0YoKHpfc3RyZWFtcCBzdHJtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZlcnNpb24sIGludCBzdHJlYW1fc2l6ZSkpOworWkVYVEVSTiBpbnQgWkVYUE9SVCBkZWZsYXRlSW5pdDJfIE9GKCh6X3N0cmVhbXAgc3RybSwgaW50ICBsZXZlbCwgaW50ICBtZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aW5kb3dCaXRzLCBpbnQgbWVtTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJhdGVneSwgY29uc3QgY2hhciAqdmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmVhbV9zaXplKSk7CitaRVhURVJOIGludCBaRVhQT1JUIGluZmxhdGVJbml0Ml8gT0YoKHpfc3RyZWFtcCBzdHJtLCBpbnQgIHdpbmRvd0JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZlcnNpb24sIGludCBzdHJlYW1fc2l6ZSkpOworWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlQmFja0luaXRfIE9GKCh6X3N0cmVhbXAgc3RybSwgaW50IHdpbmRvd0JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgRkFSICp3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJlYW1fc2l6ZSkpOworI2RlZmluZSBkZWZsYXRlSW5pdChzdHJtLCBsZXZlbCkgXAorICAgICAgICBkZWZsYXRlSW5pdF8oKHN0cm0pLCAobGV2ZWwpLCBaTElCX1ZFUlNJT04sIChpbnQpc2l6ZW9mKHpfc3RyZWFtKSkKKyNkZWZpbmUgaW5mbGF0ZUluaXQoc3RybSkgXAorICAgICAgICBpbmZsYXRlSW5pdF8oKHN0cm0pLCBaTElCX1ZFUlNJT04sIChpbnQpc2l6ZW9mKHpfc3RyZWFtKSkKKyNkZWZpbmUgZGVmbGF0ZUluaXQyKHN0cm0sIGxldmVsLCBtZXRob2QsIHdpbmRvd0JpdHMsIG1lbUxldmVsLCBzdHJhdGVneSkgXAorICAgICAgICBkZWZsYXRlSW5pdDJfKChzdHJtKSwobGV2ZWwpLChtZXRob2QpLCh3aW5kb3dCaXRzKSwobWVtTGV2ZWwpLFwKKyAgICAgICAgICAgICAgICAgICAgICAoc3RyYXRlZ3kpLCBaTElCX1ZFUlNJT04sIChpbnQpc2l6ZW9mKHpfc3RyZWFtKSkKKyNkZWZpbmUgaW5mbGF0ZUluaXQyKHN0cm0sIHdpbmRvd0JpdHMpIFwKKyAgICAgICAgaW5mbGF0ZUluaXQyXygoc3RybSksICh3aW5kb3dCaXRzKSwgWkxJQl9WRVJTSU9OLCBcCisgICAgICAgICAgICAgICAgICAgICAgKGludClzaXplb2Yoel9zdHJlYW0pKQorI2RlZmluZSBpbmZsYXRlQmFja0luaXQoc3RybSwgd2luZG93Qml0cywgd2luZG93KSBcCisgICAgICAgIGluZmxhdGVCYWNrSW5pdF8oKHN0cm0pLCAod2luZG93Qml0cyksICh3aW5kb3cpLCBcCisgICAgICAgICAgICAgICAgICAgICAgWkxJQl9WRVJTSU9OLCAoaW50KXNpemVvZih6X3N0cmVhbSkpCisKKyNpZm5kZWYgWl9TT0xPCisKKy8qIGd6Z2V0YygpIG1hY3JvIGFuZCBpdHMgc3VwcG9ydGluZyBmdW5jdGlvbiBhbmQgZXhwb3NlZCBkYXRhIHN0cnVjdHVyZS4gIE5vdGUKKyAqIHRoYXQgdGhlIHJlYWwgaW50ZXJuYWwgc3RhdGUgaXMgbXVjaCBsYXJnZXIgdGhhbiB0aGUgZXhwb3NlZCBzdHJ1Y3R1cmUuCisgKiBUaGlzIGFiYnJldmlhdGVkIHN0cnVjdHVyZSBleHBvc2VzIGp1c3QgZW5vdWdoIGZvciB0aGUgZ3pnZXRjKCkgbWFjcm8uICBUaGUKKyAqIHVzZXIgc2hvdWxkIG5vdCBtZXNzIHdpdGggdGhlc2UgZXhwb3NlZCBlbGVtZW50cywgc2luY2UgdGhlaXIgbmFtZXMgb3IKKyAqIGJlaGF2aW9yIGNvdWxkIGNoYW5nZSBpbiB0aGUgZnV0dXJlLCBwZXJoYXBzIGV2ZW4gY2FwcmljaW91c2x5LiAgVGhleSBjYW4KKyAqIG9ubHkgYmUgdXNlZCBieSB0aGUgZ3pnZXRjKCkgbWFjcm8uICBZb3UgaGF2ZSBiZWVuIHdhcm5lZC4KKyAqLworc3RydWN0IGd6RmlsZV9zIHsKKyAgICB1bnNpZ25lZCBoYXZlOworICAgIHVuc2lnbmVkIGNoYXIgKm5leHQ7CisgICAgel9vZmY2NF90IHBvczsKK307CitaRVhURVJOIGludCBaRVhQT1JUIGd6Z2V0Y18gT0YoKGd6RmlsZSBmaWxlKSk7CisjZGVmaW5lIGd6Z2V0YyhnKSBcCisgICAgKChnKS0+aGF2ZSA/ICgoZyktPmhhdmUtLSwgKGcpLT5wb3MrKywgKigoZyktPm5leHQpKyspIDogZ3pnZXRjXyhnKSkKKworLyogcHJvdmlkZSA2NC1iaXQgb2Zmc2V0IGZ1bmN0aW9ucyBpZiBfTEFSR0VGSUxFNjRfU09VUkNFIGRlZmluZWQsIGFuZC9vcgorICogY2hhbmdlIHRoZSByZWd1bGFyIGZ1bmN0aW9ucyB0byA2NCBiaXRzIGlmIF9GSUxFX09GRlNFVF9CSVRTIGlzIDY0IChpZgorICogYm90aCBhcmUgdHJ1ZSwgdGhlIGFwcGxpY2F0aW9uIGdldHMgdGhlICo2NCBmdW5jdGlvbnMsIGFuZCB0aGUgcmVndWxhcgorICogZnVuY3Rpb25zIGFyZSBjaGFuZ2VkIHRvIDY0IGJpdHMpIC0tIGluIGNhc2UgdGhlc2UgYXJlIHNldCBvbiBzeXN0ZW1zCisgKiB3aXRob3V0IGxhcmdlIGZpbGUgc3VwcG9ydCwgX0xGUzY0X0xBUkdFRklMRSBtdXN0IGFsc28gYmUgdHJ1ZQorICovCisjaWYgZGVmaW5lZChfTEFSR0VGSUxFNjRfU09VUkNFKSAmJiBfTEZTNjRfTEFSR0VGSUxFLTAKKyAgIFpFWFRFUk4gZ3pGaWxlIFpFWFBPUlQgZ3pvcGVuNjQgT0YoKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKSk7CisgICBaRVhURVJOIHpfb2ZmNjRfdCBaRVhQT1JUIGd6c2VlazY0IE9GKChnekZpbGUsIHpfb2ZmNjRfdCwgaW50KSk7CisgICBaRVhURVJOIHpfb2ZmNjRfdCBaRVhQT1JUIGd6dGVsbDY0IE9GKChnekZpbGUpKTsKKyAgIFpFWFRFUk4gel9vZmY2NF90IFpFWFBPUlQgZ3pvZmZzZXQ2NCBPRigoZ3pGaWxlKSk7CisgICBaRVhURVJOIHVMb25nIFpFWFBPUlQgYWRsZXIzMl9jb21iaW5lNjQgT0YoKHVMb25nLCB1TG9uZywgel9vZmY2NF90KSk7CisgICBaRVhURVJOIHVMb25nIFpFWFBPUlQgY3JjMzJfY29tYmluZTY0IE9GKCh1TG9uZywgdUxvbmcsIHpfb2ZmNjRfdCkpOworI2VuZGlmCisKKyNpZiAhZGVmaW5lZChaTElCX0lOVEVSTkFMKSAmJiBfRklMRV9PRkZTRVRfQklUUy0wID09IDY0ICYmIF9MRlM2NF9MQVJHRUZJTEUtMAorIyAgaWZkZWYgWl9QUkVGSVhfU0VUCisjICAgIGRlZmluZSB6X2d6b3BlbiB6X2d6b3BlbjY0CisjICAgIGRlZmluZSB6X2d6c2VlayB6X2d6c2VlazY0CisjICAgIGRlZmluZSB6X2d6dGVsbCB6X2d6dGVsbDY0CisjICAgIGRlZmluZSB6X2d6b2Zmc2V0IHpfZ3pvZmZzZXQ2NAorIyAgICBkZWZpbmUgel9hZGxlcjMyX2NvbWJpbmUgel9hZGxlcjMyX2NvbWJpbmU2NAorIyAgICBkZWZpbmUgel9jcmMzMl9jb21iaW5lIHpfY3JjMzJfY29tYmluZTY0CisjICBlbHNlCisjICAgIGRlZmluZSBnem9wZW4gZ3pvcGVuNjQKKyMgICAgZGVmaW5lIGd6c2VlayBnenNlZWs2NAorIyAgICBkZWZpbmUgZ3p0ZWxsIGd6dGVsbDY0CisjICAgIGRlZmluZSBnem9mZnNldCBnem9mZnNldDY0CisjICAgIGRlZmluZSBhZGxlcjMyX2NvbWJpbmUgYWRsZXIzMl9jb21iaW5lNjQKKyMgICAgZGVmaW5lIGNyYzMyX2NvbWJpbmUgY3JjMzJfY29tYmluZTY0CisjICBlbmRpZgorIyAgaWZuZGVmIF9MQVJHRUZJTEU2NF9TT1VSQ0UKKyAgICAgWkVYVEVSTiBnekZpbGUgWkVYUE9SVCBnem9wZW42NCBPRigoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopKTsKKyAgICAgWkVYVEVSTiB6X29mZl90IFpFWFBPUlQgZ3pzZWVrNjQgT0YoKGd6RmlsZSwgel9vZmZfdCwgaW50KSk7CisgICAgIFpFWFRFUk4gel9vZmZfdCBaRVhQT1JUIGd6dGVsbDY0IE9GKChnekZpbGUpKTsKKyAgICAgWkVYVEVSTiB6X29mZl90IFpFWFBPUlQgZ3pvZmZzZXQ2NCBPRigoZ3pGaWxlKSk7CisgICAgIFpFWFRFUk4gdUxvbmcgWkVYUE9SVCBhZGxlcjMyX2NvbWJpbmU2NCBPRigodUxvbmcsIHVMb25nLCB6X29mZl90KSk7CisgICAgIFpFWFRFUk4gdUxvbmcgWkVYUE9SVCBjcmMzMl9jb21iaW5lNjQgT0YoKHVMb25nLCB1TG9uZywgel9vZmZfdCkpOworIyAgZW5kaWYKKyNlbHNlCisgICBaRVhURVJOIGd6RmlsZSBaRVhQT1JUIGd6b3BlbiBPRigoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopKTsKKyAgIFpFWFRFUk4gel9vZmZfdCBaRVhQT1JUIGd6c2VlayBPRigoZ3pGaWxlLCB6X29mZl90LCBpbnQpKTsKKyAgIFpFWFRFUk4gel9vZmZfdCBaRVhQT1JUIGd6dGVsbCBPRigoZ3pGaWxlKSk7CisgICBaRVhURVJOIHpfb2ZmX3QgWkVYUE9SVCBnem9mZnNldCBPRigoZ3pGaWxlKSk7CisgICBaRVhURVJOIHVMb25nIFpFWFBPUlQgYWRsZXIzMl9jb21iaW5lIE9GKCh1TG9uZywgdUxvbmcsIHpfb2ZmX3QpKTsKKyAgIFpFWFRFUk4gdUxvbmcgWkVYUE9SVCBjcmMzMl9jb21iaW5lIE9GKCh1TG9uZywgdUxvbmcsIHpfb2ZmX3QpKTsKKyNlbmRpZgorCisjZWxzZSAvKiBaX1NPTE8gKi8KKworICAgWkVYVEVSTiB1TG9uZyBaRVhQT1JUIGFkbGVyMzJfY29tYmluZSBPRigodUxvbmcsIHVMb25nLCB6X29mZl90KSk7CisgICBaRVhURVJOIHVMb25nIFpFWFBPUlQgY3JjMzJfY29tYmluZSBPRigodUxvbmcsIHVMb25nLCB6X29mZl90KSk7CisKKyNlbmRpZiAvKiAhWl9TT0xPICovCisKKy8qIGhhY2sgZm9yIGJ1Z2d5IGNvbXBpbGVycyAqLworI2lmICFkZWZpbmVkKFpVVElMX0gpICYmICFkZWZpbmVkKE5PX0RVTU1ZX0RFQ0wpCisgICAgc3RydWN0IGludGVybmFsX3N0YXRlIHtpbnQgZHVtbXk7fTsKKyNlbmRpZgorCisvKiB1bmRvY3VtZW50ZWQgZnVuY3Rpb25zICovCitaRVhURVJOIGNvbnN0IGNoYXIgICAqIFpFWFBPUlQgekVycm9yICAgICAgICAgICBPRigoaW50KSk7CitaRVhURVJOIGludCAgICAgICAgICAgIFpFWFBPUlQgaW5mbGF0ZVN5bmNQb2ludCBPRigoel9zdHJlYW1wKSk7CitaRVhURVJOIGNvbnN0IHVMb25nZiAqIFpFWFBPUlQgZ2V0X2NyY190YWJsZSAgICBPRigodm9pZCkpOworWkVYVEVSTiBpbnQgICAgICAgICAgICBaRVhQT1JUIGluZmxhdGVVbmRlcm1pbmUgT0YoKHpfc3RyZWFtcCwgaW50KSk7CitaRVhURVJOIGludCAgICAgICAgICAgIFpFWFBPUlQgaW5mbGF0ZVJlc2V0S2VlcCBPRigoel9zdHJlYW1wKSk7CitaRVhURVJOIGludCAgICAgICAgICAgIFpFWFBPUlQgZGVmbGF0ZVJlc2V0S2VlcCBPRigoel9zdHJlYW1wKSk7CisjaWZuZGVmIFpfU09MTworICBaRVhURVJOIHVuc2lnbmVkIGxvbmcgIFpFWFBPUlQgZ3pmbGFncyAgICAgICAgICBPRigodm9pZCkpOworI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBaTElCX0ggKi8KZGlmZiAtLWdpdCBhL3psaWItMS4yLjYvemxpYi5tYXAgYi96bGliLTEuMi42L3psaWIubWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0ZmE1NTMKLS0tIC9kZXYvbnVsbAorKysgYi96bGliLTEuMi42L3psaWIubWFwCkBAIC0wLDAgKzEsNzkgQEAKK1pMSUJfMS4yLjAgeworICBnbG9iYWw6CisgICAgY29tcHJlc3NCb3VuZDsKKyAgICBkZWZsYXRlQm91bmQ7CisgICAgaW5mbGF0ZUJhY2s7CisgICAgaW5mbGF0ZUJhY2tFbmQ7CisgICAgaW5mbGF0ZUJhY2tJbml0XzsKKyAgICBpbmZsYXRlQ29weTsKKyAgbG9jYWw6CisgICAgZGVmbGF0ZV9jb3B5cmlnaHQ7CisgICAgaW5mbGF0ZV9jb3B5cmlnaHQ7CisgICAgaW5mbGF0ZV9mYXN0OworICAgIGluZmxhdGVfdGFibGU7CisgICAgemNhbGxvYzsKKyAgICB6Y2ZyZWU7CisgICAgel9lcnJtc2c7CisgICAgZ3pfZXJyb3I7CisgICAgZ3pfaW50bWF4OworICAgIF8qOworfTsKKworWkxJQl8xLjIuMC4yIHsKKyAgICBnemNsZWFyZXJyOworICAgIGd6dW5nZXRjOworICAgIHpsaWJDb21waWxlRmxhZ3M7Cit9IFpMSUJfMS4yLjA7CisKK1pMSUJfMS4yLjAuOCB7CisgICAgZGVmbGF0ZVByaW1lOworfSBaTElCXzEuMi4wLjI7CisKK1pMSUJfMS4yLjIgeworICAgIGFkbGVyMzJfY29tYmluZTsKKyAgICBjcmMzMl9jb21iaW5lOworICAgIGRlZmxhdGVTZXRIZWFkZXI7CisgICAgaW5mbGF0ZUdldEhlYWRlcjsKK30gWkxJQl8xLjIuMC44OworCitaTElCXzEuMi4yLjMgeworICAgIGRlZmxhdGVUdW5lOworICAgIGd6ZGlyZWN0OworfSBaTElCXzEuMi4yOworCitaTElCXzEuMi4yLjQgeworICAgIGluZmxhdGVQcmltZTsKK30gWkxJQl8xLjIuMi4zOworCitaTElCXzEuMi4zLjMgeworICAgIGFkbGVyMzJfY29tYmluZTY0OworICAgIGNyYzMyX2NvbWJpbmU2NDsKKyAgICBnem9wZW42NDsKKyAgICBnenNlZWs2NDsKKyAgICBnenRlbGw2NDsKKyAgICBpbmZsYXRlVW5kZXJtaW5lOworfSBaTElCXzEuMi4yLjQ7CisKK1pMSUJfMS4yLjMuNCB7CisgICAgaW5mbGF0ZVJlc2V0MjsKKyAgICBpbmZsYXRlTWFyazsKK30gWkxJQl8xLjIuMy4zOworCitaTElCXzEuMi4zLjUgeworICAgIGd6YnVmZmVyOworICAgIGd6b2Zmc2V0OworICAgIGd6b2Zmc2V0NjQ7CisgICAgZ3pjbG9zZV9yOworICAgIGd6Y2xvc2VfdzsKK30gWkxJQl8xLjIuMy40OworCitaTElCXzEuMi41LjEgeworICAgIGRlZmxhdGVQZW5kaW5nOworfSBaTElCXzEuMi4zLjU7CisKK1pMSUJfMS4yLjUuMiB7CisgICAgZGVmbGF0ZVJlc2V0S2VlcDsKKyAgICBnemZsYWdzOworICAgIGd6Z2V0Y187CisgICAgaW5mbGF0ZVJlc2V0S2VlcDsKK30gWkxJQl8xLjIuNS4xOwpkaWZmIC0tZ2l0IGEvemxpYi0xLjIuNi96bGliLnBjLmluIGIvemxpYi0xLjIuNi96bGliLnBjLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlNWFjZjkKLS0tIC9kZXYvbnVsbAorKysgYi96bGliLTEuMi42L3psaWIucGMuaW4KQEAgLTAsMCArMSwxMyBAQAorcHJlZml4PUBwcmVmaXhACitleGVjX3ByZWZpeD1AZXhlY19wcmVmaXhACitsaWJkaXI9QGxpYmRpckAKK3NoYXJlZGxpYmRpcj1Ac2hhcmVkbGliZGlyQAoraW5jbHVkZWRpcj1AaW5jbHVkZWRpckAKKworTmFtZTogemxpYgorRGVzY3JpcHRpb246IHpsaWIgY29tcHJlc3Npb24gbGlicmFyeQorVmVyc2lvbjogQFZFUlNJT05ACisKK1JlcXVpcmVzOgorTGliczogLUwke2xpYmRpcn0gLUwke3NoYXJlZGxpYmRpcn0gLWx6CitDZmxhZ3M6IC1JJHtpbmNsdWRlZGlyfQpkaWZmIC0tZ2l0IGEvemxpYi0xLjIuNi96bGliMmFuc2kgYi96bGliLTEuMi42L3psaWIyYW5zaQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xNWUzZTE2Ci0tLSAvZGV2L251bGwKKysrIGIvemxpYi0xLjIuNi96bGliMmFuc2kKQEAgLTAsMCArMSwxNTIgQEAKKyMhL3Vzci9iaW4vcGVybAorCisjIFRyYW5zZm9ybSBLJlIgQyBmdW5jdGlvbiBkZWZpbml0aW9ucyBpbnRvIEFOU0kgZXF1aXZhbGVudC4KKyMKKyMgQXV0aG9yOiBQYXVsIE1hcnF1ZXNzCisjIFZlcnNpb246IDEuMAorIyBEYXRlOiAzIE9jdG9iZXIgMjAwNgorCisjIFRPRE8KKyMKKyMgQXN1bWVzIG5vIGZ1bmN0aW9uIHBvaW50ZXIgcGFyYW1ldGVycy4gdW5sZXNzIHRoZXkgYXJlIHR5cGVkZWZlZC4KKyMgQXNzdW1lcyBubyBsaXRlcmFsIHN0cmluZ3MgdGhhdCBsb29rIGxpa2UgZnVuY3Rpb24gZGVmaW5pdGlvbnMKKyMgQXNzdW1lcyBmdW5jdGlvbnMgc3RhcnQgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUKKwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKKworbG9jYWwgJC87CiskXyA9IDw+OworCitteSAkc3AgPSBxcnsgXHMqICg/OiAvXCogLio/IFwqLyApPyBccyogfXg7ICMgYXNzdW1lIG5vIG5lc3RlZCBjb21tZW50cworCitteSAkZDEgICAgPSBxcnsgJHNwICg/OiBbXHdcKlxzXSsgJHNwKSogJHNwIFx3KyAkc3AgW1xbXF1cc10qICRzcCB9eCA7CitteSAkZGVjbCAgPSBxcnsgJHNwICg/OiBcdysgJHNwICkrICRkMSB9eG8gOworbXkgJGRMaXN0ID0gcXJ7ICRzcCAkZGVjbCAoPzogJHNwICwgJGQxICkqICRzcCA7ICRzcCB9eG8gOworCisKK3doaWxlIChzL14KKyAgICAgICAgICAgICggICAgICAgICAgICAgICAgICAjIFN0YXJ0ICQxCisgICAgICAgICAgICAgICAgKCAgICAgICAgICAgICAgIyAgIFN0YXJ0ICQyCisgICAgICAgICAgICAgICAgICAgIC4qPyAgICAgICAgIyAgICAgTWluaW1hbCBlYXQgY29udGVudAorICAgICAgICAgICAgICAgICAgICAoIF4gXHcgW1x3XHNcKl0rICkgICAgIyAgICAgJDMgLS0gZnVuY3Rpb24gbmFtZQorICAgICAgICAgICAgICAgICAgICBccyogICAgICAgICMgICAgIG9wdGlvbmFsIHdoaXRlc3BhY2UKKyAgICAgICAgICAgICAgICApICAgICAgICAgICAgICAjICQyIC0gTWF0Y2hlZCB1cCB0byBiZWZvcmUgcGFyYW1ldGVyIGxpc3QKKworICAgICAgICAgICAgICAgIFwoIFxzKiAgICAgICAgICMgTGl0ZXJhbCAiKCIgKyBvcHRpb25hbCB3aGl0ZXNwYWNlCisgICAgICAgICAgICAgICAgKCBbXlwpXSsgKSAgICAgIyAkNCAtIG9uZSBvciBtb3JlIGFueXRoaW5ncyBleGNlcHQgIikiCisgICAgICAgICAgICAgICAgXHMqIFwpICAgICAgICAgIyBvcHRpb25hbCB3aGl0ZXNwYWNlIHN1cnJvdW5kaW5nIGEgTGl0ZXJhbCAiKSIKKworICAgICAgICAgICAgICAgICggKD86ICRkTGlzdCApKyApICMgJDUKKworICAgICAgICAgICAgICAgICRzcCBeIHsgICAgICAgICMgbGl0ZXJhbCAieyIgYXQgc3RhcnQgb2YgbGluZQorICAgICAgICAgICAgKSAgICAgICAgICAgICAgICAgICMgUmVtZW1iZXIgdG8gJDEKKyAgICAgICAgLy94c29tCisgICAgICApCit7CisgICAgbXkgJGFsbCA9ICQxIDsKKyAgICBteSAkcHJlZml4ID0gJDI7CisgICAgbXkgJHBhcmFtX2xpc3QgPSAkNCA7CisgICAgbXkgJHBhcmFtcyA9ICQ1OworCisgICAgU3RyaXBDb21tZW50cygkcGFyYW1zKTsKKyAgICBTdHJpcENvbW1lbnRzKCRwYXJhbV9saXN0KTsKKyAgICAkcGFyYW1fbGlzdCA9fiBzL15ccysvLzsKKyAgICAkcGFyYW1fbGlzdCA9fiBzL1xzKyQvLzsKKworICAgIG15ICRpID0gMCA7CisgICAgbXkgJXBMaXN0ID0gbWFwIHsgJF8gPT4gJGkrKyB9CisgICAgICAgICAgICAgICAgc3BsaXQgL1xzKixccyovLCAkcGFyYW1fbGlzdDsKKyAgICBteSAkcE1hdGNoID0gJyhcYicgLiBqb2luKCd8Jywga2V5cyAlcExpc3QpIC4gJ1xiKVxXKiQnIDsKKworICAgIG15IEBwYXJhbXMgPSBzcGxpdCAvXHMqO1xzKi8sICRwYXJhbXM7CisgICAgbXkgQG91dFBhcmFtcyA9ICgpOworICAgIGZvcmVhY2ggbXkgJHAgKEBwYXJhbXMpCisgICAgeworICAgICAgICBpZiAoJHAgPX4gLywvKQorICAgICAgICB7CisgICAgICAgICAgICBteSBAYml0cyA9IHNwbGl0IC9ccyosXHMqLywgJHA7CisgICAgICAgICAgICBteSAkZmlyc3QgPSBzaGlmdCBAYml0czsKKyAgICAgICAgICAgICRmaXJzdCA9fiBzL15ccyovLzsKKyAgICAgICAgICAgIHB1c2ggQG91dFBhcmFtcywgJGZpcnN0OworICAgICAgICAgICAgJGZpcnN0ID1+IC9eKFx3K1xzKikvOworICAgICAgICAgICAgbXkgJHR5cGUgPSAkMSA7CisgICAgICAgICAgICBwdXNoIEBvdXRQYXJhbXMsIG1hcCB7ICR0eXBlIC4gJF8gfSBAYml0czsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgICRwID1+IHMvXlxzKy8vOworICAgICAgICAgICAgcHVzaCBAb3V0UGFyYW1zLCAkcDsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgbXkgJXRtcCA9IG1hcCB7IC8kcE1hdGNoLzsgICRfID0+ICRwTGlzdHskMX0gIH0KKyAgICAgICAgICAgICAgQG91dFBhcmFtcyA7CisKKyAgICBAb3V0UGFyYW1zID0gbWFwICB7ICIgICAgJF8iIH0KKyAgICAgICAgICAgICAgICAgc29ydCB7ICR0bXB7JGF9IDw9PiAkdG1weyRifSB9CisgICAgICAgICAgICAgICAgIEBvdXRQYXJhbXMgOworCisgICAgcHJpbnQgJHByZWZpeCA7CisgICAgcHJpbnQgIihcbiIgLiBqb2luKCIsXG4iLCBAb3V0UGFyYW1zKSAuICIpXG4iOworICAgIHByaW50ICJ7IiA7CisKK30KKworIyBPdXRwdXQgYW55IHRyYWlsaW5nIGNvZGUuCitwcmludCA7CitleGl0IDA7CisKKworc3ViIFN0cmlwQ29tbWVudHMKK3sKKworICBubyB3YXJuaW5nczsKKworICAjIFN0cmlwIEMgJiBDKysgY29tZW50cworICAjIEZyb20gdGhlIHBlcmxmYXEKKyAgJF9bMF0gPX4KKworICAgIHN7CisgICAgICAgL1wqICAgICAgICAgIyMgIFN0YXJ0IG9mIC8qIC4uLiAqLyBjb21tZW50CisgICAgICAgW14qXSpcKisgICAgIyMgIE5vbi0qIGZvbGxvd2VkIGJ5IDEtb3ItbW9yZSAqJ3MKKyAgICAgICAoCisgICAgICAgICBbXi8qXVteKl0qXCorCisgICAgICAgKSogICAgICAgICAgIyMgIDAtb3ItbW9yZSB0aGluZ3Mgd2hpY2ggZG9uJ3Qgc3RhcnQgd2l0aCAvCisgICAgICAgICAgICAgICAgICAgIyMgICAgYnV0IGRvIGVuZCB3aXRoICcqJworICAgICAgIC8gICAgICAgICAgICMjICBFbmQgb2YgLyogLi4uICovIGNvbW1lbnQKKworICAgICB8ICAgICAgICAgIyMgICAgIE9SICBDKysgQ29tbWVudAorICAgICAgIC8vICAgICAgICAgICMjIFN0YXJ0IG9mIEMrKyBjb21tZW50IC8vCisgICAgICAgW15cbl0qICAgICAgIyMgZm9sbG93ZWQgYnkgMC1vci1tb3JlIG5vbiBlbmQgb2YgbGluZSBjaGFyYWN0ZXJzCisKKyAgICAgfCAgICAgICAgICMjICAgICBPUiAgdmFyaW91cyB0aGluZ3Mgd2hpY2ggYXJlbid0IGNvbW1lbnRzOgorCisgICAgICAgKAorICAgICAgICAgIiAgICAgICAgICAgIyMgIFN0YXJ0IG9mICIgLi4uICIgc3RyaW5nCisgICAgICAgICAoCisgICAgICAgICAgIFxcLiAgICAgICAgICAgIyMgIEVzY2FwZWQgY2hhcgorICAgICAgICAgfCAgICAgICAgICAgICAgICMjICAgIE9SCisgICAgICAgICAgIFteIlxcXSAgICAgICAgIyMgIE5vbiAiXAorICAgICAgICAgKSoKKyAgICAgICAgICIgICAgICAgICAgICMjICBFbmQgb2YgIiAuLi4gIiBzdHJpbmcKKworICAgICAgIHwgICAgICAgICAjIyAgICAgT1IKKworICAgICAgICAgJyAgICAgICAgICAgIyMgIFN0YXJ0IG9mICcgLi4uICcgc3RyaW5nCisgICAgICAgICAoCisgICAgICAgICAgIFxcLiAgICAgICAgICAgIyMgIEVzY2FwZWQgY2hhcgorICAgICAgICAgfCAgICAgICAgICAgICAgICMjICAgIE9SCisgICAgICAgICAgIFteJ1xcXSAgICAgICAgIyMgIE5vbiAnXAorICAgICAgICAgKSoKKyAgICAgICAgICcgICAgICAgICAgICMjICBFbmQgb2YgJyAuLi4gJyBzdHJpbmcKKworICAgICAgIHwgICAgICAgICAjIyAgICAgT1IKKworICAgICAgICAgLiAgICAgICAgICAgIyMgIEFueXRoaW5nIG90aGVyIGNoYXIKKyAgICAgICAgIFteLyInXFxdKiAgICMjICBDaGFycyB3aGljaCBkb2Vzbid0IHN0YXJ0IGEgY29tbWVudCwgc3RyaW5nIG9yIGVzY2FwZQorICAgICAgICkKKyAgICAgfXskMn1neHM7CisKK30KZGlmZiAtLWdpdCBhL3psaWItMS4yLjYvenV0aWwuYyBiL3psaWItMS4yLjYvenV0aWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTFkMjQyCi0tLSAvZGV2L251bGwKKysrIGIvemxpYi0xLjIuNi96dXRpbC5jCkBAIC0wLDAgKzEsMzAxIEBACisvKiB6dXRpbC5jIC0tIHRhcmdldCBkZXBlbmRlbnQgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIHRoZSBjb21wcmVzc2lvbiBsaWJyYXJ5CisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwNSwgMjAxMCwgMjAxMSBKZWFuLWxvdXAgR2FpbGx5LgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAorICovCisKKy8qIEAoIykgJElkJCAqLworCisjaW5jbHVkZSAienV0aWwuaCIKKworI2lmbmRlZiBOT19EVU1NWV9ERUNMCitzdHJ1Y3QgaW50ZXJuYWxfc3RhdGUgICAgICB7aW50IGR1bW15O307IC8qIGZvciBidWdneSBjb21waWxlcnMgKi8KKyNlbmRpZgorCitjb25zdCBjaGFyICogY29uc3Qgel9lcnJtc2dbMTBdID0geworIm5lZWQgZGljdGlvbmFyeSIsICAgICAvKiBaX05FRURfRElDVCAgICAgICAyICAqLworInN0cmVhbSBlbmQiLCAgICAgICAgICAvKiBaX1NUUkVBTV9FTkQgICAgICAxICAqLworIiIsICAgICAgICAgICAgICAgICAgICAvKiBaX09LICAgICAgICAgICAgICAwICAqLworImZpbGUgZXJyb3IiLCAgICAgICAgICAvKiBaX0VSUk5PICAgICAgICAgKC0xKSAqLworInN0cmVhbSBlcnJvciIsICAgICAgICAvKiBaX1NUUkVBTV9FUlJPUiAgKC0yKSAqLworImRhdGEgZXJyb3IiLCAgICAgICAgICAvKiBaX0RBVEFfRVJST1IgICAgKC0zKSAqLworImluc3VmZmljaWVudCBtZW1vcnkiLCAvKiBaX01FTV9FUlJPUiAgICAgKC00KSAqLworImJ1ZmZlciBlcnJvciIsICAgICAgICAvKiBaX0JVRl9FUlJPUiAgICAgKC01KSAqLworImluY29tcGF0aWJsZSB2ZXJzaW9uIiwvKiBaX1ZFUlNJT05fRVJST1IgKC02KSAqLworIiJ9OworCisKK2NvbnN0IGNoYXIgKiBaRVhQT1JUIHpsaWJWZXJzaW9uKCkKK3sKKyAgICByZXR1cm4gWkxJQl9WRVJTSU9OOworfQorCit1TG9uZyBaRVhQT1JUIHpsaWJDb21waWxlRmxhZ3MoKQoreworICAgIHVMb25nIGZsYWdzOworCisgICAgZmxhZ3MgPSAwOworICAgIHN3aXRjaCAoKGludCkoc2l6ZW9mKHVJbnQpKSkgeworICAgIGNhc2UgMjogICAgIGJyZWFrOworICAgIGNhc2UgNDogICAgIGZsYWdzICs9IDE7ICAgICBicmVhazsKKyAgICBjYXNlIDg6ICAgICBmbGFncyArPSAyOyAgICAgYnJlYWs7CisgICAgZGVmYXVsdDogICAgZmxhZ3MgKz0gMzsKKyAgICB9CisgICAgc3dpdGNoICgoaW50KShzaXplb2YodUxvbmcpKSkgeworICAgIGNhc2UgMjogICAgIGJyZWFrOworICAgIGNhc2UgNDogICAgIGZsYWdzICs9IDEgPDwgMjsgICAgICAgIGJyZWFrOworICAgIGNhc2UgODogICAgIGZsYWdzICs9IDIgPDwgMjsgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6ICAgIGZsYWdzICs9IDMgPDwgMjsKKyAgICB9CisgICAgc3dpdGNoICgoaW50KShzaXplb2Yodm9pZHBmKSkpIHsKKyAgICBjYXNlIDI6ICAgICBicmVhazsKKyAgICBjYXNlIDQ6ICAgICBmbGFncyArPSAxIDw8IDQ7ICAgICAgICBicmVhazsKKyAgICBjYXNlIDg6ICAgICBmbGFncyArPSAyIDw8IDQ7ICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OiAgICBmbGFncyArPSAzIDw8IDQ7CisgICAgfQorICAgIHN3aXRjaCAoKGludCkoc2l6ZW9mKHpfb2ZmX3QpKSkgeworICAgIGNhc2UgMjogICAgIGJyZWFrOworICAgIGNhc2UgNDogICAgIGZsYWdzICs9IDEgPDwgNjsgICAgICAgIGJyZWFrOworICAgIGNhc2UgODogICAgIGZsYWdzICs9IDIgPDwgNjsgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6ICAgIGZsYWdzICs9IDMgPDwgNjsKKyAgICB9CisjaWZkZWYgREVCVUcKKyAgICBmbGFncyArPSAxIDw8IDg7CisjZW5kaWYKKyNpZiBkZWZpbmVkKEFTTVYpIHx8IGRlZmluZWQoQVNNSU5GKQorICAgIGZsYWdzICs9IDEgPDwgOTsKKyNlbmRpZgorI2lmZGVmIFpMSUJfV0lOQVBJCisgICAgZmxhZ3MgKz0gMSA8PCAxMDsKKyNlbmRpZgorI2lmZGVmIEJVSUxERklYRUQKKyAgICBmbGFncyArPSAxIDw8IDEyOworI2VuZGlmCisjaWZkZWYgRFlOQU1JQ19DUkNfVEFCTEUKKyAgICBmbGFncyArPSAxIDw8IDEzOworI2VuZGlmCisjaWZkZWYgTk9fR1pDT01QUkVTUworICAgIGZsYWdzICs9IDFMIDw8IDE2OworI2VuZGlmCisjaWZkZWYgTk9fR1pJUAorICAgIGZsYWdzICs9IDFMIDw8IDE3OworI2VuZGlmCisjaWZkZWYgUEtaSVBfQlVHX1dPUktBUk9VTkQKKyAgICBmbGFncyArPSAxTCA8PCAyMDsKKyNlbmRpZgorI2lmZGVmIEZBU1RFU1QKKyAgICBmbGFncyArPSAxTCA8PCAyMTsKKyNlbmRpZgorI2lmZGVmIFpfU09MTworICAgIHJldHVybiBmbGFnczsKKyNlbHNlCisgICAgcmV0dXJuIGZsYWdzICsgZ3pmbGFncygpOworI2VuZGlmCit9CisKKyNpZmRlZiBERUJVRworCisjICBpZm5kZWYgdmVyYm9zZQorIyAgICBkZWZpbmUgdmVyYm9zZSAwCisjICBlbmRpZgoraW50IFpMSUJfSU5URVJOQUwgel92ZXJib3NlID0gdmVyYm9zZTsKKwordm9pZCBaTElCX0lOVEVSTkFMIHpfZXJyb3IgKG0pCisgICAgY2hhciAqbTsKK3sKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiVzXG4iLCBtKTsKKyAgICBleGl0KDEpOworfQorI2VuZGlmCisKKy8qIGV4cG9ydGVkIHRvIGFsbG93IGNvbnZlcnNpb24gb2YgZXJyb3IgY29kZSB0byBzdHJpbmcgZm9yIGNvbXByZXNzKCkgYW5kCisgKiB1bmNvbXByZXNzKCkKKyAqLworY29uc3QgY2hhciAqIFpFWFBPUlQgekVycm9yKGVycikKKyAgICBpbnQgZXJyOworeworICAgIHJldHVybiBFUlJfTVNHKGVycik7Cit9CisKKyNpZiBkZWZpbmVkKF9XSU4zMl9XQ0UpCisgICAgLyogVGhlIE1pY3Jvc29mdCBDIFJ1bi1UaW1lIExpYnJhcnkgZm9yIFdpbmRvd3MgQ0UgZG9lc24ndCBoYXZlCisgICAgICogZXJybm8uICBXZSBkZWZpbmUgaXQgYXMgYSBnbG9iYWwgdmFyaWFibGUgdG8gc2ltcGxpZnkgcG9ydGluZy4KKyAgICAgKiBJdHMgdmFsdWUgaXMgYWx3YXlzIDAgYW5kIHNob3VsZCBub3QgYmUgdXNlZC4KKyAgICAgKi8KKyAgICBpbnQgZXJybm8gPSAwOworI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9NRU1DUFkKKwordm9pZCBaTElCX0lOVEVSTkFMIHptZW1jcHkoZGVzdCwgc291cmNlLCBsZW4pCisgICAgQnl0ZWYqIGRlc3Q7CisgICAgY29uc3QgQnl0ZWYqIHNvdXJjZTsKKyAgICB1SW50ICBsZW47Cit7CisgICAgaWYgKGxlbiA9PSAwKSByZXR1cm47CisgICAgZG8geworICAgICAgICAqZGVzdCsrID0gKnNvdXJjZSsrOyAvKiA/Pz8gdG8gYmUgdW5yb2xsZWQgKi8KKyAgICB9IHdoaWxlICgtLWxlbiAhPSAwKTsKK30KKworaW50IFpMSUJfSU5URVJOQUwgem1lbWNtcChzMSwgczIsIGxlbikKKyAgICBjb25zdCBCeXRlZiogczE7CisgICAgY29uc3QgQnl0ZWYqIHMyOworICAgIHVJbnQgIGxlbjsKK3sKKyAgICB1SW50IGo7CisKKyAgICBmb3IgKGogPSAwOyBqIDwgbGVuOyBqKyspIHsKKyAgICAgICAgaWYgKHMxW2pdICE9IHMyW2pdKSByZXR1cm4gMiooczFbal0gPiBzMltqXSktMTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgWkxJQl9JTlRFUk5BTCB6bWVtemVybyhkZXN0LCBsZW4pCisgICAgQnl0ZWYqIGRlc3Q7CisgICAgdUludCAgbGVuOworeworICAgIGlmIChsZW4gPT0gMCkgcmV0dXJuOworICAgIGRvIHsKKyAgICAgICAgKmRlc3QrKyA9IDA7ICAvKiA/Pz8gdG8gYmUgdW5yb2xsZWQgKi8KKyAgICB9IHdoaWxlICgtLWxlbiAhPSAwKTsKK30KKyNlbmRpZgorCisjaWZuZGVmIFpfU09MTworCisjaWZkZWYgU1lTMTZCSVQKKworI2lmZGVmIF9fVFVSQk9DX18KKy8qIFR1cmJvIEMgaW4gMTYtYml0IG1vZGUgKi8KKworIyAgZGVmaW5lIE1ZX1pDQUxMT0MKKworLyogVHVyYm8gQyBtYWxsb2MoKSBkb2VzIG5vdCBhbGxvdyBkeW5hbWljIGFsbG9jYXRpb24gb2YgNjRLIGJ5dGVzCisgKiBhbmQgZmFybWFsbG9jKDY0SykgcmV0dXJucyBhIHBvaW50ZXIgd2l0aCBhbiBvZmZzZXQgb2YgOCwgc28gd2UKKyAqIG11c3QgZml4IHRoZSBwb2ludGVyLiBXYXJuaW5nOiB0aGUgcG9pbnRlciBtdXN0IGJlIHB1dCBiYWNrIHRvIGl0cworICogb3JpZ2luYWwgZm9ybSBpbiBvcmRlciB0byBmcmVlIGl0LCB1c2UgemNmcmVlKCkuCisgKi8KKworI2RlZmluZSBNQVhfUFRSIDEwCisvKiAxMCo2NEsgPSA2NDBLICovCisKK2xvY2FsIGludCBuZXh0X3B0ciA9IDA7CisKK3R5cGVkZWYgc3RydWN0IHB0cl90YWJsZV9zIHsKKyAgICB2b2lkcGYgb3JnX3B0cjsKKyAgICB2b2lkcGYgbmV3X3B0cjsKK30gcHRyX3RhYmxlOworCitsb2NhbCBwdHJfdGFibGUgdGFibGVbTUFYX1BUUl07CisvKiBUaGlzIHRhYmxlIGlzIHVzZWQgdG8gcmVtZW1iZXIgdGhlIG9yaWdpbmFsIGZvcm0gb2YgcG9pbnRlcnMKKyAqIHRvIGxhcmdlIGJ1ZmZlcnMgKDY0SykuIFN1Y2ggcG9pbnRlcnMgYXJlIG5vcm1hbGl6ZWQgd2l0aCBhIHplcm8gb2Zmc2V0LgorICogU2luY2UgTVNET1MgaXMgbm90IGEgcHJlZW1wdGl2ZSBtdWx0aXRhc2tpbmcgT1MsIHRoaXMgdGFibGUgaXMgbm90CisgKiBwcm90ZWN0ZWQgZnJvbSBjb25jdXJyZW50IGFjY2Vzcy4gVGhpcyBoYWNrIGRvZXNuJ3Qgd29yayBhbnl3YXkgb24KKyAqIGEgcHJvdGVjdGVkIHN5c3RlbSBsaWtlIE9TLzIuIFVzZSBNaWNyb3NvZnQgQyBpbnN0ZWFkLgorICovCisKK3ZvaWRwZiBaTElCX0lOVEVSTkFMIHpjYWxsb2MgKHZvaWRwZiBvcGFxdWUsIHVuc2lnbmVkIGl0ZW1zLCB1bnNpZ25lZCBzaXplKQoreworICAgIHZvaWRwZiBidWYgPSBvcGFxdWU7IC8qIGp1c3QgdG8gbWFrZSBzb21lIGNvbXBpbGVycyBoYXBweSAqLworICAgIHVsZyBic2l6ZSA9ICh1bGcpaXRlbXMqc2l6ZTsKKworICAgIC8qIElmIHdlIGFsbG9jYXRlIGxlc3MgdGhhbiA2NTUyMCBieXRlcywgd2UgYXNzdW1lIHRoYXQgZmFybWFsbG9jCisgICAgICogd2lsbCByZXR1cm4gYSB1c2FibGUgcG9pbnRlciB3aGljaCBkb2Vzbid0IGhhdmUgdG8gYmUgbm9ybWFsaXplZC4KKyAgICAgKi8KKyAgICBpZiAoYnNpemUgPCA2NTUyMEwpIHsKKyAgICAgICAgYnVmID0gZmFybWFsbG9jKGJzaXplKTsKKyAgICAgICAgaWYgKCoodXNoKikmYnVmICE9IDApIHJldHVybiBidWY7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYnVmID0gZmFybWFsbG9jKGJzaXplICsgMTZMKTsKKyAgICB9CisgICAgaWYgKGJ1ZiA9PSBOVUxMIHx8IG5leHRfcHRyID49IE1BWF9QVFIpIHJldHVybiBOVUxMOworICAgIHRhYmxlW25leHRfcHRyXS5vcmdfcHRyID0gYnVmOworCisgICAgLyogTm9ybWFsaXplIHRoZSBwb2ludGVyIHRvIHNlZzowICovCisgICAgKigodXNoKikmYnVmKzEpICs9ICgodXNoKSgodWNoKilidWYtMCkgKyAxNSkgPj4gNDsKKyAgICAqKHVzaCopJmJ1ZiA9IDA7CisgICAgdGFibGVbbmV4dF9wdHIrK10ubmV3X3B0ciA9IGJ1ZjsKKyAgICByZXR1cm4gYnVmOworfQorCit2b2lkIFpMSUJfSU5URVJOQUwgemNmcmVlICh2b2lkcGYgb3BhcXVlLCB2b2lkcGYgcHRyKQoreworICAgIGludCBuOworICAgIGlmICgqKHVzaCopJnB0ciAhPSAwKSB7IC8qIG9iamVjdCA8IDY0SyAqLworICAgICAgICBmYXJmcmVlKHB0cik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgLyogRmluZCB0aGUgb3JpZ2luYWwgcG9pbnRlciAqLworICAgIGZvciAobiA9IDA7IG4gPCBuZXh0X3B0cjsgbisrKSB7CisgICAgICAgIGlmIChwdHIgIT0gdGFibGVbbl0ubmV3X3B0cikgY29udGludWU7CisKKyAgICAgICAgZmFyZnJlZSh0YWJsZVtuXS5vcmdfcHRyKTsKKyAgICAgICAgd2hpbGUgKCsrbiA8IG5leHRfcHRyKSB7CisgICAgICAgICAgICB0YWJsZVtuLTFdID0gdGFibGVbbl07CisgICAgICAgIH0KKyAgICAgICAgbmV4dF9wdHItLTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBwdHIgPSBvcGFxdWU7IC8qIGp1c3QgdG8gbWFrZSBzb21lIGNvbXBpbGVycyBoYXBweSAqLworICAgIEFzc2VydCgwLCAiemNmcmVlOiBwdHIgbm90IGZvdW5kIik7Cit9CisKKyNlbmRpZiAvKiBfX1RVUkJPQ19fICovCisKKworI2lmZGVmIE1fSTg2CisvKiBNaWNyb3NvZnQgQyBpbiAxNi1iaXQgbW9kZSAqLworCisjICBkZWZpbmUgTVlfWkNBTExPQworCisjaWYgKCFkZWZpbmVkKF9NU0NfVkVSKSB8fCAoX01TQ19WRVIgPD0gNjAwKSkKKyMgIGRlZmluZSBfaGFsbG9jICBoYWxsb2MKKyMgIGRlZmluZSBfaGZyZWUgICBoZnJlZQorI2VuZGlmCisKK3ZvaWRwZiBaTElCX0lOVEVSTkFMIHpjYWxsb2MgKHZvaWRwZiBvcGFxdWUsIHVJbnQgaXRlbXMsIHVJbnQgc2l6ZSkKK3sKKyAgICBpZiAob3BhcXVlKSBvcGFxdWUgPSAwOyAvKiB0byBtYWtlIGNvbXBpbGVyIGhhcHB5ICovCisgICAgcmV0dXJuIF9oYWxsb2MoKGxvbmcpaXRlbXMsIHNpemUpOworfQorCit2b2lkIFpMSUJfSU5URVJOQUwgemNmcmVlICh2b2lkcGYgb3BhcXVlLCB2b2lkcGYgcHRyKQoreworICAgIGlmIChvcGFxdWUpIG9wYXF1ZSA9IDA7IC8qIHRvIG1ha2UgY29tcGlsZXIgaGFwcHkgKi8KKyAgICBfaGZyZWUocHRyKTsKK30KKworI2VuZGlmIC8qIE1fSTg2ICovCisKKyNlbmRpZiAvKiBTWVMxNkJJVCAqLworCisKKyNpZm5kZWYgTVlfWkNBTExPQyAvKiBBbnkgc3lzdGVtIHdpdGhvdXQgYSBzcGVjaWFsIGFsbG9jIGZ1bmN0aW9uICovCisKKyNpZm5kZWYgU1REQworZXh0ZXJuIHZvaWRwICBtYWxsb2MgT0YoKHVJbnQgc2l6ZSkpOworZXh0ZXJuIHZvaWRwICBjYWxsb2MgT0YoKHVJbnQgaXRlbXMsIHVJbnQgc2l6ZSkpOworZXh0ZXJuIHZvaWQgICBmcmVlICAgT0YoKHZvaWRwZiBwdHIpKTsKKyNlbmRpZgorCit2b2lkcGYgWkxJQl9JTlRFUk5BTCB6Y2FsbG9jIChvcGFxdWUsIGl0ZW1zLCBzaXplKQorICAgIHZvaWRwZiBvcGFxdWU7CisgICAgdW5zaWduZWQgaXRlbXM7CisgICAgdW5zaWduZWQgc2l6ZTsKK3sKKyAgICBpZiAob3BhcXVlKSBpdGVtcyArPSBzaXplIC0gc2l6ZTsgLyogbWFrZSBjb21waWxlciBoYXBweSAqLworICAgIHJldHVybiBzaXplb2YodUludCkgPiAyID8gKHZvaWRwZiltYWxsb2MoaXRlbXMgKiBzaXplKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZHBmKWNhbGxvYyhpdGVtcywgc2l6ZSk7Cit9CisKK3ZvaWQgWkxJQl9JTlRFUk5BTCB6Y2ZyZWUgKG9wYXF1ZSwgcHRyKQorICAgIHZvaWRwZiBvcGFxdWU7CisgICAgdm9pZHBmIHB0cjsKK3sKKyAgICBmcmVlKHB0cik7CisgICAgaWYgKG9wYXF1ZSkgcmV0dXJuOyAvKiBtYWtlIGNvbXBpbGVyIGhhcHB5ICovCit9CisKKyNlbmRpZiAvKiBNWV9aQ0FMTE9DICovCisKKyNlbmRpZiAvKiAhWl9TT0xPICovCmRpZmYgLS1naXQgYS96bGliLTEuMi42L3p1dGlsLmggYi96bGliLTEuMi42L3p1dGlsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZmMTExMgotLS0gL2Rldi9udWxsCisrKyBiL3psaWItMS4yLjYvenV0aWwuaApAQCAtMCwwICsxLDI0OCBAQAorLyogenV0aWwuaCAtLSBpbnRlcm5hbCBpbnRlcmZhY2UgYW5kIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGNvbXByZXNzaW9uIGxpYnJhcnkKKyAqIENvcHlyaWdodCAoQykgMTk5NS0yMDExIEplYW4tbG91cCBHYWlsbHkuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCisgKi8KKworLyogV0FSTklORzogdGhpcyBmaWxlIHNob3VsZCAqbm90KiBiZSB1c2VkIGJ5IGFwcGxpY2F0aW9ucy4gSXQgaXMKKyAgIHBhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBjb21wcmVzc2lvbiBsaWJyYXJ5IGFuZCBpcworICAgc3ViamVjdCB0byBjaGFuZ2UuIEFwcGxpY2F0aW9ucyBzaG91bGQgb25seSB1c2UgemxpYi5oLgorICovCisKKy8qIEAoIykgJElkJCAqLworCisjaWZuZGVmIFpVVElMX0gKKyNkZWZpbmUgWlVUSUxfSAorCisjaWYgKChfX0dOVUNfXy0wKSAqIDEwICsgX19HTlVDX01JTk9SX18tMCA+PSAzMykgJiYgIWRlZmluZWQoTk9fVklaKQorIyAgZGVmaW5lIFpMSUJfSU5URVJOQUwgX19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eSAoImhpZGRlbiIpKSkKKyNlbHNlCisjICBkZWZpbmUgWkxJQl9JTlRFUk5BTAorI2VuZGlmCisKKyNpbmNsdWRlICJ6bGliLmgiCisKKyNpZiBkZWZpbmVkKFNUREMpICYmICFkZWZpbmVkKFpfU09MTykKKyMgIGlmICEoZGVmaW5lZChfV0lOMzJfV0NFKSAmJiBkZWZpbmVkKF9NU0NfVkVSKSkKKyMgICAgaW5jbHVkZSA8c3RkZGVmLmg+CisjICBlbmRpZgorIyAgaW5jbHVkZSA8c3RyaW5nLmg+CisjICBpbmNsdWRlIDxzdGRsaWIuaD4KKyNlbmRpZgorCisjaWZkZWYgWl9TT0xPCisgICB0eXBlZGVmIGxvbmcgcHRyZGlmZl90OyAgLyogZ3Vlc3MgLS0gd2lsbCBiZSBjYXVnaHQgaWYgZ3Vlc3MgaXMgd3JvbmcgKi8KKyNlbmRpZgorCisjaWZuZGVmIGxvY2FsCisjICBkZWZpbmUgbG9jYWwgc3RhdGljCisjZW5kaWYKKy8qIGNvbXBpbGUgd2l0aCAtRGxvY2FsIGlmIHlvdXIgZGVidWdnZXIgY2FuJ3QgZmluZCBzdGF0aWMgc3ltYm9scyAqLworCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgIHVjaDsKK3R5cGVkZWYgdWNoIEZBUiB1Y2hmOwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCB1c2g7Cit0eXBlZGVmIHVzaCBGQVIgdXNoZjsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyAgdWxnOworCitleHRlcm4gY29uc3QgY2hhciAqIGNvbnN0IHpfZXJybXNnWzEwXTsgLyogaW5kZXhlZCBieSAyLXpsaWJfZXJyb3IgKi8KKy8qIChzaXplIGdpdmVuIHRvIGF2b2lkIHNpbGx5IHdhcm5pbmdzIHdpdGggVmlzdWFsIEMrKykgKi8KKworI2RlZmluZSBFUlJfTVNHKGVycikgel9lcnJtc2dbWl9ORUVEX0RJQ1QtKGVycildCisKKyNkZWZpbmUgRVJSX1JFVFVSTihzdHJtLGVycikgXAorICByZXR1cm4gKHN0cm0tPm1zZyA9IChjaGFyKilFUlJfTVNHKGVyciksIChlcnIpKQorLyogVG8gYmUgdXNlZCBvbmx5IHdoZW4gdGhlIHN0YXRlIGlzIGtub3duIHRvIGJlIHZhbGlkICovCisKKyAgICAgICAgLyogY29tbW9uIGNvbnN0YW50cyAqLworCisjaWZuZGVmIERFRl9XQklUUworIyAgZGVmaW5lIERFRl9XQklUUyBNQVhfV0JJVFMKKyNlbmRpZgorLyogZGVmYXVsdCB3aW5kb3dCaXRzIGZvciBkZWNvbXByZXNzaW9uLiBNQVhfV0JJVFMgaXMgZm9yIGNvbXByZXNzaW9uIG9ubHkgKi8KKworI2lmIE1BWF9NRU1fTEVWRUwgPj0gOAorIyAgZGVmaW5lIERFRl9NRU1fTEVWRUwgOAorI2Vsc2UKKyMgIGRlZmluZSBERUZfTUVNX0xFVkVMICBNQVhfTUVNX0xFVkVMCisjZW5kaWYKKy8qIGRlZmF1bHQgbWVtTGV2ZWwgKi8KKworI2RlZmluZSBTVE9SRURfQkxPQ0sgMAorI2RlZmluZSBTVEFUSUNfVFJFRVMgMQorI2RlZmluZSBEWU5fVFJFRVMgICAgMgorLyogVGhlIHRocmVlIGtpbmRzIG9mIGJsb2NrIHR5cGUgKi8KKworI2RlZmluZSBNSU5fTUFUQ0ggIDMKKyNkZWZpbmUgTUFYX01BVENIICAyNTgKKy8qIFRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIG1hdGNoIGxlbmd0aHMgKi8KKworI2RlZmluZSBQUkVTRVRfRElDVCAweDIwIC8qIHByZXNldCBkaWN0aW9uYXJ5IGZsYWcgaW4gemxpYiBoZWFkZXIgKi8KKworICAgICAgICAvKiB0YXJnZXQgZGVwZW5kZW5jaWVzICovCisKKyNpZiBkZWZpbmVkKE1TRE9TKSB8fCAoZGVmaW5lZChXSU5ET1dTKSAmJiAhZGVmaW5lZChXSU4zMikpCisjICBkZWZpbmUgT1NfQ09ERSAgMHgwMAorIyAgaWZuZGVmIFpfU09MTworIyAgICBpZiBkZWZpbmVkKF9fVFVSQk9DX18pIHx8IGRlZmluZWQoX19CT1JMQU5EQ19fKQorIyAgICAgIGlmIChfX1NURENfXyA9PSAxKSAmJiAoZGVmaW5lZChfX0xBUkdFX18pIHx8IGRlZmluZWQoX19DT01QQUNUX18pKQorICAgICAgICAgLyogQWxsb3cgY29tcGlsYXRpb24gd2l0aCBBTlNJIGtleXdvcmRzIG9ubHkgZW5hYmxlZCAqLworICAgICAgICAgdm9pZCBfQ2RlY2wgZmFyZnJlZSggdm9pZCAqYmxvY2sgKTsKKyAgICAgICAgIHZvaWQgKl9DZGVjbCBmYXJtYWxsb2MoIHVuc2lnbmVkIGxvbmcgbmJ5dGVzICk7CisjICAgICAgZWxzZQorIyAgICAgICAgaW5jbHVkZSA8YWxsb2MuaD4KKyMgICAgICBlbmRpZgorIyAgICBlbHNlIC8qIE1TQyBvciBESkdQUCAqLworIyAgICAgIGluY2x1ZGUgPG1hbGxvYy5oPgorIyAgICBlbmRpZgorIyAgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgQU1JR0EKKyMgIGRlZmluZSBPU19DT0RFICAweDAxCisjZW5kaWYKKworI2lmIGRlZmluZWQoVkFYQykgfHwgZGVmaW5lZChWTVMpCisjICBkZWZpbmUgT1NfQ09ERSAgMHgwMgorIyAgZGVmaW5lIEZfT1BFTihuYW1lLCBtb2RlKSBcCisgICAgIGZvcGVuKChuYW1lKSwgKG1vZGUpLCAibWJjPTYwIiwgImN0eD1zdG0iLCAicmZtPWZpeCIsICJtcnM9NTEyIikKKyNlbmRpZgorCisjaWYgZGVmaW5lZChBVEFSSSkgfHwgZGVmaW5lZChhdGFyaXN0KQorIyAgZGVmaW5lIE9TX0NPREUgIDB4MDUKKyNlbmRpZgorCisjaWZkZWYgT1MyCisjICBkZWZpbmUgT1NfQ09ERSAgMHgwNgorIyAgaWYgZGVmaW5lZChNX0k4NikgJiYgIWRlZmluZWQoWl9TT0xPKQorIyAgICBpbmNsdWRlIDxtYWxsb2MuaD4KKyMgIGVuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQoTUFDT1MpIHx8IGRlZmluZWQoVEFSR0VUX09TX01BQykKKyMgIGRlZmluZSBPU19DT0RFICAweDA3CisjICBpZm5kZWYgWl9TT0xPCisjICAgIGlmIGRlZmluZWQoX19NV0VSS1NfXykgJiYgX19kZXN0X29zICE9IF9fYmVfb3MgJiYgX19kZXN0X29zICE9IF9fd2luMzJfb3MKKyMgICAgICBpbmNsdWRlIDx1bml4Lmg+IC8qIGZvciBmZG9wZW4gKi8KKyMgICAgZWxzZQorIyAgICAgIGlmbmRlZiBmZG9wZW4KKyMgICAgICAgIGRlZmluZSBmZG9wZW4oZmQsbW9kZSkgTlVMTCAvKiBObyBmZG9wZW4oKSAqLworIyAgICAgIGVuZGlmCisjICAgIGVuZGlmCisjICBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBUT1BTMjAKKyMgIGRlZmluZSBPU19DT0RFICAweDBhCisjZW5kaWYKKworI2lmZGVmIFdJTjMyCisjICBpZm5kZWYgX19DWUdXSU5fXyAgLyogQ3lnd2luIGlzIFVuaXgsIG5vdCBXaW4zMiAqLworIyAgICBkZWZpbmUgT1NfQ09ERSAgMHgwYgorIyAgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgX181MFNFUklFUyAvKiBQcmltZS9QUklNT1MgKi8KKyMgIGRlZmluZSBPU19DT0RFICAweDBmCisjZW5kaWYKKworI2lmIGRlZmluZWQoX0JFT1NfKSB8fCBkZWZpbmVkKFJJU0NPUykKKyMgIGRlZmluZSBmZG9wZW4oZmQsbW9kZSkgTlVMTCAvKiBObyBmZG9wZW4oKSAqLworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID4gNjAwKSkgJiYgIWRlZmluZWQgX19JTlRFUklYCisjICBpZiBkZWZpbmVkKF9XSU4zMl9XQ0UpCisjICAgIGRlZmluZSBmZG9wZW4oZmQsbW9kZSkgTlVMTCAvKiBObyBmZG9wZW4oKSAqLworIyAgICBpZm5kZWYgX1BUUkRJRkZfVF9ERUZJTkVECisgICAgICAgdHlwZWRlZiBpbnQgcHRyZGlmZl90OworIyAgICAgIGRlZmluZSBfUFRSRElGRl9UX0RFRklORUQKKyMgICAgZW5kaWYKKyMgIGVsc2UKKyMgICAgZGVmaW5lIGZkb3BlbihmZCx0eXBlKSAgX2Zkb3BlbihmZCx0eXBlKQorIyAgZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX0JPUkxBTkRDX18pICYmICFkZWZpbmVkKE1TRE9TKQorICAjcHJhZ21hIHdhcm4gLTgwMDQKKyAgI3ByYWdtYSB3YXJuIC04MDA4CisgICNwcmFnbWEgd2FybiAtODA2NgorI2VuZGlmCisKKy8qIHByb3ZpZGUgcHJvdG90eXBlcyBmb3IgdGhlc2Ugd2hlbiBidWlsZGluZyB6bGliIHdpdGhvdXQgTEZTICovCisjaWYgIWRlZmluZWQoX1dJTjMyKSAmJiAoIWRlZmluZWQoX0xBUkdFRklMRTY0X1NPVVJDRSkgfHwgX0xGUzY0X0xBUkdFRklMRS0wID09IDApCisgICAgWkVYVEVSTiB1TG9uZyBaRVhQT1JUIGFkbGVyMzJfY29tYmluZTY0IE9GKCh1TG9uZywgdUxvbmcsIHpfb2ZmX3QpKTsKKyAgICBaRVhURVJOIHVMb25nIFpFWFBPUlQgY3JjMzJfY29tYmluZTY0IE9GKCh1TG9uZywgdUxvbmcsIHpfb2ZmX3QpKTsKKyNlbmRpZgorCisgICAgICAgIC8qIGNvbW1vbiBkZWZhdWx0cyAqLworCisjaWZuZGVmIE9TX0NPREUKKyMgIGRlZmluZSBPU19DT0RFICAweDAzICAvKiBhc3N1bWUgVW5peCAqLworI2VuZGlmCisKKyNpZm5kZWYgRl9PUEVOCisjICBkZWZpbmUgRl9PUEVOKG5hbWUsIG1vZGUpIGZvcGVuKChuYW1lKSwgKG1vZGUpKQorI2VuZGlmCisKKyAgICAgICAgIC8qIGZ1bmN0aW9ucyAqLworCisjaWYgZGVmaW5lZChweXIpIHx8IGRlZmluZWQoWl9TT0xPKQorIyAgZGVmaW5lIE5PX01FTUNQWQorI2VuZGlmCisjaWYgZGVmaW5lZChTTUFMTF9NRURJVU0pICYmICFkZWZpbmVkKF9NU0NfVkVSKSAmJiAhZGVmaW5lZChfX1NDX18pCisgLyogVXNlIG91ciBvd24gZnVuY3Rpb25zIGZvciBzbWFsbCBhbmQgbWVkaXVtIG1vZGVsIHdpdGggTVNDIDw9IDUuMC4KKyAgKiBZb3UgbWF5IGhhdmUgdG8gdXNlIHRoZSBzYW1lIHN0cmF0ZWd5IGZvciBCb3JsYW5kIEMgKHVudGVzdGVkKS4KKyAgKiBUaGUgX19TQ19fIGNoZWNrIGlzIGZvciBTeW1hbnRlYy4KKyAgKi8KKyMgIGRlZmluZSBOT19NRU1DUFkKKyNlbmRpZgorI2lmIGRlZmluZWQoU1REQykgJiYgIWRlZmluZWQoSEFWRV9NRU1DUFkpICYmICFkZWZpbmVkKE5PX01FTUNQWSkKKyMgIGRlZmluZSBIQVZFX01FTUNQWQorI2VuZGlmCisjaWZkZWYgSEFWRV9NRU1DUFkKKyMgIGlmZGVmIFNNQUxMX01FRElVTSAvKiBNU0RPUyBzbWFsbCBvciBtZWRpdW0gbW9kZWwgKi8KKyMgICAgZGVmaW5lIHptZW1jcHkgX2ZtZW1jcHkKKyMgICAgZGVmaW5lIHptZW1jbXAgX2ZtZW1jbXAKKyMgICAgZGVmaW5lIHptZW16ZXJvKGRlc3QsIGxlbikgX2ZtZW1zZXQoZGVzdCwgMCwgbGVuKQorIyAgZWxzZQorIyAgICBkZWZpbmUgem1lbWNweSBtZW1jcHkKKyMgICAgZGVmaW5lIHptZW1jbXAgbWVtY21wCisjICAgIGRlZmluZSB6bWVtemVybyhkZXN0LCBsZW4pIG1lbXNldChkZXN0LCAwLCBsZW4pCisjICBlbmRpZgorI2Vsc2UKKyAgIHZvaWQgWkxJQl9JTlRFUk5BTCB6bWVtY3B5IE9GKChCeXRlZiogZGVzdCwgY29uc3QgQnl0ZWYqIHNvdXJjZSwgdUludCBsZW4pKTsKKyAgIGludCBaTElCX0lOVEVSTkFMIHptZW1jbXAgT0YoKGNvbnN0IEJ5dGVmKiBzMSwgY29uc3QgQnl0ZWYqIHMyLCB1SW50IGxlbikpOworICAgdm9pZCBaTElCX0lOVEVSTkFMIHptZW16ZXJvIE9GKChCeXRlZiogZGVzdCwgdUludCBsZW4pKTsKKyNlbmRpZgorCisvKiBEaWFnbm9zdGljIGZ1bmN0aW9ucyAqLworI2lmZGVmIERFQlVHCisjICBpbmNsdWRlIDxzdGRpby5oPgorICAgZXh0ZXJuIGludCBaTElCX0lOVEVSTkFMIHpfdmVyYm9zZTsKKyAgIGV4dGVybiB2b2lkIFpMSUJfSU5URVJOQUwgel9lcnJvciBPRigoY2hhciAqbSkpOworIyAgZGVmaW5lIEFzc2VydChjb25kLG1zZykge2lmKCEoY29uZCkpIHpfZXJyb3IobXNnKTt9CisjICBkZWZpbmUgVHJhY2UoeCkge2lmICh6X3ZlcmJvc2U+PTApIGZwcmludGYgeCA7fQorIyAgZGVmaW5lIFRyYWNldih4KSB7aWYgKHpfdmVyYm9zZT4wKSBmcHJpbnRmIHggO30KKyMgIGRlZmluZSBUcmFjZXZ2KHgpIHtpZiAoel92ZXJib3NlPjEpIGZwcmludGYgeCA7fQorIyAgZGVmaW5lIFRyYWNlYyhjLHgpIHtpZiAoel92ZXJib3NlPjAgJiYgKGMpKSBmcHJpbnRmIHggO30KKyMgIGRlZmluZSBUcmFjZWN2KGMseCkge2lmICh6X3ZlcmJvc2U+MSAmJiAoYykpIGZwcmludGYgeCA7fQorI2Vsc2UKKyMgIGRlZmluZSBBc3NlcnQoY29uZCxtc2cpCisjICBkZWZpbmUgVHJhY2UoeCkKKyMgIGRlZmluZSBUcmFjZXYoeCkKKyMgIGRlZmluZSBUcmFjZXZ2KHgpCisjICBkZWZpbmUgVHJhY2VjKGMseCkKKyMgIGRlZmluZSBUcmFjZWN2KGMseCkKKyNlbmRpZgorCisjaWZuZGVmIFpfU09MTworICAgdm9pZHBmIFpMSUJfSU5URVJOQUwgemNhbGxvYyBPRigodm9pZHBmIG9wYXF1ZSwgdW5zaWduZWQgaXRlbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaXplKSk7CisgICB2b2lkIFpMSUJfSU5URVJOQUwgemNmcmVlICBPRigodm9pZHBmIG9wYXF1ZSwgdm9pZHBmIHB0cikpOworI2VuZGlmCisKKyNkZWZpbmUgWkFMTE9DKHN0cm0sIGl0ZW1zLCBzaXplKSBcCisgICAgICAgICAgICgqKChzdHJtKS0+emFsbG9jKSkoKHN0cm0pLT5vcGFxdWUsIChpdGVtcyksIChzaXplKSkKKyNkZWZpbmUgWkZSRUUoc3RybSwgYWRkcikgICgqKChzdHJtKS0+emZyZWUpKSgoc3RybSktPm9wYXF1ZSwgKHZvaWRwZikoYWRkcikpCisjZGVmaW5lIFRSWV9GUkVFKHMsIHApIHtpZiAocCkgWkZSRUUocywgcCk7fQorCisjZW5kaWYgLyogWlVUSUxfSCAqLwpkaWZmIC0tZ2l0IGEvemxpYi5wYXRjaGVzL3psaWItNTAuZGVzY3JpcHRpb24gYi96bGliLnBhdGNoZXMvemxpYi01MC5kZXNjcmlwdGlvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmRhNDdiCi0tLSAvZGV2L251bGwKKysrIGIvemxpYi5wYXRjaGVzL3psaWItNTAuZGVzY3JpcHRpb24KQEAgLTAsMCArMSBAQAorUGF0Y2ggdG8gYWxsb3cgYnVpbGRpbmcgemxpYiB3aXRoIG5vbi1jb2xvY2F0ZWQgc291cmNlIGFuZCBvYmplY3QgdHJlZXMuCmRpZmYgLS1naXQgYS96bGliLnBhdGNoZXMvemxpYi01MC5wYXRjaCBiL3psaWIucGF0Y2hlcy96bGliLTUwLnBhdGNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllZjU2YjAKLS0tIC9kZXYvbnVsbAorKysgYi96bGliLnBhdGNoZXMvemxpYi01MC5wYXRjaApAQCAtMCwwICsxLDY4NyBAQAorZGlmZiAtYXJ1TiBhL2NvbmZpZ3VyZSBiL2NvbmZpZ3VyZQorLS0tIGEvY29uZmlndXJlCTIwMTItMDEtMjkgMDk6NDg6MTEuMDAwMDAwMDAwIC0wODAwCisrKysgYi9jb25maWd1cmUJMjAxMi0wMi0wOCAxMjo1MzoyNy4yMTQ4MzIyMzAgLTA4MDAKK0BAIC0xMyw5ICsxMywxNSBAQAorICMgSWYgeW91IGhhdmUgcHJvYmxlbXMsIHRyeSB3aXRob3V0IGRlZmluaW5nIENDIGFuZCBDRkxBR1MgYmVmb3JlIHJlcG9ydGluZworICMgYW4gZXJyb3IuCisgCistZWNobyAtLS0tLS0tLS0tLS0tLS0tLS0tLSA+PiBjb25maWd1cmUubG9nCistZWNobyAkMCAkKiA+PiBjb25maWd1cmUubG9nCistZGF0ZSA+PiBjb25maWd1cmUubG9nCisrY29uZmRpcj1gZGlybmFtZSAiJDAiYAorK3NyY2Rpcj0kY29uZmRpcgorK2J1aWxkZGlyPWBwd2RgCisrCisrTE9HPSIkYnVpbGRkaXIvY29uZmlndXJlLmxvZyIKKysKKytlY2hvIC0tLS0tLS0tLS0tLS0tLS0tLS0tID4+ICR7TE9HfQorK2VjaG8gJDAgJCogPj4gJHtMT0d9CisrZGF0ZSA+PiAke0xPR30KKyAKKyBpZiBbIC1uICIke0NIT1NUfSIgXTsgdGhlbgorICAgICB1bmFtZT0iYGVjaG8gIiR7Q0hPU1R9IiB8IHNlZCAtZSAncy9eW14tXSotXChbXi1dKlwpJC9cMS8nIC1lICdzL15bXi1dKi1bXi1dKi1cKFteLV0qXCkkL1wxLycgLWUgJ3MvXlteLV0qLVteLV0qLVwoW14tXSpcKS0uKiQvXDEvJ2AiCitAQCAtMjMsMjcgKzI5LDI3IEBACisgZmkKKyAKKyBTVEFUSUNMSUI9bGliei5hCistVkVSPWBzZWQgLW4gLWUgJy9WRVJTSU9OICIvcy8uKiJcKC4qXCkiLiovXDEvcCcgPCB6bGliLmhgCistVkVSMz1gc2VkIC1uIC1lICcvVkVSU0lPTiAiL3MvLioiXChbMC05XSpcXC5bMC05XSpcXC5bMC05XSpcKS4qL1wxL3AnIDwgemxpYi5oYAorLVZFUjI9YHNlZCAtbiAtZSAnL1ZFUlNJT04gIi9zLy4qIlwoWzAtOV0qXFwuWzAtOV0qXClcXC4uKi9cMS9wJyA8IHpsaWIuaGAKKy1WRVIxPWBzZWQgLW4gLWUgJy9WRVJTSU9OICIvcy8uKiJcKFswLTldKlwpXFwuLiovXDEvcCcgPCB6bGliLmhgCisrVkVSPWBzZWQgLW4gLWUgJy9WRVJTSU9OICIvcy8uKiJcKC4qXCkiLiovXDEvcCcgPCAkc3JjZGlyL3psaWIuaGAKKytWRVIzPWBzZWQgLW4gLWUgJy9WRVJTSU9OICIvcy8uKiJcKFswLTldKlxcLlswLTldKlxcLlswLTldKlwpLiovXDEvcCcgPCAkc3JjZGlyL3psaWIuaGAKKytWRVIyPWBzZWQgLW4gLWUgJy9WRVJTSU9OICIvcy8uKiJcKFswLTldKlxcLlswLTldKlwpXFwuLiovXDEvcCcgPCAkc3JjZGlyL3psaWIuaGAKKytWRVIxPWBzZWQgLW4gLWUgJy9WRVJTSU9OICIvcy8uKiJcKFswLTldKlwpXFwuLiovXDEvcCcgPCAkc3JjZGlyL3psaWIuaGAKKyBpZiAiJHtDUk9TU19QUkVGSVh9YXIiIC0tdmVyc2lvbiA+L2Rldi9udWxsIDI+L2Rldi9udWxsIHx8IHRlc3QgJD8gLWx0IDEyNjsgdGhlbgorICAgICBBUj0ke0FSLSIke0NST1NTX1BSRUZJWH1hciJ9CistICAgIHRlc3QgLW4gIiR7Q1JPU1NfUFJFRklYfSIgJiYgZWNobyBVc2luZyAke0FSfSB8IHRlZSAtYSBjb25maWd1cmUubG9nCisrICAgIHRlc3QgLW4gIiR7Q1JPU1NfUFJFRklYfSIgJiYgZWNobyBVc2luZyAke0FSfSB8IHRlZSAtYSAke0xPR30KKyBlbHNlCisgICAgIEFSPSR7QVItImFyIn0KKy0gICAgdGVzdCAtbiAiJHtDUk9TU19QUkVGSVh9IiAmJiBlY2hvIFVzaW5nICR7QVJ9IHwgdGVlIC1hIGNvbmZpZ3VyZS5sb2cKKysgICAgdGVzdCAtbiAiJHtDUk9TU19QUkVGSVh9IiAmJiBlY2hvIFVzaW5nICR7QVJ9IHwgdGVlIC1hICR7TE9HfQorIGZpCisgQVJGTEFHUz0ke0FSRkxBR1MtInJjIn0KKyBpZiAiJHtDUk9TU19QUkVGSVh9cmFubGliIiAtLXZlcnNpb24gPi9kZXYvbnVsbCAyPi9kZXYvbnVsbCB8fCB0ZXN0ICQ/IC1sdCAxMjY7IHRoZW4KKyAgICAgUkFOTElCPSR7UkFOTElCLSIke0NST1NTX1BSRUZJWH1yYW5saWIifQorLSAgICB0ZXN0IC1uICIke0NST1NTX1BSRUZJWH0iICYmIGVjaG8gVXNpbmcgJHtSQU5MSUJ9IHwgdGVlIC1hIGNvbmZpZ3VyZS5sb2cKKysgICAgdGVzdCAtbiAiJHtDUk9TU19QUkVGSVh9IiAmJiBlY2hvIFVzaW5nICR7UkFOTElCfSB8IHRlZSAtYSAke0xPR30KKyBlbHNlCisgICAgIFJBTkxJQj0ke1JBTkxJQi0icmFubGliIn0KKyBmaQorIGlmICIke0NST1NTX1BSRUZJWH1ubSIgLS12ZXJzaW9uID4vZGV2L251bGwgMj4vZGV2L251bGwgfHwgdGVzdCAkPyAtbHQgMTI2OyB0aGVuCisgICAgIE5NPSR7Tk0tIiR7Q1JPU1NfUFJFRklYfW5tIn0KKy0gICAgdGVzdCAtbiAiJHtDUk9TU19QUkVGSVh9IiAmJiBlY2hvIFVzaW5nICR7Tk19IHwgdGVlIC1hIGNvbmZpZ3VyZS5sb2cKKysgICAgdGVzdCAtbiAiJHtDUk9TU19QUkVGSVh9IiAmJiBlY2hvIFVzaW5nICR7Tk19IHwgdGVlIC1hICR7TE9HfQorIGVsc2UKKyAgICAgTk09JHtOTS0ibm0ifQorIGZpCitAQCAtNzIsMTAgKzc4LDEwIEBACisgZG8KKyBjYXNlICIkMSIgaW4KKyAgICAgLWgqIHwgLS1oZWxwKQorLSAgICAgIGVjaG8gJ3VzYWdlOicgfCB0ZWUgLWEgY29uZmlndXJlLmxvZworLSAgICAgIGVjaG8gJyAgY29uZmlndXJlIFstLXpwcmVmaXhdIFstLXByZWZpeD1QUkVGSVhdICBbLS1lcHJlZml4PUVYUFJFRklYXScgfCB0ZWUgLWEgY29uZmlndXJlLmxvZworLSAgICAgIGVjaG8gJyAgICBbLS1zdGF0aWNdIFstLTY0XSBbLS1saWJkaXI9TElCRElSXSBbLS1zaGFyZWRsaWJkaXI9TElCRElSXScgfCB0ZWUgLWEgY29uZmlndXJlLmxvZworLSAgICAgIGVjaG8gJyAgICBbLS1pbmNsdWRlZGlyPUlOQ0xVREVESVJdIFstLWFyY2hzPSItYXJjaCBpMzg2IC1hcmNoIHg4Nl82NCJdJyB8IHRlZSAtYSBjb25maWd1cmUubG9nCisrICAgICAgZWNobyAndXNhZ2U6JyB8IHRlZSAtYSAke0xPR30KKysgICAgICBlY2hvICcgIGNvbmZpZ3VyZSBbLS16cHJlZml4XSBbLS1wcmVmaXg9UFJFRklYXSAgWy0tZXByZWZpeD1FWFBSRUZJWF0nIHwgdGVlIC1hICR7TE9HfQorKyAgICAgIGVjaG8gJyAgICBbLS1zdGF0aWNdIFstLTY0XSBbLS1saWJkaXI9TElCRElSXSBbLS1zaGFyZWRsaWJkaXI9TElCRElSXScgfCB0ZWUgLWEgJHtMT0d9CisrICAgICAgZWNobyAnICAgIFstLWluY2x1ZGVkaXI9SU5DTFVERURJUl0gWy0tYXJjaHM9Ii1hcmNoIGkzODYgLWFyY2ggeDg2XzY0Il0nIHwgdGVlIC1hICR7TE9HfQorICAgICAgICAgZXhpdCAwIDs7CisgICAgIC1wKj0qIHwgLS1wcmVmaXg9KikgcHJlZml4PWBlY2hvICQxIHwgc2VkICdzLy4qPS8vJ2A7IHNoaWZ0IDs7CisgICAgIC1lKj0qIHwgLS1lcHJlZml4PSopIGV4ZWNfcHJlZml4PWBlY2hvICQxIHwgc2VkICdzLy4qPS8vJ2A7IHNoaWZ0IDs7CitAQCAtOTQsOSArMTAwLDkgQEAKKyAgICAgLXoqIHwgLS16cHJlZml4KSB6cHJlZml4PTE7IHNoaWZ0IDs7CisgICAgIC02KiB8IC0tNjQpIGJ1aWxkNjQ9MTsgc2hpZnQgOzsKKyAgICAgLWEqPSogfCAtLWFyY2hzPSopIEFSQ0hTPWBlY2hvICQxIHwgc2VkICdzLy4qPS8vJ2A7IHNoaWZ0IDs7CistICAgIC0tc3lzY29uZmRpcj0qKSBlY2hvICJpZ25vcmVkIG9wdGlvbjogLS1zeXNjb25mZGlyIiB8IHRlZSAtYSBjb25maWd1cmUubG9nOyBzaGlmdCA7OworLSAgICAtLWxvY2Fsc3RhdGVkaXI9KikgZWNobyAiaWdub3JlZCBvcHRpb246IC0tbG9jYWxzdGF0ZWRpciIgfCB0ZWUgLWEgY29uZmlndXJlLmxvZzsgc2hpZnQgOzsKKy0gICAgKikgZWNobyAidW5rbm93biBvcHRpb246ICQxIjsgZWNobyAiJDAgLS1oZWxwIGZvciBoZWxwIiB8IHRlZSAtYSBjb25maWd1cmUubG9nOyBleGl0IDEgOzsKKysgICAgLS1zeXNjb25mZGlyPSopIGVjaG8gImlnbm9yZWQgb3B0aW9uOiAtLXN5c2NvbmZkaXIiIHwgdGVlIC1hICR7TE9HfTsgc2hpZnQgOzsKKysgICAgLS1sb2NhbHN0YXRlZGlyPSopIGVjaG8gImlnbm9yZWQgb3B0aW9uOiAtLWxvY2Fsc3RhdGVkaXIiIHwgdGVlIC1hICR7TE9HfTsgc2hpZnQgOzsKKysgICAgKikgZWNobyAidW5rbm93biBvcHRpb246ICQxIjsgZWNobyAiJDAgLS1oZWxwIGZvciBoZWxwIiB8IHRlZSAtYSAke0xPR307IGV4aXQgMSA7OworICAgICBlc2FjCisgZG9uZQorIAorQEAgLTEwNiwxMSArMTEyLDExIEBACisgeworICAgY2FzZSAiJCoiIGluCisgICAgICokdGVzdC5jKikKKy0gICAgICBlY2hvID09PSAkdGVzdC5jID09PSA+PiBjb25maWd1cmUubG9nCistICAgICAgY2F0ICR0ZXN0LmMgPj4gY29uZmlndXJlLmxvZworLSAgICAgIGVjaG8gPT09ID4+IGNvbmZpZ3VyZS5sb2c7OworKyAgICAgIGVjaG8gPT09ICR0ZXN0LmMgPT09ID4+ICR7TE9HfQorKyAgICAgIGNhdCAkdGVzdC5jID4+ICR7TE9HfQorKyAgICAgIGVjaG8gPT09ID4+ICR7TE9HfTs7CisgICBlc2FjCistICBlY2hvICQqID4+IGNvbmZpZ3VyZS5sb2cKKysgIGVjaG8gJCogPj4gJHtMT0d9CisgfQorIAorIGNhdCA+ICR0ZXN0LmMgPDxFT0YKK0BAIC0xMjAsMzAgKzEyNiwzMCBAQAorICAgdHJ5KCkKKyAgIHsKKyAgICAgc2hvdyAkKgorLSAgICB0ZXN0ICJgKCAkKiApIDI+JjEgfCB0ZWUgLWEgY29uZmlndXJlLmxvZ2AiID0gIiIKKysgICAgdGVzdCAiYCggJCogKSAyPiYxIHwgdGVlIC1hICR7TE9HfWAiID0gIiIKKyAgIH0KKy0gIGVjaG8gLSB1c2luZyBhbnkgb3V0cHV0IGZyb20gY29tcGlsZXIgdG8gaW5kaWNhdGUgYW4gZXJyb3IgPj4gY29uZmlndXJlLmxvZworKyAgZWNobyAtIHVzaW5nIGFueSBvdXRwdXQgZnJvbSBjb21waWxlciB0byBpbmRpY2F0ZSBhbiBlcnJvciA+PiAke0xPR30KKyBlbHNlCisgICB0cnkoKQorICAgeworICAgICBzaG93ICQqCistICAgICggJCogKSA+PiBjb25maWd1cmUubG9nIDI+JjEKKysgICAgKCAkKiApID4+ICR7TE9HfSAyPiYxCisgICAgIHJldD0kPworICAgICBpZiB0ZXN0ICRyZXQgLW5lIDA7IHRoZW4KKy0gICAgICBlY2hvICIoZXhpdCBjb2RlICIkcmV0IikiID4+IGNvbmZpZ3VyZS5sb2cKKysgICAgICBlY2hvICIoZXhpdCBjb2RlICIkcmV0IikiID4+ICR7TE9HfQorICAgICBmaQorICAgICByZXR1cm4gJHJldAorICAgfQorIGZpCisgCistZWNobyA+PiBjb25maWd1cmUubG9nCisrZWNobyA+PiAke0xPR30KKyAKKyBjYXQgPiAkdGVzdC5jIDw8RU9GCisgZXh0ZXJuIGludCBnZXRjaGFyKCk7CisgaW50IGhlbGxvKCkge3JldHVybiBnZXRjaGFyKCk7fQorIEVPRgorIAorLXRlc3QgLXogIiRDQyIgJiYgZWNobyBDaGVja2luZyBmb3IgJHtDUk9TU19QUkVGSVh9Z2NjLi4uIHwgdGVlIC1hIGNvbmZpZ3VyZS5sb2cKKyt0ZXN0IC16ICIkQ0MiICYmIGVjaG8gQ2hlY2tpbmcgZm9yICR7Q1JPU1NfUFJFRklYfWdjYy4uLiB8IHRlZSAtYSAke0xPR30KKyBjYz0ke0NDLSR7Q1JPU1NfUFJFRklYfWdjY30KKyBjZmxhZ3M9JHtDRkxBR1MtIi1PMyJ9CisgIyB0byBmb3JjZSB0aGUgYXNtIHZlcnNpb24gdXNlOiBDRkxBR1M9Ii1PMyAtREFTTVYiIC4vY29uZmlndXJlCitAQCAtMTU1LDggKzE2MSw4IEBACisgZXNhYworIAorIHNob3cgJGNjIC1jICRjZmxhZ3MgJHRlc3QuYworLWlmIHRlc3QgIiRnY2MiIC1lcSAxICYmICgkY2MgLWMgJGNmbGFncyAkdGVzdC5jKSA+PiBjb25maWd1cmUubG9nIDI+JjE7IHRoZW4KKy0gIGVjaG8gLi4uIHVzaW5nIGdjYyA+PiBjb25maWd1cmUubG9nCisraWYgdGVzdCAiJGdjYyIgLWVxIDEgJiYgKCRjYyAtYyAkY2ZsYWdzICR0ZXN0LmMpID4+ICR7TE9HfSAyPiYxOyB0aGVuCisrICBlY2hvIC4uLiB1c2luZyBnY2MgPj4gJHtMT0d9CisgICBDQz0iJGNjIgorICAgQ0ZMQUdTPSIke0NGTEFHUy0tTzN9ICR7QVJDSFN9IgorICAgU0ZMQUdTPSIke0NGTEFHUy0tTzN9IC1mUElDIgorQEAgLTE3MywxNiArMTc5LDE2IEBACisgICBmaQorICAgY2FzZSAiJHVuYW1lIiBpbgorICAgTGludXgqIHwgbGludXgqIHwgR05VIHwgR05VLyogfCBzb2xhcmlzKikKKy0gICAgICAgIExEU0hBUkVEPSR7TERTSEFSRUQtIiRjYyAtc2hhcmVkIC1XbCwtc29uYW1lLGxpYnouc28uMSwtLXZlcnNpb24tc2NyaXB0LHpsaWIubWFwIn0gOzsKKysgICAgICAgIExEU0hBUkVEPSR7TERTSEFSRUQtIiRjYyAtc2hhcmVkIC1XbCwtc29uYW1lLGxpYnouc28uMSwtLXZlcnNpb24tc2NyaXB0LCRzcmNkaXIvemxpYi5tYXAifSA7OworICAgKkJTRCB8ICpic2QqIHwgRHJhZ29uRmx5KQorLSAgICAgICAgTERTSEFSRUQ9JHtMRFNIQVJFRC0iJGNjIC1zaGFyZWQgLVdsLC1zb25hbWUsbGliei5zby4xLC0tdmVyc2lvbi1zY3JpcHQsemxpYi5tYXAifQorKyAgICAgICAgTERTSEFSRUQ9JHtMRFNIQVJFRC0iJGNjIC1zaGFyZWQgLVdsLC1zb25hbWUsbGliei5zby4xLC0tdmVyc2lvbi1zY3JpcHQsJHNyY2Rpci96bGliLm1hcCJ9CisgICAgICAgICBMRENPTkZJRz0ibGRjb25maWcgLW0iIDs7CisgICBDWUdXSU4qIHwgQ3lnd2luKiB8IGN5Z3dpbiogfCBPUy8yKikKKyAgICAgICAgIEVYRT0nLmV4ZScgOzsKKyAgIE1JTkdXKiB8IG1pbmd3KikKKyAjIHRlbXBvcmFyeSBieXBhc3MKKyAgICAgICAgIHJtIC1mICR0ZXN0Lltjb10gJHRlc3QgJHRlc3Qkc2hhcmVkX2V4dAorLSAgICAgICAgZWNobyAiUGxlYXNlIHVzZSB3aW4zMi9NYWtlZmlsZS5nY2MgaW5zdGVhZC4iIHwgdGVlIC1hIGNvbmZpZ3VyZS5sb2cKKysgICAgICAgIGVjaG8gIlBsZWFzZSB1c2Ugd2luMzIvTWFrZWZpbGUuZ2NjIGluc3RlYWQuIiB8IHRlZSAtYSAke0xPR30KKyAgICAgICAgIGV4aXQgMQorICAgICAgICAgTERTSEFSRUQ9JHtMRFNIQVJFRC0iJGNjIC1zaGFyZWQifQorICAgICAgICAgTERTSEFSRURMSUJDPSIiCitAQCAtMjE0LDcgKzIyMCw3IEBACisgICAjIGZpbmQgc3lzdGVtIG5hbWUgYW5kIGNvcnJlc3BvbmRpbmcgY2Mgb3B0aW9ucworICAgQ0M9JHtDQy1jY30KKyAgIGdjYz0wCistICBlY2hvIC4uLiB1c2luZyAkQ0MgPj4gY29uZmlndXJlLmxvZworKyAgZWNobyAuLi4gdXNpbmcgJENDID4+ICR7TE9HfQorICAgaWYgdGVzdCAteiAiJHVuYW1lIjsgdGhlbgorICAgICB1bmFtZT1gKHVuYW1lIC1zciB8fCBlY2hvIHVua25vd24pIDI+L2Rldi9udWxsYAorICAgZmkKK0BAIC0yOTMsMTkgKzI5OSwxOSBAQAorIFNIQVJFRExJQlY9JHtTSEFSRURMSUJWLSJsaWJ6JHNoYXJlZF9leHQuJFZFUiJ9CisgU0hBUkVETElCTT0ke1NIQVJFRExJQk0tImxpYnokc2hhcmVkX2V4dC4kVkVSMSJ9CisgCistZWNobyA+PiBjb25maWd1cmUubG9nCisrZWNobyA+PiAke0xPR30KKyAKKyBpZiB0ZXN0ICRzaGFyZWQgLWVxIDE7IHRoZW4KKy0gIGVjaG8gQ2hlY2tpbmcgZm9yIHNoYXJlZCBsaWJyYXJ5IHN1cHBvcnQuLi4gfCB0ZWUgLWEgY29uZmlndXJlLmxvZworKyAgZWNobyBDaGVja2luZyBmb3Igc2hhcmVkIGxpYnJhcnkgc3VwcG9ydC4uLiB8IHRlZSAtYSAke0xPR30KKyAgICMgd2UgbXVzdCB0ZXN0IGluIHR3byBzdGVwcyAoY2MgdGhlbiBsZCksIHJlcXVpcmVkIGF0IGxlYXN0IG9uIFN1bk9TIDQueAorICAgaWYgdHJ5ICRDQyAtdyAtYyAkU0ZMQUdTICR0ZXN0LmMgJiYKKyAgICAgIHRyeSAkTERTSEFSRUQgJFNGTEFHUyAtbyAkdGVzdCRzaGFyZWRfZXh0ICR0ZXN0Lm87IHRoZW4KKy0gICAgZWNobyBCdWlsZGluZyBzaGFyZWQgbGlicmFyeSAkU0hBUkVETElCViB3aXRoICRDQy4gfCB0ZWUgLWEgY29uZmlndXJlLmxvZworKyAgICBlY2hvIEJ1aWxkaW5nIHNoYXJlZCBsaWJyYXJ5ICRTSEFSRURMSUJWIHdpdGggJENDLiB8IHRlZSAtYSAke0xPR30KKyAgIGVsaWYgdGVzdCAteiAiJG9sZF9jYyIgLWEgLXogIiRvbGRfY2ZsYWdzIjsgdGhlbgorLSAgICBlY2hvIE5vIHNoYXJlZCBsaWJyYXJ5IHN1cHBvcnQuIHwgdGVlIC1hIGNvbmZpZ3VyZS5sb2cKKysgICAgZWNobyBObyBzaGFyZWQgbGlicmFyeSBzdXBwb3J0LiB8IHRlZSAtYSAke0xPR30KKyAgICAgc2hhcmVkPTA7CisgICBlbHNlCistICAgIGVjaG8gJ05vIHNoYXJlZCBsaWJyYXJ5IHN1cHBvcnQ7IHRyeSB3aXRob3V0IGRlZmluaW5nIENDIGFuZCBDRkxBR1MnIHwgdGVlIC1hIGNvbmZpZ3VyZS5sb2cKKysgICAgZWNobyAnTm8gc2hhcmVkIGxpYnJhcnkgc3VwcG9ydDsgdHJ5IHdpdGhvdXQgZGVmaW5pbmcgQ0MgYW5kIENGTEFHUycgfCB0ZWUgLWEgJHtMT0d9CisgICAgIHNoYXJlZD0wOworICAgZmkKKyBmaQorQEAgLTMxNiw3ICszMjIsNyBAQAorICAgU0hBUkVETElCPSIiCisgICBTSEFSRURMSUJWPSIiCisgICBTSEFSRURMSUJNPSIiCistICBlY2hvIEJ1aWxkaW5nIHN0YXRpYyBsaWJyYXJ5ICRTVEFUSUNMSUIgdmVyc2lvbiAkVkVSIHdpdGggJENDLiB8IHRlZSAtYSBjb25maWd1cmUubG9nCisrICBlY2hvIEJ1aWxkaW5nIHN0YXRpYyBsaWJyYXJ5ICRTVEFUSUNMSUIgdmVyc2lvbiAkVkVSIHdpdGggJENDLiB8IHRlZSAtYSAke0xPR30KKyBlbHNlCisgICBBTEw9InN0YXRpYyBzaGFyZWQiCisgICBURVNUPSJhbGwgdGVzdHN0YXRpYyB0ZXN0c2hhcmVkIgorQEAgLTMyNSwxNyArMzMxLDE3IEBACisgQ1BQPSR7Q1BQLSIkQ0MgLUUifQorIGNhc2UgJENGTEFHUyBpbgorICAgKkFTTVYqKQorLSAgICBlY2hvID4+IGNvbmZpZ3VyZS5sb2cKKysgICAgZWNobyA+PiAke0xPR30KKyAgICAgc2hvdyAiJE5NICR0ZXN0Lm8gfCBncmVwIF9oZWxsbyIKKy0gICAgaWYgdGVzdCAiYCROTSAkdGVzdC5vIHwgZ3JlcCBfaGVsbG8gfCB0ZWUgLWEgY29uZmlndXJlLmxvZ2AiID0gIiI7IHRoZW4KKysgICAgaWYgdGVzdCAiYCROTSAkdGVzdC5vIHwgZ3JlcCBfaGVsbG8gfCB0ZWUgLWEgJHtMT0d9YCIgPSAiIjsgdGhlbgorICAgICAgIENQUD0iJENQUCAtRE5PX1VOREVSTElORSIKKy0gICAgICBlY2hvIENoZWNraW5nIGZvciB1bmRlcmxpbmUgaW4gZXh0ZXJuYWwgbmFtZXMuLi4gTm8uIHwgdGVlIC1hIGNvbmZpZ3VyZS5sb2cKKysgICAgICBlY2hvIENoZWNraW5nIGZvciB1bmRlcmxpbmUgaW4gZXh0ZXJuYWwgbmFtZXMuLi4gTm8uIHwgdGVlIC1hICR7TE9HfQorICAgICBlbHNlCistICAgICAgZWNobyBDaGVja2luZyBmb3IgdW5kZXJsaW5lIGluIGV4dGVybmFsIG5hbWVzLi4uIFllcy4gfCB0ZWUgLWEgY29uZmlndXJlLmxvZworKyAgICAgIGVjaG8gQ2hlY2tpbmcgZm9yIHVuZGVybGluZSBpbiBleHRlcm5hbCBuYW1lcy4uLiBZZXMuIHwgdGVlIC1hICR7TE9HfQorICAgICBmaSA7OworIGVzYWMKKyAKKy1lY2hvID4+IGNvbmZpZ3VyZS5sb2cKKytlY2hvID4+ICR7TE9HfQorIAorIGNhdCA+ICR0ZXN0LmMgPDxFT0YKKyAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CitAQCAtMzQ2LDExICszNTIsMTEgQEAKKyAgIFNGTEFHUz0iJHtTRkxBR1N9IC1EX0xBUkdFRklMRTY0X1NPVVJDRT0xIgorICAgQUxMPSIke0FMTH0gYWxsNjQiCisgICBURVNUPSIke1RFU1R9IHRlc3Q2NCIKKy0gIGVjaG8gIkNoZWNraW5nIGZvciBvZmY2NF90Li4uIFllcy4iIHwgdGVlIC1hIGNvbmZpZ3VyZS5sb2cKKy0gIGVjaG8gIkNoZWNraW5nIGZvciBmc2Vla28uLi4gWWVzLiIgfCB0ZWUgLWEgY29uZmlndXJlLmxvZworKyAgZWNobyAiQ2hlY2tpbmcgZm9yIG9mZjY0X3QuLi4gWWVzLiIgfCB0ZWUgLWEgJHtMT0d9CisrICBlY2hvICJDaGVja2luZyBmb3IgZnNlZWtvLi4uIFllcy4iIHwgdGVlIC1hICR7TE9HfQorIGVsc2UKKy0gIGVjaG8gIkNoZWNraW5nIGZvciBvZmY2NF90Li4uIE5vLiIgfCB0ZWUgLWEgY29uZmlndXJlLmxvZworLSAgZWNobyA+PiBjb25maWd1cmUubG9nCisrICBlY2hvICJDaGVja2luZyBmb3Igb2ZmNjRfdC4uLiBOby4iIHwgdGVlIC1hICR7TE9HfQorKyAgZWNobyA+PiAke0xPR30KKyAgIGNhdCA+ICR0ZXN0LmMgPDxFT0YKKyAjaW5jbHVkZSA8c3RkaW8uaD4KKyBpbnQgbWFpbih2b2lkKSB7CitAQCAtMzU5LDE3ICszNjUsMTcgQEAKKyB9CisgRU9GCisgICBpZiB0cnkgJENDICRDRkxBR1MgLW8gJHRlc3QgJHRlc3QuYzsgdGhlbgorLSAgICBlY2hvICJDaGVja2luZyBmb3IgZnNlZWtvLi4uIFllcy4iIHwgdGVlIC1hIGNvbmZpZ3VyZS5sb2cKKysgICAgZWNobyAiQ2hlY2tpbmcgZm9yIGZzZWVrby4uLiBZZXMuIiB8IHRlZSAtYSAke0xPR30KKyAgIGVsc2UKKyAgICAgQ0ZMQUdTPSIke0NGTEFHU30gLUROT19GU0VFS08iCisgICAgIFNGTEFHUz0iJHtTRkxBR1N9IC1ETk9fRlNFRUtPIgorLSAgICBlY2hvICJDaGVja2luZyBmb3IgZnNlZWtvLi4uIE5vLiIgfCB0ZWUgLWEgY29uZmlndXJlLmxvZworKyAgICBlY2hvICJDaGVja2luZyBmb3IgZnNlZWtvLi4uIE5vLiIgfCB0ZWUgLWEgJHtMT0d9CisgICBmaQorIGZpCisgCistY3AgLXAgemNvbmYuaC5pbiB6Y29uZi5oCisrY3AgLXAgJHNyY2Rpci96Y29uZi5oLmluIHpjb25mLmgKKyAKKy1lY2hvID4+IGNvbmZpZ3VyZS5sb2cKKytlY2hvID4+ICR7TE9HfQorIAorIGNhdCA+ICR0ZXN0LmMgPDxFT0YKKyAjaW5jbHVkZSA8dW5pc3RkLmg+CitAQCAtMzc4LDEyICszODQsMTIgQEAKKyBpZiB0cnkgJENDIC1jICRDRkxBR1MgJHRlc3QuYzsgdGhlbgorICAgc2VkIDwgemNvbmYuaCAiL14jaWZkZWYgSEFWRV9VTklTVERfSC4qIG1heSBiZS9zL2RlZiBIQVZFX1VOSVNURF9IXCguKlwpIG1heSBiZS8gMVwxIHdhcy8iID4gemNvbmYudGVtcC5oCisgICBtdiB6Y29uZi50ZW1wLmggemNvbmYuaAorLSAgZWNobyAiQ2hlY2tpbmcgZm9yIHVuaXN0ZC5oLi4uIFllcy4iIHwgdGVlIC1hIGNvbmZpZ3VyZS5sb2cKKysgIGVjaG8gIkNoZWNraW5nIGZvciB1bmlzdGQuaC4uLiBZZXMuIiB8IHRlZSAtYSAke0xPR30KKyBlbHNlCistICBlY2hvICJDaGVja2luZyBmb3IgdW5pc3RkLmguLi4gTm8uIiB8IHRlZSAtYSBjb25maWd1cmUubG9nCisrICBlY2hvICJDaGVja2luZyBmb3IgdW5pc3RkLmguLi4gTm8uIiB8IHRlZSAtYSAke0xPR30KKyBmaQorIAorLWVjaG8gPj4gY29uZmlndXJlLmxvZworK2VjaG8gPj4gJHtMT0d9CisgCisgY2F0ID4gJHRlc3QuYyA8PEVPRgorICNpbmNsdWRlIDxzdGRhcmcuaD4KK0BAIC0zOTIsMTYgKzM5OCwxNiBAQAorIGlmIHRyeSAkQ0MgLWMgJENGTEFHUyAkdGVzdC5jOyB0aGVuCisgICBzZWQgPCB6Y29uZi5oICIvXiNpZmRlZiBIQVZFX1NUREFSR19ILiogbWF5IGJlL3MvZGVmIEhBVkVfU1REQVJHX0hcKC4qXCkgbWF5IGJlLyAxXDEgd2FzLyIgPiB6Y29uZi50ZW1wLmgKKyAgIG12IHpjb25mLnRlbXAuaCB6Y29uZi5oCistICBlY2hvICJDaGVja2luZyBmb3Igc3RkYXJnLmguLi4gWWVzLiIgfCB0ZWUgLWEgY29uZmlndXJlLmxvZworKyAgZWNobyAiQ2hlY2tpbmcgZm9yIHN0ZGFyZy5oLi4uIFllcy4iIHwgdGVlIC1hICR7TE9HfQorIGVsc2UKKy0gIGVjaG8gIkNoZWNraW5nIGZvciBzdGRhcmcuaC4uLiBOby4iIHwgdGVlIC1hIGNvbmZpZ3VyZS5sb2cKKysgIGVjaG8gIkNoZWNraW5nIGZvciBzdGRhcmcuaC4uLiBOby4iIHwgdGVlIC1hICR7TE9HfQorIGZpCisgCisgaWYgdGVzdCAkenByZWZpeCAtZXEgMTsgdGhlbgorICAgc2VkIDwgemNvbmYuaCAiLyNpZmRlZiBaX1BSRUZJWC4qIG1heSBiZS9zL2RlZiBaX1BSRUZJWFwoLipcKSBtYXkgYmUvIDFcMSB3YXMvIiA+IHpjb25mLnRlbXAuaAorICAgbXYgemNvbmYudGVtcC5oIHpjb25mLmgKKy0gIGVjaG8gPj4gY29uZmlndXJlLmxvZworLSAgZWNobyAiVXNpbmcgel8gcHJlZml4IG9uIGFsbCBzeW1ib2xzLiIgfCB0ZWUgLWEgY29uZmlndXJlLmxvZworKyAgZWNobyA+PiAke0xPR30KKysgIGVjaG8gIlVzaW5nIHpfIHByZWZpeCBvbiBhbGwgc3ltYm9scy4iIHwgdGVlIC1hICR7TE9HfQorIGZpCisgCisgaWYgdGVzdCAkc29sbyAtZXEgMTsgdGhlbgorQEAgLTQxOCw3ICs0MjQsNyBAQAorICAgQ0ZMQUdTPSIke0NGTEFHU30gLWZwcm9maWxlLWFyY3MgLWZ0ZXN0LWNvdmVyYWdlIgorIGZpCisgCistZWNobyA+PiBjb25maWd1cmUubG9nCisrZWNobyA+PiAke0xPR30KKyAKKyBjYXQgPiAkdGVzdC5jIDw8RU9GCisgI2luY2x1ZGUgPHN0ZGlvLmg+CitAQCAtNDM0LDkgKzQ0MCw5IEBACisgRU9GCisgCisgaWYgdHJ5ICRDQyAtYyAkQ0ZMQUdTICR0ZXN0LmM7IHRoZW4KKy0gIGVjaG8gIkNoZWNraW5nIHdoZXRoZXIgdG8gdXNlIHZzW25dcHJpbnRmKCkgb3Igc1tuXXByaW50ZigpLi4uIHVzaW5nIHZzW25dcHJpbnRmKCkuIiB8IHRlZSAtYSBjb25maWd1cmUubG9nCisrICBlY2hvICJDaGVja2luZyB3aGV0aGVyIHRvIHVzZSB2c1tuXXByaW50ZigpIG9yIHNbbl1wcmludGYoKS4uLiB1c2luZyB2c1tuXXByaW50ZigpLiIgfCB0ZWUgLWEgJHtMT0d9CisgCistICBlY2hvID4+IGNvbmZpZ3VyZS5sb2cKKysgIGVjaG8gPj4gJHtMT0d9CisgICBjYXQgPiAkdGVzdC5jIDw8RU9GCisgI2luY2x1ZGUgPHN0ZGlvLmg+CisgI2luY2x1ZGUgPHN0ZGFyZy5oPgorQEAgLTQ1NSw5ICs0NjEsOSBAQAorIH0KKyBFT0YKKyAgIGlmIHRyeSAkQ0MgJENGTEFHUyAtbyAkdGVzdCAkdGVzdC5jOyB0aGVuCistICAgIGVjaG8gIkNoZWNraW5nIGZvciB2c25wcmludGYoKSBpbiBzdGRpby5oLi4uIFllcy4iIHwgdGVlIC1hIGNvbmZpZ3VyZS5sb2cKKysgICAgZWNobyAiQ2hlY2tpbmcgZm9yIHZzbnByaW50ZigpIGluIHN0ZGlvLmguLi4gWWVzLiIgfCB0ZWUgLWEgJHtMT0d9CisgCistICAgIGVjaG8gPj4gY29uZmlndXJlLmxvZworKyAgICBlY2hvID4+ICR7TE9HfQorICAgICBjYXQgPiR0ZXN0LmMgPDxFT0YKKyAjaW5jbHVkZSA8c3RkaW8uaD4KKyAjaW5jbHVkZSA8c3RkYXJnLmg+CitAQCAtNDc4LDI0ICs0ODQsMjQgQEAKKyBFT0YKKyAKKyAgICAgaWYgdHJ5ICRDQyAtYyAkQ0ZMQUdTICR0ZXN0LmM7IHRoZW4KKy0gICAgICBlY2hvICJDaGVja2luZyBmb3IgcmV0dXJuIHZhbHVlIG9mIHZzbnByaW50ZigpLi4uIFllcy4iIHwgdGVlIC1hIGNvbmZpZ3VyZS5sb2cKKysgICAgICBlY2hvICJDaGVja2luZyBmb3IgcmV0dXJuIHZhbHVlIG9mIHZzbnByaW50ZigpLi4uIFllcy4iIHwgdGVlIC1hICR7TE9HfQorICAgICBlbHNlCisgICAgICAgQ0ZMQUdTPSIkQ0ZMQUdTIC1ESEFTX3ZzbnByaW50Zl92b2lkIgorICAgICAgIFNGTEFHUz0iJFNGTEFHUyAtREhBU192c25wcmludGZfdm9pZCIKKy0gICAgICBlY2hvICJDaGVja2luZyBmb3IgcmV0dXJuIHZhbHVlIG9mIHZzbnByaW50ZigpLi4uIE5vLiIgfCB0ZWUgLWEgY29uZmlndXJlLmxvZworLSAgICAgIGVjaG8gIiAgV0FSTklORzogYXBwYXJlbnRseSB2c25wcmludGYoKSBkb2VzIG5vdCByZXR1cm4gYSB2YWx1ZS4gemxpYiIgfCB0ZWUgLWEgY29uZmlndXJlLmxvZworLSAgICAgIGVjaG8gIiAgY2FuIGJ1aWxkIGJ1dCB3aWxsIGJlIG9wZW4gdG8gcG9zc2libGUgc3RyaW5nLWZvcm1hdCBzZWN1cml0eSIgfCB0ZWUgLWEgY29uZmlndXJlLmxvZworLSAgICAgIGVjaG8gIiAgdnVsbmVyYWJpbGl0aWVzLiIgfCB0ZWUgLWEgY29uZmlndXJlLmxvZworKyAgICAgIGVjaG8gIkNoZWNraW5nIGZvciByZXR1cm4gdmFsdWUgb2YgdnNucHJpbnRmKCkuLi4gTm8uIiB8IHRlZSAtYSAke0xPR30KKysgICAgICBlY2hvICIgIFdBUk5JTkc6IGFwcGFyZW50bHkgdnNucHJpbnRmKCkgZG9lcyBub3QgcmV0dXJuIGEgdmFsdWUuIHpsaWIiIHwgdGVlIC1hICR7TE9HfQorKyAgICAgIGVjaG8gIiAgY2FuIGJ1aWxkIGJ1dCB3aWxsIGJlIG9wZW4gdG8gcG9zc2libGUgc3RyaW5nLWZvcm1hdCBzZWN1cml0eSIgfCB0ZWUgLWEgJHtMT0d9CisrICAgICAgZWNobyAiICB2dWxuZXJhYmlsaXRpZXMuIiB8IHRlZSAtYSAke0xPR30KKyAgICAgZmkKKyAgIGVsc2UKKyAgICAgQ0ZMQUdTPSIkQ0ZMQUdTIC1ETk9fdnNucHJpbnRmIgorICAgICBTRkxBR1M9IiRTRkxBR1MgLUROT192c25wcmludGYiCistICAgIGVjaG8gIkNoZWNraW5nIGZvciB2c25wcmludGYoKSBpbiBzdGRpby5oLi4uIE5vLiIgfCB0ZWUgLWEgY29uZmlndXJlLmxvZworLSAgICBlY2hvICIgIFdBUk5JTkc6IHZzbnByaW50ZigpIG5vdCBmb3VuZCwgZmFsbGluZyBiYWNrIHRvIHZzcHJpbnRmKCkuIHpsaWIiIHwgdGVlIC1hIGNvbmZpZ3VyZS5sb2cKKy0gICAgZWNobyAiICBjYW4gYnVpbGQgYnV0IHdpbGwgYmUgb3BlbiB0byBwb3NzaWJsZSBidWZmZXItb3ZlcmZsb3cgc2VjdXJpdHkiIHwgdGVlIC1hIGNvbmZpZ3VyZS5sb2cKKy0gICAgZWNobyAiICB2dWxuZXJhYmlsaXRpZXMuIiB8IHRlZSAtYSBjb25maWd1cmUubG9nCisrICAgIGVjaG8gIkNoZWNraW5nIGZvciB2c25wcmludGYoKSBpbiBzdGRpby5oLi4uIE5vLiIgfCB0ZWUgLWEgJHtMT0d9CisrICAgIGVjaG8gIiAgV0FSTklORzogdnNucHJpbnRmKCkgbm90IGZvdW5kLCBmYWxsaW5nIGJhY2sgdG8gdnNwcmludGYoKS4gemxpYiIgfCB0ZWUgLWEgJHtMT0d9CisrICAgIGVjaG8gIiAgY2FuIGJ1aWxkIGJ1dCB3aWxsIGJlIG9wZW4gdG8gcG9zc2libGUgYnVmZmVyLW92ZXJmbG93IHNlY3VyaXR5IiB8IHRlZSAtYSAke0xPR30KKysgICAgZWNobyAiICB2dWxuZXJhYmlsaXRpZXMuIiB8IHRlZSAtYSAke0xPR30KKyAKKy0gICAgZWNobyA+PiBjb25maWd1cmUubG9nCisrICAgIGVjaG8gPj4gJHtMT0d9CisgICAgIGNhdCA+JHRlc3QuYyA8PEVPRgorICNpbmNsdWRlIDxzdGRpby5oPgorICNpbmNsdWRlIDxzdGRhcmcuaD4KK0BAIC01MTYsMjAgKzUyMiwyMCBAQAorIEVPRgorIAorICAgICBpZiB0cnkgJENDIC1jICRDRkxBR1MgJHRlc3QuYzsgdGhlbgorLSAgICAgIGVjaG8gIkNoZWNraW5nIGZvciByZXR1cm4gdmFsdWUgb2YgdnNwcmludGYoKS4uLiBZZXMuIiB8IHRlZSAtYSBjb25maWd1cmUubG9nCisrICAgICAgZWNobyAiQ2hlY2tpbmcgZm9yIHJldHVybiB2YWx1ZSBvZiB2c3ByaW50ZigpLi4uIFllcy4iIHwgdGVlIC1hICR7TE9HfQorICAgICBlbHNlCisgICAgICAgQ0ZMQUdTPSIkQ0ZMQUdTIC1ESEFTX3ZzcHJpbnRmX3ZvaWQiCisgICAgICAgU0ZMQUdTPSIkU0ZMQUdTIC1ESEFTX3ZzcHJpbnRmX3ZvaWQiCistICAgICAgZWNobyAiQ2hlY2tpbmcgZm9yIHJldHVybiB2YWx1ZSBvZiB2c3ByaW50ZigpLi4uIE5vLiIgfCB0ZWUgLWEgY29uZmlndXJlLmxvZworLSAgICAgIGVjaG8gIiAgV0FSTklORzogYXBwYXJlbnRseSB2c3ByaW50ZigpIGRvZXMgbm90IHJldHVybiBhIHZhbHVlLiB6bGliIiB8IHRlZSAtYSBjb25maWd1cmUubG9nCistICAgICAgZWNobyAiICBjYW4gYnVpbGQgYnV0IHdpbGwgYmUgb3BlbiB0byBwb3NzaWJsZSBzdHJpbmctZm9ybWF0IHNlY3VyaXR5IiB8IHRlZSAtYSBjb25maWd1cmUubG9nCistICAgICAgZWNobyAiICB2dWxuZXJhYmlsaXRpZXMuIiB8IHRlZSAtYSBjb25maWd1cmUubG9nCisrICAgICAgZWNobyAiQ2hlY2tpbmcgZm9yIHJldHVybiB2YWx1ZSBvZiB2c3ByaW50ZigpLi4uIE5vLiIgfCB0ZWUgLWEgJHtMT0d9CisrICAgICAgZWNobyAiICBXQVJOSU5HOiBhcHBhcmVudGx5IHZzcHJpbnRmKCkgZG9lcyBub3QgcmV0dXJuIGEgdmFsdWUuIHpsaWIiIHwgdGVlIC1hICR7TE9HfQorKyAgICAgIGVjaG8gIiAgY2FuIGJ1aWxkIGJ1dCB3aWxsIGJlIG9wZW4gdG8gcG9zc2libGUgc3RyaW5nLWZvcm1hdCBzZWN1cml0eSIgfCB0ZWUgLWEgJHtMT0d9CisrICAgICAgZWNobyAiICB2dWxuZXJhYmlsaXRpZXMuIiB8IHRlZSAtYSAke0xPR30KKyAgICAgZmkKKyAgIGZpCisgZWxzZQorLSAgZWNobyAiQ2hlY2tpbmcgd2hldGhlciB0byB1c2UgdnNbbl1wcmludGYoKSBvciBzW25dcHJpbnRmKCkuLi4gdXNpbmcgc1tuXXByaW50ZigpLiIgfCB0ZWUgLWEgY29uZmlndXJlLmxvZworKyAgZWNobyAiQ2hlY2tpbmcgd2hldGhlciB0byB1c2UgdnNbbl1wcmludGYoKSBvciBzW25dcHJpbnRmKCkuLi4gdXNpbmcgc1tuXXByaW50ZigpLiIgfCB0ZWUgLWEgJHtMT0d9CisgCistICBlY2hvID4+IGNvbmZpZ3VyZS5sb2cKKysgIGVjaG8gPj4gJHtMT0d9CisgICBjYXQgPiR0ZXN0LmMgPDxFT0YKKyAjaW5jbHVkZSA8c3RkaW8uaD4KKyBpbnQgbXl0ZXN0KCkKK0BAIC01NDUsOSArNTUxLDkgQEAKKyBFT0YKKyAKKyAgIGlmIHRyeSAkQ0MgJENGTEFHUyAtbyAkdGVzdCAkdGVzdC5jOyB0aGVuCistICAgIGVjaG8gIkNoZWNraW5nIGZvciBzbnByaW50ZigpIGluIHN0ZGlvLmguLi4gWWVzLiIgfCB0ZWUgLWEgY29uZmlndXJlLmxvZworKyAgICBlY2hvICJDaGVja2luZyBmb3Igc25wcmludGYoKSBpbiBzdGRpby5oLi4uIFllcy4iIHwgdGVlIC1hICR7TE9HfQorIAorLSAgICBlY2hvID4+IGNvbmZpZ3VyZS5sb2cKKysgICAgZWNobyA+PiAke0xPR30KKyAgICAgY2F0ID4kdGVzdC5jIDw8RU9GCisgI2luY2x1ZGUgPHN0ZGlvLmg+CisgaW50IG15dGVzdCgpCitAQCAtNTYyLDI0ICs1NjgsMjQgQEAKKyBFT0YKKyAKKyAgICAgaWYgdHJ5ICRDQyAtYyAkQ0ZMQUdTICR0ZXN0LmM7IHRoZW4KKy0gICAgICBlY2hvICJDaGVja2luZyBmb3IgcmV0dXJuIHZhbHVlIG9mIHNucHJpbnRmKCkuLi4gWWVzLiIgfCB0ZWUgLWEgY29uZmlndXJlLmxvZworKyAgICAgIGVjaG8gIkNoZWNraW5nIGZvciByZXR1cm4gdmFsdWUgb2Ygc25wcmludGYoKS4uLiBZZXMuIiB8IHRlZSAtYSAke0xPR30KKyAgICAgZWxzZQorICAgICAgIENGTEFHUz0iJENGTEFHUyAtREhBU19zbnByaW50Zl92b2lkIgorICAgICAgIFNGTEFHUz0iJFNGTEFHUyAtREhBU19zbnByaW50Zl92b2lkIgorLSAgICAgIGVjaG8gIkNoZWNraW5nIGZvciByZXR1cm4gdmFsdWUgb2Ygc25wcmludGYoKS4uLiBOby4iIHwgdGVlIC1hIGNvbmZpZ3VyZS5sb2cKKy0gICAgICBlY2hvICIgIFdBUk5JTkc6IGFwcGFyZW50bHkgc25wcmludGYoKSBkb2VzIG5vdCByZXR1cm4gYSB2YWx1ZS4gemxpYiIgfCB0ZWUgLWEgY29uZmlndXJlLmxvZworLSAgICAgIGVjaG8gIiAgY2FuIGJ1aWxkIGJ1dCB3aWxsIGJlIG9wZW4gdG8gcG9zc2libGUgc3RyaW5nLWZvcm1hdCBzZWN1cml0eSIgfCB0ZWUgLWEgY29uZmlndXJlLmxvZworLSAgICAgIGVjaG8gIiAgdnVsbmVyYWJpbGl0aWVzLiIgfCB0ZWUgLWEgY29uZmlndXJlLmxvZworKyAgICAgIGVjaG8gIkNoZWNraW5nIGZvciByZXR1cm4gdmFsdWUgb2Ygc25wcmludGYoKS4uLiBOby4iIHwgdGVlIC1hICR7TE9HfQorKyAgICAgIGVjaG8gIiAgV0FSTklORzogYXBwYXJlbnRseSBzbnByaW50ZigpIGRvZXMgbm90IHJldHVybiBhIHZhbHVlLiB6bGliIiB8IHRlZSAtYSAke0xPR30KKysgICAgICBlY2hvICIgIGNhbiBidWlsZCBidXQgd2lsbCBiZSBvcGVuIHRvIHBvc3NpYmxlIHN0cmluZy1mb3JtYXQgc2VjdXJpdHkiIHwgdGVlIC1hICR7TE9HfQorKyAgICAgIGVjaG8gIiAgdnVsbmVyYWJpbGl0aWVzLiIgfCB0ZWUgLWEgJHtMT0d9CisgICAgIGZpCisgICBlbHNlCisgICAgIENGTEFHUz0iJENGTEFHUyAtRE5PX3NucHJpbnRmIgorICAgICBTRkxBR1M9IiRTRkxBR1MgLUROT19zbnByaW50ZiIKKy0gICAgZWNobyAiQ2hlY2tpbmcgZm9yIHNucHJpbnRmKCkgaW4gc3RkaW8uaC4uLiBOby4iIHwgdGVlIC1hIGNvbmZpZ3VyZS5sb2cKKy0gICAgZWNobyAiICBXQVJOSU5HOiBzbnByaW50ZigpIG5vdCBmb3VuZCwgZmFsbGluZyBiYWNrIHRvIHNwcmludGYoKS4gemxpYiIgfCB0ZWUgLWEgY29uZmlndXJlLmxvZworLSAgICBlY2hvICIgIGNhbiBidWlsZCBidXQgd2lsbCBiZSBvcGVuIHRvIHBvc3NpYmxlIGJ1ZmZlci1vdmVyZmxvdyBzZWN1cml0eSIgfCB0ZWUgLWEgY29uZmlndXJlLmxvZworLSAgICBlY2hvICIgIHZ1bG5lcmFiaWxpdGllcy4iIHwgdGVlIC1hIGNvbmZpZ3VyZS5sb2cKKysgICAgZWNobyAiQ2hlY2tpbmcgZm9yIHNucHJpbnRmKCkgaW4gc3RkaW8uaC4uLiBOby4iIHwgdGVlIC1hICR7TE9HfQorKyAgICBlY2hvICIgIFdBUk5JTkc6IHNucHJpbnRmKCkgbm90IGZvdW5kLCBmYWxsaW5nIGJhY2sgdG8gc3ByaW50ZigpLiB6bGliIiB8IHRlZSAtYSAke0xPR30KKysgICAgZWNobyAiICBjYW4gYnVpbGQgYnV0IHdpbGwgYmUgb3BlbiB0byBwb3NzaWJsZSBidWZmZXItb3ZlcmZsb3cgc2VjdXJpdHkiIHwgdGVlIC1hICR7TE9HfQorKyAgICBlY2hvICIgIHZ1bG5lcmFiaWxpdGllcy4iIHwgdGVlIC1hICR7TE9HfQorIAorLSAgICBlY2hvID4+IGNvbmZpZ3VyZS5sb2cKKysgICAgZWNobyA+PiAke0xPR30KKyAgICAgY2F0ID4kdGVzdC5jIDw8RU9GCisgI2luY2x1ZGUgPHN0ZGlvLmg+CisgaW50IG15dGVzdCgpCitAQCAtNTk0LDIwICs2MDAsMjAgQEAKKyBFT0YKKyAKKyAgICAgaWYgdHJ5ICRDQyAtYyAkQ0ZMQUdTICR0ZXN0LmM7IHRoZW4KKy0gICAgICBlY2hvICJDaGVja2luZyBmb3IgcmV0dXJuIHZhbHVlIG9mIHNwcmludGYoKS4uLiBZZXMuIiB8IHRlZSAtYSBjb25maWd1cmUubG9nCisrICAgICAgZWNobyAiQ2hlY2tpbmcgZm9yIHJldHVybiB2YWx1ZSBvZiBzcHJpbnRmKCkuLi4gWWVzLiIgfCB0ZWUgLWEgJHtMT0d9CisgICAgIGVsc2UKKyAgICAgICBDRkxBR1M9IiRDRkxBR1MgLURIQVNfc3ByaW50Zl92b2lkIgorICAgICAgIFNGTEFHUz0iJFNGTEFHUyAtREhBU19zcHJpbnRmX3ZvaWQiCistICAgICAgZWNobyAiQ2hlY2tpbmcgZm9yIHJldHVybiB2YWx1ZSBvZiBzcHJpbnRmKCkuLi4gTm8uIiB8IHRlZSAtYSBjb25maWd1cmUubG9nCistICAgICAgZWNobyAiICBXQVJOSU5HOiBhcHBhcmVudGx5IHNwcmludGYoKSBkb2VzIG5vdCByZXR1cm4gYSB2YWx1ZS4gemxpYiIgfCB0ZWUgLWEgY29uZmlndXJlLmxvZworLSAgICAgIGVjaG8gIiAgY2FuIGJ1aWxkIGJ1dCB3aWxsIGJlIG9wZW4gdG8gcG9zc2libGUgc3RyaW5nLWZvcm1hdCBzZWN1cml0eSIgfCB0ZWUgLWEgY29uZmlndXJlLmxvZworLSAgICAgIGVjaG8gIiAgdnVsbmVyYWJpbGl0aWVzLiIgfCB0ZWUgLWEgY29uZmlndXJlLmxvZworKyAgICAgIGVjaG8gIkNoZWNraW5nIGZvciByZXR1cm4gdmFsdWUgb2Ygc3ByaW50ZigpLi4uIE5vLiIgfCB0ZWUgLWEgJHtMT0d9CisrICAgICAgZWNobyAiICBXQVJOSU5HOiBhcHBhcmVudGx5IHNwcmludGYoKSBkb2VzIG5vdCByZXR1cm4gYSB2YWx1ZS4gemxpYiIgfCB0ZWUgLWEgJHtMT0d9CisrICAgICAgZWNobyAiICBjYW4gYnVpbGQgYnV0IHdpbGwgYmUgb3BlbiB0byBwb3NzaWJsZSBzdHJpbmctZm9ybWF0IHNlY3VyaXR5IiB8IHRlZSAtYSAke0xPR30KKysgICAgICBlY2hvICIgIHZ1bG5lcmFiaWxpdGllcy4iIHwgdGVlIC1hICR7TE9HfQorICAgICBmaQorICAgZmkKKyBmaQorIAorIGlmIHRlc3QgIiRnY2MiIC1lcSAxOyB0aGVuCistICBlY2hvID4+IGNvbmZpZ3VyZS5sb2cKKysgIGVjaG8gPj4gJHtMT0d9CisgICBjYXQgPiAkdGVzdC5jIDw8RU9GCisgI2lmICgoX19HTlVDX18tMCkgKiAxMCArIF9fR05VQ19NSU5PUl9fLTAgPj0gMzMpCisgIyAgZGVmaW5lIFpMSUJfSU5URVJOQUwgX19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eSAoImhpZGRlbiIpKSkKK0BAIC02MjEsNTIgKzYyNyw1MiBAQAorIH0KKyBFT0YKKyAgIGlmIHRyeSAkQ0MgLWMgJENGTEFHUyAkdGVzdC5jOyB0aGVuCistICAgIGVjaG8gIkNoZWNraW5nIGZvciBhdHRyaWJ1dGUodmlzaWJpbGl0eSkgc3VwcG9ydC4uLiBZZXMuIiB8IHRlZSAtYSBjb25maWd1cmUubG9nCisrICAgIGVjaG8gIkNoZWNraW5nIGZvciBhdHRyaWJ1dGUodmlzaWJpbGl0eSkgc3VwcG9ydC4uLiBZZXMuIiB8IHRlZSAtYSAke0xPR30KKyAgIGVsc2UKKyAgICAgQ0ZMQUdTPSIkQ0ZMQUdTIC1ETk9fVklaIgorICAgICBTRkxBR1M9IiRTRkxBR1MgLUROT19WSVoiCistICAgIGVjaG8gIkNoZWNraW5nIGZvciBhdHRyaWJ1dGUodmlzaWJpbGl0eSkgc3VwcG9ydC4uLiBOby4iIHwgdGVlIC1hIGNvbmZpZ3VyZS5sb2cKKysgICAgZWNobyAiQ2hlY2tpbmcgZm9yIGF0dHJpYnV0ZSh2aXNpYmlsaXR5KSBzdXBwb3J0Li4uIE5vLiIgfCB0ZWUgLWEgJHtMT0d9CisgICBmaQorIGZpCisgCisgcm0gLWYgJHRlc3QuW2NvXSAkdGVzdCAkdGVzdCRzaGFyZWRfZXh0ICR0ZXN0Lmdjbm8KKyAKKyAjIHNob3cgdGhlIHJlc3VsdHMgaW4gdGhlIGxvZworLWVjaG8gPj4gY29uZmlndXJlLmxvZworLWVjaG8gQUxMID0gJEFMTCA+PiBjb25maWd1cmUubG9nCistZWNobyBBUiA9ICRBUiA+PiBjb25maWd1cmUubG9nCistZWNobyBBUkZMQUdTID0gJEFSRkxBR1MgPj4gY29uZmlndXJlLmxvZworLWVjaG8gQ0MgPSAkQ0MgPj4gY29uZmlndXJlLmxvZworLWVjaG8gQ0ZMQUdTID0gJENGTEFHUyA+PiBjb25maWd1cmUubG9nCistZWNobyBDUFAgPSAkQ1BQID4+IGNvbmZpZ3VyZS5sb2cKKy1lY2hvIEVYRSA9ICRFWEUgPj4gY29uZmlndXJlLmxvZworLWVjaG8gTERDT05GSUcgPSAkTERDT05GSUcgPj4gY29uZmlndXJlLmxvZworLWVjaG8gTERGTEFHUyA9ICRMREZMQUdTID4+IGNvbmZpZ3VyZS5sb2cKKy1lY2hvIExEU0hBUkVEID0gJExEU0hBUkVEID4+IGNvbmZpZ3VyZS5sb2cKKy1lY2hvIExEU0hBUkVETElCQyA9ICRMRFNIQVJFRExJQkMgPj4gY29uZmlndXJlLmxvZworLWVjaG8gT0JKQyA9ICRPQkpDID4+IGNvbmZpZ3VyZS5sb2cKKy1lY2hvIFBJQ19PQkpDID0gJFBJQ19PQkpDID4+IGNvbmZpZ3VyZS5sb2cKKy1lY2hvIFJBTkxJQiA9ICRSQU5MSUIgPj4gY29uZmlndXJlLmxvZworLWVjaG8gU0ZMQUdTID0gJFNGTEFHUyA+PiBjb25maWd1cmUubG9nCistZWNobyBTSEFSRURMSUIgPSAkU0hBUkVETElCID4+IGNvbmZpZ3VyZS5sb2cKKy1lY2hvIFNIQVJFRExJQk0gPSAkU0hBUkVETElCTSA+PiBjb25maWd1cmUubG9nCistZWNobyBTSEFSRURMSUJWID0gJFNIQVJFRExJQlYgPj4gY29uZmlndXJlLmxvZworLWVjaG8gU1RBVElDTElCID0gJFNUQVRJQ0xJQiA+PiBjb25maWd1cmUubG9nCistZWNobyBURVNUID0gJFRFU1QgPj4gY29uZmlndXJlLmxvZworLWVjaG8gVkVSID0gJFZFUiA+PiBjb25maWd1cmUubG9nCistZWNobyBleGVjX3ByZWZpeCA9ICRleGVjX3ByZWZpeCA+PiBjb25maWd1cmUubG9nCistZWNobyBpbmNsdWRlZGlyID0gJGluY2x1ZGVkaXIgPj4gY29uZmlndXJlLmxvZworLWVjaG8gbGliZGlyID0gJGxpYmRpciA+PiBjb25maWd1cmUubG9nCistZWNobyBtYW5kaXIgPSAkbWFuZGlyID4+IGNvbmZpZ3VyZS5sb2cKKy1lY2hvIHByZWZpeCA9ICRwcmVmaXggPj4gY29uZmlndXJlLmxvZworLWVjaG8gc2hhcmVkbGliZGlyID0gJHNoYXJlZGxpYmRpciA+PiBjb25maWd1cmUubG9nCistZWNobyB1bmFtZSA9ICR1bmFtZSA+PiBjb25maWd1cmUubG9nCistZWNobyAtLS0tLS0tLS0tLS0tLS0tLS0tLSA+PiBjb25maWd1cmUubG9nCistZWNobyA+PiBjb25maWd1cmUubG9nCistZWNobyA+PiBjb25maWd1cmUubG9nCisrZWNobyA+PiAke0xPR30KKytlY2hvIEFMTCA9ICRBTEwgPj4gJHtMT0d9CisrZWNobyBBUiA9ICRBUiA+PiAke0xPR30KKytlY2hvIEFSRkxBR1MgPSAkQVJGTEFHUyA+PiAke0xPR30KKytlY2hvIENDID0gJENDID4+ICR7TE9HfQorK2VjaG8gQ0ZMQUdTID0gJENGTEFHUyA+PiAke0xPR30KKytlY2hvIENQUCA9ICRDUFAgPj4gJHtMT0d9CisrZWNobyBFWEUgPSAkRVhFID4+ICR7TE9HfQorK2VjaG8gTERDT05GSUcgPSAkTERDT05GSUcgPj4gJHtMT0d9CisrZWNobyBMREZMQUdTID0gJExERkxBR1MgPj4gJHtMT0d9CisrZWNobyBMRFNIQVJFRCA9ICRMRFNIQVJFRCA+PiAke0xPR30KKytlY2hvIExEU0hBUkVETElCQyA9ICRMRFNIQVJFRExJQkMgPj4gJHtMT0d9CisrZWNobyBPQkpDID0gJE9CSkMgPj4gJHtMT0d9CisrZWNobyBQSUNfT0JKQyA9ICRQSUNfT0JKQyA+PiAke0xPR30KKytlY2hvIFJBTkxJQiA9ICRSQU5MSUIgPj4gJHtMT0d9CisrZWNobyBTRkxBR1MgPSAkU0ZMQUdTID4+ICR7TE9HfQorK2VjaG8gU0hBUkVETElCID0gJFNIQVJFRExJQiA+PiAke0xPR30KKytlY2hvIFNIQVJFRExJQk0gPSAkU0hBUkVETElCTSA+PiAke0xPR30KKytlY2hvIFNIQVJFRExJQlYgPSAkU0hBUkVETElCViA+PiAke0xPR30KKytlY2hvIFNUQVRJQ0xJQiA9ICRTVEFUSUNMSUIgPj4gJHtMT0d9CisrZWNobyBURVNUID0gJFRFU1QgPj4gJHtMT0d9CisrZWNobyBWRVIgPSAkVkVSID4+ICR7TE9HfQorK2VjaG8gZXhlY19wcmVmaXggPSAkZXhlY19wcmVmaXggPj4gJHtMT0d9CisrZWNobyBpbmNsdWRlZGlyID0gJGluY2x1ZGVkaXIgPj4gJHtMT0d9CisrZWNobyBsaWJkaXIgPSAkbGliZGlyID4+ICR7TE9HfQorK2VjaG8gbWFuZGlyID0gJG1hbmRpciA+PiAke0xPR30KKytlY2hvIHByZWZpeCA9ICRwcmVmaXggPj4gJHtMT0d9CisrZWNobyBzaGFyZWRsaWJkaXIgPSAkc2hhcmVkbGliZGlyID4+ICR7TE9HfQorK2VjaG8gdW5hbWUgPSAkdW5hbWUgPj4gJHtMT0d9CisrZWNobyAtLS0tLS0tLS0tLS0tLS0tLS0tLSA+PiAke0xPR30KKytlY2hvID4+ICR7TE9HfQorK2VjaG8gPj4gJHtMT0d9CisgCisgIyB1ZHBhdGUgTWFrZWZpbGUKKy1zZWQgPCBNYWtlZmlsZS5pbiAiCisrc2VkIDwgJHNyY2Rpci9NYWtlZmlsZS5pbiAiCisgL15DQyAqPS9zIz0uKiM9JENDIworIC9eQ0ZMQUdTICo9L3MjPS4qIz0kQ0ZMQUdTIworIC9eU0ZMQUdTICo9L3MjPS4qIz0kU0ZMQUdTIworQEAgLTY5Myw5ICs2OTksMTEgQEAKKyAvXlBJQ19PQkpDICo9L3MjPS4qIz0gJFBJQ19PQkpDIworIC9eYWxsOiAqL3MjOi4qIzogJEFMTCMKKyAvXnRlc3Q6ICovcyM6LiojOiAkVEVTVCMKKysvXmJ1aWxkZGlyICo9L3MjPS4qIz0kYnVpbGRkaXIjCisrL15zcmNkaXIgKj0vcyM9LiojPSRzcmNkaXIjCisgIiA+IE1ha2VmaWxlCisgCistc2VkIDwgemxpYi5wYy5pbiAiCisrc2VkIDwgJHNyY2Rpci96bGliLnBjLmluICIKKyAvXkNDICo9L3MjPS4qIz0kQ0MjCisgL15DRkxBR1MgKj0vcyM9LiojPSRDRkxBR1MjCisgL15DUFAgKj0vcyM9LiojPSRDUFAjCitAQCAtNzE1LDYgKzcyMyw4IEBACisgL15pbmNsdWRlZGlyICo9L3MjPS4qIz0kaW5jbHVkZWRpciMKKyAvXm1hbmRpciAqPS9zIz0uKiM9JG1hbmRpciMKKyAvXkxERkxBR1MgKj0vcyM9LiojPSRMREZMQUdTIworKy9eYnVpbGRkaXIgKj0vcyM9LiojPSRidWlsZGRpciMKKysvXnNyY2RpciAqPS9zIz0uKiM9JHNyY2RpciMKKyAiIHwgc2VkIC1lICIKKyBzL1xAVkVSU0lPTlxALyRWRVIvZzsKKyAiID4gemxpYi5wYworZGlmZiAtYXJ1TiBhL01ha2VmaWxlLmluIGIvTWFrZWZpbGUuaW4KKy0tLSBhL01ha2VmaWxlLmluCTIwMTItMDEtMjggMTQ6NDg6NTAuMDAwMDAwMDAwIC0wODAwCisrKysgYi9NYWtlZmlsZS5pbgkyMDEyLTAyLTA4IDEyOjUzOjM1LjY5NTk4OTgzMyAtMDgwMAorQEAgLTQ1LDYgKzQ1LDggQEAKKyBTSEVMTD0vYmluL3NoCisgRVhFPQorIAorK2J1aWxkZGlyID0gLgorK3NyY2RpciA9IC4KKyBwcmVmaXggPSAvdXNyL2xvY2FsCisgZXhlY19wcmVmaXggPSAke3ByZWZpeH0KKyBsaWJkaXIgPSAke2V4ZWNfcHJlZml4fS9saWIKK0BAIC01NSw2ICs1Nyw4IEBACisgcGtnY29uZmlnZGlyID0gJHtsaWJkaXJ9L3BrZ2NvbmZpZworIHRlbXBmaWxlIDo9ICQoc2hlbGwgbWt0ZW1wIC11IF9fWFhYWFhYKQorIAorK1ZQQVRIID0gJHtzcmNkaXJ9CisrCisgT0JKWiA9IGFkbGVyMzIubyBjcmMzMi5vIGRlZmxhdGUubyBpbmZiYWNrLm8gaW5mZmFzdC5vIGluZmxhdGUubyBpbmZ0cmVlcy5vIHRyZWVzLm8genV0aWwubworIE9CSkcgPSBjb21wcmVzcy5vIHVuY29tcHIubyBnemNsb3NlLm8gZ3psaWIubyBnenJlYWQubyBnendyaXRlLm8KKyBPQkpDID0gJChPQkpaKSAkKE9CSkcpCitAQCAtMTExLDggKzExNSw4IEBACisgCWZpCisgCS1Acm0gLWYgZm9vLmd6CisgCistaW5mY292ZXIubzogdGVzdC9pbmZjb3Zlci5jIHpsaWIuaCB6Y29uZi5oCistCSQoQ0MpICQoQ0ZMQUdTKSAtSS4gLWMgLW8gJEAgdGVzdC9pbmZjb3Zlci5jCisraW5mY292ZXIubzogdGVzdC9pbmZjb3Zlci5jICQoc3JjZGlyKS96bGliLmggemNvbmYuaAorKwkkKENDKSAkKENGTEFHUykgLUkuIC1JJChzcmNkaXIpIC1jIC1vICRAIHRlc3QvaW5mY292ZXIuYworIAorIGluZmNvdmVyOiBpbmZjb3Zlci5vIGxpYnouYQorIAkkKENDKSAkKENGTEFHUykgLW8gJEAgaW5mY292ZXIubyBsaWJ6LmEKK0BAIC0xMzgsMTcgKzE0MiwxNyBAQAorIAltdiBfbWF0Y2gubyBtYXRjaC5sbworIAlybSAtZiBfbWF0Y2gucworIAorLWV4YW1wbGUubzogdGVzdC9leGFtcGxlLmMgemxpYi5oIHpjb25mLmgKKy0JJChDQykgJChDRkxBR1MpIC1JLiAtYyAtbyAkQCB0ZXN0L2V4YW1wbGUuYworK2V4YW1wbGUubzogJChzcmNkaXIpL3Rlc3QvZXhhbXBsZS5jICQoc3JjZGlyKS96bGliLmggemNvbmYuaAorKwkkKENDKSAkKENGTEFHUykgLUkuIC1JJChzcmNkaXIpIC1jIC1vICRAICQoc3JjZGlyKS90ZXN0L2V4YW1wbGUuYworIAorLW1pbmlnemlwLm86IHRlc3QvbWluaWd6aXAuYyB6bGliLmggemNvbmYuaAorLQkkKENDKSAkKENGTEFHUykgLUkuIC1jIC1vICRAIHRlc3QvbWluaWd6aXAuYworK21pbmlnemlwLm86ICQoc3JjZGlyKS90ZXN0L21pbmlnemlwLmMgJChzcmNkaXIpL3psaWIuaCB6Y29uZi5oCisrCSQoQ0MpICQoQ0ZMQUdTKSAtSS4gLUkkKHNyY2RpcikgLWMgLW8gJEAgJChzcmNkaXIpL3Rlc3QvbWluaWd6aXAuYworIAorLWV4YW1wbGU2NC5vOiB0ZXN0L2V4YW1wbGUuYyB6bGliLmggemNvbmYuaAorLQkkKENDKSAkKENGTEFHUykgLUkuIC1EX0ZJTEVfT0ZGU0VUX0JJVFM9NjQgLWMgLW8gJEAgdGVzdC9leGFtcGxlLmMKKytleGFtcGxlNjQubzogJChzcmNkaXIpL3Rlc3QvZXhhbXBsZS5jICQoc3JjZGlyKS96bGliLmggemNvbmYuaAorKwkkKENDKSAkKENGTEFHUykgLUkuIC1JJChzcmNkaXIpIC1EX0ZJTEVfT0ZGU0VUX0JJVFM9NjQgLWMgLW8gJEAgJChzcmNkaXIpL3Rlc3QvZXhhbXBsZS5jCisgCistbWluaWd6aXA2NC5vOiB0ZXN0L21pbmlnemlwLmMgemxpYi5oIHpjb25mLmgKKy0JJChDQykgJChDRkxBR1MpIC1JLiAtRF9GSUxFX09GRlNFVF9CSVRTPTY0IC1jIC1vICRAIHRlc3QvbWluaWd6aXAuYworK21pbmlnemlwNjQubzogdGVzdC9taW5pZ3ppcC5jICQoc3JjZGlyKS96bGliLmggemNvbmYuaAorKwkkKENDKSAkKENGTEFHUykgLUkuIC1JJChzcmNkaXIpIC1EX0ZJTEVfT0ZGU0VUX0JJVFM9NjQgLWMgLW8gJEAgJChzcmNkaXIpL3Rlc3QvbWluaWd6aXAuYworIAorIC5TVUZGSVhFUzogLmxvCisgCitAQCAtMjAxLDcgKzIwNSw3IEBACisgCSAgbG4gLXMgJChTSEFSRURMSUJWKSAkKERFU1RESVIpJChzaGFyZWRsaWJkaXIpLyQoU0hBUkVETElCTSk7IFwKKyAJICAoJChMRENPTkZJRykgfHwgdHJ1ZSkgID4vZGV2L251bGwgMj4mMTsgXAorIAlmaQorLQljcCB6bGliLjMgJChERVNURElSKSQobWFuM2RpcikKKysJY3AgJChzcmNkaXIpL3psaWIuMyAkKERFU1RESVIpJChtYW4zZGlyKQorIAljaG1vZCA2NDQgJChERVNURElSKSQobWFuM2RpcikvemxpYi4zCisgCWNwIHpsaWIucGMgJChERVNURElSKSQocGtnY29uZmlnZGlyKQorIAljaG1vZCA2NDQgJChERVNURElSKSQocGtnY29uZmlnZGlyKS96bGliLnBjCitAQCAtMjEwLDcgKzIxNCw3IEBACisgCisgaW5zdGFsbDogaW5zdGFsbC1saWJzCisgCS1AaWYgWyAhIC1kICQoREVTVERJUikkKGluY2x1ZGVkaXIpICAgXTsgdGhlbiBta2RpciAtcCAkKERFU1RESVIpJChpbmNsdWRlZGlyKTsgZmkKKy0JY3AgemxpYi5oIHpjb25mLmggJChERVNURElSKSQoaW5jbHVkZWRpcikKKysJY3AgJChzcmNkaXIpL3psaWIuaCB6Y29uZi5oICQoREVTVERJUikkKGluY2x1ZGVkaXIpCisgCWNobW9kIDY0NCAkKERFU1RESVIpJChpbmNsdWRlZGlyKS96bGliLmggJChERVNURElSKSQoaW5jbHVkZWRpcikvemNvbmYuaAorIAorIHVuaW5zdGFsbDoKK0BAIC0yMjcsMTQgKzIzMSwxNCBAQAorIHpsaWIuMy5wZGY6IHpsaWIuMworIAlncm9mZiAtbWFuZG9jIC1mIEggLVQgcHMgemxpYi4zIHwgcHMycGRmIC0gemxpYi4zLnBkZgorIAorLXpjb25mLmguY21ha2VpbjogemNvbmYuaC5pbgorK3pjb25mLmguY21ha2VpbjogJChzcmNkaXIpL3pjb25mLmguaW4KKyAJLUBlY2hvICIvI2RlZmluZSBaQ09ORl9ILyBhXFxcXFxuI2NtYWtlZGVmaW5lIFpfUFJFRklYXFxcXFxuI2NtYWtlZGVmaW5lIFpfSEFWRV9VTklTVERfSFxuIiA+ICQodGVtcGZpbGUpCistCS1Ac2VkIC1mICQodGVtcGZpbGUpIHpjb25mLmguaW4gPiB6Y29uZi5oLmNtYWtlaW4KKy0JLUB0b3VjaCAtciB6Y29uZi5oLmluIHpjb25mLmguY21ha2VpbgorKwktQHNlZCAtZiAkKHRlbXBmaWxlKSAkPCA+ICRACisrCS1AdG91Y2ggLXIgJDwgJEAKKyAJLUBybSAkKHRlbXBmaWxlKQorIAorLXpjb25mOiB6Y29uZi5oLmluCistCWNwIC1wIHpjb25mLmguaW4gemNvbmYuaAorK3pjb25mOiAkKHNyY2RpcikvemNvbmYuaC5pbgorKwljcCAtcCAkPCB6Y29uZi5oCisgCisgbW9zdGx5Y2xlYW46IGNsZWFuCisgY2xlYW46CmRpZmYgLS1naXQgYS96bGliLnBhdGNoZXMvemxpYi01MS5kZXNjcmlwdGlvbiBiL3psaWIucGF0Y2hlcy96bGliLTUxLmRlc2NyaXB0aW9uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlMjYxNDUKLS0tIC9kZXYvbnVsbAorKysgYi96bGliLnBhdGNoZXMvemxpYi01MS5kZXNjcmlwdGlvbgpAQCAtMCwwICsxIEBACitUaGlzIHBhdGNoIGVuc3VyZXMgdGhhdCB0aGUgbmF0aXZlIHZlcnNpb24gb2YgbGlidG9vbCBpcyBzZWxlY3RlZCByYXRoZXIgdGhhbiBhbnkgR05VLWJhc2VkIG9wdGlvbmFsIHZlcnNpb25zIHRoYXQgbWlnaHQgYmUgaW5zdGFsbGVkIGFuZCBpbiB0aGUgUEFUSCBzdWNoIGFzIC9vcHQvbG9jYWwvYmluIG9yIC91c3IvbG9jYWwvYmluLgpkaWZmIC0tZ2l0IGEvemxpYi5wYXRjaGVzL3psaWItNTEucGF0Y2ggYi96bGliLnBhdGNoZXMvemxpYi01MS5wYXRjaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWRlNGIwCi0tLSAvZGV2L251bGwKKysrIGIvemxpYi5wYXRjaGVzL3psaWItNTEucGF0Y2gKQEAgLTAsMCArMSwxMiBAQAorZGlmZiAtYXJ1TiBhL2NvbmZpZ3VyZSBiL2NvbmZpZ3VyZQorLS0tIGEvY29uZmlndXJlCTIwMTItMDItMDggMTM6NDg6NTEuMDAwMDAwMDAwIC0wODAwCisrKysgYi9jb25maWd1cmUJMjAxMi0wMi0wOCAxMzo0Nzo1MC4wMDAwMDAwMDAgLTA4MDAKK0BAIC0yMTIsNyArMjEyLDcgQEAKKyAgICAgICAgICAgICAgU0hBUkVETElCVj1saWJ6LiRWRVIkc2hhcmVkX2V4dAorICAgICAgICAgICAgICBTSEFSRURMSUJNPWxpYnouJFZFUjEkc2hhcmVkX2V4dAorICAgICAgICAgICAgICBMRFNIQVJFRD0ke0xEU0hBUkVELSIkY2MgLWR5bmFtaWNsaWIgLWluc3RhbGxfbmFtZSAkbGliZGlyLyRTSEFSRURMSUJNIC1jb21wYXRpYmlsaXR5X3ZlcnNpb24gJFZFUjEgLWN1cnJlbnRfdmVyc2lvbiAkVkVSMyJ9CistICAgICAgICAgICAgIEFSPSJsaWJ0b29sIgorKyAgICAgICAgICAgICBBUj0iL3Vzci9iaW4vbGlidG9vbCIKKyAgICAgICAgICAgICAgQVJGTEFHUz0iLW8iIDs7CisgICAqKSAgICAgICAgICAgICBMRFNIQVJFRD0ke0xEU0hBUkVELSIkY2MgLXNoYXJlZCJ9IDs7CisgICBlc2FjCmRpZmYgLS1naXQgYS96bGliLnBhdGNoZXMvemxpYi01Mi5kZXNjcmlwdGlvbiBiL3psaWIucGF0Y2hlcy96bGliLTUyLmRlc2NyaXB0aW9uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlNzAzY2YKLS0tIC9kZXYvbnVsbAorKysgYi96bGliLnBhdGNoZXMvemxpYi01Mi5kZXNjcmlwdGlvbgpAQCAtMCwwICsxIEBACitVcGRhdGUgTWFrZWZpbGUuaW4gdG8gdXNlIC91c3IvYmluL2luc3RhbGwgaW5zdGVhZCBvZiBzdHJhaWdodCBjb3B5aW5nIGZvciBpbnN0YWxsIHRhcmdldApkaWZmIC0tZ2l0IGEvemxpYi5wYXRjaGVzL3psaWItNTIucGF0Y2ggYi96bGliLnBhdGNoZXMvemxpYi01Mi5wYXRjaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjM4ZjhiCi0tLSAvZGV2L251bGwKKysrIGIvemxpYi5wYXRjaGVzL3psaWItNTIucGF0Y2gKQEAgLTAsMCArMSw2OSBAQAorZGlmZiAtYXJ1TiBhL3psaWItMS4yLjYvTWFrZWZpbGUuaW4gYi96bGliLTEuMi42L01ha2VmaWxlLmluCistLS0gYS96bGliLTEuMi42L01ha2VmaWxlLmluCTIwMTQtMDYtMTAgMTI6MDE6MzMuNTQ1MDQ3MzEyIC0wNzAwCisrKysgYi96bGliLTEuMi42L01ha2VmaWxlLmluCTIwMTQtMDYtMTAgMTQ6MzM6NTAuNjc0NTQwNDM0IC0wNzAwCitAQCAtMTcsNyArMTcsNiBAQAorICMgICAgbWFrZSBpbnN0YWxsIHByZWZpeD0kSE9NRQorIAorIENDPWNjCistCisgQ0ZMQUdTPS1PCisgI0NGTEFHUz0tTyAtRE1BWF9XQklUUz0xNCAtRE1BWF9NRU1fTEVWRUw9NworICNDRkxBR1M9LWcgLURERUJVRworQEAgLTQ0LDYgKzQzLDcgQEAKKyBUQVI9dGFyCisgU0hFTEw9L2Jpbi9zaAorIEVYRT0KKytJTlNUQUxMPS91c3IvYmluL2luc3RhbGwgLWMgLUMKKyAKKyBidWlsZGRpciA9IC4KKyBzcmNkaXIgPSAuCitAQCAtMTg3LDM1ICsxODcsMjggQEAKKyAJJChDQykgJChDRkxBR1MpIC1vICRAIG1pbmlnemlwNjQubyAkKFRFU1RfTERGTEFHUykKKyAKKyBpbnN0YWxsLWxpYnM6ICQoTElCUykKKy0JLUBpZiBbICEgLWQgJChERVNURElSKSQoZXhlY19wcmVmaXgpICBdOyB0aGVuIG1rZGlyIC1wICQoREVTVERJUikkKGV4ZWNfcHJlZml4KTsgZmkKKy0JLUBpZiBbICEgLWQgJChERVNURElSKSQobGliZGlyKSAgICAgICBdOyB0aGVuIG1rZGlyIC1wICQoREVTVERJUikkKGxpYmRpcik7IGZpCistCS1AaWYgWyAhIC1kICQoREVTVERJUikkKHNoYXJlZGxpYmRpcikgXTsgdGhlbiBta2RpciAtcCAkKERFU1RESVIpJChzaGFyZWRsaWJkaXIpOyBmaQorLQktQGlmIFsgISAtZCAkKERFU1RESVIpJChtYW4zZGlyKSAgICAgIF07IHRoZW4gbWtkaXIgLXAgJChERVNURElSKSQobWFuM2Rpcik7IGZpCistCS1AaWYgWyAhIC1kICQoREVTVERJUikkKHBrZ2NvbmZpZ2RpcikgXTsgdGhlbiBta2RpciAtcCAkKERFU1RESVIpJChwa2djb25maWdkaXIpOyBmaQorLQljcCAkKFNUQVRJQ0xJQikgJChERVNURElSKSQobGliZGlyKQorLQljaG1vZCA2NDQgJChERVNURElSKSQobGliZGlyKS8kKFNUQVRJQ0xJQikKKysJQCQoSU5TVEFMTCkgLWQgJChERVNURElSKSQoZXhlY19wcmVmaXgpCisrCUAkKElOU1RBTEwpIC1kICQoREVTVERJUikkKGxpYmRpcikKKysJQCQoSU5TVEFMTCkgLWQgJChERVNURElSKSQoc2hhcmVkbGliZGlyKQorKwlAJChJTlNUQUxMKSAtZCAkKERFU1RESVIpJChtYW4zZGlyKQorKwlAJChJTlNUQUxMKSAtZCAkKERFU1RESVIpJChwa2djb25maWdkaXIpCisrCUAkKElOU1RBTEwpIC1tIDY0NCAkKFNUQVRJQ0xJQikgJChERVNURElSKSQobGliZGlyKQorIAktQCgkKFJBTkxJQikgJChERVNURElSKSQobGliZGlyKS9saWJ6LmEgfHwgdHJ1ZSkgPi9kZXYvbnVsbCAyPiYxCisgCS1AaWYgdGVzdCAtbiAiJChTSEFSRURMSUJWKSI7IHRoZW4gXAorLQkgIGNwICQoU0hBUkVETElCVikgJChERVNURElSKSQoc2hhcmVkbGliZGlyKTsgXAorLQkgIGVjaG8gImNwICQoU0hBUkVETElCVikgJChERVNURElSKSQoc2hhcmVkbGliZGlyKSI7IFwKKy0JICBjaG1vZCA3NTUgJChERVNURElSKSQoc2hhcmVkbGliZGlyKS8kKFNIQVJFRExJQlYpOyBcCistCSAgZWNobyAiY2htb2QgNzU1ICQoREVTVERJUikkKHNoYXJlZGxpYmRpcikvJChTSEFSRURMSUJWKSI7IFwKKy0JICBybSAtZiAkKERFU1RESVIpJChzaGFyZWRsaWJkaXIpLyQoU0hBUkVETElCKSAkKERFU1RESVIpJChzaGFyZWRsaWJkaXIpLyQoU0hBUkVETElCTSk7IFwKKy0JICBsbiAtcyAkKFNIQVJFRExJQlYpICQoREVTVERJUikkKHNoYXJlZGxpYmRpcikvJChTSEFSRURMSUIpOyBcCistCSAgbG4gLXMgJChTSEFSRURMSUJWKSAkKERFU1RESVIpJChzaGFyZWRsaWJkaXIpLyQoU0hBUkVETElCTSk7IFwKKysJICAkKElOU1RBTEwpIC1tIDc1NSAkKFNIQVJFRExJQlYpICQoREVTVERJUikkKHNoYXJlZGxpYmRpcik7IFwKKysJICBlY2hvICIkKElOU1RBTEwpIC1tIDc1NSAkKFNIQVJFRExJQlYpICQoREVTVERJUikkKHNoYXJlZGxpYmRpcikiOyBcCisrCSAgbG4gLXNmICQoU0hBUkVETElCVikgJChERVNURElSKSQoc2hhcmVkbGliZGlyKS8kKFNIQVJFRExJQik7IFwKKysJICBsbiAtc2YgJChTSEFSRURMSUJWKSAkKERFU1RESVIpJChzaGFyZWRsaWJkaXIpLyQoU0hBUkVETElCTSk7IFwKKyAJICAoJChMRENPTkZJRykgfHwgdHJ1ZSkgID4vZGV2L251bGwgMj4mMTsgXAorIAlmaQorLQljcCAkKHNyY2RpcikvemxpYi4zICQoREVTVERJUikkKG1hbjNkaXIpCistCWNobW9kIDY0NCAkKERFU1RESVIpJChtYW4zZGlyKS96bGliLjMKKy0JY3AgemxpYi5wYyAkKERFU1RESVIpJChwa2djb25maWdkaXIpCistCWNobW9kIDY0NCAkKERFU1RESVIpJChwa2djb25maWdkaXIpL3psaWIucGMKKysJQCQoSU5TVEFMTCkgLW0gNjQ0ICQoc3JjZGlyKS96bGliLjMgJChERVNURElSKSQobWFuM2RpcikKKysJQCQoSU5TVEFMTCkgLW0gNjQ0IHpsaWIucGMgJChERVNURElSKSQocGtnY29uZmlnZGlyKQorICMgVGhlIHJhbmxpYiBpbiBpbnN0YWxsIGlzIG5lZWRlZCBvbiBOZVhUU1RFUCB3aGljaCBjaGVja3MgZmlsZSB0aW1lcworICMgbGRjb25maWcgaXMgZm9yIExpbnV4CisgCisgaW5zdGFsbDogaW5zdGFsbC1saWJzCistCS1AaWYgWyAhIC1kICQoREVTVERJUikkKGluY2x1ZGVkaXIpICAgXTsgdGhlbiBta2RpciAtcCAkKERFU1RESVIpJChpbmNsdWRlZGlyKTsgZmkKKy0JY3AgJChzcmNkaXIpL3psaWIuaCB6Y29uZi5oICQoREVTVERJUikkKGluY2x1ZGVkaXIpCistCWNobW9kIDY0NCAkKERFU1RESVIpJChpbmNsdWRlZGlyKS96bGliLmggJChERVNURElSKSQoaW5jbHVkZWRpcikvemNvbmYuaAorKwkkKElOU1RBTEwpIC1kICQoREVTVERJUikkKGluY2x1ZGVkaXIpCisrCSQoSU5TVEFMTCkgLW0gNjQ0ICQoc3JjZGlyKS96bGliLmggemNvbmYuaCAkKERFU1RESVIpJChpbmNsdWRlZGlyKQorIAorIHVuaW5zdGFsbDoKKyAJY2QgJChERVNURElSKSQoaW5jbHVkZWRpcik7IHJtIC1mIHpsaWIuaCB6Y29uZi5oCmRpZmYgLS1naXQgYS96bGliLnRhci5iejIgYi96bGliLnRhci5iejIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzY0NzliYQotLS0gL2Rldi9udWxsCisrKyBiL3psaWIudGFyLmJ6MgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS96bGliLnVybCBiL3psaWIudXJsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljOTI5ZWMKLS0tIC9kZXYvbnVsbAorKysgYi96bGliLnVybApAQCAtMCwwICsxIEBACitodHRwOi8vd3d3LnpsaWIubmV0L3psaWItMS4yLjYudGFyLmJ6MgpkaWZmIC0tZ2l0IGEvemxpYi52ZXJzaW9uIGIvemxpYi52ZXJzaW9uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjNDM3OTAKLS0tIC9kZXYvbnVsbAorKysgYi96bGliLnZlcnNpb24KQEAgLTAsMCArMSBAQAorMS4yLjYK