LyoKICogQ29weXJpZ2h0IChDKSAyMDA2IFZpdGFsaXkgTWFyZ29sZW4KICogQ29weXJpZ2h0IChDKSAyMDA2IFN0ZWZhbiBE9nNpbmdlcihGb3IgQ29kZVdlYXZlcnMpCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQogKi8KCiNkZWZpbmUgQ09CSk1BQ1JPUwojaW5jbHVkZSA8ZDNkOS5oPgojaW5jbHVkZSA8ZHhlcnI5Lmg+CiNpbmNsdWRlICJ3aW5lL3Rlc3QuaCIKCnN0YXRpYyBJRGlyZWN0M0Q5ICooV0lOQVBJICpwRGlyZWN0M0RDcmVhdGU5KShVSU5UKTsKCnN0YXRpYyBpbnQgZ2V0X3JlZmNvdW50KElVbmtub3duICpvYmplY3QpCnsKICAgIElVbmtub3duX0FkZFJlZiggb2JqZWN0ICk7CiAgICByZXR1cm4gSVVua25vd25fUmVsZWFzZSggb2JqZWN0ICk7Cn0KCiNkZWZpbmUgQ0hFQ0tfQ0FMTChyLGMsZCxyYykgXAogICAgaWYgKFNVQ0NFRURFRChyKSkge1wKICAgICAgICBpbnQgdG1wMSA9IGdldF9yZWZjb3VudCggKElVbmtub3duICopZCApOyBcCiAgICAgICAgaW50IHJjX25ldyA9IHJjOyBcCiAgICAgICAgb2sodG1wMSA9PSByY19uZXcsICJJbnZhbGlkIHJlZmNvdW50LiBFeHBlY3RlZCAlZCBnb3QgJWRcbiIsIHJjX25ldywgdG1wMSk7IFwKICAgIH0gZWxzZSB7XAogICAgICAgIHRyYWNlKCIlcyBmYWlsZWQ6ICVzXG4iLCBjLCBEWEdldEVycm9yU3RyaW5nOShyKSk7IFwKICAgIH0KI2RlZmluZSBDSEVDS19SRUxFQVNFKG9iaixkLHJjKSBcCiAgICBpZiAob2JqKSB7IFwKICAgICAgICBpbnQgdG1wMSwgcmNfbmV3ID0gcmM7IFwKICAgICAgICBJVW5rbm93bl9SZWxlYXNlKCBvYmogKTsgXAogICAgICAgIHRtcDEgPSBnZXRfcmVmY291bnQoIChJVW5rbm93biAqKWQgKTsgXAogICAgICAgIG9rKHRtcDEgPT0gcmNfbmV3LCAiSW52YWxpZCByZWZjb3VudC4gRXhwZWN0ZWQgJWQgZ290ICVkXG4iLCByY19uZXcsIHRtcDEpOyBcCiAgICB9CgpzdGF0aWMgdm9pZCBjaGVja19taXBtYXBfbGV2ZWxzKAogICAgSURpcmVjdDNERGV2aWNlOSogZGV2aWNlLCAKICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGNvdW50KSAKewoKICAgIElEaXJlY3QzREJhc2VUZXh0dXJlOSogdGV4dHVyZSA9IE5VTEw7CiAgICBIUkVTVUxUIGhyID0gSURpcmVjdDNERGV2aWNlOV9DcmVhdGVUZXh0dXJlKCBkZXZpY2UsIHdpZHRoLCBoZWlnaHQsIDAsIDAsIAogICAgICAgIEQzREZNVF9YOFI4RzhCOCwgRDNEUE9PTF9ERUZBVUxULCAoSURpcmVjdDNEVGV4dHVyZTkqKikgJnRleHR1cmUsIE5VTEwgKTsKICAgICAgIAogICAgaWYgKFNVQ0NFRURFRChocikpIHsKICAgICAgICBEV09SRCBsZXZlbHMgPSBJRGlyZWN0M0RCYXNlVGV4dHVyZTlfR2V0TGV2ZWxDb3VudCh0ZXh0dXJlKTsKICAgICAgICBvayhsZXZlbHMgPT0gY291bnQsICJJbnZhbGlkIGxldmVsIGNvdW50LiBFeHBlY3RlZCAlZCBnb3QgJWx1XG4iLCBjb3VudCwgbGV2ZWxzKTsKICAgIH0gZWxzZSAKICAgICAgICB0cmFjZSgiQ3JlYXRlVGV4dHVyZSBmYWlsZWQ6ICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwoKICAgIGlmICh0ZXh0dXJlKSBJVW5rbm93bl9SZWxlYXNlKCB0ZXh0dXJlICk7Cn0KCnN0YXRpYyB2b2lkIHRlc3RfbWlwbWFwX2xldmVscyh2b2lkKQp7CgogICAgSFJFU1VMVCAgICAgICAgICAgICAgIGhyOwogICAgSFdORCAgICAgICAgICAgICAgICAgIGh3bmQgPSBOVUxMOwoKICAgIElEaXJlY3QzRDkgICAgICAgICAgICAqcEQzZCA9IE5VTEw7CiAgICBJRGlyZWN0M0REZXZpY2U5ICAgICAgKnBEZXZpY2UgPSBOVUxMOwogICAgRDNEUFJFU0VOVF9QQVJBTUVURVJTIGQzZHBwOwogICAgRDNERElTUExBWU1PREUgICAgICAgIGQzZGRtOwogCiAgICBwRDNkID0gcERpcmVjdDNEQ3JlYXRlOSggRDNEX1NES19WRVJTSU9OICk7CiAgICBvayhwRDNkICE9IE5VTEwsICJGYWlsZWQgdG8gY3JlYXRlIElEaXJlY3QzRDkgb2JqZWN0XG4iKTsKICAgIGh3bmQgPSBDcmVhdGVXaW5kb3coICJzdGF0aWMiLCAiZDNkOV90ZXN0IiwgV1NfT1ZFUkxBUFBFRFdJTkRPVywgMTAwLCAxMDAsIDE2MCwgMTYwLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMICk7CiAgICBvayhod25kICE9IE5VTEwsICJGYWlsZWQgdG8gY3JlYXRlIHdpbmRvd1xuIik7CiAgICBpZiAoIXBEM2QgfHwgIWh3bmQpIGdvdG8gY2xlYW51cDsKCiAgICBJRGlyZWN0M0Q5X0dldEFkYXB0ZXJEaXNwbGF5TW9kZSggcEQzZCwgRDNEQURBUFRFUl9ERUZBVUxULCAmZDNkZG0gKTsKICAgIFplcm9NZW1vcnkoICZkM2RwcCwgc2l6ZW9mKGQzZHBwKSApOwogICAgZDNkcHAuV2luZG93ZWQgICAgICAgICA9IFRSVUU7CiAgICBkM2RwcC5Td2FwRWZmZWN0ICAgICAgID0gRDNEU1dBUEVGRkVDVF9ESVNDQVJEOwogICAgZDNkcHAuQmFja0J1ZmZlckZvcm1hdCA9IGQzZGRtLkZvcm1hdDsKCiAgICBociA9IElEaXJlY3QzRDlfQ3JlYXRlRGV2aWNlKCBwRDNkLCBEM0RBREFQVEVSX0RFRkFVTFQsIEQzRERFVlRZUEVfTlVMTFJFRiwgaHduZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRENSRUFURV9TT0ZUV0FSRV9WRVJURVhQUk9DRVNTSU5HLCAmZDNkcHAsICZwRGV2aWNlICk7CiAgICBvayhTVUNDRUVERUQoaHIpLCAiRmFpbGVkIHRvIGNyZWF0ZSBJRGlyZWN0M0Q5RGV2aWNlICglcylcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBpZiAoRkFJTEVEKGhyKSkgZ290byBjbGVhbnVwOwoKICAgIGNoZWNrX21pcG1hcF9sZXZlbHMocERldmljZSwgMzIsIDMyLCA2KTsKICAgIGNoZWNrX21pcG1hcF9sZXZlbHMocERldmljZSwgMjU2LCAxLCA5KTsKICAgIGNoZWNrX21pcG1hcF9sZXZlbHMocERldmljZSwgMSwgMjU2LCA5KTsKICAgIGNoZWNrX21pcG1hcF9sZXZlbHMocERldmljZSwgMSwgMSwgMSk7CgogICAgY2xlYW51cDoKICAgIGlmIChwRDNkKSAgICAgSVVua25vd25fUmVsZWFzZSggcEQzZCApOwogICAgaWYgKHBEZXZpY2UpICBJVW5rbm93bl9SZWxlYXNlKCBwRGV2aWNlICk7CiAgICBEZXN0cm95V2luZG93KCBod25kICk7Cn0KCnN0YXRpYyB2b2lkIHRlc3Rfc3dhcGNoYWluKHZvaWQpCnsKICAgIEhSRVNVTFQgICAgICAgICAgICAgICAgICAgICAgaHI7CiAgICBIV05EICAgICAgICAgICAgICAgICAgICAgICAgIGh3bmQgICAgICAgICAgICAgICA9IE5VTEw7CiAgICBJRGlyZWN0M0Q5ICAgICAgICAgICAgICAgICAgKnBEM2QgICAgICAgICAgICAgICA9IE5VTEw7CiAgICBJRGlyZWN0M0REZXZpY2U5ICAgICAgICAgICAgKnBEZXZpY2UgICAgICAgICAgICA9IE5VTEw7CiAgICBJRGlyZWN0M0RTd2FwQ2hhaW45ICAgICAgICAgKnN3YXBjaGFpbjAgICAgICAgICA9IE5VTEw7CiAgICBJRGlyZWN0M0RTd2FwQ2hhaW45ICAgICAgICAgKnN3YXBjaGFpbjEgICAgICAgICA9IE5VTEw7CiAgICBJRGlyZWN0M0RTd2FwQ2hhaW45ICAgICAgICAgKnN3YXBjaGFpbjIgICAgICAgICA9IE5VTEw7CiAgICBJRGlyZWN0M0RTd2FwQ2hhaW45ICAgICAgICAgKnN3YXBjaGFpbjMgICAgICAgICA9IE5VTEw7CiAgICBJRGlyZWN0M0RTd2FwQ2hhaW45ICAgICAgICAgKnN3YXBjaGFpblggICAgICAgICA9IE5VTEw7CiAgICBJRGlyZWN0M0RTdXJmYWNlOSAgICAgICAgICAgKmJhY2tidWZmZXIgICAgICAgICA9IE5VTEw7CiAgICBEM0RQUkVTRU5UX1BBUkFNRVRFUlMgICAgICAgIGQzZHBwOwogICAgRDNERElTUExBWU1PREUgICAgICAgICAgICAgICBkM2RkbTsKCiAgICBwRDNkID0gcERpcmVjdDNEQ3JlYXRlOSggRDNEX1NES19WRVJTSU9OICk7CiAgICBvayhwRDNkICE9IE5VTEwsICJGYWlsZWQgdG8gY3JlYXRlIElEaXJlY3QzRDkgb2JqZWN0XG4iKTsKICAgIGh3bmQgPSBDcmVhdGVXaW5kb3coICJzdGF0aWMiLCAiZDNkOV90ZXN0IiwgV1NfT1ZFUkxBUFBFRFdJTkRPVywgMTAwLCAxMDAsIDE2MCwgMTYwLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMICk7CiAgICBvayhod25kICE9IE5VTEwsICJGYWlsZWQgdG8gY3JlYXRlIHdpbmRvd1xuIik7CiAgICBpZiAoIXBEM2QgfHwgIWh3bmQpIGdvdG8gY2xlYW51cDsKCiAgICBJRGlyZWN0M0Q5X0dldEFkYXB0ZXJEaXNwbGF5TW9kZSggcEQzZCwgRDNEQURBUFRFUl9ERUZBVUxULCAmZDNkZG0gKTsKICAgIFplcm9NZW1vcnkoICZkM2RwcCwgc2l6ZW9mKGQzZHBwKSApOwogICAgZDNkcHAuV2luZG93ZWQgICAgICAgICA9IFRSVUU7CiAgICBkM2RwcC5Td2FwRWZmZWN0ICAgICAgID0gRDNEU1dBUEVGRkVDVF9ESVNDQVJEOwogICAgZDNkcHAuQmFja0J1ZmZlckZvcm1hdCA9IGQzZGRtLkZvcm1hdDsKICAgIGQzZHBwLkJhY2tCdWZmZXJDb3VudCAgPSAwOwoKICAgIGhyID0gSURpcmVjdDNEOV9DcmVhdGVEZXZpY2UoIHBEM2QsIEQzREFEQVBURVJfREVGQVVMVCwgRDNEREVWVFlQRV9OVUxMUkVGLCBod25kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEQ1JFQVRFX1NPRlRXQVJFX1ZFUlRFWFBST0NFU1NJTkcsICZkM2RwcCwgJnBEZXZpY2UgKTsKICAgIG9rKFNVQ0NFRURFRChociksICJGYWlsZWQgdG8gY3JlYXRlIElEaXJlY3QzRDlEZXZpY2UgKCVzKVxuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGlmIChGQUlMRUQoaHIpKSBnb3RvIGNsZWFudXA7CgogICAgLyogQ2hlY2sgaWYgdGhlIGJhY2sgYnVmZmVyIGNvdW50IHdhcyBtb2RpZmllZCAqLwogICAgb2soZDNkcHAuQmFja0J1ZmZlckNvdW50ID09IDEsICJUaGUgYmFjayBidWZmZXIgY291bnQgaW4gdGhlIHByZXNlbnRwYXJhbXMgc3RydWN0IGlzICVkXG4iLCBkM2RwcC5CYWNrQnVmZmVyQ291bnQpOwoKICAgIC8qIEdldCB0aGUgaW1wbGljaXQgc3dhcGNoYWluICovCiAgICBociA9IElEaXJlY3QzRERldmljZTlfR2V0U3dhcENoYWluKHBEZXZpY2UsIDAsICZzd2FwY2hhaW4wKTsKICAgIG9rKFNVQ0NFRURFRChociksICJGYWlsZWQgdG8gZ2V0IHRoZSBpbXBpY2l0IHN3YXBjaGFpbiAoJXMpXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaWYoc3dhcGNoYWluMCkgSURpcmVjdDNEU3dhcENoYWluOV9SZWxlYXNlKHN3YXBjaGFpbjApOwoKICAgIC8qIENoZWNrIGlmIHRoZXJlIGlzIGEgYmFjayBidWZmZXIgKi8KICAgIGhyID0gSURpcmVjdDNEU3dhcENoYWluOV9HZXRCYWNrQnVmZmVyKHN3YXBjaGFpbjAsIDAsIEQzREJBQ0tCVUZGRVJfVFlQRV9NT05PLCAmYmFja2J1ZmZlcik7CiAgICBvayhTVUNDRUVERUQoaHIpLCAiRmFpbGVkIHRvIGdldCB0aGUgYmFjayBidWZmZXIgKCVzKVxuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIG9rKGJhY2tidWZmZXIgIT0gTlVMTCwgIlRoZSBiYWNrIGJ1ZmZlciBpcyBOVUxMXG4iKTsKICAgIGlmKGJhY2tidWZmZXIpIElEaXJlY3QzRFN1cmZhY2U5X1JlbGVhc2UoYmFja2J1ZmZlcik7CgogICAgLyogVHJ5IHRvIGdldCBhIG5vbmV4aXN0YW50IHN3YXBjaGFpbiAqLwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0dldFN3YXBDaGFpbihwRGV2aWNlLCAxLCAmc3dhcGNoYWluWCk7CiAgICBvayhociA9PSBEM0RFUlJfSU5WQUxJRENBTEwsICJHZXRTd2FwQ2hhaW4gb24gYW4gbm9uZXhpc3RlbnQgc3dhcGNoYWluIHJldHVybmVkICglcylcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBvayhzd2FwY2hhaW5YID09IE5VTEwsICJTd2FwY2hhaW4gMSBpcyAlcFxuIiwgc3dhcGNoYWluWCk7CiAgICBpZihzd2FwY2hhaW5YKSBJRGlyZWN0M0RTd2FwQ2hhaW45X1JlbGVhc2Uoc3dhcGNoYWluWCk7CgogICAgLyogQ3JlYXRlIGEgYnVuY2ggb2Ygc3dhcGNoYWlucyAqLwogICAgZDNkcHAuQmFja0J1ZmZlckNvdW50ID0gMDsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9DcmVhdGVBZGRpdGlvbmFsU3dhcENoYWluKHBEZXZpY2UsICZkM2RwcCwgJnN3YXBjaGFpbjEpOwogICAgb2soU1VDQ0VFREVEKGhyKSwgIkZhaWxlZCB0byBjcmVhdGUgYSBzd2FwY2hhaW4gKCVzKVxuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIG9rKGQzZHBwLkJhY2tCdWZmZXJDb3VudCA9PSAxLCAiVGhlIGJhY2sgYnVmZmVyIGNvdW50IGluIHRoZSBwcmVzZW50cGFyYW1zIHN0cnVjdCBpcyAlZFxuIiwgZDNkcHAuQmFja0J1ZmZlckNvdW50KTsKCiAgICBkM2RwcC5CYWNrQnVmZmVyQ291bnQgID0gMTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9DcmVhdGVBZGRpdGlvbmFsU3dhcENoYWluKHBEZXZpY2UsICZkM2RwcCwgJnN3YXBjaGFpbjIpOwogICAgb2soU1VDQ0VFREVEKGhyKSwgIkZhaWxlZCB0byBjcmVhdGUgYSBzd2FwY2hhaW4gKCVzKVxuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKCiAgICBkM2RwcC5CYWNrQnVmZmVyQ291bnQgID0gMjsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9DcmVhdGVBZGRpdGlvbmFsU3dhcENoYWluKHBEZXZpY2UsICZkM2RwcCwgJnN3YXBjaGFpbjMpOwogICAgb2soU1VDQ0VFREVEKGhyKSwgIkZhaWxlZCB0byBjcmVhdGUgYSBzd2FwY2hhaW4gKCVzKVxuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGlmKFNVQ0NFRURFRChocikpIHsKICAgICAgICAvKiBTd2FwY2hhaW4gMywgY3JlYXRlZCB3aXRoIGJhY2tidWZmZXJjb3VudCAyICovCiAgICAgICAgYmFja2J1ZmZlciA9ICh2b2lkICopIDB4ZGVhZGJlZWY7CiAgICAgICAgaHIgPSBJRGlyZWN0M0RTd2FwQ2hhaW45X0dldEJhY2tCdWZmZXIoc3dhcGNoYWluMywgMCwgMCwgJmJhY2tidWZmZXIpOwogICAgICAgIG9rKFNVQ0NFRURFRChociksICJGYWlsZWQgdG8gZ2V0IHRoZSAxc3QgYmFjayBidWZmZXIgKCVzKVxuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgICAgICBvayhiYWNrYnVmZmVyICE9IE5VTEwgJiYgYmFja2J1ZmZlciAhPSAodm9pZCAqKSAweGRlYWRiZWVmLCAiVGhlIGJhY2sgYnVmZmVyIGlzICVwXG4iLCBiYWNrYnVmZmVyKTsKICAgICAgICBpZihiYWNrYnVmZmVyICYmIGJhY2tidWZmZXIgIT0gKHZvaWQgKikgMHhkZWFkYmVlZikgSURpcmVjdDNEU3VyZmFjZTlfUmVsZWFzZShiYWNrYnVmZmVyKTsKCiAgICAgICAgYmFja2J1ZmZlciA9ICh2b2lkICopIDB4ZGVhZGJlZWY7CiAgICAgICAgaHIgPSBJRGlyZWN0M0RTd2FwQ2hhaW45X0dldEJhY2tCdWZmZXIoc3dhcGNoYWluMywgMSwgMCwgJmJhY2tidWZmZXIpOwogICAgICAgIG9rKFNVQ0NFRURFRChociksICJGYWlsZWQgdG8gZ2V0IHRoZSAybmQgYmFjayBidWZmZXIgKCVzKVxuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgICAgICBvayhiYWNrYnVmZmVyICE9IE5VTEwgJiYgYmFja2J1ZmZlciAhPSAodm9pZCAqKSAweGRlYWRiZWVmLCAiVGhlIGJhY2sgYnVmZmVyIGlzICVwXG4iLCBiYWNrYnVmZmVyKTsKICAgICAgICBpZihiYWNrYnVmZmVyICYmIGJhY2tidWZmZXIgIT0gKHZvaWQgKikgMHhkZWFkYmVlZikgSURpcmVjdDNEU3VyZmFjZTlfUmVsZWFzZShiYWNrYnVmZmVyKTsKCiAgICAgICAgYmFja2J1ZmZlciA9ICh2b2lkICopIDB4ZGVhZGJlZWY7CiAgICAgICAgaHIgPSBJRGlyZWN0M0RTd2FwQ2hhaW45X0dldEJhY2tCdWZmZXIoc3dhcGNoYWluMywgMiwgMCwgJmJhY2tidWZmZXIpOwogICAgICAgIG9rKGhyID09IEQzREVSUl9JTlZBTElEQ0FMTCwgIkdldEJhY2tCdWZmZXIgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICAgICAgb2soYmFja2J1ZmZlciA9PSAodm9pZCAqKSAweGRlYWRiZWVmLCAiVGhlIGJhY2sgYnVmZmVyIHBvaW50ZXIgd2FzIG1vZGlmaWVkICglcClcbiIsIGJhY2tidWZmZXIpOwogICAgICAgIGlmKGJhY2tidWZmZXIgJiYgYmFja2J1ZmZlciAhPSAodm9pZCAqKSAweGRlYWRiZWVmKSBJRGlyZWN0M0RTdXJmYWNlOV9SZWxlYXNlKGJhY2tidWZmZXIpOwoKICAgICAgICBiYWNrYnVmZmVyID0gKHZvaWQgKikgMHhkZWFkYmVlZjsKICAgICAgICBociA9IElEaXJlY3QzRFN3YXBDaGFpbjlfR2V0QmFja0J1ZmZlcihzd2FwY2hhaW4zLCAzLCAwLCAmYmFja2J1ZmZlcik7CiAgICAgICAgb2soRkFJTEVEKGhyKSwgIkZhaWxlZCB0byBnZXQgdGhlIGJhY2sgYnVmZmVyICglcylcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICAgICAgb2soYmFja2J1ZmZlciA9PSAodm9pZCAqKSAweGRlYWRiZWVmLCAiVGhlIGJhY2sgYnVmZmVyIHBvaW50ZXIgd2FzIG1vZGlmaWVkICglcClcbiIsIGJhY2tidWZmZXIpOwogICAgICAgIGlmKGJhY2tidWZmZXIgJiYgYmFja2J1ZmZlciAhPSAodm9pZCAqKSAweGRlYWRiZWVmKSBJRGlyZWN0M0RTdXJmYWNlOV9SZWxlYXNlKGJhY2tidWZmZXIpOwogICAgfQoKICAgIC8qIENoZWNrIHRoZSBiYWNrIGJ1ZmZlcnMgb2YgdGhlIHN3YXBjaGFpbnMgKi8KICAgIC8qIFN3YXBjaGFpbiAxLCBjcmVhdGVkIHdpdGggYmFja2J1ZmZlcmNvdW50IDAgKi8KICAgIGhyID0gSURpcmVjdDNEU3dhcENoYWluOV9HZXRCYWNrQnVmZmVyKHN3YXBjaGFpbjEsIDAsIEQzREJBQ0tCVUZGRVJfVFlQRV9NT05PLCAmYmFja2J1ZmZlcik7CiAgICBvayhTVUNDRUVERUQoaHIpLCAiRmFpbGVkIHRvIGdldCB0aGUgYmFjayBidWZmZXIgKCVzKVxuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIG9rKGJhY2tidWZmZXIgIT0gTlVMTCwgIlRoZSBiYWNrIGJ1ZmZlciBpcyBOVUxMICglcylcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBpZihiYWNrYnVmZmVyKSBJRGlyZWN0M0RTdXJmYWNlOV9SZWxlYXNlKGJhY2tidWZmZXIpOwoKICAgIGJhY2tidWZmZXIgPSAodm9pZCAqKSAweGRlYWRiZWVmOwogICAgaHIgPSBJRGlyZWN0M0RTd2FwQ2hhaW45X0dldEJhY2tCdWZmZXIoc3dhcGNoYWluMSwgMSwgMCwgJmJhY2tidWZmZXIpOwogICAgb2soRkFJTEVEKGhyKSwgIkZhaWxlZCB0byBnZXQgdGhlIGJhY2sgYnVmZmVyICglcylcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBvayhiYWNrYnVmZmVyID09ICh2b2lkICopIDB4ZGVhZGJlZWYsICJUaGUgYmFjayBidWZmZXIgcG9pbnRlciB3YXMgbW9kaWZpZWQgKCVwKVxuIiwgYmFja2J1ZmZlcik7CiAgICBpZihiYWNrYnVmZmVyICYmIGJhY2tidWZmZXIgIT0gKHZvaWQgKikgMHhkZWFkYmVlZikgSURpcmVjdDNEU3VyZmFjZTlfUmVsZWFzZShiYWNrYnVmZmVyKTsKCiAgICAvKiBTd2FwY2hhaW4gMiAtIGNyZWF0ZWQgd2l0aCBiYWNrYnVmZmVyY291bnQgMSAqLwogICAgYmFja2J1ZmZlciA9ICh2b2lkICopIDB4ZGVhZGJlZWY7CiAgICBociA9IElEaXJlY3QzRFN3YXBDaGFpbjlfR2V0QmFja0J1ZmZlcihzd2FwY2hhaW4yLCAwLCAwLCAmYmFja2J1ZmZlcik7CiAgICBvayhTVUNDRUVERUQoaHIpLCAiRmFpbGVkIHRvIGdldCB0aGUgYmFjayBidWZmZXIgKCVzKVxuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIG9rKGJhY2tidWZmZXIgIT0gTlVMTCAmJiBiYWNrYnVmZmVyICE9ICh2b2lkICopIDB4ZGVhZGJlZWYsICJUaGUgYmFjayBidWZmZXIgaXMgJXBcbiIsIGJhY2tidWZmZXIpOwogICAgaWYoYmFja2J1ZmZlciAmJiBiYWNrYnVmZmVyICE9ICh2b2lkICopIDB4ZGVhZGJlZWYpIElEaXJlY3QzRFN1cmZhY2U5X1JlbGVhc2UoYmFja2J1ZmZlcik7CgogICAgYmFja2J1ZmZlciA9ICh2b2lkICopIDB4ZGVhZGJlZWY7CiAgICBociA9IElEaXJlY3QzRFN3YXBDaGFpbjlfR2V0QmFja0J1ZmZlcihzd2FwY2hhaW4yLCAxLCAwLCAmYmFja2J1ZmZlcik7CiAgICBvayhociA9PSBEM0RFUlJfSU5WQUxJRENBTEwsICJHZXRCYWNrQnVmZmVyIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgb2soYmFja2J1ZmZlciA9PSAodm9pZCAqKSAweGRlYWRiZWVmLCAiVGhlIGJhY2sgYnVmZmVyIHBvaW50ZXIgd2FzIG1vZGlmaWVkICglcClcbiIsIGJhY2tidWZmZXIpOwogICAgaWYoYmFja2J1ZmZlciAmJiBiYWNrYnVmZmVyICE9ICh2b2lkICopIDB4ZGVhZGJlZWYpIElEaXJlY3QzRFN1cmZhY2U5X1JlbGVhc2UoYmFja2J1ZmZlcik7CgogICAgYmFja2J1ZmZlciA9ICh2b2lkICopIDB4ZGVhZGJlZWY7CiAgICBociA9IElEaXJlY3QzRFN3YXBDaGFpbjlfR2V0QmFja0J1ZmZlcihzd2FwY2hhaW4yLCAyLCAwLCAmYmFja2J1ZmZlcik7CiAgICBvayhGQUlMRUQoaHIpLCAiRmFpbGVkIHRvIGdldCB0aGUgYmFjayBidWZmZXIgKCVzKVxuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIG9rKGJhY2tidWZmZXIgPT0gKHZvaWQgKikgMHhkZWFkYmVlZiwgIlRoZSBiYWNrIGJ1ZmZlciBwb2ludGVyIHdhcyBtb2RpZmllZCAoJXApXG4iLCBiYWNrYnVmZmVyKTsKICAgIGlmKGJhY2tidWZmZXIgJiYgYmFja2J1ZmZlciAhPSAodm9pZCAqKSAweGRlYWRiZWVmKSBJRGlyZWN0M0RTdXJmYWNlOV9SZWxlYXNlKGJhY2tidWZmZXIpOwoKICAgIC8qIFRyeSBnZXRTd2FwQ2hhaW4gb24gYSBtYW51YWxseSBjcmVhdGVkIHN3YXBjaGFpbgogICAgICogaXQgc2hvdWxkIGZhaWwsIGFwcGFyZW50bHkgR2V0U3dhcENoYWluIG9ubHkgcmV0dXJucyBpbXBsaWNpdCBzd2FwY2hhaW5zCiAgICAgKi8KICAgIHN3YXBjaGFpblggPSAodm9pZCAqKSAweGRlYWRiZWVmOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0dldFN3YXBDaGFpbihwRGV2aWNlLCAxLCAmc3dhcGNoYWluWCk7CiAgICBvayhociA9PSBEM0RFUlJfSU5WQUxJRENBTEwsICJGYWlsZWQgdG8gZ2V0IHRoZSBzZWNvbmQgc3dhcGNoYWluICglcylcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBvayhzd2FwY2hhaW5YID09IE5VTEwsICJUaGUgc3dhcGNoYWluIHBvaW50ZXIgaXMgJXBcbiIsIHN3YXBjaGFpblgpOwogICAgaWYoc3dhcGNoYWluWCAmJiBzd2FwY2hhaW5YICE9ICh2b2lkICopIDB4ZGVhZGJlZWYgKSBJRGlyZWN0M0RTd2FwQ2hhaW45X1JlbGVhc2Uoc3dhcGNoYWluWCk7CgogICAgY2xlYW51cDoKICAgIGlmKHN3YXBjaGFpbjEpIElEaXJlY3QzRFN3YXBDaGFpbjlfUmVsZWFzZShzd2FwY2hhaW4xKTsKICAgIGlmKHN3YXBjaGFpbjIpIElEaXJlY3QzRFN3YXBDaGFpbjlfUmVsZWFzZShzd2FwY2hhaW4yKTsKICAgIGlmKHN3YXBjaGFpbjMpIElEaXJlY3QzRFN3YXBDaGFpbjlfUmVsZWFzZShzd2FwY2hhaW4zKTsKICAgIGlmKHBEZXZpY2UpIElEaXJlY3QzRERldmljZTlfUmVsZWFzZShwRGV2aWNlKTsKICAgIGlmKHBEM2QpIElEaXJlY3QzRERldmljZTlfUmVsZWFzZShwRDNkKTsKICAgIERlc3Ryb3lXaW5kb3coIGh3bmQgKTsKfQoKc3RhdGljIHZvaWQgdGVzdF9yZWZjb3VudCh2b2lkKQp7CiAgICBIUkVTVUxUICAgICAgICAgICAgICAgICAgICAgIGhyOwogICAgSFdORCAgICAgICAgICAgICAgICAgICAgICAgICBod25kICAgICAgICAgICAgICAgPSBOVUxMOwogICAgSURpcmVjdDNEOSAgICAgICAgICAgICAgICAgICpwRDNkICAgICAgICAgICAgICAgPSBOVUxMOwogICAgSURpcmVjdDNERGV2aWNlOSAgICAgICAgICAgICpwRGV2aWNlICAgICAgICAgICAgPSBOVUxMOwogICAgSURpcmVjdDNEVmVydGV4QnVmZmVyOSAgICAgICpwVmVydGV4QnVmZmVyICAgICAgPSBOVUxMOwogICAgSURpcmVjdDNESW5kZXhCdWZmZXI5ICAgICAgICpwSW5kZXhCdWZmZXIgICAgICAgPSBOVUxMOwogICAgSURpcmVjdDNEVmVydGV4RGVjbGFyYXRpb245ICpwVmVydGV4RGVjbGFyYXRpb24gPSBOVUxMOwogICAgSURpcmVjdDNEVmVydGV4U2hhZGVyOSAgICAgICpwVmVydGV4U2hhZGVyICAgICAgPSBOVUxMOwogICAgSURpcmVjdDNEUGl4ZWxTaGFkZXI5ICAgICAgICpwUGl4ZWxTaGFkZXIgICAgICAgPSBOVUxMOwogICAgSURpcmVjdDNEQ3ViZVRleHR1cmU5ICAgICAgICpwQ3ViZVRleHR1cmUgICAgICAgPSBOVUxMOwogICAgSURpcmVjdDNEVGV4dHVyZTkgICAgICAgICAgICpwVGV4dHVyZSAgICAgICAgICAgPSBOVUxMOwogICAgSURpcmVjdDNEVm9sdW1lVGV4dHVyZTkgICAgICpwVm9sdW1lVGV4dHVyZSAgICAgPSBOVUxMOwogICAgSURpcmVjdDNEU3VyZmFjZTkgICAgICAgICAgICpwU3RlbmNpbFN1cmZhY2UgICAgPSBOVUxMOwogICAgSURpcmVjdDNEU3VyZmFjZTkgICAgICAgICAgICpwT2Zmc2NyZWVuU3VyZmFjZSAgPSBOVUxMOwogICAgSURpcmVjdDNEU3VyZmFjZTkgICAgICAgICAgICpwUmVuZGVyVGFyZ2V0ICAgICAgPSBOVUxMOwogICAgSURpcmVjdDNEU3VyZmFjZTkgICAgICAgICAgICpwVGV4dHVyZUxldmVsICAgICAgPSBOVUxMOwogICAgSURpcmVjdDNEU3RhdGVCbG9jazkgICAgICAgICpwU3RhdGVCbG9jayAgICAgICAgPSBOVUxMOwogICAgSURpcmVjdDNEU3RhdGVCbG9jazkgICAgICAgICpwU3RhdGVCbG9jazEgICAgICAgPSBOVUxMOwogICAgSURpcmVjdDNEU3dhcENoYWluOSAgICAgICAgICpwU3dhcENoYWluICAgICAgICAgPSBOVUxMOwogICAgSURpcmVjdDNEUXVlcnk5ICAgICAgICAgICAgICpwUXVlcnkgICAgICAgICAgICAgPSBOVUxMOwogICAgRDNEUFJFU0VOVF9QQVJBTUVURVJTICAgICAgICBkM2RwcDsKICAgIEQzRERJU1BMQVlNT0RFICAgICAgICAgICAgICAgZDNkZG07CiAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmNvdW50ID0gMCwgdG1wOwoKICAgIEQzRFZFUlRFWEVMRU1FTlQ5IGRlY2xbXSA9CiAgICB7CglEM0RERUNMX0VORCgpCiAgICB9OwogICAgc3RhdGljIERXT1JEIHNpbXBsZV92c1tdID0gezB4RkZGRTAxMDEsICAgICAgICAgICAgIC8qIHZzXzFfMSAgICAgICAgICAgICAgICovCiAgICAgICAgMHgwMDAwMDAxRiwgMHg4MDAwMDAwMCwgMHg5MDBGMDAwMCwgICAgICAgICAgICAgLyogZGNsX3Bvc2l0aW9uMCB2MCAgICAgKi8KICAgICAgICAweDAwMDAwMDA5LCAweEMwMDEwMDAwLCAweDkwRTQwMDAwLCAweEEwRTQwMDAwLCAvKiBkcDQgb1Bvcy54LCB2MCwgYzAgICAqLwogICAgICAgIDB4MDAwMDAwMDksIDB4QzAwMjAwMDAsIDB4OTBFNDAwMDAsIDB4QTBFNDAwMDEsIC8qIGRwNCBvUG9zLnksIHYwLCBjMSAgICovCiAgICAgICAgMHgwMDAwMDAwOSwgMHhDMDA0MDAwMCwgMHg5MEU0MDAwMCwgMHhBMEU0MDAwMiwgLyogZHA0IG9Qb3MueiwgdjAsIGMyICAgKi8KICAgICAgICAweDAwMDAwMDA5LCAweEMwMDgwMDAwLCAweDkwRTQwMDAwLCAweEEwRTQwMDAzLCAvKiBkcDQgb1Bvcy53LCB2MCwgYzMgICAqLwogICAgICAgIDB4MDAwMEZGRkZ9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVORCAgICAgICAgICAgICAgICAgICovCiAgICBzdGF0aWMgRFdPUkQgc2ltcGxlX3BzW10gPSB7MHhGRkZGMDEwMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcHNfMV8xICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgIDB4MDAwMDAwNTEsIDB4QTAwRjAwMDEsIDB4M0Y4MDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIC8qIGRlZiBjMSA9IDEuMCwgMC4wLCAwLjAsIDAuMCAgKi8KICAgICAgICAweDAwMDAwMDQyLCAweEIwMEYwMDAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0ZXggdDAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgMHgwMDAwMDAwOCwgMHg4MDBGMDAwMCwgMHhBMEU0MDAwMSwgMHhBMEU0MDAwMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogZHAzIHIwLCBjMSwgYzAgICAgICAgICAgICAgICAqLwogICAgICAgIDB4MDAwMDAwMDUsIDB4ODAwRjAwMDAsIDB4OTBFNDAwMDAsIDB4ODBFNDAwMDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG11bCByMCwgdjAsIHIwICAgICAgICAgICAgICAgKi8KICAgICAgICAweDAwMDAwMDA1LCAweDgwMEYwMDAwLCAweEIwRTQwMDAwLCAweDgwRTQwMDAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtdWwgcjAsIHQwLCByMCAgICAgICAgICAgICAgICovCiAgICAgICAgMHgwMDAwRkZGRn07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRU5EICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKCiAgICBwRDNkID0gcERpcmVjdDNEQ3JlYXRlOSggRDNEX1NES19WRVJTSU9OICk7CiAgICBvayhwRDNkICE9IE5VTEwsICJGYWlsZWQgdG8gY3JlYXRlIElEaXJlY3QzRDkgb2JqZWN0XG4iKTsKICAgIGh3bmQgPSBDcmVhdGVXaW5kb3coICJzdGF0aWMiLCAiZDNkOV90ZXN0IiwgV1NfT1ZFUkxBUFBFRFdJTkRPVywgMTAwLCAxMDAsIDE2MCwgMTYwLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMICk7CiAgICBvayhod25kICE9IE5VTEwsICJGYWlsZWQgdG8gY3JlYXRlIHdpbmRvd1xuIik7CiAgICBpZiAoIXBEM2QgfHwgIWh3bmQpIGdvdG8gY2xlYW51cDsKCiAgICBJRGlyZWN0M0Q5X0dldEFkYXB0ZXJEaXNwbGF5TW9kZSggcEQzZCwgRDNEQURBUFRFUl9ERUZBVUxULCAmZDNkZG0gKTsKICAgIFplcm9NZW1vcnkoICZkM2RwcCwgc2l6ZW9mKGQzZHBwKSApOwogICAgZDNkcHAuV2luZG93ZWQgICAgICAgICA9IFRSVUU7CiAgICBkM2RwcC5Td2FwRWZmZWN0ICAgICAgID0gRDNEU1dBUEVGRkVDVF9ESVNDQVJEOwogICAgZDNkcHAuQmFja0J1ZmZlckZvcm1hdCA9IGQzZGRtLkZvcm1hdDsKCiAgICBociA9IElEaXJlY3QzRDlfQ3JlYXRlRGV2aWNlKCBwRDNkLCBEM0RBREFQVEVSX0RFRkFVTFQsIEQzRERFVlRZUEVfTlVMTFJFRiwgaHduZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRENSRUFURV9TT0ZUV0FSRV9WRVJURVhQUk9DRVNTSU5HLCAmZDNkcHAsICZwRGV2aWNlICk7CiAgICBvayhTVUNDRUVERUQoaHIpLCAiRmFpbGVkIHRvIGNyZWF0ZSBJRGlyZWN0M0Q5RGV2aWNlICglcylcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBpZiAoRkFJTEVEKGhyKSkgZ290byBjbGVhbnVwOwoKICAgIHJlZmNvdW50ID0gZ2V0X3JlZmNvdW50KCAoSVVua25vd24gKilwRGV2aWNlICk7CiAgICBvayhyZWZjb3VudCA9PSAxLCAiSW52YWxpZCBkZXZpY2UgUmVmQ291bnQgJWRcbiIsIHJlZmNvdW50KTsKCiAgICAvKiBCdWZmZXJzICovCiAgICBociA9IElEaXJlY3QzRERldmljZTlfQ3JlYXRlSW5kZXhCdWZmZXIoIHBEZXZpY2UsIDE2LCAwLCBEM0RGTVRfSU5ERVgzMiwgRDNEUE9PTF9ERUZBVUxULCAmcEluZGV4QnVmZmVyLCBOVUxMICk7CiAgICBDSEVDS19DQUxMKCBociwgIkNyZWF0ZUluZGV4QnVmZmVyIiwgcERldmljZSwgKytyZWZjb3VudCApOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0NyZWF0ZVZlcnRleEJ1ZmZlciggcERldmljZSwgMTYsIDAsIEQzREZWRl9YWVosIEQzRFBPT0xfREVGQVVMVCwgJnBWZXJ0ZXhCdWZmZXIsIE5VTEwgKTsKICAgIENIRUNLX0NBTEwoIGhyLCAiQ3JlYXRlVmVydGV4QnVmZmVyIiwgcERldmljZSwgKytyZWZjb3VudCApOwogICAgLyogU2hhZGVycyAqLwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0NyZWF0ZVZlcnRleERlY2xhcmF0aW9uKCBwRGV2aWNlLCBkZWNsLCAmcFZlcnRleERlY2xhcmF0aW9uICk7CiAgICBDSEVDS19DQUxMKCBociwgIkNyZWF0ZVZlcnRleERlY2xhcmF0aW9uIiwgcERldmljZSwgKytyZWZjb3VudCApOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0NyZWF0ZVZlcnRleFNoYWRlciggcERldmljZSwgc2ltcGxlX3ZzLCAmcFZlcnRleFNoYWRlciApOwogICAgQ0hFQ0tfQ0FMTCggaHIsICJDcmVhdGVWZXJ0ZXhTaGFkZXIiLCBwRGV2aWNlLCArK3JlZmNvdW50ICk7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfQ3JlYXRlUGl4ZWxTaGFkZXIoIHBEZXZpY2UsIHNpbXBsZV9wcywgJnBQaXhlbFNoYWRlciApOwogICAgQ0hFQ0tfQ0FMTCggaHIsICJDcmVhdGVQaXhlbFNoYWRlciIsIHBEZXZpY2UsICsrcmVmY291bnQgKTsKICAgIC8qIFRleHR1cmVzICovCiAgICBociA9IElEaXJlY3QzRERldmljZTlfQ3JlYXRlVGV4dHVyZSggcERldmljZSwgMzIsIDMyLCAzLCAwLCBEM0RGTVRfWDhSOEc4QjgsIEQzRFBPT0xfREVGQVVMVCwgJnBUZXh0dXJlLCBOVUxMICk7CiAgICBDSEVDS19DQUxMKCBociwgIkNyZWF0ZVRleHR1cmUiLCBwRGV2aWNlLCArK3JlZmNvdW50ICk7CiAgICBpZiAocFRleHR1cmUpCiAgICB7CiAgICAgICAgdG1wID0gZ2V0X3JlZmNvdW50KCAoSVVua25vd24gKilwVGV4dHVyZSApOwogICAgICAgIC8qIFRoaXMgc2hvdWxkIG5vdCBpbmNyZW1lbnQgZGV2aWNlIHJlZmNvdW50ICovCiAgICAgICAgaHIgPSBJRGlyZWN0M0RUZXh0dXJlOV9HZXRTdXJmYWNlTGV2ZWwoIHBUZXh0dXJlLCAxLCAmcFRleHR1cmVMZXZlbCApOwogICAgICAgIENIRUNLX0NBTEwoIGhyLCAiR2V0U3VyZmFjZUxldmVsIiwgcERldmljZSwgcmVmY291bnQgKTsKICAgICAgICAvKiBCdXQgc2hvdWxkIGluY3JlbWVudCB0ZXh0dXJlJ3MgcmVmY291bnQgKi8KICAgICAgICBDSEVDS19DQUxMKCBociwgIkdldFN1cmZhY2VMZXZlbCIsIHBUZXh0dXJlLCB0bXArMSApOwogICAgfQogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0NyZWF0ZUN1YmVUZXh0dXJlKCBwRGV2aWNlLCAzMiwgMCwgMCwgRDNERk1UX1g4UjhHOEI4LCBEM0RQT09MX0RFRkFVTFQsICZwQ3ViZVRleHR1cmUsIE5VTEwgKTsKICAgIENIRUNLX0NBTEwoIGhyLCAiQ3JlYXRlQ3ViZVRleHR1cmUiLCBwRGV2aWNlLCArK3JlZmNvdW50ICk7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfQ3JlYXRlVm9sdW1lVGV4dHVyZSggcERldmljZSwgMzIsIDMyLCAyLCAwLCAwLCBEM0RGTVRfWDhSOEc4QjgsIEQzRFBPT0xfREVGQVVMVCwgJnBWb2x1bWVUZXh0dXJlLCBOVUxMICk7CiAgICBDSEVDS19DQUxMKCBociwgIkNyZWF0ZVZvbHVtZVRleHR1cmUiLCBwRGV2aWNlLCArK3JlZmNvdW50ICk7CiAgICAvKiBTdXJmYWNlcyAqLwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0NyZWF0ZURlcHRoU3RlbmNpbFN1cmZhY2UoIHBEZXZpY2UsIDMyLCAzMiwgRDNERk1UX0QyNFM4LCBEM0RNVUxUSVNBTVBMRV9OT05FLCAwLCBUUlVFLCAmcFN0ZW5jaWxTdXJmYWNlLCBOVUxMICk7CiAgICBDSEVDS19DQUxMKCBociwgIkNyZWF0ZURlcHRoU3RlbmNpbFN1cmZhY2UiLCBwRGV2aWNlLCArK3JlZmNvdW50ICk7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfQ3JlYXRlT2Zmc2NyZWVuUGxhaW5TdXJmYWNlKCBwRGV2aWNlLCAzMiwgMzIsIEQzREZNVF9YOFI4RzhCOCwgRDNEUE9PTF9ERUZBVUxULCAmcE9mZnNjcmVlblN1cmZhY2UsIE5VTEwgKTsKICAgIENIRUNLX0NBTEwoIGhyLCAiQ3JlYXRlT2Zmc2NyZWVuUGxhaW5TdXJmYWNlIiwgcERldmljZSwgKytyZWZjb3VudCApOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0NyZWF0ZVJlbmRlclRhcmdldCggcERldmljZSwgMzIsIDMyLCBEM0RGTVRfWDhSOEc4QjgsIEQzRE1VTFRJU0FNUExFX05PTkUsIDAsIFRSVUUsICZwUmVuZGVyVGFyZ2V0LCBOVUxMICk7CiAgICBDSEVDS19DQUxMKCBociwgIkNyZWF0ZVJlbmRlclRhcmdldCIsIHBEZXZpY2UsICsrcmVmY291bnQgKTsKICAgIC8qIE1pc2MgKi8KICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9DcmVhdGVTdGF0ZUJsb2NrKCBwRGV2aWNlLCBEM0RTQlRfQUxMLCAmcFN0YXRlQmxvY2sgKTsKICAgIENIRUNLX0NBTEwoIGhyLCAiQ3JlYXRlU3RhdGVCbG9jayIsIHBEZXZpY2UsICsrcmVmY291bnQgKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9DcmVhdGVBZGRpdGlvbmFsU3dhcENoYWluKCBwRGV2aWNlLCAmZDNkcHAsICZwU3dhcENoYWluICk7CiAgICBDSEVDS19DQUxMKCBociwgIkNyZWF0ZUFkZGl0aW9uYWxTd2FwQ2hhaW4iLCBwRGV2aWNlLCArK3JlZmNvdW50ICk7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfQ3JlYXRlUXVlcnkoIHBEZXZpY2UsIEQzRFFVRVJZVFlQRV9FVkVOVCwgJnBRdWVyeSApOwogICAgQ0hFQ0tfQ0FMTCggaHIsICJDcmVhdGVRdWVyeSIsIHBEZXZpY2UsICsrcmVmY291bnQgKTsKCiAgICBociA9IElEaXJlY3QzRERldmljZTlfQmVnaW5TdGF0ZUJsb2NrKCBwRGV2aWNlICk7CiAgICBDSEVDS19DQUxMKCBociwgIkJlZ2luU3RhdGVCbG9jayIsIHBEZXZpY2UsIHJlZmNvdW50ICk7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfRW5kU3RhdGVCbG9jayggcERldmljZSwgJnBTdGF0ZUJsb2NrMSApOwogICAgQ0hFQ0tfQ0FMTCggaHIsICJFbmRTdGF0ZUJsb2NrIiwgcERldmljZSwgKytyZWZjb3VudCApOwoKY2xlYW51cDoKICAgIENIRUNLX1JFTEVBU0UocERldmljZSwgICAgICAgICAgICAgIHBEZXZpY2UsIC0tcmVmY291bnQpOwoKICAgIC8qIEJ1ZmZlcnMgKi8KICAgIENIRUNLX1JFTEVBU0UocFZlcnRleEJ1ZmZlciwgICAgICAgIHBEZXZpY2UsIC0tcmVmY291bnQpOwogICAgQ0hFQ0tfUkVMRUFTRShwSW5kZXhCdWZmZXIsICAgICAgICAgcERldmljZSwgLS1yZWZjb3VudCk7CiAgICAvKiBTaGFkZXJzICovCiAgICBDSEVDS19SRUxFQVNFKHBWZXJ0ZXhEZWNsYXJhdGlvbiwgICBwRGV2aWNlLCAtLXJlZmNvdW50KTsKICAgIENIRUNLX1JFTEVBU0UocFZlcnRleFNoYWRlciwgICAgICAgIHBEZXZpY2UsIC0tcmVmY291bnQpOwogICAgQ0hFQ0tfUkVMRUFTRShwUGl4ZWxTaGFkZXIsICAgICAgICAgcERldmljZSwgLS1yZWZjb3VudCk7CiAgICAvKiBUZXh0dXJlcyAqLwogICAgLyogcFRleHR1cmVMZXZlbCBpcyBob2xkaW5nIGEgcmVmZXJlbmNlIHRvIHRoZSBwVGV4dHVyZSAqLwogICAgQ0hFQ0tfUkVMRUFTRShwVGV4dHVyZSwgICAgICAgICAgICAgcERldmljZSwgICByZWZjb3VudCk7CiAgICBDSEVDS19SRUxFQVNFKHBUZXh0dXJlTGV2ZWwsICAgICAgICBwRGV2aWNlLCAtLXJlZmNvdW50KTsKICAgIENIRUNLX1JFTEVBU0UocEN1YmVUZXh0dXJlLCAgICAgICAgIHBEZXZpY2UsIC0tcmVmY291bnQpOwogICAgQ0hFQ0tfUkVMRUFTRShwVm9sdW1lVGV4dHVyZSwgICAgICAgcERldmljZSwgLS1yZWZjb3VudCk7CiAgICAvKiBTdXJmYWNlcyAqLwogICAgQ0hFQ0tfUkVMRUFTRShwU3RlbmNpbFN1cmZhY2UsICAgICAgcERldmljZSwgLS1yZWZjb3VudCk7CiAgICBDSEVDS19SRUxFQVNFKHBPZmZzY3JlZW5TdXJmYWNlLCAgICBwRGV2aWNlLCAtLXJlZmNvdW50KTsKICAgIENIRUNLX1JFTEVBU0UocFJlbmRlclRhcmdldCwgICAgICAgIHBEZXZpY2UsIC0tcmVmY291bnQpOwogICAgLyogTWlzYyAqLwogICAgQ0hFQ0tfUkVMRUFTRShwU3RhdGVCbG9jaywgICAgICAgICAgcERldmljZSwgLS1yZWZjb3VudCk7CiAgICBDSEVDS19SRUxFQVNFKHBTd2FwQ2hhaW4sICAgICAgICAgICBwRGV2aWNlLCAtLXJlZmNvdW50KTsKICAgIENIRUNLX1JFTEVBU0UocFF1ZXJ5LCAgICAgICAgICAgICAgIHBEZXZpY2UsIC0tcmVmY291bnQpOwogICAgLyogVGhpcyB3aWxsIGRlc3Ryb3kgZGV2aWNlIC0gY2Fubm90IGNoZWNrIHRoZSByZWZjb3VudCBoZXJlICovCiAgICBpZiAocFN0YXRlQmxvY2sxKSAgICAgICAgIElVbmtub3duX1JlbGVhc2UoIHBTdGF0ZUJsb2NrMSApOwoKICAgIGlmIChwRDNkKSAgICAgICAgICAgICAgICAgSVVua25vd25fUmVsZWFzZSggcEQzZCApOwoKICAgIERlc3Ryb3lXaW5kb3coIGh3bmQgKTsKfQoKc3RhdGljIHZvaWQgdGVzdF9jdXJzb3Iodm9pZCkKewogICAgSFJFU1VMVCAgICAgICAgICAgICAgICAgICAgICBocjsKICAgIEhXTkQgICAgICAgICAgICAgICAgICAgICAgICAgaHduZCAgICAgICAgICAgICAgID0gTlVMTDsKICAgIElEaXJlY3QzRDkgICAgICAgICAgICAgICAgICAqcEQzZCAgICAgICAgICAgICAgID0gTlVMTDsKICAgIElEaXJlY3QzRERldmljZTkgICAgICAgICAgICAqcERldmljZSAgICAgICAgICAgID0gTlVMTDsKICAgIEQzRFBSRVNFTlRfUEFSQU1FVEVSUyAgICAgICAgZDNkcHA7CiAgICBEM0RESVNQTEFZTU9ERSAgICAgICAgICAgICAgIGQzZGRtOwogICAgQ1VSU09SSU5GTyAgICAgICAgICAgICAgICAgICBpbmZvOwogICAgSURpcmVjdDNEU3VyZmFjZTkgKmN1cnNvciA9IE5VTEw7CiAgICBIQ1VSU09SIGN1cjsKCiAgICBtZW1zZXQoJmluZm8sIDAsIHNpemVvZihpbmZvKSk7CiAgICBpbmZvLmNiU2l6ZSA9IHNpemVvZihpbmZvKTsKICAgIGhyID0gR2V0Q3Vyc29ySW5mbygmaW5mbyk7CiAgICBjdXIgPSBpbmZvLmhDdXJzb3I7CgogICAgcEQzZCA9IHBEaXJlY3QzRENyZWF0ZTkoIEQzRF9TREtfVkVSU0lPTiApOwogICAgb2socEQzZCAhPSBOVUxMLCAiRmFpbGVkIHRvIGNyZWF0ZSBJRGlyZWN0M0Q5IG9iamVjdFxuIik7CiAgICBod25kID0gQ3JlYXRlV2luZG93KCAic3RhdGljIiwgImQzZDlfdGVzdCIsIFdTX09WRVJMQVBQRURXSU5ET1csIDEwMCwgMTAwLCAxNjAsIDE2MCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCApOwogICAgb2soaHduZCAhPSBOVUxMLCAiRmFpbGVkIHRvIGNyZWF0ZSB3aW5kb3dcbiIpOwogICAgaWYgKCFwRDNkIHx8ICFod25kKSBnb3RvIGNsZWFudXA7CgogICAgSURpcmVjdDNEOV9HZXRBZGFwdGVyRGlzcGxheU1vZGUoIHBEM2QsIEQzREFEQVBURVJfREVGQVVMVCwgJmQzZGRtICk7CiAgICBaZXJvTWVtb3J5KCAmZDNkcHAsIHNpemVvZihkM2RwcCkgKTsKICAgIGQzZHBwLldpbmRvd2VkICAgICAgICAgPSBUUlVFOwogICAgZDNkcHAuU3dhcEVmZmVjdCAgICAgICA9IEQzRFNXQVBFRkZFQ1RfRElTQ0FSRDsKICAgIGQzZHBwLkJhY2tCdWZmZXJGb3JtYXQgPSBkM2RkbS5Gb3JtYXQ7CgogICAgaHIgPSBJRGlyZWN0M0Q5X0NyZWF0ZURldmljZSggcEQzZCwgRDNEQURBUFRFUl9ERUZBVUxULCBEM0RERVZUWVBFX05VTExSRUYsIGh3bmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RDUkVBVEVfU09GVFdBUkVfVkVSVEVYUFJPQ0VTU0lORywgJmQzZHBwLCAmcERldmljZSApOwogICAgb2soU1VDQ0VFREVEKGhyKSwgIkZhaWxlZCB0byBjcmVhdGUgSURpcmVjdDNEOURldmljZSAoJXMpXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaWYgKEZBSUxFRChocikpIGdvdG8gY2xlYW51cDsKCiAgICBJRGlyZWN0M0REZXZpY2U5X0NyZWF0ZU9mZnNjcmVlblBsYWluU3VyZmFjZShwRGV2aWNlLCAzMiwgMzIsIEQzREZNVF9BOFI4RzhCOCwgRDNEUE9PTF9TQ1JBVENILCAmY3Vyc29yLCAwKTsKICAgIG9rKGN1cnNvciAhPSBOVUxMLCAiSURpcmVjdDNERGV2aWNlOV9DcmVhdGVPZmZzY3JlZW5QbGFpblN1cmZhY2UgZmFpbGVkIHdpdGggJTA4bHhcbiIsIGhyKTsKCiAgICAvKiBJbml0aWFsbHkgaGlkZGVuICovCiAgICBociA9IElEaXJlY3QzRERldmljZTlfU2hvd0N1cnNvcihwRGV2aWNlLCBUUlVFKTsKICAgIG9rKGhyID09IEZBTFNFLCAiSURpcmVjdDNERGV2aWNlOV9TaG93Q3Vyc29yIHJldHVybmVkICUwOGx4XG4iLCBocik7CgogICAgLyogTm90IGVuYWJsZWQgd2l0aG91dCBhIHN1cmZhY2UqLwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1Nob3dDdXJzb3IocERldmljZSwgVFJVRSk7CiAgICBvayhociA9PSBGQUxTRSwgIklEaXJlY3QzRERldmljZTlfU2hvd0N1cnNvciByZXR1cm5lZCAlMDhseFxuIiwgaHIpOwoKICAgIC8qIEZhaWxzICovCiAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0Q3Vyc29yUHJvcGVydGllcyhwRGV2aWNlLCAwLCAwLCBOVUxMKTsKICAgIG9rKGhyID09IEQzREVSUl9JTlZBTElEQ0FMTCwgIklEaXJlY3QzRERldmljZTlfU2V0Q3Vyc29yUHJvcGVydGllcyByZXR1cm5lZCAlMDhseFxuIiwgaHIpOwoKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRDdXJzb3JQcm9wZXJ0aWVzKHBEZXZpY2UsIDAsIDAsIGN1cnNvcik7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldEN1cnNvclByb3BlcnRpZXMgcmV0dXJuZWQgJTA4bHhcbiIsIGhyKTsKCiAgICBJRGlyZWN0M0RTdXJmYWNlOV9SZWxlYXNlKGN1cnNvcik7CgogICAgbWVtc2V0KCZpbmZvLCAwLCBzaXplb2YoaW5mbykpOwogICAgaW5mby5jYlNpemUgPSBzaXplb2YoaW5mbyk7CiAgICBociA9IEdldEN1cnNvckluZm8oJmluZm8pOwogICAgb2soaHIgIT0gMCwgIkdldEN1cnNvckluZm8gcmV0dXJuZWQgJTA4bHhcbiIsIGhyKTsKICAgIG9rKGluZm8uZmxhZ3MgJiBDVVJTT1JfU0hPV0lORywgIlRoZSBnZGkgY3Vyc29yIGlzIGhpZGRlbiAoJTA4bHgpXG4iLCBpbmZvLmZsYWdzKTsKICAgIG9rKGluZm8uaEN1cnNvciA9PSBjdXIsICJUaGUgY3Vyc29yIGhhbmRsZSBpcyAlcFxuIiwgaW5mby5oQ3Vyc29yKTsgLyogdW5jaGFuZ2VkICovCgogICAgLyogU3RpbGwgaGlkZGVuICovCiAgICBociA9IElEaXJlY3QzRERldmljZTlfU2hvd0N1cnNvcihwRGV2aWNlLCBUUlVFKTsKICAgIG9rKGhyID09IEZBTFNFLCAiSURpcmVjdDNERGV2aWNlOV9TaG93Q3Vyc29yIHJldHVybmVkICUwOGx4XG4iLCBocik7CgogICAgLyogRW5hYmxlZCBub3cqLwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1Nob3dDdXJzb3IocERldmljZSwgVFJVRSk7CiAgICBvayhociA9PSBUUlVFLCAiSURpcmVjdDNERGV2aWNlOV9TaG93Q3Vyc29yIHJldHVybmVkICUwOGx4XG4iLCBocik7CgogICAgLyogR0RJIGN1cnNvciB1bmNoYW5nZWQgKi8KICAgIG1lbXNldCgmaW5mbywgMCwgc2l6ZW9mKGluZm8pKTsKICAgIGluZm8uY2JTaXplID0gc2l6ZW9mKGluZm8pOwogICAgaHIgPSBHZXRDdXJzb3JJbmZvKCZpbmZvKTsKICAgIG9rKGhyICE9IDAsICJHZXRDdXJzb3JJbmZvIHJldHVybmVkICUwOGx4XG4iLCBocik7CiAgICBvayhpbmZvLmZsYWdzICYgQ1VSU09SX1NIT1dJTkcsICJUaGUgZ2RpIGN1cnNvciBpcyBoaWRkZW4gKCUwOGx4KVxuIiwgaW5mby5mbGFncyk7CiAgICBvayhpbmZvLmhDdXJzb3IgPT0gY3VyLCAiVGhlIGN1cnNvciBoYW5kbGUgaXMgJXBcbiIsIGluZm8uaEN1cnNvcik7IC8qIHVuY2hhbmdlZCAqLwoKY2xlYW51cDoKICAgIGlmKHBEM2QpIElEaXJlY3QzRDlfUmVsZWFzZShwRDNkKTsKICAgIGlmKHBEZXZpY2UpIElEaXJlY3QzRDlfUmVsZWFzZShwRGV2aWNlKTsKfQoKU1RBUlRfVEVTVChkZXZpY2UpCnsKICAgIEhNT0RVTEUgZDNkOV9oYW5kbGUgPSBMb2FkTGlicmFyeUEoICJkM2Q5LmRsbCIgKTsKCiAgICBwRGlyZWN0M0RDcmVhdGU5ID0gKHZvaWQgKilHZXRQcm9jQWRkcmVzcyggZDNkOV9oYW5kbGUsICJEaXJlY3QzRENyZWF0ZTkiICk7CiAgICBpZiAocERpcmVjdDNEQ3JlYXRlOSkKICAgIHsKICAgICAgICB0ZXN0X3N3YXBjaGFpbigpOwogICAgICAgIHRlc3RfcmVmY291bnQoKTsKICAgICAgICB0ZXN0X21pcG1hcF9sZXZlbHMoKTsKICAgICAgICB0ZXN0X2N1cnNvcigpOwogICAgfQp9Cg==