LyoKICogQ29weXJpZ2h0IChDKSAyMDEwIE5YUCBTZW1pY29uZHVjdG9ycwogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCgovKiEKICogXGZpbGUgIHBoRnJpTmZjX0ludE5kZWYuYwogKiBcYnJpZWYgTkZDIE5kZWYgSW50ZXJuYWwgTWFwcGluZyBGaWxlLgogKgogKiBQcm9qZWN0OiBORkMtRlJJCiAqCiAqICREYXRlOiBNb24gU2VwIDE1IDE1OjA5OjMzIDIwMDggJAogKiAkQXV0aG9yOiBpbmcwODIwNSAkCiAqICRSZXZpc2lvbjogMS41ICQKICogJEFsaWFzZXM6IE5GQ19GUkkxLjFfV0s4MzhfUjlfUFJFUDIsTkZDX0ZSSTEuMV9XSzgzOF9SOV8xLE5GQ19GUkkxLjFfV0s4NDBfUjEwX1BSRVAxLE5GQ19GUkkxLjFfV0s4NDBfUjEwXzEsTkZDX0ZSSTEuMV9XSzg0Ml9SMTFfUFJFUDEsTkZDX0ZSSTEuMV9XSzg0Ml9SMTFfUFJFUDIsTkZDX0ZSSTEuMV9XSzg0Ml9SMTFfMSxORkNfRlJJMS4xX1dLODQ0X1BSRVAxLE5GQ19GUkkxLjFfV0s4NDRfUjEyXzEsTkZDX0ZSSTEuMV9XSzg0Nl9QUkVQMSxORkNfRlJJMS4xX1dLODQ2X1IxM18xLE5GQ19GUkkxLjFfV0s4NDhfUFJFUDEsTkZDX0ZSSTEuMV9XSzg0OF9SMTRfMSxORkNfRlJJMS4xX1dLODUwX1BBQ0sxLE5GQ19GUkkxLjFfV0s4NTFfUFJFUDEsTkZDX0ZSSTEuMV9XSzg1MF9SMTVfMSxORkNfRlJJMS4xX1dLOTAyX1BSRVAxLE5GQ19GUkkxLjFfV0s5MDJfUjE2XzEsTkZDX0ZSSTEuMV9XSzkwNF9QUkVQMSxORkNfRlJJMS4xX1dLOTA0X1IxN18xLE5GQ19GUkkxLjFfV0s5MDZfUjE4XzEsTkZDX0ZSSTEuMV9XSzkwOF9QUkVQMSxORkNfRlJJMS4xX1dLOTA4X1IxOV8xLE5GQ19GUkkxLjFfV0s5MTBfUFJFUDEsTkZDX0ZSSTEuMV9XSzkxMF9SMjBfMSxORkNfRlJJMS4xX1dLOTEyX1BSRVAxLE5GQ19GUkkxLjFfV0s5MTJfUjIxXzEsTkZDX0ZSSTEuMV9XSzkxNF9QUkVQMSxORkNfRlJJMS4xX1dLOTE0X1IyMl8xLE5GQ19GUkkxLjFfV0s5MTRfUjIyXzIsTkZDX0ZSSTEuMV9XSzkxNl9SMjNfMSxORkNfRlJJMS4xX1dLOTE4X1IyNF8xLE5GQ19GUkkxLjFfV0s5MjBfUFJFUDEsTkZDX0ZSSTEuMV9XSzkyMF9SMjVfMSxORkNfRlJJMS4xX1dLOTIyX1BSRVAxLE5GQ19GUkkxLjFfV0s5MjJfUjI2XzEsTkZDX0ZSSTEuMV9XSzkyNF9QUkVQMSxORkNfRlJJMS4xX1dLOTI0X1IyN18xLE5GQ19GUkkxLjFfV0s5MjZfUjI4XzEsTkZDX0ZSSTEuMV9XSzkyOF9SMjlfMSxORkNfRlJJMS4xX1dLOTMwX1IzMF8xLE5GQ19GUkkxLjFfV0s5MzRfUFJFUF8xLE5GQ19GUkkxLjFfV0s5MzRfUjMxXzEsTkZDX0ZSSTEuMV9XSzk0MV9QUkVQMSxORkNfRlJJMS4xX1dLOTQxX1BSRVAyLE5GQ19GUkkxLjFfV0s5NDFfMSxORkNfRlJJMS4xX1dLOTQzX1IzMl8xLE5GQ19GUkkxLjFfV0s5NDlfUFJFUDEsTkZDX0ZSSTEuMV9XSzk0M19SMzJfMTAsTkZDX0ZSSTEuMV9XSzk0M19SMzJfMTMsTkZDX0ZSSTEuMV9XSzk0M19SMzJfMTQsTkZDX0ZSSTEuMV9XSzEwMDdfUjMzXzEsTkZDX0ZSSTEuMV9XSzEwMDdfUjMzXzQsTkZDX0ZSSTEuMV9XSzEwMTdfUFJFUDEsTkZDX0ZSSTEuMV9XSzEwMTdfUjM0XzEsTkZDX0ZSSTEuMV9XSzEwMTdfUjM0XzIsTkZDX0ZSSTEuMV9XSzEwMjNfUjM1XzEgJAogKgogKi8KCiNpbmNsdWRlIDxwaEZyaU5mY19OZGVmTWFwLmg+CiNpbmNsdWRlIDxwaEZyaU5mY19JbnROZGVmTWFwLmg+CgojaWZuZGVmIFBIX0ZSSU5GQ19NQVBfTUlGQVJFVUxfRElTQUJMRUQKI2luY2x1ZGUgPHBoRnJpTmZjX01pZmFyZVVMTWFwLmg+CiNlbmRpZiAgLyogUEhfRlJJTkZDX01BUF9NSUZBUkVVTF9ESVNBQkxFRCovCgojaWZuZGVmIFBIX0ZSSU5GQ19NQVBfTUlGQVJFU1REX0RJU0FCTEVECiNpbmNsdWRlIDxwaEZyaU5mY19NaWZhcmVTdGRNYXAuaD4KI2VuZGlmICAvKiBQSF9GUklORkNfTUFQX01JRkFSRVNURF9ESVNBQkxFRCAqLwoKI2lmbmRlZiBQSF9GUklORkNfTUFQX0RFU0ZJUkVfRElTQUJMRUQKI2luY2x1ZGUgPHBoRnJpTmZjX0Rlc2ZpcmVNYXAuaD4KI2VuZGlmICAvKiBQSF9GUklORkNfTUFQX0RFU0ZJUkVfRElTQUJMRUQgKi8KCiNpZm5kZWYgUEhfRlJJTkZDX01BUF9GRUxJQ0FfRElTQUJMRUQKI2luY2x1ZGUgPHBoRnJpTmZjX0ZlbGljYU1hcC5oPgojZW5kaWYgIC8qIFBIX0ZSSU5GQ19NQVBfRkVMSUNBX0RJU0FCTEVEICovCgojaW5jbHVkZSA8cGhGcmlOZmNfT3ZySGFsLmg+CgovKiEgXGluZ3JvdXAgZ3JwX2ZpbGVfYXR0cmlidXRlcwogKiAgXG5hbWUgTkRFRiBNYXBwaW5nCiAqCiAqIEZpbGU6IFxyZWYgcGhGcmlfSW50TmRlZk1hcC5jCiAqICAgICAgIFRoaXMgZmlsZSBoYXMgZnVuY3Rpb25zIHdoaWNoIGFyZSB1c2VkIGNvbW1vbiBhY3Jvc3MgYWxsIHRoZQogKiAgICAgICB0eXAxL3R5cGUyL3R5cGUzL3R5cGU0IHRhZ3MuCiAqCiAqLwovKkB7Ki8KI2RlZmluZSBQSEZSSU5GQ05ERUZNQVBfRklMRVJFVklTSU9OICIkUmV2aXNpb246IDEuNSAkIgojZGVmaW5lIFBIRlJJTkZDTkRFRk1BUF9GSUxFQUxJQVNFUyAgIiRBbGlhc2VzOiBORkNfRlJJMS4xX1dLODM4X1I5X1BSRVAyLE5GQ19GUkkxLjFfV0s4MzhfUjlfMSxORkNfRlJJMS4xX1dLODQwX1IxMF9QUkVQMSxORkNfRlJJMS4xX1dLODQwX1IxMF8xLE5GQ19GUkkxLjFfV0s4NDJfUjExX1BSRVAxLE5GQ19GUkkxLjFfV0s4NDJfUjExX1BSRVAyLE5GQ19GUkkxLjFfV0s4NDJfUjExXzEsTkZDX0ZSSTEuMV9XSzg0NF9QUkVQMSxORkNfRlJJMS4xX1dLODQ0X1IxMl8xLE5GQ19GUkkxLjFfV0s4NDZfUFJFUDEsTkZDX0ZSSTEuMV9XSzg0Nl9SMTNfMSxORkNfRlJJMS4xX1dLODQ4X1BSRVAxLE5GQ19GUkkxLjFfV0s4NDhfUjE0XzEsTkZDX0ZSSTEuMV9XSzg1MF9QQUNLMSxORkNfRlJJMS4xX1dLODUxX1BSRVAxLE5GQ19GUkkxLjFfV0s4NTBfUjE1XzEsTkZDX0ZSSTEuMV9XSzkwMl9QUkVQMSxORkNfRlJJMS4xX1dLOTAyX1IxNl8xLE5GQ19GUkkxLjFfV0s5MDRfUFJFUDEsTkZDX0ZSSTEuMV9XSzkwNF9SMTdfMSxORkNfRlJJMS4xX1dLOTA2X1IxOF8xLE5GQ19GUkkxLjFfV0s5MDhfUFJFUDEsTkZDX0ZSSTEuMV9XSzkwOF9SMTlfMSxORkNfRlJJMS4xX1dLOTEwX1BSRVAxLE5GQ19GUkkxLjFfV0s5MTBfUjIwXzEsTkZDX0ZSSTEuMV9XSzkxMl9QUkVQMSxORkNfRlJJMS4xX1dLOTEyX1IyMV8xLE5GQ19GUkkxLjFfV0s5MTRfUFJFUDEsTkZDX0ZSSTEuMV9XSzkxNF9SMjJfMSxORkNfRlJJMS4xX1dLOTE0X1IyMl8yLE5GQ19GUkkxLjFfV0s5MTZfUjIzXzEsTkZDX0ZSSTEuMV9XSzkxOF9SMjRfMSxORkNfRlJJMS4xX1dLOTIwX1BSRVAxLE5GQ19GUkkxLjFfV0s5MjBfUjI1XzEsTkZDX0ZSSTEuMV9XSzkyMl9QUkVQMSxORkNfRlJJMS4xX1dLOTIyX1IyNl8xLE5GQ19GUkkxLjFfV0s5MjRfUFJFUDEsTkZDX0ZSSTEuMV9XSzkyNF9SMjdfMSxORkNfRlJJMS4xX1dLOTI2X1IyOF8xLE5GQ19GUkkxLjFfV0s5MjhfUjI5XzEsTkZDX0ZSSTEuMV9XSzkzMF9SMzBfMSxORkNfRlJJMS4xX1dLOTM0X1BSRVBfMSxORkNfRlJJMS4xX1dLOTM0X1IzMV8xLE5GQ19GUkkxLjFfV0s5NDFfUFJFUDEsTkZDX0ZSSTEuMV9XSzk0MV9QUkVQMixORkNfRlJJMS4xX1dLOTQxXzEsTkZDX0ZSSTEuMV9XSzk0M19SMzJfMSxORkNfRlJJMS4xX1dLOTQ5X1BSRVAxLE5GQ19GUkkxLjFfV0s5NDNfUjMyXzEwLE5GQ19GUkkxLjFfV0s5NDNfUjMyXzEzLE5GQ19GUkkxLjFfV0s5NDNfUjMyXzE0LE5GQ19GUkkxLjFfV0sxMDA3X1IzM18xLE5GQ19GUkkxLjFfV0sxMDA3X1IzM180LE5GQ19GUkkxLjFfV0sxMDE3X1BSRVAxLE5GQ19GUkkxLjFfV0sxMDE3X1IzNF8xLE5GQ19GUkkxLjFfV0sxMDE3X1IzNF8yLE5GQ19GUkkxLjFfV0sxMDIzX1IzNV8xICQiCi8qQH0qLwoKCi8qIFxub3RlICAgIFRoaXMgZnVuY3Rpb24gaGFzIHRvIGJlIGNhbGxlZCBhdCB0aGUgYmVnaW5uaW5nLCBhZnRlciBjcmVhdGluZyBhbiAKICogICAgICAgICAgaW5zdGFuY2Ugb2YgXHJlZiBwaEZyaU5mY19OZGVmTWFwX3QgLiBVc2UgdGhpcyBmdW5jdGlvbiB0byByZXNldCAKICogICAgICAgICAgdGhlIGluc3RhbmNlIGFuZC9vciBzd2l0Y2ggdG8gYSBkaWZmZXJlbnQgdW5kZXJseWluZyBkZXZpY2UgKAogKiAgICAgICAgICBkaWZmZXJlbnQgTkZDIGRldmljZSBvciBkZXZpY2UgbW9kZSwgb3IgZGlmZmVyZW50IFJlbW90ZSBEZXZpY2UpLgogKi8KCgojaWYgMApORkNTVEFUVVMgcGhGcmlOZmNfQ2hrQW5kUGFyc2VUTFYocGhGcmlOZmNfTmRlZk1hcF90ICAgICpOZGVmTWFwKQp7CiAgICBORkNTVEFUVVMgc3RhdHVzID0gTkZDU1RBVFVTX1BFTkRJTkc7CgogICAgc3dpdGNoICggTmRlZk1hcC0+Q2FyZFR5cGUgKQogICAgewogICAgICAgICNpZm5kZWYgUEhfRlJJTkZDX01BUF9NSUZBUkVVTF9ESVNBQkxFRAogICAgICAgICAgICBjYXNlICBQSF9GUklORkNfTkRFRk1BUF9NSUZBUkVfVUxfQ0FSRCA6CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIAogICAgICAgICAgICBicmVhazsKI2VuZGlmIC8qIFBIX0ZSSU5GQ19NQVBfTUlGQVJFVUxfRElTQUJMRUQgKi8KCiNpZm5kZWYgUEhfRlJJTkZDX01BUF9ERVNGSVJFX0RJU0FCTEVECiAgICAgICAgICAgIGNhc2UgUEhfRlJJTkZDX05ERUZNQVBfSVNPMTQ0NDNfNEFfQ0FSRCA6CiAgICAgICAgICAgICAgICBzdGF0dXMgPSBwaEZyaU5mY19EZXNmX0Noa0FuZFBhcnNlVExWKE5kZWZNYXAsUEhfRlJJTkZDX05ERUZNQVBfREVTRl9UTFZfSU5ERVgpOwogICAgICAgICAgICAgICAgcmV0dXJuIChzdGF0dXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgYnJlYWs7CiNlbmRpZiAgLyogUEhfRlJJTkZDX01BUF9ERVNGSVJFX0RJU0FCTEVEICovCgojaWZuZGVmIFBIX0ZSSU5GQ19NQVBfTUlGQVJFU1REX0RJU0FCTEVECiAgICAgICAgICAgIGNhc2UgIFBIX0ZSSU5GQ19OREVGTUFQX01JRkFSRV9TVERfMUtfQ0FSRCA6CiAgICAgICAgICAgIGNhc2UgIFBIX0ZSSU5GQ19OREVGTUFQX01JRkFSRV9TVERfNEtfQ0FSRCA6CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgYnJlYWs7CiNlbmRpZiAgLyogUEhfRlJJTkZDX01BUF9NSUZBUkVTVERfRElTQUJMRUQgKi8KCiNpZm5kZWYgUEhfRlJJTkZDX01BUF9GRUxJQ0FfRElTQUJMRUQKICAgICAgICAgICAgY2FzZSBQSF9GUklORkNfTkRFRk1BUF9GRUxJQ0FfU01BUlRfQ0FSRCA6CiAgICAgICAgICAgICAgICA7CiAgICAgICAgICAgIGJyZWFrOwojZW5kaWYgIC8qIFBIX0ZSSU5GQ19NQVBfRkVMSUNBX0RJU0FCTEVEICovCgogICAgICAgICAgICBkZWZhdWx0IDogCiAgICAgICAgICAgICAgICAvKiAgVW5rbm93biBjYXJkIHR5cGUuIFJldHVybiBlcnJvciAqLwogICAgICAgICAgICAgICAgc3RhdHVzID0gUEhORkNTVFZBTChDSURfRlJJX05GQ19OREVGX01BUCxcCiAgICAgICAgICAgICAgICAgICAgICAgIE5GQ1NUQVRVU19JTlZBTElEX1JFTU9URV9ERVZJQ0UpOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgIGJyZWFrOwogICAgIH0KICAgIAogICAgcmV0dXJuICggc3RhdHVzKTsKfQojZW5kaWYKCk5GQ1NUQVRVUyBwaEZyaU5mY19OZGVmTWFwX1NldENhcmRTdGF0ZShwaEZyaU5mY19OZGVmTWFwX3QgICAqTmRlZk1hcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgICAgIExlbmd0aCkKewogICAgTkZDU1RBVFVTICAgUmVzdWx0ID0gTkZDU1RBVFVTX1NVQ0NFU1M7CiAgICBpZihMZW5ndGggPT0gUEhfRlJJTkZDX05ERUZNQVBfTUZVTF9WQUwwKQogICAgewogICAgICAgIE5kZWZNYXAtPkNhcmRTdGF0ZSA9KHVpbnQ4X3QpICgoKE5kZWZNYXAtPkNhcmRTdGF0ZSA9PSAKICAgICAgICAgICAgICAgICAgICAgICAgUEhfTkRFRk1BUF9DQVJEX1NUQVRFX1JFQURfT05MWSkgfHwgCiAgICAgICAgICAgICAgICAgICAgICAgIChOZGVmTWFwLT5DYXJkU3RhdGUgPT0gCiAgICAgICAgICAgICAgICAgICAgICAgIFBIX05ERUZNQVBfQ0FSRF9TVEFURV9JTlZBTElEKSk/CiAgICAgICAgICAgICAgICAgICAgICAgIFBIX05ERUZNQVBfQ0FSRF9TVEFURV9JTlZBTElEOgogICAgICAgICAgICAgICAgICAgICAgICBOZGVmTWFwLT5DYXJkU3RhdGUpOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIHN3aXRjaChOZGVmTWFwLT5DYXJkU3RhdGUpCiAgICAgICAgewogICAgICAgICAgICBjYXNlIFBIX05ERUZNQVBfQ0FSRF9TVEFURV9JTklUSUFMSVpFRDoKICAgICAgICAgICAgICAgIE5kZWZNYXAtPkNhcmRTdGF0ZSA9KHVpbnQ4X3QpICgoTmRlZk1hcC0+Q2FyZFN0YXRlID09IAogICAgICAgICAgICAgICAgICAgIFBIX05ERUZNQVBfQ0FSRF9TVEFURV9JTlZBTElEKT8KICAgICAgICAgICAgICAgICAgICBOZGVmTWFwLT5DYXJkU3RhdGU6CiAgICAgICAgICAgICAgICAgICAgUEhfTkRFRk1BUF9DQVJEX1NUQVRFX1JFQURfV1JJVEUpOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgUEhfTkRFRk1BUF9DQVJEX1NUQVRFX1JFQURfT05MWToKICAgICAgICAgICAgICAgIE5kZWZNYXAtPkNhcmRTdGF0ZSA9KHVpbnQ4X3QpICgoTmRlZk1hcC0+Q2FyZFN0YXRlID09IAogICAgICAgICAgICAgICAgICAgIFBIX05ERUZNQVBfQ0FSRF9TVEFURV9JTlZBTElEKT8KICAgICAgICAgICAgICAgICAgICBOZGVmTWFwLT5DYXJkU3RhdGU6CiAgICAgICAgICAgICAgICAgICAgUEhfTkRFRk1BUF9DQVJEX1NUQVRFX1JFQURfT05MWSk7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBQSF9OREVGTUFQX0NBUkRfU1RBVEVfUkVBRF9XUklURToKICAgICAgICAgICAgICAgIE5kZWZNYXAtPkNhcmRTdGF0ZSA9KHVpbnQ4X3QpICgoTmRlZk1hcC0+Q2FyZFN0YXRlID09IAogICAgICAgICAgICAgICAgICAgIFBIX05ERUZNQVBfQ0FSRF9TVEFURV9JTlZBTElEKT8KICAgICAgICAgICAgICAgICAgICBOZGVmTWFwLT5DYXJkU3RhdGU6CiAgICAgICAgICAgICAgICAgICAgUEhfTkRFRk1BUF9DQVJEX1NUQVRFX1JFQURfV1JJVEUpOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICBOZGVmTWFwLT5DYXJkU3RhdGUgPSBQSF9OREVGTUFQX0NBUkRfU1RBVEVfSU5WQUxJRDsKICAgICAgICAgICAgICAgIFJlc3VsdCA9IFBITkZDU1RWQUwoQ0lEX0ZSSV9ORkNfTkRFRl9NQVAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTkZDU1RBVFVTX05PX05ERUZfU1VQUE9SVCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0KICAgIFJlc3VsdCA9ICgoTmRlZk1hcC0+Q2FyZFN0YXRlID09IAogICAgICAgICAgICAgICAgUEhfTkRFRk1BUF9DQVJEX1NUQVRFX0lOVkFMSUQpPwogICAgICAgICAgICAgICAgUEhORkNTVFZBTChDSURfRlJJX05GQ19OREVGX01BUCwgCiAgICAgICAgICAgICAgICBORkNTVEFUVVNfTk9fTkRFRl9TVVBQT1JUKToKICAgICAgICAgICAgICAgIFJlc3VsdCk7CiAgICByZXR1cm4gUmVzdWx0Owp9CgpORkNTVEFUVVMgICBwaEZyaU5mY19OZGVmTWFwX0NoZWNrU3BlY1ZlcnNpb24ocGhGcmlOZmNfTmRlZk1hcF90ICpOZGVmTWFwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IFZlcnNpb25JbmRleCkKewogICAgTkZDU1RBVFVTIHN0YXR1cyA9IE5GQ1NUQVRVU19TVUNDRVNTOwoKICAgIHVpbnQ4X3QgVDNUVmVyTm8gPSBOZGVmTWFwLT5TZW5kUmVjdkJ1ZltWZXJzaW9uSW5kZXhdOwoKICAgIGlmICggVDNUVmVyTm8gPT0gMCApCiAgICB7CiAgICAgICAgLypSZXR1cm4gU3RhdHVzIEVycm9yIJMgSW52YWxpZCBGb3JtYXSUKi8KICAgICAgICBzdGF0dXMgPSBQSE5GQ1NUVkFMKENJRF9GUklfTkZDX05ERUZfTUFQLE5GQ1NUQVRVU19JTlZBTElEX0ZPUk1BVCk7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgLyogY2FsY3VsYXRlIHRoZSBtYWpvciBhbmQgbWlub3IgdmVyc2lvbiBudW1iZXIgb2YgVDNWZXJObyAqLwogICAgICAgIGlmKCAoKCBQSF9ORkNGUklfTkRFRk1BUF9ORkNERVZfTUFKT1JfVkVSX05VTSA9PSAKICAgICAgICAgICAgICAgIFBIX05GQ0ZSSV9OREVGTUFQX0dFVF9NQUpPUl9UQUdfVkVSTk8oVDNUVmVyTm8gKSApJiYKICAgICAgICAgICAgKCBQSF9ORkNGUklfTkRFRk1BUF9ORkNERVZfTUlOT1JfVkVSX05VTSA+PSAKICAgICAgICAgICAgICAgIFBIX05GQ0ZSSV9OREVGTUFQX0dFVF9NSU5PUl9UQUdfVkVSTk8oVDNUVmVyTm8pKSkgfHwKICAgICAgICAgICAgKCggUEhfTkZDRlJJX05ERUZNQVBfTkZDREVWX01BSk9SX1ZFUl9OVU0gPT0gCiAgICAgICAgICAgICAgICBQSF9ORkNGUklfTkRFRk1BUF9HRVRfTUFKT1JfVEFHX1ZFUk5PKFQzVFZlck5vICkgKSYmCiAgICAgICAgICAgICggUEhfTkZDRlJJX05ERUZNQVBfTkZDREVWX01JTk9SX1ZFUl9OVU0gPCAKICAgICAgICAgICAgICAgIFBIX05GQ0ZSSV9OREVGTUFQX0dFVF9NSU5PUl9UQUdfVkVSTk8oVDNUVmVyTm8pICkpKQogICAgICAgIHsKICAgICAgICAgICAgc3RhdHVzID0gUEhORkNTVFZBTChDSURfTkZDX05PTkUsTkZDU1RBVFVTX1NVQ0NFU1MpOwogICAgICAgIH0KICAgICAgICBlbHNlIAogICAgICAgIHsKICAgICAgICAgICAgaWYgKCggUEhfTkZDRlJJX05ERUZNQVBfTkZDREVWX01BSk9SX1ZFUl9OVU0gPAogICAgICAgICAgICAgICAgICAgIFBIX05GQ0ZSSV9OREVGTUFQX0dFVF9NQUpPUl9UQUdfVkVSTk8oVDNUVmVyTm8pICkgfHwKICAgICAgICAgICAgICAgKCBQSF9ORkNGUklfTkRFRk1BUF9ORkNERVZfTUFKT1JfVkVSX05VTSA+IAogICAgICAgICAgICAgICAgICAgIFBIX05GQ0ZSSV9OREVGTUFQX0dFVF9NQUpPUl9UQUdfVkVSTk8oVDNUVmVyTm8pKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc3RhdHVzID0gUEhORkNTVFZBTChDSURfRlJJX05GQ19OREVGX01BUCxORkNTVEFUVVNfSU5WQUxJRF9GT1JNQVQpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIChzdGF0dXMpOwp9Cg==