LyoJQ29weXJpZ2h0OiAJqSBDb3B5cmlnaHQgMjAwNSBBcHBsZSBDb21wdXRlciwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgoKCURpc2NsYWltZXI6CUlNUE9SVEFOVDogIFRoaXMgQXBwbGUgc29mdHdhcmUgaXMgc3VwcGxpZWQgdG8geW91IGJ5IEFwcGxlIENvbXB1dGVyLCBJbmMuCgkJCSgiQXBwbGUiKSBpbiBjb25zaWRlcmF0aW9uIG9mIHlvdXIgYWdyZWVtZW50IHRvIHRoZSBmb2xsb3dpbmcgdGVybXMsIGFuZCB5b3VyCgkJCXVzZSwgaW5zdGFsbGF0aW9uLCBtb2RpZmljYXRpb24gb3IgcmVkaXN0cmlidXRpb24gb2YgdGhpcyBBcHBsZSBzb2Z0d2FyZQoJCQljb25zdGl0dXRlcyBhY2NlcHRhbmNlIG9mIHRoZXNlIHRlcm1zLiAgSWYgeW91IGRvIG5vdCBhZ3JlZSB3aXRoIHRoZXNlIHRlcm1zLAoJCQlwbGVhc2UgZG8gbm90IHVzZSwgaW5zdGFsbCwgbW9kaWZ5IG9yIHJlZGlzdHJpYnV0ZSB0aGlzIEFwcGxlIHNvZnR3YXJlLgoKCQkJSW4gY29uc2lkZXJhdGlvbiBvZiB5b3VyIGFncmVlbWVudCB0byBhYmlkZSBieSB0aGUgZm9sbG93aW5nIHRlcm1zLCBhbmQgc3ViamVjdAoJCQl0byB0aGVzZSB0ZXJtcywgQXBwbGUgZ3JhbnRzIHlvdSBhIHBlcnNvbmFsLCBub24tZXhjbHVzaXZlIGxpY2Vuc2UsIHVuZGVyIEFwcGxl1XMKCQkJY29weXJpZ2h0cyBpbiB0aGlzIG9yaWdpbmFsIEFwcGxlIHNvZnR3YXJlICh0aGUgIkFwcGxlIFNvZnR3YXJlIiksIHRvIHVzZSwKCQkJcmVwcm9kdWNlLCBtb2RpZnkgYW5kIHJlZGlzdHJpYnV0ZSB0aGUgQXBwbGUgU29mdHdhcmUsIHdpdGggb3Igd2l0aG91dAoJCQltb2RpZmljYXRpb25zLCBpbiBzb3VyY2UgYW5kL29yIGJpbmFyeSBmb3JtczsgcHJvdmlkZWQgdGhhdCBpZiB5b3UgcmVkaXN0cmlidXRlCgkJCXRoZSBBcHBsZSBTb2Z0d2FyZSBpbiBpdHMgZW50aXJldHkgYW5kIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgeW91IG11c3QgcmV0YWluCgkJCXRoaXMgbm90aWNlIGFuZCB0aGUgZm9sbG93aW5nIHRleHQgYW5kIGRpc2NsYWltZXJzIGluIGFsbCBzdWNoIHJlZGlzdHJpYnV0aW9ucyBvZgoJCQl0aGUgQXBwbGUgU29mdHdhcmUuICBOZWl0aGVyIHRoZSBuYW1lLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzIG9yIGxvZ29zIG9mCgkJCUFwcGxlIENvbXB1dGVyLCBJbmMuIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhlCgkJCUFwcGxlIFNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIGZyb20gQXBwbGUuICBFeGNlcHQgYXMKCQkJZXhwcmVzc2x5IHN0YXRlZCBpbiB0aGlzIG5vdGljZSwgbm8gb3RoZXIgcmlnaHRzIG9yIGxpY2Vuc2VzLCBleHByZXNzIG9yIGltcGxpZWQsCgkJCWFyZSBncmFudGVkIGJ5IEFwcGxlIGhlcmVpbiwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBhbnkgcGF0ZW50IHJpZ2h0cyB0aGF0CgkJCW1heSBiZSBpbmZyaW5nZWQgYnkgeW91ciBkZXJpdmF0aXZlIHdvcmtzIG9yIGJ5IG90aGVyIHdvcmtzIGluIHdoaWNoIHRoZSBBcHBsZQoJCQlTb2Z0d2FyZSBtYXkgYmUgaW5jb3Jwb3JhdGVkLgoKCQkJVGhlIEFwcGxlIFNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEFwcGxlIG9uIGFuICJBUyBJUyIgYmFzaXMuICBBUFBMRSBNQUtFUyBOTwoJCQlXQVJSQU5USUVTLCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gVEhFIElNUExJRUQKCQkJV0FSUkFOVElFUyBPRiBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgoJCQlQVVJQT1NFLCBSRUdBUkRJTkcgVEhFIEFQUExFIFNPRlRXQVJFIE9SIElUUyBVU0UgQU5EIE9QRVJBVElPTiBBTE9ORSBPUiBJTgoJCQlDT01CSU5BVElPTiBXSVRIIFlPVVIgUFJPRFVDVFMuCgoJCQlJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCwgSU5DSURFTlRBTCBPUgoJCQlDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFCgkJCUdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQoJCQlBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UsIFJFUFJPRFVDVElPTiwgTU9ESUZJQ0FUSU9OIEFORC9PUiBESVNUUklCVVRJT04KCQkJT0YgVEhFIEFQUExFIFNPRlRXQVJFLCBIT1dFVkVSIENBVVNFRCBBTkQgV0hFVEhFUiBVTkRFUiBUSEVPUlkgT0YgQ09OVFJBQ1QsIFRPUlQKCQkJKElOQ0xVRElORyBORUdMSUdFTkNFKSwgU1RSSUNUIExJQUJJTElUWSBPUiBPVEhFUldJU0UsIEVWRU4gSUYgQVBQTEUgSEFTIEJFRU4KCQkJQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCiovCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCUNBRGVidWdNYWNyb3MuaAoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwojaWYgIWRlZmluZWQoX19DQURlYnVnTWFjcm9zX2hfXykKI2RlZmluZSBfX0NBRGVidWdNYWNyb3NfaF9fCgovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci8vCUNBRGVidWdNYWNyb3MKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKLy8jZGVmaW5lCUNvcmVBdWRpb19TdG9wT25GYWlsdXJlCQkJMQovLyNkZWZpbmUJQ29yZUF1ZGlvX1RpbWVTdGFtcE1lc3NhZ2VzCQkxCi8vI2RlZmluZQlDb3JlQXVkaW9fVGhyZWFkU3RhbXBNZXNzYWdlcwkxCi8vI2RlZmluZQlDb3JlQXVkaW9fRmx1c2hEZWJ1Z01lc3NhZ2VzCTEKCiNkZWZpbmUJQ0E0Q0NUb0NTdHJpbmcodGhlNENDKQl7ICgoY2hhciopJnRoZTRDQylbMF0sICgoY2hhciopJnRoZTRDQylbMV0sICgoY2hhciopJnRoZTRDQylbMl0sICgoY2hhciopJnRoZTRDQylbM10sIDAgfQoKI3ByYWdtYSBtYXJrCUJhc2ljIERlZmluaXRpb25zCgojaWYJREVCVUcgfHwgQ29yZUF1ZGlvX0RlYnVnCgkKCS8vIGNhbiBiZSB1c2VkIHRvIGJyZWFrIGludG8gZGVidWdnZXIgaW1tZWRpYXRlbHksIGFsc28gc2VlIENBRGVidWdnZXIKCSNkZWZpbmUgQnVzRXJyb3IoKQkJKCoobG9uZyAqKTAgPSAwKQoJCgkvLwliYXNpYyBkZWJ1Z2dpbmcgcHJpbnQgcm91dGluZXMKCSNpZglUQVJHRVRfT1NfTUFDICYmICFUQVJHRVRfQVBJX01BQ19DQVJCT04KCQlleHRlcm4gcGFzY2FsIHZvaWQgRGVidWdTdHIoY29uc3QgdW5zaWduZWQgY2hhciogZGVidWdnZXJNc2cpOwoJCSNkZWZpbmUJRGVidWdNZXNzYWdlKG1zZykJRGVidWdTdHIoIlxwIm1zZykKCQkjZGVmaW5lIERlYnVnTWVzc2FnZU4xKG1zZywgTjEpCgkJI2RlZmluZSBEZWJ1Z01lc3NhZ2VOMihtc2csIE4xLCBOMikKCQkjZGVmaW5lIERlYnVnTWVzc2FnZU4zKG1zZywgTjEsIE4yLCBOMykKCSNlbHNlCgkJI2luY2x1ZGUgIkNBRGVidWdQcmludGYuaCIKCQkKCQkjaWYJKENvcmVBdWRpb19GbHVzaERlYnVnTWVzc2FnZXMgJiYgIUNvcmVBdWRpb19Vc2VTeXNMb2cpIHx8IGRlZmluZWQoQ29yZUF1ZGlvX1VzZVNpZGVGaWxlKQoJCQkjZGVmaW5lCUZsdXNoUnRuCTtmZmx1c2goRGVidWdQcmludGZGaWxlKQoJCSNlbHNlCgkJCSNkZWZpbmUJRmx1c2hSdG4KCQkjZW5kaWYKCQkKCQkjaWYJCUNvcmVBdWRpb19UaHJlYWRTdGFtcE1lc3NhZ2VzCgkJCSNpbmNsdWRlIDxwdGhyZWFkLmg+CgkJCSNpbmNsdWRlICJDQUhvc3RUaW1lQmFzZS5oIgoJCQkjZGVmaW5lCURlYnVnTWVzc2FnZShtc2cpCQkJCQkJCQkJCURlYnVnUHJpbnRmUnRuKERlYnVnUHJpbnRmRmlsZSwgIiVwICUuNGY6ICVzIkRlYnVnUHJpbnRmTGluZUVuZGluZywgcHRocmVhZF9zZWxmKCksICgoRmxvYXQ2NCkoQ0FIb3N0VGltZUJhc2U6OkdldEN1cnJlbnRUaW1lSW5OYW5vcygpKSAvIDEwMDAwMDAuMCksIG1zZykgRmx1c2hSdG4KCQkJI2RlZmluZSBEZWJ1Z01lc3NhZ2VOMShtc2csIE4xKQkJCQkJCQkJCURlYnVnUHJpbnRmUnRuKERlYnVnUHJpbnRmRmlsZSwgIiVwICUuNGY6ICJtc2ciXG4iLCBwdGhyZWFkX3NlbGYoKSwgKChGbG9hdDY0KShDQUhvc3RUaW1lQmFzZTo6R2V0Q3VycmVudFRpbWVJbk5hbm9zKCkpIC8gMTAwMDAwMC4wKSwgTjEpIEZsdXNoUnRuCgkJCSNkZWZpbmUgRGVidWdNZXNzYWdlTjIobXNnLCBOMSwgTjIpCQkJCQkJCQlEZWJ1Z1ByaW50ZlJ0bihEZWJ1Z1ByaW50ZkZpbGUsICIlcCAlLjRmOiAibXNnIlxuIiwgcHRocmVhZF9zZWxmKCksICgoRmxvYXQ2NCkoQ0FIb3N0VGltZUJhc2U6OkdldEN1cnJlbnRUaW1lSW5OYW5vcygpKSAvIDEwMDAwMDAuMCksIE4xLCBOMikgRmx1c2hSdG4KCQkJI2RlZmluZSBEZWJ1Z01lc3NhZ2VOMyhtc2csIE4xLCBOMiwgTjMpCQkJCQkJCURlYnVnUHJpbnRmUnRuKERlYnVnUHJpbnRmRmlsZSwgIiVwICUuNGY6ICJtc2ciXG4iLCBwdGhyZWFkX3NlbGYoKSwgKChGbG9hdDY0KShDQUhvc3RUaW1lQmFzZTo6R2V0Q3VycmVudFRpbWVJbk5hbm9zKCkpIC8gMTAwMDAwMC4wKSwgTjEsIE4yLCBOMykgRmx1c2hSdG4KCQkJI2RlZmluZSBEZWJ1Z01lc3NhZ2VONChtc2csIE4xLCBOMiwgTjMsIE40KQkJCQkJCURlYnVnUHJpbnRmUnRuKERlYnVnUHJpbnRmRmlsZSwgIiVwICUuNGY6ICJtc2ciXG4iLCBwdGhyZWFkX3NlbGYoKSwgKChGbG9hdDY0KShDQUhvc3RUaW1lQmFzZTo6R2V0Q3VycmVudFRpbWVJbk5hbm9zKCkpIC8gMTAwMDAwMC4wKSwgTjEsIE4yLCBOMywgTjQpIEZsdXNoUnRuCgkJCSNkZWZpbmUgRGVidWdNZXNzYWdlTjUobXNnLCBOMSwgTjIsIE4zLCBONCwgTjUpCQkJCQlEZWJ1Z1ByaW50ZlJ0bihEZWJ1Z1ByaW50ZkZpbGUsICIlcCAlLjRmOiAibXNnIlxuIiwgcHRocmVhZF9zZWxmKCksICgoRmxvYXQ2NCkoQ0FIb3N0VGltZUJhc2U6OkdldEN1cnJlbnRUaW1lSW5OYW5vcygpKSAvIDEwMDAwMDAuMCksIE4xLCBOMiwgTjMsIE40LCBONSkgRmx1c2hSdG4KCQkJI2RlZmluZSBEZWJ1Z01lc3NhZ2VONihtc2csIE4xLCBOMiwgTjMsIE40LCBONSwgTjYpCQkJCURlYnVnUHJpbnRmUnRuKERlYnVnUHJpbnRmRmlsZSwgIiVwICUuNGY6ICJtc2ciXG4iLCBwdGhyZWFkX3NlbGYoKSwgKChGbG9hdDY0KShDQUhvc3RUaW1lQmFzZTo6R2V0Q3VycmVudFRpbWVJbk5hbm9zKCkpIC8gMTAwMDAwMC4wKSwgTjEsIE4yLCBOMywgTjQsIE41LCBONikgRmx1c2hSdG4KCQkJI2RlZmluZSBEZWJ1Z01lc3NhZ2VONyhtc2csIE4xLCBOMiwgTjMsIE40LCBONSwgTjYsIE43KQkJCURlYnVnUHJpbnRmUnRuKERlYnVnUHJpbnRmRmlsZSwgIiVwICUuNGY6ICJtc2ciXG4iLCBwdGhyZWFkX3NlbGYoKSwgKChGbG9hdDY0KShDQUhvc3RUaW1lQmFzZTo6R2V0Q3VycmVudFRpbWVJbk5hbm9zKCkpIC8gMTAwMDAwMC4wKSwgTjEsIE4yLCBOMywgTjQsIE41LCBONiwgTjcpIEZsdXNoUnRuCgkJCSNkZWZpbmUgRGVidWdNZXNzYWdlTjgobXNnLCBOMSwgTjIsIE4zLCBONCwgTjUsIE42LCBONywgTjgpCQlEZWJ1Z1ByaW50ZlJ0bihEZWJ1Z1ByaW50ZkZpbGUsICIlcCAlLjRmOiAibXNnIlxuIiwgcHRocmVhZF9zZWxmKCksICgoRmxvYXQ2NCkoQ0FIb3N0VGltZUJhc2U6OkdldEN1cnJlbnRUaW1lSW5OYW5vcygpKSAvIDEwMDAwMDAuMCksIE4xLCBOMiwgTjMsIE40LCBONSwgTjYsIE43LCBOOCkgRmx1c2hSdG4KCQkJI2RlZmluZSBEZWJ1Z01lc3NhZ2VOOShtc2csIE4xLCBOMiwgTjMsIE40LCBONSwgTjYsIE43LCBOOCwgTjkpCURlYnVnUHJpbnRmUnRuKERlYnVnUHJpbnRmRmlsZSwgIiVwICUuNGY6ICJtc2ciXG4iLCBwdGhyZWFkX3NlbGYoKSwgKChGbG9hdDY0KShDQUhvc3RUaW1lQmFzZTo6R2V0Q3VycmVudFRpbWVJbk5hbm9zKCkpIC8gMTAwMDAwMC4wKSwgTjEsIE4yLCBOMywgTjQsIE41LCBONiwgTjcsIE44LCBOOSkgRmx1c2hSdG4KCQkjZWxpZglDb3JlQXVkaW9fVGltZVN0YW1wTWVzc2FnZXMKCQkJI2luY2x1ZGUgIkNBSG9zdFRpbWVCYXNlLmgiCgkJCSNkZWZpbmUJRGVidWdNZXNzYWdlKG1zZykJCQkJCQkJCQkJRGVidWdQcmludGZSdG4oRGVidWdQcmludGZGaWxlLCAiJS40ZjogJXMiRGVidWdQcmludGZMaW5lRW5kaW5nLCBwdGhyZWFkX3NlbGYoKSwgKChGbG9hdDY0KShDQUhvc3RUaW1lQmFzZTo6R2V0Q3VycmVudFRpbWVJbk5hbm9zKCkpIC8gMTAwMDAwMC4wKSwgbXNnKSBGbHVzaFJ0bgoJCQkjZGVmaW5lIERlYnVnTWVzc2FnZU4xKG1zZywgTjEpCQkJCQkJCQkJRGVidWdQcmludGZSdG4oRGVidWdQcmludGZGaWxlLCAiJS40ZjogIm1zZyBEZWJ1Z1ByaW50ZkxpbmVFbmRpbmcsICgoRmxvYXQ2NCkoQ0FIb3N0VGltZUJhc2U6OkdldEN1cnJlbnRUaW1lSW5OYW5vcygpKSAvIDEwMDAwMDAuMCksIE4xKSBGbHVzaFJ0bgoJCQkjZGVmaW5lIERlYnVnTWVzc2FnZU4yKG1zZywgTjEsIE4yKQkJCQkJCQkJRGVidWdQcmludGZSdG4oRGVidWdQcmludGZGaWxlLCAiJS40ZjogIm1zZyBEZWJ1Z1ByaW50ZkxpbmVFbmRpbmcsICgoRmxvYXQ2NCkoQ0FIb3N0VGltZUJhc2U6OkdldEN1cnJlbnRUaW1lSW5OYW5vcygpKSAvIDEwMDAwMDAuMCksIE4xLCBOMikgRmx1c2hSdG4KCQkJI2RlZmluZSBEZWJ1Z01lc3NhZ2VOMyhtc2csIE4xLCBOMiwgTjMpCQkJCQkJCURlYnVnUHJpbnRmUnRuKERlYnVnUHJpbnRmRmlsZSwgIiUuNGY6ICJtc2cgRGVidWdQcmludGZMaW5lRW5kaW5nLCAoKEZsb2F0NjQpKENBSG9zdFRpbWVCYXNlOjpHZXRDdXJyZW50VGltZUluTmFub3MoKSkgLyAxMDAwMDAwLjApLCBOMSwgTjIsIE4zKSBGbHVzaFJ0bgoJCQkjZGVmaW5lIERlYnVnTWVzc2FnZU40KG1zZywgTjEsIE4yLCBOMywgTjQpCQkJCQkJRGVidWdQcmludGZSdG4oRGVidWdQcmludGZGaWxlLCAiJS40ZjogIm1zZyBEZWJ1Z1ByaW50ZkxpbmVFbmRpbmcsICgoRmxvYXQ2NCkoQ0FIb3N0VGltZUJhc2U6OkdldEN1cnJlbnRUaW1lSW5OYW5vcygpKSAvIDEwMDAwMDAuMCksIE4xLCBOMiwgTjMsIE40KSBGbHVzaFJ0bgoJCQkjZGVmaW5lIERlYnVnTWVzc2FnZU41KG1zZywgTjEsIE4yLCBOMywgTjQsIE41KQkJCQkJRGVidWdQcmludGZSdG4oRGVidWdQcmludGZGaWxlLCAiJS40ZjogIm1zZyBEZWJ1Z1ByaW50ZkxpbmVFbmRpbmcsICgoRmxvYXQ2NCkoQ0FIb3N0VGltZUJhc2U6OkdldEN1cnJlbnRUaW1lSW5OYW5vcygpKSAvIDEwMDAwMDAuMCksIE4xLCBOMiwgTjMsIE40LCBONSkgRmx1c2hSdG4KCQkJI2RlZmluZSBEZWJ1Z01lc3NhZ2VONihtc2csIE4xLCBOMiwgTjMsIE40LCBONSwgTjYpCQkJCURlYnVnUHJpbnRmUnRuKERlYnVnUHJpbnRmRmlsZSwgIiUuNGY6ICJtc2cgRGVidWdQcmludGZMaW5lRW5kaW5nLCAoKEZsb2F0NjQpKENBSG9zdFRpbWVCYXNlOjpHZXRDdXJyZW50VGltZUluTmFub3MoKSkgLyAxMDAwMDAwLjApLCBOMSwgTjIsIE4zLCBONCwgTjUsIE42KSBGbHVzaFJ0bgoJCQkjZGVmaW5lIERlYnVnTWVzc2FnZU43KG1zZywgTjEsIE4yLCBOMywgTjQsIE41LCBONiwgTjcpCQkJRGVidWdQcmludGZSdG4oRGVidWdQcmludGZGaWxlLCAiJS40ZjogIm1zZyBEZWJ1Z1ByaW50ZkxpbmVFbmRpbmcsICgoRmxvYXQ2NCkoQ0FIb3N0VGltZUJhc2U6OkdldEN1cnJlbnRUaW1lSW5OYW5vcygpKSAvIDEwMDAwMDAuMCksIE4xLCBOMiwgTjMsIE40LCBONSwgTjYsIE43KSBGbHVzaFJ0bgoJCQkjZGVmaW5lIERlYnVnTWVzc2FnZU44KG1zZywgTjEsIE4yLCBOMywgTjQsIE41LCBONiwgTjcsIE44KQkJRGVidWdQcmludGZSdG4oRGVidWdQcmludGZGaWxlLCAiJS40ZjogIm1zZyBEZWJ1Z1ByaW50ZkxpbmVFbmRpbmcsICgoRmxvYXQ2NCkoQ0FIb3N0VGltZUJhc2U6OkdldEN1cnJlbnRUaW1lSW5OYW5vcygpKSAvIDEwMDAwMDAuMCksIE4xLCBOMiwgTjMsIE40LCBONSwgTjYsIE43LCBOOCkgRmx1c2hSdG4KCQkJI2RlZmluZSBEZWJ1Z01lc3NhZ2VOOShtc2csIE4xLCBOMiwgTjMsIE40LCBONSwgTjYsIE43LCBOOCwgTjkpCURlYnVnUHJpbnRmUnRuKERlYnVnUHJpbnRmRmlsZSwgIiUuNGY6ICJtc2cgRGVidWdQcmludGZMaW5lRW5kaW5nLCAoKEZsb2F0NjQpKENBSG9zdFRpbWVCYXNlOjpHZXRDdXJyZW50VGltZUluTmFub3MoKSkgLyAxMDAwMDAwLjApLCBOMSwgTjIsIE4zLCBONCwgTjUsIE42LCBONywgTjgsIE45KSBGbHVzaFJ0bgoJCSNlbHNlCgkJCSNkZWZpbmUJRGVidWdNZXNzYWdlKG1zZykJCQkJCQkJCQkJRGVidWdQcmludGZSdG4oRGVidWdQcmludGZGaWxlLCAiJXMiRGVidWdQcmludGZMaW5lRW5kaW5nLCBtc2cpIEZsdXNoUnRuCgkJCSNkZWZpbmUgRGVidWdNZXNzYWdlTjEobXNnLCBOMSkJCQkJCQkJCQlEZWJ1Z1ByaW50ZlJ0bihEZWJ1Z1ByaW50ZkZpbGUsIG1zZyBEZWJ1Z1ByaW50ZkxpbmVFbmRpbmcsIE4xKSBGbHVzaFJ0bgoJCQkjZGVmaW5lIERlYnVnTWVzc2FnZU4yKG1zZywgTjEsIE4yKQkJCQkJCQkJRGVidWdQcmludGZSdG4oRGVidWdQcmludGZGaWxlLCBtc2cgRGVidWdQcmludGZMaW5lRW5kaW5nLCBOMSwgTjIpIEZsdXNoUnRuCgkJCSNkZWZpbmUgRGVidWdNZXNzYWdlTjMobXNnLCBOMSwgTjIsIE4zKQkJCQkJCQlEZWJ1Z1ByaW50ZlJ0bihEZWJ1Z1ByaW50ZkZpbGUsIG1zZyBEZWJ1Z1ByaW50ZkxpbmVFbmRpbmcsIE4xLCBOMiwgTjMpIEZsdXNoUnRuCgkJCSNkZWZpbmUgRGVidWdNZXNzYWdlTjQobXNnLCBOMSwgTjIsIE4zLCBONCkJCQkJCQlEZWJ1Z1ByaW50ZlJ0bihEZWJ1Z1ByaW50ZkZpbGUsIG1zZyBEZWJ1Z1ByaW50ZkxpbmVFbmRpbmcsIE4xLCBOMiwgTjMsIE40KSBGbHVzaFJ0bgoJCQkjZGVmaW5lIERlYnVnTWVzc2FnZU41KG1zZywgTjEsIE4yLCBOMywgTjQsIE41KQkJCQkJRGVidWdQcmludGZSdG4oRGVidWdQcmludGZGaWxlLCBtc2cgRGVidWdQcmludGZMaW5lRW5kaW5nLCBOMSwgTjIsIE4zLCBONCwgTjUpIEZsdXNoUnRuCgkJCSNkZWZpbmUgRGVidWdNZXNzYWdlTjYobXNnLCBOMSwgTjIsIE4zLCBONCwgTjUsIE42KQkJCQlEZWJ1Z1ByaW50ZlJ0bihEZWJ1Z1ByaW50ZkZpbGUsIG1zZyBEZWJ1Z1ByaW50ZkxpbmVFbmRpbmcsIE4xLCBOMiwgTjMsIE40LCBONSwgTjYpIEZsdXNoUnRuCgkJCSNkZWZpbmUgRGVidWdNZXNzYWdlTjcobXNnLCBOMSwgTjIsIE4zLCBONCwgTjUsIE42LCBONykJCQlEZWJ1Z1ByaW50ZlJ0bihEZWJ1Z1ByaW50ZkZpbGUsIG1zZyBEZWJ1Z1ByaW50ZkxpbmVFbmRpbmcsIE4xLCBOMiwgTjMsIE40LCBONSwgTjYsIE43KSBGbHVzaFJ0bgoJCQkjZGVmaW5lIERlYnVnTWVzc2FnZU44KG1zZywgTjEsIE4yLCBOMywgTjQsIE41LCBONiwgTjcsIE44KQkJRGVidWdQcmludGZSdG4oRGVidWdQcmludGZGaWxlLCBtc2cgRGVidWdQcmludGZMaW5lRW5kaW5nLCBOMSwgTjIsIE4zLCBONCwgTjUsIE42LCBONywgTjgpIEZsdXNoUnRuCgkJCSNkZWZpbmUgRGVidWdNZXNzYWdlTjkobXNnLCBOMSwgTjIsIE4zLCBONCwgTjUsIE42LCBONywgTjgsIE45KQlEZWJ1Z1ByaW50ZlJ0bihEZWJ1Z1ByaW50ZkZpbGUsIG1zZyBEZWJ1Z1ByaW50ZkxpbmVFbmRpbmcsIE4xLCBOMiwgTjMsIE40LCBONSwgTjYsIE43LCBOOCwgTjkpIEZsdXNoUnRuCgkJI2VuZGlmCgkjZW5kaWYKCXZvaWQJRGVidWdQcmludChjb25zdCBjaGFyICpmbXQsIC4uLik7CS8vIGNhbiBiZSB1c2VkIGxpa2UgcHJpbnRmCgkjZGVmaW5lIERFQlVHUFJJTlQobXNnKSBEZWJ1Z1ByaW50IG1zZwkJLy8gaGF2ZSB0byBkb3VibGUtcGFyZW50aGVzaXplIGFyZ2xpc3QgKHNlZSBEZWJ1Z2dpbmcuaCkKCSNpZiBWRVJCT1NFCgkJI2RlZmluZSB2cHJpbnQobXNnKSBERUJVR1BSSU5UKG1zZykKCSNlbHNlCgkJI2RlZmluZSB2cHJpbnQobXNnKQoJI2VuZGlmCgkKCSNpZglDb3JlQXVkaW9fU3RvcE9uRmFpbHVyZQoJCSNpbmNsdWRlICJDQURlYnVnZ2VyLmgiCgkJI2RlZmluZSBTVE9QCUNBRGVidWdnZXJTdG9wKCkKCSNlbHNlCgkJI2RlZmluZQlTVE9QCgkjZW5kaWYKCiNlbHNlCgkjZGVmaW5lCURlYnVnTWVzc2FnZShtc2cpCgkjZGVmaW5lIERlYnVnTWVzc2FnZU4xKG1zZywgTjEpCgkjZGVmaW5lIERlYnVnTWVzc2FnZU4yKG1zZywgTjEsIE4yKQoJI2RlZmluZSBEZWJ1Z01lc3NhZ2VOMyhtc2csIE4xLCBOMiwgTjMpCgkjZGVmaW5lIERlYnVnTWVzc2FnZU40KG1zZywgTjEsIE4yLCBOMywgTjQpCgkjZGVmaW5lIERlYnVnTWVzc2FnZU41KG1zZywgTjEsIE4yLCBOMywgTjQsIE41KQoJI2RlZmluZSBEZWJ1Z01lc3NhZ2VONihtc2csIE4xLCBOMiwgTjMsIE40LCBONSwgTjYpCgkjZGVmaW5lIERlYnVnTWVzc2FnZU43KG1zZywgTjEsIE4yLCBOMywgTjQsIE41LCBONiwgTjcpCgkjZGVmaW5lIERlYnVnTWVzc2FnZU44KG1zZywgTjEsIE4yLCBOMywgTjQsIE41LCBONiwgTjcsIE44KQoJI2RlZmluZSBEZWJ1Z01lc3NhZ2VOOShtc2csIE4xLCBOMiwgTjMsIE40LCBONSwgTjYsIE43LCBOOCwgTjkpCgkjZGVmaW5lIERFQlVHUFJJTlQobXNnKQoJI2RlZmluZSB2cHJpbnQobXNnKQoJI2RlZmluZQlTVE9QCiNlbmRpZgoKdm9pZAlMb2dFcnJvcihjb25zdCBjaGFyICpmbXQsIC4uLik7CQkJLy8gd3JpdGVzIHRvIHN5c2xvZyAoYW5kIHN0ZGVyciBpZiBkZWJ1Z2dpbmcpCnZvaWQJTG9nV2FybmluZyhjb25zdCBjaGFyICpmbXQsIC4uLik7CQkvLyB3cml0ZXMgdG8gc3lzbG9nIChhbmQgc3RkZXJyIGlmIGRlYnVnZ2luZykKCiNpZglERUJVRyB8fCBDb3JlQXVkaW9fRGVidWcKCiNwcmFnbWEgbWFyawlEZWJ1ZyBNYWNyb3MKCiNkZWZpbmUJQXNzZXJ0KGluQ29uZGl0aW9uLCBpbk1lc3NhZ2UpCQkJCQkJCQkJCQkJCVwKCQkJaWYoIShpbkNvbmRpdGlvbikpCQkJCQkJCQkJCQkJCQkJXAoJCQl7CQkJCQkJCQkJCQkJCQkJCQkJCVwKCQkJCURlYnVnTWVzc2FnZShpbk1lc3NhZ2UpOwkJCQkJCQkJCQkJCVwKCQkJCVNUT1A7CQkJCQkJCQkJCQkJCQkJCQlcCgkJCX0KCiNkZWZpbmUJQXNzZXJ0Tm9FcnJvcihpbkVycm9yLCBpbk1lc3NhZ2UpCQkJCQkJCQkJCQkJXAoJCQl7CQkJCQkJCQkJCQkJCQkJCQkJCVwKCQkJCVNJbnQzMiBfX0VyciA9IChpbkVycm9yKTsJCQkJCQkJCQkJCQlcCgkJCQlpZihfX0VyciAhPSAwKQkJCQkJCQkJCQkJCQkJCVwKCQkJCXsJCQkJCQkJCQkJCQkJCQkJCQlcCgkJCQkJY2hhciBfXzRDQ1s1XSA9IENBNENDVG9DU3RyaW5nKF9fRXJyKTsJCQkJCQkJCVwKCQkJCQlEZWJ1Z01lc3NhZ2VOMihpbk1lc3NhZ2UgIiwgRXJyb3I6ICVsZCAoJXMpIiwgX19FcnIsIF9fNENDKTsJCVwKCQkJCQlTVE9QOwkJCQkJCQkJCQkJCQkJCQlcCgkJCQl9CQkJCQkJCQkJCQkJCQkJCQkJXAoJCQl9CgojZGVmaW5lCUFzc2VydE5vS2VybmVsRXJyb3IoaW5FcnJvciwgaW5NZXNzYWdlKQkJCQkJCQkJCQkJXAoJCQl7CQkJCQkJCQkJCQkJCQkJCQkJCVwKCQkJCXVuc2lnbmVkIGludCBfX0VyciA9ICh1bnNpZ25lZCBpbnQpKGluRXJyb3IpOwkJCQkJCQlcCgkJCQlpZihfX0VyciAhPSAwKQkJCQkJCQkJCQkJCQkJCVwKCQkJCXsJCQkJCQkJCQkJCQkJCQkJCQlcCgkJCQkJRGVidWdNZXNzYWdlTjEoaW5NZXNzYWdlICIsIEVycm9yOiAweCVYIiwgX19FcnIpOwkJCQkJXAoJCQkJCVNUT1A7CQkJCQkJCQkJCQkJCQkJCVwKCQkJCX0JCQkJCQkJCQkJCQkJCQkJCQlcCgkJCX0KCiNkZWZpbmUJRmFpbElmKGluQ29uZGl0aW9uLCBpbkhhbmRsZXIsIGluTWVzc2FnZSkJCQkJCQkJCQkJXAoJCQlpZihpbkNvbmRpdGlvbikJCQkJCQkJCQkJCQkJCQkJXAoJCQl7CQkJCQkJCQkJCQkJCQkJCQkJCVwKCQkJCURlYnVnTWVzc2FnZShpbk1lc3NhZ2UpOwkJCQkJCQkJCQkJCVwKCQkJCVNUT1A7CQkJCQkJCQkJCQkJCQkJCQlcCgkJCQlnb3RvIGluSGFuZGxlcjsJCQkJCQkJCQkJCQkJCQlcCgkJCX0KCiNkZWZpbmUJRmFpbFdpdGhBY3Rpb24oaW5Db25kaXRpb24sIGluQWN0aW9uLCBpbkhhbmRsZXIsIGluTWVzc2FnZSkJCQkJCQlcCgkJCWlmKGluQ29uZGl0aW9uKQkJCQkJCQkJCQkJCQkJCQlcCgkJCXsJCQkJCQkJCQkJCQkJCQkJCQkJXAoJCQkJRGVidWdNZXNzYWdlKGluTWVzc2FnZSk7CQkJCQkJCQkJCQkJXAoJCQkJU1RPUDsJCQkJCQkJCQkJCQkJCQkJCVwKCQkJCXsgaW5BY3Rpb247IH0JCQkJCQkJCQkJCQkJCQlcCgkJCQlnb3RvIGluSGFuZGxlcjsJCQkJCQkJCQkJCQkJCQlcCgkJCX0KCiNkZWZpbmUJRmFpbElmTlVMTChpblBvaW50ZXIsIGluQWN0aW9uLCBpbkhhbmRsZXIsIGluTWVzc2FnZSkJCQkJCQkJXAoJCQlpZigoaW5Qb2ludGVyKSA9PSBOVUxMKQkJCQkJCQkJCQkJCQkJXAoJCQl7CQkJCQkJCQkJCQkJCQkJCQkJCVwKCQkJCURlYnVnTWVzc2FnZShpbk1lc3NhZ2UpOwkJCQkJCQkJCQkJCVwKCQkJCVNUT1A7CQkJCQkJCQkJCQkJCQkJCQlcCgkJCQl7IGluQWN0aW9uOyB9CQkJCQkJCQkJCQkJCQkJXAoJCQkJZ290byBpbkhhbmRsZXI7CQkJCQkJCQkJCQkJCQkJXAoJCQl9CgojZGVmaW5lCUZhaWxJZktlcm5lbEVycm9yKGluS2VybmVsRXJyb3IsIGluRXhjZXB0aW9uLCBpbk1lc3NhZ2UpCQkJCQkJXAoJCQl7CQkJCQkJCQkJCQkJCQkJCQkJCVwKCQkJCWtlcm5fcmV0dXJuX3QgX19FcnIgPSAoaW5LZXJuZWxFcnJvcik7CQkJCQkJCQkJXAoJCQkJaWYoX19FcnIgIT0gMCkJCQkJCQkJCQkJCQkJCQlcCgkJCQl7CQkJCQkJCQkJCQkJCQkJCQkJXAoJCQkJCURlYnVnTWVzc2FnZU4xKGluTWVzc2FnZSAiLCBFcnJvcjogMHglWCIsIF9fRXJyKTsJCQkJCVwKCQkJCQlTVE9QOwkJCQkJCQkJCQkJCQkJCQlcCgkJCQkJeyBpbkFjdGlvbjsgfQkJCQkJCQkJCQkJCQkJXAoJCQkJCWdvdG8gaW5IYW5kbGVyOwkJCQkJCQkJCQkJCQkJXAoJCQkJfQkJCQkJCQkJCQkJCQkJCQkJCVwKCQkJfQoKI2RlZmluZQlGYWlsSWZFcnJvcihpbkVycm9yLCBpbkV4Y2VwdGlvbiwgaW5NZXNzYWdlKQkJCQkJCQkJCVwKCQkJewkJCQkJCQkJCQkJCQkJCQkJCQlcCgkJCQlTSW50MzIgX19FcnIgPSAoaW5FcnJvcik7CQkJCQkJCQkJCQkJXAoJCQkJaWYoX19FcnIgIT0gMCkJCQkJCQkJCQkJCQkJCQlcCgkJCQl7CQkJCQkJCQkJCQkJCQkJCQkJXAoJCQkJCWNoYXIgX180Q0NbNV0gPSBDQTRDQ1RvQ1N0cmluZyhfX0Vycik7CQkJCQkJCQlcCgkJCQkJRGVidWdNZXNzYWdlTjIoaW5NZXNzYWdlICIsIEVycm9yOiAlbGQgKCVzKSIsIF9fRXJyLCBfXzRDQyk7CQlcCgkJCQkJU1RPUDsJCQkJCQkJCQkJCQkJCQkJXAoJCQkJCXsgaW5BY3Rpb247IH0JCQkJCQkJCQkJCQkJCVwKCQkJCQlnb3RvIGluSGFuZGxlcjsJCQkJCQkJCQkJCQkJCVwKCQkJCX0JCQkJCQkJCQkJCQkJCQkJCQlcCgkJCX0KCiNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQoKI2RlZmluZSBUaHJvdyhpbkV4Y2VwdGlvbikgIFNUT1A7IHRocm93IChpbkV4Y2VwdGlvbikKCiNkZWZpbmUJVGhyb3dJZihpbkNvbmRpdGlvbiwgaW5FeGNlcHRpb24sIGluTWVzc2FnZSkJCQkJCQkJCQlcCgkJCWlmKGluQ29uZGl0aW9uKQkJCQkJCQkJCQkJCQkJCQlcCgkJCXsJCQkJCQkJCQkJCQkJCQkJCQkJXAoJCQkJRGVidWdNZXNzYWdlKGluTWVzc2FnZSk7CQkJCQkJCQkJCQkJXAoJCQkJVGhyb3coaW5FeGNlcHRpb24pOwkJCQkJCQkJCQkJCQkJXAoJCQl9CgojZGVmaW5lCVRocm93SWZOVUxMKGluUG9pbnRlciwgaW5FeGNlcHRpb24sIGluTWVzc2FnZSkJCQkJCQkJCQlcCgkJCWlmKChpblBvaW50ZXIpID09IE5VTEwpCQkJCQkJCQkJCQkJCQlcCgkJCXsJCQkJCQkJCQkJCQkJCQkJCQkJXAoJCQkJRGVidWdNZXNzYWdlKGluTWVzc2FnZSk7CQkJCQkJCQkJCQkJXAoJCQkJVGhyb3coaW5FeGNlcHRpb24pOwkJCQkJCQkJCQkJCQkJXAoJCQl9CgojZGVmaW5lCVRocm93SWZLZXJuZWxFcnJvcihpbktlcm5lbEVycm9yLCBpbkV4Y2VwdGlvbiwgaW5NZXNzYWdlKQkJCQkJCVwKCQkJewkJCQkJCQkJCQkJCQkJCQkJCQlcCgkJCQlrZXJuX3JldHVybl90IF9fRXJyID0gKGluS2VybmVsRXJyb3IpOwkJCQkJCQkJCVwKCQkJCWlmKF9fRXJyICE9IDApCQkJCQkJCQkJCQkJCQkJXAoJCQkJewkJCQkJCQkJCQkJCQkJCQkJCVwKCQkJCQlEZWJ1Z01lc3NhZ2VOMShpbk1lc3NhZ2UgIiwgRXJyb3I6IDB4JVgiLCBfX0Vycik7CQkJCQlcCgkJCQkJVGhyb3coaW5FeGNlcHRpb24pOwkJCQkJCQkJCQkJCQlcCgkJCQl9CQkJCQkJCQkJCQkJCQkJCQkJXAoJCQl9CgojZGVmaW5lCVRocm93SWZFcnJvcihpbkVycm9yLCBpbkV4Y2VwdGlvbiwgaW5NZXNzYWdlKQkJCQkJCQkJCVwKCQkJewkJCQkJCQkJCQkJCQkJCQkJCQlcCgkJCQlTSW50MzIgX19FcnIgPSAoaW5FcnJvcik7CQkJCQkJCQkJCQkJXAoJCQkJaWYoX19FcnIgIT0gMCkJCQkJCQkJCQkJCQkJCQlcCgkJCQl7CQkJCQkJCQkJCQkJCQkJCQkJXAoJCQkJCWNoYXIgX180Q0NbNV0gPSBDQTRDQ1RvQ1N0cmluZyhfX0Vycik7CQkJCQkJCQlcCgkJCQkJRGVidWdNZXNzYWdlTjIoaW5NZXNzYWdlICIsIEVycm9yOiAlbGQgKCVzKSIsIF9fRXJyLCBfXzRDQyk7CQlcCgkJCQkJVGhyb3coaW5FeGNlcHRpb24pOwkJCQkJCQkJCQkJCQlcCgkJCQl9CQkJCQkJCQkJCQkJCQkJCQkJXAoJCQl9CgojaWYgVEFSR0VUX09TX1dJTjMyCiNkZWZpbmUJVGhyb3dJZldpbkVycm9yKGluRXJyb3IsIGluRXhjZXB0aW9uLCBpbk1lc3NhZ2UpCQkJCQkJCQlcCgkJCXsJCQkJCQkJCQkJCQkJCQkJCQkJXAoJCQkJSFJFU1VMVCBfX0VyciA9IChpbkVycm9yKTsJCQkJCQkJCQkJCQlcCgkJCQlpZihGQUlMRUQoX19FcnIpKQkJCQkJCQkJCQkJCQkJXAoJCQkJewkJCQkJCQkJCQkJCQkJCQkJCVwKCQkJCQlEZWJ1Z01lc3NhZ2VOMShpbk1lc3NhZ2UgIiwgRXJyb3I6IDB4JVgiLCBfX0Vycik7CQkJCQlcCgkJCQkJVGhyb3coaW5FeGNlcHRpb24pOwkJCQkJCQkJCQkJCQlcCgkJCQl9CQkJCQkJCQkJCQkJCQkJCQkJXAoJCQl9CiNlbmRpZgoKI2RlZmluZQlTdWJjbGFzc1Jlc3BvbnNpYmlsaXR5KGluTWV0aG9kTmFtZSwgaW5FeGNlcHRpb24pCQkJCQkJCQlcCgkJCXsJCQkJCQkJCQkJCQkJCQkJCQkJXAoJCQkJRGVidWdNZXNzYWdlKGluTWV0aG9kTmFtZSI6IFN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQgdGhpcyBtZXRob2QiKTsJXAoJCQkJVGhyb3coaW5FeGNlcHRpb24pOwkJCQkJCQkJCQkJCQkJXAoJCQl9CgojZW5kaWYJLy8JZGVmaW5lZChfX2NwbHVzcGx1cykKCiNlbHNlCgojcHJhZ21hIG1hcmsJUmVsZWFzZSBNYWNyb3MKCiNkZWZpbmUJQXNzZXJ0KGluQ29uZGl0aW9uLCBpbk1lc3NhZ2UpCQkJCQkJCQkJCQkJCVwKCQkJaWYoIShpbkNvbmRpdGlvbikpCQkJCQkJCQkJCQkJCQkJXAoJCQl7CQkJCQkJCQkJCQkJCQkJCQkJCVwKCQkJCVNUT1A7CQkJCQkJCQkJCQkJCQkJCQlcCgkJCX0KCiNkZWZpbmUJQXNzZXJ0Tm9FcnJvcihpbkVycm9yLCBpbk1lc3NhZ2UpCQkJCQkJCQkJCQkJXAoJCQl7CQkJCQkJCQkJCQkJCQkJCQkJCVwKCQkJCVNJbnQzMiBfX0VyciA9IChpbkVycm9yKTsJCQkJCQkJCQkJCQlcCgkJCQlpZihfX0VyciAhPSAwKQkJCQkJCQkJCQkJCQkJCVwKCQkJCXsJCQkJCQkJCQkJCQkJCQkJCQlcCgkJCQkJU1RPUDsJCQkJCQkJCQkJCQkJCQkJXAoJCQkJfQkJCQkJCQkJCQkJCQkJCQkJCVwKCQkJfQoKI2RlZmluZQlBc3NlcnROb0tlcm5lbEVycm9yKGluRXJyb3IsIGluTWVzc2FnZSkJCQkJCQkJCQkJCVwKCQkJewkJCQkJCQkJCQkJCQkJCQkJCQlcCgkJCQl1bnNpZ25lZCBpbnQgX19FcnIgPSAodW5zaWduZWQgaW50KShpbkVycm9yKTsJCQkJCQkJXAoJCQkJaWYoX19FcnIgIT0gMCkJCQkJCQkJCQkJCQkJCQlcCgkJCQl7CQkJCQkJCQkJCQkJCQkJCQkJXAoJCQkJCVNUT1A7CQkJCQkJCQkJCQkJCQkJCVwKCQkJCX0JCQkJCQkJCQkJCQkJCQkJCQlcCgkJCX0KCiNkZWZpbmUJRmFpbElmKGluQ29uZGl0aW9uLCBpbkhhbmRsZXIsIGluTWVzc2FnZSkJCQkJCQkJCQkJXAoJCQlpZihpbkNvbmRpdGlvbikJCQkJCQkJCQkJCQkJCQkJXAoJCQl7CQkJCQkJCQkJCQkJCQkJCQkJCVwKCQkJCVNUT1A7CQkJCQkJCQkJCQkJCQkJCQlcCgkJCQlnb3RvIGluSGFuZGxlcjsJCQkJCQkJCQkJCQkJCQlcCgkJCX0KCiNkZWZpbmUJRmFpbFdpdGhBY3Rpb24oaW5Db25kaXRpb24sIGluQWN0aW9uLCBpbkhhbmRsZXIsIGluTWVzc2FnZSkJCQkJCQlcCgkJCWlmKGluQ29uZGl0aW9uKQkJCQkJCQkJCQkJCQkJCQlcCgkJCXsJCQkJCQkJCQkJCQkJCQkJCQkJXAoJCQkJU1RPUDsJCQkJCQkJCQkJCQkJCQkJCVwKCQkJCXsgaW5BY3Rpb247IH0JCQkJCQkJCQkJCQkJCQlcCgkJCQlnb3RvIGluSGFuZGxlcjsJCQkJCQkJCQkJCQkJCQlcCgkJCX0KCiNkZWZpbmUJRmFpbElmTlVMTChpblBvaW50ZXIsIGluQWN0aW9uLCBpbkhhbmRsZXIsIGluTWVzc2FnZSkJCQkJCQkJXAoJCQlpZigoaW5Qb2ludGVyKSA9PSBOVUxMKQkJCQkJCQkJCQkJCQkJXAoJCQl7CQkJCQkJCQkJCQkJCQkJCQkJCVwKCQkJCVNUT1A7CQkJCQkJCQkJCQkJCQkJCQlcCgkJCQl7IGluQWN0aW9uOyB9CQkJCQkJCQkJCQkJCQkJXAoJCQkJZ290byBpbkhhbmRsZXI7CQkJCQkJCQkJCQkJCQkJXAoJCQl9CgojZGVmaW5lCUZhaWxJZktlcm5lbEVycm9yKGluS2VybmVsRXJyb3IsIGluRXhjZXB0aW9uLCBpbk1lc3NhZ2UpCQkJCQkJXAoJCQlpZigoaW5LZXJuZWxFcnJvcikgIT0gMCkJCQkJCQkJCQkJCQkJXAoJCQl7CQkJCQkJCQkJCQkJCQkJCQkJCVwKCQkJCVNUT1A7CQkJCQkJCQkJCQkJCQkJCQlcCgkJCQl7IGluQWN0aW9uOyB9CQkJCQkJCQkJCQkJCQkJXAoJCQkJZ290byBpbkhhbmRsZXI7CQkJCQkJCQkJCQkJCQkJXAoJCQl9CgojZGVmaW5lCUZhaWxJZkVycm9yKGluRXJyb3IsIGluRXhjZXB0aW9uLCBpbk1lc3NhZ2UpCQkJCQkJCQkJXAoJCQlpZigoaW5FcnJvcikgIT0gMCkJCQkJCQkJCQkJCQkJCQlcCgkJCXsJCQkJCQkJCQkJCQkJCQkJCQkJXAoJCQkJU1RPUDsJCQkJCQkJCQkJCQkJCQkJCVwKCQkJCXsgaW5BY3Rpb247IH0JCQkJCQkJCQkJCQkJCQlcCgkJCQlnb3RvIGluSGFuZGxlcjsJCQkJCQkJCQkJCQkJCQlcCgkJCX0KCiNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQoKI2RlZmluZSBUaHJvdyhpbkV4Y2VwdGlvbikgIFNUT1A7IHRocm93IChpbkV4Y2VwdGlvbikKCiNkZWZpbmUJVGhyb3dJZihpbkNvbmRpdGlvbiwgaW5FeGNlcHRpb24sIGluTWVzc2FnZSkJCQkJCQkJCQlcCgkJCWlmKGluQ29uZGl0aW9uKQkJCQkJCQkJCQkJCQkJCQlcCgkJCXsJCQkJCQkJCQkJCQkJCQkJCQkJXAoJCQkJVGhyb3coaW5FeGNlcHRpb24pOwkJCQkJCQkJCQkJCQkJXAoJCQl9CgojZGVmaW5lCVRocm93SWZOVUxMKGluUG9pbnRlciwgaW5FeGNlcHRpb24sIGluTWVzc2FnZSkJCQkJCQkJCQlcCgkJCWlmKChpblBvaW50ZXIpID09IE5VTEwpCQkJCQkJCQkJCQkJCQlcCgkJCXsJCQkJCQkJCQkJCQkJCQkJCQkJXAoJCQkJVGhyb3coaW5FeGNlcHRpb24pOwkJCQkJCQkJCQkJCQkJXAoJCQl9CgojZGVmaW5lCVRocm93SWZLZXJuZWxFcnJvcihpbktlcm5lbEVycm9yLCBpbkV4Y2VwdGlvbiwgaW5NZXNzYWdlKQkJCQkJCVwKCQkJewkJCQkJCQkJCQkJCQkJCQkJCQlcCgkJCQlrZXJuX3JldHVybl90IF9fRXJyID0gKGluS2VybmVsRXJyb3IpOwkJCQkJCQkJCVwKCQkJCWlmKF9fRXJyICE9IDApCQkJCQkJCQkJCQkJCQkJXAoJCQkJewkJCQkJCQkJCQkJCQkJCQkJCVwKCQkJCQlUaHJvdyhpbkV4Y2VwdGlvbik7CQkJCQkJCQkJCQkJCVwKCQkJCX0JCQkJCQkJCQkJCQkJCQkJCQlcCgkJCX0KCiNkZWZpbmUJVGhyb3dJZkVycm9yKGluRXJyb3IsIGluRXhjZXB0aW9uLCBpbk1lc3NhZ2UpCQkJCQkJCQkJXAoJCQl7CQkJCQkJCQkJCQkJCQkJCQkJCVwKCQkJCVNJbnQzMiBfX0VyciA9IChpbkVycm9yKTsJCQkJCQkJCQkJCQlcCgkJCQlpZihfX0VyciAhPSAwKQkJCQkJCQkJCQkJCQkJCVwKCQkJCXsJCQkJCQkJCQkJCQkJCQkJCQlcCgkJCQkJVGhyb3coaW5FeGNlcHRpb24pOwkJCQkJCQkJCQkJCQlcCgkJCQl9CQkJCQkJCQkJCQkJCQkJCQkJXAoJCQl9CgojaWYgVEFSR0VUX09TX1dJTjMyCiNkZWZpbmUJVGhyb3dJZldpbkVycm9yKGluRXJyb3IsIGluRXhjZXB0aW9uLCBpbk1lc3NhZ2UpCQkJCQkJCQlcCgkJCXsJCQkJCQkJCQkJCQkJCQkJCQkJXAoJCQkJSFJFU1VMVCBfX0VyciA9IChpbkVycm9yKTsJCQkJCQkJCQkJCQlcCgkJCQlpZihGQUlMRUQoX19FcnIpKQkJCQkJCQkJCQkJCQkJXAoJCQkJewkJCQkJCQkJCQkJCQkJCQkJCVwKCQkJCQlUaHJvdyhpbkV4Y2VwdGlvbik7CQkJCQkJCQkJCQkJCVwKCQkJCX0JCQkJCQkJCQkJCQkJCQkJCQlcCgkJCX0KI2VuZGlmCgojZGVmaW5lCVN1YmNsYXNzUmVzcG9uc2liaWxpdHkoaW5NZXRob2ROYW1lLCBpbkV4Y2VwdGlvbikJCQkJCQkJCVwKCQkJewkJCQkJCQkJCQkJCQkJCQkJCQlcCgkJCQlUaHJvdyhpbkV4Y2VwdGlvbik7CQkJCQkJCQkJCQkJCQlcCgkJCX0KCiNlbmRpZgkvLwlkZWZpbmVkKF9fY3BsdXNwbHVzKQoKI2VuZGlmICAvLyAgREVCVUcgfHwgQ29yZUF1ZGlvX0RlYnVnCgojZW5kaWYK