Ly8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyBEZWx1eGUgUGFpbnQgTG9hZGVyCi8vCi8vIERlc2lnbiBhbmQgaW1wbGVtZW50YXRpb24gYnkKLy8gLSBGbG9yaXMgdmFuIGRlbiBCZXJnIChmbHZkYmVyZ0B3eHMubmwpCi8vIC0gTWFyayBTaWJseSAobWFya3NpYmx5QGJsaXR6YmFzaWMuY29tKQovLyAtIEFhcm9uIFNodW1hdGUgKHRyZWtAc3RhcnRyZWtlci5jb20pCi8vIC0gSGVydukgRHJvbG9uIChkcm9sb25AaW5mb25pZS5mcikKLy8KLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRnJlZUltYWdlIDMKLy8KLy8gQ09WRVJFRCBDT0RFIElTIFBST1ZJREVEIFVOREVSIFRISVMgTElDRU5TRSBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRZCi8vIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBXQVJSQU5USUVTCi8vIFRIQVQgVEhFIENPVkVSRUQgQ09ERSBJUyBGUkVFIE9GIERFRkVDVFMsIE1FUkNIQU5UQUJMRSwgRklUIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQovLyBPUiBOT04tSU5GUklOR0lORy4gVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgQ09WRVJFRAovLyBDT0RFIElTIFdJVEggWU9VLiBTSE9VTEQgQU5ZIENPVkVSRUQgQ09ERSBQUk9WRSBERUZFQ1RJVkUgSU4gQU5ZIFJFU1BFQ1QsIFlPVSAoTk9UCi8vIFRIRSBJTklUSUFMIERFVkVMT1BFUiBPUiBBTlkgT1RIRVIgQ09OVFJJQlVUT1IpIEFTU1VNRSBUSEUgQ09TVCBPRiBBTlkgTkVDRVNTQVJZCi8vIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uIFRISVMgRElTQ0xBSU1FUiBPRiBXQVJSQU5UWSBDT05TVElUVVRFUyBBTiBFU1NFTlRJQUwKLy8gUEFSVCBPRiBUSElTIExJQ0VOU0UuIE5PIFVTRSBPRiBBTlkgQ09WRVJFRCBDT0RFIElTIEFVVEhPUklaRUQgSEVSRVVOREVSIEVYQ0VQVCBVTkRFUgovLyBUSElTIERJU0NMQUlNRVIuCi8vCi8vIFVzZSBhdCB5b3VyIG93biByaXNrIQovLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgojaW5jbHVkZSAiRnJlZUltYWdlLmgiCiNpbmNsdWRlICJVdGlsaXRpZXMuaCIKCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gIEludGVybmFsIHR5cGVkZWZzIGFuZCBzdHJ1Y3R1cmVzCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiNpZmRlZiBfV0lOMzIKI3ByYWdtYSBwYWNrKHB1c2gsIDEpCiNlbHNlCiNwcmFnbWEgcGFjaygxKQojZW5kaWYKCnR5cGVkZWYgc3RydWN0IHsKICAgIFdPUkQgdywgaDsgICAgICAgICAgICAgICAgICAgIC8qIHJhc3RlciB3aWR0aCAmIGhlaWdodCBpbiBwaXhlbHMgKi8KICAgIFdPUkQgeCwgeTsgICAgICAgICAgICAgICAgICAgIC8qIHBvc2l0aW9uIGZvciB0aGlzIGltYWdlICovCiAgICBCWVRFIG5QbGFuZXM7ICAgICAgICAgICAgICAgICAvKiAjIHNvdXJjZSBiaXRwbGFuZXMgKi8KICAgIEJZVEUgbWFza2luZzsgICAgICAgICAgICAgICAgIC8qIG1hc2tpbmcgdGVjaG5pcXVlICovCiAgICBCWVRFIGNvbXByZXNzaW9uOyAgICAgICAgICAgICAvKiBjb21wcmVzc2lvbiBhbGdvcml0aG0gKi8KICAgIEJZVEUgcGFkMTsgICAgICAgICAgICAgICAgICAgIC8qIFVOVVNFRC4gIEZvciBjb25zaXN0ZW5jeSwgcHV0IDAgaGVyZS4qLwogICAgV09SRCB0cmFuc3BhcmVudENvbG9yOyAgICAgICAgLyogdHJhbnNwYXJlbnQgImNvbG9yIG51bWJlciIgKi8KICAgIEJZVEUgeEFzcGVjdCwgeUFzcGVjdDsgICAgICAgIC8qIGFzcGVjdCByYXRpbywgYSByYXRpb25hbCBudW1iZXIgeC95ICovCiAgICBXT1JEIHBhZ2VXaWR0aCwgcGFnZUhlaWdodDsgICAvKiBzb3VyY2UgInBhZ2UiIHNpemUgaW4gcGl4ZWxzICovCn0gQk1IRDsKCiNpZmRlZiBfV0lOMzIKI3ByYWdtYSBwYWNrKHBvcCkKI2Vsc2UKI3ByYWdtYSBwYWNrKCkKI2VuZGlmCgojaWZuZGVmIEZSRUVJTUFHRV9CSUdFTkRJQU4Kc3RhdGljIHZvaWQKU3dhcEhlYWRlcihCTUhEICpoZWFkZXIpIHsKCVN3YXBTaG9ydCgmaGVhZGVyLT53KTsKCVN3YXBTaG9ydCgmaGVhZGVyLT5oKTsKCVN3YXBTaG9ydCgmaGVhZGVyLT54KTsKCVN3YXBTaG9ydCgmaGVhZGVyLT55KTsKCVN3YXBTaG9ydCgmaGVhZGVyLT50cmFuc3BhcmVudENvbG9yKTsKCVN3YXBTaG9ydCgmaGVhZGVyLT5wYWdlV2lkdGgpOwoJU3dhcFNob3J0KCZoZWFkZXItPnBhZ2VIZWlnaHQpOwp9CiNlbmRpZgoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKLyogSUZGIGNodW5rIElEcyAqLwoKdHlwZWRlZiBEV09SRCBJRkZfSUQ7CgojZGVmaW5lIE1BS0VfSUQoYSwgYiwgYywgZCkgICAgICAgICAoKElGRl9JRCkoYSk8PDI0IHwgKElGRl9JRCkoYik8PDE2IHwgKElGRl9JRCkoYyk8PDggfCAoSUZGX0lEKShkKSkKCiNkZWZpbmUgSURfRk9STSAgICAgTUFLRV9JRCgnRicsICdPJywgJ1InLCAnTScpICAgICAvKiBFQSBJRkYgODUgZ3JvdXAgaWRlbnRpZmllciAqLwojZGVmaW5lIElEX0NBVCAgICAgIE1BS0VfSUQoJ0MnLCAnQScsICdUJywgJyAnKSAgICAgLyogRUEgSUZGIDg1IGdyb3VwIGlkZW50aWZpZXIgKi8KI2RlZmluZSBJRF9MSVNUICAgICBNQUtFX0lEKCdMJywgJ0knLCAnUycsICdUJykgICAgIC8qIEVBIElGRiA4NSBncm91cCBpZGVudGlmaWVyICovCiNkZWZpbmUgSURfUFJPUCAgICAgTUFLRV9JRCgnUCcsICdSJywgJ08nLCAnUCcpICAgICAvKiBFQSBJRkYgODUgZ3JvdXAgaWRlbnRpZmllciAqLwojZGVmaW5lIElEX0VORCAgICAgIE1BS0VfSUQoJ0UnLCAnTicsICdEJywgJyAnKSAgICAgLyogdW5vZmZpY2lhbCBFTkQtb2YtRk9STSBpZGVudGlmaWVyIChzZWUgQW1pZ2EgUktNIERldmljZXMgRWQuMyBwYWdlIDM3NikgKi8KCiNkZWZpbmUgSURfSUxCTSAgICAgTUFLRV9JRCgnSScsICdMJywgJ0InLCAnTScpICAgICAvKiBFQSBJRkYgODUgcmFzdGVyIGJpdG1hcCBmb3JtICovCiNkZWZpbmUgSURfREVFUCAgICAgTUFLRV9JRCgnRCcsICdFJywgJ0UnLCAnUCcpICAgICAvKiBDaHVua3kgcGl4ZWwgaW1hZ2UgZmlsZXMgKFVzZWQgaW4gVFYgUGFpbnQpICovCiNkZWZpbmUgSURfUkdCOCAgICAgTUFLRV9JRCgnUicsICdHJywgJ0InLCAnOCcpICAgICAvKiBSR0IgaW1hZ2UgZm9ybXMsIFR1cmJvIFNpbHZlciAoSW1wdWxzZSkgKi8KI2RlZmluZSBJRF9SR0JOICAgICBNQUtFX0lEKCdSJywgJ0cnLCAnQicsICdOJykgICAgIC8qIFJHQiBpbWFnZSBmb3JtcywgVHVyYm8gU2lsdmVyIChJbXB1bHNlKSAqLwojZGVmaW5lIElEX1BCTSAgICAgIE1BS0VfSUQoJ1AnLCAnQicsICdNJywgJyAnKSAgICAgLyogMjU2LWNvbG9yIGNodW5reSBmb3JtYXQgKERQYWludCAyID8pICovCiNkZWZpbmUgSURfQUNCTSAgICAgTUFLRV9JRCgnQScsICdDJywgJ0InLCAnTScpICAgICAvKiBBbWlnYSBDb250aWd1b3VzIEJpdG1hcCAoQW1pZ2FCYXNpYykgKi8KLyogZ2VuZXJpYyAqLwojZGVmaW5lIElEX0ZWRVIgICAgIE1BS0VfSUQoJ0YnLCAnVicsICdFJywgJ1InKSAgICAgLyogQW1pZ2FPUyB2ZXJzaW9uIHN0cmluZyAqLwojZGVmaW5lIElEX0pVTksgICAgIE1BS0VfSUQoJ0onLCAnVScsICdOJywgJ0snKSAgICAgLyogYWx3YXlzIGlnbm9yZSB0aGlzIGNodW5rICovCiNkZWZpbmUgSURfQU5OTyAgICAgTUFLRV9JRCgnQScsICdOJywgJ04nLCAnTycpICAgICAvKiBFQSBJRkYgODUgR2VuZXJpYyBBbm5vdGF0aW9uIGNodW5rICovCiNkZWZpbmUgSURfQVVUSCAgICAgTUFLRV9JRCgnQScsICdVJywgJ1QnLCAnSCcpICAgICAvKiBFQSBJRkYgODUgR2VuZXJpYyBBdXRob3IgY2h1bmsgKi8KI2RlZmluZSBJRF9DSFJTICAgICBNQUtFX0lEKCdDJywgJ0gnLCAnUicsICdTJykgICAgIC8qIEVBIElGRiA4NSBHZW5lcmljIGNoYXJhY3RlciBzdHJpbmcgY2h1bmsgKi8KI2RlZmluZSBJRF9OQU1FICAgICBNQUtFX0lEKCdOJywgJ0EnLCAnTScsICdFJykgICAgIC8qIEVBIElGRiA4NSBHZW5lcmljIE5hbWUgb2YgYXJ0LCBtdXNpYywgZXRjLiBjaHVuayAqLwojZGVmaW5lIElEX1RFWFQgICAgIE1BS0VfSUQoJ1QnLCAnRScsICdYJywgJ1QnKSAgICAgLyogRUEgSUZGIDg1IEdlbmVyaWMgdW5mb3JtYXR0ZWQgQVNDSUkgdGV4dCBjaHVuayAqLwojZGVmaW5lIElEX2NvcHkgICAgIE1BS0VfSUQoJygnLCAnYycsICcpJywgJyAnKSAgICAgLyogRUEgSUZGIDg1IEdlbmVyaWMgQ29weXJpZ2h0IHRleHQgY2h1bmsgKi8KLyogSUxCTSBjaHVua3MgKi8KI2RlZmluZSBJRF9CTUhEICAgICBNQUtFX0lEKCdCJywgJ00nLCAnSCcsICdEJykgICAgIC8qIElMQk0gQml0bWFwSGVhZGVyICovCiNkZWZpbmUgSURfQ01BUCAgICAgTUFLRV9JRCgnQycsICdNJywgJ0EnLCAnUCcpICAgICAvKiBJTEJNIDhiaXQgUkdCIGNvbG9ybWFwICovCiNkZWZpbmUgSURfR1JBQiAgICAgTUFLRV9JRCgnRycsICdSJywgJ0EnLCAnQicpICAgICAvKiBJTEJNICJob3RzcG90IiBjb29yZGlhbnRlcyAqLwojZGVmaW5lIElEX0RFU1QgICAgIE1BS0VfSUQoJ0QnLCAnRScsICdTJywgJ1QnKSAgICAgLyogSUxCTSBkZXN0aW5hdGlvbiBpbWFnZSBpbmZvICovCiNkZWZpbmUgSURfU1BSVCAgICAgTUFLRV9JRCgnUycsICdQJywgJ1InLCAnVCcpICAgICAvKiBJTEJNIHNwcml0ZSBpZGVudGlmaWVyICovCiNkZWZpbmUgSURfQ0FNRyAgICAgTUFLRV9JRCgnQycsICdBJywgJ00nLCAnRycpICAgICAvKiBBbWlnYSB2aWV3cG9ydG1vZGVzICovCiNkZWZpbmUgSURfQk9EWSAgICAgTUFLRV9JRCgnQicsICdPJywgJ0QnLCAnWScpICAgICAvKiBJTEJNIGltYWdlIGRhdGEgKi8KI2RlZmluZSBJRF9DUk5HICAgICBNQUtFX0lEKCdDJywgJ1InLCAnTicsICdHJykgICAgIC8qIGNvbG9yIGN5Y2xpbmcgKi8KI2RlZmluZSBJRF9DQ1JUICAgICBNQUtFX0lEKCdDJywgJ0MnLCAnUicsICdUJykgICAgIC8qIGNvbG9yIGN5Y2xpbmcgKi8KI2RlZmluZSBJRF9DTFVUICAgICBNQUtFX0lEKCdDJywgJ0wnLCAnVScsICdUJykgICAgIC8qIENvbG9yIExvb2t1cCBUYWJsZSBjaHVuayAqLwojZGVmaW5lIElEX0RQSSAgICAgIE1BS0VfSUQoJ0QnLCAnUCcsICdJJywgJyAnKSAgICAgLyogRG90cyBwZXIgaW5jaCBjaHVuayAqLwojZGVmaW5lIElEX0RQUFYgICAgIE1BS0VfSUQoJ0QnLCAnUCcsICdQJywgJ1YnKSAgICAgLyogRFBhaW50IHBlcnNwZWN0aXZlIGNodW5rIChFQSkgKi8KI2RlZmluZSBJRF9EUk5HICAgICBNQUtFX0lEKCdEJywgJ1InLCAnTicsICdHJykgICAgIC8qIERQYWludCBJViBlbmhhbmNlZCBjb2xvciBjeWNsZSBjaHVuayAoRUEpICovCiNkZWZpbmUgSURfRVBTRiAgICAgTUFLRV9JRCgnRScsICdQJywgJ1MnLCAnRicpICAgICAvKiBFbmNhcHN1bGF0ZWQgUG9zdHNjcmlwdCBjaHVuayAqLwojZGVmaW5lIElEX0NNWUsgICAgIE1BS0VfSUQoJ0MnLCAnTScsICdZJywgJ0snKSAgICAgLyogQ3lhbiwgTWFnZW50YSwgWWVsbG93LCAmIEJsYWNrIGNvbG9yIG1hcCAoU29mdC1Mb2dpaykgKi8KI2RlZmluZSBJRF9DTkFNICAgICBNQUtFX0lEKCdDJywgJ04nLCAnQScsICdNJykgICAgIC8qIENvbG9yIG5hbWluZyBjaHVuayAoU29mdC1Mb2dpaykgKi8KI2RlZmluZSBJRF9QQ0hHICAgICBNQUtFX0lEKCdQJywgJ0MnLCAnSCcsICdHJykgICAgIC8qIExpbmUgYnkgbGluZSBwYWxldHRlIGNvbnRyb2wgaW5mb3JtYXRpb24gKFNlYmFzdGlhbm8gVmlnbmEpICovCiNkZWZpbmUgSURfUFJWVyAgICAgTUFLRV9JRCgnUCcsICdSJywgJ1YnLCAnVycpICAgICAvKiBBIG1pbmkgZHVwbGljYXRlIElMQk0gdXNlZCBmb3IgcHJldmlldyAoR2FyeSBCb25oYW0pICovCiNkZWZpbmUgSURfWEJNSSAgICAgTUFLRV9JRCgnWCcsICdCJywgJ00nLCAnSScpICAgICAvKiBlWHRlbmRlZCBCaXRNYXAgSW5mb3JtYXRpb24gKFNvZnQtTG9naWspICovCiNkZWZpbmUgSURfQ1RCTCAgICAgTUFLRV9JRCgnQycsICdUJywgJ0InLCAnTCcpICAgICAvKiBOZXd0ZWsgRHluYW1pYyBIYW0gY29sb3IgY2h1bmsgKi8KI2RlZmluZSBJRF9EWUNQICAgICBNQUtFX0lEKCdEJywgJ1knLCAnQycsICdQJykgICAgIC8qIE5ld3RlayBEeW5hbWljIEhhbSBjaHVuayAqLwojZGVmaW5lIElEX1NIQU0gICAgIE1BS0VfSUQoJ1MnLCAnSCcsICdBJywgJ00nKSAgICAgLyogU2xpY2VkIEhBTSBjb2xvciBjaHVuayAqLwojZGVmaW5lIElEX0FCSVQgICAgIE1BS0VfSUQoJ0EnLCAnQicsICdJJywgJ1QnKSAgICAgLyogQUNCTSBib2R5IGNodW5rICovCiNkZWZpbmUgSURfRENPTCAgICAgTUFLRV9JRCgnRCcsICdDJywgJ08nLCAnTCcpICAgICAvKiB1bm9mZmljaWFsIGRpcmVjdCBjb2xvciAqLwoKLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyBQbHVnaW4gSW50ZXJmYWNlCi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCnN0YXRpYyBpbnQgc19mb3JtYXRfaWQ7CgovLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci8vIFBsdWdpbiBJbXBsZW1lbnRhdGlvbgovLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpzdGF0aWMgY29uc3QgY2hhciAqIERMTF9DQUxMQ09OVgpGb3JtYXQoKSB7CglyZXR1cm4gIklGRiI7Cn0KCnN0YXRpYyBjb25zdCBjaGFyICogRExMX0NBTExDT05WCkRlc2NyaXB0aW9uKCkgewoJcmV0dXJuICJJRkYgSW50ZXJsZWF2ZWQgQml0bWFwIjsKfQoKc3RhdGljIGNvbnN0IGNoYXIgKiBETExfQ0FMTENPTlYKRXh0ZW5zaW9uKCkgewoJcmV0dXJuICJpZmYsbGJtIjsKfQoKc3RhdGljIGNvbnN0IGNoYXIgKiBETExfQ0FMTENPTlYKUmVnRXhwcigpIHsKCXJldHVybiBOVUxMOwp9CgpzdGF0aWMgY29uc3QgY2hhciAqIERMTF9DQUxMQ09OVgpNaW1lVHlwZSgpIHsKCXJldHVybiAiaW1hZ2UvZnJlZWltYWdlLWlmZiI7Cn0KCnN0YXRpYyBCT09MIERMTF9DQUxMQ09OVgpWYWxpZGF0ZShGcmVlSW1hZ2VJTyAqaW8sIGZpX2hhbmRsZSBoYW5kbGUpIHsKCURXT1JEIHR5cGUgPSAwOwoKCS8vIHJlYWQgY2h1bmsgdHlwZQoJaW8tPnJlYWRfcHJvYygmdHlwZSwgNCwgMSwgaGFuZGxlKTsKI2lmbmRlZiBGUkVFSU1BR0VfQklHRU5ESUFOCglTd2FwTG9uZygmdHlwZSk7CiNlbmRpZgoKCWlmKHR5cGUgIT0gSURfRk9STSkKCQlyZXR1cm4gRkFMU0U7CgkJCgkvLyBza2lwIDQgYnl0ZXMKCWlvLT5yZWFkX3Byb2MoJnR5cGUsIDQsIDEsIGhhbmRsZSk7CgoJLy8gcmVhZCBjaHVuayB0eXBlCglpby0+cmVhZF9wcm9jKCZ0eXBlLCA0LCAxLCBoYW5kbGUpOwojaWZuZGVmIEZSRUVJTUFHRV9CSUdFTkRJQU4KCVN3YXBMb25nKCZ0eXBlKTsKI2VuZGlmCgoJLy8gRmlsZSBmb3JtYXQgOiBJRF9QQk0gPSBQYWNrZWQgQml0bWFwLCBJRF9JTEJNID0gSW50ZXJsZWF2ZWQgQml0bWFwCglyZXR1cm4gKHR5cGUgPT0gSURfSUxCTSkgfHwgKHR5cGUgPT0gSURfUEJNKTsKfQoKCnN0YXRpYyBCT09MIERMTF9DQUxMQ09OVgpTdXBwb3J0c0V4cG9ydERlcHRoKGludCBkZXB0aCkgewoJcmV0dXJuIEZBTFNFOwp9CgpzdGF0aWMgQk9PTCBETExfQ0FMTENPTlYgClN1cHBvcnRzRXhwb3J0VHlwZShGUkVFX0lNQUdFX1RZUEUgdHlwZSkgewoJcmV0dXJuIEZBTFNFOwp9CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpzdGF0aWMgRklCSVRNQVAgKiBETExfQ0FMTENPTlYKTG9hZChGcmVlSW1hZ2VJTyAqaW8sIGZpX2hhbmRsZSBoYW5kbGUsIGludCBwYWdlLCBpbnQgZmxhZ3MsIHZvaWQgKmRhdGEpIHsKCWlmIChoYW5kbGUgIT0gTlVMTCkgewoJCUZJQklUTUFQICpkaWIgPSBOVUxMOwoKCQlEV09SRCB0eXBlLCBzaXplOwoKCQlpby0+cmVhZF9wcm9jKCZ0eXBlLCA0LCAxLCBoYW5kbGUpOwojaWZuZGVmIEZSRUVJTUFHRV9CSUdFTkRJQU4KCQlTd2FwTG9uZygmdHlwZSk7CiNlbmRpZgoKCQlpZih0eXBlICE9IElEX0ZPUk0pCgkJCXJldHVybiBOVUxMOwoKCQlpby0+cmVhZF9wcm9jKCZzaXplLCA0LCAxLCBoYW5kbGUpOwojaWZuZGVmIEZSRUVJTUFHRV9CSUdFTkRJQU4KCQlTd2FwTG9uZygmc2l6ZSk7CiNlbmRpZgoKCQlpby0+cmVhZF9wcm9jKCZ0eXBlLCA0LCAxLCBoYW5kbGUpOwojaWZuZGVmIEZSRUVJTUFHRV9CSUdFTkRJQU4KCQlTd2FwTG9uZygmdHlwZSk7CiNlbmRpZgoKCQlpZigodHlwZSAhPSBJRF9JTEJNKSAmJiAodHlwZSAhPSBJRF9QQk0pKQoJCQlyZXR1cm4gTlVMTDsKCgkJc2l6ZSAtPSA0OwoKCQl1bnNpZ25lZCB3aWR0aCA9IDAsIGhlaWdodCA9IDAsIHBsYW5lcyA9IDAsIGRlcHRoID0gMCwgY29tcCA9IDA7CgoJCXdoaWxlIChzaXplKSB7CgkJCURXT1JEIGNoX3R5cGUsY2hfc2l6ZTsKCgkJCWlvLT5yZWFkX3Byb2MoJmNoX3R5cGUsIDQsIDEsIGhhbmRsZSk7CiNpZm5kZWYgRlJFRUlNQUdFX0JJR0VORElBTgoJCQlTd2FwTG9uZygmY2hfdHlwZSk7CiNlbmRpZgoKCQkJaW8tPnJlYWRfcHJvYygmY2hfc2l6ZSw0LDEsaGFuZGxlICk7CiNpZm5kZWYgRlJFRUlNQUdFX0JJR0VORElBTgoJCQlTd2FwTG9uZygmY2hfc2l6ZSk7CiNlbmRpZgoKCQkJdW5zaWduZWQgY2hfZW5kID0gaW8tPnRlbGxfcHJvYyhoYW5kbGUpICsgY2hfc2l6ZTsKCgkJCWlmIChjaF90eXBlID09IElEX0JNSEQpIHsJCQkvLyBCaXRtYXAgSGVhZGVyCgkJCQlpZiAoZGliKQoJCQkJCUZyZWVJbWFnZV9VbmxvYWQoZGliKTsKCgkJCQlCTUhEIGJtaGQ7CgoJCQkJaW8tPnJlYWRfcHJvYygmYm1oZCwgc2l6ZW9mKGJtaGQpLCAxLCBoYW5kbGUpOwojaWZuZGVmIEZSRUVJTUFHRV9CSUdFTkRJQU4KCQkJCVN3YXBIZWFkZXIoJmJtaGQpOwojZW5kaWYKCgkJCQl3aWR0aCA9IGJtaGQudzsKCQkJCWhlaWdodCA9IGJtaGQuaDsKCQkJCXBsYW5lcyA9IGJtaGQublBsYW5lczsKCQkJCWNvbXAgPSBibWhkLmNvbXByZXNzaW9uOwoKCQkJCWlmKGJtaGQubWFza2luZyAmIDEpCgkJCQkJcGxhbmVzKys7CS8vIHRoZXJlIGlzIGEgbWFzayAoICdzdGVuY2lsJyApCgoJCQkJaWYgKHBsYW5lcyA+IDggJiYgcGxhbmVzICE9IDI0KQoJCQkJCXJldHVybiBOVUxMOwoKCQkJCWRlcHRoID0gcGxhbmVzID4gOCA/IDI0IDogODsKCgkJCQlpZiggZGVwdGggPT0gMjQgKSB7CgkJCQkJZGliID0gRnJlZUltYWdlX0FsbG9jYXRlKHdpZHRoLCBoZWlnaHQsIGRlcHRoLCBGSV9SR0JBX1JFRF9NQVNLLCBGSV9SR0JBX0dSRUVOX01BU0ssIEZJX1JHQkFfQkxVRV9NQVNLKTsKCQkJCX0gZWxzZSB7CgkJCQkJZGliID0gRnJlZUltYWdlX0FsbG9jYXRlKHdpZHRoLCBoZWlnaHQsIGRlcHRoKTsKCQkJCX0KCQkJfSBlbHNlIGlmIChjaF90eXBlID09IElEX0NNQVApIHsJLy8gUGFsZXR0ZSAoQ29sb3IgTWFwKQoJCQkJaWYgKCFkaWIpCgkJCQkJcmV0dXJuIE5VTEw7CgoJCQkJUkdCUVVBRCAqcGFsID0gRnJlZUltYWdlX0dldFBhbGV0dGUoZGliKTsKCgkJCQlmb3IgKHVuc2lnbmVkIGsgPSAwOyBrIDwgY2hfc2l6ZSAvIDM7IGsrKykgewkJCQkJCgkJCQkJaW8tPnJlYWRfcHJvYygmcGFsW2tdLnJnYlJlZCwgMSwgMSwgaGFuZGxlICk7CgkJCQkJaW8tPnJlYWRfcHJvYygmcGFsW2tdLnJnYkdyZWVuLCAxLCAxLCBoYW5kbGUgKTsKCQkJCQlpby0+cmVhZF9wcm9jKCZwYWxba10ucmdiQmx1ZSwgMSwgMSwgaGFuZGxlICk7CgkJCQl9CgkJCX0gZWxzZSBpZiAoY2hfdHlwZSA9PSBJRF9CT0RZKSB7CgkJCQlpZiAoIWRpYikKCQkJCQlyZXR1cm4gTlVMTDsKCgkJCQlpZiAodHlwZSA9PSBJRF9QQk0pIHsKCQkJCQkvLyBOT04gSU5URVJMQUNFRCAoTEJNKQoKCQkJCQl1bnNpZ25lZCBsaW5lID0gRnJlZUltYWdlX0dldExpbmUoZGliKSArIDEgJiB+MTsKCQkJCQkKCQkJCQlmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgRnJlZUltYWdlX0dldEhlaWdodChkaWIpOyBpKyspIHsKCQkJCQkJQllURSAqYml0cyA9IEZyZWVJbWFnZV9HZXRTY2FuTGluZShkaWIsIEZyZWVJbWFnZV9HZXRIZWlnaHQoZGliKSAtIGkgLSAxKTsKCgkJCQkJCWlmIChjb21wID09IDEpIHsKCQkJCQkJCS8vIHVzZSBSTEUgY29tcHJlc3Npb24KCgkJCQkJCQlEV09SRCBudW1iZXJfb2ZfYnl0ZXNfd3JpdHRlbiA9IDA7CgkJCQkJCQlCWVRFIHJsZV9jb3VudDsKCQkJCQkJCUJZVEUgYnl0ZTsKCgkJCQkJCQl3aGlsZSAobnVtYmVyX29mX2J5dGVzX3dyaXR0ZW4gPCBsaW5lKSB7CgkJCQkJCQkJaW8tPnJlYWRfcHJvYygmcmxlX2NvdW50LCAxLCAxLCBoYW5kbGUpOwoKCQkJCQkJCQlpZiAocmxlX2NvdW50IDwgMTI4KSB7CgkJCQkJCQkJCWZvciAoaW50IGsgPSAwOyBrIDwgcmxlX2NvdW50ICsgMTsgaysrKSB7CgkJCQkJCQkJCQlpby0+cmVhZF9wcm9jKCZieXRlLCAxLCAxLCBoYW5kbGUpOwoKCQkJCQkJCQkJCWJpdHNbbnVtYmVyX29mX2J5dGVzX3dyaXR0ZW4rK10gKz0gYnl0ZTsKCQkJCQkJCQkJfQoJCQkJCQkJCX0gZWxzZSBpZiAocmxlX2NvdW50ID4gMTI4KSB7CgkJCQkJCQkJCWlvLT5yZWFkX3Byb2MoJmJ5dGUsIDEsIDEsIGhhbmRsZSk7CgoJCQkJCQkJCQlmb3IgKGludCBrID0gMDsgayA8IDI1NyAtIHJsZV9jb3VudDsgaysrKSB7CgkJCQkJCQkJCQliaXRzW251bWJlcl9vZl9ieXRlc193cml0dGVuKytdICs9IGJ5dGU7CgkJCQkJCQkJCX0KCQkJCQkJCQl9CgkJCQkJCQl9CgkJCQkJCX0gZWxzZSB7CgkJCQkJCQkvLyBkb24ndCB1c2UgY29tcHJlc3Npb24KCgkJCQkJCQlpby0+cmVhZF9wcm9jKGJpdHMsIGxpbmUsIDEsIGhhbmRsZSk7CgkJCQkJCX0KCQkJCQl9CgoJCQkJCXJldHVybiBkaWI7CgkJCQl9IGVsc2UgewoJCQkJCS8vIElOVEVSTEFDRUQgKElMQk0pCgoJCQkJCXVuc2lnbmVkIHBpeGVsX3NpemUgPSBkZXB0aC84OwoJCQkJCXVuc2lnbmVkIG5fd2lkdGg9KHdpZHRoKzE1KSZ+MTU7CgkJCQkJdW5zaWduZWQgcGxhbmVfc2l6ZSA9IG5fd2lkdGgvODsKCQkJCQl1bnNpZ25lZCBzcmNfc2l6ZSA9IHBsYW5lX3NpemUgKiBwbGFuZXM7CgkJCQkJQllURSAqc3JjID0gKEJZVEUqKW1hbGxvYyhzcmNfc2l6ZSk7CgkJCQkJQllURSAqZGVzdCA9IEZyZWVJbWFnZV9HZXRCaXRzKGRpYik7CgoJCQkJCWRlc3QgKz0gRnJlZUltYWdlX0dldFBpdGNoKGRpYikgKiBoZWlnaHQ7CgoJCQkJCWZvciAodW5zaWduZWQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgewoJCQkJCQlkZXN0IC09IEZyZWVJbWFnZV9HZXRQaXRjaChkaWIpOwoKCQkJCQkJLy8gcmVhZCBhbGwgcGxhbmVzIGluIG9uZSBoaXQsCgkJCQkJCS8vICdjb3ogUFNQIGNvbXByZXNzZXMgYWNyb3NzIHBsYW5lcy4uLgoKCQkJCQkJaWYgKGNvbXApIHsKCQkJCQkJCS8vIHVucGFja2VyIGFsZ29yaXRobQoKCQkJCQkJCWZvcih1bnNpZ25lZCB4ID0gMDsgeCA8IHNyY19zaXplOykgewoJCQkJCQkJCS8vIHJlYWQgdGhlIG5leHQgc291cmNlIGJ5dGUgaW50byB0CgkJCQkJCQkJc2lnbmVkIGNoYXIgdCA9IDA7CgkJCQkJCQkJaW8tPnJlYWRfcHJvYygmdCwgMSwgMSwgaGFuZGxlKTsKCQkJCQkJCQkKCQkJCQkJCQlpZiAodCA+PSAwKSB7CgkJCQkJCQkJCS8vIHQgPSBbMC4uMTI3XSA9PiBjb3B5IHRoZSBuZXh0IHQrMSBieXRlcyBsaXRlcmFsbHkKCQkJCQkJCQkJdW5zaWduZWQgc2l6ZV90b19yZWFkID0gdCArIDE7CgoJCQkJCQkJCQlpZigoc2l6ZV90b19yZWFkICsgeCkgPiBzcmNfc2l6ZSkgewoJCQkJCQkJCQkJLy8gc2FuaXR5IGNoZWNrIGZvciBidWZmZXIgb3ZlcnJ1bnMgCgkJCQkJCQkJCQlzaXplX3RvX3JlYWQgPSBzcmNfc2l6ZSAtIHg7CgkJCQkJCQkJCQlpby0+cmVhZF9wcm9jKHNyYyArIHgsIHNpemVfdG9fcmVhZCwgMSwgaGFuZGxlKTsKCQkJCQkJCQkJCXggKz0gKHQgKyAxKTsKCQkJCQkJCQkJfSBlbHNlIHsKCQkJCQkJCQkJCWlvLT5yZWFkX3Byb2Moc3JjICsgeCwgc2l6ZV90b19yZWFkLCAxLCBoYW5kbGUpOwoJCQkJCQkJCQkJeCArPSBzaXplX3RvX3JlYWQ7CgkJCQkJCQkJCX0KCQkJCQkJCQl9IGVsc2UgaWYgKHQgIT0gLTEyOCkgewoJCQkJCQkJCQkvLyB0ID0gWy0xLi4tMTI3XSAgPT4gcmVwbGljYXRlIHRoZSBuZXh0IGJ5dGUgLXQrMSB0aW1lcwoJCQkJCQkJCQlCWVRFIGIgPSAwOwoJCQkJCQkJCQlpby0+cmVhZF9wcm9jKCZiLCAxLCAxLCBoYW5kbGUpOwoJCQkJCQkJCQl1bnNpZ25lZCBzaXplX3RvX2NvcHkgPSAodW5zaWduZWQpKC0oaW50KXQgKyAxKTsKCgkJCQkJCQkJCWlmKChzaXplX3RvX2NvcHkgKyB4KSA+IHNyY19zaXplKSB7CgkJCQkJCQkJCQkvLyBzYW5pdHkgY2hlY2sgZm9yIGJ1ZmZlciBvdmVycnVucyAKCQkJCQkJCQkJCXNpemVfdG9fY29weSA9IHNyY19zaXplIC0geDsKCQkJCQkJCQkJCW1lbXNldChzcmMgKyB4LCBiLCBzaXplX3RvX2NvcHkpOwoJCQkJCQkJCQkJeCArPSAodW5zaWduZWQpKC0oaW50KXQgKyAxKTsKCQkJCQkJCQkJfSBlbHNlIHsKCQkJCQkJCQkJCW1lbXNldChzcmMgKyB4LCBiLCBzaXplX3RvX2NvcHkpOwoJCQkJCQkJCQkJeCArPSBzaXplX3RvX2NvcHk7CgkJCQkJCQkJCX0KCQkJCQkJCQl9CgkJCQkJCQkJLy8gdCA9IC0xMjggPT4gbm9vcAoJCQkJCQkJfQoJCQkJCQl9IGVsc2UgewoJCQkJCQkJaW8tPnJlYWRfcHJvYyhzcmMsIHNyY19zaXplLCAxLCBoYW5kbGUpOwoJCQkJCQl9CgoJCQkJCQkvLyBsYXp5IHBsYW5hci0+Y2h1bmt5Li4uCgoJCQkJCQlmb3IgKHVuc2lnbmVkIHggPSAwOyB4IDwgd2lkdGg7IHgrKykgewoJCQkJCQkJZm9yICh1bnNpZ25lZCBuID0gMDsgbiA8IHBsYW5lczsgbisrKSB7CgkJCQkJCQkJQllURSBiaXQgPSAoQllURSkoIHNyY1tuICogcGxhbmVfc2l6ZSArICh4IC8gOCldID4+ICgoeF43KSAmIDcpICk7CgoJCQkJCQkJCWRlc3RbeCAqIHBpeGVsX3NpemUgKyAobiAvIDgpXSB8PSAoYml0ICYgMSkgPDwgKG4gJiA3KTsKCQkJCQkJCX0KCQkJCQkJfQoKI2lmIEZSRUVJTUFHRV9DT0xPUk9SREVSID09IEZSRUVJTUFHRV9DT0xPUk9SREVSX0JHUgoJCQkJCQlpZiAoZGVwdGggPT0gMjQpIHsKCQkJCQkJCWZvciAodW5zaWduZWQgeCA9IDA7IHggPCB3aWR0aDsgKyt4KXsKCQkJCQkJCQlJTlBMQUNFU1dBUChkZXN0W3ggKiAzXSwgZGVzdFt4ICogMyArIDJdKTsKCQkJCQkJCX0KCQkJCQkJfQojZW5kaWYKCQkJCQl9CgoJCQkJCWZyZWUoc3JjKTsKCgkJCQkJcmV0dXJuIGRpYjsKCQkJCX0KCQkJfQoKCQkJLy8gRXZlcnkgb2RkLWxlbmd0aCBjaHVuayBpcyBmb2xsb3dlZCBieSBhIDAgcGFkIGJ5dGUuICBUaGlzIHBhZAoJCQkvLyAgYnl0ZSBpcyBub3QgY291bnRlZCBpbiBjaF9zaXplLgoJCQlpZiAoY2hfc2l6ZSAmIDEpIHsKCQkJCWNoX3NpemUrKzsKCQkJCWNoX2VuZCsrOwoJCQl9CgoJCQlpby0+c2Vla19wcm9jKGhhbmRsZSwgY2hfZW5kIC0gaW8tPnRlbGxfcHJvYyhoYW5kbGUpLCBTRUVLX0NVUik7CgoJCQlzaXplIC09IGNoX3NpemUgKyA4OwoJCX0KCgkJaWYgKGRpYikKCQkJRnJlZUltYWdlX1VubG9hZChkaWIpOwoJfQoKCXJldHVybiAwOwp9CgovLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci8vICAgSW5pdAovLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cgp2b2lkIERMTF9DQUxMQ09OVgpJbml0SUZGKFBsdWdpbiAqcGx1Z2luLCBpbnQgZm9ybWF0X2lkKSB7CglzX2Zvcm1hdF9pZCA9IGZvcm1hdF9pZDsKCglwbHVnaW4tPmZvcm1hdF9wcm9jID0gRm9ybWF0OwoJcGx1Z2luLT5kZXNjcmlwdGlvbl9wcm9jID0gRGVzY3JpcHRpb247CglwbHVnaW4tPmV4dGVuc2lvbl9wcm9jID0gRXh0ZW5zaW9uOwoJcGx1Z2luLT5yZWdleHByX3Byb2MgPSBSZWdFeHByOwoJcGx1Z2luLT5vcGVuX3Byb2MgPSBOVUxMOwoJcGx1Z2luLT5jbG9zZV9wcm9jID0gTlVMTDsKCXBsdWdpbi0+cGFnZWNvdW50X3Byb2MgPSBOVUxMOwoJcGx1Z2luLT5wYWdlY2FwYWJpbGl0eV9wcm9jID0gTlVMTDsKCXBsdWdpbi0+bG9hZF9wcm9jID0gTG9hZDsKCXBsdWdpbi0+c2F2ZV9wcm9jID0gTlVMTDsKCXBsdWdpbi0+dmFsaWRhdGVfcHJvYyA9IFZhbGlkYXRlOwoJcGx1Z2luLT5taW1lX3Byb2MgPSBNaW1lVHlwZTsKCXBsdWdpbi0+c3VwcG9ydHNfZXhwb3J0X2JwcF9wcm9jID0gU3VwcG9ydHNFeHBvcnREZXB0aDsKCXBsdWdpbi0+c3VwcG9ydHNfZXhwb3J0X3R5cGVfcHJvYyA9IFN1cHBvcnRzRXhwb3J0VHlwZTsKCXBsdWdpbi0+c3VwcG9ydHNfaWNjX3Byb2ZpbGVzX3Byb2MgPSBOVUxMOwp9Cg==