LyoqIFxmaWxlIHZwX2FwaV9jb21tb24uaAogKiB2cF9hcGlfY29tbW9uLmgKICoKICogSGVhZGVyIGZpbGUgZm9yIHRoZSBWUC1BUEktSUkgYyBmaWxlcy4KICoKICogVGhpcyBmaWxlIGNvbnRhaW5zIGFsbCBvZiB0aGUgVlAtQVBJLUlJIGRlY2xhcmF0aW9ucyB0aGF0IGFyZSBWb2ljZQogKiBUZXJtaW5hdGlvbiBEZXZpY2UgKFZURCkgZmFtaWx5IGluZGVwZW5kZW50LgogKgogKiAkUmV2aXNpb246IDg4NjcgJAogKiAkTGFzdENoYW5nZWREYXRlOiAyMDExLTA5LTIyIDE0OjEzOjAzIC0wNTAwIChUaHUsIDIyIFNlcCAyMDExKSAkCiAqLwoKI2lmbmRlZiBWUF9BUElfQ09NTU9OX0gKI2RlZmluZSBWUF9BUElfQ09NTU9OX0gKCiNpbmNsdWRlICJ2cF9hcGlfdHlwZXMuaCIKI2luY2x1ZGUgInZwX2FwaV9kZXZfdGVybS5oIgojaW5jbHVkZSAidnBfYXBpX2V2ZW50LmgiCiNpbmNsdWRlICJ2cF9hcGlfb3B0aW9uLmgiCiNpbmNsdWRlICJ2cF9hcGlfdGVzdC5oIgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFRklORVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyoKICogUHJvZmlsZSBUYWJsZSBJbmRleGVzCiAqLwojZGVmaW5lIFZQX1BUQUJMRV9OVUxMICAgICAgKFZwUHJvZmlsZVB0clR5cGUpMAojZGVmaW5lIFZQX1BUQUJMRV9JTkRFWDEgICAgKFZwUHJvZmlsZVB0clR5cGUpMQojZGVmaW5lIFZQX1BUQUJMRV9JTkRFWDIgICAgKFZwUHJvZmlsZVB0clR5cGUpMgojZGVmaW5lIFZQX1BUQUJMRV9JTkRFWDMgICAgKFZwUHJvZmlsZVB0clR5cGUpMwojZGVmaW5lIFZQX1BUQUJMRV9JTkRFWDQgICAgKFZwUHJvZmlsZVB0clR5cGUpNAojZGVmaW5lIFZQX1BUQUJMRV9JTkRFWDUgICAgKFZwUHJvZmlsZVB0clR5cGUpNQojZGVmaW5lIFZQX1BUQUJMRV9JTkRFWDYgICAgKFZwUHJvZmlsZVB0clR5cGUpNgojZGVmaW5lIFZQX1BUQUJMRV9JTkRFWDcgICAgKFZwUHJvZmlsZVB0clR5cGUpNwojZGVmaW5lIFZQX1BUQUJMRV9JTkRFWDggICAgKFZwUHJvZmlsZVB0clR5cGUpOAojZGVmaW5lIFZQX1BUQUJMRV9JTkRFWDkgICAgKFZwUHJvZmlsZVB0clR5cGUpOQojZGVmaW5lIFZQX1BUQUJMRV9JTkRFWDEwICAgKFZwUHJvZmlsZVB0clR5cGUpMTAKI2RlZmluZSBWUF9QVEFCTEVfSU5ERVgxMSAgIChWcFByb2ZpbGVQdHJUeXBlKTExCiNkZWZpbmUgVlBfUFRBQkxFX0lOREVYMTIgICAoVnBQcm9maWxlUHRyVHlwZSkxMgojZGVmaW5lIFZQX1BUQUJMRV9JTkRFWDEzICAgKFZwUHJvZmlsZVB0clR5cGUpMTMKI2RlZmluZSBWUF9QVEFCTEVfSU5ERVgxNCAgIChWcFByb2ZpbGVQdHJUeXBlKTE0CiNkZWZpbmUgVlBfUFRBQkxFX0lOREVYMTUgICAoVnBQcm9maWxlUHRyVHlwZSkxNQojZGVmaW5lIFZQX1BUQUJMRV9OT19JTkRFWCAgIChWcFByb2ZpbGVQdHJUeXBlKTk5CiNkZWZpbmUgVlBfUFRBQkxFX01BWF9JTkRFWCBWUF9QVEFCTEVfSU5ERVgxNQojZGVmaW5lIFZQX1BUQUJMRV9JTkRFWChuKSAgKFZwUHJvZmlsZVB0clR5cGUpKG4pCgoKLyoKICpVdGlsaXR5IG1hY3JvczoKICovCiNpZm5kZWYgQUJTCiAgI2RlZmluZSBBQlMoYXJnKSAoKGFyZykgPCAwID8gLShhcmcpIDogKGFyZykpCiNlbmRpZgoKI2lmbmRlZiBNQVgKICAjZGVmaW5lIE1BWChhLCBiKSAoKGEpID4gKGIpID8gKGEpIDogKGIpKQojZW5kaWYKCiNpZm5kZWYgTUlOCiAgI2RlZmluZSBNSU4oYSwgYikgKChhKSA8IChiKSA/IChhKSA6IChiKSkKI2VuZGlmCgojaWZuZGVmIE1BWDQKICAjZGVmaW5lIE1BWDQoYSwgYiwgYywgZCkgTUFYKE1BWChhLCBiKSwgTUFYKGMsIGQpKQojZW5kaWYKCiNpZm5kZWYgTUFYMTIKICAjZGVmaW5lIE1BWDEyKGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwpIFwKICAgIE1BWChNQVgoTUFYNChhLCBiLCBjLCBkKSwgTUFYNChlLCBmLCBnLCBoKSksIE1BWDQoaSwgaiwgaywgbCkpCiNlbmRpZgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgICAgICAgIEVOVU1FUkFUSU9OUyBBTkQgTkVXIERBVEEgVFlQRVMgICAgICAgICAgICAgICAgICAgICAgICAgKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiogU3RhbmRhcmQgcmV0dXJuIHZhbHVlIGZvciBtb3N0IEFQSSBsaWJyYXJ5IGZ1bmN0aW9ucy4gIFNlZSB0aGUgVlAtQVBJLUlJCiAgICBSZWZlcmVuY2UgR3VpZGUgZm9yIGRlc2NyaXB0aW9ucy4gKi8KdHlwZWRlZiBlbnVtIFZwU3RhdHVzVHlwZSB7CiAgICBWUF9TVEFUVVNfU1VDQ0VTUyAgICAgICAgICAgICAgPSAwLAogICAgVlBfU1RBVFVTX0ZBSUxVUkUgICAgICAgICAgICAgID0gMSwKICAgIFZQX1NUQVRVU19GVU5DX05PVF9TVVBQT1JURUQgICA9IDIsCiAgICBWUF9TVEFUVVNfSU5WQUxJRF9BUkcgICAgICAgICAgPSAzLAogICAgVlBfU1RBVFVTX01BSUxCT1hfQlVTWSAgICAgICAgID0gNCwKICAgIFZQX1NUQVRVU19FUlJfVlREX0NPREUgICAgICAgICA9IDUsCiAgICBWUF9TVEFUVVNfT1BUSU9OX05PVF9TVVBQT1JURUQgPSA2LAogICAgVlBfU1RBVFVTX0VSUl9WRVJJRlkgICAgICAgICAgID0gNywKICAgIFZQX1NUQVRVU19ERVZJQ0VfQlVTWSAgICAgICAgICA9IDgsCiAgICBWUF9TVEFUVVNfTUFJTEJPWF9FTVBUWSAgICAgICAgPSA5LAogICAgVlBfU1RBVFVTX0VSUl9NQUlMQk9YX0RBVEEgICAgID0gMTAsCiAgICBWUF9TVEFUVVNfRVJSX0hCSSAgICAgICAgICAgICAgPSAxMSwKICAgIFZQX1NUQVRVU19FUlJfSU1BR0UgICAgICAgICAgICA9IDEyLAogICAgVlBfU1RBVFVTX0lOX0NSVENMX1NFQ1ROICAgICAgID0gMTMsCiAgICBWUF9TVEFUVVNfREVWX05PVF9JTklUSUFMSVpFRCAgPSAxNCwKICAgIFZQX1NUQVRVU19FUlJfUFJPRklMRSAgICAgICAgICA9IDE1LAogICAgVlBfU1RBVFVTX0NVU1RPTV9URVJNX05PVF9DRkcgID0gMTcsCiAgICBWUF9TVEFUVVNfREVESUNBVEVEX1BJTlMgICAgICAgPSAxOCwKICAgIFZQX1NUQVRVU19JTlZBTElEX0xJTkUgICAgICAgICA9IDE5LAogICAgVlBfU1RBVFVTX0xJTkVfTk9UX0NPTkZJRyAgICAgID0gMjAsCiAgICBWUF9TVEFUVVNfSU5QVVRfUEFSQU1fT09SLCAgLyogVGhpcyBlbnVtIHZhbHVlIGRvZXMgbm90IHlldCByZXF1aXJlIHRvIGJlIGEgc2V0IHZhbHVlICovCiAgICBWUF9TVEFUVVNfTlVNX1RZUEVTLAogICAgVlBfU1RBVFVTX0VOVU1fU0laRSA9IEZPUkNFX1NUQU5EQVJEX0NfRU5VTV9TSVpFIC8qIFBvcnRhYmlsaXR5IFJlcS4gKi8KfSBWcFN0YXR1c1R5cGU7CgovKiBFbnVtZXJhdGlvbiBmb3IgQm9vdCBsb2FkIEZ1bmN0aW9uICovCnR5cGVkZWYgZW51bSBWcEJvb3RTdGF0ZVR5cGUgewogICAgVlBfQk9PVF9TVEFURV9GSVJTVCwgICAgICAgIC8qIEZpcnN0IGJsb2NrIHRvIGRvd25sb2FkICovCiAgICBWUF9CT09UX1NUQVRFX0NPTlRJTlVFLCAgICAgLyogQWRkaXRpb25hbCBibG9jayB0byBkb3dubG9hZCAqLwogICAgVlBfQk9PVF9TVEFURV9MQVNULCAgICAgICAgIC8qIExhc3QgYmxvY2sgdG8gZG93bmxvYWQgKi8KICAgIFZQX0JPT1RfU1RBVEVfRklSU1RMQVNULCAgICAvKiBGaXJzdCBhbmQgb25seSBibG9jayB0byBkb3dubG9hZCAqLwogICAgVlBfTlVNX0JPT1RfU1RBVEVTLAogICAgVlBfQk9PVF9FTlVNX1NJWkUgPSBGT1JDRV9TVEFOREFSRF9DX0VOVU1fU0laRSAvKiBQb3J0YWJpbGl0eSBSZXEuICovCn0gVnBCb290U3RhdGVUeXBlOwoKLyogRW51bWVyYXRpb24gZm9yIEJvb3QgbG9hZCBGdW5jdGlvbiAqLwp0eXBlZGVmIGVudW0gVnBCb290TW9kZVR5cGUgewogICAgVlBfQk9PVF9NT0RFX05PX1ZFUklGWSwgICAgIC8qIE5vIHdyaXRlIHZlcmlmaWNhdGlvbiBpcyBwZXJmb3JtZWQgKi8KICAgIFZQX0JPT1RfTU9ERV9WRVJJRlksICAgICAgICAvKiBWZXJpZnkgTG9hZCBJbWFnZSBDaGVja3N1bSAqLwogICAgVlBfTlVNX0JPT1RfTU9ERVMsCiAgICBWUF9CT09UX01PREVfRU5VTV9TSVpFID0gRk9SQ0VfU1RBTkRBUkRfQ19FTlVNX1NJWkUgLyogUG9ydGFiaWxpdHkgUmVxLiAqLwp9IFZwQm9vdE1vZGVUeXBlOwoKLyogVmVyc2lvbiBhbmQgY2hlY2tzdW0gaW5mb3JtYXRpb24gZm9yIFZDUCAqLwp0eXBlZGVmIHN0cnVjdCBWcFZlcnNpb25JbmZvVHlwZSB7CiAgICB1aW50MTYgdnRkUmV2Q29kZTsgICAgICAgICAgLyogU2lsaWNvbiBSZXZpc2lvbiBmb3IgVlREICovCiAgICB1aW50OCBzd1Byb2R1Y3RJZDsgICAgICAgICAgLyogVlREIEZpcm13YXJlIElEICovCiAgICB1aW50OCBzd1Zlck1ham9yOyAgICAgICAgICAgLyogTWFqb3IgUmV2aXNpb24gZm9yIFZURCBGaXJtd2FyZSAqLwogICAgdWludDggc3dWZXJNaW5vcjsgICAgICAgICAgIC8qIE1pbm9yIFJldmlzaW9uIGZvciBWVEQgRmlybXdhcmUgKi8KfSBWcFZlcnNpb25JbmZvVHlwZTsKCnR5cGVkZWYgc3RydWN0IFZwQ2hrU3VtVHlwZSB7CiAgICB1aW50MzIgbG9hZENoZWNrc3VtOyAgICAgICAgLyogQ2FsY3VsYXRlZCBDaGVja3N1bSBmb3IgQ29kZSBJbWFnZSAqLwogICAgVnBWZXJzaW9uSW5mb1R5cGUgdkluZm87ICAgIC8qIFZlcnNpb24gSW5mb3JtYXRpb24gZm9yIFZURCBIVy9TVyAqLwp9IFZwQ2hrU3VtVHlwZTsKCnR5cGVkZWYgZW51bSBWcFByb2ZpbGVUeXBlIHsKICAgIFZQX1BST0ZJTEVfREVWSUNFICAgICAgPSAwLCAvKiBEZXZpY2UgcHJvZmlsZSAqLwogICAgVlBfUFJPRklMRV9BQyAgICAgICAgICA9IDEsIC8qIEFDIHByb2ZpbGUgKi8KICAgIFZQX1BST0ZJTEVfREMgICAgICAgICAgPSAyLCAvKiBEQyBwcm9maWxlICovCiAgICBWUF9QUk9GSUxFX1JJTkcgICAgICAgID0gMywgLyogUmluZyBwcm9maWxlICovCiAgICBWUF9QUk9GSUxFX1JJTkdDQUQgICAgID0gNCwgLyogUmluZ2luZyBjYWRlbmNlIHByb2ZpbGUgKi8KICAgIFZQX1BST0ZJTEVfVE9ORSAgICAgICAgPSA1LCAvKiBUb25lIHByb2ZpbGUgKi8KICAgIFZQX1BST0ZJTEVfTUVURVIgICAgICAgPSA2LCAvKiBNZXRlcmluZyBwcm9maWxlICovCiAgICBWUF9QUk9GSUxFX0NJRCAgICAgICAgID0gNywgLyogQ2FsbGVyIElEIHByb2ZpbGUgKi8KICAgIFZQX1BST0ZJTEVfVE9ORUNBRCAgICAgPSA4LCAvKiBUb25lIGNhZGVuY2UgcHJvZmlsZSAqLwogICAgVlBfUFJPRklMRV9GWE9fQ09ORklHLCAgICAgIC8qIEZYTyBjb25maWd1cmF0aW9uIHByb2ZpbGUgKi8KICAgIFZQX1BST0ZJTEVfQ1VTVE9NX1RFUk0sICAgICAvKiBDdXN0b20gVGVybWluYXRpb24gVHlwZSBwcm9maWxlICovCiAgICBWUF9QUk9GSUxFX0NBTCwgICAgICAgICAgICAgLyogVXNlZCBmb3IgVnBDYWwgd2hlbiBwYXNzaW5nIGNhbGlicmF0aW9uIGNvZWZmaWNpZW50cyAqLwogICAgVlBfTlVNX1BST0ZJTEVfVFlQRVMsCiAgICBWUF9QUk9GSUxFX0VOVU1fU0laRSA9IEZPUkNFX1NUQU5EQVJEX0NfRU5VTV9TSVpFIC8qIFBvcnRhYmlsaXR5IFJlcS4gKi8KfSBWcFByb2ZpbGVUeXBlOwoKLyoqPCB0eXBlZGVmIGZvciBWcENhbENvZGVjKCkgZnVuY3Rpb24gKi8KdHlwZWRlZiBlbnVtIFZwRGV2aWNlQ2FsVHlwZSB7CiAgICBWUF9ERVZfQ0FMX05PVyAgID0gMCwgLyogQ2FsaWJyYXRlIGltbWVkaWF0ZWx5ICovCiAgICBWUF9ERVZfQ0FMX05CVVNZID0gMSwgLyogQ2FsaWJyYXRlIGlmIGFsbCBsaW5lcyBhcmUgIm9uLWhvb2siICovCiAgICBWUF9OVU1fREVWX0NBTF9UWVBFUywKICAgIFZQX0RFVl9DQUxfRU5VTV9TSVpFID0gRk9SQ0VfU1RBTkRBUkRfQ19FTlVNX1NJWkUgLyogUG9ydGFiaWxpdHkgUmVxLiAqLwp9IFZwRGV2aWNlQ2FsVHlwZTsKCi8qIFZhbGlkIGxpbmUgc3RhdGVzIGZvciBWcFNldExpbmVTdGF0ZSgpICovCi8qIERlZmluZWQgZWxzZSB3aGVyZSAqLwoKLyoqPCBUaGUgZm9sbG93aW5nIHR5cGVzIGFyZSBmb3IgVnBTZXRMaW5lVG9uZSgpIGZ1bmN0aW9uICovCnR5cGVkZWYgc3RydWN0IFZwRHRtZlRvbmVHZW5UeXBlIHsKICAgIFZwRGlnaXRUeXBlIHRvbmVJZDsgIC8qIElkZW50aWZpZXMgdGhlIERUTUYgdG9uZSB0byBnZW5lcmF0ZWQgKi8KICAgIFZwRGlyZWN0aW9uVHlwZSBkaXI7IC8qIERpcmVjdGlvbiBpbiB3aGljaCBEVE1GIHRvbmUgbmVlZHMgdG8gYmUKICAgICAgICAgICAgICAgICAgICAgICAgICAqIGdlbmVyYXRlZCAqLwp9IFZwRHRtZlRvbmVHZW5UeXBlOwoKdHlwZWRlZiBlbnVtIFZwRGlnaXRHZW5lcmF0aW9uVHlwZSB7CiAgVlBfRElHSVRfR0VORVJBVElPTl9EVE1GLCAgICAgICAgICAgICAvKiBHZW5lcmF0ZSBEVE1GIGRpZ2l0ICovCiAgVlBfRElHSVRfR0VORVJBVElPTl9ESUFMX1BVTFNFLCAgICAgICAvKiBHZW5lcmF0ZSBwdWxzZSBkaWdpdCAqLwogIFZQX0RJR0lUX0dFTkVSQVRJT05fRElBTF9IT09LX0ZMQVNILCAgIC8qIEdlbmVyYXRlIGhvb2sgZmxhc2ggKi8KICBWUF9ESUdJVF9HRU5fRU5VTV9TSVpFID0gRk9SQ0VfU1RBTkRBUkRfQ19FTlVNX1NJWkUgLyogUG9ydGFiaWxpdHkgUmVxLiAqLwp9IFZwRGlnaXRHZW5lcmF0aW9uVHlwZTsKCnR5cGVkZWYgZW51bSBWcEJGaWx0ZXJNb2RlVHlwZSB7CiAgVlBfQkZJTFRfRElTID0gMCwKICBWUF9CRklMVF9FTiAgPSAxLAogIFZQX0JGSUxUX0VOVU1fU0laRSA9IEZPUkNFX1NUQU5EQVJEX0NfRU5VTV9TSVpFIC8qIFBvcnRhYmlsaXR5IFJlcS4gKi8KfSBWcEJGaWx0ZXJNb2RlVHlwZTsKCnR5cGVkZWYgZW51bSBWcEJhdHRlcnlNb2RlVHlwZSB7CiAgVlBfQkFUVF9NT0RFX0RJUyA9IDAsCiAgVlBfQkFUVF9NT0RFX0VOICA9IDEsCiAgVlBfQkFUVF9NT0RFX0VOVU1fU0laRSA9IEZPUkNFX1NUQU5EQVJEX0NfRU5VTV9TSVpFIC8qIFBvcnRhYmlsaXR5IFJlcS4gKi8KfSBWcEJhdHRlcnlNb2RlVHlwZTsKCnR5cGVkZWYgc3RydWN0IFZwQmF0dGVyeVZhbHVlc1R5cGUgewogICAgaW50MTYgYmF0dDE7CiAgICBpbnQxNiBiYXR0MjsKICAgIGludDE2IGJhdHQzOwp9IFZwQmF0dGVyeVZhbHVlc1R5cGU7CgovKio8IFRoZSBmb2xsb3dpbmcgdHlwZXMgYXJlIGZvciBWcFNldFJlbGF5U3RhdGUoKSBhbmQgVnBHZXRSZWxheVN0YXRlKCkgZnVuY3Rpb25zICovCnR5cGVkZWYgZW51bSBWcFJlbGF5Q29udHJvbFR5cGUgewogICAgVlBfUkVMQVlfTk9STUFMICAgICAgICAgPSAwLCAgLyogTm8gdGVzdCBhY2Nlc3MsIHJpbmdpbmcgY29udHJvbGxlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYnkgbGluZSBzdGF0ZSAqLwogICAgVlBfUkVMQVlfUkVTRVQgICAgICAgICAgPSAxLCAgLyogTENBUyBhbGwtb2ZmIHN0YXRlLCB0ZXN0LW91dCByZWxlYXNlZCAqLwogICAgVlBfUkVMQVlfVEVTVE9VVCAgICAgICAgPSAyLCAgLyogTENBUyBhbGwtb2ZmIHN0YXRlLCB0ZXN0LW91dCBhY3RpdmUgKi8KICAgIFZQX1JFTEFZX1RBTEsgICAgICAgICAgID0gMywgIC8qIExDQVMgdGFsayBzdGF0ZSwgdGVzdC1vdXQgcmVsZWFzZWQgKi8KICAgIFZQX1JFTEFZX1JJTkdJTkcgICAgICAgID0gNCwgIC8qIExDQVMgcmluZ2luZyBzdGF0ZSwgdGVzdC1vdXQgcmVsZWFzZWQgKi8KICAgIFZQX1JFTEFZX1RFU1QgICAgICAgICAgID0gNSwgIC8qIExDQVMgdGVzdCBzdGF0ZSwgdGVzdC1vdXQgcmVsZWFzZWQgKi8KICAgIFZQX1JFTEFZX0JSSURHRURfVEVTVCAgID0gNiwgIC8qIExDQVMgdGVzdC9tb25pdG9yIHN0YXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogdGVzdC1vdXQgcmVsZWFzZWQgKi8KICAgIFZQX1JFTEFZX1NQTElUX1RFU1QgICAgID0gNywgIC8qIExDQVMgdGVzdC9tb25pdG9yIHN0YXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogdGVzdC1vdXQgYWN0aXZlICovCiAgICBWUF9SRUxBWV9ESVNDT05ORUNUICAgICA9IDgsICAvKiBMQ0FTIHRhbGsgc3RhdGUsIHRlc3Qtb3V0IGFjdGl2ZSAqLwogICAgVlBfUkVMQVlfUklOR0lOR19OT0xPQUQgPSA5LCAgLyogTENBUyByaW5naW5nIHN0YXRlLCB0ZXN0LW91dCBhY3RpdmUgKi8KICAgIFZQX1JFTEFZX1JJTkdJTkdfVEVTVCAgID0gMTAsIC8qIExDQVMgdGVzdCByaW5naW5nIHN0YXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogdGVzdC1vdXQgYWN0aXZlICovCiAgICBWUF9SRUxBWV9MQU1QX09OICAgICAgICA9IDExLCAvKiBWQ1AyLTc5MCBGWFNfVExfTVcgb25seSAqLwogICAgVlBfUkVMQVlfSURMRSAgICAgICAgICAgPSAxMiwgLyogQWxsIHN3aXRjaGVzIG9wZW4sIHRlc3Qgc3dpdGNoIG9mZiAqLwogICAgVlBfTlVNX1JFTEFZX1NUQVRFUywKICAgIFZQX1JFTEFZX0VOVU1fUlNWRCAgPSBGT1JDRV9TSUdORURfRU5VTSwKICAgIFZQX1JFTEFZX0VOVU1fU0laRSAgPSBGT1JDRV9TVEFOREFSRF9DX0VOVU1fU0laRSAvKiBQb3J0YWJpbGl0eSBSZXEuICovCn0gVnBSZWxheUNvbnRyb2xUeXBlOwoKLyoqPCBUaGUgZm9sbG93aW5nIHR5cGVzIGFyZSBmb3IgVnBTZXRDYWxSZWxheVN0YXRlKCkgZnVuY3Rpb24gKi8KdHlwZWRlZiBlbnVtIFZwQ2FsUmVsYXlDb250cm9sVHlwZSB7CiAgICBWUF9DQUxfUkVMQVlfT1BFTiwgICAgICAgICAgICAgICAgLyogT3BlbiBjaXJjdWl0ICAgICAgICAgICAgICAgICAgICAgICovCiAgICBWUF9DQUxfUkVMQVlfUl9ESUZGX0xPV19USVBfUklORywgLyogUmVzIFRpcC10by1SaW5nOiBSX0RJRkZfTE9XIE9obXMgICovCiAgICBWUF9DQUxfUkVMQVlfUl9DTV9SRUZfVElQX0dORCwgICAgLyogUmVzIFRpcC10by1HbmQ6ICBSX0NNX1JFRiBPaG1zICAgICovCiAgICBWUF9DQUxfUkVMQVlfVl9DQUxfUkVGX1RJUF9HTkQsICAgLyogVm9sdCBUaXA6ICAgICAgICBWX0NBTF9SRUYgVm9sdHMgICovCiAgICBWUF9DQUxfUkVMQVlfU0hPUlRfVElQX1JJTkcsICAgICAgLyogUmVzIFRpcC10by1SaW5nOiBzaG9ydCAoMCBPaG1zKSAgICovCiAgICBWUF9DQUxfUkVMQVlfUl9ESUZGX0hJR0hfVElQX1JJTkcsLyogUmVzIFRpcC10by1SaW5nOiBSX0RJRkZfSElHSCBPaG1zICovCiAgICBWUF9DQUxfUkVMQVlfUl9DTV9SRUZfUklOR19HTkQsICAgLyogUmVzIFJpbmctdG8tR25kOiBSX0NNX1JFRiBPaG1zICAgICovCiAgICBWUF9DQUxfUkVMQVlfVl9DQUxfUkVGX1JJTkdfR05ELCAgLyogVm9sdCBSaW5nOiAgICAgICBWX0NBTF9SRUYgVm9sdHMgICovCiAgICBWUF9DQUxfUkVMQVlfTlVNX1NUQVRFUywKICAgIFZQX0NBTF9SRUxBWV9FTlVNX1NJWkUgPSBGT1JDRV9TVEFOREFSRF9DX0VOVU1fU0laRSAvKiBQb3J0YWJpbGl0eSBSZXEuKi8KfSBWcENhbFJlbGF5Q29udHJvbFR5cGU7CgovKio8IFRoZSBmb2xsb3dpbmcgdHlwZXMgYXJlIGZvciBWcFNldFJlbEdhaW4oKSBmdW5jdGlvbiAqLwp0eXBlZGVmIGVudW0gVnBHYWluUmVzdWx0VHlwZSB7CiAgICBWUF9HQUlOX1NVQ0NFU1MgID0gMCwgLyogR2FpbiBzZXR0aW5nIGFkanVzdGVkIHN1Y2Nlc3NmdWxseSAqLwogICAgVlBfR0FJTl9HUl9PT1IgICA9IDEsIC8qIEdSIEdhaW4gc2V0dGluZyBvdmVyZmxvd2VkIChyZXNldCB0byBkZWZhdWx0KSAqLwogICAgVlBfR0FJTl9HWF9PT1IgICA9IDIsIC8qIEdYIEdhaW4gc2V0dGluZyBvdmVyZmxvd2VkIChyZXNldCB0byBkZWZhdWx0KSAqLwogICAgVlBfR0FJTl9CT1RIX09PUiA9IDMsIC8qIEJvdGggR1IgJiBHWCBvdmVyZmxvd2VkIChhbmQgcmVzZXQgdG8gZGVmYXVsdCkgKi8KICAgIFZQX0dBSU5fRU5VTV9TSVpFID0gRk9SQ0VfU1RBTkRBUkRfQ19FTlVNX1NJWkUgLyogUG9ydGFiaWxpdHkgUmVxLiAqLwp9IFZwR2FpblJlc3VsdFR5cGU7Cgp0eXBlZGVmIHN0cnVjdCBWcFJlbEdhaW5SZXN1bHRzVHlwZSB7CiAgICBWcEdhaW5SZXN1bHRUeXBlIGdSZXN1bHQ7IC8qIFN1Y2Nlc3MgLyBGYWlsdXJlIHN0YXR1cyByZXR1cm4gKi8KICAgIHVpbnQxNiBneFZhbHVlOyAgICAgICAgICAgLyogbmV3IEdYIHJlZ2lzdGVyIGFicyB2YWx1ZSAqLwogICAgdWludDE2IGdyVmFsdWU7ICAgICAgICAgICAvKiBuZXcgR1IgcmVnaXN0ZXIgYWJzIHZhbHVlICovCn0gVnBSZWxHYWluUmVzdWx0c1R5cGU7CgovKiBUaGUgbnVtYmVyIG9mIDE2IGJpdHMgd29yZHMgdXNlZCB0byBkZWZpbmUgd2hldGhlciBzZWFsIGN1cnJlbnQKICogc2hvdWxkIGJlIGFwcGxpZWQgdG8gbGluZXMgMC0xMjcgKi8KI2RlZmluZSBWUF9TRUFMX0NVUlJFTlRfQVJSQVlfU0laRSA4Cgp0eXBlZGVmIHN0cnVjdCBWcFNlYWxDdXJUeXBlIHsKICAgIHVpbnQxNiBzZWFsQXBwbHlUaW1lOwogICAgdWludDE2IHNlYWxDeWNsZVRpbWU7CiAgICB1aW50MTYgbWF4Q3VycmVudDsKICAgIHVpbnQxNiBtaW5DdXJyZW50OwogICAgdWludDE2IHNlYWxNYXNrQXJyYXlbVlBfU0VBTF9DVVJSRU5UX0FSUkFZX1NJWkVdOwp9IFZwU2VhbEN1clR5cGU7CgovKio8IFRoZSBmb2xsb3dpbmcgdHlwZXMgYXJlIGZvciB0aGUgVnBRdWVyeSgpIGZ1bmN0aW9uICovCnR5cGVkZWYgZW51bSBWcFF1ZXJ5SWRUeXBlIHsKICAgIFZQX1FVRVJZX0lEX1RFTVBFUkFUVVJFID0gMCwKICAgIFZQX1FVRVJZX0lEX01FVEVSX0NPVU5UID0gMSwKICAgIFZQX1FVRVJZX0lEX0xPT1BfUkVTICAgID0gMiwKICAgIFZQX1FVRVJZX0lEX1NFQUxfQ1VSICAgID0gMywKICAgIFZQX05VTV9RVUVSWV9JRFMsCiAgICBWUF9RVUVSWV9JRF9FTlVNX1NJWkUgPSBGT1JDRV9TVEFOREFSRF9DX0VOVU1fU0laRSAvKiBQb3J0YWJpbGl0eSBSZXEuICovCn0gVnBRdWVyeUlkVHlwZTsKCnR5cGVkZWYgdW5pb24gVnBRdWVyeVJlc3VsdHNUeXBlIHsKICAgIGludDE2IHRlbXA7CiAgICB1aW50MTYgbWV0ZXJDb3VudDsKICAgIHVpbnQxNiBybG9vcDsKICAgIFZwU2VhbEN1clR5cGUgc2VhbEN1cjsKfSBWcFF1ZXJ5UmVzdWx0c1R5cGU7CgovKio8IFRoZSBmb2xsb3dpbmcgdHlwZXMgYXJlIGZvciBWcExpbmVJb0FjY2VzcygpIGZ1bmN0aW9uICovCnR5cGVkZWYgZW51bSBWcElvRGlyZWN0aW9uVHlwZSB7CiAgICBWUF9JT19XUklURSA9IDAsCiAgICBWUF9JT19SRUFEICA9IDEsCiAgICBWUF9JT19FTlVNX1NJWkUgPSBGT1JDRV9TVEFOREFSRF9DX0VOVU1fU0laRSAvKiBQb3J0YWJpbGl0eSBSZXEuICovCn0gVnBJb0RpcmVjdGlvblR5cGU7Cgp0eXBlZGVmIHN0cnVjdCBWcExpbmVJb0JpdHNUeXBlIHsKICAgIHVpbnQ4IG1hc2s7CiAgICB1aW50OCBkYXRhOwp9IFZwTGluZUlvQml0c1R5cGU7Cgp0eXBlZGVmIHN0cnVjdCBWcExpbmVJb0FjY2Vzc1R5cGUgewogICAgVnBJb0RpcmVjdGlvblR5cGUgZGlyZWN0aW9uOwogICAgVnBMaW5lSW9CaXRzVHlwZSBpb0JpdHM7Cn0gVnBMaW5lSW9BY2Nlc3NUeXBlOwoKLyoqPCBUaGUgZm9sbG93aW5nIHR5cGVzIGFyZSBmb3IgVnBEZXZpY2VJb0FjY2VzcygpIGZ1bmN0aW9uICovCnR5cGVkZWYgZW51bSBWcERldmljZUlvQWNjZXNzVHlwZSB7CiAgICBWUF9ERVZJQ0VfSU9fV1JJVEUgPSAwLCAvKiBQZXJmb3JtIGRldmljZSBzcGVjaWZpYyBJTyB3cml0ZSBhY2Nlc3MgKi8KICAgIFZQX0RFVklDRV9JT19SRUFEICA9IDEsIC8qIFBlcmZvcm0gZGV2aWNlIHNwZWNpZmljIElPIHJlYWQgYWNjZXNzICovCiAgICBWUF9ERVZJQ0VfSU9fRU5VTV9TSVpFID0gRk9SQ0VfU1RBTkRBUkRfQ19FTlVNX1NJWkUgLyogUG9ydGFiaWxpdHkgUmVxLiAqLwp9IFZwRGV2aWNlSW9BY2Nlc3NUeXBlOwoKdHlwZWRlZiBlbnVtIFZwRGV2aWNlSW9BY2Nlc3NNYXNrIHsKICAgIFZQX0RFVklDRV9JT19JR05PUkUgPSAwLCAvKiBJZ25vcmUgSS9PIGFjY2VzcyAqLwogICAgVlBfREVWSUNFX0lPX0FDQ0VTUyA9IDEsIC8qIFBlcmZvcm0gSS9PIGFjY2VzcyAqLwogICAgVlBfREVWVUNFX0lPQV9FTlVNX1NJWkUgPSBGT1JDRV9TVEFOREFSRF9DX0VOVU1fU0laRSAvKiBQb3J0YWJpbGl0eSBSZXEuICovCn0gVnBEZXZpY2VJb0FjY2Vzc01hc2s7Cgp0eXBlZGVmIHN0cnVjdCBWcERldmljZUlvQWNjZXNzRGF0YVR5cGUgewogICAgVnBEZXZpY2VJb0FjY2Vzc1R5cGUgYWNjZXNzVHlwZTsvKiBEZXZpY2UgSS9PIGFjY2VzcyB0eXBlICovCiAgICB1aW50MzIgYWNjZXNzTWFza18zMV8wOyAgICAgICAgIC8qIEkvTyBhY2Nlc3MgbWFzayAoUGlucyAwIC0gMzEpICovCiAgICB1aW50MzIgYWNjZXNzTWFza182M18zMjsgICAgICAgIC8qIEkvTyBhY2Nlc3MgbWFzayAoUGlucyAzMiAtIDYzKSAqLwogICAgdWludDMyIGRldmljZUlPRGF0YV8zMV8wOyAgIC8qIE91dHB1dCBwaW4gZGF0YSAoUGlucyAwIC0gMzEpICovCiAgICB1aW50MzIgZGV2aWNlSU9EYXRhXzYzXzMyOyAgLyogT3V0cHV0IHBpbiBkYXRhIChQaW5zIDMyIC0gNjMpICovCn0gVnBEZXZpY2VJb0FjY2Vzc0RhdGFUeXBlOwoKLyoqPCBUaGUgZm9sbG93aW5nIHR5cGVzIGFyZSBmb3IgVnBEZXZpY2VJb0FjY2Vzc0V4dCgpIGZ1bmN0aW9uICovCgp0eXBlZGVmIHN0cnVjdCBWcERldmljZUlvQWNjZXNzRXh0VHlwZSB7CiAgICBWcElvRGlyZWN0aW9uVHlwZSBkaXJlY3Rpb247CiAgICBWcExpbmVJb0JpdHNUeXBlIGxpbmVJb0JpdHNbVlBfTUFYX0xJTkVTX1BFUl9ERVZJQ0VdOwp9IFZwRGV2aWNlSW9BY2Nlc3NFeHRUeXBlOwoKLyoqPCBUaGUgZm9sbG93aW5nIHR5cGVzIGFyZSBmb3IgVnBHZXRMaW5lU3RhdHVzKCkgZnVuY3Rpb24gKi8KdHlwZWRlZiBlbnVtIFZwSW5wdXRUeXBlIHsKICAgIFZQX0lOUFVUX0hPT0sgICAgICA9IDAsIC8qIEhvb2sgU3RhdHVzIChpZ25vcmluZyBwdWxzZSAmIGZsYXNoKSAqLwogICAgVlBfSU5QVVRfUkFXX0hPT0sgID0gMSwgLyogSG9vayBTdGF0dXMgKGluY2x1ZGUgcHVsc2UgJiBmbGFzaCkgKi8KICAgIFZQX0lOUFVUX0dLRVkgICAgICA9IDIsIC8qIEdyb3VuZC1LZXkvRmF1bHQgU3RhdHVzICovCiAgICBWUF9JTlBVVF9USEVSTV9GTFQgPSAzLCAvKiBUaGVybWFsIEZhdWx0IFN0YXR1cyAqLwogICAgVlBfSU5QVVRfQ0xLX0ZMVCAgID0gNCwgLyogQ2xvY2sgRmF1bHQgU3RhdHVzICovCiAgICBWUF9JTlBVVF9BQ19GTFQgICAgPSA1LCAvKiBBQyBGYXVsdCBTdGF0dXMgKi8KICAgIFZQX0lOUFVUX0RDX0ZMVCAgICA9IDYsIC8qIERDIEZhdWx0IFN0YXR1cyAqLwogICAgVlBfSU5QVVRfQkFUMV9GTFQgID0gNywgLyogQmF0dGVyeSAxIEZhdWx0IFN0YXR1cyAqLwogICAgVlBfSU5QVVRfQkFUMl9GTFQgID0gOCwgLyogQmF0dGVyeSAyIEZhdWx0IFN0YXR1cyAqLwogICAgVlBfSU5QVVRfQkFUM19GTFQgID0gOSwgLyogQmF0dGVyeSAzIEZhdWx0IFN0YXR1cyAqLwoKICAgIFZQX0lOUFVUX1JJTkdJTkcsICAgIC8qIFJpbmdpbmcgU3RhdHVzICovCiAgICBWUF9JTlBVVF9MSVUsICAgICAgICAvKiBMaW5lIEluIFVzZSBTdGF0dXMgKi8KICAgIFZQX0lOUFVUX0ZFRURfRElTLCAgIC8qIEZlZWQgRGlzYWJsZSBTdGF0dXMgKi8KICAgIFZQX0lOUFVUX0ZFRURfRU4sICAgIC8qIEZlZWQgRW5hYmxlIFN0YXR1cyAqLwogICAgVlBfSU5QVVRfRElTQ09OTkVDVCwgLyogRmVlZCBEaXNjb25uZWN0IFN0YXR1cyAqLwogICAgVlBfSU5QVVRfQ09OTkVDVCwgICAgLyogRmVlZCBDb25uZWN0IFN0YXR1cyAqLwogICAgVlBfSU5QVVRfUE9MUkVWLCAgICAgLyogUmV2ZXJzZSBQb2xhcml0eSBpZiBUUlVFLCBOb3JtYWwgaWYgRkFMU0UgKi8KICAgIFZQX0lOUFVUX1JFU19MRUFLLCAgIC8qIFJlc2lzdGl2ZSBMZWFrYWdlIG9uIGxpbmUgaWYgVFJVRSAqLwoKICAgIFZQX05VTV9JTlBVVF9UWVBFUywKICAgIFZQX0lOUFVUX0VOVU1fU0laRSA9IEZPUkNFX1NUQU5EQVJEX0NfRU5VTV9TSVpFIC8qIFBvcnRhYmlsaXR5IFJlcS4gKi8KfSBWcElucHV0VHlwZTsKCi8qKjwgVGhlIGZvbGxvd2luZyB0eXBlIGlzIGZvciB0aGUgVnBHZXREZXZpY2VTdGF0dXNFeHQoKSBmdW5jdGlvbjogKi8KdHlwZWRlZiBzdHJ1Y3QgVnBEZXZpY2VTdGF0dXNUeXBlIHsKICAgIFZwSW5wdXRUeXBlIGlucHV0OwogICAgdWludDggc3RhdHVzW1ZQX0xJTkVfRkxBR19CWVRFU107Cn0gVnBEZXZpY2VTdGF0dXNUeXBlOwoKLyoqPCBUaGUgZm9sbG93aW5nIHR5cGVzIGFyZSBmb3IgVnBHZXRMb29wQ29uZCgpIGZ1bmN0aW9uIChyZXR1cm4gdmlhCiAqIFZwR2V0UmVzdWx0cygpKQogKi8KdHlwZWRlZiBlbnVtIFZwQmF0dGVyeVR5cGUgewogICAgVlBfQkFUVEVSWV9VTkRFRklORUQgPSAwLCAvKiBCYXR0ZXJ5IGJlaW5nIHVzZWQgaXMgbm90IGtub3duIG9yIGZlYXR1cmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogbm90IHN1cHBvcnRlZCAqLwogICAgVlBfQkFUVEVSWV8xICAgICAgICAgPSAxLCAvKiBCYXR0ZXJ5IDEgKi8KICAgIFZQX0JBVFRFUllfMiAgICAgICAgID0gMiwgLyogQmF0dGVyeSAyICovCiAgICBWUF9CQVRURVJZXzMgICAgICAgICA9IDMsIC8qIEJhdHRlcnkgMyAqLwogICAgVlBfTlVNX0JBVFRFUllfVFlQRVMsCiAgICBWUF9CQVRURVJZX0VOVU1fU0laRSA9IEZPUkNFX1NUQU5EQVJEX0NfRU5VTV9TSVpFIC8qIFBvcnRhYmlsaXR5IFJlcS4gKi8KfSBWcEJhdHRlcnlUeXBlOwoKdHlwZWRlZiBlbnVtIFZwRGNGZWVkUmVnaW9uVHlwZSB7CiAgICBWUF9ERl9VTkRFRklORUQgICAgPSAwLCAvKiBEQyBmZWVkIHJlZ2lvbiBub3Qga25vd24gb3IgZmVhdHVyZSBub3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHN1cHBvcnRlZCAqLwogICAgVlBfREZfQU5USV9TQVRfUkVHID0gMSwgLyogREMgZmVlZCBpcyBpbiBhbnRpIHNhdHVyYXRpb24gcmVnaW9uICovCiAgICBWUF9ERl9DTlNUX0NVUl9SRUcgPSAyLCAvKiBEQyBmZWVkIGlzIGluIGNvbnN0YW50IGN1cnJlbnQgcmVnaW9uICovCiAgICBWUF9ERl9SRVNfRkVFRF9SRUcgPSAzLCAvKiBEQyBmZWVkIGlzIGluIHJlc2lzdGl2ZSBmZWVkIHJlZ2lvbiAqLwogICAgVlBfTlVNX0RDX0ZFRURfVFlQRVMsCiAgICBWUF9EQ19GRUVEX0VOVU1fU0laRSA9IEZPUkNFX1NUQU5EQVJEX0NfRU5VTV9TSVpFIC8qIFBvcnRhYmlsaXR5IFJlcS4gKi8KfSBWcERjRmVlZFJlZ2lvblR5cGU7Cgp0eXBlZGVmIHN0cnVjdCBWcExvb3BDb25kUmVzdWx0c1R5cGUgewogICAgaW50MTYgcmxvb3A7ICAgICAgICAgICAgICAgICAgICAvKio8IFRoZSBsb29wIHJlc2lzdGFuY2UgKi8KICAgIGludDE2IGlsZzsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBUaGUgbG9uZ2l0dWRpbmFsIGxvb3AgY3VycmVudCAqLwogICAgaW50MTYgaW10OyAgICAgICAgICAgICAgICAgICAgICAvKio8IFRoZSBtZXRhbGxpYyBsb29wIGN1cnJlbnQgKi8KICAgIGludDE2IHZzYWI7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBUaGUgdGlwL3Jpbmcgdm9sdGFnZSAqLwogICAgaW50MTYgdmJhdDE7ICAgICAgICAgICAgICAgICAgICAvKio8IFRoZSBCYXR0ZXJ5IDEgdm9sdGFnZSAqLwogICAgaW50MTYgdmJhdDI7ICAgICAgICAgICAgICAgICAgICAvKio8IFRoZSBCYXR0ZXJ5IDIgdm9sdGFnZSAqLwogICAgaW50MTYgdmJhdDM7ICAgICAgICAgICAgICAgICAgICAvKio8IFRoZSBCYXR0ZXJ5IDMgdm9sdGFnZSAqLwogICAgaW50MTYgbXNwbDsgICAgICAgICAgICAgICAgICAgICAvKio8IE1ldGVyaW5nIHNpZ25hbCBwZWFrIGxldmVsICovCiAgICBWcEJhdHRlcnlUeXBlIHNlbGVjdGVkQmF0OyAgICAgIC8qKjwgQmF0dGVyeSB0aGF0IGlzIHByZXNlbnRseSB1c2VkIGZvcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIHRoZSBEQyBmZWVkICovCiAgICBWcERjRmVlZFJlZ2lvblR5cGUgZGNGZWVkUmVnOyAgIC8qKjwgREMgZmVlZCByZWdpb24gcHJlc2VudGx5IHNlbGVjdGVkICovCn0gVnBMb29wQ29uZFJlc3VsdHNUeXBlOwoKLyoqPCBUaGUgZm9sbG93aW5nIHR5cGVzIGFyZSB1c2VkIGZvciB0aGUgZnVuY3Rpb24gVnBTZW5kU2lnbmFsKCkgKi8KdHlwZWRlZiBlbnVtIFZwU2VuZFNpZ25hbFR5cGUgewogICAgVlBfU0VORFNJR19NU0dfV0FJVF9QVUxTRSAgICAgID0gMCwKICAgIFZQX1NFTkRTSUdfRFRNRl9ESUdJVCAgICAgICAgICA9IDEsCiAgICBWUF9TRU5EU0lHX1BVTFNFX0RJR0lUICAgICAgICAgPSAyLAogICAgVlBfU0VORFNJR19IT09LX0ZMQVNIICAgICAgICAgID0gMywKICAgIFZQX1NFTkRTSUdfRldEX0RJU0NPTk5FQ1QgICAgICA9IDQsCiAgICBWUF9TRU5EU0lHX1BPTFJFVl9QVUxTRSAgICAgICAgPSA1LAogICAgVlBfU0VORFNJR19NT01FTlRBUllfTE9PUF9PUEVOID0gNiwKICAgIFZQX1NFTkRTSUdfVElQX09QRU5fUFVMU0UgICAgICA9IDcsCiAgICBWUF9TRU5EU0lHX0VOVU1fU0laRSA9IEZPUkNFX1NUQU5EQVJEX0NfRU5VTV9TSVpFIC8qIFBvcnRhYmlsaXR5IFJlcS4gKi8KfSBWcFNlbmRTaWduYWxUeXBlOwoKdHlwZWRlZiBzdHJ1Y3QgVnBTZW5kTXNnV2FpdFR5cGUgewogICAgaW50OCB2b2x0YWdlOyAgIC8qKjwgVm9sdGFnZSBpbiBWb2x0cyB0byBhcHBseSB0byB0aGUgbGluZS4gQSBuZWdhdGl2ZQogICAgICAgICAgICAgICAgICAgICAqIHZhbHVlIG1lYW5zIFRpcCBpcyBtb3JlIE5lZ2F0aXZlIHRoYW4gUmluZywgYSBwb3NpdGl2ZQogICAgICAgICAgICAgICAgICAgICAqIHZhbHVlIG1lYW5zIFJpbmcgaXMgbW9yZSBOZWdhdGl2ZSB0aGFuIFRpcC4KICAgICAgICAgICAgICAgICAgICAgKi8KICAgIHVpbnQxNiBvblRpbWU7ICAvKio8IER1cmF0aW9uIG9mIHB1bHNlIG9uLXRpbWUgaW4gbVMgKi8KICAgIHVpbnQxNiBvZmZUaW1lOyAvKio8IER1cmF0aW9uIG9mIHB1bHNlIG9mZi10aW0gaW4gbVMuIElmIHRoZSBvZmYtdGltZSBpcwogICAgICAgICAgICAgICAgICAgICAqIHNldCB0byAwLCB0aGUgdm9sdGFnZSBpcyBhcHBsaWVkIHRvIHRoZSBsaW5lIGNvbnRpbnVvdXNseQogICAgICAgICAgICAgICAgICAgICAqLwogICAgdWludDggY3ljbGVzOyAgIC8qKjwgTnVtYmVyIG9mIHB1bHNlcyB0byBzZW5kIG9uIHRoZSBsaW5lLiBJZiBzZXQgdG8gMCwgd2lsbAogICAgICAgICAgICAgICAgICAgICAqIHJlcGVhdCBmb3JldmVyCiAgICAgICAgICAgICAgICAgICAgICovCn0gVnBTZW5kTXNnV2FpdFR5cGU7CgovKio8IFRoZSBmb2xsb3dpbmcgdHlwZSBpcyB1c2VkIGZvciB0aGUgZnVuY3Rpb24gVnBHZW5UaW1lckN0cmwoKSAqLwp0eXBlZGVmIGVudW0gVnBHZW5UaW1lckN0cmxUeXBlIHsKICAgIFZQX0dFTl9USU1FUl9TVEFSVCAgPSAwLAogICAgVlBfR0VOX1RJTUVSX0NBTkNFTCA9IDEsCiAgICBWUF9HRU5fVElNRVJfRU5VTV9TSVpFID0gRk9SQ0VfU1RBTkRBUkRfQ19FTlVNX1NJWkUgLyogUG9ydGFiaWxpdHkgUmVxLiAqLwp9IFZwR2VuVGltZXJDdHJsVHlwZTsKCi8qKjwgVGhlIGVudW0gaXMgdXNlZCBieSB0aGUgc3lzdGVtIHNlcnZpY2UgbGF5ZXIgcGNtQ29sbGVjdCgpIGZ1bmN0aW9uICovCnR5cGVkZWYgZW51bSBWcFBjbU9wZXJhdGlvbkJpdFR5cGUgewogICAgVlBfUENNX09QRVJBVElPTl9BVkVSQUdFICAgICAgPSAweDAwMDEsIC8qIGF2ZXJhZ2UgUENNIHNhbXBsZXMgKi8KICAgIFZQX1BDTV9PUEVSQVRJT05fUkFOR0UgICAgICAgID0gMHgwMDAyLCAvKiBmaW5kIHBrIHRvIHBrIHBjbSBzYW1wbGUgZGF0YS4gKi8KICAgIFZQX1BDTV9PUEVSQVRJT05fUk1TICAgICAgICAgID0gMHgwMDA0LCAvKiBmaW5kIHJtcyB2YWx1ZSBvZiBwY20gc2FtcGxlcyAqLwogICAgVlBfUENNX09QRVJBVElPTl9NSU4gICAgICAgICAgPSAweDAwMDgsIC8qIGZpbmQgbWluIHBjbSB2YWx1ZSBvZiBwY20gc2FtcGxlcyAqLwogICAgVlBfUENNX09QRVJBVElPTl9NQVggICAgICAgICAgPSAweDAwMTAsIC8qIGZpbmQgbWF4IHBjbSB2YWx1ZSBvZiBwY20gc2FtcGxlcyAqLwogICAgVlBfUENNX09QRVJBVElPTl9BUFBfU1BFQ0lGSUMgPSAweDAwMjAsIC8qIGdlbmVyaWMgb3BlcmF0aW9uICovCiAgICBWUF9QQ01fT1BFUkFUSU9OX0ZSRVEgICAgICAgICA9IDB4MDA0MCwgLyogTWVhc3VyZSBmcmVxdWVuY3kgKi8KICAgIFZQX1BDTV9PUEVSQVRJT05fRU5VTV9TSVpFID0gRk9SQ0VfU1RBTkRBUkRfQ19FTlVNX1NJWkUgLyogUG9ydGFiaWxpdHkgUmVxLiAqLwp9IFZwUGNtT3BlcmF0aW9uQml0VHlwZTsKCnR5cGVkZWYgdWludDE2IFZwUGNtT3BlcmF0aW9uTWFza1R5cGU7Cgp0eXBlZGVmIHN0cnVjdCBWcFBjbU9wZXJhdGlvblJlc3VsdHNUeXBlIHsKICAgIGludDE2IGF2ZXJhZ2U7ICAvKiBBdmVyYWdlIHZhbHVlIG9mIGFsbCBjb2xsZWN0ZWQgUENNIHNhbXBsZXMgKi8KICAgIGludDE2IHJhbmdlOyAgICAvKiBNYXhpbXVtIC0gbWluaW11bSBQQ00gdmFsdWUgZHVyaW5nIG9wZXJhdGlvbiB0aW1lICovCiAgICBpbnQxNiBybXM7ICAgICAgLyogUk1TIHJlc3VsdCBvZiBhbGwgY29sbGVjdGVkIHBjbSBzYW1wbGVzICovCiAgICBpbnQxNiBtaW47ICAgICAgLyogTWF4aW11bSBwY20gdmFsdWUgZm91bmQgKi8KICAgIGludDE2IG1heDsgICAgICAvKiBNaW5pbXVtIHBjbSB2YWx1ZSBmb3VuZCAqLwogICAgdm9pZCAqcEFwcGxpY2F0aW9uSW5mbzsgLyogQW55IHJlc3VsdHMgdGhhdCB0aGUgaW1wbGVtZW50YXRpb24gY2hvb3NlcyB0bwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcGFzcy4gVGhpcyBkYXRhIGlzIG5vdCBpbnRlcnByZXRlZCBuZWl0aGVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBieSB0aGUgVlAtQVBJIG5vciB0aGUgTFQtQVBJLiBMVC1BUEkgcGFzc2VzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB0aGlzIHBvaW50ZXIgYmFjayB0byB0aGUgYXBwbGljYXRpb24gYXMgcGFydAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICogb2YgdGhlIHRlc3QgcmVzdWx0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgIGludDMyIGZyZXE7ICAgICAvKiBNZWFzdXJlZCBhdmVyYWdlIGZyZXF1ZW5ueSAqLwoKICAgIGJvb2wgZXJyb3I7ICAgICAvKiBpbmRpY2F0aW9uIG9mIFBDTSBvcGVyYXRpb24gcHJvY2VzcyAoMSA9IGZhaWx1cmUpICovCn0gVnBQY21PcGVyYXRpb25SZXN1bHRzVHlwZTsKCi8qKjwgVGhlIGVudW0gaXMgdXNlZCBieSB0aGUgY2FsIGZ1bmN0aW9uICovCnR5cGVkZWYgZW51bSBWcENhbFR5cGUgewogICAgVlBfQ0FMX0JGSUxURVIgICAgICAgICAgICAgID0gMSwKICAgIFZQX0NBTF9BUFBMWV9CRklMVEVSICAgICAgICA9IDIsCiAgICBWUF9DQUxfTUVBU1VSRV9CRklMVEVSICAgICAgPSAzLAogICAgVlBfQ0FMX0dFVF9TWVNURU1fQ09FRkYgICAgID0gNCwKICAgIFZQX0NBTF9BUFBMWV9TWVNURU1fQ09FRkYgICA9IDUsCiAgICBWUF9DQUxfRU5VTV9TSVpFID0gRk9SQ0VfU1RBTkRBUkRfQ19FTlVNX1NJWkUgLyogUG9ydGFiaWxpdHkgUmVxLiAqLwp9IFZwQ2FsVHlwZTsKCnR5cGVkZWYgc3RydWN0IFZwQ2FsQkZpbHRlclR5cGUgewogICAgdWludDE2IHZSbXM7ICAgIC8qKjwgQ3VzdG9tZXIgVGFyZ2V0IFZhbHVlIGluIGFwcHJveGltYXRlIHZSbXMgKi8KICAgIFZwUHJvZmlsZVB0clR5cGUgcEFjUHJvZmlsZTsKfSBWcENhbEJGaWx0ZXJUeXBlOwoKdHlwZWRlZiBzdHJ1Y3QgVnBDYWxBcHBseUJGaWx0ZXJUeXBlIHsKICAgIFZwUHJvZmlsZVB0clR5cGUgcEFjUHJvZmlsZTsKICAgIHVpbnQxNiBpbmRleDsKfSBWcENhbEFwcGx5QkZpbHRlclR5cGU7Cgp0eXBlZGVmIGVudW0gVnBDYWxTdGF0dXNUeXBlIHsKICAgIFZQX0NBTF9TVUNDRVNTLAogICAgVlBfQ0FMX0ZBSUxVUkUsCiAgICBWUF9DQUxfU1RBVFVTX0VOVU1fU0laRSA9IEZPUkNFX1NUQU5EQVJEX0NfRU5VTV9TSVpFIC8qIFBvcnRhYmlsaXR5IFJlcS4gKi8KfSBWcENhbFN0YXR1c1R5cGU7Cgp0eXBlZGVmIGVudW0gVnBMb3dMZXZlbENtZFR5cGUgewogICAgVlBfTE9XTEVWX1BBR0VfV1IgPSAwLAogICAgVlBfTE9XTEVWX1BBR0VfUkQgPSAxLAogICAgVlBfTE9XTEVWX01CT1hfV1IgPSAyLAogICAgVlBfTE9XTEVWX01CT1hfUkQgPSAzLAogICAgVlBfTE9XTEVWX0VOVU1fU0laRSA9IEZPUkNFX1NUQU5EQVJEX0NfRU5VTV9TSVpFIC8qIFBvcnRhYmlsaXR5IFJlcS4gKi8KfSBWcExvd0xldmVsQ21kVHlwZTsKCnR5cGVkZWYgZW51bSBWcFByb2ZpbGVGaWVsZElkVHlwZSB7CgogICAgLyogRGV2aWNlIHBhcmFtZXRlcnMgKi8KCiAgICAvKiBEQyBwYXJhbWV0ZXJzICovCiAgICBWUF9QUk9GX0ZJRUxEX0lMQQoKfSBWcFByb2ZpbGVGaWVsZElkVHlwZTsKCnR5cGVkZWYgc3RydWN0IFZwUHJvZmlsZUZpZWxkVHlwZSB7CiAgICBWcFByb2ZpbGVGaWVsZElkVHlwZSBmaWVsZElkOwoKICAgIHVuaW9uIGRhdGEgewogICAgICAgIHVpbnQxNiBpbGE7CiAgICB9IGRhdGE7Cgp9IFZwUHJvZmlsZUZpZWxkVHlwZTsKCi8qIFRoZSBmb2xsb3dpbmcgc3RydWN0IGNhbiBiZSBwYXNzZWQgdG8gVnBHZXRSZXN1bHRzKCkgaWYgdGhlIGV2ZW50IElEIGlzIG5vdAogICBrbm93biBhdCBjb21waWxlIHRpbWUsIHRvIGVuc3VyZSB0aGF0IHRoZSBidWZmZXIgaXMgbGFyZ2UgZW5vdWdoIHJlZ2FyZGxlc3MKICAgb2YgdGhlIHJlc3VsdCB0eXBlLiAqLwp0eXBlZGVmIHVuaW9uIFZwUmVzdWx0c1R5cGUgewogICAgVnBDaGtTdW1UeXBlIGNvZGVDaGVja3N1bTsgICAgICAgICAgICAgICAgICAvKiBWUF9ERVZfRVZJRF9CT09UX0NNUCBvcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUF9ERVZfRVZJRF9DSEtTVU0gICAgICAgICAgKi8KICAgIFZwUmVsR2FpblJlc3VsdHNUeXBlIHNldFJlbEdhaW47ICAgICAgICAgICAgLyogVlBfTElORV9FVklEX0dBSU5fQ01QICAgICAgICovCiAgICB1aW50OCBsb3dMZXZlbENtZFsyNTZdOyAgICAgICAgICAgICAgICAgICAgIC8qIFZQX0xJTkVfRVZJRF9MTENNRF9SWF9DTVAgICAqLwogICAgVnBMb29wQ29uZFJlc3VsdHNUeXBlIGdldExvb3BDb25kOyAgICAgICAgICAvKiBWUF9MSU5FX0VWSURfUkRfTE9PUCAgICAgICAgKi8KICAgIFZwT3B0aW9uVmFsdWVUeXBlIGdldE9wdGlvbjsgICAgICAgICAgICAgICAgLyogVlBfTElORV9FVklEX1JEX09QVElPTiAgICAgICovCiAgICBWcFRlc3RSZXN1bHRUeXBlIHRlc3RMaW5lOyAgICAgICAgICAgICAgICAgIC8qIFZQX0xJTkVfRVZJRF9URVNUX0NNUCAgICAgICAqLwogICAgVnBEZXZpY2VJb0FjY2Vzc0RhdGFUeXBlIGRldmljZUlvQWNjZXNzOyAgICAvKiBWUF9ERVZfRVZJRF9JT19BQ0NFU1NfQ01QICAgKi8KICAgIFZwRGV2aWNlSW9BY2Nlc3NFeHRUeXBlIGRldmljZUlvQWNjZXNzRXh0OyAgLyogVlBfREVWX0VWSURfSU9fQUNDRVNTX0NNUCAgICovCiAgICBWcExpbmVJb0FjY2Vzc1R5cGUgbGluZUlvQWNjZXNzOyAgICAgICAgICAgIC8qIFZQX0xJTkVfRVZJRF9MSU5FX0lPX1JEX0NNUCAqLwogICAgVnBRdWVyeVJlc3VsdHNUeXBlIHF1ZXJ5OyAgICAgICAgICAgICAgICAgICAvKiBWUF9MSU5FX0VWSURfUVVFUllfQ01QICAgICAgKi8KfSBWcFJlc3VsdHNUeXBlOwoKdHlwZWRlZiBlbnVtIFZwRnJlZVJ1bk1vZGVUeXBlIHsKICAgIFZQX0ZSRUVfUlVOX1NUQVJULAogICAgVlBfRlJFRV9SVU5fU1RPUAp9IFZwRnJlZVJ1bk1vZGVUeXBlOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgICAgREVWSUNFL0xJTkUgQ09OVEVYVCAoU1VQUE9SVCkgREVGSU5JVElPTiAgICAgICAgICAgICAgICAgICAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gcG9pbnRlcnMgYXJlIHJlcXVpcmVkIHRvIGdldCBhcm91bmQgcHJvYmxlbSBvZgogKiB3aGF0IGNvbWVzIGZpcnN0PyBjaGlja2VuIG9yIHRoZSBlZ2c/IHdoZW4gZGVhbGluZyB3aXRoIGRlY2xhcmF0aW9uIG9mCiAqIGRldmljZSBjb250ZXh0LCBmdW5jdGlvbiBwb2ludGVyIHRhYmxlIGFuZCBoZW5jZSB0aGUgZm9sbG93aW5nIGRlY2xhcmF0aW9ucy4KICovCnN0cnVjdCBWcERldkN0eFR5cGU7ICAgIC8qKjwgZm9yd2FyZCBkZWNsYXJhdGlvbiAqLwpzdHJ1Y3QgVnBMaW5lQ3R4VHlwZTsgICAvKio8IGZvcndhcmQgZGVjbGFyYXRpb24gKi8Kc3RydWN0IFZwRXZlbnRUeXBlOyAgICAgLyoqPCBmb3J3YXJkIGRlY2xhcmF0aW9uICovCgovKgogKiBTeXN0ZW0gQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMKICovCnR5cGVkZWYgVnBTdGF0dXNUeXBlCigqVnBNYWtlTGluZU9iamVjdEZ1bmNQdHJUeXBlKSAoCiAgICBWcFRlcm1UeXBlIHRlcm1UeXBlLAogICAgdWludDggY2hhbm5lbElkLAogICAgc3RydWN0IFZwTGluZUN0eFR5cGUgKnBMaW5lQ3R4LAogICAgdm9pZCAqcExpbmVPYmosCiAgICBzdHJ1Y3QgVnBEZXZDdHhUeXBlICpwRGV2Q3R4KTsKCi8qCiAqIEluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucwogKi8KI2lmICFkZWZpbmVkKFZQX1JFRFVDRURfQVBJX0lGKSB8fCBkZWZpbmVkKFZQX0NDXzc5Ml9TRVJJRVMpIHx8IGRlZmluZWQoVlBfQ0NfVkNQX1NFUklFUykgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBkZWZpbmVkKFZQX0NDX1ZDUDJfU0VSSUVTKSAgfHwgZGVmaW5lZChWUF9DQ19NRUxUX1NFUklFUykgfHwgZGVmaW5lZChWUF9DQ19LV1JBUCkKdHlwZWRlZiBWcFN0YXR1c1R5cGUKKCpWcEJvb3RMb2FkRnVuY1B0clR5cGUpICgKICAgIHN0cnVjdCBWcERldkN0eFR5cGUgKnBEZXZDdHgsCiAgICBWcEJvb3RTdGF0ZVR5cGUgc3RhdGUsCiAgICBWcEltYWdlUHRyVHlwZSBwSW1hZ2VCdWZmZXIsCiAgICB1aW50MzIgYnVmZmVyU2l6ZSwKICAgIFZwU2NyYXRjaE1lbVR5cGUgKnBTY3JhdGNoTWVtLAogICAgVnBCb290TW9kZVR5cGUgdmFsaWRhdGlvbik7Cgp0eXBlZGVmIFZwU3RhdHVzVHlwZQooKlZwQm9vdFNsYWNGdW5jUHRyVHlwZSkgKAogICAgc3RydWN0IFZwTGluZUN0eFR5cGUgKnBMaW5lQ3R4LAogICAgVnBJbWFnZVB0clR5cGUgcEltYWdlQnVmZmVyLAogICAgdWludDMyIGJ1ZmZlclNpemUpOwojZW5kaWYgIC8qICFkZWZpbmVkKFZQX1JFRFVDRURfQVBJX0lGKSB8fCBkZWZpbmVkKFZQX0NDXzc5Ml9TRVJJRVMpIHx8IGRlZmluZWQoVlBfQ0NfVkNQX1NFUklFUykgXAogICAgICAgICAqIHwgZGVmaW5lZChWUF9DQ19WQ1AyX1NFUklFUykgIHx8IGRlZmluZWQoVlBfQ0NfTUVMVF9TRVJJRVMpIHx8IGRlZmluZWQoVlBfQ0NfS1dSQVApCiAgICAgICAgICovCgp0eXBlZGVmIFZwU3RhdHVzVHlwZQooKlZwSW5pdERldmljZUZ1bmNQdHJUeXBlKSAoCiAgICBzdHJ1Y3QgVnBEZXZDdHhUeXBlICpwRGV2Q3R4LAogICAgVnBQcm9maWxlUHRyVHlwZSBwRGV2UHJvZmlsZSwKICAgIFZwUHJvZmlsZVB0clR5cGUgcEFjUHJvZmlsZSwKICAgIFZwUHJvZmlsZVB0clR5cGUgcERjUHJvZmlsZSwKICAgIFZwUHJvZmlsZVB0clR5cGUgcFJpbmdQcm9maWxlLAogICAgVnBQcm9maWxlUHRyVHlwZSBwRnhvQWNQcm9maWxlLAogICAgVnBQcm9maWxlUHRyVHlwZSBwRnhvQ2ZnUHJvZmlsZSk7Cgp0eXBlZGVmIFZwU3RhdHVzVHlwZQooKlZwRnJlZVJ1bkZ1bmNQdHJUeXBlKSAoCiAgICBzdHJ1Y3QgVnBEZXZDdHhUeXBlICpwRGV2Q3R4LAogICAgVnBGcmVlUnVuTW9kZVR5cGUgZnJlZVJ1bk1vZGUpOwoKI2lmICFkZWZpbmVkKFZQX1JFRFVDRURfQVBJX0lGKSB8fCBkZWZpbmVkKFZQX0NDXzc5Ml9TRVJJRVMpIHx8IGRlZmluZWQoVlBfQ0NfVkNQX1NFUklFUykgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBkZWZpbmVkKFZQX0NDX1ZDUDJfU0VSSUVTKSAgfHwgZGVmaW5lZChWUF9DQ19NRUxUX1NFUklFUykgfHwgZGVmaW5lZChWUF9DQ19LV1JBUCkKdHlwZWRlZiBWcFN0YXR1c1R5cGUKKCpWcEluaXRTbGFjRnVuY1B0clR5cGUpICgKICAgIHN0cnVjdCBWcExpbmVDdHhUeXBlICpwTGluZUN0eCwKICAgIFZwUHJvZmlsZVB0clR5cGUgcERldlByb2ZpbGUsCiAgICBWcFByb2ZpbGVQdHJUeXBlIHBBY1Byb2ZpbGUsCiAgICBWcFByb2ZpbGVQdHJUeXBlIHBEY1Byb2ZpbGUsCiAgICBWcFByb2ZpbGVQdHJUeXBlIHBSaW5nUHJvZmlsZSk7CiNlbmRpZiAgLyoKICAgICAgICAgKiAhZGVmaW5lZChWUF9SRURVQ0VEX0FQSV9JRikgfHwgZGVmaW5lZChWUF9DQ183OTJfU0VSSUVTKSB8fCBkZWZpbmVkKFZQX0NDX1ZDUF9TRVJJRVMpIFwKICAgICAgICAgKiB8fCBkZWZpbmVkKFZQX0NDX1ZDUDJfU0VSSUVTKSAgfHwgZGVmaW5lZChWUF9DQ19NRUxUX1NFUklFUykgfHwgZGVmaW5lZChWUF9DQ19LV1JBUCkKICAgICAgICAgKi8KCnR5cGVkZWYgVnBTdGF0dXNUeXBlCigqVnBJbml0TGluZUZ1bmNQdHJUeXBlKSAoCiAgICBzdHJ1Y3QgVnBMaW5lQ3R4VHlwZSAqcExpbmVDdHgsCiAgICBWcFByb2ZpbGVQdHJUeXBlIHBBY1Byb2ZpbGUsCiAgICBWcFByb2ZpbGVQdHJUeXBlIHBEY0ZlZWRPckZ4b0NmZ1Byb2ZpbGUsCiAgICBWcFByb2ZpbGVQdHJUeXBlIHBSaW5nUHJvZmlsZSk7Cgp0eXBlZGVmIFZwU3RhdHVzVHlwZQooKlZwQ29uZmlnTGluZUZ1bmNQdHJUeXBlKSAoCiAgICBzdHJ1Y3QgVnBMaW5lQ3R4VHlwZSAqcExpbmVDdHgsCiAgICBWcFByb2ZpbGVQdHJUeXBlIHBBY1Byb2ZpbGUsCiAgICBWcFByb2ZpbGVQdHJUeXBlIHBEY0ZlZWRPckZ4b0NmZ1Byb2ZpbGUsCiAgICBWcFByb2ZpbGVQdHJUeXBlIHBSaW5nUHJvZmlsZSk7CgojaWYgIWRlZmluZWQoVlBfUkVEVUNFRF9BUElfSUYpIHx8IGRlZmluZWQoVlBfQ0NfNzkyX1NFUklFUykgfHwgZGVmaW5lZChWUF9DQ19WQ1BfU0VSSUVTKSAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBkZWZpbmVkKFZQX0NDX1ZDUDJfU0VSSUVTKSB8fCBkZWZpbmVkKFZQX0NDX01FTFRfU0VSSUVTKSBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgZGVmaW5lZChWUF9DQ19LV1JBUCkgfHwgZGVmaW5lZChWUF9DQ183OTBfU0VSSUVTKQp0eXBlZGVmIFZwU3RhdHVzVHlwZQooKlZwU2V0QkZpbHRlckZ1bmNQdHJUeXBlKSAoCiAgICBzdHJ1Y3QgVnBMaW5lQ3R4VHlwZSAqcExpbmVDdHgsCiAgICBWcEJGaWx0ZXJNb2RlVHlwZSBiRmlsdE1vZGUsCiAgICBWcFByb2ZpbGVQdHJUeXBlIHBBY1Byb2ZpbGUpOwoKdHlwZWRlZiBWcFN0YXR1c1R5cGUKKCpWcFNldEJhdHRlcmllc0Z1bmNQdHJUeXBlKSAoCiAgICBzdHJ1Y3QgVnBMaW5lQ3R4VHlwZSAqcExpbmVDdHgsCiAgICBWcEJhdHRlcnlNb2RlVHlwZSBiYXR0TW9kZSwKICAgIFZwQmF0dGVyeVZhbHVlc1R5cGUgKnBCYXR0KTsKI2VuZGlmICAvKgogICAgICAgICAqICFkZWZpbmVkKFZQX1JFRFVDRURfQVBJX0lGKSB8fCBkZWZpbmVkKFZQX0NDXzc5Ml9TRVJJRVMpIHx8IGRlZmluZWQoVlBfQ0NfVkNQX1NFUklFUykgICBcCiAgICAgICAgICogfHwgZGVmaW5lZChWUF9DQ19WQ1AyX1NFUklFUykgfHwgZGVmaW5lZChWUF9DQ19NRUxUX1NFUklFUykgXAogICAgICAgICAqIHx8IGRlZmluZWQoVlBfQ0NfS1dSQVApIHx8IGRlZmluZWQoVlBfQ0NfNzkwX1NFUklFUykKICAgICAgICAgKi8KCiNpZiAhZGVmaW5lZChWUF9SRURVQ0VEX0FQSV9JRikgfHwgZGVmaW5lZChWUF9DQ183OTJfU0VSSUVTKSB8fCBkZWZpbmVkKFZQX0NDX1ZDUF9TRVJJRVMpICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGRlZmluZWQoVlBfQ0NfVkNQMl9TRVJJRVMpIHx8IGRlZmluZWQoVlBfQ0NfTUVMVF9TRVJJRVMpIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBkZWZpbmVkKFZQX0NDX0tXUkFQKSB8fCBkZWZpbmVkKFZQX0NDXzc5MF9TRVJJRVMpIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoZGVmaW5lZChWUF9DQ184ODBfU0VSSUVTKSAmJiBkZWZpbmVkKFZQX0VOQUJMRV9QUk9EX1RFU1QpKQp0eXBlZGVmIFZwU3RhdHVzVHlwZQooKlZwQ2FsQ29kZWNGdW5jUHRyVHlwZSkgKAogICAgc3RydWN0IFZwTGluZUN0eFR5cGUgKnBMaW5lQ3R4LAogICAgVnBEZXZpY2VDYWxUeXBlIG1vZGUpOwojZW5kaWYgIC8qCiAgICAgICAgICogIWRlZmluZWQoVlBfUkVEVUNFRF9BUElfSUYpIHx8IGRlZmluZWQoVlBfQ0NfNzkyX1NFUklFUykgfHwgZGVmaW5lZChWUF9DQ19WQ1BfU0VSSUVTKSAgIFwKICAgICAgICAgKiB8fCBkZWZpbmVkKFZQX0NDX1ZDUDJfU0VSSUVTKSB8fCBkZWZpbmVkKFZQX0NDX01FTFRfU0VSSUVTKSBcCiAgICAgICAgICogfHwgZGVmaW5lZChWUF9DQ19LV1JBUCkgfHwgZGVmaW5lZChWUF9DQ183OTBfU0VSSUVTKSBcCiAgICAgICAgICogfHwgKGRlZmluZWQoVlBfQ0NfODgwX1NFUklFUykgJiYgZGVmaW5lZChWUF9FTkFCTEVfUFJPRF9URVNUKSkKICAgICAgICAgKi8KCnR5cGVkZWYgVnBTdGF0dXNUeXBlCigqVnBDYWxMaW5lRnVuY1B0clR5cGUpICgKICAgIHN0cnVjdCBWcExpbmVDdHhUeXBlICpwTGluZUN0eCk7Cgp0eXBlZGVmIFZwU3RhdHVzVHlwZQooKlZwQ2FsRnVuY1B0clR5cGUpICgKICAgIHN0cnVjdCBWcExpbmVDdHhUeXBlICpwTGluZUN0eCwKICAgIFZwQ2FsVHlwZSBjYWxUeXBlLAogICAgdm9pZCAqaW5wdXRBcmdzKTsKCiNpZiAhZGVmaW5lZChWUF9SRURVQ0VEX0FQSV9JRikgfHwgZGVmaW5lZChWUF9DQ183OTJfU0VSSUVTKSB8fCBkZWZpbmVkKFZQX0NDX1ZDUF9TRVJJRVMpICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGRlZmluZWQoVlBfQ0NfVkNQMl9TRVJJRVMpIHx8IGRlZmluZWQoVlBfQ0NfTUVMVF9TRVJJRVMpIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBkZWZpbmVkKFZQX0NDX0tXUkFQKSB8fCBkZWZpbmVkKFZQX0NTTEFDX1NFUV9FTikKdHlwZWRlZiBWcFN0YXR1c1R5cGUKKCpWcEluaXRSaW5nRnVuY1B0clR5cGUpICgKICAgIHN0cnVjdCBWcExpbmVDdHhUeXBlICpwTGluZUN0eCwKICAgIFZwUHJvZmlsZVB0clR5cGUgcENhZFByb2ZpbGUsCiAgICBWcFByb2ZpbGVQdHJUeXBlIHBDaWRQcm9maWxlKTsKCnR5cGVkZWYgVnBTdGF0dXNUeXBlCigqVnBJbml0Q2lkRnVuY1B0clR5cGUpICgKICAgIHN0cnVjdCBWcExpbmVDdHhUeXBlICpwTGluZUN0eCwKICAgIHVpbnQ4IGxlbmd0aCwKICAgIHVpbnQ4cCBwQ2lkRGF0YSk7Cgp0eXBlZGVmIFZwU3RhdHVzVHlwZQooKlZwSW5pdE1ldGVyRnVuY1B0clR5cGUpICgKICAgIHN0cnVjdCBWcExpbmVDdHhUeXBlICpwTGluZUN0eCwKICAgIFZwUHJvZmlsZVB0clR5cGUgcE1ldGVyUHJvZmlsZSk7CiNlbmRpZiAgLyoKICAgICAgICAgKiAhZGVmaW5lZChWUF9SRURVQ0VEX0FQSV9JRikgfHwgZGVmaW5lZChWUF9DQ183OTJfU0VSSUVTKSB8fCBkZWZpbmVkKFZQX0NDX1ZDUF9TRVJJRVMpICAgXAogICAgICAgICAqIHx8IGRlZmluZWQoVlBfQ0NfVkNQMl9TRVJJRVMpIHx8IGRlZmluZWQoVlBfQ0NfTUVMVF9TRVJJRVMpIFwKICAgICAgICAgKiB8fCBkZWZpbmVkKFZQX0NDX0tXUkFQKSB8fCBkZWZpbmVkKFZQX0NTTEFDX1NFUV9FTikKICAgICAgICAgKi8KCiNpZiAhZGVmaW5lZChWUF9SRURVQ0VEX0FQSV9JRikgfHwgZGVmaW5lZChWUF9DQ183OTJfU0VSSUVTKSB8fCBkZWZpbmVkKFZQX0NDX1ZDUF9TRVJJRVMpICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGRlZmluZWQoVlBfQ0NfVkNQMl9TRVJJRVMpIHx8IGRlZmluZWQoVlBfQ0NfTUVMVF9TRVJJRVMpIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBkZWZpbmVkKFZQX0NDX0tXUkFQKSB8fCBkZWZpbmVkKFZQX0NDXzU4MF9TRVJJRVMpCnR5cGVkZWYgVnBTdGF0dXNUeXBlCigqVnBJbml0Q3VzdG9tVGVybVR5cGVGdW5jUHRyVHlwZSkgKAogICAgc3RydWN0IFZwRGV2Q3R4VHlwZSAqcERldkN0eCwKICAgIHN0cnVjdCBWcExpbmVDdHhUeXBlICpwTGluZUN0eCwKICAgIFZwUHJvZmlsZVB0clR5cGUgcEN1c3RvbVRlcm1Qcm9maWxlKTsKI2VuZGlmICAvKgogICAgICAgICAqICFkZWZpbmVkKFZQX1JFRFVDRURfQVBJX0lGKSB8fCBkZWZpbmVkKFZQX0NDXzc5Ml9TRVJJRVMpIHx8IGRlZmluZWQoVlBfQ0NfVkNQX1NFUklFUykgICBcCiAgICAgICAgICogfHwgZGVmaW5lZChWUF9DQ19WQ1AyX1NFUklFUykgfHwgZGVmaW5lZChWUF9DQ19NRUxUX1NFUklFUykgXAogICAgICAgICAqIHx8IGRlZmluZWQoVlBfQ0NfS1dSQVApIHx8IGRlZmluZWQoVlBfQ0NfNTgwX1NFUklFUykKICAgICAgICAgKi8KCnR5cGVkZWYgVnBTdGF0dXNUeXBlCigqVnBJbml0UHJvZmlsZUZ1bmNQdHJUeXBlKSAoCiAgICBzdHJ1Y3QgVnBEZXZDdHhUeXBlICpwRGV2Q3R4LAogICAgVnBQcm9maWxlVHlwZSB0eXBlLAogICAgVnBQcm9maWxlUHRyVHlwZSBwUHJvZmlsZUluZGV4LAogICAgVnBQcm9maWxlUHRyVHlwZSBwUHJvZmlsZSk7CgojaWYgIWRlZmluZWQoVlBfUkVEVUNFRF9BUElfSUYpIHx8IGRlZmluZWQoVlBfQ0NfNzkyX1NFUklFUykgfHwgZGVmaW5lZChWUF9DQ19WQ1BfU0VSSUVTKSAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBkZWZpbmVkKFZQX0NDX1ZDUDJfU0VSSUVTKSB8fCBkZWZpbmVkKFZQX0NDX01FTFRfU0VSSUVTKSBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgZGVmaW5lZChWUF9DQ19LV1JBUCkKdHlwZWRlZiBWcFN0YXR1c1R5cGUKKCpWcFNvZnRSZXNldEZ1bmNQdHJUeXBlKSAoCiAgICBzdHJ1Y3QgVnBEZXZDdHhUeXBlICpwRGV2Q3R4KTsKI2VuZGlmICAvKgogICAgICAgICAqICFkZWZpbmVkKFZQX1JFRFVDRURfQVBJX0lGKSB8fCBkZWZpbmVkKFZQX0NDXzc5Ml9TRVJJRVMpIHx8IGRlZmluZWQoVlBfQ0NfVkNQX1NFUklFUykgICBcCiAgICAgICAgICogfHwgZGVmaW5lZChWUF9DQ19WQ1AyX1NFUklFUykgfHwgZGVmaW5lZChWUF9DQ19NRUxUX1NFUklFUykgfHwgZGVmaW5lZChWUF9DQ19LV1JBUCkKICAgICAgICAgKi8KCi8qCiAqIENvbnRyb2wgZnVuY3Rpb25zCiAqLwp0eXBlZGVmIFZwU3RhdHVzVHlwZQooKlZwU2V0TGluZVN0YXRlRnVuY1B0clR5cGUpICgKICAgIHN0cnVjdCBWcExpbmVDdHhUeXBlICpwTGluZUN0eCwKICAgIFZwTGluZVN0YXRlVHlwZSBzdGF0ZSk7Cgp0eXBlZGVmIFZwU3RhdHVzVHlwZQooKlZwU2V0TGluZVRvbmVGdW5jUHRyVHlwZSkgKAogICAgc3RydWN0IFZwTGluZUN0eFR5cGUgKnBMaW5lQ3R4LAogICAgVnBQcm9maWxlUHRyVHlwZSBwVG9uZVByb2ZpbGUsCiAgICBWcFByb2ZpbGVQdHJUeXBlIHBDYWRQcm9maWxlLAogICAgVnBEdG1mVG9uZUdlblR5cGUgKnBEdG1mQ29udHJvbCk7Cgp0eXBlZGVmIFZwU3RhdHVzVHlwZQooKlZwU2V0UmVsYXlTdGF0ZUZ1bmNQdHJUeXBlKSAoCiAgICBzdHJ1Y3QgVnBMaW5lQ3R4VHlwZSAqcExpbmVDdHgsCiAgICBWcFJlbGF5Q29udHJvbFR5cGUgclN0YXRlKTsKCiNpZiAhZGVmaW5lZChWUF9SRURVQ0VEX0FQSV9JRikgfHwgZGVmaW5lZChWUF9DQ183OTJfU0VSSUVTKSB8fCBkZWZpbmVkKFZQX0NDX1ZDUF9TRVJJRVMpICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGRlZmluZWQoVlBfQ0NfVkNQMl9TRVJJRVMpIHx8IGRlZmluZWQoVlBfQ0NfTUVMVF9TRVJJRVMpIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBkZWZpbmVkKFZQX0NDX0tXUkFQKSB8fCBkZWZpbmVkKFZQX0NDXzU4MF9TRVJJRVMpCnR5cGVkZWYgVnBTdGF0dXNUeXBlCigqVnBTZXRDYWxSZWxheVN0YXRlRnVuY1B0clR5cGUpICgKICAgIHN0cnVjdCBWcERldkN0eFR5cGUgKnBEZXZDdHgsCiAgICBWcENhbFJlbGF5Q29udHJvbFR5cGUgclN0YXRlKTsKI2VuZGlmICAvKgogICAgICAgICAqICFkZWZpbmVkKFZQX1JFRFVDRURfQVBJX0lGKSB8fCBkZWZpbmVkKFZQX0NDXzc5Ml9TRVJJRVMpIHx8IGRlZmluZWQoVlBfQ0NfVkNQX1NFUklFUykgICBcCiAgICAgICAgICogfHwgZGVmaW5lZChWUF9DQ19WQ1AyX1NFUklFUykgfHwgZGVmaW5lZChWUF9DQ19NRUxUX1NFUklFUykgXAogICAgICAgICAqIHx8IGRlZmluZWQoVlBfQ0NfS1dSQVApIHx8IGRlZmluZWQoVlBfQ0NfNTgwX1NFUklFUykKICAgICAgICAgKi8KCnR5cGVkZWYgVnBTdGF0dXNUeXBlCigqVnBTZXRSZWxHYWluRnVuY1B0clR5cGUpICgKICAgIHN0cnVjdCBWcExpbmVDdHhUeXBlICpwTGluZUN0eCwKICAgIHVpbnQxNiB0eExldmVsLAogICAgdWludDE2IHJ4TGV2ZWwsCiAgICB1aW50MTYgaGFuZGxlKTsKCiNpZiAhZGVmaW5lZChWUF9SRURVQ0VEX0FQSV9JRikgfHwgZGVmaW5lZChWUF9DQ183OTJfU0VSSUVTKSB8fCBkZWZpbmVkKFZQX0NDX1ZDUF9TRVJJRVMpICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGRlZmluZWQoVlBfQ0NfVkNQMl9TRVJJRVMpIHx8IGRlZmluZWQoVlBfQ0NfTUVMVF9TRVJJRVMpIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBkZWZpbmVkKFZQX0NDX0tXUkFQKSAgfHwgZGVmaW5lZChWUF9DU0xBQ19TRVFfRU4pCnR5cGVkZWYgVnBTdGF0dXNUeXBlCigqVnBTZW5kU2lnbmFsRnVuY1B0clR5cGUpICgKICAgIHN0cnVjdCBWcExpbmVDdHhUeXBlICpwTGluZUN0eCwKICAgIFZwU2VuZFNpZ25hbFR5cGUgc2lnbmFsVHlwZSwKICAgIHZvaWQgKnBTaWduYWxEYXRhKTsKCnR5cGVkZWYgVnBTdGF0dXNUeXBlCigqVnBTZW5kQ2lkRnVuY1B0clR5cGUpICgKICAgIHN0cnVjdCBWcExpbmVDdHhUeXBlICpwTGluZUN0eCwKICAgIHVpbnQ4IGxlbmd0aCwKICAgIFZwUHJvZmlsZVB0clR5cGUgcENpZFByb2ZpbGUsCiAgICB1aW50OHAgcENpZERhdGEpOwoKdHlwZWRlZiBWcFN0YXR1c1R5cGUKKCpWcENvbnRpbnVlQ2lkRnVuY1B0clR5cGUpICgKICAgIHN0cnVjdCBWcExpbmVDdHhUeXBlICpwTGluZUN0eCwKICAgIHVpbnQ4IGxlbmd0aCwKICAgIHVpbnQ4cCBwQ2lkRGF0YSk7Cgp0eXBlZGVmIFZwU3RhdHVzVHlwZQooKlZwU3RhcnRNZXRlckZ1bmNQdHJUeXBlKSAoCiAgICBzdHJ1Y3QgVnBMaW5lQ3R4VHlwZSAqcExpbmVDdHgsCiAgICB1aW50MTYgb25UaW1lLAogICAgdWludDE2IG9mZlRpbWUsCiAgICB1aW50MTYgbnVtTWV0ZXJzKTsKI2VuZGlmICAvKgogICAgICAgICAqICFkZWZpbmVkKFZQX1JFRFVDRURfQVBJX0lGKSB8fCBkZWZpbmVkKFZQX0NDXzc5Ml9TRVJJRVMpIHx8IGRlZmluZWQoVlBfQ0NfVkNQX1NFUklFUykgICBcCiAgICAgICAgICogfHwgZGVmaW5lZChWUF9DQ19WQ1AyX1NFUklFUykgfHwgZGVmaW5lZChWUF9DQ19NRUxUX1NFUklFUykgXAogICAgICAgICAqIHx8IGRlZmluZWQoVlBfQ0NfS1dSQVApICB8fCBkZWZpbmVkKFZQX0NTTEFDX1NFUV9FTikKICAgICAgICAgKi8KCiNpZiAhZGVmaW5lZChWUF9SRURVQ0VEX0FQSV9JRikgfHwgZGVmaW5lZChWUF9DQ183OTJfU0VSSUVTKSB8fCBkZWZpbmVkKFZQX0NDX1ZDUF9TRVJJRVMpICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGRlZmluZWQoVlBfQ0NfVkNQMl9TRVJJRVMpIHx8IGRlZmluZWQoVlBfQ0NfTUVMVF9TRVJJRVMpIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBkZWZpbmVkKFZQX0NDX0tXUkFQKQp0eXBlZGVmIFZwU3RhdHVzVHlwZQooKlZwU3RhcnRNZXRlcjMyUUZ1bmNQdHJUeXBlKSAoCiAgICBzdHJ1Y3QgVnBMaW5lQ3R4VHlwZSAqcExpbmVDdHgsCiAgICB1aW50MzIgbWluRGVsYXksCiAgICB1aW50MzIgb25UaW1lLAogICAgdWludDMyIG9mZlRpbWUsCiAgICB1aW50MTYgbnVtTWV0ZXJzLAogICAgdWludDE2IGV2ZW50UmF0ZSk7Cgp0eXBlZGVmIFZwU3RhdHVzVHlwZQooKlZwR2VuVGltZXJDdHJsRnVuY1B0clR5cGUpICgKICAgIHN0cnVjdCBWcExpbmVDdHhUeXBlICpwTGluZUN0eCwKICAgIFZwR2VuVGltZXJDdHJsVHlwZSB0aW1lckN0cmwsCiAgICB1aW50MzIgZHVyYXRpb24sCiAgICB1aW50MTYgaGFuZGxlKTsKCnR5cGVkZWYgVnBTdGF0dXNUeXBlCigqVnBBc3NvY0RzbExpbmVGdW5jUHRyVHlwZSkgKAogICAgc3RydWN0IFZwTGluZUN0eFR5cGUgKnBMaW5lQ3R4LAogICAgYm9vbCBjb25uZWN0LAogICAgdWludDggbGluZSk7Cgp0eXBlZGVmIFZwU3RhdHVzVHlwZQooKlZwU2V0U2VhbEN1ckZ1bmNQdHJUeXBlKSAoCiAgICBzdHJ1Y3QgVnBEZXZDdHhUeXBlICpwRGV2Q3R4LAogICAgdWludDE2IHNlYWxBcHBseVRpbWUsCiAgICB1aW50MTYgc2VhbEN5Y2xlVGltZSwKICAgIHVpbnQxNiBtYXhDdXJyZW50LAogICAgdWludDE2IG1pbkN1cnJlbnQsCiAgICB1aW50MTYgKnBTZWFsQXJyYXksCiAgICBWcFByb2ZpbGVQdHJUeXBlIHBEY1Byb2ZpbGUpOwojZW5kaWYgIC8qCiAgICAgICAgICogIWRlZmluZWQoVlBfUkVEVUNFRF9BUElfSUYpIHx8IGRlZmluZWQoVlBfQ0NfNzkyX1NFUklFUykgfHwgZGVmaW5lZChWUF9DQ19WQ1BfU0VSSUVTKSAgIFwKICAgICAgICAgKiB8fCBkZWZpbmVkKFZQX0NDX1ZDUDJfU0VSSUVTKSB8fCBkZWZpbmVkKFZQX0NDX01FTFRfU0VSSUVTKSB8fCBkZWZpbmVkKFZQX0NDX0tXUkFQKQogICAgICAgICAqLwoKdHlwZWRlZiBWcFN0YXR1c1R5cGUKKCpWcFNldE9wdGlvbkZ1bmNQdHJUeXBlKSAoCiAgICBzdHJ1Y3QgVnBMaW5lQ3R4VHlwZSAqcExpbmVDdHgsCiAgICBzdHJ1Y3QgVnBEZXZDdHhUeXBlICpwRGV2Q3R4LAogICAgVnBPcHRpb25JZFR5cGUgb3B0aW9uLAogICAgdm9pZCAqcFZhbHVlKTsKCnR5cGVkZWYgVnBTdGF0dXNUeXBlCigqVnBEZXZpY2VJb0FjY2Vzc0Z1bmNQdHJUeXBlKSAoCiAgICBzdHJ1Y3QgVnBEZXZDdHhUeXBlICpwRGV2Q3R4LAogICAgVnBEZXZpY2VJb0FjY2Vzc0RhdGFUeXBlICpwRGV2aWNlSW9EYXRhKTsKCiNpZiAhZGVmaW5lZChWUF9SRURVQ0VEX0FQSV9JRikgfHwgZGVmaW5lZChWUF9DQ183OTJfU0VSSUVTKSB8fCBkZWZpbmVkKFZQX0NDX1ZDUF9TRVJJRVMpICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGRlZmluZWQoVlBfQ0NfVkNQMl9TRVJJRVMpIHx8IGRlZmluZWQoVlBfQ0NfTUVMVF9TRVJJRVMpIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBkZWZpbmVkKFZQX0NDX0tXUkFQKQp0eXBlZGVmIFZwU3RhdHVzVHlwZQooKlZwRGV2aWNlSW9BY2Nlc3NFeHRGdW5jUHRyVHlwZSkgKAogICAgc3RydWN0IFZwRGV2Q3R4VHlwZSAqcERldkN0eCwKICAgIFZwRGV2aWNlSW9BY2Nlc3NFeHRUeXBlICpwRGV2aWNlSW9BY2Nlc3MpOwoKdHlwZWRlZiBWcFN0YXR1c1R5cGUKKCpWcExpbmVJb0FjY2Vzc0Z1bmNQdHJUeXBlKSAoCiAgICBzdHJ1Y3QgVnBMaW5lQ3R4VHlwZSAqcExpbmVDdHgsCiAgICBWcExpbmVJb0FjY2Vzc1R5cGUgKnBMaW5lSW9BY2Nlc3MsCiAgICB1aW50MTYgaGFuZGxlKTsKI2VuZGlmICAvKgogICAgICAgICAqICFkZWZpbmVkKFZQX1JFRFVDRURfQVBJX0lGKSB8fCBkZWZpbmVkKFZQX0NDXzc5Ml9TRVJJRVMpIHx8IGRlZmluZWQoVlBfQ0NfVkNQX1NFUklFUykgICBcCiAgICAgICAgICogfHwgZGVmaW5lZChWUF9DQ19WQ1AyX1NFUklFUykgfHwgZGVmaW5lZChWUF9DQ19NRUxUX1NFUklFUykgfHwgZGVmaW5lZChWUF9DQ19LV1JBUCkKICAgICAgICAgKi8KCnR5cGVkZWYgVnBTdGF0dXNUeXBlCigqVnBWaXJ0dWFsSVNSRnVuY1B0clR5cGUpICgKICAgIHN0cnVjdCBWcERldkN0eFR5cGUgKnBEZXZDdHgpOwoKdHlwZWRlZiBWcFN0YXR1c1R5cGUKKCpWcEFwaVRpY2tGdW5jUHRyVHlwZSkgKAogICAgc3RydWN0IFZwRGV2Q3R4VHlwZSAqcERldkN0eCwKICAgIGJvb2wgKnBFdmVudFN0YXR1cyk7CgojaWYgIWRlZmluZWQoVlBfUkVEVUNFRF9BUElfSUYpIHx8IGRlZmluZWQoVlBfQ0NfNzkyX1NFUklFUykgfHwgZGVmaW5lZChWUF9DQ19WQ1BfU0VSSUVTKSAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBkZWZpbmVkKFZQX0NDX1ZDUDJfU0VSSUVTKSB8fCBkZWZpbmVkKFZQX0NDX01FTFRfU0VSSUVTKSBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgZGVmaW5lZChWUF9DQ19LV1JBUCkgfHwgZGVmaW5lZChaQVJMSU5LX0NGR19JTlRFUk5BTCkKdHlwZWRlZiBWcFN0YXR1c1R5cGUKKCpWcExvd0xldmVsQ21kRnVuY1B0clR5cGUpICgKICAgIHN0cnVjdCBWcExpbmVDdHhUeXBlICpwTGluZUN0eCwKICAgIHVpbnQ4ICpwQ21kRGF0YSwKICAgIHVpbnQ4IGxlbiwKICAgIHVpbnQxNiBoYW5kbGUpOwojZW5kaWYKCiNpZiAhZGVmaW5lZChWUF9SRURVQ0VEX0FQSV9JRikgfHwgZGVmaW5lZChWUF9DQ183OTJfU0VSSUVTKSB8fCBkZWZpbmVkKFZQX0NDX1ZDUF9TRVJJRVMpICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGRlZmluZWQoVlBfQ0NfVkNQMl9TRVJJRVMpIHx8IGRlZmluZWQoVlBfQ0NfTUVMVF9TRVJJRVMpIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBkZWZpbmVkKFZQX0NDX0tXUkFQKQp0eXBlZGVmIFZwU3RhdHVzVHlwZQooKlZwTG93TGV2ZWxDbWQxNkZ1bmNQdHJUeXBlKSAoCiAgICBzdHJ1Y3QgVnBMaW5lQ3R4VHlwZSAqcExpbmVDdHgsCiAgICBWcExvd0xldmVsQ21kVHlwZSBjbWRUeXBlLAogICAgdWludDE2ICp3cml0ZVdvcmRzLAogICAgdWludDggbnVtV3JpdGVXb3JkcywKICAgIHVpbnQ4IG51bVJlYWRXb3JkcywKICAgIHVpbnQxNiBoYW5kbGUpOwojZW5kaWYgIC8qCiAgICAgICAgICogIWRlZmluZWQoVlBfUkVEVUNFRF9BUElfSUYpIHx8IGRlZmluZWQoVlBfQ0NfNzkyX1NFUklFUykgfHwgZGVmaW5lZChWUF9DQ19WQ1BfU0VSSUVTKSAgIFwKICAgICAgICAgKiB8fCBkZWZpbmVkKFZQX0NDX1ZDUDJfU0VSSUVTKSB8fCBkZWZpbmVkKFZQX0NDX01FTFRfU0VSSUVTKSB8fCBkZWZpbmVkKFZQX0NDX0tXUkFQKQogICAgICAgICAqLwoKLyoKICogU3RhdHVzIGFuZCBxdWVyeSBmdW5jdGlvbnMKICovCgp0eXBlZGVmIGJvb2wKKCpWcEdldEV2ZW50RnVuY1B0clR5cGUpICgKICAgIHN0cnVjdCBWcERldkN0eFR5cGUgKnBEZXZDdHgsCiAgICBzdHJ1Y3QgVnBFdmVudFR5cGUgKnBFdmVudCk7Cgp0eXBlZGVmIFZwU3RhdHVzVHlwZQooKlZwR2V0TGluZVN0YXR1c0Z1bmNQdHJUeXBlKSAoCiAgICBzdHJ1Y3QgVnBMaW5lQ3R4VHlwZSAqcExpbmVDdHgsCiAgICBWcElucHV0VHlwZSBpbnB1dCwKICAgIGJvb2wgKnBTdGF0dXMpOwoKdHlwZWRlZiBWcFN0YXR1c1R5cGUKKCpWcEdldERldmljZVN0YXR1c0Z1bmNQdHJUeXBlKSAoCiAgICBzdHJ1Y3QgVnBEZXZDdHhUeXBlICpwRGV2Q3R4LAogICAgVnBJbnB1dFR5cGUgaW5wdXQsCiAgICB1aW50MzIgKnBEZXZpY2VTdGF0dXMpOwoKI2lmICFkZWZpbmVkKFZQX1JFRFVDRURfQVBJX0lGKSB8fCBkZWZpbmVkKFZQX0NDXzc5Ml9TRVJJRVMpIHx8IGRlZmluZWQoVlBfQ0NfVkNQX1NFUklFUykgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBkZWZpbmVkKFZQX0NDX1ZDUDJfU0VSSUVTKSAgfHwgZGVmaW5lZChWUF9DQ19NRUxUX1NFUklFUykgfHwgZGVmaW5lZChWUF9DQ19LV1JBUCkKdHlwZWRlZiBWcFN0YXR1c1R5cGUKKCpWcEdldERldmljZVN0YXR1c0V4dEZ1bmNQdHJUeXBlKSAoCiAgICBzdHJ1Y3QgVnBEZXZDdHhUeXBlICpwRGV2Q3R4LAogICAgVnBEZXZpY2VTdGF0dXNUeXBlICpwRGV2aWNlU3RhdHVzKTsKI2VuZGlmICAvKgogICAgICAgICAqICFkZWZpbmVkKFZQX1JFRFVDRURfQVBJX0lGKSB8fCBkZWZpbmVkKFZQX0NDXzc5Ml9TRVJJRVMpIHx8IGRlZmluZWQoVlBfQ0NfVkNQX1NFUklFUykgXAogICAgICAgICAqIHx8IGRlZmluZWQoVlBfQ0NfVkNQMl9TRVJJRVMpICB8fCBkZWZpbmVkKFZQX0NDX01FTFRfU0VSSUVTKSB8fCBkZWZpbmVkKFZQX0NDX0tXUkFQKQogICAgICAgICAqLwoKI2lmICFkZWZpbmVkKFZQX1JFRFVDRURfQVBJX0lGKSB8fCBkZWZpbmVkKFZQX0NDXzc5Ml9TRVJJRVMpIHx8IGRlZmluZWQoVlBfQ0NfVkNQX1NFUklFUykgXAogICAgICAgICB8fCBkZWZpbmVkKFZQX0NDX1ZDUDJfU0VSSUVTKSB8fCBkZWZpbmVkKFZQX0NDX01FTFRfU0VSSUVTKSB8fCBkZWZpbmVkKFZQX0NDX0tXUkFQKSB8fCBkZWZpbmVkKFZQX0NDXzc5MF9TRVJJRVMpCnR5cGVkZWYgVnBTdGF0dXNUeXBlCigqVnBHZXRMb29wQ29uZEZ1bmNQdHJUeXBlKSAoCiAgICBzdHJ1Y3QgVnBMaW5lQ3R4VHlwZSAqcExpbmVDdHgsCiAgICB1aW50MTYgaGFuZGxlKTsKI2VuZGlmICAvKgogICAgICAgICAqICFkZWZpbmVkKFZQX1JFRFVDRURfQVBJX0lGKSB8fCBkZWZpbmVkKFZQX0NDXzc5Ml9TRVJJRVMpIHx8IGRlZmluZWQoVlBfQ0NfVkNQX1NFUklFUykgXAogICAgICAgICAqIHx8IGRlZmluZWQoVlBfQ0NfVkNQMl9TRVJJRVMpIHx8IGRlZmluZWQoVlBfQ0NfTUVMVF9TRVJJRVMpIHx8IGRlZmluZWQoVlBfQ0NfS1dSQVApIHx8IGRlZmluZWQoVlBfQ0NfNzkwX1NFUklFUykKICAgICAgICAgKi8KCnR5cGVkZWYgVnBTdGF0dXNUeXBlCigqVnBHZXRPcHRpb25GdW5jUHRyVHlwZSkgKAogICAgc3RydWN0IFZwTGluZUN0eFR5cGUgKnBMaW5lQ3R4LAogICAgc3RydWN0IFZwRGV2Q3R4VHlwZSAqcERldkN0eCwKICAgIFZwT3B0aW9uSWRUeXBlIG9wdGlvbiwKICAgIHVpbnQxNiBoYW5kbGUpOwoKdHlwZWRlZiBWcFN0YXR1c1R5cGUKKCpWcEdldExpbmVTdGF0ZUZ1bmNQdHJUeXBlKSAoCiAgICBzdHJ1Y3QgVnBMaW5lQ3R4VHlwZSAqcExpbmVDdHgsCiAgICBWcExpbmVTdGF0ZVR5cGUgKnBDdXJyZW50U3RhdGUpOwoKdHlwZWRlZiBWcFN0YXR1c1R5cGUKKCpWcEZsdXNoRXZlbnRzRnVuY1B0clR5cGUpICgKICAgIHN0cnVjdCBWcERldkN0eFR5cGUgKnBEZXZDdHgpOwoKdHlwZWRlZiBWcFN0YXR1c1R5cGUKKCpWcEdldFJlc3VsdHNGdW5jUHRyVHlwZSkgKAogICAgc3RydWN0IFZwRXZlbnRUeXBlICpwRXZlbnQsCiAgICB2b2lkICpwUmVzdWx0cyk7CgojaWYgIWRlZmluZWQoVlBfUkVEVUNFRF9BUElfSUYpIHx8IGRlZmluZWQoVlBfQ0NfNzkyX1NFUklFUykgfHwgZGVmaW5lZChWUF9DQ19WQ1BfU0VSSUVTKSBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGRlZmluZWQoVlBfQ0NfVkNQMl9TRVJJRVMpIHx8IGRlZmluZWQoVlBfQ0NfTUVMVF9TRVJJRVMpIHx8IGRlZmluZWQoVlBfQ0NfS1dSQVApCnR5cGVkZWYgVnBTdGF0dXNUeXBlCigqVnBDbGVhclJlc3VsdHNGdW5jUHRyVHlwZSkgKAogICAgc3RydWN0IFZwRGV2Q3R4VHlwZSAqcERldkN0eCk7CiNlbmRpZiAgLyoKICAgICAgICAgKiAhZGVmaW5lZChWUF9SRURVQ0VEX0FQSV9JRikgfHwgZGVmaW5lZChWUF9DQ183OTJfU0VSSUVTKSB8fCBkZWZpbmVkKFZQX0NDX1ZDUF9TRVJJRVMpIFwKICAgICAgICAgKiB8fCBkZWZpbmVkKFZQX0NDX1ZDUDJfU0VSSUVTKSB8fCBkZWZpbmVkKFZQX0NDX01FTFRfU0VSSUVTKSB8fCBkZWZpbmVkKFZQX0NDX0tXUkFQKQogICAgICAgICAqLwoKI2lmICFkZWZpbmVkKFZQX1JFRFVDRURfQVBJX0lGKSB8fCBkZWZpbmVkKFZQX0NDXzc5Ml9TRVJJRVMpIHx8IGRlZmluZWQoVlBfQ0NfVkNQX1NFUklFUykgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGRlZmluZWQoVlBfQ0NfVkNQMl9TRVJJRVMpIHx8IGRlZmluZWQoVlBfQ0NfTUVMVF9TRVJJRVMpIHx8IGRlZmluZWQoVlBfQ0NfS1dSQVApIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoZGVmaW5lZChWUDg4MF9JTkNMVURFX1RFU1RMSU5FX0NPREUpICYmIGRlZmluZWQoVlBfQ0NfODgwX1NFUklFUykpIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoZGVmaW5lZChWUDg5MF9JTkNMVURFX1RFU1RMSU5FX0NPREUpICYmIGRlZmluZWQoVlBfQ0NfODkwX1NFUklFUykpCnR5cGVkZWYgVnBTdGF0dXNUeXBlCigqVnBHZXRSZWxheVN0YXRlRnVuY1B0clR5cGUpICgKICAgIHN0cnVjdCBWcExpbmVDdHhUeXBlICpwTGluZUN0eCwKICAgIFZwUmVsYXlDb250cm9sVHlwZSAqcFJzdGF0ZSk7CiNlbmRpZiAgLyoKICAgICAgICAgKiAhZGVmaW5lZChWUF9SRURVQ0VEX0FQSV9JRikgfHwgZGVmaW5lZChWUF9DQ183OTJfU0VSSUVTKSB8fCBkZWZpbmVkKFZQX0NDX1ZDUF9TRVJJRVMpIFwKICAgICAgICAgKiB8fCBkZWZpbmVkKFZQX0NDX1ZDUDJfU0VSSUVTKSB8fCBkZWZpbmVkKFZQX0NDX01FTFRfU0VSSUVTKSB8fCBkZWZpbmVkKFZQX0NDX0tXUkFQKSBcCiAgICAgICAgICogfHwgKGRlZmluZWQoVlA4ODBfSU5DTFVERV9URVNUTElORV9DT0RFKSAmJiBkZWZpbmVkKFZQX0NDXzg4MF9TRVJJRVMpKSBcCiAgICAgICAgICogfHwgKGRlZmluZWQoVlA4OTBfSU5DTFVERV9URVNUTElORV9DT0RFKSAmJiBkZWZpbmVkKFZQX0NDXzg5MF9TRVJJRVMpKQogICAgICAgICAqLwoKdHlwZWRlZiBWcFN0YXR1c1R5cGUKKCpWcE9iamVjdER1bXBGdW5jUHRyVHlwZSkoCiAgICBzdHJ1Y3QgVnBMaW5lQ3R4VHlwZSAqcExpbmVDdHgsCiAgICBzdHJ1Y3QgVnBEZXZDdHhUeXBlICpwRGV2Q3R4KTsKCnR5cGVkZWYgVnBTdGF0dXNUeXBlCigqVnBSZWdpc3RlckR1bXBGdW5jUHRyVHlwZSkoCiAgICBzdHJ1Y3QgVnBEZXZDdHhUeXBlICpwRGV2Q3R4KTsKCnR5cGVkZWYgVnBTdGF0dXNUeXBlCigqVnBEdG1mRGlnaXREZXRlY3RlZEZ1bmNQdHJUeXBlKSAoCiAgICBzdHJ1Y3QgVnBMaW5lQ3R4VHlwZSAqcExpbmVDdHgsCiAgICBWcERpZ2l0VHlwZSBkaWdpdCwKICAgIFZwRGlnaXRTZW5zZVR5cGUgc2Vuc2UpOwoKI2lmICFkZWZpbmVkKFZQX1JFRFVDRURfQVBJX0lGKSB8fCBkZWZpbmVkKFZQX0NDXzc5Ml9TRVJJRVMpIHx8IGRlZmluZWQoVlBfQ0NfVkNQX1NFUklFUykgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBkZWZpbmVkKFZQX0NDX1ZDUDJfU0VSSUVTKSB8fCBkZWZpbmVkKFZQX0NDX01FTFRfU0VSSUVTKSB8fCBkZWZpbmVkKFZQX0NDX0tXUkFQKQoKdHlwZWRlZiBWcFN0YXR1c1R5cGUKKCpWcFF1ZXJ5RnVuY1B0clR5cGUpICgKICAgIHN0cnVjdCBWcExpbmVDdHhUeXBlICpwTGluZUN0eCwKICAgIFZwUXVlcnlJZFR5cGUgcXVlcnlJZCwKICAgIHVpbnQxNiBoYW5kbGUpOwojZW5kaWYgIC8qCiAgICAgICAgICogIWRlZmluZWQoVlBfUkVEVUNFRF9BUElfSUYpIHx8IGRlZmluZWQoVlBfQ0NfNzkyX1NFUklFUykgfHwgZGVmaW5lZChWUF9DQ19WQ1BfU0VSSUVTKSBcCiAgICAgICAgICogfHwgZGVmaW5lZChWUF9DQ19WQ1AyX1NFUklFUykgfHwgZGVmaW5lZChWUF9DQ19NRUxUX1NFUklFUykgfHwgZGVmaW5lZChWUF9DQ19LV1JBUCkKICAgICAgICAgKi8KCi8qCiAqIFRlc3QgRnVuY3Rpb25zCiAqLwojaWYgIWRlZmluZWQoVlBfUkVEVUNFRF9BUElfSUYpIHx8IGRlZmluZWQoVlBfQ0NfNzkyX1NFUklFUykgfHwgZGVmaW5lZChWUF9DQ19WQ1BfU0VSSUVTKSBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgZGVmaW5lZChWUF9DQ19WQ1AyX1NFUklFUykgfHwgZGVmaW5lZChWUF9DQ19NRUxUX1NFUklFUykgfHwgZGVmaW5lZChWUF9DQ19LV1JBUCkgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChkZWZpbmVkKFZQX0NDXzg4MF9TRVJJRVMpICYmIGRlZmluZWQgKFZQODgwX0lOQ0xVREVfVEVTVExJTkVfQ09ERSkpIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoZGVmaW5lZChWUF9DQ184OTBfU0VSSUVTKSAmJiBkZWZpbmVkIChWUDg5MF9JTkNMVURFX1RFU1RMSU5FX0NPREUpKQp0eXBlZGVmIFZwU3RhdHVzVHlwZQooKlZwVGVzdExpbmVGdW5jUHRyVHlwZSkgKAogICAgc3RydWN0IFZwTGluZUN0eFR5cGUgKnBMaW5lQ3R4LAogICAgVnBUZXN0SWRUeXBlIHRlc3QsCiAgICBjb25zdCB2b2lkICpwQXJncywKICAgIHVpbnQxNiBoYW5kbGUpOwoKdHlwZWRlZiBWcFN0YXR1c1R5cGUKKCpWcFRlc3RMaW5lSW50RnVuY1B0clR5cGUpICgKICAgIHN0cnVjdCBWcExpbmVDdHhUeXBlICpwTGluZUN0eCwKICAgIFZwVGVzdElkVHlwZSB0ZXN0LAogICAgY29uc3Qgdm9pZCAqcEFyZ3MsCiAgICB1aW50MTYgaGFuZGxlLAogICAgYm9vbCBjYWxsYmFjayk7Cgp0eXBlZGVmIFZwU3RhdHVzVHlwZQooKlZwVGVzdExpbmVDYWxsYmFja1R5cGUpICgKICAgIHN0cnVjdCBWcExpbmVDdHhUeXBlICpwTGluZUN0eCwKICAgIFZwUGNtT3BlcmF0aW9uUmVzdWx0c1R5cGUgKnBSZXN1bHRzKTsKCiNpZiAhZGVmaW5lZChWUF9SRURVQ0VEX0FQSV9JRikgfHwgZGVmaW5lZChWUF9DQ183OTJfU0VSSUVTKSB8fCBkZWZpbmVkKFZQX0NDX1ZDUF9TRVJJRVMpIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgZGVmaW5lZChWUF9DQ19WQ1AyX1NFUklFUykgfHwgZGVmaW5lZChWUF9DQ19NRUxUX1NFUklFUykgfHwgZGVmaW5lZChWUF9DQ19LV1JBUCkKdHlwZWRlZiBWcFN0YXR1c1R5cGUKKCpWcENvZGVDaGVja1N1bUZ1bmNQdHJUeXBlKSAoCiAgICBzdHJ1Y3QgVnBEZXZDdHhUeXBlICpwRGV2Q3R4LAogICAgdWludDE2IGhhbmRsZSk7Cgp0eXBlZGVmIFZwU3RhdHVzVHlwZQooKlZwU2VsZlRlc3RGdW5jUHRyVHlwZSkgKAogICAgc3RydWN0IFZwTGluZUN0eFR5cGUgKnBMaW5lQ3R4KTsKCnR5cGVkZWYgVnBTdGF0dXNUeXBlCigqVnBGaWxsVGVzdEJ1ZkZ1bmNQdHJUeXBlKSAoCiAgICBzdHJ1Y3QgVnBMaW5lQ3R4VHlwZSAqcExpbmVDdHgsCiAgICB1aW50MTYgbGVuZ3RoLAogICAgVnBWZWN0b3JQdHJUeXBlIHBEYXRhKTsKCnR5cGVkZWYgVnBTdGF0dXNUeXBlCigqVnBSZWFkVGVzdEJ1ZkZ1bmNQdHJUeXBlKSAoCiAgICBzdHJ1Y3QgVnBMaW5lQ3R4VHlwZSAqcExpbmVDdHgsCiAgICB1aW50MTYgbGVuZ3RoLAogICAgVnBWZWN0b3JQdHJUeXBlIHBEYXRhKTsKI2VuZGlmICAvKgogICAgICAgICAqICFkZWZpbmVkKFZQX1JFRFVDRURfQVBJX0lGKSB8fCBkZWZpbmVkKFZQX0NDXzc5Ml9TRVJJRVMpIHx8IGRlZmluZWQoVlBfQ0NfVkNQX1NFUklFUykgXAogICAgICAgICAqIHx8IGRlZmluZWQoVlBfQ0NfVkNQMl9TRVJJRVMpIHx8IGRlZmluZWQoVlBfQ0NfTUVMVF9TRVJJRVMpIHx8IGRlZmluZWQoVlBfQ0NfS1dSQVApCiAgICAgICAgICovCiNlbmRpZiAgLyoKICAgICAgICAgKiAhZGVmaW5lZChWUF9SRURVQ0VEX0FQSV9JRikgfHwgZGVmaW5lZChWUF9DQ183OTJfU0VSSUVTKSB8fCBkZWZpbmVkKFZQX0NDX1ZDUF9TRVJJRVMpIFwKICAgICAgICAgKiB8fCBkZWZpbmVkKFZQX0NDX1ZDUDJfU0VSSUVTKSB8fCBkZWZpbmVkKFZQX0NDX01FTFRfU0VSSUVTKSB8fCBkZWZpbmVkKFZQX0NDX0tXUkFQKSBcCiAgICAgICAgICogfHwgKGRlZmluZWQoVlBfQ0NfODgwX1NFUklFUykgJiYgZGVmaW5lZCAoVlA4ODBfSU5DTFVERV9URVNUTElORV9DT0RFKSkgXAogICAgICAgICAqIHx8IChkZWZpbmVkKFZQX0NDXzg5MF9TRVJJRVMpICYmIGRlZmluZWQgKFZQODkwX0lOQ0xVREVfVEVTVExJTkVfQ09ERSkpCiAgICAgICAgICovCgovKiogQXBpRnVuY3Rpb25Qb2ludGVyIFRhYmxlIHRvIGJlIHVzZWQgYnkgRGV2aWNlIENvbnRleHQgKi8KdHlwZWRlZiBzdHJ1Y3QgQXBpRnVuY3Rpb25zIHsKICAgIC8qIFN5c3RlbSBDb25maWd1cmF0aW9uIEZ1bmN0aW9ucyAqLwogICAgVnBNYWtlTGluZU9iamVjdEZ1bmNQdHJUeXBlIE1ha2VMaW5lT2JqZWN0OwoKICAgIC8qIEluaXRpYWxpemF0aW9uIEZ1bmN0aW9ucyAqLwogICAgLyogICAtLSBJbml0IEZ1bmN0aW9ucyBjb21tb24gdG8gYWxsIGRldmljZXMgYW5kIFZQLUFQSS1JSSBjb25maWd1cmF0aW9uIG1vZGVzICovCiAgICBWcEluaXREZXZpY2VGdW5jUHRyVHlwZSBJbml0RGV2aWNlOwogICAgVnBGcmVlUnVuRnVuY1B0clR5cGUgRnJlZVJ1bjsKCiAgICBWcEluaXRMaW5lRnVuY1B0clR5cGUgSW5pdExpbmU7CiAgICBWcENvbmZpZ0xpbmVGdW5jUHRyVHlwZSBDb25maWdMaW5lOwoKICAgIFZwQ2FsTGluZUZ1bmNQdHJUeXBlIENhbExpbmU7CiAgICBWcENhbEZ1bmNQdHJUeXBlIENhbDsKICAgIFZwSW5pdFByb2ZpbGVGdW5jUHRyVHlwZSBJbml0UHJvZmlsZTsKCiAgICAvKiAgIC0tIEluaXQgRnVuY3Rpb25zIE5PVCBwcm92aWRlZCBpbiBDU0xBQyBWUC1BUEktSUkgKi8KI2lmICFkZWZpbmVkKFZQX1JFRFVDRURfQVBJX0lGKSB8fCBkZWZpbmVkKFZQX0NDXzc5Ml9TRVJJRVMpIHx8IGRlZmluZWQoVlBfQ0NfVkNQX1NFUklFUykgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgZGVmaW5lZChWUF9DQ19WQ1AyX1NFUklFUykgfHwgZGVmaW5lZChWUF9DQ19NRUxUX1NFUklFUykgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGRlZmluZWQoVlBfQ0NfS1dSQVApCiAgICBWcEJvb3RMb2FkRnVuY1B0clR5cGUgQm9vdExvYWQ7CiAgICBWcEJvb3RTbGFjRnVuY1B0clR5cGUgQm9vdFNsYWM7CiAgICBWcEluaXRTbGFjRnVuY1B0clR5cGUgSW5pdFNsYWM7CiAgICBWcFNvZnRSZXNldEZ1bmNQdHJUeXBlIFNvZnRSZXNldDsKI2VuZGlmICAvKgogICAgICAgICAqICFkZWZpbmVkKFZQX1JFRFVDRURfQVBJX0lGKSB8fCBkZWZpbmVkKFZQX0NDXzc5Ml9TRVJJRVMpIHx8IGRlZmluZWQoVlBfQ0NfVkNQX1NFUklFUykgICBcCiAgICAgICAgICogfHwgZGVmaW5lZChWUF9DQ19WQ1AyX1NFUklFUykgfHwgZGVmaW5lZChWUF9DQ19NRUxUX1NFUklFUykgfHwgZGVmaW5lZChWUF9DQ19LV1JBUCkKICAgICAgICAgKi8KCiAgICAvKiAgIC0tIEluaXQgRnVuY3Rpb25zIE5PVCBwcm92aWRlZCBpbiBDU0xBQyBWUC1BUEktSUkgZXhjZXB0IFZFNzkwICovCiNpZiAhZGVmaW5lZChWUF9SRURVQ0VEX0FQSV9JRikgfHwgZGVmaW5lZChWUF9DQ183OTJfU0VSSUVTKSB8fCBkZWZpbmVkKFZQX0NDX1ZDUF9TRVJJRVMpICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGRlZmluZWQoVlBfQ0NfVkNQMl9TRVJJRVMpIHx8IGRlZmluZWQoVlBfQ0NfTUVMVF9TRVJJRVMpIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBkZWZpbmVkKFZQX0NDX0tXUkFQKSB8fCBkZWZpbmVkKFZQX0NDXzc5MF9TRVJJRVMpCiAgICBWcFNldEJGaWx0ZXJGdW5jUHRyVHlwZSBTZXRCRmlsdGVyOwogICAgVnBTZXRCYXR0ZXJpZXNGdW5jUHRyVHlwZSBTZXRCYXR0ZXJpZXM7CiNlbmRpZiAgLyoKICAgICAgICAgKiAhZGVmaW5lZChWUF9SRURVQ0VEX0FQSV9JRikgfHwgZGVmaW5lZChWUF9DQ183OTJfU0VSSUVTKSB8fCBkZWZpbmVkKFZQX0NDX1ZDUF9TRVJJRVMpICAgXAogICAgICAgICAqIHx8IGRlZmluZWQoVlBfQ0NfVkNQMl9TRVJJRVMpIHx8IGRlZmluZWQoVlBfQ0NfTUVMVF9TRVJJRVMpIFwKICAgICAgICAgKiB8fCBkZWZpbmVkKFZQX0NDX0tXUkFQKSB8fCBkZWZpbmVkKFZQX0NDXzc5MF9TRVJJRVMpCiAgICAgICAgICovCgoKI2lmICFkZWZpbmVkKFZQX1JFRFVDRURfQVBJX0lGKSB8fCBkZWZpbmVkKFZQX0NDXzc5Ml9TRVJJRVMpIHx8IGRlZmluZWQoVlBfQ0NfVkNQX1NFUklFUykgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgZGVmaW5lZChWUF9DQ19WQ1AyX1NFUklFUykgfHwgZGVmaW5lZChWUF9DQ19NRUxUX1NFUklFUykgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGRlZmluZWQoVlBfQ0NfS1dSQVApIHx8IGRlZmluZWQoVlBfQ0NfNzkwX1NFUklFUykgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChkZWZpbmVkKFZQX0NDXzg4MF9TRVJJRVMpICYmIGRlZmluZWQoVlBfRU5BQkxFX1BST0RfVEVTVCkpCiAgICBWcENhbENvZGVjRnVuY1B0clR5cGUgQ2FsQ29kZWM7CiNlbmRpZiAgLyoKICAgICAgICAgKiAhZGVmaW5lZChWUF9SRURVQ0VEX0FQSV9JRikgfHwgZGVmaW5lZChWUF9DQ183OTJfU0VSSUVTKSB8fCBkZWZpbmVkKFZQX0NDX1ZDUF9TRVJJRVMpICAgXAogICAgICAgICAqIHx8IGRlZmluZWQoVlBfQ0NfVkNQMl9TRVJJRVMpIHx8IGRlZmluZWQoVlBfQ0NfTUVMVF9TRVJJRVMpIFwKICAgICAgICAgKiB8fCBkZWZpbmVkKFZQX0NDX0tXUkFQKSB8fCBkZWZpbmVkKFZQX0NDXzc5MF9TRVJJRVMpCiAgICAgICAgICovCgogICAgLyogICAtLSBJbml0IEZ1bmN0aW9ucyBOT1QgcHJvdmlkZWQgaW4gQ1NMQUMgVlAtQVBJLUlJIGV4Y2VwdCBWRTU4MCAqLwojaWYgIWRlZmluZWQoVlBfUkVEVUNFRF9BUElfSUYpIHx8IGRlZmluZWQoVlBfQ0NfNzkyX1NFUklFUykgfHwgZGVmaW5lZChWUF9DQ19WQ1BfU0VSSUVTKSAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBkZWZpbmVkKFZQX0NDX1ZDUDJfU0VSSUVTKSB8fCBkZWZpbmVkKFZQX0NDX01FTFRfU0VSSUVTKSBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgZGVmaW5lZChWUF9DQ19LV1JBUCkgfHwgZGVmaW5lZChWUF9DQ181ODBfU0VSSUVTKQogICAgVnBJbml0Q3VzdG9tVGVybVR5cGVGdW5jUHRyVHlwZSBJbml0Q3VzdG9tVGVybTsKI2VuZGlmICAvKgogICAgICAgICAqICFkZWZpbmVkKFZQX1JFRFVDRURfQVBJX0lGKSB8fCBkZWZpbmVkKFZQX0NDXzc5Ml9TRVJJRVMpIHx8IGRlZmluZWQoVlBfQ0NfVkNQX1NFUklFUykgICBcCiAgICAgICAgICogfHwgZGVmaW5lZChWUF9DQ19WQ1AyX1NFUklFUykgfHwgZGVmaW5lZChWUF9DQ19NRUxUX1NFUklFUykgXAogICAgICAgICAqIHx8IGRlZmluZWQoVlBfQ0NfS1dSQVApIHx8IGRlZmluZWQoVlBfQ0NfNTgwX1NFUklFUykKICAgICAgICAgKi8KCiAgICAvKiAgIC0tIEluaXQgRnVuY3Rpb25zIE5PVCBwcm92aWRlZCBpbiBDU0xBQyBWUC1BUEktSUkgTGl0ZSBWZXJzaW9uICovCiNpZiAhZGVmaW5lZChWUF9SRURVQ0VEX0FQSV9JRikgfHwgZGVmaW5lZChWUF9DQ183OTJfU0VSSUVTKSB8fCBkZWZpbmVkKFZQX0NDX1ZDUF9TRVJJRVMpICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGRlZmluZWQoVlBfQ0NfVkNQMl9TRVJJRVMpIHx8IGRlZmluZWQoVlBfQ0NfTUVMVF9TRVJJRVMpIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBkZWZpbmVkKFZQX0NDX0tXUkFQKSB8fCBkZWZpbmVkKFZQX0NTTEFDX1NFUV9FTikKICAgIFZwSW5pdFJpbmdGdW5jUHRyVHlwZSBJbml0UmluZzsKICAgIFZwSW5pdENpZEZ1bmNQdHJUeXBlIEluaXRDaWQ7CiAgICBWcEluaXRNZXRlckZ1bmNQdHJUeXBlIEluaXRNZXRlcjsKI2VuZGlmICAvKgogICAgICAgICAqICFkZWZpbmVkKFZQX1JFRFVDRURfQVBJX0lGKSB8fCBkZWZpbmVkKFZQX0NDXzc5Ml9TRVJJRVMpIHx8IGRlZmluZWQoVlBfQ0NfVkNQX1NFUklFUykgICBcCiAgICAgICAgICogfHwgZGVmaW5lZChWUF9DQ19WQ1AyX1NFUklFUykgfHwgZGVmaW5lZChWUF9DQ19NRUxUX1NFUklFUykgXAogICAgICAgICAqIHx8IGRlZmluZWQoVlBfQ0NfS1dSQVApIHx8IGRlZmluZWQoVlBfQ1NMQUNfU0VRX0VOKQogICAgICAgICAqLwoKICAgIC8qIENvbnRyb2wgRnVuY3Rpb25zICovCiAgICAvKiAgIC0tIENvbnRyb2wgRnVuY3Rpb25zIGNvbW1vbiB0byBhbGwgZGV2aWNlcyBhbmQgVlAtQVBJLUlJIGNvbmZpZ3VyYXRpb24gbW9kZXMgKi8KICAgIFZwU2V0TGluZVN0YXRlRnVuY1B0clR5cGUgU2V0TGluZVN0YXRlOwogICAgVnBTZXRMaW5lVG9uZUZ1bmNQdHJUeXBlIFNldExpbmVUb25lOwogICAgVnBTZXRSZWxheVN0YXRlRnVuY1B0clR5cGUgU2V0UmVsYXlTdGF0ZTsKICAgIFZwU2V0UmVsR2FpbkZ1bmNQdHJUeXBlIFNldFJlbEdhaW47CgogICAgVnBTZXRPcHRpb25GdW5jUHRyVHlwZSBTZXRPcHRpb247CiAgICBWcERldmljZUlvQWNjZXNzRnVuY1B0clR5cGUgRGV2aWNlSW9BY2Nlc3M7CiAgICBWcFZpcnR1YWxJU1JGdW5jUHRyVHlwZSBWaXJ0dWFsSVNSOwogICAgVnBBcGlUaWNrRnVuY1B0clR5cGUgQXBpVGljazsKCiAgICAvKiAgIC0tIENvbnRyb2wgRnVuY3Rpb25zIE5PVCBwcm92aWRlZCBpbiBDU0xBQyBWUC1BUEktSUkgKi8KI2lmICFkZWZpbmVkKFZQX1JFRFVDRURfQVBJX0lGKSB8fCBkZWZpbmVkKFZQX0NDXzc5Ml9TRVJJRVMpIHx8IGRlZmluZWQoVlBfQ0NfVkNQX1NFUklFUykgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgZGVmaW5lZChWUF9DQ19WQ1AyX1NFUklFUykgfHwgZGVmaW5lZChWUF9DQ19NRUxUX1NFUklFUykgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGRlZmluZWQoVlBfQ0NfS1dSQVApCiAgICBWcFNldENhbFJlbGF5U3RhdGVGdW5jUHRyVHlwZSBTZXRDYWxSZWxheVN0YXRlOwoKICAgIFZwU3RhcnRNZXRlcjMyUUZ1bmNQdHJUeXBlIFN0YXJ0TWV0ZXIzMlE7CiAgICBWcEdlblRpbWVyQ3RybEZ1bmNQdHJUeXBlIEdlblRpbWVyQ3RybDsKICAgIFZwQXNzb2NEc2xMaW5lRnVuY1B0clR5cGUgQXNzb2NEc2xMaW5lOwogICAgVnBTZXRTZWFsQ3VyRnVuY1B0clR5cGUgU2V0U2VhbEN1cjsKCiAgICBWcERldmljZUlvQWNjZXNzRXh0RnVuY1B0clR5cGUgRGV2aWNlSW9BY2Nlc3NFeHQ7CiAgICBWcExpbmVJb0FjY2Vzc0Z1bmNQdHJUeXBlIExpbmVJb0FjY2VzczsKCiAgICBWcExvd0xldmVsQ21kMTZGdW5jUHRyVHlwZSBMb3dMZXZlbENtZDE2OwojZW5kaWYgIC8qCiAgICAgICAgICogIWRlZmluZWQoVlBfUkVEVUNFRF9BUElfSUYpIHx8IGRlZmluZWQoVlBfQ0NfNzkyX1NFUklFUykgfHwgZGVmaW5lZChWUF9DQ19WQ1BfU0VSSUVTKSAgIFwKICAgICAgICAgKiB8fCBkZWZpbmVkKFZQX0NDX1ZDUDJfU0VSSUVTKSB8fCBkZWZpbmVkKFZQX0NDX01FTFRfU0VSSUVTKSBcCiAgICAgICAgICogfHwgZGVmaW5lZChWUF9DQ19LV1JBUCkKICAgICAgICAgKi8KCiNpZiAhZGVmaW5lZChWUF9SRURVQ0VEX0FQSV9JRikgfHwgZGVmaW5lZChWUF9DQ183OTJfU0VSSUVTKSB8fCBkZWZpbmVkKFZQX0NDX1ZDUF9TRVJJRVMpICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGRlZmluZWQoVlBfQ0NfVkNQMl9TRVJJRVMpIHx8IGRlZmluZWQoVlBfQ0NfTUVMVF9TRVJJRVMpIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBkZWZpbmVkKFZQX0NDX0tXUkFQKSB8fCBkZWZpbmVkKFpBUkxJTktfQ0ZHX0lOVEVSTkFMKQogICAgVnBMb3dMZXZlbENtZEZ1bmNQdHJUeXBlIExvd0xldmVsQ21kOwojZW5kaWYKCiAgICAvKiAgIC0tIENvbnRyb2wgRnVuY3Rpb25zIE5PVCBwcm92aWRlZCBpbiBDU0xBQyBWUC1BUEktSUkgTGl0ZSBWZXJzaW9uICovCiNpZiAhZGVmaW5lZChWUF9SRURVQ0VEX0FQSV9JRikgfHwgZGVmaW5lZChWUF9DQ183OTJfU0VSSUVTKSB8fCBkZWZpbmVkKFZQX0NDX1ZDUF9TRVJJRVMpICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGRlZmluZWQoVlBfQ0NfVkNQMl9TRVJJRVMpIHx8IGRlZmluZWQoVlBfQ0NfTUVMVF9TRVJJRVMpIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBkZWZpbmVkKFZQX0NDX0tXUkFQKSAgfHwgZGVmaW5lZChWUF9DU0xBQ19TRVFfRU4pCiAgICBWcFNlbmRTaWduYWxGdW5jUHRyVHlwZSBTZW5kU2lnbmFsOwogICAgVnBTZW5kQ2lkRnVuY1B0clR5cGUgU2VuZENpZDsKICAgIFZwQ29udGludWVDaWRGdW5jUHRyVHlwZSBDb250aW51ZUNpZDsKICAgIFZwU3RhcnRNZXRlckZ1bmNQdHJUeXBlIFN0YXJ0TWV0ZXI7CiNlbmRpZiAgLyoKICAgICAgICAgKiAhZGVmaW5lZChWUF9SRURVQ0VEX0FQSV9JRikgfHwgZGVmaW5lZChWUF9DQ183OTJfU0VSSUVTKSB8fCBkZWZpbmVkKFZQX0NDX1ZDUF9TRVJJRVMpICAgXAogICAgICAgICAqIHx8IGRlZmluZWQoVlBfQ0NfVkNQMl9TRVJJRVMpIHx8IGRlZmluZWQoVlBfQ0NfTUVMVF9TRVJJRVMpIFwKICAgICAgICAgKiB8fCBkZWZpbmVkKFZQX0NDX0tXUkFQKSAgfHwgZGVmaW5lZChWUF9DU0xBQ19TRVFfRU4pCiAgICAgICAgICovCgogICAgLyogU3RhdHVzIGFuZCBRdWVyeSBGdW5jdGlvbnMgKi8KICAgIC8qICAgLS0gU3RhdHVzIGFuZCBRdWVyeSBGdW5jdGlvbnMgY29tbW9uIHRvIGFsbCBkZXZpY2VzIGFuZCBWUC1BUEktSUkgY29uZmlndXJhdGlvbiBtb2RlcyAqLwogICAgVnBHZXRFdmVudEZ1bmNQdHJUeXBlIEdldEV2ZW50OwogICAgVnBHZXRMaW5lU3RhdHVzRnVuY1B0clR5cGUgR2V0TGluZVN0YXR1czsKICAgIFZwR2V0RGV2aWNlU3RhdHVzRnVuY1B0clR5cGUgR2V0RGV2aWNlU3RhdHVzOwoKICAgIFZwR2V0T3B0aW9uRnVuY1B0clR5cGUgR2V0T3B0aW9uOwogICAgVnBHZXRMaW5lU3RhdGVGdW5jUHRyVHlwZSBHZXRMaW5lU3RhdGU7CiAgICBWcEZsdXNoRXZlbnRzRnVuY1B0clR5cGUgRmx1c2hFdmVudHM7CiAgICBWcEdldFJlc3VsdHNGdW5jUHRyVHlwZSBHZXRSZXN1bHRzOwoKICAgIFZwT2JqZWN0RHVtcEZ1bmNQdHJUeXBlIE9iamVjdER1bXA7CiAgICBWcFJlZ2lzdGVyRHVtcEZ1bmNQdHJUeXBlIFJlZ2lzdGVyRHVtcDsKICAgIFZwRHRtZkRpZ2l0RGV0ZWN0ZWRGdW5jUHRyVHlwZSBEdG1mRGlnaXREZXRlY3RlZDsKCiAgICAvKiAgIC0tIFN0YXR1cyBhbmQgUXVlcnkgRnVuY3Rpb25zIHVzZWQgb25seSBmb3IgQ1NMQUMgTGluZSBUZXN0aW5nICovCiNpZiAhZGVmaW5lZChWUF9SRURVQ0VEX0FQSV9JRikgfHwgZGVmaW5lZChWUF9DQ183OTJfU0VSSUVTKSB8fCBkZWZpbmVkKFZQX0NDX1ZDUF9TRVJJRVMpIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBkZWZpbmVkKFZQX0NDX1ZDUDJfU0VSSUVTKSB8fCBkZWZpbmVkKFZQX0NDX01FTFRfU0VSSUVTKSB8fCBkZWZpbmVkKFZQX0NDX0tXUkFQKSBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGRlZmluZWQoVlA4ODBfSU5DTFVERV9URVNUTElORV9DT0RFKSAmJiBkZWZpbmVkKFZQX0NDXzg4MF9TRVJJRVMpKSBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGRlZmluZWQoVlA4OTBfSU5DTFVERV9URVNUTElORV9DT0RFKSAmJiBkZWZpbmVkKFZQX0NDXzg5MF9TRVJJRVMpKQogICAgVnBHZXRSZWxheVN0YXRlRnVuY1B0clR5cGUgR2V0UmVsYXlTdGF0ZTsKI2VuZGlmICAvKgogICAgICAgICAqICFkZWZpbmVkKFZQX1JFRFVDRURfQVBJX0lGKSB8fCBkZWZpbmVkKFZQX0NDXzc5Ml9TRVJJRVMpIHx8IGRlZmluZWQoVlBfQ0NfVkNQX1NFUklFUykgXAogICAgICAgICAqIHx8IGRlZmluZWQoVlBfQ0NfVkNQMl9TRVJJRVMpIHx8IGRlZmluZWQoVlBfQ0NfTUVMVF9TRVJJRVMpIHx8IGRlZmluZWQoVlBfQ0NfS1dSQVApIFwKICAgICAgICAgKiB8fCAoZGVmaW5lZChWUDg4MF9JTkNMVURFX1RFU1RMSU5FX0NPREUpICYmIGRlZmluZWQoVlBfQ0NfODgwX1NFUklFUykpIFwKICAgICAgICAgKiB8fCAoZGVmaW5lZChWUDg5MF9JTkNMVURFX1RFU1RMSU5FX0NPREUpICYmIGRlZmluZWQoVlBfQ0NfODkwX1NFUklFUykpCiAgICAgICAgICovCgogICAgLyogICAtLSBTdGF0dXMgYW5kIFF1ZXJ5IEZ1bmN0aW9ucyBOT1QgcHJvdmlkZWQgaW4gQ1NMQUMgVlAtQVBJLUlJICovCiNpZiAhZGVmaW5lZChWUF9SRURVQ0VEX0FQSV9JRikgfHwgZGVmaW5lZChWUF9DQ183OTJfU0VSSUVTKSB8fCBkZWZpbmVkKFZQX0NDX1ZDUF9TRVJJRVMpIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgZGVmaW5lZChWUF9DQ19WQ1AyX1NFUklFUykgIHx8IGRlZmluZWQoVlBfQ0NfTUVMVF9TRVJJRVMpIHx8IGRlZmluZWQoVlBfQ0NfS1dSQVApCiAgICBWcEdldERldmljZVN0YXR1c0V4dEZ1bmNQdHJUeXBlIEdldERldmljZVN0YXR1c0V4dDsKICAgIFZwQ2xlYXJSZXN1bHRzRnVuY1B0clR5cGUgQ2xlYXJSZXN1bHRzOwogICAgVnBRdWVyeUZ1bmNQdHJUeXBlIFF1ZXJ5OwojZW5kaWYgIC8qCiAgICAgICAgICogIWRlZmluZWQoVlBfUkVEVUNFRF9BUElfSUYpIHx8IGRlZmluZWQoVlBfQ0NfNzkyX1NFUklFUykgfHwgZGVmaW5lZChWUF9DQ19WQ1BfU0VSSUVTKSBcCiAgICAgICAgICogfHwgZGVmaW5lZChWUF9DQ19WQ1AyX1NFUklFUykgIHx8IGRlZmluZWQoVlBfQ0NfTUVMVF9TRVJJRVMpIHx8IGRlZmluZWQoVlBfQ0NfS1dSQVApCiAgICAgICAgICovCgogICAgLyogICAtLSBTdGF0dXMgYW5kIFF1ZXJ5IEZ1bmN0aW9ucyBOT1QgcHJvdmlkZWQgaW4gQ1NMQUMgVlAtQVBJLUlJIGV4Y2VwdCBWRTc5MCAqLwojaWYgIWRlZmluZWQoVlBfUkVEVUNFRF9BUElfSUYpIHx8IGRlZmluZWQoVlBfQ0NfNzkyX1NFUklFUykgfHwgZGVmaW5lZChWUF9DQ19WQ1BfU0VSSUVTKSBcCiAgICAgICAgIHx8IGRlZmluZWQoVlBfQ0NfVkNQMl9TRVJJRVMpIHx8IGRlZmluZWQoVlBfQ0NfTUVMVF9TRVJJRVMpIHx8IGRlZmluZWQoVlBfQ0NfS1dSQVApIHx8IGRlZmluZWQoVlBfQ0NfNzkwX1NFUklFUykKICAgIFZwR2V0TG9vcENvbmRGdW5jUHRyVHlwZSBHZXRMb29wQ29uZDsKI2VuZGlmICAvKgogICAgICAgICAqICFkZWZpbmVkKFZQX1JFRFVDRURfQVBJX0lGKSB8fCBkZWZpbmVkKFZQX0NDXzc5Ml9TRVJJRVMpIHx8IGRlZmluZWQoVlBfQ0NfVkNQX1NFUklFUykgXAogICAgICAgICAqIHx8IGRlZmluZWQoVlBfQ0NfVkNQMl9TRVJJRVMpIHx8IGRlZmluZWQoVlBfQ0NfTUVMVF9TRVJJRVMpIHx8IGRlZmluZWQoVlBfQ0NfS1dSQVApIHx8IGRlZmluZWQoVlBfQ0NfNzkwX1NFUklFUykKICAgICAgICAgKi8KCiAgICAvKiBUZXN0IEZ1bmN0aW9ucyAqLwogICAgLyogICAtLSBBbGwgdGVzdCBmdW5jdGlvbnMgcmVtb3ZlZCBmb3IgQ1NMQUMgVlAtQVBJLUlJIHVubGVzcyBMaW5lIFRlc3QgaXMgaW5jbHVkZWQgKi8KI2lmICFkZWZpbmVkKFZQX1JFRFVDRURfQVBJX0lGKSB8fCBkZWZpbmVkKFZQX0NDXzc5Ml9TRVJJRVMpIHx8IGRlZmluZWQoVlBfQ0NfVkNQX1NFUklFUykgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGRlZmluZWQoVlBfQ0NfVkNQMl9TRVJJRVMpIHx8IGRlZmluZWQoVlBfQ0NfTUVMVF9TRVJJRVMpIHx8IGRlZmluZWQoVlBfQ0NfS1dSQVApIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoZGVmaW5lZChWUF9DQ184ODBfU0VSSUVTKSAmJiBkZWZpbmVkIChWUDg4MF9JTkNMVURFX1RFU1RMSU5FX0NPREUpKSBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGRlZmluZWQoVlBfQ0NfODkwX1NFUklFUykgJiYgZGVmaW5lZCAoVlA4OTBfSU5DTFVERV9URVNUTElORV9DT0RFKSkKICAgIC8qICAgLS0gVGVzdCBGdW5jdGlvbnMgY29tbW9uIHRvIGFsbCBkZXZpY2VzIGFuZCBWUC1BUEktSUkgY29uZmlndXJhdGlvbiBtb2RlcyAqLwogICAgVnBUZXN0TGluZUZ1bmNQdHJUeXBlIFRlc3RMaW5lOwogICAgVnBUZXN0TGluZUludEZ1bmNQdHJUeXBlIFRlc3RMaW5lSW50OwogICAgVnBUZXN0TGluZUNhbGxiYWNrVHlwZSBUZXN0TGluZUNhbGxiYWNrOwoKICAgIC8qICAgLS0gVGVzdCBGdW5jdGlvbnMgTk9UIHByb3ZpZGVkIGluIENTTEFDIFZQLUFQSS1JSSAqLwojaWYgIWRlZmluZWQoVlBfUkVEVUNFRF9BUElfSUYpIHx8IGRlZmluZWQoVlBfQ0NfNzkyX1NFUklFUykgfHwgZGVmaW5lZChWUF9DQ19WQ1BfU0VSSUVTKSBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGRlZmluZWQoVlBfQ0NfVkNQMl9TRVJJRVMpIHx8IGRlZmluZWQoVlBfQ0NfTUVMVF9TRVJJRVMpIHx8IGRlZmluZWQoVlBfQ0NfS1dSQVApCiAgICBWcENvZGVDaGVja1N1bUZ1bmNQdHJUeXBlIENvZGVDaGVja1N1bTsKICAgIFZwRmlsbFRlc3RCdWZGdW5jUHRyVHlwZSBGaWxsVGVzdEJ1ZjsKICAgIFZwUmVhZFRlc3RCdWZGdW5jUHRyVHlwZSBSZWFkVGVzdEJ1ZjsKI2VuZGlmICAvKgogICAgICAgICAqICFkZWZpbmVkKFZQX1JFRFVDRURfQVBJX0lGKSB8fCBkZWZpbmVkKFZQX0NDXzc5Ml9TRVJJRVMpIHx8IGRlZmluZWQoVlBfQ0NfVkNQX1NFUklFUykgXAogICAgICAgICAqIHx8IGRlZmluZWQoVlBfQ0NfVkNQMl9TRVJJRVMpIHx8IGRlZmluZWQoVlBfQ0NfTUVMVF9TRVJJRVMpIHx8IGRlZmluZWQoVlBfQ0NfS1dSQVApCiAgICAgICAgICovCgogICAgLyogICAtLSBUZXN0IEZ1bmN0aW9ucyBOT1QgcHJvdmlkZWQgaW4gQ1NMQUMgVlAtQVBJLUlJIGV4Y2VwdCBWRTc5MCAqLwojaWYgIWRlZmluZWQoVlBfUkVEVUNFRF9BUElfSUYpIHx8IGRlZmluZWQoVlBfQ0NfNzkyX1NFUklFUykgfHwgZGVmaW5lZChWUF9DQ19WQ1BfU0VSSUVTKSBcCiAgICAgICAgICAgIHx8IGRlZmluZWQoVlBfQ0NfVkNQMl9TRVJJRVMpIHx8IGRlZmluZWQoVlBfQ0NfTUVMVF9TRVJJRVMpIHx8IGRlZmluZWQoVlBfQ0NfS1dSQVApIHx8IGRlZmluZWQoVlBfQ0NfNzkwX1NFUklFUykKICAgIFZwU2VsZlRlc3RGdW5jUHRyVHlwZSBTZWxmVGVzdDsKI2VuZGlmICAvKgogICAgICAgICAqICFkZWZpbmVkKFZQX1JFRFVDRURfQVBJX0lGKSB8fCBkZWZpbmVkKFZQX0NDXzc5Ml9TRVJJRVMpIHx8IGRlZmluZWQoVlBfQ0NfVkNQX1NFUklFUykgXAogICAgICAgICAqICB8fCBkZWZpbmVkKFZQX0NDX1ZDUDJfU0VSSUVTKSB8fCBkZWZpbmVkKFZQX0NDX01FTFRfU0VSSUVTKSB8fCBkZWZpbmVkKFZQX0NDX0tXUkFQKSB8fCBkZWZpbmVkKFZQX0NDXzc5MF9TRVJJRVMpCiAgICAgICAgICovCgojZW5kaWYgIC8qCiAgICAgICAgICogIWRlZmluZWQoVlBfUkVEVUNFRF9BUElfSUYpIHx8IGRlZmluZWQoVlBfQ0NfNzkyX1NFUklFUykgfHwgZGVmaW5lZChWUF9DQ19WQ1BfU0VSSUVTKSBcCiAgICAgICAgICogfHwgZGVmaW5lZChWUF9DQ19WQ1AyX1NFUklFUykgfHwgZGVmaW5lZChWUF9DQ19NRUxUX1NFUklFUykgfHwgZGVmaW5lZChWUF9DQ19LV1JBUCkgXAogICAgICAgICAqIHx8IChkZWZpbmVkKFZQX0NDXzg4MF9TRVJJRVMpICYmIGRlZmluZWQgKFZQODgwX0lOQ0xVREVfVEVTVExJTkVfQ09ERSkpIFwKICAgICAgICAgKiB8fCAoZGVmaW5lZChWUF9DQ184OTBfU0VSSUVTKSAmJiBkZWZpbmVkIChWUDg5MF9JTkNMVURFX1RFU1RMSU5FX0NPREUpKQogICAgICAgICAqLwp9IEFwaUZ1bmN0aW9uczsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgICAgICAgICAgIERFVklDRS9MSU5FIENPTlRFWFQgREVGSU5JVElPTiAgICAgICAgICAgICAgICAgICAgICAgKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiogVm9pY2UgUGF0aCBMaW5lIENvbnRleHQgdHlwZSAqLwp0eXBlZGVmIHN0cnVjdCBWcExpbmVDdHhUeXBlIHsKICAgIHN0cnVjdCBWcERldkN0eFR5cGUgKnBEZXZDdHg7ICAgLyoqPCBQb2ludGVyIGJhY2sgRGV2aWNlIENvbnRleHQgKi8KCiAgICB2b2lkICpwTGluZU9iajsgICAgICAgICAgICAgICAgIC8qKjwgUG9pbnRlciAoZm9yd2FyZCkgdG8gTGluZSBPYmplY3QgKi8KfSBWcExpbmVDdHhUeXBlOwoKLyoqIFZvaWNlIFBhdGggRGV2aWNlIENvbnRleHQgdHlwZSAqLwp0eXBlZGVmIHN0cnVjdCBWcERldkN0eFR5cGUgewogICAgVnBEZXZpY2VUeXBlIGRldmljZVR5cGU7ICAgIC8qKjwgV2hhdCB0eXBlIGlzIHRoZSBkZXZpY2UgY29udGV4dCAoZW51bSkgKi8KICAgIHZvaWQgKnBEZXZPYmo7ICAgICAgICAgICAgICAvKio8IFBvaW50ZXIgdG8gZGV2aWNlIG9iamVjdCAqLwoKICAgIEFwaUZ1bmN0aW9ucyBmdW5QdHJzVG9BcGlGdW5jczsgLyoqPCBQb2ludGVycyB0byBBUEkgZnVuY3Rpb25zICovCgogICAgLyoqPCBQb2ludGVycyB0byBlYWNoIGxpbmUgY29udGV4dCBhc3NvY2lhdGVkIHdpdGggdGhpcyBkZXZpY2UuICBTZXQgc2l6ZQogICAgICogdG8gbWF4IGFsbG93YWJsZSBwZXIgZGV2aWNlIGluIHN5c3RlbQogICAgICovCiAgICBWcExpbmVDdHhUeXBlICpwTGluZUN0eFtWUF9NQVhfTElORVNfUEVSX0RFVklDRV07Cn0gVnBEZXZDdHhUeXBlOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgICAgICAgICAgIFZQLUFQSS1JSSBEZWZpbml0aW9ucyB0aGF0IHVzZSBjb250ZXh0ICAgICAgICAgICAgICAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiBFdmVudCBzdHJ1Y3Q6IFR5cGUgcmVwb3J0ZWQgYnkgVnBHZXRFdmVudCgpLiAqLwp0eXBlZGVmIHN0cnVjdCBWcEV2ZW50VHlwZSB7CiAgICBWcFN0YXR1c1R5cGUgc3RhdHVzOyAgICAgICAgLyoqPCBGdW5jdGlvbiByZXR1cm4gc3RhdHVzICovCgogICAgdWludDggY2hhbm5lbElkOyAgICAgICAgICAgIC8qKjwgQ2hhbm5lbCB0aGF0IGNhdXNlZCB0aGUgZXZlbnQgKi8KCiAgICBWcExpbmVDdHhUeXBlICpwTGluZUN0eDsgICAgLyoqPCBQb2ludGVyIHRvIHRoZSBsaW5lIGNvbnRleHQgKGNvcnJlc3BvbmRpbmcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIHRvIHRoZSBjaGFubmVsIHRoYXQgY2F1c2VkIHRoZSBldmVudCkgKi8KCiAgICBWcERldmljZUlkVHlwZSBkZXZpY2VJZDsgICAgLyoqPCBkZXZpY2UgY2hpcCBzZWxlY3QgSUQgY29ycmVzcG9uZGluZyB0byB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIGRldmljZSB0aGF0IGNhdXNlZCB0aGUgZXZlbnQgKi8KCiAgICBWcERldkN0eFR5cGUgKnBEZXZDdHg7ICAgICAgLyoqPCBQb2ludGVyIHRvIHRoZSBkZXZpY2UgY29udGV4dAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgKGNvcnJlc3BvbmRpbmcgdG8gdGhlIGRldmljZSB0aGF0IGNhdXNlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgdGhlIGV2ZW50KSAqLwoKICAgIFZwRXZlbnRDYXRlZ29yeVR5cGUgZXZlbnRDYXRlZ29yeTsgLyoqPCBFdmVudCBjYXRlZ29yeS4gIFRoZSBldmVudCBjYXRhZ29yeQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHRoZXJlIGFyZSBtb3JlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgZXZlbnRzIHRoYW4gY2FuIGJlIHNwZWNpZmllZCBieSB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBzaXplIG9mICJldmVudElkICAqLwoKICAgIHVpbnQxNiBldmVudElkOyAgICAgLyoqPCBUaGUgZXZlbnQgdGhhdCBvY2N1cnJlZC4gIFJlcXVpcmVzIHRoYXQgdGhlIGV2ZW50CiAgICAgICAgICAgICAgICAgICAgICAgICAqICAgY2F0YWdvcnkgYmUga25vd24gdG8gaW50ZXJwcmV0ICovCgogICAgdWludDE2IHBhcm1IYW5kbGU7ICAvKio8IEV2ZW50knMgUGFyYW1ldGVyIG9yIEhvc3QgSGFuZGxlLiAgVGhpcyB2YWx1ZSBpcwogICAgICAgICAgICAgICAgICAgICAgICAgKiAgIHNwZWNpZmllZCBieSB0aGUgYXBwbGljYXRpb24gb25seSwgbm90IHVzZWQgYnkgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAqICAgQVBJICovCgogICAgdWludDE2IGV2ZW50RGF0YTsgICAvKio8IERhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBldmVudC4gRXZlbnQgSWQgc3BlY2lmaWMqLwoKICAgIGJvb2wgaGFzUmVzdWx0czsgICAgLyoqPCBJZiBUUlVFIGluZGljYXRlcyB0aGlzIGV2ZW50IGhhcyByZXN1bHRzIGFzc29jaWF0ZWQKICAgICAgICAgICAgICAgICAgICAgICAgICogICB3aXRoIGl0ICovCgogICAgVnBMaW5lSWRUeXBlIGxpbmVJZDsgICAgLyoqPCBBcHBsaWNhdGlvbiBwcm92aWRlIGxpbmUgSWQgdG8gZWFzZSBtYXBwaW5nIG9mCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBsaW5lcyB0byBzcGVjaWZpYyBsaW5lIGNvbnRleHRzLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCn0gVnBFdmVudFR5cGU7CgovKio8IFRoZSBmb2xsb3dpbmcgdHlwZXMgYXJlIGZvciBWcEdldERldmljZUluZm8oKSBhbmQgVnBHZXRMaW5lSW5mbygpCiAqIGZ1bmN0aW9ucyAqLwoKdHlwZWRlZiBlbnVtIFZwRmVhdHVyZVR5cGUgewogICAgVlBfVU5LTk9XTiwKICAgIFZQX0FWQUlMQUJMRSwKICAgIFZQX05PVF9BVkFJTEFCTEUKfSBWcEZlYXR1cmVUeXBlOwoKdHlwZWRlZiBzdHJ1Y3QgVnBGZWF0dXJlTGlzdFR5cGUgewogICAgVnBGZWF0dXJlVHlwZSB0ZXN0TG9hZFN3aXRjaDsKICAgIFZwRmVhdHVyZVR5cGUgaW50ZXJuYWxUZXN0VGVybWluYXRpb247Cn0gVnBGZWF0dXJlTGlzdFR5cGU7Cgp0eXBlZGVmIHN0cnVjdCBWcERldmljZUluZm9UeXBlIHsKICAgIFZwTGluZUN0eFR5cGUgKnBMaW5lQ3R4OyAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gTGluZSBDb250ZXh0ICovCiAgICBWcERldmljZUlkVHlwZSBkZXZpY2VJZDsgICAgICAgICAgICAvKiBEZXZpY2UgaWRlbnRpdHkgKi8KICAgIFZwRGV2Q3R4VHlwZSAqcERldkN0eDsgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gZGV2aWNlIENvbnRleHQgKi8KICAgIFZwRGV2aWNlVHlwZSBkZXZpY2VUeXBlOyAgICAgICAgICAgIC8qIERldmljZSBUeXBlICovCiAgICBWcEZlYXR1cmVMaXN0VHlwZSBmZWF0dXJlTGlzdDsgICAgICAvKiBTdG9yZSB0aGUgZGV2aWNlIGZlYXR1cmVzICovCiAgICB1aW50OCBudW1MaW5lczsgICAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgbGluZXMgKi8KICAgIHVpbnQ4IHJldkNvZGU7ICAgICAgICAgICAgICAgICAgICAgIC8qIFJldmlzaW9uIENvZGUgTnVtYmVyICovCiAgICB1aW50OCBzbGFjSWQ7ICAgICAgICAgICAgICAgICAgICAgICAvKiBVbmlxdWUgSUQgYXNzb2NpYXRlZCB3aXRoIERldmljZSBpZGVudGl0eSAqLwogICAgdWludDE2IHByb2R1Y3RDb2RlOyAgICAgICAgICAgICAgICAgLyogTnVtYmVyIGluZGljYXRpbmcgZmVhdHVyZXMgb2YgdGhlIGRldmljZS4qLwp9IFZwRGV2aWNlSW5mb1R5cGU7Cgp0eXBlZGVmIHN0cnVjdCBWcExpbmVJbmZvVHlwZSB7CiAgICBWcERldkN0eFR5cGUgKnBEZXZDdHg7ICAgICAgIC8qIFBvaW50ZXIgdG8gZGV2aWNlIENvbnRleHQgKi8KICAgIHVpbnQ4IGNoYW5uZWxJZDsgICAgICAgICAgICAgLyogQ2hhbm5lbCBpZGVudGl0eSAqLwogICAgVnBMaW5lQ3R4VHlwZSAqcExpbmVDdHg7ICAgICAvKiBQb2ludGVyIHRvIExpbmUgQ29udGV4dCAqLwogICAgVnBUZXJtVHlwZSB0ZXJtVHlwZTsgICAgICAgICAvKiBUZXJtaW5hdGlvbiBUeXBlICovCiAgICBWcExpbmVJZFR5cGUgbGluZUlkOyAgICAgICAgIC8qIEFwcGxpY2F0aW9uIHN5c3RlbSB3aWRlIGxpbmUgaWRlbnRpZmllciAqLwp9IFZwTGluZUluZm9UeXBlOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgICAgICAgICAgIFZQLUFQSS1JSSBGVU5DVElPTiBQUk9UT1RZUEVTICAgICAgICAgICAgICAgICAgICAgICAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qCiAqIFN5c3RlbSBjb25maWd1cmF0aW9uIGZ1bmN0aW9ucwogKi8KRVhURVJOIFZwU3RhdHVzVHlwZQpWcE1ha2VEZXZpY2VPYmplY3QoCiAgICBWcERldmljZVR5cGUgZGV2aWNlVHlwZSwKICAgIFZwRGV2aWNlSWRUeXBlIGRldmljZUlkLAogICAgVnBEZXZDdHhUeXBlICpwRGV2Q3R4LAogICAgdm9pZCAqcERldk9iaik7CgpFWFRFUk4gVnBTdGF0dXNUeXBlClZwTWFrZURldmljZUN0eCgKICAgIFZwRGV2aWNlVHlwZSBkZXZpY2VUeXBlLAogICAgVnBEZXZDdHhUeXBlICpwRGV2Q3R4LAogICAgdm9pZCAqcERldk9iaik7CgpFWFRFUk4gVnBTdGF0dXNUeXBlClZwTWFrZUxpbmVPYmplY3QoCiAgICBWcFRlcm1UeXBlIHRlcm1UeXBlLAogICAgdWludDggY2hhbm5lbElkLAogICAgVnBMaW5lQ3R4VHlwZSAqcExpbmVDdHgsCiAgICB2b2lkICpwTGluZU9iaiwKICAgIFZwRGV2Q3R4VHlwZSAqcERldkN0eCk7CgpFWFRFUk4gVnBTdGF0dXNUeXBlClZwTWFrZUxpbmVDdHgoCiAgICBWcExpbmVDdHhUeXBlICpwTGluZUN0eCwKICAgIHZvaWQgKnBMaW5lT2JqLAogICAgVnBEZXZDdHhUeXBlICpwRGV2Q3R4KTsKCkVYVEVSTiBWcFN0YXR1c1R5cGUKVnBGcmVlTGluZUN0eCgKICAgIFZwTGluZUN0eFR5cGUgKnBMaW5lQ3R4KTsKCkVYVEVSTiBWcFN0YXR1c1R5cGUKVnBHZXREZXZpY2VJbmZvKAogICAgVnBEZXZpY2VJbmZvVHlwZSAqcERldmljZUluZm8pOwoKRVhURVJOIFZwU3RhdHVzVHlwZQpWcEdldExpbmVJbmZvKAogICAgVnBMaW5lSW5mb1R5cGUgKnBMaW5lSW5mbyk7CgovKgogKiBJbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKICovCkVYVEVSTiBWcFN0YXR1c1R5cGUKVnBCb290TG9hZCgKICAgIFZwRGV2Q3R4VHlwZSAqcERldkN0eCwKICAgIFZwQm9vdFN0YXRlVHlwZSBzdGF0ZSwKICAgIFZwSW1hZ2VQdHJUeXBlIHBJbWFnZUJ1ZmZlciwKICAgIHVpbnQzMiBidWZmZXJTaXplLAogICAgVnBTY3JhdGNoTWVtVHlwZSAqcFNjcmF0Y2hNZW0sCiAgICBWcEJvb3RNb2RlVHlwZSB2YWxpZGF0aW9uKTsKCkVYVEVSTiBWcFN0YXR1c1R5cGUKVnBCb290U2xhYygKICAgIFZwTGluZUN0eFR5cGUgKnBMaW5lQ3R4LAogICAgVnBJbWFnZVB0clR5cGUgcEltYWdlQnVmZmVyLAogICAgdWludDMyIGJ1ZmZlclNpemUpOwoKRVhURVJOIFZwU3RhdHVzVHlwZQpWcEluaXREZXZpY2UoCiAgICBWcERldkN0eFR5cGUgKnBEZXZDdHgsCiAgICBWcFByb2ZpbGVQdHJUeXBlIHBEZXZQcm9maWxlLAogICAgVnBQcm9maWxlUHRyVHlwZSBwQWNQcm9maWxlLAogICAgVnBQcm9maWxlUHRyVHlwZSBwRGNQcm9maWxlLAogICAgVnBQcm9maWxlUHRyVHlwZSBwUmluZ1Byb2ZpbGUsCiAgICBWcFByb2ZpbGVQdHJUeXBlIHBGeG9BY1Byb2ZpbGUsCiAgICBWcFByb2ZpbGVQdHJUeXBlIHBGeG9DZmdQcm9maWxlKTsKCkVYVEVSTiBWcFN0YXR1c1R5cGUKVnBGcmVlUnVuKAogICAgVnBEZXZDdHhUeXBlICpwRGV2Q3R4LAogICAgVnBGcmVlUnVuTW9kZVR5cGUgZnJlZVJ1bk1vZGUpOwoKRVhURVJOIFZwU3RhdHVzVHlwZQpWcEluaXRTbGFjKAogICAgVnBMaW5lQ3R4VHlwZSAqcExpbmVDdHgsCiAgICBWcFByb2ZpbGVQdHJUeXBlIHBEZXZQcm9maWxlLAogICAgVnBQcm9maWxlUHRyVHlwZSBwQWNQcm9maWxlLAogICAgVnBQcm9maWxlUHRyVHlwZSBwRGNQcm9maWxlLAogICAgVnBQcm9maWxlUHRyVHlwZSBwUmluZ1Byb2ZpbGUpOwoKRVhURVJOIFZwU3RhdHVzVHlwZQpWcEluaXRMaW5lKAogICAgVnBMaW5lQ3R4VHlwZSAqcExpbmVDdHgsCiAgICBWcFByb2ZpbGVQdHJUeXBlIHBBY1Byb2ZpbGUsCiAgICBWcFByb2ZpbGVQdHJUeXBlIHBEY0ZlZWRPckZ4b0NmZ1Byb2ZpbGUsCiAgICBWcFByb2ZpbGVQdHJUeXBlIHBSaW5nUHJvZmlsZSk7CgpFWFRFUk4gVnBTdGF0dXNUeXBlClZwQ29uZmlnTGluZSgKICAgIFZwTGluZUN0eFR5cGUgKnBMaW5lQ3R4LAogICAgVnBQcm9maWxlUHRyVHlwZSBwQWNQcm9maWxlLAogICAgVnBQcm9maWxlUHRyVHlwZSBwRGNGZWVkT3JGeG9DZmdQcm9maWxlLAogICAgVnBQcm9maWxlUHRyVHlwZSBwUmluZ1Byb2ZpbGUpOwoKRVhURVJOIFZwU3RhdHVzVHlwZQpWcENhbENvZGVjKAogICAgVnBMaW5lQ3R4VHlwZSAqcExpbmVDdHgsCiAgICBWcERldmljZUNhbFR5cGUgbW9kZSk7CgpFWFRFUk4gVnBTdGF0dXNUeXBlClZwQ2FsTGluZSgKICAgIFZwTGluZUN0eFR5cGUgKnBMaW5lQ3R4KTsKCkVYVEVSTiBWcFN0YXR1c1R5cGUKVnBDYWwoCiAgICBWcExpbmVDdHhUeXBlICpwTGluZUN0eCwKICAgIFZwQ2FsVHlwZSBjYWxUeXBlLAogICAgdm9pZCAqaW5wdXRBcmdzKTsKCkVYVEVSTiBWcFN0YXR1c1R5cGUKVnBJbml0UmluZygKICAgIFZwTGluZUN0eFR5cGUgKnBMaW5lQ3R4LAogICAgVnBQcm9maWxlUHRyVHlwZSBwQ2FkUHJvZmlsZSwKICAgIFZwUHJvZmlsZVB0clR5cGUgcENpZFByb2ZpbGUpOwoKRVhURVJOIFZwU3RhdHVzVHlwZQpWcEluaXRDaWQoCiAgICBWcExpbmVDdHhUeXBlICpwTGluZUN0eCwKICAgIHVpbnQ4IGxlbmd0aCwKICAgIHVpbnQ4cCBwQ2lkRGF0YSk7CgpFWFRFUk4gVnBTdGF0dXNUeXBlClZwSW5pdE1ldGVyKAogICAgVnBMaW5lQ3R4VHlwZSAqcExpbmVDdHgsCiAgICBWcFByb2ZpbGVQdHJUeXBlIHBNZXRlclByb2ZpbGUpOwoKRVhURVJOIFZwU3RhdHVzVHlwZQpWcEluaXRDdXN0b21UZXJtVHlwZSAoCiAgICBWcERldkN0eFR5cGUgKnBEZXZDdHgsCiAgICBWcExpbmVDdHhUeXBlICpwTGluZUN0eCwKICAgIFZwUHJvZmlsZVB0clR5cGUgcEN1c3RvbVRlcm1Qcm9maWxlKTsKCkVYVEVSTiBWcFN0YXR1c1R5cGUKVnBJbml0UHJvZmlsZSgKICAgIFZwRGV2Q3R4VHlwZSAqcERldkN0eCwKICAgIFZwUHJvZmlsZVR5cGUgdHlwZSwKICAgIFZwUHJvZmlsZVB0clR5cGUgcFByb2ZpbGVJbmRleCwKICAgIFZwUHJvZmlsZVB0clR5cGUgcFByb2ZpbGUpOwoKRVhURVJOIFZwU3RhdHVzVHlwZQpWcFNvZnRSZXNldCgKICAgIFZwRGV2Q3R4VHlwZSAqcERldkN0eCk7CgpFWFRFUk4gVnBTdGF0dXNUeXBlClZwU2V0QmF0dGVyaWVzKAogICAgVnBMaW5lQ3R4VHlwZSAqcExpbmVDdHgsCiAgICBWcEJhdHRlcnlNb2RlVHlwZSBiYXR0TW9kZSwKICAgIFZwQmF0dGVyeVZhbHVlc1R5cGUgKnBCYXR0KTsKCkVYVEVSTiBWcFN0YXR1c1R5cGUKVnBTZXRCRmlsdGVyKAogICAgVnBMaW5lQ3R4VHlwZSAqcExpbmVDdHgsCiAgICBWcEJGaWx0ZXJNb2RlVHlwZSBiRmlsdE1vZGUsCiAgICBWcFByb2ZpbGVQdHJUeXBlIHBBY1Byb2ZpbGUpOwoKLyoKICogQ29udHJvbCBmdW5jdGlvbnMKICovCkVYVEVSTiBWcFN0YXR1c1R5cGUKVnBTZXRMaW5lU3RhdGUoCiAgICBWcExpbmVDdHhUeXBlICpwTGluZUN0eCwKICAgIFZwTGluZVN0YXRlVHlwZSBzdGF0ZSk7CgpFWFRFUk4gVnBTdGF0dXNUeXBlClZwU2V0TGluZVRvbmUoCiAgICBWcExpbmVDdHhUeXBlICpwTGluZUN0eCwKICAgIFZwUHJvZmlsZVB0clR5cGUgcFRvbmVQcm9maWxlLAogICAgVnBQcm9maWxlUHRyVHlwZSBwQ2FkUHJvZmlsZSwKICAgIFZwRHRtZlRvbmVHZW5UeXBlICpwRHRtZkNvbnRyb2wpOwoKRVhURVJOIFZwU3RhdHVzVHlwZQpWcFNldFJlbGF5U3RhdGUoCiAgICBWcExpbmVDdHhUeXBlICpwTGluZUN0eCwKICAgIFZwUmVsYXlDb250cm9sVHlwZSByU3RhdGUpOwoKRVhURVJOIFZwU3RhdHVzVHlwZQpWcFNldENhbFJlbGF5U3RhdGUoCiAgICBWcERldkN0eFR5cGUgKnBEZXZDdHgsCiAgICBWcENhbFJlbGF5Q29udHJvbFR5cGUgclN0YXRlKTsKCkVYVEVSTiBWcFN0YXR1c1R5cGUKVnBTZXRSZWxHYWluKAogICAgVnBMaW5lQ3R4VHlwZSAqcExpbmVDdHgsCiAgICB1aW50MTYgdHhMZXZlbCwKICAgIHVpbnQxNiByeExldmVsLAogICAgdWludDE2IGhhbmRsZSk7CgpFWFRFUk4gVnBTdGF0dXNUeXBlClZwU2VuZFNpZ25hbCgKICAgIFZwTGluZUN0eFR5cGUgKnBMaW5lQ3R4LAogICAgVnBTZW5kU2lnbmFsVHlwZSBzaWduYWxUeXBlLAogICAgdm9pZCAqcFNpZ25hbERhdGEpOwoKRVhURVJOIFZwU3RhdHVzVHlwZQpWcFNlbmRDaWQoCiAgICBWcExpbmVDdHhUeXBlICpwTGluZUN0eCwKICAgIHVpbnQ4IGxlbmd0aCwKICAgIFZwUHJvZmlsZVB0clR5cGUgcENpZFByb2ZpbGUsCiAgICB1aW50OHAgcENpZERhdGEpOwoKRVhURVJOIFZwU3RhdHVzVHlwZQpWcENvbnRpbnVlQ2lkKAogICAgVnBMaW5lQ3R4VHlwZSAqcExpbmVDdHgsCiAgICB1aW50OCBsZW5ndGgsCiAgICB1aW50OHAgcENpZERhdGEpOwoKRVhURVJOIFZwU3RhdHVzVHlwZQpWcFN0YXJ0TWV0ZXIoCiAgICBWcExpbmVDdHhUeXBlICpwTGluZUN0eCwKICAgIHVpbnQxNiBvblRpbWUsCiAgICB1aW50MTYgb2ZmVGltZSwKICAgIHVpbnQxNiBudW1NZXRlcnMpOwoKRVhURVJOIFZwU3RhdHVzVHlwZQpWcFN0YXJ0TWV0ZXIzMlEoCiAgICBWcExpbmVDdHhUeXBlICpwTGluZUN0eCwKICAgIHVpbnQzMiBtaW5EZWxheSwKICAgIHVpbnQzMiBvblRpbWUsCiAgICB1aW50MzIgb2ZmVGltZSwKICAgIHVpbnQxNiBudW1NZXRlcnMsCiAgICB1aW50MTYgZXZlbnRSYXRlKTsKCkVYVEVSTiBWcFN0YXR1c1R5cGUKVnBBc3NvY0RzbExpbmUoCiAgICBWcExpbmVDdHhUeXBlICpwTGluZUN0eCwKICAgIGJvb2wgY29ubmVjdCwKICAgIHVpbnQ4IGxpbmUpOwoKRVhURVJOIFZwU3RhdHVzVHlwZQpWcFNldFNlYWxDdXIoCiAgICBWcERldkN0eFR5cGUgKnBEZXZDdHgsCiAgICB1aW50MTYgc2VhbEFwcGx5VGltZSwKICAgIHVpbnQxNiBzZWFsQ3ljbGVUaW1lLAogICAgdWludDE2IG1heEN1cnJlbnQsCiAgICB1aW50MTYgbWluQ3VycmVudCwKICAgIHVpbnQxNiAqcFNlYWxBcnJheSwKICAgIFZwUHJvZmlsZVB0clR5cGUgcERjUHJvZmlsZSk7CgoKI2RlZmluZSBWcFN0YXJ0TWV0ZXIzMihwTGluZUN0eCwgbWluRGVsYXksIG9uVGltZSwgb2ZmVGltZSwgbnVtTWV0ZXJzKSBcCiAgICBWcFN0YXJ0TWV0ZXIzMlEocExpbmVDdHgsIG1pbkRlbGF5LCBvblRpbWUsIG9mZlRpbWUsIG51bU1ldGVycywgMSkKCkVYVEVSTiBWcFN0YXR1c1R5cGUKVnBTZXRPcHRpb24oCiAgICBWcExpbmVDdHhUeXBlICpwTGluZUN0eCwKICAgIFZwRGV2Q3R4VHlwZSAqcERldkN0eCwKICAgIFZwT3B0aW9uSWRUeXBlIG9wdGlvbiwKICAgIHZvaWQgKnBWYWx1ZSk7CgpFWFRFUk4gVnBTdGF0dXNUeXBlClZwRGV2aWNlSW9BY2Nlc3MoCiAgICBWcERldkN0eFR5cGUgKnBEZXZDdHgsCiAgICBWcERldmljZUlvQWNjZXNzRGF0YVR5cGUgKnBEZXZpY2VJb0RhdGEpOwoKVnBTdGF0dXNUeXBlClZwRGV2aWNlSW9BY2Nlc3NFeHQoCiAgICBWcERldkN0eFR5cGUgKnBEZXZDdHgsCiAgICBWcERldmljZUlvQWNjZXNzRXh0VHlwZSAqcERldmljZUlvQWNjZXNzKTsKCkVYVEVSTiBWcFN0YXR1c1R5cGUKVnBMaW5lSW9BY2Nlc3MoCiAgICBWcExpbmVDdHhUeXBlICpwTGluZUN0eCwKICAgIFZwTGluZUlvQWNjZXNzVHlwZSAqcExpbmVJb0FjY2VzcywKICAgIHVpbnQxNiBoYW5kbGUpOwoKRVhURVJOIFZwU3RhdHVzVHlwZQpWcFZpcnR1YWxJU1IoCiAgICBWcERldkN0eFR5cGUgKnBEZXZDdHgpOwoKRVhURVJOIFZwU3RhdHVzVHlwZQpWcEFwaVRpY2soCiAgICBWcERldkN0eFR5cGUgKnBEZXZDdHgsCiAgICBib29sICpwRXZlbnRTdGF0dXMpOwoKRVhURVJOIFZwU3RhdHVzVHlwZQpWcExvd0xldmVsQ21kKAogICAgVnBMaW5lQ3R4VHlwZSAqcExpbmVDdHgsCiAgICB1aW50OCAqcENtZERhdGEsCiAgICB1aW50OCBsZW4sCiAgICB1aW50MTYgaGFuZGxlKTsKCkVYVEVSTiBWcFN0YXR1c1R5cGUKVnBMb3dMZXZlbENtZDE2KAogICAgVnBMaW5lQ3R4VHlwZSAqcExpbmVDdHgsCiAgICBWcExvd0xldmVsQ21kVHlwZSBjbWRUeXBlLAogICAgdWludDE2ICp3cml0ZVdvcmRzLAogICAgdWludDggbnVtV3JpdGVXb3JkcywKICAgIHVpbnQ4IG51bVJlYWRXb3JkcywKICAgIHVpbnQxNiBoYW5kbGUpOwoKRVhURVJOIFZwU3RhdHVzVHlwZQpWcEdlblRpbWVyQ3RybCgKICAgIFZwTGluZUN0eFR5cGUgKnBMaW5lQ3R4LAogICAgVnBHZW5UaW1lckN0cmxUeXBlIHRpbWVyQ3RybCwKICAgIHVpbnQzMiBkdXJhdGlvbiwKICAgIHVpbnQxNiBoYW5kbGUpOwoKLyoKICogU3RhdHVzIGFuZCBxdWVyeSBmdW5jdGlvbnMKICovCkVYVEVSTiBib29sClZwR2V0RXZlbnQoCiAgICBWcERldkN0eFR5cGUgKnBEZXZDdHgsCiAgICBWcEV2ZW50VHlwZSAqcEV2ZW50KTsKCkVYVEVSTiBWcFN0YXR1c1R5cGUKVnBHZXRMaW5lU3RhdHVzKAogICAgVnBMaW5lQ3R4VHlwZSAqcExpbmVDdHgsCiAgICBWcElucHV0VHlwZSBpbnB1dCwKICAgIGJvb2wgKnBTdGF0dXMpOwoKRVhURVJOIFZwU3RhdHVzVHlwZQpWcEdldERldmljZVN0YXR1cygKICAgIFZwRGV2Q3R4VHlwZSAqcERldkN0eCwKICAgIFZwSW5wdXRUeXBlIGlucHV0LAogICAgdWludDMyICpwRGV2aWNlU3RhdHVzKTsKCkVYVEVSTiBWcFN0YXR1c1R5cGUKVnBHZXREZXZpY2VTdGF0dXNFeHQoCiAgICBWcERldkN0eFR5cGUgKnBEZXZDdHgsCiAgICBWcERldmljZVN0YXR1c1R5cGUgKnBEZXZpY2VTdGF0dXMpOwoKRVhURVJOIFZwU3RhdHVzVHlwZQpWcEdldExvb3BDb25kKAogICAgVnBMaW5lQ3R4VHlwZSAqcExpbmVDdHgsCiAgICB1aW50MTYgaGFuZGxlKTsKCkVYVEVSTiBWcFN0YXR1c1R5cGUKVnBHZXRPcHRpb24oCiAgICBWcExpbmVDdHhUeXBlICpwTGluZUN0eCwKICAgIFZwRGV2Q3R4VHlwZSAqcERldkN0eCwKICAgIFZwT3B0aW9uSWRUeXBlIG9wdGlvbiwKICAgIHVpbnQxNiBoYW5kbGUpOwoKRVhURVJOIFZwU3RhdHVzVHlwZQpWcEdldExpbmVTdGF0ZSgKICAgIFZwTGluZUN0eFR5cGUgKnBMaW5lQ3R4LAogICAgVnBMaW5lU3RhdGVUeXBlICpwQ3VycmVudFN0YXRlKTsKCkVYVEVSTiBWcFN0YXR1c1R5cGUKVnBGbHVzaEV2ZW50cygKICAgIFZwRGV2Q3R4VHlwZSAqcERldkN0eCk7CgpFWFRFUk4gVnBTdGF0dXNUeXBlClZwR2V0UmVzdWx0cygKICAgIFZwRXZlbnRUeXBlICpwRXZlbnQsCiAgICB2b2lkICpwUmVzdWx0cyk7CgpFWFRFUk4gVnBTdGF0dXNUeXBlClZwQ2xlYXJSZXN1bHRzKAogICAgVnBEZXZDdHhUeXBlICpwRGV2Q3R4KTsKCkVYVEVSTiBWcFN0YXR1c1R5cGUKVnBPYmplY3REdW1wKAogICAgVnBMaW5lQ3R4VHlwZSAqcExpbmVDdHgsCiAgICBWcERldkN0eFR5cGUgKnBEZXZDdHgpOwoKRVhURVJOIFZwU3RhdHVzVHlwZQpWcFJlZ2lzdGVyRHVtcCgKICAgIFZwRGV2Q3R4VHlwZSAqcERldkN0eCk7CgpFWFRFUk4gVnBTdGF0dXNUeXBlClZwRHRtZkRpZ2l0RGV0ZWN0ZWQoCiAgICBWcExpbmVDdHhUeXBlICpwTGluZUN0eCwKICAgIFZwRGlnaXRUeXBlIGRpZ2l0LAogICAgVnBEaWdpdFNlbnNlVHlwZSBzZW5zZSk7CgpFWFRFUk4gVnBTdGF0dXNUeXBlClZwUXVlcnkoCiAgICBWcExpbmVDdHhUeXBlICpwTGluZUN0eCwKICAgIFZwUXVlcnlJZFR5cGUgcXVlcnlJZCwKICAgIHVpbnQxNiBoYW5kbGUpOwoKRVhURVJOIFZwU3RhdHVzVHlwZQpWcEdldFJlbGF5U3RhdGUoCiAgICBWcExpbmVDdHhUeXBlICpwTGluZUN0eCwKICAgIFZwUmVsYXlDb250cm9sVHlwZSAqcFJzdGF0ZSk7CgovKgogKiBUZXN0IEZ1bmN0aW9ucwogKi8KRVhURVJOIFZwU3RhdHVzVHlwZQpWcFRlc3RMaW5lKAogICAgVnBMaW5lQ3R4VHlwZSAqcExpbmVDdHgsCiAgICBWcFRlc3RJZFR5cGUgdGVzdCwKICAgIGNvbnN0IHZvaWQgKnBBcmdzLAogICAgdWludDE2IGhhbmRsZSk7CgpFWFRFUk4gVnBTdGF0dXNUeXBlClZwVGVzdExpbmVDYWxsYmFjaygKICAgIFZwTGluZUN0eFR5cGUgKnBMaW5lQ3R4LAogICAgVnBQY21PcGVyYXRpb25SZXN1bHRzVHlwZSAqcFJlc3VsdHMpOwoKRVhURVJOIFZwU3RhdHVzVHlwZQpWcENvZGVDaGVja1N1bSgKICAgIFZwRGV2Q3R4VHlwZSAqcERldkN0eCwKICAgIHVpbnQxNiBoYW5kbGUpOwoKRVhURVJOIFZwU3RhdHVzVHlwZQpWcFNlbGZUZXN0KAogICAgVnBMaW5lQ3R4VHlwZSAqcExpbmVDdHgpOwoKRVhURVJOIFZwU3RhdHVzVHlwZQpWcEZpbGxUZXN0QnVmKAogICAgVnBMaW5lQ3R4VHlwZSAqcExpbmVDdHgsCiAgICB1aW50MTYgbGVuZ3RoLAogICAgVnBWZWN0b3JQdHJUeXBlIHBEYXRhKTsKCkVYVEVSTiBWcFN0YXR1c1R5cGUKVnBSZWFkVGVzdEJ1ZigKICAgIFZwTGluZUN0eFR5cGUgKnBMaW5lQ3R4LAogICAgdWludDE2IGxlbmd0aCwKICAgIFZwVmVjdG9yUHRyVHlwZSBwRGF0YSk7CgoKRVhURVJOIFZwU3RhdHVzVHlwZQpWcE1hcExpbmVJZCgKICAgIFZwTGluZUN0eFR5cGUgKnBMaW5lQ3R4LAogICAgVnBMaW5lSWRUeXBlIGxpbmVJZCk7CgojaWYgIWRlZmluZWQoVlBfUkVEVUNFRF9BUElfSUYpIHx8IGRlZmluZWQoVlBfQ0NfNzkyX1NFUklFUykgfHwgZGVmaW5lZChWUF9DQ19WQ1BfU0VSSUVTKSAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBkZWZpbmVkKFZQX0NDX1ZDUDJfU0VSSUVTKSB8fCBkZWZpbmVkKFZQX0NDX01FTFRfU0VSSUVTKSBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgZGVmaW5lZChWUF9DQ19LV1JBUCkKRVhURVJOIFZwU3RhdHVzVHlwZQpWcE1hcFNsYWNJZCgKICAgIFZwRGV2Q3R4VHlwZSAqcERldkN0eCwKICAgIHVpbnQ4IHNsYWNJZCk7CiNlbmRpZgoKRVhURVJOIGJvb2wKVnBNZW1DcHlDaGVjaygKICAgIHVpbnQ4ICpkZXN0LAogICAgdWludDggKnNyYywKICAgIHVpbnQxNiBjb3VudCk7CgpFWFRFUk4gdm9pZCAqClZwTWVtQ3B5KAogICAgdm9pZCAqZGVzdCwKICAgIGNvbnN0IHZvaWQgKnNyYywKICAgIHVpbnQxNiBjb3VudCk7CgpFWFRFUk4gdm9pZCAqClZwTWVtU2V0KAogICAgdm9pZCAqIHMsCiAgICBpbnQgYywKICAgIHVpbnQxNiBjb3VudCk7CgoKLyoKICogVW5kb2N1bWVudGVkIGV4dGVybmFsIGZ1bmN0aW9uczoKICovCiNpZiAhZGVmaW5lZChWUF9SRURVQ0VEX0FQSV9JRikgfHwgZGVmaW5lZChWUF9DQ183OTJfU0VSSUVTKSB8fCBkZWZpbmVkKFZQX0NDX1ZDUF9TRVJJRVMpICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGRlZmluZWQoVlBfQ0NfVkNQMl9TRVJJRVMpIHx8IGRlZmluZWQoVlBfQ0NfTUVMVF9TRVJJRVMpIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBkZWZpbmVkKFZQX0NDX0tXUkFQKQpFWFRFUk4gdm9pZApWcFNldENhbEZsYWcoCiAgICBWcExpbmVDdHhUeXBlICpwTGluZUN0eCwKICAgIGJvb2wgdmFsdWUpOwoKRVhURVJOIGJvb2wKVnBSZWFkQ2FsRmxhZygKICAgIFZwTGluZUN0eFR5cGUgKnBMaW5lQ3R4KTsKCkVYVEVSTiBWcFN0YXR1c1R5cGUKVmNwMkhiaUNoZWNrKAogICAgVnBEZXZDdHhUeXBlICpwRGV2Q3R4KTsKI2VuZGlmCgpFWFRFUk4gdm9pZApWcE1waUNtZFdyYXBwZXIoCiAgICBWcERldmljZUlkVHlwZSBkZXZpY2VJZCwKICAgIHVpbnQ4IGVjVmFsLAogICAgdWludDggbXBpQ21kLAogICAgdWludDggbXBpQ21kTGVuLAogICAgdWludDggKmRhdGFCdWZmZXIpOwoKRVhURVJOIHVpbnQ4ClZwQ1NMQUNCdWlsZE1waUJ1ZmZlcigKICAgIHVpbnQ4IGluZGV4LAogICAgdWludDggKm1waUJ1ZmZlciwKICAgIHVpbnQ4IG1waUNtZCwKICAgIHVpbnQ4IG1waUNtZExlbiwKICAgIHVpbnQ4ICptcGlEYXRhKTsKI2VuZGlmIC8qIFZQX0FQSV9DT01NT05fSCAqLwo=