IyEvdXNyL2Jpbi9lbnYgcGVybAoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIFdyaXR0ZW4gYnkgQW5keSBQb2x5YWtvdiA8YXBwcm9Ab3BlbnNzbC5vcmc+IGZvciB0aGUgT3BlblNTTAojIHByb2plY3QuIFRoZSBtb2R1bGUgaXMsIGhvd2V2ZXIsIGR1YWwgbGljZW5zZWQgdW5kZXIgT3BlblNTTCBhbmQKIyBDUllQVE9HQU1TIGxpY2Vuc2VzIGRlcGVuZGluZyBvbiB3aGVyZSB5b3Ugb2J0YWluIGl0LiBGb3IgZnVydGhlcgojIGRldGFpbHMgc2VlIGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvfmFwcHJvL2NyeXB0b2dhbXMvLgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgojIE1hcmNoIDIwMTAKIwojIFRoZSBtb2R1bGUgaW1wbGVtZW50cyAiNC1iaXQiIEdDTSBHSEFTSCBmdW5jdGlvbiBhbmQgdW5kZXJseWluZwojIHNpbmdsZSBtdWx0aXBsaWNhdGlvbiBvcGVyYXRpb24gaW4gR0YoMl4xMjgpLiAiNC1iaXQiIG1lYW5zIHRoYXQgaXQKIyB1c2VzIDI1NiBieXRlcyBwZXIta2V5IHRhYmxlIFsrMTI4IGJ5dGVzIHNoYXJlZCB0YWJsZV0uIFBlcmZvcm1hbmNlCiMgcmVzdWx0cyBhcmUgZm9yIHN0cmVhbWVkIEdIQVNIIHN1YnJvdXRpbmUgb24gVWx0cmFTUEFSQyBwcmUtVHggQ1BVCiMgYW5kIGFyZSBleHByZXNzZWQgaW4gY3ljbGVzIHBlciBwcm9jZXNzZWQgYnl0ZSwgbGVzcyBpcyBiZXR0ZXI6CiMKIwkJZ2NjIDMuMy54CWNjIDUuMgkJdGhpcyBhc3NlbWJsZXIKIwojIDMyLWJpdCBidWlsZAk4MS40CQk0My4zCQkxMi42CSgrNTQ2JS8rMjQ0JSkKIyA2NC1iaXQgYnVpbGQJMjAuMgkJMjEuMgkJMTIuNgkoKzYwJS8rNjglKQojCiMgSGVyZSBpcyBkYXRhIGNvbGxlY3RlZCBvbiBVbHRyYVNQQVJDIFQxIHN5c3RlbSBydW5uaW5nIExpbnV4OgojCiMJCWdjYyA0LjQuMQkJCXRoaXMgYXNzZW1ibGVyCiMKIyAzMi1iaXQgYnVpbGQJNTY2CQkJCTUwCSgrMTAwMCUpCiMgNjQtYml0IGJ1aWxkCTU2CQkJCTUwCSgrMTIlKQojCiMgSSBkb24ndCBxdWl0ZSB1bmRlcnN0YW5kIHdoeSBkaWZmZXJlbmNlIGJldHdlZW4gMzItYml0IGFuZCA2NC1iaXQKIyBjb21waWxlci1nZW5lcmF0ZWQgY29kZSBpcyBzbyBiaWcuIENvbXBpbGVycyAqd2VyZSogaW5zdHJ1Y3RlZCB0bwojIGdlbmVyYXRlIGNvZGUgZm9yIFVsdHJhU1BBUkMgYW5kIHNob3VsZCBoYXZlIHVzZWQgNjQtYml0IHJlZ2lzdGVycwojIGZvciBaIHZlY3RvciAoc2VlIEMgY29kZSkgZXZlbiBpbiAzMi1iaXQgYnVpbGQuLi4gT2ggd2VsbCwgaXQgb25seQojIG1lYW5zIG1vcmUgaW1wcmVzc2l2ZSBpbXByb3ZlbWVudCBjb2VmZmljaWVudHMgZm9yIHRoaXMgYXNzZW1ibGVyCiMgbW9kdWxlOy0pIExvb3BzIGFyZSBhZ2dyZXNzaXZlbHkgbW9kdWxvLXNjaGVkdWxlZCBpbiByZXNwZWN0IHRvCiMgcmVmZXJlbmNlcyB0byBpbnB1dCBkYXRhIGFuZCBaLmhpIHVwZGF0ZXMgdG8gYWNoaWV2ZSAxMiBjeWNsZXMKIyB0aW1pbmcuIFRvIGFuY2hvciB0byBzb21ldGhpbmcgZWxzZSwgc2hhMS1zcGFyY3Y5LnBsIHNwZW5kcyAxMS42CiMgY3ljbGVzIHRvIHByb2Nlc3Mgb25lIGJ5dGUgb24gVWx0cmFTUEFSQyBwcmUtVHggQ1BVIGFuZCB+MjQgb24gVDEuCiMKIyBPY3RvYmVyIDIwMTIKIwojIEFkZCBWSVMzIGxvb2t1cC10YWJsZS1mcmVlIGltcGxlbWVudGF0aW9uIHVzaW5nIHBvbHlub21pYWwKIyBtdWx0aXBsaWNhdGlvbiB4bXVseFtoaV0gYW5kIGV4dGVuZGVkIGFkZGl0aW9uIGFkZHhjW2NjXQojIGluc3RydWN0aW9ucy4gNC41Mi83LjYzeCBpbXByb3ZlbWVudCBvbiBUMy9UNCBvciBpbiBhYnNvbHV0ZQojIHRlcm1zIDcuOTAvMi4xNCBjeWNsZXMgcGVyIGJ5dGUuIE9uIFQ0IG11bHRpLXByb2Nlc3MgYmVuY2htYXJrCiMgc2F0dXJhdGVzIGF0IH4xNS41eCBzaW5nbGUtcHJvY2VzcyByZXN1bHQgb24gOC1jb3JlIHByb2Nlc3NvciwKIyBvciB+MjAuNUdCcHMgcGVyIDIuODVHSHogc29ja2V0LgoKJGJpdHM9MzI7CmZvciAoQEFSR1YpICAgICB7ICRiaXRzPTY0IGlmICgvXC1tNjQvIHx8IC9cLXhhcmNoXD12OS8pOyB9CmlmICgkYml0cz09NjQpICB7ICRiaWFzPTIwNDc7ICRmcmFtZT0xOTI7IH0KZWxzZSAgICAgICAgICAgIHsgJGJpYXM9MDsgICAgJGZyYW1lPTExMjsgfQoKJG91dHB1dD1zaGlmdDsKb3BlbiBTVERPVVQsIj4kb3V0cHV0IjsKCiRaaGk9IiVvMCI7CSMgNjQtYml0IHZhbHVlcwokWmxvPSIlbzEiOwokVGhpPSIlbzIiOwokVGxvPSIlbzMiOwokcmVtPSIlbzQiOwokdG1wPSIlbzUiOwoKJG5oaT0iJWwwIjsJIyBzbWFsbCB2YWx1ZXMgYW5kIHBvaW50ZXJzCiRubG89IiVsMSI7CiR4aTA9IiVsMiI7CiR4aTE9IiVsMyI7CiRyZW1fNGJpdD0iJWw0IjsKJHJlbWk9IiVsNSI7CiRIdGJsbz0iJWw2IjsKJGNudD0iJWw3IjsKCiRYaT0iJWkwIjsJIyBpbnB1dCBhcmd1bWVudCBibG9jawokSHRibD0iJWkxIjsKJGlucD0iJWkyIjsKJGxlbj0iJWkzIjsKCiRjb2RlLj08PF9fXyBpZiAoJGJpdHM9PTY0KTsKLnJlZ2lzdGVyCSVnMiwjc2NyYXRjaAoucmVnaXN0ZXIJJWczLCNzY3JhdGNoCl9fXwokY29kZS49PDxfX187Ci5zZWN0aW9uCSIudGV4dCIsI2FsbG9jLCNleGVjaW5zdHIKCi5hbGlnbgk2NApyZW1fNGJpdDoKCS5sb25nCWAweDAwMDA8PDE2YCwwLGAweDFDMjA8PDE2YCwwLGAweDM4NDA8PDE2YCwwLGAweDI0NjA8PDE2YCwwCgkubG9uZwlgMHg3MDgwPDwxNmAsMCxgMHg2Q0EwPDwxNmAsMCxgMHg0OEMwPDwxNmAsMCxgMHg1NEUwPDwxNmAsMAoJLmxvbmcJYDB4RTEwMDw8MTZgLDAsYDB4RkQyMDw8MTZgLDAsYDB4RDk0MDw8MTZgLDAsYDB4QzU2MDw8MTZgLDAKCS5sb25nCWAweDkxODA8PDE2YCwwLGAweDhEQTA8PDE2YCwwLGAweEE5QzA8PDE2YCwwLGAweEI1RTA8PDE2YCwwCi50eXBlCXJlbV80Yml0LCNvYmplY3QKLnNpemUJcmVtXzRiaXQsKC4tcmVtXzRiaXQpCgouZ2xvYmwJZ2NtX2doYXNoXzRiaXQKLmFsaWduCTMyCmdjbV9naGFzaF80Yml0OgoJc2F2ZQklc3AsLSRmcmFtZSwlc3AKCWxkdWIJWyRpbnArMTVdLCRubG8KCWxkdWIJWyRYaSsxNV0sJHhpMAoJbGR1YglbJFhpKzE0XSwkeGkxCglhZGQJJGxlbiwkaW5wLCRsZW4KCWFkZAkkSHRibCw4LCRIdGJsbwoKMToJY2FsbAkuKzgKCWFkZAklbzcscmVtXzRiaXQtMWIsJHJlbV80Yml0CgouTG91dGVyOgoJeG9yCSR4aTAsJG5sbywkbmxvCglhbmQJJG5sbywweGYwLCRuaGkKCWFuZAkkbmxvLDB4MGYsJG5sbwoJc2xsCSRubG8sNCwkbmxvCglsZHgJWyRIdGJsbyskbmxvXSwkWmxvCglsZHgJWyRIdGJsKyRubG9dLCRaaGkKCglsZHViCVskaW5wKzE0XSwkbmxvCgoJbGR4CVskSHRibG8rJG5oaV0sJFRsbwoJYW5kCSRabG8sMHhmLCRyZW1pCglsZHgJWyRIdGJsKyRuaGldLCRUaGkKCXNsbAkkcmVtaSwzLCRyZW1pCglsZHgJWyRyZW1fNGJpdCskcmVtaV0sJHJlbQoJc3JseAkkWmxvLDQsJFpsbwoJbW92CTEzLCRjbnQKCXNsbHgJJFpoaSw2MCwkdG1wCgl4b3IJJFRsbywkWmxvLCRabG8KCXNybHgJJFpoaSw0LCRaaGkKCXhvcgkkWmxvLCR0bXAsJFpsbwoKCXhvcgkkeGkxLCRubG8sJG5sbwoJYW5kCSRabG8sMHhmLCRyZW1pCglhbmQJJG5sbywweGYwLCRuaGkKCWFuZAkkbmxvLDB4MGYsJG5sbwoJYmEJLkxnaGFzaF9pbm5lcgoJc2xsCSRubG8sNCwkbmxvCi5hbGlnbgkzMgouTGdoYXNoX2lubmVyOgoJbGR4CVskSHRibG8rJG5sb10sJFRsbwoJc2xsCSRyZW1pLDMsJHJlbWkKCXhvcgkkVGhpLCRaaGksJFpoaQoJbGR4CVskSHRibCskbmxvXSwkVGhpCglzcmx4CSRabG8sNCwkWmxvCgl4b3IJJHJlbSwkWmhpLCRaaGkKCWxkeAlbJHJlbV80Yml0KyRyZW1pXSwkcmVtCglzbGx4CSRaaGksNjAsJHRtcAoJeG9yCSRUbG8sJFpsbywkWmxvCglsZHViCVskaW5wKyRjbnRdLCRubG8KCXNybHgJJFpoaSw0LCRaaGkKCXhvcgkkWmxvLCR0bXAsJFpsbwoJbGR1YglbJFhpKyRjbnRdLCR4aTEKCXhvcgkkVGhpLCRaaGksJFpoaQoJYW5kCSRabG8sMHhmLCRyZW1pCgoJbGR4CVskSHRibG8rJG5oaV0sJFRsbwoJc2xsCSRyZW1pLDMsJHJlbWkKCXhvcgkkcmVtLCRaaGksJFpoaQoJbGR4CVskSHRibCskbmhpXSwkVGhpCglzcmx4CSRabG8sNCwkWmxvCglsZHgJWyRyZW1fNGJpdCskcmVtaV0sJHJlbQoJc2xseAkkWmhpLDYwLCR0bXAKCXhvcgkkeGkxLCRubG8sJG5sbwoJc3JseAkkWmhpLDQsJFpoaQoJYW5kCSRubG8sMHhmMCwkbmhpCglhZGRjYwkkY250LC0xLCRjbnQKCXhvcgkkWmxvLCR0bXAsJFpsbwoJYW5kCSRubG8sMHgwZiwkbmxvCgl4b3IJJFRsbywkWmxvLCRabG8KCXNsbAkkbmxvLDQsJG5sbwoJYmx1CS5MZ2hhc2hfaW5uZXIKCWFuZAkkWmxvLDB4ZiwkcmVtaQoKCWxkeAlbJEh0YmxvKyRubG9dLCRUbG8KCXNsbAkkcmVtaSwzLCRyZW1pCgl4b3IJJFRoaSwkWmhpLCRaaGkKCWxkeAlbJEh0YmwrJG5sb10sJFRoaQoJc3JseAkkWmxvLDQsJFpsbwoJeG9yCSRyZW0sJFpoaSwkWmhpCglsZHgJWyRyZW1fNGJpdCskcmVtaV0sJHJlbQoJc2xseAkkWmhpLDYwLCR0bXAKCXhvcgkkVGxvLCRabG8sJFpsbwoJc3JseAkkWmhpLDQsJFpoaQoJeG9yCSRabG8sJHRtcCwkWmxvCgl4b3IJJFRoaSwkWmhpLCRaaGkKCglhZGQJJGlucCwxNiwkaW5wCgljbXAJJGlucCwkbGVuCgliZSxwbglgJGJpdHM9PTY0PyIleGNjIjoiJWljYyJgLC5MZG9uZQoJYW5kCSRabG8sMHhmLCRyZW1pCgoJbGR4CVskSHRibG8rJG5oaV0sJFRsbwoJc2xsCSRyZW1pLDMsJHJlbWkKCXhvcgkkcmVtLCRaaGksJFpoaQoJbGR4CVskSHRibCskbmhpXSwkVGhpCglzcmx4CSRabG8sNCwkWmxvCglsZHgJWyRyZW1fNGJpdCskcmVtaV0sJHJlbQoJc2xseAkkWmhpLDYwLCR0bXAKCXhvcgkkVGxvLCRabG8sJFpsbwoJbGR1YglbJGlucCsxNV0sJG5sbwoJc3JseAkkWmhpLDQsJFpoaQoJeG9yCSRabG8sJHRtcCwkWmxvCgl4b3IJJFRoaSwkWmhpLCRaaGkKCXN0eAkkWmxvLFskWGkrOF0KCXhvcgkkcmVtLCRaaGksJFpoaQoJc3R4CSRaaGksWyRYaV0KCXNybAkkWmxvLDgsJHhpMQoJYW5kCSRabG8sMHhmZiwkeGkwCgliYQkuTG91dGVyCglhbmQJJHhpMSwweGZmLCR4aTEKLmFsaWduCTMyCi5MZG9uZToKCWxkeAlbJEh0YmxvKyRuaGldLCRUbG8KCXNsbAkkcmVtaSwzLCRyZW1pCgl4b3IJJHJlbSwkWmhpLCRaaGkKCWxkeAlbJEh0YmwrJG5oaV0sJFRoaQoJc3JseAkkWmxvLDQsJFpsbwoJbGR4CVskcmVtXzRiaXQrJHJlbWldLCRyZW0KCXNsbHgJJFpoaSw2MCwkdG1wCgl4b3IJJFRsbywkWmxvLCRabG8KCXNybHgJJFpoaSw0LCRaaGkKCXhvcgkkWmxvLCR0bXAsJFpsbwoJeG9yCSRUaGksJFpoaSwkWmhpCglzdHgJJFpsbyxbJFhpKzhdCgl4b3IJJHJlbSwkWmhpLCRaaGkKCXN0eAkkWmhpLFskWGldCgoJcmV0CglyZXN0b3JlCi50eXBlCWdjbV9naGFzaF80Yml0LCNmdW5jdGlvbgouc2l6ZQlnY21fZ2hhc2hfNGJpdCwoLi1nY21fZ2hhc2hfNGJpdCkKX19fCgp1bmRlZiAkaW5wOwp1bmRlZiAkbGVuOwoKJGNvZGUuPTw8X19fOwouZ2xvYmwJZ2NtX2dtdWx0XzRiaXQKLmFsaWduCTMyCmdjbV9nbXVsdF80Yml0OgoJc2F2ZQklc3AsLSRmcmFtZSwlc3AKCWxkdWIJWyRYaSsxNV0sJG5sbwoJYWRkCSRIdGJsLDgsJEh0YmxvCgoxOgljYWxsCS4rOAoJYWRkCSVvNyxyZW1fNGJpdC0xYiwkcmVtXzRiaXQKCglhbmQJJG5sbywweGYwLCRuaGkKCWFuZAkkbmxvLDB4MGYsJG5sbwoJc2xsCSRubG8sNCwkbmxvCglsZHgJWyRIdGJsbyskbmxvXSwkWmxvCglsZHgJWyRIdGJsKyRubG9dLCRaaGkKCglsZHViCVskWGkrMTRdLCRubG8KCglsZHgJWyRIdGJsbyskbmhpXSwkVGxvCglhbmQJJFpsbywweGYsJHJlbWkKCWxkeAlbJEh0YmwrJG5oaV0sJFRoaQoJc2xsCSRyZW1pLDMsJHJlbWkKCWxkeAlbJHJlbV80Yml0KyRyZW1pXSwkcmVtCglzcmx4CSRabG8sNCwkWmxvCgltb3YJMTMsJGNudAoJc2xseAkkWmhpLDYwLCR0bXAKCXhvcgkkVGxvLCRabG8sJFpsbwoJc3JseAkkWmhpLDQsJFpoaQoJeG9yCSRabG8sJHRtcCwkWmxvCgoJYW5kCSRabG8sMHhmLCRyZW1pCglhbmQJJG5sbywweGYwLCRuaGkKCWFuZAkkbmxvLDB4MGYsJG5sbwoJYmEJLkxnbXVsdF9pbm5lcgoJc2xsCSRubG8sNCwkbmxvCi5hbGlnbgkzMgouTGdtdWx0X2lubmVyOgoJbGR4CVskSHRibG8rJG5sb10sJFRsbwoJc2xsCSRyZW1pLDMsJHJlbWkKCXhvcgkkVGhpLCRaaGksJFpoaQoJbGR4CVskSHRibCskbmxvXSwkVGhpCglzcmx4CSRabG8sNCwkWmxvCgl4b3IJJHJlbSwkWmhpLCRaaGkKCWxkeAlbJHJlbV80Yml0KyRyZW1pXSwkcmVtCglzbGx4CSRaaGksNjAsJHRtcAoJeG9yCSRUbG8sJFpsbywkWmxvCglsZHViCVskWGkrJGNudF0sJG5sbwoJc3JseAkkWmhpLDQsJFpoaQoJeG9yCSRabG8sJHRtcCwkWmxvCgl4b3IJJFRoaSwkWmhpLCRaaGkKCWFuZAkkWmxvLDB4ZiwkcmVtaQoKCWxkeAlbJEh0YmxvKyRuaGldLCRUbG8KCXNsbAkkcmVtaSwzLCRyZW1pCgl4b3IJJHJlbSwkWmhpLCRaaGkKCWxkeAlbJEh0YmwrJG5oaV0sJFRoaQoJc3JseAkkWmxvLDQsJFpsbwoJbGR4CVskcmVtXzRiaXQrJHJlbWldLCRyZW0KCXNsbHgJJFpoaSw2MCwkdG1wCglzcmx4CSRaaGksNCwkWmhpCglhbmQJJG5sbywweGYwLCRuaGkKCWFkZGNjCSRjbnQsLTEsJGNudAoJeG9yCSRabG8sJHRtcCwkWmxvCglhbmQJJG5sbywweDBmLCRubG8KCXhvcgkkVGxvLCRabG8sJFpsbwoJc2xsCSRubG8sNCwkbmxvCglibHUJLkxnbXVsdF9pbm5lcgoJYW5kCSRabG8sMHhmLCRyZW1pCgoJbGR4CVskSHRibG8rJG5sb10sJFRsbwoJc2xsCSRyZW1pLDMsJHJlbWkKCXhvcgkkVGhpLCRaaGksJFpoaQoJbGR4CVskSHRibCskbmxvXSwkVGhpCglzcmx4CSRabG8sNCwkWmxvCgl4b3IJJHJlbSwkWmhpLCRaaGkKCWxkeAlbJHJlbV80Yml0KyRyZW1pXSwkcmVtCglzbGx4CSRaaGksNjAsJHRtcAoJeG9yCSRUbG8sJFpsbywkWmxvCglzcmx4CSRaaGksNCwkWmhpCgl4b3IJJFpsbywkdG1wLCRabG8KCXhvcgkkVGhpLCRaaGksJFpoaQoJYW5kCSRabG8sMHhmLCRyZW1pCgoJbGR4CVskSHRibG8rJG5oaV0sJFRsbwoJc2xsCSRyZW1pLDMsJHJlbWkKCXhvcgkkcmVtLCRaaGksJFpoaQoJbGR4CVskSHRibCskbmhpXSwkVGhpCglzcmx4CSRabG8sNCwkWmxvCglsZHgJWyRyZW1fNGJpdCskcmVtaV0sJHJlbQoJc2xseAkkWmhpLDYwLCR0bXAKCXhvcgkkVGxvLCRabG8sJFpsbwoJc3JseAkkWmhpLDQsJFpoaQoJeG9yCSRabG8sJHRtcCwkWmxvCgl4b3IJJFRoaSwkWmhpLCRaaGkKCXN0eAkkWmxvLFskWGkrOF0KCXhvcgkkcmVtLCRaaGksJFpoaQoJc3R4CSRaaGksWyRYaV0KCglyZXQKCXJlc3RvcmUKLnR5cGUJZ2NtX2dtdWx0XzRiaXQsI2Z1bmN0aW9uCi5zaXplCWdjbV9nbXVsdF80Yml0LCguLWdjbV9nbXVsdF80Yml0KQpfX18KDAp7e3sKIyBTdHJhaWdodGZvcndhcmQgMTI4eDEyOC1iaXQgbXVsdGlwbGljYXRpb24gdXNpbmcgS2FyYXRzdWJhIGFsZ29yaXRobQojIGZvbGxvd2VkIGJ5IHBhaXIgb2YgNjQtYml0IHJlZHVjdGlvbnMgW3dpdGggYSBzaG9ydGN1dCBpbiBmaXJzdCBvbmUsCiMgd2hpY2ggYWxsb3dlZCB0byBicmVhayBkZXBlbmRlbmN5IGJldHdlZW4gcmVkdWN0aW9ucyBhbmQgcmVtb3ZlIG9uZQojIG11bHRpcGxpY2F0aW9uIGZyb20gY3JpdGljYWwgcGF0aF0uIFdoaWxlIGl0IG1pZ2h0IGJlIHN1Ym9wdGltYWwKIyB3aXRoIHJlZ2FyZCB0byBzaGVlciBudW1iZXIgb2YgbXVsdGlwbGljYXRpb25zLCBvdGhlciBtZXRob2RzIFtzdWNoCiMgYXMgYWdncmVnYXRlIHJlZHVjdGlvbl0gd291bGQgcmVxdWlyZSBtb3JlIDY0LWJpdCByZWdpc3RlcnMsIHdoaWNoCiMgd2UgZG9uJ3QgaGF2ZSBpbiAzMi1iaXQgYXBwbGljYXRpb24gY29udGV4dC4KCigkWGlwLCRIdGFibGUsJGlucCwkbGVuKT1tYXAoIiVpJF8iLCgwLi4zKSk7CgooJEhobCwkSGxvLCRIaGksJFhsbywkWGhpLCR4RTEsJHNxciwgJEMwLCRDMSwkQzIsJEMzLCRWKT0KCShtYXAoIiVvJF8iLCgwLi41LDcpKSxtYXAoIiVnJF8iLCgxLi41KSkpOwoKKCRzaGwsJHNocik9bWFwKCIlbCRfIiwoMC4uNykpOwoKIyBGb3IgZGV0YWlscyByZWdhcmRpbmcgInR3aXN0ZWQgSCIgc2VlIGdoYXNoLXg4Ni5wbC4KJGNvZGUuPTw8X19fOwouZ2xvYmwJZ2NtX2luaXRfdmlzMwouYWxpZ24JMzIKZ2NtX2luaXRfdmlzMzoKCXNhdmUJJXNwLC0kZnJhbWUsJXNwCgoJbGR4CVslaTErMF0sJEhoaQoJbGR4CVslaTErOF0sJEhsbwoJbW92CTB4RTEsJFhoaQoJbW92CTEsJFhsbwoJc2xseAkkWGhpLDU3LCRYaGkKCXNyYXgJJEhoaSw2MywkQzAJCSEgYnJvYWRjYXN0IGNhcnJ5CglhZGRjYwkkSGxvLCRIbG8sJEhsbwkJISBIPDw9MQoJYWRkeGMJJEhoaSwkSGhpLCRIaGkKCWFuZAkkQzAsJFhsbywkWGxvCglhbmQJJEMwLCRYaGksJFhoaQoJeG9yCSRYbG8sJEhsbywkSGxvCgl4b3IJJFhoaSwkSGhpLCRIaGkKCXN0eAkkSGxvLFslaTArOF0JCSEgc2F2ZSB0d2lzdGVkIEgKCXN0eAkkSGhpLFslaTArMF0KCglzZXRoaQklaGkoMHhBMDQwNjA4MCksJFYKCXNldGhpCSVoaSgweDIwQzBFMDAwKSwlbDAKCW9yCSRWLCVsbygweEEwNDA2MDgwKSwkVgoJb3IJJWwwLCVsbygweDIwQzBFMDAwKSwlbDAKCXNsbHgJJFYsMzIsJFYKCW9yCSVsMCwkViwkVgkJISAoMHhFMLdpKSYweGZmPTB4QTA0MDYwODAyMEMwRTAwMAoJc3R4CSRWLFslaTArMTZdCgoJcmV0CglyZXN0b3JlCi50eXBlCWdjbV9pbml0X3ZpczMsI2Z1bmN0aW9uCi5zaXplCWdjbV9pbml0X3ZpczMsLi1nY21faW5pdF92aXMzCgouZ2xvYmwJZ2NtX2dtdWx0X3ZpczMKLmFsaWduCTMyCmdjbV9nbXVsdF92aXMzOgoJc2F2ZQklc3AsLSRmcmFtZSwlc3AKCglsZHgJWyRYaXArOF0sJFhsbwkJISBsb2FkIFhpCglsZHgJWyRYaXArMF0sJFhoaQoJbGR4CVskSHRhYmxlKzhdLCRIbG8JISBsb2FkIHR3aXN0ZWQgSAoJbGR4CVskSHRhYmxlKzBdLCRIaGkKCgltb3YJMHhFMSwlbDcKCXNsbHgJJWw3LDU3LCR4RTEJCSEgNTcgaXMgbm90IGEgdHlwbwoJbGR4CVskSHRhYmxlKzE2XSwkVgkJISAoMHhFMLdpKSYweGZmPTB4QTA0MDYwODAyMEMwRTAwMAoKCXhvcgkkSGhpLCRIbG8sJEhobAkJISBLYXJhdHN1YmEgcHJlLXByb2Nlc3NpbmcKCXhtdWx4CSRYbG8sJEhsbywkQzAKCXhvcgkkWGxvLCRYaGksJEMyCQkhIEthcmF0c3ViYSBwcmUtcHJvY2Vzc2luZwoJeG11bHgJJEMyLCRIaGwsJEMxCgl4bXVseGhpCSRYbG8sJEhsbywkWGxvCgl4bXVseGhpCSRDMiwkSGhsLCRDMgoJeG11bHhoaQkkWGhpLCRIaGksJEMzCgl4bXVseAkkWGhpLCRIaGksJFhoaQoKCXNsbAkkQzAsMywkc3FyCglzcmx4CSRWLCRzcXIsJHNxcgkJISC3MHhFMCBbaW1wbGljaXQgJig3PDwzKV0KCXhvcgkkQzAsJHNxciwkc3FyCglzbGx4CSRzcXIsNTcsJHNxcgkJISAoJEMwtzB4RTEpPDwxPDw1NiBbaW1wbGljaXQgJjB4N2ZdCgoJeG9yCSRDMCwkQzEsJEMxCQkhIEthcmF0c3ViYSBwb3N0LXByb2Nlc3NpbmcKCXhvcgkkWGxvLCRDMiwkQzIKCSB4b3IJJHNxciwkWGxvLCRYbG8JCSEgcmVhbCBkZXN0aW5hdGlvbiBpcyAkQzEKCXhvcgkkQzMsJEMyLCRDMgoJeG9yCSRYbG8sJEMxLCRDMQoJeG9yCSRYaGksJEMyLCRDMgoJeG9yCSRYaGksJEMxLCRDMQoKCXhtdWx4aGkJJEMwLCR4RTEsJFhsbwkJISC3MHhFMTw8MTw8NTYKCSB4b3IJJEMwLCRDMiwkQzIKCXhtdWx4CSRDMSwkeEUxLCRDMAoJIHhvcgkkQzEsJEMzLCRDMwoJeG11bHhoaQkkQzEsJHhFMSwkQzEKCgl4b3IJJFhsbywkQzIsJEMyCgl4b3IJJEMwLCRDMiwkQzIKCXhvcgkkQzEsJEMzLCRDMwoKCXN0eAkkQzIsWyRYaXArOF0JCSEgc2F2ZSBYaQoJc3R4CSRDMyxbJFhpcCswXQoKCXJldAoJcmVzdG9yZQoudHlwZQlnY21fZ211bHRfdmlzMywjZnVuY3Rpb24KLnNpemUJZ2NtX2dtdWx0X3ZpczMsLi1nY21fZ211bHRfdmlzMwoKLmdsb2JsCWdjbV9naGFzaF92aXMzCi5hbGlnbgkzMgpnY21fZ2hhc2hfdmlzMzoKCXNhdmUJJXNwLC0kZnJhbWUsJXNwCgoJbGR4CVskWGlwKzhdLCRDMgkJISBsb2FkIFhpCglsZHgJWyRYaXArMF0sJEMzCglsZHgJWyRIdGFibGUrOF0sJEhsbwkhIGxvYWQgdHdpc3RlZCBICglsZHgJWyRIdGFibGUrMF0sJEhoaQoKCW1vdgkweEUxLCVsNwoJc2xseAklbDcsNTcsJHhFMQkJISA1NyBpcyBub3QgYSB0eXBvCglsZHgJWyRIdGFibGUrMTZdLCRWCQkhICgweEUwt2kpJjB4ZmY9MHhBMDQwNjA4MDIwQzBFMDAwCgoJYW5kCSRpbnAsNywkc2hsCglhbmRuCSRpbnAsNywkaW5wCglzbGwJJHNobCwzLCRzaGwKCXByZWZldGNoIFskaW5wKzYzXSwgMjAKCXN1YgklZzAsJHNobCwkc2hyCgoJeG9yCSRIaGksJEhsbywkSGhsCQkhIEthcmF0c3ViYSBwcmUtcHJvY2Vzc2luZwouTG9vcDoKCWxkeAlbJGlucCs4XSwkWGxvCglicnoscHQJJHNobCwxZgoJbGR4CVskaW5wKzBdLCRYaGkKCglsZHgJWyRpbnArMTZdLCRDMQkJISBhbGlnbiBkYXRhCglzcmx4CSRYbG8sJHNociwkQzAKCXNsbHgJJFhsbywkc2hsLCRYbG8KCXNsbHgJJFhoaSwkc2hsLCRYaGkKCXNybHgJJEMxLCRzaHIsJEMxCglvcgkkQzAsJFhoaSwkWGhpCglvcgkkQzEsJFhsbywkWGxvCjE6CglhZGQJJGlucCwxNiwkaW5wCglzdWIJJGxlbiwxNiwkbGVuCgl4b3IJJEMyLCRYbG8sJFhsbwoJeG9yCSRDMywkWGhpLCRYaGkKCXByZWZldGNoIFskaW5wKzYzXSwgMjAKCgl4bXVseAkkWGxvLCRIbG8sJEMwCgl4b3IJJFhsbywkWGhpLCRDMgkJISBLYXJhdHN1YmEgcHJlLXByb2Nlc3NpbmcKCXhtdWx4CSRDMiwkSGhsLCRDMQoJeG11bHhoaQkkWGxvLCRIbG8sJFhsbwoJeG11bHhoaQkkQzIsJEhobCwkQzIKCXhtdWx4aGkJJFhoaSwkSGhpLCRDMwoJeG11bHgJJFhoaSwkSGhpLCRYaGkKCglzbGwJJEMwLDMsJHNxcgoJc3JseAkkViwkc3FyLCRzcXIJCSEgtzB4RTAgW2ltcGxpY2l0ICYoNzw8MyldCgl4b3IJJEMwLCRzcXIsJHNxcgoJc2xseAkkc3FyLDU3LCRzcXIJCSEgKCRDMLcweEUxKTw8MTw8NTYgW2ltcGxpY2l0ICYweDdmXQoKCXhvcgkkQzAsJEMxLCRDMQkJISBLYXJhdHN1YmEgcG9zdC1wcm9jZXNzaW5nCgl4b3IJJFhsbywkQzIsJEMyCgkgeG9yCSRzcXIsJFhsbywkWGxvCQkhIHJlYWwgZGVzdGluYXRpb24gaXMgJEMxCgl4b3IJJEMzLCRDMiwkQzIKCXhvcgkkWGxvLCRDMSwkQzEKCXhvcgkkWGhpLCRDMiwkQzIKCXhvcgkkWGhpLCRDMSwkQzEKCgl4bXVseGhpCSRDMCwkeEUxLCRYbG8JCSEgtzB4RTE8PDE8PDU2CgkgeG9yCSRDMCwkQzIsJEMyCgl4bXVseAkkQzEsJHhFMSwkQzAKCSB4b3IJJEMxLCRDMywkQzMKCXhtdWx4aGkJJEMxLCR4RTEsJEMxCgoJeG9yCSRYbG8sJEMyLCRDMgoJeG9yCSRDMCwkQzIsJEMyCglicm56LHB0CSRsZW4sLkxvb3AKCXhvcgkkQzEsJEMzLCRDMwoKCXN0eAkkQzIsWyRYaXArOF0JCSEgc2F2ZSBYaQoJc3R4CSRDMyxbJFhpcCswXQoKCXJldAoJcmVzdG9yZQoudHlwZQlnY21fZ2hhc2hfdmlzMywjZnVuY3Rpb24KLnNpemUJZ2NtX2doYXNoX3ZpczMsLi1nY21fZ2hhc2hfdmlzMwpfX18KfX19CiRjb2RlLj08PF9fXzsKLmFzY2l6CSJHSEFTSCBmb3IgU1BBUkN2OS9WSVMzLCBDUllQVE9HQU1TIGJ5IDxhcHByb1xAb3BlbnNzbC5vcmc+IgouYWxpZ24JNApfX18KCgwKIyBQdXJwb3NlIG9mIHRoZXNlIHN1YnJvdXRpbmVzIGlzIHRvIGV4cGxpY2l0bHkgZW5jb2RlIFZJUyBpbnN0cnVjdGlvbnMsCiMgc28gdGhhdCBvbmUgY2FuIGNvbXBpbGUgdGhlIG1vZHVsZSB3aXRob3V0IGhhdmluZyB0byBzcGVjaWZ5IFZJUwojIGV4dGVuc2lvbnMgb24gY29tcGlsZXIgY29tbWFuZCBsaW5lLCBlLmcuIC14YXJjaD12OSB2cy4gLXhhcmNoPXY5YS4KIyBJZGVhIGlzIHRvIHJlc2VydmUgZm9yIG9wdGlvbiB0byBwcm9kdWNlICJ1bml2ZXJzYWwiIGJpbmFyeSBhbmQgbGV0CiMgcHJvZ3JhbW1lciBkZXRlY3QgaWYgY3VycmVudCBDUFUgaXMgVklTIGNhcGFibGUgYXQgcnVuLXRpbWUuCnN1YiB1bnZpczMgewpteSAoJG1uZW1vbmljLCRyczEsJHJzMiwkcmQpPUBfOwpteSAlYmlhcyA9ICggImciID0+IDAsICJvIiA9PiA4LCAibCIgPT4gMTYsICJpIiA9PiAyNCApOwpteSAoJHJlZiwkb3BmKTsKbXkgJXZpc29wZiA9ICgJImFkZHhjIgkJPT4gMHgwMTEsCgkJImFkZHhjY2MiCT0+IDB4MDEzLAoJCSJ4bXVseCIJCT0+IDB4MTE1LAoJCSJ4bXVseGhpIgk9PiAweDExNgkpOwoKICAgICRyZWYgPSAiJG1uZW1vbmljXHQkcnMxLCRyczIsJHJkIjsKCiAgICBpZiAoJG9wZj0kdmlzb3BmeyRtbmVtb25pY30pIHsKCWZvcmVhY2ggKCRyczEsJHJzMiwkcmQpIHsKCSAgICByZXR1cm4gJHJlZiBpZiAoIS8lKFtnb2xpXSkoWzAtOV0pLyk7CgkgICAgJF89JGJpYXN7JDF9KyQyOwoJfQoKCXJldHVybglzcHJpbnRmICIud29yZFx0MHglMDh4ICElcyIsCgkJCTB4ODFiMDAwMDB8JHJkPDwyNXwkcnMxPDwxNHwkb3BmPDw1fCRyczIsCgkJCSRyZWY7CiAgICB9IGVsc2UgewoJcmV0dXJuICRyZWY7CiAgICB9Cn0KCmZvcmVhY2ggKHNwbGl0KCJcbiIsJGNvZGUpKSB7CglzL1xgKFteXGBdKilcYC9ldmFsICQxL2dlOwoKCXMvXGIoeG11bHhbaGldKnxhZGR4Y1tjXXswLDJ9KVxzKyglW2dvbGldWzAtN10pLFxzKiglW2dvbGldWzAtN10pLFxzKiglW2dvbGldWzAtN10pLwoJCSZ1bnZpczMoJDEsJDIsJDMsJDQpCgkgL2dlOwoKCXByaW50ICRfLCJcbiI7Cn0KCmNsb3NlIFNURE9VVDsK