IyEvdXNyL2Jpbi9lbnYgcGVybAojCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBXcml0dGVuIGJ5IEFuZHkgUG9seWFrb3YgPGFwcHJvQG9wZW5zc2wub3JnPiBmb3IgdGhlIE9wZW5TU0wKIyBwcm9qZWN0LiBUaGUgbW9kdWxlIGlzLCBob3dldmVyLCBkdWFsIGxpY2Vuc2VkIHVuZGVyIE9wZW5TU0wgYW5kCiMgQ1JZUFRPR0FNUyBsaWNlbnNlcyBkZXBlbmRpbmcgb24gd2hlcmUgeW91IG9idGFpbiBpdC4gRm9yIGZ1cnRoZXIKIyBkZXRhaWxzIHNlZSBodHRwOi8vd3d3Lm9wZW5zc2wub3JnL35hcHByby9jcnlwdG9nYW1zLy4KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojCiMgTWF5IDIwMTEKIwojIFRoZSBtb2R1bGUgaW1wbGVtZW50cyBibl9HRjJtX211bF8yeDIgcG9seW5vbWlhbCBtdWx0aXBsaWNhdGlvbiB1c2VkCiMgaW4gYm5fZ2YybS5jLiBJdCdzIGtpbmQgb2YgbG93LWhhbmdpbmcgbWVjaGFuaWNhbCBwb3J0IGZyb20gQyBmb3IKIyB0aGUgdGltZSBiZWluZy4uLiBFeGNlcHQgdGhhdCBpdCBoYXMgdGhyZWUgY29kZSBwYXRoczogcHVyZSBpbnRlZ2VyCiMgY29kZSBzdWl0YWJsZSBmb3IgYW55IHg4NiBDUFUsIE1NWCBjb2RlIHN1aXRhYmxlIGZvciBQSUlJIGFuZCBsYXRlcgojIGFuZCBQQ0xNVUxRRFEgc3VpdGFibGUgZm9yIFdlc3RtZXJlIGFuZCBsYXRlci4gSW1wcm92ZW1lbnQgdmFyaWVzCiMgZnJvbSBvbmUgYmVuY2htYXJrIGFuZCC1LWFyY2ggdG8gYW5vdGhlci4gQmVsb3cgYXJlIGludGVydmFsIHZhbHVlcwojIGZvciAxNjMtIGFuZCA1NzEtYml0IEVDREggYmVuY2htYXJrcyByZWxhdGl2ZSB0byBjb21waWxlci1nZW5lcmF0ZWQKIyBjb2RlOgojCiMgUElJSQkJMTYlLTMwJQojIFA0CQkxMiUtMTIlCiMgT3B0ZXJvbgkxOCUtNDAlCiMgQ29yZTIJCTE5JS00NCUKIyBBdG9tCQkzOCUtNjQlCiMgV2VzdG1lcmUJNTMlLTEyMSUoUENMTVVMUURRKS8yMCUtMzIlKE1NWCkKIyBTYW5keSBCcmlkZ2UJNzIlLTEyNyUoUENMTVVMUURRKS8yNyUtMjMlKE1NWCkKIwojIE5vdGUgdGhhdCBhYm92ZSBpbXByb3ZlbWVudCBjb2VmZmljaWVudHMgYXJlIG5vdCBjb2VmZmljaWVudHMgZm9yCiMgYm5fR0YybV9tdWxfMngyIGl0c2VsZi4gRm9yIGV4YW1wbGUgMTIwJSBFQ0RIIGltcHJvdmVtZW50IGlzIHJlc3VsdAojIG9mIGJuX0dGMm1fbXVsXzJ4MiBiZWluZyA+NHggZmFzdGVyLiBBcyBpdCBnZXRzIGZhc3RlciwgYmVuY2htYXJrCiMgaXMgbW9yZSBhbmQgbW9yZSBkb21pbmF0ZWQgYnkgb3RoZXIgc3Vicm91dGluZXMsIG1vc3Qgbm90YWJseSBieQojIEJOX0dGMm1fbW9kW19tdWxdX2Fyci4uLgoKJDAgPX4gbS8oLipbXC9cXF0pW15cL1xcXSskLzsgJGRpcj0kMTsKcHVzaChASU5DLCIke2Rpcn0iLCIke2Rpcn0uLi8uLi9wZXJsYXNtIik7CnJlcXVpcmUgIng4NmFzbS5wbCI7CgomYXNtX2luaXQoJEFSR1ZbMF0sJDAsJHg4Nm9ubHkgPSAkQVJHVlskI0FSR1ZdIGVxICIzODYiKTsKCiRzc2UyPTA7CmZvciAoQEFSR1YpIHsgJHNzZTI9MSBpZiAoLy1ET1BFTlNTTF9JQTMyX1NTRTIvKTsgfQoKJmV4dGVybmFsX2xhYmVsKCJPUEVOU1NMX2lhMzJjYXBfUCIpIGlmICgkc3NlMik7CgokYT0iZWF4IjsKJGI9ImVieCI7CigkYTEsJGEyLCRhNCk9KCJlY3giLCJlZHgiLCJlYnAiKTsKCiRSPSJtbTAiOwpAVD0oIm1tMSIsIm1tMiIpOwooJEEsJEIsJEIzMCwkQjMxKT0oIm1tMiIsIm1tMyIsIm1tNCIsIm1tNSIpOwpAaT0oImVzaSIsImVkaSIpOwoKCQkJCQlpZiAoISR4ODZvbmx5KSB7CiZmdW5jdGlvbl9iZWdpbl9CKCJfbXVsXzF4MV9tbXgiKTsKCSZzdWIJKCJlc3AiLDMyKzQpOwoJICZtb3YJKCRhMSwkYSk7CgkgJmxlYQkoJGEyLCZEV1AoMCwkYSwkYSkpOwoJICZhbmQJKCRhMSwweDNmZmZmZmZmKTsKCSAmbGVhCSgkYTQsJkRXUCgwLCRhMiwkYTIpKTsKCSAmbW92CSgmRFdQKDAqNCwiZXNwIiksMCk7CgkgJmFuZAkoJGEyLDB4N2ZmZmZmZmYpOwoJJm1vdmQJKCRBLCRhKTsKCSZtb3ZkCSgkQiwkYik7CgkgJm1vdgkoJkRXUCgxKjQsImVzcCIpLCRhMSk7CSMgYTEKCSAmeG9yCSgkYTEsJGEyKTsJCSMgYTFeYTIKCSZweG9yCSgkQjMxLCRCMzEpOwoJJnB4b3IJKCRCMzAsJEIzMCk7CgkgJm1vdgkoJkRXUCgyKjQsImVzcCIpLCRhMik7CSMgYTIKCSAmeG9yCSgkYTIsJGE0KTsJCSMgYTJeYTQKCSAmbW92CSgmRFdQKDMqNCwiZXNwIiksJGExKTsJIyBhMV5hMgoJJnBjbXBndGQoJEIzMSwkQSk7CQkjIGJyb2FkY2FzdCAzMXN0IGJpdAoJJnBhZGRkCSgkQSwkQSk7CQkjICRBPDw9MQoJICZ4b3IJKCRhMSwkYTIpOwkJIyBhMV5hND1hMV5hMl5hMl5hNAoJICZtb3YJKCZEV1AoNCo0LCJlc3AiKSwkYTQpOwkjIGE0CgkgJnhvcgkoJGE0LCRhMik7CQkjIGEyPWE0XmEyXmE0CgkmcGFuZAkoJEIzMSwkQik7CgkmcGNtcGd0ZCgkQjMwLCRBKTsJCSMgYnJvYWRjYXN0IDMwdGggYml0CgkgJm1vdgkoJkRXUCg1KjQsImVzcCIpLCRhMSk7CSMgYTFeYTQKCSAmeG9yCSgkYTQsJGExKTsJCSMgYTFeYTJeYTQKCSZwc2xscQkoJEIzMSwzMSk7CgkmcGFuZAkoJEIzMCwkQik7CgkgJm1vdgkoJkRXUCg2KjQsImVzcCIpLCRhMik7CSMgYTJeYTQKCSZtb3YJKEBpWzBdLDB4Nyk7CgkgJm1vdgkoJkRXUCg3KjQsImVzcCIpLCRhNCk7CSMgYTFeYTJeYTQKCSAmbW92CSgkYTQsQGlbMF0pOwoJJmFuZAkoQGlbMF0sJGIpOwoJJnNocgkoJGIsMyk7CgkmbW92CShAaVsxXSwkYTQpOwoJJnBzbGxxCSgkQjMwLDMwKTsKCSZhbmQJKEBpWzFdLCRiKTsKCSZzaHIJKCRiLDMpOwoJJm1vdmQJKCRSLCZEV1AoMCwiZXNwIixAaVswXSw0KSk7CgkmbW92CShAaVswXSwkYTQpOwoJJmFuZAkoQGlbMF0sJGIpOwoJJnNocgkoJGIsMyk7Cglmb3IoJG49MTskbjw5OyRuKyspIHsKCQkmbW92ZAkoQFRbMV0sJkRXUCgwLCJlc3AiLEBpWzFdLDQpKTsKCQkmbW92CShAaVsxXSwkYTQpOwoJCSZwc2xscQkoQFRbMV0sMyokbik7CgkJJmFuZAkoQGlbMV0sJGIpOwoJCSZzaHIJKCRiLDMpOwoJCSZweG9yCSgkUixAVFsxXSk7CgoJCXB1c2goQGksc2hpZnQoQGkpKTsgcHVzaChAVCxzaGlmdChAVCkpOwoJfQoJJm1vdmQJKEBUWzFdLCZEV1AoMCwiZXNwIixAaVsxXSw0KSk7CgkmcHhvcgkoJFIsJEIzMCk7CgkmcHNsbHEJKEBUWzFdLDMqJG4rKyk7CgkmcHhvcgkoJFIsQFRbMV0pOwoKCSZtb3ZkCShAVFswXSwmRFdQKDAsImVzcCIsQGlbMF0sNCkpOwoJJnB4b3IJKCRSLCRCMzEpOwoJJnBzbGxxCShAVFswXSwzKiRuKTsKCSZhZGQJKCJlc3AiLDMyKzQpOwoJJnB4b3IJKCRSLEBUWzBdKTsKCSZyZXQJKCk7CiZmdW5jdGlvbl9lbmRfQigiX211bF8xeDFfbW14Iik7CgkJCQkJfQoKKCRsbywkaGkpPSgiZWF4IiwiZWR4Iik7CkBUPSgiZWN4IiwiZWJwIik7CgomZnVuY3Rpb25fYmVnaW5fQigiX211bF8xeDFfaWFsdSIpOwoJJnN1YgkoImVzcCIsMzIrNCk7CgkgJm1vdgkoJGExLCRhKTsKCSAmbGVhCSgkYTIsJkRXUCgwLCRhLCRhKSk7CgkgJmxlYQkoJGE0LCZEV1AoMCwiIiwkYSw0KSk7CgkgJmFuZAkoJGExLDB4M2ZmZmZmZmYpOwoJJmxlYQkoQGlbMV0sJkRXUCgwLCRsbywkbG8pKTsKCSZzYXIJKCRsbywzMSk7CQkjIGJyb2FkY2FzdCAzMXN0IGJpdAoJICZtb3YJKCZEV1AoMCo0LCJlc3AiKSwwKTsKCSAmYW5kCSgkYTIsMHg3ZmZmZmZmZik7CgkgJm1vdgkoJkRXUCgxKjQsImVzcCIpLCRhMSk7CSMgYTEKCSAmeG9yCSgkYTEsJGEyKTsJCSMgYTFeYTIKCSAmbW92CSgmRFdQKDIqNCwiZXNwIiksJGEyKTsJIyBhMgoJICZ4b3IJKCRhMiwkYTQpOwkJIyBhMl5hNAoJICZtb3YJKCZEV1AoMyo0LCJlc3AiKSwkYTEpOwkjIGExXmEyCgkgJnhvcgkoJGExLCRhMik7CQkjIGExXmE0PWExXmEyXmEyXmE0CgkgJm1vdgkoJkRXUCg0KjQsImVzcCIpLCRhNCk7CSMgYTQKCSAmeG9yCSgkYTQsJGEyKTsJCSMgYTI9YTReYTJeYTQKCSAmbW92CSgmRFdQKDUqNCwiZXNwIiksJGExKTsJIyBhMV5hNAoJICZ4b3IJKCRhNCwkYTEpOwkJIyBhMV5hMl5hNAoJJnNhcgkoQGlbMV0sMzEpOwkJIyBicm9hcmRjYXN0IDMwdGggYml0CgkmYW5kCSgkbG8sJGIpOwoJICZtb3YJKCZEV1AoNio0LCJlc3AiKSwkYTIpOwkjIGEyXmE0CgkmYW5kCShAaVsxXSwkYik7CgkgJm1vdgkoJkRXUCg3KjQsImVzcCIpLCRhNCk7CSMgYTFeYTJeYTQKCSZtb3YJKCRoaSwkbG8pOwoJJnNobAkoJGxvLDMxKTsKCSZtb3YJKEBUWzBdLEBpWzFdKTsKCSZzaHIJKCRoaSwxKTsKCgkgJm1vdgkoQGlbMF0sMHg3KTsKCSZzaGwJKEBpWzFdLDMwKTsKCSAmYW5kCShAaVswXSwkYik7Cgkmc2hyCShAVFswXSwyKTsKCSZ4b3IJKCRsbyxAaVsxXSk7CgoJJnNocgkoJGIsMyk7CgkmbW92CShAaVsxXSwweDcpOwkJIyA1LWJ5dGUgaW5zdHJ1Y3Rpb24hPwoJJmFuZAkoQGlbMV0sJGIpOwoJJnNocgkoJGIsMyk7CgkgJnhvcgkoJGhpLEBUWzBdKTsKCSZ4b3IJKCRsbywmRFdQKDAsImVzcCIsQGlbMF0sNCkpOwoJJm1vdgkoQGlbMF0sMHg3KTsKCSZhbmQJKEBpWzBdLCRiKTsKCSZzaHIJKCRiLDMpOwoJZm9yKCRuPTE7JG48OTskbisrKSB7CgkJJm1vdgkoQFRbMV0sJkRXUCgwLCJlc3AiLEBpWzFdLDQpKTsKCQkmbW92CShAaVsxXSwweDcpOwoJCSZtb3YJKEBUWzBdLEBUWzFdKTsKCQkmc2hsCShAVFsxXSwzKiRuKTsKCQkmYW5kCShAaVsxXSwkYik7CgkJJnNocgkoQFRbMF0sMzItMyokbik7CgkJJnhvcgkoJGxvLEBUWzFdKTsKCQkmc2hyCSgkYiwzKTsKCQkmeG9yCSgkaGksQFRbMF0pOwoKCQlwdXNoKEBpLHNoaWZ0KEBpKSk7IHB1c2goQFQsc2hpZnQoQFQpKTsKCX0KCSZtb3YJKEBUWzFdLCZEV1AoMCwiZXNwIixAaVsxXSw0KSk7CgkmbW92CShAVFswXSxAVFsxXSk7Cgkmc2hsCShAVFsxXSwzKiRuKTsKCSZtb3YJKEBpWzFdLCZEV1AoMCwiZXNwIixAaVswXSw0KSk7Cgkmc2hyCShAVFswXSwzMi0zKiRuKTsJJG4rKzsKCSZtb3YJKEBpWzBdLEBpWzFdKTsKCSZ4b3IJKCRsbyxAVFsxXSk7Cgkmc2hsCShAaVsxXSwzKiRuKTsKCSZ4b3IJKCRoaSxAVFswXSk7Cgkmc2hyCShAaVswXSwzMi0zKiRuKTsKCSZ4b3IJKCRsbyxAaVsxXSk7CgkmeG9yCSgkaGksQGlbMF0pOwoKCSZhZGQJKCJlc3AiLDMyKzQpOwoJJnJldAkoKTsKJmZ1bmN0aW9uX2VuZF9CKCJfbXVsXzF4MV9pYWx1Iik7CgojIHZvaWQgYm5fR0YybV9tdWxfMngyKEJOX1VMT05HICpyLCBCTl9VTE9ORyBhMSwgQk5fVUxPTkcgYTAsIEJOX1VMT05HIGIxLCBCTl9VTE9ORyBiMCk7CiZmdW5jdGlvbl9iZWdpbl9CKCJibl9HRjJtX211bF8yeDIiKTsKaWYgKCEkeDg2b25seSkgewoJJnBpY21ldXAoImVkeCIsIk9QRU5TU0xfaWEzMmNhcF9QIik7CgkmbW92CSgiZWF4IiwmRFdQKDAsImVkeCIpKTsKCSZtb3YJKCJlZHgiLCZEV1AoNCwiZWR4IikpOwoJJnRlc3QJKCJlYXgiLDE8PDIzKTsJCSMgY2hlY2sgTU1YIGJpdAoJJmp6CSgmbGFiZWwoImlhbHUiKSk7CmlmICgkc3NlMikgewoJJnRlc3QJKCJlYXgiLDE8PDI0KTsJCSMgY2hlY2sgRlhTUiBiaXQKCSZqegkoJmxhYmVsKCJtbXgiKSk7CgkmdGVzdAkoImVkeCIsMTw8MSk7CQkjIGNoZWNrIFBDTE1VTFFEUSBiaXQKCSZqegkoJmxhYmVsKCJtbXgiKSk7CgoJJm1vdnVwcwkJKCJ4bW0wIiwmUVdQKDgsImVzcCIpKTsKCSZzaHVmcHMJCSgieG1tMCIsInhtbTAiLDBiMTAxMTAwMDEpOwoJJnBjbG11bHFkcQkoInhtbTAiLCJ4bW0wIiwxKTsKCSZtb3YJCSgiZWF4IiwmRFdQKDQsImVzcCIpKTsKCSZtb3Z1cHMJCSgmUVdQKDAsImVheCIpLCJ4bW0wIik7CgkmcmV0CSgpOwoKJnNldF9sYWJlbCgibW14IiwxNik7Cn0KCSZwdXNoCSgiZWJwIik7CgkmcHVzaAkoImVieCIpOwoJJnB1c2gJKCJlc2kiKTsKCSZwdXNoCSgiZWRpIik7CgkmbW92CSgkYSwmd3BhcmFtKDEpKTsKCSZtb3YJKCRiLCZ3cGFyYW0oMykpOwoJJmNhbGwJKCJfbXVsXzF4MV9tbXgiKTsJIyBhMbdiMQoJJm1vdnEJKCJtbTciLCRSKTsKCgkmbW92CSgkYSwmd3BhcmFtKDIpKTsKCSZtb3YJKCRiLCZ3cGFyYW0oNCkpOwoJJmNhbGwJKCJfbXVsXzF4MV9tbXgiKTsJIyBhMLdiMAoJJm1vdnEJKCJtbTYiLCRSKTsKCgkmbW92CSgkYSwmd3BhcmFtKDEpKTsKCSZtb3YJKCRiLCZ3cGFyYW0oMykpOwoJJnhvcgkoJGEsJndwYXJhbSgyKSk7CgkmeG9yCSgkYiwmd3BhcmFtKDQpKTsKCSZjYWxsCSgiX211bF8xeDFfbW14Iik7CSMgKGEwK2ExKbcoYjArYjEpCgkmcHhvcgkoJFIsIm1tNyIpOwoJJm1vdgkoJGEsJndwYXJhbSgwKSk7CgkmcHhvcgkoJFIsIm1tNiIpOwkJIyAoYTArYTEptyhiMCtiMSktYTG3YjEtYTC3YjAKCgkmbW92cQkoJEEsJFIpOwoJJnBzbGxxCSgkUiwzMik7CgkmcG9wCSgiZWRpIik7CgkmcHNybHEJKCRBLDMyKTsKCSZwb3AJKCJlc2kiKTsKCSZweG9yCSgkUiwibW02Iik7CgkmcG9wCSgiZWJ4Iik7CgkmcHhvcgkoJEEsIm1tNyIpOwoJJm1vdnEJKCZRV1AoMCwkYSksJFIpOwoJJnBvcAkoImVicCIpOwoJJm1vdnEJKCZRV1AoOCwkYSksJEEpOwoJJmVtbXMJKCk7CgkmcmV0CSgpOwomc2V0X2xhYmVsKCJpYWx1IiwxNik7Cn0KCSZwdXNoCSgiZWJwIik7CgkmcHVzaAkoImVieCIpOwoJJnB1c2gJKCJlc2kiKTsKCSZwdXNoCSgiZWRpIik7Cgkmc3RhY2tfcHVzaCg0KzEpOwoKCSZtb3YJKCRhLCZ3cGFyYW0oMSkpOwoJJm1vdgkoJGIsJndwYXJhbSgzKSk7CgkmY2FsbAkoIl9tdWxfMXgxX2lhbHUiKTsJIyBhMbdiMQoJJm1vdgkoJkRXUCg4LCJlc3AiKSwkbG8pOwoJJm1vdgkoJkRXUCgxMiwiZXNwIiksJGhpKTsKCgkmbW92CSgkYSwmd3BhcmFtKDIpKTsKCSZtb3YJKCRiLCZ3cGFyYW0oNCkpOwoJJmNhbGwJKCJfbXVsXzF4MV9pYWx1Iik7CSMgYTC3YjAKCSZtb3YJKCZEV1AoMCwiZXNwIiksJGxvKTsKCSZtb3YJKCZEV1AoNCwiZXNwIiksJGhpKTsKCgkmbW92CSgkYSwmd3BhcmFtKDEpKTsKCSZtb3YJKCRiLCZ3cGFyYW0oMykpOwoJJnhvcgkoJGEsJndwYXJhbSgyKSk7CgkmeG9yCSgkYiwmd3BhcmFtKDQpKTsKCSZjYWxsCSgiX211bF8xeDFfaWFsdSIpOwkjIChhMCthMSm3KGIwK2IxKQoKCSZtb3YJKCJlYnAiLCZ3cGFyYW0oMCkpOwoJCSBAcj0oImVieCIsImVjeCIsImVkaSIsImVzaSIpOwoJJm1vdgkoQHJbMF0sJkRXUCgwLCJlc3AiKSk7CgkmbW92CShAclsxXSwmRFdQKDQsImVzcCIpKTsKCSZtb3YJKEByWzJdLCZEV1AoOCwiZXNwIikpOwoJJm1vdgkoQHJbM10sJkRXUCgxMiwiZXNwIikpOwoKCSZ4b3IJKCRsbywkaGkpOwoJJnhvcgkoJGhpLEByWzFdKTsKCSZ4b3IJKCRsbyxAclswXSk7CgkmbW92CSgmRFdQKDAsImVicCIpLEByWzBdKTsKCSZ4b3IJKCRoaSxAclsyXSk7CgkmbW92CSgmRFdQKDEyLCJlYnAiKSxAclszXSk7CgkmeG9yCSgkbG8sQHJbM10pOwoJJnN0YWNrX3BvcCg0KzEpOwoJJnhvcgkoJGhpLEByWzNdKTsKCSZwb3AJKCJlZGkiKTsKCSZ4b3IJKCRsbywkaGkpOwoJJnBvcAkoImVzaSIpOwoJJm1vdgkoJkRXUCg4LCJlYnAiKSwkaGkpOwoJJnBvcAkoImVieCIpOwoJJm1vdgkoJkRXUCg0LCJlYnAiKSwkbG8pOwoJJnBvcAkoImVicCIpOwoJJnJldAkoKTsKJmZ1bmN0aW9uX2VuZF9CKCJibl9HRjJtX211bF8yeDIiKTsKCiZhc2NpegkoIkdGKDJebSkgTXVsdGlwbGljYXRpb24gZm9yIHg4NiwgQ1JZUFRPR0FNUyBieSA8YXBwcm9cQG9wZW5zc2wub3JnPiIpOwoKJmFzbV9maW5pc2goKTsK