LyoKICBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxNiBTYW0gTGFudGluZ2EgPHNsb3VrZW5AbGlic2RsLm9yZz4KCiAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKICB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCiAgYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KCiAgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCiAgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAogIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKCiAgMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKICAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQogICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQogICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCiAgMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKICAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCiAgMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KKi8KI2luY2x1ZGUgIi4uLy4uL1NETF9pbnRlcm5hbC5oIgoKI2lmIFNETF9BVURJT19EUklWRVJfU1VOQVVESU8KCi8qIEFsbG93IGFjY2VzcyB0byBhIHJhdyBtaXhpbmcgYnVmZmVyICovCgojaW5jbHVkZSA8ZmNudGwuaD4KI2luY2x1ZGUgPGVycm5vLmg+CiNpZmRlZiBfX05FVEJTRF9fCiNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KI2luY2x1ZGUgPHN5cy9hdWRpb2lvLmg+CiNlbmRpZgojaWZkZWYgX19TVlI0CiNpbmNsdWRlIDxzeXMvYXVkaW9pby5oPgojZWxzZQojaW5jbHVkZSA8c3lzL3RpbWUuaD4KI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojZW5kaWYKI2luY2x1ZGUgPHVuaXN0ZC5oPgoKI2luY2x1ZGUgIlNETF90aW1lci5oIgojaW5jbHVkZSAiU0RMX2F1ZGlvLmgiCiNpbmNsdWRlICIuLi9TRExfYXVkaW9tZW0uaCIKI2luY2x1ZGUgIi4uL1NETF9hdWRpb19jLmgiCiNpbmNsdWRlICIuLi9TRExfYXVkaW9kZXZfYy5oIgojaW5jbHVkZSAiU0RMX3N1bmF1ZGlvLmgiCgovKiBPcGVuIHRoZSBhdWRpbyBkZXZpY2UgZm9yIHBsYXliYWNrLCBhbmQgZG9uJ3QgYmxvY2sgaWYgYnVzeSAqLwoKI2lmIGRlZmluZWQoQVVESU9fR0VUSU5GTykgJiYgIWRlZmluZWQoQVVESU9fR0VUQlVGSU5GTykKI2RlZmluZSBBVURJT19HRVRCVUZJTkZPIEFVRElPX0dFVElORk8KI2VuZGlmCgovKiBBdWRpbyBkcml2ZXIgZnVuY3Rpb25zICovCnN0YXRpYyBVaW50OCBzbmQyYXUoaW50IHNhbXBsZSk7CgovKiBBdWRpbyBkcml2ZXIgYm9vdHN0cmFwIGZ1bmN0aW9ucyAqLwpzdGF0aWMgdm9pZApTVU5BVURJT19EZXRlY3REZXZpY2VzKHZvaWQpCnsKICAgIFNETF9FbnVtVW5peEF1ZGlvRGV2aWNlcygxLCAoaW50ICgqKShpbnQpKSBOVUxMKTsKfQoKI2lmZGVmIERFQlVHX0FVRElPCnZvaWQKQ2hlY2tVbmRlcmZsb3coX1RISVMpCnsKI2lmZGVmIEFVRElPX0dFVEJVRklORk8KICAgIGF1ZGlvX2luZm9fdCBpbmZvOwogICAgaW50IGxlZnQ7CgogICAgaW9jdGwodGhpcy0+aGlkZGVuLT5hdWRpb19mZCwgQVVESU9fR0VUQlVGSU5GTywgJmluZm8pOwogICAgbGVmdCA9ICh0aGlzLT5oaWRkZW4tPndyaXR0ZW4gLSBpbmZvLnBsYXkuc2FtcGxlcyk7CiAgICBpZiAodGhpcy0+aGlkZGVuLT53cml0dGVuICYmIChsZWZ0ID09IDApKSB7CiAgICAgICAgZnByaW50ZihzdGRlcnIsICJhdWRpbyB1bmRlcmZsb3chXG4iKTsKICAgIH0KI2VuZGlmCn0KI2VuZGlmCgpzdGF0aWMgdm9pZApTVU5BVURJT19XYWl0RGV2aWNlKF9USElTKQp7CiNpZmRlZiBBVURJT19HRVRCVUZJTkZPCiNkZWZpbmUgU0xFRVBfRlVER0UgMTAgICAgICAvKiAxMCBtcyBzY2hlZHVsaW5nIGZ1ZGdlIGZhY3RvciAqLwogICAgYXVkaW9faW5mb190IGluZm87CiAgICBTaW50MzIgbGVmdDsKCiAgICBpb2N0bCh0aGlzLT5oaWRkZW4tPmF1ZGlvX2ZkLCBBVURJT19HRVRCVUZJTkZPLCAmaW5mbyk7CiAgICBsZWZ0ID0gKHRoaXMtPmhpZGRlbi0+d3JpdHRlbiAtIGluZm8ucGxheS5zYW1wbGVzKTsKICAgIGlmIChsZWZ0ID4gdGhpcy0+aGlkZGVuLT5mcmFnc2l6ZSkgewogICAgICAgIFNpbnQzMiBzbGVlcHk7CgogICAgICAgIHNsZWVweSA9ICgobGVmdCAtIHRoaXMtPmhpZGRlbi0+ZnJhZ3NpemUpIC8gdGhpcy0+aGlkZGVuLT5mcmVxdWVuY3kpOwogICAgICAgIHNsZWVweSAtPSBTTEVFUF9GVURHRTsKICAgICAgICBpZiAoc2xlZXB5ID4gMCkgewogICAgICAgICAgICBTRExfRGVsYXkoc2xlZXB5KTsKICAgICAgICB9CiAgICB9CiNlbHNlCiAgICBmZF9zZXQgZmRzZXQ7CgogICAgRkRfWkVSTygmZmRzZXQpOwogICAgRkRfU0VUKHRoaXMtPmhpZGRlbi0+YXVkaW9fZmQsICZmZHNldCk7CiAgICBzZWxlY3QodGhpcy0+aGlkZGVuLT5hdWRpb19mZCArIDEsIE5VTEwsICZmZHNldCwgTlVMTCwgTlVMTCk7CiNlbmRpZgp9CgpzdGF0aWMgdm9pZApTVU5BVURJT19QbGF5RGV2aWNlKF9USElTKQp7CiAgICAvKiBXcml0ZSB0aGUgYXVkaW8gZGF0YSAqLwogICAgaWYgKHRoaXMtPmhpZGRlbi0+dWxhd19vbmx5KSB7CiAgICAgICAgLyogQXNzdW1pbmcgdGhhdCB0aGlzLT5zcGVjLmZyZXEgPj0gODAwMCBIeiAqLwogICAgICAgIGludCBhY2N1bSwgaW5jciwgcG9zOwogICAgICAgIFVpbnQ4ICphdWJ1ZjsKCiAgICAgICAgYWNjdW0gPSAwOwogICAgICAgIGluY3IgPSB0aGlzLT5zcGVjLmZyZXEgLyA4OwogICAgICAgIGF1YnVmID0gdGhpcy0+aGlkZGVuLT51bGF3X2J1ZjsKICAgICAgICBzd2l0Y2ggKHRoaXMtPmhpZGRlbi0+YXVkaW9fZm10ICYgMHhGRikgewogICAgICAgIGNhc2UgODoKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVWludDggKnNuZGJ1ZjsKCiAgICAgICAgICAgICAgICBzbmRidWYgPSB0aGlzLT5oaWRkZW4tPm1peGJ1ZjsKICAgICAgICAgICAgICAgIGZvciAocG9zID0gMDsgcG9zIDwgdGhpcy0+aGlkZGVuLT5mcmFnc2l6ZTsgKytwb3MpIHsKICAgICAgICAgICAgICAgICAgICAqYXVidWYgPSBzbmQyYXUoKDB4ODAgLSAqc25kYnVmKSAqIDY0KTsKICAgICAgICAgICAgICAgICAgICBhY2N1bSArPSBpbmNyOwogICAgICAgICAgICAgICAgICAgIHdoaWxlIChhY2N1bSA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgYWNjdW0gLT0gMTAwMDsKICAgICAgICAgICAgICAgICAgICAgICAgc25kYnVmICs9IDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGF1YnVmICs9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAxNjoKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgU2ludDE2ICpzbmRidWY7CgogICAgICAgICAgICAgICAgc25kYnVmID0gKFNpbnQxNiAqKSB0aGlzLT5oaWRkZW4tPm1peGJ1ZjsKICAgICAgICAgICAgICAgIGZvciAocG9zID0gMDsgcG9zIDwgdGhpcy0+aGlkZGVuLT5mcmFnc2l6ZTsgKytwb3MpIHsKICAgICAgICAgICAgICAgICAgICAqYXVidWYgPSBzbmQyYXUoKnNuZGJ1ZiAvIDQpOwogICAgICAgICAgICAgICAgICAgIGFjY3VtICs9IGluY3I7CiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGFjY3VtID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICBhY2N1bSAtPSAxMDAwOwogICAgICAgICAgICAgICAgICAgICAgICBzbmRidWYgKz0gMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYXVidWYgKz0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiNpZmRlZiBERUJVR19BVURJTwogICAgICAgIENoZWNrVW5kZXJmbG93KHRoaXMpOwojZW5kaWYKICAgICAgICBpZiAod3JpdGUodGhpcy0+aGlkZGVuLT5hdWRpb19mZCwgdGhpcy0+aGlkZGVuLT51bGF3X2J1ZiwKICAgICAgICAgICAgdGhpcy0+aGlkZGVuLT5mcmFnc2l6ZSkgPCAwKSB7CiAgICAgICAgICAgIC8qIEFzc3VtZSBmYXRhbCBlcnJvciwgZm9yIG5vdyAqLwogICAgICAgICAgICBTRExfT3BlbmVkQXVkaW9EZXZpY2VEaXNjb25uZWN0ZWQodGhpcyk7CiAgICAgICAgfQogICAgICAgIHRoaXMtPmhpZGRlbi0+d3JpdHRlbiArPSB0aGlzLT5oaWRkZW4tPmZyYWdzaXplOwogICAgfSBlbHNlIHsKI2lmZGVmIERFQlVHX0FVRElPCiAgICAgICAgQ2hlY2tVbmRlcmZsb3codGhpcyk7CiNlbmRpZgogICAgICAgIGlmICh3cml0ZSh0aGlzLT5oaWRkZW4tPmF1ZGlvX2ZkLCB0aGlzLT5oaWRkZW4tPm1peGJ1ZiwKICAgICAgICAgICAgdGhpcy0+c3BlYy5zaXplKSA8IDApIHsKICAgICAgICAgICAgLyogQXNzdW1lIGZhdGFsIGVycm9yLCBmb3Igbm93ICovCiAgICAgICAgICAgIFNETF9PcGVuZWRBdWRpb0RldmljZURpc2Nvbm5lY3RlZCh0aGlzKTsKICAgICAgICB9CiAgICAgICAgdGhpcy0+aGlkZGVuLT53cml0dGVuICs9IHRoaXMtPmhpZGRlbi0+ZnJhZ3NpemU7CiAgICB9Cn0KCnN0YXRpYyBVaW50OCAqClNVTkFVRElPX0dldERldmljZUJ1ZihfVEhJUykKewogICAgcmV0dXJuICh0aGlzLT5oaWRkZW4tPm1peGJ1Zik7Cn0KCnN0YXRpYyB2b2lkClNVTkFVRElPX0Nsb3NlRGV2aWNlKF9USElTKQp7CiAgICBpZiAodGhpcy0+aGlkZGVuICE9IE5VTEwpIHsKICAgICAgICBTRExfRnJlZUF1ZGlvTWVtKHRoaXMtPmhpZGRlbi0+bWl4YnVmKTsKICAgICAgICB0aGlzLT5oaWRkZW4tPm1peGJ1ZiA9IE5VTEw7CiAgICAgICAgU0RMX2ZyZWUodGhpcy0+aGlkZGVuLT51bGF3X2J1Zik7CiAgICAgICAgdGhpcy0+aGlkZGVuLT51bGF3X2J1ZiA9IE5VTEw7CiAgICAgICAgaWYgKHRoaXMtPmhpZGRlbi0+YXVkaW9fZmQgPj0gMCkgewogICAgICAgICAgICBjbG9zZSh0aGlzLT5oaWRkZW4tPmF1ZGlvX2ZkKTsKICAgICAgICAgICAgdGhpcy0+aGlkZGVuLT5hdWRpb19mZCA9IC0xOwogICAgICAgIH0KICAgICAgICBTRExfZnJlZSh0aGlzLT5oaWRkZW4pOwogICAgICAgIHRoaXMtPmhpZGRlbiA9IE5VTEw7CiAgICB9Cn0KCnN0YXRpYyBpbnQKU1VOQVVESU9fT3BlbkRldmljZShfVEhJUywgdm9pZCAqaGFuZGxlLCBjb25zdCBjaGFyICpkZXZuYW1lLCBpbnQgaXNjYXB0dXJlKQp7CiAgICBjb25zdCBpbnQgZmxhZ3MgPSAoKGlzY2FwdHVyZSkgPyBPUEVOX0ZMQUdTX0lOUFVUIDogT1BFTl9GTEFHU19PVVRQVVQpOwogICAgU0RMX0F1ZGlvRm9ybWF0IGZvcm1hdCA9IDA7CiAgICBhdWRpb19pbmZvX3QgaW5mbzsKCiAgICAvKiBXZSBkb24ndCBjYXJlIHdoYXQgdGhlIGRldm5hbWUgaXMuLi53ZSdsbCB0cnkgdG8gb3BlbiBhbnl0aGluZy4gKi8KICAgIC8qICAuLi5idXQgZGVmYXVsdCB0byBmaXJzdCBuYW1lIGluIHRoZSBsaXN0Li4uICovCiAgICBpZiAoZGV2bmFtZSA9PSBOVUxMKSB7CiAgICAgICAgZGV2bmFtZSA9IFNETF9HZXRBdWRpb0RldmljZU5hbWUoMCwgaXNjYXB0dXJlKTsKICAgICAgICBpZiAoZGV2bmFtZSA9PSBOVUxMKSB7CiAgICAgICAgICAgIHJldHVybiBTRExfU2V0RXJyb3IoIk5vIHN1Y2ggYXVkaW8gZGV2aWNlIik7CiAgICAgICAgfQogICAgfQoKICAgIC8qIEluaXRpYWxpemUgYWxsIHZhcmlhYmxlcyB0aGF0IHdlIGNsZWFuIG9uIHNodXRkb3duICovCiAgICB0aGlzLT5oaWRkZW4gPSAoc3RydWN0IFNETF9Qcml2YXRlQXVkaW9EYXRhICopCiAgICAgICAgU0RMX21hbGxvYygoc2l6ZW9mICp0aGlzLT5oaWRkZW4pKTsKICAgIGlmICh0aGlzLT5oaWRkZW4gPT0gTlVMTCkgewogICAgICAgIHJldHVybiBTRExfT3V0T2ZNZW1vcnkoKTsKICAgIH0KICAgIFNETF9tZW1zZXQodGhpcy0+aGlkZGVuLCAwLCAoc2l6ZW9mICp0aGlzLT5oaWRkZW4pKTsKCiAgICAvKiBPcGVuIHRoZSBhdWRpbyBkZXZpY2UgKi8KICAgIHRoaXMtPmhpZGRlbi0+YXVkaW9fZmQgPSBvcGVuKGRldm5hbWUsIGZsYWdzLCAwKTsKICAgIGlmICh0aGlzLT5oaWRkZW4tPmF1ZGlvX2ZkIDwgMCkgewogICAgICAgIHJldHVybiBTRExfU2V0RXJyb3IoIkNvdWxkbid0IG9wZW4gJXM6ICVzIiwgZGV2bmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKICAgIH0KCiNpZmRlZiBBVURJT19TRVRJTkZPCiAgICBpbnQgZW5jOwojZW5kaWYKICAgIGludCBkZXNpcmVkX2ZyZXEgPSB0aGlzLT5zcGVjLmZyZXE7CgogICAgLyogRGV0ZXJtaW5lIHRoZSBhdWRpbyBwYXJhbWV0ZXJzIGZyb20gdGhlIEF1ZGlvU3BlYyAqLwogICAgc3dpdGNoIChTRExfQVVESU9fQklUU0laRSh0aGlzLT5zcGVjLmZvcm1hdCkpIHsKCiAgICBjYXNlIDg6CiAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgLyogVW5zaWduZWQgOCBiaXQgYXVkaW8gZGF0YSAqLwogICAgICAgICAgICB0aGlzLT5zcGVjLmZvcm1hdCA9IEFVRElPX1U4OwojaWZkZWYgQVVESU9fU0VUSU5GTwogICAgICAgICAgICBlbmMgPSBBVURJT19FTkNPRElOR19MSU5FQVI4OwojZW5kaWYKICAgICAgICB9CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSAxNjoKICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAvKiBTaWduZWQgMTYgYml0IGF1ZGlvIGRhdGEgKi8KICAgICAgICAgICAgdGhpcy0+c3BlYy5mb3JtYXQgPSBBVURJT19TMTZTWVM7CiNpZmRlZiBBVURJT19TRVRJTkZPCiAgICAgICAgICAgIGVuYyA9IEFVRElPX0VOQ09ESU5HX0xJTkVBUjsKI2VuZGlmCiAgICAgICAgfQogICAgICAgIGJyZWFrOwoKICAgIGRlZmF1bHQ6CiAgICAgICAgewogICAgICAgICAgICAvKiAhISEgRklYTUU6IGZhbGxiYWNrIHRvIGNvbnZlcnNpb24gb24gdW5zdXBwb3J0ZWQgdHlwZXMhICovCiAgICAgICAgICAgIHJldHVybiBTRExfU2V0RXJyb3IoIlVuc3VwcG9ydGVkIGF1ZGlvIGZvcm1hdCIpOwogICAgICAgIH0KICAgIH0KICAgIHRoaXMtPmhpZGRlbi0+YXVkaW9fZm10ID0gdGhpcy0+c3BlYy5mb3JtYXQ7CgogICAgdGhpcy0+aGlkZGVuLT51bGF3X29ubHkgPSAwOyAgICAvKiBtb2Rlcm4gU3VucyBkbyBzdXBwb3J0IGxpbmVhciBhdWRpbyAqLwojaWZkZWYgQVVESU9fU0VUSU5GTwogICAgZm9yICg7OykgewogICAgICAgIGF1ZGlvX2luZm9fdCBpbmZvOwogICAgICAgIEFVRElPX0lOSVRJTkZPKCZpbmZvKTsgIC8qIGluaXQgYWxsIGZpZWxkcyB0byAibm8gY2hhbmdlIiAqLwoKICAgICAgICAvKiBUcnkgdG8gc2V0IHRoZSByZXF1ZXN0ZWQgc2V0dGluZ3MgKi8KICAgICAgICBpbmZvLnBsYXkuc2FtcGxlX3JhdGUgPSB0aGlzLT5zcGVjLmZyZXE7CiAgICAgICAgaW5mby5wbGF5LmNoYW5uZWxzID0gdGhpcy0+c3BlYy5jaGFubmVsczsKICAgICAgICBpbmZvLnBsYXkucHJlY2lzaW9uID0gKGVuYyA9PSBBVURJT19FTkNPRElOR19VTEFXKQogICAgICAgICAgICA/IDggOiB0aGlzLT5zcGVjLmZvcm1hdCAmIDB4ZmY7CiAgICAgICAgaW5mby5wbGF5LmVuY29kaW5nID0gZW5jOwogICAgICAgIGlmIChpb2N0bCh0aGlzLT5oaWRkZW4tPmF1ZGlvX2ZkLCBBVURJT19TRVRJTkZPLCAmaW5mbykgPT0gMCkgewoKICAgICAgICAgICAgLyogQ2hlY2sgdG8gYmUgc3VyZSB3ZSBnb3Qgd2hhdCB3ZSB3YW50ZWQgKi8KICAgICAgICAgICAgaWYgKGlvY3RsKHRoaXMtPmhpZGRlbi0+YXVkaW9fZmQsIEFVRElPX0dFVElORk8sICZpbmZvKSA8IDApIHsKICAgICAgICAgICAgICAgIHJldHVybiBTRExfU2V0RXJyb3IoIkVycm9yIGdldHRpbmcgYXVkaW8gcGFyYW1ldGVyczogJXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcihlcnJubykpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChpbmZvLnBsYXkuZW5jb2RpbmcgPT0gZW5jCiAgICAgICAgICAgICAgICAmJiBpbmZvLnBsYXkucHJlY2lzaW9uID09ICh0aGlzLT5zcGVjLmZvcm1hdCAmIDB4ZmYpCiAgICAgICAgICAgICAgICAmJiBpbmZvLnBsYXkuY2hhbm5lbHMgPT0gdGhpcy0+c3BlYy5jaGFubmVscykgewogICAgICAgICAgICAgICAgLyogWW93ISBBbGwgc2VlbXMgdG8gYmUgd2VsbCEgKi8KICAgICAgICAgICAgICAgIHRoaXMtPnNwZWMuZnJlcSA9IGluZm8ucGxheS5zYW1wbGVfcmF0ZTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBzd2l0Y2ggKGVuYykgewogICAgICAgIGNhc2UgQVVESU9fRU5DT0RJTkdfTElORUFSODoKICAgICAgICAgICAgLyogdW5zaWduZWQgOGJpdCBhcHBhcmVudGx5IG5vdCBzdXBwb3J0ZWQgaGVyZSAqLwogICAgICAgICAgICBlbmMgPSBBVURJT19FTkNPRElOR19MSU5FQVI7CiAgICAgICAgICAgIHRoaXMtPnNwZWMuZm9ybWF0ID0gQVVESU9fUzE2U1lTOwogICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgIC8qIHRyeSBhZ2FpbiAqLwoKICAgICAgICBjYXNlIEFVRElPX0VOQ09ESU5HX0xJTkVBUjoKICAgICAgICAgICAgLyogbGluZWFyIDE2Yml0IGRpZG4ndCB3b3JrIGVpdGhlciwgcmVzb3J0IHRvILUtbGF3ICovCiAgICAgICAgICAgIGVuYyA9IEFVRElPX0VOQ09ESU5HX1VMQVc7CiAgICAgICAgICAgIHRoaXMtPnNwZWMuY2hhbm5lbHMgPSAxOwogICAgICAgICAgICB0aGlzLT5zcGVjLmZyZXEgPSA4MDAwOwogICAgICAgICAgICB0aGlzLT5zcGVjLmZvcm1hdCA9IEFVRElPX1U4OwogICAgICAgICAgICB0aGlzLT5oaWRkZW4tPnVsYXdfb25seSA9IDE7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAvKiBvaCB3ZWxsLi4uICovCiAgICAgICAgICAgIHJldHVybiBTRExfU2V0RXJyb3IoIkVycm9yIHNldHRpbmcgYXVkaW8gcGFyYW1ldGVyczogJXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKGVycm5vKSk7CiAgICAgICAgfQogICAgfQojZW5kaWYgLyogQVVESU9fU0VUSU5GTyAqLwogICAgdGhpcy0+aGlkZGVuLT53cml0dGVuID0gMDsKCiAgICAvKiBXZSBjYW4gYWN0dWFsbHkgY29udmVydCBvbi10aGUtZmx5IHRvIFUtTGF3ICovCiAgICBpZiAodGhpcy0+aGlkZGVuLT51bGF3X29ubHkpIHsKICAgICAgICB0aGlzLT5zcGVjLmZyZXEgPSBkZXNpcmVkX2ZyZXE7CiAgICAgICAgdGhpcy0+aGlkZGVuLT5mcmFnc2l6ZSA9ICh0aGlzLT5zcGVjLnNhbXBsZXMgKiAxMDAwKSAvCiAgICAgICAgICAgICh0aGlzLT5zcGVjLmZyZXEgLyA4KTsKICAgICAgICB0aGlzLT5oaWRkZW4tPmZyZXF1ZW5jeSA9IDg7CiAgICAgICAgdGhpcy0+aGlkZGVuLT51bGF3X2J1ZiA9IChVaW50OCAqKSBTRExfbWFsbG9jKHRoaXMtPmhpZGRlbi0+ZnJhZ3NpemUpOwogICAgICAgIGlmICh0aGlzLT5oaWRkZW4tPnVsYXdfYnVmID09IE5VTEwpIHsKICAgICAgICAgICAgcmV0dXJuIFNETF9PdXRPZk1lbW9yeSgpOwogICAgICAgIH0KICAgICAgICB0aGlzLT5zcGVjLmNoYW5uZWxzID0gMTsKICAgIH0gZWxzZSB7CiAgICAgICAgdGhpcy0+aGlkZGVuLT5mcmFnc2l6ZSA9IHRoaXMtPnNwZWMuc2FtcGxlczsKICAgICAgICB0aGlzLT5oaWRkZW4tPmZyZXF1ZW5jeSA9IHRoaXMtPnNwZWMuZnJlcSAvIDEwMDA7CiAgICB9CiNpZmRlZiBERUJVR19BVURJTwogICAgZnByaW50ZihzdGRlcnIsICJBdWRpbyBkZXZpY2UgJXMgVS1MYXcgb25seVxuIiwKICAgICAgICAgICAgdGhpcy0+aGlkZGVuLT51bGF3X29ubHkgPyAiaXMiIDogImlzIG5vdCIpOwogICAgZnByaW50ZihzdGRlcnIsICJmb3JtYXQ9MHgleCBjaGFuPSVkIGZyZXE9JWRcbiIsCiAgICAgICAgICAgIHRoaXMtPnNwZWMuZm9ybWF0LCB0aGlzLT5zcGVjLmNoYW5uZWxzLCB0aGlzLT5zcGVjLmZyZXEpOwojZW5kaWYKCiAgICAvKiBVcGRhdGUgdGhlIGZyYWdtZW50IHNpemUgYXMgc2l6ZSBpbiBieXRlcyAqLwogICAgU0RMX0NhbGN1bGF0ZUF1ZGlvU3BlYygmdGhpcy0+c3BlYyk7CgogICAgLyogQWxsb2NhdGUgbWl4aW5nIGJ1ZmZlciAqLwogICAgdGhpcy0+aGlkZGVuLT5taXhidWYgPSAoVWludDggKikgU0RMX0FsbG9jQXVkaW9NZW0odGhpcy0+c3BlYy5zaXplKTsKICAgIGlmICh0aGlzLT5oaWRkZW4tPm1peGJ1ZiA9PSBOVUxMKSB7CiAgICAgICAgcmV0dXJuIFNETF9PdXRPZk1lbW9yeSgpOwogICAgfQogICAgU0RMX21lbXNldCh0aGlzLT5oaWRkZW4tPm1peGJ1ZiwgdGhpcy0+c3BlYy5zaWxlbmNlLCB0aGlzLT5zcGVjLnNpemUpOwoKICAgIC8qIFdlJ3JlIHJlYWR5IHRvIHJvY2sgYW5kIHJvbGwuIDotKSAqLwogICAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qIFRoaXMgZnVuY3Rpb24gKHNuZDJhdSgpKSBjb3B5cmlnaHRlZDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qICAgICAgQ29weXJpZ2h0IDE5ODkgYnkgUmljaCBHb3BzdGVpbiBhbmQgSGFycmlzIENvcnBvcmF0aW9uICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSAgICovCi8qICAgICAgYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgICAgICAgICovCi8qICAgICAgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgICAgICAgICovCi8qICAgICAgYXBwZWFycyBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCAgICovCi8qICAgICAgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgICovCi8qICAgICAgdGhhdCB0aGUgbmFtZSBvZiBSaWNoIEdvcHN0ZWluIGFuZCBIYXJyaXMgQ29ycG9yYXRpb24gbm90IGJlICAgICovCi8qICAgICAgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gICAgICovCi8qICAgICAgb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gICAgICovCi8qICAgICAgUmljaCBHb3BzdGVpbiBhbmQgSGFycmlzIENvcnBvcmF0aW9uIG1ha2Ugbm8gcmVwcmVzZW50YXRpb25zICAgICovCi8qICAgICAgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiAgSXQgICAgICovCi8qICAgICAgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4gICAgICAgICAgICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpzdGF0aWMgVWludDgKc25kMmF1KGludCBzYW1wbGUpCnsKCiAgICBpbnQgbWFzazsKCiAgICBpZiAoc2FtcGxlIDwgMCkgewogICAgICAgIHNhbXBsZSA9IC1zYW1wbGU7CiAgICAgICAgbWFzayA9IDB4N2Y7CiAgICB9IGVsc2UgewogICAgICAgIG1hc2sgPSAweGZmOwogICAgfQoKICAgIGlmIChzYW1wbGUgPCAzMikgewogICAgICAgIHNhbXBsZSA9IDB4RjAgfCAoMTUgLSBzYW1wbGUgLyAyKTsKICAgIH0gZWxzZSBpZiAoc2FtcGxlIDwgOTYpIHsKICAgICAgICBzYW1wbGUgPSAweEUwIHwgKDE1IC0gKHNhbXBsZSAtIDMyKSAvIDQpOwogICAgfSBlbHNlIGlmIChzYW1wbGUgPCAyMjQpIHsKICAgICAgICBzYW1wbGUgPSAweEQwIHwgKDE1IC0gKHNhbXBsZSAtIDk2KSAvIDgpOwogICAgfSBlbHNlIGlmIChzYW1wbGUgPCA0ODApIHsKICAgICAgICBzYW1wbGUgPSAweEMwIHwgKDE1IC0gKHNhbXBsZSAtIDIyNCkgLyAxNik7CiAgICB9IGVsc2UgaWYgKHNhbXBsZSA8IDk5MikgewogICAgICAgIHNhbXBsZSA9IDB4QjAgfCAoMTUgLSAoc2FtcGxlIC0gNDgwKSAvIDMyKTsKICAgIH0gZWxzZSBpZiAoc2FtcGxlIDwgMjAxNikgewogICAgICAgIHNhbXBsZSA9IDB4QTAgfCAoMTUgLSAoc2FtcGxlIC0gOTkyKSAvIDY0KTsKICAgIH0gZWxzZSBpZiAoc2FtcGxlIDwgNDA2NCkgewogICAgICAgIHNhbXBsZSA9IDB4OTAgfCAoMTUgLSAoc2FtcGxlIC0gMjAxNikgLyAxMjgpOwogICAgfSBlbHNlIGlmIChzYW1wbGUgPCA4MTYwKSB7CiAgICAgICAgc2FtcGxlID0gMHg4MCB8ICgxNSAtIChzYW1wbGUgLSA0MDY0KSAvIDI1Nik7CiAgICB9IGVsc2UgewogICAgICAgIHNhbXBsZSA9IDB4ODA7CiAgICB9CiAgICByZXR1cm4gKG1hc2sgJiBzYW1wbGUpOwp9CgpzdGF0aWMgaW50ClNVTkFVRElPX0luaXQoU0RMX0F1ZGlvRHJpdmVySW1wbCAqIGltcGwpCnsKICAgIC8qIFNldCB0aGUgZnVuY3Rpb24gcG9pbnRlcnMgKi8KICAgIGltcGwtPkRldGVjdERldmljZXMgPSBTVU5BVURJT19EZXRlY3REZXZpY2VzOwogICAgaW1wbC0+T3BlbkRldmljZSA9IFNVTkFVRElPX09wZW5EZXZpY2U7CiAgICBpbXBsLT5QbGF5RGV2aWNlID0gU1VOQVVESU9fUGxheURldmljZTsKICAgIGltcGwtPldhaXREZXZpY2UgPSBTVU5BVURJT19XYWl0RGV2aWNlOwogICAgaW1wbC0+R2V0RGV2aWNlQnVmID0gU1VOQVVESU9fR2V0RGV2aWNlQnVmOwogICAgaW1wbC0+Q2xvc2VEZXZpY2UgPSBTVU5BVURJT19DbG9zZURldmljZTsKCiAgICBpbXBsLT5BbGxvd3NBcmJpdHJhcnlEZXZpY2VOYW1lcyA9IDE7CgogICAgcmV0dXJuIDE7IC8qIHRoaXMgYXVkaW8gdGFyZ2V0IGlzIGF2YWlsYWJsZS4gKi8KfQoKQXVkaW9Cb290U3RyYXAgU1VOQVVESU9fYm9vdHN0cmFwID0gewogICAgImF1ZGlvIiwgIlVOSVggL2Rldi9hdWRpbyBpbnRlcmZhY2UiLCBTVU5BVURJT19Jbml0LCAwCn07CgojZW5kaWYgLyogU0RMX0FVRElPX0RSSVZFUl9TVU5BVURJTyAqLwoKLyogdmk6IHNldCB0cz00IHN3PTQgZXhwYW5kdGFiOiAqLwo=