LyoJCURpcmVjdERyYXcgLSBJRGlyZWN0UGFsZXR0ZSBiYXNlIGludGVyZmFjZQogKgogKiBDb3B5cmlnaHQgMjAwNiBTdGVmYW4gRPZzaW5nZXIKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBCiAqLwoKI2luY2x1ZGUgImNvbmZpZy5oIgojaW5jbHVkZSAid2luZXJyb3IuaCIKI2luY2x1ZGUgIndpbmUvZGVidWcuaCIKCiNkZWZpbmUgQ09CSk1BQ1JPUwoKI2luY2x1ZGUgPGFzc2VydC5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CgojaW5jbHVkZSAiZGRyYXdfcHJpdmF0ZS5oIgoKV0lORV9ERUZBVUxUX0RFQlVHX0NIQU5ORUwoZGRyYXcpOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3REcmF3UGFsZXR0ZTo6UXVlcnlJbnRlcmZhY2UKICoKICogQSB1c3VhbCBRdWVyeUludGVyZmFjZSBpbXBsZW1lbnRhdGlvbi4gQ2FuIG9ubHkgUXVlcnkgSVVua25vd24gYW5kCiAqIElEaXJlY3REcmF3UGFsZXR0ZQogKgogKiBQYXJhbXM6CiAqICByZWZpaWQ6IFRoZSBpbnRlcmZhY2UgaWQgcXVlcmllZCBmb3IKICogIG9iajogQWRkcmVzcyB0byByZXR1cm4gdGhlIGludGVyZmFjZSBwb2ludGVyIGF0CiAqCiAqIFJldHVybnM6CiAqICBTX09LIG9uIHN1Y2Nlc3MKICogIEVfTk9JTlRFUkZBQ0UgaWYgdGhlIHJlcXVlc3RlZCBpbnRlcmZhY2Ugd2Fzbid0IGZvdW5kCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJCklEaXJlY3REcmF3UGFsZXR0ZUltcGxfUXVlcnlJbnRlcmZhY2UoSURpcmVjdERyYXdQYWxldHRlICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUZJSUQgcmVmaWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKipvYmopCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3UGFsZXR0ZUltcGwsIElEaXJlY3REcmF3UGFsZXR0ZSwgaWZhY2UpOwogICAgVFJBQ0UoIiglcCktPiglcywlcClcbiIsVGhpcyxkZWJ1Z3N0cl9ndWlkKHJlZmlpZCksb2JqKTsKCiAgICBpZiAoSXNFcXVhbEdVSUQocmVmaWlkLCAmSUlEX0lVbmtub3duKQogICAgICAgIHx8IElzRXF1YWxHVUlEKHJlZmlpZCwgJklJRF9JRGlyZWN0RHJhd1BhbGV0dGUpKQogICAgewogICAgICAgICpvYmogPSBpZmFjZTsKICAgICAgICBJRGlyZWN0RHJhd1BhbGV0dGVfQWRkUmVmKGlmYWNlKTsKICAgICAgICByZXR1cm4gU19PSzsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICAqb2JqID0gTlVMTDsKICAgICAgICByZXR1cm4gRV9OT0lOVEVSRkFDRTsKICAgIH0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3REcmF3UGFsZXR0ZUltcGw6OkFkZFJlZgogKgogKiBJbmNyZWFzZXMgdGhlIHJlZmNvdW50LgogKgogKiBSZXR1cm5zOgogKiAgVGhlIG5ldyByZWZjb3VudAogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBVTE9ORyBXSU5BUEkKSURpcmVjdERyYXdQYWxldHRlSW1wbF9BZGRSZWYoSURpcmVjdERyYXdQYWxldHRlICppZmFjZSkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdQYWxldHRlSW1wbCwgSURpcmVjdERyYXdQYWxldHRlLCBpZmFjZSk7CiAgICBVTE9ORyByZWYgPSBJbnRlcmxvY2tlZEluY3JlbWVudCgmVGhpcy0+cmVmKTsKCiAgICBUUkFDRSgiKCVwKS0+KCkgaW5jcmVtZW50aW5nIGZyb20gJXUuXG4iLCBUaGlzLCByZWYgLSAxKTsKCiAgICByZXR1cm4gcmVmOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdERyYXdQYWxldHRlSW1wbDo6UmVsZWFzZQogKgogKiBSZWR1Y2VzIHRoZSByZWZjb3VudC4gSWYgdGhlIHJlZmNvdW50IGZhbGxzIHRvIDAsIHRoZSBvYmplY3QgaXMgZGVzdHJveWVkCiAqCiAqIFJldHVybnM6CiAqICBUaGUgbmV3IHJlZmNvdW50CiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIFVMT05HIFdJTkFQSQpJRGlyZWN0RHJhd1BhbGV0dGVJbXBsX1JlbGVhc2UoSURpcmVjdERyYXdQYWxldHRlICppZmFjZSkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdQYWxldHRlSW1wbCwgSURpcmVjdERyYXdQYWxldHRlLCBpZmFjZSk7CiAgICBVTE9ORyByZWYgPSBJbnRlcmxvY2tlZERlY3JlbWVudCgmVGhpcy0+cmVmKTsKCiAgICBUUkFDRSgiKCVwKS0+KCkgZGVjcmVtZW50aW5nIGZyb20gJXUuXG4iLCBUaGlzLCByZWYgKyAxKTsKCiAgICBpZiAocmVmID09IDApCiAgICB7CiAgICAgICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oJmRkcmF3X2NzKTsKICAgICAgICBJV2luZUQzRFBhbGV0dGVfUmVsZWFzZShUaGlzLT53aW5lRDNEUGFsZXR0ZSk7CiAgICAgICAgaWYoVGhpcy0+aWZhY2VUb1JlbGVhc2UpCiAgICAgICAgewogICAgICAgICAgICBJVW5rbm93bl9SZWxlYXNlKFRoaXMtPmlmYWNlVG9SZWxlYXNlKTsKICAgICAgICB9CiAgICAgICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oJmRkcmF3X2NzKTsKICAgICAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBUaGlzKTsKICAgIH0KCiAgICByZXR1cm4gcmVmOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdERyYXdQYWxldHRlOjpJbml0aWFsaXplCiAqCiAqIEluaXRpYWxpemVzIHRoZSBwYWxldHRlLiBBcyB3ZSBzdGFydCBpbml0aWFsaXplZCwgcmV0dXJuCiAqIERERVJSX0FMUkVBRFlJTklUSUFMSVpFRAogKgogKiBQYXJhbXM6CiAqICBERDogRGlyZWN0RHJhdyBpbnRlcmZhY2UgdGhpcyBwYWxldHRlIGlzIGFzc2lnbmVkIHRvCiAqICBGbGFnczogU29tZSBmbGFncywgYXMgdXN1YWwKICogIENvbG9yVGFibGU6IFRoZSBzdGFydHVwIGNvbG9yIHRhYmxlCiAqCiAqIFJldHVybnM6CiAqICBEREVSUl9BTFJFQURZSU5JVElBTElaRUQKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKSURpcmVjdERyYXdQYWxldHRlSW1wbF9Jbml0aWFsaXplKElEaXJlY3REcmF3UGFsZXR0ZSAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRGlyZWN0RHJhdyAqREQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBGbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBTEVUVEVFTlRSWSAqQ29sb3JUYWJsZSkKewogICAgVFJBQ0UoIiglcCktPiglcCwleCwlcClcbiIsIGlmYWNlLCBERCwgRmxhZ3MsIENvbG9yVGFibGUpOwogICAgcmV0dXJuIERERVJSX0FMUkVBRFlJTklUSUFMSVpFRDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3REcmF3UGFsZXR0ZTo6R2V0Q2FwcwogKgogKiBSZXR1cm5zIHRoZSBwYWxldHRlIGRlc2NyaXB0aW9uCiAqCiAqIFBhcmFtczoKICogIENhcHM6IEFkZHJlc3MgdG8gc3RvcmUgdGhlIGNhcHMgYXQKICoKICogUmV0dXJuczoKICogIEQzRF9PSyBvbiBzdWNjZXNzCiAqICBEREVSUl9JTlZBTElEUEFSQU1TIGlmIENhcHMgaXMgTlVMTAogKiAgRm9yIG1vcmUgZGV0YWlscywgc2VlIElXaW5lRDNEUGFsZXR0ZTo6R2V0Q2FwcwogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpJRGlyZWN0RHJhd1BhbGV0dGVJbXBsX0dldENhcHMoSURpcmVjdERyYXdQYWxldHRlICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEICpDYXBzKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd1BhbGV0dGVJbXBsLCBJRGlyZWN0RHJhd1BhbGV0dGUsIGlmYWNlKTsKICAgIEhSRVNVTFQgaHI7CiAgICBUUkFDRSgiKCVwKS0+KCVwKTogUmVsYXlcbiIsIFRoaXMsIENhcHMpOwoKICAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCZkZHJhd19jcyk7CiAgICBociA9IElXaW5lRDNEUGFsZXR0ZV9HZXRDYXBzKFRoaXMtPndpbmVEM0RQYWxldHRlLCBDYXBzKTsKICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCZkZHJhd19jcyk7CiAgICByZXR1cm4gaHI7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0RHJhd1BhbGV0dGU6OlNldEVudHJpZXMKICoKICogU2V0cyB0aGUgcGFsZXR0ZSBlbnRyaWVzIGZyb20gYSBQQUxFVFRFRU5UUlkgc3RydWN0dXJlLiBXaW5lRDNEIHRha2VzCiAqIGNhcmUgZm9yIHVwZGF0aW5nIHRoZSBzdXJmYWNlLgogKgogKiBQYXJhbXM6CiAqICBGbGFnczogRmxhZ3MsIGFzIHVzdWFsCiAqICBTdGFydDogRmlyc3QgcGFsZXR0ZSBlbnRyeSB0byBzZXQKICogIENvdW50OiBOdW1iZXIgb2YgZW50cmllcyB0byBzZXQKICogIFBhbEVudDogU291cmNlIGVudHJpZXMKICoKICogUmV0dXJuczoKICogIEQzRF9PSyBvbiBzdWNjZXNzCiAqICBEREVSUl9JTlZBTElEUEFSQU1TIGlmIFBhbEVudCBpcyBOVUxMCiAqICBGb3IgZGV0YWlscywgc2VlIElXaW5lRDNERGV2aWNlOjpTZXRFbnRyaWVzCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJCklEaXJlY3REcmF3UGFsZXR0ZUltcGxfU2V0RW50cmllcyhJRGlyZWN0RHJhd1BhbGV0dGUgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgRmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBTdGFydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIENvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFMRVRURUVOVFJZICpQYWxFbnQpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3UGFsZXR0ZUltcGwsIElEaXJlY3REcmF3UGFsZXR0ZSwgaWZhY2UpOwogICAgSFJFU1VMVCBocjsKICAgIFRSQUNFKCIoJXApLT4oJXgsJWQsJWQsJXApOiBSZWxheVxuIiwgVGhpcywgRmxhZ3MsIFN0YXJ0LCBDb3VudCwgUGFsRW50KTsKCiAgICBpZighUGFsRW50KQogICAgICAgIHJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOwoKICAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCZkZHJhd19jcyk7CiAgICBociA9IElXaW5lRDNEUGFsZXR0ZV9TZXRFbnRyaWVzKFRoaXMtPndpbmVEM0RQYWxldHRlLCBGbGFncywgU3RhcnQsIENvdW50LCBQYWxFbnQpOwogICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oJmRkcmF3X2NzKTsKICAgIHJldHVybiBocjsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3REcmF3UGFsZXR0ZTo6R2V0RW50cmllcwogKgogKiBSZXR1cm5zIHRoZSBlbnRyaWVzIHN0b3JlZCBpbiB0aGlzIGludGVyZmFjZS4KICoKICogUGFyYW1zOgogKiAgRmxhZ3M6IEZsYWdzIDopCiAqICBTdGFydDogRmlyc3QgZW50cnkgdG8gcmV0dXJuCiAqICBDb3VudDogVGhlIG51bWJlciBvZiBlbnRyaWVzIHRvIHJldHVybgogKiAgUGFsRW50OiBQQUxFVFRFRU5UUlkgc3RydWN0dXJlIHRvIHdyaXRlIHRoZSBlbnRyaWVzIHRvCiAqCiAqIFJldHVybnM6CiAqICBEM0RfT0sgb24gc3VjY2VzcwogKiAgRERFUlJfSU5WQUxJRFBBUkFNUyBpZiBQYWxFbnQgaXMgTlVMTAogKiAgRm9yIGRldGFpbHMsIHNlZSBJV2luZUQzRERldmljZTo6U2V0RW50cmllcwogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpJRGlyZWN0RHJhd1BhbGV0dGVJbXBsX0dldEVudHJpZXMoSURpcmVjdERyYXdQYWxldHRlICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIEZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgU3RhcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBTEVUVEVFTlRSWSAqUGFsRW50KQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd1BhbGV0dGVJbXBsLCBJRGlyZWN0RHJhd1BhbGV0dGUsIGlmYWNlKTsKICAgIEhSRVNVTFQgaHI7CiAgICBUUkFDRSgiKCVwKS0+KCV4LCVkLCVkLCVwKTogUmVsYXlcbiIsIFRoaXMsIEZsYWdzLCBTdGFydCwgQ291bnQsIFBhbEVudCk7CgogICAgaWYoIVBhbEVudCkKICAgICAgICByZXR1cm4gRERFUlJfSU5WQUxJRFBBUkFNUzsKCiAgICBFbnRlckNyaXRpY2FsU2VjdGlvbigmZGRyYXdfY3MpOwogICAgaHIgPSBJV2luZUQzRFBhbGV0dGVfR2V0RW50cmllcyhUaGlzLT53aW5lRDNEUGFsZXR0ZSwgRmxhZ3MsIFN0YXJ0LCBDb3VudCwgUGFsRW50KTsKICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCZkZHJhd19jcyk7CiAgICByZXR1cm4gaHI7Cn0KCmNvbnN0IElEaXJlY3REcmF3UGFsZXR0ZVZ0YmwgSURpcmVjdERyYXdQYWxldHRlX1Z0YmwgPQp7CiAgICAvKioqIElVbmtub3duICoqKi8KICAgIElEaXJlY3REcmF3UGFsZXR0ZUltcGxfUXVlcnlJbnRlcmZhY2UsCiAgICBJRGlyZWN0RHJhd1BhbGV0dGVJbXBsX0FkZFJlZiwKICAgIElEaXJlY3REcmF3UGFsZXR0ZUltcGxfUmVsZWFzZSwKICAgIC8qKiogSURpcmVjdERyYXdQYWxldHRlICoqKi8KICAgIElEaXJlY3REcmF3UGFsZXR0ZUltcGxfR2V0Q2FwcywKICAgIElEaXJlY3REcmF3UGFsZXR0ZUltcGxfR2V0RW50cmllcywKICAgIElEaXJlY3REcmF3UGFsZXR0ZUltcGxfSW5pdGlhbGl6ZSwKICAgIElEaXJlY3REcmF3UGFsZXR0ZUltcGxfU2V0RW50cmllcwp9Owo=