Ly8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyBNZXRhZGF0YSBmdW5jdGlvbnMgaW1wbGVtZW50YXRpb24KLy8KLy8gRGVzaWduIGFuZCBpbXBsZW1lbnRhdGlvbiBieQovLyAtIEhlcnbpIERyb2xvbiAoZHJvbG9uQGluZm9uaWUuZnIpCi8vCi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZyZWVJbWFnZSAzCi8vCi8vIENPVkVSRUQgQ09ERSBJUyBQUk9WSURFRCBVTkRFUiBUSElTIExJQ0VOU0UgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5UWQovLyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgV0FSUkFOVElFUwovLyBUSEFUIFRIRSBDT1ZFUkVEIENPREUgSVMgRlJFRSBPRiBERUZFQ1RTLCBNRVJDSEFOVEFCTEUsIEZJVCBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKLy8gT1IgTk9OLUlORlJJTkdJTkcuIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIENPVkVSRUQKLy8gQ09ERSBJUyBXSVRIIFlPVS4gU0hPVUxEIEFOWSBDT1ZFUkVEIENPREUgUFJPVkUgREVGRUNUSVZFIElOIEFOWSBSRVNQRUNULCBZT1UgKE5PVAovLyBUSEUgSU5JVElBTCBERVZFTE9QRVIgT1IgQU5ZIE9USEVSIENPTlRSSUJVVE9SKSBBU1NVTUUgVEhFIENPU1QgT0YgQU5ZIE5FQ0VTU0FSWQovLyBTRVJWSUNJTkcsIFJFUEFJUiBPUiBDT1JSRUNUSU9OLiBUSElTIERJU0NMQUlNRVIgT0YgV0FSUkFOVFkgQ09OU1RJVFVURVMgQU4gRVNTRU5USUFMCi8vIFBBUlQgT0YgVEhJUyBMSUNFTlNFLiBOTyBVU0UgT0YgQU5ZIENPVkVSRUQgQ09ERSBJUyBBVVRIT1JJWkVEIEhFUkVVTkRFUiBFWENFUFQgVU5ERVIKLy8gVEhJUyBESVNDTEFJTUVSLgovLwovLyBVc2UgYXQgeW91ciBvd24gcmlzayEKLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKI2lmZGVmIF9NU0NfVkVSIAojcHJhZ21hIHdhcm5pbmcgKGRpc2FibGUgOiA0Nzg2KSAvLyBpZGVudGlmaWVyIHdhcyB0cnVuY2F0ZWQgdG8gJ251bWJlcicgY2hhcmFjdGVycwojZW5kaWYKCiNpbmNsdWRlICJGcmVlSW1hZ2UuaCIKI2luY2x1ZGUgIlV0aWxpdGllcy5oIgojaW5jbHVkZSAiRnJlZUltYWdlVGFnLmgiCgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vICAgSVBUQyBKUEVHIC8gVElGRiBtYXJrZXJzIHJvdXRpbmVzCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCnN0YXRpYyBjb25zdCBjaGFyKiBJUFRDX0RFTElNSVRFUiA9ICI7IjsJLy8ga2V5d29yZHMvc3VwcGxlbWVudGFsIGNhdGVnb3J5IGRlbGltaXRlcgovKioKCVJlYWQgYW5kIGRlY29kZSBJUFRDIGJpbmFyeSBkYXRhCiovCkJPT0wgCnJlYWRfaXB0Y19wcm9maWxlKEZJQklUTUFQICpkaWIsIGNvbnN0IEJZVEUgKmRhdGFwdHIsIHVuc2lnbmVkIGludCBkYXRhbGVuKSB7CgljaGFyIGRlZmF1bHRLZXlbMTZdOwoJc2l6ZV90IGxlbmd0aCA9IGRhdGFsZW47CglCWVRFICpwcm9maWxlID0gKEJZVEUqKWRhdGFwdHI7CgoJY29uc3QgY2hhciAqSlBFR19BZG9iZUNNX1RhZyA9ICJBZG9iZV9DTSI7CgoJc3RkOjpzdHJpbmcgS2V5d29yZHM7CglzdGQ6OnN0cmluZyBTdXBwbGVtZW50YWxDYXRlZ29yeTsKCglXT1JEIHRhZ19pZDsKCglpZighZGF0YXB0ciB8fCAoZGF0YWxlbiA9PSAwKSkgewoJCXJldHVybiBGQUxTRTsKCX0KCglpZihkYXRhbGVuID4gOCkgewoJCWlmKG1lbWNtcChKUEVHX0Fkb2JlQ01fVGFnLCBkYXRhcHRyLCA4KSA9PSAwKSB7CgkJCS8vIHRoZSAiQWRvYmVfQ00iIEFQUDEzIHNlZ21lbnQgcHJlc3VtYWJseSBjb250YWlucyBjb2xvciBtYW5hZ2VtZW50IGluZm9ybWF0aW9uLCAKCQkJLy8gYnV0IHRoZSBtZWFuaW5nIG9mIHRoZSBkYXRhIGlzIGN1cnJlbnRseSB1bmtub3duLiAKCQkJLy8gSWYgYW55b25lIGhhcyBhbiBpZGVhIGFib3V0IHdoYXQgdGhpcyBtZWFucywgcGxlYXNlIGxldCBtZSBrbm93LgoJCQlyZXR1cm4gRkFMU0U7CgkJfQoJfQoKCgkvLyBjcmVhdGUgYSB0YWcKCglGSVRBRyAqdGFnID0gRnJlZUltYWdlX0NyZWF0ZVRhZygpOwoKCVRhZ0xpYiYgdGFnX2xpYiA9IFRhZ0xpYjo6aW5zdGFuY2UoKTsKCiAgICAvLyBmaW5kIHN0YXJ0IG9mIHRoZSBCSU0gcG9ydGlvbiBvZiB0aGUgYmluYXJ5IGRhdGEKICAgIHNpemVfdCBvZmZzZXQgPSAwOwoJd2hpbGUob2Zmc2V0IDwgbGVuZ3RoIC0gMSkgewoJCWlmKChwcm9maWxlW29mZnNldF0gPT0gMHgxQykgJiYgKHByb2ZpbGVbb2Zmc2V0KzFdID09IDB4MDIpKQoJCQlicmVhazsKCQlvZmZzZXQrKzsKCX0KCiAgICAvLyBmb3IgZWFjaCB0YWcKICAgIHdoaWxlIChvZmZzZXQgPCBsZW5ndGgpIHsKCiAgICAgICAgLy8gaWRlbnRpZmllcyBzdGFydCBvZiBhIHRhZwogICAgICAgIGlmIChwcm9maWxlW29mZnNldF0gIT0gMHgxYykgewogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgLy8gd2UgbmVlZCBhdCBsZWFzdCBmaXZlIGJ5dGVzIGxlZnQgdG8gcmVhZCBhIHRhZwogICAgICAgIGlmICgob2Zmc2V0ICsgNSkgPj0gbGVuZ3RoKSB7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgICAgb2Zmc2V0Kys7CgoJCWludCBkaXJlY3RvcnlUeXBlCT0gcHJvZmlsZVtvZmZzZXQrK107CiAgICAgICAgaW50IHRhZ1R5cGUJCQk9IHByb2ZpbGVbb2Zmc2V0KytdOzsKICAgICAgICBpbnQgdGFnQnl0ZUNvdW50CT0gKChwcm9maWxlW29mZnNldF0gJiAweEZGKSA8PCA4KSB8IChwcm9maWxlW29mZnNldCArIDFdICYgMHhGRik7CiAgICAgICAgb2Zmc2V0ICs9IDI7CgogICAgICAgIGlmICgob2Zmc2V0ICsgdGFnQnl0ZUNvdW50KSA+IGxlbmd0aCkgewogICAgICAgICAgICAvLyBkYXRhIGZvciB0YWcgZXh0ZW5kcyBiZXlvbmQgZW5kIG9mIGlwdGMgc2VnbWVudAogICAgICAgICAgICBicmVhazsKICAgICAgICB9CgoJCWlmKHRhZ0J5dGVDb3VudCA9PSAwKSB7CgkJCS8vIGdvIHRvIG5leHQgdGFnCgkJCWNvbnRpbnVlOwoJCX0KCgkJLy8gcHJvY2VzcyB0aGUgdGFnCgoJCXRhZ19pZCA9IChXT1JEKSh0YWdUeXBlIHwgKGRpcmVjdG9yeVR5cGUgPDwgOCkpOwoKCQlGcmVlSW1hZ2VfU2V0VGFnSUQodGFnLCB0YWdfaWQpOwoJCUZyZWVJbWFnZV9TZXRUYWdMZW5ndGgodGFnLCB0YWdCeXRlQ291bnQpOwoKCQkvLyBhbGxvY2F0ZSBhIGJ1ZmZlciB0byBzdG9yZSB0aGUgdGFnIHZhbHVlCgkJQllURSAqaXB0Y192YWx1ZSA9IChCWVRFKiltYWxsb2MoKHRhZ0J5dGVDb3VudCArIDEpICogc2l6ZW9mKEJZVEUpKTsKCQltZW1zZXQoaXB0Y192YWx1ZSwgMCwgKHRhZ0J5dGVDb3VudCArIDEpICogc2l6ZW9mKEJZVEUpKTsKCgkJLy8gZ2V0IHRoZSB0YWcgdmFsdWUKCgkJc3dpdGNoICh0YWdfaWQpIHsKCQkJY2FzZSBUQUdfUkVDT1JEX1ZFUlNJT046CgkJCXsKCQkJCS8vIHNob3J0CgkJCQlGcmVlSW1hZ2VfU2V0VGFnVHlwZSh0YWcsIEZJRFRfU1NIT1JUKTsKCQkJCUZyZWVJbWFnZV9TZXRUYWdDb3VudCh0YWcsIDEpOwoJCQkJc2hvcnQgKnB2YWx1ZSA9IChzaG9ydCopJmlwdGNfdmFsdWVbMF07CgkJCQkqcHZhbHVlID0gKHNob3J0KSgocHJvZmlsZVtvZmZzZXRdIDw8IDgpIHwgcHJvZmlsZVtvZmZzZXQgKyAxXSk7CgkJCQlGcmVlSW1hZ2VfU2V0VGFnVmFsdWUodGFnLCBwdmFsdWUpOwoJCQkJYnJlYWs7CgkJCX0KCgkJCWNhc2UgVEFHX1JFTEVBU0VfREFURToKCQkJY2FzZSBUQUdfREFURV9DUkVBVEVEOgoJCQkJLy8gRGF0ZSBvYmplY3QKCQkJY2FzZSBUQUdfUkVMRUFTRV9USU1FOgoJCQljYXNlIFRBR19USU1FX0NSRUFURUQ6CgkJCQkvLyB0aW1lCgkJCWRlZmF1bHQ6CgkJCXsKCQkJCS8vIHN0cmluZwoJCQkJRnJlZUltYWdlX1NldFRhZ1R5cGUodGFnLCBGSURUX0FTQ0lJKTsKCQkJCUZyZWVJbWFnZV9TZXRUYWdDb3VudCh0YWcsIHRhZ0J5dGVDb3VudCk7CgkJCQlmb3IoaW50IGkgPSAwOyBpIDwgdGFnQnl0ZUNvdW50OyBpKyspIHsKCQkJCQlpcHRjX3ZhbHVlW2ldID0gcHJvZmlsZVtvZmZzZXQgKyBpXTsKCQkJCX0KCQkJCWlwdGNfdmFsdWVbdGFnQnl0ZUNvdW50XSA9ICdcMCc7CgkJCQlGcmVlSW1hZ2VfU2V0VGFnVmFsdWUodGFnLCAoY2hhciopJmlwdGNfdmFsdWVbMF0pOwoJCQkJYnJlYWs7CgkJCX0KCQl9CgoJCWlmKHRhZ19pZCA9PSBUQUdfU1VQUExFTUVOVEFMX0NBVEVHT1JJRVMpIHsKCQkJLy8gY29uY2F0ZW5hdGUgdGhlIGNhdGVnb3JpZXMKCQkJaWYoU3VwcGxlbWVudGFsQ2F0ZWdvcnkubGVuZ3RoKCkgPT0gMCkgewoJCQkJU3VwcGxlbWVudGFsQ2F0ZWdvcnkuYXBwZW5kKChjaGFyKilpcHRjX3ZhbHVlKTsKCQkJfSBlbHNlIHsKCQkJCVN1cHBsZW1lbnRhbENhdGVnb3J5LmFwcGVuZChJUFRDX0RFTElNSVRFUik7CgkJCQlTdXBwbGVtZW50YWxDYXRlZ29yeS5hcHBlbmQoKGNoYXIqKWlwdGNfdmFsdWUpOwoJCQl9CgkJfQoJCWVsc2UgaWYodGFnX2lkID09IFRBR19LRVlXT1JEUykgewoJCQkvLyBjb25jYXRlbmF0ZSB0aGUga2V5d29yZHMKCQkJaWYoS2V5d29yZHMubGVuZ3RoKCkgPT0gMCkgewoJCQkJS2V5d29yZHMuYXBwZW5kKChjaGFyKilpcHRjX3ZhbHVlKTsKCQkJfSBlbHNlIHsKCQkJCUtleXdvcmRzLmFwcGVuZChJUFRDX0RFTElNSVRFUik7CgkJCQlLZXl3b3Jkcy5hcHBlbmQoKGNoYXIqKWlwdGNfdmFsdWUpOwoJCQl9CgkJfQoJCWVsc2UgewoJCQkvLyBnZXQgdGhlIHRhZyBrZXkgYW5kIGRlc2NyaXB0aW9uCgkJCWNvbnN0IGNoYXIgKmtleSA9IHRhZ19saWIuZ2V0VGFnRmllbGROYW1lKFRhZ0xpYjo6SVBUQywgdGFnX2lkLCBkZWZhdWx0S2V5KTsKCQkJRnJlZUltYWdlX1NldFRhZ0tleSh0YWcsIGtleSk7CgkJCWNvbnN0IGNoYXIgKmRlc2NyaXB0aW9uID0gdGFnX2xpYi5nZXRUYWdEZXNjcmlwdGlvbihUYWdMaWI6OklQVEMsIHRhZ19pZCk7CgkJCUZyZWVJbWFnZV9TZXRUYWdEZXNjcmlwdGlvbih0YWcsIGRlc2NyaXB0aW9uKTsKCgkJCS8vIHN0b3JlIHRoZSB0YWcKCQkJaWYoa2V5KSB7CgkJCQlGcmVlSW1hZ2VfU2V0TWV0YWRhdGEoRklNRF9JUFRDLCBkaWIsIGtleSwgdGFnKTsKCQkJfQoJCX0KCgkJZnJlZShpcHRjX3ZhbHVlKTsKCiAgICAgICAgLy8gbmV4dCB0YWcKCQlvZmZzZXQgKz0gdGFnQnl0ZUNvdW50OwoKICAgIH0KCgkvLyBzdG9yZSB0aGUgJ2tleXdvcmRzJyB0YWcKCWlmKEtleXdvcmRzLmxlbmd0aCgpKSB7CgkJRnJlZUltYWdlX1NldFRhZ1R5cGUodGFnLCBGSURUX0FTQ0lJKTsKCQlGcmVlSW1hZ2VfU2V0VGFnSUQodGFnLCBUQUdfS0VZV09SRFMpOwoJCUZyZWVJbWFnZV9TZXRUYWdLZXkodGFnLCB0YWdfbGliLmdldFRhZ0ZpZWxkTmFtZShUYWdMaWI6OklQVEMsIFRBR19LRVlXT1JEUywgZGVmYXVsdEtleSkpOwoJCUZyZWVJbWFnZV9TZXRUYWdEZXNjcmlwdGlvbih0YWcsIHRhZ19saWIuZ2V0VGFnRGVzY3JpcHRpb24oVGFnTGliOjpJUFRDLCBUQUdfS0VZV09SRFMpKTsKCQlGcmVlSW1hZ2VfU2V0VGFnTGVuZ3RoKHRhZywgKERXT1JEKUtleXdvcmRzLmxlbmd0aCgpKTsKCQlGcmVlSW1hZ2VfU2V0VGFnQ291bnQodGFnLCAoRFdPUkQpS2V5d29yZHMubGVuZ3RoKCkpOwoJCUZyZWVJbWFnZV9TZXRUYWdWYWx1ZSh0YWcsIChjaGFyKilLZXl3b3Jkcy5jX3N0cigpKTsKCQlGcmVlSW1hZ2VfU2V0TWV0YWRhdGEoRklNRF9JUFRDLCBkaWIsIEZyZWVJbWFnZV9HZXRUYWdLZXkodGFnKSwgdGFnKTsKCX0KCgkvLyBzdG9yZSB0aGUgJ3N1cHBsZW1lbnRhbCBjYXRlZ29yeScgdGFnCglpZihTdXBwbGVtZW50YWxDYXRlZ29yeS5sZW5ndGgoKSkgewoJCUZyZWVJbWFnZV9TZXRUYWdUeXBlKHRhZywgRklEVF9BU0NJSSk7CgkJRnJlZUltYWdlX1NldFRhZ0lEKHRhZywgVEFHX1NVUFBMRU1FTlRBTF9DQVRFR09SSUVTKTsKCQlGcmVlSW1hZ2VfU2V0VGFnS2V5KHRhZywgdGFnX2xpYi5nZXRUYWdGaWVsZE5hbWUoVGFnTGliOjpJUFRDLCBUQUdfU1VQUExFTUVOVEFMX0NBVEVHT1JJRVMsIGRlZmF1bHRLZXkpKTsKCQlGcmVlSW1hZ2VfU2V0VGFnRGVzY3JpcHRpb24odGFnLCB0YWdfbGliLmdldFRhZ0Rlc2NyaXB0aW9uKFRhZ0xpYjo6SVBUQywgVEFHX1NVUFBMRU1FTlRBTF9DQVRFR09SSUVTKSk7CgkJRnJlZUltYWdlX1NldFRhZ0xlbmd0aCh0YWcsIChEV09SRClTdXBwbGVtZW50YWxDYXRlZ29yeS5sZW5ndGgoKSk7CgkJRnJlZUltYWdlX1NldFRhZ0NvdW50KHRhZywgKERXT1JEKVN1cHBsZW1lbnRhbENhdGVnb3J5Lmxlbmd0aCgpKTsKCQlGcmVlSW1hZ2VfU2V0VGFnVmFsdWUodGFnLCAoY2hhciopU3VwcGxlbWVudGFsQ2F0ZWdvcnkuY19zdHIoKSk7CgkJRnJlZUltYWdlX1NldE1ldGFkYXRhKEZJTURfSVBUQywgZGliLCBGcmVlSW1hZ2VfR2V0VGFnS2V5KHRhZyksIHRhZyk7Cgl9CgoJLy8gZGVsZXRlIHRoZSB0YWcKCglGcmVlSW1hZ2VfRGVsZXRlVGFnKHRhZyk7CgoJcmV0dXJuIFRSVUU7Cn0KCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpzdGF0aWMgQllURSogCmFwcGVuZF9pcHRjX3RhZyhCWVRFICpwcm9maWxlLCB1bnNpZ25lZCAqcHJvZmlsZV9zaXplLCBXT1JEIGlkLCBEV09SRCBsZW5ndGgsIGNvbnN0IHZvaWQgKnZhbHVlKSB7CglCWVRFICpidWZmZXIgPSBOVUxMOwoKCS8vIGNhbGN1bGF0ZSB0aGUgbmV3IGJ1ZmZlciBzaXplCglzaXplX3QgYnVmZmVyX3NpemUgPSAoNSArICpwcm9maWxlX3NpemUgKyBsZW5ndGgpICogc2l6ZW9mKEJZVEUpOwoJYnVmZmVyID0gKEJZVEUqKW1hbGxvYyhidWZmZXJfc2l6ZSk7CglpZighYnVmZmVyKQoJCXJldHVybiBOVUxMOwoKCS8vIGFkZCB0aGUgaGVhZGVyCglidWZmZXJbMF0gPSAweDFDOwoJYnVmZmVyWzFdID0gMHgwMjsKCS8vIGFkZCB0aGUgdGFnIHR5cGUKCWJ1ZmZlclsyXSA9IChCWVRFKShpZCAmIDB4MDBGRik7CgkvLyBhZGQgdGhlIHRhZyBsZW5ndGgKCWJ1ZmZlclszXSA9IChCWVRFKShsZW5ndGggPj4gOCk7CglidWZmZXJbNF0gPSAoQllURSkobGVuZ3RoICYgMHhGRik7CgkvLyBhZGQgdGhlIHRhZyB2YWx1ZQoJbWVtY3B5KGJ1ZmZlciArIDUsIChCWVRFKil2YWx1ZSwgbGVuZ3RoKTsKCS8vIGFwcGVuZCB0aGUgcHJldmlvdXMgcHJvZmlsZQoJaWYoTlVMTCA9PSBwcm9maWxlKQl7CgkJKnByb2ZpbGVfc2l6ZSA9ICg1ICsgbGVuZ3RoKTsKCX0KCWVsc2UgewoJCW1lbWNweShidWZmZXIgKyA1ICsgbGVuZ3RoLCBwcm9maWxlLCAqcHJvZmlsZV9zaXplKTsKCQkqcHJvZmlsZV9zaXplICs9ICg1ICsgbGVuZ3RoKTsKCQlmcmVlKHByb2ZpbGUpOwoJfQoJCglyZXR1cm4gYnVmZmVyOwp9CgovKioKRW5jb2RlIElQVEMgbWV0YWRhdGEgaW50byBhIGJpbmFyeSBidWZmZXIuIApUaGUgYnVmZmVyIGlzIGFsbG9jYXRlZCBieSB0aGUgZnVuY3Rpb24gYW5kIG11c3QgYmUgZnJlZWQgYnkgdGhlIGNhbGxlci4gCiovCkJPT0wgCndyaXRlX2lwdGNfcHJvZmlsZShGSUJJVE1BUCAqZGliLCBCWVRFICoqcHJvZmlsZSwgdW5zaWduZWQgKnByb2ZpbGVfc2l6ZSkgewoJRklUQUcgKnRhZyA9IE5VTEw7CglGSU1FVEFEQVRBICptZGhhbmRsZSA9IE5VTEw7CgoJQllURSAqYnVmZmVyID0gTlVMTDsKCXVuc2lnbmVkIGJ1ZmZlcl9zaXplID0gMDsKCgkvLyBwYXJzZSBhbGwgSVBUQyB0YWdzIGFuZCByZWJ1aWxkIGEgSVBUQyBwcm9maWxlCgltZGhhbmRsZSA9IEZyZWVJbWFnZV9GaW5kRmlyc3RNZXRhZGF0YShGSU1EX0lQVEMsIGRpYiwgJnRhZyk7CgoJaWYobWRoYW5kbGUpIHsKCQlkbyB7CgkJCVdPUkQgdGFnX2lkCT0gRnJlZUltYWdlX0dldFRhZ0lEKHRhZyk7CgoJCQkvLyBhcHBlbmQgdGhlIHRhZyB0byB0aGUgcHJvZmlsZQoKCQkJc3dpdGNoKHRhZ19pZCkgewoJCQkJY2FzZSBUQUdfUkVDT1JEX1ZFUlNJT046CgkJCQkJLy8gaWdub3JlIChhbHJlYWR5IGhhbmRsZWQpCgkJCQkJYnJlYWs7CgoJCQkJY2FzZSBUQUdfU1VQUExFTUVOVEFMX0NBVEVHT1JJRVM6CgkJCQljYXNlIFRBR19LRVlXT1JEUzoKCQkJCQlpZihGcmVlSW1hZ2VfR2V0VGFnVHlwZSh0YWcpID09IEZJRFRfQVNDSUkpIHsKCQkJCQkJc3RkOjpzdHJpbmcgdmFsdWUgPSAoY29uc3QgY2hhciopRnJlZUltYWdlX0dldFRhZ1ZhbHVlKHRhZyk7CgoJCQkJCQkvLyBzcGxpdCB0aGUgdGFnIHZhbHVlCgkJCQkJCXN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBvdXRwdXQ7CgkJCQkJCXN0ZDo6c3RyaW5nIGRlbGltaXRlciA9IElQVENfREVMSU1JVEVSOwkJCgkJCQkJCQoJCQkJCQlzaXplX3Qgb2Zmc2V0ID0gMDsKCQkJCQkJc2l6ZV90IGRlbGltaXRlckluZGV4ID0gMDsKCgkJCQkJCWRlbGltaXRlckluZGV4ID0gdmFsdWUuZmluZChkZWxpbWl0ZXIsIG9mZnNldCk7CgkJCQkJCXdoaWxlIChkZWxpbWl0ZXJJbmRleCAhPSBzdGQ6OnN0cmluZzo6bnBvcykgewoJCQkJCQkJb3V0cHV0LnB1c2hfYmFjayh2YWx1ZS5zdWJzdHIob2Zmc2V0LCBkZWxpbWl0ZXJJbmRleCAtIG9mZnNldCkpOwoJCQkJCQkJb2Zmc2V0ICs9IGRlbGltaXRlckluZGV4IC0gb2Zmc2V0ICsgZGVsaW1pdGVyLmxlbmd0aCgpOwoJCQkJCQkJZGVsaW1pdGVySW5kZXggPSB2YWx1ZS5maW5kKGRlbGltaXRlciwgb2Zmc2V0KTsKCQkJCQkJfQoJCQkJCQlvdXRwdXQucHVzaF9iYWNrKHZhbHVlLnN1YnN0cihvZmZzZXQpKTsKCgkJCQkJCS8vIGFkZCBhcyBtYW55IHRhZ3MgYXMgdGhlcmUgYXJlIGNvbW1hIHNlcGFyYXRlZCBzdHJpbmdzCgkJCQkJCWZvcihpbnQgaSA9IDA7IGkgPCAoaW50KW91dHB1dC5zaXplKCk7IGkrKykgewoJCQkJCQkJc3RkOjpzdHJpbmcmIHRhZ192YWx1ZSA9IG91dHB1dFtpXTsKCQkJCQkJCWJ1ZmZlciA9IGFwcGVuZF9pcHRjX3RhZyhidWZmZXIsICZidWZmZXJfc2l6ZSwgdGFnX2lkLCAoRFdPUkQpdGFnX3ZhbHVlLmxlbmd0aCgpLCB0YWdfdmFsdWUuY19zdHIoKSk7CgkJCQkJCX0KCgkJCQkJfQoJCQkJCWJyZWFrOwoKCQkJCWNhc2UgVEFHX1VSR0VOQ1k6CgkJCQkJaWYoRnJlZUltYWdlX0dldFRhZ1R5cGUodGFnKSA9PSBGSURUX0FTQ0lJKSB7CgkJCQkJCURXT1JEIGxlbmd0aCA9IDE7CS8vIGtlZXAgdGhlIGZpcnN0IG9jdGV0IG9ubHkKCQkJCQkJYnVmZmVyID0gYXBwZW5kX2lwdGNfdGFnKGJ1ZmZlciwgJmJ1ZmZlcl9zaXplLCB0YWdfaWQsIGxlbmd0aCwgRnJlZUltYWdlX0dldFRhZ1ZhbHVlKHRhZykpOwoJCQkJCX0KCQkJCQlicmVhazsKCgkJCQlkZWZhdWx0OgoJCQkJCWlmKEZyZWVJbWFnZV9HZXRUYWdUeXBlKHRhZykgPT0gRklEVF9BU0NJSSkgewoJCQkJCQlEV09SRCBsZW5ndGggPSBGcmVlSW1hZ2VfR2V0VGFnTGVuZ3RoKHRhZyk7CQoJCQkJCQlidWZmZXIgPSBhcHBlbmRfaXB0Y190YWcoYnVmZmVyLCAmYnVmZmVyX3NpemUsIHRhZ19pZCwgbGVuZ3RoLCBGcmVlSW1hZ2VfR2V0VGFnVmFsdWUodGFnKSk7CgkJCQkJfQkJCQkJCgkJCQkJYnJlYWs7CgkJCX0KCgkJfSB3aGlsZShGcmVlSW1hZ2VfRmluZE5leHRNZXRhZGF0YShtZGhhbmRsZSwgJnRhZykpOwoJCQoJCUZyZWVJbWFnZV9GaW5kQ2xvc2VNZXRhZGF0YShtZGhhbmRsZSk7CgoJCS8vIGFkZCB0aGUgRGlyZWN0b3J5VmVyc2lvbiB0YWcKCQljb25zdCBzaG9ydCB2ZXJzaW9uID0gMHgwMjAwOwoJCWJ1ZmZlciA9IGFwcGVuZF9pcHRjX3RhZyhidWZmZXIsICZidWZmZXJfc2l6ZSwgVEFHX1JFQ09SRF9WRVJTSU9OLCBzaXplb2YodmVyc2lvbiksICZ2ZXJzaW9uKTsKCQkKCQkqcHJvZmlsZSA9IGJ1ZmZlcjsKCQkqcHJvZmlsZV9zaXplID0gYnVmZmVyX3NpemU7CgoJCXJldHVybiBUUlVFOwoJfQoKCXJldHVybiBGQUxTRTsKfQo=