LyoKICogQ29weXJpZ2h0IChDKSAyMDA2IFZpdGFsaXkgTWFyZ29sZW4KICogQ29weXJpZ2h0IChDKSAyMDA2IENocmlzIFJvYmluc29uCiAqIENvcHlyaWdodCAoQykgMjAwNi0yMDA3IFN0ZWZhbiBE9nNpbmdlcihGb3IgQ29kZVdlYXZlcnMpCiAqIENvcHlyaWdodCAyMDA3IEhlbnJpIFZlcmJlZXQKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBCiAqLwoKI2RlZmluZSBDT0JKTUFDUk9TCiNpbmNsdWRlIDxkM2Q5Lmg+CiNpbmNsdWRlIDxkeGVycjkuaD4KI2luY2x1ZGUgIndpbmUvdGVzdC5oIgoKc3RhdGljIElEaXJlY3QzRDkgKihXSU5BUEkgKnBEaXJlY3QzRENyZWF0ZTkpKFVJTlQpOwoKc3RhdGljIGludCBnZXRfcmVmY291bnQoSVVua25vd24gKm9iamVjdCkKewogICAgSVVua25vd25fQWRkUmVmKCBvYmplY3QgKTsKICAgIHJldHVybiBJVW5rbm93bl9SZWxlYXNlKCBvYmplY3QgKTsKfQoKI2RlZmluZSBDSEVDS19DQUxMKHIsYyxkLHJjKSBcCiAgICBpZiAoU1VDQ0VFREVEKHIpKSB7XAogICAgICAgIGludCB0bXAxID0gZ2V0X3JlZmNvdW50KCAoSVVua25vd24gKilkICk7IFwKICAgICAgICBpbnQgcmNfbmV3ID0gcmM7IFwKICAgICAgICBvayh0bXAxID09IHJjX25ldywgIkludmFsaWQgcmVmY291bnQuIEV4cGVjdGVkICVkIGdvdCAlZFxuIiwgcmNfbmV3LCB0bXAxKTsgXAogICAgfSBlbHNlIHtcCiAgICAgICAgdHJhY2UoIiVzIGZhaWxlZDogJXNcbiIsIGMsIERYR2V0RXJyb3JTdHJpbmc5KHIpKTsgXAogICAgfQoKI2RlZmluZSBDSEVDS19SRUxFQVNFKG9iaixkLHJjKSBcCiAgICBpZiAob2JqKSB7IFwKICAgICAgICBpbnQgdG1wMSwgcmNfbmV3ID0gcmM7IFwKICAgICAgICBJVW5rbm93bl9SZWxlYXNlKCBvYmogKTsgXAogICAgICAgIHRtcDEgPSBnZXRfcmVmY291bnQoIChJVW5rbm93biAqKWQgKTsgXAogICAgICAgIG9rKHRtcDEgPT0gcmNfbmV3LCAiSW52YWxpZCByZWZjb3VudC4gRXhwZWN0ZWQgJWQgZ290ICVkXG4iLCByY19uZXcsIHRtcDEpOyBcCiAgICB9CgojZGVmaW5lIENIRUNLX1JFRkNPVU5UKG9iaixyYykgXAogICAgeyBcCiAgICAgICAgaW50IHJjX25ldyA9IHJjOyBcCiAgICAgICAgaW50IGNvdW50ID0gZ2V0X3JlZmNvdW50KCAoSVVua25vd24gKilvYmogKTsgXAogICAgICAgIG9rKGNvdW50ID09IHJjX25ldywgIkludmFsaWQgcmVmY291bnQuIEV4cGVjdGVkICVkIGdvdCAlZFxuIiwgcmNfbmV3LCBjb3VudCk7IFwKICAgIH0KCiNkZWZpbmUgQ0hFQ0tfUkVMRUFTRV9SRUZDT1VOVChvYmoscmMpIFwKICAgIHsgXAogICAgICAgIGludCByY19uZXcgPSByYzsgXAogICAgICAgIGludCBjb3VudCA9IElVbmtub3duX1JlbGVhc2UoIChJVW5rbm93biAqKW9iaiApOyBcCiAgICAgICAgb2soY291bnQgPT0gcmNfbmV3LCAiSW52YWxpZCByZWZjb3VudC4gRXhwZWN0ZWQgJWQgZ290ICVkXG4iLCByY19uZXcsIGNvdW50KTsgXAogICAgfQoKI2RlZmluZSBDSEVDS19BRERSRUZfUkVGQ09VTlQob2JqLHJjKSBcCiAgICB7IFwKICAgICAgICBpbnQgcmNfbmV3ID0gcmM7IFwKICAgICAgICBpbnQgY291bnQgPSBJVW5rbm93bl9BZGRSZWYoIChJVW5rbm93biAqKW9iaiApOyBcCiAgICAgICAgb2soY291bnQgPT0gcmNfbmV3LCAiSW52YWxpZCByZWZjb3VudC4gRXhwZWN0ZWQgJWQgZ290ICVkXG4iLCByY19uZXcsIGNvdW50KTsgXAogICAgfQoKI2RlZmluZSBDSEVDS19TVVJGQUNFX0NPTlRBSU5FUihvYmosaWlkLGV4cGVjdGVkKSBcCiAgICB7IFwKICAgICAgICB2b2lkICpjb250YWluZXJfcHRyID0gKHZvaWQgKikweDEzMzdjMGQzOyBcCiAgICAgICAgaHIgPSBJRGlyZWN0M0RTdXJmYWNlOV9HZXRDb250YWluZXIob2JqLCAmaWlkLCAmY29udGFpbmVyX3B0cik7IFwKICAgICAgICBvayhTVUNDRUVERUQoaHIpICYmIGNvbnRhaW5lcl9wdHIgPT0gZXhwZWN0ZWQsICJHZXRDb250YWluZXIgcmV0dXJuZWQ6IGhyICUjeCwgY29udGFpbmVyX3B0ciAlcC4gIiBcCiAgICAgICAgICAgICJFeHBlY3RlZCBociAlI3gsIGNvbnRhaW5lcl9wdHIgJXBcbiIsIGhyLCBjb250YWluZXJfcHRyLCBTX09LLCBleHBlY3RlZCk7IFwKICAgICAgICBpZiAoY29udGFpbmVyX3B0ciAmJiBjb250YWluZXJfcHRyICE9ICh2b2lkICopMHgxMzM3YzBkMykgSVVua25vd25fUmVsZWFzZSgoSVVua25vd24gKiljb250YWluZXJfcHRyKTsgXAogICAgfQoKc3RhdGljIHZvaWQgY2hlY2tfbWlwbWFwX2xldmVscygKICAgIElEaXJlY3QzRERldmljZTkqIGRldmljZSwgCiAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBjb3VudCkgCnsKCiAgICBJRGlyZWN0M0RCYXNlVGV4dHVyZTkqIHRleHR1cmUgPSBOVUxMOwogICAgSFJFU1VMVCBociA9IElEaXJlY3QzRERldmljZTlfQ3JlYXRlVGV4dHVyZSggZGV2aWNlLCB3aWR0aCwgaGVpZ2h0LCAwLCAwLCAKICAgICAgICBEM0RGTVRfWDhSOEc4QjgsIEQzRFBPT0xfREVGQVVMVCwgKElEaXJlY3QzRFRleHR1cmU5KiopICZ0ZXh0dXJlLCBOVUxMICk7CiAgICAgICAKICAgIGlmIChTVUNDRUVERUQoaHIpKSB7CiAgICAgICAgRFdPUkQgbGV2ZWxzID0gSURpcmVjdDNEQmFzZVRleHR1cmU5X0dldExldmVsQ291bnQodGV4dHVyZSk7CiAgICAgICAgb2sobGV2ZWxzID09IGNvdW50LCAiSW52YWxpZCBsZXZlbCBjb3VudC4gRXhwZWN0ZWQgJWQgZ290ICV1XG4iLCBjb3VudCwgbGV2ZWxzKTsKICAgIH0gZWxzZSAKICAgICAgICB0cmFjZSgiQ3JlYXRlVGV4dHVyZSBmYWlsZWQ6ICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwoKICAgIGlmICh0ZXh0dXJlKSBJVW5rbm93bl9SZWxlYXNlKCB0ZXh0dXJlICk7Cn0KCnN0YXRpYyB2b2lkIHRlc3RfbWlwbWFwX2xldmVscyh2b2lkKQp7CgogICAgSFJFU1VMVCAgICAgICAgICAgICAgIGhyOwogICAgSFdORCAgICAgICAgICAgICAgICAgIGh3bmQgPSBOVUxMOwoKICAgIElEaXJlY3QzRDkgICAgICAgICAgICAqcEQzZCA9IE5VTEw7CiAgICBJRGlyZWN0M0REZXZpY2U5ICAgICAgKnBEZXZpY2UgPSBOVUxMOwogICAgRDNEUFJFU0VOVF9QQVJBTUVURVJTIGQzZHBwOwogICAgRDNERElTUExBWU1PREUgICAgICAgIGQzZGRtOwogCiAgICBwRDNkID0gcERpcmVjdDNEQ3JlYXRlOSggRDNEX1NES19WRVJTSU9OICk7CiAgICBvayhwRDNkICE9IE5VTEwsICJGYWlsZWQgdG8gY3JlYXRlIElEaXJlY3QzRDkgb2JqZWN0XG4iKTsKICAgIGh3bmQgPSBDcmVhdGVXaW5kb3coICJzdGF0aWMiLCAiZDNkOV90ZXN0IiwgV1NfT1ZFUkxBUFBFRFdJTkRPVywgMTAwLCAxMDAsIDE2MCwgMTYwLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMICk7CiAgICBvayhod25kICE9IE5VTEwsICJGYWlsZWQgdG8gY3JlYXRlIHdpbmRvd1xuIik7CiAgICBpZiAoIXBEM2QgfHwgIWh3bmQpIGdvdG8gY2xlYW51cDsKCiAgICBJRGlyZWN0M0Q5X0dldEFkYXB0ZXJEaXNwbGF5TW9kZSggcEQzZCwgRDNEQURBUFRFUl9ERUZBVUxULCAmZDNkZG0gKTsKICAgIFplcm9NZW1vcnkoICZkM2RwcCwgc2l6ZW9mKGQzZHBwKSApOwogICAgZDNkcHAuV2luZG93ZWQgICAgICAgICA9IFRSVUU7CiAgICBkM2RwcC5Td2FwRWZmZWN0ICAgICAgID0gRDNEU1dBUEVGRkVDVF9ESVNDQVJEOwogICAgZDNkcHAuQmFja0J1ZmZlckZvcm1hdCA9IGQzZGRtLkZvcm1hdDsKCiAgICBociA9IElEaXJlY3QzRDlfQ3JlYXRlRGV2aWNlKCBwRDNkLCBEM0RBREFQVEVSX0RFRkFVTFQsIEQzRERFVlRZUEVfTlVMTFJFRiwgaHduZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRENSRUFURV9TT0ZUV0FSRV9WRVJURVhQUk9DRVNTSU5HLCAmZDNkcHAsICZwRGV2aWNlICk7CiAgICBvayhTVUNDRUVERUQoaHIpLCAiRmFpbGVkIHRvIGNyZWF0ZSBJRGlyZWN0M0Q5RGV2aWNlICglcylcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBpZiAoRkFJTEVEKGhyKSkgZ290byBjbGVhbnVwOwoKICAgIGNoZWNrX21pcG1hcF9sZXZlbHMocERldmljZSwgMzIsIDMyLCA2KTsKICAgIGNoZWNrX21pcG1hcF9sZXZlbHMocERldmljZSwgMjU2LCAxLCA5KTsKICAgIGNoZWNrX21pcG1hcF9sZXZlbHMocERldmljZSwgMSwgMjU2LCA5KTsKICAgIGNoZWNrX21pcG1hcF9sZXZlbHMocERldmljZSwgMSwgMSwgMSk7CgogICAgY2xlYW51cDoKICAgIGlmIChwRDNkKSAgICAgSVVua25vd25fUmVsZWFzZSggcEQzZCApOwogICAgaWYgKHBEZXZpY2UpICBJVW5rbm93bl9SZWxlYXNlKCBwRGV2aWNlICk7CiAgICBEZXN0cm95V2luZG93KCBod25kICk7Cn0KCnN0YXRpYyB2b2lkIHRlc3Rfc3dhcGNoYWluKHZvaWQpCnsKICAgIEhSRVNVTFQgICAgICAgICAgICAgICAgICAgICAgaHI7CiAgICBIV05EICAgICAgICAgICAgICAgICAgICAgICAgIGh3bmQgICAgICAgICAgICAgICA9IE5VTEw7CiAgICBJRGlyZWN0M0Q5ICAgICAgICAgICAgICAgICAgKnBEM2QgICAgICAgICAgICAgICA9IE5VTEw7CiAgICBJRGlyZWN0M0REZXZpY2U5ICAgICAgICAgICAgKnBEZXZpY2UgICAgICAgICAgICA9IE5VTEw7CiAgICBJRGlyZWN0M0RTd2FwQ2hhaW45ICAgICAgICAgKnN3YXBjaGFpbjAgICAgICAgICA9IE5VTEw7CiAgICBJRGlyZWN0M0RTd2FwQ2hhaW45ICAgICAgICAgKnN3YXBjaGFpbjEgICAgICAgICA9IE5VTEw7CiAgICBJRGlyZWN0M0RTd2FwQ2hhaW45ICAgICAgICAgKnN3YXBjaGFpbjIgICAgICAgICA9IE5VTEw7CiAgICBJRGlyZWN0M0RTd2FwQ2hhaW45ICAgICAgICAgKnN3YXBjaGFpbjMgICAgICAgICA9IE5VTEw7CiAgICBJRGlyZWN0M0RTd2FwQ2hhaW45ICAgICAgICAgKnN3YXBjaGFpblggICAgICAgICA9IE5VTEw7CiAgICBJRGlyZWN0M0RTdXJmYWNlOSAgICAgICAgICAgKmJhY2tidWZmZXIgICAgICAgICA9IE5VTEw7CiAgICBEM0RQUkVTRU5UX1BBUkFNRVRFUlMgICAgICAgIGQzZHBwOwogICAgRDNERElTUExBWU1PREUgICAgICAgICAgICAgICBkM2RkbTsKCiAgICBwRDNkID0gcERpcmVjdDNEQ3JlYXRlOSggRDNEX1NES19WRVJTSU9OICk7CiAgICBvayhwRDNkICE9IE5VTEwsICJGYWlsZWQgdG8gY3JlYXRlIElEaXJlY3QzRDkgb2JqZWN0XG4iKTsKICAgIGh3bmQgPSBDcmVhdGVXaW5kb3coICJzdGF0aWMiLCAiZDNkOV90ZXN0IiwgV1NfT1ZFUkxBUFBFRFdJTkRPVywgMTAwLCAxMDAsIDE2MCwgMTYwLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMICk7CiAgICBvayhod25kICE9IE5VTEwsICJGYWlsZWQgdG8gY3JlYXRlIHdpbmRvd1xuIik7CiAgICBpZiAoIXBEM2QgfHwgIWh3bmQpIGdvdG8gY2xlYW51cDsKCiAgICBJRGlyZWN0M0Q5X0dldEFkYXB0ZXJEaXNwbGF5TW9kZSggcEQzZCwgRDNEQURBUFRFUl9ERUZBVUxULCAmZDNkZG0gKTsKICAgIFplcm9NZW1vcnkoICZkM2RwcCwgc2l6ZW9mKGQzZHBwKSApOwogICAgZDNkcHAuV2luZG93ZWQgICAgICAgICA9IFRSVUU7CiAgICBkM2RwcC5Td2FwRWZmZWN0ICAgICAgID0gRDNEU1dBUEVGRkVDVF9ESVNDQVJEOwogICAgZDNkcHAuQmFja0J1ZmZlckZvcm1hdCA9IGQzZGRtLkZvcm1hdDsKICAgIGQzZHBwLkJhY2tCdWZmZXJDb3VudCAgPSAwOwoKICAgIGhyID0gSURpcmVjdDNEOV9DcmVhdGVEZXZpY2UoIHBEM2QsIEQzREFEQVBURVJfREVGQVVMVCwgRDNEREVWVFlQRV9IQUwsIGh3bmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RDUkVBVEVfU09GVFdBUkVfVkVSVEVYUFJPQ0VTU0lORywgJmQzZHBwLCAmcERldmljZSApOwogICAgb2soU1VDQ0VFREVEKGhyKSwgIkZhaWxlZCB0byBjcmVhdGUgSURpcmVjdDNEOURldmljZSAoJXMpXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaWYgKEZBSUxFRChocikpIGdvdG8gY2xlYW51cDsKCiAgICAvKiBDaGVjayBpZiB0aGUgYmFjayBidWZmZXIgY291bnQgd2FzIG1vZGlmaWVkICovCiAgICBvayhkM2RwcC5CYWNrQnVmZmVyQ291bnQgPT0gMSwgIlRoZSBiYWNrIGJ1ZmZlciBjb3VudCBpbiB0aGUgcHJlc2VudHBhcmFtcyBzdHJ1Y3QgaXMgJWRcbiIsIGQzZHBwLkJhY2tCdWZmZXJDb3VudCk7CgogICAgLyogR2V0IHRoZSBpbXBsaWNpdCBzd2FwY2hhaW4gKi8KICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9HZXRTd2FwQ2hhaW4ocERldmljZSwgMCwgJnN3YXBjaGFpbjApOwogICAgb2soU1VDQ0VFREVEKGhyKSwgIkZhaWxlZCB0byBnZXQgdGhlIGltcGljaXQgc3dhcGNoYWluICglcylcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBpZihzd2FwY2hhaW4wKSBJRGlyZWN0M0RTd2FwQ2hhaW45X1JlbGVhc2Uoc3dhcGNoYWluMCk7CgogICAgLyogQ2hlY2sgaWYgdGhlcmUgaXMgYSBiYWNrIGJ1ZmZlciAqLwogICAgaHIgPSBJRGlyZWN0M0RTd2FwQ2hhaW45X0dldEJhY2tCdWZmZXIoc3dhcGNoYWluMCwgMCwgRDNEQkFDS0JVRkZFUl9UWVBFX01PTk8sICZiYWNrYnVmZmVyKTsKICAgIG9rKFNVQ0NFRURFRChociksICJGYWlsZWQgdG8gZ2V0IHRoZSBiYWNrIGJ1ZmZlciAoJXMpXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgb2soYmFja2J1ZmZlciAhPSBOVUxMLCAiVGhlIGJhY2sgYnVmZmVyIGlzIE5VTExcbiIpOwogICAgaWYoYmFja2J1ZmZlcikgSURpcmVjdDNEU3VyZmFjZTlfUmVsZWFzZShiYWNrYnVmZmVyKTsKCiAgICAvKiBUcnkgdG8gZ2V0IGEgbm9uZXhpc3RhbnQgc3dhcGNoYWluICovCiAgICBociA9IElEaXJlY3QzRERldmljZTlfR2V0U3dhcENoYWluKHBEZXZpY2UsIDEsICZzd2FwY2hhaW5YKTsKICAgIG9rKGhyID09IEQzREVSUl9JTlZBTElEQ0FMTCwgIkdldFN3YXBDaGFpbiBvbiBhbiBub25leGlzdGVudCBzd2FwY2hhaW4gcmV0dXJuZWQgKCVzKVxuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIG9rKHN3YXBjaGFpblggPT0gTlVMTCwgIlN3YXBjaGFpbiAxIGlzICVwXG4iLCBzd2FwY2hhaW5YKTsKICAgIGlmKHN3YXBjaGFpblgpIElEaXJlY3QzRFN3YXBDaGFpbjlfUmVsZWFzZShzd2FwY2hhaW5YKTsKCiAgICAvKiBDcmVhdGUgYSBidW5jaCBvZiBzd2FwY2hhaW5zICovCiAgICBkM2RwcC5CYWNrQnVmZmVyQ291bnQgPSAwOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0NyZWF0ZUFkZGl0aW9uYWxTd2FwQ2hhaW4ocERldmljZSwgJmQzZHBwLCAmc3dhcGNoYWluMSk7CiAgICBvayhTVUNDRUVERUQoaHIpLCAiRmFpbGVkIHRvIGNyZWF0ZSBhIHN3YXBjaGFpbiAoJXMpXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgb2soZDNkcHAuQmFja0J1ZmZlckNvdW50ID09IDEsICJUaGUgYmFjayBidWZmZXIgY291bnQgaW4gdGhlIHByZXNlbnRwYXJhbXMgc3RydWN0IGlzICVkXG4iLCBkM2RwcC5CYWNrQnVmZmVyQ291bnQpOwoKICAgIGQzZHBwLkJhY2tCdWZmZXJDb3VudCAgPSAxOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0NyZWF0ZUFkZGl0aW9uYWxTd2FwQ2hhaW4ocERldmljZSwgJmQzZHBwLCAmc3dhcGNoYWluMik7CiAgICBvayhTVUNDRUVERUQoaHIpLCAiRmFpbGVkIHRvIGNyZWF0ZSBhIHN3YXBjaGFpbiAoJXMpXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwoKICAgIGQzZHBwLkJhY2tCdWZmZXJDb3VudCAgPSAyOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0NyZWF0ZUFkZGl0aW9uYWxTd2FwQ2hhaW4ocERldmljZSwgJmQzZHBwLCAmc3dhcGNoYWluMyk7CiAgICBvayhTVUNDRUVERUQoaHIpLCAiRmFpbGVkIHRvIGNyZWF0ZSBhIHN3YXBjaGFpbiAoJXMpXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaWYoU1VDQ0VFREVEKGhyKSkgewogICAgICAgIC8qIFN3YXBjaGFpbiAzLCBjcmVhdGVkIHdpdGggYmFja2J1ZmZlcmNvdW50IDIgKi8KICAgICAgICBiYWNrYnVmZmVyID0gKHZvaWQgKikgMHhkZWFkYmVlZjsKICAgICAgICBociA9IElEaXJlY3QzRFN3YXBDaGFpbjlfR2V0QmFja0J1ZmZlcihzd2FwY2hhaW4zLCAwLCAwLCAmYmFja2J1ZmZlcik7CiAgICAgICAgb2soU1VDQ0VFREVEKGhyKSwgIkZhaWxlZCB0byBnZXQgdGhlIDFzdCBiYWNrIGJ1ZmZlciAoJXMpXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgICAgIG9rKGJhY2tidWZmZXIgIT0gTlVMTCAmJiBiYWNrYnVmZmVyICE9ICh2b2lkICopIDB4ZGVhZGJlZWYsICJUaGUgYmFjayBidWZmZXIgaXMgJXBcbiIsIGJhY2tidWZmZXIpOwogICAgICAgIGlmKGJhY2tidWZmZXIgJiYgYmFja2J1ZmZlciAhPSAodm9pZCAqKSAweGRlYWRiZWVmKSBJRGlyZWN0M0RTdXJmYWNlOV9SZWxlYXNlKGJhY2tidWZmZXIpOwoKICAgICAgICBiYWNrYnVmZmVyID0gKHZvaWQgKikgMHhkZWFkYmVlZjsKICAgICAgICBociA9IElEaXJlY3QzRFN3YXBDaGFpbjlfR2V0QmFja0J1ZmZlcihzd2FwY2hhaW4zLCAxLCAwLCAmYmFja2J1ZmZlcik7CiAgICAgICAgb2soU1VDQ0VFREVEKGhyKSwgIkZhaWxlZCB0byBnZXQgdGhlIDJuZCBiYWNrIGJ1ZmZlciAoJXMpXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgICAgIG9rKGJhY2tidWZmZXIgIT0gTlVMTCAmJiBiYWNrYnVmZmVyICE9ICh2b2lkICopIDB4ZGVhZGJlZWYsICJUaGUgYmFjayBidWZmZXIgaXMgJXBcbiIsIGJhY2tidWZmZXIpOwogICAgICAgIGlmKGJhY2tidWZmZXIgJiYgYmFja2J1ZmZlciAhPSAodm9pZCAqKSAweGRlYWRiZWVmKSBJRGlyZWN0M0RTdXJmYWNlOV9SZWxlYXNlKGJhY2tidWZmZXIpOwoKICAgICAgICBiYWNrYnVmZmVyID0gKHZvaWQgKikgMHhkZWFkYmVlZjsKICAgICAgICBociA9IElEaXJlY3QzRFN3YXBDaGFpbjlfR2V0QmFja0J1ZmZlcihzd2FwY2hhaW4zLCAyLCAwLCAmYmFja2J1ZmZlcik7CiAgICAgICAgb2soaHIgPT0gRDNERVJSX0lOVkFMSURDQUxMLCAiR2V0QmFja0J1ZmZlciByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgICAgICBvayhiYWNrYnVmZmVyID09ICh2b2lkICopIDB4ZGVhZGJlZWYsICJUaGUgYmFjayBidWZmZXIgcG9pbnRlciB3YXMgbW9kaWZpZWQgKCVwKVxuIiwgYmFja2J1ZmZlcik7CiAgICAgICAgaWYoYmFja2J1ZmZlciAmJiBiYWNrYnVmZmVyICE9ICh2b2lkICopIDB4ZGVhZGJlZWYpIElEaXJlY3QzRFN1cmZhY2U5X1JlbGVhc2UoYmFja2J1ZmZlcik7CgogICAgICAgIGJhY2tidWZmZXIgPSAodm9pZCAqKSAweGRlYWRiZWVmOwogICAgICAgIGhyID0gSURpcmVjdDNEU3dhcENoYWluOV9HZXRCYWNrQnVmZmVyKHN3YXBjaGFpbjMsIDMsIDAsICZiYWNrYnVmZmVyKTsKICAgICAgICBvayhGQUlMRUQoaHIpLCAiRmFpbGVkIHRvIGdldCB0aGUgYmFjayBidWZmZXIgKCVzKVxuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgICAgICBvayhiYWNrYnVmZmVyID09ICh2b2lkICopIDB4ZGVhZGJlZWYsICJUaGUgYmFjayBidWZmZXIgcG9pbnRlciB3YXMgbW9kaWZpZWQgKCVwKVxuIiwgYmFja2J1ZmZlcik7CiAgICAgICAgaWYoYmFja2J1ZmZlciAmJiBiYWNrYnVmZmVyICE9ICh2b2lkICopIDB4ZGVhZGJlZWYpIElEaXJlY3QzRFN1cmZhY2U5X1JlbGVhc2UoYmFja2J1ZmZlcik7CiAgICB9CgogICAgLyogQ2hlY2sgdGhlIGJhY2sgYnVmZmVycyBvZiB0aGUgc3dhcGNoYWlucyAqLwogICAgLyogU3dhcGNoYWluIDEsIGNyZWF0ZWQgd2l0aCBiYWNrYnVmZmVyY291bnQgMCAqLwogICAgaHIgPSBJRGlyZWN0M0RTd2FwQ2hhaW45X0dldEJhY2tCdWZmZXIoc3dhcGNoYWluMSwgMCwgRDNEQkFDS0JVRkZFUl9UWVBFX01PTk8sICZiYWNrYnVmZmVyKTsKICAgIG9rKFNVQ0NFRURFRChociksICJGYWlsZWQgdG8gZ2V0IHRoZSBiYWNrIGJ1ZmZlciAoJXMpXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgb2soYmFja2J1ZmZlciAhPSBOVUxMLCAiVGhlIGJhY2sgYnVmZmVyIGlzIE5VTEwgKCVzKVxuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGlmKGJhY2tidWZmZXIpIElEaXJlY3QzRFN1cmZhY2U5X1JlbGVhc2UoYmFja2J1ZmZlcik7CgogICAgYmFja2J1ZmZlciA9ICh2b2lkICopIDB4ZGVhZGJlZWY7CiAgICBociA9IElEaXJlY3QzRFN3YXBDaGFpbjlfR2V0QmFja0J1ZmZlcihzd2FwY2hhaW4xLCAxLCAwLCAmYmFja2J1ZmZlcik7CiAgICBvayhGQUlMRUQoaHIpLCAiRmFpbGVkIHRvIGdldCB0aGUgYmFjayBidWZmZXIgKCVzKVxuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIG9rKGJhY2tidWZmZXIgPT0gKHZvaWQgKikgMHhkZWFkYmVlZiwgIlRoZSBiYWNrIGJ1ZmZlciBwb2ludGVyIHdhcyBtb2RpZmllZCAoJXApXG4iLCBiYWNrYnVmZmVyKTsKICAgIGlmKGJhY2tidWZmZXIgJiYgYmFja2J1ZmZlciAhPSAodm9pZCAqKSAweGRlYWRiZWVmKSBJRGlyZWN0M0RTdXJmYWNlOV9SZWxlYXNlKGJhY2tidWZmZXIpOwoKICAgIC8qIFN3YXBjaGFpbiAyIC0gY3JlYXRlZCB3aXRoIGJhY2tidWZmZXJjb3VudCAxICovCiAgICBiYWNrYnVmZmVyID0gKHZvaWQgKikgMHhkZWFkYmVlZjsKICAgIGhyID0gSURpcmVjdDNEU3dhcENoYWluOV9HZXRCYWNrQnVmZmVyKHN3YXBjaGFpbjIsIDAsIDAsICZiYWNrYnVmZmVyKTsKICAgIG9rKFNVQ0NFRURFRChociksICJGYWlsZWQgdG8gZ2V0IHRoZSBiYWNrIGJ1ZmZlciAoJXMpXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgb2soYmFja2J1ZmZlciAhPSBOVUxMICYmIGJhY2tidWZmZXIgIT0gKHZvaWQgKikgMHhkZWFkYmVlZiwgIlRoZSBiYWNrIGJ1ZmZlciBpcyAlcFxuIiwgYmFja2J1ZmZlcik7CiAgICBpZihiYWNrYnVmZmVyICYmIGJhY2tidWZmZXIgIT0gKHZvaWQgKikgMHhkZWFkYmVlZikgSURpcmVjdDNEU3VyZmFjZTlfUmVsZWFzZShiYWNrYnVmZmVyKTsKCiAgICBiYWNrYnVmZmVyID0gKHZvaWQgKikgMHhkZWFkYmVlZjsKICAgIGhyID0gSURpcmVjdDNEU3dhcENoYWluOV9HZXRCYWNrQnVmZmVyKHN3YXBjaGFpbjIsIDEsIDAsICZiYWNrYnVmZmVyKTsKICAgIG9rKGhyID09IEQzREVSUl9JTlZBTElEQ0FMTCwgIkdldEJhY2tCdWZmZXIgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBvayhiYWNrYnVmZmVyID09ICh2b2lkICopIDB4ZGVhZGJlZWYsICJUaGUgYmFjayBidWZmZXIgcG9pbnRlciB3YXMgbW9kaWZpZWQgKCVwKVxuIiwgYmFja2J1ZmZlcik7CiAgICBpZihiYWNrYnVmZmVyICYmIGJhY2tidWZmZXIgIT0gKHZvaWQgKikgMHhkZWFkYmVlZikgSURpcmVjdDNEU3VyZmFjZTlfUmVsZWFzZShiYWNrYnVmZmVyKTsKCiAgICBiYWNrYnVmZmVyID0gKHZvaWQgKikgMHhkZWFkYmVlZjsKICAgIGhyID0gSURpcmVjdDNEU3dhcENoYWluOV9HZXRCYWNrQnVmZmVyKHN3YXBjaGFpbjIsIDIsIDAsICZiYWNrYnVmZmVyKTsKICAgIG9rKEZBSUxFRChociksICJGYWlsZWQgdG8gZ2V0IHRoZSBiYWNrIGJ1ZmZlciAoJXMpXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgb2soYmFja2J1ZmZlciA9PSAodm9pZCAqKSAweGRlYWRiZWVmLCAiVGhlIGJhY2sgYnVmZmVyIHBvaW50ZXIgd2FzIG1vZGlmaWVkICglcClcbiIsIGJhY2tidWZmZXIpOwogICAgaWYoYmFja2J1ZmZlciAmJiBiYWNrYnVmZmVyICE9ICh2b2lkICopIDB4ZGVhZGJlZWYpIElEaXJlY3QzRFN1cmZhY2U5X1JlbGVhc2UoYmFja2J1ZmZlcik7CgogICAgLyogVHJ5IGdldFN3YXBDaGFpbiBvbiBhIG1hbnVhbGx5IGNyZWF0ZWQgc3dhcGNoYWluCiAgICAgKiBpdCBzaG91bGQgZmFpbCwgYXBwYXJlbnRseSBHZXRTd2FwQ2hhaW4gb25seSByZXR1cm5zIGltcGxpY2l0IHN3YXBjaGFpbnMKICAgICAqLwogICAgc3dhcGNoYWluWCA9ICh2b2lkICopIDB4ZGVhZGJlZWY7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfR2V0U3dhcENoYWluKHBEZXZpY2UsIDEsICZzd2FwY2hhaW5YKTsKICAgIG9rKGhyID09IEQzREVSUl9JTlZBTElEQ0FMTCwgIkZhaWxlZCB0byBnZXQgdGhlIHNlY29uZCBzd2FwY2hhaW4gKCVzKVxuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIG9rKHN3YXBjaGFpblggPT0gTlVMTCwgIlRoZSBzd2FwY2hhaW4gcG9pbnRlciBpcyAlcFxuIiwgc3dhcGNoYWluWCk7CiAgICBpZihzd2FwY2hhaW5YICYmIHN3YXBjaGFpblggIT0gKHZvaWQgKikgMHhkZWFkYmVlZiApIElEaXJlY3QzRFN3YXBDaGFpbjlfUmVsZWFzZShzd2FwY2hhaW5YKTsKCiAgICBjbGVhbnVwOgogICAgaWYoc3dhcGNoYWluMSkgSURpcmVjdDNEU3dhcENoYWluOV9SZWxlYXNlKHN3YXBjaGFpbjEpOwogICAgaWYoc3dhcGNoYWluMikgSURpcmVjdDNEU3dhcENoYWluOV9SZWxlYXNlKHN3YXBjaGFpbjIpOwogICAgaWYoc3dhcGNoYWluMykgSURpcmVjdDNEU3dhcENoYWluOV9SZWxlYXNlKHN3YXBjaGFpbjMpOwogICAgaWYocERldmljZSkgSURpcmVjdDNERGV2aWNlOV9SZWxlYXNlKHBEZXZpY2UpOwogICAgaWYocEQzZCkgSURpcmVjdDNERGV2aWNlOV9SZWxlYXNlKHBEM2QpOwogICAgRGVzdHJveVdpbmRvdyggaHduZCApOwp9CgpzdGF0aWMgdm9pZCB0ZXN0X3JlZmNvdW50KHZvaWQpCnsKICAgIEhSRVNVTFQgICAgICAgICAgICAgICAgICAgICAgaHI7CiAgICBIV05EICAgICAgICAgICAgICAgICAgICAgICAgIGh3bmQgICAgICAgICAgICAgICA9IE5VTEw7CiAgICBJRGlyZWN0M0Q5ICAgICAgICAgICAgICAgICAgKnBEM2QgICAgICAgICAgICAgICA9IE5VTEw7CiAgICBJRGlyZWN0M0REZXZpY2U5ICAgICAgICAgICAgKnBEZXZpY2UgICAgICAgICAgICA9IE5VTEw7CiAgICBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI5ICAgICAgKnBWZXJ0ZXhCdWZmZXIgICAgICA9IE5VTEw7CiAgICBJRGlyZWN0M0RJbmRleEJ1ZmZlcjkgICAgICAgKnBJbmRleEJ1ZmZlciAgICAgICA9IE5VTEw7CiAgICBJRGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjkgKnBWZXJ0ZXhEZWNsYXJhdGlvbiA9IE5VTEw7CiAgICBJRGlyZWN0M0RWZXJ0ZXhTaGFkZXI5ICAgICAgKnBWZXJ0ZXhTaGFkZXIgICAgICA9IE5VTEw7CiAgICBJRGlyZWN0M0RQaXhlbFNoYWRlcjkgICAgICAgKnBQaXhlbFNoYWRlciAgICAgICA9IE5VTEw7CiAgICBJRGlyZWN0M0RDdWJlVGV4dHVyZTkgICAgICAgKnBDdWJlVGV4dHVyZSAgICAgICA9IE5VTEw7CiAgICBJRGlyZWN0M0RUZXh0dXJlOSAgICAgICAgICAgKnBUZXh0dXJlICAgICAgICAgICA9IE5VTEw7CiAgICBJRGlyZWN0M0RWb2x1bWVUZXh0dXJlOSAgICAgKnBWb2x1bWVUZXh0dXJlICAgICA9IE5VTEw7CiAgICBJRGlyZWN0M0RWb2x1bWU5ICAgICAgICAgICAgKnBWb2x1bWVMZXZlbCAgICAgICA9IE5VTEw7CiAgICBJRGlyZWN0M0RTdXJmYWNlOSAgICAgICAgICAgKnBTdGVuY2lsU3VyZmFjZSAgICA9IE5VTEw7CiAgICBJRGlyZWN0M0RTdXJmYWNlOSAgICAgICAgICAgKnBPZmZzY3JlZW5TdXJmYWNlICA9IE5VTEw7CiAgICBJRGlyZWN0M0RTdXJmYWNlOSAgICAgICAgICAgKnBSZW5kZXJUYXJnZXQgICAgICA9IE5VTEw7CiAgICBJRGlyZWN0M0RTdXJmYWNlOSAgICAgICAgICAgKnBSZW5kZXJUYXJnZXQyICAgICA9IE5VTEw7CiAgICBJRGlyZWN0M0RTdXJmYWNlOSAgICAgICAgICAgKnBSZW5kZXJUYXJnZXQzICAgICA9IE5VTEw7CiAgICBJRGlyZWN0M0RTdXJmYWNlOSAgICAgICAgICAgKnBUZXh0dXJlTGV2ZWwgICAgICA9IE5VTEw7CiAgICBJRGlyZWN0M0RTdXJmYWNlOSAgICAgICAgICAgKnBCYWNrQnVmZmVyICAgICAgICA9IE5VTEw7CiAgICBJRGlyZWN0M0RTdGF0ZUJsb2NrOSAgICAgICAgKnBTdGF0ZUJsb2NrICAgICAgICA9IE5VTEw7CiAgICBJRGlyZWN0M0RTdGF0ZUJsb2NrOSAgICAgICAgKnBTdGF0ZUJsb2NrMSAgICAgICA9IE5VTEw7CiAgICBJRGlyZWN0M0RTd2FwQ2hhaW45ICAgICAgICAgKnBTd2FwQ2hhaW4gICAgICAgICA9IE5VTEw7CiAgICBJRGlyZWN0M0RRdWVyeTkgICAgICAgICAgICAgKnBRdWVyeSAgICAgICAgICAgICA9IE5VTEw7CiAgICBEM0RQUkVTRU5UX1BBUkFNRVRFUlMgICAgICAgIGQzZHBwOwogICAgRDNERElTUExBWU1PREUgICAgICAgICAgICAgICBkM2RkbTsKICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmY291bnQgPSAwLCB0bXA7CgogICAgRDNEVkVSVEVYRUxFTUVOVDkgZGVjbFtdID0KICAgIHsKCUQzRERFQ0xfRU5EKCkKICAgIH07CiAgICBzdGF0aWMgRFdPUkQgc2ltcGxlX3ZzW10gPSB7MHhGRkZFMDEwMSwgICAgICAgICAgICAgLyogdnNfMV8xICAgICAgICAgICAgICAgKi8KICAgICAgICAweDAwMDAwMDFGLCAweDgwMDAwMDAwLCAweDkwMEYwMDAwLCAgICAgICAgICAgICAvKiBkY2xfcG9zaXRpb24wIHYwICAgICAqLwogICAgICAgIDB4MDAwMDAwMDksIDB4QzAwMTAwMDAsIDB4OTBFNDAwMDAsIDB4QTBFNDAwMDAsIC8qIGRwNCBvUG9zLngsIHYwLCBjMCAgICovCiAgICAgICAgMHgwMDAwMDAwOSwgMHhDMDAyMDAwMCwgMHg5MEU0MDAwMCwgMHhBMEU0MDAwMSwgLyogZHA0IG9Qb3MueSwgdjAsIGMxICAgKi8KICAgICAgICAweDAwMDAwMDA5LCAweEMwMDQwMDAwLCAweDkwRTQwMDAwLCAweEEwRTQwMDAyLCAvKiBkcDQgb1Bvcy56LCB2MCwgYzIgICAqLwogICAgICAgIDB4MDAwMDAwMDksIDB4QzAwODAwMDAsIDB4OTBFNDAwMDAsIDB4QTBFNDAwMDMsIC8qIGRwNCBvUG9zLncsIHYwLCBjMyAgICovCiAgICAgICAgMHgwMDAwRkZGRn07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRU5EICAgICAgICAgICAgICAgICAgKi8KICAgIHN0YXRpYyBEV09SRCBzaW1wbGVfcHNbXSA9IHsweEZGRkYwMTAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwc18xXzEgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgMHgwMDAwMDA1MSwgMHhBMDBGMDAwMSwgMHgzRjgwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgLyogZGVmIGMxID0gMS4wLCAwLjAsIDAuMCwgMC4wICAqLwogICAgICAgIDB4MDAwMDAwNDIsIDB4QjAwRjAwMDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRleCB0MCAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAweDAwMDAwMDA4LCAweDgwMEYwMDAwLCAweEEwRTQwMDAxLCAweEEwRTQwMDAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkcDMgcjAsIGMxLCBjMCAgICAgICAgICAgICAgICovCiAgICAgICAgMHgwMDAwMDAwNSwgMHg4MDBGMDAwMCwgMHg5MEU0MDAwMCwgMHg4MEU0MDAwMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogbXVsIHIwLCB2MCwgcjAgICAgICAgICAgICAgICAqLwogICAgICAgIDB4MDAwMDAwMDUsIDB4ODAwRjAwMDAsIDB4QjBFNDAwMDAsIDB4ODBFNDAwMDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG11bCByMCwgdDAsIHIwICAgICAgICAgICAgICAgKi8KICAgICAgICAweDAwMDBGRkZGfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBFTkQgICAgICAgICAgICAgICAgICAgICAgICAgICovCgoKICAgIHBEM2QgPSBwRGlyZWN0M0RDcmVhdGU5KCBEM0RfU0RLX1ZFUlNJT04gKTsKICAgIG9rKHBEM2QgIT0gTlVMTCwgIkZhaWxlZCB0byBjcmVhdGUgSURpcmVjdDNEOSBvYmplY3RcbiIpOwogICAgaHduZCA9IENyZWF0ZVdpbmRvdyggInN0YXRpYyIsICJkM2Q5X3Rlc3QiLCBXU19PVkVSTEFQUEVEV0lORE9XLCAxMDAsIDEwMCwgMTYwLCAxNjAsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwgKTsKICAgIG9rKGh3bmQgIT0gTlVMTCwgIkZhaWxlZCB0byBjcmVhdGUgd2luZG93XG4iKTsKICAgIGlmICghcEQzZCB8fCAhaHduZCkgZ290byBjbGVhbnVwOwoKICAgIElEaXJlY3QzRDlfR2V0QWRhcHRlckRpc3BsYXlNb2RlKCBwRDNkLCBEM0RBREFQVEVSX0RFRkFVTFQsICZkM2RkbSApOwogICAgWmVyb01lbW9yeSggJmQzZHBwLCBzaXplb2YoZDNkcHApICk7CiAgICBkM2RwcC5XaW5kb3dlZCAgICAgICAgID0gVFJVRTsKICAgIGQzZHBwLlN3YXBFZmZlY3QgICAgICAgPSBEM0RTV0FQRUZGRUNUX0RJU0NBUkQ7CiAgICBkM2RwcC5CYWNrQnVmZmVyRm9ybWF0ID0gZDNkZG0uRm9ybWF0OwogICAgZDNkcHAuRW5hYmxlQXV0b0RlcHRoU3RlbmNpbCA9IFRSVUU7CiAgICBkM2RwcC5BdXRvRGVwdGhTdGVuY2lsRm9ybWF0ID0gRDNERk1UX0QxNjsKCiAgICBociA9IElEaXJlY3QzRDlfQ3JlYXRlRGV2aWNlKCBwRDNkLCBEM0RBREFQVEVSX0RFRkFVTFQsIEQzRERFVlRZUEVfSEFMLCBod25kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEQ1JFQVRFX1NPRlRXQVJFX1ZFUlRFWFBST0NFU1NJTkcsICZkM2RwcCwgJnBEZXZpY2UgKTsKICAgIG9rKFNVQ0NFRURFRChociksICJGYWlsZWQgdG8gY3JlYXRlIElEaXJlY3QzRDlEZXZpY2UgKCVzKVxuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGlmIChGQUlMRUQoaHIpKSBnb3RvIGNsZWFudXA7CgogICAgcmVmY291bnQgPSBnZXRfcmVmY291bnQoIChJVW5rbm93biAqKXBEZXZpY2UgKTsKICAgIG9rKHJlZmNvdW50ID09IDEsICJJbnZhbGlkIGRldmljZSBSZWZDb3VudCAlZFxuIiwgcmVmY291bnQpOwoKICAgIC8qKgogICAgICogQ2hlY2sgcmVmY291bnQgb2YgaW1wbGljaXQgc3VyZmFjZXMgYW5kIGltcGxpY2l0IHN3YXBjaGFpbi4gRmluZGluZ3M6CiAgICAgKiAgIC0gdGhlIGNvbnRhaW5lciBpcyB0aGUgZGV2aWNlIE9SIHN3YXBjaGFpbgogICAgICogICAtIHRoZXkgaG9sZCBhIHJlZmVybmNlIHRvIHRoZSBkZXZpY2UKICAgICAqICAgLSB0aGV5IGFyZSBjcmVhdGVkIHdpdGggYSByZWZjb3VudCBvZiAwIChHZXQvUmVsZWFzZSByZXR1cm5zIG9yaWduaWFsIHJlZmNvdW50KQogICAgICogICAtIHRoZXkgYXJlIG5vdCBmcmVlZCBpZiByZWZjb3VudCByZWFjaGVzIDAuCiAgICAgKiAgIC0gdGhlIHJlZmNvdW50IGlzIG5vdCBmb3J3YXJkZWQgdG8gdGhlIGNvbnRhaW5lci4KICAgICAqLwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0dldFN3YXBDaGFpbihwRGV2aWNlLCAwLCAmcFN3YXBDaGFpbik7CiAgICBDSEVDS19DQUxMKCBociwgIkdldFN3YXBDaGFpbiIsIHBEZXZpY2UsICsrcmVmY291bnQpOwogICAgaWYgKHBTd2FwQ2hhaW4pCiAgICB7CiAgICAgICAgQ0hFQ0tfUkVGQ09VTlQoIHBTd2FwQ2hhaW4sIDEpOwoKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfR2V0UmVuZGVyVGFyZ2V0KHBEZXZpY2UsIDAsICZwUmVuZGVyVGFyZ2V0KTsKICAgICAgICBDSEVDS19DQUxMKCBociwgIkdldFJlbmRlclRhcmdldCIsIHBEZXZpY2UsICsrcmVmY291bnQpOwogICAgICAgIENIRUNLX1JFRkNPVU5UKCBwU3dhcENoYWluLCAxKTsKICAgICAgICBpZihwUmVuZGVyVGFyZ2V0KQogICAgICAgIHsKICAgICAgICAgICAgQ0hFQ0tfU1VSRkFDRV9DT05UQUlORVIoIHBSZW5kZXJUYXJnZXQsIElJRF9JRGlyZWN0M0RTd2FwQ2hhaW45LCBwU3dhcENoYWluKTsKICAgICAgICAgICAgQ0hFQ0tfUkVGQ09VTlQoIHBSZW5kZXJUYXJnZXQsIDEpOwoKICAgICAgICAgICAgQ0hFQ0tfQUREUkVGX1JFRkNPVU5UKHBSZW5kZXJUYXJnZXQsIDIpOwogICAgICAgICAgICBDSEVDS19SRUZDT1VOVChwRGV2aWNlLCByZWZjb3VudCk7CiAgICAgICAgICAgIENIRUNLX1JFTEVBU0VfUkVGQ09VTlQocFJlbmRlclRhcmdldCwgMSk7CiAgICAgICAgICAgIENIRUNLX1JFRkNPVU5UKHBEZXZpY2UsIHJlZmNvdW50KTsKCiAgICAgICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9HZXRSZW5kZXJUYXJnZXQocERldmljZSwgMCwgJnBSZW5kZXJUYXJnZXQpOwogICAgICAgICAgICBDSEVDS19DQUxMKCBociwgIkdldFJlbmRlclRhcmdldCIsIHBEZXZpY2UsIHJlZmNvdW50KTsKICAgICAgICAgICAgQ0hFQ0tfUkVGQ09VTlQoIHBSZW5kZXJUYXJnZXQsIDIpOwogICAgICAgICAgICBDSEVDS19SRUxFQVNFX1JFRkNPVU5UKCBwUmVuZGVyVGFyZ2V0LCAxKTsKICAgICAgICAgICAgQ0hFQ0tfUkVMRUFTRV9SRUZDT1VOVCggcFJlbmRlclRhcmdldCwgMCk7CiAgICAgICAgICAgIENIRUNLX1JFRkNPVU5UKCBwRGV2aWNlLCAtLXJlZmNvdW50KTsKCiAgICAgICAgICAgIC8qIFRoZSByZW5kZXIgdGFyZ2V0IGlzIHJlbGVhc2VkIHdpdGggdGhlIGRldmljZSwgc28gQWRkUmVmIHdpdGggcmVmY291bnQ9MCBpcyBmaW5lIGhlcmUuICovCiAgICAgICAgICAgIENIRUNLX0FERFJFRl9SRUZDT1VOVChwUmVuZGVyVGFyZ2V0LCAxKTsKICAgICAgICAgICAgQ0hFQ0tfUkVGQ09VTlQocERldmljZSwgKytyZWZjb3VudCk7CiAgICAgICAgICAgIENIRUNLX1JFTEVBU0VfUkVGQ09VTlQocFJlbmRlclRhcmdldCwgMCk7CiAgICAgICAgICAgIENIRUNLX1JFRkNPVU5UKHBEZXZpY2UsIC0tcmVmY291bnQpOwogICAgICAgIH0KCiAgICAgICAgLyogUmVuZGVyIHRhcmdldCBhbmQgYmFjayBidWZmZXIgYXJlIGlkZW50aWNhbC4gKi8KICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfR2V0QmFja0J1ZmZlcihwRGV2aWNlLCAwLCAwLCAwLCAmcEJhY2tCdWZmZXIpOwogICAgICAgIENIRUNLX0NBTEwoIGhyLCAiR2V0QmFja0J1ZmZlciIsIHBEZXZpY2UsICsrcmVmY291bnQpOwogICAgICAgIGlmKHBCYWNrQnVmZmVyKQogICAgICAgIHsKICAgICAgICAgICAgQ0hFQ0tfUkVMRUFTRV9SRUZDT1VOVChwQmFja0J1ZmZlciwgMCk7CiAgICAgICAgICAgIG9rKHBSZW5kZXJUYXJnZXQgPT0gcEJhY2tCdWZmZXIsICJSZW5kZXJUYXJnZXQ9JXAgYW5kIEJhY2tCdWZmZXI9JXAgc2hvdWxkIGJlIHRoZSBzYW1lLlxuIiwKICAgICAgICAgICAgcFJlbmRlclRhcmdldCwgcEJhY2tCdWZmZXIpOwogICAgICAgICAgICBwQmFja0J1ZmZlciA9IE5VTEw7CiAgICAgICAgfQogICAgICAgIENIRUNLX1JFRkNPVU5UKCBwRGV2aWNlLCAtLXJlZmNvdW50KTsKCiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0dldERlcHRoU3RlbmNpbFN1cmZhY2UocERldmljZSwgJnBTdGVuY2lsU3VyZmFjZSk7CiAgICAgICAgQ0hFQ0tfQ0FMTCggaHIsICJHZXREZXB0aFN0ZW5jaWxTdXJmYWNlIiwgcERldmljZSwgKytyZWZjb3VudCk7CiAgICAgICAgQ0hFQ0tfUkVGQ09VTlQoIHBTd2FwQ2hhaW4sIDEpOwogICAgICAgIGlmKHBTdGVuY2lsU3VyZmFjZSkKICAgICAgICB7CiAgICAgICAgICAgIENIRUNLX1NVUkZBQ0VfQ09OVEFJTkVSKCBwU3RlbmNpbFN1cmZhY2UsIElJRF9JRGlyZWN0M0REZXZpY2U5LCBwRGV2aWNlKTsKICAgICAgICAgICAgQ0hFQ0tfUkVGQ09VTlQoIHBTdGVuY2lsU3VyZmFjZSwgMSk7CgogICAgICAgICAgICBDSEVDS19BRERSRUZfUkVGQ09VTlQocFN0ZW5jaWxTdXJmYWNlLCAyKTsKICAgICAgICAgICAgQ0hFQ0tfUkVGQ09VTlQocERldmljZSwgcmVmY291bnQpOwogICAgICAgICAgICBDSEVDS19SRUxFQVNFX1JFRkNPVU5UKHBTdGVuY2lsU3VyZmFjZSwgMSk7CiAgICAgICAgICAgIENIRUNLX1JFRkNPVU5UKHBEZXZpY2UsIHJlZmNvdW50KTsKCiAgICAgICAgICAgIENIRUNLX1JFTEVBU0VfUkVGQ09VTlQoIHBTdGVuY2lsU3VyZmFjZSwgMCk7CiAgICAgICAgICAgIENIRUNLX1JFRkNPVU5UKCBwRGV2aWNlLCAtLXJlZmNvdW50KTsKCiAgICAgICAgICAgIC8qIFRoZSBzdGVuY2lsIHN1cmZhY2UgaXMgcmVsZWFzZWQgd2l0aCB0aGUgZGV2aWNlLCBzbyBBZGRSZWYgd2l0aCByZWZjb3VudD0wIGlzIGZpbmUgaGVyZS4gKi8KICAgICAgICAgICAgQ0hFQ0tfQUREUkVGX1JFRkNPVU5UKHBTdGVuY2lsU3VyZmFjZSwgMSk7CiAgICAgICAgICAgIENIRUNLX1JFRkNPVU5UKHBEZXZpY2UsICsrcmVmY291bnQpOwogICAgICAgICAgICBDSEVDS19SRUxFQVNFX1JFRkNPVU5UKHBTdGVuY2lsU3VyZmFjZSwgMCk7CiAgICAgICAgICAgIENIRUNLX1JFRkNPVU5UKHBEZXZpY2UsIC0tcmVmY291bnQpOwogICAgICAgICAgICBwU3RlbmNpbFN1cmZhY2UgPSBOVUxMOwogICAgICAgIH0KCiAgICAgICAgQ0hFQ0tfUkVMRUFTRV9SRUZDT1VOVCggcFN3YXBDaGFpbiwgMCk7CiAgICAgICAgQ0hFQ0tfUkVGQ09VTlQoIHBEZXZpY2UsIC0tcmVmY291bnQpOwoKICAgICAgICAvKiBUaGUgaW1wbGljaXQgc3dhcGNod2luIGlzIHJlbGVhc2VkIHdpdGggdGhlIGRldmljZSwgc28gQWRkUmVmIHdpdGggcmVmY291bnQ9MCBpcyBmaW5lIGhlcmUuICovCiAgICAgICAgQ0hFQ0tfQUREUkVGX1JFRkNPVU5UKHBTd2FwQ2hhaW4sIDEpOwogICAgICAgIENIRUNLX1JFRkNPVU5UKHBEZXZpY2UsICsrcmVmY291bnQpOwogICAgICAgIENIRUNLX1JFTEVBU0VfUkVGQ09VTlQocFN3YXBDaGFpbiwgMCk7CiAgICAgICAgQ0hFQ0tfUkVGQ09VTlQocERldmljZSwgLS1yZWZjb3VudCk7CiAgICAgICAgcFN3YXBDaGFpbiA9IE5VTEw7CiAgICB9CgogICAgLyogQnVmZmVycyAqLwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0NyZWF0ZUluZGV4QnVmZmVyKCBwRGV2aWNlLCAxNiwgMCwgRDNERk1UX0lOREVYMzIsIEQzRFBPT0xfREVGQVVMVCwgJnBJbmRleEJ1ZmZlciwgTlVMTCApOwogICAgQ0hFQ0tfQ0FMTCggaHIsICJDcmVhdGVJbmRleEJ1ZmZlciIsIHBEZXZpY2UsICsrcmVmY291bnQgKTsKICAgIGlmKHBJbmRleEJ1ZmZlcikKICAgIHsKICAgICAgICB0bXAgPSBnZXRfcmVmY291bnQoIChJVW5rbm93biAqKXBJbmRleEJ1ZmZlciApOwoKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0SW5kaWNlcyhwRGV2aWNlLCBwSW5kZXhCdWZmZXIpOwogICAgICAgIENIRUNLX0NBTEwoIGhyLCAiU2V0SW5kaWNlcyIsIHBJbmRleEJ1ZmZlciwgdG1wKTsKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0SW5kaWNlcyhwRGV2aWNlLCBOVUxMKTsKICAgICAgICBDSEVDS19DQUxMKCBociwgIlNldEluZGljZXMiLCBwSW5kZXhCdWZmZXIsIHRtcCk7CiAgICB9CgogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0NyZWF0ZVZlcnRleEJ1ZmZlciggcERldmljZSwgMTYsIDAsIEQzREZWRl9YWVosIEQzRFBPT0xfREVGQVVMVCwgJnBWZXJ0ZXhCdWZmZXIsIE5VTEwgKTsKICAgIENIRUNLX0NBTEwoIGhyLCAiQ3JlYXRlVmVydGV4QnVmZmVyIiwgcERldmljZSwgKytyZWZjb3VudCApOwogICAgaWYocFZlcnRleEJ1ZmZlcikKICAgIHsKICAgICAgICBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI5ICpwVkJ1ZiA9ICh2b2lkKil+MDsKICAgICAgICBVSU5UIG9mZnNldCA9IH4wOwogICAgICAgIFVJTlQgc3RyaWRlID0gfjA7CgogICAgICAgIHRtcCA9IGdldF9yZWZjb3VudCggKElVbmtub3duICopcFZlcnRleEJ1ZmZlciApOwoKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0U3RyZWFtU291cmNlKHBEZXZpY2UsIDAsIHBWZXJ0ZXhCdWZmZXIsIDAsIDMgKiBzaXplb2YoZmxvYXQpKTsKICAgICAgICBDSEVDS19DQUxMKCBociwgIlNldFN0cmVhbVNvdXJjZSIsIHBWZXJ0ZXhCdWZmZXIsIHRtcCk7CiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFN0cmVhbVNvdXJjZShwRGV2aWNlLCAwLCBOVUxMLCAwLCAwKTsKICAgICAgICBDSEVDS19DQUxMKCBociwgIlNldFN0cmVhbVNvdXJjZSIsIHBWZXJ0ZXhCdWZmZXIsIHRtcCk7CgogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9HZXRTdHJlYW1Tb3VyY2UocERldmljZSwgMCwgJnBWQnVmLCAmb2Zmc2V0LCAmc3RyaWRlKTsKICAgICAgICBvayhTVUNDRUVERUQoaHIpLCAiR2V0U3RyZWFtU291cmNlIGRpZCBub3Qgc3VjY2VlZCB3aXRoIE5VTEwgc3RyZWFtIVxuIik7CiAgICAgICAgb2socFZCdWY9PU5VTEwsICJwVkJ1ZiBub3QgTlVMTCAoJXApIVxuIiwgcFZCdWYpOwogICAgICAgIG9rKHN0cmlkZT09MypzaXplb2YoZmxvYXQpLCAic3RyaWRlIG5vdCAzIGZsb2F0cyAoZ290ICV1KSFcbiIsIHN0cmlkZSk7CiAgICAgICAgb2sob2Zmc2V0PT0wLCAib2Zmc2V0IG5vdCAwIChnb3QgJXUpIVxuIiwgb2Zmc2V0KTsKICAgIH0KICAgIC8qIFNoYWRlcnMgKi8KICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9DcmVhdGVWZXJ0ZXhEZWNsYXJhdGlvbiggcERldmljZSwgZGVjbCwgJnBWZXJ0ZXhEZWNsYXJhdGlvbiApOwogICAgQ0hFQ0tfQ0FMTCggaHIsICJDcmVhdGVWZXJ0ZXhEZWNsYXJhdGlvbiIsIHBEZXZpY2UsICsrcmVmY291bnQgKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9DcmVhdGVWZXJ0ZXhTaGFkZXIoIHBEZXZpY2UsIHNpbXBsZV92cywgJnBWZXJ0ZXhTaGFkZXIgKTsKICAgIENIRUNLX0NBTEwoIGhyLCAiQ3JlYXRlVmVydGV4U2hhZGVyIiwgcERldmljZSwgKytyZWZjb3VudCApOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0NyZWF0ZVBpeGVsU2hhZGVyKCBwRGV2aWNlLCBzaW1wbGVfcHMsICZwUGl4ZWxTaGFkZXIgKTsKICAgIENIRUNLX0NBTEwoIGhyLCAiQ3JlYXRlUGl4ZWxTaGFkZXIiLCBwRGV2aWNlLCArK3JlZmNvdW50ICk7CiAgICAvKiBUZXh0dXJlcyAqLwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0NyZWF0ZVRleHR1cmUoIHBEZXZpY2UsIDMyLCAzMiwgMywgMCwgRDNERk1UX1g4UjhHOEI4LCBEM0RQT09MX0RFRkFVTFQsICZwVGV4dHVyZSwgTlVMTCApOwogICAgQ0hFQ0tfQ0FMTCggaHIsICJDcmVhdGVUZXh0dXJlIiwgcERldmljZSwgKytyZWZjb3VudCApOwogICAgaWYgKHBUZXh0dXJlKQogICAgewogICAgICAgIHRtcCA9IGdldF9yZWZjb3VudCggKElVbmtub3duICopcFRleHR1cmUgKTsKCiAgICAgICAgLyogU2V0VGV4dHVyZSBzaG91bGQgbm90IGluY3JlYXNlIHJlZmNvdW50cyAqLwogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRUZXh0dXJlKHBEZXZpY2UsIDAsIChJRGlyZWN0M0RCYXNlVGV4dHVyZTkgKikgcFRleHR1cmUpOwogICAgICAgIENIRUNLX0NBTEwoIGhyLCAiU2V0VGV4dHVyZSIsIHBUZXh0dXJlLCB0bXApOwogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRUZXh0dXJlKHBEZXZpY2UsIDAsIE5VTEwpOwogICAgICAgIENIRUNLX0NBTEwoIGhyLCAiU2V0VGV4dHVyZSIsIHBUZXh0dXJlLCB0bXApOwoKICAgICAgICAvKiBUaGlzIHNob3VsZCBub3QgaW5jcmVtZW50IGRldmljZSByZWZjb3VudCAqLwogICAgICAgIGhyID0gSURpcmVjdDNEVGV4dHVyZTlfR2V0U3VyZmFjZUxldmVsKCBwVGV4dHVyZSwgMSwgJnBUZXh0dXJlTGV2ZWwgKTsKICAgICAgICBDSEVDS19DQUxMKCBociwgIkdldFN1cmZhY2VMZXZlbCIsIHBEZXZpY2UsIHJlZmNvdW50ICk7CiAgICAgICAgLyogQnV0IHNob3VsZCBpbmNyZW1lbnQgdGV4dHVyZSdzIHJlZmNvdW50ICovCiAgICAgICAgQ0hFQ0tfUkVGQ09VTlQoIHBUZXh0dXJlLCB0bXArMSApOwogICAgICAgIC8qIEJlY2F1c2UgdGhlIHRleHR1cmUgYW5kIHN1cmZhY2UgcmVmY291bnQgYXJlIGlkZW50aWNhbCAqLwogICAgICAgIGlmIChwVGV4dHVyZUxldmVsKQogICAgICAgIHsKICAgICAgICAgICAgQ0hFQ0tfUkVGQ09VTlQgICAgICAgICggcFRleHR1cmVMZXZlbCwgdG1wKzEgKTsKICAgICAgICAgICAgQ0hFQ0tfQUREUkVGX1JFRkNPVU5UICggcFRleHR1cmVMZXZlbCwgdG1wKzIgKTsKICAgICAgICAgICAgQ0hFQ0tfUkVGQ09VTlQgICAgICAgICggcFRleHR1cmUgICAgICwgdG1wKzIgKTsKICAgICAgICAgICAgQ0hFQ0tfUkVMRUFTRV9SRUZDT1VOVCggcFRleHR1cmVMZXZlbCwgdG1wKzEgKTsKICAgICAgICAgICAgQ0hFQ0tfUkVGQ09VTlQgICAgICAgICggcFRleHR1cmUgICAgICwgdG1wKzEgKTsKICAgICAgICAgICAgQ0hFQ0tfUkVMRUFTRV9SRUZDT1VOVCggcFRleHR1cmUgICAgICwgdG1wICAgKTsKICAgICAgICAgICAgQ0hFQ0tfUkVGQ09VTlQgICAgICAgICggcFRleHR1cmVMZXZlbCwgdG1wICAgKTsKICAgICAgICB9CiAgICB9CiAgICBociA9IElEaXJlY3QzRERldmljZTlfQ3JlYXRlQ3ViZVRleHR1cmUoIHBEZXZpY2UsIDMyLCAwLCAwLCBEM0RGTVRfWDhSOEc4QjgsIEQzRFBPT0xfREVGQVVMVCwgJnBDdWJlVGV4dHVyZSwgTlVMTCApOwogICAgQ0hFQ0tfQ0FMTCggaHIsICJDcmVhdGVDdWJlVGV4dHVyZSIsIHBEZXZpY2UsICsrcmVmY291bnQgKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9DcmVhdGVWb2x1bWVUZXh0dXJlKCBwRGV2aWNlLCAzMiwgMzIsIDIsIDAsIDAsIEQzREZNVF9YOFI4RzhCOCwgRDNEUE9PTF9ERUZBVUxULCAmcFZvbHVtZVRleHR1cmUsIE5VTEwgKTsKICAgIENIRUNLX0NBTEwoIGhyLCAiQ3JlYXRlVm9sdW1lVGV4dHVyZSIsIHBEZXZpY2UsICsrcmVmY291bnQgKTsKICAgIGlmIChwVm9sdW1lVGV4dHVyZSkKICAgIHsKICAgICAgICB0bXAgPSBnZXRfcmVmY291bnQoIChJVW5rbm93biAqKXBWb2x1bWVUZXh0dXJlICk7CgogICAgICAgIC8qIFRoaXMgc2hvdWxkIG5vdCBpbmNyZW1lbnQgZGV2aWNlIHJlZmNvdW50ICovCiAgICAgICAgaHIgPSBJRGlyZWN0M0RWb2x1bWVUZXh0dXJlOV9HZXRWb2x1bWVMZXZlbChwVm9sdW1lVGV4dHVyZSwgMCwgJnBWb2x1bWVMZXZlbCk7CiAgICAgICAgQ0hFQ0tfQ0FMTCggaHIsICJHZXRWb2x1bWVMZXZlbCIsIHBEZXZpY2UsIHJlZmNvdW50ICk7CiAgICAgICAgLyogQnV0IHNob3VsZCBpbmNyZW1lbnQgdm9sdW1lIHRleHR1cmUncyByZWZjb3VudCAqLwogICAgICAgIENIRUNLX1JFRkNPVU5UKCBwVm9sdW1lVGV4dHVyZSwgdG1wKzEgKTsKICAgICAgICAvKiBCZWNhdXNlIHRoZSB2b2x1bWUgdGV4dHVyZSBhbmQgdm9sdW1lIHJlZmNvdW50IGFyZSBpZGVudGljYWwgKi8KICAgICAgICBpZiAocFZvbHVtZUxldmVsKQogICAgICAgIHsKICAgICAgICAgICAgQ0hFQ0tfUkVGQ09VTlQgICAgICAgICggcFZvbHVtZUxldmVsICAsIHRtcCsxICk7CiAgICAgICAgICAgIENIRUNLX0FERFJFRl9SRUZDT1VOVCAoIHBWb2x1bWVMZXZlbCAgLCB0bXArMiApOwogICAgICAgICAgICBDSEVDS19SRUZDT1VOVCAgICAgICAgKCBwVm9sdW1lVGV4dHVyZSwgdG1wKzIgKTsKICAgICAgICAgICAgQ0hFQ0tfUkVMRUFTRV9SRUZDT1VOVCggcFZvbHVtZUxldmVsICAsIHRtcCsxICk7CiAgICAgICAgICAgIENIRUNLX1JFRkNPVU5UICAgICAgICAoIHBWb2x1bWVUZXh0dXJlLCB0bXArMSApOwogICAgICAgICAgICBDSEVDS19SRUxFQVNFX1JFRkNPVU5UKCBwVm9sdW1lVGV4dHVyZSwgdG1wICAgKTsKICAgICAgICAgICAgQ0hFQ0tfUkVGQ09VTlQgICAgICAgICggcFZvbHVtZUxldmVsICAsIHRtcCAgICk7CiAgICAgICAgfQogICAgfQogICAgLyogU3VyZmFjZXMgKi8KICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9DcmVhdGVEZXB0aFN0ZW5jaWxTdXJmYWNlKCBwRGV2aWNlLCAzMiwgMzIsIEQzREZNVF9EMjRTOCwgRDNETVVMVElTQU1QTEVfTk9ORSwgMCwgVFJVRSwgJnBTdGVuY2lsU3VyZmFjZSwgTlVMTCApOwogICAgQ0hFQ0tfQ0FMTCggaHIsICJDcmVhdGVEZXB0aFN0ZW5jaWxTdXJmYWNlIiwgcERldmljZSwgKytyZWZjb3VudCApOwogICAgQ0hFQ0tfUkVGQ09VTlQoIHBTdGVuY2lsU3VyZmFjZSwgMSApOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0NyZWF0ZU9mZnNjcmVlblBsYWluU3VyZmFjZSggcERldmljZSwgMzIsIDMyLCBEM0RGTVRfWDhSOEc4QjgsIEQzRFBPT0xfREVGQVVMVCwgJnBPZmZzY3JlZW5TdXJmYWNlLCBOVUxMICk7CiAgICBDSEVDS19DQUxMKCBociwgIkNyZWF0ZU9mZnNjcmVlblBsYWluU3VyZmFjZSIsIHBEZXZpY2UsICsrcmVmY291bnQgKTsKICAgIENIRUNLX1JFRkNPVU5UKCBwT2Zmc2NyZWVuU3VyZmFjZSwgMSApOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0NyZWF0ZVJlbmRlclRhcmdldCggcERldmljZSwgMzIsIDMyLCBEM0RGTVRfWDhSOEc4QjgsIEQzRE1VTFRJU0FNUExFX05PTkUsIDAsIFRSVUUsICZwUmVuZGVyVGFyZ2V0MywgTlVMTCApOwogICAgQ0hFQ0tfQ0FMTCggaHIsICJDcmVhdGVSZW5kZXJUYXJnZXQiLCBwRGV2aWNlLCArK3JlZmNvdW50ICk7CiAgICBDSEVDS19SRUZDT1VOVCggcFJlbmRlclRhcmdldDMsIDEgKTsKICAgIC8qIE1pc2MgKi8KICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9DcmVhdGVTdGF0ZUJsb2NrKCBwRGV2aWNlLCBEM0RTQlRfQUxMLCAmcFN0YXRlQmxvY2sgKTsKICAgIENIRUNLX0NBTEwoIGhyLCAiQ3JlYXRlU3RhdGVCbG9jayIsIHBEZXZpY2UsICsrcmVmY291bnQgKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9DcmVhdGVBZGRpdGlvbmFsU3dhcENoYWluKCBwRGV2aWNlLCAmZDNkcHAsICZwU3dhcENoYWluICk7CiAgICBDSEVDS19DQUxMKCBociwgIkNyZWF0ZUFkZGl0aW9uYWxTd2FwQ2hhaW4iLCBwRGV2aWNlLCArK3JlZmNvdW50ICk7CiAgICBpZihwU3dhcENoYWluKQogICAgewogICAgICAgIC8qIGNoZWNrIGltcGxpY2l0IGJhY2sgYnVmZmVyICovCiAgICAgICAgaHIgPSBJRGlyZWN0M0RTd2FwQ2hhaW45X0dldEJhY2tCdWZmZXIocFN3YXBDaGFpbiwgMCwgMCwgJnBCYWNrQnVmZmVyKTsKICAgICAgICBDSEVDS19DQUxMKCBociwgIkdldEJhY2tCdWZmZXIiLCBwRGV2aWNlLCArK3JlZmNvdW50KTsKICAgICAgICBDSEVDS19SRUZDT1VOVCggcFN3YXBDaGFpbiwgMSk7CiAgICAgICAgaWYocEJhY2tCdWZmZXIpCiAgICAgICAgewogICAgICAgICAgICBDSEVDS19TVVJGQUNFX0NPTlRBSU5FUiggcEJhY2tCdWZmZXIsIElJRF9JRGlyZWN0M0RTd2FwQ2hhaW45LCBwU3dhcENoYWluKTsKICAgICAgICAgICAgQ0hFQ0tfUkVGQ09VTlQoIHBCYWNrQnVmZmVyLCAxKTsKICAgICAgICAgICAgQ0hFQ0tfUkVMRUFTRV9SRUZDT1VOVCggcEJhY2tCdWZmZXIsIDApOwogICAgICAgICAgICBDSEVDS19SRUZDT1VOVCggcERldmljZSwgLS1yZWZjb3VudCk7CgogICAgICAgICAgICAvKiBUaGUgYmFjayBidWZmZXIgaXMgcmVsZWFzZWQgd2l0aCB0aGUgc3dhcGNoYWluLCBzbyBBZGRSZWYgd2l0aCByZWZjb3VudD0wIGlzIGZpbmUgaGVyZS4gKi8KICAgICAgICAgICAgQ0hFQ0tfQUREUkVGX1JFRkNPVU5UKHBCYWNrQnVmZmVyLCAxKTsKICAgICAgICAgICAgQ0hFQ0tfUkVGQ09VTlQocERldmljZSwgKytyZWZjb3VudCk7CiAgICAgICAgICAgIENIRUNLX1JFTEVBU0VfUkVGQ09VTlQocEJhY2tCdWZmZXIsIDApOwogICAgICAgICAgICBDSEVDS19SRUZDT1VOVChwRGV2aWNlLCAtLXJlZmNvdW50KTsKICAgICAgICAgICAgcEJhY2tCdWZmZXIgPSBOVUxMOwogICAgICAgIH0KICAgICAgICBDSEVDS19SRUZDT1VOVCggcFN3YXBDaGFpbiwgMSk7CiAgICB9CiAgICBociA9IElEaXJlY3QzRERldmljZTlfQ3JlYXRlUXVlcnkoIHBEZXZpY2UsIEQzRFFVRVJZVFlQRV9FVkVOVCwgJnBRdWVyeSApOwogICAgQ0hFQ0tfQ0FMTCggaHIsICJDcmVhdGVRdWVyeSIsIHBEZXZpY2UsICsrcmVmY291bnQgKTsKCiAgICBociA9IElEaXJlY3QzRERldmljZTlfQmVnaW5TdGF0ZUJsb2NrKCBwRGV2aWNlICk7CiAgICBDSEVDS19DQUxMKCBociwgIkJlZ2luU3RhdGVCbG9jayIsIHBEZXZpY2UsIHJlZmNvdW50ICk7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfRW5kU3RhdGVCbG9jayggcERldmljZSwgJnBTdGF0ZUJsb2NrMSApOwogICAgQ0hFQ0tfQ0FMTCggaHIsICJFbmRTdGF0ZUJsb2NrIiwgcERldmljZSwgKytyZWZjb3VudCApOwoKICAgIC8qIFRoZSBpbXBsaWNpdCByZW5kZXIgdGFyZ2V0IGlzIG5vdCBmcmVlZCBpZiByZWZjb3VudCByZWFjaGVzIDAuCiAgICAgKiBPdGhlcndpc2UgR2V0UmVuZGVyVGFyZ2V0IHdvdWxkIHJlLWFsbG9jYXRlIGl0IGFuZCB0aGUgcG9pbnRlciB3b3VsZCBjaGFuZ2UuKi8KICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9HZXRSZW5kZXJUYXJnZXQocERldmljZSwgMCwgJnBSZW5kZXJUYXJnZXQyKTsKICAgIENIRUNLX0NBTEwoIGhyLCAiR2V0UmVuZGVyVGFyZ2V0IiwgcERldmljZSwgKytyZWZjb3VudCk7CiAgICBpZihwUmVuZGVyVGFyZ2V0MikKICAgIHsKICAgICAgICBDSEVDS19SRUxFQVNFX1JFRkNPVU5UKHBSZW5kZXJUYXJnZXQyLCAwKTsKICAgICAgICBvayhwUmVuZGVyVGFyZ2V0ID09IHBSZW5kZXJUYXJnZXQyLCAiUmVuZGVyVGFyZ2V0PSVwIGFuZCBSZW5kZXJUYXJnZXQyPSVwIHNob3VsZCBiZSB0aGUgc2FtZS5cbiIsCiAgICAgICAgICAgcFJlbmRlclRhcmdldCwgcFJlbmRlclRhcmdldDIpOwogICAgICAgIENIRUNLX1JFRkNPVU5UKCBwRGV2aWNlLCAtLXJlZmNvdW50KTsKICAgICAgICBwUmVuZGVyVGFyZ2V0MiA9IE5VTEw7CiAgICB9CiAgICBwUmVuZGVyVGFyZ2V0ID0gTlVMTDsKCmNsZWFudXA6CiAgICBDSEVDS19SRUxFQVNFKHBEZXZpY2UsICAgICAgICAgICAgICBwRGV2aWNlLCAtLXJlZmNvdW50KTsKCiAgICAvKiBCdWZmZXJzICovCiAgICBDSEVDS19SRUxFQVNFKHBWZXJ0ZXhCdWZmZXIsICAgICAgICBwRGV2aWNlLCAtLXJlZmNvdW50KTsKICAgIENIRUNLX1JFTEVBU0UocEluZGV4QnVmZmVyLCAgICAgICAgIHBEZXZpY2UsIC0tcmVmY291bnQpOwogICAgLyogU2hhZGVycyAqLwogICAgQ0hFQ0tfUkVMRUFTRShwVmVydGV4RGVjbGFyYXRpb24sICAgcERldmljZSwgLS1yZWZjb3VudCk7CiAgICBDSEVDS19SRUxFQVNFKHBWZXJ0ZXhTaGFkZXIsICAgICAgICBwRGV2aWNlLCAtLXJlZmNvdW50KTsKICAgIENIRUNLX1JFTEVBU0UocFBpeGVsU2hhZGVyLCAgICAgICAgIHBEZXZpY2UsIC0tcmVmY291bnQpOwogICAgLyogVGV4dHVyZXMgKi8KICAgIENIRUNLX1JFTEVBU0UocFRleHR1cmVMZXZlbCwgICAgICAgIHBEZXZpY2UsIC0tcmVmY291bnQpOwogICAgQ0hFQ0tfUkVMRUFTRShwQ3ViZVRleHR1cmUsICAgICAgICAgcERldmljZSwgLS1yZWZjb3VudCk7CiAgICBDSEVDS19SRUxFQVNFKHBWb2x1bWVUZXh0dXJlLCAgICAgICBwRGV2aWNlLCAtLXJlZmNvdW50KTsKICAgIC8qIFN1cmZhY2VzICovCiAgICBDSEVDS19SRUxFQVNFKHBTdGVuY2lsU3VyZmFjZSwgICAgICBwRGV2aWNlLCAtLXJlZmNvdW50KTsKICAgIENIRUNLX1JFTEVBU0UocE9mZnNjcmVlblN1cmZhY2UsICAgIHBEZXZpY2UsIC0tcmVmY291bnQpOwogICAgQ0hFQ0tfUkVMRUFTRShwUmVuZGVyVGFyZ2V0MywgICAgICAgcERldmljZSwgLS1yZWZjb3VudCk7CiAgICAvKiBNaXNjICovCiAgICBDSEVDS19SRUxFQVNFKHBTdGF0ZUJsb2NrLCAgICAgICAgICBwRGV2aWNlLCAtLXJlZmNvdW50KTsKICAgIENIRUNLX1JFTEVBU0UocFN3YXBDaGFpbiwgICAgICAgICAgIHBEZXZpY2UsIC0tcmVmY291bnQpOwogICAgQ0hFQ0tfUkVMRUFTRShwUXVlcnksICAgICAgICAgICAgICAgcERldmljZSwgLS1yZWZjb3VudCk7CiAgICAvKiBUaGlzIHdpbGwgZGVzdHJveSBkZXZpY2UgLSBjYW5ub3QgY2hlY2sgdGhlIHJlZmNvdW50IGhlcmUgKi8KICAgIGlmIChwU3RhdGVCbG9jazEpICAgICAgICAgQ0hFQ0tfUkVMRUFTRV9SRUZDT1VOVCggcFN0YXRlQmxvY2sxLCAwKTsKCiAgICBpZiAocEQzZCkgICAgICAgICAgICAgICAgIENIRUNLX1JFTEVBU0VfUkVGQ09VTlQoIHBEM2QsIDApOwoKICAgIERlc3Ryb3lXaW5kb3coIGh3bmQgKTsKfQoKc3RhdGljIHZvaWQgdGVzdF9jdXJzb3Iodm9pZCkKewogICAgSFJFU1VMVCAgICAgICAgICAgICAgICAgICAgICBocjsKICAgIEhXTkQgICAgICAgICAgICAgICAgICAgICAgICAgaHduZCAgICAgICAgICAgICAgID0gTlVMTDsKICAgIElEaXJlY3QzRDkgICAgICAgICAgICAgICAgICAqcEQzZCAgICAgICAgICAgICAgID0gTlVMTDsKICAgIElEaXJlY3QzRERldmljZTkgICAgICAgICAgICAqcERldmljZSAgICAgICAgICAgID0gTlVMTDsKICAgIEQzRFBSRVNFTlRfUEFSQU1FVEVSUyAgICAgICAgZDNkcHA7CiAgICBEM0RESVNQTEFZTU9ERSAgICAgICAgICAgICAgIGQzZGRtOwogICAgQ1VSU09SSU5GTyAgICAgICAgICAgICAgICAgICBpbmZvOwogICAgSURpcmVjdDNEU3VyZmFjZTkgKmN1cnNvciA9IE5VTEw7CiAgICBIQ1VSU09SIGN1cjsKCiAgICBtZW1zZXQoJmluZm8sIDAsIHNpemVvZihpbmZvKSk7CiAgICBpbmZvLmNiU2l6ZSA9IHNpemVvZihpbmZvKTsKICAgIGhyID0gR2V0Q3Vyc29ySW5mbygmaW5mbyk7CiAgICBjdXIgPSBpbmZvLmhDdXJzb3I7CgogICAgcEQzZCA9IHBEaXJlY3QzRENyZWF0ZTkoIEQzRF9TREtfVkVSU0lPTiApOwogICAgb2socEQzZCAhPSBOVUxMLCAiRmFpbGVkIHRvIGNyZWF0ZSBJRGlyZWN0M0Q5IG9iamVjdFxuIik7CiAgICBod25kID0gQ3JlYXRlV2luZG93KCAic3RhdGljIiwgImQzZDlfdGVzdCIsIFdTX09WRVJMQVBQRURXSU5ET1csIDEwMCwgMTAwLCAxNjAsIDE2MCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCApOwogICAgb2soaHduZCAhPSBOVUxMLCAiRmFpbGVkIHRvIGNyZWF0ZSB3aW5kb3dcbiIpOwogICAgaWYgKCFwRDNkIHx8ICFod25kKSBnb3RvIGNsZWFudXA7CgogICAgSURpcmVjdDNEOV9HZXRBZGFwdGVyRGlzcGxheU1vZGUoIHBEM2QsIEQzREFEQVBURVJfREVGQVVMVCwgJmQzZGRtICk7CiAgICBaZXJvTWVtb3J5KCAmZDNkcHAsIHNpemVvZihkM2RwcCkgKTsKICAgIGQzZHBwLldpbmRvd2VkICAgICAgICAgPSBUUlVFOwogICAgZDNkcHAuU3dhcEVmZmVjdCAgICAgICA9IEQzRFNXQVBFRkZFQ1RfRElTQ0FSRDsKICAgIGQzZHBwLkJhY2tCdWZmZXJGb3JtYXQgPSBkM2RkbS5Gb3JtYXQ7CgogICAgaHIgPSBJRGlyZWN0M0Q5X0NyZWF0ZURldmljZSggcEQzZCwgRDNEQURBUFRFUl9ERUZBVUxULCBEM0RERVZUWVBFX0hBTCwgaHduZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRENSRUFURV9TT0ZUV0FSRV9WRVJURVhQUk9DRVNTSU5HLCAmZDNkcHAsICZwRGV2aWNlICk7CiAgICBvayhTVUNDRUVERUQoaHIpLCAiRmFpbGVkIHRvIGNyZWF0ZSBJRGlyZWN0M0Q5RGV2aWNlICglcylcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBpZiAoRkFJTEVEKGhyKSkgZ290byBjbGVhbnVwOwoKICAgIElEaXJlY3QzRERldmljZTlfQ3JlYXRlT2Zmc2NyZWVuUGxhaW5TdXJmYWNlKHBEZXZpY2UsIDMyLCAzMiwgRDNERk1UX0E4UjhHOEI4LCBEM0RQT09MX1NDUkFUQ0gsICZjdXJzb3IsIDApOwogICAgb2soY3Vyc29yICE9IE5VTEwsICJJRGlyZWN0M0REZXZpY2U5X0NyZWF0ZU9mZnNjcmVlblBsYWluU3VyZmFjZSBmYWlsZWQgd2l0aCAlMDh4XG4iLCBocik7CgogICAgLyogSW5pdGlhbGx5IGhpZGRlbiAqLwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1Nob3dDdXJzb3IocERldmljZSwgVFJVRSk7CiAgICBvayhociA9PSBGQUxTRSwgIklEaXJlY3QzRERldmljZTlfU2hvd0N1cnNvciByZXR1cm5lZCAlMDh4XG4iLCBocik7CgogICAgLyogTm90IGVuYWJsZWQgd2l0aG91dCBhIHN1cmZhY2UqLwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1Nob3dDdXJzb3IocERldmljZSwgVFJVRSk7CiAgICBvayhociA9PSBGQUxTRSwgIklEaXJlY3QzRERldmljZTlfU2hvd0N1cnNvciByZXR1cm5lZCAlMDh4XG4iLCBocik7CgogICAgLyogRmFpbHMgKi8KICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRDdXJzb3JQcm9wZXJ0aWVzKHBEZXZpY2UsIDAsIDAsIE5VTEwpOwogICAgb2soaHIgPT0gRDNERVJSX0lOVkFMSURDQUxMLCAiSURpcmVjdDNERGV2aWNlOV9TZXRDdXJzb3JQcm9wZXJ0aWVzIHJldHVybmVkICUwOHhcbiIsIGhyKTsKCiAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0Q3Vyc29yUHJvcGVydGllcyhwRGV2aWNlLCAwLCAwLCBjdXJzb3IpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRDdXJzb3JQcm9wZXJ0aWVzIHJldHVybmVkICUwOHhcbiIsIGhyKTsKCiAgICBJRGlyZWN0M0RTdXJmYWNlOV9SZWxlYXNlKGN1cnNvcik7CgogICAgbWVtc2V0KCZpbmZvLCAwLCBzaXplb2YoaW5mbykpOwogICAgaW5mby5jYlNpemUgPSBzaXplb2YoaW5mbyk7CiAgICBociA9IEdldEN1cnNvckluZm8oJmluZm8pOwogICAgb2soaHIgIT0gMCwgIkdldEN1cnNvckluZm8gcmV0dXJuZWQgJTA4eFxuIiwgaHIpOwogICAgb2soaW5mby5mbGFncyAmIENVUlNPUl9TSE9XSU5HLCAiVGhlIGdkaSBjdXJzb3IgaXMgaGlkZGVuICglMDh4KVxuIiwgaW5mby5mbGFncyk7CiAgICBvayhpbmZvLmhDdXJzb3IgPT0gY3VyLCAiVGhlIGN1cnNvciBoYW5kbGUgaXMgJXBcbiIsIGluZm8uaEN1cnNvcik7IC8qIHVuY2hhbmdlZCAqLwoKICAgIC8qIFN0aWxsIGhpZGRlbiAqLwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1Nob3dDdXJzb3IocERldmljZSwgVFJVRSk7CiAgICBvayhociA9PSBGQUxTRSwgIklEaXJlY3QzRERldmljZTlfU2hvd0N1cnNvciByZXR1cm5lZCAlMDh4XG4iLCBocik7CgogICAgLyogRW5hYmxlZCBub3cqLwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1Nob3dDdXJzb3IocERldmljZSwgVFJVRSk7CiAgICBvayhociA9PSBUUlVFLCAiSURpcmVjdDNERGV2aWNlOV9TaG93Q3Vyc29yIHJldHVybmVkICUwOHhcbiIsIGhyKTsKCiAgICAvKiBHREkgY3Vyc29yIHVuY2hhbmdlZCAqLwogICAgbWVtc2V0KCZpbmZvLCAwLCBzaXplb2YoaW5mbykpOwogICAgaW5mby5jYlNpemUgPSBzaXplb2YoaW5mbyk7CiAgICBociA9IEdldEN1cnNvckluZm8oJmluZm8pOwogICAgb2soaHIgIT0gMCwgIkdldEN1cnNvckluZm8gcmV0dXJuZWQgJTA4eFxuIiwgaHIpOwogICAgb2soaW5mby5mbGFncyAmIENVUlNPUl9TSE9XSU5HLCAiVGhlIGdkaSBjdXJzb3IgaXMgaGlkZGVuICglMDh4KVxuIiwgaW5mby5mbGFncyk7CiAgICBvayhpbmZvLmhDdXJzb3IgPT0gY3VyLCAiVGhlIGN1cnNvciBoYW5kbGUgaXMgJXBcbiIsIGluZm8uaEN1cnNvcik7IC8qIHVuY2hhbmdlZCAqLwoKY2xlYW51cDoKICAgIGlmKHBEZXZpY2UpIElEaXJlY3QzRDlfUmVsZWFzZShwRGV2aWNlKTsKICAgIGlmKHBEM2QpIElEaXJlY3QzRDlfUmVsZWFzZShwRDNkKTsKICAgIERlc3Ryb3lXaW5kb3coIGh3bmQgKTsKfQoKc3RhdGljIHZvaWQgdGVzdF9yZXNldCh2b2lkKQp7CiAgICBIUkVTVUxUICAgICAgICAgICAgICAgICAgICAgIGhyOwogICAgSFdORCAgICAgICAgICAgICAgICAgICAgICAgICBod25kICAgICAgICAgICAgICAgPSBOVUxMOwogICAgSURpcmVjdDNEOSAgICAgICAgICAgICAgICAgICpwRDNkICAgICAgICAgICAgICAgPSBOVUxMOwogICAgSURpcmVjdDNERGV2aWNlOSAgICAgICAgICAgICpwRGV2aWNlICAgICAgICAgICAgPSBOVUxMOwogICAgRDNEUFJFU0VOVF9QQVJBTUVURVJTICAgICAgICBkM2RwcDsKICAgIEQzRERJU1BMQVlNT0RFICAgICAgICAgICAgICAgZDNkZG07CiAgICBEM0RWSUVXUE9SVDkgICAgICAgICAgICAgICAgIHZwOwogICAgRFdPUkQgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgb3JpZ193aWR0aCA9IEdldFN5c3RlbU1ldHJpY3MoU01fQ1hTQ1JFRU4pOwogICAgRFdPUkQgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQsIG9yaWdfaGVpZ2h0ID0gR2V0U3lzdGVtTWV0cmljcyhTTV9DWVNDUkVFTik7CiAgICBJRGlyZWN0M0RTd2FwQ2hhaW45ICAgICAgICAgICpwU3dhcGNoYWluOwoKICAgIHBEM2QgPSBwRGlyZWN0M0RDcmVhdGU5KCBEM0RfU0RLX1ZFUlNJT04gKTsKICAgIG9rKHBEM2QgIT0gTlVMTCwgIkZhaWxlZCB0byBjcmVhdGUgSURpcmVjdDNEOSBvYmplY3RcbiIpOwogICAgaHduZCA9IENyZWF0ZVdpbmRvdyggInN0YXRpYyIsICJkM2Q5X3Rlc3QiLCBXU19PVkVSTEFQUEVEV0lORE9XLCAxMDAsIDEwMCwgMTYwLCAxNjAsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwgKTsKICAgIG9rKGh3bmQgIT0gTlVMTCwgIkZhaWxlZCB0byBjcmVhdGUgd2luZG93XG4iKTsKICAgIGlmICghcEQzZCB8fCAhaHduZCkgZ290byBjbGVhbnVwOwoKICAgIElEaXJlY3QzRDlfR2V0QWRhcHRlckRpc3BsYXlNb2RlKCBwRDNkLCBEM0RBREFQVEVSX0RFRkFVTFQsICZkM2RkbSApOwogICAgWmVyb01lbW9yeSggJmQzZHBwLCBzaXplb2YoZDNkcHApICk7CiAgICBkM2RwcC5XaW5kb3dlZCAgICAgICAgID0gRkFMU0U7CiAgICBkM2RwcC5Td2FwRWZmZWN0ICAgICAgID0gRDNEU1dBUEVGRkVDVF9ESVNDQVJEOwogICAgZDNkcHAuQmFja0J1ZmZlcldpZHRoICA9IDgwMDsKICAgIGQzZHBwLkJhY2tCdWZmZXJIZWlnaHQgID0gNjAwOwogICAgZDNkcHAuQmFja0J1ZmZlckZvcm1hdCA9IGQzZGRtLkZvcm1hdDsKCiAgICBociA9IElEaXJlY3QzRDlfQ3JlYXRlRGV2aWNlKCBwRDNkLCBEM0RBREFQVEVSX0RFRkFVTFQsIEQzRERFVlRZUEVfSEFMIC8qIG5vIE5VTExSRUYgaGVyZSAqLywgaHduZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRENSRUFURV9TT0ZUV0FSRV9WRVJURVhQUk9DRVNTSU5HLCAmZDNkcHAsICZwRGV2aWNlICk7CgogICAgaWYoRkFJTEVEKGhyKSkKICAgIHsKICAgICAgICBza2lwKCJjb3VsZCBub3QgY3JlYXRlIGRldmljZSwgSURpcmVjdDNEOV9DcmVhdGVEZXZpY2UgcmV0dXJuZWQgJSN4XG4iLCBocik7CiAgICAgICAgZ290byBjbGVhbnVwOwogICAgfQoKICAgIHdpZHRoID0gR2V0U3lzdGVtTWV0cmljcyhTTV9DWFNDUkVFTik7CiAgICBoZWlnaHQgPSBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NZU0NSRUVOKTsKICAgIG9rKHdpZHRoID09IDgwMCwgIlNjcmVlbiB3aWR0aCBpcyAlZFxuIiwgd2lkdGgpOwogICAgb2soaGVpZ2h0ID09IDYwMCwgIlNjcmVlbiBoZWlnaHQgaXMgJWRcbiIsIGhlaWdodCk7CgogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0dldFZpZXdwb3J0KHBEZXZpY2UsICZ2cCk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X0dldFZpZXdwb3J0IGZhaWxlZCB3aXRoICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaWYoU1VDQ0VFREVEKGhyKSkKICAgIHsKICAgICAgICBvayh2cC5YID09IDAsICJEM0RWSUVXUE9SVC0+WCA9ICVkXG4iLCB2cC5YKTsKICAgICAgICBvayh2cC5ZID09IDAsICJEM0RWSUVXUE9SVC0+WCA9ICVkXG4iLCB2cC5ZKTsKICAgICAgICBvayh2cC5XaWR0aCA9PSA4MDAsICJEM0RWSUVXUE9SVC0+WCA9ICVkXG4iLCB2cC5XaWR0aCk7CiAgICAgICAgb2sodnAuSGVpZ2h0ID09IDYwMCwgIkQzRFZJRVdQT1JULT5YID0gJWRcbiIsIHZwLkhlaWdodCk7CiAgICAgICAgb2sodnAuTWluWiA9PSAwLCAiRDNEVklFV1BPUlQtPlggPSAlZFxuIiwgdnAuSGVpZ2h0KTsKICAgICAgICBvayh2cC5NYXhaID09IDEsICJEM0RWSUVXUE9SVC0+WCA9ICVkXG4iLCB2cC5IZWlnaHQpOwogICAgfQogICAgdnAuWCA9IDEwOwogICAgdnAuWCA9IDIwOwogICAgdnAuTWluWiA9IDI7CiAgICB2cC5NYXhaID0gMzsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRWaWV3cG9ydChwRGV2aWNlLCAmdnApOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRWaWV3cG9ydCBmYWlsZWQgd2l0aCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKCiAgICBaZXJvTWVtb3J5KCAmZDNkcHAsIHNpemVvZihkM2RwcCkgKTsKICAgIGQzZHBwLlN3YXBFZmZlY3QgICAgICAgPSBEM0RTV0FQRUZGRUNUX0RJU0NBUkQ7CiAgICBkM2RwcC5XaW5kb3dlZCAgICAgICAgID0gRkFMU0U7CiAgICBkM2RwcC5CYWNrQnVmZmVyV2lkdGggID0gNjQwOwogICAgZDNkcHAuQmFja0J1ZmZlckhlaWdodCAgPSA0ODA7CiAgICBkM2RwcC5CYWNrQnVmZmVyRm9ybWF0ID0gZDNkZG0uRm9ybWF0OwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1Jlc2V0KHBEZXZpY2UsICZkM2RwcCk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1Jlc2V0IGZhaWxlZCB3aXRoICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwoKICAgIFplcm9NZW1vcnkoJnZwLCBzaXplb2YodnApKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9HZXRWaWV3cG9ydChwRGV2aWNlLCAmdnApOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9HZXRWaWV3cG9ydCBmYWlsZWQgd2l0aCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGlmKFNVQ0NFRURFRChocikpCiAgICB7CiAgICAgICAgb2sodnAuWCA9PSAwLCAiRDNEVklFV1BPUlQtPlggPSAlZFxuIiwgdnAuWCk7CiAgICAgICAgb2sodnAuWSA9PSAwLCAiRDNEVklFV1BPUlQtPlggPSAlZFxuIiwgdnAuWSk7CiAgICAgICAgb2sodnAuV2lkdGggPT0gNjQwLCAiRDNEVklFV1BPUlQtPlggPSAlZFxuIiwgdnAuV2lkdGgpOwogICAgICAgIG9rKHZwLkhlaWdodCA9PSA0ODAsICJEM0RWSUVXUE9SVC0+WCA9ICVkXG4iLCB2cC5IZWlnaHQpOwogICAgICAgIG9rKHZwLk1pblogPT0gMCwgIkQzRFZJRVdQT1JULT5YID0gJWRcbiIsIHZwLkhlaWdodCk7CiAgICAgICAgb2sodnAuTWF4WiA9PSAxLCAiRDNEVklFV1BPUlQtPlggPSAlZFxuIiwgdnAuSGVpZ2h0KTsKICAgIH0KCiAgICB3aWR0aCA9IEdldFN5c3RlbU1ldHJpY3MoU01fQ1hTQ1JFRU4pOwogICAgaGVpZ2h0ID0gR2V0U3lzdGVtTWV0cmljcyhTTV9DWVNDUkVFTik7CiAgICBvayh3aWR0aCA9PSA2NDAsICJTY3JlZW4gd2lkdGggaXMgJWRcbiIsIHdpZHRoKTsKICAgIG9rKGhlaWdodCA9PSA0ODAsICJTY3JlZW4gaGVpZ2h0IGlzICVkXG4iLCBoZWlnaHQpOwoKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9HZXRTd2FwQ2hhaW4ocERldmljZSwgMCwgJnBTd2FwY2hhaW4pOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9HZXRTd2FwQ2hhaW4gcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBpZihTVUNDRUVERUQoaHIpKQogICAgewogICAgICAgIFplcm9NZW1vcnkoJmQzZHBwLCBzaXplb2YoZDNkcHApKTsKICAgICAgICBociA9IElEaXJlY3QzRFN3YXBDaGFpbjlfR2V0UHJlc2VudFBhcmFtZXRlcnMocFN3YXBjaGFpbiwgJmQzZHBwKTsKICAgICAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0RTd2FwQ2hhaW45X0dldFByZXNlbnRQYXJhbWV0ZXJzIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgICAgIGlmKFNVQ0NFRURFRChocikpCiAgICAgICAgewogICAgICAgICAgICBvayhkM2RwcC5CYWNrQnVmZmVyV2lkdGggPT0gNjQwLCAiQmFjayBidWZmZXIgd2lkdGggaXMgJWRcbiIsIGQzZHBwLkJhY2tCdWZmZXJXaWR0aCk7CiAgICAgICAgICAgIG9rKGQzZHBwLkJhY2tCdWZmZXJIZWlnaHQgPT0gNDgwLCAiQmFjayBidWZmZXIgaGVpZ2h0IGlzICVkXG4iLCBkM2RwcC5CYWNrQnVmZmVySGVpZ2h0KTsKICAgICAgICB9CiAgICAgICAgSURpcmVjdDNEU3dhcENoYWluOV9SZWxlYXNlKHBTd2FwY2hhaW4pOwogICAgfQoKICAgIFplcm9NZW1vcnkoICZkM2RwcCwgc2l6ZW9mKGQzZHBwKSApOwogICAgZDNkcHAuU3dhcEVmZmVjdCAgICAgICA9IEQzRFNXQVBFRkZFQ1RfRElTQ0FSRDsKICAgIGQzZHBwLldpbmRvd2VkICAgICAgICAgPSBUUlVFOwogICAgZDNkcHAuQmFja0J1ZmZlcldpZHRoICA9IDQwMDsKICAgIGQzZHBwLkJhY2tCdWZmZXJIZWlnaHQgID0gMzAwOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1Jlc2V0KHBEZXZpY2UsICZkM2RwcCk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1Jlc2V0IGZhaWxlZCB3aXRoICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwoKICAgIHdpZHRoID0gR2V0U3lzdGVtTWV0cmljcyhTTV9DWFNDUkVFTik7CiAgICBoZWlnaHQgPSBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NZU0NSRUVOKTsKICAgIG9rKHdpZHRoID09IG9yaWdfd2lkdGgsICJTY3JlZW4gd2lkdGggaXMgJWRcbiIsIHdpZHRoKTsKICAgIG9rKGhlaWdodCA9PSBvcmlnX2hlaWdodCwgIlNjcmVlbiBoZWlnaHQgaXMgJWRcbiIsIGhlaWdodCk7CgogICAgWmVyb01lbW9yeSgmdnAsIHNpemVvZih2cCkpOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0dldFZpZXdwb3J0KHBEZXZpY2UsICZ2cCk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X0dldFZpZXdwb3J0IGZhaWxlZCB3aXRoICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaWYoU1VDQ0VFREVEKGhyKSkKICAgIHsKICAgICAgICBvayh2cC5YID09IDAsICJEM0RWSUVXUE9SVC0+WCA9ICVkXG4iLCB2cC5YKTsKICAgICAgICBvayh2cC5ZID09IDAsICJEM0RWSUVXUE9SVC0+WCA9ICVkXG4iLCB2cC5ZKTsKICAgICAgICBvayh2cC5XaWR0aCA9PSA0MDAsICJEM0RWSUVXUE9SVC0+WCA9ICVkXG4iLCB2cC5XaWR0aCk7CiAgICAgICAgb2sodnAuSGVpZ2h0ID09IDMwMCwgIkQzRFZJRVdQT1JULT5YID0gJWRcbiIsIHZwLkhlaWdodCk7CiAgICAgICAgb2sodnAuTWluWiA9PSAwLCAiRDNEVklFV1BPUlQtPlggPSAlZFxuIiwgdnAuSGVpZ2h0KTsKICAgICAgICBvayh2cC5NYXhaID09IDEsICJEM0RWSUVXUE9SVC0+WCA9ICVkXG4iLCB2cC5IZWlnaHQpOwogICAgfQoKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9HZXRTd2FwQ2hhaW4ocERldmljZSwgMCwgJnBTd2FwY2hhaW4pOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9HZXRTd2FwQ2hhaW4gcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBpZihTVUNDRUVERUQoaHIpKQogICAgewogICAgICAgIFplcm9NZW1vcnkoJmQzZHBwLCBzaXplb2YoZDNkcHApKTsKICAgICAgICBociA9IElEaXJlY3QzRFN3YXBDaGFpbjlfR2V0UHJlc2VudFBhcmFtZXRlcnMocFN3YXBjaGFpbiwgJmQzZHBwKTsKICAgICAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0RTd2FwQ2hhaW45X0dldFByZXNlbnRQYXJhbWV0ZXJzIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgICAgIGlmKFNVQ0NFRURFRChocikpCiAgICAgICAgewogICAgICAgICAgICBvayhkM2RwcC5CYWNrQnVmZmVyV2lkdGggPT0gNDAwLCAiQmFjayBidWZmZXIgd2lkdGggaXMgJWRcbiIsIGQzZHBwLkJhY2tCdWZmZXJXaWR0aCk7CiAgICAgICAgICAgIG9rKGQzZHBwLkJhY2tCdWZmZXJIZWlnaHQgPT0gMzAwLCAiQmFjayBidWZmZXIgaGVpZ2h0IGlzICVkXG4iLCBkM2RwcC5CYWNrQnVmZmVySGVpZ2h0KTsKICAgICAgICB9CiAgICAgICAgSURpcmVjdDNEU3dhcENoYWluOV9SZWxlYXNlKHBTd2FwY2hhaW4pOwogICAgfQoKY2xlYW51cDoKICAgIGlmKHBEM2QpIElEaXJlY3QzRDlfUmVsZWFzZShwRDNkKTsKICAgIGlmKHBEZXZpY2UpIElEaXJlY3QzRDlfUmVsZWFzZShwRGV2aWNlKTsKfQoKLyogVGVzdCBhZGFwdGVyIGRpc3BsYXkgbW9kZXMgKi8Kc3RhdGljIHZvaWQgdGVzdF9kaXNwbGF5X21vZGVzKHZvaWQpCnsKICAgIEQzRERJU1BMQVlNT0RFIGRtb2RlOwogICAgSURpcmVjdDNEOSAqcEQzZDsKCiAgICBwRDNkID0gcERpcmVjdDNEQ3JlYXRlOSggRDNEX1NES19WRVJTSU9OICk7CiAgICBvayhwRDNkICE9IE5VTEwsICJGYWlsZWQgdG8gY3JlYXRlIElEaXJlY3QzRDkgb2JqZWN0XG4iKTsKICAgIGlmKCFwRDNkKSByZXR1cm47CgojZGVmaW5lIFRFU1RfRk1UKHgscikgZG8geyBcCiAgICBIUkVTVUxUIHJlcyA9IElEaXJlY3QzRDlfRW51bUFkYXB0ZXJNb2RlcyhwRDNkLCAwLCAoeCksIDAsICZkbW9kZSk7IFwKICAgIG9rKHJlcz09KHIpLCAiRW51bUFkYXB0ZXJNb2RlcygiI3giKSBkaWQgbm90IHJldHVybiAiI3IiIChnb3QgJXMpIVxuIiwgRFhHZXRFcnJvclN0cmluZzkocmVzKSk7IFwKfSB3aGlsZSgwKQoKICAgIFRFU1RfRk1UKEQzREZNVF9SOEc4QjgsIEQzREVSUl9JTlZBTElEQ0FMTCk7CiAgICBURVNUX0ZNVChEM0RGTVRfQThSOEc4QjgsIEQzREVSUl9JTlZBTElEQ0FMTCk7CiAgICBURVNUX0ZNVChEM0RGTVRfWDhCOEc4UjgsIEQzREVSUl9JTlZBTElEQ0FMTCk7CiAgICAvKiBEM0RGTVRfUjVHNkI1ICovCiAgICBURVNUX0ZNVChEM0RGTVRfWDFSNUc1QjUsIEQzREVSUl9JTlZBTElEQ0FMTCk7CiAgICBURVNUX0ZNVChEM0RGTVRfQTFSNUc1QjUsIEQzREVSUl9JTlZBTElEQ0FMTCk7CiAgICBURVNUX0ZNVChEM0RGTVRfQTRSNEc0QjQsIEQzREVSUl9JTlZBTElEQ0FMTCk7CiAgICBURVNUX0ZNVChEM0RGTVRfUjNHM0IyLCBEM0RFUlJfSU5WQUxJRENBTEwpOwogICAgVEVTVF9GTVQoRDNERk1UX0E4LCBEM0RFUlJfSU5WQUxJRENBTEwpOwogICAgVEVTVF9GTVQoRDNERk1UX0E4UjNHM0IyLCBEM0RFUlJfSU5WQUxJRENBTEwpOwogICAgVEVTVF9GTVQoRDNERk1UX1g0UjRHNEI0LCBEM0RFUlJfSU5WQUxJRENBTEwpOwogICAgVEVTVF9GTVQoRDNERk1UX0EyQjEwRzEwUjEwLCBEM0RFUlJfSU5WQUxJRENBTEwpOwogICAgVEVTVF9GTVQoRDNERk1UX0E4QjhHOFI4LCBEM0RFUlJfSU5WQUxJRENBTEwpOwogICAgVEVTVF9GTVQoRDNERk1UX1g4QjhHOFI4LCBEM0RFUlJfSU5WQUxJRENBTEwpOwogICAgVEVTVF9GTVQoRDNERk1UX0cxNlIxNiwgRDNERVJSX0lOVkFMSURDQUxMKTsKICAgIFRFU1RfRk1UKEQzREZNVF9BMlIxMEcxMEIxMCwgRDNERVJSX0lOVkFMSURDQUxMKTsKICAgIFRFU1RfRk1UKEQzREZNVF9BMTZCMTZHMTZSMTYsIEQzREVSUl9JTlZBTElEQ0FMTCk7CgogICAgVEVTVF9GTVQoRDNERk1UX0E4UDgsIEQzREVSUl9JTlZBTElEQ0FMTCk7CiAgICBURVNUX0ZNVChEM0RGTVRfUDgsIEQzREVSUl9JTlZBTElEQ0FMTCk7CgogICAgVEVTVF9GTVQoRDNERk1UX0w4LCBEM0RFUlJfSU5WQUxJRENBTEwpOwogICAgVEVTVF9GTVQoRDNERk1UX0E4TDgsIEQzREVSUl9JTlZBTElEQ0FMTCk7CiAgICBURVNUX0ZNVChEM0RGTVRfQTRMNCwgRDNERVJSX0lOVkFMSURDQUxMKTsKCiAgICBURVNUX0ZNVChEM0RGTVRfVjhVOCwgRDNERVJSX0lOVkFMSURDQUxMKTsKICAgIFRFU1RfRk1UKEQzREZNVF9MNlY1VTUsIEQzREVSUl9JTlZBTElEQ0FMTCk7CiAgICBURVNUX0ZNVChEM0RGTVRfWDhMOFY4VTgsIEQzREVSUl9JTlZBTElEQ0FMTCk7CiAgICBURVNUX0ZNVChEM0RGTVRfUThXOFY4VTgsIEQzREVSUl9JTlZBTElEQ0FMTCk7CiAgICBURVNUX0ZNVChEM0RGTVRfVjE2VTE2LCBEM0RFUlJfSU5WQUxJRENBTEwpOwogICAgVEVTVF9GTVQoRDNERk1UX0EyVzEwVjEwVTEwLCBEM0RFUlJfSU5WQUxJRENBTEwpOwoKICAgIFRFU1RfRk1UKEQzREZNVF9VWVZZLCBEM0RFUlJfSU5WQUxJRENBTEwpOwogICAgVEVTVF9GTVQoRDNERk1UX1lVWTIsIEQzREVSUl9JTlZBTElEQ0FMTCk7CiAgICBURVNUX0ZNVChEM0RGTVRfRFhUMSwgRDNERVJSX0lOVkFMSURDQUxMKTsKICAgIFRFU1RfRk1UKEQzREZNVF9EWFQyLCBEM0RFUlJfSU5WQUxJRENBTEwpOwogICAgVEVTVF9GTVQoRDNERk1UX0RYVDMsIEQzREVSUl9JTlZBTElEQ0FMTCk7CiAgICBURVNUX0ZNVChEM0RGTVRfRFhUNCwgRDNERVJSX0lOVkFMSURDQUxMKTsKICAgIFRFU1RfRk1UKEQzREZNVF9EWFQ1LCBEM0RFUlJfSU5WQUxJRENBTEwpOwogICAgVEVTVF9GTVQoRDNERk1UX01VTFRJMl9BUkdCOCwgRDNERVJSX0lOVkFMSURDQUxMKTsKICAgIFRFU1RfRk1UKEQzREZNVF9HOFI4X0c4QjgsIEQzREVSUl9JTlZBTElEQ0FMTCk7CiAgICBURVNUX0ZNVChEM0RGTVRfUjhHOF9COEc4LCBEM0RFUlJfSU5WQUxJRENBTEwpOwoKICAgIFRFU1RfRk1UKEQzREZNVF9EMTZfTE9DS0FCTEUsIEQzREVSUl9JTlZBTElEQ0FMTCk7CiAgICBURVNUX0ZNVChEM0RGTVRfRDMyLCBEM0RFUlJfSU5WQUxJRENBTEwpOwogICAgVEVTVF9GTVQoRDNERk1UX0QxNVMxLCBEM0RFUlJfSU5WQUxJRENBTEwpOwogICAgVEVTVF9GTVQoRDNERk1UX0QyNFM4LCBEM0RFUlJfSU5WQUxJRENBTEwpOwogICAgVEVTVF9GTVQoRDNERk1UX0QyNFg4LCBEM0RFUlJfSU5WQUxJRENBTEwpOwogICAgVEVTVF9GTVQoRDNERk1UX0QyNFg0UzQsIEQzREVSUl9JTlZBTElEQ0FMTCk7CiAgICBURVNUX0ZNVChEM0RGTVRfRDE2LCBEM0RFUlJfSU5WQUxJRENBTEwpOwogICAgVEVTVF9GTVQoRDNERk1UX0wxNiwgRDNERVJSX0lOVkFMSURDQUxMKTsKICAgIFRFU1RfRk1UKEQzREZNVF9EMzJGX0xPQ0tBQkxFLCBEM0RFUlJfSU5WQUxJRENBTEwpOwogICAgVEVTVF9GTVQoRDNERk1UX0QyNEZTOCwgRDNERVJSX0lOVkFMSURDQUxMKTsKCiAgICBURVNUX0ZNVChEM0RGTVRfVkVSVEVYREFUQSwgRDNERVJSX0lOVkFMSURDQUxMKTsKICAgIFRFU1RfRk1UKEQzREZNVF9JTkRFWDE2LCBEM0RFUlJfSU5WQUxJRENBTEwpOwogICAgVEVTVF9GTVQoRDNERk1UX0lOREVYMzIsIEQzREVSUl9JTlZBTElEQ0FMTCk7CiAgICBURVNUX0ZNVChEM0RGTVRfUTE2VzE2VjE2VTE2LCBEM0RFUlJfSU5WQUxJRENBTEwpOwogICAgLyogRmxvYXRpbmcgcG9pbnQgZm9ybWF0cyAqLwogICAgVEVTVF9GTVQoRDNERk1UX1IxNkYsIEQzREVSUl9JTlZBTElEQ0FMTCk7CiAgICBURVNUX0ZNVChEM0RGTVRfRzE2UjE2RiwgRDNERVJSX0lOVkFMSURDQUxMKTsKICAgIFRFU1RfRk1UKEQzREZNVF9BMTZCMTZHMTZSMTZGLCBEM0RFUlJfSU5WQUxJRENBTEwpOwoKICAgIC8qIElFRUUgZm9ybWF0cyAqLwogICAgVEVTVF9GTVQoRDNERk1UX1IzMkYsIEQzREVSUl9JTlZBTElEQ0FMTCk7CiAgICBURVNUX0ZNVChEM0RGTVRfRzMyUjMyRiwgRDNERVJSX0lOVkFMSURDQUxMKTsKICAgIFRFU1RfRk1UKEQzREZNVF9BMzJCMzJHMzJSMzJGLCBEM0RFUlJfSU5WQUxJRENBTEwpOwoKICAgIFRFU1RfRk1UKEQzREZNVF9DeFY4VTgsIEQzREVSUl9JTlZBTElEQ0FMTCk7CgogICAgVEVTVF9GTVQoMCwgRDNERVJSX0lOVkFMSURDQUxMKTsKCiAgICBJRGlyZWN0M0Q5X1JlbGVhc2UocEQzZCk7Cn0KCnN0YXRpYyB2b2lkIHRlc3Rfc2NlbmUodm9pZCkKewogICAgSFJFU1VMVCAgICAgICAgICAgICAgICAgICAgICBocjsKICAgIEhXTkQgICAgICAgICAgICAgICAgICAgICAgICAgaHduZCAgICAgICAgICAgICAgID0gTlVMTDsKICAgIElEaXJlY3QzRDkgICAgICAgICAgICAgICAgICAqcEQzZCAgICAgICAgICAgICAgID0gTlVMTDsKICAgIElEaXJlY3QzRERldmljZTkgICAgICAgICAgICAqcERldmljZSAgICAgICAgICAgID0gTlVMTDsKICAgIEQzRFBSRVNFTlRfUEFSQU1FVEVSUyAgICAgICAgZDNkcHA7CiAgICBEM0RESVNQTEFZTU9ERSAgICAgICAgICAgICAgIGQzZGRtOwogICAgSURpcmVjdDNEU3VyZmFjZTkgICAgICAgICAgICAqcFN1cmZhY2UxID0gTlVMTCwgKnBTdXJmYWNlMiA9IE5VTEwsICpwU3VyZmFjZTMgPSBOVUxMLCAqcFJlbmRlclRhcmdldCA9IE5VTEw7CiAgICBJRGlyZWN0M0RTdXJmYWNlOSAgICAgICAgICAgICpwQmFja0J1ZmZlciA9IE5VTEwsICpwRGVwdGhTdGVuY2lsID0gTlVMTDsKICAgIFJFQ1QgcmVjdCA9IHswLCAwLCAxMjgsIDEyOH07CiAgICBEM0RDQVBTOSAgICAgICAgICAgICAgICAgICAgIGNhcHM7CgogICAgcEQzZCA9IHBEaXJlY3QzRENyZWF0ZTkoIEQzRF9TREtfVkVSU0lPTiApOwogICAgb2socEQzZCAhPSBOVUxMLCAiRmFpbGVkIHRvIGNyZWF0ZSBJRGlyZWN0M0Q5IG9iamVjdFxuIik7CiAgICBod25kID0gQ3JlYXRlV2luZG93KCAic3RhdGljIiwgImQzZDlfdGVzdCIsIFdTX09WRVJMQVBQRURXSU5ET1csIDEwMCwgMTAwLCAxNjAsIDE2MCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCApOwogICAgb2soaHduZCAhPSBOVUxMLCAiRmFpbGVkIHRvIGNyZWF0ZSB3aW5kb3dcbiIpOwogICAgaWYgKCFwRDNkIHx8ICFod25kKSBnb3RvIGNsZWFudXA7CgogICAgSURpcmVjdDNEOV9HZXRBZGFwdGVyRGlzcGxheU1vZGUoIHBEM2QsIEQzREFEQVBURVJfREVGQVVMVCwgJmQzZGRtICk7CiAgICBaZXJvTWVtb3J5KCAmZDNkcHAsIHNpemVvZihkM2RwcCkgKTsKICAgIGQzZHBwLldpbmRvd2VkICAgICAgICAgPSBUUlVFOwogICAgZDNkcHAuU3dhcEVmZmVjdCAgICAgICA9IEQzRFNXQVBFRkZFQ1RfRElTQ0FSRDsKICAgIGQzZHBwLkJhY2tCdWZmZXJXaWR0aCAgPSA4MDA7CiAgICBkM2RwcC5CYWNrQnVmZmVySGVpZ2h0ICA9IDYwMDsKICAgIGQzZHBwLkJhY2tCdWZmZXJGb3JtYXQgPSBkM2RkbS5Gb3JtYXQ7CiAgICBkM2RwcC5FbmFibGVBdXRvRGVwdGhTdGVuY2lsID0gVFJVRTsKICAgIGQzZHBwLkF1dG9EZXB0aFN0ZW5jaWxGb3JtYXQgPSBEM0RGTVRfRDE2OwoKICAgIGhyID0gSURpcmVjdDNEOV9DcmVhdGVEZXZpY2UoIHBEM2QsIEQzREFEQVBURVJfREVGQVVMVCwgRDNEREVWVFlQRV9IQUwgLyogbm8gTlVMTFJFRiBoZXJlICovLCBod25kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEQ1JFQVRFX1NPRlRXQVJFX1ZFUlRFWFBST0NFU1NJTkcsICZkM2RwcCwgJnBEZXZpY2UgKTsKICAgIG9rKGhyID09IEQzRF9PSyB8fCBociA9PSBEM0RFUlJfTk9UQVZBSUxBQkxFLCAiSURpcmVjdDNEOV9DcmVhdGVEZXZpY2UgZmFpbGVkIHdpdGggJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBpZighcERldmljZSkKICAgIHsKICAgICAgICBza2lwKCJGYWlsZWQgdG8gY3JlYXRlIGEgZDNkIGRldmljZVxuIik7CiAgICAgICAgZ290byBjbGVhbnVwOwogICAgfQoKICAgIC8qIEdldCB0aGUgY2FwcywgdGhleSB3aWxsIGJlIG5lZWRlZCB0byB0ZWxsIGlmIGFuIG9wZXJhdGlvbiBpcyBzdXBwb3NlZCB0byBiZSB2YWxpZCAqLwogICAgbWVtc2V0KCZjYXBzLCAwLCBzaXplb2YoY2FwcykpOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0dldERldmljZUNhcHMocERldmljZSwgJmNhcHMpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9HZXRDYXBzIGZhaWxlZCB3aXRoICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaWYoRkFJTEVEKGhyKSkgZ290byBjbGVhbnVwOwoKICAgIC8qIFRlc3QgYW4gRW5kU2NlbmUgd2l0aG91dCBiZWdpbnNjZW5lLiBTaG91bGQgcmV0dXJuIGFuIGVycm9yICovCiAgICBociA9IElEaXJlY3QzRERldmljZTlfRW5kU2NlbmUocERldmljZSk7CiAgICBvayhociA9PSBEM0RFUlJfSU5WQUxJRENBTEwsICJJRGlyZWN0M0REZXZpY2U5X0VuZFNjZW5lIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwoKICAgIC8qIFRlc3QgYSBub3JtYWwgQmVnaW5TY2VuZSAvIEVuZFNjZW5lIHBhaXIsIHRoaXMgc2hvdWxkIHdvcmsgKi8KICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9CZWdpblNjZW5lKHBEZXZpY2UpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9CZWdpblNjZW5lIGZhaWxlZCB3aXRoICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaWYoU1VDQ0VFREVEKGhyKSkKICAgIHsKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfRW5kU2NlbmUocERldmljZSk7CiAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9FbmRTY2VuZSBmYWlsZWQgd2l0aCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIH0KCiAgICAvKiBUZXN0IGFub3RoZXIgRW5kU2NlbmUgd2l0aG91dCBoYXZpbmcgYmVndW4gYSBuZXcgc2NlbmUuIFNob3VsZCByZXR1cm4gYW4gZXJyb3IgKi8KICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9FbmRTY2VuZShwRGV2aWNlKTsKICAgIG9rKGhyID09IEQzREVSUl9JTlZBTElEQ0FMTCwgIklEaXJlY3QzRERldmljZTlfRW5kU2NlbmUgcmV0dXJuZWQgJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CgogICAgLyogVHdvIG5lc3RlZCBCZWdpblNjZW5lIGFuZCBFbmRTY2VuZSBjYWxscyAqLwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0JlZ2luU2NlbmUocERldmljZSk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X0JlZ2luU2NlbmUgZmFpbGVkIHdpdGggJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfQmVnaW5TY2VuZShwRGV2aWNlKTsKICAgIG9rKGhyID09IEQzREVSUl9JTlZBTElEQ0FMTCwgIklEaXJlY3QzRERldmljZTlfQmVnaW5TY2VuZSByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9FbmRTY2VuZShwRGV2aWNlKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfRW5kU2NlbmUgZmFpbGVkIHdpdGggJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfRW5kU2NlbmUocERldmljZSk7CiAgICBvayhociA9PSBEM0RFUlJfSU5WQUxJRENBTEwsICJJRGlyZWN0M0REZXZpY2U5X0VuZFNjZW5lIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwoKICAgIC8qIENyZWF0ZSBzb21lIHN1cmZhY2VzIHRvIHRlc3Qgc3RyZXRjaHJlY3QgYmV0d2VlbiB0aGUgc2NlbmVzICovCiAgICBociA9IElEaXJlY3QzRERldmljZTlfQ3JlYXRlT2Zmc2NyZWVuUGxhaW5TdXJmYWNlKHBEZXZpY2UsIDEyOCwgMTI4LCBEM0RGTVRfQThSOEc4QjgsIEQzRFBPT0xfREVGQVVMVCwgJnBTdXJmYWNlMSwgTlVMTCk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X0NyZWF0ZU9mZnNjcmVlblBsYWluU3VyZmFjZSBmYWlsZWQgd2l0aCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9DcmVhdGVPZmZzY3JlZW5QbGFpblN1cmZhY2UocERldmljZSwgMTI4LCAxMjgsIEQzREZNVF9BOFI4RzhCOCwgRDNEUE9PTF9ERUZBVUxULCAmcFN1cmZhY2UyLCBOVUxMKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfQ3JlYXRlT2Zmc2NyZWVuUGxhaW5TdXJmYWNlIGZhaWxlZCB3aXRoICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0NyZWF0ZURlcHRoU3RlbmNpbFN1cmZhY2UocERldmljZSwgODAwLCA2MDAsIEQzREZNVF9EMTYsIEQzRE1VTFRJU0FNUExFX05PTkUsIDAsIEZBTFNFLCAmcFN1cmZhY2UzLCBOVUxMKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfQ3JlYXRlRGVwdGhTdGVuY2lsU3VyZmFjZSBmYWlsZWQgd2l0aCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9DcmVhdGVSZW5kZXJUYXJnZXQocERldmljZSwgMTI4LCAxMjgsIGQzZGRtLkZvcm1hdCwgRDNETVVMVElTQU1QTEVfTk9ORSwgMCwgRkFMU0UsICZwUmVuZGVyVGFyZ2V0LCBOVUxMKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfQ3JlYXRlUmVuZGVyVGFyZ2V0IGZhaWxlZCB3aXRoICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwoKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9HZXRCYWNrQnVmZmVyKHBEZXZpY2UsIDAsIDAsIEQzREJBQ0tCVUZGRVJfVFlQRV9NT05PLCAmcEJhY2tCdWZmZXIpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9HZXRCYWNrQnVmZmVyIGZhaWxlZCB3aXRoICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0dldERlcHRoU3RlbmNpbFN1cmZhY2UocERldmljZSwgJnBEZXB0aFN0ZW5jaWwpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9HZXRCYWNrQnVmZmVyIGZhaWxlZCB3aXRoICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwoKICAgIC8qIEZpcnN0IG1ha2Ugc3VyZSBhIHNpbXBsZSBTdHJldGNoUmVjdCBjYWxsIHdvcmtzICovCiAgICBpZihwU3VyZmFjZTEgJiYgcFN1cmZhY2UyKSB7CiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1N0cmV0Y2hSZWN0KHBEZXZpY2UsIHBTdXJmYWNlMSwgTlVMTCwgcFN1cmZhY2UyLCBOVUxMLCAwKTsKICAgICAgICBvayggaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TdHJldGNoUmVjdCBmYWlsZWQgd2l0aCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIH0KICAgIGlmKHBCYWNrQnVmZmVyICYmIHBSZW5kZXJUYXJnZXQpIHsKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfU3RyZXRjaFJlY3QocERldmljZSwgcEJhY2tCdWZmZXIsICZyZWN0LCBwUmVuZGVyVGFyZ2V0LCBOVUxMLCAwKTsKICAgICAgICBvayggaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TdHJldGNoUmVjdCBmYWlsZWQgd2l0aCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIH0KICAgIGlmKHBEZXB0aFN0ZW5jaWwgJiYgcFN1cmZhY2UzKSB7CiAgICAgICAgSFJFU1VMVCBleHBlY3RlZDsKICAgICAgICBpZigwKSAvKiBEaXNhYmxlZCBmb3Igbm93IGJlY2F1c2UgaXQgY3Jhc2hlcyBpbiB3aW5lICovIHsKICAgICAgICAgICAgZXhwZWN0ZWQgPSBjYXBzLkRldkNhcHMyICYgRDNEREVWQ0FQUzJfQ0FOX1NUUkVUQ0hSRUNUX0ZST01fVEVYVFVSRVMgPyBEM0RfT0sgOiBEM0RFUlJfSU5WQUxJRENBTEw7CiAgICAgICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TdHJldGNoUmVjdChwRGV2aWNlLCBwRGVwdGhTdGVuY2lsLCBOVUxMLCBwU3VyZmFjZTMsIE5VTEwsIDApOwogICAgICAgICAgICBvayggaHIgPT0gZXhwZWN0ZWQsICJJRGlyZWN0M0REZXZpY2U5X1N0cmV0Y2hSZWN0IHJldHVybmVkICVzLCBleHBlY3RlZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpLCBEWEdldEVycm9yU3RyaW5nOShleHBlY3RlZCkpOwogICAgICAgIH0KICAgIH0KCiAgICAvKiBOb3cgdHJ5IGl0IGluIGEgQmVnaW5TY2VuZSAtIEVuZFNjZW5lIHBhaXIuIFNlZW1zIHRvIGJlIGFsbG93ZWQgaW4gYSBiZWdpblNjZW5lIC0gRW5kc2NlbmUgcGFpcgogICAgICogd2lkdGggbm9ybWFsIHN1cmZhY2VzLCByZW5kZXIgdGFyZ2V0cyBhbmQgZGVwdGggc3RlbmNpbCBzdXJmYWNlcy4KICAgICAqLwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0JlZ2luU2NlbmUocERldmljZSk7CiAgICBvayggaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9CZWdpblNjZW5lIGZhaWxlZCB3aXRoICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwoKICAgIGlmKHBTdXJmYWNlMSAmJiBwU3VyZmFjZTIpCiAgICB7CiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1N0cmV0Y2hSZWN0KHBEZXZpY2UsIHBTdXJmYWNlMSwgTlVMTCwgcFN1cmZhY2UyLCBOVUxMLCAwKTsKICAgICAgICBvayggaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TdHJldGNoUmVjdCBmYWlsZWQgd2l0aCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIH0KICAgIGlmKHBCYWNrQnVmZmVyICYmIHBSZW5kZXJUYXJnZXQpCiAgICB7CiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1N0cmV0Y2hSZWN0KHBEZXZpY2UsIHBCYWNrQnVmZmVyLCAmcmVjdCwgcFJlbmRlclRhcmdldCwgTlVMTCwgMCk7CiAgICAgICAgb2soIGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU3RyZXRjaFJlY3QgZmFpbGVkIHdpdGggJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICB9CiAgICBpZihwRGVwdGhTdGVuY2lsICYmIHBTdXJmYWNlMykKICAgIHsKICAgICAgICAvKiBUaGlzIGlzIHN1cHBvc2VkIHRvIGZhaWwgaW5zaWRlIGEgQmVnaW5TY2VuZSAtIEVuZFNjZW5lIHBhaXIuICovCiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1N0cmV0Y2hSZWN0KHBEZXZpY2UsIHBEZXB0aFN0ZW5jaWwsIE5VTEwsIHBTdXJmYWNlMywgTlVMTCwgMCk7CiAgICAgICAgb2soIGhyID09IEQzREVSUl9JTlZBTElEQ0FMTCwgIklEaXJlY3QzRERldmljZTlfU3RyZXRjaFJlY3QgcmV0dXJuZWQgJXMsIGV4cGVjdGVkIEQzREVSUl9JTlZBTElEQ0FMTFxuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIH0KCiAgICBociA9IElEaXJlY3QzRERldmljZTlfRW5kU2NlbmUocERldmljZSk7CiAgICBvayggaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9FbmRTY2VuZSBmYWlsZWQgd2l0aCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKCiAgICAvKiBEb2VzIGEgU2V0UmVuZGVyVGFyZ2V0IGluZmx1ZW5jZSBCZWdpblNjZW5lIC8gRW5kU2NlbmUgPwogICAgICogU2V0IGEgbmV3IHJlbmRlciB0YXJnZXQsIHRoZW4gc2VlIGlmIGl0IHN0YXJ0ZWQgYSBuZXcgc2NlbmUuIEZsaXAgdGhlIHJ0IGJhY2sgYW5kIHNlZSBpZiB0aGF0IG1heWJlCiAgICAgKiBlbmRlZCB0aGUgc2NlbmUuIEV4cGVjdGVkIHJlc3VsdCBpcyB0aGF0IHRoZSBzY2VuZSBpcyBub3QgYWZmZWN0ZWQgYnkgU2V0UmVuZGVyVGFyZ2V0CiAgICAgKi8KICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRSZW5kZXJUYXJnZXQocERldmljZSwgMCwgcFJlbmRlclRhcmdldCk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFJlbmRlclRhcmdldCBmYWlsZWQgd2l0aCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9CZWdpblNjZW5lKHBEZXZpY2UpOwogICAgb2soIGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfQmVnaW5TY2VuZSBmYWlsZWQgd2l0aCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRSZW5kZXJUYXJnZXQocERldmljZSwgMCwgcEJhY2tCdWZmZXIpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRSZW5kZXJUYXJnZXQgZmFpbGVkIHdpdGggJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfRW5kU2NlbmUocERldmljZSk7CiAgICBvayggaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9FbmRTY2VuZSBmYWlsZWQgd2l0aCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKCmNsZWFudXA6CiAgICBpZihwUmVuZGVyVGFyZ2V0KSBJRGlyZWN0M0RTdXJmYWNlOV9SZWxlYXNlKHBSZW5kZXJUYXJnZXQpOwogICAgaWYocERlcHRoU3RlbmNpbCkgSURpcmVjdDNEU3VyZmFjZTlfUmVsZWFzZShwRGVwdGhTdGVuY2lsKTsKICAgIGlmKHBCYWNrQnVmZmVyKSBJRGlyZWN0M0RTdXJmYWNlOV9SZWxlYXNlKHBCYWNrQnVmZmVyKTsKICAgIGlmKHBTdXJmYWNlMSkgSURpcmVjdDNEU3VyZmFjZTlfUmVsZWFzZShwU3VyZmFjZTEpOwogICAgaWYocFN1cmZhY2UyKSBJRGlyZWN0M0RTdXJmYWNlOV9SZWxlYXNlKHBTdXJmYWNlMik7CiAgICBpZihwU3VyZmFjZTMpIElEaXJlY3QzRFN1cmZhY2U5X1JlbGVhc2UocFN1cmZhY2UzKTsKICAgIGlmKHBEM2QpIElEaXJlY3QzRDlfUmVsZWFzZShwRDNkKTsKICAgIGlmKHBEZXZpY2UpIElEaXJlY3QzRDlfUmVsZWFzZShwRGV2aWNlKTsKICAgIGlmKGh3bmQpIERlc3Ryb3lXaW5kb3coaHduZCk7Cn0KCnN0YXRpYyB2b2lkIHRlc3RfbGltaXRzKHZvaWQpCnsKICAgIEhSRVNVTFQgICAgICAgICAgICAgICAgICAgICAgaHI7CiAgICBIV05EICAgICAgICAgICAgICAgICAgICAgICAgIGh3bmQgICAgICAgICAgICAgICA9IE5VTEw7CiAgICBJRGlyZWN0M0Q5ICAgICAgICAgICAgICAgICAgKnBEM2QgICAgICAgICAgICAgICA9IE5VTEw7CiAgICBJRGlyZWN0M0REZXZpY2U5ICAgICAgICAgICAgKnBEZXZpY2UgICAgICAgICAgICA9IE5VTEw7CiAgICBEM0RQUkVTRU5UX1BBUkFNRVRFUlMgICAgICAgIGQzZHBwOwogICAgRDNERElTUExBWU1PREUgICAgICAgICAgICAgICBkM2RkbTsKICAgIElEaXJlY3QzRFRleHR1cmU5ICAgICAgICAgICAqcFRleHR1cmUgICAgICAgICAgID0gTlVMTDsKICAgIGludCBpOwoKICAgIHBEM2QgPSBwRGlyZWN0M0RDcmVhdGU5KCBEM0RfU0RLX1ZFUlNJT04gKTsKICAgIG9rKHBEM2QgIT0gTlVMTCwgIkZhaWxlZCB0byBjcmVhdGUgSURpcmVjdDNEOSBvYmplY3RcbiIpOwogICAgaHduZCA9IENyZWF0ZVdpbmRvdyggInN0YXRpYyIsICJkM2Q5X3Rlc3QiLCBXU19PVkVSTEFQUEVEV0lORE9XLCAxMDAsIDEwMCwgMTYwLCAxNjAsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwgKTsKICAgIG9rKGh3bmQgIT0gTlVMTCwgIkZhaWxlZCB0byBjcmVhdGUgd2luZG93XG4iKTsKICAgIGlmICghcEQzZCB8fCAhaHduZCkgZ290byBjbGVhbnVwOwoKICAgIElEaXJlY3QzRDlfR2V0QWRhcHRlckRpc3BsYXlNb2RlKCBwRDNkLCBEM0RBREFQVEVSX0RFRkFVTFQsICZkM2RkbSApOwogICAgWmVyb01lbW9yeSggJmQzZHBwLCBzaXplb2YoZDNkcHApICk7CiAgICBkM2RwcC5XaW5kb3dlZCAgICAgICAgID0gVFJVRTsKICAgIGQzZHBwLlN3YXBFZmZlY3QgICAgICAgPSBEM0RTV0FQRUZGRUNUX0RJU0NBUkQ7CiAgICBkM2RwcC5CYWNrQnVmZmVyV2lkdGggID0gODAwOwogICAgZDNkcHAuQmFja0J1ZmZlckhlaWdodCAgPSA2MDA7CiAgICBkM2RwcC5CYWNrQnVmZmVyRm9ybWF0ID0gZDNkZG0uRm9ybWF0OwogICAgZDNkcHAuRW5hYmxlQXV0b0RlcHRoU3RlbmNpbCA9IFRSVUU7CiAgICBkM2RwcC5BdXRvRGVwdGhTdGVuY2lsRm9ybWF0ID0gRDNERk1UX0QxNjsKCiAgICBociA9IElEaXJlY3QzRDlfQ3JlYXRlRGV2aWNlKCBwRDNkLCBEM0RBREFQVEVSX0RFRkFVTFQsIEQzRERFVlRZUEVfSEFMIC8qIG5vIE5VTExSRUYgaGVyZSAqLywgaHduZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRENSRUFURV9TT0ZUV0FSRV9WRVJURVhQUk9DRVNTSU5HLCAmZDNkcHAsICZwRGV2aWNlICk7CiAgICBvayhociA9PSBEM0RfT0sgfHwgaHIgPT0gRDNERVJSX05PVEFWQUlMQUJMRSwgIklEaXJlY3QzRDlfQ3JlYXRlRGV2aWNlIGZhaWxlZCB3aXRoICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaWYoIXBEZXZpY2UpCiAgICB7CiAgICAgICAgc2tpcCgiRmFpbGVkIHRvIGNyZWF0ZSBhIGQzZCBkZXZpY2VcbiIpOwogICAgICAgIGdvdG8gY2xlYW51cDsKICAgIH0KCiAgICBociA9IElEaXJlY3QzRERldmljZTlfQ3JlYXRlVGV4dHVyZShwRGV2aWNlLCAxNiwgMTYsIDEsIDAsIEQzREZNVF9BOFI4RzhCOCwgRDNEUE9PTF9NQU5BR0VELCAmcFRleHR1cmUsIE5VTEwpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9DcmVhdGVUZXh0dXJlIGZhaWxlZCB3aXRoICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaWYoIXBUZXh0dXJlKSBnb3RvIGNsZWFudXA7CgogICAgLyogVGhlcmUgYXJlIDE2IHBpeGVsIHNhbXBsZXJzLiBXZSBzaG91bGQgYmUgYWJsZSB0byBhY2Nlc3MgYWxsIG9mIHRoZW0gKi8KICAgIGZvcihpID0gMDsgaSA8IDE2OyBpKyspIHsKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0VGV4dHVyZShwRGV2aWNlLCBpLCAoSURpcmVjdDNEQmFzZVRleHR1cmU5ICopIHBUZXh0dXJlKTsKICAgICAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldFRleHR1cmUgZm9yIHNhbXBsZXIgJWQgZmFpbGVkIHdpdGggJXNcbiIsIGksIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFRleHR1cmUocERldmljZSwgaSwgTlVMTCk7CiAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRUZXh0dXJlIGZvciBzYW1wbGVyICVkIGZhaWxlZCB3aXRoICVzXG4iLCBpLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRTYW1wbGVyU3RhdGUocERldmljZSwgaSwgRDNEU0FNUF9TUkdCVEVYVFVSRSwgVFJVRSk7CiAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9TZXRTYW1wbGVyU3RhdGUgZm9yIHNhbXBsZXIgJWQgZmFpbGVkIHdpdGggJXNcbiIsIGksIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICB9CgogICAgLyogTm93IHRlc3QgYWxsIDggdGV4dHVyZXMgc3RhZ2Ugc3RhdGVzICovCiAgICBmb3IoaSA9IDA7IGkgPCA4OyBpKyspIHsKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0VGV4dHVyZVN0YWdlU3RhdGUocERldmljZSwgaSwgRDNEVFNTX0NPTE9ST1AsIEQzRFRPUF9BREQpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0VGV4dHVyZVN0YWdlU3RhdGUgZm9yIHRleHR1cmUgJWQgZmFpbGVkIHdpdGggJXNcbiIsIGksIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICB9CgogICAgLyogSW52ZXN0aWdhdGlvbnMgc2hvdyB0aGF0IGFjY2Vzc2luZyBoaWdoZXIgc2FtcGxlcnMgLyB0ZXh0dXJlcyBzdGFnZSBzdGF0ZXMgZG9lcyBub3QgcmV0dXJuIGFuIGVycm9yIGVpdGhlci4gV3JpdGluZwogICAgICogdG8gdG9vIGhpZ2ggc2FtcGxlcnMoYXBwcm94aW1hdGVseSBzYW1wbGVyIDQwKSBjYXVzZXMgbWVtb3J5IGNvcnJ1cHRpb24gaW4gd2luZG93cywgc28gdGhlcmUgaXMgbm8gYm91bmRzIGNoZWNraW5nCiAgICAgKiBidXQgaG93IGRvIEkgdGVzdCB0aGF0PwogICAgICovCmNsZWFudXA6CiAgICBpZihwVGV4dHVyZSkgSURpcmVjdDNEVGV4dHVyZTlfUmVsZWFzZShwVGV4dHVyZSk7CiAgICBpZihwRDNkKSBJRGlyZWN0M0Q5X1JlbGVhc2UocEQzZCk7CiAgICBpZihwRGV2aWNlKSBJRGlyZWN0M0Q5X1JlbGVhc2UocERldmljZSk7CiAgICBpZihod25kKSBEZXN0cm95V2luZG93KGh3bmQpOwp9CgpzdGF0aWMgdm9pZCB0ZXN0X2RlcHRoc3RlbmNpbHRlc3Qodm9pZCkKewogICAgSFJFU1VMVCAgICAgICAgICAgICAgICAgICAgICBocjsKICAgIEhXTkQgICAgICAgICAgICAgICAgICAgICAgICAgaHduZCAgICAgICAgICAgICAgID0gTlVMTDsKICAgIElEaXJlY3QzRDkgICAgICAgICAgICAgICAgICAqcEQzZCAgICAgICAgICAgICAgID0gTlVMTDsKICAgIElEaXJlY3QzRERldmljZTkgICAgICAgICAgICAqcERldmljZSAgICAgICAgICAgID0gTlVMTDsKICAgIEQzRFBSRVNFTlRfUEFSQU1FVEVSUyAgICAgICAgZDNkcHA7CiAgICBEM0RESVNQTEFZTU9ERSAgICAgICAgICAgICAgIGQzZGRtOwogICAgSURpcmVjdDNEU3VyZmFjZTkgICAgICAgICAgICpwRGVwdGhTdGVuY2lsICAgICAgICAgICA9IE5VTEw7CiAgICBJRGlyZWN0M0RTdXJmYWNlOSAgICAgICAgICAgKnBEZXB0aFN0ZW5jaWwyICAgICAgICAgID0gTlVMTDsKICAgIEQzRFpCVUZGRVJUWVBFICAgICAgICAgICAgICAgc3RhdGU7CgogICAgcEQzZCA9IHBEaXJlY3QzRENyZWF0ZTkoIEQzRF9TREtfVkVSU0lPTiApOwogICAgb2socEQzZCAhPSBOVUxMLCAiRmFpbGVkIHRvIGNyZWF0ZSBJRGlyZWN0M0Q5IG9iamVjdFxuIik7CiAgICBod25kID0gQ3JlYXRlV2luZG93KCAic3RhdGljIiwgImQzZDlfdGVzdCIsIFdTX09WRVJMQVBQRURXSU5ET1csIDEwMCwgMTAwLCAxNjAsIDE2MCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCApOwogICAgb2soaHduZCAhPSBOVUxMLCAiRmFpbGVkIHRvIGNyZWF0ZSB3aW5kb3dcbiIpOwogICAgaWYgKCFwRDNkIHx8ICFod25kKSBnb3RvIGNsZWFudXA7CgogICAgSURpcmVjdDNEOV9HZXRBZGFwdGVyRGlzcGxheU1vZGUoIHBEM2QsIEQzREFEQVBURVJfREVGQVVMVCwgJmQzZGRtICk7CiAgICBaZXJvTWVtb3J5KCAmZDNkcHAsIHNpemVvZihkM2RwcCkgKTsKICAgIGQzZHBwLldpbmRvd2VkICAgICAgICAgPSBUUlVFOwogICAgZDNkcHAuU3dhcEVmZmVjdCAgICAgICA9IEQzRFNXQVBFRkZFQ1RfRElTQ0FSRDsKICAgIGQzZHBwLkJhY2tCdWZmZXJXaWR0aCAgPSA4MDA7CiAgICBkM2RwcC5CYWNrQnVmZmVySGVpZ2h0ICA9IDYwMDsKICAgIGQzZHBwLkJhY2tCdWZmZXJGb3JtYXQgPSBkM2RkbS5Gb3JtYXQ7CiAgICBkM2RwcC5FbmFibGVBdXRvRGVwdGhTdGVuY2lsID0gVFJVRTsKICAgIGQzZHBwLkF1dG9EZXB0aFN0ZW5jaWxGb3JtYXQgPSBEM0RGTVRfRDE2OwoKICAgIGhyID0gSURpcmVjdDNEOV9DcmVhdGVEZXZpY2UoIHBEM2QsIEQzREFEQVBURVJfREVGQVVMVCwgRDNEREVWVFlQRV9IQUwgLyogbm8gTlVMTFJFRiBoZXJlICovLCBod25kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEQ1JFQVRFX1NPRlRXQVJFX1ZFUlRFWFBST0NFU1NJTkcsICZkM2RwcCwgJnBEZXZpY2UgKTsKICAgIG9rKGhyID09IEQzRF9PSyB8fCBociA9PSBEM0RFUlJfTk9UQVZBSUxBQkxFLCAiSURpcmVjdDNEOV9DcmVhdGVEZXZpY2UgZmFpbGVkIHdpdGggJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBpZighcERldmljZSkKICAgIHsKICAgICAgICBza2lwKCJGYWlsZWQgdG8gY3JlYXRlIGEgZDNkIGRldmljZVxuIik7CiAgICAgICAgZ290byBjbGVhbnVwOwogICAgfQoKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9HZXREZXB0aFN0ZW5jaWxTdXJmYWNlKHBEZXZpY2UsICZwRGVwdGhTdGVuY2lsKTsKICAgIG9rKGhyID09IEQzRF9PSyAmJiBwRGVwdGhTdGVuY2lsICE9IE5VTEwsICJJRGlyZWN0M0REZXZpY2U5X0dldERlcHRoU3RlbmNpbFN1cmZhY2UgZmFpbGVkIHdpdGggJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CgogICAgLyogVHJ5IHRvIGNsZWFyICovCiAgICBociA9IElEaXJlY3QzRERldmljZTlfQ2xlYXIocERldmljZSwgMCwgTlVMTCwgRDNEQ0xFQVJfWkJVRkZFUiwgMHgwMDAwMDAwMCwgMS4wLCAwKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfQ2xlYXIgZmFpbGVkIHdpdGggJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CgogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldERlcHRoU3RlbmNpbFN1cmZhY2UocERldmljZSwgTlVMTCk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldERlcHRoU3RlbmNpbFN1cmZhY2UgZmFpbGVkIHdpdGggJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CgogICAgLyogQ2hlY2sgaWYgdGhlIHNldCBidWZmZXIgaXMgcmV0dXJuZWQgb24gYSBnZXQuIFdpbmVEM0QgaGFkIGEgYnVnIHdpdGggdGhhdCBvbmNlLCBwcmV2ZW50IGl0IGZyb20gY29taW5nIGJhY2sgKi8KICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9HZXREZXB0aFN0ZW5jaWxTdXJmYWNlKHBEZXZpY2UsICZwRGVwdGhTdGVuY2lsMik7CiAgICBvayhociA9PSBEM0RFUlJfTk9URk9VTkQgJiYgcERlcHRoU3RlbmNpbDIgPT0gTlVMTCwgIklEaXJlY3QzRERldmljZTlfR2V0RGVwdGhTdGVuY2lsU3VyZmFjZSBmYWlsZWQgd2l0aCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGlmKHBEZXB0aFN0ZW5jaWwyKSBJRGlyZWN0M0RTdXJmYWNlOV9SZWxlYXNlKHBEZXB0aFN0ZW5jaWwyKTsKCiAgICAvKiBUaGlzIGxlZnQgdGhlIHJlbmRlciBzdGF0ZXMgdW50b3VjaGVkISAqLwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0dldFJlbmRlclN0YXRlKHBEZXZpY2UsIEQzRFJTX1pFTkFCTEUsICZzdGF0ZSk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X0dldFJlbmRlclN0YXRlIGZhaWxlZCB3aXRoICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgb2soc3RhdGUgPT0gRDNEWkJfVFJVRSwgIkQzRFJTX1pFTkFCTEUgaXMgJXNcbiIsIHN0YXRlID09IEQzRFpCX0ZBTFNFID8gIkQzRFpCX0ZBTFNFIiA6IChzdGF0ZSA9PSBEM0RaQl9UUlVFID8gIkQzRFpCX1RSVUUiIDogIkQzRFpCX1VTRVciKSk7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfR2V0UmVuZGVyU3RhdGUocERldmljZSwgRDNEUlNfWldSSVRFRU5BQkxFLCAmc3RhdGUpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9HZXRSZW5kZXJTdGF0ZSBmYWlsZWQgd2l0aCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIG9rKHN0YXRlID09IFRSVUUsICJEM0RSU19aV1JJVEVFTkFCTEUgaXMgJXNcbiIsIHN0YXRlID8gIlRSVUUiIDogIkZBTFNFIik7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfR2V0UmVuZGVyU3RhdGUocERldmljZSwgRDNEUlNfU1RFTkNJTEVOQUJMRSwgJnN0YXRlKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfR2V0UmVuZGVyU3RhdGUgZmFpbGVkIHdpdGggJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBvayhzdGF0ZSA9PSBGQUxTRSwgIkQzRFJTX1NURU5DSUxFTkFCTEUgaXMgJXNcbiIsIHN0YXRlID8gIlRSVUUiIDogIkZBTFNFIik7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfR2V0UmVuZGVyU3RhdGUocERldmljZSwgRDNEUlNfU1RFTkNJTFdSSVRFTUFTSywgJnN0YXRlKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfR2V0UmVuZGVyU3RhdGUgZmFpbGVkIHdpdGggJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBvayhzdGF0ZSA9PSAweGZmZmZmZmZmLCAiRDNEUlNfU1RFTkNJTFdSSVRFTUFTSyBpcyAweCUwOHhcbiIsIHN0YXRlKTsKCiAgICAvKiBUaGlzIGlzIHN1cHBvc2VkIHRvIGZhaWwgbm93ICovCiAgICBociA9IElEaXJlY3QzRERldmljZTlfQ2xlYXIocERldmljZSwgMCwgTlVMTCwgRDNEQ0xFQVJfWkJVRkZFUiwgMHgwMDAwMDAwMCwgMS4wLCAwKTsKICAgIG9rKGhyID09IEQzREVSUl9JTlZBTElEQ0FMTCwgIklEaXJlY3QzRERldmljZTlfQ2xlYXIgZmFpbGVkIHdpdGggJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CgogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFJlbmRlclN0YXRlKHBEZXZpY2UsIEQzRFJTX1pFTkFCTEUsIEQzRFpCX0ZBTFNFKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfU2V0UmVuZGVyU3RhdGUgZmFpbGVkIHdpdGggJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CgogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldERlcHRoU3RlbmNpbFN1cmZhY2UocERldmljZSwgcERlcHRoU3RlbmNpbCk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X1NldERlcHRoU3RlbmNpbFN1cmZhY2UgZmFpbGVkIHdpdGggJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CgogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0dldFJlbmRlclN0YXRlKHBEZXZpY2UsIEQzRFJTX1pFTkFCTEUsICZzdGF0ZSk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X0dldFJlbmRlclN0YXRlIGZhaWxlZCB3aXRoICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgb2soc3RhdGUgPT0gRDNEWkJfRkFMU0UsICJEM0RSU19aRU5BQkxFIGlzICVzXG4iLCBzdGF0ZSA9PSBEM0RaQl9GQUxTRSA/ICJEM0RaQl9GQUxTRSIgOiAoc3RhdGUgPT0gRDNEWkJfVFJVRSA/ICJEM0RaQl9UUlVFIiA6ICJEM0RaQl9VU0VXIikpOwoKICAgIC8qIE5vdyBpdCB3b3JrcyBhZ2FpbiAqLwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0NsZWFyKHBEZXZpY2UsIDAsIE5VTEwsIEQzRENMRUFSX1pCVUZGRVIsIDB4MDAwMDAwMDAsIDEuMCwgMCk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X0NsZWFyIGZhaWxlZCB3aXRoICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwoKICAgIGlmKHBEZXB0aFN0ZW5jaWwpIElEaXJlY3QzRFN1cmZhY2U5X1JlbGVhc2UocERlcHRoU3RlbmNpbCk7CiAgICBpZihwRGV2aWNlKSBJRGlyZWN0M0Q5X1JlbGVhc2UocERldmljZSk7CgogICAgLyogTm93IHNlZSBpZiBhdXRvZGVwdGhzdGVuY2lsIGRpc2FibGUgaXMgaG9ub3JlZC4gRmlyc3QsIHdpdGhvdXQgYSBmb3JtYXQgc2V0ICovCiAgICBaZXJvTWVtb3J5KCAmZDNkcHAsIHNpemVvZihkM2RwcCkgKTsKICAgIGQzZHBwLldpbmRvd2VkICAgICAgICAgPSBUUlVFOwogICAgZDNkcHAuU3dhcEVmZmVjdCAgICAgICA9IEQzRFNXQVBFRkZFQ1RfRElTQ0FSRDsKICAgIGQzZHBwLkJhY2tCdWZmZXJXaWR0aCAgPSA4MDA7CiAgICBkM2RwcC5CYWNrQnVmZmVySGVpZ2h0ICA9IDYwMDsKICAgIGQzZHBwLkJhY2tCdWZmZXJGb3JtYXQgPSBkM2RkbS5Gb3JtYXQ7CiAgICBkM2RwcC5FbmFibGVBdXRvRGVwdGhTdGVuY2lsID0gRkFMU0U7CiAgICBkM2RwcC5BdXRvRGVwdGhTdGVuY2lsRm9ybWF0ID0gRDNERk1UX1VOS05PV047CgogICAgaHIgPSBJRGlyZWN0M0Q5X0NyZWF0ZURldmljZSggcEQzZCwgRDNEQURBUFRFUl9ERUZBVUxULCBEM0RERVZUWVBFX0hBTCAvKiBubyBOVUxMUkVGIGhlcmUgKi8sIGh3bmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RDUkVBVEVfU09GVFdBUkVfVkVSVEVYUFJPQ0VTU0lORywgJmQzZHBwLCAmcERldmljZSApOwogICAgb2soaHIgPT0gRDNEX09LIHx8IGhyID09IEQzREVSUl9OT1RBVkFJTEFCTEUsICJJRGlyZWN0M0Q5X0NyZWF0ZURldmljZSBmYWlsZWQgd2l0aCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGlmKCFwRGV2aWNlKQogICAgewogICAgICAgIHNraXAoIkZhaWxlZCB0byBjcmVhdGUgYSBkM2QgZGV2aWNlXG4iKTsKICAgICAgICBnb3RvIGNsZWFudXA7CiAgICB9CgogICAgcERlcHRoU3RlbmNpbCA9IE5VTEw7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfR2V0RGVwdGhTdGVuY2lsU3VyZmFjZShwRGV2aWNlLCAmcERlcHRoU3RlbmNpbCk7CiAgICBvayhociA9PSBEM0RFUlJfTk9URk9VTkQgJiYgcERlcHRoU3RlbmNpbCA9PSBOVUxMLCAiSURpcmVjdDNERGV2aWNlOV9HZXREZXB0aFN0ZW5jaWxTdXJmYWNlIHJldHVybmVkICVzLCBzdXJmYWNlID0gJXBcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSwgcERlcHRoU3RlbmNpbCk7CiAgICBpZihwRGVwdGhTdGVuY2lsKSB7CiAgICAgICAgSURpcmVjdDNEU3VyZmFjZTlfUmVsZWFzZShwRGVwdGhTdGVuY2lsKTsKICAgICAgICBwRGVwdGhTdGVuY2lsID0gTlVMTDsKICAgIH0KCiAgICAvKiBDaGVjayB0aGUgZGVwdGggdGVzdCBzdGF0ZSAqLwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0dldFJlbmRlclN0YXRlKHBEZXZpY2UsIEQzRFJTX1pFTkFCTEUsICZzdGF0ZSk7CiAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X0dldFJlbmRlclN0YXRlIGZhaWxlZCB3aXRoICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgb2soc3RhdGUgPT0gRDNEWkJfRkFMU0UsICJEM0RSU19aRU5BQkxFIGlzICVzXG4iLCBzdGF0ZSA9PSBEM0RaQl9GQUxTRSA/ICJEM0RaQl9GQUxTRSIgOiAoc3RhdGUgPT0gRDNEWkJfVFJVRSA/ICJEM0RaQl9UUlVFIiA6ICJEM0RaQl9VU0VXIikpOwoKICAgIGlmKHBEZXZpY2UpIElEaXJlY3QzRDlfUmVsZWFzZShwRGV2aWNlKTsKCiAgICAvKiBOZXh0LCB0cnkgRW5hYmxlQXV0b0RlcHRoU3RlbmNpbCBGQUxTRSB3aXRoIGEgZGVwdGggc3RlbmNpbCBmb3JtYXQgc2V0ICovCiAgICBaZXJvTWVtb3J5KCAmZDNkcHAsIHNpemVvZihkM2RwcCkgKTsKICAgIGQzZHBwLldpbmRvd2VkICAgICAgICAgPSBUUlVFOwogICAgZDNkcHAuU3dhcEVmZmVjdCAgICAgICA9IEQzRFNXQVBFRkZFQ1RfRElTQ0FSRDsKICAgIGQzZHBwLkJhY2tCdWZmZXJXaWR0aCAgPSA4MDA7CiAgICBkM2RwcC5CYWNrQnVmZmVySGVpZ2h0ICA9IDYwMDsKICAgIGQzZHBwLkJhY2tCdWZmZXJGb3JtYXQgPSBkM2RkbS5Gb3JtYXQ7CiAgICBkM2RwcC5FbmFibGVBdXRvRGVwdGhTdGVuY2lsID0gRkFMU0U7CiAgICBkM2RwcC5BdXRvRGVwdGhTdGVuY2lsRm9ybWF0ID0gRDNERk1UX0QxNjsKCiAgICBociA9IElEaXJlY3QzRDlfQ3JlYXRlRGV2aWNlKCBwRDNkLCBEM0RBREFQVEVSX0RFRkFVTFQsIEQzRERFVlRZUEVfSEFMIC8qIG5vIE5VTExSRUYgaGVyZSAqLywgaHduZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRENSRUFURV9TT0ZUV0FSRV9WRVJURVhQUk9DRVNTSU5HLCAmZDNkcHAsICZwRGV2aWNlICk7CiAgICBvayhociA9PSBEM0RfT0sgfHwgaHIgPT0gRDNERVJSX05PVEFWQUlMQUJMRSwgIklEaXJlY3QzRDlfQ3JlYXRlRGV2aWNlIGZhaWxlZCB3aXRoICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaWYoIXBEZXZpY2UpCiAgICB7CiAgICAgICAgc2tpcCgiRmFpbGVkIHRvIGNyZWF0ZSBhIGQzZCBkZXZpY2VcbiIpOwogICAgICAgIGdvdG8gY2xlYW51cDsKICAgIH0KCiAgICBwRGVwdGhTdGVuY2lsID0gTlVMTDsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9HZXREZXB0aFN0ZW5jaWxTdXJmYWNlKHBEZXZpY2UsICZwRGVwdGhTdGVuY2lsKTsKICAgIG9rKGhyID09IEQzREVSUl9OT1RGT1VORCAmJiBwRGVwdGhTdGVuY2lsID09IE5VTEwsICJJRGlyZWN0M0REZXZpY2U5X0dldERlcHRoU3RlbmNpbFN1cmZhY2UgcmV0dXJuZWQgJXMsIHN1cmZhY2UgPSAlcFxuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpLCBwRGVwdGhTdGVuY2lsKTsKICAgIGlmKHBEZXB0aFN0ZW5jaWwpIHsKICAgICAgICBJRGlyZWN0M0RTdXJmYWNlOV9SZWxlYXNlKHBEZXB0aFN0ZW5jaWwpOwogICAgICAgIHBEZXB0aFN0ZW5jaWwgPSBOVUxMOwogICAgfQoKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9HZXRSZW5kZXJTdGF0ZShwRGV2aWNlLCBEM0RSU19aRU5BQkxFLCAmc3RhdGUpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9HZXRSZW5kZXJTdGF0ZSBmYWlsZWQgd2l0aCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIG9rKHN0YXRlID09IEQzRFpCX0ZBTFNFLCAiRDNEUlNfWkVOQUJMRSBpcyAlc1xuIiwgc3RhdGUgPT0gRDNEWkJfRkFMU0UgPyAiRDNEWkJfRkFMU0UiIDogKHN0YXRlID09IEQzRFpCX1RSVUUgPyAiRDNEWkJfVFJVRSIgOiAiRDNEWkJfVVNFVyIpKTsKCmNsZWFudXA6CiAgICBpZihwRGVwdGhTdGVuY2lsKSBJRGlyZWN0M0RTdXJmYWNlOV9SZWxlYXNlKHBEZXB0aFN0ZW5jaWwpOwogICAgaWYocEQzZCkgSURpcmVjdDNEOV9SZWxlYXNlKHBEM2QpOwogICAgaWYocERldmljZSkgSURpcmVjdDNEOV9SZWxlYXNlKHBEZXZpY2UpOwogICAgaWYoaHduZCkgRGVzdHJveVdpbmRvdyhod25kKTsKfQoKLyogVGVzdCB3aGF0IGhhcHBlbnMgd2hlbiBJRGlyZWN0M0REZXZpY2U5X0RyYXdJbmRleGVkUHJpbWl0aXZlIGlzIGNhbGxlZCB3aXRob3V0IGEgdmFsaWQgaW5kZXggYnVmZmVyIHNldC4gKi8Kc3RhdGljIHZvaWQgdGVzdF9kcmF3X2luZGV4ZWQodm9pZCkKewogICAgc3RhdGljIGNvbnN0IHN0cnVjdCB7CiAgICAgICAgZmxvYXQgcG9zaXRpb25bM107CiAgICAgICAgRFdPUkQgY29sb3I7CiAgICB9IHF1YWRbXSA9IHsKICAgICAgICB7ey0xLjBmLCAtMS4wZiwgMC4wZn0sIDB4ZmZmZjAwMDB9LAogICAgICAgIHt7LTEuMGYsICAxLjBmLCAwLjBmfSwgMHhmZmZmMDAwMH0sCiAgICAgICAge3sgMS4wZiwgIDEuMGYsIDAuMGZ9LCAweGZmZmYwMDAwfSwKICAgICAgICB7eyAxLjBmLCAtMS4wZiwgMC4wZn0sIDB4ZmZmZjAwMDB9LAogICAgfTsKICAgIFdPUkQgaW5kaWNlc1tdID0gezAsIDEsIDIsIDMsIDAsIDJ9OwoKICAgIHN0YXRpYyBjb25zdCBEM0RWRVJURVhFTEVNRU5UOSBkZWNsX2VsZW1lbnRzW10gPSB7CiAgICAgICAgezAsIDAsICBEM0RERUNMVFlQRV9GTE9BVDMsICAgRDNEREVDTE1FVEhPRF9ERUZBVUxULCBEM0RERUNMVVNBR0VfUE9TSVRJT04sIDB9LAogICAgICAgIHswLCAxMiwgRDNEREVDTFRZUEVfRDNEQ09MT1IsIEQzRERFQ0xNRVRIT0RfREVGQVVMVCwgICAgRDNEREVDTFVTQUdFX0NPTE9SLCAwfSwKICAgICAgICBEM0RERUNMX0VORCgpCiAgICB9OwoKICAgIElEaXJlY3QzRFZlcnRleERlY2xhcmF0aW9uOSAqdmVydGV4X2RlY2xhcmF0aW9uID0gTlVMTDsKICAgIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjkgKnZlcnRleF9idWZmZXIgPSBOVUxMOwogICAgSURpcmVjdDNESW5kZXhCdWZmZXI5ICppbmRleF9idWZmZXIgPSBOVUxMOwogICAgRDNEUFJFU0VOVF9QQVJBTUVURVJTIHByZXNlbnRfcGFyYW1ldGVyczsKICAgIElEaXJlY3QzRERldmljZTkgKmRldmljZSA9IE5VTEw7CiAgICBJRGlyZWN0M0Q5ICpkM2Q5OwogICAgSFJFU1VMVCBocjsKICAgIEhXTkQgaHduZDsKICAgIHZvaWQgKnB0cjsKCiAgICBod25kID0gQ3JlYXRlV2luZG93KCJzdGF0aWMiLCAiZDNkOV90ZXN0IiwKICAgICAgICAgICAgMCwgMCwgMCwgMTAsIDEwLCAwLCAwLCAwLCAwKTsKICAgIGlmICghaHduZCkKICAgIHsKICAgICAgICBza2lwKCJGYWlsZWQgdG8gY3JlYXRlIHdpbmRvd1xuIik7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGQzZDkgPSBwRGlyZWN0M0RDcmVhdGU5KEQzRF9TREtfVkVSU0lPTik7CiAgICBpZiAoIWQzZDkpCiAgICB7CiAgICAgICAgc2tpcCgiRmFpbGVkIHRvIGNyZWF0ZSBJRGlyZWN0M0Q5IG9iamVjdFxuIik7CiAgICAgICAgZ290byBjbGVhbnVwOwogICAgfQoKICAgIFplcm9NZW1vcnkoJnByZXNlbnRfcGFyYW1ldGVycywgc2l6ZW9mKHByZXNlbnRfcGFyYW1ldGVycykpOwogICAgcHJlc2VudF9wYXJhbWV0ZXJzLldpbmRvd2VkID0gVFJVRTsKICAgIHByZXNlbnRfcGFyYW1ldGVycy5oRGV2aWNlV2luZG93ID0gaHduZDsKICAgIHByZXNlbnRfcGFyYW1ldGVycy5Td2FwRWZmZWN0ID0gRDNEU1dBUEVGRkVDVF9ESVNDQVJEOwoKICAgIGhyID0gSURpcmVjdDNEOV9DcmVhdGVEZXZpY2UoZDNkOSwgRDNEQURBUFRFUl9ERUZBVUxULCBEM0RERVZUWVBFX0hBTCwKICAgICAgICAgICAgTlVMTCwgRDNEQ1JFQVRFX1NPRlRXQVJFX1ZFUlRFWFBST0NFU1NJTkcsICZwcmVzZW50X3BhcmFtZXRlcnMsICZkZXZpY2UpOwogICAgaWYgKEZBSUxFRChocikgfHwgIWRldmljZSkKICAgIHsKICAgICAgICBza2lwKCJGYWlsZWQgdG8gY3JlYXRlIGRldmljZVxuIik7CiAgICAgICAgZ290byBjbGVhbnVwOwogICAgfQoKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9DcmVhdGVWZXJ0ZXhEZWNsYXJhdGlvbihkZXZpY2UsIGRlY2xfZWxlbWVudHMsICZ2ZXJ0ZXhfZGVjbGFyYXRpb24pOwogICAgb2soU1VDQ0VFREVEKGhyKSwgIkNyZWF0ZVZlcnRleERlY2xhcmF0aW9uIGZhaWxlZCAoMHglMDh4KVxuIiwgaHIpOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X1NldFZlcnRleERlY2xhcmF0aW9uKGRldmljZSwgdmVydGV4X2RlY2xhcmF0aW9uKTsKICAgIG9rKFNVQ0NFRURFRChociksICJTZXRWZXJ0ZXhEZWNsYXJhdGlvbiBmYWlsZWQgKDB4JTA4eClcbiIsIGhyKTsKCiAgICBociA9IElEaXJlY3QzRERldmljZTlfQ3JlYXRlVmVydGV4QnVmZmVyKGRldmljZSwgc2l6ZW9mKHF1YWQpLCAwLCAwLCBEM0RQT09MX0RFRkFVTFQsICZ2ZXJ0ZXhfYnVmZmVyLCBOVUxMKTsKICAgIG9rKFNVQ0NFRURFRChociksICJDcmVhdGVWZXJ0ZXhCdWZmZXIgZmFpbGVkICgweCUwOHgpXG4iLCBocik7CiAgICBociA9IElEaXJlY3QzRFZlcnRleEJ1ZmZlcjlfTG9jayh2ZXJ0ZXhfYnVmZmVyLCAwLCAwLCAmcHRyLCBEM0RMT0NLX0RJU0NBUkQpOwogICAgb2soU1VDQ0VFREVEKGhyKSwgIkxvY2sgZmFpbGVkICgweCUwOHgpXG4iLCBocik7CiAgICBtZW1jcHkocHRyLCBxdWFkLCBzaXplb2YocXVhZCkpOwogICAgaHIgPSBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI5X1VubG9jayh2ZXJ0ZXhfYnVmZmVyKTsKICAgIG9rKFNVQ0NFRURFRChociksICJVbmxvY2sgZmFpbGVkICgweCUwOHgpXG4iLCBocik7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0U3RyZWFtU291cmNlKGRldmljZSwgMCwgdmVydGV4X2J1ZmZlciwgMCwgc2l6ZW9mKCpxdWFkKSk7CiAgICBvayhTVUNDRUVERUQoaHIpLCAiU2V0U3RyZWFtU291cmNlIGZhaWxlZCAoMHglMDh4KVxuIiwgaHIpOwoKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9DcmVhdGVJbmRleEJ1ZmZlcihkZXZpY2UsIHNpemVvZihpbmRpY2VzKSwgMCwgRDNERk1UX0lOREVYMTYsIEQzRFBPT0xfREVGQVVMVCwgJmluZGV4X2J1ZmZlciwgTlVMTCk7CiAgICBvayhTVUNDRUVERUQoaHIpLCAiQ3JlYXRlSW5kZXhCdWZmZXIgZmFpbGVkICgweCUwOHgpXG4iLCBocik7CiAgICBociA9IElEaXJlY3QzREluZGV4QnVmZmVyOV9Mb2NrKGluZGV4X2J1ZmZlciwgMCwgMCwgJnB0ciwgRDNETE9DS19ESVNDQVJEKTsKICAgIG9rKFNVQ0NFRURFRChociksICJMb2NrIGZhaWxlZCAoMHglMDh4KVxuIiwgaHIpOwogICAgbWVtY3B5KHB0ciwgaW5kaWNlcywgc2l6ZW9mKGluZGljZXMpKTsKICAgIGhyID0gSURpcmVjdDNESW5kZXhCdWZmZXI5X1VubG9jayhpbmRleF9idWZmZXIpOwogICAgb2soU1VDQ0VFREVEKGhyKSwgIlVubG9jayBmYWlsZWQgKDB4JTA4eClcbiIsIGhyKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRSZW5kZXJTdGF0ZShkZXZpY2UsIEQzRFJTX0xJR0hUSU5HLCBGQUxTRSk7CiAgICBvayhTVUNDRUVERUQoaHIpLCAiU2V0UmVuZGVyU3RhdGUgRDNEUlNfTElHSFRJTkcgZmFpbGVkICgweCUwOHgpXG4iLCBocik7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfQmVnaW5TY2VuZShkZXZpY2UpOwogICAgb2soU1VDQ0VFREVEKGhyKSwgIkJlZ2luU2NlbmUgZmFpbGVkICgweCUwOHgpXG4iLCBocik7CgogICAgLyogTlVMTCBpbmRleCBidWZmZXIuIFNob3VsZCBmYWlsICovCiAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0SW5kaWNlcyhkZXZpY2UsIE5VTEwpOwogICAgb2soU1VDQ0VFREVEKGhyKSwgIlNldEluZGljZXMgZmFpbGVkICgweCUwOHgpXG4iLCBocik7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfRHJhd0luZGV4ZWRQcmltaXRpdmUoZGV2aWNlLCBEM0RQVF9UUklBTkdMRUxJU1QsIDAgLyogQmFzZVZlcnRleEluZGV4ICovLCAwIC8qIE1pbkluZGV4ICovLAogICAgICAgICAgICA0IC8qIE51bVZlcnRzICovLCAwIC8qIFN0YXJ0SW5kZXggKi8sIDIgLypQcmltQ291bnQgKi8pOwogICAgb2soaHIgPT0gRDNERVJSX0lOVkFMSURDQUxMLCAiRHJhd0luZGV4ZWRQcmltaXRpdmUgcmV0dXJuZWQgMHglMDh4LCBleHBlY3RlZCBEM0RFUlJfSU5WQUxJRENBTEwgKDB4JTA4eClcbiIsCiAgICAgICAgICAgIGhyLCBEM0RFUlJfSU5WQUxJRENBTEwpOwoKICAgIC8qIFZhbGlkIGluZGV4IGJ1ZmZlci4gU2hvdWxkIHN1Y2NlZWQgKi8KICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRJbmRpY2VzKGRldmljZSwgaW5kZXhfYnVmZmVyKTsKICAgIG9rKFNVQ0NFRURFRChociksICJTZXRJbmRpY2VzIGZhaWxlZCAoMHglMDh4KVxuIiwgaHIpOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0RyYXdJbmRleGVkUHJpbWl0aXZlKGRldmljZSwgRDNEUFRfVFJJQU5HTEVMSVNULCAwIC8qIEJhc2VWZXJ0ZXhJbmRleCAqLywgMCAvKiBNaW5JbmRleCAqLywKICAgICAgICAgICAgNCAvKiBOdW1WZXJ0cyAqLywgMCAvKiBTdGFydEluZGV4ICovLCAyIC8qUHJpbUNvdW50ICovKTsKICAgIG9rKFNVQ0NFRURFRChociksICJEcmF3SW5kZXhlZFByaW1pdGl2ZSBmYWlsZWQgKDB4JTA4eClcbiIsIGhyKTsKCiAgICBociA9IElEaXJlY3QzRERldmljZTlfRW5kU2NlbmUoZGV2aWNlKTsKICAgIG9rKFNVQ0NFRURFRChociksICJFbmRTY2VuZSBmYWlsZWQgKDB4JTA4eClcbiIsIGhyKTsKCiAgICBociA9IElEaXJlY3QzRERldmljZTlfUHJlc2VudChkZXZpY2UsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOwogICAgb2soU1VDQ0VFREVEKGhyKSwgIlByZXNlbnQgZmFpbGVkICgweCUwOHgpXG4iLCBocik7CgogICAgSURpcmVjdDNEVmVydGV4QnVmZmVyOV9SZWxlYXNlKHZlcnRleF9idWZmZXIpOwogICAgSURpcmVjdDNESW5kZXhCdWZmZXI5X1JlbGVhc2UoaW5kZXhfYnVmZmVyKTsKICAgIElEaXJlY3QzRFZlcnRleERlY2xhcmF0aW9uOV9SZWxlYXNlKHZlcnRleF9kZWNsYXJhdGlvbik7CgpjbGVhbnVwOgogICAgaWYgKGQzZDkpIElEaXJlY3QzRDlfUmVsZWFzZShkM2Q5KTsKICAgIGlmIChkZXZpY2UpIElEaXJlY3QzRERldmljZTlfUmVsZWFzZShkZXZpY2UpOwogICAgaWYgKGh3bmQpIERlc3Ryb3lXaW5kb3coaHduZCk7Cn0KCnN0YXRpYyB2b2lkIHRlc3RfbnVsbF9zdHJlYW0odm9pZCkKewogICAgSURpcmVjdDNEVmVydGV4QnVmZmVyOSAqYnVmZmVyID0gTlVMTDsKICAgIEQzRFBSRVNFTlRfUEFSQU1FVEVSUyBwcmVzZW50X3BhcmFtZXRlcnM7CiAgICBJRGlyZWN0M0REZXZpY2U5ICpkZXZpY2UgPSBOVUxMOwogICAgSURpcmVjdDNEOSAqZDNkOTsKICAgIEhXTkQgaHduZDsKICAgIEhSRVNVTFQgaHI7CiAgICBJRGlyZWN0M0RWZXJ0ZXhTaGFkZXI5ICpzaGFkZXIgPSBOVUxMOwogICAgSURpcmVjdDNEVmVydGV4RGVjbGFyYXRpb245ICpkZWNsOwogICAgRFdPUkQgc2hhZGVyX2NvZGVbXSA9IHsKICAgICAgICAweGZmZmUwMTAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdnNfMV8xICAgICAgICAgICAqLwogICAgICAgIDB4MDAwMDAwMWYsIDB4ODAwMDAwMDAsIDB4OTAwZjAwMDAsICAgICAvKiBkY2xfcG9zaXRpb24gdjAgICovCiAgICAgICAgMHgwMDAwMDAwMSwgMHhjMDBmMDAwMCwgMHg5MGU0MDAwMCwgICAgIC8qIG1vdiBvUG9zLCB2MCAgICAgKi8KICAgICAgICAweDAwMDBmZmZmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZW5kICAgICAgICAgICAgICAqLwogICAgfTsKICAgIHN0YXRpYyBjb25zdCBEM0RWRVJURVhFTEVNRU5UOSBkZWNsX2VsZW1lbnRzW10gPSB7CiAgICAgICAgezAsIDAsICBEM0RERUNMVFlQRV9GTE9BVDMsICAgRDNEREVDTE1FVEhPRF9ERUZBVUxULCBEM0RERUNMVVNBR0VfUE9TSVRJT04sIDB9LAogICAgICAgIHsxLCAwLCAgRDNEREVDTFRZUEVfRDNEQ09MT1IsIEQzRERFQ0xNRVRIT0RfREVGQVVMVCwgICAgRDNEREVDTFVTQUdFX0NPTE9SLCAwfSwKICAgICAgICBEM0RERUNMX0VORCgpCiAgICB9OwoKICAgIGQzZDkgPSBwRGlyZWN0M0RDcmVhdGU5KCBEM0RfU0RLX1ZFUlNJT04gKTsKICAgIG9rKGQzZDkgIT0gTlVMTCwgIkZhaWxlZCB0byBjcmVhdGUgSURpcmVjdDNEOSBvYmplY3RcbiIpOwogICAgaHduZCA9IENyZWF0ZVdpbmRvdyggInN0YXRpYyIsICJkM2Q5X3Rlc3QiLCBXU19PVkVSTEFQUEVEV0lORE9XLCAxMDAsIDEwMCwgMTYwLCAxNjAsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwgKTsKICAgIG9rKGh3bmQgIT0gTlVMTCwgIkZhaWxlZCB0byBjcmVhdGUgd2luZG93XG4iKTsKICAgIGlmICghZDNkOSB8fCAhaHduZCkgZ290byBjbGVhbnVwOwoKICAgIFplcm9NZW1vcnkoJnByZXNlbnRfcGFyYW1ldGVycywgc2l6ZW9mKHByZXNlbnRfcGFyYW1ldGVycykpOwogICAgcHJlc2VudF9wYXJhbWV0ZXJzLldpbmRvd2VkID0gVFJVRTsKICAgIHByZXNlbnRfcGFyYW1ldGVycy5oRGV2aWNlV2luZG93ID0gaHduZDsKICAgIHByZXNlbnRfcGFyYW1ldGVycy5Td2FwRWZmZWN0ID0gRDNEU1dBUEVGRkVDVF9ESVNDQVJEOwoKICAgIGhyID0gSURpcmVjdDNEOV9DcmVhdGVEZXZpY2UoIGQzZDksIEQzREFEQVBURVJfREVGQVVMVCwgRDNEREVWVFlQRV9IQUwgLyogbm8gTlVMTFJFRiBoZXJlICovLCBod25kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEQ1JFQVRFX1NPRlRXQVJFX1ZFUlRFWFBST0NFU1NJTkcsICZwcmVzZW50X3BhcmFtZXRlcnMsICZkZXZpY2UgKTsKICAgIG9rKGhyID09IEQzRF9PSyB8fCBociA9PSBEM0RFUlJfTk9UQVZBSUxBQkxFLCAiSURpcmVjdDNEOV9DcmVhdGVEZXZpY2UgZmFpbGVkIHdpdGggJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBpZighZGV2aWNlKQogICAgewogICAgICAgIHNraXAoIkZhaWxlZCB0byBjcmVhdGUgYSBkM2QgZGV2aWNlXG4iKTsKICAgICAgICBnb3RvIGNsZWFudXA7CiAgICB9CgogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0NyZWF0ZVZlcnRleFNoYWRlcihkZXZpY2UsIHNoYWRlcl9jb2RlLCAmc2hhZGVyKTsKICAgIGlmKEZBSUxFRChocikpIHsKICAgICAgICBza2lwKCJObyB2ZXJ0ZXggc2hhZGVyIHN1cHBvcnRcbiIpOwogICAgICAgIGdvdG8gY2xlYW51cDsKICAgIH0KICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9DcmVhdGVWZXJ0ZXhEZWNsYXJhdGlvbihkZXZpY2UsIGRlY2xfZWxlbWVudHMsICZkZWNsKTsKICAgIG9rKFNVQ0NFRURFRChociksICJJRGlyZWN0M0REZXZpY2U5X0NyZWF0ZVZlcnRleERlY2xhcmF0aW9uIGZhaWxlZCAoMHglMDh4KVxuIiwgaHIpOwogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0NyZWF0ZVZlcnRleEJ1ZmZlcihkZXZpY2UsIDEyICogc2l6ZW9mKGZsb2F0KSwgMCwgMCwgRDNEUE9PTF9NQU5BR0VELCAmYnVmZmVyLCBOVUxMKTsKICAgIG9rKFNVQ0NFRURFRChociksICJJRGlyZWN0M0REZXZpY2U5X0NyZWF0ZVZlcnRleEJ1ZmZlciBmYWlsZWQgKDB4JTA4eClcbiIsIGhyKTsKCiAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0U3RyZWFtU291cmNlKGRldmljZSwgMCwgYnVmZmVyLCAwLCBzaXplb2YoZmxvYXQpICogMyk7CiAgICBvayhTVUNDRUVERUQoaHIpLCAiSURpcmVjdDNERGV2aWNlOV9TZXRTdHJlYW1Tb3VyY2UgZmFpbGVkICgweCUwOHgpXG4iLCBocik7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0U3RyZWFtU291cmNlKGRldmljZSwgMSwgTlVMTCwgMCwgMCk7CiAgICBvayhTVUNDRUVERUQoaHIpLCAiSURpcmVjdDNERGV2aWNlOV9TZXRTdHJlYW1Tb3VyY2UgZmFpbGVkICgweCUwOHgpXG4iLCBocik7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfU2V0VmVydGV4U2hhZGVyKGRldmljZSwgc2hhZGVyKTsKICAgIG9rKFNVQ0NFRURFRChociksICJJRGlyZWN0M0REZXZpY2U5X1NldFZlcnRleFNoYWRlciBmYWlsZWQgKDB4JTA4eClcbiIsIGhyKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9TZXRWZXJ0ZXhEZWNsYXJhdGlvbihkZXZpY2UsIGRlY2wpOwogICAgb2soU1VDQ0VFREVEKGhyKSwgIklEaXJlY3QzRERldmljZTlfU2V0VmVydGV4RGVjbGFyYXRpb24gZmFpbGVkICgweCUwOHgpXG4iLCBocik7CgogICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0JlZ2luU2NlbmUoZGV2aWNlKTsKICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfQmVnaW5TY2VuZSBmYWlsZWQgKDB4JTA4eClcbiIsIGhyKTsKICAgIGlmKFNVQ0NFRURFRChocikpIHsKICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfRHJhd1ByaW1pdGl2ZShkZXZpY2UsIEQzRFBUX1BPSU5UTElTVCwgMCwgMSk7CiAgICAgICAgb2soU1VDQ0VFREVEKGhyKSwgIklEaXJlY3QzRERldmljZTlfRHJhd1ByaW1pdGl2ZSBmYWlsZWQgKDB4JTA4eClcbiIsIGhyKTsKCiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0VuZFNjZW5lKGRldmljZSk7CiAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9FbmRTY2VuZSBmYWlsZWQgKDB4JTA4eClcbiIsIGhyKTsKICAgIH0KCiAgICBJRGlyZWN0M0REZXZpY2U5X1NldFN0cmVhbVNvdXJjZShkZXZpY2UsIDAsIE5VTEwsIDAsIDApOwogICAgSURpcmVjdDNERGV2aWNlOV9TZXRWZXJ0ZXhTaGFkZXIoZGV2aWNlLCBOVUxMKTsKICAgIElEaXJlY3QzRERldmljZTlfU2V0VmVydGV4RGVjbGFyYXRpb24oZGV2aWNlLCBOVUxMKTsKCiAgICBjbGVhbnVwOgogICAgaWYoZGVjbCkgSURpcmVjdDNEVmVydGV4RGVjbGFyYXRpb245X1JlbGVhc2UoZGVjbCk7CiAgICBpZihzaGFkZXIpIElEaXJlY3QzRFZlcnRleFNoYWRlcjlfUmVsZWFzZShzaGFkZXIpOwogICAgaWYoZGV2aWNlKSBJRGlyZWN0M0REZXZpY2U5X1JlbGVhc2UoZGV2aWNlKTsKICAgIGlmKGQzZDkpIElEaXJlY3QzRDlfUmVsZWFzZShkM2Q5KTsKfQoKc3RhdGljIGlubGluZSBjb25zdCBjaGFyICpkZWJ1Z19kM2Rwb29sKEQzRFBPT0wgcG9vbCkgewogICAgc3dpdGNoKHBvb2wpIHsKICAgICAgICBjYXNlIEQzRFBPT0xfREVGQVVMVDogcmV0dXJuICJEM0RQT09MX0RFRkFVTFQiOwogICAgICAgIGNhc2UgRDNEUE9PTF9TWVNURU1NRU06IHJldHVybiAiRDNEUE9PTF9TWVNURU1NRU0iOwogICAgICAgIGNhc2UgRDNEUE9PTF9TQ1JBVENIOiByZXR1cm4gIkQzRFBPT0xfU0NSQVRDSCI7CiAgICAgICAgY2FzZSBEM0RQT09MX01BTkFHRUQ6IHJldHVybiAiRDNEUE9PTF9NQU5BR0VEIjsKICAgICAgICBkZWZhdWx0OgogICAgICAgIHJldHVybiAidW5rbm93biBwb29sIjsKICAgIH0KfQoKc3RhdGljIHZvaWQgdGVzdF92ZXJ0ZXhfYnVmZmVyX2FsaWdubWVudCh2b2lkKQp7CiAgICBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI5ICpidWZmZXIgPSBOVUxMOwogICAgRDNEUFJFU0VOVF9QQVJBTUVURVJTIHByZXNlbnRfcGFyYW1ldGVyczsKICAgIElEaXJlY3QzRERldmljZTkgKmRldmljZSA9IE5VTEw7CiAgICBJRGlyZWN0M0Q5ICpkM2Q5OwogICAgSFdORCBod25kOwogICAgSFJFU1VMVCBocjsKICAgIEQzRFBPT0wgcG9vbHNbXSA9IHtEM0RQT09MX0RFRkFVTFQsIEQzRFBPT0xfU1lTVEVNTUVNLCBEM0RQT09MX1NDUkFUQ0gsIEQzRFBPT0xfTUFOQUdFRH07CiAgICBEV09SRCBzaXplc1tdID0gezEsIDQsIDE2LCAxNywgMzIsIDMzLCA2NCwgNjUsIDEwMjQsIDEwMjUsIDEwNDg1NzYsIDEwNDg1Nzd9OwogICAgdW5zaWduZWQgaW50IGksIGo7CiAgICB2b2lkICpkYXRhOwoKICAgIGQzZDkgPSBwRGlyZWN0M0RDcmVhdGU5KCBEM0RfU0RLX1ZFUlNJT04gKTsKICAgIG9rKGQzZDkgIT0gTlVMTCwgIkZhaWxlZCB0byBjcmVhdGUgSURpcmVjdDNEOSBvYmplY3RcbiIpOwogICAgaHduZCA9IENyZWF0ZVdpbmRvdyggInN0YXRpYyIsICJkM2Q5X3Rlc3QiLCBXU19PVkVSTEFQUEVEV0lORE9XLCAxMDAsIDEwMCwgMTYwLCAxNjAsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwgKTsKICAgIG9rKGh3bmQgIT0gTlVMTCwgIkZhaWxlZCB0byBjcmVhdGUgd2luZG93XG4iKTsKICAgIGlmICghZDNkOSB8fCAhaHduZCkgZ290byBjbGVhbnVwOwoKICAgIFplcm9NZW1vcnkoJnByZXNlbnRfcGFyYW1ldGVycywgc2l6ZW9mKHByZXNlbnRfcGFyYW1ldGVycykpOwogICAgcHJlc2VudF9wYXJhbWV0ZXJzLldpbmRvd2VkID0gVFJVRTsKICAgIHByZXNlbnRfcGFyYW1ldGVycy5oRGV2aWNlV2luZG93ID0gaHduZDsKICAgIHByZXNlbnRfcGFyYW1ldGVycy5Td2FwRWZmZWN0ID0gRDNEU1dBUEVGRkVDVF9ESVNDQVJEOwoKICAgIGhyID0gSURpcmVjdDNEOV9DcmVhdGVEZXZpY2UoIGQzZDksIEQzREFEQVBURVJfREVGQVVMVCwgRDNEREVWVFlQRV9IQUwgLyogbm8gTlVMTFJFRiBoZXJlICovLCBod25kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEQ1JFQVRFX1NPRlRXQVJFX1ZFUlRFWFBST0NFU1NJTkcsICZwcmVzZW50X3BhcmFtZXRlcnMsICZkZXZpY2UgKTsKICAgIG9rKGhyID09IEQzRF9PSyB8fCBociA9PSBEM0RFUlJfTk9UQVZBSUxBQkxFLCAiSURpcmVjdDNEOV9DcmVhdGVEZXZpY2UgZmFpbGVkIHdpdGggJXNcbiIsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBpZighZGV2aWNlKQogICAgewogICAgICAgIHNraXAoIkZhaWxlZCB0byBjcmVhdGUgYSBkM2QgZGV2aWNlXG4iKTsKICAgICAgICBnb3RvIGNsZWFudXA7CiAgICB9CgogICAgZm9yKGkgPSAwOyBpIDwgKHNpemVvZihzaXplcykgLyBzaXplb2Yoc2l6ZXNbMF0pKTsgaSsrKSB7CiAgICAgICAgZm9yKGogPSAwOyBqIDwgKHNpemVvZihwb29scykgLyBzaXplb2YocG9vbHNbMF0pKTsgaisrKSB7CiAgICAgICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9DcmVhdGVWZXJ0ZXhCdWZmZXIoZGV2aWNlLCBzaXplc1tpXSwgMCwgMCwgcG9vbHNbal0sICZidWZmZXIsIE5VTEwpOwogICAgICAgICAgICBpZihwb29sc1tqXSA9PSBEM0RQT09MX1NDUkFUQ0gpIHsKICAgICAgICAgICAgICAgIG9rKGhyID09IEQzREVSUl9JTlZBTElEQ0FMTCwgIkNyZWF0aW5nIGEgRDNEUE9PTF9TQ1JBVENIIGJ1ZmZlciByZXR1cm5lZCAoMHglMDh4KVxuIiwgaHIpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgb2soU1VDQ0VFREVEKGhyKSwgIklEaXJlY3QzRERldmljZTlfQ3JlYXRlVmVydGV4QnVmZmVyIGZhaWxlZCAoMHglMDh4KS4gUG9vbCA9ICVzLCBzaXplICVkXG4iLCBociwKICAgICAgICAgICAgICAgICAgIGRlYnVnX2QzZHBvb2wocG9vbHNbal0pLCBzaXplc1tpXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYoRkFJTEVEKGhyKSkgY29udGludWU7CgogICAgICAgICAgICBociA9IElEaXJlY3QzRFZlcnRleEJ1ZmZlcjlfTG9jayhidWZmZXIsIDAsIDAsICh2b2lkICoqKSAmZGF0YSwgMCk7CiAgICAgICAgICAgIG9rKFNVQ0NFRURFRChociksICJJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI5X0xvY2sgZmFpbGVkICgweCUwOHgpXG4iLCBocik7CiAgICAgICAgICAgIG9rKCgoRFdPUkRfUFRSKSBkYXRhICYgMzEpID09IDAsICJWZXJ0ZXggYnVmZmVyIHN0YXJ0IGFkZHJlc3MgaXMgbm90IDMyIGJ5dGUgYWxpZ25lZChzaXplOiAlZCwgcG9vbDogJXMsIGRhdGE6ICVwKVxuIiwKICAgICAgICAgICAgICAgc2l6ZXNbaV0sIGRlYnVnX2QzZHBvb2wocG9vbHNbal0pLCBkYXRhKTsKICAgICAgICAgICAgaHIgPSBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI5X1VubG9jayhidWZmZXIpOwogICAgICAgICAgICBvayhTVUNDRUVERUQoaHIpLCAiSURpcmVjdDNEVmVydGV4QnVmZmVyOV9VbmxvY2sgZmFpbGVkICgweCUwOHgpXG4iLCBocik7CgogICAgICAgICAgICBpZihidWZmZXIpIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjlfUmVsZWFzZShidWZmZXIpOwogICAgICAgIH0KICAgIH0KCiAgICBjbGVhbnVwOgogICAgaWYoZDNkOSkgSURpcmVjdDNEOV9SZWxlYXNlKGQzZDkpOwp9CgpzdGF0aWMgdm9pZCB0ZXN0X2xpZ2h0cyh2b2lkKQp7CiAgICBEM0RQUkVTRU5UX1BBUkFNRVRFUlMgcHJlc2VudF9wYXJhbWV0ZXJzOwogICAgSURpcmVjdDNERGV2aWNlOSAqZGV2aWNlID0gTlVMTDsKICAgIElEaXJlY3QzRDkgKmQzZDk7CiAgICBIV05EIGh3bmQ7CiAgICBIUkVTVUxUIGhyOwogICAgdW5zaWduZWQgaW50IGk7CiAgICBCT09MIGVuYWJsZWQ7CiAgICBEM0RDQVBTOSBjYXBzOwoKICAgIGQzZDkgPSBwRGlyZWN0M0RDcmVhdGU5KCBEM0RfU0RLX1ZFUlNJT04gKTsKICAgIG9rKGQzZDkgIT0gTlVMTCwgIkZhaWxlZCB0byBjcmVhdGUgSURpcmVjdDNEOSBvYmplY3RcbiIpOwogICAgaHduZCA9IENyZWF0ZVdpbmRvdyggInN0YXRpYyIsICJkM2Q5X3Rlc3QiLCBXU19PVkVSTEFQUEVEV0lORE9XLCAxMDAsIDEwMCwgMTYwLCAxNjAsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwgKTsKICAgIG9rKGh3bmQgIT0gTlVMTCwgIkZhaWxlZCB0byBjcmVhdGUgd2luZG93XG4iKTsKICAgIGlmICghZDNkOSB8fCAhaHduZCkgZ290byBjbGVhbnVwOwoKICAgIFplcm9NZW1vcnkoJnByZXNlbnRfcGFyYW1ldGVycywgc2l6ZW9mKHByZXNlbnRfcGFyYW1ldGVycykpOwogICAgcHJlc2VudF9wYXJhbWV0ZXJzLldpbmRvd2VkID0gVFJVRTsKICAgIHByZXNlbnRfcGFyYW1ldGVycy5oRGV2aWNlV2luZG93ID0gaHduZDsKICAgIHByZXNlbnRfcGFyYW1ldGVycy5Td2FwRWZmZWN0ID0gRDNEU1dBUEVGRkVDVF9ESVNDQVJEOwoKICAgIGhyID0gSURpcmVjdDNEOV9DcmVhdGVEZXZpY2UoIGQzZDksIEQzREFEQVBURVJfREVGQVVMVCwgRDNEREVWVFlQRV9IQUwsIGh3bmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RDUkVBVEVfSEFSRFdBUkVfVkVSVEVYUFJPQ0VTU0lORyB8IEQzRENSRUFURV9QVVJFREVWSUNFLCAmcHJlc2VudF9wYXJhbWV0ZXJzLCAmZGV2aWNlICk7CiAgICBvayhociA9PSBEM0RfT0sgfHwgaHIgPT0gRDNERVJSX05PVEFWQUlMQUJMRSwgIklEaXJlY3QzRDlfQ3JlYXRlRGV2aWNlIGZhaWxlZCB3aXRoICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgaWYoIWRldmljZSkKICAgIHsKICAgICAgICBza2lwKCJGYWlsZWQgdG8gY3JlYXRlIGEgZDNkIGRldmljZVxuIik7CiAgICAgICAgZ290byBjbGVhbnVwOwogICAgfQoKICAgIG1lbXNldCgmY2FwcywgMCwgc2l6ZW9mKGNhcHMpKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9HZXREZXZpY2VDYXBzKGRldmljZSwgJmNhcHMpOwogICAgb2soaHIgPT0gRDNEX09LLCAiSURpcmVjdDNERGV2aWNlOV9HZXREZXZpY2VDYXBzIGZhaWxlZCB3aXRoICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwoKICAgIGZvcihpID0gMTsgaSA8PSBjYXBzLk1heEFjdGl2ZUxpZ2h0czsgaSsrKSB7CiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0xpZ2h0RW5hYmxlKGRldmljZSwgaSwgVFJVRSk7CiAgICAgICAgb2soaHIgPT0gRDNEX09LLCAiRW5hYmxpbmcgbGlnaHQgJXUgZmFpbGVkIHdpdGggJXNcbiIsIGksIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0dldExpZ2h0RW5hYmxlKGRldmljZSwgaSwgJmVuYWJsZWQpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIkdldExpZ2h0RW5hYmxlIG9uIGxpZ2h0ICV1IGZhaWxlZCB3aXRoICVzXG4iLCBpLCBEWEdldEVycm9yU3RyaW5nOShocikpOwogICAgICAgIG9rKGVuYWJsZWQsICJMaWdodCAlZCBpcyAlc1xuIiwgaSwgZW5hYmxlZCA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpOwogICAgfQoKICAgIC8qIFRPRE86IFRlc3QgdGhlIHJlbmRlcmluZyByZXN1bHRzIGluIHRoaXMgc2l0dWF0aW9uICovCiAgICBociA9IElEaXJlY3QzRERldmljZTlfTGlnaHRFbmFibGUoZGV2aWNlLCBpICsgMSwgVFJVRSk7CiAgICBvayhociA9PSBEM0RfT0ssICJFbmFibGluZyBvbmUgbGlnaHQgbW9yZSB0aGFuIHN1cHBvcnRlZCByZXR1cm5lZCAlc1xuIiwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9HZXRMaWdodEVuYWJsZShkZXZpY2UsIGkgKyAxLCAmZW5hYmxlZCk7CiAgICBvayhociA9PSBEM0RfT0ssICJHZXRMaWdodEVuYWJsZSBvbiBsaWdodCAldSBmYWlsZWQgd2l0aCAlc1xuIiwgaSArIDEsIERYR2V0RXJyb3JTdHJpbmc5KGhyKSk7CiAgICBvayhlbmFibGVkLCAiTGlnaHQgJWQgaXMgJXNcbiIsIGkgKyAxLCBlbmFibGVkID8gImVuYWJsZWQiIDogImRpc2FibGVkIik7CiAgICBociA9IElEaXJlY3QzRERldmljZTlfTGlnaHRFbmFibGUoZGV2aWNlLCBpICsgMSwgRkFMU0UpOwogICAgb2soaHIgPT0gRDNEX09LLCAiRGlzYWJsaW5nIHRoZSBhZGRpdGlvbmFsIHJldHVybmVkICVzXG4iLCBEWEdldEVycm9yU3RyaW5nOShocikpOwoKICAgIGZvcihpID0gMTsgaSA8PSBjYXBzLk1heEFjdGl2ZUxpZ2h0czsgaSsrKSB7CiAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0xpZ2h0RW5hYmxlKGRldmljZSwgaSwgRkFMU0UpOwogICAgICAgIG9rKGhyID09IEQzRF9PSywgIkRpc2FibGluZyBsaWdodCAldSBmYWlsZWQgd2l0aCAlc1xuIiwgaSwgRFhHZXRFcnJvclN0cmluZzkoaHIpKTsKICAgIH0KCiAgICBjbGVhbnVwOgogICAgaWYoZGV2aWNlKSBJRGlyZWN0M0REZXZpY2U5X1JlbGVhc2UoZGV2aWNlKTsKICAgIGlmKGQzZDkpIElEaXJlY3QzRDlfUmVsZWFzZShkM2Q5KTsKfQoKU1RBUlRfVEVTVChkZXZpY2UpCnsKICAgIEhNT0RVTEUgZDNkOV9oYW5kbGUgPSBMb2FkTGlicmFyeUEoICJkM2Q5LmRsbCIgKTsKICAgIGlmICghZDNkOV9oYW5kbGUpCiAgICB7CiAgICAgICAgc2tpcCgiQ291bGQgbm90IGxvYWQgZDNkOS5kbGxcbiIpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBwRGlyZWN0M0RDcmVhdGU5ID0gKHZvaWQgKilHZXRQcm9jQWRkcmVzcyggZDNkOV9oYW5kbGUsICJEaXJlY3QzRENyZWF0ZTkiICk7CiAgICBvayhwRGlyZWN0M0RDcmVhdGU5ICE9IE5VTEwsICJGYWlsZWQgdG8gZ2V0IGFkZHJlc3Mgb2YgRGlyZWN0M0RDcmVhdGU5XG4iKTsKICAgIGlmIChwRGlyZWN0M0RDcmVhdGU5KQogICAgewogICAgICAgIHRlc3RfZGlzcGxheV9tb2RlcygpOwogICAgICAgIHRlc3Rfc3dhcGNoYWluKCk7CiAgICAgICAgdGVzdF9yZWZjb3VudCgpOwogICAgICAgIHRlc3RfbWlwbWFwX2xldmVscygpOwogICAgICAgIHRlc3RfY3Vyc29yKCk7CiAgICAgICAgdGVzdF9yZXNldCgpOwogICAgICAgIHRlc3Rfc2NlbmUoKTsKICAgICAgICB0ZXN0X2xpbWl0cygpOwogICAgICAgIHRlc3RfZGVwdGhzdGVuY2lsdGVzdCgpOwogICAgICAgIHRlc3RfZHJhd19pbmRleGVkKCk7CiAgICAgICAgdGVzdF9udWxsX3N0cmVhbSgpOwogICAgICAgIHRlc3RfdmVydGV4X2J1ZmZlcl9hbGlnbm1lbnQoKTsKICAgICAgICB0ZXN0X2xpZ2h0cygpOwogICAgfQp9Cg==