Ly8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyBUb25lIG1hcHBpbmcgb3BlcmF0b3IgKFJlaW5oYXJkLCAyMDA1KQovLwovLyBEZXNpZ24gYW5kIGltcGxlbWVudGF0aW9uIGJ5Ci8vIC0gSGVydukgRHJvbG9uIChkcm9sb25AaW5mb25pZS5mcikKLy8gLSBNaWhhaWwgTmF5ZGVub3YgKG1uYXlkZW5vdkB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQpCi8vCi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZyZWVJbWFnZSAzCi8vCi8vIENPVkVSRUQgQ09ERSBJUyBQUk9WSURFRCBVTkRFUiBUSElTIExJQ0VOU0UgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5UWQovLyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgV0FSUkFOVElFUwovLyBUSEFUIFRIRSBDT1ZFUkVEIENPREUgSVMgRlJFRSBPRiBERUZFQ1RTLCBNRVJDSEFOVEFCTEUsIEZJVCBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKLy8gT1IgTk9OLUlORlJJTkdJTkcuIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIENPVkVSRUQKLy8gQ09ERSBJUyBXSVRIIFlPVS4gU0hPVUxEIEFOWSBDT1ZFUkVEIENPREUgUFJPVkUgREVGRUNUSVZFIElOIEFOWSBSRVNQRUNULCBZT1UgKE5PVAovLyBUSEUgSU5JVElBTCBERVZFTE9QRVIgT1IgQU5ZIE9USEVSIENPTlRSSUJVVE9SKSBBU1NVTUUgVEhFIENPU1QgT0YgQU5ZIE5FQ0VTU0FSWQovLyBTRVJWSUNJTkcsIFJFUEFJUiBPUiBDT1JSRUNUSU9OLiBUSElTIERJU0NMQUlNRVIgT0YgV0FSUkFOVFkgQ09OU1RJVFVURVMgQU4gRVNTRU5USUFMCi8vIFBBUlQgT0YgVEhJUyBMSUNFTlNFLiBOTyBVU0UgT0YgQU5ZIENPVkVSRUQgQ09ERSBJUyBBVVRIT1JJWkVEIEhFUkVVTkRFUiBFWENFUFQgVU5ERVIKLy8gVEhJUyBESVNDTEFJTUVSLgovLwovLyBVc2UgYXQgeW91ciBvd24gcmlzayEKLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKI2luY2x1ZGUgPGNtYXRoPgoKI2luY2x1ZGUgIkZyZWVJbWFnZS5oIgojaW5jbHVkZSAiVXRpbGl0aWVzLmgiCiNpbmNsdWRlICJUb25lTWFwcGluZy5oIgoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBHbG9iYWwgYW5kL29yIGxvY2FsIHRvbmUgbWFwcGluZyBvcGVyYXRvcgovLyBSZWZlcmVuY2VzOiAKLy8gWzFdIEVyaWsgUmVpbmhhcmQgYW5kIEthdGUgRGV2bGluLCAnRHluYW1pYyBSYW5nZSBSZWR1Y3Rpb24gSW5zcGlyZWQgYnkgUGhvdG9yZWNlcHRvciBQaHlzaW9sb2d5JywgCi8vICAgICBJRUVFIFRyYW5zYWN0aW9ucyBvbiBWaXN1YWxpemF0aW9uIGFuZCBDb21wdXRlciBHcmFwaGljcywgMTEoMSksIEphbi9GZWIgMjAwNS4gCi8vIFsyXSBFcmlrIFJlaW5oYXJkLCAnUGFyYW1ldGVyIGVzdGltYXRpb24gZm9yIHBob3RvZ3JhcGhpYyB0b25lIHJlcHJvZHVjdGlvbicsCi8vICAgICBKb3VybmFsIG9mIEdyYXBoaWNzIFRvb2xzLCB2b2wuIDcsIG5vLiAxLCBwcC4gNDWWNTEsIDIwMDMuCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi8qKgpUb25lIG1hcHBpbmcgb3BlcmF0b3IKQHBhcmFtIGRpYiBJbnB1dCAvIE91dHB1dCBSR0JGIGltYWdlCkBwYXJhbSBZIElucHV0IGx1bWluYW5jZSBpbWFnZSB2ZXJzaW9uIG9mIGRpYgpAcGFyYW0gZiBPdmVyYWxsIGludGVuc2l0eSBpbiByYW5nZSBbLTg6OF0gOiBkZWZhdWx0IHRvIDAKQHBhcmFtIG0gQ29udHJhc3QgaW4gcmFuZ2UgWzAuMzoxKSA6IGRlZmF1bHQgdG8gMApAcGFyYW0gYSBBZGFwdGF0aW9uIGluIHJhbmdlIFswOjFdIDogZGVmYXVsdCB0byAxCkBwYXJhbSBjIENvbG9yIGNvcnJlY3Rpb24gaW4gcmFuZ2UgWzA6MV0gOiBkZWZhdWx0IHRvIDAKQHJldHVybiBSZXR1cm5zIFRSVUUgaWYgc3VjY2Vzc2Z1bCwgcmV0dXJucyBGQUxTRSBvdGhlcndpc2UKQHNlZSBMdW1pbmFuY2VGcm9tWQoqLwpzdGF0aWMgQk9PTCAKVG9uZU1hcHBpbmdSZWluaGFyZDA1KEZJQklUTUFQICpkaWIsIEZJQklUTUFQICpZLCBmbG9hdCBmLCBmbG9hdCBtLCBmbG9hdCBhLCBmbG9hdCBjKSB7CglmbG9hdCBDYXZbM107CQkvLyBjaGFubmVsIGF2ZXJhZ2UKCWZsb2F0IExhdiA9IDA7CQkvLyBhdmVyYWdlIGx1bWluYW5jZQoJZmxvYXQgTGxhdiA9IDA7CQkvLyBsb2cgYXZlcmFnZSBsdW1pbmFuY2UKCWZsb2F0IG1pbkx1bSA9IDE7CS8vIG1pbiBsdW1pbmFuY2UKCWZsb2F0IG1heEx1bSA9IDE7CS8vIG1heCBsdW1pbmFuY2UKCglmbG9hdCBMOwkJLy8gcGl4ZWwgbHVtaW5hbmNlCglmbG9hdCBJX2csIElfbDsgLy8gZ2xvYmFsIGFuZCBsb2NhbCBsaWdodCBhZGFwdGF0aW9uCglmbG9hdCBJX2E7CQkvLyBpbnRlcnBvbGF0ZWQgcGl4ZWwgbGlnaHQgYWRhcHRhdGlvbgoJZmxvYXQgazsJCS8vIGtleSAobG93LWtleSBtZWFucyBvdmVyYWxsIGRhcmsgaW1hZ2UsIGhpZ2gta2V5IG1lYW5zIG92ZXJhbGwgbGlnaHQgaW1hZ2UpCgoJLy8gY2hlY2sgaW5wdXQgcGFyYW1ldGVycyAKCglpZigoRnJlZUltYWdlX0dldEltYWdlVHlwZShkaWIpICE9IEZJVF9SR0JGKSB8fCAoRnJlZUltYWdlX0dldEltYWdlVHlwZShZKSAhPSBGSVRfRkxPQVQpKSB7CgkJcmV0dXJuIEZBTFNFOwoJfQoKCWlmKGYgPCAtOCkgZiA9IC04OyBpZihmID4gOCkgZiA9IDg7CiAgICBpZihtIDwgMCkgIG0gPSAwOyAgaWYobSA+IDEpIG0gPSAxOwogICAgaWYoYSA8IDApICBhID0gMDsgIGlmKGEgPiAxKSBhID0gMTsKICAgIGlmKGMgPCAwKSAgYyA9IDA7ICBpZihjID4gMSkgYyA9IDE7CgoJY29uc3QgdW5zaWduZWQgd2lkdGggID0gRnJlZUltYWdlX0dldFdpZHRoKGRpYik7Cgljb25zdCB1bnNpZ25lZCBoZWlnaHQgPSBGcmVlSW1hZ2VfR2V0SGVpZ2h0KGRpYik7CgoJY29uc3QgdW5zaWduZWQgZGliX3BpdGNoICA9IEZyZWVJbWFnZV9HZXRQaXRjaChkaWIpOwoJY29uc3QgdW5zaWduZWQgeV9waXRjaCAgICA9IEZyZWVJbWFnZV9HZXRQaXRjaChZKTsKCglpbnQgaTsKCXVuc2lnbmVkIHgsIHk7CglCWVRFICpiaXRzID0gTlVMTCwgKlliaXRzID0gTlVMTDsKCgkvLyBnZXQgc3RhdGlzdGljcyBhYm91dCB0aGUgZGF0YSAoYnV0IG9ubHkgaWYgaXRzIHJlYWxseSBuZWVkZWQpCgogICAgICAgIGYgPSBzdGQ6OmV4cCgtZik7CiAgICAgICAgaWYgKChtID09IDApIHx8IChhICE9IDEpICYmIChjICE9IDEpKSB7CiAgICAgICAgICAvLyBhdm9pZCB0aGVzZSBjYWxjdWxhdGlvbnMgaWYgaXRzIG5vdCBuZWVkZWQgYWZ0ZXIgLi4uCiAgICAgICAgICBMdW1pbmFuY2VGcm9tWShZLCAmbWF4THVtLCAmbWluTHVtLCAmTGF2LCAmTGxhdik7CiAgICAgICAgICBrID0gKHN0ZDo6bG9nKG1heEx1bSkgLSBMbGF2KSAvIChzdGQ6OmxvZyhtYXhMdW0pIC0gc3RkOjpsb2cobWluTHVtKSk7CiAgICAgICAgICBpZiAoayA8IDApIHsKICAgICAgICAgICAgLy8gcG93KGssIDEuNEYpIGlzIHVuZGVmaW5lZCAuLi4KICAgICAgICAgICAgLy8gdGhlcmUncyBhbiBhbWJpZ3VpdHkgYWJvdXQgdGhlIGNhbGN1bGF0aW9uIG9mIExsYXYgYmV0d2VlbgogICAgICAgICAgICAvLyBSZWluaGFyZCBwYXBlcnMgYW5kIHRoZSB2YXJpb3VzIGltcGxlbWVudGF0aW9ucyAgLi4uIHRyeSBhbm90aGVyCiAgICAgICAgICAgIC8vIHdvcmxkIGFkYXB0YXRpb24gbHVtaW5hbmNlIGZvcm11bGEgdXNpbmcgaW5zdGVhZCAnd29ybGRMdW0gPQogICAgICAgICAgICAvLyBsb2coTGxhdiknCiAgICAgICAgICAgIGsgPSAoc3RkOjpsb2cobWF4THVtKSAtIHN0ZDo6bG9nKExsYXYpKSAvCiAgICAgICAgICAgICAgICAoc3RkOjpsb2cobWF4THVtKSAtIHN0ZDo6bG9nKG1pbkx1bSkpOwogICAgICAgICAgICBpZiAoayA8IDApIG0gPSAwLjNGOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBtID0gKG0gPiAwKSA/IG0gOiAoZmxvYXQpKDAuMyArIDAuNyAqIHN0ZDo6cG93KGssIDEuNEYpKTsKCiAgICAgICAgZmxvYXQgbWF4X2NvbG9yID0gLTFlNkY7CglmbG9hdCBtaW5fY29sb3IgPSArMWU2RjsKCgkvLyB0b25lIG1hcCBpbWFnZQoKCWJpdHMgID0gKEJZVEUqKUZyZWVJbWFnZV9HZXRCaXRzKGRpYik7CglZYml0cyA9IChCWVRFKilGcmVlSW1hZ2VfR2V0Qml0cyhZKTsKCglpZigoYSA9PSAxKSAmJiAoYyA9PSAwKSkgewoJCS8vIHdoZW4gdXNpbmcgZGVmYXVsdCB2YWx1ZXMsIHVzZSBhIGZhc3Rlc3QgY29kZQoKCQlmb3IoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgewoJCQlmbG9hdCAqWSAgICAgPSAoZmxvYXQqKVliaXRzOwoJCQlmbG9hdCAqY29sb3IgPSAoZmxvYXQqKWJpdHM7CgoJCQlmb3IoeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CgkJCQlJX2EgPSBZW3hdOwkvLyBsdW1pbmFuY2UoeCwgeSkKCQkJCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb2xvciAvPSAoKmNvbG9yICsgc3RkOjpwb3coZiAqIElfYSwgbSkpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9jb2xvciA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpjb2xvciA+IG1heF9jb2xvcikgPyAqY29sb3IgOiBtYXhfY29sb3I7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5fY29sb3IgPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqY29sb3IgPCBtaW5fY29sb3IpID8gKmNvbG9yIDogbWluX2NvbG9yOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yKys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoJCQl9CgkJCS8vIG5leHQgbGluZQoJCQliaXRzICArPSBkaWJfcGl0Y2g7CgkJCVliaXRzICs9IHlfcGl0Y2g7CgkJfQoJfSBlbHNlIHsKCQkvLyBjb21wbGV0ZSBhbGdvcml0aG0KCgkJLy8gY2hhbm5lbCBhdmVyYWdlcwoKCQlDYXZbMF0gPSBDYXZbMV0gPSBDYXZbMl0gPSAwOwoJCWlmKChhICE9IDEpICYmIChjICE9IDApKSB7CgkJCS8vIGNoYW5uZWwgYXZlcmFnZXMgYXJlIG5vdCBuZWVkZWQgd2hlbiAoYSA9PSAxKSBvciAoYyA9PSAwKQoJCQliaXRzID0gKEJZVEUqKUZyZWVJbWFnZV9HZXRCaXRzKGRpYik7CgkJCWZvcih5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CgkJCQlmbG9hdCAqY29sb3IgPSAoZmxvYXQqKWJpdHM7CgkJCQlmb3IoeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CgkJCQkJZm9yKGkgPSAwOyBpIDwgMzsgaSsrKSB7CgkJCQkJCUNhdltpXSArPSAqY29sb3I7CgkJCQkJCWNvbG9yKys7CgkJCQkJfQoJCQkJfQoJCQkJLy8gbmV4dCBsaW5lCgkJCQliaXRzICs9IGRpYl9waXRjaDsKCQkJfQoJCQljb25zdCBmbG9hdCBpbWFnZV9zaXplID0gKGZsb2F0KXdpZHRoICogaGVpZ2h0OwoJCQlmb3IoaSA9IDA7IGkgPCAzOyBpKyspIHsKCQkJCUNhdltpXSAvPSBpbWFnZV9zaXplOwoJCQl9CgkJfQoKCQkvLyBwZXJmb3JtIHRvbmUgbWFwcGluZwoKCQliaXRzID0gKEJZVEUqKUZyZWVJbWFnZV9HZXRCaXRzKGRpYik7CgkJZm9yKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKCQkJY29uc3QgZmxvYXQgKlkgICAgID0gKGZsb2F0KilZYml0czsKCQkJZmxvYXQgKmNvbG9yID0gKGZsb2F0KiliaXRzOwoKCQkJZm9yKHggPSAwOyB4IDwgd2lkdGg7IHgrKykgewoJCQkJTCA9IFlbeF07CS8vIGx1bWluYW5jZSh4LCB5KQoJCQkJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgewoJCQkJCUlfbCA9IGMgKiAqY29sb3IgKyAoMS1jKSAqIEw7CgkJCQkJSV9nID0gYyAqIENhdltpXSArICgxLWMpICogTGF2OwoJCQkJCUlfYSA9IGEgKiBJX2wgKyAoMS1hKSAqIElfZzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb2xvciAvPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqY29sb3IgKyBzdGQ6OnBvdyhmICogSV9hLCBtKSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2NvbG9yID0gKCpjb2xvciA+IG1heF9jb2xvcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICpjb2xvcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbWF4X2NvbG9yOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluX2NvbG9yID0gKCpjb2xvciA8IG1pbl9jb2xvcikgPyAqY29sb3IgOiBtaW5fY29sb3I7CgoJCQkJCWNvbG9yKys7CgkJCQl9CgkJCX0KCQkJLy8gbmV4dCBsaW5lCgkJCWJpdHMgICs9IGRpYl9waXRjaDsKCQkJWWJpdHMgKz0geV9waXRjaDsKCQl9Cgl9CgoJLy8gbm9ybWFsaXplIGludGVuc2l0aWVzCgoJaWYobWF4X2NvbG9yICE9IG1pbl9jb2xvcikgewoJCWJpdHMgPSAoQllURSopRnJlZUltYWdlX0dldEJpdHMoZGliKTsKCQljb25zdCBmbG9hdCByYW5nZSA9IG1heF9jb2xvciAtIG1pbl9jb2xvcjsKCQlmb3IoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgewoJCQlmbG9hdCAqY29sb3IgPSAoZmxvYXQqKWJpdHM7CgkJCWZvcih4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKCQkJCWZvcihpID0gMDsgaSA8IDM7IGkrKykgewoJCQkJCSpjb2xvciA9ICgqY29sb3IgLSBtaW5fY29sb3IpIC8gcmFuZ2U7CgkJCQkJY29sb3IrKzsKCQkJCX0KCQkJfQoJCQkvLyBuZXh0IGxpbmUKCQkJYml0cyArPSBkaWJfcGl0Y2g7CgkJfQoJfQoKCXJldHVybiBUUlVFOwp9CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vICBNYWluIGFsZ29yaXRobQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgovKioKQXBwbHkgdGhlIGdsb2JhbC9sb2NhbCB0b25lIG1hcHBpbmcgb3BlcmF0b3IgdG8gYSBSR0JGIGltYWdlIGFuZCBjb252ZXJ0IHRvIDI0LWJpdCBSR0I8YnI+ClVzZXIgcGFyYW1ldGVycyBjb250cm9sIGludGVuc2l0eSwgY29udHJhc3QsIGFuZCBsZXZlbCBvZiBhZGFwdGF0aW9uCkBwYXJhbSBzcmMgSW5wdXQgUkdCRiBpbWFnZQpAcGFyYW0gaW50ZW5zaXR5IE92ZXJhbGwgaW50ZW5zaXR5IGluIHJhbmdlIFstODo4XSA6IGRlZmF1bHQgdG8gMApAcGFyYW0gY29udHJhc3QgQ29udHJhc3QgaW4gcmFuZ2UgWzAuMzoxKSA6IGRlZmF1bHQgdG8gMApAcGFyYW0gYWRhcHRhdGlvbiBBZGFwdGF0aW9uIGluIHJhbmdlIFswOjFdIDogZGVmYXVsdCB0byAxCkBwYXJhbSBjb2xvcl9jb3JyZWN0aW9uIENvbG9yIGNvcnJlY3Rpb24gaW4gcmFuZ2UgWzA6MV0gOiBkZWZhdWx0IHRvIDAKQHJldHVybiBSZXR1cm5zIGEgMjQtYml0IFJHQiBpbWFnZSBpZiBzdWNjZXNzZnVsLCByZXR1cm5zIE5VTEwgb3RoZXJ3aXNlCiovCkZJQklUTUFQKiBETExfQ0FMTENPTlYgCkZyZWVJbWFnZV9UbW9SZWluaGFyZDA1RXgoRklCSVRNQVAgKnNyYywgZG91YmxlIGludGVuc2l0eSwgZG91YmxlIGNvbnRyYXN0LCBkb3VibGUgYWRhcHRhdGlvbiwgZG91YmxlIGNvbG9yX2NvcnJlY3Rpb24pIHsKCWlmKCFGcmVlSW1hZ2VfSGFzUGl4ZWxzKHNyYykpIHJldHVybiBOVUxMOwoKCS8vIHdvcmtpbmcgUkdCRiB2YXJpYWJsZQoJRklCSVRNQVAgKmRpYiA9IE5VTEwsICpZID0gTlVMTDsKCglkaWIgPSBGcmVlSW1hZ2VfQ29udmVydFRvUkdCRihzcmMpOwoJaWYoIWRpYikgcmV0dXJuIE5VTEw7CgoJLy8gZ2V0IHRoZSBMdW1pbmFuY2UgY2hhbm5lbAoJWSA9IENvbnZlcnRSR0JGVG9ZKGRpYik7CglpZighWSkgewoJCUZyZWVJbWFnZV9VbmxvYWQoZGliKTsKCQlyZXR1cm4gTlVMTDsKCX0KCgkvLyBwZXJmb3JtIHRoZSB0b25lIG1hcHBpbmcKCVRvbmVNYXBwaW5nUmVpbmhhcmQwNShkaWIsIFksIChmbG9hdClpbnRlbnNpdHksIChmbG9hdCljb250cmFzdCwgKGZsb2F0KWFkYXB0YXRpb24sIChmbG9hdCljb2xvcl9jb3JyZWN0aW9uKTsKCS8vIG5vdCBuZWVkZWQgYW55bW9yZQoJRnJlZUltYWdlX1VubG9hZChZKTsKCS8vIGNsYW1wIGltYWdlIGhpZ2hlc3QgdmFsdWVzIHRvIGRpc3BsYXkgd2hpdGUsIHRoZW4gY29udmVydCB0byAyNC1iaXQgUkdCCglGSUJJVE1BUCAqZHN0ID0gQ2xhbXBDb252ZXJ0UkdCRlRvMjQoZGliKTsKCgkvLyBjbGVhbi11cCBhbmQgcmV0dXJuCglGcmVlSW1hZ2VfVW5sb2FkKGRpYik7CgoJLy8gY29weSBtZXRhZGF0YSBmcm9tIHNyYyB0byBkc3QKCUZyZWVJbWFnZV9DbG9uZU1ldGFkYXRhKGRzdCwgc3JjKTsKCglyZXR1cm4gZHN0Owp9CgovKioKQXBwbHkgdGhlIGdsb2JhbCB0b25lIG1hcHBpbmcgb3BlcmF0b3IgdG8gYSBSR0JGIGltYWdlIGFuZCBjb252ZXJ0IHRvIDI0LWJpdCBSR0I8YnI+ClVzZXIgcGFyYW1ldGVycyBjb250cm9sIGludGVuc2l0eSBhbmQgY29udHJhc3QKQHBhcmFtIHNyYyBJbnB1dCBSR0JGIGltYWdlCkBwYXJhbSBpbnRlbnNpdHkgT3ZlcmFsbCBpbnRlbnNpdHkgaW4gcmFuZ2UgWy04OjhdIDogZGVmYXVsdCB0byAwCkBwYXJhbSBjb250cmFzdCBDb250cmFzdCBpbiByYW5nZSBbMC4zOjEpIDogZGVmYXVsdCB0byAwCkByZXR1cm4gUmV0dXJucyBhIDI0LWJpdCBSR0IgaW1hZ2UgaWYgc3VjY2Vzc2Z1bCwgcmV0dXJucyBOVUxMIG90aGVyd2lzZQoqLwpGSUJJVE1BUCogRExMX0NBTExDT05WIApGcmVlSW1hZ2VfVG1vUmVpbmhhcmQwNShGSUJJVE1BUCAqc3JjLCBkb3VibGUgaW50ZW5zaXR5LCBkb3VibGUgY29udHJhc3QpIHsKCXJldHVybiBGcmVlSW1hZ2VfVG1vUmVpbmhhcmQwNUV4KHNyYywgaW50ZW5zaXR5LCBjb250cmFzdCwgMSwgMCk7Cn0K