LyoKICogQ29weXJpZ2h0IChjKSAyMDA2IFN0ZWZhbiBE9nNpbmdlcgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EKICovCgojaW5jbHVkZSAiY29uZmlnLmgiCiNpbmNsdWRlICJ3aW5lL3BvcnQuaCIKI2luY2x1ZGUgIndpbmUvZGVidWcuaCIKCiNpbmNsdWRlIDxhc3NlcnQuaD4KI2luY2x1ZGUgPHN0ZGFyZy5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KCiNkZWZpbmUgQ09CSk1BQ1JPUwoKI2luY2x1ZGUgIndpbmRlZi5oIgojaW5jbHVkZSAid2luYmFzZS5oIgojaW5jbHVkZSAid2luZXJyb3IuaCIKI2luY2x1ZGUgIndpbmdkaS5oIgojaW5jbHVkZSAid2luZS9leGNlcHRpb24uaCIKCiNpbmNsdWRlICJkZHJhdy5oIgojaW5jbHVkZSAiZDNkLmgiCgojaW5jbHVkZSAiZGRyYXdfcHJpdmF0ZS5oIgoKV0lORV9ERUZBVUxUX0RFQlVHX0NIQU5ORUwoZDNkNyk7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNENzo6UXVlcnlJbnRlcmZhY2UKICoKICogUXVlcnlJbnRlcmZhY2UgaW1wbGVtZW50YXRpb24gd2l0aCB0aHVua3MgdG8gSURpcmVjdERyYXc3CiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJClRodW5rX0lEaXJlY3QzREltcGxfN19RdWVyeUludGVyZmFjZShJRGlyZWN0M0Q3ICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVGSUlEIHJlZmlpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKm9iaikKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdJbXBsLCBJRGlyZWN0M0Q3LCBpZmFjZSk7CiAgICBUUkFDRSgiKCVwKS0+KCVzLCVwKTogVGh1bmtpbmcgdG8gSURpcmVjdERyYXc3XG4iLCBUaGlzLCBkZWJ1Z3N0cl9ndWlkKHJlZmlpZCksIG9iaik7CgogICAgcmV0dXJuIElEaXJlY3REcmF3N19RdWVyeUludGVyZmFjZShJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0RHJhdzcpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZpaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iaik7Cn0KCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpUaHVua19JRGlyZWN0M0RJbXBsXzNfUXVlcnlJbnRlcmZhY2UoSURpcmVjdDNEMyAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFRklJRCByZWZpaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKipvYmopCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3SW1wbCwgSURpcmVjdDNEMywgaWZhY2UpOwogICAgVFJBQ0UoIiglcCktPiglcywlcCk6IFRodW5raW5nIHRvIElEaXJlY3REcmF3N1xuIiwgVGhpcywgZGVidWdzdHJfZ3VpZChyZWZpaWQpLCBvYmopOwoKICAgIHJldHVybiBJRGlyZWN0RHJhdzdfUXVlcnlJbnRlcmZhY2UoSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdERyYXc3KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmaWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmopOwp9CgpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKVGh1bmtfSURpcmVjdDNESW1wbF8yX1F1ZXJ5SW50ZXJmYWNlKElEaXJlY3QzRDIgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUZJSUQgcmVmaWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqb2JqKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd0ltcGwsIElEaXJlY3QzRDIsIGlmYWNlKTsKICAgIFRSQUNFKCIoJXApLT4oJXMsJXApOiBUaHVua2luZyB0byBJRGlyZWN0RHJhdzdcbiIsIFRoaXMsIGRlYnVnc3RyX2d1aWQocmVmaWlkKSwgb2JqKTsKCiAgICByZXR1cm4gSURpcmVjdERyYXc3X1F1ZXJ5SW50ZXJmYWNlKElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3REcmF3NyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmlpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqKTsKfQoKc3RhdGljIEhSRVNVTFQgV0lOQVBJClRodW5rX0lEaXJlY3QzREltcGxfMV9RdWVyeUludGVyZmFjZShJRGlyZWN0M0QgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUZJSUQgcmVmaWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqb2JqKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd0ltcGwsIElEaXJlY3QzRCwgaWZhY2UpOwogICAgVFJBQ0UoIiglcCktPiglcywlcCk6IFRodW5raW5nIHRvIElEaXJlY3REcmF3N1xuIiwgVGhpcywgZGVidWdzdHJfZ3VpZChyZWZpaWQpLCBvYmopOwoKICAgIHJldHVybiBJRGlyZWN0RHJhdzdfUXVlcnlJbnRlcmZhY2UoSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdERyYXc3KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmaWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmopOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNENzo6QWRkUmVmCiAqCiAqIERpcmVjdERyYXcgcmVmY291bnRpbmcgaXMgYSBiaXQgb2RkLiBFdmVyeSB2ZXJzaW9uIG9mIHRoZSBkZHJhdyBpbnRlcmZhY2UKICogaGFzIGl0cyBvd24gcmVmY291bnQsIGJ1dCBJRGlyZWN0M0QgMS8yLzMgcmVmY291bnRzIGFyZSBsaW5rZWQgdG8KICogSURpcmVjdERyYXcsIGFuZCBJRGlyZWN0M0Q3IGlzIGxpbmtlZCB0byBJRGlyZWN0RHJhdzcKICoKICogSURpcmVjdDNENyAtPiBJRGlyZWN0RHJhdzcKICogSURpcmVjdDNEMyAtPiBJRGlyZWN0RHJhdwogKiBJRGlyZWN0M0QyIC0+IElEaXJlY3REcmF3CiAqIElEaXJlY3QzRCAgLT4gSURpcmVjdERyYXcKICoKICogU28gZXZlcnkgQWRkUmVmIGltcGxlbWVudGF0aW9uIHRodW5rcyB0byBhIGRpZmZlcmVudCBpbnRlcmZhY2UsIGFuZCB0aGUKICogSURpcmVjdERyYXdYOjpBZGRSZWYgaW1wbGVtZW50YXRpb25zIGhhdmUgZGlmZmVyZW50IGNvdW50ZXJzLi4uCiAqCiAqIFJldHVybnMKICogIFRoZSBuZXcgcmVmY291bnQKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgVUxPTkcgV0lOQVBJClRodW5rX0lEaXJlY3QzREltcGxfN19BZGRSZWYoSURpcmVjdDNENyAqaWZhY2UpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3SW1wbCwgSURpcmVjdDNENywgaWZhY2UpOwogICAgVFJBQ0UoIiglcCkgOiBUaHVua2luZyB0byBJRGlyZWN0RHJhdzcuXG4iLCBUaGlzKTsKCiAgICByZXR1cm4gSURpcmVjdERyYXc3X0FkZFJlZihJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0RHJhdzcpKTsKfQoKc3RhdGljIFVMT05HIFdJTkFQSQpUaHVua19JRGlyZWN0M0RJbXBsXzNfQWRkUmVmKElEaXJlY3QzRDMgKmlmYWNlKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd0ltcGwsIElEaXJlY3QzRDMsIGlmYWNlKTsKICAgIFRSQUNFKCIoJXApIDogVGh1bmtpbmcgdG8gSURpcmVjdERyYXcuXG4iLCBUaGlzKTsKCiAgICByZXR1cm4gSURpcmVjdERyYXdfQWRkUmVmKElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3REcmF3KSk7Cn0KCnN0YXRpYyBVTE9ORyBXSU5BUEkKVGh1bmtfSURpcmVjdDNESW1wbF8yX0FkZFJlZihJRGlyZWN0M0QyICppZmFjZSkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdJbXBsLCBJRGlyZWN0M0QyLCBpZmFjZSk7CiAgICBUUkFDRSgiKCVwKSA6IFRodW5raW5nIHRvIElEaXJlY3REcmF3LlxuIiwgVGhpcyk7CgogICAgcmV0dXJuIElEaXJlY3REcmF3X0FkZFJlZihJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0RHJhdykpOwp9CgpzdGF0aWMgVUxPTkcgV0lOQVBJClRodW5rX0lEaXJlY3QzREltcGxfMV9BZGRSZWYoSURpcmVjdDNEICppZmFjZSkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdJbXBsLCBJRGlyZWN0M0QsIGlmYWNlKTsKICAgIFRSQUNFKCIoJXApIDogVGh1bmtpbmcgdG8gSURpcmVjdERyYXcuXG4iLCBUaGlzKTsKCiAgICByZXR1cm4gSURpcmVjdERyYXdfQWRkUmVmKElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3REcmF3KSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0Q3OjpSZWxlYXNlCiAqCiAqIFNhbWUgc3RvcnkgYXMgSURpcmVjdDNENzo6QWRkUmVmCiAqCiAqIFJldHVybnM6IFRoZSBuZXcgcmVmY291bnQKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgVUxPTkcgV0lOQVBJClRodW5rX0lEaXJlY3QzREltcGxfN19SZWxlYXNlKElEaXJlY3QzRDcgKmlmYWNlKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd0ltcGwsIElEaXJlY3QzRDcsIGlmYWNlKTsKICAgIFRSQUNFKCIoJXApIDogVGh1bmtpbmcgdG8gSURpcmVjdERyYXc3LlxuIiwgVGhpcyk7CgogICAgcmV0dXJuIElEaXJlY3REcmF3N19SZWxlYXNlKElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3REcmF3NykpOwp9CgpzdGF0aWMgVUxPTkcgV0lOQVBJClRodW5rX0lEaXJlY3QzREltcGxfM19SZWxlYXNlKElEaXJlY3QzRDMgKmlmYWNlKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd0ltcGwsIElEaXJlY3QzRDMsIGlmYWNlKTsKICAgIFRSQUNFKCIoJXApIDogVGh1bmtpbmcgdG8gSURpcmVjdERyYXcuXG4iLCBUaGlzKTsKCiAgICByZXR1cm4gSURpcmVjdERyYXdfUmVsZWFzZShJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0RHJhdykpOwp9CgpzdGF0aWMgVUxPTkcgV0lOQVBJClRodW5rX0lEaXJlY3QzREltcGxfMl9SZWxlYXNlKElEaXJlY3QzRDIgKmlmYWNlKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd0ltcGwsIElEaXJlY3QzRDIsIGlmYWNlKTsKICAgIFRSQUNFKCIoJXApIDogVGh1bmtpbmcgdG8gSURpcmVjdERyYXcuXG4iLCBUaGlzKTsKCiAgICByZXR1cm4gSURpcmVjdERyYXdfUmVsZWFzZShJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0RHJhdykpOwp9CgpzdGF0aWMgVUxPTkcgV0lOQVBJClRodW5rX0lEaXJlY3QzREltcGxfMV9SZWxlYXNlKElEaXJlY3QzRCAqaWZhY2UpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3SW1wbCwgSURpcmVjdDNELCBpZmFjZSk7CiAgICBUUkFDRSgiKCVwKSA6IFRodW5raW5nIHRvIElEaXJlY3REcmF3LlxuIiwgVGhpcyk7CgogICAgcmV0dXJuIElEaXJlY3REcmF3X1JlbGVhc2UoSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdERyYXcpKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzRCBNZXRob2RzCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0Q6OkluaXRpYWxpemUKICoKICogSW5pdGlhbGl6ZXMgdGhlIElEaXJlY3QzRCBpbnRlcmZhY2UuIFRoaXMgaXMgYSBuby1vcCBpbXBsZW1lbnRhdGlvbiwKICogYXMgYWxsIGluaXRpYWxpemF0aW9uIGlzIGRvbmUgYXQgY3JlYXRlIHRpbWUuCiAqCiAqIFZlcnNpb24gMQogKgogKiBQYXJhbXM6CiAqICByZWZpaWQ6ID8KICoKICogUmV0dXJuczoKICogIEQzRF9PSywgYmVjYXVzZSBpdCdzIGEgbm8tb3AKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKSURpcmVjdDNESW1wbF8xX0luaXRpYWxpemUoSURpcmVjdDNEICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVGSUlEIHJlZmlpZCkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdJbXBsLCBJRGlyZWN0M0QsIGlmYWNlKTsKCiAgICBUUkFDRSgiKCVwKS0+KCVzKSBuby1vcC4uLlxuIiwgVGhpcywgZGVidWdzdHJfZ3VpZChyZWZpaWQpKTsKICAgIHJldHVybiBEM0RfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0Q3OjpFbnVtRGV2aWNlcwogKgogKiBUaGUgRW51bURldmljZXMgbWV0aG9kIGZvciBJRGlyZWN0M0Q3LiBJdCBlbnVtZXJhdGVzIGFsbCBzdXBwb3J0ZWQKICogRDNENyBkZXZpY2VzLiBDdXJyZW50bHkgdGhlIFQmTCwgSEFMIGFuZCBSR0IgZGV2aWNlcyBhcmUgZW51bWVyYXRlZC4KICoKICogUGFyYW1zOgogKiAgQ2FsbGJhY2s6IEZ1bmN0aW9uIHRvIGNhbGwgZm9yIGVhY2ggZW51bWVyYXRlZCBkZXZpY2UKICogIENvbnRleHQ6IFBvaW50ZXIgdG8gcGFzcyBiYWNrIHRvIHRoZSBhcHAKICoKICogUmV0dXJuczoKICogIEQzRF9PSywgb3IgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgR2V0Q2FwcyBjYWxsCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJCklEaXJlY3QzREltcGxfN19FbnVtRGV2aWNlcyhJRGlyZWN0M0Q3ICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICBMUEQzREVOVU1ERVZJQ0VTQ0FMTEJBQ0s3IENhbGxiYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKkNvbnRleHQpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3SW1wbCwgSURpcmVjdDNENywgaWZhY2UpOwogICAgY2hhciBpbnRlcmZhY2VfbmFtZV90bmxbXSA9ICJXSU5FIERpcmVjdDNENyBIYXJkd2FyZSBUcmFuc2Zvcm0gYW5kIExpZ2h0aW5nIGFjY2VsZXJhdGlvbiB1c2luZyBXaW5lRDNEIjsKICAgIGNoYXIgZGV2aWNlX25hbWVfdG5sW10gPSAiV2luZSBEM0Q3IFQmTCBIQUwiOwogICAgY2hhciBpbnRlcmZhY2VfbmFtZV9oYWxbXSA9ICJXSU5FIERpcmVjdDNENyBIYXJkd2FyZSBhY2NlbGVyYXRpb24gdXNpbmcgV2luZUQzRCI7CiAgICBjaGFyIGRldmljZV9uYW1lX2hhbFtdID0gIldpbmUgRDNENyBIQUwiOwogICAgY2hhciBpbnRlcmZhY2VfbmFtZV9yZ2JbXSA9ICJXSU5FIERpcmVjdDNENyBSR0IgU29mdHdhcmUgRW11bGF0aW9uIHVzaW5nIFdpbmVEM0QiOwogICAgY2hhciBkZXZpY2VfbmFtZV9yZ2JbXSA9ICJXaW5lIEQzRDcgUkdCIjsKICAgIEQzRERFVklDRURFU0M3IGRkZXNjOwogICAgRDNEREVWSUNFREVTQyBvbGREZXNjOwogICAgSFJFU1VMVCBocjsKCiAgICBUUkFDRSgiKCVwKS0+KCVwLCVwKVxuIiwgVGhpcywgQ2FsbGJhY2ssIENvbnRleHQpOwogICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oJmRkcmF3X2NzKTsKCiAgICBUUkFDRSgiKCVwKSBFbnVtZXJhdGluZyBXaW5lRDNEIEQzRGV2aWNlNyBpbnRlcmZhY2VcbiIsIFRoaXMpOwogICAgaHIgPSBJRGlyZWN0M0RJbXBsX0dldENhcHMoVGhpcy0+d2luZUQzRCwgJm9sZERlc2MsICZkZGVzYyk7CiAgICBpZihociAhPSBEM0RfT0spCiAgICB7CiAgICAgICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oJmRkcmF3X2NzKTsKICAgICAgICByZXR1cm4gaHI7CiAgICB9CiAgICBDYWxsYmFjayhpbnRlcmZhY2VfbmFtZV90bmwsIGRldmljZV9uYW1lX3RubCwgJmRkZXNjLCBDb250ZXh0KTsKCiAgICBkZGVzYy5kZXZpY2VHVUlEID0gSUlEX0lEaXJlY3QzREhBTERldmljZTsKICAgIENhbGxiYWNrKGludGVyZmFjZV9uYW1lX2hhbCwgZGV2aWNlX25hbWVfaGFsLCAmZGRlc2MsIENvbnRleHQpOwoKICAgIGRkZXNjLmRldmljZUdVSUQgPSBJSURfSURpcmVjdDNEUkdCRGV2aWNlOwogICAgQ2FsbGJhY2soaW50ZXJmYWNlX25hbWVfcmdiLCBkZXZpY2VfbmFtZV9yZ2IsICZkZGVzYywgQ29udGV4dCk7CgogICAgVFJBQ0UoIiglcCkgRW5kIG9mIGVudW1lcmF0aW9uXG4iLCBUaGlzKTsKICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCZkZHJhd19jcyk7CiAgICByZXR1cm4gRDNEX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNEMzo6RW51bURldmljZXMKICoKICogRW51bWVyYXRlcyBhbGwgc3VwcG9ydGVkIERpcmVjdDNERGV2aWNlIGludGVyZmFjZXMuIFRoaXMgaXMgdGhlCiAqIGltcGxlbWVudGF0aW9uIGZvciBEaXJlY3QzRCAxIHRvIERpcmVjM0QgMywgVmVyc2lvbiA3IGhhcyBpdHMgb3duLgogKgogKiBWZXJzaW9uIDEsIDIgYW5kIDMKICoKICogUGFyYW1zOgogKiAgQ2FsbGJhY2s6IEFwcGxpY2F0aW9uLXByb3ZpZGVkIHJvdXRpbmUgdG8gY2FsbCBmb3IgZWFjaCBlbnVtZXJhdGVkIGRldmljZQogKiAgQ29udGV4dDogUG9pbnRlciB0byBwYXNzIHRvIHRoZSBjYWxsYmFjawogKgogKiBSZXR1cm5zOgogKiAgRDNEX09LIG9uIHN1Y2Nlc3MsCiAqICBUaGUgcmVzdWx0IG9mIElEaXJlY3QzREltcGxfR2V0Q2FwcyBpZiBpdCBmYWlsZWQKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKSURpcmVjdDNESW1wbF8zX0VudW1EZXZpY2VzKElEaXJlY3QzRDMgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEM0RFTlVNREVWSUNFU0NBTExCQUNLIENhbGxiYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqQ29udGV4dCkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdJbXBsLCBJRGlyZWN0M0QzLCBpZmFjZSk7CiAgICBEM0RERVZJQ0VERVNDIGRyZWYsIGQxLCBkMjsKICAgIEQzRERFVklDRURFU0M3IG5ld0Rlc2M7CiAgICBzdGF0aWMgQ0hBUiB3aW5lZDNkX2Rlc2NyaXB0aW9uW10gPSAiV2luZSBEM0REZXZpY2UgdXNpbmcgV2luZUQzRCBhbmQgT3BlbkdMIjsKICAgIEhSRVNVTFQgaHI7CgogICAgLyogU29tZSBnYW1lcyAoTW90b3JhY2VyIDIgZGVtbykgaGF2ZSB0aGUgYmFkIGlkZWEgdG8gbW9kaWZ5IHRoZSBkZXZpY2UgbmFtZSBzdHJpbmcuCiAgICAgICBMZXQncyBwdXQgdGhlIHN0cmluZyBpbiBhIHN1ZmZpY2llbnRseSBzaXplZCBhcnJheSBpbiB3cml0YWJsZSBtZW1vcnkuICovCiAgICBjaGFyIGRldmljZV9uYW1lWzUwXTsKICAgIHN0cmNweShkZXZpY2VfbmFtZSwiZGlyZWN0M2QiKTsKCiAgICBUUkFDRSgiKCVwKS0+KCVwLCVwKVxuIiwgVGhpcywgQ2FsbGJhY2ssIENvbnRleHQpOwogICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oJmRkcmF3X2NzKTsKCiAgICBociA9IElEaXJlY3QzREltcGxfR2V0Q2FwcyhUaGlzLT53aW5lRDNELCAmZHJlZiwgJm5ld0Rlc2MpOwogICAgaWYoaHIgIT0gRDNEX09LKQogICAgewogICAgICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCZkZHJhd19jcyk7CiAgICAgICAgcmV0dXJuIGhyOwogICAgfQoKICAgIC8qIERvIEkgaGF2ZSB0byBlbnVtZXJhdGUgdGhlIHJlZmVyZW5jZSBpZD8gTm90ZSBmcm9tIG9sZCBkM2Q3OgogICAgICogIkl0IHNlZW1zIHRoYXQgZW51bWVyYXRpbmcgdGhlIHJlZmVyZW5jZSBJSUQgb24gRGlyZWN0M0QgMSBnYW1lcwogICAgICogKEF2UCAvIE1vdG9yYWNlcjIpIGJyZWFrcyB0aGVtIi4gU28gZG8gbm90IGVudW1lcmF0ZSB0aGlzIGlpZCBpbiBWMQogICAgICoKICAgICAqIFRoZXJlJ3MgYSByZWdpc3RyeSBrZXkgSEtMTVxTb2Z0d2FyZVxNaWNyb3NvZnRcRGlyZWN0M0RcRHJpdmVycywgRW51bVJlZmVyZW5jZQogICAgICogd2hpY2ggZW5hYmxlcyAvIGRpc2FibGVzIGVudW1lcmF0aW5nIHRoZSByZWZlcmVuY2UgcmFzdGVyaXplci4gSXQncyBhIERXT1JELAogICAgICogMCBtZWFucyBkaXNhYmxlZCwgMiBtZWFucyBlbmFibGVkLiBUaGUgZW5hYmxlcmVmcmFzdC5yZWcgYW5kIGRpc2FibGVyZWZyYXN0LnJlZwogICAgICogZmlsZXMgaW4gdGhlIERpcmVjdFggNy4wIHNkayBkZW1vIGRpcmVjdG9yeSBzdWdnZXN0IHRoaXMuCiAgICAgKgogICAgICogU29tZSBnYW1lcyhHVEEgMikgc2VlbSB0byB1c2UgdGhlIHNlY29uZCBlbnVtZXJhdGVkIGRldmljZSwgc28gSSBoYXZlIHRvIGVudW1lcmF0ZQogICAgICogYXQgbGVhc3QgMiBkZXZpY2VzLiBTbyBlbnVtZXJhdGUgdGhlIHJlZmVyZW5jZSBkZXZpY2UgdG8gaGF2ZSAyIGRldmljZXMuCiAgICAgKgogICAgICogT3RoZXIgZ2FtZXMoUm9sbGNhZ2UpIHRlbGwgZW11bGF0aW9uIGFuZCBoYWwgZGV2aWNlIGFwcGFydCBieSBjZXJ0YWluIGZsYWdzLgogICAgICogUm9sbGNhZ2UgZXhwZWN0cyBEM0RQVEVYVFVSRUNBUFNfUE9XMiB0byBiZSBzZXQoeWVhaCwgaXQgaXMgYSBsaW1pdGF0aW9uIGZsYWcpLAogICAgICogYW5kIGl0IHJlZnVzZXMgYWxsIGRldmljZXMgdGhhdCBoYXZlIHRoZSBwZXJzcGVjdGl2ZSBmbGFnIHNldC4gVGhpcyB3YXkgaXQgcmVmdXNlcwogICAgICogdGhlIGVtdWxhdGlvbiBkZXZpY2UsIGFuZCBIQUwgZGV2aWNlcyBuZXZlciBoYXZlIFBPVzIgdW5zZXQgaW4gZDNkNyBvbiB3aW5kb3dzLgogICAgICovCgogICAgaWYoVGhpcy0+ZDNkdmVyc2lvbiAhPSAxKQogICAgewogICAgICAgIHN0YXRpYyBDSEFSIHJlZmVyZW5jZV9kZXNjcmlwdGlvbltdID0gIlJHQiBEaXJlY3QzRCBlbXVsYXRpb24iOwoKICAgICAgICBUUkFDRSgiKCVwKSBFbnVtZXJhdGluZyBXaW5lRDNEIEQzRERldmljZSBpbnRlcmZhY2VcbiIsIFRoaXMpOwogICAgICAgIGQxID0gZHJlZjsKICAgICAgICBkMiA9IGRyZWY7CiAgICAgICAgLyogVGhlIHJnYiBkZXZpY2UgaGFzIHRoZSBwb3cyIGZsYWcgc2V0IGluIHRoZSBoZWwgY2FwcywgYnV0IG5vdCBpbiB0aGUgaGFsIGNhcHMgKi8KICAgICAgICBkMS5kcGNMaW5lQ2Fwcy5kd1RleHR1cmVDYXBzICY9IH4oRDNEUFRFWFRVUkVDQVBTX1BPVzIgfCBEM0RQVEVYVFVSRUNBUFNfTk9OUE9XMkNPTkRJVElPTkFMIHwgRDNEUFRFWFRVUkVDQVBTX1BFUlNQRUNUSVZFKTsKICAgICAgICBkMS5kcGNUcmlDYXBzLmR3VGV4dHVyZUNhcHMgJj0gfihEM0RQVEVYVFVSRUNBUFNfUE9XMiB8IEQzRFBURVhUVVJFQ0FQU19OT05QT1cyQ09ORElUSU9OQUwgfCBEM0RQVEVYVFVSRUNBUFNfUEVSU1BFQ1RJVkUpOwogICAgICAgIGhyID0gQ2FsbGJhY2soIChMUElJRCkgJklJRF9JRGlyZWN0M0RSR0JEZXZpY2UsIHJlZmVyZW5jZV9kZXNjcmlwdGlvbiwgZGV2aWNlX25hbWUsICZkMSwgJmQyLCBDb250ZXh0KTsKICAgICAgICBpZihociAhPSBEM0RFTlVNUkVUX09LKQogICAgICAgIHsKICAgICAgICAgICAgVFJBQ0UoIkFwcGxpY2F0aW9uIGNhbmNlbGxlZCB0aGUgZW51bWVyYXRpb25cbiIpOwogICAgICAgICAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbigmZGRyYXdfY3MpOwogICAgICAgICAgICByZXR1cm4gRDNEX09LOwogICAgICAgIH0KICAgIH0KCiAgICBUUkFDRSgiKCVwKSBFbnVtZXJhdGluZyBIQUwgRGlyZWN0M0QgZGV2aWNlXG4iLCBUaGlzKTsKICAgIGQxID0gZHJlZjsKICAgIGQyID0gZHJlZjsKICAgIC8qIFRoZSBoYWwgZGV2aWNlIGRvZXMgbm90IGhhdmUgdGhlIHBvdzIgZmxhZyBzZXQgaW4gaGVsLCBidXQgaW4gaGFsICovCiAgICBkMi5kcGNMaW5lQ2Fwcy5kd1RleHR1cmVDYXBzICY9IH4oRDNEUFRFWFRVUkVDQVBTX1BPVzIgfCBEM0RQVEVYVFVSRUNBUFNfTk9OUE9XMkNPTkRJVElPTkFMIHwgRDNEUFRFWFRVUkVDQVBTX1BFUlNQRUNUSVZFKTsKICAgIGQyLmRwY1RyaUNhcHMuZHdUZXh0dXJlQ2FwcyAmPSB+KEQzRFBURVhUVVJFQ0FQU19QT1cyIHwgRDNEUFRFWFRVUkVDQVBTX05PTlBPVzJDT05ESVRJT05BTCB8IEQzRFBURVhUVVJFQ0FQU19QRVJTUEVDVElWRSk7CiAgICBociA9IENhbGxiYWNrKCAoTFBJSUQpICZJSURfSURpcmVjdDNESEFMRGV2aWNlLCB3aW5lZDNkX2Rlc2NyaXB0aW9uLCBkZXZpY2VfbmFtZSwgJmQxLCAmZDIsIENvbnRleHQpOwogICAgaWYoaHIgIT0gRDNERU5VTVJFVF9PSykKICAgIHsKICAgICAgICBUUkFDRSgiQXBwbGljYXRpb24gY2FuY2VsbGVkIHRoZSBlbnVtZXJhdGlvblxuIik7CiAgICAgICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oJmRkcmF3X2NzKTsKICAgICAgICByZXR1cm4gRDNEX09LOwogICAgfQogICAgVFJBQ0UoIiglcCkgRW5kIG9mIGVudW1lcmF0aW9uXG4iLCBUaGlzKTsKCiAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbigmZGRyYXdfY3MpOwogICAgcmV0dXJuIEQzRF9PSzsKfQoKc3RhdGljIEhSRVNVTFQgV0lOQVBJClRodW5rX0lEaXJlY3QzREltcGxfMl9FbnVtRGV2aWNlcyhJRGlyZWN0M0QyICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRDNERU5VTURFVklDRVNDQUxMQkFDSyBDYWxsYmFjaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKkNvbnRleHQpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3SW1wbCwgSURpcmVjdDNEMiwgaWZhY2UpOwogICAgVFJBQ0UoIiglcCktPiglcCwlcCkgdGh1bmtpbmcgdG8gSURpcmVjdDNEMyBpbnRlcmZhY2UuXG4iLCBUaGlzLCBDYWxsYmFjaywgQ29udGV4dCk7CiAgICByZXR1cm4gSURpcmVjdDNEM19FbnVtRGV2aWNlcyhJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0QzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbGxiYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGV4dCk7Cn0KCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpUaHVua19JRGlyZWN0M0RJbXBsXzFfRW51bURldmljZXMoSURpcmVjdDNEICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRDNERU5VTURFVklDRVNDQUxMQkFDSyBDYWxsYmFjaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKkNvbnRleHQpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3SW1wbCwgSURpcmVjdDNELCBpZmFjZSk7CiAgICBUUkFDRSgiKCVwKS0+KCVwLCVwKSB0aHVua2luZyB0byBJRGlyZWN0M0QzIGludGVyZmFjZS5cbiIsIFRoaXMsIENhbGxiYWNrLCBDb250ZXh0KTsKICAgIHJldHVybiBJRGlyZWN0M0QzX0VudW1EZXZpY2VzKElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRDMpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbGJhY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZXh0KTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzRDM6OkNyZWF0ZUxpZ2h0CiAqCiAqIENyZWF0ZXMgYW4gSURpcmVjdDNETGlnaHQgaW50ZXJmYWNlLiBUaGlzIGludGVyZmFjZSBpcyB1c2VkIGluCiAqIERpcmVjdDNEMyBvciBlYXJsaWVyIGZvciBsaWdodGluZy4gSW4gRGlyZWN0M0Q3IGl0IGhhcyBiZWVuIHJlcGxhY2VkCiAqIGJ5IHRoZSBESVJFQ1QzRExJR0hUNyBzdHJ1Y3R1cmUuIFdpbmUncyBEaXJlY3QzRExpZ2h0IGltcGxlbWVudGF0aW9uCiAqIHVzZXMgdGhlIElEaXJlY3QzRERldmljZTcgaW50ZXJmYWNlIHdpdGggRDNENyBsaWdodHMuCiAqCiAqIFZlcnNpb24gMSwgMiBhbmQgMwogKgogKiBQYXJhbXM6CiAqICBMaWdodDogQWRkcmVzcyB0byBzdG9yZSB0aGUgbmV3IGludGVyZmFjZSBwb2ludGVyCiAqICBVbmtPdXRlcjogQmFzaWNhbGx5IGZvciBhZ2dyZWdhdGlvbiwgYnV0IGRkcmF3IGRvZXNuJ3Qgc3VwcG9ydCBpdC4KICogICAgICAgICAgICBNdXN0IGJlIE5VTEwKICoKICogUmV0dXJuczoKICogIEQzRF9PSyBvbiBzdWNjZXNzCiAqICBEREVSUl9PVVRPRk1FTU9SWSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQKICogIENMQVNTX0VfTk9BR0dSRUdBVElPTiBpZiBVbmtPdXRlciAhPSBOVUxMCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJCklEaXJlY3QzREltcGxfM19DcmVhdGVMaWdodChJRGlyZWN0M0QzICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3QzRExpZ2h0ICoqTGlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJVW5rbm93biAqVW5rT3V0ZXIgKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd0ltcGwsIElEaXJlY3QzRDMsIGlmYWNlKTsKICAgIElEaXJlY3QzRExpZ2h0SW1wbCAqb2JqZWN0OwoKICAgIFRSQUNFKCIoJXApLT4oJXAsJXApXG4iLCBUaGlzLCBMaWdodCwgVW5rT3V0ZXIpOwoKICAgIGlmKFVua091dGVyKQogICAgICAgIHJldHVybiBDTEFTU19FX05PQUdHUkVHQVRJT047CgogICAgb2JqZWN0ID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIEhFQVBfWkVST19NRU1PUlksIHNpemVvZihJRGlyZWN0M0RMaWdodEltcGwpKTsKICAgIGlmIChvYmplY3QgPT0gTlVMTCkKICAgICAgICByZXR1cm4gRERFUlJfT1VUT0ZNRU1PUlk7CgogICAgSUNPTV9JTklUX0lOVEVSRkFDRShvYmplY3QsIElEaXJlY3QzRExpZ2h0LCBJRGlyZWN0M0RMaWdodF9WdGJsKTsKICAgIG9iamVjdC0+cmVmID0gMTsKICAgIG9iamVjdC0+ZGRyYXcgPSBUaGlzOwogICAgb2JqZWN0LT5uZXh0ID0gTlVMTDsKICAgIG9iamVjdC0+YWN0aXZlX3ZpZXdwb3J0ID0gTlVMTDsKCiAgICAvKiBVcGRhdGUgZnVuY3Rpb25zICovCiAgICBvYmplY3QtPmFjdGl2YXRlID0gbGlnaHRfdXBkYXRlOwogICAgb2JqZWN0LT5kZXNhY3RpdmF0ZSA9IGxpZ2h0X2FjdGl2YXRlOwogICAgb2JqZWN0LT51cGRhdGUgPSBsaWdodF9kZXNhY3RpdmF0ZTsKICAgIG9iamVjdC0+YWN0aXZlX3ZpZXdwb3J0ID0gTlVMTDsKCiAgICAqTGlnaHQgPSBJQ09NX0lOVEVSRkFDRShvYmplY3QsIElEaXJlY3QzRExpZ2h0KTsKCiAgICBUUkFDRSgiKCVwKSBjcmVhdGluZyBpbXBsZW1lbnRhdGlvbiBhdCAlcC5cbiIsIFRoaXMsIG9iamVjdCk7CgogICAgcmV0dXJuIEQzRF9PSzsKfQoKc3RhdGljIEhSRVNVTFQgV0lOQVBJClRodW5rX0lEaXJlY3QzREltcGxfMl9DcmVhdGVMaWdodChJRGlyZWN0M0QyICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3QzRExpZ2h0ICoqRGlyZWN0M0RMaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElVbmtub3duICpVbmtPdXRlcikKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdJbXBsLCBJRGlyZWN0M0QyLCBpZmFjZSk7CiAgICBUUkFDRSgiKCVwKS0+KCVwLCVwKSB0aHVua2luZyB0byBJRGlyZWN0M0QzIGludGVyZmFjZS5cbiIsIFRoaXMsIERpcmVjdDNETGlnaHQsIFVua091dGVyKTsKICAgIHJldHVybiBJRGlyZWN0M0QzX0NyZWF0ZUxpZ2h0KElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRDMpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlyZWN0M0RMaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVua091dGVyKTsKfQoKc3RhdGljIEhSRVNVTFQgV0lOQVBJClRodW5rX0lEaXJlY3QzREltcGxfMV9DcmVhdGVMaWdodChJRGlyZWN0M0QgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdDNETGlnaHQgKipEaXJlY3QzRExpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVVua25vd24gKlVua091dGVyKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd0ltcGwsIElEaXJlY3QzRCwgaWZhY2UpOwogICAgVFJBQ0UoIiglcCktPiglcCwlcCkgdGh1bmtpbmcgdG8gSURpcmVjdDNEMyBpbnRlcmZhY2UuXG4iLCBUaGlzLCBEaXJlY3QzRExpZ2h0LCBVbmtPdXRlcik7CiAgICByZXR1cm4gSURpcmVjdDNEM19DcmVhdGVMaWdodChJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0QzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpcmVjdDNETGlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbmtPdXRlcik7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0QzOjpDcmVhdGVNYXRlcmlhbAogKgogKiBDcmVhdGVzIGFuIElEaXJlY3QzRE1hdGVyaWFsIGludGVyZmFjZS4gVGhpcyBpbnRlcmZhY2UgaXMgdXNlZCBieSBEaXJlY3QzRDMKICogYW5kIG9sZGVyIHZlcnNpb25zLiBUaGUgSURpcmVjdDNETWF0ZXJpYWwgaW1wbGVtZW50YXRpb24gd3JhcHMgaXRzCiAqIGZ1bmN0aW9uYWxpdHkgdG8gSURpcmVjdDNERGV2aWNlNzo6U2V0TWF0ZXJpYWwgYW5kIGZyaWVuZHMuCiAqCiAqIFZlcnNpb24gMSwgMiBhbmQgMwogKgogKiBQYXJhbXM6CiAqICBNYXRlcmlhbDogQWRkcmVzcyB0byBzdG9yZSB0aGUgbmV3IGludGVyZmFjZSdzIHBvaW50ZXIgdG8KICogIFVua091dGVyOiBCYXNpY2FsbHkgZm9yIGFnZ3JlZ2F0aW9uLCBidXQgZGRyYXcgZG9lc24ndCBzdXBwb3J0IGl0LgogKiAgICAgICAgICAgIE11c3QgYmUgTlVMTAogKgogKiBSZXR1cm5zOgogKiAgRDNEX09LIG9uIHN1Y2Nlc3MKICogIERERVJSX09VVE9GTUVNT1JZIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZAogKiAgQ0xBU1NfRV9OT0FHR1JFR0FUSU9OIGlmIFVua091dGVyICE9IE5VTEwKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKSURpcmVjdDNESW1wbF8zX0NyZWF0ZU1hdGVyaWFsKElEaXJlY3QzRDMgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdDNETWF0ZXJpYWwzICoqTWF0ZXJpYWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJVW5rbm93biAqVW5rT3V0ZXIgKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd0ltcGwsIElEaXJlY3QzRDMsIGlmYWNlKTsKICAgIElEaXJlY3QzRE1hdGVyaWFsSW1wbCAqb2JqZWN0OwoKICAgIFRSQUNFKCIoJXApLT4oJXAsJXApXG4iLCBUaGlzLCBNYXRlcmlhbCwgVW5rT3V0ZXIpOwoKICAgIGlmKFVua091dGVyKQogICAgICAgIHJldHVybiBDTEFTU19FX05PQUdHUkVHQVRJT047CgogICAgb2JqZWN0ID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIEhFQVBfWkVST19NRU1PUlksIHNpemVvZihJRGlyZWN0M0RNYXRlcmlhbEltcGwpKTsKICAgIGlmIChvYmplY3QgPT0gTlVMTCkKICAgICAgICByZXR1cm4gRERFUlJfT1VUT0ZNRU1PUlk7CgogICAgSUNPTV9JTklUX0lOVEVSRkFDRShvYmplY3QsIElEaXJlY3QzRE1hdGVyaWFsMywgSURpcmVjdDNETWF0ZXJpYWwzX1Z0YmwpOwogICAgSUNPTV9JTklUX0lOVEVSRkFDRShvYmplY3QsIElEaXJlY3QzRE1hdGVyaWFsMiwgSURpcmVjdDNETWF0ZXJpYWwyX1Z0YmwpOwogICAgSUNPTV9JTklUX0lOVEVSRkFDRShvYmplY3QsIElEaXJlY3QzRE1hdGVyaWFsLCBJRGlyZWN0M0RNYXRlcmlhbF9WdGJsKTsKICAgIG9iamVjdC0+cmVmID0gMTsKICAgIG9iamVjdC0+ZGRyYXcgPSBUaGlzOwogICAgb2JqZWN0LT5hY3RpdmF0ZSA9IG1hdGVyaWFsX2FjdGl2YXRlOwoKICAgICpNYXRlcmlhbCA9IElDT01fSU5URVJGQUNFKG9iamVjdCwgSURpcmVjdDNETWF0ZXJpYWwzKTsKCiAgICBUUkFDRSgiKCVwKSBjcmVhdGluZyBpbXBsZW1lbnRhdGlvbiBhdCAlcC5cbiIsIFRoaXMsIG9iamVjdCk7CgogICAgcmV0dXJuIEQzRF9PSzsKfQoKc3RhdGljIEhSRVNVTFQgV0lOQVBJClRodW5rX0lEaXJlY3QzREltcGxfMl9DcmVhdGVNYXRlcmlhbChJRGlyZWN0M0QyICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3QzRE1hdGVyaWFsMiAqKkRpcmVjdDNETWF0ZXJpYWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJVW5rbm93biogVW5rT3V0ZXIpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3SW1wbCwgSURpcmVjdDNEMiwgaWZhY2UpOwogICAgSFJFU1VMVCByZXQ7CiAgICBJRGlyZWN0M0RNYXRlcmlhbDMgKnJldF92YWw7CgogICAgVFJBQ0UoIiglcCktPiglcCwlcCkgdGh1bmtpbmcgdG8gSURpcmVjdDNEMyBpbnRlcmZhY2UuXG4iLCBUaGlzLCBEaXJlY3QzRE1hdGVyaWFsLCBVbmtPdXRlcik7CiAgICByZXQgPSBJRGlyZWN0M0QzX0NyZWF0ZU1hdGVyaWFsKElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRDMpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmV0X3ZhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5rT3V0ZXIpOwoKICAgICpEaXJlY3QzRE1hdGVyaWFsID0gQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3QzRE1hdGVyaWFsSW1wbCwgSURpcmVjdDNETWF0ZXJpYWwzLCBJRGlyZWN0M0RNYXRlcmlhbDIsIHJldF92YWwpOwoKICAgIFRSQUNFKCIgcmV0dXJuaW5nIGludGVyZmFjZSAlcC5cbiIsICpEaXJlY3QzRE1hdGVyaWFsKTsKCiAgICByZXR1cm4gcmV0Owp9CgpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKVGh1bmtfSURpcmVjdDNESW1wbF8xX0NyZWF0ZU1hdGVyaWFsKElEaXJlY3QzRCAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRGlyZWN0M0RNYXRlcmlhbCAqKkRpcmVjdDNETWF0ZXJpYWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJVW5rbm93biogVW5rT3V0ZXIpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3SW1wbCwgSURpcmVjdDNELCBpZmFjZSk7CiAgICBIUkVTVUxUIHJldDsKICAgIExQRElSRUNUM0RNQVRFUklBTDMgcmV0X3ZhbDsKCiAgICBUUkFDRSgiKCVwKS0+KCVwLCVwKSB0aHVua2luZyB0byBJRGlyZWN0M0QzIGludGVyZmFjZS5cbiIsIFRoaXMsIERpcmVjdDNETWF0ZXJpYWwsIFVua091dGVyKTsKICAgIHJldCA9IElEaXJlY3QzRDNfQ3JlYXRlTWF0ZXJpYWwoSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdDNEMyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXRfdmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbmtPdXRlcik7CgogICAgKkRpcmVjdDNETWF0ZXJpYWwgPSBDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdDNETWF0ZXJpYWxJbXBsLCBJRGlyZWN0M0RNYXRlcmlhbDMsIElEaXJlY3QzRE1hdGVyaWFsLCByZXRfdmFsKTsKCiAgICBUUkFDRSgiIHJldHVybmluZyBpbnRlcmZhY2UgJXAuXG4iLCAqRGlyZWN0M0RNYXRlcmlhbCk7CgogICAgcmV0dXJuIHJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzRDM6OkNyZWF0ZVZpZXdwb3J0CiAqCiAqIENyZWF0ZXMgYW4gSURpcmVjdDNEVmlld3BvcnQgaW50ZXJmYWNlLiBUaGlzIGludGVyZmFjZSBpcyB1c2VkCiAqIGJ5IERpcmVjdDNEIGFuZCBlYXJsaWVyIHZlcnNpb25zIGZvciBWaWV3cG9ydCBtYW5hZ2VtZW50LiBJbiBEaXJlY3QzRDcKICogaXQgaGFzIGJlZW4gcmVwbGFjZWQgYnkgYSB2aWV3cG9ydCBzdHJ1Y3R1cmUgYW5kCiAqIElEaXJlY3QzRERldmljZTc6OipWaWV3cG9ydC4gV2luZSdzIElEaXJlY3QzRFZpZXdwb3J0IGltcGxlbWVudGF0aW9uCiAqIHVzZXMgdGhlIElEaXJlY3QzRERldmljZTcgbWV0aG9kcyBmb3IgaXRzIGZ1bmN0aW9uYWxpdHkKICoKICogUGFyYW1zOgogKiAgVmlld3BvcnQ6IEFkZHJlc3MgdG8gc3RvcmUgdGhlIG5ldyBpbnRlcmZhY2UgcG9pbnRlcgogKiAgVW5rT3V0ZXI6IEJhc2ljYWxseSBmb3IgYWdncmVnYXRpb24sIGJ1dCBkZHJhdyBkb2Vzbid0IHN1cHBvcnQgaXQuCiAqICAgICAgICAgICAgTXVzdCBiZSBOVUxMCiAqCiAqIFJldHVybnM6CiAqICBEM0RfT0sgb24gc3VjY2VzcwogKiAgRERFUlJfT1VUT0ZNRU1PUlkgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkCiAqICBDTEFTU19FX05PQUdHUkVHQVRJT04gaWYgVW5rT3V0ZXIgIT0gTlVMTAogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpJRGlyZWN0M0RJbXBsXzNfQ3JlYXRlVmlld3BvcnQoSURpcmVjdDNEMyAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3QzRFZpZXdwb3J0MyAqKlZpZXdwb3J0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJVW5rbm93biAqVW5rT3V0ZXIgKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd0ltcGwsIElEaXJlY3QzRDMsIGlmYWNlKTsKICAgIElEaXJlY3QzRFZpZXdwb3J0SW1wbCAqb2JqZWN0OwoKICAgIGlmKFVua091dGVyKQogICAgICAgIHJldHVybiBDTEFTU19FX05PQUdHUkVHQVRJT047CgogICAgb2JqZWN0ID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIEhFQVBfWkVST19NRU1PUlksIHNpemVvZihJRGlyZWN0M0RWaWV3cG9ydEltcGwpKTsKICAgIGlmIChvYmplY3QgPT0gTlVMTCkKICAgICAgICByZXR1cm4gRERFUlJfT1VUT0ZNRU1PUlk7CgogICAgSUNPTV9JTklUX0lOVEVSRkFDRShvYmplY3QsIElEaXJlY3QzRFZpZXdwb3J0MywgSURpcmVjdDNEVmlld3BvcnQzX1Z0YmwpOwogICAgb2JqZWN0LT5yZWYgPSAxOwogICAgb2JqZWN0LT5kZHJhdyA9IFRoaXM7CiAgICBvYmplY3QtPmFjdGl2YXRlID0gdmlld3BvcnRfYWN0aXZhdGU7CiAgICBvYmplY3QtPnVzZV92cDIgPSAweEZGOwogICAgb2JqZWN0LT5uZXh0ID0gTlVMTDsKICAgIG9iamVjdC0+bGlnaHRzID0gTlVMTDsKICAgIG9iamVjdC0+bnVtX2xpZ2h0cyA9IDA7CiAgICBvYmplY3QtPm1hcF9saWdodHMgPSAwOwoKICAgICpWaWV3cG9ydCA9IElDT01fSU5URVJGQUNFKG9iamVjdCwgSURpcmVjdDNEVmlld3BvcnQzKTsKCiAgICBUUkFDRSgiKCVwKSBjcmVhdGluZyBpbXBsZW1lbnRhdGlvbiBhdCAlcC5cbiIsVGhpcywgb2JqZWN0KTsKCiAgICByZXR1cm4gRDNEX09LOwp9CgpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKVGh1bmtfSURpcmVjdDNESW1wbF8yX0NyZWF0ZVZpZXdwb3J0KElEaXJlY3QzRDIgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdDNEVmlld3BvcnQyICoqRDNEVmlld3BvcnQyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVVua25vd24gKlVua091dGVyKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd0ltcGwsIElEaXJlY3QzRDIsIGlmYWNlKTsKICAgIFRSQUNFKCIoJXApLT4oJXAsJXApIHRodW5raW5nIHRvIElEaXJlY3QzRDMgaW50ZXJmYWNlLlxuIiwgVGhpcywgRDNEVmlld3BvcnQyLCBVbmtPdXRlcik7CgogICAgcmV0dXJuIElEaXJlY3QzRDNfQ3JlYXRlVmlld3BvcnQoSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdDNEMyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSURpcmVjdDNEVmlld3BvcnQzICoqKSBEM0RWaWV3cG9ydDIgLyogTm8gbmVlZCB0byBjYXN0IGhlcmUgKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbmtPdXRlcik7Cn0KCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpUaHVua19JRGlyZWN0M0RJbXBsXzFfQ3JlYXRlVmlld3BvcnQoSURpcmVjdDNEICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3QzRFZpZXdwb3J0ICoqRDNEVmlld3BvcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJVW5rbm93biogVW5rT3V0ZXIpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3SW1wbCwgSURpcmVjdDNELCBpZmFjZSk7CiAgICBUUkFDRSgiKCVwKS0+KCVwLCVwKSB0aHVua2luZyB0byBJRGlyZWN0M0QzIGludGVyZmFjZS5cbiIsIFRoaXMsIEQzRFZpZXdwb3J0LCBVbmtPdXRlcik7CgogICAgcmV0dXJuIElEaXJlY3QzRDNfQ3JlYXRlVmlld3BvcnQoSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdDNEMyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSURpcmVjdDNEVmlld3BvcnQzICoqKSBEM0RWaWV3cG9ydCAvKiBObyBuZWVkIHRvIGNhc3QgaGVyZSAqLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVua091dGVyKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzRDM6OkZpbmREZXZpY2UKICoKICogVGhpcyBtZXRob2QgZmluZHMgYSBkZXZpY2Ugd2l0aCB0aGUgcmVxdWVzdGVkIHByb3BlcnRpZXMgYW5kIHJldHVybnMgYQogKiBkZXZpY2UgZGVzY3JpcHRpb24KICoKICogVmVyaW9uIDEsIDIgYW5kIDMKICogUGFyYW1zOgogKiAgRDNEREZTOiBEZXNjcmliZXMgdGhlIHJlcXVlc3RlZCBkZXZpY2UgY2hhcmFjdGVyaXN0aWNzCiAqICBEM0RGRFI6IFJldHVybnMgdGhlIGRldmljZSBkZXNjcmlwdGlvbgogKgogKiBSZXR1cm5zOgogKiAgRDNEX09LIG9uIHN1Y2Nlc3MKICogIERERVJSX0lOVkFMSURQQVJBTVMgaWYgbm8gZGV2aWNlIHdhcyBmb3VuZAogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpJRGlyZWN0M0RJbXBsXzNfRmluZERldmljZShJRGlyZWN0M0QzICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNERklORERFVklDRVNFQVJDSCAqRDNEREZTLAogICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RGSU5EREVWSUNFUkVTVUxUICpEM0RGRFIpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3SW1wbCwgSURpcmVjdDNEMywgaWZhY2UpOwogICAgRDNEREVWSUNFREVTQyBkZXNjOwogICAgRDNEREVWSUNFREVTQzcgbmV3RGVzYzsKICAgIEhSRVNVTFQgaHI7CgogICAgVFJBQ0UoIiglcCktPiglcCwlcClcbiIsIFRoaXMsIEQzRERGUywgRDNERkRSKTsKCiAgICBpZiAoKEQzRERGUy0+ZHdGbGFncyAmIEQzREZEU19DT0xPUk1PREVMKSAmJgogICAgICAgIChEM0RERlMtPmRjbUNvbG9yTW9kZWwgIT0gRDNEQ09MT1JfUkdCKSkKICAgIHsKICAgICAgICBUUkFDRSgiIHRyeWluZyB0byByZXF1ZXN0IGEgbm9uLVJHQiBEM0QgY29sb3IgbW9kZWwuIE5vdCBzdXBwb3J0ZWQuXG4iKTsKICAgICAgICByZXR1cm4gRERFUlJfSU5WQUxJRFBBUkFNUzsgLyogTm8gcmVhbCBpZGVhIHdoYXQgdG8gcmV0dXJuIGhlcmUgOi0pICovCiAgICB9CiAgICBpZiAoRDNEREZTLT5kd0ZsYWdzICYgRDNERkRTX0dVSUQpCiAgICB7CiAgICAgICAgVFJBQ0UoIiB0cnlpbmcgdG8gbWF0Y2ggZ3VpZCAlcy5cbiIsIGRlYnVnc3RyX2d1aWQoJihEM0RERlMtPmd1aWQpKSk7CiAgICAgICAgaWYgKChJc0VxdWFsR1VJRCgmSUlEX0QzRERFVklDRV9XaW5lRDNELCAmKEQzRERGUy0+Z3VpZCkpID09IDApICYmCiAgICAgICAgICAgIChJc0VxdWFsR1VJRCgmSUlEX0lEaXJlY3QzREhBTERldmljZSwgJihEM0RERlMtPmd1aWQpKSA9PSAwKSAmJgogICAgICAgICAgICAoSXNFcXVhbEdVSUQoJklJRF9JRGlyZWN0M0RSZWZEZXZpY2UsICYoRDNEREZTLT5ndWlkKSkgPT0gMCkpCiAgICAgICAgewogICAgICAgICAgICBUUkFDRSgiIG5vIG1hdGNoIGZvciB0aGlzIEdVSUQuXG4iKTsKICAgICAgICAgICAgcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7CiAgICAgICAgfQogICAgfQoKICAgIC8qIEdldCB0aGUgY2FwcyAqLwogICAgaHIgPSBJRGlyZWN0M0RJbXBsX0dldENhcHMoVGhpcy0+d2luZUQzRCwgJmRlc2MsICZuZXdEZXNjKTsKICAgIGlmKGhyICE9IEQzRF9PSykgcmV0dXJuIGhyOwoKICAgIC8qIE5vdyByZXR1cm4gb3VyIG93biBHVUlEICovCiAgICBEM0RGRFItPmd1aWQgPSBJSURfRDNEREVWSUNFX1dpbmVEM0Q7CiAgICBEM0RGRFItPmRkSHdEZXNjID0gZGVzYzsKICAgIEQzREZEUi0+ZGRTd0Rlc2MgPSBkZXNjOwoKICAgIFRSQUNFKCIgcmV0dXJuaW5nIFdpbmUncyBXaW5lRDNEIGRldmljZSB3aXRoICh1bmR1bXBlZCkgY2FwYWJpbGl0aWVzXG4iKTsKCiAgICByZXR1cm4gRDNEX09LOwp9CgpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKVGh1bmtfSURpcmVjdDNESW1wbF8yX0ZpbmREZXZpY2UoSURpcmVjdDNEMiAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzREZJTkRERVZJQ0VTRUFSQ0ggKkQzRERGUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNERklORERFVklDRVJFU1VMVCAqRDNERkRSKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd0ltcGwsIElEaXJlY3QzRDIsIGlmYWNlKTsKICAgIFRSQUNFKCIoJXApLT4oJXAsJXApIHRodW5raW5nIHRvIElEaXJlY3QzRDMgaW50ZXJmYWNlLlxuIiwgaWZhY2UsIEQzRERGUywgRDNERkRSKTsKICAgIHJldHVybiBJRGlyZWN0M0QzX0ZpbmREZXZpY2UoSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdDNEMyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRERGUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNERkRSKTsKfQoKc3RhdGljIEhSRVNVTFQgV0lOQVBJClRodW5rX0lEaXJlY3QzREltcGxfMV9GaW5kRGV2aWNlKElEaXJlY3QzRCAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNERklORERFVklDRVNFQVJDSCAqRDNEREZTLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzREZJTkRERVZJQ0VSRVNVTFQgKkQzRERldmljZSkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdJbXBsLCBJRGlyZWN0M0QsIGlmYWNlKTsKICAgIFRSQUNFKCIoJXApLT4oJXAsJXApIHRodW5raW5nIHRvIElEaXJlY3QzRDMgaW50ZXJmYWNlLlxuIiwgVGhpcywgRDNEREZTLCBEM0REZXZpY2UpOwogICAgcmV0dXJuIElEaXJlY3QzRDNfRmluZERldmljZShJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0QzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEREZTLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0REZXZpY2UpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNENzo6Q3JlYXRlRGV2aWNlCiAqCiAqIENyZWF0ZXMgYW4gSURpcmVjdDNERGV2aWNlNyBpbnRlcmZhY2UuCiAqCiAqIFZlcnNpb24gMiwgMyBhbmQgNy4gSURpcmVjdDNERGV2aWNlIDEgaW50ZXJmYWNlcyBhcmUgaW50ZXJmYWNlcyB0bwogKiBEaXJlY3REcmF3IHN1cmZhY2VzIGFuZCBhcmUgY3JlYXRlZCB3aXRoCiAqIElEaXJlY3REcmF3U3VyZmFjZTo6UXVlcnlJbnRlcmZhY2UuIFRoaXMgbWV0aG9kIHVzZXMgQ3JlYXRlRGV2aWNlIHRvCiAqIGNyZWF0ZSB0aGUgZGV2aWNlIG9iamVjdCBhbmQgUXVlcnlJbnRlcmZhY2VzIGZvciBJRGlyZWN0M0REZXZpY2UKICoKICogUGFyYW1zOgogKiAgcmVmaWlkOiBJSUQgb2YgdGhlIGRldmljZSB0byBjcmVhdGUKICogIFN1cmZhY2U6IEluaXRpdGlhbCByZW5kZXJ0YXJnZXQKICogIERldmljZTogQWRkcmVzcyB0byByZXR1cm4gdGhlIGludGVyZmFjZSBwb2ludGVyCiAqCiAqIFJldHVybnM6CiAqICBEM0RfT0sgb24gc3VjY2VzcwogKiAgRERFUlJfT1VUT0ZNRU1PUlkgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkCiAqICBEREVSUl9JTlZBTElEUEFSQU1TIGlmIGEgZGV2aWNlIGV4aXN0cyBhbHJlYWR5CiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJCklEaXJlY3QzREltcGxfN19DcmVhdGVEZXZpY2UoSURpcmVjdDNENyAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVGQ0xTSUQgcmVmaWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3REcmF3U3VyZmFjZTcgKlN1cmZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdDNERGV2aWNlNyAqKkRldmljZSkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdJbXBsLCBJRGlyZWN0M0Q3LCBpZmFjZSk7CiAgICBJRGlyZWN0M0REZXZpY2VJbXBsICpvYmplY3Q7CiAgICBJUGFyZW50SW1wbCAqSW5kZXhCdWZmZXJQYXJlbnQ7CiAgICBIUkVTVUxUIGhyOwogICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqdGFyZ2V0ID0gSUNPTV9PQkpFQ1QoSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgSURpcmVjdERyYXdTdXJmYWNlNywgU3VyZmFjZSk7CiAgICBUUkFDRSgiKCVwKS0+KCVzLCVwLCVwKVxuIiwgaWZhY2UsIGRlYnVnc3RyX2d1aWQocmVmaWlkKSwgU3VyZmFjZSwgRGV2aWNlKTsKCiAgICBFbnRlckNyaXRpY2FsU2VjdGlvbigmZGRyYXdfY3MpOwogICAgKkRldmljZSA9IE5VTEw7CgogICAgLyogRmFpbCBkZXZpY2UgY3JlYXRpb24gaWYgbm9uLW9wZW5nbCBzdXJmYWNlcyBhcmUgdXNlZCAqLwogICAgaWYoVGhpcy0+SW1wbFR5cGUgIT0gU1VSRkFDRV9PUEVOR0wpCiAgICB7CiAgICAgICAgRVJSKCJUaGUgYXBwbGljYXRpb24gd2FudHMgdG8gY3JlYXRlIGEgRGlyZWN0M0QgZGV2aWNlLCBidXQgbm9uLW9wZW5nbCBzdXJmYWNlcyBhcmUgc2V0IGluIHRoZSByZWdpc3RyeS4gUGxlYXNlIHNldCB0aGUgc3VyZmFjZSBpbXBsZW1lbnRhdGlvbiB0byBvcGVuZ2wgb3IgYXV0b2RldGVjdGlvbiB0byBhbGxvdyAzRCByZW5kZXJpbmdcbiIpOwoKICAgICAgICAvKiBXZSBvbmx5IGhpdCB0aGlzIHBhdGggaWYgYSBkZWZhdWx0IHN1cmZhY2UgaXMgc2V0IGluIHRoZSByZWdpc3RyeS4gSW5jb3JyZWN0IGF1dG9kZXRlY3Rpb24KICAgICAgICAgKiBpcyBjYXVnaHQgaW4gQ3JlYXRlU3VyZmFjZSBvciBRdWVyeUludGVyZmFjZQogICAgICAgICAqLwogICAgICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCZkZHJhd19jcyk7CiAgICAgICAgcmV0dXJuIERERVJSX05PM0Q7CiAgICB9CgogICAgLyogU28gZmFyIHdlIGNhbiBvbmx5IGNyZWF0ZSBvbmUgZGV2aWNlIHBlciBkZHJhdyBvYmplY3QgKi8KICAgIGlmKFRoaXMtPmQzZGRldmljZSkKICAgIHsKICAgICAgICBGSVhNRSgiKCVwKTogT25seSBvbmUgRGlyZWN0M0QgZGV2aWNlIHBlciBEaXJlY3REcmF3IG9iamVjdCBzdXBwb3J0ZWRcbiIsIFRoaXMpOwogICAgICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCZkZHJhd19jcyk7CiAgICAgICAgcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7CiAgICB9CgogICAgb2JqZWN0ID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIDAsIHNpemVvZihJRGlyZWN0M0REZXZpY2VJbXBsKSk7CiAgICBpZighb2JqZWN0KQogICAgewogICAgICAgIEVSUigiT3V0IG9mIG1lbW9yeSB3aGVuIGFsbG9jYXRpbmcgYSBJRGlyZWN0M0REZXZpY2UgaW1wbGVtZW50YXRpb25cbiIpOwogICAgICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCZkZHJhd19jcyk7CiAgICAgICAgcmV0dXJuIERERVJSX09VVE9GTUVNT1JZOwogICAgfQoKICAgIElDT01fSU5JVF9JTlRFUkZBQ0Uob2JqZWN0LCBJRGlyZWN0M0REZXZpY2U3LCBJRGlyZWN0M0REZXZpY2U3X1Z0YmwpOwogICAgSUNPTV9JTklUX0lOVEVSRkFDRShvYmplY3QsIElEaXJlY3QzRERldmljZTMsIElEaXJlY3QzRERldmljZTNfVnRibCk7CiAgICBJQ09NX0lOSVRfSU5URVJGQUNFKG9iamVjdCwgSURpcmVjdDNERGV2aWNlMiwgSURpcmVjdDNERGV2aWNlMl9WdGJsKTsKICAgIElDT01fSU5JVF9JTlRFUkZBQ0Uob2JqZWN0LCBJRGlyZWN0M0REZXZpY2UsIElEaXJlY3QzRERldmljZTFfVnRibCk7CgogICAgb2JqZWN0LT5yZWYgPSAxOwogICAgb2JqZWN0LT5kZHJhdyA9IFRoaXM7CiAgICBvYmplY3QtPnZpZXdwb3J0X2xpc3QgPSBOVUxMOwogICAgb2JqZWN0LT5jdXJyZW50X3ZpZXdwb3J0ID0gTlVMTDsKICAgIG9iamVjdC0+bWF0ZXJpYWwgPSAwOwogICAgb2JqZWN0LT50YXJnZXQgPSB0YXJnZXQ7CgogICAgb2JqZWN0LT5IYW5kbGVzID0gTlVMTDsKICAgIG9iamVjdC0+bnVtSGFuZGxlcyA9IDA7CgogICAgLyogVGhpcyBpcyBmb3IgY29udmVuaWVuY2UgKi8KICAgIG9iamVjdC0+d2luZUQzRERldmljZSA9IFRoaXMtPndpbmVEM0REZXZpY2U7CgogICAgLyogQ3JlYXRlIGFuIGluZGV4IGJ1ZmZlciwgaXQncyBuZWVkZWQgZm9yIGluZGV4ZWQgZHJhd2luZyAqLwogICAgSW5kZXhCdWZmZXJQYXJlbnQgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc2l6ZW9mKElQYXJlbnRJbXBsICopKTsKICAgIGlmKCFJbmRleEJ1ZmZlclBhcmVudCkKICAgIHsKICAgICAgICBFUlIoIkFsbG9jYXRpbmcgbWVtb3J5IGZvciBhbiBpbmRleCBidWZmZXIgcGFyZW50IGZhaWxlZFxuIik7CiAgICAgICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgb2JqZWN0KTsKICAgICAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbigmZGRyYXdfY3MpOwogICAgICAgIHJldHVybiBEREVSUl9PVVRPRk1FTU9SWTsKICAgIH0KICAgIElDT01fSU5JVF9JTlRFUkZBQ0UoSW5kZXhCdWZmZXJQYXJlbnQsIElQYXJlbnQsIElQYXJlbnRfVnRibCk7CiAgICBJbmRleEJ1ZmZlclBhcmVudC0+cmVmID0gMTsKCiAgICAvKiBDcmVhdGUgYW4gSW5kZXggQnVmZmVyLiBXaW5lRDNEIG5lZWRzIG9uZSBmb3IgRHJhd2luZyBpbmRleGVkIHByaW1pdGl2ZXMKICAgICAqIENyZWF0ZSBhIChob3BlZnVsbHkpIGxvbmcgZW5vdWdoIGJ1ZmZlciwgYW5kIGNvcHkgdGhlIGluZGljZXMgaW50byBpdAogICAgICogSWRlYWxseSwgYSBJV2luZUQzREluZGV4QnVmZmVyOjpTZXREYXRhIG1ldGhvZCBjb3VsZCBiZSBjcmVhdGVkLCB3aGljaAogICAgICogdGFrZXMgdGhlIHBvaW50ZXIgYW5kIGF2b2lkcyB0aGUgbWVtY3B5CiAgICAgKi8KICAgIGhyID0gSVdpbmVEM0REZXZpY2VfQ3JlYXRlSW5kZXhCdWZmZXIoVGhpcy0+d2luZUQzRERldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwMCwgLyogTGVuZ3RoLiBEb24ndCBrbm93IGhvdyBsb25nIGl0IHNob3VsZCBiZSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEVVNBR0VfRFlOQU1JQywgLyogVXNhZ2UgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzREZNVF9JTkRFWDE2LCAvKiBGb3JtYXQuIEQzRDcgdXNlcyBXT1JEUyAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUE9PTF9ERUZBVUxULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2JqZWN0LT5pbmRleGJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAvKiBIYW5kbGUgKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJVW5rbm93biAqKSBJQ09NX0lOVEVSRkFDRShJbmRleEJ1ZmZlclBhcmVudCwgSVBhcmVudCkpOwoKICAgIGlmKEZBSUxFRChocikpCiAgICB7CiAgICAgICAgRVJSKCJGYWlsZWQgdG8gY3JlYXRlIGFuIGluZGV4IGJ1ZmZlclxuIik7CiAgICAgICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgb2JqZWN0KTsKICAgICAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbigmZGRyYXdfY3MpOwogICAgICAgIHJldHVybiBocjsKICAgIH0KICAgIEluZGV4QnVmZmVyUGFyZW50LT5jaGlsZCA9IChJVW5rbm93biAqKSBvYmplY3QtPmluZGV4YnVmZmVyOwoKICAgIC8qIE5vIG5lZWQgdG8gc2V0IHRoZSBpbmRpY2VzLCBpdCdzIGRvbmUgd2hlbiBuZWNlc3NhcnkgKi8KCiAgICAvKiBBZGRSZWYgdGhlIFdpbmVEM0QgRGV2aWNlICovCiAgICBJV2luZUQzRERldmljZV9BZGRSZWYoVGhpcy0+d2luZUQzRERldmljZSk7CgogICAgLyogRG9uJ3QgZm9yZ2V0IHRvIHJldHVybiB0aGUgaW50ZXJmYWNlIDspICovCiAgICAqRGV2aWNlID0gSUNPTV9JTlRFUkZBQ0Uob2JqZWN0LCBJRGlyZWN0M0REZXZpY2U3KTsKCiAgICBUUkFDRSgiICglcCkgQ3JlYXRlZCBhbiBJRGlyZWN0M0REZXZpY2VJbXBsIG9iamVjdCBhdCAlcFxuIiwgVGhpcywgb2JqZWN0KTsKCiAgICAvKiBUaGlzIGlzIGZvciBhcHBzIHdoaWNoIGNyZWF0ZSBhIG5vbi1mbGlwLCBub24tZDNkIHByaW1hcnkgc3VyZmFjZQogICAgICogYW5kIGFuIG9mZnNjcmVlbiBEM0RERVZJQ0Ugc3VyZmFjZSwgdGhlbiByZW5kZXIgdG8gdGhlIG9mZnNjcmVlbiBzdXJmYWNlCiAgICAgKiBhbmQgZG8gYSBCbHQgZnJvbSB0aGUgb2Zmc2NyZWVuIHRvIHRoZSBwcmltYXJ5IHN1cmZhY2UuCiAgICAgKgogICAgICogU2V0IHRoZSBvZmZzY3JlZW4gRDNERERFVklDRSBzdXJmYWNlKD10YXJnZXQpIGFzIHRoZSBiYWNrIGJ1ZmZlciwKICAgICAqIGFuZCB0aGUgcHJpbWFyeSBzdXJmYWNlKD1UaGlzLT5kM2RfdGFyZ2V0KSBhcyB0aGUgZnJvbnQgYnVmZmVyLgogICAgICoKICAgICAqIFRoaXMgd2F5IHRoZSBhcHAgd2lsbCByZW5kZXIgdG8gdGhlIEQzRERFVklDRSBzdXJmYWNlIGFuZCBXaW5lRDNECiAgICAgKiB3aWxsIGNhdGNoIHRoZSBCbHQgd2FzIEJhY2sgQnVmZmVyIC0+IEZyb250IGJ1ZmZlciBibHQgYW5kIHBlcmZvcm0KICAgICAqIGEgZmxpcCBpbnN0ZWFkLiBUaGlzIHdheSB3ZSBkb24ndCBoYXZlIHRvIGRlYWwgd2l0aCBhIG1peGVkIEdMIC8gR0RJCiAgICAgKiBlbnZpcm9ubWVudC4KICAgICAqCiAgICAgKiBUaGlzIHNob3VsZCBiZSBjaGVja2VkIGFnYWluc3Qgd2luZG93ZWQgYXBwcy4gVGhlIG9ubHkgYXBwIHRlc3RlZCB3aXRoCiAgICAgKiB0aGlzIGlzIG1vdG8gcmFjZXIgMiBkdXJpbmcgdGhlIGxvYWRpbmcgc2NyZWVuLgogICAgICovCiAgICBUUkFDRSgiSXNyZW5kZXJ0YXJnZXQ6ICVzLCBkM2RfdGFyZ2V0PSVwXG4iLCB0YXJnZXQtPnN1cmZhY2VfZGVzYy5kZHNDYXBzLmR3Q2FwcyAmIEREU0NBUFNfUFJJTUFSWVNVUkZBQ0UgPyAidHJ1ZSIgOiAiZmFsc2UiLCBUaGlzLT5kM2RfdGFyZ2V0KTsKICAgIGlmKCEodGFyZ2V0LT5zdXJmYWNlX2Rlc2MuZGRzQ2Fwcy5kd0NhcHMgJiBERFNDQVBTX1BSSU1BUllTVVJGQUNFKSAmJgogICAgICAgKFRoaXMtPmQzZF90YXJnZXQgIT0gdGFyZ2V0KSkKICAgIHsKICAgICAgICBXSU5FRDNEVklFV1BPUlQgdnA7CiAgICAgICAgVFJBQ0UoIiglcCkgVXNpbmcgJXAgYXMgZnJvbnQgYnVmZmVyLCAlcCBhcyBiYWNrIGJ1ZmZlclxuIiwgVGhpcywgVGhpcy0+ZDNkX3RhcmdldCwgdGFyZ2V0KTsKICAgICAgICBociA9IElXaW5lRDNERGV2aWNlX1NldEZyb250QmFja0J1ZmZlcnMoVGhpcy0+d2luZUQzRERldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcy0+ZDNkX3RhcmdldC0+V2luZUQzRFN1cmZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldC0+V2luZUQzRFN1cmZhY2UpOwogICAgICAgIGlmKGhyICE9IEQzRF9PSykKICAgICAgICAgICAgRVJSKCIoJXApIEVycm9yICUwOHggc2V0dGluZyB0aGUgZnJvbnQgYW5kIGJhY2sgYnVmZmVyXG4iLCBUaGlzLCBocik7CgogICAgICAgIC8qIFJlbmRlciB0byB0aGUgYmFjayBidWZmZXIgKi8KICAgICAgICBJV2luZUQzRERldmljZV9TZXRSZW5kZXJUYXJnZXQoVGhpcy0+d2luZUQzRERldmljZSwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LT5XaW5lRDNEU3VyZmFjZSk7CgogICAgICAgIHZwLlggPSAwOwogICAgICAgIHZwLlkgPSAwOwogICAgICAgIHZwLldpZHRoID0gdGFyZ2V0LT5zdXJmYWNlX2Rlc2MuZHdXaWR0aDsKICAgICAgICB2cC5IZWlnaHQgPSB0YXJnZXQtPnN1cmZhY2VfZGVzYy5kd0hlaWdodDsKICAgICAgICB2cC5NaW5aID0gMC4wOwogICAgICAgIHZwLk1heFogPSAxLjA7CiAgICAgICAgSVdpbmVEM0REZXZpY2VfU2V0Vmlld3BvcnQoVGhpcy0+d2luZUQzRERldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdnApOwoKICAgICAgICBvYmplY3QtPk9mZlNjcmVlblRhcmdldCA9IFRSVUU7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgb2JqZWN0LT5PZmZTY3JlZW5UYXJnZXQgPSBGQUxTRTsKICAgIH0KCiAgICAvKiBBZGRSZWYgdGhlIHJlbmRlciB0YXJnZXQuIEFsc28gQWRkUmVmIHRoZSByZW5kZXIgdGFyZ2V0IGZyb20gZGRyYXcsCiAgICAgKiBiZWNhdXNlIGlmIGl0IGlzIHJlbGVhc2VkIGJlZm9yZSB0aGUgYXBwIHJlbGVhc2VzIHRoZSBEM0QgZGV2aWNlLCB0aGUgRDNEIGNhcGFiaWxpdGllcwogICAgICogb2YgV2luZUQzRCB3aWxsIGJlIHVuaW5pdGlhbGl6ZWQsIHdoaWNoIGhhcyBiYWQgZWZmZWN0cy4KICAgICAqCiAgICAgKiBJbiBtb3N0IGNhc2VzLCB0aG9zZSBzdXJmYWNlcyBhcmUgdGhlIHN1cmZhY2VzIGFyZSB0aGUgc2FtZSBhbnl3YXksIGJ1dCB0aGlzIHdpbGwgc2ltcGx5CiAgICAgKiBhZGQgYW5vdGhlciByZWYgd2hpY2ggaXMgcmVsZWFzZWQgd2hlbiB0aGUgZGV2aWNlIGlzIGRlc3Ryb3llZC4KICAgICAqLwogICAgSURpcmVjdERyYXdTdXJmYWNlN19BZGRSZWYoU3VyZmFjZSk7CiAgICBJRGlyZWN0RHJhd1N1cmZhY2U3X0FkZFJlZihJQ09NX0lOVEVSRkFDRShUaGlzLT5kM2RfdGFyZ2V0LCBJRGlyZWN0RHJhd1N1cmZhY2U3KSk7CgogICAgVGhpcy0+ZDNkZGV2aWNlID0gb2JqZWN0OwoKICAgIElXaW5lRDNERGV2aWNlX1NldFJlbmRlclN0YXRlKFRoaXMtPndpbmVEM0REZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUlNfWkVOQUJMRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3QzRERldmljZUltcGxfVXBkYXRlRGVwdGhTdGVuY2lsKG9iamVjdCkpOwogICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oJmRkcmF3X2NzKTsKICAgIHJldHVybiBEM0RfT0s7Cn0KCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpUaHVua19JRGlyZWN0M0RJbXBsXzNfQ3JlYXRlRGV2aWNlKElEaXJlY3QzRDMgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFRkNMU0lEIHJlZmlpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRGlyZWN0RHJhd1N1cmZhY2U0ICpTdXJmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3QzRERldmljZTMgKipEZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVVua25vd24gKlVua091dGVyKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd0ltcGwsIElEaXJlY3QzRDMsIGlmYWNlKTsKICAgIEhSRVNVTFQgaHI7CiAgICBUUkFDRSgiKCVwKS0+KCVzLCVwLCVwLCVwKTogVGh1bmtpbmcgdG8gSURpcmVjdDNEN1xuIiwgVGhpcywgZGVidWdzdHJfZ3VpZChyZWZpaWQpLCBTdXJmYWNlLCBEZXZpY2UsIFVua091dGVyKTsKCiAgICBpZihVbmtPdXRlciAhPSBOVUxMKQogICAgICAgIHJldHVybiBDTEFTU19FX05PQUdHUkVHQVRJT047CgogICAgaHIgPSAgSURpcmVjdDNEN19DcmVhdGVEZXZpY2UoSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdDNENyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZpaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSURpcmVjdERyYXdTdXJmYWNlNyAqKSBTdXJmYWNlIC8qIFNhbWUgVlRhYmxlcyAqLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJRGlyZWN0M0REZXZpY2U3ICoqKSBEZXZpY2UpOwoKICAgICpEZXZpY2UgPSBDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlNywgSURpcmVjdDNERGV2aWNlMywgKkRldmljZSk7CiAgICByZXR1cm4gaHI7Cn0KCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpUaHVua19JRGlyZWN0M0RJbXBsXzJfQ3JlYXRlRGV2aWNlKElEaXJlY3QzRDIgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFRkNMU0lEIHJlZmlpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRGlyZWN0RHJhd1N1cmZhY2UgKlN1cmZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdDNERGV2aWNlMiAqKkRldmljZSkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdJbXBsLCBJRGlyZWN0M0QyLCBpZmFjZSk7CiAgICBIUkVTVUxUIGhyOwogICAgVFJBQ0UoIiglcCktPiglcywlcCwlcCk6IFRodW5raW5nIHRvIElEaXJlY3QzRDdcbiIsIFRoaXMsIGRlYnVnc3RyX2d1aWQocmVmaWlkKSwgU3VyZmFjZSwgRGV2aWNlKTsKCiAgICBociA9ICBJRGlyZWN0M0Q3X0NyZWF0ZURldmljZShJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0Q3KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmlpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0RHJhd1N1cmZhY2UzLCBJRGlyZWN0RHJhd1N1cmZhY2U3LCBTdXJmYWNlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJRGlyZWN0M0REZXZpY2U3ICoqKSBEZXZpY2UpOwoKICAgICpEZXZpY2UgPSBDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlNywgSURpcmVjdDNERGV2aWNlMiwgKkRldmljZSk7CiAgICByZXR1cm4gaHI7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0Q3OjpDcmVhdGVWZXJ0ZXhCdWZmZXIKICoKICogQ3JlYXRlcyBhIG5ldyB2ZXJ0ZXggYnVmZmVyIG9iamVjdCBhbmQgcmV0dXJucyBhIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjcKICogaW50ZXJmYWNlLgogKgogKiBWZXJzaW9uIDMgYW5kIDcKICoKICogUGFyYW1zOgogKiAgRGVzYzogUmVxdWVzdGVkIFZlcnRleCBidWZmZXIgcHJvcGVydGllcwogKiAgVmVydGV4QnVmZmVyOiBBZGRyZXNzIHRvIHJldHVybiB0aGUgaW50ZXJmYWNlIHBvaW50ZXIgYXQKICogIEZsYWdzOiBTb21lIGZsYWdzLCBtdXN0IGJlIDAKICoKICogUmV0dXJucwogKiAgRDNEX09LIG9uIHN1Y2Nlc3MKICogIERERVJSX09VVE9GTUVNT1JZIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZAogKiAgVGhlIHJldHVybiB2YWx1ZSBvZiBJV2luZUQzRERldmljZTo6Q3JlYXRlVmVydGV4QnVmZmVyIGlmIHRoaXMgY2FsbCBmYWlscwogKiAgRERFUlJfSU5WQUxJRFBBUkFNUyBpZiBEZXNjIG9yIFZlcnRleEJ1ZmZlciBhcmUgTlVMTCwgb3IgRmxhZ3MgIT0gMAogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpJRGlyZWN0M0RJbXBsXzdfQ3JlYXRlVmVydGV4QnVmZmVyKElEaXJlY3QzRDcgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFZFUlRFWEJVRkZFUkRFU0MgKkRlc2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdDNEVmVydGV4QnVmZmVyNyAqKlZlcnRleEJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBGbGFncykKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdJbXBsLCBJRGlyZWN0M0Q3LCBpZmFjZSk7CiAgICBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXJJbXBsICpvYmplY3Q7CiAgICBIUkVTVUxUIGhyOwogICAgVFJBQ0UoIiglcCktPiglcCwlcCwlMDh4KVxuIiwgVGhpcywgRGVzYywgVmVydGV4QnVmZmVyLCBGbGFncyk7CgogICAgVFJBQ0UoIiglcCkgVmVydGV4IGJ1ZmZlciBkZXNjcmlwdGlvbjpcbiIsIFRoaXMpOwogICAgVFJBQ0UoIiglcCkgIGR3U2l6ZT0lZFxuIiwgVGhpcywgRGVzYy0+ZHdTaXplKTsKICAgIFRSQUNFKCIoJXApICBkd0NhcHM9JTA4eFxuIiwgVGhpcywgRGVzYy0+ZHdDYXBzKTsKICAgIFRSQUNFKCIoJXApICBGVkY9JTA4eFxuIiwgVGhpcywgRGVzYy0+ZHdGVkYpOwogICAgVFJBQ0UoIiglcCkgIGR3TnVtVmVydGljZXM9JWRcbiIsIFRoaXMsIERlc2MtPmR3TnVtVmVydGljZXMpOwoKICAgIC8qIEQzRDcgU0RLOiAiTm8gRmxhZ3MgYXJlIGN1cnJlbnRseSBkZWZpbmVkIGZvciB0aGlzIG1ldGhvZC4gVGhpcwogICAgICogcGFyYW1ldGVyIG11c3QgYmUgMCIKICAgICAqCiAgICAgKiBOZXZlciB0cnVzdCB0aGUgZG9jdW1lbnRhdGlvbiAtIHRoaXMgaXMgd3JvbmcKICAgIGlmKEZsYWdzICE9IDApCiAgICB7CiAgICAgICAgRVJSKCIoJXApIEZsYWdzIGlzICUwOGx4LCByZXR1cm5pbmcgRERFUlJfSU5WQUxJRFBBUkFNU1xuIiwgVGhpcywgRmxhZ3MpOwogICAgICAgIHJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOwogICAgfQogICAgICovCgogICAgLyogV2VsbCwgdGhpcyBzb3VuZHMgc2FuZSAqLwogICAgaWYoICghVmVydGV4QnVmZmVyKSB8fCAoIURlc2MpICkKICAgICAgICByZXR1cm4gRERFUlJfSU5WQUxJRFBBUkFNUzsKCiAgICAvKiBOb3cgY3JlYXRlIHRoZSB2ZXJ0ZXggYnVmZmVyICovCiAgICBvYmplY3QgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc2l6ZW9mKElEaXJlY3QzRFZlcnRleEJ1ZmZlckltcGwpKTsKICAgIGlmKCFvYmplY3QpCiAgICB7CiAgICAgICAgRVJSKCIoJXApIE91dCBvZiBtZW1vcnkgd2hlbiBhbGxvY2F0aW5nIGEgSURpcmVjdDNEVmVydGV4QnVmZmVySW1wbCBzdHJ1Y3R1cmVcbiIsIFRoaXMpOwogICAgICAgIHJldHVybiBEREVSUl9PVVRPRk1FTU9SWTsKICAgIH0KCiAgICBvYmplY3QtPnJlZiA9IDE7CiAgICBJQ09NX0lOSVRfSU5URVJGQUNFKG9iamVjdCwgSURpcmVjdDNEVmVydGV4QnVmZmVyNywgSURpcmVjdDNEVmVydGV4QnVmZmVyN19WdGJsKTsKICAgIElDT01fSU5JVF9JTlRFUkZBQ0Uob2JqZWN0LCBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXIsIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjFfVnRibCk7CgogICAgb2JqZWN0LT5DYXBzID0gRGVzYy0+ZHdDYXBzOwogICAgb2JqZWN0LT5kZHJhdyA9IFRoaXM7CgogICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oJmRkcmF3X2NzKTsKICAgIGhyID0gSVdpbmVEM0REZXZpY2VfQ3JlYXRlVmVydGV4QnVmZmVyKFRoaXMtPndpbmVEM0REZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfZmxleGlibGVfdmVydGV4X3NpemUoRGVzYy0+ZHdGVkYpICogRGVzYy0+ZHdOdW1WZXJ0aWNlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2MtPmR3Q2FwcyAmIEQzRFZCQ0FQU19XUklURU9OTFkgPyBXSU5FRDNEVVNBR0VfV1JJVEVPTkxZIDogMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2MtPmR3RlZGLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzYy0+ZHdDYXBzICYgRDNEVkJDQVBTX1NZU1RFTU1FTU9SWSA/IFdJTkVEM0RQT09MX1NZU1RFTU1FTSA6IFdJTkVEM0RQT09MX0RFRkFVTFQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2JqZWN0LT53aW5lRDNEVmVydGV4QnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAvKiBTaGFyZWRIYW5kbGUgKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSVVua25vd24gKikgSUNPTV9JTlRFUkZBQ0Uob2JqZWN0LCBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI3KSk7CiAgICBpZihociAhPSBEM0RfT0spCiAgICB7CiAgICAgICAgRVJSKCIoJXApIElXaW5lRDNERGV2aWNlOjpDcmVhdGVWZXJ0ZXhCdWZmZXIgZmFpbGVkIHdpdGggaHI9JTA4eFxuIiwgVGhpcywgaHIpOwogICAgICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIG9iamVjdCk7CiAgICAgICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oJmRkcmF3X2NzKTsKICAgICAgICBpZiAoaHIgPT0gV0lORUQzREVSUl9JTlZBTElEQ0FMTCkKICAgICAgICAgICAgcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7CiAgICAgICAgZWxzZQogICAgICAgICAgICByZXR1cm4gaHI7CiAgICB9CgogICAgb2JqZWN0LT53aW5lRDNEVmVydGV4RGVjbGFyYXRpb24gPSBJRGlyZWN0RHJhd0ltcGxfRmluZERlY2woVGhpcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2MtPmR3RlZGKTsKICAgIGlmKCFvYmplY3QtPndpbmVEM0RWZXJ0ZXhEZWNsYXJhdGlvbikKICAgIHsKICAgICAgICBFUlIoIkNhbm5vdCBmaW5kIHRoZSB2ZXJ0ZXggZGVjbGFyYXRpb24gZm9yIGZ2ZiAlMDh4XG4iLCBEZXNjLT5kd0ZWRik7CiAgICAgICAgSVdpbmVEM0RWZXJ0ZXhCdWZmZXJfUmVsZWFzZShvYmplY3QtPndpbmVEM0RWZXJ0ZXhCdWZmZXIpOwogICAgICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIG9iamVjdCk7CiAgICAgICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oJmRkcmF3X2NzKTsKICAgICAgICByZXR1cm4gRERFUlJfSU5WQUxJRFBBUkFNUzsKICAgIH0KICAgIElXaW5lRDNEVmVydGV4RGVjbGFyYXRpb25fQWRkUmVmKG9iamVjdC0+d2luZUQzRFZlcnRleERlY2xhcmF0aW9uKTsKCiAgICAvKiBSZXR1cm4gdGhlIGludGVyZmFjZSAqLwogICAgKlZlcnRleEJ1ZmZlciA9IElDT01fSU5URVJGQUNFKG9iamVjdCwgSURpcmVjdDNEVmVydGV4QnVmZmVyNyk7CgogICAgVFJBQ0UoIiglcCkgQ3JlYXRlZCBuZXcgdmVydGV4IGJ1ZmZlciBpbXBsZW1lbnRhdGlvbiBhdCAlcCwgcmV0dXJuaW5nIGludGVyZmFjZSBhdCAlcFxuIiwgVGhpcywgb2JqZWN0LCAqVmVydGV4QnVmZmVyKTsKICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCZkZHJhd19jcyk7CiAgICByZXR1cm4gRDNEX09LOwp9CgpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKVGh1bmtfSURpcmVjdDNESW1wbF8zX0NyZWF0ZVZlcnRleEJ1ZmZlcihJRGlyZWN0M0QzICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RWRVJURVhCVUZGRVJERVNDICpEZXNjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3QzRFZlcnRleEJ1ZmZlciAqKlZlcnRleEJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBGbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJVW5rbm93biAqVW5rT3V0ZXIpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3SW1wbCwgSURpcmVjdDNEMywgaWZhY2UpOwogICAgSFJFU1VMVCBocjsKICAgIFRSQUNFKCIoJXApLT4oJXAsJXAsJTA4eCwlcCk6IFJlbGF5aW5nIHRvIElEaXJlY3QzRDdcbiIsIFRoaXMsIERlc2MsIFZlcnRleEJ1ZmZlciwgRmxhZ3MsIFVua091dGVyKTsKCiAgICBpZihVbmtPdXRlciAhPSBOVUxMKSByZXR1cm4gQ0xBU1NfRV9OT0FHR1JFR0FUSU9OOwoKICAgIGhyID0gSURpcmVjdDNEN19DcmVhdGVWZXJ0ZXhCdWZmZXIoSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdDNENyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI3ICoqKSBWZXJ0ZXhCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZsYWdzKTsKCiAgICAqVmVydGV4QnVmZmVyID0gQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3QzRFZlcnRleEJ1ZmZlckltcGwsIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjcsIElEaXJlY3QzRFZlcnRleEJ1ZmZlciwgKlZlcnRleEJ1ZmZlcik7CiAgICByZXR1cm4gaHI7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNENzo6RW51bVpCdWZmZXJGb3JtYXRzCiAqCiAqIEVudW1lcmF0ZXMgYWxsIHN1cHBvcnRlZCBaIGJ1ZmZlciBwaXhlbCBmb3JtYXRzCiAqCiAqIFZlcnNpb24gMyBhbmQgNwogKgogKiBQYXJhbXM6CiAqICByZWZpaWREZXZpY2U6CiAqICBDYWxsYmFjazogQ2FsbGJhY2sgdG8gY2FsbCBmb3IgZWFjaCBwaXhlbCBmb3JtYXQKICogIENvbnRleHQ6IFBvaW50ZXIgdG8gcGFzcyBiYWNrIHRvIHRoZSBjYWxsYmFjawogKgogKiBSZXR1cm5zOgogKiAgRDNEX09LIG9uIHN1Y2Nlc3MKICogIERERVJSX0lOVkFMSURQQVJBTVMgaWYgQ2FsbGJhY2sgaXMgTlVMTAogKiAgRm9yIGRldGFpbHMsIHNlZSBJV2luZUQzRERldmljZTo6RW51bVpCdWZmZXJGb3JtYXRzCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJCklEaXJlY3QzREltcGxfN19FbnVtWkJ1ZmZlckZvcm1hdHMoSURpcmVjdDNENyAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVGQ0xTSUQgcmVmaWlkRGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRDNERU5VTVBJWEVMRk9STUFUU0NBTExCQUNLIENhbGxiYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKkNvbnRleHQpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3SW1wbCwgSURpcmVjdDNENywgaWZhY2UpOwogICAgSFJFU1VMVCBocjsKICAgIGludCBpOwoKICAgIC8qIE9yZGVyIG1hdHRlcnMuIFNwZWNpZmljYWxseSwgQmF0dGxlWm9uZSBJSSAoZnVsbCB2ZXJzaW9uKSBleHBlY3RzIHRoZQogICAgICogMTYtYml0IGRlcHRoIGZvcm1hdHMgdG8gYmUgbGlzdGVkIGJlZm9yZSB0aGUgMjQgYW5kIDMyIG9uZXMuICovCiAgICBXSU5FRDNERk9STUFUIEZvcm1hdExpc3RbXSA9IHsKICAgICAgICBXSU5FRDNERk1UX0QxNVMxLAogICAgICAgIFdJTkVEM0RGTVRfRDE2LAogICAgICAgIFdJTkVEM0RGTVRfRDI0WDgsCiAgICAgICAgV0lORUQzREZNVF9EMjRYNFM0LAogICAgICAgIFdJTkVEM0RGTVRfRDI0UzgsCiAgICAgICAgV0lORUQzREZNVF9EMzIKICAgIH07CgogICAgVFJBQ0UoIiglcCktPiglcywlcCwlcCk6IFJlbGF5XG4iLCBpZmFjZSwgZGVidWdzdHJfZ3VpZChyZWZpaWREZXZpY2UpLCBDYWxsYmFjaywgQ29udGV4dCk7CgogICAgaWYoIUNhbGxiYWNrKQogICAgICAgIHJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOwoKICAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCZkZHJhd19jcyk7CiAgICBmb3IoaSA9IDA7IGkgPCBzaXplb2YoRm9ybWF0TGlzdCkgLyBzaXplb2YoV0lORUQzREZPUk1BVCk7IGkrKykKICAgIHsKICAgICAgICBociA9IElXaW5lRDNEX0NoZWNrRGV2aWNlRm9ybWF0KFRoaXMtPndpbmVEM0QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIC8qIEFkYXB0ZXIgKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIC8qIERldmljZVR5cGUgKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIC8qIEFkYXB0ZXJGb3JtYXQgKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEVVNBR0VfREVQVEhTVEVOQ0lMIC8qIFVzYWdlICovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAvKiBSZXNvdXJjZVR5cGUgKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3JtYXRMaXN0W2ldKTsKICAgICAgICBpZihociA9PSBEM0RfT0spCiAgICAgICAgewogICAgICAgICAgICBERFBJWEVMRk9STUFUIHBmb3JtYXQ7CgogICAgICAgICAgICBtZW1zZXQoJnBmb3JtYXQsIDAsIHNpemVvZihwZm9ybWF0KSk7CiAgICAgICAgICAgIHBmb3JtYXQuZHdTaXplID0gc2l6ZW9mKHBmb3JtYXQpOwogICAgICAgICAgICBQaXhlbEZvcm1hdF9XaW5lRDNEdG9ERCgmcGZvcm1hdCwgRm9ybWF0TGlzdFtpXSk7CgogICAgICAgICAgICBUUkFDRSgiRW51bWVyYXRpbmcgV2luZUQzREZvcm1hdCAlZFxuIiwgRm9ybWF0TGlzdFtpXSk7CiAgICAgICAgICAgIGhyID0gQ2FsbGJhY2soJnBmb3JtYXQsIENvbnRleHQpOwogICAgICAgICAgICBpZihociAhPSBEREVOVU1SRVRfT0spCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFRSQUNFKCJGb3JtYXQgZW51bWVyYXRpb24gY2FuY2VsbGVkIGJ5IGFwcGxpY2F0aW9uXG4iKTsKICAgICAgICAgICAgICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCZkZHJhd19jcyk7CiAgICAgICAgICAgICAgICByZXR1cm4gRDNEX09LOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgVFJBQ0UoIkVuZCBvZiBlbnVtZXJhdGlvblxuIik7CiAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbigmZGRyYXdfY3MpOwogICAgcmV0dXJuIEQzRF9PSzsKfQoKc3RhdGljIEhSRVNVTFQgV0lOQVBJClRodW5rX0lEaXJlY3QzREltcGxfM19FbnVtWkJ1ZmZlckZvcm1hdHMoSURpcmVjdDNEMyAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVGQ0xTSUQgcmlpZERldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEQzREVOVU1QSVhFTEZPUk1BVFNDQUxMQkFDSyBDYWxsYmFjaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpDb250ZXh0KQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd0ltcGwsIElEaXJlY3QzRDMsIGlmYWNlKTsKICAgIFRSQUNFKCIoJXApLT4oJXMsJXAsJXApIHRodW5raW5nIHRvIElEaXJlY3QzRDcgaW50ZXJmYWNlLlxuIiwgVGhpcywgZGVidWdzdHJfZ3VpZChyaWlkRGV2aWNlKSwgQ2FsbGJhY2ssIENvbnRleHQpOwogICAgcmV0dXJuIElEaXJlY3QzRDdfRW51bVpCdWZmZXJGb3JtYXRzKElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRDcpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpaWREZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbGJhY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGV4dCk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0Q3OjpFdmljdE1hbmFnZWRUZXh0dXJlcwogKgogKiBSZW1vdmVzIGFsbCBtYW5hZ2VkIHRleHR1cmVzICg9c3VyZmFjZXMgd2l0aCBERFNDQVBTMl9URVhUVVJFTUFOQUdFIG9yCiAqIEREU0NBUFMyX0QzRFRFWFRVUkVNQU5BR0UgY2FwcykgdG8gYmUgcmVtb3ZlZCBmcm9tIHZpZGVvIG1lbW9yeS4KICoKICogVmVyc2lvbiAzIGFuZCA3CiAqCiAqIFJldHVybnM6CiAqICBEM0RfT0ssIGJlY2F1c2UgaXQncyBhIHN0dWIKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKSURpcmVjdDNESW1wbF83X0V2aWN0TWFuYWdlZFRleHR1cmVzKElEaXJlY3QzRDcgKmlmYWNlKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd0ltcGwsIElEaXJlY3QzRDcsIGlmYWNlKTsKICAgIEZJWE1FKCIoJXApOiBTdHViIVxuIiwgVGhpcyk7CgogICAgLyogSW1wbGVtZW50YXRpb24gaWRlYToKICAgICAqIEFkZCBhbiBJV2luZUQzRFN1cmZhY2UgbWV0aG9kIHdoaWNoIHNldHMgdGhlIG9wZW5nbCB0ZXh0dXJlCiAgICAgKiBwcmlvcml0eSBsb3cgb3IgZXZlbiByZW1vdmVzIHRoZSBvcGVuZ2wgdGV4dHVyZS4KICAgICAqLwoKICAgIHJldHVybiBEM0RfT0s7Cn0KCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpUaHVua19JRGlyZWN0M0RJbXBsXzNfRXZpY3RNYW5hZ2VkVGV4dHVyZXMoSURpcmVjdDNEMyAqaWZhY2UpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3SW1wbCwgSURpcmVjdDNEMywgaWZhY2UpOwogICAgVFJBQ0UoIiglcCktPigpIHRodW5raW5nIHRvIElEaXJlY3QzRDcgaW50ZXJmYWNlLlxuIiwgVGhpcyk7CiAgICByZXR1cm4gSURpcmVjdDNEN19FdmljdE1hbmFnZWRUZXh0dXJlcyhJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0Q3KSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0RJbXBsX0dldENhcHMKICoKICogVGhpcyBmdW5jdGlvbiByZXRyaWV2ZXMgdGhlIGRldmljZSBjYXBzIGZyb20gd2luZWQzZAogKiBhbmQgY29udmVydHMgaXQgaW50byBhIEQzRDcgYW5kIEQzRCAtIEQzRDMgc3RydWN0dXJlCiAqIFRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24gY2FsbGVkIGZyb20gdmFyaW91cyBwbGFjZXMgaW4gZGRyYXcKICoKICogUGFyYW1zOgogKiAgV2luZUQzRDogVGhlIGludGVyZmFjZSB0byBnZXQgdGhlIGNhcHMgZnJvbQogKiAgRGVzYzEyMzogT2xkIEQzRCA8MyBzdHJ1Y3R1cmUgdG8gZmlsbCAobmVlZGVkKQogKiAgRGVzYzc6IEQzRDcgZGV2aWNlIGRlc2Mgc3RydWN0dXJlIHRvIGZpbGwgKG5lZWRlZCkKICoKICogUmV0dXJucwogKiAgRDNEX09LIG9uIHN1Y2Nlc3MsIG9yIHRoZSByZXR1cm4gdmFsdWUgb2YgSVdpbmVEM0Q6OkdldENhcHMKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpIUkVTVUxUCklEaXJlY3QzREltcGxfR2V0Q2FwcyhJV2luZUQzRCAqV2luZUQzRCwKICAgICAgICAgICAgICAgICAgICAgIEQzRERFVklDRURFU0MgKkRlc2MxMjMsCiAgICAgICAgICAgICAgICAgICAgICBEM0RERVZJQ0VERVNDNyAqRGVzYzcpCnsKICAgIFdJTkVEM0RDQVBTIFdDYXBzOwogICAgSFJFU1VMVCBocjsKCiAgICAvKiBTb21lIFZhcmlhYmxlcyB0byBhc2lnbiB0byB0aGUgcG9pbnRlcnMgaW4gV0NhcHMgKi8KICAgIFdJTkVEM0RERVZUWVBFIERldlR5cGU7CiAgICBVSU5UIGR1bW15X3VpbnQ7CiAgICBmbG9hdCBkdW1teV9mbG9hdDsKICAgIERXT1JEIGR1bW15X2R3b3JkLCBNYXhUZXh0dXJlQmxlbmRTdGFnZXMsIE1heFNpbXVsdGFuZW91c1RleHR1cmVzOwogICAgRFdPUkQgTWF4VXNlckNsaXBQbGFuZXMsIE1heFZlcnRleEJsZW5kTWF0cmljZXM7CgogICAgVFJBQ0UoIigpLT4oJXAsJXAsJXBcbiIsIFdpbmVEM0QsIERlc2MxMjMsIERlc2M3KTsKCiAgICAvKiBBc2lnbiB0aGUgcG9pbnRlcnMgaW4gV0NhcHMgKi8KICAgIFdDYXBzLkRldmljZVR5cGUgPSAmRGV2VHlwZTsKICAgIFdDYXBzLkFkYXB0ZXJPcmRpbmFsID0gJmR1bW15X3VpbnQ7CgogICAgV0NhcHMuQ2FwcyA9ICZkdW1teV9kd29yZDsKICAgIFdDYXBzLkNhcHMyID0gJmR1bW15X2R3b3JkOwogICAgV0NhcHMuQ2FwczMgPSAmZHVtbXlfZHdvcmQ7CiAgICBXQ2Fwcy5QcmVzZW50YXRpb25JbnRlcnZhbHMgPSAmZHVtbXlfZHdvcmQ7CgogICAgV0NhcHMuQ3Vyc29yQ2FwcyA9ICZkdW1teV9kd29yZDsKCiAgICBXQ2Fwcy5EZXZDYXBzID0gJkRlc2M3LT5kd0RldkNhcHM7CiAgICBXQ2Fwcy5QcmltaXRpdmVNaXNjQ2FwcyA9ICZkdW1teV9kd29yZDsKICAgIFdDYXBzLlJhc3RlckNhcHMgPSAmRGVzYzctPmRwY0xpbmVDYXBzLmR3UmFzdGVyQ2FwczsKICAgIFdDYXBzLlpDbXBDYXBzID0gJkRlc2M3LT5kcGNMaW5lQ2Fwcy5kd1pDbXBDYXBzOwogICAgV0NhcHMuU3JjQmxlbmRDYXBzID0gJkRlc2M3LT5kcGNMaW5lQ2Fwcy5kd1NyY0JsZW5kQ2FwczsKICAgIFdDYXBzLkRlc3RCbGVuZENhcHMgPSAmRGVzYzctPmRwY0xpbmVDYXBzLmR3RGVzdEJsZW5kQ2FwczsKICAgIFdDYXBzLkFscGhhQ21wQ2FwcyA9ICZEZXNjNy0+ZHBjTGluZUNhcHMuZHdBbHBoYUNtcENhcHM7CiAgICBXQ2Fwcy5TaGFkZUNhcHMgPSAmRGVzYzctPmRwY0xpbmVDYXBzLmR3U2hhZGVDYXBzOwogICAgV0NhcHMuVGV4dHVyZUNhcHMgPSAmRGVzYzctPmRwY0xpbmVDYXBzLmR3VGV4dHVyZUNhcHM7CiAgICBXQ2Fwcy5UZXh0dXJlRmlsdGVyQ2FwcyA9ICZEZXNjNy0+ZHBjTGluZUNhcHMuZHdUZXh0dXJlRmlsdGVyQ2FwczsKICAgIFdDYXBzLkN1YmVUZXh0dXJlRmlsdGVyQ2FwcyA9ICZkdW1teV9kd29yZDsKICAgIFdDYXBzLlZvbHVtZVRleHR1cmVGaWx0ZXJDYXBzID0gJmR1bW15X2R3b3JkOwogICAgV0NhcHMuVGV4dHVyZUFkZHJlc3NDYXBzID0gJkRlc2M3LT5kcGNMaW5lQ2Fwcy5kd1RleHR1cmVBZGRyZXNzQ2FwczsKICAgIFdDYXBzLlZvbHVtZVRleHR1cmVBZGRyZXNzQ2FwcyA9ICZkdW1teV9kd29yZDsKCiAgICBXQ2Fwcy5MaW5lQ2FwcyA9ICZkdW1teV9kd29yZDsKICAgIFdDYXBzLk1heFRleHR1cmVXaWR0aCA9ICZEZXNjNy0+ZHdNYXhUZXh0dXJlV2lkdGg7CiAgICBXQ2Fwcy5NYXhUZXh0dXJlSGVpZ2h0ID0gJkRlc2M3LT5kd01heFRleHR1cmVIZWlnaHQ7CiAgICBXQ2Fwcy5NYXhWb2x1bWVFeHRlbnQgPSAmZHVtbXlfZHdvcmQ7CgogICAgV0NhcHMuTWF4VGV4dHVyZVJlcGVhdCA9ICZEZXNjNy0+ZHdNYXhUZXh0dXJlUmVwZWF0OwogICAgV0NhcHMuTWF4VGV4dHVyZUFzcGVjdFJhdGlvID0gJkRlc2M3LT5kd01heFRleHR1cmVBc3BlY3RSYXRpbzsKICAgIFdDYXBzLk1heEFuaXNvdHJvcHkgPSAmRGVzYzctPmR3TWF4QW5pc290cm9weTsKICAgIFdDYXBzLk1heFZlcnRleFcgPSAmRGVzYzctPmR2TWF4VmVydGV4VzsKCiAgICBXQ2Fwcy5HdWFyZEJhbmRMZWZ0ID0gJkRlc2M3LT5kdkd1YXJkQmFuZExlZnQ7CiAgICBXQ2Fwcy5HdWFyZEJhbmRUb3AgPSAmRGVzYzctPmR2R3VhcmRCYW5kVG9wOwogICAgV0NhcHMuR3VhcmRCYW5kUmlnaHQgPSAmRGVzYzctPmR2R3VhcmRCYW5kUmlnaHQ7CiAgICBXQ2Fwcy5HdWFyZEJhbmRCb3R0b20gPSAmRGVzYzctPmR2R3VhcmRCYW5kQm90dG9tOwoKICAgIFdDYXBzLkV4dGVudHNBZGp1c3QgPSAmRGVzYzctPmR2RXh0ZW50c0FkanVzdDsKICAgIFdDYXBzLlN0ZW5jaWxDYXBzID0gJkRlc2M3LT5kd1N0ZW5jaWxDYXBzOwoKICAgIFdDYXBzLkZWRkNhcHMgPSAmRGVzYzctPmR3RlZGQ2FwczsKICAgIFdDYXBzLlRleHR1cmVPcENhcHMgPSAmRGVzYzctPmR3VGV4dHVyZU9wQ2FwczsKICAgIFdDYXBzLk1heFRleHR1cmVCbGVuZFN0YWdlcyA9ICZNYXhUZXh0dXJlQmxlbmRTdGFnZXM7CiAgICBXQ2Fwcy5NYXhTaW11bHRhbmVvdXNUZXh0dXJlcyA9ICZNYXhTaW11bHRhbmVvdXNUZXh0dXJlczsKCiAgICBXQ2Fwcy5WZXJ0ZXhQcm9jZXNzaW5nQ2FwcyA9ICZEZXNjNy0+ZHdWZXJ0ZXhQcm9jZXNzaW5nQ2FwczsKICAgIFdDYXBzLk1heEFjdGl2ZUxpZ2h0cyA9ICZEZXNjNy0+ZHdNYXhBY3RpdmVMaWdodHM7CiAgICBXQ2Fwcy5NYXhVc2VyQ2xpcFBsYW5lcyA9ICZNYXhVc2VyQ2xpcFBsYW5lczsKICAgIFdDYXBzLk1heFZlcnRleEJsZW5kTWF0cmljZXMgPSAmTWF4VmVydGV4QmxlbmRNYXRyaWNlczsKICAgIFdDYXBzLk1heFZlcnRleEJsZW5kTWF0cml4SW5kZXggPSAmZHVtbXlfZHdvcmQ7CgogICAgV0NhcHMuTWF4UG9pbnRTaXplID0gJmR1bW15X2Zsb2F0OwogICAgV0NhcHMuTWF4UHJpbWl0aXZlQ291bnQgPSAmZHVtbXlfZHdvcmQ7CiAgICBXQ2Fwcy5NYXhWZXJ0ZXhJbmRleCA9ICZkdW1teV9kd29yZDsKICAgIFdDYXBzLk1heFN0cmVhbXMgPSAmZHVtbXlfZHdvcmQ7CiAgICBXQ2Fwcy5NYXhTdHJlYW1TdHJpZGUgPSAmZHVtbXlfZHdvcmQ7CgogICAgV0NhcHMuVmVydGV4U2hhZGVyVmVyc2lvbiA9ICZkdW1teV9kd29yZDsKICAgIFdDYXBzLk1heFZlcnRleFNoYWRlckNvbnN0ID0gJmR1bW15X2R3b3JkOwoKICAgIFdDYXBzLlBpeGVsU2hhZGVyVmVyc2lvbiA9ICZkdW1teV9kd29yZDsKICAgIFdDYXBzLlBpeGVsU2hhZGVyMXhNYXhWYWx1ZSA9ICZkdW1teV9mbG9hdDsKCiAgICAvKiBUaGVzZSBhcmUgZHg5IG9ubHksIHNldCB0aGVtIHRvIE5VTEwgKi8KICAgIFdDYXBzLkRldkNhcHMyID0gTlVMTDsKICAgIFdDYXBzLk1heE5wYXRjaFRlc3NlbGxhdGlvbkxldmVsID0gTlVMTDsKICAgIFdDYXBzLlJlc2VydmVkNSA9IE5VTEw7CiAgICBXQ2Fwcy5NYXN0ZXJBZGFwdGVyT3JkaW5hbCA9IE5VTEw7CiAgICBXQ2Fwcy5BZGFwdGVyT3JkaW5hbEluR3JvdXAgPSBOVUxMOwogICAgV0NhcHMuTnVtYmVyT2ZBZGFwdGVyc0luR3JvdXAgPSBOVUxMOwogICAgV0NhcHMuRGVjbFR5cGVzID0gTlVMTDsKICAgIFdDYXBzLk51bVNpbXVsdGFuZW91c1JUcyA9IE5VTEw7CiAgICBXQ2Fwcy5TdHJldGNoUmVjdEZpbHRlckNhcHMgPSBOVUxMOwogICAgLyogV0NhcHMuVlMyMENhcHMgPSBOVUxMOyAqLwogICAgLyogV0NhcHMuUFMyMENhcHMgPSBOVUxMOyAqLwogICAgV0NhcHMuVmVydGV4VGV4dHVyZUZpbHRlckNhcHMgPSBOVUxMOwogICAgV0NhcHMuTWF4VlNoYWRlckluc3RydWN0aW9uc0V4ZWN1dGVkID0gTlVMTDsKICAgIFdDYXBzLk1heFBTaGFkZXJJbnN0cnVjdGlvbnNFeGVjdXRlZCA9IE5VTEw7CiAgICBXQ2Fwcy5NYXhWZXJ0ZXhTaGFkZXIzMEluc3RydWN0aW9uU2xvdHMgPSBOVUxMOwogICAgV0NhcHMuTWF4UGl4ZWxTaGFkZXIzMEluc3RydWN0aW9uU2xvdHMgPSBOVUxMOwogICAgV0NhcHMuUmVzZXJ2ZWQyID0gTlVMTDsKICAgIFdDYXBzLlJlc2VydmVkMyA9IE5VTEw7CgogICAgLyogTm93IGdldCB0aGUgY2FwcyAqLwogICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oJmRkcmF3X2NzKTsKICAgIGhyID0gSVdpbmVEM0RfR2V0RGV2aWNlQ2FwcyhXaW5lRDNELCAwLCBXSU5FRDNEREVWVFlQRV9IQUwsICZXQ2Fwcyk7CiAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbigmZGRyYXdfY3MpOwogICAgaWYoaHIgIT0gRDNEX09LKQogICAgewogICAgICAgIHJldHVybiBocjsKICAgIH0KCiAgICAvKiBSZW1vdmUgYWxsIG5vbi1kM2Q3IGNhcHMgKi8KICAgIERlc2M3LT5kd0RldkNhcHMgJj0gKAogICAgICAgIEQzRERFVkNBUFNfRkxPQVRUTFZFUlRFWCAgICAgICAgIHwgRDNEREVWQ0FQU19TT1JUSU5DUkVBU0lOR1ogICAgICAgICAgfCBEM0RERVZDQVBTX1NPUlRERUNSRUFTSU5HWiAgICAgICAgICB8CiAgICAgICAgRDNEREVWQ0FQU19TT1JURVhBQ1QgICAgICAgICAgICAgfCBEM0RERVZDQVBTX0VYRUNVVEVTWVNURU1NRU1PUlkgICAgICB8IEQzRERFVkNBUFNfRVhFQ1VURVZJREVPTUVNT1JZICAgICAgIHwKICAgICAgICBEM0RERVZDQVBTX1RMVkVSVEVYU1lTVEVNTUVNT1JZICB8IEQzRERFVkNBUFNfVExWRVJURVhWSURFT01FTU9SWSAgICAgIHwgRDNEREVWQ0FQU19URVhUVVJFU1lTVEVNTUVNT1JZICAgICAgfAogICAgICAgIEQzRERFVkNBUFNfVEVYVFVSRVZJREVPTUVNT1JZICAgIHwgRDNEREVWQ0FQU19EUkFXUFJJTVRMVkVSVEVYICAgICAgICAgfCBEM0RERVZDQVBTX0NBTlJFTkRFUkFGVEVSRkxJUCAgICAgICB8CiAgICAgICAgRDNEREVWQ0FQU19URVhUVVJFTk9OTE9DQUxWSURNRU0gfCBEM0RERVZDQVBTX0RSQVdQUklNSVRJVkVTMiAgICAgICAgICB8IEQzRERFVkNBUFNfU0VQQVJBVEVURVhUVVJFTUVNT1JJRVMgIHwKICAgICAgICBEM0RERVZDQVBTX0RSQVdQUklNSVRJVkVTMkVYICAgICB8IEQzRERFVkNBUFNfSFdUUkFOU0ZPUk1BTkRMSUdIVCAgICAgIHwgRDNEREVWQ0FQU19DQU5CTFRTWVNUT05PTkxPQ0FMICAgICAgfAogICAgICAgIEQzRERFVkNBUFNfSFdSQVNURVJJWkFUSU9OKTsKCiAgICBEZXNjNy0+ZHdTdGVuY2lsQ2FwcyAmPSAoCiAgICAgICAgRDNEU1RFTkNJTENBUFNfS0VFUCAgICAgICAgICAgICAgfCBEM0RTVEVOQ0lMQ0FQU19aRVJPICAgICAgICAgICAgICAgICB8IEQzRFNURU5DSUxDQVBTX1JFUExBQ0UgICAgICAgICAgICAgIHwKICAgICAgICBEM0RTVEVOQ0lMQ0FQU19JTkNSU0FUICAgICAgICAgICB8IEQzRFNURU5DSUxDQVBTX0RFQ1JTQVQgICAgICAgICAgICAgIHwgRDNEU1RFTkNJTENBUFNfSU5WRVJUICAgICAgICAgICAgICAgfAogICAgICAgIEQzRFNURU5DSUxDQVBTX0lOQ1IgICAgICAgICAgICAgIHwgRDNEU1RFTkNJTENBUFNfREVDUiAgICAgICAgICAgICAgICAgfCBEM0RTVEVOQ0lMQ0FQU19UV09TSURFRCk7CgogICAgLyogRlZGIGNhcHMgPyovCgogICAgRGVzYzctPmR3VGV4dHVyZU9wQ2FwcyAmPSAoCiAgICAgICAgRDNEVEVYT1BDQVBTX0RJU0FCTEUgICAgICAgICAgICAgfCBEM0RURVhPUENBUFNfU0VMRUNUQVJHMSAgICAgICAgICAgICB8IEQzRFRFWE9QQ0FQU19TRUxFQ1RBUkcyICAgICAgICAgICAgIHwKICAgICAgICBEM0RURVhPUENBUFNfTU9EVUxBVEUgICAgICAgICAgICB8IEQzRFRFWE9QQ0FQU19NT0RVTEFURTJYICAgICAgICAgICAgIHwgRDNEVEVYT1BDQVBTX01PRFVMQVRFNFggICAgICAgICAgICAgfAogICAgICAgIEQzRFRFWE9QQ0FQU19BREQgICAgICAgICAgICAgICAgIHwgRDNEVEVYT1BDQVBTX0FERFNJR05FRCAgICAgICAgICAgICAgfCBEM0RURVhPUENBUFNfQUREU0lHTkVEMlggICAgICAgICAgICB8CiAgICAgICAgRDNEVEVYT1BDQVBTX1NVQlRSQUNUICAgICAgICAgICAgfCBEM0RURVhPUENBUFNfQUREU01PT1RIICAgICAgICAgICAgICB8IEQzRFRFWE9QQ0FQU19CTEVORFRFWFRVUkVBTFBIQSAgICAgIHwKICAgICAgICBEM0RURVhPUENBUFNfQkxFTkRGQUNUT1JBTFBIQSAgICB8IEQzRFRFWE9QQ0FQU19CTEVORFRFWFRVUkVBTFBIQVBNICAgIHwgRDNEVEVYT1BDQVBTX0JMRU5EQ1VSUkVOVEFMUEhBICAgICAgfAogICAgICAgIEQzRFRFWE9QQ0FQU19QUkVNT0RVTEFURSAgICAgICAgIHwgRDNEVEVYT1BDQVBTX01PRFVMQVRFQUxQSEFfQUREQ09MT1IgfCBEM0RURVhPUENBUFNfTU9EVUxBVEVDT0xPUl9BRERBTFBIQSB8CiAgICAgICAgRDNEVEVYT1BDQVBTX01PRFVMQVRFSU5WQUxQSEFfQUREQ09MT1IgfCBEM0RURVhPUENBUFNfTU9EVUxBVEVJTlZDT0xPUl9BRERBTFBIQSB8IEQzRFRFWE9QQ0FQU19CVU1QRU5WTUFQICAgIHwKICAgICAgICBEM0RURVhPUENBUFNfQlVNUEVOVk1BUExVTUlOQU5DRSB8IEQzRFRFWE9QQ0FQU19ET1RQUk9EVUNUMyk7CgogICAgRGVzYzctPmR3VmVydGV4UHJvY2Vzc2luZ0NhcHMgJj0gKAogICAgICAgIEQzRFZUWFBDQVBTX1RFWEdFTiAgICAgICAgICAgICAgIHwgRDNEVlRYUENBUFNfTUFURVJJQUxTT1VSQ0U3ICAgICAgICAgfCBEM0RWVFhQQ0FQU19WRVJURVhGT0cgICAgICAgICAgICAgICB8CiAgICAgICAgRDNEVlRYUENBUFNfRElSRUNUSU9OQUxMSUdIVFMgICAgfCBEM0RWVFhQQ0FQU19QT1NJVElPTkFMTElHSFRTICAgICAgICB8IEQzRFZUWFBDQVBTX0xPQ0FMVklFV0VSKTsKCiAgICBEZXNjNy0+ZHBjTGluZUNhcHMuZHdNaXNjQ2FwcyAmPSAoCiAgICAgICAgRDNEUE1JU0NDQVBTX01BU0tQTEFORVMgICAgICAgICAgfCBEM0RQTUlTQ0NBUFNfTUFTS1ogICAgICAgICAgICAgICAgICB8IEQzRFBNSVNDQ0FQU19MSU5FUEFUVEVSTlJFUCAgICAgICAgIHwKICAgICAgICBEM0RQTUlTQ0NBUFNfQ09ORk9STUFOVCAgICAgICAgICB8IEQzRFBNSVNDQ0FQU19DVUxMTk9ORSAgICAgICAgICAgICAgIHwgRDNEUE1JU0NDQVBTX0NVTExDVyAgICAgICAgICAgICAgICAgfAogICAgICAgIEQzRFBNSVNDQ0FQU19DVUxMQ0NXKTsKCiAgICBEZXNjNy0+ZHBjTGluZUNhcHMuZHdSYXN0ZXJDYXBzICY9ICgKICAgICAgICBEM0RQUkFTVEVSQ0FQU19ESVRIRVIgICAgICAgICAgICB8IEQzRFBSQVNURVJDQVBTX1JPUDIgICAgICAgICAgICAgICAgIHwgRDNEUFJBU1RFUkNBUFNfWE9SICAgICAgICAgICAgICAgICAgfAogICAgICAgIEQzRFBSQVNURVJDQVBTX1BBVCAgICAgICAgICAgICAgIHwgRDNEUFJBU1RFUkNBUFNfWlRFU1QgICAgICAgICAgICAgICAgfCBEM0RQUkFTVEVSQ0FQU19TVUJQSVhFTCAgICAgICAgICAgICB8CiAgICAgICAgRDNEUFJBU1RFUkNBUFNfU1VCUElYRUxYICAgICAgICAgfCBEM0RQUkFTVEVSQ0FQU19GT0dWRVJURVggICAgICAgICAgICB8IEQzRFBSQVNURVJDQVBTX0ZPR1RBQkxFICAgICAgICAgICAgIHwKICAgICAgICBEM0RQUkFTVEVSQ0FQU19TVElQUExFICAgICAgICAgICB8IEQzRFBSQVNURVJDQVBTX0FOVElBTElBU1NPUlRERVBFTkRFTlQgfCBEM0RQUkFTVEVSQ0FQU19BTlRJQUxJQVNTT1JUSU5ERVBFTkRFTlQgfAogICAgICAgIEQzRFBSQVNURVJDQVBTX0FOVElBTElBU0VER0VTICAgIHwgRDNEUFJBU1RFUkNBUFNfTUlQTUFQTE9EQklBUyAgICAgICAgfCBEM0RQUkFTVEVSQ0FQU19aQklBUyAgICAgICAgICAgICAgICB8CiAgICAgICAgRDNEUFJBU1RFUkNBUFNfWkJVRkZFUkxFU1NIU1IgICAgfCBEM0RQUkFTVEVSQ0FQU19GT0dSQU5HRSAgICAgICAgICAgICB8IEQzRFBSQVNURVJDQVBTX0FOSVNPVFJPUFkgICAgICAgICAgIHwKICAgICAgICBEM0RQUkFTVEVSQ0FQU19XQlVGRkVSICAgICAgICAgICB8IEQzRFBSQVNURVJDQVBTX1RSQU5TTFVDRU5UU09SVElOREVQRU5ERU5UIHwgRDNEUFJBU1RFUkNBUFNfV0ZPRyAgICAgICAgICAgfAogICAgICAgIEQzRFBSQVNURVJDQVBTX1pGT0cpOwoKICAgIERlc2M3LT5kcGNMaW5lQ2Fwcy5kd1pDbXBDYXBzICY9ICgKICAgICAgICBEM0RQQ01QQ0FQU19ORVZFUiAgICAgICAgICAgICAgICB8IEQzRFBDTVBDQVBTX0xFU1MgICAgICAgICAgICAgICAgICAgIHwgRDNEUENNUENBUFNfRVFVQUwgICAgICAgICAgICAgICAgICAgfAogICAgICAgIEQzRFBDTVBDQVBTX0xFU1NFUVVBTCAgICAgICAgICAgIHwgRDNEUENNUENBUFNfR1JFQVRFUiAgICAgICAgICAgICAgICAgfCBEM0RQQ01QQ0FQU19OT1RFUVVBTCAgICAgICAgICAgICAgICB8CiAgICAgICAgRDNEUENNUENBUFNfR1JFQVRFUkVRVUFMICAgICAgICAgfCBEM0RQQ01QQ0FQU19BTFdBWVMpOwoKICAgIERlc2M3LT5kcGNMaW5lQ2Fwcy5kd1NyY0JsZW5kQ2FwcyAmPSAoCiAgICAgICAgRDNEUEJMRU5EQ0FQU19aRVJPICAgICAgICAgICAgICAgfCBEM0RQQkxFTkRDQVBTX09ORSAgICAgICAgICAgICAgICAgICB8IEQzRFBCTEVORENBUFNfU1JDQ09MT1IgICAgICAgICAgICAgIHwKICAgICAgICBEM0RQQkxFTkRDQVBTX0lOVlNSQ0NPTE9SICAgICAgICB8IEQzRFBCTEVORENBUFNfU1JDQUxQSEEgICAgICAgICAgICAgIHwgRDNEUEJMRU5EQ0FQU19JTlZTUkNBTFBIQSAgICAgICAgICAgfAogICAgICAgIEQzRFBCTEVORENBUFNfREVTVEFMUEhBICAgICAgICAgIHwgRDNEUEJMRU5EQ0FQU19JTlZERVNUQUxQSEEgICAgICAgICAgfCBEM0RQQkxFTkRDQVBTX0RFU1RDT0xPUiAgICAgICAgICAgICB8CiAgICAgICAgRDNEUEJMRU5EQ0FQU19JTlZERVNUQ09MT1IgICAgICAgfCBEM0RQQkxFTkRDQVBTX1NSQ0FMUEhBU0FUICAgICAgICAgICB8IEQzRFBCTEVORENBUFNfQk9USFNSQ0FMUEhBICAgICAgICAgIHwKICAgICAgICBEM0RQQkxFTkRDQVBTX0JPVEhJTlZTUkNBTFBIQSk7CgogICAgRGVzYzctPmRwY0xpbmVDYXBzLmR3RGVzdEJsZW5kQ2FwcyAmPSAoCiAgICAgICAgRDNEUEJMRU5EQ0FQU19aRVJPICAgICAgICAgICAgICAgfCBEM0RQQkxFTkRDQVBTX09ORSAgICAgICAgICAgICAgICAgICB8IEQzRFBCTEVORENBUFNfU1JDQ09MT1IgICAgICAgICAgICAgIHwKICAgICAgICBEM0RQQkxFTkRDQVBTX0lOVlNSQ0NPTE9SICAgICAgICB8IEQzRFBCTEVORENBUFNfU1JDQUxQSEEgICAgICAgICAgICAgIHwgRDNEUEJMRU5EQ0FQU19JTlZTUkNBTFBIQSAgICAgICAgICAgfAogICAgICAgIEQzRFBCTEVORENBUFNfREVTVEFMUEhBICAgICAgICAgIHwgRDNEUEJMRU5EQ0FQU19JTlZERVNUQUxQSEEgICAgICAgICAgfCBEM0RQQkxFTkRDQVBTX0RFU1RDT0xPUiAgICAgICAgICAgICB8CiAgICAgICAgRDNEUEJMRU5EQ0FQU19JTlZERVNUQ09MT1IgICAgICAgfCBEM0RQQkxFTkRDQVBTX1NSQ0FMUEhBU0FUICAgICAgICAgICB8IEQzRFBCTEVORENBUFNfQk9USFNSQ0FMUEhBICAgICAgICAgIHwKICAgICAgICBEM0RQQkxFTkRDQVBTX0JPVEhJTlZTUkNBTFBIQSk7CgogICAgRGVzYzctPmRwY0xpbmVDYXBzLmR3QWxwaGFDbXBDYXBzICY9ICgKICAgICAgICBEM0RQQ01QQ0FQU19ORVZFUiAgICAgICAgICAgICAgICB8IEQzRFBDTVBDQVBTX0xFU1MgICAgICAgICAgICAgICAgICAgIHwgRDNEUENNUENBUFNfRVFVQUwgICAgICAgICAgICAgICAgICAgfAogICAgICAgIEQzRFBDTVBDQVBTX0xFU1NFUVVBTCAgICAgICAgICAgIHwgRDNEUENNUENBUFNfR1JFQVRFUiAgICAgICAgICAgICAgICAgfCBEM0RQQ01QQ0FQU19OT1RFUVVBTCAgICAgICAgICAgICAgICB8CiAgICAgICAgRDNEUENNUENBUFNfR1JFQVRFUkVRVUFMICAgICAgICAgfCBEM0RQQ01QQ0FQU19BTFdBWVMpOwoKICAgIERlc2M3LT5kcGNMaW5lQ2Fwcy5kd1NoYWRlQ2FwcyAmPSAoCiAgICAgICAgRDNEUFNIQURFQ0FQU19DT0xPUkZMQVRNT05PICAgICAgfCBEM0RQU0hBREVDQVBTX0NPTE9SRkxBVFJHQiAgICAgICAgICB8IEQzRFBTSEFERUNBUFNfQ09MT1JHT1VSQVVETU9OTyAgICAgIHwKICAgICAgICBEM0RQU0hBREVDQVBTX0NPTE9SR09VUkFVRFJHQiAgICB8IEQzRFBTSEFERUNBUFNfQ09MT1JQSE9OR01PTk8gICAgICAgIHwgRDNEUFNIQURFQ0FQU19DT0xPUlBIT05HUkdCICAgICAgICAgfAogICAgICAgIEQzRFBTSEFERUNBUFNfU1BFQ1VMQVJGTEFUTU9OTyAgIHwgRDNEUFNIQURFQ0FQU19TUEVDVUxBUkZMQVRSR0IgICAgICAgfCBEM0RQU0hBREVDQVBTX1NQRUNVTEFSR09VUkFVRE1PTk8gICB8CiAgICAgICAgRDNEUFNIQURFQ0FQU19TUEVDVUxBUkdPVVJBVURSR0IgfCBEM0RQU0hBREVDQVBTX1NQRUNVTEFSUEhPTkdNT05PICAgICB8IEQzRFBTSEFERUNBUFNfU1BFQ1VMQVJQSE9OR1JHQiAgICAgIHwKICAgICAgICBEM0RQU0hBREVDQVBTX0FMUEhBRkxBVEJMRU5EICAgICB8IEQzRFBTSEFERUNBUFNfQUxQSEFGTEFUU1RJUFBMRUQgICAgIHwgRDNEUFNIQURFQ0FQU19BTFBIQUdPVVJBVURCTEVORCAgICAgfAogICAgICAgIEQzRFBTSEFERUNBUFNfQUxQSEFHT1VSQVVEU1RJUFBMRUQgfCBEM0RQU0hBREVDQVBTX0FMUEhBUEhPTkdCTEVORCAgICAgfCBEM0RQU0hBREVDQVBTX0FMUEhBUEhPTkdTVElQUExFRCAgICB8CiAgICAgICAgRDNEUFNIQURFQ0FQU19GT0dGTEFUICAgICAgICAgICAgfCBEM0RQU0hBREVDQVBTX0ZPR0dPVVJBVUQgICAgICAgICAgICB8IEQzRFBTSEFERUNBUFNfRk9HUEhPTkcpOwoKICAgIERlc2M3LT5kcGNMaW5lQ2Fwcy5kd1RleHR1cmVDYXBzICY9ICgKICAgICAgICBEM0RQVEVYVFVSRUNBUFNfUEVSU1BFQ1RJVkUgICAgICB8IEQzRFBURVhUVVJFQ0FQU19QT1cyICAgICAgICAgICAgICAgIHwgRDNEUFRFWFRVUkVDQVBTX0FMUEhBICAgICAgICAgICAgICAgfAogICAgICAgIEQzRFBURVhUVVJFQ0FQU19UUkFOU1BBUkVOQ1kgICAgIHwgRDNEUFRFWFRVUkVDQVBTX0JPUkRFUiAgICAgICAgICAgICAgfCBEM0RQVEVYVFVSRUNBUFNfU1FVQVJFT05MWSAgICAgICAgICB8CiAgICAgICAgRDNEUFRFWFRVUkVDQVBTX1RFWFJFUEVBVE5PVFNDQUxFREJZU0laRSB8IEQzRFBURVhUVVJFQ0FQU19BTFBIQVBBTEVUVEV8IEQzRFBURVhUVVJFQ0FQU19OT05QT1cyQ09ORElUSU9OQUwgIHwKICAgICAgICBEM0RQVEVYVFVSRUNBUFNfUFJPSkVDVEVEICAgICAgICB8IEQzRFBURVhUVVJFQ0FQU19DVUJFTUFQICAgICAgICAgICAgIHwgRDNEUFRFWFRVUkVDQVBTX0NPTE9SS0VZQkxFTkQpOwoKICAgIERlc2M3LT5kcGNMaW5lQ2Fwcy5kd1RleHR1cmVGaWx0ZXJDYXBzICY9ICgKICAgICAgICBEM0RQVEZJTFRFUkNBUFNfTkVBUkVTVCAgICAgICAgICB8IEQzRFBURklMVEVSQ0FQU19MSU5FQVIgICAgICAgICAgICAgIHwgRDNEUFRGSUxURVJDQVBTX01JUE5FQVJFU1QgICAgICAgICAgfAogICAgICAgIEQzRFBURklMVEVSQ0FQU19NSVBMSU5FQVIgICAgICAgIHwgRDNEUFRGSUxURVJDQVBTX0xJTkVBUk1JUE5FQVJFU1QgICAgfCBEM0RQVEZJTFRFUkNBUFNfTElORUFSTUlQTElORUFSICAgICB8CiAgICAgICAgRDNEUFRGSUxURVJDQVBTX01JTkZQT0lOVCAgICAgICAgfCBEM0RQVEZJTFRFUkNBUFNfTUlORkxJTkVBUiAgICAgICAgICB8IEQzRFBURklMVEVSQ0FQU19NSU5GQU5JU09UUk9QSUMgICAgIHwKICAgICAgICBEM0RQVEZJTFRFUkNBUFNfTUlQRlBPSU5UICAgICAgICB8IEQzRFBURklMVEVSQ0FQU19NSVBGTElORUFSICAgICAgICAgIHwgRDNEUFRGSUxURVJDQVBTX01BR0ZQT0lOVCAgICAgICAgICAgfAogICAgICAgIEQzRFBURklMVEVSQ0FQU19NQUdGTElORUFSICAgICAgIHwgRDNEUFRGSUxURVJDQVBTX01BR0ZBTklTT1RST1BJQyAgICAgfCBEM0RQVEZJTFRFUkNBUFNfTUFHRkFGTEFUQ1VCSUMgICAgICB8CiAgICAgICAgRDNEUFRGSUxURVJDQVBTX01BR0ZHQVVTU0lBTkNVQklDKTsKCiAgICBEZXNjNy0+ZHBjTGluZUNhcHMuZHdUZXh0dXJlQmxlbmRDYXBzICY9ICgKICAgICAgICBEM0RQVEJMRU5EQ0FQU19ERUNBTCAgICAgICAgICAgICB8IEQzRFBUQkxFTkRDQVBTX01PRFVMQVRFICAgICAgICAgICAgIHwgRDNEUFRCTEVORENBUFNfREVDQUxBTFBIQSAgICAgICAgICAgfAogICAgICAgIEQzRFBUQkxFTkRDQVBTX01PRFVMQVRFQUxQSEEgICAgIHwgRDNEUFRCTEVORENBUFNfREVDQUxNQVNLICAgICAgICAgICAgfCBEM0RQVEJMRU5EQ0FQU19NT0RVTEFURU1BU0sgICAgICAgICB8CiAgICAgICAgRDNEUFRCTEVORENBUFNfQ09QWSAgICAgICAgICAgICAgfCBEM0RQVEJMRU5EQ0FQU19BREQpOwoKICAgIERlc2M3LT5kcGNMaW5lQ2Fwcy5kd1RleHR1cmVBZGRyZXNzQ2FwcyAmPSAoCiAgICAgICAgRDNEUFRBRERSRVNTQ0FQU19XUkFQICAgICAgICAgICAgfCBEM0RQVEFERFJFU1NDQVBTX01JUlJPUiAgICAgICAgICAgICB8IEQzRFBUQUREUkVTU0NBUFNfQ0xBTVAgICAgICAgICAgICAgIHwKICAgICAgICBEM0RQVEFERFJFU1NDQVBTX0JPUkRFUiAgICAgICAgICB8IEQzRFBUQUREUkVTU0NBUFNfSU5ERVBFTkRFTlRVVik7CgogICAgaWYoIShEZXNjNy0+ZHBjTGluZUNhcHMuZHdUZXh0dXJlQ2FwcyAmIEQzRFBURVhUVVJFQ0FQU19QT1cyKSkgewogICAgICAgIC8qIERpcmVjdFg3IGFsd2F5cyBoYXMgdGhlIG5wMiBmbGFnIHNldCwgbm8gbWF0dGVyIHdoYXQgdGhlIGNhcmQgc3VwcG9ydHMuIFNvbWUgb2xkIGdhbWVzKHJvbGxjYWdlKQogICAgICAgICAqIGNoZWNrIHRoZSBjYXBzIGluY29ycmVjdGx5LiBJZiB3aW5lZDNkIHN1cHBvcnRzIG5vbnBvdzIgdGV4dHVyZXMgaXQgYWxzbyBoYXMgbnAyIGNvbmRpdGlvbmFsIHN1cHBvcnQKICAgICAgICAgKi8KICAgICAgICBEZXNjNy0+ZHBjTGluZUNhcHMuZHdUZXh0dXJlQ2FwcyB8PSBEM0RQVEVYVFVSRUNBUFNfUE9XMiB8IEQzRFBURVhUVVJFQ0FQU19OT05QT1cyQ09ORElUSU9OQUw7CiAgICB9CiAgICAvKiBGaWxsIHRoZSBtaXNzaW5nIG1lbWJlcnMsIGFuZCBkbyBzb21lIGZpeHVwICovCiAgICBEZXNjNy0+ZHBjTGluZUNhcHMuZHdTaXplID0gc2l6ZW9mKERlc2M3LT5kcGNMaW5lQ2Fwcyk7CiAgICBEZXNjNy0+ZHBjTGluZUNhcHMuZHdUZXh0dXJlQmxlbmRDYXBzID0gRDNEUFRCTEVORENBUFNfQUREIHwgRDNEUFRCTEVORENBUFNfTU9EVUxBVEVNQVNLIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RQVEJMRU5EQ0FQU19DT1BZIHwgRDNEUFRCTEVORENBUFNfREVDQUwgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFBUQkxFTkRDQVBTX0RFQ0FMQUxQSEEgfCBEM0RQVEJMRU5EQ0FQU19ERUNBTE1BU0sgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFBUQkxFTkRDQVBTX01PRFVMQVRFIHwgRDNEUFRCTEVORENBUFNfTU9EVUxBVEVBTFBIQTsKICAgIERlc2M3LT5kcGNMaW5lQ2Fwcy5kd1N0aXBwbGVXaWR0aCA9IDMyOwogICAgRGVzYzctPmRwY0xpbmVDYXBzLmR3U3RpcHBsZUhlaWdodCA9IDMyOwogICAgLyogVXNlIHRoZSBzYW1lIGZvciB0aGUgVHJpQ2FwcyAqLwogICAgRGVzYzctPmRwY1RyaUNhcHMgPSBEZXNjNy0+ZHBjTGluZUNhcHM7CgogICAgRGVzYzctPmR3RGV2aWNlUmVuZGVyQml0RGVwdGggPSBEREJEXzE2IHwgRERCRF8yNCB8IEREQkRfMzI7CiAgICBEZXNjNy0+ZHdEZXZpY2VaQnVmZmVyQml0RGVwdGggPSBEREJEXzE2IHwgRERCRF8yNDsKICAgIERlc2M3LT5kd01pblRleHR1cmVXaWR0aCA9IDE7CiAgICBEZXNjNy0+ZHdNaW5UZXh0dXJlSGVpZ2h0ID0gMTsKCiAgICAvKiBDb252ZXJ0IERXT1JEcyBzYWZlbHkgdG8gV09SRHMgKi8KICAgIGlmKE1heFRleHR1cmVCbGVuZFN0YWdlcyA+IDY1NTM1KSBEZXNjNy0+d01heFRleHR1cmVCbGVuZFN0YWdlcyA9IDY1NTM1OwogICAgZWxzZSBEZXNjNy0+d01heFRleHR1cmVCbGVuZFN0YWdlcyA9IChXT1JEKSBNYXhUZXh0dXJlQmxlbmRTdGFnZXM7CiAgICBpZihNYXhTaW11bHRhbmVvdXNUZXh0dXJlcyA+IDY1NTM1KSBEZXNjNy0+d01heFNpbXVsdGFuZW91c1RleHR1cmVzID0gNjU1MzU7CiAgICBlbHNlIERlc2M3LT53TWF4U2ltdWx0YW5lb3VzVGV4dHVyZXMgPSAoV09SRCkgTWF4U2ltdWx0YW5lb3VzVGV4dHVyZXM7CgogICAgaWYoTWF4VXNlckNsaXBQbGFuZXMgPiA2NTUzNSkgRGVzYzctPndNYXhVc2VyQ2xpcFBsYW5lcyA9IDY1NTM1OwogICAgZWxzZSBEZXNjNy0+d01heFVzZXJDbGlwUGxhbmVzID0gKFdPUkQpIE1heFVzZXJDbGlwUGxhbmVzOwogICAgaWYoTWF4VmVydGV4QmxlbmRNYXRyaWNlcyA+IDY1NTM1KSBEZXNjNy0+d01heFZlcnRleEJsZW5kTWF0cmljZXMgPSA2NTUzNTsKICAgIGVsc2UgRGVzYzctPndNYXhWZXJ0ZXhCbGVuZE1hdHJpY2VzID0gKFdPUkQpIE1heFZlcnRleEJsZW5kTWF0cmljZXM7CgogICAgRGVzYzctPmRldmljZUdVSUQgPSBJSURfSURpcmVjdDNEVG5MSGFsRGV2aWNlOwoKICAgIERlc2M3LT5kd1Jlc2VydmVkMSA9IDA7CiAgICBEZXNjNy0+ZHdSZXNlcnZlZDIgPSAwOwogICAgRGVzYzctPmR3UmVzZXJ2ZWQzID0gMDsKICAgIERlc2M3LT5kd1Jlc2VydmVkNCA9IDA7CgogICAgLyogRmlsbCB0aGUgb2xkIHN0cnVjdHVyZSAqLwogICAgbWVtc2V0KERlc2MxMjMsIDB4MCwgc2l6ZW9mKEQzRERFVklDRURFU0MpKTsKICAgIERlc2MxMjMtPmR3U2l6ZSA9IHNpemVvZihEM0RERVZJQ0VERVNDKTsKICAgIERlc2MxMjMtPmR3RmxhZ3MgPSBEM0RERF9DT0xPUk1PREVMICAgICAgICAgICAgfAogICAgICAgICAgICAgICAgICAgICAgIEQzREREX0RFVkNBUFMgICAgICAgICAgICAgICB8CiAgICAgICAgICAgICAgICAgICAgICAgRDNERERfVFJBTlNGT1JNQ0FQUyAgICAgICAgIHwKICAgICAgICAgICAgICAgICAgICAgICBEM0RERF9CQ0xJUFBJTkcgICAgICAgICAgICAgfAogICAgICAgICAgICAgICAgICAgICAgIEQzREREX0xJR0hUSU5HQ0FQUyAgICAgICAgICB8CiAgICAgICAgICAgICAgICAgICAgICAgRDNERERfTElORUNBUFMgICAgICAgICAgICAgIHwKICAgICAgICAgICAgICAgICAgICAgICBEM0RERF9UUklDQVBTICAgICAgICAgICAgICAgfAogICAgICAgICAgICAgICAgICAgICAgIEQzREREX0RFVklDRVJFTkRFUkJJVERFUFRIICB8CiAgICAgICAgICAgICAgICAgICAgICAgRDNERERfREVWSUNFWkJVRkZFUkJJVERFUFRIIHwKICAgICAgICAgICAgICAgICAgICAgICBEM0RERF9NQVhCVUZGRVJTSVpFICAgICAgICAgfAogICAgICAgICAgICAgICAgICAgICAgIEQzREREX01BWFZFUlRFWENPVU5UOwogICAgRGVzYzEyMy0+ZGNtQ29sb3JNb2RlbCA9IEQzRENPTE9SX1JHQjsKICAgIERlc2MxMjMtPmR3RGV2Q2FwcyA9IERlc2M3LT5kd0RldkNhcHM7CiAgICBEZXNjMTIzLT5kdGNUcmFuc2Zvcm1DYXBzLmR3U2l6ZSA9IHNpemVvZihEM0RUUkFOU0ZPUk1DQVBTKTsKICAgIERlc2MxMjMtPmR0Y1RyYW5zZm9ybUNhcHMuZHdDYXBzID0gRDNEVFJBTlNGT1JNQ0FQU19DTElQOwogICAgRGVzYzEyMy0+YkNsaXBwaW5nID0gVFJVRTsKICAgIERlc2MxMjMtPmRsY0xpZ2h0aW5nQ2Fwcy5kd1NpemUgPSBzaXplb2YoRDNETElHSFRJTkdDQVBTKTsKICAgIERlc2MxMjMtPmRsY0xpZ2h0aW5nQ2Fwcy5kd0NhcHMgPSBEM0RMSUdIVENBUFNfRElSRUNUSU9OQUwgfCBEM0RMSUdIVENBUFNfUEFSQUxMRUxQT0lOVCB8IEQzRExJR0hUQ0FQU19QT0lOVCB8IEQzRExJR0hUQ0FQU19TUE9UOwogICAgRGVzYzEyMy0+ZGxjTGlnaHRpbmdDYXBzLmR3TGlnaHRpbmdNb2RlbCA9IEQzRExJR0hUSU5HTU9ERUxfUkdCOwogICAgRGVzYzEyMy0+ZGxjTGlnaHRpbmdDYXBzLmR3TnVtTGlnaHRzID0gRGVzYzctPmR3TWF4QWN0aXZlTGlnaHRzOwoKICAgIERlc2MxMjMtPmRwY0xpbmVDYXBzLmR3U2l6ZSA9IHNpemVvZihEM0RQUklNQ0FQUyk7CiAgICBEZXNjMTIzLT5kcGNMaW5lQ2Fwcy5kd01pc2NDYXBzID0gRGVzYzctPmRwY0xpbmVDYXBzLmR3TWlzY0NhcHM7CiAgICBEZXNjMTIzLT5kcGNMaW5lQ2Fwcy5kd1Jhc3RlckNhcHMgPSBEZXNjNy0+ZHBjTGluZUNhcHMuZHdSYXN0ZXJDYXBzOwogICAgRGVzYzEyMy0+ZHBjTGluZUNhcHMuZHdaQ21wQ2FwcyA9IERlc2M3LT5kcGNMaW5lQ2Fwcy5kd1pDbXBDYXBzOwogICAgRGVzYzEyMy0+ZHBjTGluZUNhcHMuZHdTcmNCbGVuZENhcHMgPSBEZXNjNy0+ZHBjTGluZUNhcHMuZHdTcmNCbGVuZENhcHM7CiAgICBEZXNjMTIzLT5kcGNMaW5lQ2Fwcy5kd0Rlc3RCbGVuZENhcHMgPSBEZXNjNy0+ZHBjTGluZUNhcHMuZHdEZXN0QmxlbmRDYXBzOwogICAgRGVzYzEyMy0+ZHBjTGluZUNhcHMuZHdTaGFkZUNhcHMgPSBEZXNjNy0+ZHBjTGluZUNhcHMuZHdTaGFkZUNhcHM7CiAgICBEZXNjMTIzLT5kcGNMaW5lQ2Fwcy5kd1RleHR1cmVDYXBzID0gRGVzYzctPmRwY0xpbmVDYXBzLmR3VGV4dHVyZUNhcHM7CiAgICBEZXNjMTIzLT5kcGNMaW5lQ2Fwcy5kd1RleHR1cmVGaWx0ZXJDYXBzID0gRGVzYzctPmRwY0xpbmVDYXBzLmR3VGV4dHVyZUZpbHRlckNhcHM7CiAgICBEZXNjMTIzLT5kcGNMaW5lQ2Fwcy5kd1RleHR1cmVCbGVuZENhcHMgPSBEZXNjNy0+ZHBjTGluZUNhcHMuZHdUZXh0dXJlQmxlbmRDYXBzOwogICAgRGVzYzEyMy0+ZHBjTGluZUNhcHMuZHdUZXh0dXJlQWRkcmVzc0NhcHMgPSBEZXNjNy0+ZHBjTGluZUNhcHMuZHdUZXh0dXJlQWRkcmVzc0NhcHM7CiAgICBEZXNjMTIzLT5kcGNMaW5lQ2Fwcy5kd1N0aXBwbGVXaWR0aCA9IERlc2M3LT5kcGNMaW5lQ2Fwcy5kd1N0aXBwbGVXaWR0aDsKICAgIERlc2MxMjMtPmRwY0xpbmVDYXBzLmR3QWxwaGFDbXBDYXBzID0gRGVzYzctPmRwY0xpbmVDYXBzLmR3QWxwaGFDbXBDYXBzOwoKICAgIERlc2MxMjMtPmRwY1RyaUNhcHMuZHdTaXplID0gc2l6ZW9mKEQzRFBSSU1DQVBTKTsKICAgIERlc2MxMjMtPmRwY1RyaUNhcHMuZHdNaXNjQ2FwcyA9IERlc2M3LT5kcGNUcmlDYXBzLmR3TWlzY0NhcHM7CiAgICBEZXNjMTIzLT5kcGNUcmlDYXBzLmR3UmFzdGVyQ2FwcyA9IERlc2M3LT5kcGNUcmlDYXBzLmR3UmFzdGVyQ2FwczsKICAgIERlc2MxMjMtPmRwY1RyaUNhcHMuZHdaQ21wQ2FwcyA9IERlc2M3LT5kcGNUcmlDYXBzLmR3WkNtcENhcHM7CiAgICBEZXNjMTIzLT5kcGNUcmlDYXBzLmR3U3JjQmxlbmRDYXBzID0gRGVzYzctPmRwY1RyaUNhcHMuZHdTcmNCbGVuZENhcHM7CiAgICBEZXNjMTIzLT5kcGNUcmlDYXBzLmR3RGVzdEJsZW5kQ2FwcyA9IERlc2M3LT5kcGNUcmlDYXBzLmR3RGVzdEJsZW5kQ2FwczsKICAgIERlc2MxMjMtPmRwY1RyaUNhcHMuZHdTaGFkZUNhcHMgPSBEZXNjNy0+ZHBjVHJpQ2Fwcy5kd1NoYWRlQ2FwczsKICAgIERlc2MxMjMtPmRwY1RyaUNhcHMuZHdUZXh0dXJlQ2FwcyA9IERlc2M3LT5kcGNUcmlDYXBzLmR3VGV4dHVyZUNhcHM7CiAgICBEZXNjMTIzLT5kcGNUcmlDYXBzLmR3VGV4dHVyZUZpbHRlckNhcHMgPSBEZXNjNy0+ZHBjVHJpQ2Fwcy5kd1RleHR1cmVGaWx0ZXJDYXBzOwogICAgRGVzYzEyMy0+ZHBjVHJpQ2Fwcy5kd1RleHR1cmVCbGVuZENhcHMgPSBEZXNjNy0+ZHBjVHJpQ2Fwcy5kd1RleHR1cmVCbGVuZENhcHM7CiAgICBEZXNjMTIzLT5kcGNUcmlDYXBzLmR3VGV4dHVyZUFkZHJlc3NDYXBzID0gRGVzYzctPmRwY1RyaUNhcHMuZHdUZXh0dXJlQWRkcmVzc0NhcHM7CiAgICBEZXNjMTIzLT5kcGNUcmlDYXBzLmR3U3RpcHBsZVdpZHRoID0gRGVzYzctPmRwY1RyaUNhcHMuZHdTdGlwcGxlV2lkdGg7CiAgICBEZXNjMTIzLT5kcGNUcmlDYXBzLmR3QWxwaGFDbXBDYXBzID0gRGVzYzctPmRwY1RyaUNhcHMuZHdBbHBoYUNtcENhcHM7CgogICAgRGVzYzEyMy0+ZHdEZXZpY2VSZW5kZXJCaXREZXB0aCA9IERlc2M3LT5kd0RldmljZVJlbmRlckJpdERlcHRoOwogICAgRGVzYzEyMy0+ZHdEZXZpY2VaQnVmZmVyQml0RGVwdGggPSBEZXNjNy0+ZHdEZXZpY2VaQnVmZmVyQml0RGVwdGg7CiAgICBEZXNjMTIzLT5kd01heEJ1ZmZlclNpemUgPSAwOwogICAgRGVzYzEyMy0+ZHdNYXhWZXJ0ZXhDb3VudCA9IDY1NTM2OwogICAgRGVzYzEyMy0+ZHdNaW5UZXh0dXJlV2lkdGggID0gRGVzYzctPmR3TWluVGV4dHVyZVdpZHRoOwogICAgRGVzYzEyMy0+ZHdNaW5UZXh0dXJlSGVpZ2h0ID0gRGVzYzctPmR3TWluVGV4dHVyZUhlaWdodDsKICAgIERlc2MxMjMtPmR3TWF4VGV4dHVyZVdpZHRoICA9IERlc2M3LT5kd01heFRleHR1cmVXaWR0aDsKICAgIERlc2MxMjMtPmR3TWF4VGV4dHVyZUhlaWdodCA9IERlc2M3LT5kd01heFRleHR1cmVIZWlnaHQ7CiAgICBEZXNjMTIzLT5kd01pblN0aXBwbGVXaWR0aCAgPSAxOwogICAgRGVzYzEyMy0+ZHdNaW5TdGlwcGxlSGVpZ2h0ID0gMTsKICAgIERlc2MxMjMtPmR3TWF4U3RpcHBsZVdpZHRoICA9IDMyOwogICAgRGVzYzEyMy0+ZHdNYXhTdGlwcGxlSGVpZ2h0ID0gMzI7CiAgICBEZXNjMTIzLT5kd01heFRleHR1cmVSZXBlYXQgPSBEZXNjNy0+ZHdNYXhUZXh0dXJlUmVwZWF0OwogICAgRGVzYzEyMy0+ZHdNYXhUZXh0dXJlQXNwZWN0UmF0aW8gPSBEZXNjNy0+ZHdNYXhUZXh0dXJlQXNwZWN0UmF0aW87CiAgICBEZXNjMTIzLT5kd01heEFuaXNvdHJvcHkgPSBEZXNjNy0+ZHdNYXhBbmlzb3Ryb3B5OwogICAgRGVzYzEyMy0+ZHZHdWFyZEJhbmRMZWZ0ID0gRGVzYzctPmR2R3VhcmRCYW5kTGVmdDsKICAgIERlc2MxMjMtPmR2R3VhcmRCYW5kUmlnaHQgPSBEZXNjNy0+ZHZHdWFyZEJhbmRSaWdodDsKICAgIERlc2MxMjMtPmR2R3VhcmRCYW5kVG9wID0gRGVzYzctPmR2R3VhcmRCYW5kVG9wOwogICAgRGVzYzEyMy0+ZHZHdWFyZEJhbmRCb3R0b20gPSBEZXNjNy0+ZHZHdWFyZEJhbmRCb3R0b207CiAgICBEZXNjMTIzLT5kdkV4dGVudHNBZGp1c3QgPSBEZXNjNy0+ZHZFeHRlbnRzQWRqdXN0OwogICAgRGVzYzEyMy0+ZHdTdGVuY2lsQ2FwcyA9IERlc2M3LT5kd1N0ZW5jaWxDYXBzOwogICAgRGVzYzEyMy0+ZHdGVkZDYXBzID0gRGVzYzctPmR3RlZGQ2FwczsKICAgIERlc2MxMjMtPmR3VGV4dHVyZU9wQ2FwcyA9IERlc2M3LT5kd1RleHR1cmVPcENhcHM7CiAgICBEZXNjMTIzLT53TWF4VGV4dHVyZUJsZW5kU3RhZ2VzID0gRGVzYzctPndNYXhUZXh0dXJlQmxlbmRTdGFnZXM7CiAgICBEZXNjMTIzLT53TWF4U2ltdWx0YW5lb3VzVGV4dHVyZXMgPSBEZXNjNy0+d01heFNpbXVsdGFuZW91c1RleHR1cmVzOwoKICAgIHJldHVybiBERF9PSzsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNEIHZ0YWJsZXMgaW4gdmFyaW91cyB2ZXJzaW9ucwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpjb25zdCBJRGlyZWN0M0RWdGJsIElEaXJlY3QzRDFfVnRibCA9CnsKICAgIC8qKiogSVVua25vd24gbWV0aG9kcyAqKiovCiAgICBUaHVua19JRGlyZWN0M0RJbXBsXzFfUXVlcnlJbnRlcmZhY2UsCiAgICBUaHVua19JRGlyZWN0M0RJbXBsXzFfQWRkUmVmLAogICAgVGh1bmtfSURpcmVjdDNESW1wbF8xX1JlbGVhc2UsCiAgICAvKioqIElEaXJlY3QzRCBtZXRob2RzICoqKi8KICAgIElEaXJlY3QzREltcGxfMV9Jbml0aWFsaXplLAogICAgVGh1bmtfSURpcmVjdDNESW1wbF8xX0VudW1EZXZpY2VzLAogICAgVGh1bmtfSURpcmVjdDNESW1wbF8xX0NyZWF0ZUxpZ2h0LAogICAgVGh1bmtfSURpcmVjdDNESW1wbF8xX0NyZWF0ZU1hdGVyaWFsLAogICAgVGh1bmtfSURpcmVjdDNESW1wbF8xX0NyZWF0ZVZpZXdwb3J0LAogICAgVGh1bmtfSURpcmVjdDNESW1wbF8xX0ZpbmREZXZpY2UKfTsKCmNvbnN0IElEaXJlY3QzRDJWdGJsIElEaXJlY3QzRDJfVnRibCA9CnsKICAgIC8qKiogSVVua25vd24gbWV0aG9kcyAqKiovCiAgICBUaHVua19JRGlyZWN0M0RJbXBsXzJfUXVlcnlJbnRlcmZhY2UsCiAgICBUaHVua19JRGlyZWN0M0RJbXBsXzJfQWRkUmVmLAogICAgVGh1bmtfSURpcmVjdDNESW1wbF8yX1JlbGVhc2UsCiAgICAvKioqIElEaXJlY3QzRDIgbWV0aG9kcyAqKiovCiAgICBUaHVua19JRGlyZWN0M0RJbXBsXzJfRW51bURldmljZXMsCiAgICBUaHVua19JRGlyZWN0M0RJbXBsXzJfQ3JlYXRlTGlnaHQsCiAgICBUaHVua19JRGlyZWN0M0RJbXBsXzJfQ3JlYXRlTWF0ZXJpYWwsCiAgICBUaHVua19JRGlyZWN0M0RJbXBsXzJfQ3JlYXRlVmlld3BvcnQsCiAgICBUaHVua19JRGlyZWN0M0RJbXBsXzJfRmluZERldmljZSwKICAgIFRodW5rX0lEaXJlY3QzREltcGxfMl9DcmVhdGVEZXZpY2UKfTsKCmNvbnN0IElEaXJlY3QzRDNWdGJsIElEaXJlY3QzRDNfVnRibCA9CnsKICAgIC8qKiogSVVua25vd24gbWV0aG9kcyAqKiovCiAgICBUaHVua19JRGlyZWN0M0RJbXBsXzNfUXVlcnlJbnRlcmZhY2UsCiAgICBUaHVua19JRGlyZWN0M0RJbXBsXzNfQWRkUmVmLAogICAgVGh1bmtfSURpcmVjdDNESW1wbF8zX1JlbGVhc2UsCiAgICAvKioqIElEaXJlY3QzRDMgbWV0aG9kcyAqKiovCiAgICBJRGlyZWN0M0RJbXBsXzNfRW51bURldmljZXMsCiAgICBJRGlyZWN0M0RJbXBsXzNfQ3JlYXRlTGlnaHQsCiAgICBJRGlyZWN0M0RJbXBsXzNfQ3JlYXRlTWF0ZXJpYWwsCiAgICBJRGlyZWN0M0RJbXBsXzNfQ3JlYXRlVmlld3BvcnQsCiAgICBJRGlyZWN0M0RJbXBsXzNfRmluZERldmljZSwKICAgIFRodW5rX0lEaXJlY3QzREltcGxfM19DcmVhdGVEZXZpY2UsCiAgICBUaHVua19JRGlyZWN0M0RJbXBsXzNfQ3JlYXRlVmVydGV4QnVmZmVyLAogICAgVGh1bmtfSURpcmVjdDNESW1wbF8zX0VudW1aQnVmZmVyRm9ybWF0cywKICAgIFRodW5rX0lEaXJlY3QzREltcGxfM19FdmljdE1hbmFnZWRUZXh0dXJlcwp9OwoKY29uc3QgSURpcmVjdDNEN1Z0YmwgSURpcmVjdDNEN19WdGJsID0KewogICAgLyoqKiBJVW5rbm93biBtZXRob2RzICoqKi8KICAgIFRodW5rX0lEaXJlY3QzREltcGxfN19RdWVyeUludGVyZmFjZSwKICAgIFRodW5rX0lEaXJlY3QzREltcGxfN19BZGRSZWYsCiAgICBUaHVua19JRGlyZWN0M0RJbXBsXzdfUmVsZWFzZSwKICAgIC8qKiogSURpcmVjdDNENyBtZXRob2RzICoqKi8KICAgIElEaXJlY3QzREltcGxfN19FbnVtRGV2aWNlcywKICAgIElEaXJlY3QzREltcGxfN19DcmVhdGVEZXZpY2UsCiAgICBJRGlyZWN0M0RJbXBsXzdfQ3JlYXRlVmVydGV4QnVmZmVyLAogICAgSURpcmVjdDNESW1wbF83X0VudW1aQnVmZmVyRm9ybWF0cywKICAgIElEaXJlY3QzREltcGxfN19FdmljdE1hbmFnZWRUZXh0dXJlcwp9Owo=