Ly8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyBYWVogdG8gUkdCIFRJRkYgY29udmVyc2lvbiByb3V0aW5lcwovLwovLyBEZXNpZ24gYW5kIGltcGxlbWVudGF0aW9uIGJ5Ci8vIC0gSGVydukgRHJvbG9uIChkcm9sb25AaW5mb25pZS5mcikKLy8KLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRnJlZUltYWdlIDMKLy8KLy8gQ09WRVJFRCBDT0RFIElTIFBST1ZJREVEIFVOREVSIFRISVMgTElDRU5TRSBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRZCi8vIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBXQVJSQU5USUVTCi8vIFRIQVQgVEhFIENPVkVSRUQgQ09ERSBJUyBGUkVFIE9GIERFRkVDVFMsIE1FUkNIQU5UQUJMRSwgRklUIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQovLyBPUiBOT04tSU5GUklOR0lORy4gVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgQ09WRVJFRAovLyBDT0RFIElTIFdJVEggWU9VLiBTSE9VTEQgQU5ZIENPVkVSRUQgQ09ERSBQUk9WRSBERUZFQ1RJVkUgSU4gQU5ZIFJFU1BFQ1QsIFlPVSAoTk9UCi8vIFRIRSBJTklUSUFMIERFVkVMT1BFUiBPUiBBTlkgT1RIRVIgQ09OVFJJQlVUT1IpIEFTU1VNRSBUSEUgQ09TVCBPRiBBTlkgTkVDRVNTQVJZCi8vIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uIFRISVMgRElTQ0xBSU1FUiBPRiBXQVJSQU5UWSBDT05TVElUVVRFUyBBTiBFU1NFTlRJQUwKLy8gUEFSVCBPRiBUSElTIExJQ0VOU0UuIE5PIFVTRSBPRiBBTlkgQ09WRVJFRCBDT0RFIElTIEFVVEhPUklaRUQgSEVSRVVOREVSIEVYQ0VQVCBVTkRFUgovLyBUSElTIERJU0NMQUlNRVIuCi8vCi8vIFVzZSBhdCB5b3VyIG93biByaXNrIQovLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgojaW5jbHVkZSAiRnJlZUltYWdlLmgiCiNpbmNsdWRlICJVdGlsaXRpZXMuaCIKCnZvaWQgdGlmZl9Db252ZXJ0TGluZVhZWlRvUkdCKEJZVEUgKnRhcmdldCwgQllURSAqc291cmNlLCBkb3VibGUgc3Rvbml0cywgaW50IHdpZHRoX2luX3BpeGVscykgewoJRklSR0JGICpyZ2JmID0gKEZJUkdCRiopdGFyZ2V0OwoJZmxvYXQgKnh5eiA9IChmbG9hdCopc291cmNlOwoJCglmb3IgKGludCBjb2xzID0gMDsgY29scyA8IHdpZHRoX2luX3BpeGVsczsgY29scysrKSB7CgkJLy8gYXNzdW1lIENDSVItNzA5IHByaW1hcmllcyAobWF0cml4IGZyb20gdGlmX2x1di5jKQoJCS8vIExPRyBMdXYgWFlaIChENjUpIC0+IHNSR0IgKENJRSBJbGx1bWluYW50IEUpCgkJcmdiZi0+cmVkCT0gKGZsb2F0KSggMi42OTAqeHl6WzBdICsgLTEuMjc2Knh5elsxXSArIC0wLjQxNCp4eXpbMl0pOwoJCXJnYmYtPmdyZWVuCT0gKGZsb2F0KSgtMS4wMjIqeHl6WzBdICsgIDEuOTc4Knh5elsxXSArICAwLjA0NCp4eXpbMl0pOwoJCXJnYmYtPmJsdWUJPSAoZmxvYXQpKCAwLjA2MSp4eXpbMF0gKyAtMC4yMjQqeHl6WzFdICsgIDEuMTYzKnh5elsyXSk7CgkJCgkJLyoKCQlpZiAoc3Rvbml0cyAhPSAwLjApIHsKCQkJcmdiZi0+cmVkCT0gKGZsb2F0KShyZ2JmLT5yZWQgICAqIHN0b25pdHMpOwoJCQlyZ2JmLT5ncmVlbgk9IChmbG9hdCkocmdiZi0+Z3JlZW4gKiBzdG9uaXRzKTsKCQkJcmdiZi0+Ymx1ZQk9IChmbG9hdCkocmdiZi0+Ymx1ZSAgKiBzdG9uaXRzKTsKCQl9IAoJCSovCgoJCXJnYmYrKzsKCQl4eXogKz0gMzsKCX0KfQoKdm9pZCB0aWZmX0NvbnZlcnRMaW5lUkdCVG9YWVooQllURSAqdGFyZ2V0LCBCWVRFICpzb3VyY2UsIGludCB3aWR0aF9pbl9waXhlbHMpIHsKCUZJUkdCRiAqcmdiZiA9IChGSVJHQkYqKXNvdXJjZTsKCWZsb2F0ICp4eXogPSAoZmxvYXQqKXRhcmdldDsKCQoJZm9yIChpbnQgY29scyA9IDA7IGNvbHMgPCB3aWR0aF9pbl9waXhlbHM7IGNvbHMrKykgewoJCS8vIGFzc3VtZSBDQ0lSLTcwOSBwcmltYXJpZXMsIHdoaXRlcG9pbnQgeCA9IDEvMyB5ID0gMS8zIChEX0UpCgkJLy8gIlRoZSBMb2dMdXYgRW5jb2RpbmcgZm9yIEZ1bGwgR2FtdXQsIEhpZ2ggRHluYW1pYyBSYW5nZSBJbWFnZXMiIDxHLldhcmQ+CgkJLy8gc1JHQiAoIENJRSBJbGx1bWluYW50IEUgKSAtPiBMT0cgTHV2IFhZWiAoRDY1KQoJCXh5elswXSA9ICAoZmxvYXQpKDAuNDk3KnJnYmYtPnJlZCArICAwLjMzOSpyZ2JmLT5ncmVlbiArICAwLjE2NCpyZ2JmLT5ibHVlKTsKCQl4eXpbMV0gPSAgKGZsb2F0KSgwLjI1NipyZ2JmLT5yZWQgKyAgMC42NzgqcmdiZi0+Z3JlZW4gKyAgMC4wNjYqcmdiZi0+Ymx1ZSk7CgkJeHl6WzJdID0gIChmbG9hdCkoMC4wMjMqcmdiZi0+cmVkICsgIDAuMTEzKnJnYmYtPmdyZWVuICsgIDAuODY0KnJnYmYtPmJsdWUpOwoKCQlyZ2JmKys7CgkJeHl6ICs9IDM7Cgl9Cn0KCg==