Ly8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyBCaXRtYXAgY29udmVyc2lvbiByb3V0aW5lcwovLwovLyBEZXNpZ24gYW5kIGltcGxlbWVudGF0aW9uIGJ5Ci8vIC0gSGVydukgRHJvbG9uIChkcm9sb25AaW5mb25pZS5mcikKLy8gLSBUYW5uZXIgSGVsbGFuZCAodGFubmVyaGVsbGFuZEB1c2Vycy5zZi5uZXQpCi8vCi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZyZWVJbWFnZSAzCi8vCi8vIENPVkVSRUQgQ09ERSBJUyBQUk9WSURFRCBVTkRFUiBUSElTIExJQ0VOU0UgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5UWQovLyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgV0FSUkFOVElFUwovLyBUSEFUIFRIRSBDT1ZFUkVEIENPREUgSVMgRlJFRSBPRiBERUZFQ1RTLCBNRVJDSEFOVEFCTEUsIEZJVCBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKLy8gT1IgTk9OLUlORlJJTkdJTkcuIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIENPVkVSRUQKLy8gQ09ERSBJUyBXSVRIIFlPVS4gU0hPVUxEIEFOWSBDT1ZFUkVEIENPREUgUFJPVkUgREVGRUNUSVZFIElOIEFOWSBSRVNQRUNULCBZT1UgKE5PVAovLyBUSEUgSU5JVElBTCBERVZFTE9QRVIgT1IgQU5ZIE9USEVSIENPTlRSSUJVVE9SKSBBU1NVTUUgVEhFIENPU1QgT0YgQU5ZIE5FQ0VTU0FSWQovLyBTRVJWSUNJTkcsIFJFUEFJUiBPUiBDT1JSRUNUSU9OLiBUSElTIERJU0NMQUlNRVIgT0YgV0FSUkFOVFkgQ09OU1RJVFVURVMgQU4gRVNTRU5USUFMCi8vIFBBUlQgT0YgVEhJUyBMSUNFTlNFLiBOTyBVU0UgT0YgQU5ZIENPVkVSRUQgQ09ERSBJUyBBVVRIT1JJWkVEIEhFUkVVTkRFUiBFWENFUFQgVU5ERVIKLy8gVEhJUyBESVNDTEFJTUVSLgovLwovLyBVc2UgYXQgeW91ciBvd24gcmlzayEKLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKI2luY2x1ZGUgIkZyZWVJbWFnZS5oIgojaW5jbHVkZSAiVXRpbGl0aWVzLmgiCgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgovKiogQ29udmVydCBhIGdyZXlzY2FsZSBpbWFnZSBvZiB0eXBlIFRzcmMgdG8gdHlwZSBUZHN0LgoJQ29udmVyc2lvbiBpcyBkb25lIHVzaW5nIHN0YW5kYXJkIEMgbGFuZ3VhZ2UgY2FzdGluZyBjb252ZW50aW9uLgoqLwp0ZW1wbGF0ZTxjbGFzcyBUZHN0LCBjbGFzcyBUc3JjPgpjbGFzcyBDT05WRVJUX1RZUEUKewpwdWJsaWM6CglGSUJJVE1BUCogY29udmVydChGSUJJVE1BUCAqc3JjLCBGUkVFX0lNQUdFX1RZUEUgZHN0X3R5cGUpOwp9OwoKdGVtcGxhdGU8Y2xhc3MgVGRzdCwgY2xhc3MgVHNyYz4gRklCSVRNQVAqIApDT05WRVJUX1RZUEU8VGRzdCwgVHNyYz46OmNvbnZlcnQoRklCSVRNQVAgKnNyYywgRlJFRV9JTUFHRV9UWVBFIGRzdF90eXBlKSB7CgoJRklCSVRNQVAgKmRzdCA9IE5VTEw7CgoJdW5zaWduZWQgd2lkdGgJPSBGcmVlSW1hZ2VfR2V0V2lkdGgoc3JjKTsKCXVuc2lnbmVkIGhlaWdodCA9IEZyZWVJbWFnZV9HZXRIZWlnaHQoc3JjKTsKCXVuc2lnbmVkIGJwcAk9IEZyZWVJbWFnZV9HZXRCUFAoc3JjKTsKCgkvLyBhbGxvY2F0ZSBkc3QgaW1hZ2UKCglkc3QgPSBGcmVlSW1hZ2VfQWxsb2NhdGVUKGRzdF90eXBlLCB3aWR0aCwgaGVpZ2h0LCBicHAsIAoJCQlGcmVlSW1hZ2VfR2V0UmVkTWFzayhzcmMpLCBGcmVlSW1hZ2VfR2V0R3JlZW5NYXNrKHNyYyksIEZyZWVJbWFnZV9HZXRCbHVlTWFzayhzcmMpKTsKCWlmKCFkc3QpIHJldHVybiBOVUxMOwoKCS8vIGNvbnZlcnQgZnJvbSBzcmNfdHlwZSB0byBkc3RfdHlwZQoJCglmb3IodW5zaWduZWQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgewoJCWNvbnN0IFRzcmMgKnNyY19iaXRzID0gcmVpbnRlcnByZXRfY2FzdDxUc3JjKj4oRnJlZUltYWdlX0dldFNjYW5MaW5lKHNyYywgeSkpOwoJCVRkc3QgKmRzdF9iaXRzID0gcmVpbnRlcnByZXRfY2FzdDxUZHN0Kj4oRnJlZUltYWdlX0dldFNjYW5MaW5lKGRzdCwgeSkpOwoKCQlmb3IodW5zaWduZWQgeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CgkJCSpkc3RfYml0cysrID0gc3RhdGljX2Nhc3Q8VGRzdD4oKnNyY19iaXRzKyspOwoJCX0KCX0KCglyZXR1cm4gZHN0Owp9CgoKLyoqIENvbnZlcnQgYSBncmV5c2NhbGUgaW1hZ2Ugb2YgdHlwZSBUc3JjIHRvIGEgOC1iaXQgZ3JheXNjYWxlIGRpYi4KCUNvbnZlcnNpb24gaXMgZG9uZSB1c2luZyBlaXRoZXIgYSBsaW5lYXIgc2NhbGluZyBmcm9tIFttaW4sIG1heF0gdG8gWzAsIDI1NV0KCW9yIGEgcm91bmRpbmcgZnJvbSBzcmNfcGl4ZWwgdG8gKEJZVEUpIE1JTigyNTUsIE1BWCgwLCBxKSkgd2hlcmUgaW50IHEgPSBpbnQoc3JjX3BpeGVsICsgMC41KTsgCiovCnRlbXBsYXRlPGNsYXNzIFRzcmM+CmNsYXNzIENPTlZFUlRfVE9fQllURQp7CnB1YmxpYzoKCUZJQklUTUFQKiBjb252ZXJ0KEZJQklUTUFQICpzcmMsIEJPT0wgc2NhbGVfbGluZWFyKTsKfTsKCnRlbXBsYXRlPGNsYXNzIFRzcmM+IEZJQklUTUFQKiAKQ09OVkVSVF9UT19CWVRFPFRzcmM+Ojpjb252ZXJ0KEZJQklUTUFQICpzcmMsIEJPT0wgc2NhbGVfbGluZWFyKSB7CglGSUJJVE1BUCAqZHN0ID0gTlVMTDsKCXVuc2lnbmVkIHgsIHk7CgoJdW5zaWduZWQgd2lkdGgJPSBGcmVlSW1hZ2VfR2V0V2lkdGgoc3JjKTsKCXVuc2lnbmVkIGhlaWdodCA9IEZyZWVJbWFnZV9HZXRIZWlnaHQoc3JjKTsKCgkvLyBhbGxvY2F0ZSBhIDgtYml0IGRpYgoKCWRzdCA9IEZyZWVJbWFnZV9BbGxvY2F0ZVQoRklUX0JJVE1BUCwgd2lkdGgsIGhlaWdodCwgOCwgMCwgMCwgMCk7CglpZighZHN0KSByZXR1cm4gTlVMTDsKCgkvLyBidWlsZCBhIGdyZXlzY2FsZSBwYWxldHRlCglSR0JRVUFEICpwYWwgPSBGcmVlSW1hZ2VfR2V0UGFsZXR0ZShkc3QpOwoJZm9yKGludCBpID0gMDsgaSA8IDI1NjsgaSsrKSB7CgkJcGFsW2ldLnJnYlJlZCA9IChCWVRFKWk7CgkJcGFsW2ldLnJnYkdyZWVuID0gKEJZVEUpaTsKCQlwYWxbaV0ucmdiQmx1ZSA9IChCWVRFKWk7Cgl9CgoJLy8gY29udmVydCB0aGUgc3JjIGltYWdlIHRvIGRzdAoJLy8gKEZJQklUTUFQIGFyZSBzdG9yZWQgdXBzaWRlIGRvd24pCglpZihzY2FsZV9saW5lYXIpIHsKCQlUc3JjIG1heCwgbWluOwoJCWRvdWJsZSBzY2FsZTsKCgkJLy8gZmluZCB0aGUgbWluIGFuZCBtYXggdmFsdWUgb2YgdGhlIGltYWdlCgkJVHNyYyBsX21pbiwgbF9tYXg7CgkJbWluID0gMjU1LCBtYXggPSAwOwoJCWZvcih5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CgkJCVRzcmMgKmJpdHMgPSByZWludGVycHJldF9jYXN0PFRzcmMqPihGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoc3JjLCB5KSk7CgkJCU1BWE1JTihiaXRzLCB3aWR0aCwgbF9tYXgsIGxfbWluKTsKCQkJaWYobF9tYXggPiBtYXgpIG1heCA9IGxfbWF4OwoJCQlpZihsX21pbiA8IG1pbikgbWluID0gbF9taW47CgkJfQoJCWlmKG1heCA9PSBtaW4pIHsKCQkJbWF4ID0gMjU1OyBtaW4gPSAwOwoJCX0KCgkJLy8gY29tcHV0ZSB0aGUgc2NhbGluZyBmYWN0b3IKCQlzY2FsZSA9IDI1NSAvIChkb3VibGUpKG1heCAtIG1pbik7CgoJCS8vIHNjYWxlIHRvIDgtYml0CgkJZm9yKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKCQkJVHNyYyAqc3JjX2JpdHMgPSByZWludGVycHJldF9jYXN0PFRzcmMqPihGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoc3JjLCB5KSk7CgkJCUJZVEUgKmRzdF9iaXRzID0gRnJlZUltYWdlX0dldFNjYW5MaW5lKGRzdCwgeSk7CgkJCWZvcih4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKCQkJCWRzdF9iaXRzW3hdID0gKEJZVEUpKCBzY2FsZSAqIChzcmNfYml0c1t4XSAtIG1pbikgKyAwLjUpOwoJCQl9CgkJfQoJfSBlbHNlIHsKCQlmb3IoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgewoJCQlUc3JjICpzcmNfYml0cyA9IHJlaW50ZXJwcmV0X2Nhc3Q8VHNyYyo+KEZyZWVJbWFnZV9HZXRTY2FuTGluZShzcmMsIHkpKTsKCQkJQllURSAqZHN0X2JpdHMgPSBGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoZHN0LCB5KTsKCQkJZm9yKHggPSAwOyB4IDwgd2lkdGg7IHgrKykgewoJCQkJLy8gcm91bmRpbmcKCQkJCWludCBxID0gaW50KHNyY19iaXRzW3hdICsgMC41KTsKCQkJCWRzdF9iaXRzW3hdID0gKEJZVEUpIE1JTigyNTUsIE1BWCgwLCBxKSk7CgkJCX0KCQl9Cgl9CgoJcmV0dXJuIGRzdDsKfQoKLyoqIENvbnZlcnQgYSBncmV5c2NhbGUgaW1hZ2Ugb2YgdHlwZSBUc3JjIHRvIGEgRklDT01QTEVYIGRpYi4KKi8KdGVtcGxhdGU8Y2xhc3MgVHNyYz4KY2xhc3MgQ09OVkVSVF9UT19DT01QTEVYCnsKcHVibGljOgoJRklCSVRNQVAqIGNvbnZlcnQoRklCSVRNQVAgKnNyYyk7Cn07Cgp0ZW1wbGF0ZTxjbGFzcyBUc3JjPiBGSUJJVE1BUCogCkNPTlZFUlRfVE9fQ09NUExFWDxUc3JjPjo6Y29udmVydChGSUJJVE1BUCAqc3JjKSB7CglGSUJJVE1BUCAqZHN0ID0gTlVMTDsKCgl1bnNpZ25lZCB3aWR0aAk9IEZyZWVJbWFnZV9HZXRXaWR0aChzcmMpOwoJdW5zaWduZWQgaGVpZ2h0ID0gRnJlZUltYWdlX0dldEhlaWdodChzcmMpOwoKCS8vIGFsbG9jYXRlIGRzdCBpbWFnZQoKCWRzdCA9IEZyZWVJbWFnZV9BbGxvY2F0ZVQoRklUX0NPTVBMRVgsIHdpZHRoLCBoZWlnaHQpOwoJaWYoIWRzdCkgcmV0dXJuIE5VTEw7CgoJLy8gY29udmVydCBmcm9tIHNyY190eXBlIHRvIEZJVF9DT01QTEVYCgkKCWZvcih1bnNpZ25lZCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CgkJY29uc3QgVHNyYyAqc3JjX2JpdHMgPSByZWludGVycHJldF9jYXN0PFRzcmMqPihGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoc3JjLCB5KSk7CgkJRklDT01QTEVYICpkc3RfYml0cyA9IChGSUNPTVBMRVggKilGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoZHN0LCB5KTsKCgkJZm9yKHVuc2lnbmVkIHggPSAwOyB4IDwgd2lkdGg7IHgrKykgewoJCQlkc3RfYml0c1t4XS5yID0gKGRvdWJsZSlzcmNfYml0c1t4XTsKCQkJZHN0X2JpdHNbeF0uaSA9IDA7CgkJfQoJfQoKCXJldHVybiBkc3Q7Cn0KCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi8vIENvbnZlcnQgZnJvbSB0eXBlIEJZVEUgdG8gdHlwZSBYCkNPTlZFUlRfVFlQRTx1bnNpZ25lZCBzaG9ydCwgQllURT4JY29udmVydEJ5dGVUb1VTaG9ydDsKQ09OVkVSVF9UWVBFPHNob3J0LCBCWVRFPgkJCWNvbnZlcnRCeXRlVG9TaG9ydDsKQ09OVkVSVF9UWVBFPERXT1JELCBCWVRFPgkJCWNvbnZlcnRCeXRlVG9VTG9uZzsKQ09OVkVSVF9UWVBFPExPTkcsIEJZVEU+CQkJY29udmVydEJ5dGVUb0xvbmc7CkNPTlZFUlRfVFlQRTxmbG9hdCwgQllURT4JCQljb252ZXJ0Qnl0ZVRvRmxvYXQ7CkNPTlZFUlRfVFlQRTxkb3VibGUsIEJZVEU+CQkJY29udmVydEJ5dGVUb0RvdWJsZTsKCi8vIENvbnZlcnQgZnJvbSB0eXBlIFggdG8gdHlwZSBCWVRFCkNPTlZFUlRfVE9fQllURTx1bnNpZ25lZCBzaG9ydD4JY29udmVydFVTaG9ydFRvQnl0ZTsKQ09OVkVSVF9UT19CWVRFPHNob3J0PgkJCWNvbnZlcnRTaG9ydFRvQnl0ZTsKQ09OVkVSVF9UT19CWVRFPERXT1JEPgkJCWNvbnZlcnRVTG9uZ1RvQnl0ZTsKQ09OVkVSVF9UT19CWVRFPExPTkc+CQkJY29udmVydExvbmdUb0J5dGU7CkNPTlZFUlRfVE9fQllURTxmbG9hdD4JCQljb252ZXJ0RmxvYXRUb0J5dGU7CkNPTlZFUlRfVE9fQllURTxkb3VibGU+CQkJY29udmVydERvdWJsZVRvQnl0ZTsKCi8vIENvbnZlcnQgZnJvbSB0eXBlIFggdG8gdHlwZSBmbG9hdApDT05WRVJUX1RZUEU8ZmxvYXQsIHVuc2lnbmVkIHNob3J0Pgljb252ZXJ0VVNob3J0VG9GbG9hdDsKQ09OVkVSVF9UWVBFPGZsb2F0LCBzaG9ydD4JCQljb252ZXJ0U2hvcnRUb0Zsb2F0OwpDT05WRVJUX1RZUEU8ZmxvYXQsIERXT1JEPgkJCWNvbnZlcnRVTG9uZ1RvRmxvYXQ7CkNPTlZFUlRfVFlQRTxmbG9hdCwgTE9ORz4JCQljb252ZXJ0TG9uZ1RvRmxvYXQ7CgovLyBDb252ZXJ0IGZyb20gdHlwZSBYIHRvIHR5cGUgZG91YmxlCkNPTlZFUlRfVFlQRTxkb3VibGUsIHVuc2lnbmVkIHNob3J0Pgljb252ZXJ0VVNob3J0VG9Eb3VibGU7CkNPTlZFUlRfVFlQRTxkb3VibGUsIHNob3J0PgkJCQljb252ZXJ0U2hvcnRUb0RvdWJsZTsKQ09OVkVSVF9UWVBFPGRvdWJsZSwgRFdPUkQ+CQkJCWNvbnZlcnRVTG9uZ1RvRG91YmxlOwpDT05WRVJUX1RZUEU8ZG91YmxlLCBMT05HPgkJCQljb252ZXJ0TG9uZ1RvRG91YmxlOwpDT05WRVJUX1RZUEU8ZG91YmxlLCBmbG9hdD4JCQkJY29udmVydEZsb2F0VG9Eb3VibGU7CgovLyBDb252ZXJ0IGZyb20gdHlwZSBYIHRvIHR5cGUgRklDT01QTEVYCkNPTlZFUlRfVE9fQ09NUExFWDxCWVRFPgkJCWNvbnZlcnRCeXRlVG9Db21wbGV4OwpDT05WRVJUX1RPX0NPTVBMRVg8dW5zaWduZWQgc2hvcnQ+CWNvbnZlcnRVU2hvcnRUb0NvbXBsZXg7CkNPTlZFUlRfVE9fQ09NUExFWDxzaG9ydD4JCQljb252ZXJ0U2hvcnRUb0NvbXBsZXg7CkNPTlZFUlRfVE9fQ09NUExFWDxEV09SRD4JCQljb252ZXJ0VUxvbmdUb0NvbXBsZXg7CkNPTlZFUlRfVE9fQ09NUExFWDxMT05HPgkJCWNvbnZlcnRMb25nVG9Db21wbGV4OwpDT05WRVJUX1RPX0NPTVBMRVg8ZmxvYXQ+CQkJY29udmVydEZsb2F0VG9Db21wbGV4OwpDT05WRVJUX1RPX0NPTVBMRVg8ZG91YmxlPgkJCWNvbnZlcnREb3VibGVUb0NvbXBsZXg7CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vICAgc21hcnQgY29udmVydCBYIHRvIHN0YW5kYXJkIEZJQklUTUFQCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi8qKiBDb252ZXJ0IGltYWdlIG9mIGFueSB0eXBlIHRvIGEgc3RhbmRhcmQgOC1iaXQgZ3JleXNjYWxlIGltYWdlLgpGb3Igc3RhbmRhcmQgaW1hZ2VzLCBhIGNsb25lIG9mIHRoZSBpbnB1dCBpbWFnZSBpcyByZXR1cm5lZC4KV2hlbiB0aGUgc2NhbGVfbGluZWFyIHBhcmFtZXRlciBpcyBUUlVFLCBjb252ZXJzaW9uIGlzIGRvbmUgYnkgc2NhbGluZyBsaW5lYXJseSAKZWFjaCBwaXhlbCB0byBhbiBpbnRlZ2VyIHZhbHVlIGJldHdlZW4gWzAuLjI1NV0uIFdoZW4gaXQgaXMgRkFMU0UsIGNvbnZlcnNpb24gaXMgZG9uZSAKYnkgcm91bmRpbmcgZWFjaCBmbG9hdCBwaXhlbCB0byBhbiBpbnRlZ2VyIGJldHdlZW4gWzAuLjI1NV0uIApGb3IgY29tcGxleCBpbWFnZXMsIHRoZSBtYWduaXR1ZGUgaXMgZXh0cmFjdGVkIGFzIGEgZG91YmxlIGltYWdlLCB0aGVuIGNvbnZlcnRlZCBhY2NvcmRpbmcgdG8gdGhlIHNjYWxlIHBhcmFtZXRlci4gCkBwYXJhbSBpbWFnZSBJbWFnZSB0byBjb252ZXJ0CkBwYXJhbSBzY2FsZV9saW5lYXIgTGluZWFyIHNjYWxpbmcgLyByb3VuZGluZyBzd2l0Y2gKKi8KRklCSVRNQVAqIERMTF9DQUxMQ09OVgpGcmVlSW1hZ2VfQ29udmVydFRvU3RhbmRhcmRUeXBlKEZJQklUTUFQICpzcmMsIEJPT0wgc2NhbGVfbGluZWFyKSB7CglGSUJJVE1BUCAqZHN0ID0gTlVMTDsKCglpZighc3JjKSByZXR1cm4gTlVMTDsKCgkvLyBjb252ZXJ0IGZyb20gc3JjX3R5cGUgdG8gRklUX0JJVE1BUAoKCWNvbnN0IEZSRUVfSU1BR0VfVFlQRSBzcmNfdHlwZSA9IEZyZWVJbWFnZV9HZXRJbWFnZVR5cGUoc3JjKTsKCglzd2l0Y2goc3JjX3R5cGUpIHsKCQljYXNlIEZJVF9CSVRNQVA6CS8vIHN0YW5kYXJkIGltYWdlOiAxLSwgNC0sIDgtLCAxNi0sIDI0LSwgMzItYml0CgkJCWRzdCA9IEZyZWVJbWFnZV9DbG9uZShzcmMpOwoJCQlicmVhazsKCQljYXNlIEZJVF9VSU5UMTY6CS8vIGFycmF5IG9mIHVuc2lnbmVkIHNob3J0OiB1bnNpZ25lZCAxNi1iaXQKCQkJZHN0ID0gY29udmVydFVTaG9ydFRvQnl0ZS5jb252ZXJ0KHNyYywgc2NhbGVfbGluZWFyKTsKCQkJYnJlYWs7CgkJY2FzZSBGSVRfSU5UMTY6CQkvLyBhcnJheSBvZiBzaG9ydDogc2lnbmVkIDE2LWJpdAoJCQlkc3QgPSBjb252ZXJ0U2hvcnRUb0J5dGUuY29udmVydChzcmMsIHNjYWxlX2xpbmVhcik7CgkJCWJyZWFrOwoJCWNhc2UgRklUX1VJTlQzMjoJLy8gYXJyYXkgb2YgdW5zaWduZWQgbG9uZzogdW5zaWduZWQgMzItYml0CgkJCWRzdCA9IGNvbnZlcnRVTG9uZ1RvQnl0ZS5jb252ZXJ0KHNyYywgc2NhbGVfbGluZWFyKTsKCQkJYnJlYWs7CgkJY2FzZSBGSVRfSU5UMzI6CQkvLyBhcnJheSBvZiBsb25nOiBzaWduZWQgMzItYml0CgkJCWRzdCA9IGNvbnZlcnRMb25nVG9CeXRlLmNvbnZlcnQoc3JjLCBzY2FsZV9saW5lYXIpOwoJCQlicmVhazsKCQljYXNlIEZJVF9GTE9BVDoJCS8vIGFycmF5IG9mIGZsb2F0OiAzMi1iaXQKCQkJZHN0ID0gY29udmVydEZsb2F0VG9CeXRlLmNvbnZlcnQoc3JjLCBzY2FsZV9saW5lYXIpOwoJCQlicmVhazsKCQljYXNlIEZJVF9ET1VCTEU6CS8vIGFycmF5IG9mIGRvdWJsZTogNjQtYml0CgkJCWRzdCA9IGNvbnZlcnREb3VibGVUb0J5dGUuY29udmVydChzcmMsIHNjYWxlX2xpbmVhcik7CgkJCWJyZWFrOwoJCWNhc2UgRklUX0NPTVBMRVg6CS8vIGFycmF5IG9mIEZJQ09NUExFWDogMiB4IDY0LWJpdAoJCQl7CgkJCQkvLyBDb252ZXJ0IHRvIHR5cGUgRklUX0RPVUJMRQoJCQkJRklCSVRNQVAgKmRpYl9kb3VibGUgPSBGcmVlSW1hZ2VfR2V0Q29tcGxleENoYW5uZWwoc3JjLCBGSUNDX01BRyk7CgkJCQlpZihkaWJfZG91YmxlKSB7CgkJCQkJLy8gQ29udmVydCB0byBhIHN0YW5kYXJkIGJpdG1hcCAobGluZWFyIHNjYWxpbmcpCgkJCQkJZHN0ID0gY29udmVydERvdWJsZVRvQnl0ZS5jb252ZXJ0KGRpYl9kb3VibGUsIHNjYWxlX2xpbmVhcik7CgkJCQkJLy8gRnJlZSBpbWFnZSBvZiB0eXBlIEZJVF9ET1VCTEUKCQkJCQlGcmVlSW1hZ2VfVW5sb2FkKGRpYl9kb3VibGUpOwoJCQkJfQoJCQl9CgkJCWJyZWFrOwoJCWNhc2UgRklUX1JHQjE2OgkJLy8gNDgtYml0IFJHQiBpbWFnZTogMyB4IDE2LWJpdAoJCQlicmVhazsKCQljYXNlIEZJVF9SR0JBMTY6CS8vIDY0LWJpdCBSR0JBIGltYWdlOiA0IHggMTYtYml0CgkJCWJyZWFrOwoJCWNhc2UgRklUX1JHQkY6CQkvLyA5Ni1iaXQgUkdCIGZsb2F0IGltYWdlOiAzIHggMzItYml0IElFRUUgZmxvYXRpbmcgcG9pbnQKCQkJYnJlYWs7CgkJY2FzZSBGSVRfUkdCQUY6CQkvLyAxMjgtYml0IFJHQkEgZmxvYXQgaW1hZ2U6IDQgeCAzMi1iaXQgSUVFRSBmbG9hdGluZyBwb2ludAoJCQlicmVhazsKCX0KCglpZihOVUxMID09IGRzdCkgewoJCUZyZWVJbWFnZV9PdXRwdXRNZXNzYWdlUHJvYyhGSUZfVU5LTk9XTiwgIkZSRUVfSU1BR0VfVFlQRTogVW5hYmxlIHRvIGNvbnZlcnQgZnJvbSB0eXBlICVkIHRvIHR5cGUgJWQuXG4gTm8gc3VjaCBjb252ZXJzaW9uIGV4aXN0cy4iLCBzcmNfdHlwZSwgRklUX0JJVE1BUCk7Cgl9IGVsc2UgewoJCS8vIGNvcHkgbWV0YWRhdGEgZnJvbSBzcmMgdG8gZHN0CgkJRnJlZUltYWdlX0Nsb25lTWV0YWRhdGEoZHN0LCBzcmMpOwoJfQoJCglyZXR1cm4gZHN0Owp9CgoKCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gICBzbWFydCBjb252ZXJ0IFggdG8gWQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpGSUJJVE1BUCogRExMX0NBTExDT05WCkZyZWVJbWFnZV9Db252ZXJ0VG9UeXBlKEZJQklUTUFQICpzcmMsIEZSRUVfSU1BR0VfVFlQRSBkc3RfdHlwZSwgQk9PTCBzY2FsZV9saW5lYXIpIHsKCUZJQklUTUFQICpkc3QgPSBOVUxMOwoKCWlmKCFGcmVlSW1hZ2VfSGFzUGl4ZWxzKHNyYykpIHJldHVybiBOVUxMOwoKCS8vIGNvbnZlcnQgZnJvbSBzcmNfdHlwZSB0byBkc3RfdHlwZQoKCWNvbnN0IEZSRUVfSU1BR0VfVFlQRSBzcmNfdHlwZSA9IEZyZWVJbWFnZV9HZXRJbWFnZVR5cGUoc3JjKTsKCglpZihzcmNfdHlwZSA9PSBkc3RfdHlwZSkgewoJCXJldHVybiBGcmVlSW1hZ2VfQ2xvbmUoc3JjKTsKCX0KCgljb25zdCB1bnNpZ25lZCBzcmNfYnBwID0gRnJlZUltYWdlX0dldEJQUChzcmMpOwoKCXN3aXRjaChzcmNfdHlwZSkgewoJCWNhc2UgRklUX0JJVE1BUDoKCQkJc3dpdGNoKGRzdF90eXBlKSB7CgkJCQljYXNlIEZJVF9VSU5UMTY6CgkJCQkJZHN0ID0gRnJlZUltYWdlX0NvbnZlcnRUb1VJTlQxNihzcmMpOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSBGSVRfSU5UMTY6CgkJCQkJZHN0ID0gKHNyY19icHAgPT0gOCkgPyBjb252ZXJ0Qnl0ZVRvU2hvcnQuY29udmVydChzcmMsIGRzdF90eXBlKSA6IE5VTEw7CgkJCQkJYnJlYWs7CgkJCQljYXNlIEZJVF9VSU5UMzI6CgkJCQkJZHN0ID0gKHNyY19icHAgPT0gOCkgPyBjb252ZXJ0Qnl0ZVRvVUxvbmcuY29udmVydChzcmMsIGRzdF90eXBlKSA6IE5VTEw7CgkJCQkJYnJlYWs7CgkJCQljYXNlIEZJVF9JTlQzMjoKCQkJCQlkc3QgPSAoc3JjX2JwcCA9PSA4KSA/IGNvbnZlcnRCeXRlVG9Mb25nLmNvbnZlcnQoc3JjLCBkc3RfdHlwZSkgOiBOVUxMOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSBGSVRfRkxPQVQ6CgkJCQkJZHN0ID0gRnJlZUltYWdlX0NvbnZlcnRUb0Zsb2F0KHNyYyk7CgkJCQkJYnJlYWs7CgkJCQljYXNlIEZJVF9ET1VCTEU6CgkJCQkJZHN0ID0gKHNyY19icHAgPT0gOCkgPyBjb252ZXJ0Qnl0ZVRvRG91YmxlLmNvbnZlcnQoc3JjLCBkc3RfdHlwZSkgOiBOVUxMOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSBGSVRfQ09NUExFWDoKCQkJCQlkc3QgPSAoc3JjX2JwcCA9PSA4KSA/IGNvbnZlcnRCeXRlVG9Db21wbGV4LmNvbnZlcnQoc3JjKSA6IE5VTEw7CgkJCQkJYnJlYWs7CgkJCQljYXNlIEZJVF9SR0IxNjoKCQkJCQlkc3QgPSBGcmVlSW1hZ2VfQ29udmVydFRvUkdCMTYoc3JjKTsKCQkJCQlicmVhazsKCQkJCWNhc2UgRklUX1JHQkExNjoKCQkJCQlkc3QgPSBGcmVlSW1hZ2VfQ29udmVydFRvUkdCQTE2KHNyYyk7CgkJCQkJYnJlYWs7CgkJCQljYXNlIEZJVF9SR0JGOgoJCQkJCWRzdCA9IEZyZWVJbWFnZV9Db252ZXJ0VG9SR0JGKHNyYyk7CgkJCQkJYnJlYWs7CgkJCQljYXNlIEZJVF9SR0JBRjoKCQkJCQlkc3QgPSBGcmVlSW1hZ2VfQ29udmVydFRvUkdCQUYoc3JjKTsKCQkJCQlicmVhazsKCQkJfQoJCQlicmVhazsKCQljYXNlIEZJVF9VSU5UMTY6CgkJCXN3aXRjaChkc3RfdHlwZSkgewoJCQkJY2FzZSBGSVRfQklUTUFQOgoJCQkJCWRzdCA9IEZyZWVJbWFnZV9Db252ZXJ0VG9TdGFuZGFyZFR5cGUoc3JjLCBzY2FsZV9saW5lYXIpOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSBGSVRfSU5UMTY6CgkJCQkJYnJlYWs7CgkJCQljYXNlIEZJVF9VSU5UMzI6CgkJCQkJYnJlYWs7CgkJCQljYXNlIEZJVF9JTlQzMjoKCQkJCQlicmVhazsKCQkJCWNhc2UgRklUX0ZMT0FUOgoJCQkJCWRzdCA9IEZyZWVJbWFnZV9Db252ZXJ0VG9GbG9hdChzcmMpOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSBGSVRfRE9VQkxFOgoJCQkJCWRzdCA9IGNvbnZlcnRVU2hvcnRUb0RvdWJsZS5jb252ZXJ0KHNyYywgZHN0X3R5cGUpOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSBGSVRfQ09NUExFWDoKCQkJCQlkc3QgPSBjb252ZXJ0VVNob3J0VG9Db21wbGV4LmNvbnZlcnQoc3JjKTsKCQkJCQlicmVhazsKCQkJCWNhc2UgRklUX1JHQjE2OgoJCQkJCWRzdCA9IEZyZWVJbWFnZV9Db252ZXJ0VG9SR0IxNihzcmMpOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSBGSVRfUkdCQTE2OgoJCQkJCWRzdCA9IEZyZWVJbWFnZV9Db252ZXJ0VG9SR0JBMTYoc3JjKTsKCQkJCQlicmVhazsKCQkJCWNhc2UgRklUX1JHQkY6CgkJCQkJZHN0ID0gRnJlZUltYWdlX0NvbnZlcnRUb1JHQkYoc3JjKTsKCQkJCQlicmVhazsKCQkJCWNhc2UgRklUX1JHQkFGOgoJCQkJCWRzdCA9IEZyZWVJbWFnZV9Db252ZXJ0VG9SR0JBRihzcmMpOwoJCQkJCWJyZWFrOwoJCQl9CgkJCWJyZWFrOwoJCWNhc2UgRklUX0lOVDE2OgoJCQlzd2l0Y2goZHN0X3R5cGUpIHsKCQkJCWNhc2UgRklUX0JJVE1BUDoKCQkJCQlkc3QgPSBGcmVlSW1hZ2VfQ29udmVydFRvU3RhbmRhcmRUeXBlKHNyYywgc2NhbGVfbGluZWFyKTsKCQkJCQlicmVhazsKCQkJCWNhc2UgRklUX1VJTlQxNjoKCQkJCQlicmVhazsKCQkJCWNhc2UgRklUX1VJTlQzMjoKCQkJCQlicmVhazsKCQkJCWNhc2UgRklUX0lOVDMyOgoJCQkJCWJyZWFrOwoJCQkJY2FzZSBGSVRfRkxPQVQ6CgkJCQkJZHN0ID0gY29udmVydFNob3J0VG9GbG9hdC5jb252ZXJ0KHNyYywgZHN0X3R5cGUpOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSBGSVRfRE9VQkxFOgoJCQkJCWRzdCA9IGNvbnZlcnRTaG9ydFRvRG91YmxlLmNvbnZlcnQoc3JjLCBkc3RfdHlwZSk7CgkJCQkJYnJlYWs7CgkJCQljYXNlIEZJVF9DT01QTEVYOgoJCQkJCWRzdCA9IGNvbnZlcnRTaG9ydFRvQ29tcGxleC5jb252ZXJ0KHNyYyk7CgkJCQkJYnJlYWs7CgkJCQljYXNlIEZJVF9SR0IxNjoKCQkJCQlicmVhazsKCQkJCWNhc2UgRklUX1JHQkExNjoKCQkJCQlicmVhazsKCQkJCWNhc2UgRklUX1JHQkY6CgkJCQkJYnJlYWs7CgkJCQljYXNlIEZJVF9SR0JBRjoKCQkJCQlicmVhazsKCQkJfQoJCQlicmVhazsKCQljYXNlIEZJVF9VSU5UMzI6CgkJCXN3aXRjaChkc3RfdHlwZSkgewoJCQkJY2FzZSBGSVRfQklUTUFQOgoJCQkJCWRzdCA9IEZyZWVJbWFnZV9Db252ZXJ0VG9TdGFuZGFyZFR5cGUoc3JjLCBzY2FsZV9saW5lYXIpOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSBGSVRfVUlOVDE2OgoJCQkJCWJyZWFrOwoJCQkJY2FzZSBGSVRfSU5UMTY6CgkJCQkJYnJlYWs7CgkJCQljYXNlIEZJVF9JTlQzMjoKCQkJCQlicmVhazsKCQkJCWNhc2UgRklUX0ZMT0FUOgoJCQkJCWRzdCA9IGNvbnZlcnRVTG9uZ1RvRmxvYXQuY29udmVydChzcmMsIGRzdF90eXBlKTsKCQkJCQlicmVhazsKCQkJCWNhc2UgRklUX0RPVUJMRToKCQkJCQlkc3QgPSBjb252ZXJ0VUxvbmdUb0RvdWJsZS5jb252ZXJ0KHNyYywgZHN0X3R5cGUpOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSBGSVRfQ09NUExFWDoKCQkJCQlkc3QgPSBjb252ZXJ0VUxvbmdUb0NvbXBsZXguY29udmVydChzcmMpOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSBGSVRfUkdCMTY6CgkJCQkJYnJlYWs7CgkJCQljYXNlIEZJVF9SR0JBMTY6CgkJCQkJYnJlYWs7CgkJCQljYXNlIEZJVF9SR0JGOgoJCQkJCWJyZWFrOwoJCQkJY2FzZSBGSVRfUkdCQUY6CgkJCQkJYnJlYWs7CgkJCX0KCQkJYnJlYWs7CgkJY2FzZSBGSVRfSU5UMzI6CgkJCXN3aXRjaChkc3RfdHlwZSkgewoJCQkJY2FzZSBGSVRfQklUTUFQOgoJCQkJCWRzdCA9IEZyZWVJbWFnZV9Db252ZXJ0VG9TdGFuZGFyZFR5cGUoc3JjLCBzY2FsZV9saW5lYXIpOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSBGSVRfVUlOVDE2OgoJCQkJCWJyZWFrOwoJCQkJY2FzZSBGSVRfSU5UMTY6CgkJCQkJYnJlYWs7CgkJCQljYXNlIEZJVF9VSU5UMzI6CgkJCQkJYnJlYWs7CgkJCQljYXNlIEZJVF9GTE9BVDoKCQkJCQlkc3QgPSBjb252ZXJ0TG9uZ1RvRmxvYXQuY29udmVydChzcmMsIGRzdF90eXBlKTsKCQkJCQlicmVhazsKCQkJCWNhc2UgRklUX0RPVUJMRToKCQkJCQlkc3QgPSBjb252ZXJ0TG9uZ1RvRG91YmxlLmNvbnZlcnQoc3JjLCBkc3RfdHlwZSk7CgkJCQkJYnJlYWs7CgkJCQljYXNlIEZJVF9DT01QTEVYOgoJCQkJCWRzdCA9IGNvbnZlcnRMb25nVG9Db21wbGV4LmNvbnZlcnQoc3JjKTsKCQkJCQlicmVhazsKCQkJCWNhc2UgRklUX1JHQjE2OgoJCQkJCWJyZWFrOwoJCQkJY2FzZSBGSVRfUkdCQTE2OgoJCQkJCWJyZWFrOwoJCQkJY2FzZSBGSVRfUkdCRjoKCQkJCQlicmVhazsKCQkJCWNhc2UgRklUX1JHQkFGOgoJCQkJCWJyZWFrOwoJCQl9CgkJCWJyZWFrOwoJCWNhc2UgRklUX0ZMT0FUOgoJCQlzd2l0Y2goZHN0X3R5cGUpIHsKCQkJCWNhc2UgRklUX0JJVE1BUDoKCQkJCQlkc3QgPSBGcmVlSW1hZ2VfQ29udmVydFRvU3RhbmRhcmRUeXBlKHNyYywgc2NhbGVfbGluZWFyKTsKCQkJCQlicmVhazsKCQkJCWNhc2UgRklUX1VJTlQxNjoKCQkJCQlicmVhazsKCQkJCWNhc2UgRklUX0lOVDE2OgoJCQkJCWJyZWFrOwoJCQkJY2FzZSBGSVRfVUlOVDMyOgoJCQkJCWJyZWFrOwoJCQkJY2FzZSBGSVRfSU5UMzI6CgkJCQkJYnJlYWs7CgkJCQljYXNlIEZJVF9ET1VCTEU6CgkJCQkJZHN0ID0gY29udmVydEZsb2F0VG9Eb3VibGUuY29udmVydChzcmMsIGRzdF90eXBlKTsKCQkJCQlicmVhazsKCQkJCWNhc2UgRklUX0NPTVBMRVg6CgkJCQkJZHN0ID0gY29udmVydEZsb2F0VG9Db21wbGV4LmNvbnZlcnQoc3JjKTsKCQkJCQlicmVhazsKCQkJCWNhc2UgRklUX1JHQjE2OgoJCQkJCWJyZWFrOwoJCQkJY2FzZSBGSVRfUkdCQTE2OgoJCQkJCWJyZWFrOwoJCQkJY2FzZSBGSVRfUkdCRjoKCQkJCQlkc3QgPSBGcmVlSW1hZ2VfQ29udmVydFRvUkdCRihzcmMpOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSBGSVRfUkdCQUY6CgkJCQkJZHN0ID0gRnJlZUltYWdlX0NvbnZlcnRUb1JHQkFGKHNyYyk7CgkJCQkJYnJlYWs7CgkJCX0KCQkJYnJlYWs7CgkJY2FzZSBGSVRfRE9VQkxFOgoJCQlzd2l0Y2goZHN0X3R5cGUpIHsKCQkJCWNhc2UgRklUX0JJVE1BUDoKCQkJCQlkc3QgPSBGcmVlSW1hZ2VfQ29udmVydFRvU3RhbmRhcmRUeXBlKHNyYywgc2NhbGVfbGluZWFyKTsKCQkJCQlicmVhazsKCQkJCWNhc2UgRklUX1VJTlQxNjoKCQkJCQlicmVhazsKCQkJCWNhc2UgRklUX0lOVDE2OgoJCQkJCWJyZWFrOwoJCQkJY2FzZSBGSVRfVUlOVDMyOgoJCQkJCWJyZWFrOwoJCQkJY2FzZSBGSVRfSU5UMzI6CgkJCQkJYnJlYWs7CgkJCQljYXNlIEZJVF9GTE9BVDoKCQkJCQlicmVhazsKCQkJCWNhc2UgRklUX0NPTVBMRVg6CgkJCQkJZHN0ID0gY29udmVydERvdWJsZVRvQ29tcGxleC5jb252ZXJ0KHNyYyk7CgkJCQkJYnJlYWs7CgkJCQljYXNlIEZJVF9SR0IxNjoKCQkJCQlicmVhazsKCQkJCWNhc2UgRklUX1JHQkExNjoKCQkJCQlicmVhazsKCQkJCWNhc2UgRklUX1JHQkY6CgkJCQkJYnJlYWs7CgkJCQljYXNlIEZJVF9SR0JBRjoKCQkJCQlicmVhazsKCQkJfQoJCQlicmVhazsKCQljYXNlIEZJVF9DT01QTEVYOgoJCQlzd2l0Y2goZHN0X3R5cGUpIHsKCQkJCWNhc2UgRklUX0JJVE1BUDoKCQkJCQlicmVhazsKCQkJCWNhc2UgRklUX1VJTlQxNjoKCQkJCQlicmVhazsKCQkJCWNhc2UgRklUX0lOVDE2OgoJCQkJCWJyZWFrOwoJCQkJY2FzZSBGSVRfVUlOVDMyOgoJCQkJCWJyZWFrOwoJCQkJY2FzZSBGSVRfSU5UMzI6CgkJCQkJYnJlYWs7CgkJCQljYXNlIEZJVF9GTE9BVDoKCQkJCQlicmVhazsKCQkJCWNhc2UgRklUX0RPVUJMRToKCQkJCQlicmVhazsKCQkJCWNhc2UgRklUX1JHQjE2OgoJCQkJCWJyZWFrOwoJCQkJY2FzZSBGSVRfUkdCQTE2OgoJCQkJCWJyZWFrOwoJCQkJY2FzZSBGSVRfUkdCRjoKCQkJCQlicmVhazsKCQkJCWNhc2UgRklUX1JHQkFGOgoJCQkJCWJyZWFrOwoJCQl9CgkJCWJyZWFrOwoJCWNhc2UgRklUX1JHQjE2OgoJCQlzd2l0Y2goZHN0X3R5cGUpIHsKCQkJCWNhc2UgRklUX0JJVE1BUDoKCQkJCQlkc3QgPSBGcmVlSW1hZ2VfQ29udmVydFRvMjRCaXRzKHNyYyk7CgkJCQkJYnJlYWs7CgkJCQljYXNlIEZJVF9VSU5UMTY6CgkJCQkJZHN0ID0gRnJlZUltYWdlX0NvbnZlcnRUb1VJTlQxNihzcmMpOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSBGSVRfSU5UMTY6CgkJCQkJYnJlYWs7CgkJCQljYXNlIEZJVF9VSU5UMzI6CgkJCQkJYnJlYWs7CgkJCQljYXNlIEZJVF9JTlQzMjoKCQkJCQlicmVhazsKCQkJCWNhc2UgRklUX0ZMT0FUOgoJCQkJCWRzdCA9IEZyZWVJbWFnZV9Db252ZXJ0VG9GbG9hdChzcmMpOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSBGSVRfRE9VQkxFOgoJCQkJCWJyZWFrOwoJCQkJY2FzZSBGSVRfQ09NUExFWDoKCQkJCQlicmVhazsKCQkJCWNhc2UgRklUX1JHQkExNjoKCQkJCQlkc3QgPSBGcmVlSW1hZ2VfQ29udmVydFRvUkdCQTE2KHNyYyk7CgkJCQkJYnJlYWs7CgkJCQljYXNlIEZJVF9SR0JGOgoJCQkJCWRzdCA9IEZyZWVJbWFnZV9Db252ZXJ0VG9SR0JGKHNyYyk7CgkJCQkJYnJlYWs7CgkJCQljYXNlIEZJVF9SR0JBRjoKCQkJCQlkc3QgPSBGcmVlSW1hZ2VfQ29udmVydFRvUkdCQUYoc3JjKTsKCQkJCQlicmVhazsKCQkJfQoJCQlicmVhazsKCQljYXNlIEZJVF9SR0JBMTY6CgkJCXN3aXRjaChkc3RfdHlwZSkgewoJCQkJY2FzZSBGSVRfQklUTUFQOgoJCQkJCWRzdCA9IEZyZWVJbWFnZV9Db252ZXJ0VG8zMkJpdHMoc3JjKTsKCQkJCQlicmVhazsKCQkJCWNhc2UgRklUX1VJTlQxNjoKCQkJCQlkc3QgPSBGcmVlSW1hZ2VfQ29udmVydFRvVUlOVDE2KHNyYyk7CgkJCQkJYnJlYWs7CgkJCQljYXNlIEZJVF9JTlQxNjoKCQkJCQlicmVhazsKCQkJCWNhc2UgRklUX1VJTlQzMjoKCQkJCQlicmVhazsKCQkJCWNhc2UgRklUX0lOVDMyOgoJCQkJCWJyZWFrOwoJCQkJY2FzZSBGSVRfRkxPQVQ6CgkJCQkJZHN0ID0gRnJlZUltYWdlX0NvbnZlcnRUb0Zsb2F0KHNyYyk7CgkJCQkJYnJlYWs7CgkJCQljYXNlIEZJVF9ET1VCTEU6CgkJCQkJYnJlYWs7CgkJCQljYXNlIEZJVF9DT01QTEVYOgoJCQkJCWJyZWFrOwoJCQkJY2FzZSBGSVRfUkdCMTY6CgkJCQkJZHN0ID0gRnJlZUltYWdlX0NvbnZlcnRUb1JHQjE2KHNyYyk7CgkJCQkJYnJlYWs7CgkJCQljYXNlIEZJVF9SR0JGOgoJCQkJCWRzdCA9IEZyZWVJbWFnZV9Db252ZXJ0VG9SR0JGKHNyYyk7CgkJCQkJYnJlYWs7CgkJCQljYXNlIEZJVF9SR0JBRjoKCQkJCQlkc3QgPSBGcmVlSW1hZ2VfQ29udmVydFRvUkdCQUYoc3JjKTsKCQkJCQlicmVhazsKCQkJfQoJCQlicmVhazsKCQljYXNlIEZJVF9SR0JGOgoJCQlzd2l0Y2goZHN0X3R5cGUpIHsKCQkJCWNhc2UgRklUX0JJVE1BUDoKCQkJCQlicmVhazsKCQkJCWNhc2UgRklUX1VJTlQxNjoKCQkJCQlicmVhazsKCQkJCWNhc2UgRklUX0lOVDE2OgoJCQkJCWJyZWFrOwoJCQkJY2FzZSBGSVRfVUlOVDMyOgoJCQkJCWJyZWFrOwoJCQkJY2FzZSBGSVRfSU5UMzI6CgkJCQkJYnJlYWs7CgkJCQljYXNlIEZJVF9GTE9BVDoKCQkJCQlkc3QgPSBGcmVlSW1hZ2VfQ29udmVydFRvRmxvYXQoc3JjKTsKCQkJCQlicmVhazsKCQkJCWNhc2UgRklUX0RPVUJMRToKCQkJCQlicmVhazsKCQkJCWNhc2UgRklUX0NPTVBMRVg6CgkJCQkJYnJlYWs7CgkJCQljYXNlIEZJVF9SR0IxNjoKCQkJCQlicmVhazsKCQkJCWNhc2UgRklUX1JHQkExNjoKCQkJCQlicmVhazsKCQkJCWNhc2UgRklUX1JHQkFGOgoJCQkJCWRzdCA9IEZyZWVJbWFnZV9Db252ZXJ0VG9SR0JBRihzcmMpOwoJCQkJCWJyZWFrOwoJCQl9CgkJCWJyZWFrOwoJCWNhc2UgRklUX1JHQkFGOgoJCQlzd2l0Y2goZHN0X3R5cGUpIHsKCQkJCWNhc2UgRklUX0JJVE1BUDoKCQkJCQlicmVhazsKCQkJCWNhc2UgRklUX1VJTlQxNjoKCQkJCQlicmVhazsKCQkJCWNhc2UgRklUX0lOVDE2OgoJCQkJCWJyZWFrOwoJCQkJY2FzZSBGSVRfVUlOVDMyOgoJCQkJCWJyZWFrOwoJCQkJY2FzZSBGSVRfSU5UMzI6CgkJCQkJYnJlYWs7CgkJCQljYXNlIEZJVF9GTE9BVDoKCQkJCQlkc3QgPSBGcmVlSW1hZ2VfQ29udmVydFRvRmxvYXQoc3JjKTsKCQkJCQlicmVhazsKCQkJCWNhc2UgRklUX0RPVUJMRToKCQkJCQlicmVhazsKCQkJCWNhc2UgRklUX0NPTVBMRVg6CgkJCQkJYnJlYWs7CgkJCQljYXNlIEZJVF9SR0IxNjoKCQkJCQlicmVhazsKCQkJCWNhc2UgRklUX1JHQkExNjoKCQkJCQlicmVhazsKCQkJCWNhc2UgRklUX1JHQkY6CgkJCQkJZHN0ID0gRnJlZUltYWdlX0NvbnZlcnRUb1JHQkYoc3JjKTsKCQkJCQlicmVhazsKCQkJfQoJCQlicmVhazsKCX0KCglpZihOVUxMID09IGRzdCkgewoJCUZyZWVJbWFnZV9PdXRwdXRNZXNzYWdlUHJvYyhGSUZfVU5LTk9XTiwgIkZSRUVfSU1BR0VfVFlQRTogVW5hYmxlIHRvIGNvbnZlcnQgZnJvbSB0eXBlICVkIHRvIHR5cGUgJWQuXG4gTm8gc3VjaCBjb252ZXJzaW9uIGV4aXN0cy4iLCBzcmNfdHlwZSwgZHN0X3R5cGUpOwoJfSBlbHNlIHsKCQkvLyBjb3B5IG1ldGFkYXRhIGZyb20gc3JjIHRvIGRzdAoJCUZyZWVJbWFnZV9DbG9uZU1ldGFkYXRhKGRzdCwgc3JjKTsKCX0KCglyZXR1cm4gZHN0Owp9Cg==