LyoKICogT0xFMzIgY2FsbG91dHMsIENPTSBpbnRlcmZhY2UgbWFyc2hhbGxpbmcKICoKICogQ29weXJpZ2h0IDIwMDEgT3ZlIEvldmVuLCBUcmFuc0dhbWluZyBUZWNobm9sb2dpZXMKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBCiAqCiAqIFRPRE86CiAqICAtIGZpeCB0aGUgd2lyZS1wcm90b2NvbCB0byBtYXRjaCBNUy9SUEMKICogIC0gZmluaXNoIFJwY1N0cmVhbV9WdGJsCiAqLwoKI2luY2x1ZGUgPHN0ZGFyZy5oPgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0cmluZy5oPgoKI2RlZmluZSBDT0JKTUFDUk9TCiNkZWZpbmUgTk9OQU1FTEVTU1VOSU9OCiNkZWZpbmUgTk9OQU1FTEVTU1NUUlVDVAoKI2luY2x1ZGUgIndpbmRlZi5oIgojaW5jbHVkZSAid2luYmFzZS5oIgojaW5jbHVkZSAid2luZXJyb3IuaCIKI2luY2x1ZGUgIndpbnJlZy5oIgoKI2luY2x1ZGUgIm9iamJhc2UuaCIKCiNpbmNsdWRlICJuZHJfbWlzYy5oIgojaW5jbHVkZSAicnBjbmRyLmgiCiNpbmNsdWRlICJ3aW5lL3JwY2ZjLmgiCgojaW5jbHVkZSAid2luZS9kZWJ1Zy5oIgoKV0lORV9ERUZBVUxUX0RFQlVHX0NIQU5ORUwob2xlKTsKCnN0YXRpYyBITU9EVUxFIGhPTEU7CgpzdGF0aWMgSFJFU1VMVCAoV0lOQVBJICpDT01fR2V0TWFyc2hhbFNpemVNYXgpKFVMT05HICosUkVGSUlELExQVU5LTk9XTixEV09SRCxMUFZPSUQsRFdPUkQpOwpzdGF0aWMgSFJFU1VMVCAoV0lOQVBJICpDT01fTWFyc2hhbEludGVyZmFjZSkoTFBTVFJFQU0sUkVGSUlELExQVU5LTk9XTixEV09SRCxMUFZPSUQsRFdPUkQpOwpzdGF0aWMgSFJFU1VMVCAoV0lOQVBJICpDT01fVW5tYXJzaGFsSW50ZXJmYWNlKShMUFNUUkVBTSxSRUZJSUQsTFBWT0lEKik7CnN0YXRpYyBIUkVTVUxUIChXSU5BUEkgKkNPTV9SZWxlYXNlTWFyc2hhbERhdGEpKExQU1RSRUFNKTsKc3RhdGljIEhSRVNVTFQgKFdJTkFQSSAqQ09NX0dldENsYXNzT2JqZWN0KShSRUZDTFNJRCxEV09SRCxDT1NFUlZFUklORk8gKixSRUZJSUQsTFBWT0lEICopOwpzdGF0aWMgSFJFU1VMVCAoV0lOQVBJICpDT01fR2V0UFNDbHNpZCkoUkVGSUlELENMU0lEICopOwpzdGF0aWMgTFBWT0lEIChXSU5BUEkgKkNPTV9NZW1BbGxvYykoVUxPTkcpOwpzdGF0aWMgdm9pZCAoV0lOQVBJICpDT01fTWVtRnJlZSkoTFBWT0lEKTsKCnN0YXRpYyBITU9EVUxFIExvYWRDT00odm9pZCkKewogIGlmIChoT0xFKSByZXR1cm4gaE9MRTsKICBoT0xFID0gTG9hZExpYnJhcnlBKCJPTEUzMi5ETEwiKTsKICBpZiAoIWhPTEUpIHJldHVybiAwOwogIENPTV9HZXRNYXJzaGFsU2l6ZU1heCAgPSAoTFBWT0lEKUdldFByb2NBZGRyZXNzKGhPTEUsICJDb0dldE1hcnNoYWxTaXplTWF4Iik7CiAgQ09NX01hcnNoYWxJbnRlcmZhY2UgICA9IChMUFZPSUQpR2V0UHJvY0FkZHJlc3MoaE9MRSwgIkNvTWFyc2hhbEludGVyZmFjZSIpOwogIENPTV9Vbm1hcnNoYWxJbnRlcmZhY2UgPSAoTFBWT0lEKUdldFByb2NBZGRyZXNzKGhPTEUsICJDb1VubWFyc2hhbEludGVyZmFjZSIpOwogIENPTV9SZWxlYXNlTWFyc2hhbERhdGEgPSAoTFBWT0lEKUdldFByb2NBZGRyZXNzKGhPTEUsICJDb1JlbGVhc2VNYXJzaGFsRGF0YSIpOwogIENPTV9HZXRDbGFzc09iamVjdCAgICAgPSAoTFBWT0lEKUdldFByb2NBZGRyZXNzKGhPTEUsICJDb0dldENsYXNzT2JqZWN0Iik7CiAgQ09NX0dldFBTQ2xzaWQgICAgICAgICA9IChMUFZPSUQpR2V0UHJvY0FkZHJlc3MoaE9MRSwgIkNvR2V0UFNDbHNpZCIpOwogIENPTV9NZW1BbGxvYyA9IChMUFZPSUQpR2V0UHJvY0FkZHJlc3MoaE9MRSwgIkNvVGFza01lbUFsbG9jIik7CiAgQ09NX01lbUZyZWUgID0gKExQVk9JRClHZXRQcm9jQWRkcmVzcyhoT0xFLCAiQ29UYXNrTWVtRnJlZSIpOwogIHJldHVybiBoT0xFOwp9CgovKiBDb01hcnNoYWxJbnRlcmZhY2UvQ29Vbm1hcnNoYWxJbnRlcmZhY2Ugd29ya3Mgb24gc3RyZWFtcywKICogc28gaW1wbGVtZW50IGEgc2ltcGxlIHN0cmVhbSBvbiB0b3Agb2YgdGhlIFJQQyBidWZmZXIKICogKHdoaWNoIGFsc28gaW1wbGVtZW50cyB0aGUgTUludGVyZmFjZVBvaW50ZXIgc3RydWN0dXJlKSAqLwp0eXBlZGVmIHN0cnVjdCBScGNTdHJlYW1JbXBsCnsKICBjb25zdCBJU3RyZWFtVnRibCAqbHBWdGJsOwogIERXT1JEIFJlZkNvdW50OwogIFBNSURMX1NUVUJfTUVTU0FHRSBwTXNnOwogIExQRFdPUkQgc2l6ZTsKICBjaGFyICpkYXRhOwogIERXT1JEIHBvczsKfSBScGNTdHJlYW1JbXBsOwoKc3RhdGljIEhSRVNVTFQgV0lOQVBJIFJwY1N0cmVhbV9RdWVyeUludGVyZmFjZShMUFNUUkVBTSBpZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFRklJRCByaWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBWT0lEICpvYmopCnsKICBScGNTdHJlYW1JbXBsICpUaGlzID0gKFJwY1N0cmVhbUltcGwgKilpZmFjZTsKICBpZiAoSXNFcXVhbEdVSUQoJklJRF9JVW5rbm93biwgcmlpZCkgfHwKICAgICAgSXNFcXVhbEdVSUQoJklJRF9JU2VxdWVudGlhbFN0cmVhbSwgcmlpZCkgfHwKICAgICAgSXNFcXVhbEdVSUQoJklJRF9JU3RyZWFtLCByaWlkKSkgewogICAgKm9iaiA9IFRoaXM7CiAgICBUaGlzLT5SZWZDb3VudCsrOwogICAgcmV0dXJuIFNfT0s7CiAgfQogIHJldHVybiBFX05PSU5URVJGQUNFOwp9CgpzdGF0aWMgVUxPTkcgV0lOQVBJIFJwY1N0cmVhbV9BZGRSZWYoTFBTVFJFQU0gaWZhY2UpCnsKICBScGNTdHJlYW1JbXBsICpUaGlzID0gKFJwY1N0cmVhbUltcGwgKilpZmFjZTsKICByZXR1cm4gKysoVGhpcy0+UmVmQ291bnQpOwp9CgpzdGF0aWMgVUxPTkcgV0lOQVBJIFJwY1N0cmVhbV9SZWxlYXNlKExQU1RSRUFNIGlmYWNlKQp7CiAgUnBjU3RyZWFtSW1wbCAqVGhpcyA9IChScGNTdHJlYW1JbXBsICopaWZhY2U7CiAgaWYgKCEtLShUaGlzLT5SZWZDb3VudCkpIHsKICAgIFRSQUNFKCJzaXplPSVsZFxuIiwgKlRoaXMtPnNpemUpOwogICAgVGhpcy0+cE1zZy0+QnVmZmVyID0gKHVuc2lnbmVkIGNoYXIqKVRoaXMtPmRhdGEgKyAqVGhpcy0+c2l6ZTsKICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksMCxUaGlzKTsKICAgIHJldHVybiAwOwogIH0KICByZXR1cm4gVGhpcy0+UmVmQ291bnQ7Cn0KCnN0YXRpYyBIUkVTVUxUIFdJTkFQSSBScGNTdHJlYW1fUmVhZChMUFNUUkVBTSBpZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcHYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVMT05HIGNiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTE9ORyAqcGNiUmVhZCkKewogIFJwY1N0cmVhbUltcGwgKlRoaXMgPSAoUnBjU3RyZWFtSW1wbCAqKWlmYWNlOwogIEhSRVNVTFQgaHIgPSBTX09LOwogIGlmIChUaGlzLT5wb3MgKyBjYiA+ICpUaGlzLT5zaXplKQogIHsKICAgIGNiID0gKlRoaXMtPnNpemUgLSBUaGlzLT5wb3M7CiAgICBociA9IFNfRkFMU0U7CiAgfQogIGlmIChjYikgewogICAgbWVtY3B5KHB2LCBUaGlzLT5kYXRhICsgVGhpcy0+cG9zLCBjYik7CiAgICBUaGlzLT5wb3MgKz0gY2I7CiAgfQogIGlmIChwY2JSZWFkKSAqcGNiUmVhZCA9IGNiOwogIHJldHVybiBocjsKfQoKc3RhdGljIEhSRVNVTFQgV0lOQVBJIFJwY1N0cmVhbV9Xcml0ZShMUFNUUkVBTSBpZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKnB2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUxPTkcgY2IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTE9ORyAqcGNiV3JpdHRlbikKewogIFJwY1N0cmVhbUltcGwgKlRoaXMgPSAoUnBjU3RyZWFtSW1wbCAqKWlmYWNlOwogIGlmIChUaGlzLT5kYXRhICsgY2IgPiAoY2hhciAqKVRoaXMtPnBNc2ctPkJ1ZmZlckVuZCkKICAgIHJldHVybiBTVEdfRV9NRURJVU1GVUxMOwogIG1lbWNweShUaGlzLT5kYXRhICsgVGhpcy0+cG9zLCBwdiwgY2IpOwogIFRoaXMtPnBvcyArPSBjYjsKICBpZiAoVGhpcy0+cG9zID4gKlRoaXMtPnNpemUpICpUaGlzLT5zaXplID0gVGhpcy0+cG9zOwogIGlmIChwY2JXcml0dGVuKSAqcGNiV3JpdHRlbiA9IGNiOwogIHJldHVybiBTX09LOwp9CgpzdGF0aWMgSFJFU1VMVCBXSU5BUEkgUnBjU3RyZWFtX1NlZWsoTFBTVFJFQU0gaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExBUkdFX0lOVEVHRVIgbW92ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgb3JpZ2luLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTEFSR0VfSU5URUdFUiAqbmV3UG9zKQp7CiAgUnBjU3RyZWFtSW1wbCAqVGhpcyA9IChScGNTdHJlYW1JbXBsICopaWZhY2U7CiAgc3dpdGNoIChvcmlnaW4pIHsKICBjYXNlIFNUUkVBTV9TRUVLX1NFVDoKICAgIFRoaXMtPnBvcyA9IG1vdmUudS5Mb3dQYXJ0OwogICAgYnJlYWs7CiAgY2FzZSBTVFJFQU1fU0VFS19DVVI6CiAgICBUaGlzLT5wb3MgPSBUaGlzLT5wb3MgKyBtb3ZlLnUuTG93UGFydDsKICAgIGJyZWFrOwogIGNhc2UgU1RSRUFNX1NFRUtfRU5EOgogICAgVGhpcy0+cG9zID0gKlRoaXMtPnNpemUgKyBtb3ZlLnUuTG93UGFydDsKICAgIGJyZWFrOwogIGRlZmF1bHQ6CiAgICByZXR1cm4gU1RHX0VfSU5WQUxJREZVTkNUSU9OOwogIH0KICBpZiAobmV3UG9zKSB7CiAgICBuZXdQb3MtPnUuTG93UGFydCA9IFRoaXMtPnBvczsKICAgIG5ld1Bvcy0+dS5IaWdoUGFydCA9IDA7CiAgfQogIHJldHVybiBTX09LOwp9CgpzdGF0aWMgSFJFU1VMVCBXSU5BUEkgUnBjU3RyZWFtX1NldFNpemUoTFBTVFJFQU0gaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVMQVJHRV9JTlRFR0VSIG5ld1NpemUpCnsKICBScGNTdHJlYW1JbXBsICpUaGlzID0gKFJwY1N0cmVhbUltcGwgKilpZmFjZTsKICAqVGhpcy0+c2l6ZSA9IG5ld1NpemUudS5Mb3dQYXJ0OwogIHJldHVybiBTX09LOwp9CgpzdGF0aWMgY29uc3QgSVN0cmVhbVZ0YmwgUnBjU3RyZWFtX1Z0YmwgPQp7CiAgUnBjU3RyZWFtX1F1ZXJ5SW50ZXJmYWNlLAogIFJwY1N0cmVhbV9BZGRSZWYsCiAgUnBjU3RyZWFtX1JlbGVhc2UsCiAgUnBjU3RyZWFtX1JlYWQsCiAgUnBjU3RyZWFtX1dyaXRlLAogIFJwY1N0cmVhbV9TZWVrLAogIFJwY1N0cmVhbV9TZXRTaXplLAogIE5VTEwsIC8qIENvcHlUbyAqLwogIE5VTEwsIC8qIENvbW1pdCAqLwogIE5VTEwsIC8qIFJldmVydCAqLwogIE5VTEwsIC8qIExvY2tSZWdpb24gKi8KICBOVUxMLCAvKiBVbmxvY2tSZWdpb24gKi8KICBOVUxMLCAvKiBTdGF0ICovCiAgTlVMTCAgLyogQ2xvbmUgKi8KfTsKCnN0YXRpYyBMUFNUUkVBTSBScGNTdHJlYW1fQ3JlYXRlKFBNSURMX1NUVUJfTUVTU0FHRSBwU3R1Yk1zZywgQk9PTCBpbml0KQp7CiAgUnBjU3RyZWFtSW1wbCAqVGhpczsKICBUaGlzID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksSEVBUF9aRVJPX01FTU9SWSxzaXplb2YoUnBjU3RyZWFtSW1wbCkpOwogIGlmICghVGhpcykgcmV0dXJuIE5VTEw7CiAgVGhpcy0+bHBWdGJsID0gJlJwY1N0cmVhbV9WdGJsOwogIFRoaXMtPlJlZkNvdW50ID0gMTsKICBUaGlzLT5wTXNnID0gcFN0dWJNc2c7CiAgVGhpcy0+c2l6ZSA9IChMUERXT1JEKXBTdHViTXNnLT5CdWZmZXI7CiAgVGhpcy0+ZGF0YSA9IChjaGFyKikoVGhpcy0+c2l6ZSArIDEpOwogIFRoaXMtPnBvcyA9IDA7CiAgaWYgKGluaXQpICpUaGlzLT5zaXplID0gMDsKICBUUkFDRSgiaW5pdCBzaXplPSVsZFxuIiwgKlRoaXMtPnNpemUpOwogIHJldHVybiAoTFBTVFJFQU0pVGhpczsKfQoKc3RhdGljIGNvbnN0IElJRCogZ2V0X2lwX2lpZChQTUlETF9TVFVCX01FU1NBR0UgcFN0dWJNc2csIHVuc2lnbmVkIGNoYXIgKnBNZW1vcnksIFBGT1JNQVRfU1RSSU5HIHBGb3JtYXQpCnsKICBjb25zdCBJSUQgKnJpaWQ7CiAgaWYgKCFwRm9ybWF0KSByZXR1cm4gJklJRF9JVW5rbm93bjsKICBUUkFDRSgiZm9ybWF0PSUwMnggJTAyeFxuIiwgcEZvcm1hdFswXSwgcEZvcm1hdFsxXSk7CiAgaWYgKHBGb3JtYXRbMF0gIT0gUlBDX0ZDX0lQKSBGSVhNRSgiZm9ybWF0PSVkXG4iLCBwRm9ybWF0WzBdKTsKICBpZiAocEZvcm1hdFsxXSA9PSBSUENfRkNfQ09OU1RBTlRfSUlEKSB7CiAgICByaWlkID0gKGNvbnN0IElJRCAqKSZwRm9ybWF0WzJdOwogIH0gZWxzZSB7CiAgICBDb21wdXRlQ29uZm9ybWFuY2UocFN0dWJNc2csIHBNZW1vcnksIHBGb3JtYXQrMiwgMCk7CiAgICByaWlkID0gKGNvbnN0IElJRCAqKXBTdHViTXNnLT5NYXhDb3VudDsKICB9CiAgaWYgKCFyaWlkKSByaWlkID0gJklJRF9JVW5rbm93bjsKICBUUkFDRSgiZ290ICVzXG4iLCBkZWJ1Z3N0cl9ndWlkKHJpaWQpKTsKICByZXR1cm4gcmlpZDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBOZHJJbnRlcmZhY2VQb2ludGVyTWFyc2hhbGwgW1JQQ1JUNC5AXQogKi8KdW5zaWduZWQgY2hhciAqIFdJTkFQSSBOZHJJbnRlcmZhY2VQb2ludGVyTWFyc2hhbGwoUE1JRExfU1RVQl9NRVNTQUdFIHBTdHViTXNnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnBNZW1vcnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEZPUk1BVF9TVFJJTkcgcEZvcm1hdCkKewogIGNvbnN0IElJRCAqcmlpZCA9IGdldF9pcF9paWQocFN0dWJNc2csIHBNZW1vcnksIHBGb3JtYXQpOwogIExQU1RSRUFNIHN0cmVhbTsKICBIUkVTVUxUIGhyOwoKICBUUkFDRSgiKCVwLCVwLCVwKVxuIiwgcFN0dWJNc2csIHBNZW1vcnksIHBGb3JtYXQpOwogIHBTdHViTXNnLT5NYXhDb3VudCA9IDA7CiAgaWYgKCFMb2FkQ09NKCkpIHJldHVybiBOVUxMOwogIGlmIChwU3R1Yk1zZy0+QnVmZmVyICsgc2l6ZW9mKERXT1JEKSA8PSAodW5zaWduZWQgY2hhciAqKXBTdHViTXNnLT5ScGNNc2ctPkJ1ZmZlciArIHBTdHViTXNnLT5CdWZmZXJMZW5ndGgpIHsKICAgIHN0cmVhbSA9IFJwY1N0cmVhbV9DcmVhdGUocFN0dWJNc2csIFRSVUUpOwogICAgaWYgKHN0cmVhbSkgewogICAgICBpZiAocE1lbW9yeSkKICAgICAgICBociA9IENPTV9NYXJzaGFsSW50ZXJmYWNlKHN0cmVhbSwgcmlpZCwgKExQVU5LTk9XTilwTWVtb3J5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN0dWJNc2ctPmR3RGVzdENvbnRleHQsIHBTdHViTXNnLT5wdkRlc3RDb250ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVNITEZMQUdTX05PUk1BTCk7CiAgICAgIGVsc2UKICAgICAgICBociA9IFNfT0s7CgogICAgICBJU3RyZWFtX1JlbGVhc2Uoc3RyZWFtKTsKICAgICAgaWYgKEZBSUxFRChocikpCiAgICAgICAgUnBjUmFpc2VFeGNlcHRpb24oaHIpOwogICAgfQogIH0KICByZXR1cm4gTlVMTDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBOZHJJbnRlcmZhY2VQb2ludGVyVW5tYXJzaGFsbCBbUlBDUlQ0LkBdCiAqLwp1bnNpZ25lZCBjaGFyICogV0lOQVBJIE5kckludGVyZmFjZVBvaW50ZXJVbm1hcnNoYWxsKFBNSURMX1NUVUJfTUVTU0FHRSBwU3R1Yk1zZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKipwcE1lbW9yeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBGT1JNQVRfU1RSSU5HIHBGb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGZNdXN0QWxsb2MpCnsKICBMUFNUUkVBTSBzdHJlYW07CiAgSFJFU1VMVCBocjsKCiAgVFJBQ0UoIiglcCwlcCwlcCwlZClcbiIsIHBTdHViTXNnLCBwcE1lbW9yeSwgcEZvcm1hdCwgZk11c3RBbGxvYyk7CiAgaWYgKCFMb2FkQ09NKCkpIHJldHVybiBOVUxMOwogICooTFBWT0lEKilwcE1lbW9yeSA9IE5VTEw7CiAgaWYgKHBTdHViTXNnLT5CdWZmZXIgKyBzaXplb2YoRFdPUkQpIDwgKHVuc2lnbmVkIGNoYXIgKilwU3R1Yk1zZy0+UnBjTXNnLT5CdWZmZXIgKyBwU3R1Yk1zZy0+QnVmZmVyTGVuZ3RoKSB7CiAgICBzdHJlYW0gPSBScGNTdHJlYW1fQ3JlYXRlKHBTdHViTXNnLCBGQUxTRSk7CiAgICBpZiAoc3RyZWFtKSB7CiAgICAgIGhyID0gQ09NX1VubWFyc2hhbEludGVyZmFjZShzdHJlYW0sICZJSURfTlVMTCwgKExQVk9JRCopcHBNZW1vcnkpOwogICAgICBJU3RyZWFtX1JlbGVhc2Uoc3RyZWFtKTsKICAgICAgaWYgKEZBSUxFRChocikpCiAgICAgICAgUnBjUmFpc2VFeGNlcHRpb24oaHIpOwogICAgfQogIH0KICByZXR1cm4gTlVMTDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBOZHJJbnRlcmZhY2VQb2ludGVyQnVmZmVyU2l6ZSBbUlBDUlQ0LkBdCiAqLwp2b2lkIFdJTkFQSSBOZHJJbnRlcmZhY2VQb2ludGVyQnVmZmVyU2l6ZShQTUlETF9TVFVCX01FU1NBR0UgcFN0dWJNc2csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqcE1lbW9yeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQRk9STUFUX1NUUklORyBwRm9ybWF0KQp7CiAgY29uc3QgSUlEICpyaWlkID0gZ2V0X2lwX2lpZChwU3R1Yk1zZywgcE1lbW9yeSwgcEZvcm1hdCk7CiAgVUxPTkcgc2l6ZSA9IDA7CiAgSFJFU1VMVCBocjsKCiAgVFJBQ0UoIiglcCwlcCwlcClcbiIsIHBTdHViTXNnLCBwTWVtb3J5LCBwRm9ybWF0KTsKICBpZiAoIUxvYWRDT00oKSkgcmV0dXJuOwogIGhyID0gQ09NX0dldE1hcnNoYWxTaXplTWF4KCZzaXplLCByaWlkLCAoTFBVTktOT1dOKXBNZW1vcnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3R1Yk1zZy0+ZHdEZXN0Q29udGV4dCwgcFN0dWJNc2ctPnB2RGVzdENvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNU0hMRkxBR1NfTk9STUFMKTsKICBUUkFDRSgic2l6ZT0lbGRcbiIsIHNpemUpOwogIHBTdHViTXNnLT5CdWZmZXJMZW5ndGggKz0gc2l6ZW9mKERXT1JEKSArIHNpemU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgTmRySW50ZXJmYWNlUG9pbnRlck1lbW9yeVNpemUgW1JQQ1JUNC5AXQogKi8KdW5zaWduZWQgbG9uZyBXSU5BUEkgTmRySW50ZXJmYWNlUG9pbnRlck1lbW9yeVNpemUoUE1JRExfU1RVQl9NRVNTQUdFIHBTdHViTXNnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBGT1JNQVRfU1RSSU5HIHBGb3JtYXQpCnsKICBVTE9ORyBzaXplOwoKICBUUkFDRSgiKCVwLCVwKVxuIiwgcFN0dWJNc2csIHBGb3JtYXQpOwoKICBzaXplID0gKihVTE9ORyAqKXBTdHViTXNnLT5CdWZmZXI7CiAgcFN0dWJNc2ctPkJ1ZmZlciArPSA0OwogIHBTdHViTXNnLT5NZW1vcnlTaXplICs9IDQ7CgogIHBTdHViTXNnLT5CdWZmZXIgKz0gc2l6ZTsKCiAgcmV0dXJuIHBTdHViTXNnLT5NZW1vcnlTaXplOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIE5kckludGVyZmFjZVBvaW50ZXJGcmVlIFtSUENSVDQuQF0KICovCnZvaWQgV0lOQVBJIE5kckludGVyZmFjZVBvaW50ZXJGcmVlKFBNSURMX1NUVUJfTUVTU0FHRSBwU3R1Yk1zZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpwTWVtb3J5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBGT1JNQVRfU1RSSU5HIHBGb3JtYXQpCnsKICBMUFVOS05PV04gcFVuayA9IChMUFVOS05PV04pcE1lbW9yeTsKICBUUkFDRSgiKCVwLCVwLCVwKVxuIiwgcFN0dWJNc2csIHBNZW1vcnksIHBGb3JtYXQpOwogIGlmIChwVW5rKSBJVW5rbm93bl9SZWxlYXNlKHBVbmspOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIE5kck9sZUFsbG9jYXRlIFtSUENSVDQuQF0KICovCnZvaWQgKiBXSU5BUEkgTmRyT2xlQWxsb2NhdGUoc2l6ZV90IFNpemUpCnsKICBpZiAoIUxvYWRDT00oKSkgcmV0dXJuIE5VTEw7CiAgcmV0dXJuIENPTV9NZW1BbGxvYyhTaXplKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBOZHJPbGVGcmVlIFtSUENSVDQuQF0KICovCnZvaWQgV0lOQVBJIE5kck9sZUZyZWUodm9pZCAqTm9kZVRvRnJlZSkKewogIGlmICghTG9hZENPTSgpKSByZXR1cm47CiAgQ09NX01lbUZyZWUoTm9kZVRvRnJlZSk7Cn0K