Ly8gU3dpZnRTaGFkZXIgU29mdHdhcmUgUmVuZGVyZXIKLy8KLy8gQ29weXJpZ2h0KGMpIDIwMDUtMjAxMSBUcmFuc0dhbWluZyBJbmMuCi8vCi8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIE5vIHBhcnQgb2YgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgdHJhbnNtaXR0ZWQsCi8vIHRyYW5zY3JpYmVkLCBzdG9yZWQgaW4gYSByZXRyaWV2YWwgc3lzdGVtLCB0cmFuc2xhdGVkIGludG8gYW55IGh1bWFuIG9yIGNvbXB1dGVyCi8vIGxhbmd1YWdlIGJ5IGFueSBtZWFucywgb3IgZGlzY2xvc2VkIHRvIHRoaXJkIHBhcnRpZXMgd2l0aG91dCB0aGUgZXhwbGljaXQgd3JpdHRlbgovLyBhZ3JlZW1lbnQgb2YgVHJhbnNHYW1pbmcgSW5jLiBXaXRob3V0IHN1Y2ggYW4gYWdyZWVtZW50LCBubyByaWdodHMgb3IgbGljZW5zZXMsIGV4cHJlc3MKLy8gb3IgaW1wbGllZCwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBhbnkgcGF0ZW50IHJpZ2h0cywgYXJlIGdyYW50ZWQgdG8geW91LgovLwoKI2luY2x1ZGUgIkRpcmVjdDNEOS5ocHAiCgojaW5jbHVkZSAiRGlyZWN0M0REZXZpY2U5LmhwcCIKI2luY2x1ZGUgIkNhcGFiaWxpdGllcy5ocHAiCiNpbmNsdWRlICJTd2lmdFNoYWRlci5ocHAiCiNpbmNsdWRlICJDb25maWd1cmF0b3IuaHBwIgojaW5jbHVkZSAiRGVidWcuaHBwIgojaW5jbHVkZSAiQ1BVSUQuaHBwIgojaW5jbHVkZSAiVmVyc2lvbi5oIgojaW5jbHVkZSAiQ29uZmlnLmhwcCIKCiNkZWZpbmUgQ09NUElMRV9NVUxUSU1PTl9TVFVCUwojaW5jbHVkZSA8bXVsdGltb24uaD4KI2luY2x1ZGUgPGFzc2VydC5oPgojaW5jbHVkZSA8cHNhcGkuaD4KCm5hbWVzcGFjZSBEM0Q5CnsKCURpcmVjdDNEOTo6RGlyZWN0M0Q5KGludCB2ZXJzaW9uLCBjb25zdCBISU5TVEFOQ0UgaW5zdGFuY2UpIDogdmVyc2lvbih2ZXJzaW9uKSwgaW5zdGFuY2UoaW5zdGFuY2UpCgl7CgkJZGlzcGxheU1vZGUgPSAwOwoJCW51bURpc3BsYXlNb2RlcyA9IDA7CgoJCURFVk1PREUgZGV2bW9kZTsKCQlkZXZtb2RlLmRtU2l6ZSA9IHNpemVvZihERVZNT0RFKTsKCgkJLy8gQ291bnQgbnVtYmVyIG9mIGRpc3BsYXkgbW9kZXMKCQl3aGlsZShFbnVtRGlzcGxheVNldHRpbmdzKDAsIG51bURpc3BsYXlNb2RlcywgJmRldm1vZGUpKSAgIC8vIEZJWE1FOiBPbmx5IGVudW1hcmF0ZSBpbnRlcm5hbCBtb2RlcyEKCQl7CgkJCW51bURpc3BsYXlNb2RlcysrOwoJCX0KCgkJZGlzcGxheU1vZGUgPSBuZXcgREVWTU9ERVtudW1EaXNwbGF5TW9kZXNdOwoKCQkvLyBTdG9yZSBkaXNwbGF5IG1vZGVzIGluZm9ybWF0aW9uCgkJZm9yKGludCBpID0gMDsgaSA8IG51bURpc3BsYXlNb2RlczsgaSsrKQoJCXsKCQkJZGlzcGxheU1vZGVbaV0uZG1TaXplID0gc2l6ZW9mKERFVk1PREUpOwoJCQlFbnVtRGlzcGxheVNldHRpbmdzKDAsIGksICZkaXNwbGF5TW9kZVtpXSk7CgkJfQoKCQlkM2Q5TGliID0gMDsKCQlkM2Q5ID0gMDsKCgkJc3c6OkNvbmZpZ3VyYXRvciBpbmkoIlN3aWZ0U2hhZGVyLmluaSIpOwoKCQlkaXNhYmxlQWxwaGFNb2RlID0gaW5pLmdldEJvb2xlYW4oIlRlc3RpbmciLCAiRGlzYWJsZUFscGhhTW9kZSIsIGZhbHNlKTsKCQlkaXNhYmxlMTBCaXRNb2RlID0gaW5pLmdldEJvb2xlYW4oIlRlc3RpbmciLCAiRGlzYWJsZTEwQml0TW9kZSIsIGZhbHNlKTsKCgkJaW50IHBzID0gaW5pLmdldEludGVnZXIoIkNhcGFiaWxpdGllcyIsICJQaXhlbFNoYWRlclZlcnNpb24iLCAzMCk7CgkJaW50IHZzID0gaW5pLmdldEludGVnZXIoIkNhcGFiaWxpdGllcyIsICJWZXJ0ZXhTaGFkZXJWZXJzaW9uIiwgMzApOwoKCQkgICAgIGlmKHBzID09ICAwKSBwaXhlbFNoYWRlclZlcnNpb25YID0gRDNEUFNfVkVSU0lPTigwLCAwKTsKCQllbHNlIGlmKHBzIDw9IDExKSBwaXhlbFNoYWRlclZlcnNpb25YID0gRDNEUFNfVkVSU0lPTigxLCAxKTsKCQllbHNlIGlmKHBzIDw9IDEyKSBwaXhlbFNoYWRlclZlcnNpb25YID0gRDNEUFNfVkVSU0lPTigxLCAyKTsKCQllbHNlIGlmKHBzIDw9IDEzKSBwaXhlbFNoYWRlclZlcnNpb25YID0gRDNEUFNfVkVSU0lPTigxLCAzKTsKCQllbHNlIGlmKHBzIDw9IDE0KSBwaXhlbFNoYWRlclZlcnNpb25YID0gRDNEUFNfVkVSU0lPTigxLCA0KTsKCQllbHNlIGlmKHBzIDw9IDIwKSBwaXhlbFNoYWRlclZlcnNpb25YID0gRDNEUFNfVkVSU0lPTigyLCAwKTsKCQllbHNlIGlmKHBzIDw9IDIxKSBwaXhlbFNoYWRlclZlcnNpb25YID0gRDNEUFNfVkVSU0lPTigyLCAxKTsKCQllbHNlICAgICAgICAgICAgICBwaXhlbFNoYWRlclZlcnNpb25YID0gRDNEUFNfVkVSU0lPTigzLCAwKTsKCiAgICAgICAgICAgICBpZih2cyA9PSAgMCkgdmVydGV4U2hhZGVyVmVyc2lvblggPSBEM0RWU19WRVJTSU9OKDAsIDApOwoJCWVsc2UgaWYodnMgPD0gMTEpIHZlcnRleFNoYWRlclZlcnNpb25YID0gRDNEVlNfVkVSU0lPTigxLCAxKTsKCQllbHNlIGlmKHZzIDw9IDIwKSB2ZXJ0ZXhTaGFkZXJWZXJzaW9uWCA9IEQzRFZTX1ZFUlNJT04oMiwgMCk7CgkJZWxzZSBpZih2cyA8PSAyMSkgdmVydGV4U2hhZGVyVmVyc2lvblggPSBEM0RWU19WRVJTSU9OKDIsIDEpOwoJCWVsc2UgICAgICAgICAgICAgIHZlcnRleFNoYWRlclZlcnNpb25YID0gRDNEVlNfVkVSU0lPTigzLCAwKTsKCgkJcGl4ZWxTaGFkZXJBcmJpdHJhcnlTd2l6emxlID0gMDsKCQlwaXhlbFNoYWRlckdyYWRpZW50SW5zdHJ1Y3Rpb25zID0gMDsKCQlwaXhlbFNoYWRlclByZWRpY2F0aW9uID0gMDsKCQlwaXhlbFNoYWRlck5vRGVwZW5kZW50UmVhZExpbWl0ID0gMDsKCQlwaXhlbFNoYWRlck5vVGV4SW5zdHJ1Y3Rpb25MaW1pdCA9IDA7CgoJCXBpeGVsU2hhZGVyRHluYW1pY0Zsb3dDb250cm9sRGVwdGggPSBEM0RQUzIwX01JTl9EWU5BTUlDRkxPV0NPTlRST0xERVBUSDsKCQlwaXhlbFNoYWRlclN0YXRpY0Zsb3dDb250cm9sRGVwdGggPSBEM0RQUzIwX01JTl9TVEFUSUNGTE9XQ09OVFJPTERFUFRIOwoKCQlpZihwcyA+PSAyMSkKCQl7CgkJCXBpeGVsU2hhZGVyQXJiaXRyYXJ5U3dpenpsZSA9IEQzRFBTMjBDQVBTX0FSQklUUkFSWVNXSVpaTEU7CgkJCXBpeGVsU2hhZGVyR3JhZGllbnRJbnN0cnVjdGlvbnMgPSBEM0RQUzIwQ0FQU19HUkFESUVOVElOU1RSVUNUSU9OUzsKCQkJcGl4ZWxTaGFkZXJQcmVkaWNhdGlvbiA9IEQzRFBTMjBDQVBTX1BSRURJQ0FUSU9OOwoJCQlwaXhlbFNoYWRlck5vRGVwZW5kZW50UmVhZExpbWl0ID0gRDNEUFMyMENBUFNfTk9ERVBFTkRFTlRSRUFETElNSVQ7CgkJCXBpeGVsU2hhZGVyTm9UZXhJbnN0cnVjdGlvbkxpbWl0ID0gRDNEUFMyMENBUFNfTk9URVhJTlNUUlVDVElPTkxJTUlUOwoKCQkJcGl4ZWxTaGFkZXJEeW5hbWljRmxvd0NvbnRyb2xEZXB0aCA9IEQzRFBTMjBfTUFYX0RZTkFNSUNGTE9XQ09OVFJPTERFUFRIOwoJCQlwaXhlbFNoYWRlclN0YXRpY0Zsb3dDb250cm9sRGVwdGggPSBEM0RQUzIwX01BWF9TVEFUSUNGTE9XQ09OVFJPTERFUFRIOwoJCX0KCgkJdmVydGV4U2hhZGVyUHJlZGljYXRpb24gPSAwOwoJCXZlcnRleFNoYWRlckR5bmFtaWNGbG93Q29udHJvbERlcHRoID0gMDsKCgkJaWYodnMgPj0gMjEpCgkJewoJCQl2ZXJ0ZXhTaGFkZXJQcmVkaWNhdGlvbiA9IEQzRFZTMjBDQVBTX1BSRURJQ0FUSU9OOwoJCQl2ZXJ0ZXhTaGFkZXJEeW5hbWljRmxvd0NvbnRyb2xEZXB0aCA9IEQzRFZTMjBfTUFYX0RZTkFNSUNGTE9XQ09OVFJPTERFUFRIOwoJCX0KCgkJdGV4dHVyZU1lbW9yeSA9IDEwMjQgKiAxMDI0ICogaW5pLmdldEludGVnZXIoIkNhcGFiaWxpdGllcyIsICJUZXh0dXJlTWVtb3J5IiwgMjU2KTsKCgkJaW50IHNoYWRvd01hcHBpbmcgPSBpbmkuZ2V0SW50ZWdlcigiVGVzdGluZyIsICJTaGFkb3dNYXBwaW5nIiwgMyk7CgoJCWlmKHNoYWRvd01hcHBpbmcgIT0gMiAmJiBzaGFkb3dNYXBwaW5nICE9IDMpICAgLy8gTm8gRFNUIHN1cHBvcnQKCQl7CgkJCUNhcGFiaWxpdGllczo6VGV4dHVyZTo6RGVwdGhTdGVuY2lsOjpEMzIgPSBmYWxzZTsKCQkJQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpEZXB0aFN0ZW5jaWw6OkQyNFM4ID0gZmFsc2U7CgkJCUNhcGFiaWxpdGllczo6VGV4dHVyZTo6RGVwdGhTdGVuY2lsOjpEMjRYOCA9IGZhbHNlOwoJCQlDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkRlcHRoU3RlbmNpbDo6RDE2ID0gZmFsc2U7CgkJCUNhcGFiaWxpdGllczo6VGV4dHVyZTo6RGVwdGhTdGVuY2lsOjpEMjRGUzggPSBmYWxzZTsKCQkJQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpEZXB0aFN0ZW5jaWw6OkQzMkZfTE9DS0FCTEUgPSBmYWxzZTsKCgkJCUNhcGFiaWxpdGllczo6VGV4dHVyZTo6RDMyID0gZmFsc2U7CgkJCUNhcGFiaWxpdGllczo6VGV4dHVyZTo6RDI0UzggPSBmYWxzZTsKCQkJQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpEMjRYOCA9IGZhbHNlOwoJCQlDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkQxNiA9IGZhbHNlOwoJCQlDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkQyNEZTOCA9IGZhbHNlOwoJCQlDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkQzMkZfTE9DS0FCTEUgPSBmYWxzZTsKCQl9CgoJCWlmKHNoYWRvd01hcHBpbmcgIT0gMSAmJiBzaGFkb3dNYXBwaW5nICE9IDMpICAgLy8gTm8gRmV0Y2g0IHN1cHBvcnQKCQl7CgkJCUNhcGFiaWxpdGllczo6VGV4dHVyZTo6RGVwdGhTdGVuY2lsOjpERjI0ID0gZmFsc2U7CgkJCUNhcGFiaWxpdGllczo6VGV4dHVyZTo6RGVwdGhTdGVuY2lsOjpERjE2ID0gZmFsc2U7CgoJCQlDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkRGMjQgPSBmYWxzZTsKCQkJQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpERjE2ID0gZmFsc2U7CgkJfQoJfQoKCURpcmVjdDNEOTo6fkRpcmVjdDNEOSgpCgl7CgkJZGVsZXRlW10gZGlzcGxheU1vZGU7CgkJZGlzcGxheU1vZGUgPSAwOwoKCQlpZihkM2Q5KQoJCXsKCQkJZDNkOS0+UmVsZWFzZSgpOwoJCQlkM2Q5ID0gMDsKCQl9CgoJCWlmKGQzZDlMaWIpCgkJewoJCQlGcmVlTGlicmFyeShkM2Q5TGliKTsKCQkJZDNkOUxpYiA9IDA7CgkJfQoJfQoKCWxvbmcgRGlyZWN0M0Q5OjpRdWVyeUludGVyZmFjZShjb25zdCBJSUQgJmlpZCwgdm9pZCAqKm9iamVjdCkKCXsKCQlUUkFDRSgiY29uc3QgSUlEICZpaWQgPSAweCUwLjhwLCB2b2lkICoqb2JqZWN0ID0gMHglMC44cCIsIGlpZCwgb2JqZWN0KTsKCgkJaWYoaWlkID09IElJRF9JRGlyZWN0M0Q5IHx8CgkJICAgaWlkID09IElJRF9JVW5rbm93bikKCQl7CgkJCUFkZFJlZigpOwoJCQkqb2JqZWN0ID0gdGhpczsKCgkJCXJldHVybiBTX09LOwoJCX0KCQllbHNlIGlmKGlpZCA9PSBJSURfU3dpZnRTaGFkZXJQcml2YXRlVjEpCgkJewoJCQlTd2lmdFNoYWRlciAqc3dpZnRTaGFkZXIgPSBuZXcgU3dpZnRTaGFkZXIodGhpcyk7CgoJCQkqb2JqZWN0ID0gc3dpZnRTaGFkZXI7CgoJCQlyZXR1cm4gU19PSzsKCQl9CgoJCSpvYmplY3QgPSAwOwoKCQlyZXR1cm4gTk9JTlRFUkZBQ0UoaWlkKTsKCX0KCgl1bnNpZ25lZCBsb25nIERpcmVjdDNEOTo6QWRkUmVmKCkKCXsKCQlUUkFDRSgidm9pZCIpOwoKCQlyZXR1cm4gVW5rbm93bjo6QWRkUmVmKCk7Cgl9CgoJdW5zaWduZWQgbG9uZyBEaXJlY3QzRDk6OlJlbGVhc2UoKQoJewoJCVRSQUNFKCJ2b2lkIik7CgoJCXJldHVybiBVbmtub3duOjpSZWxlYXNlKCk7Cgl9CgoJbG9uZyBEaXJlY3QzRDk6OkNoZWNrRGVwdGhTdGVuY2lsTWF0Y2godW5zaWduZWQgaW50IGFkYXB0ZXIsIEQzRERFVlRZUEUgZGV2aWNlVHlwZSwgRDNERk9STUFUIGFkYXB0ZXJGb3JtYXQsIEQzREZPUk1BVCByZW5kZXJUYXJnZXRGb3JtYXQsIEQzREZPUk1BVCBkZXB0aFN0ZW5jaWxGb3JtYXQpCgl7CgkJVFJBQ0UoInVuc2lnbmVkIGludCBhZGFwdGVyID0gJWQsIEQzRERFVlRZUEUgZGV2aWNlVHlwZSA9ICVkLCBEM0RGT1JNQVQgYWRhcHRlckZvcm1hdCA9ICVkLCBEM0RGT1JNQVQgcmVuZGVyVGFyZ2V0Rm9ybWF0ID0gJWQsIEQzREZPUk1BVCBkZXB0aFN0ZW5jaWxGb3JtYXQgPSAlZCIsIGFkYXB0ZXIsIGRldmljZVR5cGUsIGFkYXB0ZXJGb3JtYXQsIHJlbmRlclRhcmdldEZvcm1hdCwgZGVwdGhTdGVuY2lsRm9ybWF0KTsKCgkJaWYoZGV2aWNlVHlwZSAhPSBEM0RERVZUWVBFX0hBTCkKCQl7CgkJCWxvYWRTeXN0ZW1EM0Q5KCk7CgoJCQlpZihkM2Q5KQoJCQl7CgkJCQlyZXR1cm4gZDNkOS0+Q2hlY2tEZXB0aFN0ZW5jaWxNYXRjaChhZGFwdGVyLCBkZXZpY2VUeXBlLCBhZGFwdGVyRm9ybWF0LCByZW5kZXJUYXJnZXRGb3JtYXQsIGRlcHRoU3RlbmNpbEZvcm1hdCk7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlyZXR1cm4gQ2hlY2tEZXB0aFN0ZW5jaWxNYXRjaChhZGFwdGVyLCBEM0RERVZUWVBFX0hBTCwgYWRhcHRlckZvcm1hdCwgcmVuZGVyVGFyZ2V0Rm9ybWF0LCBkZXB0aFN0ZW5jaWxGb3JtYXQpOwoJCQl9CgkJfQoKCQlyZXR1cm4gRDNEX09LOyAgIC8vIEFueSBmb3JtYXQgY29tYmluYXRpb24gaXMgb2sKCX0KCglsb25nIERpcmVjdDNEOTo6Q2hlY2tEZXZpY2VGb3JtYXQodW5zaWduZWQgaW50IGFkYXB0ZXIsIEQzRERFVlRZUEUgZGV2aWNlVHlwZSwgRDNERk9STUFUIGFkYXB0ZXJGb3JtYXQsIHVuc2lnbmVkIGxvbmcgdXNhZ2UsIEQzRFJFU09VUkNFVFlQRSByZXNvdXJjZVR5cGUsIEQzREZPUk1BVCBjaGVja0Zvcm1hdCkKCXsKCQlUUkFDRSgidW5zaWduZWQgaW50IGFkYXB0ZXIgPSAlZCwgRDNEREVWVFlQRSBkZXZpY2VUeXBlID0gJWQsIEQzREZPUk1BVCBhZGFwdGVyRm9ybWF0ID0gJWQsIHVuc2lnbmVkIGxvbmcgdXNhZ2UgPSAlZCwgRDNEUkVTT1VSQ0VUWVBFIHJlc291cmNlVHlwZSA9ICVkLCBEM0RGT1JNQVQgY2hlY2tGb3JtYXQgPSAlZCIsIGFkYXB0ZXIsIGRldmljZVR5cGUsIGFkYXB0ZXJGb3JtYXQsIHVzYWdlLCByZXNvdXJjZVR5cGUsIGNoZWNrRm9ybWF0KTsKCgkJaWYoZGV2aWNlVHlwZSAhPSBEM0RERVZUWVBFX0hBTCkKCQl7CgkJCWxvYWRTeXN0ZW1EM0Q5KCk7CgoJCQlpZihkM2Q5KQoJCQl7CgkJCQlyZXR1cm4gZDNkOS0+Q2hlY2tEZXZpY2VGb3JtYXQoYWRhcHRlciwgZGV2aWNlVHlwZSwgYWRhcHRlckZvcm1hdCwgdXNhZ2UsIHJlc291cmNlVHlwZSwgY2hlY2tGb3JtYXQpOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJcmV0dXJuIENoZWNrRGV2aWNlRm9ybWF0KGFkYXB0ZXIsIEQzRERFVlRZUEVfSEFMLCBhZGFwdGVyRm9ybWF0LCB1c2FnZSwgcmVzb3VyY2VUeXBlLCBjaGVja0Zvcm1hdCk7CgkJCX0KCQl9CgkJCgkJaWYodXNhZ2UgJiBEM0RVU0FHRV9RVUVSWV9TUkdCUkVBRCkKCQl7CgkJCWlmKCFDYXBhYmlsaXRpZXM6OmlzU1JHQnJlYWRhYmxlKGNoZWNrRm9ybWF0KSkKCQkJewoJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwoJCQl9CgkJfQoKCQlpZih1c2FnZSAmIEQzRFVTQUdFX1FVRVJZX1NSR0JXUklURSkKCQl7CgkJCWlmKCFDYXBhYmlsaXRpZXM6OmlzU1JHQndyaXRhYmxlKGNoZWNrRm9ybWF0KSkKCQkJewoJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwoJCQl9CgkJfQoKCQkvLyBBVEkgaGFjayB0byBpbmRpY2F0ZSBpbnN0YW5jaW5nIHN1cHBvcnQgb24gU00gMi4wIGhhcmR3YXJlCgkJaWYoY2hlY2tGb3JtYXQgPT0gRDNERk1UX0lOU1QgJiYgcGl4ZWxTaGFkZXJWZXJzaW9uWCA+PSBEM0RQU19WRVJTSU9OKDIsIDApICYmIHBpeGVsU2hhZGVyVmVyc2lvblggPCBEM0RQU19WRVJTSU9OKDMsIDApKQoJCXsKCQkJcmV0dXJuIEQzRF9PSzsKCQl9CgoJCXN3aXRjaChyZXNvdXJjZVR5cGUpCgkJewoJCWNhc2UgRDNEUlRZUEVfU1VSRkFDRToKCQkJaWYodXNhZ2UgJiBEM0RVU0FHRV9SRU5ERVJUQVJHRVQpCgkJCXsKCQkJCXN3aXRjaChjaGVja0Zvcm1hdCkKCQkJCXsKCQkJCWNhc2UgRDNERk1UX05VTEw6CQkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6UmVuZGVyVGFyZ2V0OjpOVUxMXykJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX1I4RzhCODoJCQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpSZW5kZXJUYXJnZXQ6OlI4RzhCOCkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfUjVHNkI1OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlJlbmRlclRhcmdldDo6UjVHNkI1KQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9YMVI1RzVCNToJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlJlbmRlclRhcmdldDo6WDFSNUc1QjUpCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0ExUjVHNUI1OgkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6UmVuZGVyVGFyZ2V0OjpBMVI1RzVCNSkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfQTRSNEc0QjQ6CQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpSZW5kZXJUYXJnZXQ6OkE0UjRHNEI0KQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9SM0czQjI6CQkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6UmVuZGVyVGFyZ2V0OjpSM0czQjIpCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0E4UjNHM0IyOgkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6UmVuZGVyVGFyZ2V0OjpBOFIzRzNCMikJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfWDRSNEc0QjQ6CQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpSZW5kZXJUYXJnZXQ6Olg0UjRHNEI0KQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9BOFI4RzhCODoJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlJlbmRlclRhcmdldDo6QThSOEc4QjgpCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX1g4UjhHOEI4OgkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6UmVuZGVyVGFyZ2V0OjpYOFI4RzhCOCkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfQThCOEc4Ujg6CQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpSZW5kZXJUYXJnZXQ6OkE4QjhHOFI4KQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9YOEI4RzhSODoJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlJlbmRlclRhcmdldDo6WDhCOEc4UjgpCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCS8vIEludGVnZXIgSERSIGZvcm1hdHMKCQkJCWNhc2UgRDNERk1UX0cxNlIxNjoJCQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpSZW5kZXJUYXJnZXQ6OkcxNlIxNikJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfQTJCMTBHMTBSMTA6CWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlJlbmRlclRhcmdldDo6QTJCMTBHMTBSMTApCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfQTJSMTBHMTBCMTA6CWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlJlbmRlclRhcmdldDo6QTJSMTBHMTBCMTApCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfQTE2QjE2RzE2UjE2OglpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpSZW5kZXJUYXJnZXQ6OkExNkIxNkcxNlIxNikJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQkvLyBGbG9hdGluZy1wb2ludCBmb3JtYXRzCgkJCQljYXNlIEQzREZNVF9SMTZGOgkJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlJlbmRlclRhcmdldDo6UjE2RikJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0cxNlIxNkY6CQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpSZW5kZXJUYXJnZXQ6OkcxNlIxNkYpCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0ExNkIxNkcxNlIxNkY6CWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlJlbmRlclRhcmdldDo6QTE2QjE2RzE2UjE2RikJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9SMzJGOgkJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlJlbmRlclRhcmdldDo6UjMyRikJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0czMlIzMkY6CQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpSZW5kZXJUYXJnZXQ6OkczMlIzMkYpCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0EzMkIzMkczMlIzMkY6CWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlJlbmRlclRhcmdldDo6QTMyQjMyRzMyUjMyRikJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQlkZWZhdWx0OgoJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsKCQkJCX0KCQkJfQoJCQllbHNlIGlmKHVzYWdlICYgRDNEVVNBR0VfREVQVEhTVEVOQ0lMKQoJCQl7CgkJCQlzd2l0Y2goY2hlY2tGb3JtYXQpCgkJCQl7CgkJCQljYXNlIEQzREZNVF9EMzI6CQkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6RGVwdGhTdGVuY2lsOjpEMzIpCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9EMjRTODoJCQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpEZXB0aFN0ZW5jaWw6OkQyNFM4KQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfRDI0WDg6CQkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6RGVwdGhTdGVuY2lsOjpEMjRYOCkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0QxNjoJCQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpEZXB0aFN0ZW5jaWw6OkQxNikJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0QyNEZTODoJCQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpEZXB0aFN0ZW5jaWw6OkQyNEZTOCkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfRDMyRl9MT0NLQUJMRToJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6RGVwdGhTdGVuY2lsOjpEMzJGX0xPQ0tBQkxFKQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0RGMjQ6CQkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6RGVwdGhTdGVuY2lsOjpERjI0KQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfREYxNjoJCQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpEZXB0aFN0ZW5jaWw6OkRGMTYpCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9JTlRaOgkJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkRlcHRoU3RlbmNpbDo6SU5UWikJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWRlZmF1bHQ6CgkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwoJCQkJfQoJCQl9CgkJCWVsc2UKCQkJewoJCQkJc3dpdGNoKGNoZWNrRm9ybWF0KQoJCQkJewoJCQkJY2FzZSBEM0RGTVRfQTg6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkE4KQkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX1I1RzZCNToJCQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpSNUc2QjUpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9YMVI1RzVCNToJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlgxUjVHNUI1KQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9BMVI1RzVCNToJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkExUjVHNUI1KQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9BNFI0RzRCNDoJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkE0UjRHNEI0KQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9SM0czQjI6CQkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6UjNHM0IyKQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfQThSM0czQjI6CQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpBOFIzRzNCMikJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfWDRSNEc0QjQ6CQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpYNFI0RzRCNCkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfUjhHOEI4OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlI4RzhCOCkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX1g4UjhHOEI4OgkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6WDhSOEc4QjgpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0E4UjhHOEI4OgkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6QThSOEc4QjgpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX1g4QjhHOFI4OgkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6WDhCOEc4UjgpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0E4QjhHOFI4OgkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6QThCOEc4UjgpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCS8vIFBhbGV0dGVkIGZvcm1hdHMKCQkJCWNhc2UgRDNERk1UX1A4OgkJCQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpQOCkJCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9BOFA4OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkE4UDgpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQkvLyBJbnRlZ2VyIEhEUiBmb3JtYXRzCgkJCQljYXNlIEQzREZNVF9HMTZSMTY6CQkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6RzE2UjE2KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfQTJSMTBHMTBCMTA6CWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkEyUjEwRzEwQjEwKQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9BMkIxMEcxMFIxMDoJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6QTJCMTBHMTBSMTApCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0ExNkIxNkcxNlIxNjoJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6QTE2QjE2RzE2UjE2KQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCS8vIENvbXByZXNzZWQgZm9ybWF0cwoJCQkJY2FzZSBEM0RGTVRfRFhUMToJCQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpEWFQxKQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfRFhUMjoJCQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpEWFQyKQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfRFhUMzoJCQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpEWFQzKQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfRFhUNDoJCQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpEWFQ0KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfRFhUNToJCQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpEWFQ1KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfQVRJMToJCQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpBVEkxKQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfQVRJMjoJCQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpBVEkyKQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJLy8gRmxvYXRpbmctcG9pbnQgZm9ybWF0cwoJCQkJY2FzZSBEM0RGTVRfUjE2RjoJCQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpSMTZGKQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfRzE2UjE2RjoJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkcxNlIxNkYpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9BMTZCMTZHMTZSMTZGOglpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpBMTZCMTZHMTZSMTZGKQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX1IzMkY6CQkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6UjMyRikJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0czMlIzMkY6CQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpHMzJSMzJGKQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfQTMyQjMyRzMyUjMyRjoJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6QTMyQjMyRzMyUjMyRikJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQkvLyBCdW1wIG1hcCBmb3JtYXRzCgkJCQljYXNlIEQzREZNVF9WOFU4OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlY4VTgpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9MNlY1VTU6CQkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6TDZWNVU1KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfWDhMOFY4VTg6CQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpYOEw4VjhVOCkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfUThXOFY4VTg6CQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpROFc4VjhVOCkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfVjE2VTE2OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlYxNlUxNikJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0EyVzEwVjEwVTEwOglpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpBMlcxMFYxMFUxMCkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfUTE2VzE2VjE2VTE2OglpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpRMTZXMTZWMTZVMTYpCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJLy8gTHVtaW5hbmNlIGZvcm1hdHMKCQkJCWNhc2UgRDNERk1UX0w4OgkJCQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpMOCkJCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9BNEw0OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkE0TDQpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9MMTY6CQkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6TDE2KQkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0E4TDg6CQkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6QThMOCkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCS8vIERlcHRoIEJvdW5kcyBUZXN0CgkJCQljYXNlIEQzREZNVF9OVkRCOgkJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6Ok5WREIpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQkvLyBUcmFuc3BhcmVuY3kgYW50aS1hbGlhc2luZwoJCQkJY2FzZSBEM0RGTVRfQVRPQzoJCQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpBVE9DKQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJZGVmYXVsdDoKCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CgkJCQl9CgkJCX0KCQljYXNlIEQzRFJUWVBFX1ZPTFVNRToKCQkJc3dpdGNoKGNoZWNrRm9ybWF0KQoJCQl7CgkJCWNhc2UgRDNERk1UX0E4OgkJCQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lOjpBOCkJCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCWNhc2UgRDNERk1UX1I1RzZCNToJCQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lOjpSNUc2QjUpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCWNhc2UgRDNERk1UX1gxUjVHNUI1OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZTo6WDFSNUc1QjUpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCWNhc2UgRDNERk1UX0ExUjVHNUI1OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZTo6QTFSNUc1QjUpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCWNhc2UgRDNERk1UX0E0UjRHNEI0OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZTo6QTRSNEc0QjQpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCWNhc2UgRDNERk1UX1IzRzNCMjoJCQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lOjpSM0czQjIpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCWNhc2UgRDNERk1UX0E4UjNHM0IyOgkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZTo6QThSM0czQjIpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCWNhc2UgRDNERk1UX1g0UjRHNEI0OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZTo6WDRSNEc0QjQpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCWNhc2UgRDNERk1UX1I4RzhCODoJCQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lOjpSOEc4QjgpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCWNhc2UgRDNERk1UX1g4UjhHOEI4OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZTo6WDhSOEc4QjgpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCWNhc2UgRDNERk1UX0E4UjhHOEI4OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZTo6QThSOEc4QjgpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCWNhc2UgRDNERk1UX1g4QjhHOFI4OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZTo6WDhCOEc4UjgpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCWNhc2UgRDNERk1UX0E4QjhHOFI4OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZTo6QThCOEc4UjgpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCS8vIFBhbGV0dGVkIGZvcm1hdHMKCQkJY2FzZSBEM0RGTVRfUDg6CQkJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWU6OlA4KQkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJY2FzZSBEM0RGTVRfQThQODoJCQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lOjpBOFA4KQkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJLy8gSW50ZWdlciBIRFIgZm9ybWF0cwoJCQljYXNlIEQzREZNVF9HMTZSMTY6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZTo6RzE2UjE2KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQljYXNlIEQzREZNVF9BMlIxMEcxMEIxMDoJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZTo6QTJSMTBHMTBCMTApCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJY2FzZSBEM0RGTVRfQTJCMTBHMTBSMTA6CQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWU6OkEyQjEwRzEwUjEwKQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCWNhc2UgRDNERk1UX0ExNkIxNkcxNlIxNjoJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZTo6QTE2QjE2RzE2UjE2KQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCS8vIENvbXByZXNzZWQgZm9ybWF0cwoJCQljYXNlIEQzREZNVF9EWFQxOgkJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWU6OkRYVDEpCQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQljYXNlIEQzREZNVF9EWFQyOgkJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWU6OkRYVDIpCQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQljYXNlIEQzREZNVF9EWFQzOgkJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWU6OkRYVDMpCQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQljYXNlIEQzREZNVF9EWFQ0OgkJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWU6OkRYVDQpCQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQljYXNlIEQzREZNVF9EWFQ1OgkJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWU6OkRYVDUpCQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQljYXNlIEQzREZNVF9BVEkxOgkJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWU6OkFUSTEpCQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQljYXNlIEQzREZNVF9BVEkyOgkJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWU6OkFUSTIpCQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkvLyBGbG9hdGluZy1wb2ludCBmb3JtYXRzCgkJCWNhc2UgRDNERk1UX1IxNkY6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZTo6UjE2RikJCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCWNhc2UgRDNERk1UX0cxNlIxNkY6CQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lOjpHMTZSMTZGKQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQljYXNlIEQzREZNVF9BMTZCMTZHMTZSMTZGOgkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lOjpBMTZCMTZHMTZSMTZGKQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJY2FzZSBEM0RGTVRfUjMyRjoJCQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lOjpSMzJGKQkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJY2FzZSBEM0RGTVRfRzMyUjMyRjoJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWU6OkczMlIzMkYpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCWNhc2UgRDNERk1UX0EzMkIzMkczMlIzMkY6CQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWU6OkEzMkIzMkczMlIzMkYpCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkvLyBCdW1wIG1hcCBmb3JtYXRzCgkJCWNhc2UgRDNERk1UX1Y4VTg6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZTo6VjhVOCkJCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCWNhc2UgRDNERk1UX0w2VjVVNToJCQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lOjpMNlY1VTUpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCWNhc2UgRDNERk1UX1g4TDhWOFU4OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZTo6WDhMOFY4VTgpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCWNhc2UgRDNERk1UX1E4VzhWOFU4OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZTo6UThXOFY4VTgpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCWNhc2UgRDNERk1UX1YxNlUxNjoJCQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lOjpWMTZVMTYpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCWNhc2UgRDNERk1UX0EyVzEwVjEwVTEwOgkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lOjpBMlcxMFYxMFUxMCkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQljYXNlIEQzREZNVF9RMTZXMTZWMTZVMTY6CQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWU6OlExNlcxNlYxNlUxNikJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkvLyBMdW1pbmFuY2UgZm9ybWF0cwoJCQljYXNlIEQzREZNVF9MODoJCQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZTo6TDgpCQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQljYXNlIEQzREZNVF9BNEw0OgkJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWU6OkE0TDQpCQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQljYXNlIEQzREZNVF9MMTY6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZTo6TDE2KQkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJY2FzZSBEM0RGTVRfQThMODoJCQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lOjpBOEw4KQkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJZGVmYXVsdDoKCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsKCQkJfQoJCWNhc2UgRDNEUlRZUEVfQ1VCRVRFWFRVUkU6CgkJCWlmKHVzYWdlICYgRDNEVVNBR0VfUkVOREVSVEFSR0VUKQoJCQl7CgkJCQlzd2l0Y2goY2hlY2tGb3JtYXQpCgkJCQl7CgkJCQljYXNlIEQzREZNVF9OVUxMOgkJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OlJlbmRlclRhcmdldDo6TlVMTF8pCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9SOEc4Qjg6CQkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6UmVuZGVyVGFyZ2V0OjpSOEc4QjgpCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX1I1RzZCNToJCQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpSZW5kZXJUYXJnZXQ6OlI1RzZCNSkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfWDFSNUc1QjU6CQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpSZW5kZXJUYXJnZXQ6OlgxUjVHNUI1KQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9BMVI1RzVCNToJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OlJlbmRlclRhcmdldDo6QTFSNUc1QjUpCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0E0UjRHNEI0OgkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6UmVuZGVyVGFyZ2V0OjpBNFI0RzRCNCkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfUjNHM0IyOgkJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OlJlbmRlclRhcmdldDo6UjNHM0IyKQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9BOFIzRzNCMjoJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OlJlbmRlclRhcmdldDo6QThSM0czQjIpCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX1g0UjRHNEI0OgkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6UmVuZGVyVGFyZ2V0OjpYNFI0RzRCNCkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfQThSOEc4Qjg6CQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpSZW5kZXJUYXJnZXQ6OkE4UjhHOEI4KQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9YOFI4RzhCODoJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OlJlbmRlclRhcmdldDo6WDhSOEc4QjgpCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0E4QjhHOFI4OgkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6UmVuZGVyVGFyZ2V0OjpBOEI4RzhSOCkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfWDhCOEc4Ujg6CQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpSZW5kZXJUYXJnZXQ6Olg4QjhHOFI4KQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQkvLyBJbnRlZ2VyIEhEUiBmb3JtYXRzCgkJCQljYXNlIEQzREZNVF9HMTZSMTY6CQkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6UmVuZGVyVGFyZ2V0OjpHMTZSMTYpCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0EyQjEwRzEwUjEwOglpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpSZW5kZXJUYXJnZXQ6OkEyQjEwRzEwUjEwKQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0EyUjEwRzEwQjEwOglpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpSZW5kZXJUYXJnZXQ6OkEyUjEwRzEwQjEwKQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0ExNkIxNkcxNlIxNjoJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6UmVuZGVyVGFyZ2V0OjpBMTZCMTZHMTZSMTYpCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJLy8gRmxvYXRpbmctcG9pbnQgZm9ybWF0cwoJCQkJY2FzZSBEM0RGTVRfUjE2RjoJCQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpSZW5kZXJUYXJnZXQ6OlIxNkYpCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9HMTZSMTZGOgkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6UmVuZGVyVGFyZ2V0OjpHMTZSMTZGKQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9BMTZCMTZHMTZSMTZGOglpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpSZW5kZXJUYXJnZXQ6OkExNkIxNkcxNlIxNkYpCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfUjMyRjoJCQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpSZW5kZXJUYXJnZXQ6OlIzMkYpCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9HMzJSMzJGOgkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6UmVuZGVyVGFyZ2V0OjpHMzJSMzJGKQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9BMzJCMzJHMzJSMzJGOglpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpSZW5kZXJUYXJnZXQ6OkEzMkIzMkczMlIzMkYpCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJZGVmYXVsdDoKCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CgkJCQl9CgkJCX0KCQkJZWxzZSBpZih1c2FnZSAmIEQzRFVTQUdFX0RFUFRIU1RFTkNJTCkKCQkJewoJCQkJc3dpdGNoKGNoZWNrRm9ybWF0KQoJCQkJewoJCQkJY2FzZSBEM0RGTVRfRDMyOgkJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkRlcHRoU3RlbmNpbDo6RDMyKQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfRDI0Uzg6CQkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6RGVwdGhTdGVuY2lsOjpEMjRTOCkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0QyNFg4OgkJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkRlcHRoU3RlbmNpbDo6RDI0WDgpCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9EMTY6CQkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6RGVwdGhTdGVuY2lsOjpEMTYpCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9EMjRGUzg6CQkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6RGVwdGhTdGVuY2lsOjpEMjRGUzgpCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0QzMkZfTE9DS0FCTEU6CWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkRlcHRoU3RlbmNpbDo6RDMyRl9MT0NLQUJMRSkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9ERjI0OgkJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkRlcHRoU3RlbmNpbDo6REYyNCkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0RGMTY6CQkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6RGVwdGhTdGVuY2lsOjpERjE2KQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfSU5UWjoJCQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpEZXB0aFN0ZW5jaWw6OklOVFopCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQlkZWZhdWx0OgoJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsKCQkJCX0KCQkJfQoJCQllbHNlCgkJCXsKCQkJCXN3aXRjaChjaGVja0Zvcm1hdCkKCQkJCXsKCQkJCWNhc2UgRDNERk1UX0E4OgkJCQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpBOCkJCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9SNUc2QjU6CQkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6UjVHNkI1KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfWDFSNUc1QjU6CQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpYMVI1RzVCNSkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfQTFSNUc1QjU6CQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpBMVI1RzVCNSkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfQTRSNEc0QjQ6CQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpBNFI0RzRCNCkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfUjNHM0IyOgkJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OlIzRzNCMikJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0E4UjNHM0IyOgkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6QThSM0czQjIpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX1g0UjRHNEI0OgkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6WDRSNEc0QjQpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX1I4RzhCODoJCQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpSOEc4QjgpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9YOFI4RzhCODoJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6Olg4UjhHOEI4KQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9BOFI4RzhCODoJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkE4UjhHOEI4KQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9YOEI4RzhSODoJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6Olg4QjhHOFI4KQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9BOEI4RzhSODoJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkE4QjhHOFI4KQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQkvLyBQYWxldHRlZCBmb3JtYXRzCgkJCQljYXNlIEQzREZNVF9QODoJCQkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6UDgpCQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfQThQODoJCQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpBOFA4KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJLy8gSW50ZWdlciBIRFIgZm9ybWF0cwoJCQkJY2FzZSBEM0RGTVRfRzE2UjE2OgkJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkcxNlIxNikJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0EyUjEwRzEwQjEwOglpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpBMlIxMEcxMEIxMCkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfQTJCMTBHMTBSMTA6CWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkEyQjEwRzEwUjEwKQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9BMTZCMTZHMTZSMTY6CWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkExNkIxNkcxNlIxNikJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQkvLyBDb21wcmVzc2VkIGZvcm1hdHMKCQkJCWNhc2UgRDNERk1UX0RYVDE6CQkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6RFhUMSkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0RYVDI6CQkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6RFhUMikJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0RYVDM6CQkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6RFhUMykJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0RYVDQ6CQkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6RFhUNCkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0RYVDU6CQkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6RFhUNSkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0FUSTE6CQkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6QVRJMSkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0FUSTI6CQkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6QVRJMikJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCS8vIEZsb2F0aW5nLXBvaW50IGZvcm1hdHMKCQkJCWNhc2UgRDNERk1UX1IxNkY6CQkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6UjE2RikJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0cxNlIxNkY6CQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpHMTZSMTZGKQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfQTE2QjE2RzE2UjE2RjoJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6QTE2QjE2RzE2UjE2RikJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9SMzJGOgkJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OlIzMkYpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9HMzJSMzJGOgkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6RzMyUjMyRikJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0EzMkIzMkczMlIzMkY6CWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkEzMkIzMkczMlIzMkYpCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJLy8gQnVtcCBtYXAgZm9ybWF0cwoJCQkJY2FzZSBEM0RGTVRfVjhVODoJCQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpWOFU4KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfTDZWNVU1OgkJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6Okw2VjVVNSkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX1g4TDhWOFU4OgkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6WDhMOFY4VTgpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX1E4VzhWOFU4OgkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6UThXOFY4VTgpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX1YxNlUxNjoJCQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpWMTZVMTYpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9BMlcxMFYxMFUxMDoJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6QTJXMTBWMTBVMTApCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX1ExNlcxNlYxNlUxNjoJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6UTE2VzE2VjE2VTE2KQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCS8vIEx1bWluYW5jZSBmb3JtYXRzCgkJCQljYXNlIEQzREZNVF9MODoJCQkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6TDgpCQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfQTRMNDoJCQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpBNEw0KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfTDE2OgkJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkwxNikJCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9BOEw4OgkJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkE4TDgpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQlkZWZhdWx0OgoJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsKCQkJCX0KCQkJfQoJCWNhc2UgRDNEUlRZUEVfVk9MVU1FVEVYVFVSRToKCQkJc3dpdGNoKGNoZWNrRm9ybWF0KQoJCQl7CgkJCWNhc2UgRDNERk1UX0E4OgkJCQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6QTgpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJY2FzZSBEM0RGTVRfUjVHNkI1OgkJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpSNUc2QjUpCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQljYXNlIEQzREZNVF9YMVI1RzVCNToJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpYMVI1RzVCNSkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCWNhc2UgRDNERk1UX0ExUjVHNUI1OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OkExUjVHNUI1KQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJY2FzZSBEM0RGTVRfQTRSNEc0QjQ6CQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6QTRSNEc0QjQpCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQljYXNlIEQzREZNVF9SM0czQjI6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OlIzRzNCMikJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCWNhc2UgRDNERk1UX0E4UjNHM0IyOgkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OkE4UjNHM0IyKQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJY2FzZSBEM0RGTVRfWDRSNEc0QjQ6CQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6WDRSNEc0QjQpCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQljYXNlIEQzREZNVF9SOEc4Qjg6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OlI4RzhCOCkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCWNhc2UgRDNERk1UX1g4UjhHOEI4OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6Olg4UjhHOEI4KQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJY2FzZSBEM0RGTVRfQThSOEc4Qjg6CQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6QThSOEc4QjgpCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQljYXNlIEQzREZNVF9YOEI4RzhSODoJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpYOEI4RzhSOCkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCWNhc2UgRDNERk1UX0E4QjhHOFI4OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OkE4QjhHOFI4KQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJLy8gUGFsZXR0ZWQgZm9ybWF0cwoJCQljYXNlIEQzREZNVF9QODoJCQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OlA4KQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCWNhc2UgRDNERk1UX0E4UDg6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OkE4UDgpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJLy8gSW50ZWdlciBIRFIgZm9ybWF0cwoJCQljYXNlIEQzREZNVF9HMTZSMTY6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OkcxNlIxNikJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCWNhc2UgRDNERk1UX0EyUjEwRzEwQjEwOgkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6QTJSMTBHMTBCMTApCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCWNhc2UgRDNERk1UX0EyQjEwRzEwUjEwOgkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6QTJCMTBHMTBSMTApCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCWNhc2UgRDNERk1UX0ExNkIxNkcxNlIxNjoJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OkExNkIxNkcxNlIxNikJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJLy8gQ29tcHJlc3NlZCBmb3JtYXRzCgkJCWNhc2UgRDNERk1UX0RYVDE6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OkRYVDEpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJY2FzZSBEM0RGTVRfRFhUMjoJCQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6RFhUMikJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQljYXNlIEQzREZNVF9EWFQzOgkJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpEWFQzKQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCWNhc2UgRDNERk1UX0RYVDQ6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OkRYVDQpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJY2FzZSBEM0RGTVRfRFhUNToJCQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6RFhUNSkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQljYXNlIEQzREZNVF9BVEkxOgkJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpBVEkxKQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCWNhc2UgRDNERk1UX0FUSTI6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OkFUSTIpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJLy8gRmxvYXRpbmctcG9pbnQgZm9ybWF0cwoJCQljYXNlIEQzREZNVF9SMTZGOgkJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpSMTZGKQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCWNhc2UgRDNERk1UX0cxNlIxNkY6CQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6RzE2UjE2RikJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCWNhc2UgRDNERk1UX0ExNkIxNkcxNlIxNkY6CQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpBMTZCMTZHMTZSMTZGKQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQljYXNlIEQzREZNVF9SMzJGOgkJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpSMzJGKQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCWNhc2UgRDNERk1UX0czMlIzMkY6CQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6RzMyUjMyRikJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCWNhc2UgRDNERk1UX0EzMkIzMkczMlIzMkY6CQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpBMzJCMzJHMzJSMzJGKQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkvLyBCdW1wIG1hcCBmb3JtYXRzCgkJCWNhc2UgRDNERk1UX1Y4VTg6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OlY4VTgpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJY2FzZSBEM0RGTVRfTDZWNVU1OgkJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpMNlY1VTUpCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQljYXNlIEQzREZNVF9YOEw4VjhVODoJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpYOEw4VjhVOCkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCWNhc2UgRDNERk1UX1E4VzhWOFU4OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OlE4VzhWOFU4KQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJY2FzZSBEM0RGTVRfVjE2VTE2OgkJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpWMTZVMTYpCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQljYXNlIEQzREZNVF9BMlcxMFYxMFUxMDoJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OkEyVzEwVjEwVTEwKQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQljYXNlIEQzREZNVF9RMTZXMTZWMTZVMTY6CQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpRMTZXMTZWMTZVMTYpCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCS8vIEx1bWluYW5jZSBmb3JtYXRzCgkJCWNhc2UgRDNERk1UX0w4OgkJCQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6TDgpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJY2FzZSBEM0RGTVRfQTRMNDoJCQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6QTRMNCkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQljYXNlIEQzREZNVF9MMTY6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OkwxNikJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQljYXNlIEQzREZNVF9BOEw4OgkJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpBOEw4KQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCWRlZmF1bHQ6CgkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CgkJCX0KCQljYXNlIEQzRFJUWVBFX1RFWFRVUkU6CgkJCWlmKHVzYWdlICYgRDNEVVNBR0VfUkVOREVSVEFSR0VUKQoJCQl7CgkJCQlzd2l0Y2goY2hlY2tGb3JtYXQpCgkJCQl7CgkJCQljYXNlIEQzREZNVF9OVUxMOgkJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OlJlbmRlclRhcmdldDo6TlVMTF8pCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9SOEc4Qjg6CQkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6UmVuZGVyVGFyZ2V0OjpSOEc4QjgpCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX1I1RzZCNToJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpSZW5kZXJUYXJnZXQ6OlI1RzZCNSkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfWDFSNUc1QjU6CQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpSZW5kZXJUYXJnZXQ6OlgxUjVHNUI1KQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9BMVI1RzVCNToJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OlJlbmRlclRhcmdldDo6QTFSNUc1QjUpCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0E0UjRHNEI0OgkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6UmVuZGVyVGFyZ2V0OjpBNFI0RzRCNCkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfUjNHM0IyOgkJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OlJlbmRlclRhcmdldDo6UjNHM0IyKQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9BOFIzRzNCMjoJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OlJlbmRlclRhcmdldDo6QThSM0czQjIpCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX1g0UjRHNEI0OgkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6UmVuZGVyVGFyZ2V0OjpYNFI0RzRCNCkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfQThSOEc4Qjg6CQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpSZW5kZXJUYXJnZXQ6OkE4UjhHOEI4KQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9YOFI4RzhCODoJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OlJlbmRlclRhcmdldDo6WDhSOEc4QjgpCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0E4QjhHOFI4OgkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6UmVuZGVyVGFyZ2V0OjpBOEI4RzhSOCkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfWDhCOEc4Ujg6CQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpSZW5kZXJUYXJnZXQ6Olg4QjhHOFI4KQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQkvLyBJbnRlZ2VyIEhEUiBmb3JtYXRzCgkJCQljYXNlIEQzREZNVF9HMTZSMTY6CQkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6UmVuZGVyVGFyZ2V0OjpHMTZSMTYpCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0EyQjEwRzEwUjEwOglpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpSZW5kZXJUYXJnZXQ6OkEyQjEwRzEwUjEwKQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0EyUjEwRzEwQjEwOglpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpSZW5kZXJUYXJnZXQ6OkEyUjEwRzEwQjEwKQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0ExNkIxNkcxNlIxNjoJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6UmVuZGVyVGFyZ2V0OjpBMTZCMTZHMTZSMTYpCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJLy8gRmxvYXRpbmctcG9pbnQgZm9ybWF0cwoJCQkJY2FzZSBEM0RGTVRfUjE2RjoJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpSZW5kZXJUYXJnZXQ6OlIxNkYpCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9HMTZSMTZGOgkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6UmVuZGVyVGFyZ2V0OjpHMTZSMTZGKQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9BMTZCMTZHMTZSMTZGOglpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpSZW5kZXJUYXJnZXQ6OkExNkIxNkcxNlIxNkYpCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfUjMyRjoJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpSZW5kZXJUYXJnZXQ6OlIzMkYpCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9HMzJSMzJGOgkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6UmVuZGVyVGFyZ2V0OjpHMzJSMzJGKQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9BMzJCMzJHMzJSMzJGOglpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpSZW5kZXJUYXJnZXQ6OkEzMkIzMkczMlIzMkYpCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJZGVmYXVsdDoKCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CgkJCQl9CgkJCX0KCQkJZWxzZSBpZih1c2FnZSAmIEQzRFVTQUdFX0RFUFRIU1RFTkNJTCkKCQkJewoJCQkJc3dpdGNoKGNoZWNrRm9ybWF0KQoJCQkJewoJCQkJY2FzZSBEM0RGTVRfRDMyOgkJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkRlcHRoU3RlbmNpbDo6RDMyKQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfRDI0Uzg6CQkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6RGVwdGhTdGVuY2lsOjpEMjRTOCkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0QyNFg4OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkRlcHRoU3RlbmNpbDo6RDI0WDgpCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9EMTY6CQkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6RGVwdGhTdGVuY2lsOjpEMTYpCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9EMjRGUzg6CQkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6RGVwdGhTdGVuY2lsOjpEMjRGUzgpCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0QzMkZfTE9DS0FCTEU6CWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkRlcHRoU3RlbmNpbDo6RDMyRl9MT0NLQUJMRSkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9ERjI0OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkRlcHRoU3RlbmNpbDo6REYyNCkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0RGMTY6CQkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6RGVwdGhTdGVuY2lsOjpERjE2KQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfSU5UWjoJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpEZXB0aFN0ZW5jaWw6OklOVFopCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQlkZWZhdWx0OgoJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsKCQkJCX0KCQkJfQoJCQllbHNlCgkJCXsKCQkJCXN3aXRjaChjaGVja0Zvcm1hdCkKCQkJCXsKCQkJCWNhc2UgRDNERk1UX05VTEw6CQkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6TlVMTF8pCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9BODoJCQkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6QTgpCQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfUjVHNkI1OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OlI1RzZCNSkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX1gxUjVHNUI1OgkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6WDFSNUc1QjUpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0ExUjVHNUI1OgkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6QTFSNUc1QjUpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0E0UjRHNEI0OgkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6QTRSNEc0QjQpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX1IzRzNCMjoJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpSM0czQjIpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9BOFIzRzNCMjoJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkE4UjNHM0IyKQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9YNFI0RzRCNDoJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6Olg0UjRHNEI0KQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9SOEc4Qjg6CQkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6UjhHOEI4KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfWDhSOEc4Qjg6CQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpYOFI4RzhCOCkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfQThSOEc4Qjg6CQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpBOFI4RzhCOCkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfWDhCOEc4Ujg6CQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpYOEI4RzhSOCkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfQThCOEc4Ujg6CQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpBOEI4RzhSOCkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJLy8gUGFsZXR0ZWQgZm9ybWF0cwoJCQkJY2FzZSBEM0RGTVRfUDg6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OlA4KQkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0E4UDg6CQkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6QThQOCkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCS8vIEludGVnZXIgSERSIGZvcm1hdHMKCQkJCWNhc2UgRDNERk1UX0cxNlIxNjoJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpHMTZSMTYpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9BMlIxMEcxMEIxMDoJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6QTJSMTBHMTBCMTApCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0EyQjEwRzEwUjEwOglpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpBMkIxMEcxMFIxMCkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfQTE2QjE2RzE2UjE2OglpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpBMTZCMTZHMTZSMTYpCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJLy8gQ29tcHJlc3NlZCBmb3JtYXRzCgkJCQljYXNlIEQzREZNVF9EWFQxOgkJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkRYVDEpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9EWFQyOgkJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkRYVDIpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9EWFQzOgkJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkRYVDMpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9EWFQ0OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkRYVDQpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9EWFQ1OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkRYVDUpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9BVEkxOgkJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkFUSTEpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9BVEkyOgkJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkFUSTIpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQkvLyBGbG9hdGluZy1wb2ludCBmb3JtYXRzCgkJCQljYXNlIEQzREZNVF9SMTZGOgkJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OlIxNkYpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9HMTZSMTZGOgkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6RzE2UjE2RikJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0ExNkIxNkcxNlIxNkY6CWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkExNkIxNkcxNlIxNkYpCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfUjMyRjoJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpSMzJGKQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfRzMyUjMyRjoJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkczMlIzMkYpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9BMzJCMzJHMzJSMzJGOglpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpBMzJCMzJHMzJSMzJGKQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCS8vIEJ1bXAgbWFwIGZvcm1hdHMKCQkJCWNhc2UgRDNERk1UX1Y4VTg6CQkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6VjhVOCkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0w2VjVVNToJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpMNlY1VTUpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9YOEw4VjhVODoJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6Olg4TDhWOFU4KQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9ROFc4VjhVODoJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OlE4VzhWOFU4KQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9WMTZVMTY6CQkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6VjE2VTE2KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfQTJXMTBWMTBVMTA6CWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkEyVzEwVjEwVTEwKQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9RMTZXMTZWMTZVMTY6CWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OlExNlcxNlYxNlUxNikJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQkvLyBMdW1pbmFuY2UgZm9ybWF0cwoJCQkJY2FzZSBEM0RGTVRfTDg6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6Okw4KQkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0E0TDQ6CQkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6QTRMNCkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0wxNjoJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpMMTYpCQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfQThMODoJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpBOEw4KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJLy8gRGVwdGggZm9ybWF0cwoJCQkJY2FzZSBEM0RGTVRfRDMyOgkJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkQzMikJCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9EMjRTODoJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpEMjRTOCkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0QyNFg4OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkQyNFg4KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfRDE2OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkQxNikJCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9EMjRGUzg6CQkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6RDI0RlM4KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfRDMyRl9MT0NLQUJMRToJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6RDMyRl9MT0NLQUJMRSkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9ERjI0OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkRGMjQpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9ERjE2OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkRGMTYpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9JTlRaOgkJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OklOVFopCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQlkZWZhdWx0OgoJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsKCQkJCX0KCQkJfQoJCWNhc2UgRDNEUlRZUEVfVkVSVEVYQlVGRkVSOgoJCQlpZihjaGVja0Zvcm1hdCA9PSBEM0RGTVRfVkVSVEVYREFUQSkKCQkJewoJCQkJcmV0dXJuIEQzRF9PSzsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsKCQkJfQoJCWNhc2UgRDNEUlRZUEVfSU5ERVhCVUZGRVI6CgkJCXN3aXRjaChjaGVja0Zvcm1hdCkKCQkJewoJCQljYXNlIEQzREZNVF9JTkRFWDE2OgoJCQljYXNlIEQzREZNVF9JTkRFWDMyOgoJCQkJcmV0dXJuIEQzRF9PSzsKCQkJZGVmYXVsdDoKCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsKCQkJfTsKCQlkZWZhdWx0OgoJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CgkJfQoJfQoKCWxvbmcgRGlyZWN0M0Q5OjpDaGVja0RldmljZUZvcm1hdENvbnZlcnNpb24odW5zaWduZWQgaW50IGFkYXB0ZXIsIEQzRERFVlRZUEUgZGV2aWNlVHlwZSwgRDNERk9STUFUIHNvdXJjZUZvcm1hdCwgRDNERk9STUFUIHRhcmdldEZvcm1hdCkKCXsKCQlUUkFDRSgidW5zaWduZWQgaW50IGFkYXB0ZXIgPSAlZCwgRDNEREVWVFlQRSBkZXZpY2VUeXBlID0gJWQsIEQzREZPUk1BVCBzb3VyY2VGb3JtYXQgPSAlZCwgRDNERk9STUFUIHRhcmdldEZvcm1hdCA9ICVkIiwgYWRhcHRlciwgZGV2aWNlVHlwZSwgc291cmNlRm9ybWF0LCB0YXJnZXRGb3JtYXQpOwoKCQlpZihkZXZpY2VUeXBlICE9IEQzRERFVlRZUEVfSEFMKQoJCXsKCQkJbG9hZFN5c3RlbUQzRDkoKTsKCgkJCWlmKGQzZDkpCgkJCXsKCQkJCXJldHVybiBkM2Q5LT5DaGVja0RldmljZUZvcm1hdENvbnZlcnNpb24oYWRhcHRlciwgZGV2aWNlVHlwZSwgc291cmNlRm9ybWF0LCB0YXJnZXRGb3JtYXQpOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJcmV0dXJuIENoZWNrRGV2aWNlRm9ybWF0Q29udmVyc2lvbihhZGFwdGVyLCBEM0RERVZUWVBFX0hBTCwgc291cmNlRm9ybWF0LCB0YXJnZXRGb3JtYXQpOwoJCQl9CgkJfQoKCQlyZXR1cm4gRDNEX09LOwoJfQoKCWxvbmcgRGlyZWN0M0Q5OjpDaGVja0RldmljZU11bHRpU2FtcGxlVHlwZSh1bnNpZ25lZCBpbnQgYWRhcHRlciwgRDNEREVWVFlQRSBkZXZpY2VUeXBlLCBEM0RGT1JNQVQgc3VyZmFjZUZvcm1hdCwgaW50IHdpbmRvd2VkLCBEM0RNVUxUSVNBTVBMRV9UWVBFIG11bHRpU2FtcGxlVHlwZSwgdW5zaWduZWQgbG9uZyAqcXVhbGl0eUxldmVscykKCXsKCQlUUkFDRSgidW5zaWduZWQgaW50IGFkYXB0ZXIgPSAlZCwgRDNEREVWVFlQRSBkZXZpY2VUeXBlID0gJWQsIEQzREZPUk1BVCBzdXJmYWNlRm9ybWF0ID0gJWQsIGludCB3aW5kb3dlZCA9ICVkLCBEM0RNVUxUSVNBTVBMRV9UWVBFIG11bHRpU2FtcGxlVHlwZSA9ICVkLCB1bnNpZ25lZCBsb25nICpxdWFsaXR5TGV2ZWxzID0gMHglMC44cCIsIGFkYXB0ZXIsIGRldmljZVR5cGUsIHN1cmZhY2VGb3JtYXQsIHdpbmRvd2VkLCBtdWx0aVNhbXBsZVR5cGUsIHF1YWxpdHlMZXZlbHMpOwoKCQlpZihkZXZpY2VUeXBlICE9IEQzRERFVlRZUEVfSEFMKQoJCXsKCQkJbG9hZFN5c3RlbUQzRDkoKTsKCgkJCWlmKGQzZDkpCgkJCXsKCQkJCXJldHVybiBkM2Q5LT5DaGVja0RldmljZU11bHRpU2FtcGxlVHlwZShhZGFwdGVyLCBkZXZpY2VUeXBlLCBzdXJmYWNlRm9ybWF0LCB3aW5kb3dlZCwgbXVsdGlTYW1wbGVUeXBlLCBxdWFsaXR5TGV2ZWxzKTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCXJldHVybiBDaGVja0RldmljZU11bHRpU2FtcGxlVHlwZShhZGFwdGVyLCBEM0RERVZUWVBFX0hBTCwgc3VyZmFjZUZvcm1hdCwgd2luZG93ZWQsIG11bHRpU2FtcGxlVHlwZSwgcXVhbGl0eUxldmVscyk7CgkJCX0KCQl9CgoJCWlmKGFkYXB0ZXIgPj0gR2V0QWRhcHRlckNvdW50KCkpCgkJewoJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKCQl9CgoJCWlmKHF1YWxpdHlMZXZlbHMpCgkJewoJCQlpZihtdWx0aVNhbXBsZVR5cGUgPT0gRDNETVVMVElTQU1QTEVfTk9OTUFTS0FCTEUpCgkJCXsKCQkJCSpxdWFsaXR5TGV2ZWxzID0gNDsgICAvLyAyLCA0LCA4LCAxNiBzYW1wbGVzCgkJCX0KCQkJZWxzZQoJCQl7CgkJCQkqcXVhbGl0eUxldmVscyA9IDE7CgkJCX0KCQl9CgoJCWlmKG11bHRpU2FtcGxlVHlwZSA9PSBEM0RNVUxUSVNBTVBMRV9OT05FIHx8CgkJICAgbXVsdGlTYW1wbGVUeXBlID09IEQzRE1VTFRJU0FNUExFX05PTk1BU0tBQkxFIHx8CgkJICAgbXVsdGlTYW1wbGVUeXBlID09IEQzRE1VTFRJU0FNUExFXzJfU0FNUExFUyB8fAoJCSAgIG11bHRpU2FtcGxlVHlwZSA9PSBEM0RNVUxUSVNBTVBMRV80X1NBTVBMRVMgfHwKCQkgICBtdWx0aVNhbXBsZVR5cGUgPT0gRDNETVVMVElTQU1QTEVfOF9TQU1QTEVTIHx8CgkJICAgbXVsdGlTYW1wbGVUeXBlID09IEQzRE1VTFRJU0FNUExFXzE2X1NBTVBMRVMpCgkJewoJCQlpZihDaGVja0RldmljZUZvcm1hdChhZGFwdGVyLCBkZXZpY2VUeXBlLCBEM0RGTVRfWDhSOEc4QjgsIEQzRFVTQUdFX1JFTkRFUlRBUkdFVCwgRDNEUlRZUEVfU1VSRkFDRSwgc3VyZmFjZUZvcm1hdCkgPT0gRDNEX09LIHx8CgkJCSAgIENoZWNrRGV2aWNlRm9ybWF0KGFkYXB0ZXIsIGRldmljZVR5cGUsIEQzREZNVF9YOFI4RzhCOCwgRDNEVVNBR0VfREVQVEhTVEVOQ0lMLCBEM0RSVFlQRV9TVVJGQUNFLCBzdXJmYWNlRm9ybWF0KSA9PSBEM0RfT0spCgkJCXsKCQkJCWlmKHN1cmZhY2VGb3JtYXQgIT0gRDNERk1UX0QzMkZfTE9DS0FCTEUgJiYgc3VyZmFjZUZvcm1hdCAhPSBEM0RGTVRfRDE2X0xPQ0tBQkxFKQoJCQkJewoJCQkJCXJldHVybiBEM0RfT0s7CgkJCQl9CgkJCX0KCQl9CgoJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsKCX0KCglsb25nIERpcmVjdDNEOTo6Q2hlY2tEZXZpY2VUeXBlKHVuc2lnbmVkIGludCBhZGFwdGVyLCBEM0RERVZUWVBFIGNoZWNrVHlwZSwgRDNERk9STUFUIGRpc3BsYXlGb3JtYXQsIEQzREZPUk1BVCBiYWNrQnVmZmVyRm9ybWF0LCBpbnQgd2luZG93ZWQpCgl7CgkJVFJBQ0UoInVuc2lnbmVkIGludCBhZGFwdGVyID0gJWQsIEQzRERFVlRZUEUgY2hlY2tUeXBlID0gJWQsIEQzREZPUk1BVCBkaXNwbGF5Rm9ybWF0ID0gJWQsIEQzREZPUk1BVCBiYWNrQnVmZmVyRm9ybWF0ID0gJWQsIGludCB3aW5kb3dlZCA9ICVkIiwgYWRhcHRlciwgY2hlY2tUeXBlLCBkaXNwbGF5Rm9ybWF0LCBiYWNrQnVmZmVyRm9ybWF0LCB3aW5kb3dlZCk7CgoJCWlmKGNoZWNrVHlwZSAhPSBEM0RERVZUWVBFX0hBTCkKCQl7CgkJCWxvYWRTeXN0ZW1EM0Q5KCk7CgoJCQlpZihkM2Q5KQoJCQl7CgkJCQlyZXR1cm4gZDNkOS0+Q2hlY2tEZXZpY2VUeXBlKGFkYXB0ZXIsIGNoZWNrVHlwZSwgZGlzcGxheUZvcm1hdCwgYmFja0J1ZmZlckZvcm1hdCwgd2luZG93ZWQpOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJcmV0dXJuIENoZWNrRGV2aWNlVHlwZShhZGFwdGVyLCBEM0RERVZUWVBFX0hBTCwgZGlzcGxheUZvcm1hdCwgYmFja0J1ZmZlckZvcm1hdCwgd2luZG93ZWQpOwoJCQl9CgkJfQoKCQlpZihhZGFwdGVyID49IEdldEFkYXB0ZXJDb3VudCgpKQoJCXsKCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7CgkJfQoKCQlzd2l0Y2goZGlzcGxheUZvcm1hdCkKCQl7CgkJY2FzZSBEM0RGTVRfVU5LTk9XTjoKCQkJaWYod2luZG93ZWQgPT0gRkFMU0UpCgkJCXsKCQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwoJCQl9CgkJY2FzZSBEM0RGTVRfQTJSMTBHMTBCMTA6CgkJY2FzZSBEM0RGTVRfQTJCMTBHMTBSMTA6CgkJCWlmKGRpc2FibGUxMEJpdE1vZGUpCgkJCXsKCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsKCQkJfQoJCWNhc2UgRDNERk1UX1g4UjhHOEI4OgoJCWNhc2UgRDNERk1UX1I1RzZCNToKCQkJYnJlYWs7CgkJZGVmYXVsdDoKCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwoJCX0KCgkJaWYod2luZG93ZWQgIT0gRkFMU0UpCgkJewoJCQlzd2l0Y2goYmFja0J1ZmZlckZvcm1hdCkKCQkJewoJCQljYXNlIEQzREZNVF9BMlIxMEcxMEIxMDoKCQkJY2FzZSBEM0RGTVRfQTJCMTBHMTBSMTA6CgkJCQlpZihkaXNhYmxlMTBCaXRNb2RlKQoJCQkJewoJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsKCQkJCX0KCQkJY2FzZSBEM0RGTVRfQThSOEc4Qjg6CgkJCQlpZihkaXNhYmxlQWxwaGFNb2RlKQoJCQkJewoJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsKCQkJCX0KCQkJY2FzZSBEM0RGTVRfVU5LTk9XTjoKCQkJY2FzZSBEM0RGTVRfWDhSOEc4Qjg6CgkJCWNhc2UgRDNERk1UX1I1RzZCNToKCQkvLwljYXNlIEQzREZNVF9YMVI1RzVCNTogICAgICAvLyBGSVhNRTogU3VwcG9ydGVkIGJ5IFJFRgoJCS8vCWNhc2UgRDNERk1UX0ExUjVHNUI1OiAgICAgIC8vIEZJWE1FOiBTdXBwb3J0ZWQgYnkgUkVGCgkJCQlicmVhazsKCQkJZGVmYXVsdDoKCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsKCQkJfQoJCX0KCQllbHNlCgkJewoJCQlzd2l0Y2goYmFja0J1ZmZlckZvcm1hdCkKCQkJewoJCQljYXNlIEQzREZNVF9VTktOT1dOOgoJCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7CgkJCWNhc2UgRDNERk1UX0EyUjEwRzEwQjEwOgoJCQljYXNlIEQzREZNVF9BMkIxMEcxMFIxMDoKCQkJCWlmKGRpc2FibGUxMEJpdE1vZGUpCgkJCQl7CgkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwoJCQkJfQoJCQljYXNlIEQzREZNVF9BOFI4RzhCODoKCQkJCWlmKGRpc2FibGVBbHBoYU1vZGUpCgkJCQl7CgkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwoJCQkJfQoJCQljYXNlIEQzREZNVF9YOFI4RzhCODoKCQkJCWJyZWFrOwoJCQlkZWZhdWx0OgoJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwoJCQl9CgkJfQoKCQlyZXR1cm4gRDNEX09LOwoJfQoKCWxvbmcgRGlyZWN0M0Q5OjpDcmVhdGVEZXZpY2UodW5zaWduZWQgaW50IGFkYXB0ZXIsIEQzRERFVlRZUEUgZGV2aWNlVHlwZSwgSFdORCBmb2N1c1dpbmRvdywgdW5zaWduZWQgbG9uZyBiZWhhdmlvckZsYWdzLCBEM0RQUkVTRU5UX1BBUkFNRVRFUlMgKnByZXNlbnRQYXJhbWV0ZXJzLCBJRGlyZWN0M0REZXZpY2U5ICoqcmV0dXJuZWREZXZpY2VJbnRlcmZhY2UpCgl7CgkJVFJBQ0UoInVuc2lnbmVkIGludCBhZGFwdGVyID0gJWQsIEQzRERFVlRZUEUgZGV2aWNlVHlwZSA9ICVkLCBIV05EIGZvY3VzV2luZG93ID0gJWQsIHVuc2lnbmVkIGxvbmcgYmVoYXZpb3JGbGFncyA9IDB4JTAuOFgsIEQzRFBSRVNFTlRfUEFSQU1FVEVSUyAqcHJlc2VudFBhcmFtZXRlcnMgPSAweCUwLjhwLCBJRGlyZWN0M0REZXZpY2U5ICoqcmV0dXJuZWREZXZpY2VJbnRlcmZhY2UgPSAweCUwLjhwIiwgYWRhcHRlciwgZGV2aWNlVHlwZSwgZm9jdXNXaW5kb3csIGJlaGF2aW9yRmxhZ3MsIHByZXNlbnRQYXJhbWV0ZXJzLCByZXR1cm5lZERldmljZUludGVyZmFjZSk7CgoJCWlmKGRldmljZVR5cGUgIT0gRDNEREVWVFlQRV9IQUwpCgkJewoJCQlsb2FkU3lzdGVtRDNEOSgpOwoKCQkJaWYoZDNkOSkKCQkJewoJCQkJcmV0dXJuIGQzZDktPkNyZWF0ZURldmljZShhZGFwdGVyLCBkZXZpY2VUeXBlLCBmb2N1c1dpbmRvdywgYmVoYXZpb3JGbGFncywgcHJlc2VudFBhcmFtZXRlcnMsIHJldHVybmVkRGV2aWNlSW50ZXJmYWNlKTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCXJldHVybiBDcmVhdGVEZXZpY2UoYWRhcHRlciwgRDNEREVWVFlQRV9IQUwsIGZvY3VzV2luZG93LCBiZWhhdmlvckZsYWdzLCBwcmVzZW50UGFyYW1ldGVycywgcmV0dXJuZWREZXZpY2VJbnRlcmZhY2UpOwoJCQl9CgkJfQoKCQlpZighZm9jdXNXaW5kb3cgfHwgIXByZXNlbnRQYXJhbWV0ZXJzIHx8ICFyZXR1cm5lZERldmljZUludGVyZmFjZSkKCQl7CgkJCSpyZXR1cm5lZERldmljZUludGVyZmFjZSA9IDA7CgoJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKCQl9CgoJCSpyZXR1cm5lZERldmljZUludGVyZmFjZSA9IG5ldyBEaXJlY3QzRERldmljZTkoaW5zdGFuY2UsIHRoaXMsIGFkYXB0ZXIsIGRldmljZVR5cGUsIGZvY3VzV2luZG93LCBiZWhhdmlvckZsYWdzLCBwcmVzZW50UGFyYW1ldGVycyk7CgoJCWlmKCpyZXR1cm5lZERldmljZUludGVyZmFjZSkKCQl7CgkJCSgqcmV0dXJuZWREZXZpY2VJbnRlcmZhY2UpLT5BZGRSZWYoKTsKCQl9CgoJCXJldHVybiBEM0RfT0s7Cgl9CgoJbG9uZyBEaXJlY3QzRDk6OkVudW1BZGFwdGVyTW9kZXModW5zaWduZWQgaW50IGFkYXB0ZXIsIEQzREZPUk1BVCBmb3JtYXQsIHVuc2lnbmVkIGludCBpbmRleCwgRDNERElTUExBWU1PREUgKm1vZGUpCgl7CgkJVFJBQ0UoInVuc2lnbmVkIGludCBhZGFwdGVyID0gJWQsIEQzREZPUk1BVCBmb3JtYXQgPSAlZCwgdW5zaWduZWQgaW50IGluZGV4ID0gJWQsIEQzRERJU1BMQVlNT0RFICptb2RlID0gMHglMC44cCIsIGFkYXB0ZXIsIGZvcm1hdCwgaW5kZXgsIG1vZGUpOwoKCQlpZihhZGFwdGVyICE9IEQzREFEQVBURVJfREVGQVVMVCB8fCAhbW9kZSkKCQl7CgkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwoJCX0KCgkJdW5zaWduZWQgaW50IGJwcCA9IDMyOwoKCQlzd2l0Y2goZm9ybWF0KQoJCXsKCQljYXNlIEQzREZNVF9BMVI1RzVCNToJCWJwcCA9IDE2OyBicmVhazsKCQljYXNlIEQzREZNVF9BMlIxMEcxMEIxMDoJYnBwID0gMzI7IGJyZWFrOwoJCWNhc2UgRDNERk1UX0E4UjhHOEI4OgkJYnBwID0gMzI7IGJyZWFrOwoJCWNhc2UgRDNERk1UX1I1RzZCNToJCQlicHAgPSAxNjsgYnJlYWs7CgkJY2FzZSBEM0RGTVRfWDFSNUc1QjU6CQlicHAgPSAxNjsgYnJlYWs7CgkJY2FzZSBEM0RGTVRfWDhSOEc4Qjg6CQlicHAgPSAzMjsgYnJlYWs7CgkJZGVmYXVsdDogcmV0dXJuIElOVkFMSURDQUxMKCk7CgkJfQoKCQlmb3IoaW50IGkgPSAwOyBpIDwgbnVtRGlzcGxheU1vZGVzOyBpKyspCgkJewoJCQlpZihkaXNwbGF5TW9kZVtpXS5kbUJpdHNQZXJQZWwgPT0gYnBwKQoJCQl7CgkJCQlpZihpbmRleC0tID09IDApCgkJCQl7CgkJCQkJbW9kZS0+V2lkdGggPSBkaXNwbGF5TW9kZVtpXS5kbVBlbHNXaWR0aDsKCQkJCQltb2RlLT5IZWlnaHQgPSBkaXNwbGF5TW9kZVtpXS5kbVBlbHNIZWlnaHQ7CgkJCQkJbW9kZS0+UmVmcmVzaFJhdGUgPSBkaXNwbGF5TW9kZVtpXS5kbURpc3BsYXlGcmVxdWVuY3k7CgkJCQkJbW9kZS0+Rm9ybWF0ID0gZm9ybWF0OwoKCQkJCQlyZXR1cm4gRDNEX09LOwoJCQkJfQoJCQl9CgkJfQoKCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKCX0KCgl1bnNpZ25lZCBpbnQgRGlyZWN0M0Q5OjpHZXRBZGFwdGVyQ291bnQoKQoJewoJCVRSQUNFKCJ2b2lkIik7CgoJCXJldHVybiAxOyAgIC8vIFN3aWZ0U2hhZGVyIGRvZXMgbm90IHN1cHBvcnQgbXVsdGlwbGUgZGlzcGxheSBhZGFwdGVycwoJfQoKCWxvbmcgRGlyZWN0M0Q5OjpHZXRBZGFwdGVyRGlzcGxheU1vZGUodW5zaWduZWQgaW50IGFkYXB0ZXIsIEQzRERJU1BMQVlNT0RFICptb2RlKQoJewoJCVRSQUNFKCJ1bnNpZ25lZCBpbnQgYWRhcHRlciA9ICVkLCBEM0RESVNQTEFZTU9ERSAqbW9kZSA9IDB4JTAuOHAiLCBhZGFwdGVyLCBtb2RlKTsKCgkJaWYoYWRhcHRlciAhPSBEM0RBREFQVEVSX0RFRkFVTFQgfHwgIW1vZGUpCgkJewoJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKCQl9CgoJCUhEQyBkZXZpY2VDb250ZXh0ID0gR2V0REMoMCk7CgkJCQoJCW1vZGUtPldpZHRoID0gOjpHZXREZXZpY2VDYXBzKGRldmljZUNvbnRleHQsIEhPUlpSRVMpOwoJCW1vZGUtPkhlaWdodCA9IDo6R2V0RGV2aWNlQ2FwcyhkZXZpY2VDb250ZXh0LCBWRVJUUkVTKTsKCQltb2RlLT5SZWZyZXNoUmF0ZSA9IDo6R2V0RGV2aWNlQ2FwcyhkZXZpY2VDb250ZXh0LCBWUkVGUkVTSCk7CgkJdW5zaWduZWQgaW50IGJwcCA9IDo6R2V0RGV2aWNlQ2FwcyhkZXZpY2VDb250ZXh0LCBCSVRTUElYRUwpOwoKCQlSZWxlYXNlREMoMCwgZGV2aWNlQ29udGV4dCk7CgoJCWJwcCA9IDMyOyAgIC8vIEZJWE1FCgoJCXN3aXRjaChicHApCgkJewoJCWNhc2UgMzI6IG1vZGUtPkZvcm1hdCA9IEQzREZNVF9YOFI4RzhCODsgYnJlYWs7CgkJY2FzZSAyNDogbW9kZS0+Rm9ybWF0ID0gRDNERk1UX1I4RzhCODsgICBicmVhazsKCQljYXNlIDE2OiBtb2RlLT5Gb3JtYXQgPSBEM0RGTVRfUjVHNkI1OyAgIGJyZWFrOwoJCWRlZmF1bHQ6CgkJCUFTU0VSVChmYWxzZSk7ICAgLy8gVW5leHBlY3RlZCBkaXNwbGF5IG1vZGUgY29sb3IgZGVwdGgKCQl9CgoJCXJldHVybiBEM0RfT0s7Cgl9CgoJbG9uZyBEaXJlY3QzRDk6OkdldEFkYXB0ZXJJZGVudGlmaWVyKHVuc2lnbmVkIGludCBhZGFwdGVyLCB1bnNpZ25lZCBsb25nIGZsYWdzLCBEM0RBREFQVEVSX0lERU5USUZJRVI5ICppZGVudGlmaWVyKQoJewoJCVRSQUNFKCJ1bnNpZ25lZCBpbnQgYWRhcHRlciA9ICVkLCB1bnNpZ25lZCBsb25nIGZsYWdzID0gMHglMC44WCwgRDNEQURBUFRFUl9JREVOVElGSUVSOSAqaWRlbnRpZmllciA9IDB4JTAuOHAiLCBhZGFwdGVyLCBmbGFncywgaWRlbnRpZmllcik7CgoJCWlmKCFpZGVudGlmaWVyKQoJCXsKCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7CgkJfQoKCQlzdzo6Q29uZmlndXJhdG9yIGluaSgiU3dpZnRTaGFkZXIuaW5pIik7CgkJaW50IGlkID0gaW5pLmdldEludGVnZXIoIkNhcGFiaWxpdGllcyIsICJJZGVudGlmaWVyIiwgMCk7CgoJCWlmKGlkID09IDEpCgkJewoJCQl1bnNpZ25lZCBzaG9ydCBwcm9kdWN0ID0gNjsKCQkJdW5zaWduZWQgc2hvcnQgdmVyc2lvbiA9IDE0OwoJCQl1bnNpZ25lZCBzaG9ydCBzdWJWZXJzaW9uID0gMTA7CgkJCXVuc2lnbmVkIHNob3J0IHJldmlzaW9uID0gODQ0MDsKCQkJR1VJRCBndWlkID0gezB4RDdCNzFFM0UsIDB4NDFEMiwgMHgxMUNGLCB7MHg5NiwgMHg1MywgMHg3QSwgMHgyMywgMHgwMCwgMHhDMiwgMHhDQiwgMHgzNX19OwoKCQkJaWRlbnRpZmllci0+RHJpdmVyVmVyc2lvbi5IaWdoUGFydCA9IHByb2R1Y3QgPDwgMTYgfCB2ZXJzaW9uOwoJCQlpZGVudGlmaWVyLT5Ecml2ZXJWZXJzaW9uLkxvd1BhcnQgPSBzdWJWZXJzaW9uIDw8IDE2IHwgcmV2aXNpb247CgkJCXN0cmNweShpZGVudGlmaWVyLT5Ecml2ZXIsICJudjRfZGlzcC5kbGwiKTsKCQkJc3RyY3B5KGlkZW50aWZpZXItPkRlc2NyaXB0aW9uLCAiTlZJRElBIEdlRm9yY2UgNzkwMCBHUyIpOwoJCQlzdHJjcHkoaWRlbnRpZmllci0+RGV2aWNlTmFtZSwgIlxcXFwuXFxESVNQTEFZMSIpOwoJCQlpZGVudGlmaWVyLT5WZW5kb3JJZCA9IDB4MTBERTsKCQkJaWRlbnRpZmllci0+RGV2aWNlSWQgPSAweDAyOTI7CgkJCWlkZW50aWZpZXItPlN1YlN5c0lkID0gMHgwMzcwMTBERTsKCQkJaWRlbnRpZmllci0+UmV2aXNpb24gPSAweDAwQTE7CgkJCWlkZW50aWZpZXItPkRldmljZUlkZW50aWZpZXIgPSBndWlkOwoJCQlpZGVudGlmaWVyLT5XSFFMTGV2ZWwgPSAxOwoKCQkJcmV0dXJuIEQzRF9PSzsKCQl9CgkJZWxzZSBpZihpZCA9PSAyKQoJCXsKCQkJdW5zaWduZWQgc2hvcnQgcHJvZHVjdCA9IDc7CgkJCXVuc2lnbmVkIHNob3J0IHZlcnNpb24gPSAxNDsKCQkJdW5zaWduZWQgc2hvcnQgc3ViVmVyc2lvbiA9IDEwOwoJCQl1bnNpZ25lZCBzaG9ydCByZXZpc2lvbiA9IDQ2NDsKCQkJR1VJRCBndWlkID0gezB4RDdCNzFFRTIsIDB4MzI4NSwgMHgxMUNGLCB7MHgxMSwgMHg3MiwgMHgwRCwgMHhBMiwgMHhBMSwgMHhDMiwgMHhDQSwgMHgzNX19OwoKCQkJaWRlbnRpZmllci0+RHJpdmVyVmVyc2lvbi5IaWdoUGFydCA9IHByb2R1Y3QgPDwgMTYgfCB2ZXJzaW9uOwoJCQlpZGVudGlmaWVyLT5Ecml2ZXJWZXJzaW9uLkxvd1BhcnQgPSBzdWJWZXJzaW9uIDw8IDE2IHwgcmV2aXNpb247CgkJCXN0cmNweShpZGVudGlmaWVyLT5Ecml2ZXIsICJhdGl1bWRhZy5kbGwiKTsKCQkJc3RyY3B5KGlkZW50aWZpZXItPkRlc2NyaXB0aW9uLCAiQVRJIE1vYmlsaXR5IFJhZGVvbiBYMTYwMCIpOwoJCQlzdHJjcHkoaWRlbnRpZmllci0+RGV2aWNlTmFtZSwgIlxcXFwuXFxESVNQTEFZMSIpOwoJCQlpZGVudGlmaWVyLT5WZW5kb3JJZCA9IDB4MTAwMjsKCQkJaWRlbnRpZmllci0+RGV2aWNlSWQgPSAweDcxQzU7CgkJCWlkZW50aWZpZXItPlN1YlN5c0lkID0gMHg4MjA3MTA3MTsKCQkJaWRlbnRpZmllci0+UmV2aXNpb24gPSAweDAwMDA7CgkJCWlkZW50aWZpZXItPkRldmljZUlkZW50aWZpZXIgPSBndWlkOwoJCQlpZGVudGlmaWVyLT5XSFFMTGV2ZWwgPSAxOwoKCQkJcmV0dXJuIEQzRF9PSzsKCQl9CgkJZWxzZSBpZihpZCA9PSAzKQoJCXsKCQkJdW5zaWduZWQgc2hvcnQgcHJvZHVjdCA9IDc7CgkJCXVuc2lnbmVkIHNob3J0IHZlcnNpb24gPSAxNDsKCQkJdW5zaWduZWQgc2hvcnQgc3ViVmVyc2lvbiA9IDEwOwoJCQl1bnNpZ25lZCBzaG9ydCByZXZpc2lvbiA9IDE0Mzc7CgkJCUdVSUQgZ3VpZCA9IHsweEQ3Qjc4RTY2LCAweDY5NDIsIDB4MTFDRiwgezB4MDUsIDB4NzYsIDB4MDMsIDB4MjIsIDB4QUQsIDB4QzIsIDB4Q0EsIDB4MzV9fTsKCgkJCWlkZW50aWZpZXItPkRyaXZlclZlcnNpb24uSGlnaFBhcnQgPSBwcm9kdWN0IDw8IDE2IHwgdmVyc2lvbjsKCQkJaWRlbnRpZmllci0+RHJpdmVyVmVyc2lvbi5Mb3dQYXJ0ID0gc3ViVmVyc2lvbiA8PCAxNiB8IHJldmlzaW9uOwoJCQlzdHJjcHkoaWRlbnRpZmllci0+RHJpdmVyLCAiaWdkdW1kNjQuZGxsIik7CgkJCXN0cmNweShpZGVudGlmaWVyLT5EZXNjcmlwdGlvbiwgIkludGVsIEdNQSBYMzEwMCIpOwoJCQlzdHJjcHkoaWRlbnRpZmllci0+RGV2aWNlTmFtZSwgIlxcXFwuXFxESVNQTEFZMSIpOwoJCQlpZGVudGlmaWVyLT5WZW5kb3JJZCA9IDB4ODA4NjsKCQkJaWRlbnRpZmllci0+RGV2aWNlSWQgPSAweDJBMDI7CgkJCWlkZW50aWZpZXItPlN1YlN5c0lkID0gMHgwMjA5MTAyODsKCQkJaWRlbnRpZmllci0+UmV2aXNpb24gPSAweDAwMEM7CgkJCWlkZW50aWZpZXItPkRldmljZUlkZW50aWZpZXIgPSBndWlkOwoJCQlpZGVudGlmaWVyLT5XSFFMTGV2ZWwgPSAxOwoKCQkJcmV0dXJuIEQzRF9PSzsKCQl9CgkJZWxzZSBpZihpZCA9PSA0KQoJCXsKCQkJbG9hZFN5c3RlbUQzRDkoKTsKCgkJCWlmKGQzZDkpCgkJCXsKCQkJCXJldHVybiBkM2Q5LT5HZXRBZGFwdGVySWRlbnRpZmllcihhZGFwdGVyLCBmbGFncywgaWRlbnRpZmllcik7CgkJCX0KCQl9CgoJCXVuc2lnbmVkIHNob3J0IHByb2R1Y3QgPSAnc3cnOwoJCXVuc2lnbmVkIHNob3J0IHZlcnNpb24gPSAzOwoJCXVuc2lnbmVkIHNob3J0IHN1YlZlcnNpb24gPSAwOwoJCXVuc2lnbmVkIHNob3J0IHJldmlzaW9uID0gQlVJTERfUkVWSVNJT047CgkJR1VJRCBndWlkID0gezB4MDAwMDAwMDAsIDB4MDAwMCwgMHgwMDAwLCB7MHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH19OwoKCQlpZGVudGlmaWVyLT5Ecml2ZXJWZXJzaW9uLkhpZ2hQYXJ0ID0gcHJvZHVjdCA8PCAxNiB8IHZlcnNpb247CgkJaWRlbnRpZmllci0+RHJpdmVyVmVyc2lvbi5Mb3dQYXJ0ID0gc3ViVmVyc2lvbiA8PCAxNiB8IHJldmlzaW9uOwoJCXN0cmNweShpZGVudGlmaWVyLT5Ecml2ZXIsICJTd2lmdFNoYWRlciIpOwoJCXN0cmNweShpZGVudGlmaWVyLT5EZXNjcmlwdGlvbiwgIlRyYW5zR2FtaW5nIFN3aWZ0U2hhZGVyIFNvZnR3YXJlIDNEIFJlbmRlcmVyIik7CgkJc3RyY3B5KGlkZW50aWZpZXItPkRldmljZU5hbWUsICJcXFxcLlxcRElTUExBWTEiKTsKCQlpZGVudGlmaWVyLT5WZW5kb3JJZCA9IDA7CgkJaWRlbnRpZmllci0+RGV2aWNlSWQgPSAwOwoJCWlkZW50aWZpZXItPlN1YlN5c0lkID0gMDsKCQlpZGVudGlmaWVyLT5SZXZpc2lvbiA9IDA7CgkJaWRlbnRpZmllci0+RGV2aWNlSWRlbnRpZmllciA9IGd1aWQ7CgkJaWRlbnRpZmllci0+V0hRTExldmVsID0gMDsKCgkJY2hhciBleGVOYW1lW01BWF9QQVRIICsgMV07CgkJaW50IG4gPSBHZXRNb2R1bGVCYXNlTmFtZShHZXRDdXJyZW50UHJvY2VzcygpLCAwLCBleGVOYW1lLCBNQVhfUEFUSCk7CgkJZXhlTmFtZVtuXSA9ICdcMCc7CgoJCWlmKHN0cm5jbXAoZXhlTmFtZSwgIkZhbGxvdXQiLCA3KSA9PSAwKQoJCXsKCQkJc3RyY3B5KGlkZW50aWZpZXItPkRyaXZlciwgIm52NF9kaXNwLmRsbCIpOwoJCX0KCgkJcmV0dXJuIEQzRF9PSzsKCX0KCgl1bnNpZ25lZCBpbnQgRGlyZWN0M0Q5OjpHZXRBZGFwdGVyTW9kZUNvdW50KHVuc2lnbmVkIGludCBhZGFwdGVyLCBEM0RGT1JNQVQgZm9ybWF0KQoJewoJCVRSQUNFKCJ1bnNpZ25lZCBpbnQgYWRhcHRlciA9ICVkLCBEM0RGT1JNQVQgZm9ybWF0ID0gJWQiLCBhZGFwdGVyLCBmb3JtYXQpOwoKCQlpZihhZGFwdGVyICE9IEQzREFEQVBURVJfREVGQVVMVCkKCQl7CgkJCXJldHVybiAwOwoJCX0KCgkJaW50IG1vZGVDb3VudCA9IDA7CgoJCWZvcihpbnQgaSA9IDA7IGkgPCBudW1EaXNwbGF5TW9kZXM7IGkrKykKCQl7CgkJCXN3aXRjaChmb3JtYXQpCgkJCXsKCQkJY2FzZSBEM0RGTVRfQThSOEc4Qjg6CgkJCQlpZighZGlzYWJsZUFscGhhTW9kZSkKCQkJCXsKCQkJCQlpZihkaXNwbGF5TW9kZVtpXS5kbUJpdHNQZXJQZWwgPT0gMzIpIG1vZGVDb3VudCsrOwoJCQkJfQoJCQkJYnJlYWs7CgkJCWNhc2UgRDNERk1UX1g4UjhHOEI4OiAgICBpZihkaXNwbGF5TW9kZVtpXS5kbUJpdHNQZXJQZWwgPT0gMzIpIG1vZGVDb3VudCsrOyBicmVhazsKCQkJY2FzZSBEM0RGTVRfQTJSMTBHMTBCMTA6CgkJCWNhc2UgRDNERk1UX0EyQjEwRzEwUjEwOgoJCQkJaWYoIWRpc2FibGUxMEJpdE1vZGUpCgkJCQl7CgkJCQkJaWYoZGlzcGxheU1vZGVbaV0uZG1CaXRzUGVyUGVsID09IDMyKSBtb2RlQ291bnQrKzsKCQkJCX0KCQkJCWJyZWFrOwoJCS8vCWNhc2UgRDNERk1UX1I4RzhCODogICAgICBpZihkaXNwbGF5TW9kZVtpXS5kbUJpdHNQZXJQZWwgPT0gMjQpIG1vZGVDb3VudCsrOyBicmVhazsgICAvLyBOT1RFOiBEZXByZWNhdGVkIGJ5IERpcmVjdFggOQoJCQljYXNlIEQzREZNVF9SNUc2QjU6ICAgICAgaWYoZGlzcGxheU1vZGVbaV0uZG1CaXRzUGVyUGVsID09IDE2KSBtb2RlQ291bnQrKzsgYnJlYWs7CgkJLy8JY2FzZSBEM0RGTVRfWDFSNUc1QjU6ICAgIGlmKGRpc3BsYXlNb2RlW2ldLmRtQml0c1BlclBlbCA9PSAxNikgbW9kZUNvdW50Kys7IGJyZWFrOwoJCS8vCWNhc2UgRDNERk1UX0ExUjVHNUI1OiAgICBpZihkaXNwbGF5TW9kZVtpXS5kbUJpdHNQZXJQZWwgPT0gMTYpIG1vZGVDb3VudCsrOyBicmVhazsKCQkvLwlkZWZhdWx0OgoJCS8vCQlBU1NFUlQoZmFsc2UpOwoJCQl9CgkJfQoKCQlyZXR1cm4gbW9kZUNvdW50OwoJfQoKCUhNT05JVE9SIERpcmVjdDNEOTo6R2V0QWRhcHRlck1vbml0b3IodW5zaWduZWQgaW50IGFkYXB0ZXIpCgl7CgkJVFJBQ0UoInVuc2lnbmVkIGludCBhZGFwdGVyID0gJWQiLCBhZGFwdGVyKTsKCgkJUE9JTlQgcG9pbnQgPSB7MCwgMH07CgoJCXJldHVybiBNb25pdG9yRnJvbVBvaW50KHBvaW50LCBNT05JVE9SX0RFRkFVTFRUT1BSSU1BUlkpOyAgIC8vIEZJWE1FOiBJZ25vcmVzIGFkYXB0ZXIgcGFyYW1ldGVyCgl9CgoJbG9uZyBEaXJlY3QzRDk6OkdldERldmljZUNhcHModW5zaWduZWQgaW50IGFkYXB0ZXIsIEQzRERFVlRZUEUgZGV2aWNlVHlwZSwgRDNEQ0FQUzkgKmNhcGFiaWxpdGllcykKCXsKCQlUUkFDRSgidW5zaWduZWQgaW50IGFkYXB0ZXIgPSAlZCwgRDNEREVWVFlQRSBkZXZpY2VUeXBlID0gJWQsIEQzRENBUFM5ICpjYXBhYmlsaXRpZXMgPSAweCUwLjhwIiwgYWRhcHRlciwgZGV2aWNlVHlwZSwgY2FwYWJpbGl0aWVzKTsKCgkJaWYoZGV2aWNlVHlwZSAhPSBEM0RERVZUWVBFX0hBTCkKCQl7CgkJCWxvYWRTeXN0ZW1EM0Q5KCk7CgoJCQlpZihkM2Q5KQoJCQl7CgkJCQlyZXR1cm4gZDNkOS0+R2V0RGV2aWNlQ2FwcyhhZGFwdGVyLCBkZXZpY2VUeXBlLCBjYXBhYmlsaXRpZXMpOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJcmV0dXJuIEdldERldmljZUNhcHMoYWRhcHRlciwgRDNEREVWVFlQRV9IQUwsIGNhcGFiaWxpdGllcyk7CgkJCX0KCQl9CgoJCWlmKCFjYXBhYmlsaXRpZXMpCgkJewoJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKCQl9CgoJCXVuc2lnbmVkIGludCBwaXhlbFNoYWRlclZlcnNpb24gPSBwaXhlbFNoYWRlclZlcnNpb25YOwoJCXVuc2lnbmVkIGludCB2ZXJ0ZXhTaGFkZXJWZXJzaW9uID0gdmVydGV4U2hhZGVyVmVyc2lvblg7CgoJCWlmKHBpeGVsU2hhZGVyVmVyc2lvbiA9PSBEM0RQU19WRVJTSU9OKDIsIDEpKSBwaXhlbFNoYWRlclZlcnNpb24gPSBEM0RQU19WRVJTSU9OKDIsIDApOwoJCWlmKHZlcnRleFNoYWRlclZlcnNpb24gPT0gRDNEVlNfVkVSU0lPTigyLCAxKSkgdmVydGV4U2hhZGVyVmVyc2lvbiA9IEQzRFZTX1ZFUlNJT04oMiwgMCk7CgoJCXVuc2lnbmVkIGludCBtYXhpbXVtVmVydGV4U2hhZGVySW5zdHJ1Y3Rpb25zRXhlY3V0ZWQgPSAwOwoJCXVuc2lnbmVkIGludCBtYXhpbXVtUGl4ZWxTaGFkZXJJbnN0cnVjdGlvbnNFeGVjdXRlZCA9IDA7CgkJdW5zaWduZWQgaW50IG1heGltdW1WZXJ0ZXhTaGFkZXIzMEluc3RydWN0aW9uU2xvdHMgPSAwOwoJCXVuc2lnbmVkIGludCBtYXhpbXVtUGl4ZWxTaGFkZXIzMEluc3RydWN0aW9uU2xvdHMgPSAwOwoKCQlpZih2ZXJ0ZXhTaGFkZXJWZXJzaW9uID49IEQzRFZTX1ZFUlNJT04oMSwgMCkpIG1heGltdW1WZXJ0ZXhTaGFkZXJJbnN0cnVjdGlvbnNFeGVjdXRlZCA9IDB4RkZGRkZGRkY7CgkJaWYocGl4ZWxTaGFkZXJWZXJzaW9uID49IEQzRFBTX1ZFUlNJT04oMSwgMCkpIG1heGltdW1QaXhlbFNoYWRlckluc3RydWN0aW9uc0V4ZWN1dGVkID0gMHhGRkZGRkZGRjsKCQlpZih2ZXJ0ZXhTaGFkZXJWZXJzaW9uID49IEQzRFZTX1ZFUlNJT04oMywgMCkpIG1heGltdW1WZXJ0ZXhTaGFkZXIzMEluc3RydWN0aW9uU2xvdHMgPSAzMjc2ODsKCQlpZihwaXhlbFNoYWRlclZlcnNpb24gPj0gRDNEUFNfVkVSU0lPTigzLCAwKSkgbWF4aW11bVBpeGVsU2hhZGVyMzBJbnN0cnVjdGlvblNsb3RzID0gMzI3Njg7CgoJCUQzRENBUFM5IGNhcHM7CgkJWmVyb01lbW9yeSgmY2Fwcywgc2l6ZW9mKEQzRENBUFM5KSk7CgoJCS8vIERldmljZSBpbmZvCgkJY2Fwcy5EZXZpY2VUeXBlID0gRDNEREVWVFlQRV9IQUw7CgkJY2Fwcy5BZGFwdGVyT3JkaW5hbCA9IEQzREFEQVBURVJfREVGQVVMVDsKCgkJLy8gQ2FwcyBmcm9tIERYNwoJCWNhcHMuQ2FwcyA9CUQzRENBUFNfUkVBRF9TQ0FOTElORTsKCgkJY2Fwcy5DYXBzMiA9CQlEM0RDQVBTMl9DQU5BVVRPR0VOTUlQTUFQIHwJCS8vIFRoZSBkcml2ZXIgaXMgY2FwYWJsZSBvZiBhdXRvbWF0aWNhbGx5IGdlbmVyYXRpbmcgbWlwbWFwcy4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBBdXRvbWF0aWMgR2VuZXJhdGlvbiBvZiBNaXBtYXBzLiAKCQkJCQkJLy8JRDNEQ0FQUzJfQ0FOQ0FMSUJSQVRFR0FNTUEgfAkvLyBUaGUgc3lzdGVtIGhhcyBhIGNhbGlicmF0b3IgaW5zdGFsbGVkIHRoYXQgY2FuIGF1dG9tYXRpY2FsbHkgYWRqdXN0IHRoZSBnYW1tYSByYW1wIHNvIHRoYXQgdGhlIHJlc3VsdCBpcyBpZGVudGljYWwgb24gYWxsIHN5c3RlbXMgdGhhdCBoYXZlIGEgY2FsaWJyYXRvci4gVG8gaW52b2tlIHRoZSBjYWxpYnJhdG9yIHdoZW4gc2V0dGluZyBuZXcgZ2FtbWEgbGV2ZWxzLCB1c2UgdGhlIEQzRFNHUl9DQUxJQlJBVEUgZmxhZyB3aGVuIGNhbGxpbmcgSURpcmVjdDNERGV2aWNlOTo6U2V0R2FtbWFSYW1wLiBDYWxpYnJhdGluZyBnYW1tYSByYW1wcyBpbmN1cnMgc29tZSBwcm9jZXNzaW5nIG92ZXJoZWFkIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgZnJlcXVlbnRseS4gIAoJCQkJCQkvLwlEM0RDQVBTMl9DQU5NQU5BR0VSRVNPVVJDRSB8CS8vIFRoZSBkcml2ZXIgaXMgY2FwYWJsZSBvZiBtYW5hZ2luZyByZXNvdXJjZXMuIE9uIHN1Y2ggZHJpdmVycywgRDNEUE9PTF9NQU5BR0VEIHJlc291cmNlcyB3aWxsIGJlIG1hbmFnZWQgYnkgdGhlIGRyaXZlci4gVG8gaGF2ZSBNaWNyb3NvZnSuIERpcmVjdDNEriBvdmVycmlkZSB0aGUgZHJpdmVyIHNvIHRoYXQgRGlyZWN0M0QgbWFuYWdlcyByZXNvdXJjZXMsIHVzZSB0aGUgRDNEQ1JFQVRFX0RJU0FCTEVfRFJJVkVSX01BTkFHRU1FTlQgZmxhZyB3aGVuIGNhbGxpbmcgSURpcmVjdDNEOTo6Q3JlYXRlRGV2aWNlLiAKCQkJCQkJCUQzRENBUFMyX0RZTkFNSUNURVhUVVJFUyB8IAkJLy8gVGhlIGRyaXZlciBzdXBwb3J0cyBkeW5hbWljIHRleHR1cmVzLiAKCQkJCQkJCUQzRENBUFMyX0ZVTExTQ1JFRU5HQU1NQTsJCS8vIFRoZSBkcml2ZXIgc3VwcG9ydHMgZHluYW1pYyBnYW1tYSByYW1wIGFkanVzdG1lbnQgaW4gZnVsbC1zY3JlZW4gbW9kZS4KCQkJCQkJLy8JRDNEQ0FQUzJfQ0FOU0hBUkVSRVNPVVJDRTsKCgkJY2Fwcy5DYXBzMyA9CQlEM0RDQVBTM19BTFBIQV9GVUxMU0NSRUVOX0ZMSVBfT1JfRElTQ0FSRCB8CS8vIEluZGljYXRlcyB0aGF0IHRoZSBkZXZpY2UgY2FuIHJlc3BlY3QgdGhlIEQzRFJTX0FMUEhBQkxFTkRFTkFCTEUgcmVuZGVyIHN0YXRlIGluIGZ1bGwtc2NyZWVuIG1vZGUgd2hpbGUgdXNpbmcgdGhlIEZMSVAgb3IgRElTQ0FSRCBzd2FwIGVmZmVjdC4KCQkJCQkJCUQzRENBUFMzX0NPUFlfVE9fVklETUVNIHwJCQkJCS8vIERldmljZSBjYW4gYWNjZWxlcmF0ZSBhIG1lbW9yeSBjb3B5IGZyb20gc3lzdGVtIG1lbW9yeSB0byBsb2NhbCB2aWRlbyBtZW1vcnkuCgkJCQkJCQlEM0RDQVBTM19DT1BZX1RPX1NZU1RFTU1FTTsJCQkJCS8vIERldmljZSBjYW4gYWNjZWxlcmF0ZSBhIG1lbW9yeSBjb3B5IGZyb20gbG9jYWwgdmlkZW8gbWVtb3J5IHRvIHN5c3RlbSBtZW1vcnkuCgkJCQkJCS8vCUQzRENBUFMzX0xJTkVBUl9UT19TUkdCX1BSRVNFTlRBVElPTjsJCS8vIEluZGljYXRlcyB0aGF0IHRoZSBkZXZpY2UgY2FuIHBlcmZvcm0gZ2FtbWEgY29ycmVjdGlvbiBmcm9tIGEgd2luZG93ZWQgYmFjayBidWZmZXIgKGNvbnRhaW5pbmcgbGluZWFyIGNvbnRlbnQpIHRvIGFuIHNSR0IgZGVza3RvcC4KCgkJY2Fwcy5QcmVzZW50YXRpb25JbnRlcnZhbHMgPQkJRDNEUFJFU0VOVF9JTlRFUlZBTF9JTU1FRElBVEUgfAoJCQkJCQkJCQkJCUQzRFBSRVNFTlRfSU5URVJWQUxfT05FOwoJCQkJCQkJCQkgCS8vCUQzRFBSRVNFTlRfSU5URVJWQUxfVFdPOwoJCQkJCQkJCQkgCS8vCUQzRFBSRVNFTlRfSU5URVJWQUxfVEhSRUU7CgkJCQkJCQkJCSAJLy8JRDNEUFJFU0VOVF9JTlRFUlZBTF9GT1VSOwoKCQkvLyBDdXJzb3IgY2FwcwoJCWNhcHMuQ3Vyc29yQ2FwcyA9CUQzRENVUlNPUkNBUFNfQ09MT1IJfAkvLyBBIGZ1bGwtY29sb3IgY3Vyc29yIGlzIHN1cHBvcnRlZCBpbiBoYXJkd2FyZS4gU3BlY2lmaWNhbGx5LCB0aGlzIGZsYWcgaW5kaWNhdGVzIHRoYXQgdGhlIGRyaXZlciBzdXBwb3J0cyBhdCBsZWFzdCBhIGhhcmR3YXJlIGNvbG9yIGN1cnNvciBpbiBoaWdoLXJlc29sdXRpb24gbW9kZXMgKHdpdGggc2NhbiBsaW5lcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gNDAwKS4gCgkJCQkJCQlEM0RDVVJTT1JDQVBTX0xPV1JFUzsJLy8gQSBmdWxsLWNvbG9yIGN1cnNvciBpcyBzdXBwb3J0ZWQgaW4gaGFyZHdhcmUuIFNwZWNpZmljYWxseSwgdGhpcyBmbGFnIGluZGljYXRlcyB0aGF0IHRoZSBkcml2ZXIgc3VwcG9ydHMgYSBoYXJkd2FyZSBjb2xvciBjdXJzb3IgaW4gYm90aCBoaWdoLXJlc29sdXRpb24gYW5kIGxvdy1yZXNvbHV0aW9uIG1vZGVzICh3aXRoIHNjYW4gbGluZXMgbGVzcyB0aGFuIDQwMCkuIAoKCQkvLyAzRCBEZXZpY2UgY2FwcwoJCWNhcHMuRGV2Q2FwcyA9CQlEM0RERVZDQVBTX0NBTkJMVFNZU1RPTk9OTE9DQUwgfAkJLy8gRGV2aWNlIHN1cHBvcnRzIGJsaXRzIGZyb20gc3lzdGVtLW1lbW9yeSB0ZXh0dXJlcyB0byBub25sb2NhbCB2aWRlby1tZW1vcnkgdGV4dHVyZXMuIAoJCQkJCQkJRDNEREVWQ0FQU19DQU5SRU5ERVJBRlRFUkZMSVAgfAkJCS8vIERldmljZSBjYW4gcXVldWUgcmVuZGVyaW5nIGNvbW1hbmRzIGFmdGVyIGEgcGFnZSBmbGlwLiBBcHBsaWNhdGlvbnMgZG8gbm90IGNoYW5nZSB0aGVpciBiZWhhdmlvciBpZiB0aGlzIGZsYWcgaXMgc2V0OyB0aGlzIGNhcGFiaWxpdHkgbWVhbnMgdGhhdCB0aGUgZGV2aWNlIGlzIHJlbGF0aXZlbHkgZmFzdC4gCgkJCQkJCQlEM0RERVZDQVBTX0RSQVdQUklNSVRJVkVTMiB8CQkJLy8gRGV2aWNlIGNhbiBzdXBwb3J0IERyYXdQcmltaXRpdmVzMi4KCQkJCQkJCUQzRERFVkNBUFNfRFJBV1BSSU1JVElWRVMyRVggfAkJCS8vIERldmljZSBjYW4gc3VwcG9ydCBleHRlbmRlZCBEcmF3UHJpbWl0aXZlczI7IHRoYXQgaXMsIHRoaXMgaXMgYSBEaXJlY3RYIDcuMC1jb21wbGlhbnQgZHJpdmVyLgoJCQkJCQkJRDNEREVWQ0FQU19EUkFXUFJJTVRMVkVSVEVYIHwJCQkvLyBEZXZpY2UgZXhwb3J0cyBhbiBJRGlyZWN0M0REZXZpY2U5OjpEcmF3UHJpbWl0aXZlLWF3YXJlIGhhcmR3YXJlIGFic3RyYWN0aW9uIGxheWVyIChIQUwpLiAKCQkJCQkJCUQzRERFVkNBUFNfRVhFQ1VURVNZU1RFTU1FTU9SWSB8CQkvLyBEZXZpY2UgY2FuIHVzZSBleGVjdXRlIGJ1ZmZlcnMgZnJvbSBzeXN0ZW0gbWVtb3J5LgoJCQkJCQkJRDNEREVWQ0FQU19FWEVDVVRFVklERU9NRU1PUlkgfAkJCS8vIERldmljZSBjYW4gdXNlIGV4ZWN1dGUgYnVmZmVycyBmcm9tIHZpZGVvIG1lbW9yeS4gCgkJCQkJCQlEM0RERVZDQVBTX0hXUkFTVEVSSVpBVElPTiB8CQkJLy8gRGV2aWNlIGhhcyBoYXJkd2FyZSBhY2NlbGVyYXRpb24gZm9yIHNjZW5lIHJhc3Rlcml6YXRpb24uIAoJCQkJCQkJRDNEREVWQ0FQU19IV1RSQU5TRk9STUFORExJR0hUIHwJCS8vIERldmljZSBjYW4gc3VwcG9ydCB0cmFuc2Zvcm1hdGlvbiBhbmQgbGlnaHRpbmcgaW4gaGFyZHdhcmUuIAoJCQkJCQkvLwlEM0RERVZDQVBTX05QQVRDSEVTIHwJCQkJCS8vIERldmljZSBzdXBwb3J0cyBOIHBhdGNoZXMuIAoJCQkJCQkJRDNEREVWQ0FQU19QVVJFREVWSUNFIHwJCQkJCS8vIERldmljZSBjYW4gc3VwcG9ydCByYXN0ZXJpemF0aW9uLCB0cmFuc2Zvcm0sIGxpZ2h0aW5nLCBhbmQgc2hhZGluZyBpbiBoYXJkd2FyZS4gCgkJCQkJCS8vCUQzRERFVkNBUFNfUVVJTlRJQ1JUUEFUQ0hFUyB8CQkJLy8gRGV2aWNlIHN1cHBvcnRzIHF1aW50aWMgQul6aWVyIGN1cnZlcyBhbmQgQi1zcGxpbmVzLiAKCQkJCQkJLy8JRDNEREVWQ0FQU19SVFBBVENIRVMgfAkJCQkJLy8gRGV2aWNlIHN1cHBvcnRzIHJlY3Rhbmd1bGFyIGFuZCB0cmlhbmd1bGFyIHBhdGNoZXMuIAoJCQkJCQkJRDNEREVWQ0FQU19SVFBBVENISEFORExFWkVSTyB8CQkJLy8gV2hlbiB0aGlzIGRldmljZSBjYXBhYmlsaXR5IGlzIHNldCwgdGhlIGhhcmR3YXJlIGFyY2hpdGVjdHVyZSBkb2VzIG5vdCByZXF1aXJlIGNhY2hpbmcgb2YgYW55IGluZm9ybWF0aW9uIGFuZCB1bmNhY2hlZCBwYXRjaGVzIChoYW5kbGUgemVybykgd2lsbCBiZSBkcmF3biBhcyBlZmZpY2llbnRseSBhcyBjYWNoZWQgb25lcy4gTm90ZSB0aGF0IHNldHRpbmcgRDNEREVWQ0FQU19SVFBBVENISEFORExFWkVSTyBkb2VzIG5vdCBtZWFuIHRoYXQgYSBwYXRjaCB3aXRoIGhhbmRsZSB6ZXJvIGNhbiBiZSBkcmF3bi4gQSBoYW5kbGUtemVybyBwYXRjaCBjYW4gYWx3YXlzIGJlIGRyYXduIHdoZXRoZXIgdGhpcyBjYXAgaXMgc2V0IG9yIG5vdC4gCgkJCQkJCS8vCUQzRERFVkNBUFNfU0VQQVJBVEVURVhUVVJFTUVNT1JJRVMgfAkvLyBEZXZpY2UgaXMgdGV4dHVyaW5nIGZyb20gc2VwYXJhdGUgbWVtb3J5IHBvb2xzLiAKCQkJCQkJCUQzRERFVkNBUFNfVEVYVFVSRU5PTkxPQ0FMVklETUVNIHwJCS8vIERldmljZSBjYW4gcmV0cmlldmUgdGV4dHVyZXMgZnJvbSBub24tbG9jYWwgdmlkZW8gbWVtb3J5LiAKCQkJCQkJCUQzRERFVkNBUFNfVEVYVFVSRVNZU1RFTU1FTU9SWSB8CQkvLyBEZXZpY2UgY2FuIHJldHJpZXZlIHRleHR1cmVzIGZyb20gc3lzdGVtIG1lbW9yeS4gCgkJCQkJCQlEM0RERVZDQVBTX1RFWFRVUkVWSURFT01FTU9SWSB8CQkJLy8gRGV2aWNlIGNhbiByZXRyaWV2ZSB0ZXh0dXJlcyBmcm9tIGRldmljZSBtZW1vcnkuIAoJCQkJCQkJRDNEREVWQ0FQU19UTFZFUlRFWFNZU1RFTU1FTU9SWSB8CQkvLyBEZXZpY2UgY2FuIHVzZSBidWZmZXJzIGZyb20gc3lzdGVtIG1lbW9yeSBmb3IgdHJhbnNmb3JtZWQgYW5kIGxpdCB2ZXJ0aWNlcy4gCgkJCQkJCQlEM0RERVZDQVBTX1RMVkVSVEVYVklERU9NRU1PUlk7CQkJLy8gRGV2aWNlIGNhbiB1c2UgYnVmZmVycyBmcm9tIHZpZGVvIG1lbW9yeSBmb3IgdHJhbnNmb3JtZWQgYW5kIGxpdCB2ZXJ0aWNlcy4KCgkJY2Fwcy5QcmltaXRpdmVNaXNjQ2FwcyA9IAkJRDNEUE1JU0NDQVBTX01BU0taIHwJCQkJCQkvLyBEZXZpY2UgY2FuIGVuYWJsZSBhbmQgZGlzYWJsZSBtb2RpZmljYXRpb24gb2YgdGhlIGRlcHRoIGJ1ZmZlciBvbiBwaXhlbCBvcGVyYXRpb25zLiAKCQkJCQkJCQkJCUQzRFBNSVNDQ0FQU19DVUxMTk9ORSB8CQkJCQkJLy8gVGhlIGRyaXZlciBkb2VzIG5vdCBwZXJmb3JtIHRyaWFuZ2xlIGN1bGxpbmcuIFRoaXMgY29ycmVzcG9uZHMgdG8gdGhlIEQzRENVTExfTk9ORSBtZW1iZXIgb2YgdGhlIEQzRENVTEwgZW51bWVyYXRlZCB0eXBlLiAKCQkJCQkJCQkJCUQzRFBNSVNDQ0FQU19DVUxMQ1cgfAkJCQkJCS8vIFRoZSBkcml2ZXIgc3VwcG9ydHMgY2xvY2t3aXNlIHRyaWFuZ2xlIGN1bGxpbmcgdGhyb3VnaCB0aGUgRDNEUlNfQ1VMTE1PREUgc3RhdGUuIChUaGlzIGFwcGxpZXMgb25seSB0byB0cmlhbmdsZSBwcmltaXRpdmVzLikgVGhpcyBmbGFnIGNvcnJlc3BvbmRzIHRvIHRoZSBEM0RDVUxMX0NXIG1lbWJlciBvZiB0aGUgRDNEQ1VMTCBlbnVtZXJhdGVkIHR5cGUuIAoJCQkJCQkJCQkJRDNEUE1JU0NDQVBTX0NVTExDQ1cgfAkJCQkJCS8vIFRoZSBkcml2ZXIgc3VwcG9ydHMgY291bnRlcmNsb2Nrd2lzZSBjdWxsaW5nIHRocm91Z2ggdGhlIEQzRFJTX0NVTExNT0RFIHN0YXRlLiAoVGhpcyBhcHBsaWVzIG9ubHkgdG8gdHJpYW5nbGUgcHJpbWl0aXZlcy4pIFRoaXMgZmxhZyBjb3JyZXNwb25kcyB0byB0aGUgRDNEQ1VMTF9DQ1cgbWVtYmVyIG9mIHRoZSBEM0RDVUxMIGVudW1lcmF0ZWQgdHlwZS4gCgkJCQkJCQkJCQlEM0RQTUlTQ0NBUFNfQ09MT1JXUklURUVOQUJMRSB8CQkJCS8vIERldmljZSBzdXBwb3J0cyBwZXItY2hhbm5lbCB3cml0ZXMgZm9yIHRoZSByZW5kZXItdGFyZ2V0IGNvbG9yIGJ1ZmZlciB0aHJvdWdoIHRoZSBEM0RSU19DT0xPUldSSVRFRU5BQkxFIHN0YXRlLiAKCQkJCQkJCQkJCUQzRFBNSVNDQ0FQU19DTElQUExBTkVTQ0FMRURQT0lOVFMgfAkJLy8gRGV2aWNlIGNvcnJlY3RseSBjbGlwcyBzY2FsZWQgcG9pbnRzIG9mIHNpemUgZ3JlYXRlciB0aGFuIDEuMCB0byB1c2VyLWRlZmluZWQgY2xpcHBpbmcgcGxhbmVzLiAKCQkJCQkJCQkJCUQzRFBNSVNDQ0FQU19DTElQVExWRVJUUyB8CQkJCQkvLyBEZXZpY2UgY2xpcHMgcG9zdC10cmFuc2Zvcm1lZCB2ZXJ0ZXggcHJpbWl0aXZlcy4gU3BlY2lmeSBEM0RVU0FHRV9ET05PVENMSVAgd2hlbiB0aGUgcGlwZWxpbmUgc2hvdWxkIG5vdCBkbyBhbnkgY2xpcHBpbmcuIEZvciB0aGlzIGNhc2UsIGFkZGl0aW9uYWwgc29mdHdhcmUgY2xpcHBpbmcgbWF5IG5lZWQgdG8gYmUgcGVyZm9ybWVkIGF0IGRyYXcgdGltZSwgcmVxdWlyaW5nIHRoZSB2ZXJ0ZXggYnVmZmVyIHRvIGJlIGluIHN5c3RlbSBtZW1vcnkuIAoJCQkJCQkJCQkJRDNEUE1JU0NDQVBTX1RTU0FSR1RFTVAgfAkJCQkJLy8gRGV2aWNlIHN1cHBvcnRzIEQzRFRBIGZvciB0ZW1wb3JhcnkgcmVnaXN0ZXIuIAoJCQkJCQkJCQkJRDNEUE1JU0NDQVBTX0JMRU5ET1AgfAkJCQkJCS8vIERldmljZSBzdXBwb3J0cyBhbHBoYS1ibGVuZGluZyBvcGVyYXRpb25zIG90aGVyIHRoYW4gRDNEQkxFTkRPUF9BREQuIAoJCQkJCQkJCQkvLwlEM0RQTUlTQ0NBUFNfTlVMTFJFRkVSRU5DRSB8CQkJCS8vIEEgcmVmZXJlbmNlIGRldmljZSB0aGF0IGRvZXMgbm90IHJlbmRlci4gCgkJCQkJCQkJCQlEM0RQTUlTQ0NBUFNfSU5ERVBFTkRFTlRXUklURU1BU0tTIHwJCS8vIERldmljZSBzdXBwb3J0cyBpbmRlcGVuZGVudCB3cml0ZSBtYXNrcyBmb3IgbXVsdGlwbGUgZWxlbWVudCB0ZXh0dXJlcyBvciBtdWx0aXBsZSByZW5kZXIgdGFyZ2V0cy4gCgkJCQkJCQkJCQlEM0RQTUlTQ0NBUFNfUEVSU1RBR0VDT05TVEFOVCB8CQkJCS8vIERldmljZSBzdXBwb3J0cyBwZXItc3RhZ2UgY29uc3RhbnRzLiBTZWUgRDNEVFNTX0NPTlNUQU5UIGluIEQzRFRFWFRVUkVTVEFHRVNUQVRFVFlQRS4gCgkJCQkJCQkJCQlEM0RQTUlTQ0NBUFNfRk9HQU5EU1BFQ1VMQVJBTFBIQSB8CQkJLy8gRGV2aWNlIHN1cHBvcnRzIHNlcGFyYXRlIGZvZyBhbmQgc3BlY3VsYXIgYWxwaGEuIE1hbnkgZGV2aWNlcyB1c2UgdGhlIHNwZWN1bGFyIGFscGhhIGNoYW5uZWwgdG8gc3RvcmUgdGhlIGZvZyBmYWN0b3IuIAoJCQkJCQkJCQkJRDNEUE1JU0NDQVBTX1NFUEFSQVRFQUxQSEFCTEVORCB8CQkJLy8gRGV2aWNlIHN1cHBvcnRzIHNlcGFyYXRlIGJsZW5kIHNldHRpbmdzIGZvciB0aGUgYWxwaGEgY2hhbm5lbC4gCgkJCQkJCQkJCQlEM0RQTUlTQ0NBUFNfTVJUSU5ERVBFTkRFTlRCSVRERVBUSFMgfAkJLy8gRGV2aWNlIHN1cHBvcnRzIGRpZmZlcmVudCBiaXQgZGVwdGhzIGZvciBtdWx0aXBsZSByZW5kZXIgdGFyZ2V0cy4gCgkJCQkJCQkJCQlEM0RQTUlTQ0NBUFNfTVJUUE9TVFBJWEVMU0hBREVSQkxFTkRJTkcgfAkvLyBEZXZpY2Ugc3VwcG9ydHMgcG9zdC1waXhlbCBzaGFkZXIgb3BlcmF0aW9ucyBmb3IgbXVsdGlwbGUgcmVuZGVyIHRhcmdldHMuIAoJCQkJCQkJCQkJRDNEUE1JU0NDQVBTX0ZPR1ZFUlRFWENMQU1QRUQ7CQkJCS8vIERldmljZSBjbGFtcHMgZm9nIGJsZW5kIGZhY3RvciBwZXIgdmVydGV4LgoKCQljYXBzLlJhc3RlckNhcHMgPQkJRDNEUFJBU1RFUkNBUFNfQU5JU09UUk9QWSB8CQkJCS8vIERldmljZSBzdXBwb3J0cyBhbmlzb3Ryb3BpYyBmaWx0ZXJpbmcuIAoJCQkJCQkJCUQzRFBSQVNURVJDQVBTX0NPTE9SUEVSU1BFQ1RJVkUgfAkJLy8gRGV2aWNlIGl0ZXJhdGVzIGNvbG9ycyBwZXJzcGVjdGl2ZSBjb3JyZWN0bHkuIAoJCQkJCQkJLy8JRDNEUFJBU1RFUkNBUFNfRElUSEVSIHwJCQkJCS8vIERldmljZSBjYW4gZGl0aGVyIHRvIGltcHJvdmUgY29sb3IgcmVzb2x1dGlvbi4gCgkJCQkJCQkJRDNEUFJBU1RFUkNBUFNfREVQVEhCSUFTIHwJCQkJLy8gRGV2aWNlIHN1cHBvcnRzIGxlZ2FjeSBkZXB0aCBiaWFzLiBGb3IgdHJ1ZSBkZXB0aCBiaWFzLCBzZWUgRDNEUFJBU1RFUkNBUFNfU0xPUEVTQ0FMRURFUFRIQklBUy4KCQkJCQkJCQlEM0RQUkFTVEVSQ0FQU19GT0dSQU5HRSB8CQkJCS8vIERldmljZSBzdXBwb3J0cyByYW5nZS1iYXNlZCBmb2cuIEluIHJhbmdlLWJhc2VkIGZvZywgdGhlIGRpc3RhbmNlIG9mIGFuIG9iamVjdCBmcm9tIHRoZSB2aWV3ZXIgaXMgdXNlZCB0byBjb21wdXRlIGZvZyBlZmZlY3RzLCBub3QgdGhlIGRlcHRoIG9mIHRoZSBvYmplY3QgKHRoYXQgaXMsIHRoZSB6LWNvb3JkaW5hdGUpIGluIHRoZSBzY2VuZS4gCgkJCQkJCQkJRDNEUFJBU1RFUkNBUFNfRk9HVEFCTEUgfAkJCQkvLyBEZXZpY2UgY2FsY3VsYXRlcyB0aGUgZm9nIHZhbHVlIGJ5IHJlZmVycmluZyB0byBhIGxvb2t1cCB0YWJsZSBjb250YWluaW5nIGZvZyB2YWx1ZXMgdGhhdCBhcmUgaW5kZXhlZCB0byB0aGUgZGVwdGggb2YgYSBnaXZlbiBwaXhlbC4gCgkJCQkJCQkJRDNEUFJBU1RFUkNBUFNfRk9HVkVSVEVYIHwJCQkJLy8gRGV2aWNlIGNhbGN1bGF0ZXMgdGhlIGZvZyB2YWx1ZSBkdXJpbmcgdGhlIGxpZ2h0aW5nIG9wZXJhdGlvbiBhbmQgaW50ZXJwb2xhdGVzIHRoZSBmb2cgdmFsdWUgZHVyaW5nIHJhc3Rlcml6YXRpb24uIAoJCQkJCQkJCUQzRFBSQVNURVJDQVBTX01JUE1BUExPREJJQVMgfAkJCS8vIERldmljZSBzdXBwb3J0cyBsZXZlbCBvZiBkZXRhaWwgKExPRCkgYmlhcyBhZGp1c3RtZW50cy4gVGhlc2UgYmlhcyBhZGp1c3RtZW50cyBlbmFibGUgYW4gYXBwbGljYXRpb24gdG8gbWFrZSBhIG1pcG1hcCBhcHBlYXIgY3Jpc3BlciBvciBsZXNzIHNoYXJwIHRoYW4gaXQgbm9ybWFsbHkgd291bGQuIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IExPRCBiaWFzIGluIG1pcG1hcHMsIHNlZSBEM0RTQU1QX01JUE1BUExPREJJQVMuCgkJCQkJCQkvLwlEM0RQUkFTVEVSQ0FQU19NVUxUSVNBTVBMRV9UT0dHTEUgfAkJLy8gRGV2aWNlIHN1cHBvcnRzIHRvZ2dsaW5nIG11bHRpc2FtcGxpbmcgb24gYW5kIG9mZiBiZXR3ZWVuIElEaXJlY3QzRERldmljZTk6OkJlZ2luU2NlbmUgYW5kIElEaXJlY3QzRERldmljZTk6OkVuZFNjZW5lICh1c2luZyBEM0RSU19NVUxUSVNBTVBMRUFOVElBTElBUykuIAoJCQkJCQkJCUQzRFBSQVNURVJDQVBTX1NDSVNTT1JURVNUIHwJCQkvLyBEZXZpY2Ugc3VwcG9ydHMgc2Npc3NvciB0ZXN0LiBTZWUgU2Npc3NvciBUZXN0LgoJCQkJCQkJCUQzRFBSQVNURVJDQVBTX1NMT1BFU0NBTEVERVBUSEJJQVMgfAkvLyBEZXZpY2UgcGVyZm9ybXMgdHJ1ZSBzbG9wZS1zY2FsZSBiYXNlZCBkZXB0aCBiaWFzLiBUaGlzIGlzIGluIGNvbnRyYXN0IHRvIHRoZSBsZWdhY3kgc3R5bGUgRDNEUFJBU1RFUkNBUFNfREVQVEhCSUFTLgoJCQkJCQkJLy8JRDNEUFJBU1RFUkNBUFNfV0JVRkZFUiB8CQkJCS8vIERldmljZSBzdXBwb3J0cyBkZXB0aCBidWZmZXJpbmcgdXNpbmcgdy4gCgkJCQkJCQkJRDNEUFJBU1RFUkNBUFNfV0ZPRyB8CQkJCQkvLyBEZXZpY2Ugc3VwcG9ydHMgdy1iYXNlZCBmb2cuIFctYmFzZWQgZm9nIGlzIHVzZWQgd2hlbiBhIHBlcnNwZWN0aXZlIHByb2plY3Rpb24gbWF0cml4IGlzIHNwZWNpZmllZCwgYnV0IGFmZmluZSBwcm9qZWN0aW9ucyBzdGlsbCB1c2Ugei1iYXNlZCBmb2cuIFRoZSBzeXN0ZW0gY29uc2lkZXJzIGEgcHJvamVjdGlvbiBtYXRyaXggdGhhdCBjb250YWlucyBhIG5vbnplcm8gdmFsdWUgaW4gdGhlIFszXVs0XSBlbGVtZW50IHRvIGJlIGEgcGVyc3BlY3RpdmUgcHJvamVjdGlvbiBtYXRyaXguIAoJCQkJCQkJLy8JRDNEUFJBU1RFUkNBUFNfWkJVRkZFUkxFU1NIU1IgfAkJCS8vIERldmljZSBjYW4gcGVyZm9ybSBoaWRkZW4tc3VyZmFjZSByZW1vdmFsIChIU1IpIHdpdGhvdXQgcmVxdWlyaW5nIHRoZSBhcHBsaWNhdGlvbiB0byBzb3J0IHBvbHlnb25zIGFuZCB3aXRob3V0IHJlcXVpcmluZyB0aGUgYWxsb2NhdGlvbiBvZiBhIGRlcHRoLWJ1ZmZlci4gVGhpcyBsZWF2ZXMgbW9yZSB2aWRlbyBtZW1vcnkgZm9yIHRleHR1cmVzLiBUaGUgbWV0aG9kIHVzZWQgdG8gcGVyZm9ybSBIU1IgaXMgaGFyZHdhcmUtZGVwZW5kZW50IGFuZCBpcyB0cmFuc3BhcmVudCB0byB0aGUgYXBwbGljYXRpb24uIFotYnVmZmVybGVzcyBIU1IgaXMgcGVyZm9ybWVkIGlmIG5vIGRlcHRoLWJ1ZmZlciBzdXJmYWNlIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVuZGVyaW5nLXRhcmdldCBzdXJmYWNlIGFuZCB0aGUgZGVwdGgtYnVmZmVyIGNvbXBhcmlzb24gdGVzdCBpcyBlbmFibGVkICh0aGF0IGlzLCB3aGVuIHRoZSBzdGF0ZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIEQzRFJTX1pFTkFCTEUgZW51bWVyYXRpb24gY29uc3RhbnQgaXMgc2V0IHRvIFRSVUUpLgoJCQkJCQkJCUQzRFBSQVNURVJDQVBTX1pGT0cgfAkJCQkJLy8gRGV2aWNlIHN1cHBvcnRzIHotYmFzZWQgZm9nLiAKCQkJCQkJCQlEM0RQUkFTVEVSQ0FQU19aVEVTVDsJCQkJCS8vIERldmljZSBjYW4gcGVyZm9ybSB6LXRlc3Qgb3BlcmF0aW9ucy4gVGhpcyBlZmZlY3RpdmVseSByZW5kZXJzIGEgcHJpbWl0aXZlIGFuZCBpbmRpY2F0ZXMgd2hldGhlciBhbnkgeiBwaXhlbHMgaGF2ZSBiZWVuIHJlbmRlcmVkLgoKCQljYXBzLlpDbXBDYXBzID0JCUQzRFBDTVBDQVBTX0FMV0FZUyB8CQkvLyBBbHdheXMgcGFzcyB0aGUgei10ZXN0LiAKCQkJCQkJCUQzRFBDTVBDQVBTX0VRVUFMIHwJCQkvLyBQYXNzIHRoZSB6LXRlc3QgaWYgdGhlIG5ldyB6IGVxdWFscyB0aGUgY3VycmVudCB6LiAKCQkJCQkJCUQzRFBDTVBDQVBTX0dSRUFURVIgfAkJLy8gUGFzcyB0aGUgei10ZXN0IGlmIHRoZSBuZXcgeiBpcyBncmVhdGVyIHRoYW4gdGhlIGN1cnJlbnQgei4gCgkJCQkJCQlEM0RQQ01QQ0FQU19HUkVBVEVSRVFVQUwgfAkvLyBQYXNzIHRoZSB6LXRlc3QgaWYgdGhlIG5ldyB6IGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgY3VycmVudCB6LiAKCQkJCQkJCUQzRFBDTVBDQVBTX0xFU1MgfAkJCS8vIFBhc3MgdGhlIHotdGVzdCBpZiB0aGUgbmV3IHogaXMgbGVzcyB0aGFuIHRoZSBjdXJyZW50IHouIAoJCQkJCQkJRDNEUENNUENBUFNfTEVTU0VRVUFMIHwJCS8vIFBhc3MgdGhlIHotdGVzdCBpZiB0aGUgbmV3IHogaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBjdXJyZW50IHouIAoJCQkJCQkJRDNEUENNUENBUFNfTkVWRVIgfAkJCS8vIEFsd2F5cyBmYWlsIHRoZSB6LXRlc3QuIAoJCQkJCQkJRDNEUENNUENBUFNfTk9URVFVQUw7CQkvLyBQYXNzIHRoZSB6LXRlc3QgaWYgdGhlIG5ldyB6IGRvZXMgbm90IGVxdWFsIHRoZSBjdXJyZW50IHouCgoJCWNhcHMuU3JjQmxlbmRDYXBzID0JCUQzRFBCTEVORENBUFNfQkxFTkRGQUNUT1IgfAkJLy8gVGhlIGRyaXZlciBzdXBwb3J0cyBib3RoIEQzREJMRU5EX0JMRU5ERkFDVE9SIGFuZCBEM0RCTEVORF9JTlZCTEVOREZBQ1RPUi4gU2VlIEQzREJMRU5ELgoJCQkJCQkJCUQzRFBCTEVORENBUFNfQk9USElOVlNSQ0FMUEhBIHwJLy8gU291cmNlIGJsZW5kIGZhY3RvciBpcyAoMS1BcywxLUFzLDEtQXMsMS1BcykgYW5kIGRlc3RpbmF0aW9uIGJsZW5kIGZhY3RvciBpcyAoQXMsQXMsQXMsQXMpOyB0aGUgZGVzdGluYXRpb24gYmxlbmQgc2VsZWN0aW9uIGlzIG92ZXJyaWRkZW4uIAoJCQkJCQkJCUQzRFBCTEVORENBUFNfQk9USFNSQ0FMUEhBIHwJLy8gVGhlIGRyaXZlciBzdXBwb3J0cyB0aGUgRDNEQkxFTkRfQk9USFNSQ0FMUEhBIGJsZW5kIG1vZGUuIChUaGlzIGJsZW5kIG1vZGUgaXMgb2Jzb2xldGUuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgRDNEQkxFTkQuKSAKCQkJCQkJCQlEM0RQQkxFTkRDQVBTX0RFU1RBTFBIQSB8CQkvLyBCbGVuZCBmYWN0b3IgaXMgKEFkLCBBZCwgQWQsIEFkKS4gCgkJCQkJCQkJRDNEUEJMRU5EQ0FQU19ERVNUQ09MT1IgfAkJLy8gQmxlbmQgZmFjdG9yIGlzIChSZCwgR2QsIEJkLCBBZCkuIAoJCQkJCQkJCUQzRFBCTEVORENBUFNfSU5WREVTVEFMUEhBIHwJLy8gQmxlbmQgZmFjdG9yIGlzICgxLUFkLCAxLUFkLCAxLUFkLCAxLUFkKS4gCgkJCQkJCQkJRDNEUEJMRU5EQ0FQU19JTlZERVNUQ09MT1IgfAkvLyBCbGVuZCBmYWN0b3IgaXMgKDEtUmQsIDEtR2QsIDEtQmQsIDEtQWQpLiAKCQkJCQkJCQlEM0RQQkxFTkRDQVBTX0lOVlNSQ0FMUEhBIHwJCS8vIEJsZW5kIGZhY3RvciBpcyAoMS1BcywgMS1BcywgMS1BcywgMS1BcykuIAoJCQkJCQkJCUQzRFBCTEVORENBUFNfSU5WU1JDQ09MT1IgfAkJLy8gQmxlbmQgZmFjdG9yIGlzICgxLVJzLCAxLUdzLCAxLUJzLCAxLUFzKS4gCgkJCQkJCQkJRDNEUEJMRU5EQ0FQU19PTkUgfAkJCQkvLyBCbGVuZCBmYWN0b3IgaXMgKDEsIDEsIDEsIDEpLiAKCQkJCQkJCQlEM0RQQkxFTkRDQVBTX1NSQ0FMUEhBIHwJCS8vIEJsZW5kIGZhY3RvciBpcyAoQXMsIEFzLCBBcywgQXMpLiAKCQkJCQkJCQlEM0RQQkxFTkRDQVBTX1NSQ0FMUEhBU0FUIHwJCS8vIEJsZW5kIGZhY3RvciBpcyAoZiwgZiwgZiwgMSk7IGYgPSBtaW4oQXMsIDEtQWQpLiAKCQkJCQkJCQlEM0RQQkxFTkRDQVBTX1NSQ0NPTE9SIHwJCS8vIEJsZW5kIGZhY3RvciBpcyAoUnMsIEdzLCBCcywgQXMpLiAKCQkJCQkJCQlEM0RQQkxFTkRDQVBTX1pFUk87CQkJCS8vIEJsZW5kIGZhY3RvciBpcyAoMCwgMCwgMCwgMCkuCgoJCWNhcHMuRGVzdEJsZW5kQ2FwcyA9IAlEM0RQQkxFTkRDQVBTX0JMRU5ERkFDVE9SIHwJCS8vIFRoZSBkcml2ZXIgc3VwcG9ydHMgYm90aCBEM0RCTEVORF9CTEVOREZBQ1RPUiBhbmQgRDNEQkxFTkRfSU5WQkxFTkRGQUNUT1IuIFNlZSBEM0RCTEVORC4KCQkJCQkJCQlEM0RQQkxFTkRDQVBTX0JPVEhJTlZTUkNBTFBIQSB8CS8vIFNvdXJjZSBibGVuZCBmYWN0b3IgaXMgKDEtQXMsMS1BcywxLUFzLDEtQXMpIGFuZCBkZXN0aW5hdGlvbiBibGVuZCBmYWN0b3IgaXMgKEFzLEFzLEFzLEFzKTsgdGhlIGRlc3RpbmF0aW9uIGJsZW5kIHNlbGVjdGlvbiBpcyBvdmVycmlkZGVuLiAKCQkJCQkJCQlEM0RQQkxFTkRDQVBTX0JPVEhTUkNBTFBIQSB8CS8vIFRoZSBkcml2ZXIgc3VwcG9ydHMgdGhlIEQzREJMRU5EX0JPVEhTUkNBTFBIQSBibGVuZCBtb2RlLiAoVGhpcyBibGVuZCBtb2RlIGlzIG9ic29sZXRlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIEQzREJMRU5ELikgCgkJCQkJCQkJRDNEUEJMRU5EQ0FQU19ERVNUQUxQSEEgfAkJLy8gQmxlbmQgZmFjdG9yIGlzIChBZCwgQWQsIEFkLCBBZCkuIAoJCQkJCQkJCUQzRFBCTEVORENBUFNfREVTVENPTE9SIHwJCS8vIEJsZW5kIGZhY3RvciBpcyAoUmQsIEdkLCBCZCwgQWQpLiAKCQkJCQkJCQlEM0RQQkxFTkRDQVBTX0lOVkRFU1RBTFBIQSB8CS8vIEJsZW5kIGZhY3RvciBpcyAoMS1BZCwgMS1BZCwgMS1BZCwgMS1BZCkuIAoJCQkJCQkJCUQzRFBCTEVORENBUFNfSU5WREVTVENPTE9SIHwJLy8gQmxlbmQgZmFjdG9yIGlzICgxLVJkLCAxLUdkLCAxLUJkLCAxLUFkKS4gCgkJCQkJCQkJRDNEUEJMRU5EQ0FQU19JTlZTUkNBTFBIQSB8CQkvLyBCbGVuZCBmYWN0b3IgaXMgKDEtQXMsIDEtQXMsIDEtQXMsIDEtQXMpLiAKCQkJCQkJCQlEM0RQQkxFTkRDQVBTX0lOVlNSQ0NPTE9SIHwJCS8vIEJsZW5kIGZhY3RvciBpcyAoMS1ScywgMS1HcywgMS1CcywgMS1BcykuIAoJCQkJCQkJCUQzRFBCTEVORENBUFNfT05FIHwJCQkJLy8gQmxlbmQgZmFjdG9yIGlzICgxLCAxLCAxLCAxKS4gCgkJCQkJCQkJRDNEUEJMRU5EQ0FQU19TUkNBTFBIQSB8CQkvLyBCbGVuZCBmYWN0b3IgaXMgKEFzLCBBcywgQXMsIEFzKS4gCgkJCQkJCQkJRDNEUEJMRU5EQ0FQU19TUkNBTFBIQVNBVCB8CQkvLyBCbGVuZCBmYWN0b3IgaXMgKGYsIGYsIGYsIDEpOyBmID0gbWluKEFzLCAxLUFkKS4gCgkJCQkJCQkJRDNEUEJMRU5EQ0FQU19TUkNDT0xPUiB8CQkvLyBCbGVuZCBmYWN0b3IgaXMgKFJzLCBHcywgQnMsIEFzKS4gCgkJCQkJCQkJRDNEUEJMRU5EQ0FQU19aRVJPOwkJCQkvLyBCbGVuZCBmYWN0b3IgaXMgKDAsIDAsIDAsIDApLgoKCQljYXBzLkFscGhhQ21wQ2FwcyA9IEQzRFBDTVBDQVBTX0FMV0FZUyB8CQkvLyBBbHdheXMgcGFzcyB0aGUgYXBoYS10ZXN0LiAKCQkJCQkJCUQzRFBDTVBDQVBTX0VRVUFMIHwJCQkvLyBQYXNzIHRoZSBhcGhhLXRlc3QgaWYgdGhlIG5ldyBhcGhhIGVxdWFscyB0aGUgY3VycmVudCBhcGhhLiAKCQkJCQkJCUQzRFBDTVBDQVBTX0dSRUFURVIgfAkJLy8gUGFzcyB0aGUgYXBoYS10ZXN0IGlmIHRoZSBuZXcgYXBoYSBpcyBncmVhdGVyIHRoYW4gdGhlIGN1cnJlbnQgYXBoYS4gCgkJCQkJCQlEM0RQQ01QQ0FQU19HUkVBVEVSRVFVQUwgfAkvLyBQYXNzIHRoZSBhcGhhLXRlc3QgaWYgdGhlIG5ldyBhcGhhIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgY3VycmVudCBhcGhhLiAKCQkJCQkJCUQzRFBDTVBDQVBTX0xFU1MgfAkJCS8vIFBhc3MgdGhlIGFwaGEtdGVzdCBpZiB0aGUgbmV3IGFwaGEgaXMgbGVzcyB0aGFuIHRoZSBjdXJyZW50IGFwaGEuIAoJCQkJCQkJRDNEUENNUENBUFNfTEVTU0VRVUFMIHwJCS8vIFBhc3MgdGhlIGFwaGEtdGVzdCBpZiB0aGUgbmV3IGFwaGEgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBjdXJyZW50IGFwaGEuIAoJCQkJCQkJRDNEUENNUENBUFNfTkVWRVIgfAkJCS8vIEFsd2F5cyBmYWlsIHRoZSBhcGhhLXRlc3QuIAoJCQkJCQkJRDNEUENNUENBUFNfTk9URVFVQUw7CQkvLyBQYXNzIHRoZSBhcGhhLXRlc3QgaWYgdGhlIG5ldyBhcGhhIGRvZXMgbm90IGVxdWFsIHRoZSBjdXJyZW50IGFwaGEuCgoJCWNhcHMuU2hhZGVDYXBzID0JRDNEUFNIQURFQ0FQU19BTFBIQUdPVVJBVURCTEVORCB8CS8vIERldmljZSBjYW4gc3VwcG9ydCBhbiBhbHBoYSBjb21wb25lbnQgZm9yIEdvdXJhdWQtYmxlbmRlZCB0cmFuc3BhcmVuY3kgKHRoZSBEM0RTSEFERV9HT1VSQVVEIHN0YXRlIGZvciB0aGUgRDNEU0hBREVNT0RFIGVudW1lcmF0ZWQgdHlwZSkuIEluIHRoaXMgbW9kZSwgdGhlIGFscGhhIGNvbG9yIGNvbXBvbmVudCBvZiBhIHByaW1pdGl2ZSBpcyBwcm92aWRlZCBhdCB2ZXJ0aWNlcyBhbmQgaW50ZXJwb2xhdGVkIGFjcm9zcyBhIGZhY2UgYWxvbmcgd2l0aCB0aGUgb3RoZXIgY29sb3IgY29tcG9uZW50cy4gCgkJCQkJCQlEM0RQU0hBREVDQVBTX0NPTE9SR09VUkFVRFJHQiB8CQkvLyBEZXZpY2UgY2FuIHN1cHBvcnQgY29sb3JlZCBHb3VyYXVkIHNoYWRpbmcgaW4gdGhlIFJHQiBjb2xvciBtb2RlbC4gSW4gdGhpcyBtb2RlLCB0aGUgY29sb3IgY29tcG9uZW50IGZvciBhIHByaW1pdGl2ZSBpcyBwcm92aWRlZCBhdCB2ZXJ0aWNlcyBhbmQgaW50ZXJwb2xhdGVkIGFjcm9zcyBhIGZhY2UgYWxvbmcgd2l0aCB0aGUgb3RoZXIgY29sb3IgY29tcG9uZW50cy4gSW4gdGhlIFJHQiBsaWdodGluZyBtb2RlbCwgdGhlIHJlZCwgZ3JlZW4sIGFuZCBibHVlIGNvbXBvbmVudHMgYXJlIGludGVycG9sYXRlZC4gCgkJCQkJCQlEM0RQU0hBREVDQVBTX0ZPR0dPVVJBVUQgfAkJCS8vIERldmljZSBjYW4gc3VwcG9ydCBmb2cgaW4gdGhlIEdvdXJhdWQgc2hhZGluZyBtb2RlLiAKCQkJCQkJCUQzRFBTSEFERUNBUFNfU1BFQ1VMQVJHT1VSQVVEUkdCOwkvLyBEZXZpY2Ugc3VwcG9ydHMgR291cmF1ZCBzaGFkaW5nIG9mIHNwZWN1bGFyIGhpZ2hsaWdodHMuCgoJCWNhcHMuVGV4dHVyZUNhcHMgPQkJRDNEUFRFWFRVUkVDQVBTX0FMUEhBIHwJCQkJCQkvLyBBbHBoYSBpbiB0ZXh0dXJlIHBpeGVscyBpcyBzdXBwb3J0ZWQuIAoJCQkJCQkJCUQzRFBURVhUVVJFQ0FQU19BTFBIQVBBTEVUVEUgfAkJCQkvLyBEZXZpY2UgY2FuIGRyYXcgYWxwaGEgZnJvbSB0ZXh0dXJlIHBhbGV0dGVzLiAKCQkJCQkJCQlEM0RQVEVYVFVSRUNBUFNfQ1VCRU1BUCB8CQkJCQkvLyBTdXBwb3J0cyBjdWJlIHRleHR1cmVzLgoJCQkJCQkJLy8JRDNEUFRFWFRVUkVDQVBTX0NVQkVNQVBfUE9XMiB8CQkJCS8vIERldmljZSByZXF1aXJlcyB0aGF0IGN1YmUgdGV4dHVyZSBtYXBzIGhhdmUgZGltZW5zaW9ucyBzcGVjaWZpZWQgYXMgcG93ZXJzIG9mIHR3by4gCgkJCQkJCQkJRDNEUFRFWFRVUkVDQVBTX01JUENVQkVNQVAgfAkJCQkvLyBEZXZpY2Ugc3VwcG9ydHMgbWlwbWFwcGVkIGN1YmUgdGV4dHVyZXMuIAoJCQkJCQkJCUQzRFBURVhUVVJFQ0FQU19NSVBNQVAgfAkJCQkJLy8gRGV2aWNlIHN1cHBvcnRzIG1pcG1hcHBlZCB0ZXh0dXJlcy4gCgkJCQkJCQkJRDNEUFRFWFRVUkVDQVBTX01JUFZPTFVNRU1BUCB8CQkJCS8vIERldmljZSBzdXBwb3J0cyBtaXBtYXBwZWQgdm9sdW1lIHRleHR1cmVzLiAKCQkJCQkJCS8vCUQzRFBURVhUVVJFQ0FQU19OT05QT1cyQ09ORElUSU9OQUwgfAkJLy8gQ29uZGl0aW9uYWxseSBzdXBwb3J0cyB0aGUgdXNlIG9mIDItRCB0ZXh0dXJlcyB3aXRoIGRpbWVuc2lvbnMgdGhhdCBhcmUgbm90IHBvd2VycyBvZiB0d28uIEEgZGV2aWNlIHRoYXQgZXhwb3NlcyB0aGlzIGNhcGFiaWxpdHkgY2FuIHVzZSBzdWNoIGEgdGV4dHVyZSBpZiBhbGwgb2YgdGhlIGZvbGxvd2luZyByZXF1aXJlbWVudHMgYXJlIG1ldC4uLgoJCQkJCQkJLy8JRDNEUFRFWFRVUkVDQVBTX05PUFJPSkVDVEVEQlVNUEVOViB8CQkvLyBEZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCBhIHByb2plY3RlZCBidW1wLWVudmlyb25tZW50IGxvb3BrdXAgb3BlcmF0aW9uIGluIHByb2dyYW1tYWJsZSBhbmQgZml4ZWQgZnVuY3Rpb24gc2hhZGVycy4gCgkJCQkJCQkJRDNEUFRFWFRVUkVDQVBTX1BFUlNQRUNUSVZFIHwJCQkJLy8gUGVyc3BlY3RpdmUgY29ycmVjdGlvbiB0ZXh0dXJpbmcgaXMgc3VwcG9ydGVkLgoJCQkJCQkJLy8JRDNEUFRFWFRVUkVDQVBTX1BPVzIgfAkJCQkJCS8vIEFsbCB0ZXh0dXJlcyBtdXN0IGhhdmUgd2lkdGhzIGFuZCBoZWlnaHRzIHNwZWNpZmllZCBhcyBwb3dlcnMgb2YgdHdvLiBUaGlzIHJlcXVpcmVtZW50IGRvZXMgbm90IGFwcGx5IHRvIGVpdGhlciBjdWJlIHRleHR1cmVzIG9yIHZvbHVtZSB0ZXh0dXJlcy4KCQkJCQkJCQlEM0RQVEVYVFVSRUNBUFNfUFJPSkVDVEVEIHwJCQkJCS8vIFN1cHBvcnRzIHRoZSBEM0RUVEZGX1BST0pFQ1RFRCB0ZXh0dXJlIHRyYW5zZm9ybWF0aW9uIGZsYWcuIFdoZW4gYXBwbGllZCwgdGhlIGRldmljZSBkaXZpZGVzIHRyYW5zZm9ybWVkIHRleHR1cmUgY29vcmRpbmF0ZXMgYnkgdGhlIGxhc3QgdGV4dHVyZSBjb29yZGluYXRlLiBJZiB0aGlzIGNhcGFiaWxpdHkgaXMgcHJlc2VudCwgdGhlbiB0aGUgcHJvamVjdGl2ZSBkaXZpZGUgb2NjdXJzIHBlciBwaXhlbC4gSWYgdGhpcyBjYXBhYmlsaXR5IGlzIG5vdCBwcmVzZW50LCBidXQgdGhlIHByb2plY3RpdmUgZGl2aWRlIG5lZWRzIHRvIG9jY3VyIGFueXdheSwgdGhlbiBpdCBpcyBwZXJmb3JtZWQgb24gYSBwZXItdmVydGV4IGJhc2lzIGJ5IHRoZSBEaXJlY3QzRCBydW50aW1lLiAKCQkJCQkJCS8vCUQzRFBURVhUVVJFQ0FQU19TUVVBUkVPTkxZIHwJCQkJLy8gQWxsIHRleHR1cmVzIG11c3QgYmUgc3F1YXJlLiAKCQkJCQkJCQlEM0RQVEVYVFVSRUNBUFNfVEVYUkVQRUFUTk9UU0NBTEVEQllTSVpFIHwJLy8gVGV4dHVyZSBpbmRpY2VzIGFyZSBub3Qgc2NhbGVkIGJ5IHRoZSB0ZXh0dXJlIHNpemUgcHJpb3IgdG8gaW50ZXJwb2xhdGlvbi4KCQkJCQkJCQlEM0RQVEVYVFVSRUNBUFNfVk9MVU1FTUFQOwkJCQkJLy8gRGV2aWNlIHN1cHBvcnRzIHZvbHVtZSB0ZXh0dXJlcy4KCQkJCQkJCS8vCUQzRFBURVhUVVJFQ0FQU19WT0xVTUVNQVBfUE9XMjsJCQkJLy8gRGV2aWNlIHJlcXVpcmVzIHRoYXQgdm9sdW1lIHRleHR1cmUgbWFwcyBoYXZlIGRpbWVuc2lvbnMgc3BlY2lmaWVkIGFzIHBvd2VycyBvZiB0d28uIAoKCQljYXBzLlRleHR1cmVGaWx0ZXJDYXBzID0JCUQzRFBURklMVEVSQ0FQU19NQUdGUE9JTlQgfAkJCS8vIERldmljZSBzdXBwb3J0cyBwZXItc3RhZ2UgcG9pbnQtc2FtcGxlIGZpbHRlcmluZyBmb3IgbWFnbmlmeWluZyB0ZXh0dXJlcy4gVGhlIHBvaW50LXNhbXBsZSBtYWduaWZpY2F0aW9uIGZpbHRlciBpcyByZXByZXNlbnRlZCBieSB0aGUgRDNEVEVYRl9QT0lOVCBtZW1iZXIgb2YgdGhlIEQzRFRFWFRVUkVGSUxURVJUWVBFIGVudW1lcmF0ZWQgdHlwZS4gCgkJCQkJCQkJCQlEM0RQVEZJTFRFUkNBUFNfTUFHRkxJTkVBUiB8CQkvLyBEZXZpY2Ugc3VwcG9ydHMgcGVyLXN0YWdlIGJpbGluZWFyIGludGVycG9sYXRpb24gZmlsdGVyaW5nIGZvciBtYWduaWZ5aW5nIG1pcG1hcHMuIFRoZSBiaWxpbmVhciBpbnRlcnBvbGF0aW9uIG1pcG1hcHBpbmcgZmlsdGVyIGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBEM0RURVhGX0xJTkVBUiBtZW1iZXIgb2YgdGhlIEQzRFRFWFRVUkVGSUxURVJUWVBFIGVudW1lcmF0ZWQgdHlwZS4gCgkJCQkJCQkJCS8vCUQzRFBURklMVEVSQ0FQU19NQUdGQU5JU09UUk9QSUMgfAkvLyBEZXZpY2Ugc3VwcG9ydHMgcGVyLXN0YWdlIGFuaXNvdHJvcGljIGZpbHRlcmluZyBmb3IgbWFnbmlmeWluZyB0ZXh0dXJlcy4gVGhlIGFuaXNvdHJvcGljIG1hZ25pZmljYXRpb24gZmlsdGVyIGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBEM0RURVhGX0FOSVNPVFJPUElDIG1lbWJlciBvZiB0aGUgRDNEVEVYVFVSRUZJTFRFUlRZUEUgZW51bWVyYXRlZCB0eXBlLiAKCQkJCQkJCQkJLy8JRDNEUFRGSUxURVJDQVBTX01BR0ZQWVJBTUlEQUxRVUFEIHwJLy8gRGV2aWNlIHN1cHBvcnRzIHBlci1zdGFnZSBweXJhbWlkYWwgc2FtcGxlIGZpbHRlcmluZyBmb3IgbWFnbmlmeWluZyB0ZXh0dXJlcy4gVGhlIHB5cmFtaWRhbCBtYWduaWZ5aW5nIGZpbHRlciBpcyByZXByZXNlbnRlZCBieSB0aGUgRDNEVEVYRl9QWVJBTUlEQUxRVUFEIG1lbWJlciBvZiB0aGUgRDNEVEVYVFVSRUZJTFRFUlRZUEUgZW51bWVyYXRlZCB0eXBlLiAKCQkJCQkJCQkJLy8JRDNEUFRGSUxURVJDQVBTX01BR0ZHQVVTU0lBTlFVQUQgfAkvLyBEZXZpY2Ugc3VwcG9ydHMgcGVyLXN0YWdlIEdhdXNzaWFuIHF1YWQgZmlsdGVyaW5nIGZvciBtYWduaWZ5aW5nIHRleHR1cmVzLiAKCQkJCQkJCQkJCUQzRFBURklMVEVSQ0FQU19NSU5GUE9JTlQgfAkJCS8vIERldmljZSBzdXBwb3J0cyBwZXItc3RhZ2UgcG9pbnQtc2FtcGxlIGZpbHRlcmluZyBmb3IgbWluaWZ5aW5nIHRleHR1cmVzLiBUaGUgcG9pbnQtc2FtcGxlIG1pbmlmaWNhdGlvbiBmaWx0ZXIgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIEQzRFRFWEZfUE9JTlQgbWVtYmVyIG9mIHRoZSBEM0RURVhUVVJFRklMVEVSVFlQRSBlbnVtZXJhdGVkIHR5cGUuIAoJCQkJCQkJCQkJRDNEUFRGSUxURVJDQVBTX01JTkZMSU5FQVIgfAkJLy8gRGV2aWNlIHN1cHBvcnRzIHBlci1zdGFnZSBsaW5lYXIgZmlsdGVyaW5nIGZvciBtaW5pZnlpbmcgdGV4dHVyZXMuIFRoZSBsaW5lYXIgbWluaWZpY2F0aW9uIGZpbHRlciBpcyByZXByZXNlbnRlZCBieSB0aGUgRDNEVEVYRl9MSU5FQVIgbWVtYmVyIG9mIHRoZSBEM0RURVhUVVJFRklMVEVSVFlQRSBlbnVtZXJhdGVkIHR5cGUuIAoJCQkJCQkJCQkJRDNEUFRGSUxURVJDQVBTX01JTkZBTklTT1RST1BJQyB8CS8vIERldmljZSBzdXBwb3J0cyBwZXItc3RhZ2UgYW5pc290cm9waWMgZmlsdGVyaW5nIGZvciBtaW5pZnlpbmcgdGV4dHVyZXMuIFRoZSBhbmlzb3Ryb3BpYyBtaW5pZmljYXRpb24gZmlsdGVyIGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBEM0RURVhGX0FOSVNPVFJPUElDIG1lbWJlciBvZiB0aGUgRDNEVEVYVFVSRUZJTFRFUlRZUEUgZW51bWVyYXRlZCB0eXBlLiAKCQkJCQkJCQkJLy8JRDNEUFRGSUxURVJDQVBTX01JTkZQWVJBTUlEQUxRVUFEIHwJLy8gRGV2aWNlIHN1cHBvcnRzIHBlci1zdGFnZSBweXJhbWlkYWwgc2FtcGxlIGZpbHRlcmluZyBmb3IgbWluaWZ5aW5nIHRleHR1cmVzLiAKCQkJCQkJCQkJLy8JRDNEUFRGSUxURVJDQVBTX01JTkZHQVVTU0lBTlFVQUQgfAkvLyBEZXZpY2Ugc3VwcG9ydHMgcGVyLXN0YWdlIEdhdXNzaWFuIHF1YWQgZmlsdGVyaW5nIGZvciBtaW5pZnlpbmcgdGV4dHVyZXMuIAoJCQkJCQkJCQkJRDNEUFRGSUxURVJDQVBTX01JUEZQT0lOVCB8CQkJLy8gRGV2aWNlIHN1cHBvcnRzIHBlci1zdGFnZSBwb2ludC1zYW1wbGUgZmlsdGVyaW5nIGZvciBtaXBtYXBzLiBUaGUgcG9pbnQtc2FtcGxlIG1pcG1hcHBpbmcgZmlsdGVyIGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBEM0RURVhGX1BPSU5UIG1lbWJlciBvZiB0aGUgRDNEVEVYVFVSRUZJTFRFUlRZUEUgZW51bWVyYXRlZCB0eXBlLiAKCQkJCQkJCQkJCUQzRFBURklMVEVSQ0FQU19NSVBGTElORUFSOwkJCS8vIERldmljZSBzdXBwb3J0cyBwZXItc3RhZ2UgYmlsaW5lYXIgaW50ZXJwb2xhdGlvbiBmaWx0ZXJpbmcgZm9yIG1pcG1hcHMuIFRoZSBiaWxpbmVhciBpbnRlcnBvbGF0aW9uIG1pcG1hcHBpbmcgZmlsdGVyIGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBEM0RURVhGX0xJTkVBUiBtZW1iZXIgb2YgdGhlIEQzRFRFWFRVUkVGSUxURVJUWVBFIGVudW1lcmF0ZWQgdHlwZS4gCgoJCWNhcHMuQ3ViZVRleHR1cmVGaWx0ZXJDYXBzID0JCUQzRFBURklMVEVSQ0FQU19NQUdGUE9JTlQgfAkJCS8vIERldmljZSBzdXBwb3J0cyBwZXItc3RhZ2UgcG9pbnQtc2FtcGxlIGZpbHRlcmluZyBmb3IgbWFnbmlmeWluZyB0ZXh0dXJlcy4gVGhlIHBvaW50LXNhbXBsZSBtYWduaWZpY2F0aW9uIGZpbHRlciBpcyByZXByZXNlbnRlZCBieSB0aGUgRDNEVEVYRl9QT0lOVCBtZW1iZXIgb2YgdGhlIEQzRFRFWFRVUkVGSUxURVJUWVBFIGVudW1lcmF0ZWQgdHlwZS4gCgkJCQkJCQkJCQkJRDNEUFRGSUxURVJDQVBTX01BR0ZMSU5FQVIgfAkJLy8gRGV2aWNlIHN1cHBvcnRzIHBlci1zdGFnZSBiaWxpbmVhciBpbnRlcnBvbGF0aW9uIGZpbHRlcmluZyBmb3IgbWFnbmlmeWluZyBtaXBtYXBzLiBUaGUgYmlsaW5lYXIgaW50ZXJwb2xhdGlvbiBtaXBtYXBwaW5nIGZpbHRlciBpcyByZXByZXNlbnRlZCBieSB0aGUgRDNEVEVYRl9MSU5FQVIgbWVtYmVyIG9mIHRoZSBEM0RURVhUVVJFRklMVEVSVFlQRSBlbnVtZXJhdGVkIHR5cGUuIAoJCQkJCQkJCQkJLy8JRDNEUFRGSUxURVJDQVBTX01BR0ZBTklTT1RST1BJQyB8CS8vIERldmljZSBzdXBwb3J0cyBwZXItc3RhZ2UgYW5pc290cm9waWMgZmlsdGVyaW5nIGZvciBtYWduaWZ5aW5nIHRleHR1cmVzLiBUaGUgYW5pc290cm9waWMgbWFnbmlmaWNhdGlvbiBmaWx0ZXIgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIEQzRFRFWEZfQU5JU09UUk9QSUMgbWVtYmVyIG9mIHRoZSBEM0RURVhUVVJFRklMVEVSVFlQRSBlbnVtZXJhdGVkIHR5cGUuIAoJCQkJCQkJCQkJLy8JRDNEUFRGSUxURVJDQVBTX01BR0ZQWVJBTUlEQUxRVUFEIHwJLy8gRGV2aWNlIHN1cHBvcnRzIHBlci1zdGFnZSBweXJhbWlkYWwgc2FtcGxlIGZpbHRlcmluZyBmb3IgbWFnbmlmeWluZyB0ZXh0dXJlcy4gVGhlIHB5cmFtaWRhbCBtYWduaWZ5aW5nIGZpbHRlciBpcyByZXByZXNlbnRlZCBieSB0aGUgRDNEVEVYRl9QWVJBTUlEQUxRVUFEIG1lbWJlciBvZiB0aGUgRDNEVEVYVFVSRUZJTFRFUlRZUEUgZW51bWVyYXRlZCB0eXBlLiAKCQkJCQkJCQkJCS8vCUQzRFBURklMVEVSQ0FQU19NQUdGR0FVU1NJQU5RVUFEIHwJLy8gRGV2aWNlIHN1cHBvcnRzIHBlci1zdGFnZSBHYXVzc2lhbiBxdWFkIGZpbHRlcmluZyBmb3IgbWFnbmlmeWluZyB0ZXh0dXJlcy4gCgkJCQkJCQkJCQkJRDNEUFRGSUxURVJDQVBTX01JTkZQT0lOVCB8CQkJLy8gRGV2aWNlIHN1cHBvcnRzIHBlci1zdGFnZSBwb2ludC1zYW1wbGUgZmlsdGVyaW5nIGZvciBtaW5pZnlpbmcgdGV4dHVyZXMuIFRoZSBwb2ludC1zYW1wbGUgbWluaWZpY2F0aW9uIGZpbHRlciBpcyByZXByZXNlbnRlZCBieSB0aGUgRDNEVEVYRl9QT0lOVCBtZW1iZXIgb2YgdGhlIEQzRFRFWFRVUkVGSUxURVJUWVBFIGVudW1lcmF0ZWQgdHlwZS4gCgkJCQkJCQkJCQkJRDNEUFRGSUxURVJDQVBTX01JTkZMSU5FQVIgfAkJLy8gRGV2aWNlIHN1cHBvcnRzIHBlci1zdGFnZSBsaW5lYXIgZmlsdGVyaW5nIGZvciBtaW5pZnlpbmcgdGV4dHVyZXMuIFRoZSBsaW5lYXIgbWluaWZpY2F0aW9uIGZpbHRlciBpcyByZXByZXNlbnRlZCBieSB0aGUgRDNEVEVYRl9MSU5FQVIgbWVtYmVyIG9mIHRoZSBEM0RURVhUVVJFRklMVEVSVFlQRSBlbnVtZXJhdGVkIHR5cGUuIAoJCQkJCQkJCQkJLy8JRDNEUFRGSUxURVJDQVBTX01JTkZBTklTT1RST1BJQyB8CS8vIERldmljZSBzdXBwb3J0cyBwZXItc3RhZ2UgYW5pc290cm9waWMgZmlsdGVyaW5nIGZvciBtaW5pZnlpbmcgdGV4dHVyZXMuIFRoZSBhbmlzb3Ryb3BpYyBtaW5pZmljYXRpb24gZmlsdGVyIGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBEM0RURVhGX0FOSVNPVFJPUElDIG1lbWJlciBvZiB0aGUgRDNEVEVYVFVSRUZJTFRFUlRZUEUgZW51bWVyYXRlZCB0eXBlLiAKCQkJCQkJCQkJCS8vCUQzRFBURklMVEVSQ0FQU19NSU5GUFlSQU1JREFMUVVBRCB8CS8vIERldmljZSBzdXBwb3J0cyBwZXItc3RhZ2UgcHlyYW1pZGFsIHNhbXBsZSBmaWx0ZXJpbmcgZm9yIG1pbmlmeWluZyB0ZXh0dXJlcy4gCgkJCQkJCQkJCQkvLwlEM0RQVEZJTFRFUkNBUFNfTUlORkdBVVNTSUFOUVVBRCB8CS8vIERldmljZSBzdXBwb3J0cyBwZXItc3RhZ2UgR2F1c3NpYW4gcXVhZCBmaWx0ZXJpbmcgZm9yIG1pbmlmeWluZyB0ZXh0dXJlcy4gCgkJCQkJCQkJCQkJRDNEUFRGSUxURVJDQVBTX01JUEZQT0lOVCB8CQkJLy8gRGV2aWNlIHN1cHBvcnRzIHBlci1zdGFnZSBwb2ludC1zYW1wbGUgZmlsdGVyaW5nIGZvciBtaXBtYXBzLiBUaGUgcG9pbnQtc2FtcGxlIG1pcG1hcHBpbmcgZmlsdGVyIGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBEM0RURVhGX1BPSU5UIG1lbWJlciBvZiB0aGUgRDNEVEVYVFVSRUZJTFRFUlRZUEUgZW51bWVyYXRlZCB0eXBlLiAKCQkJCQkJCQkJCQlEM0RQVEZJTFRFUkNBUFNfTUlQRkxJTkVBUjsJCQkvLyBEZXZpY2Ugc3VwcG9ydHMgcGVyLXN0YWdlIGJpbGluZWFyIGludGVycG9sYXRpb24gZmlsdGVyaW5nIGZvciBtaXBtYXBzLiBUaGUgYmlsaW5lYXIgaW50ZXJwb2xhdGlvbiBtaXBtYXBwaW5nIGZpbHRlciBpcyByZXByZXNlbnRlZCBieSB0aGUgRDNEVEVYRl9MSU5FQVIgbWVtYmVyIG9mIHRoZSBEM0RURVhUVVJFRklMVEVSVFlQRSBlbnVtZXJhdGVkIHR5cGUuIAoKCQljYXBzLlZvbHVtZVRleHR1cmVGaWx0ZXJDYXBzID0gCQlEM0RQVEZJTFRFUkNBUFNfTUFHRlBPSU5UIHwJCQkvLyBEZXZpY2Ugc3VwcG9ydHMgcGVyLXN0YWdlIHBvaW50LXNhbXBsZSBmaWx0ZXJpbmcgZm9yIG1hZ25pZnlpbmcgdGV4dHVyZXMuIFRoZSBwb2ludC1zYW1wbGUgbWFnbmlmaWNhdGlvbiBmaWx0ZXIgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIEQzRFRFWEZfUE9JTlQgbWVtYmVyIG9mIHRoZSBEM0RURVhUVVJFRklMVEVSVFlQRSBlbnVtZXJhdGVkIHR5cGUuIAoJCQkJCQkJCQkJCUQzRFBURklMVEVSQ0FQU19NQUdGTElORUFSIHwJCS8vIERldmljZSBzdXBwb3J0cyBwZXItc3RhZ2UgYmlsaW5lYXIgaW50ZXJwb2xhdGlvbiBmaWx0ZXJpbmcgZm9yIG1hZ25pZnlpbmcgbWlwbWFwcy4gVGhlIGJpbGluZWFyIGludGVycG9sYXRpb24gbWlwbWFwcGluZyBmaWx0ZXIgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIEQzRFRFWEZfTElORUFSIG1lbWJlciBvZiB0aGUgRDNEVEVYVFVSRUZJTFRFUlRZUEUgZW51bWVyYXRlZCB0eXBlLiAKCQkJCQkJCQkJCS8vCUQzRFBURklMVEVSQ0FQU19NQUdGQU5JU09UUk9QSUMgfAkvLyBEZXZpY2Ugc3VwcG9ydHMgcGVyLXN0YWdlIGFuaXNvdHJvcGljIGZpbHRlcmluZyBmb3IgbWFnbmlmeWluZyB0ZXh0dXJlcy4gVGhlIGFuaXNvdHJvcGljIG1hZ25pZmljYXRpb24gZmlsdGVyIGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBEM0RURVhGX0FOSVNPVFJPUElDIG1lbWJlciBvZiB0aGUgRDNEVEVYVFVSRUZJTFRFUlRZUEUgZW51bWVyYXRlZCB0eXBlLiAKCQkJCQkJCQkJCS8vCUQzRFBURklMVEVSQ0FQU19NQUdGUFlSQU1JREFMUVVBRCB8CS8vIERldmljZSBzdXBwb3J0cyBwZXItc3RhZ2UgcHlyYW1pZGFsIHNhbXBsZSBmaWx0ZXJpbmcgZm9yIG1hZ25pZnlpbmcgdGV4dHVyZXMuIFRoZSBweXJhbWlkYWwgbWFnbmlmeWluZyBmaWx0ZXIgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIEQzRFRFWEZfUFlSQU1JREFMUVVBRCBtZW1iZXIgb2YgdGhlIEQzRFRFWFRVUkVGSUxURVJUWVBFIGVudW1lcmF0ZWQgdHlwZS4gCgkJCQkJCQkJCQkvLwlEM0RQVEZJTFRFUkNBUFNfTUFHRkdBVVNTSUFOUVVBRCB8CS8vIERldmljZSBzdXBwb3J0cyBwZXItc3RhZ2UgR2F1c3NpYW4gcXVhZCBmaWx0ZXJpbmcgZm9yIG1hZ25pZnlpbmcgdGV4dHVyZXMuIAoJCQkJCQkJCQkJCUQzRFBURklMVEVSQ0FQU19NSU5GUE9JTlQgfAkJCS8vIERldmljZSBzdXBwb3J0cyBwZXItc3RhZ2UgcG9pbnQtc2FtcGxlIGZpbHRlcmluZyBmb3IgbWluaWZ5aW5nIHRleHR1cmVzLiBUaGUgcG9pbnQtc2FtcGxlIG1pbmlmaWNhdGlvbiBmaWx0ZXIgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIEQzRFRFWEZfUE9JTlQgbWVtYmVyIG9mIHRoZSBEM0RURVhUVVJFRklMVEVSVFlQRSBlbnVtZXJhdGVkIHR5cGUuIAoJCQkJCQkJCQkJCUQzRFBURklMVEVSQ0FQU19NSU5GTElORUFSIHwJCS8vIERldmljZSBzdXBwb3J0cyBwZXItc3RhZ2UgbGluZWFyIGZpbHRlcmluZyBmb3IgbWluaWZ5aW5nIHRleHR1cmVzLiBUaGUgbGluZWFyIG1pbmlmaWNhdGlvbiBmaWx0ZXIgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIEQzRFRFWEZfTElORUFSIG1lbWJlciBvZiB0aGUgRDNEVEVYVFVSRUZJTFRFUlRZUEUgZW51bWVyYXRlZCB0eXBlLiAKCQkJCQkJCQkJCS8vCUQzRFBURklMVEVSQ0FQU19NSU5GQU5JU09UUk9QSUMgfAkvLyBEZXZpY2Ugc3VwcG9ydHMgcGVyLXN0YWdlIGFuaXNvdHJvcGljIGZpbHRlcmluZyBmb3IgbWluaWZ5aW5nIHRleHR1cmVzLiBUaGUgYW5pc290cm9waWMgbWluaWZpY2F0aW9uIGZpbHRlciBpcyByZXByZXNlbnRlZCBieSB0aGUgRDNEVEVYRl9BTklTT1RST1BJQyBtZW1iZXIgb2YgdGhlIEQzRFRFWFRVUkVGSUxURVJUWVBFIGVudW1lcmF0ZWQgdHlwZS4gCgkJCQkJCQkJCQkvLwlEM0RQVEZJTFRFUkNBUFNfTUlORlBZUkFNSURBTFFVQUQgfAkvLyBEZXZpY2Ugc3VwcG9ydHMgcGVyLXN0YWdlIHB5cmFtaWRhbCBzYW1wbGUgZmlsdGVyaW5nIGZvciBtaW5pZnlpbmcgdGV4dHVyZXMuIAoJCQkJCQkJCQkJLy8JRDNEUFRGSUxURVJDQVBTX01JTkZHQVVTU0lBTlFVQUQgfAkvLyBEZXZpY2Ugc3VwcG9ydHMgcGVyLXN0YWdlIEdhdXNzaWFuIHF1YWQgZmlsdGVyaW5nIGZvciBtaW5pZnlpbmcgdGV4dHVyZXMuIAoJCQkJCQkJCQkJCUQzRFBURklMVEVSQ0FQU19NSVBGUE9JTlQgfAkJCS8vIERldmljZSBzdXBwb3J0cyBwZXItc3RhZ2UgcG9pbnQtc2FtcGxlIGZpbHRlcmluZyBmb3IgbWlwbWFwcy4gVGhlIHBvaW50LXNhbXBsZSBtaXBtYXBwaW5nIGZpbHRlciBpcyByZXByZXNlbnRlZCBieSB0aGUgRDNEVEVYRl9QT0lOVCBtZW1iZXIgb2YgdGhlIEQzRFRFWFRVUkVGSUxURVJUWVBFIGVudW1lcmF0ZWQgdHlwZS4gCgkJCQkJCQkJCQkJRDNEUFRGSUxURVJDQVBTX01JUEZMSU5FQVI7CQkJLy8gRGV2aWNlIHN1cHBvcnRzIHBlci1zdGFnZSBiaWxpbmVhciBpbnRlcnBvbGF0aW9uIGZpbHRlcmluZyBmb3IgbWlwbWFwcy4gVGhlIGJpbGluZWFyIGludGVycG9sYXRpb24gbWlwbWFwcGluZyBmaWx0ZXIgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIEQzRFRFWEZfTElORUFSIG1lbWJlciBvZiB0aGUgRDNEVEVYVFVSRUZJTFRFUlRZUEUgZW51bWVyYXRlZCB0eXBlLiAKCgkJY2Fwcy5UZXh0dXJlQWRkcmVzc0NhcHMgPQlEM0RQVEFERFJFU1NDQVBTX0JPUkRFUiB8CQkJLy8gRGV2aWNlIHN1cHBvcnRzIHNldHRpbmcgY29vcmRpbmF0ZXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAuMCwgMS4wXSB0byB0aGUgYm9yZGVyIGNvbG9yLCBhcyBzcGVjaWZpZWQgYnkgdGhlIEQzRFNBTVBfQk9SREVSQ09MT1IgdGV4dHVyZS1zdGFnZSBzdGF0ZS4gCgkJCQkJCQkJCUQzRFBUQUREUkVTU0NBUFNfQ0xBTVAgfAkJCS8vIERldmljZSBjYW4gY2xhbXAgdGV4dHVyZXMgdG8gYWRkcmVzc2VzLiAKCQkJCQkJCQkJRDNEUFRBRERSRVNTQ0FQU19JTkRFUEVOREVOVFVWIHwJLy8gRGV2aWNlIGNhbiBzZXBhcmF0ZSB0aGUgdGV4dHVyZS1hZGRyZXNzaW5nIG1vZGVzIG9mIHRoZSB1IGFuZCB2IGNvb3JkaW5hdGVzIG9mIHRoZSB0ZXh0dXJlLiBUaGlzIGFiaWxpdHkgY29ycmVzcG9uZHMgdG8gdGhlIEQzRFNBTVBfQUREUkVTU1UgYW5kIEQzRFNBTVBfQUREUkVTU1YgcmVuZGVyLXN0YXRlIHZhbHVlcy4gCgkJCQkJCQkJCUQzRFBUQUREUkVTU0NBUFNfTUlSUk9SIHwJCQkvLyBEZXZpY2UgY2FuIG1pcnJvciB0ZXh0dXJlcyB0byBhZGRyZXNzZXMuIAoJCQkJCQkJCQlEM0RQVEFERFJFU1NDQVBTX01JUlJPUk9OQ0UgfAkJLy8gRGV2aWNlIGNhbiB0YWtlIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB0aGUgdGV4dHVyZSBjb29yZGluYXRlICh0aHVzLCBtaXJyb3JpbmcgYXJvdW5kIDApIGFuZCB0aGVuIGNsYW1wIHRvIHRoZSBtYXhpbXVtIHZhbHVlLiAKCQkJCQkJCQkJRDNEUFRBRERSRVNTQ0FQU19XUkFQOwkJCQkvLyBEZXZpY2UgY2FuIHdyYXAgdGV4dHVyZXMgdG8gYWRkcmVzc2VzLgoKCQljYXBzLlZvbHVtZVRleHR1cmVBZGRyZXNzQ2FwcyA9CUQzRFBUQUREUkVTU0NBUFNfQk9SREVSIHwJCQkvLyBEZXZpY2Ugc3VwcG9ydHMgc2V0dGluZyBjb29yZGluYXRlcyBvdXRzaWRlIHRoZSByYW5nZSBbMC4wLCAxLjBdIHRvIHRoZSBib3JkZXIgY29sb3IsIGFzIHNwZWNpZmllZCBieSB0aGUgRDNEU0FNUF9CT1JERVJDT0xPUiB0ZXh0dXJlLXN0YWdlIHN0YXRlLiAKCQkJCQkJCQkJCUQzRFBUQUREUkVTU0NBUFNfQ0xBTVAgfAkJCS8vIERldmljZSBjYW4gY2xhbXAgdGV4dHVyZXMgdG8gYWRkcmVzc2VzLiAKCQkJCQkJCQkJCUQzRFBUQUREUkVTU0NBUFNfSU5ERVBFTkRFTlRVViB8CS8vIERldmljZSBjYW4gc2VwYXJhdGUgdGhlIHRleHR1cmUtYWRkcmVzc2luZyBtb2RlcyBvZiB0aGUgdSBhbmQgdiBjb29yZGluYXRlcyBvZiB0aGUgdGV4dHVyZS4gVGhpcyBhYmlsaXR5IGNvcnJlc3BvbmRzIHRvIHRoZSBEM0RTQU1QX0FERFJFU1NVIGFuZCBEM0RTQU1QX0FERFJFU1NWIHJlbmRlci1zdGF0ZSB2YWx1ZXMuIAoJCQkJCQkJCQkJRDNEUFRBRERSRVNTQ0FQU19NSVJST1IgfAkJCS8vIERldmljZSBjYW4gbWlycm9yIHRleHR1cmVzIHRvIGFkZHJlc3Nlcy4gCgkJCQkJCQkJCQlEM0RQVEFERFJFU1NDQVBTX01JUlJPUk9OQ0UgfAkJLy8gRGV2aWNlIGNhbiB0YWtlIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB0aGUgdGV4dHVyZSBjb29yZGluYXRlICh0aHVzLCBtaXJyb3JpbmcgYXJvdW5kIDApIGFuZCB0aGVuIGNsYW1wIHRvIHRoZSBtYXhpbXVtIHZhbHVlLiAKCQkJCQkJCQkJCUQzRFBUQUREUkVTU0NBUFNfV1JBUDsJCQkJLy8gRGV2aWNlIGNhbiB3cmFwIHRleHR1cmVzIHRvIGFkZHJlc3Nlcy4KCgkJY2Fwcy5MaW5lQ2FwcyA9CQlEM0RMSU5FQ0FQU19BTFBIQUNNUCB8CS8vIFN1cHBvcnRzIGFscGhhLXRlc3QgY29tcGFyaXNvbnMuIAoJCQkJCQkvLwlEM0RMSU5FQ0FQU19BTlRJQUxJQVMgfCAvLyBBbnRpYWxpYXNlZCBsaW5lcyBhcmUgc3VwcG9ydGVkLgoJCQkJCQkJRDNETElORUNBUFNfQkxFTkQgfAkJLy8gU3VwcG9ydHMgc291cmNlLWJsZW5kaW5nLiAKCQkJCQkJCUQzRExJTkVDQVBTX0ZPRyB8CQkvLyBTdXBwb3J0cyBmb2cuIAoJCQkJCQkJRDNETElORUNBUFNfVEVYVFVSRSB8CS8vIFN1cHBvcnRzIHRleHR1cmUtbWFwcGluZy4gCgkJCQkJCQlEM0RMSU5FQ0FQU19aVEVTVDsJCS8vIFN1cHBvcnRzIHotYnVmZmVyIGNvbXBhcmlzb25zLgoJCQoJCWNhcHMuTWF4VGV4dHVyZVdpZHRoID0gMSA8PCAoTUlQTUFQX0xFVkVMUyAtIDEpOwoJCWNhcHMuTWF4VGV4dHVyZUhlaWdodCA9IDEgPDwgKE1JUE1BUF9MRVZFTFMgLSAxKTsKCQljYXBzLk1heFZvbHVtZUV4dGVudCA9IDEgPDwgKE1JUE1BUF9MRVZFTFMgLSAxKTsKCQljYXBzLk1heFRleHR1cmVSZXBlYXQgPSA4MTkyOwoJCWNhcHMuTWF4VGV4dHVyZUFzcGVjdFJhdGlvID0gMSA8PCAoTUlQTUFQX0xFVkVMUyAtIDEpOwoJCWNhcHMuTWF4QW5pc290cm9weSA9IG1heEFuaXNvdHJvcHk7CgkJY2Fwcy5NYXhWZXJ0ZXhXID0gMWUrMDEwOwoKCQljYXBzLkd1YXJkQmFuZExlZnQgPSAtMWUrMDA4OwoJCWNhcHMuR3VhcmRCYW5kVG9wID0gLTFlKzAwODsKCQljYXBzLkd1YXJkQmFuZFJpZ2h0ID0gMWUrMDA4OwoJCWNhcHMuR3VhcmRCYW5kQm90dG9tID0gMWUrMDA4OwoKCQljYXBzLkV4dGVudHNBZGp1c3QgPSAwOwoKCQljYXBzLlN0ZW5jaWxDYXBzID0JCUQzRFNURU5DSUxDQVBTX0tFRVAgfAkJLy8gRG8gbm90IHVwZGF0ZSB0aGUgZW50cnkgaW4gdGhlIHN0ZW5jaWwgYnVmZmVyLiBUaGlzIGlzIHRoZSBkZWZhdWx0IHZhbHVlLiAKCQkJCQkJCQlEM0RTVEVOQ0lMQ0FQU19aRVJPIHwJCS8vIFNldCB0aGUgc3RlbmNpbC1idWZmZXIgZW50cnkgdG8gMC4gCgkJCQkJCQkJRDNEU1RFTkNJTENBUFNfUkVQTEFDRSB8CS8vIFJlcGxhY2UgdGhlIHN0ZW5jaWwtYnVmZmVyIGVudHJ5IHdpdGggcmVmZXJlbmNlIHZhbHVlLiAKCQkJCQkJCQlEM0RTVEVOQ0lMQ0FQU19JTkNSU0FUIHwJLy8gSW5jcmVtZW50IHRoZSBzdGVuY2lsLWJ1ZmZlciBlbnRyeSwgY2xhbXBpbmcgdG8gdGhlIG1heGltdW0gdmFsdWUuICAKCQkJCQkJCQlEM0RTVEVOQ0lMQ0FQU19ERUNSU0FUIHwJLy8gRGVjcmVtZW50IHRoZSBzdGVuY2lsLWJ1ZmZlciBlbnRyeSwgY2xhbXBpbmcgdG8gemVyby4gCgkJCQkJCQkJRDNEU1RFTkNJTENBUFNfSU5WRVJUIHwJCS8vIEludmVydCB0aGUgYml0cyBpbiB0aGUgc3RlbmNpbC1idWZmZXIgZW50cnkuIAoJCQkJCQkJCUQzRFNURU5DSUxDQVBTX0lOQ1IgfAkJLy8gSW5jcmVtZW50IHRoZSBzdGVuY2lsLWJ1ZmZlciBlbnRyeSwgd3JhcHBpbmcgdG8gemVybyBpZiB0aGUgbmV3IHZhbHVlIGV4Y2VlZHMgdGhlIG1heGltdW0gdmFsdWUuICAKCQkJCQkJCQlEM0RTVEVOQ0lMQ0FQU19ERUNSIHwJCS8vIERlY3JlbWVudCB0aGUgc3RlbmNpbC1idWZmZXIgZW50cnksIHdyYXBwaW5nIHRvIHRoZSBtYXhpbXVtIHZhbHVlIGlmIHRoZSBuZXcgdmFsdWUgaXMgbGVzcyB0aGFuIHplcm8uIAoJCQkJCQkJCUQzRFNURU5DSUxDQVBTX1RXT1NJREVEOwkvLyBUaGUgZGV2aWNlIHN1cHBvcnRzIHR3by1zaWRlZCBzdGVuY2lsLiAKCgkJY2Fwcy5GVkZDYXBzID0JCUQzREZWRkNBUFNfRE9OT1RTVFJJUEVMRU1FTlRTIHwJCS8vIEl0IGlzIHByZWZlcmFibGUgdGhhdCB2ZXJ0ZXggZWxlbWVudHMgbm90IGJlIHN0cmlwcGVkLiBUaGF0IGlzLCBpZiB0aGUgdmVydGV4IGZvcm1hdCBjb250YWlucyBlbGVtZW50cyB0aGF0IGFyZSBub3QgdXNlZCB3aXRoIHRoZSBjdXJyZW50IHJlbmRlciBzdGF0ZXMsIHRoZXJlIGlzIG5vIG5lZWQgdG8gcmVnZW5lcmF0ZSB0aGUgdmVydGljZXMuIElmIHRoaXMgY2FwYWJpbGl0eSBmbGFnIGlzIG5vdCBwcmVzZW50LCBzdHJpcHBpbmcgZXh0cmFuZW91cyBlbGVtZW50cyBmcm9tIHRoZSB2ZXJ0ZXggZm9ybWF0IHByb3ZpZGVzIGJldHRlciBwZXJmb3JtYW5jZS4gCgkJCQkJCQlEM0RGVkZDQVBTX1BTSVpFIHwJCQkJCS8vIFBvaW50IHNpemUgaXMgZGV0ZXJtaW5lZCBieSBlaXRoZXIgdGhlIHJlbmRlciBzdGF0ZSBvciB0aGUgdmVydGV4IGRhdGEuCgkJCQkJCS8vCUQzREZWRkNBUFNfVEVYQ09PUkRDT1VOVE1BU0sgfAkJLy8gTWFza3MgdGhlIGxvdyBXT1JEIG9mIEZWRkNhcHMuIFRoZXNlIGJpdHMsIGNhc3QgdG8gdGhlIFdPUkQgZGF0YSB0eXBlLCBkZXNjcmliZSB0aGUgdG90YWwgbnVtYmVyIG9mIHRleHR1cmUgY29vcmRpbmF0ZSBzZXRzIHRoYXQgdGhlIGRldmljZSBjYW4gc2ltdWx0YW5lb3VzbHkgdXNlIGZvciBtdWx0aXBsZSB0ZXh0dXJlIGJsZW5kaW5nLiAoWW91IGNhbiB1c2UgdXAgdG8gZWlnaHQgdGV4dHVyZSBjb29yZGluYXRlIHNldHMgZm9yIGFueSB2ZXJ0ZXgsIGJ1dCB0aGUgZGV2aWNlIGNhbiBibGVuZCB1c2luZyBvbmx5IHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIHRleHR1cmUgY29vcmRpbmF0ZSBzZXRzLikgCgkJCQkJCQk4OwoKCQljYXBzLlRleHR1cmVPcENhcHMgPQlEM0RURVhPUENBUFNfQUREIHwJCQkJCQkJLy8gVGhlIEQzRFRPUF9BREQgdGV4dHVyZS1ibGVuZGluZyBvcGVyYXRpb24gaXMgc3VwcG9ydGVkLiAKCQkJCQkJCQlEM0RURVhPUENBUFNfQUREU0lHTkVEIHwJCQkJCS8vIFRoZSBEM0RUT1BfQUREU0lHTkVEIHRleHR1cmUtYmxlbmRpbmcgb3BlcmF0aW9uIGlzIHN1cHBvcnRlZC4gCgkJCQkJCQkJRDNEVEVYT1BDQVBTX0FERFNJR05FRDJYIHwJCQkJCS8vIFRoZSBEM0RUT1BfQUREU0lHTkVEMlggdGV4dHVyZS1ibGVuZGluZyBvcGVyYXRpb24gaXMgc3VwcG9ydGVkLiAKCQkJCQkJCQlEM0RURVhPUENBUFNfQUREU01PT1RIIHwJCQkJCS8vIFRoZSBEM0RUT1BfQUREU01PT1RIIHRleHR1cmUtYmxlbmRpbmcgb3BlcmF0aW9uIGlzIHN1cHBvcnRlZC4gCgkJCQkJCQkJRDNEVEVYT1BDQVBTX0JMRU5EQ1VSUkVOVEFMUEhBIHwJCQkvLyBUaGUgRDNEVE9QX0JMRU5EQ1VSUkVOVEFMUEhBIHRleHR1cmUtYmxlbmRpbmcgb3BlcmF0aW9uIGlzIHN1cHBvcnRlZC4gCgkJCQkJCQkJRDNEVEVYT1BDQVBTX0JMRU5ERElGRlVTRUFMUEhBIHwJCQkvLyBUaGUgRDNEVE9QX0JMRU5ERElGRlVTRUFMUEhBIHRleHR1cmUtYmxlbmRpbmcgb3BlcmF0aW9uIGlzIHN1cHBvcnRlZC4gCgkJCQkJCQkJRDNEVEVYT1BDQVBTX0JMRU5ERkFDVE9SQUxQSEEgfAkJCQkvLyBUaGUgRDNEVE9QX0JMRU5ERkFDVE9SQUxQSEEgdGV4dHVyZS1ibGVuZGluZyBvcGVyYXRpb24gaXMgc3VwcG9ydGVkLiAKCQkJCQkJCQlEM0RURVhPUENBUFNfQkxFTkRURVhUVVJFQUxQSEEgfAkJCS8vIFRoZSBEM0RUT1BfQkxFTkRURVhUVVJFQUxQSEEgdGV4dHVyZS1ibGVuZGluZyBvcGVyYXRpb24gaXMgc3VwcG9ydGVkLiAKCQkJCQkJCQlEM0RURVhPUENBUFNfQkxFTkRURVhUVVJFQUxQSEFQTSB8CQkJLy8gVGhlIEQzRFRPUF9CTEVORFRFWFRVUkVBTFBIQVBNIHRleHR1cmUtYmxlbmRpbmcgb3BlcmF0aW9uIGlzIHN1cHBvcnRlZC4gCgkJCQkJCQkJRDNEVEVYT1BDQVBTX0JVTVBFTlZNQVAgfAkJCQkJLy8gVGhlIEQzRFRPUF9CVU1QRU5WTUFQIHRleHR1cmUtYmxlbmRpbmcgb3BlcmF0aW9uIGlzIHN1cHBvcnRlZC4gCgkJCQkJCQkJRDNEVEVYT1BDQVBTX0JVTVBFTlZNQVBMVU1JTkFOQ0UgfAkJCS8vIFRoZSBEM0RUT1BfQlVNUEVOVk1BUExVTUlOQU5DRSB0ZXh0dXJlLWJsZW5kaW5nIG9wZXJhdGlvbiBpcyBzdXBwb3J0ZWQuIAoJCQkJCQkJCUQzRFRFWE9QQ0FQU19ESVNBQkxFIHwJCQkJCQkvLyBUaGUgRDNEVE9QX0RJU0FCTEUgdGV4dHVyZS1ibGVuZGluZyBvcGVyYXRpb24gaXMgc3VwcG9ydGVkLiAKCQkJCQkJCQlEM0RURVhPUENBUFNfRE9UUFJPRFVDVDMgfAkJCQkJLy8gVGhlIEQzRFRPUF9ET1RQUk9EVUNUMyB0ZXh0dXJlLWJsZW5kaW5nIG9wZXJhdGlvbiBpcyBzdXBwb3J0ZWQuIAoJCQkJCQkJCUQzRFRFWE9QQ0FQU19MRVJQIHwJCQkJCQkJLy8gVGhlIEQzRFRPUF9MRVJQIHRleHR1cmUtYmxlbmRpbmcgb3BlcmF0aW9uIGlzIHN1cHBvcnRlZC4gCgkJCQkJCQkJRDNEVEVYT1BDQVBTX01PRFVMQVRFIHwJCQkJCQkvLyBUaGUgRDNEVE9QX01PRFVMQVRFIHRleHR1cmUtYmxlbmRpbmcgb3BlcmF0aW9uIGlzIHN1cHBvcnRlZC4gCgkJCQkJCQkJRDNEVEVYT1BDQVBTX01PRFVMQVRFMlggfAkJCQkJLy8gVGhlIEQzRFRPUF9NT0RVTEFURTJYIHRleHR1cmUtYmxlbmRpbmcgb3BlcmF0aW9uIGlzIHN1cHBvcnRlZC4gCgkJCQkJCQkJRDNEVEVYT1BDQVBTX01PRFVMQVRFNFggfAkJCQkJLy8gVGhlIEQzRFRPUF9NT0RVTEFURTRYIHRleHR1cmUtYmxlbmRpbmcgb3BlcmF0aW9uIGlzIHN1cHBvcnRlZC4gCgkJCQkJCQkJRDNEVEVYT1BDQVBTX01PRFVMQVRFQUxQSEFfQUREQ09MT1IgfAkJLy8gVGhlIEQzRFRPUF9NT0RVTEFURUFMUEhBX0FERENPTE9SIHRleHR1cmUtYmxlbmRpbmcgb3BlcmF0aW9uIGlzIHN1cHBvcnRlZC4gCgkJCQkJCQkJRDNEVEVYT1BDQVBTX01PRFVMQVRFQ09MT1JfQUREQUxQSEEgfAkJLy8gVGhlIEQzRFRPUF9NT0RVTEFURUNPTE9SX0FEREFMUEhBIHRleHR1cmUtYmxlbmRpbmcgb3BlcmF0aW9uIGlzIHN1cHBvcnRlZC4gCgkJCQkJCQkJRDNEVEVYT1BDQVBTX01PRFVMQVRFSU5WQUxQSEFfQUREQ09MT1IgfAkvLyBUaGUgRDNEVE9QX01PRFVMQVRFSU5WQUxQSEFfQUREQ09MT1IgdGV4dHVyZS1ibGVuZGluZyBvcGVyYXRpb24gaXMgc3VwcG9ydGVkLiAKCQkJCQkJCQlEM0RURVhPUENBUFNfTU9EVUxBVEVJTlZDT0xPUl9BRERBTFBIQSB8CS8vIFRoZSBEM0RUT1BfTU9EVUxBVEVJTlZDT0xPUl9BRERBTFBIQSB0ZXh0dXJlLWJsZW5kaW5nIG9wZXJhdGlvbiBpcyBzdXBwb3J0ZWQuIAoJCQkJCQkJCUQzRFRFWE9QQ0FQU19NVUxUSVBMWUFERCB8CQkJCQkvLyBUaGUgRDNEVE9QX01VTFRJUExZQUREIHRleHR1cmUtYmxlbmRpbmcgb3BlcmF0aW9uIGlzIHN1cHBvcnRlZC4gCgkJCQkJCQkJRDNEVEVYT1BDQVBTX1BSRU1PRFVMQVRFIHwJCQkJCS8vIFRoZSBEM0RUT1BfUFJFTU9EVUxBVEUgdGV4dHVyZS1ibGVuZGluZyBvcGVyYXRpb24gaXMgc3VwcG9ydGVkLiAKCQkJCQkJCQlEM0RURVhPUENBUFNfU0VMRUNUQVJHMSB8CQkJCQkvLyBUaGUgRDNEVE9QX1NFTEVDVEFSRzEgdGV4dHVyZS1ibGVuZGluZyBvcGVyYXRpb24gaXMgc3VwcG9ydGVkLiAKCQkJCQkJCQlEM0RURVhPUENBUFNfU0VMRUNUQVJHMiB8CQkJCQkvLyBUaGUgRDNEVE9QX1NFTEVDVEFSRzIgdGV4dHVyZS1ibGVuZGluZyBvcGVyYXRpb24gaXMgc3VwcG9ydGVkLiAKCQkJCQkJCQlEM0RURVhPUENBUFNfU1VCVFJBQ1Q7CQkJCQkJLy8gVGhlIEQzRFRPUF9TVUJUUkFDVCB0ZXh0dXJlLWJsZW5kaW5nIG9wZXJhdGlvbiBpcyBzdXBwb3J0ZWQuIAoKCQljYXBzLk1heFRleHR1cmVCbGVuZFN0YWdlcyA9IDg7CgkJY2Fwcy5NYXhTaW11bHRhbmVvdXNUZXh0dXJlcyA9IDg7CgoJCWNhcHMuVmVydGV4UHJvY2Vzc2luZ0NhcHMgPQkJRDNEVlRYUENBUFNfRElSRUNUSU9OQUxMSUdIVFMgfAkJCS8vIERldmljZSBjYW4gZG8gZGlyZWN0aW9uYWwgbGlnaHRzLiAKCQkJCQkJCQkJCUQzRFZUWFBDQVBTX0xPQ0FMVklFV0VSIHwJCQkJLy8gRGV2aWNlIGNhbiBkbyBsb2NhbCB2aWV3ZXIuIAoJCQkJCQkJCQkJRDNEVlRYUENBUFNfTUFURVJJQUxTT1VSQ0U3CXwJCQkvLyBEZXZpY2UgY2FuIGRvIE1pY3Jvc29mdK4gRGlyZWN0WK4gNy4wIGNvbG9ybWF0ZXJpYWxzb3VyY2Ugb3BlcmF0aW9ucy4gCgkJCQkJCQkJCS8vCUQzRFZUWFBDQVBTX05PX1RFWEdFTl9OT05MT0NBTFZJRVdFUiB8CS8vIERldmljZSBkb2VzIG5vdCBzdXBwb3J0IHRleHR1cmUgZ2VuZXJhdGlvbiBpbiBub24tbG9jYWwgdmlld2VyIG1vZGUuIAoJCQkJCQkJCQkJRDNEVlRYUENBUFNfUE9TSVRJT05BTExJR0hUUyB8CQkJLy8gRGV2aWNlIGNhbiBkbyBwb3NpdGlvbmFsIGxpZ2h0cyAoaW5jbHVkZXMgcG9pbnQgYW5kIHNwb3QpLiAKCQkJCQkJCQkJCUQzRFZUWFBDQVBTX1RFWEdFTiB8CQkJCQkvLyBEZXZpY2UgY2FuIGRvIHRleGdlbi4gCgkJCQkJCQkJCQlEM0RWVFhQQ0FQU19URVhHRU5fU1BIRVJFTUFQOwkJCS8vIERldmljZSBzdXBwb3J0cyBEM0RUU1NfVENJX1NQSEVSRU1BUC4gCgkJCQkJCQkJCS8vCUQzRFZUWFBDQVBTX1RXRUVOSU5HOwkJCQkJLy8gRGV2aWNlIGNhbiBkbyB2ZXJ0ZXggdHdlZW5pbmcuIAoKCQljYXBzLk1heEFjdGl2ZUxpZ2h0cyA9IDg7CQkJCQkJLy8gTWF4aW11bSBudW1iZXIgb2YgbGlnaHRzIHRoYXQgY2FuIGJlIGFjdGl2ZSBzaW11bHRhbmVvdXNseS4gRm9yIGEgZ2l2ZW4gcGh5c2ljYWwgZGV2aWNlLCB0aGlzIGNhcGFiaWxpdHkgbWlnaHQgdmFyeSBhY3Jvc3MgRGlyZWN0M0REZXZpY2Ugb2JqZWN0cyBkZXBlbmRpbmcgb24gdGhlIHBhcmFtZXRlcnMgc3VwcGxpZWQgdG8gSURpcmVjdDNEOTo6Q3JlYXRlRGV2aWNlLgoJCWNhcHMuTWF4VXNlckNsaXBQbGFuZXMgPSA2OwkJCQkJCS8vIE1heGltdW0gbnVtYmVyIG9mIHVzZXItZGVmaW5lZCBjbGlwcGluZyBwbGFuZXMgc3VwcG9ydGVkLiBUaGlzIG1lbWJlciBjYW4gcmFuZ2UgZnJvbSAwIHRocm91Z2ggRDNETUFYVVNFUkNMSVBQTEFORVMuIEZvciBhIGdpdmVuIHBoeXNpY2FsIGRldmljZSwgdGhpcyBjYXBhYmlsaXR5IG1heSB2YXJ5IGFjcm9zcyBEaXJlY3QzRERldmljZSBvYmplY3RzIGRlcGVuZGluZyBvbiB0aGUgcGFyYW1ldGVycyBzdXBwbGllZCB0byBJRGlyZWN0M0Q5OjpDcmVhdGVEZXZpY2UuIAoJCWNhcHMuTWF4VmVydGV4QmxlbmRNYXRyaWNlcyA9IDQ7CQkJCS8vIE1heGltdW0gbnVtYmVyIG9mIG1hdHJpY2VzIHRoYXQgdGhpcyBkZXZpY2UgY2FuIGFwcGx5IHdoZW4gcGVyZm9ybWluZyBtdWx0aW1hdHJpeCB2ZXJ0ZXggYmxlbmRpbmcuIEZvciBhIGdpdmVuIHBoeXNpY2FsIGRldmljZSwgdGhpcyBjYXBhYmlsaXR5IG1heSB2YXJ5IGFjcm9zcyBEaXJlY3QzRERldmljZSBvYmplY3RzIGRlcGVuZGluZyBvbiB0aGUgcGFyYW1ldGVycyBzdXBwbGllZCB0byBJRGlyZWN0M0Q5OjpDcmVhdGVEZXZpY2UuIAoJCWNhcHMuTWF4VmVydGV4QmxlbmRNYXRyaXhJbmRleCA9IDExOwkJCS8vIERXT1JEIHZhbHVlIHRoYXQgc3BlY2lmaWVzIHRoZSBtYXhpbXVtIG1hdHJpeCBpbmRleCB0aGF0IGNhbiBiZSBpbmRleGVkIGludG8gdXNpbmcgdGhlIHBlci12ZXJ0ZXggaW5kaWNlcy4gVGhlIG51bWJlciBvZiBtYXRyaWNlcyBpcyBNYXhWZXJ0ZXhCbGVuZE1hdHJpeEluZGV4ICsgMSwgd2hpY2ggaXMgdGhlIHNpemUgb2YgdGhlIG1hdHJpeCBwYWxldHRlLiBJZiBub3JtYWxzIGFyZSBwcmVzZW50IGluIHRoZSB2ZXJ0ZXggZGF0YSB0aGF0IG5lZWRzIHRvIGJlIGJsZW5kZWQgZm9yIGxpZ2h0aW5nLCB0aGVuIHRoZSBudW1iZXIgb2YgbWF0cmljZXMgaXMgaGFsZiB0aGUgbnVtYmVyIHNwZWNpZmllZCBieSB0aGlzIGNhcGFiaWxpdHkgZmxhZy4gSWYgTWF4VmVydGV4QmxlbmRNYXRyaXhJbmRleCBpcyBzZXQgdG8gemVybywgdGhlIGRyaXZlciBkb2VzIG5vdCBzdXBwb3J0IGluZGV4ZWQgdmVydGV4IGJsZW5kaW5nLiBJZiB0aGlzIHZhbHVlIGlzIG5vdCB6ZXJvIHRoZW4gdGhlIHZhbGlkIHJhbmdlIG9mIGluZGljZXMgaXMgemVybyB0aHJvdWdoIE1heFZlcnRleEJsZW5kTWF0cml4SW5kZXguCgkJY2Fwcy5NYXhQb2ludFNpemUgPSA4MTkyLjBmOwkJCQkJLy8gTWF4aW11bSBzaXplIG9mIGEgcG9pbnQgcHJpbWl0aXZlLiBJZiBzZXQgdG8gMS4wZiB0aGVuIGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IHBvaW50IHNpemUgY29udHJvbC4gVGhlIHJhbmdlIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAxLjBmLgoJCWNhcHMuTWF4UHJpbWl0aXZlQ291bnQgPSAxIDw8IDIxOwkJCQkvLyBNYXhpbXVtIG51bWJlciBvZiBwcmltaXRpdmVzIGZvciBlYWNoIElEaXJlY3QzRERldmljZTk6OkRyYXdQcmltaXRpdmUgY2FsbC4gTm90ZSB0aGF0IHdoZW4gRGlyZWN0M0QgaXMgd29ya2luZyB3aXRoIGEgRGlyZWN0WCA2LjAgb3IgRGlyZWN0WCA3LjAgZHJpdmVyLCB0aGlzIGZpZWxkIGlzIHNldCB0byAweEZGRkYuIFRoaXMgbWVhbnMgdGhhdCBub3Qgb25seSB0aGUgbnVtYmVyIG9mIHByaW1pdGl2ZXMgYnV0IGFsc28gdGhlIG51bWJlciBvZiB2ZXJ0aWNlcyBpcyBsaW1pdGVkIGJ5IHRoaXMgdmFsdWUuCgkJY2Fwcy5NYXhWZXJ0ZXhJbmRleCA9IDEgPDwgMjQ7CQkJCQkvLyBNYXhpbXVtIHNpemUgb2YgaW5kaWNlcyBzdXBwb3J0ZWQgZm9yIGhhcmR3YXJlIHZlcnRleCBwcm9jZXNzaW5nLiBJdCBpcyBwb3NzaWJsZSB0byBjcmVhdGUgMzItYml0IGluZGV4IGJ1ZmZlcnMgYnkgc3BlY2lmeWluZyBEM0RGTVRfSU5ERVgzMjsgaG93ZXZlciwgeW91IHdpbGwgbm90IGJlIGFibGUgdG8gcmVuZGVyIHdpdGggdGhlIGluZGV4IGJ1ZmZlciB1bmxlc3MgdGhpcyB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gMHgwMDAwRkZGRi4KCQljYXBzLk1heFN0cmVhbXMgPSAxNjsJCQkJCQkJLy8gTWF4aW11bSBudW1iZXIgb2YgY29uY3VycmVudCBkYXRhIHN0cmVhbXMgZm9yIElEaXJlY3QzRERldmljZTk6OlNldFN0cmVhbVNvdXJjZS4gVGhlIHZhbGlkIHJhbmdlIGlzIDEgdG8gMTYuIE5vdGUgdGhhdCBpZiB0aGlzIHZhbHVlIGlzIDAsIHRoZW4gdGhlIGRyaXZlciBpcyBub3QgYSBEaXJlY3RYIDkuMCBkcml2ZXIuCgkJY2Fwcy5NYXhTdHJlYW1TdHJpZGUgPSA2NTUzNjsJCQkJCS8vIE1heGltdW0gc3RyaWRlIGZvciBJRGlyZWN0M0REZXZpY2U5OjpTZXRTdHJlYW1Tb3VyY2UuCgkJY2Fwcy5WZXJ0ZXhTaGFkZXJWZXJzaW9uID0gdmVydGV4U2hhZGVyVmVyc2lvbjsJLy8gVHdvIG51bWJlcnMgdGhhdCByZXByZXNlbnQgdGhlIHZlcnRleCBzaGFkZXIgbWFpbiBhbmQgc3ViIHZlcnNpb25zLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgaW5zdHJ1Y3Rpb25zIHN1cHBvcnRlZCBmb3IgZWFjaCB2ZXJ0ZXggc2hhZGVyIHZlcnNpb24sIHNlZSBWZXJzaW9uIDFfeCwgVmVyc2lvbiAyXzAsIFZlcnNpb24gMl8wIEV4dGVuZGVkLCBvciBWZXJzaW9uIDNfMC4KCQljYXBzLk1heFZlcnRleFNoYWRlckNvbnN0ID0gMjU2OwkJCQkvLyBUaGUgbnVtYmVyIG9mIHZlcnRleCBzaGFkZXIgUmVnaXN0ZXJzIHRoYXQgYXJlIHJlc2VydmVkIGZvciBjb25zdGFudHMuCgkJY2Fwcy5QaXhlbFNoYWRlclZlcnNpb24gPSBwaXhlbFNoYWRlclZlcnNpb247CS8vIFR3byBudW1iZXJzIHRoYXQgcmVwcmVzZW50IHRoZSBwaXhlbCBzaGFkZXIgbWFpbiBhbmQgc3ViIHZlcnNpb25zLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgaW5zdHJ1Y3Rpb25zIHN1cHBvcnRlZCBmb3IgZWFjaCBwaXhlbCBzaGFkZXIgdmVyc2lvbiwgc2VlIFZlcnNpb24gMV94LCBWZXJzaW9uIDJfMCwgVmVyc2lvbiAyXzAgRXh0ZW5kZWQsIG9yIFZlcnNpb24gM18wLgoJCWNhcHMuUGl4ZWxTaGFkZXIxeE1heFZhbHVlID0gOC4wOwkJCQkvLyBNYXhpbXVtIHZhbHVlIG9mIHBpeGVsIHNoYWRlciBhcml0aG1ldGljIGNvbXBvbmVudC4gVGhpcyB2YWx1ZSBpbmRpY2F0ZXMgdGhlIGludGVybmFsIHJhbmdlIG9mIHZhbHVlcyBzdXBwb3J0ZWQgZm9yIHBpeGVsIGNvbG9yIGJsZW5kaW5nIG9wZXJhdGlvbnMuIFdpdGhpbiB0aGUgcmFuZ2UgdGhhdCB0aGV5IHJlcG9ydCB0bywgaW1wbGVtZW50YXRpb25zIG11c3QgYWxsb3cgZGF0YSB0byBwYXNzIHRocm91Z2ggcGl4ZWwgcHJvY2Vzc2luZyB1bm1vZGlmaWVkICh1bmNsYW1wZWQpLiBOb3JtYWxseSwgdGhlIHZhbHVlIG9mIHRoaXMgbWVtYmVyIGlzIGFuIGFic29sdXRlIHZhbHVlLiBGb3IgZXhhbXBsZSwgYSAxLjAgaW5kaWNhdGVzIHRoYXQgdGhlIHJhbmdlIGlzIC0xLjAgdG8gMSwgYW5kIGFuIDguMCBpbmRpY2F0ZXMgdGhhdCB0aGUgcmFuZ2UgaXMgLTguMCB0byA4LjAuIFRoZSB2YWx1ZSBtdXN0IGJlID49IDEuMCBmb3IgYW55IGhhcmR3YXJlIHRoYXQgc3VwcG9ydHMgcGl4ZWwgc2hhZGVycy4KCQkKCQljYXBzLkRldkNhcHMyID0gLy8JRDNEREVWQ0FQUzJfQURBUFRJVkVURVNTUlRQQVRDSCB8CQkJCS8vIERldmljZSBzdXBwb3J0cyBhZGFwdGl2ZSB0ZXNzZWxsYXRpb24gb2YgUlQtcGF0Y2hlcyAKCQkJCQkJLy8JRDNEREVWQ0FQUzJfQURBUFRJVkVURVNTTlBBVENIIHwJCQkJLy8gRGV2aWNlIHN1cHBvcnRzIGFkYXB0aXZlIHRlc3NlbGxhdGlvbiBvZiBOLXBhdGNoZXMuIAoJCQkJCQkJRDNEREVWQ0FQUzJfQ0FOX1NUUkVUQ0hSRUNUX0ZST01fVEVYVFVSRVMgfAkJLy8gRGV2aWNlIHN1cHBvcnRzIElEaXJlY3QzRERldmljZTk6OlN0cmV0Y2hSZWN0IHVzaW5nIGEgdGV4dHVyZSBhcyB0aGUgc291cmNlLiAKCQkJCQkJLy8JRDNEREVWQ0FQUzJfRE1BUE5QQVRDSCB8CQkJCQkJLy8gRGV2aWNlIHN1cHBvcnRzIGRpc3BsYWNlbWVudCBtYXBzIGZvciBOLXBhdGNoZXMuIAoJCQkJCQkvLwlEM0RERVZDQVBTMl9QUkVTQU1QTEVERE1BUE5QQVRDSCB8CQkJCS8vIERldmljZSBzdXBwb3J0cyBwcmVzYW1wbGVkIGRpc3BsYWNlbWVudCBtYXBzIGZvciBOLXBhdGNoZXMuIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGRpc3BsYWNlbWVudCBtYXBwaW5nLCBzZWUgRGlzcGxhY2VtZW50IE1hcHBpbmcuIAoJCQkJCQkJRDNEREVWQ0FQUzJfU1RSRUFNT0ZGU0VUIHwJCQkJCQkvLyBEZXZpY2Ugc3VwcG9ydHMgc3RyZWFtIG9mZnNldHMuIAoJCQkJCQkJRDNEREVWQ0FQUzJfVkVSVEVYRUxFTUVOVFNDQU5TSEFSRVNUUkVBTU9GRlNFVDsJLy8gTXVsdGlwbGUgdmVydGV4IGVsZW1lbnRzIGNhbiBzaGFyZSB0aGUgc2FtZSBvZmZzZXQgaW4gYSBzdHJlYW0gaWYgRDNEREVWQ0FQUzJfVkVSVEVYRUxFTUVOVFNDQU5TSEFSRVNUUkVBTU9GRlNFVCBpcyBzZXQgYnkgdGhlIGRldmljZSBhbmQgdGhlIHZlcnRleCBkZWNsYXJhdGlvbiBkb2VzIG5vdCBoYXZlIGFuIGVsZW1lbnQgd2l0aCBEM0RERUNMVVNBR0VfUE9TSVRJT05UMC4gCgoJCWNhcHMuTWF4TnBhdGNoVGVzc2VsbGF0aW9uTGV2ZWwgPSAwOwkvLyBNYXhpbXVtIG51bWJlciBvZiBOLXBhdGNoIHN1YmRpdmlzaW9uIGxldmVscy4gVGhlIGRyaXZlciB3aWxsIGNsYW1wIGFwcGxpY2F0aW9ucyB0byB0aGlzIHZhbHVlLCBpZiB0aGV5IGFyZSB1c2luZyBwcmVzYW1wbGVkIGRpc3BsYWNlbWVudCBtYXBwaW5nLiBTZWUgVGVzc2VsbGF0aW9uIGFuZCBEaXNwbGFjZW1lbnQgTWFwcGluZy4KCQljYXBzLk1hc3RlckFkYXB0ZXJPcmRpbmFsID0gMDsJCQkvLyBUaGlzIG51bWJlciBpbmRpY2F0ZXMgd2hpY2ggZGV2aWNlIGlzIHRoZSBtYXN0ZXIgZm9yIHRoaXMgc3Vib3JkaW5hdGUuIFRoaXMgbnVtYmVyIGlzIHRha2VuIGZyb20gdGhlIHNhbWUgc3BhY2UgYXMgdGhlIGFkYXB0ZXIgdmFsdWVzIHBhc3NlZCB0byB0aGUgSURpcmVjdDNEOSBtZXRob2RzLgoJCWNhcHMuQWRhcHRlck9yZGluYWxJbkdyb3VwID0gMDsJCQkvLyBUaGlzIG51bWJlciBpbmRpY2F0ZXMgdGhlIG9yZGVyIGluIHdoaWNoIGhlYWRzIGFyZSByZWZlcmVuY2VkIGJ5IHRoZSBhcHBsaWNhdGlvbiBwcm9ncmFtbWluZyBpbnRlcmZhY2UgKEFQSSkuIFRoZSBtYXN0ZXIgYWRhcHRlciBhbHdheXMgaGFzIEFkYXB0ZXJPcmRpbmFsSW5Hcm91cCA9IDAuIFRoZXNlIHZhbHVlcyBkbyBub3QgY29ycmVzcG9uZCB0byB0aGUgYWRhcHRlciBvcmRpbmFscyBwYXNzZWQgdG8gdGhlIElEaXJlY3QzRDkgbWV0aG9kcy4gVGhleSBhcHBseSBvbmx5IHRvIGhlYWRzIHdpdGhpbiBhIGdyb3VwLgoJCWNhcHMuTnVtYmVyT2ZBZGFwdGVyc0luR3JvdXAgPSAxOwkJLy8gTnVtYmVyIG9mIGFkYXB0ZXJzIGluIHRoaXMgYWRhcHRlciBncm91cCAob25seSBpZiBtYXN0ZXIpLiBUaGlzIHdpbGwgYmUgMSBmb3IgY29udmVudGlvbmFsIGFkYXB0ZXJzLiBUaGUgdmFsdWUgd2lsbCBiZSBncmVhdGVyIHRoYW4gMSBmb3IgdGhlIG1hc3RlciBhZGFwdGVyIG9mIGEgbXVsdGloZWFkIGNhcmQuIFRoZSB2YWx1ZSB3aWxsIGJlIDAgZm9yIGEgc3Vib3JkaW5hdGUgYWRhcHRlciBvZiBhIG11bHRpaGVhZCBjYXJkLiBFYWNoIGNhcmQgY2FuIGhhdmUgYXQgbW9zdCBvbmUgbWFzdGVyLCBidXQgbWF5IGhhdmUgbWFueSBzdWJvcmRpbmF0ZXMuCgoJCWNhcHMuRGVjbFR5cGVzID0JRDNERFRDQVBTX1VCWVRFNCB8CQkvLyA0LUQgdW5zaWduZWQgYnl0ZS4gCgkJCQkJCQlEM0REVENBUFNfVUJZVEU0TiB8CQkvLyBOb3JtYWxpemVkLCA0LUQgdW5zaWduZWQgYnl0ZS4gRWFjaCBvZiB0aGUgZm91ciBieXRlcyBpcyBub3JtYWxpemVkIGJ5IGRpdmlkaW5nIHRvIDI1NS4wLiAKCQkJCQkJCUQzRERUQ0FQU19TSE9SVDJOIHwJCS8vIE5vcm1hbGl6ZWQsIDItRCBzaWduZWQgc2hvcnQsIGV4cGFuZGVkIHRvIChmaXJzdCBieXRlLzMyNzY3LjAsIHNlY29uZCBieXRlLzMyNzY3LjAsIDAsIDEpLiAKCQkJCQkJCUQzRERUQ0FQU19TSE9SVDROIHwJCS8vIE5vcm1hbGl6ZWQsIDQtRCBzaWduZWQgc2hvcnQsIGV4cGFuZGVkIHRvIChmaXJzdCBieXRlLzMyNzY3LjAsIHNlY29uZCBieXRlLzMyNzY3LjAsIHRoaXJkIGJ5dGUvMzI3NjcuMCwgZm91cnRoIGJ5dGUvMzI3NjcuMCkuIAoJCQkJCQkJRDNERFRDQVBTX1VTSE9SVDJOIHwJLy8gTm9ybWFsaXplZCwgMi1EIHVuc2lnbmVkIHNob3J0LCBleHBhbmRlZCB0byAoZmlyc3QgYnl0ZS82NTUzNS4wLCBzZWNvbmQgYnl0ZS82NTUzNS4wLCAwLCAxKS4gIAoJCQkJCQkJRDNERFRDQVBTX1VTSE9SVDROIHwJLy8gTm9ybWFsaXplZCA0LUQgdW5zaWduZWQgc2hvcnQsIGV4cGFuZGVkIHRvIChmaXJzdCBieXRlLzY1NTM1LjAsIHNlY29uZCBieXRlLzY1NTM1LjAsIHRoaXJkIGJ5dGUvNjU1MzUuMCwgZm91cnRoIGJ5dGUvNjU1MzUuMCkuICAKCQkJCQkJCUQzRERUQ0FQU19VREVDMyB8CQkvLyAzLUQgdW5zaWduZWQgMTAgMTAgMTAgZm9ybWF0IGV4cGFuZGVkIHRvICh2YWx1ZSwgdmFsdWUsIHZhbHVlLCAxKS4gCgkJCQkJCQlEM0REVENBUFNfREVDM04gfAkJLy8gMy1EIHNpZ25lZCAxMCAxMCAxMCBmb3JtYXQgbm9ybWFsaXplZCBhbmQgZXhwYW5kZWQgdG8gKHZbMF0vNTExLjAsIHZbMV0vNTExLjAsIHZbMl0vNTExLjAsIDEpLiAKCQkJCQkJCUQzRERUQ0FQU19GTE9BVDE2XzIgfAkvLyAyLUQgMTYtYml0IGZsb2F0aW5nIHBvaW50IG51bWJlcnMuIAoJCQkJCQkJRDNERFRDQVBTX0ZMT0FUMTZfNDsJLy8gNC1EIDE2LWJpdCBmbG9hdGluZyBwb2ludCBudW1iZXJzLiAKCgkJY2Fwcy5OdW1TaW11bHRhbmVvdXNSVHMgPSA0OwkvLyBOdW1iZXIgb2Ygc2ltdWx0YW5lb3VzIHJlbmRlciB0YXJnZXRzLiBUaGlzIG51bWJlciBtdXN0IGJlIGF0IGxlYXN0IG9uZS4KCgkJY2Fwcy5TdHJldGNoUmVjdEZpbHRlckNhcHMgPSAJRDNEUFRGSUxURVJDQVBTX01JTkZQT0lOVCB8CQkvLyBEZXZpY2Ugc3VwcG9ydHMgcG9pbnQtc2FtcGxlIGZpbHRlcmluZyBmb3IgbWluaWZ5aW5nIHJlY3RhbmdsZXMuIFRoaXMgZmlsdGVyIHR5cGUgaXMgcmVxdWVzdGVkIGJ5IGNhbGxpbmcgSURpcmVjdDNERGV2aWNlOTo6U3RyZXRjaFJlY3QgdXNpbmcgRDNEVEVYRl9QT0lOVC4gCgkJCQkJCQkJCQlEM0RQVEZJTFRFUkNBUFNfTUFHRlBPSU5UIHwJCS8vIERldmljZSBzdXBwb3J0cyBwb2ludC1zYW1wbGUgZmlsdGVyaW5nIGZvciBtYWduaWZ5aW5nIHJlY3RhbmdsZXMuIFRoaXMgZmlsdGVyIHR5cGUgaXMgcmVxdWVzdGVkIGJ5IGNhbGxpbmcgSURpcmVjdDNERGV2aWNlOTo6U3RyZXRjaFJlY3QgdXNpbmcgRDNEVEVYRl9QT0lOVC4gCgkJCQkJCQkJCQlEM0RQVEZJTFRFUkNBUFNfTUlORkxJTkVBUiB8CS8vIERldmljZSBzdXBwb3J0cyBiaWxpbmVhciBpbnRlcnBvbGF0aW9uIGZpbHRlcmluZyBmb3IgbWluaWZ5aW5nIHJlY3RhbmdsZXMuIFRoaXMgZmlsdGVyIHR5cGUgaXMgcmVxdWVzdGVkIGJ5IGNhbGxpbmcgSURpcmVjdDNERGV2aWNlOTo6U3RyZXRjaFJlY3QgdXNpbmcgRDNEVEVYRl9MSU5FQVIuIAoJCQkJCQkJCQkJRDNEUFRGSUxURVJDQVBTX01BR0ZMSU5FQVI7CQkvLyBEZXZpY2Ugc3VwcG9ydHMgYmlsaW5lYXIgaW50ZXJwb2xhdGlvbiBmaWx0ZXJpbmcgZm9yIG1hZ25pZnlpbmcgcmVjdGFuZ2xlcy4gVGhpcyBmaWx0ZXIgdHlwZSBpcyByZXF1ZXN0ZWQgYnkgY2FsbGluZyBJRGlyZWN0M0REZXZpY2U5OjpTdHJldGNoUmVjdCB1c2luZyBEM0RURVhGX0xJTkVBUi4gCgoJCWNhcHMuVlMyMENhcHMuQ2FwcyA9IHZlcnRleFNoYWRlclByZWRpY2F0aW9uOwkJCQkJCQkJCS8vIEluc3RydWN0aW9uIHByZWRpY2F0aW9uIGlzIHN1cHBvcnRlZC4gU2VlIHNldHBfY29tcC4gCgkJY2Fwcy5WUzIwQ2Fwcy5EeW5hbWljRmxvd0NvbnRyb2xEZXB0aCA9IHZlcnRleFNoYWRlckR5bmFtaWNGbG93Q29udHJvbERlcHRoOwkvLyBUaGUgbWF4aW11bSBsZXZlbCBvZiBuZXN0aW5nIG9mIGR5bmFtaWMgZmxvdyBjb250cm9sIGluc3RydWN0aW9ucyAoYnJlYWssIGJyZWFrYywgaWZjKS4KCQljYXBzLlZTMjBDYXBzLk51bVRlbXBzID0gRDNEVlMyMF9NQVhfTlVNVEVNUFM7CQkJCQkJCQkJLy8gVGhlIG1heGltdW0gbnVtYmVyIG9mIHRlbXBvcmFyeSByZWdpc3RlcnMgc3VwcG9ydGVkLgoJCWNhcHMuVlMyMENhcHMuU3RhdGljRmxvd0NvbnRyb2xEZXB0aCA9IEQzRFZTMjBfTUFYX1NUQVRJQ0ZMT1dDT05UUk9MREVQVEg7CQkvLyBUaGUgbWF4aW11bSBkZXB0aCBvZiBuZXN0aW5nIG9mIHRoZSBsb29wL3JlcCBhbmQgY2FsbC9jYWxsbnogYm9vbCBpbnN0cnVjdGlvbnMuCgoJCWNhcHMuUFMyMENhcHMuQ2FwcyA9CXBpeGVsU2hhZGVyQXJiaXRyYXJ5U3dpenpsZSB8CQkJCQkJLy8gQXJiaXRyYXJ5IHN3aXp6bGluZyBpcyBzdXBwb3J0ZWQuIAoJCQkJCQkJCXBpeGVsU2hhZGVyR3JhZGllbnRJbnN0cnVjdGlvbnMgfAkJCQkJLy8gR3JhZGllbnQgaW5zdHJ1Y3Rpb25zIGFyZSBzdXBwb3J0ZWQuIAoJCQkJCQkJCXBpeGVsU2hhZGVyUHJlZGljYXRpb24gfAkJCQkJCQkvLyBJbnN0cnVjdGlvbiBwcmVkaWNhdGlvbiBpcyBzdXBwb3J0ZWQuIFNlZSBzZXRwX2NvbXAgLSBwcy4gCgkJCQkJCQkJcGl4ZWxTaGFkZXJOb0RlcGVuZGVudFJlYWRMaW1pdCB8CQkJCQkvLyBUaGVyZSBpcyBubyBsaW1pdCBvbiB0aGUgbnVtYmVyIG9mIGRlcGVuZGVudCByZWFkcyBwZXIgaW5zdHJ1Y3Rpb24uIAoJCQkJCQkJCXBpeGVsU2hhZGVyTm9UZXhJbnN0cnVjdGlvbkxpbWl0OwkJCQkJLy8gVGhlcmUgaXMgbm8gbGltaXQgb24gdGhlIG51bWJlciBvZiB0ZXggaW5zdHJ1Y3Rpb25zLiAKCgkJY2Fwcy5QUzIwQ2Fwcy5EeW5hbWljRmxvd0NvbnRyb2xEZXB0aCA9IHBpeGVsU2hhZGVyRHluYW1pY0Zsb3dDb250cm9sRGVwdGg7CQkvLyBUaGUgbWF4aW11bSBsZXZlbCBvZiBuZXN0aW5nIG9mIGR5bmFtaWMgZmxvdyBjb250cm9sIGluc3RydWN0aW9ucyAoYnJlYWssIGJyZWFrYywgaWZjKS4KCQljYXBzLlBTMjBDYXBzLk51bUluc3RydWN0aW9uU2xvdHMgPSBEM0RQUzIwX01BWF9OVU1JTlNUUlVDVElPTlNMT1RTOwkJCS8vIFRoZSBkcml2ZXIgd2lsbCBzdXBwb3J0IGF0IG1vc3QgdGhpcyBtYW55IGluc3RydWN0aW9ucy4KCQljYXBzLlBTMjBDYXBzLk51bVRlbXBzID0gRDNEUFMyMF9NQVhfTlVNVEVNUFM7CQkJCQkJCQkJLy8gVGhlIGRyaXZlciB3aWxsIHN1cHBvcnQgYXQgbW9zdCB0aGlzIG1hbnkgdGVtcG9yYXJ5IHJlZ2lzdGVyLgoJCWNhcHMuUFMyMENhcHMuU3RhdGljRmxvd0NvbnRyb2xEZXB0aCA9IHBpeGVsU2hhZGVyU3RhdGljRmxvd0NvbnRyb2xEZXB0aDsJCS8vIFRoZSBtYXhpbXVtIGRlcHRoIG9mIG5lc3Rpbmcgb2YgdGhlIGxvb3AvcmVwIGFuZCBjYWxsL2NhbGxueiBib29sIGluc3RydWN0aW9ucy4KCgkJY2Fwcy5WZXJ0ZXhUZXh0dXJlRmlsdGVyQ2FwcyA9CQlEM0RQVEZJTFRFUkNBUFNfTUFHRlBPSU5UIHwJCQkvLyBEZXZpY2Ugc3VwcG9ydHMgcGVyLXN0YWdlIHBvaW50LXNhbXBsZSBmaWx0ZXJpbmcgZm9yIG1hZ25pZnlpbmcgdGV4dHVyZXMuIFRoZSBwb2ludC1zYW1wbGUgbWFnbmlmaWNhdGlvbiBmaWx0ZXIgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIEQzRFRFWEZfUE9JTlQgbWVtYmVyIG9mIHRoZSBEM0RURVhUVVJFRklMVEVSVFlQRSBlbnVtZXJhdGVkIHR5cGUuIAoJCQkJCQkJCQkJLy8JRDNEUFRGSUxURVJDQVBTX01BR0ZMSU5FQVIgfAkJLy8gRGV2aWNlIHN1cHBvcnRzIHBlci1zdGFnZSBiaWxpbmVhciBpbnRlcnBvbGF0aW9uIGZpbHRlcmluZyBmb3IgbWFnbmlmeWluZyBtaXBtYXBzLiBUaGUgYmlsaW5lYXIgaW50ZXJwb2xhdGlvbiBtaXBtYXBwaW5nIGZpbHRlciBpcyByZXByZXNlbnRlZCBieSB0aGUgRDNEVEVYRl9MSU5FQVIgbWVtYmVyIG9mIHRoZSBEM0RURVhUVVJFRklMVEVSVFlQRSBlbnVtZXJhdGVkIHR5cGUuIAoJCQkJCQkJCQkJLy8JRDNEUFRGSUxURVJDQVBTX01BR0ZBTklTT1RST1BJQyB8CS8vIERldmljZSBzdXBwb3J0cyBwZXItc3RhZ2UgYW5pc290cm9waWMgZmlsdGVyaW5nIGZvciBtYWduaWZ5aW5nIHRleHR1cmVzLiBUaGUgYW5pc290cm9waWMgbWFnbmlmaWNhdGlvbiBmaWx0ZXIgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIEQzRFRFWEZfQU5JU09UUk9QSUMgbWVtYmVyIG9mIHRoZSBEM0RURVhUVVJFRklMVEVSVFlQRSBlbnVtZXJhdGVkIHR5cGUuIAoJCQkJCQkJCQkJLy8JRDNEUFRGSUxURVJDQVBTX01BR0ZQWVJBTUlEQUxRVUFEIHwJLy8gRGV2aWNlIHN1cHBvcnRzIHBlci1zdGFnZSBweXJhbWlkYWwgc2FtcGxlIGZpbHRlcmluZyBmb3IgbWFnbmlmeWluZyB0ZXh0dXJlcy4gVGhlIHB5cmFtaWRhbCBtYWduaWZ5aW5nIGZpbHRlciBpcyByZXByZXNlbnRlZCBieSB0aGUgRDNEVEVYRl9QWVJBTUlEQUxRVUFEIG1lbWJlciBvZiB0aGUgRDNEVEVYVFVSRUZJTFRFUlRZUEUgZW51bWVyYXRlZCB0eXBlLiAKCQkJCQkJCQkJCS8vCUQzRFBURklMVEVSQ0FQU19NQUdGR0FVU1NJQU5RVUFEIHwJLy8gRGV2aWNlIHN1cHBvcnRzIHBlci1zdGFnZSBHYXVzc2lhbiBxdWFkIGZpbHRlcmluZyBmb3IgbWFnbmlmeWluZyB0ZXh0dXJlcy4gCgkJCQkJCQkJCQkJRDNEUFRGSUxURVJDQVBTX01JTkZQT0lOVCB8CQkJLy8gRGV2aWNlIHN1cHBvcnRzIHBlci1zdGFnZSBwb2ludC1zYW1wbGUgZmlsdGVyaW5nIGZvciBtaW5pZnlpbmcgdGV4dHVyZXMuIFRoZSBwb2ludC1zYW1wbGUgbWluaWZpY2F0aW9uIGZpbHRlciBpcyByZXByZXNlbnRlZCBieSB0aGUgRDNEVEVYRl9QT0lOVCBtZW1iZXIgb2YgdGhlIEQzRFRFWFRVUkVGSUxURVJUWVBFIGVudW1lcmF0ZWQgdHlwZS4gCgkJCQkJCQkJCQkvLwlEM0RQVEZJTFRFUkNBUFNfTUlORkxJTkVBUiB8CQkvLyBEZXZpY2Ugc3VwcG9ydHMgcGVyLXN0YWdlIGxpbmVhciBmaWx0ZXJpbmcgZm9yIG1pbmlmeWluZyB0ZXh0dXJlcy4gVGhlIGxpbmVhciBtaW5pZmljYXRpb24gZmlsdGVyIGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBEM0RURVhGX0xJTkVBUiBtZW1iZXIgb2YgdGhlIEQzRFRFWFRVUkVGSUxURVJUWVBFIGVudW1lcmF0ZWQgdHlwZS4gCgkJCQkJCQkJCQkvLwlEM0RQVEZJTFRFUkNBUFNfTUlORkFOSVNPVFJPUElDIHwJLy8gRGV2aWNlIHN1cHBvcnRzIHBlci1zdGFnZSBhbmlzb3Ryb3BpYyBmaWx0ZXJpbmcgZm9yIG1pbmlmeWluZyB0ZXh0dXJlcy4gVGhlIGFuaXNvdHJvcGljIG1pbmlmaWNhdGlvbiBmaWx0ZXIgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIEQzRFRFWEZfQU5JU09UUk9QSUMgbWVtYmVyIG9mIHRoZSBEM0RURVhUVVJFRklMVEVSVFlQRSBlbnVtZXJhdGVkIHR5cGUuIAoJCQkJCQkJCQkJLy8JRDNEUFRGSUxURVJDQVBTX01JTkZQWVJBTUlEQUxRVUFEIHwJLy8gRGV2aWNlIHN1cHBvcnRzIHBlci1zdGFnZSBweXJhbWlkYWwgc2FtcGxlIGZpbHRlcmluZyBmb3IgbWluaWZ5aW5nIHRleHR1cmVzLiAKCQkJCQkJCQkJCS8vCUQzRFBURklMVEVSQ0FQU19NSU5GR0FVU1NJQU5RVUFEIHwJLy8gRGV2aWNlIHN1cHBvcnRzIHBlci1zdGFnZSBHYXVzc2lhbiBxdWFkIGZpbHRlcmluZyBmb3IgbWluaWZ5aW5nIHRleHR1cmVzLiAKCQkJCQkJCQkJCQlEM0RQVEZJTFRFUkNBUFNfTUlQRlBPSU5UOwkJCS8vIERldmljZSBzdXBwb3J0cyBwZXItc3RhZ2UgcG9pbnQtc2FtcGxlIGZpbHRlcmluZyBmb3IgbWlwbWFwcy4gVGhlIHBvaW50LXNhbXBsZSBtaXBtYXBwaW5nIGZpbHRlciBpcyByZXByZXNlbnRlZCBieSB0aGUgRDNEVEVYRl9QT0lOVCBtZW1iZXIgb2YgdGhlIEQzRFRFWFRVUkVGSUxURVJUWVBFIGVudW1lcmF0ZWQgdHlwZS4gCgkJCQkJCQkJCQkvLwlEM0RQVEZJTFRFUkNBUFNfTUlQRkxJTkVBUjsJCQkvLyBEZXZpY2Ugc3VwcG9ydHMgcGVyLXN0YWdlIGJpbGluZWFyIGludGVycG9sYXRpb24gZmlsdGVyaW5nIGZvciBtaXBtYXBzLiBUaGUgYmlsaW5lYXIgaW50ZXJwb2xhdGlvbiBtaXBtYXBwaW5nIGZpbHRlciBpcyByZXByZXNlbnRlZCBieSB0aGUgRDNEVEVYRl9MSU5FQVIgbWVtYmVyIG9mIHRoZSBEM0RURVhUVVJFRklMVEVSVFlQRSBlbnVtZXJhdGVkIHR5cGUuIAoKCQljYXBzLk1heFZTaGFkZXJJbnN0cnVjdGlvbnNFeGVjdXRlZCA9IG1heGltdW1WZXJ0ZXhTaGFkZXJJbnN0cnVjdGlvbnNFeGVjdXRlZDsJLy8gTWF4aW11bSBudW1iZXIgb2YgdmVydGV4IHNoYWRlciBpbnN0cnVjdGlvbnMgdGhhdCBjYW4gYmUgcnVuLgoJCWNhcHMuTWF4UFNoYWRlckluc3RydWN0aW9uc0V4ZWN1dGVkID0gbWF4aW11bVBpeGVsU2hhZGVySW5zdHJ1Y3Rpb25zRXhlY3V0ZWQ7CS8vIE1heGltdW0gbnVtYmVyIG9mIHBpeGVsIHNoYWRlciBpbnN0cnVjdGlvbnMgdGhhdCBjYW4gYmUgcnVuLgoJCWNhcHMuTWF4VmVydGV4U2hhZGVyMzBJbnN0cnVjdGlvblNsb3RzID0gbWF4aW11bVZlcnRleFNoYWRlcjMwSW5zdHJ1Y3Rpb25TbG90czsJLy8gTWF4aW11bSBudW1iZXIgb2YgdmVydGV4IHNoYWRlciBpbnN0cnVjdGlvbiBzbG90cyBzdXBwb3J0ZWQuIFRoZSBtYXhpbXVtIHZhbHVlIHRoYXQgY2FuIGJlIHNldCBvbiB0aGlzIGNhcCBpcyAzMjc2OC4gRGV2aWNlcyB0aGF0IHN1cHBvcnQgdnNfM18wIGFyZSByZXF1aXJlZCB0byBzdXBwb3J0IGF0IGxlYXN0IDUxMiBpbnN0cnVjdGlvbiBzbG90cy4KCQljYXBzLk1heFBpeGVsU2hhZGVyMzBJbnN0cnVjdGlvblNsb3RzID0gbWF4aW11bVBpeGVsU2hhZGVyMzBJbnN0cnVjdGlvblNsb3RzOwkvLyBNYXhpbXVtIG51bWJlciBvZiBwaXhlbCBzaGFkZXIgaW5zdHJ1Y3Rpb24gc2xvdHMgc3VwcG9ydGVkLiBUaGUgbWF4aW11bSB2YWx1ZSB0aGF0IGNhbiBiZSBzZXQgb24gdGhpcyBjYXAgaXMgMzI3NjguIERldmljZXMgdGhhdCBzdXBwb3J0IHBzXzNfMCBhcmUgcmVxdWlyZWQgdG8gc3VwcG9ydCBhdCBsZWFzdCA1MTIgaW5zdHJ1Y3Rpb24gc2xvdHMuCgoJCSpjYXBhYmlsaXRpZXMgPSBjYXBzOwoKCQlyZXR1cm4gRDNEX09LOwoJfQoKCWxvbmcgRGlyZWN0M0Q5OjpSZWdpc3RlclNvZnR3YXJlRGV2aWNlKHZvaWQgKmluaXRpYWxpemVGdW5jdGlvbikKCXsKCQlUUkFDRSgidm9pZCAqaW5pdGlhbGl6ZUZ1bmN0aW9uID0gMHglMC44cCIsIGluaXRpYWxpemVGdW5jdGlvbik7CgoJCWxvYWRTeXN0ZW1EM0Q5KCk7CgoJCWlmKGQzZDkpCgkJewoJCQlyZXR1cm4gZDNkOS0+UmVnaXN0ZXJTb2Z0d2FyZURldmljZShpbml0aWFsaXplRnVuY3Rpb24pOwoJCX0KCQllbHNlCgkJewoJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKCQl9Cgl9CgoJdm9pZCBEaXJlY3QzRDk6OmxvYWRTeXN0ZW1EM0Q5KCkKCXsKCQlpZihkM2Q5KQoJCXsKCQkJcmV0dXJuOwoJCX0KCgkJY2hhciBkM2Q5UGF0aFtNQVhfUEFUSCArIDE2XTsKCQlHZXRTeXN0ZW1EaXJlY3RvcnkoZDNkOVBhdGgsIE1BWF9QQVRIKTsKCQlzdHJjYXQoZDNkOVBhdGgsICJcXGQzZDkuZGxsIik7CgkJZDNkOUxpYiA9IExvYWRMaWJyYXJ5KGQzZDlQYXRoKTsKCgkJaWYoZDNkOUxpYikKCQl7CgkJCXR5cGVkZWYgSURpcmVjdDNEOSogKF9fc3RkY2FsbCAqRElSRUNUM0RDUkVBVEU5KSh1bnNpZ25lZCBpbnQpOwoJCQlESVJFQ1QzRENSRUFURTkgZGlyZWN0M0RDcmVhdGU5ID0gKERJUkVDVDNEQ1JFQVRFOSlHZXRQcm9jQWRkcmVzcyhkM2Q5TGliLCAiRGlyZWN0M0RDcmVhdGU5Iik7CgkJCWQzZDkgPSBkaXJlY3QzRENyZWF0ZTkoRDNEX1NES19WRVJTSU9OKTsKCQl9Cgl9Cn0K