LyoKICogT0xFMzIgY2FsbG91dHMsIENPTSBpbnRlcmZhY2UgbWFyc2hhbGxpbmcKICoKICogQ29weXJpZ2h0IDIwMDEgT3ZlIEvldmVuLCBUcmFuc0dhbWluZyBUZWNobm9sb2dpZXMKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCiAqCiAqIFRPRE86CiAqICAtIGZpZ3VyZSBvdXQgd2hldGhlciB3ZSAqcmVhbGx5KiBnb3QgdGhpcyByaWdodAogKiAgLSBjaGVjayBmb3IgZXJyb3JzIGFuZCB0aHJvdyBleGNlcHRpb25zCiAqICAtIHdoYXQgYXJlIHRoZSBtYXJzaGFsbGluZyBmdW5jdGlvbnMgc3VwcG9zZWQgdG8gcmV0dXJuPwogKiAgLSBmaW5pc2ggUnBjU3RyZWFtX1Z0YmwKICovCgojaW5jbHVkZSA8c3RkYXJnLmg+CiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CgojZGVmaW5lIENPQkpNQUNST1MKI2RlZmluZSBOT05BTUVMRVNTVU5JT04KI2RlZmluZSBOT05BTUVMRVNTU1RSVUNUCgojaW5jbHVkZSAid2luZGVmLmgiCiNpbmNsdWRlICJ3aW5iYXNlLmgiCiNpbmNsdWRlICJ3aW5lcnJvci5oIgojaW5jbHVkZSAid2lucmVnLmgiCgojaW5jbHVkZSAib2JqYmFzZS5oIgoKI2luY2x1ZGUgIm5kcl9taXNjLmgiCiNpbmNsdWRlICJycGNuZHIuaCIKI2luY2x1ZGUgIndpbmUvcnBjZmMuaCIKCiNpbmNsdWRlICJ3aW5lL2RlYnVnLmgiCgpXSU5FX0RFRkFVTFRfREVCVUdfQ0hBTk5FTChvbGUpOwoKc3RhdGljIEhNT0RVTEUgaE9MRTsKCnN0YXRpYyBIUkVTVUxUIChXSU5BUEkgKkNPTV9HZXRNYXJzaGFsU2l6ZU1heCkoVUxPTkcgKixSRUZJSUQsTFBVTktOT1dOLERXT1JELExQVk9JRCxEV09SRCk7CnN0YXRpYyBIUkVTVUxUIChXSU5BUEkgKkNPTV9NYXJzaGFsSW50ZXJmYWNlKShMUFNUUkVBTSxSRUZJSUQsTFBVTktOT1dOLERXT1JELExQVk9JRCxEV09SRCk7CnN0YXRpYyBIUkVTVUxUIChXSU5BUEkgKkNPTV9Vbm1hcnNoYWxJbnRlcmZhY2UpKExQU1RSRUFNLFJFRklJRCxMUFZPSUQqKTsKc3RhdGljIEhSRVNVTFQgKFdJTkFQSSAqQ09NX1JlbGVhc2VNYXJzaGFsRGF0YSkoTFBTVFJFQU0pOwpzdGF0aWMgSFJFU1VMVCAoV0lOQVBJICpDT01fR2V0Q2xhc3NPYmplY3QpKFJFRkNMU0lELERXT1JELENPU0VSVkVSSU5GTyAqLFJFRklJRCxMUFZPSUQgKik7CnN0YXRpYyBIUkVTVUxUIChXSU5BUEkgKkNPTV9HZXRQU0Nsc2lkKShSRUZJSUQsQ0xTSUQgKik7CnN0YXRpYyBMUFZPSUQgKFdJTkFQSSAqQ09NX01lbUFsbG9jKShVTE9ORyk7CnN0YXRpYyB2b2lkIChXSU5BUEkgKkNPTV9NZW1GcmVlKShMUFZPSUQpOwoKc3RhdGljIEhNT0RVTEUgTG9hZENPTSh2b2lkKQp7CiAgaWYgKGhPTEUpIHJldHVybiBoT0xFOwogIGhPTEUgPSBMb2FkTGlicmFyeUEoIk9MRTMyLkRMTCIpOwogIGlmICghaE9MRSkgcmV0dXJuIDA7CiAgQ09NX0dldE1hcnNoYWxTaXplTWF4ICA9IChMUFZPSUQpR2V0UHJvY0FkZHJlc3MoaE9MRSwgIkNvR2V0TWFyc2hhbFNpemVNYXgiKTsKICBDT01fTWFyc2hhbEludGVyZmFjZSAgID0gKExQVk9JRClHZXRQcm9jQWRkcmVzcyhoT0xFLCAiQ29NYXJzaGFsSW50ZXJmYWNlIik7CiAgQ09NX1VubWFyc2hhbEludGVyZmFjZSA9IChMUFZPSUQpR2V0UHJvY0FkZHJlc3MoaE9MRSwgIkNvVW5tYXJzaGFsSW50ZXJmYWNlIik7CiAgQ09NX1JlbGVhc2VNYXJzaGFsRGF0YSA9IChMUFZPSUQpR2V0UHJvY0FkZHJlc3MoaE9MRSwgIkNvUmVsZWFzZU1hcnNoYWxEYXRhIik7CiAgQ09NX0dldENsYXNzT2JqZWN0ICAgICA9IChMUFZPSUQpR2V0UHJvY0FkZHJlc3MoaE9MRSwgIkNvR2V0Q2xhc3NPYmplY3QiKTsKICBDT01fR2V0UFNDbHNpZCAgICAgICAgID0gKExQVk9JRClHZXRQcm9jQWRkcmVzcyhoT0xFLCAiQ29HZXRQU0Nsc2lkIik7CiAgQ09NX01lbUFsbG9jID0gKExQVk9JRClHZXRQcm9jQWRkcmVzcyhoT0xFLCAiQ29UYXNrTWVtQWxsb2MiKTsKICBDT01fTWVtRnJlZSAgPSAoTFBWT0lEKUdldFByb2NBZGRyZXNzKGhPTEUsICJDb1Rhc2tNZW1GcmVlIik7CiAgcmV0dXJuIGhPTEU7Cn0KCi8qIENvTWFyc2hhbEludGVyZmFjZS9Db1VubWFyc2hhbEludGVyZmFjZSB3b3JrcyBvbiBzdHJlYW1zLAogKiBzbyBpbXBsZW1lbnQgYSBzaW1wbGUgc3RyZWFtIG9uIHRvcCBvZiB0aGUgUlBDIGJ1ZmZlcgogKiAod2hpY2ggYWxzbyBpbXBsZW1lbnRzIHRoZSBNSW50ZXJmYWNlUG9pbnRlciBzdHJ1Y3R1cmUpICovCnR5cGVkZWYgc3RydWN0IFJwY1N0cmVhbUltcGwKewogIElTdHJlYW1WdGJsICpscFZ0Ymw7CiAgRFdPUkQgUmVmQ291bnQ7CiAgUE1JRExfU1RVQl9NRVNTQUdFIHBNc2c7CiAgTFBEV09SRCBzaXplOwogIGNoYXIgKmRhdGE7CiAgRFdPUkQgcG9zOwp9IFJwY1N0cmVhbUltcGw7CgpzdGF0aWMgSFJFU1VMVCBXSU5BUEkgUnBjU3RyZWFtX1F1ZXJ5SW50ZXJmYWNlKExQU1RSRUFNIGlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVGSUlEIHJpaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFZPSUQgKm9iaikKewogIFJwY1N0cmVhbUltcGwgKlRoaXMgPSAoUnBjU3RyZWFtSW1wbCAqKWlmYWNlOwogIGlmIChJc0VxdWFsR1VJRCgmSUlEX0lVbmtub3duLCByaWlkKSB8fAogICAgICBJc0VxdWFsR1VJRCgmSUlEX0lTZXF1ZW50aWFsU3RyZWFtLCByaWlkKSB8fAogICAgICBJc0VxdWFsR1VJRCgmSUlEX0lTdHJlYW0sIHJpaWQpKSB7CiAgICAqb2JqID0gVGhpczsKICAgIFRoaXMtPlJlZkNvdW50Kys7CiAgICByZXR1cm4gU19PSzsKICB9CiAgcmV0dXJuIEVfTk9JTlRFUkZBQ0U7Cn0KCnN0YXRpYyBVTE9ORyBXSU5BUEkgUnBjU3RyZWFtX0FkZFJlZihMUFNUUkVBTSBpZmFjZSkKewogIFJwY1N0cmVhbUltcGwgKlRoaXMgPSAoUnBjU3RyZWFtSW1wbCAqKWlmYWNlOwogIHJldHVybiArKyhUaGlzLT5SZWZDb3VudCk7Cn0KCnN0YXRpYyBVTE9ORyBXSU5BUEkgUnBjU3RyZWFtX1JlbGVhc2UoTFBTVFJFQU0gaWZhY2UpCnsKICBScGNTdHJlYW1JbXBsICpUaGlzID0gKFJwY1N0cmVhbUltcGwgKilpZmFjZTsKICBpZiAoIS0tKFRoaXMtPlJlZkNvdW50KSkgewogICAgVFJBQ0UoInNpemU9JWxkXG4iLCAqVGhpcy0+c2l6ZSk7CiAgICBUaGlzLT5wTXNnLT5CdWZmZXIgPSBUaGlzLT5kYXRhICsgKlRoaXMtPnNpemU7CiAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsVGhpcyk7CiAgICByZXR1cm4gMDsKICB9CiAgcmV0dXJuIFRoaXMtPlJlZkNvdW50Owp9CgpzdGF0aWMgSFJFU1VMVCBXSU5BUEkgUnBjU3RyZWFtX1JlYWQoTFBTVFJFQU0gaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnB2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTE9ORyBjYiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUxPTkcgKnBjYlJlYWQpCnsKICBScGNTdHJlYW1JbXBsICpUaGlzID0gKFJwY1N0cmVhbUltcGwgKilpZmFjZTsKICBpZiAoVGhpcy0+cG9zICsgY2IgPiAqVGhpcy0+c2l6ZSkgY2IgPSAqVGhpcy0+c2l6ZSAtIFRoaXMtPnBvczsKICBpZiAoY2IpIHsKICAgIG1lbWNweShwdiwgVGhpcy0+ZGF0YSArIFRoaXMtPnBvcywgY2IpOwogICAgVGhpcy0+cG9zICs9IGNiOwogIH0KICBpZiAocGNiUmVhZCkgKnBjYlJlYWQgPSBjYjsKICByZXR1cm4gU19PSzsKfQoKc3RhdGljIEhSRVNVTFQgV0lOQVBJIFJwY1N0cmVhbV9Xcml0ZShMUFNUUkVBTSBpZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKnB2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUxPTkcgY2IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTE9ORyAqcGNiV3JpdHRlbikKewogIFJwY1N0cmVhbUltcGwgKlRoaXMgPSAoUnBjU3RyZWFtSW1wbCAqKWlmYWNlOwogIG1lbWNweShUaGlzLT5kYXRhICsgVGhpcy0+cG9zLCBwdiwgY2IpOwogIFRoaXMtPnBvcyArPSBjYjsKICBpZiAoVGhpcy0+cG9zID4gKlRoaXMtPnNpemUpICpUaGlzLT5zaXplID0gVGhpcy0+cG9zOwogIGlmIChwY2JXcml0dGVuKSAqcGNiV3JpdHRlbiA9IGNiOwogIHJldHVybiBTX09LOwp9CgpzdGF0aWMgSFJFU1VMVCBXSU5BUEkgUnBjU3RyZWFtX1NlZWsoTFBTVFJFQU0gaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExBUkdFX0lOVEVHRVIgbW92ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgb3JpZ2luLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTEFSR0VfSU5URUdFUiAqbmV3UG9zKQp7CiAgUnBjU3RyZWFtSW1wbCAqVGhpcyA9IChScGNTdHJlYW1JbXBsICopaWZhY2U7CiAgc3dpdGNoIChvcmlnaW4pIHsKICBjYXNlIFNUUkVBTV9TRUVLX1NFVDoKICAgIFRoaXMtPnBvcyA9IG1vdmUudS5Mb3dQYXJ0OwogICAgYnJlYWs7CiAgY2FzZSBTVFJFQU1fU0VFS19DVVI6CiAgICBUaGlzLT5wb3MgPSBUaGlzLT5wb3MgKyBtb3ZlLnUuTG93UGFydDsKICAgIGJyZWFrOwogIGNhc2UgU1RSRUFNX1NFRUtfRU5EOgogICAgVGhpcy0+cG9zID0gKlRoaXMtPnNpemUgKyBtb3ZlLnUuTG93UGFydDsKICAgIGJyZWFrOwogIGRlZmF1bHQ6CiAgICByZXR1cm4gU1RHX0VfSU5WQUxJREZVTkNUSU9OOwogIH0KICBpZiAobmV3UG9zKSB7CiAgICBuZXdQb3MtPnUuTG93UGFydCA9IFRoaXMtPnBvczsKICAgIG5ld1Bvcy0+dS5IaWdoUGFydCA9IDA7CiAgfQogIHJldHVybiBTX09LOwp9CgpzdGF0aWMgSFJFU1VMVCBXSU5BUEkgUnBjU3RyZWFtX1NldFNpemUoTFBTVFJFQU0gaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVMQVJHRV9JTlRFR0VSIG5ld1NpemUpCnsKICBScGNTdHJlYW1JbXBsICpUaGlzID0gKFJwY1N0cmVhbUltcGwgKilpZmFjZTsKICAqVGhpcy0+c2l6ZSA9IG5ld1NpemUudS5Mb3dQYXJ0OwogIHJldHVybiBTX09LOwp9CgpzdGF0aWMgSVN0cmVhbVZ0YmwgUnBjU3RyZWFtX1Z0YmwgPQp7CiAgUnBjU3RyZWFtX1F1ZXJ5SW50ZXJmYWNlLAogIFJwY1N0cmVhbV9BZGRSZWYsCiAgUnBjU3RyZWFtX1JlbGVhc2UsCiAgUnBjU3RyZWFtX1JlYWQsCiAgUnBjU3RyZWFtX1dyaXRlLAogIFJwY1N0cmVhbV9TZWVrLAogIFJwY1N0cmVhbV9TZXRTaXplLAogIE5VTEwsIC8qIENvcHlUbyAqLwogIE5VTEwsIC8qIENvbW1pdCAqLwogIE5VTEwsIC8qIFJldmVydCAqLwogIE5VTEwsIC8qIExvY2tSZWdpb24gKi8KICBOVUxMLCAvKiBVbmxvY2tSZWdpb24gKi8KICBOVUxMLCAvKiBTdGF0ICovCiAgTlVMTCAgLyogQ2xvbmUgKi8KfTsKCnN0YXRpYyBMUFNUUkVBTSBScGNTdHJlYW1fQ3JlYXRlKFBNSURMX1NUVUJfTUVTU0FHRSBwU3R1Yk1zZywgQk9PTCBpbml0KQp7CiAgUnBjU3RyZWFtSW1wbCAqVGhpczsKICBUaGlzID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksSEVBUF9aRVJPX01FTU9SWSxzaXplb2YoUnBjU3RyZWFtSW1wbCkpOwogIGlmICghVGhpcykgcmV0dXJuIE5VTEw7CiAgVGhpcy0+bHBWdGJsID0gJlJwY1N0cmVhbV9WdGJsOwogIFRoaXMtPlJlZkNvdW50ID0gMTsKICBUaGlzLT5wTXNnID0gcFN0dWJNc2c7CiAgVGhpcy0+c2l6ZSA9IChMUERXT1JEKXBTdHViTXNnLT5CdWZmZXI7CiAgVGhpcy0+ZGF0YSA9IChjaGFyKikoVGhpcy0+c2l6ZSArIDEpOwogIFRoaXMtPnBvcyA9IDA7CiAgaWYgKGluaXQpICpUaGlzLT5zaXplID0gMDsKICBUUkFDRSgiaW5pdCBzaXplPSVsZFxuIiwgKlRoaXMtPnNpemUpOwogIHJldHVybiAoTFBTVFJFQU0pVGhpczsKfQoKY29uc3QgSUlEKiBnZXRfaXBfaWlkKFBNSURMX1NUVUJfTUVTU0FHRSBwU3R1Yk1zZywgdW5zaWduZWQgY2hhciAqcE1lbW9yeSwgUEZPUk1BVF9TVFJJTkcgcEZvcm1hdCkKewogIGNvbnN0IElJRCAqcmlpZDsKICBpZiAoIXBGb3JtYXQpIHJldHVybiAmSUlEX0lVbmtub3duOwogIFRSQUNFKCJmb3JtYXQ9JTAyeCAlMDJ4XG4iLCBwRm9ybWF0WzBdLCBwRm9ybWF0WzFdKTsKICBpZiAocEZvcm1hdFswXSAhPSBSUENfRkNfSVApIEZJWE1FKCJmb3JtYXQ9JWRcbiIsIHBGb3JtYXRbMF0pOwogIGlmIChwRm9ybWF0WzFdID09IFJQQ19GQ19DT05TVEFOVF9JSUQpIHsKICAgIHJpaWQgPSAoY29uc3QgSUlEICopJnBGb3JtYXRbMl07CiAgfSBlbHNlIHsKICAgIENvbXB1dGVDb25mb3JtYW5jZShwU3R1Yk1zZywgcE1lbW9yeSwgcEZvcm1hdCsyLCAwKTsKICAgIHJpaWQgPSAoY29uc3QgSUlEICopcFN0dWJNc2ctPk1heENvdW50OwogIH0KICBpZiAoIXJpaWQpIHJpaWQgPSAmSUlEX0lVbmtub3duOwogIFRSQUNFKCJnb3QgJXNcbiIsIGRlYnVnc3RyX2d1aWQocmlpZCkpOwogIHJldHVybiByaWlkOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIE5kckludGVyZmFjZVBvaW50ZXJNYXJzaGFsbCBbUlBDUlQ0LkBdCiAqLwp1bnNpZ25lZCBjaGFyICogV0lOQVBJIE5kckludGVyZmFjZVBvaW50ZXJNYXJzaGFsbChQTUlETF9TVFVCX01FU1NBR0UgcFN0dWJNc2csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqcE1lbW9yeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQRk9STUFUX1NUUklORyBwRm9ybWF0KQp7CiAgY29uc3QgSUlEICpyaWlkID0gZ2V0X2lwX2lpZChwU3R1Yk1zZywgcE1lbW9yeSwgcEZvcm1hdCk7CiAgTFBTVFJFQU0gc3RyZWFtOwogIEhSRVNVTFQgaHI7CgogIFRSQUNFKCIoJXAsJXAsJXApXG4iLCBwU3R1Yk1zZywgcE1lbW9yeSwgcEZvcm1hdCk7CiAgcFN0dWJNc2ctPk1heENvdW50ID0gMDsKICBpZiAoIUxvYWRDT00oKSkgcmV0dXJuIE5VTEw7CiAgc3RyZWFtID0gUnBjU3RyZWFtX0NyZWF0ZShwU3R1Yk1zZywgVFJVRSk7CiAgaHIgPSBDT01fTWFyc2hhbEludGVyZmFjZShzdHJlYW0sIHJpaWQsIChMUFVOS05PV04pcE1lbW9yeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN0dWJNc2ctPmR3RGVzdENvbnRleHQsIHBTdHViTXNnLT5wdkRlc3RDb250ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICBNU0hMRkxBR1NfTk9STUFMKTsKICBJU3RyZWFtX1JlbGVhc2Uoc3RyZWFtKTsKICByZXR1cm4gTlVMTDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBOZHJJbnRlcmZhY2VQb2ludGVyVW5tYXJzaGFsbCBbUlBDUlQ0LkBdCiAqLwp1bnNpZ25lZCBjaGFyICogV0lOQVBJIE5kckludGVyZmFjZVBvaW50ZXJVbm1hcnNoYWxsKFBNSURMX1NUVUJfTUVTU0FHRSBwU3R1Yk1zZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKipwcE1lbW9yeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBGT1JNQVRfU1RSSU5HIHBGb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGZNdXN0QWxsb2MpCnsKICBMUFNUUkVBTSBzdHJlYW07CiAgSFJFU1VMVCBocjsKCiAgVFJBQ0UoIiglcCwlcCwlcCwlZClcbiIsIHBTdHViTXNnLCBwcE1lbW9yeSwgcEZvcm1hdCwgZk11c3RBbGxvYyk7CiAgaWYgKCFMb2FkQ09NKCkpIHJldHVybiBOVUxMOwogICooTFBWT0lEKilwcE1lbW9yeSA9IE5VTEw7CiAgc3RyZWFtID0gUnBjU3RyZWFtX0NyZWF0ZShwU3R1Yk1zZywgRkFMU0UpOwogIGhyID0gQ09NX1VubWFyc2hhbEludGVyZmFjZShzdHJlYW0sICZJSURfTlVMTCwgKExQVk9JRCopcHBNZW1vcnkpOwogIElTdHJlYW1fUmVsZWFzZShzdHJlYW0pOwogIHJldHVybiBOVUxMOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIE5kckludGVyZmFjZVBvaW50ZXJCdWZmZXJTaXplIFtSUENSVDQuQF0KICovCnZvaWQgV0lOQVBJIE5kckludGVyZmFjZVBvaW50ZXJCdWZmZXJTaXplKFBNSURMX1NUVUJfTUVTU0FHRSBwU3R1Yk1zZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpwTWVtb3J5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBGT1JNQVRfU1RSSU5HIHBGb3JtYXQpCnsKICBjb25zdCBJSUQgKnJpaWQgPSBnZXRfaXBfaWlkKHBTdHViTXNnLCBwTWVtb3J5LCBwRm9ybWF0KTsKICBVTE9ORyBzaXplID0gMDsKICBIUkVTVUxUIGhyOwoKICBUUkFDRSgiKCVwLCVwLCVwKVxuIiwgcFN0dWJNc2csIHBNZW1vcnksIHBGb3JtYXQpOwogIGlmICghTG9hZENPTSgpKSByZXR1cm47CiAgaHIgPSBDT01fR2V0TWFyc2hhbFNpemVNYXgoJnNpemUsIHJpaWQsIChMUFVOS05PV04pcE1lbW9yeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdHViTXNnLT5kd0Rlc3RDb250ZXh0LCBwU3R1Yk1zZy0+cHZEZXN0Q29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1TSExGTEFHU19OT1JNQUwpOwogIFRSQUNFKCJzaXplPSVsZFxuIiwgc2l6ZSk7CiAgcFN0dWJNc2ctPkJ1ZmZlckxlbmd0aCArPSBzaXplb2YoRFdPUkQpICsgc2l6ZTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBOZHJJbnRlcmZhY2VQb2ludGVyTWVtb3J5U2l6ZSBbUlBDUlQ0LkBdCiAqLwp1bnNpZ25lZCBsb25nIFdJTkFQSSBOZHJJbnRlcmZhY2VQb2ludGVyTWVtb3J5U2l6ZShQTUlETF9TVFVCX01FU1NBR0UgcFN0dWJNc2csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEZPUk1BVF9TVFJJTkcgcEZvcm1hdCkKewogIEZJWE1FKCIoJXAsJXApOiBzdHViXG4iLCBwU3R1Yk1zZywgcEZvcm1hdCk7CiAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgTmRySW50ZXJmYWNlUG9pbnRlckZyZWUgW1JQQ1JUNC5AXQogKi8Kdm9pZCBXSU5BUEkgTmRySW50ZXJmYWNlUG9pbnRlckZyZWUoUE1JRExfU1RVQl9NRVNTQUdFIHBTdHViTXNnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnBNZW1vcnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEZPUk1BVF9TVFJJTkcgcEZvcm1hdCkKewogIExQVU5LTk9XTiBwVW5rID0gKExQVU5LTk9XTilwTWVtb3J5OwogIFRSQUNFKCIoJXAsJXAsJXApXG4iLCBwU3R1Yk1zZywgcE1lbW9yeSwgcEZvcm1hdCk7CiAgaWYgKHBVbmspIElVbmtub3duX1JlbGVhc2UocFVuayk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgTmRyT2xlQWxsb2NhdGUgW1JQQ1JUNC5AXQogKi8Kdm9pZCAqIFdJTkFQSSBOZHJPbGVBbGxvY2F0ZShzaXplX3QgU2l6ZSkKewogIGlmICghTG9hZENPTSgpKSByZXR1cm4gTlVMTDsKICByZXR1cm4gQ09NX01lbUFsbG9jKFNpemUpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIE5kck9sZUZyZWUgW1JQQ1JUNC5AXQogKi8Kdm9pZCBXSU5BUEkgTmRyT2xlRnJlZSh2b2lkICpOb2RlVG9GcmVlKQp7CiAgaWYgKCFMb2FkQ09NKCkpIHJldHVybjsKICBDT01fTWVtRnJlZShOb2RlVG9GcmVlKTsKfQoKLyogaW50ZXJuYWwgKi8KSFJFU1VMVCBSUENSVDRfR2V0UFNGYWN0b3J5KFJFRklJRCByaWlkLCBMUFBTRkFDVE9SWUJVRkZFUiAqcFBTKQp7CiAgSFJFU1VMVCBocjsKICBDTFNJRCBjbHNpZDsKCiAgaWYgKCFMb2FkQ09NKCkpIHJldHVybiBSUENfRV9VTkVYUEVDVEVEOwogIGhyID0gQ09NX0dldFBTQ2xzaWQocmlpZCwgJmNsc2lkKTsKICBpZiAoRkFJTEVEKGhyKSkgcmV0dXJuIGhyOwogIGhyID0gQ09NX0dldENsYXNzT2JqZWN0KCZjbHNpZCwgQ0xTQ1RYX0lOUFJPQ19TRVJWRVIsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgJklJRF9JUFNGYWN0b3J5QnVmZmVyLCAoTFBWT0lEICopcFBTKTsKICByZXR1cm4gaHI7Cn0K