LyoKICogSVdpbmVEM0RJbmRleEJ1ZmZlciBJbXBsZW1lbnRhdGlvbgogKgogKiBDb3B5cmlnaHQgMjAwMi0yMDA0IEphc29uIEVkbWVhZGVzCiAqIENvcHlyaWdodCAyMDAzLTIwMDQgUmFwaGFlbCBKdW5xdWVpcmEKICogQ29weXJpZ2h0IDIwMDQgQ2hyaXN0aWFuIENvc3RhCiAqIENvcHlyaWdodCAyMDA1IE9saXZlciBTdGllYmVyCiAqIENvcHlyaWdodCAyMDA3IFN0ZWZhbiBE9nNpbmdlciBmb3IgQ29kZVdlYXZlcnMKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBCiAqLwoKI2luY2x1ZGUgImNvbmZpZy5oIgojaW5jbHVkZSAid2luZWQzZF9wcml2YXRlLmgiCgpXSU5FX0RFRkFVTFRfREVCVUdfQ0hBTk5FTChkM2QpOwojZGVmaW5lIEdMSU5GT19MT0NBVElPTiBUaGlzLT5yZXNvdXJjZS53aW5lRDNERGV2aWNlLT5hZGFwdGVyLT5nbF9pbmZvCgovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgIElXaW5lRDNESW5kZXhCdWZmZXIgSVVua25vd24gcGFydHMgZm9sbG93CiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJIElXaW5lRDNESW5kZXhCdWZmZXJJbXBsX1F1ZXJ5SW50ZXJmYWNlKElXaW5lRDNESW5kZXhCdWZmZXIgKmlmYWNlLCBSRUZJSUQgcmlpZCwgTFBWT0lEICpwcG9iaikKewogICAgSVdpbmVEM0RJbmRleEJ1ZmZlckltcGwgKlRoaXMgPSAoSVdpbmVEM0RJbmRleEJ1ZmZlckltcGwgKilpZmFjZTsKICAgIFRSQUNFKCIoJXApLT4oJXMsJXApXG4iLFRoaXMsZGVidWdzdHJfZ3VpZChyaWlkKSxwcG9iaik7CiAgICBpZiAoSXNFcXVhbEdVSUQocmlpZCwgJklJRF9JVW5rbm93bikKICAgICAgICB8fCBJc0VxdWFsR1VJRChyaWlkLCAmSUlEX0lXaW5lRDNEQmFzZSkKICAgICAgICB8fCBJc0VxdWFsR1VJRChyaWlkLCAmSUlEX0lXaW5lRDNEUmVzb3VyY2UpCiAgICAgICAgfHwgSXNFcXVhbEdVSUQocmlpZCwgJklJRF9JV2luZUQzREluZGV4QnVmZmVyKSl7CiAgICAgICAgSVVua25vd25fQWRkUmVmKGlmYWNlKTsKICAgICAgICAqcHBvYmogPSBUaGlzOwogICAgICAgIHJldHVybiBTX09LOwogICAgfQogICAgKnBwb2JqID0gTlVMTDsKICAgIHJldHVybiBFX05PSU5URVJGQUNFOwp9CgpzdGF0aWMgVUxPTkcgV0lOQVBJIElXaW5lRDNESW5kZXhCdWZmZXJJbXBsX0FkZFJlZihJV2luZUQzREluZGV4QnVmZmVyICppZmFjZSkgewogICAgSVdpbmVEM0RJbmRleEJ1ZmZlckltcGwgKlRoaXMgPSAoSVdpbmVEM0RJbmRleEJ1ZmZlckltcGwgKilpZmFjZTsKICAgIFVMT05HIHJlZiA9IEludGVybG9ja2VkSW5jcmVtZW50KCZUaGlzLT5yZXNvdXJjZS5yZWYpOwogICAgVFJBQ0UoIiglcCkgOiBBZGRSZWYgaW5jcmVhc2luZyBmcm9tICVkXG4iLCBUaGlzLCByZWYgLSAxKTsKICAgIHJldHVybiByZWY7Cn0KCnN0YXRpYyBVTE9ORyBXSU5BUEkgSVdpbmVEM0RJbmRleEJ1ZmZlckltcGxfUmVsZWFzZShJV2luZUQzREluZGV4QnVmZmVyICppZmFjZSkgewogICAgSVdpbmVEM0RJbmRleEJ1ZmZlckltcGwgKlRoaXMgPSAoSVdpbmVEM0RJbmRleEJ1ZmZlckltcGwgKilpZmFjZTsKICAgIFVMT05HIHJlZiA9IEludGVybG9ja2VkRGVjcmVtZW50KCZUaGlzLT5yZXNvdXJjZS5yZWYpOwogICAgVFJBQ0UoIiglcCkgOiBSZWxlYXNpbmcgZnJvbSAlZFxuIiwgVGhpcywgcmVmICsgMSk7CiAgICBpZiAocmVmID09IDApIHsKICAgICAgICBpZihUaGlzLT52Ym8pIHsKICAgICAgICAgICAgSVdpbmVEM0REZXZpY2VJbXBsICpkZXZpY2UgPSBUaGlzLT5yZXNvdXJjZS53aW5lRDNERGV2aWNlOwoKICAgICAgICAgICAgQWN0aXZhdGVDb250ZXh0KGRldmljZSwgZGV2aWNlLT5sYXN0QWN0aXZlUmVuZGVyVGFyZ2V0LCBDVFhVU0FHRV9SRVNPVVJDRUxPQUQpOwogICAgICAgICAgICBFTlRFUl9HTCgpOwogICAgICAgICAgICAvKiBObyBuZWVkIHRvIG1hbnVhbGx5IHVuc2V0IHRoZSBidWZmZXIuIGdsRGVsZXRlQnVmZmVycyB1bnNldHMgaXQgZm9yIHRoZSBjdXJyZW50IGNvbnRleHQsCiAgICAgICAgICAgICAqIGJ1dCBub3QgZm9yIG90aGVyIGNvbnRleHRzLiBIb3dldmVyLCBiZWNhdXNlIHRoZSBkM2QgYnVmZmVyIGlzIGRlc3Ryb3llZCB0aGUgYXBwIGhhcyB0bwogICAgICAgICAgICAgKiB1bnNldCBpdCBiZWZvcmUgZG9pbmcgdGhlIG5leHQgZHJhdywgdGh1cyBkaXJ0aWZ5aW5nIHRoZSBpbmRleCBidWZmZXIgc3RhdGUgYW5kIGZvcmNpbmcKICAgICAgICAgICAgICogYmluZGluZyBhIG5ldyBidWZmZXIKICAgICAgICAgICAgICovCiAgICAgICAgICAgIEdMX0VYVENBTEwoZ2xEZWxldGVCdWZmZXJzQVJCKDEsICZUaGlzLT52Ym8pKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoImdsRGVsZXRlQnVmZmVyc0FSQiIpOwogICAgICAgICAgICBMRUFWRV9HTCgpOwogICAgICAgIH0KCiAgICAgICAgSVdpbmVEM0RSZXNvdXJjZUltcGxfQ2xlYW5VcCgoSVdpbmVEM0RSZXNvdXJjZSAqKWlmYWNlKTsKICAgICAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBUaGlzKTsKICAgIH0KICAgIHJldHVybiByZWY7Cn0KCi8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgSVdpbmVEM0RJbmRleEJ1ZmZlciBJV2luZUQzRFJlc291cmNlIHBhcnRzIGZvbGxvdwogICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJV2luZUQzREluZGV4QnVmZmVySW1wbF9HZXREZXZpY2UoSVdpbmVEM0RJbmRleEJ1ZmZlciAqaWZhY2UsIElXaW5lRDNERGV2aWNlKiogcHBEZXZpY2UpIHsKICAgIHJldHVybiBJV2luZUQzRFJlc291cmNlSW1wbF9HZXREZXZpY2UoKElXaW5lRDNEUmVzb3VyY2UgKilpZmFjZSwgcHBEZXZpY2UpOwp9CgpzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSVdpbmVEM0RJbmRleEJ1ZmZlckltcGxfU2V0UHJpdmF0ZURhdGEoSVdpbmVEM0RJbmRleEJ1ZmZlciAqaWZhY2UsIFJFRkdVSUQgcmVmZ3VpZCwgQ09OU1Qgdm9pZCogcERhdGEsIERXT1JEIFNpemVPZkRhdGEsIERXT1JEIEZsYWdzKSB7CiAgICByZXR1cm4gSVdpbmVEM0RSZXNvdXJjZUltcGxfU2V0UHJpdmF0ZURhdGEoKElXaW5lRDNEUmVzb3VyY2UgKilpZmFjZSwgcmVmZ3VpZCwgcERhdGEsIFNpemVPZkRhdGEsIEZsYWdzKTsKfQoKc3RhdGljIEhSRVNVTFQgV0lOQVBJIElXaW5lRDNESW5kZXhCdWZmZXJJbXBsX0dldFByaXZhdGVEYXRhKElXaW5lRDNESW5kZXhCdWZmZXIgKmlmYWNlLCBSRUZHVUlEIHJlZmd1aWQsIHZvaWQqIHBEYXRhLCBEV09SRCogcFNpemVPZkRhdGEpIHsKICAgIHJldHVybiBJV2luZUQzRFJlc291cmNlSW1wbF9HZXRQcml2YXRlRGF0YSgoSVdpbmVEM0RSZXNvdXJjZSAqKWlmYWNlLCByZWZndWlkLCBwRGF0YSwgcFNpemVPZkRhdGEpOwp9CgpzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSVdpbmVEM0RJbmRleEJ1ZmZlckltcGxfRnJlZVByaXZhdGVEYXRhKElXaW5lRDNESW5kZXhCdWZmZXIgKmlmYWNlLCBSRUZHVUlEIHJlZmd1aWQpIHsKICAgIHJldHVybiBJV2luZUQzRFJlc291cmNlSW1wbF9GcmVlUHJpdmF0ZURhdGEoKElXaW5lRDNEUmVzb3VyY2UgKilpZmFjZSwgcmVmZ3VpZCk7Cn0KCnN0YXRpYyBEV09SRCBXSU5BUEkgSVdpbmVEM0RJbmRleEJ1ZmZlckltcGxfU2V0UHJpb3JpdHkoSVdpbmVEM0RJbmRleEJ1ZmZlciAqaWZhY2UsIERXT1JEIFByaW9yaXR5TmV3KSB7CiAgICByZXR1cm4gSVdpbmVEM0RSZXNvdXJjZUltcGxfU2V0UHJpb3JpdHkoKElXaW5lRDNEUmVzb3VyY2UgKilpZmFjZSwgUHJpb3JpdHlOZXcpOwp9CgpzdGF0aWMgRFdPUkQgV0lOQVBJIElXaW5lRDNESW5kZXhCdWZmZXJJbXBsX0dldFByaW9yaXR5KElXaW5lRDNESW5kZXhCdWZmZXIgKmlmYWNlKSB7CiAgICByZXR1cm4gSVdpbmVEM0RSZXNvdXJjZUltcGxfR2V0UHJpb3JpdHkoKElXaW5lRDNEUmVzb3VyY2UgKilpZmFjZSk7Cn0KCnN0YXRpYyB2b2lkIFdJTkFQSSBJV2luZUQzREluZGV4QnVmZmVySW1wbF9QcmVMb2FkKElXaW5lRDNESW5kZXhCdWZmZXIgKmlmYWNlKSB7CiAgICBJV2luZUQzRFJlc291cmNlSW1wbF9QcmVMb2FkKChJV2luZUQzRFJlc291cmNlICopaWZhY2UpOwp9CgpzdGF0aWMgdm9pZCBXSU5BUEkgSVdpbmVEM0RJbmRleEJ1ZmZlckltcGxfVW5Mb2FkKElXaW5lRDNESW5kZXhCdWZmZXIgKmlmYWNlKSB7CiAgICBJV2luZUQzREluZGV4QnVmZmVySW1wbCAqVGhpcyA9IChJV2luZUQzREluZGV4QnVmZmVySW1wbCAqKSBpZmFjZTsKICAgIElXaW5lRDNERGV2aWNlSW1wbCAqZGV2aWNlID0gVGhpcy0+cmVzb3VyY2Uud2luZUQzRERldmljZTsKICAgIFRSQUNFKCIoJXApXG4iLCBUaGlzKTsKCiAgICAvKiBUaGlzIGlzIGVhc3k6IFRoZSB3aG9sZSBjb250ZW50IGlzIHNoYWRvd2VkIGluIFRoaXMtPnJlc291cmNlLmFsbG9jYXRlZE1lbW9yeSwKICAgICAqIHNvIHdlIG9ubHkgaGF2ZSB0byBkZXN0cm95IHRoZSB2Ym8uIE9ubHkgZG8gaXQgaWYgd2UgaGF2ZSBhIHZibywgd2hpY2ggaW1wbGllcwogICAgICogdGhhdCB2Ym9zIGFyZSBzdXBwb3J0ZWQuCiAgICAgKiAoVE9ETzogTWFrZSBhIElXaW5lRDNEQnVmZmVyIGJhc2UgY2xhc3MgZm9yIGluZGV4IGFuZCB2ZXJ0ZXggYnVmZmVycyBhbmQgc2hhcmUKICAgICAqIHRoaXMgY29kZS4gQWxzbyBuZWVkZWQgZm9yIEQzRDEwKQogICAgICovCiAgICBpZihUaGlzLT52Ym8pIHsKICAgICAgICBBY3RpdmF0ZUNvbnRleHQoZGV2aWNlLCBkZXZpY2UtPmxhc3RBY3RpdmVSZW5kZXJUYXJnZXQsIENUWFVTQUdFX1JFU09VUkNFTE9BRCk7CiAgICAgICAgRU5URVJfR0woKTsKICAgICAgICBHTF9FWFRDQUxMKGdsRGVsZXRlQnVmZmVyc0FSQigxLCAmVGhpcy0+dmJvKSk7CiAgICAgICAgY2hlY2tHTGNhbGwoImdsRGVsZXRlQnVmZmVyc0FSQiIpOwogICAgICAgIExFQVZFX0dMKCk7CiAgICAgICAgVGhpcy0+dmJvID0gMDsKICAgIH0KfQoKc3RhdGljIFdJTkVEM0RSRVNPVVJDRVRZUEUgV0lOQVBJIElXaW5lRDNESW5kZXhCdWZmZXJJbXBsX0dldFR5cGUoSVdpbmVEM0RJbmRleEJ1ZmZlciAqaWZhY2UpIHsKICAgIHJldHVybiBJV2luZUQzRFJlc291cmNlSW1wbF9HZXRUeXBlKChJV2luZUQzRFJlc291cmNlICopaWZhY2UpOwp9CgpzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSVdpbmVEM0RJbmRleEJ1ZmZlckltcGxfR2V0UGFyZW50KElXaW5lRDNESW5kZXhCdWZmZXIgKmlmYWNlLCBJVW5rbm93biAqKnBQYXJlbnQpIHsKICAgIHJldHVybiBJV2luZUQzRFJlc291cmNlSW1wbF9HZXRQYXJlbnQoKElXaW5lRDNEUmVzb3VyY2UgKilpZmFjZSwgcFBhcmVudCk7Cn0KCi8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICBJV2luZUQzREluZGV4QnVmZmVyIElXaW5lRDNESW5kZXhCdWZmZXIgcGFydHMgZm9sbG93CiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSVdpbmVEM0RJbmRleEJ1ZmZlckltcGxfTG9jayhJV2luZUQzREluZGV4QnVmZmVyICppZmFjZSwgVUlOVCBPZmZzZXRUb0xvY2ssIFVJTlQgU2l6ZVRvTG9jaywgQllURSoqIHBwYkRhdGEsIERXT1JEIEZsYWdzKSB7CiAgICBJV2luZUQzREluZGV4QnVmZmVySW1wbCAqVGhpcyA9IChJV2luZUQzREluZGV4QnVmZmVySW1wbCAqKWlmYWNlOwogICAgVFJBQ0UoIiglcCkgOiBvZmZzZXQgJWQsIHNpemUgJWQsIEZsYWdzPSV4XG4iLCBUaGlzLCBPZmZzZXRUb0xvY2ssIFNpemVUb0xvY2ssIEZsYWdzKTsKCiAgICBJbnRlcmxvY2tlZEluY3JlbWVudCgmVGhpcy0+bG9ja2NvdW50KTsKICAgICpwcGJEYXRhID0gVGhpcy0+cmVzb3VyY2UuYWxsb2NhdGVkTWVtb3J5ICsgT2Zmc2V0VG9Mb2NrOwoKICAgIGlmKEZsYWdzICYgKFdJTkVEM0RMT0NLX1JFQURPTkxZIHwgV0lORUQzRExPQ0tfTk9fRElSVFlfVVBEQVRFKSB8fCBUaGlzLT52Ym8gPT0gMCkgewogICAgICAgIHJldHVybiBXSU5FRDNEX09LOwogICAgfQoKICAgIGlmKFRoaXMtPmRpcnR5c3RhcnQgIT0gVGhpcy0+ZGlydHllbmQpIHsKICAgICAgICBpZihUaGlzLT5kaXJ0eXN0YXJ0ID4gT2Zmc2V0VG9Mb2NrKSBUaGlzLT5kaXJ0eXN0YXJ0ID0gT2Zmc2V0VG9Mb2NrOwogICAgICAgIGlmKFNpemVUb0xvY2spIHsKICAgICAgICAgICAgaWYoVGhpcy0+ZGlydHllbmQgPCBPZmZzZXRUb0xvY2sgKyBTaXplVG9Mb2NrKSBUaGlzLT5kaXJ0eWVuZCA9IE9mZnNldFRvTG9jayArIFNpemVUb0xvY2s7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgVGhpcy0+ZGlydHllbmQgPSBUaGlzLT5yZXNvdXJjZS5zaXplOwogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgVGhpcy0+ZGlydHlzdGFydCA9IE9mZnNldFRvTG9jazsKICAgICAgICBpZihTaXplVG9Mb2NrKQogICAgICAgICAgICBUaGlzLT5kaXJ0eWVuZCA9IE9mZnNldFRvTG9jayArIFNpemVUb0xvY2s7CiAgICAgICAgZWxzZQogICAgICAgICAgICBUaGlzLT5kaXJ0eWVuZCA9IFRoaXMtPnJlc291cmNlLnNpemU7CiAgICB9CgogICAgcmV0dXJuIFdJTkVEM0RfT0s7Cn0Kc3RhdGljIEhSRVNVTFQgV0lOQVBJIElXaW5lRDNESW5kZXhCdWZmZXJJbXBsX1VubG9jayhJV2luZUQzREluZGV4QnVmZmVyICppZmFjZSkgewogICAgSVdpbmVEM0RJbmRleEJ1ZmZlckltcGwgKlRoaXMgPSAoSVdpbmVEM0RJbmRleEJ1ZmZlckltcGwgKilpZmFjZTsKICAgIHVuc2lnbmVkIGxvbmcgbG9ja3MgPSBJbnRlcmxvY2tlZERlY3JlbWVudCgmVGhpcy0+bG9ja2NvdW50KTsKICAgIFRSQUNFKCIoJXApXG4iLCBUaGlzKTsKCiAgICAvKiBGb3Igbm93IGxvYWQgaW4gdW5sb2NrICovCiAgICBpZihsb2NrcyA9PSAwICYmIFRoaXMtPnZibyAmJiAoVGhpcy0+ZGlydHllbmQgLSBUaGlzLT5kaXJ0eXN0YXJ0KSA+IDApIHsKICAgICAgICBJV2luZUQzRERldmljZUltcGwgKmRldmljZSA9IFRoaXMtPnJlc291cmNlLndpbmVEM0REZXZpY2U7CgogICAgICAgIEFjdGl2YXRlQ29udGV4dChkZXZpY2UsIGRldmljZS0+bGFzdEFjdGl2ZVJlbmRlclRhcmdldCwgQ1RYVVNBR0VfUkVTT1VSQ0VMT0FEKTsKCiAgICAgICAgRU5URVJfR0woKTsKICAgICAgICBHTF9FWFRDQUxMKGdsQmluZEJ1ZmZlckFSQihHTF9FTEVNRU5UX0FSUkFZX0JVRkZFUl9BUkIsIFRoaXMtPnZibykpOwogICAgICAgIGNoZWNrR0xjYWxsKCJnbEJpbmRCdWZmZXJBUkIiKTsKICAgICAgICBHTF9FWFRDQUxMKGdsQnVmZmVyU3ViRGF0YUFSQihHTF9FTEVNRU5UX0FSUkFZX0JVRkZFUl9BUkIsCiAgICAgICAgICAgICAgICBUaGlzLT5kaXJ0eXN0YXJ0LCBUaGlzLT5kaXJ0eWVuZCAtIFRoaXMtPmRpcnR5c3RhcnQsIFRoaXMtPnJlc291cmNlLmFsbG9jYXRlZE1lbW9yeSArIFRoaXMtPmRpcnR5c3RhcnQpKTsKICAgICAgICBjaGVja0dMY2FsbCgiZ2xCdWZmZXJTdWJEYXRhQVJCIik7CiAgICAgICAgTEVBVkVfR0woKTsKICAgICAgICBUaGlzLT5kaXJ0eXN0YXJ0ID0gMDsKICAgICAgICBUaGlzLT5kaXJ0eWVuZCA9IDA7CiAgICAgICAgLyogVE9ETzogTW92ZSBsb2FkaW5nIGludG8gcHJlbG9hZCB3aGVuIHRoZSBidWZmZXIgaXMgdXNlZCwgdGhhdCBhdm9pZHMgZGlydGlmeWluZyB0aGUgc3RhdGUgKi8KICAgICAgICBJV2luZUQzRERldmljZUltcGxfTWFya1N0YXRlRGlydHkoZGV2aWNlLCBTVEFURV9JTkRFWEJVRkZFUik7CiAgICB9CiAgICByZXR1cm4gV0lORUQzRF9PSzsKfQpzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSVdpbmVEM0RJbmRleEJ1ZmZlckltcGxfR2V0RGVzYyhJV2luZUQzREluZGV4QnVmZmVyICppZmFjZSwgV0lORUQzRElOREVYQlVGRkVSX0RFU0MgKnBEZXNjKSB7CiAgICBJV2luZUQzREluZGV4QnVmZmVySW1wbCAqVGhpcyA9IChJV2luZUQzREluZGV4QnVmZmVySW1wbCAqKWlmYWNlOwoKICAgIFRSQUNFKCIoJXApXG4iLCBUaGlzKTsKICAgIHBEZXNjLT5Gb3JtYXQgPSBUaGlzLT5yZXNvdXJjZS5mb3JtYXQ7CiAgICBwRGVzYy0+VHlwZSAgID0gVGhpcy0+cmVzb3VyY2UucmVzb3VyY2VUeXBlOwogICAgcERlc2MtPlVzYWdlICA9IFRoaXMtPnJlc291cmNlLnVzYWdlOwogICAgcERlc2MtPlBvb2wgICA9IFRoaXMtPnJlc291cmNlLnBvb2w7CiAgICBwRGVzYy0+U2l6ZSAgID0gVGhpcy0+cmVzb3VyY2Uuc2l6ZTsKICAgIHJldHVybiBXSU5FRDNEX09LOwp9Cgpjb25zdCBJV2luZUQzREluZGV4QnVmZmVyVnRibCBJV2luZUQzREluZGV4QnVmZmVyX1Z0YmwgPQp7CiAgICAvKiBJVW5rbm93biAqLwogICAgSVdpbmVEM0RJbmRleEJ1ZmZlckltcGxfUXVlcnlJbnRlcmZhY2UsCiAgICBJV2luZUQzREluZGV4QnVmZmVySW1wbF9BZGRSZWYsCiAgICBJV2luZUQzREluZGV4QnVmZmVySW1wbF9SZWxlYXNlLAogICAgLyogSVdpbmVEM0RSZXNvdXJjZSAqLwogICAgSVdpbmVEM0RJbmRleEJ1ZmZlckltcGxfR2V0UGFyZW50LAogICAgSVdpbmVEM0RJbmRleEJ1ZmZlckltcGxfR2V0RGV2aWNlLAogICAgSVdpbmVEM0RJbmRleEJ1ZmZlckltcGxfU2V0UHJpdmF0ZURhdGEsCiAgICBJV2luZUQzREluZGV4QnVmZmVySW1wbF9HZXRQcml2YXRlRGF0YSwKICAgIElXaW5lRDNESW5kZXhCdWZmZXJJbXBsX0ZyZWVQcml2YXRlRGF0YSwKICAgIElXaW5lRDNESW5kZXhCdWZmZXJJbXBsX1NldFByaW9yaXR5LAogICAgSVdpbmVEM0RJbmRleEJ1ZmZlckltcGxfR2V0UHJpb3JpdHksCiAgICBJV2luZUQzREluZGV4QnVmZmVySW1wbF9QcmVMb2FkLAogICAgSVdpbmVEM0RJbmRleEJ1ZmZlckltcGxfVW5Mb2FkLAogICAgSVdpbmVEM0RJbmRleEJ1ZmZlckltcGxfR2V0VHlwZSwKICAgIC8qIElXaW5lRDNESW5kZXhCdWZmZXIgKi8KICAgIElXaW5lRDNESW5kZXhCdWZmZXJJbXBsX0xvY2ssCiAgICBJV2luZUQzREluZGV4QnVmZmVySW1wbF9VbmxvY2ssCiAgICBJV2luZUQzREluZGV4QnVmZmVySW1wbF9HZXREZXNjCn07Cg==