LyoqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBAZmlsZSAgICBzdG0zMmY3eHhfaGFsX2NyeXAuYwogICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KICAqIEBicmllZiAgIENSWVAgSEFMIG1vZHVsZSBkcml2ZXIuCiAgKiAgICAgICAgICBUaGlzIGZpbGUgcHJvdmlkZXMgZmlybXdhcmUgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aGUgZm9sbG93aW5nIAogICogICAgICAgICAgZnVuY3Rpb25hbGl0aWVzIG9mIHRoZSBDcnlwdG9ncmFwaHkgKENSWVApIHBlcmlwaGVyYWw6CiAgKiAgICAgICAgICAgKyBJbml0aWFsaXphdGlvbiwgZGUtaW5pdGlhbGl6YXRpb24sIHNldCBjb25maWcgYW5kIGdldCBjb25maWcgIGZ1bmN0aW9ucwogICogICAgICAgICAgICsgREVTL1RERVMsIEFFUyBwcm9jZXNzaW5nIGZ1bmN0aW9ucwogICogICAgICAgICAgICsgRE1BIGNhbGxiYWNrIGZ1bmN0aW9ucwogICogICAgICAgICAgICsgQ1JZUCBJUlEgaGFuZGxlciBtYW5hZ2VtZW50CiAgKiAgICAgICAgICAgKyBQZXJpcGhlcmFsIFN0YXRlIGZ1bmN0aW9ucwogICoKICBAdmVyYmF0aW0KICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSG93IHRvIHVzZSB0aGlzIGRyaXZlciAjIyMjIwogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgWy4uXQogICAgICBUaGUgQ1JZUCBIQUwgZHJpdmVyIGNhbiBiZSB1c2VkIGluIENSWVAgb3IgVGlueUFFUyBJUCBhcyBmb2xsb3dzOgoKICAgICAgKCMpSW5pdGlhbGl6ZSB0aGUgQ1JZUCBsb3cgbGV2ZWwgcmVzb3VyY2VzIGJ5IGltcGxlbWVudGluZyB0aGUgSEFMX0NSWVBfTXNwSW5pdCgpOgogICAgICAgICAoIyMpIEVuYWJsZSB0aGUgQ1JZUCBpbnRlcmZhY2UgY2xvY2sgdXNpbmcgX19IQUxfUkNDX0NSWVBfQ0xLX0VOQUJMRSgpb3IgX19IQUxfUkNDX0FFU19DTEtfRU5BQkxFIGZvciBUaW55QUVTIElQCiAgICAgICAgICgjIykgSW4gY2FzZSBvZiB1c2luZyBpbnRlcnJ1cHRzIChlLmcuIEhBTF9DUllQX0VuY3J5cHRfSVQoKSkKICAgICAgICAgICAgICgrKyspIENvbmZpZ3VyZSB0aGUgQ1JZUCBpbnRlcnJ1cHQgcHJpb3JpdHkgdXNpbmcgSEFMX05WSUNfU2V0UHJpb3JpdHkoKQogICAgICAgICAgICAgKCsrKykgRW5hYmxlIHRoZSBDUllQIElSUSBoYW5kbGVyIHVzaW5nIEhBTF9OVklDX0VuYWJsZUlSUSgpCiAgICAgICAgICAgICAoKysrKSBJbiBDUllQIElSUSBoYW5kbGVyLCBjYWxsIEhBTF9DUllQX0lSUUhhbmRsZXIoKQogICAgICAgICAoIyMpIEluIGNhc2Ugb2YgdXNpbmcgRE1BIHRvIGNvbnRyb2wgZGF0YSB0cmFuc2ZlciAoZS5nLiBIQUxfQ1JZUF9FbmNyeXB0X0RNQSgpKQogICAgICAgICAgICAgKCsrKykgRW5hYmxlIHRoZSBETUF4IGludGVyZmFjZSBjbG9jayB1c2luZyBfX1JDQ19ETUF4X0NMS19FTkFCTEUoKQogICAgICAgICAgICAgKCsrKykgQ29uZmlndXJlIGFuZCBlbmFibGUgdHdvIERNQSBzdHJlYW1zIG9uZSBmb3IgbWFuYWdpbmcgZGF0YSB0cmFuc2ZlciBmcm9tCiAgICAgICAgICAgICAgICAgbWVtb3J5IHRvIHBlcmlwaGVyYWwgKGlucHV0IHN0cmVhbSkgYW5kIGFub3RoZXIgc3RyZWFtIGZvciBtYW5hZ2luZyBkYXRhCiAgICAgICAgICAgICAgICAgdHJhbnNmZXIgZnJvbSBwZXJpcGhlcmFsIHRvIG1lbW9yeSAob3V0cHV0IHN0cmVhbSkKICAgICAgICAgICAgICgrKyspIEFzc29jaWF0ZSB0aGUgaW5pdGlhbGl6ZWQgRE1BIGhhbmRsZSB0byB0aGUgQ1JZUCBETUEgaGFuZGxlCiAgICAgICAgICAgICAgICAgdXNpbmcgIF9fSEFMX0xJTktETUEoKQogICAgICAgICAgICAgKCsrKykgQ29uZmlndXJlIHRoZSBwcmlvcml0eSBhbmQgZW5hYmxlIHRoZSBOVklDIGZvciB0aGUgdHJhbnNmZXIgY29tcGxldGUKICAgICAgICAgICAgICAgICBpbnRlcnJ1cHQgb24gdGhlIHR3byBETUEgU3RyZWFtcy4gVGhlIG91dHB1dCBzdHJlYW0gc2hvdWxkIGhhdmUgaGlnaGVyCiAgICAgICAgICAgICAgICAgcHJpb3JpdHkgdGhhbiB0aGUgaW5wdXQgc3RyZWFtIEhBTF9OVklDX1NldFByaW9yaXR5KCkgYW5kIEhBTF9OVklDX0VuYWJsZUlSUSgpCgogICAgICAoIylJbml0aWFsaXplIHRoZSBDUllQIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMgOgogICAgICAgICAoIyMpIFRoZSBkYXRhIHR5cGU6IDEtYml0LCA4LWJpdCwgMTYtYml0IG9yIDMyLWJpdC4KICAgICAgICAgKCMjKSBUaGUga2V5IHNpemU6IDEyOCwgMTkyIG9yIDI1Ni4KICAgICAgICAgKCMjKSBUaGUgQWxnb01vZGUgREVTLyBUREVTIEFsZ29yaXRobSBFQ0IvQ0JDIG9yIEFFUyBBbGdvcml0aG0gRUNCL0NCQy9DVFIvR0NNIG9yIENDTS4KICAgICAgICAgKCMjKSBUaGUgaW5pdGlhbGl6YXRpb24gdmVjdG9yIChjb3VudGVyKS4gSXQgaXMgbm90IHVzZWQgaW4gRUNCIG1vZGUuCiAgICAgICAgICgjIykgVGhlIGtleSBidWZmZXIgdXNlZCBmb3IgZW5jcnlwdGlvbi9kZWNyeXB0aW9uLgogICAgICAgICAoIyMpIFRoZSBIZWFkZXIgdXNlZCBvbmx5IGluIEFFUyBHQ00gYW5kIENDTSBBbGdvcml0aG0gZm9yIGF1dGhlbnRpY2F0aW9uLgogICAgICAgICAoIyMpIFRoZSBIZWFkZXJTaXplIFRoZSBzaXplIG9mIGhlYWRlciBidWZmZXIgaW4gd29yZC4KICAgICAgICAgKCMjKSBUaGUgQjAgYmxvY2sgaXMgdGhlIGZpcnN0IGF1dGhlbnRpY2F0aW9uIGJsb2NrIHVzZWQgb25seSAgaW4gQUVTIENDTSBtb2RlLgoKICAgICAgKCMpVGhyZWUgcHJvY2Vzc2luZyAoZW5jcnlwdGlvbi9kZWNyeXB0aW9uKSBmdW5jdGlvbnMgYXJlIGF2YWlsYWJsZToKICAgICAgICAgKCMjKSBQb2xsaW5nIG1vZGU6IGVuY3J5cHRpb24gYW5kIGRlY3J5cHRpb24gQVBJcyBhcmUgYmxvY2tpbmcgZnVuY3Rpb25zCiAgICAgICAgICAgICAgaS5lLiB0aGV5IHByb2Nlc3MgdGhlIGRhdGEgYW5kIHdhaXQgdGlsbCB0aGUgcHJvY2Vzc2luZyBpcyBmaW5pc2hlZCwKICAgICAgICAgICAgICBlLmcuIEhBTF9DUllQX0VuY3J5cHQgJiBIQUxfQ1JZUF9EZWNyeXB0CiAgICAgICAgICgjIykgSW50ZXJydXB0IG1vZGU6IGVuY3J5cHRpb24gYW5kIGRlY3J5cHRpb24gQVBJcyBhcmUgbm90IGJsb2NraW5nIGZ1bmN0aW9ucwogICAgICAgICAgICAgIGkuZS4gdGhleSBwcm9jZXNzIHRoZSBkYXRhIHVuZGVyIGludGVycnVwdCwKICAgICAgICAgICAgICBlLmcuIEhBTF9DUllQX0VuY3J5cHRfSVQgJiBIQUxfQ1JZUF9EZWNyeXB0X0lUCiAgICAgICAgICgjIykgRE1BIG1vZGU6IGVuY3J5cHRpb24gYW5kIGRlY3J5cHRpb24gQVBJcyBhcmUgbm90IGJsb2NraW5nIGZ1bmN0aW9ucwogICAgICAgICAgICAgIGkuZS4gdGhlIGRhdGEgdHJhbnNmZXIgaXMgZW5zdXJlZCBieSBETUEsCiAgICAgICAgICAgICAgZS5nLiBIQUxfQ1JZUF9FbmNyeXB0X0RNQSAmIEhBTF9DUllQX0RlY3J5cHRfRE1BCgogICAgICAoIylXaGVuIHRoZSBwcm9jZXNzaW5nIGZ1bmN0aW9uIGlzIGNhbGxlZCBhdCBmaXJzdCB0aW1lIGFmdGVyIEhBTF9DUllQX0luaXQoKQogICAgICAgICB0aGUgQ1JZUCBwZXJpcGhlcmFsIGlzIGNvbmZpZ3VyZWQgYW5kIHByb2Nlc3NlcyB0aGUgYnVmZmVyIGluIGlucHV0LgogICAgICAgICBBdCBzZWNvbmQgY2FsbCwgbm8gbmVlZCB0byBJbml0aWFsaXplIHRoZSBDUllQLCB1c2VyIGhhdmUgdG8gZ2V0IGN1cnJlbnQgY29uZmlndXJhdGlvbiB2aWEKICAgICAgICAgSEFMX0NSWVBfR2V0Q29uZmlnKCkgQVBJLCB0aGVuIG9ubHkgIEhBTF9DUllQX1NldENvbmZpZygpIGlzIHJlcXVlc3RlZCB0byBzZXQKICAgICAgICAgbmV3IHBhcmFtZXRyZXMsIGZpbmFsbHkgdXNlciBjYW4gIHN0YXJ0IGVuY3J5cHRpb24vZGVjcnlwdGlvbi4KCiAgICAgICAoIylDYWxsIEhBTF9DUllQX0RlSW5pdCgpIHRvIGRlaW5pdGlhbGl6ZSB0aGUgQ1JZUCBwZXJpcGhlcmFsLgoKICAgIFsuLl0KICAgICAgVGhlIGNyeXB0b2dyYXBoaWMgcHJvY2Vzc29yIHN1cHBvcnRzIGZvbGxvd2luZyBzdGFuZGFyZHM6CiAgICAgICgjKSBUaGUgZGF0YSBlbmNyeXB0aW9uIHN0YW5kYXJkIChERVMpIGFuZCBUcmlwbGUtREVTIChUREVTKSBzdXBwb3J0ZWQgb25seSBieSBDUllQMSBJUDoKICAgICAgICAgKCMjKTY0LWJpdCBkYXRhIGJsb2NrIHByb2Nlc3NpbmcKICAgICAgICAgKCMjKSBjaGFpbmluZyBtb2RlcyBzdXBwb3J0ZWQgOgogICAgICAgICAgICAgKCsrKykgIEVsZWN0cm9uaWMgQ29kZSBCb29rKEVDQikKICAgICAgICAgICAgICgrKyspICBDaXBoZXIgQmxvY2sgQ2hhaW5pbmcgKENCQykKICAgICAgICAgKCMjKSBrZXlzIGxlbmd0aCBzdXBwb3J0ZWQgOjY0LWJpdCwgMTI4LWJpdCBhbmQgMTkyLWJpdC4KICAgICAgKCMpIFRoZSBhZHZhbmNlZCBlbmNyeXB0aW9uIHN0YW5kYXJkIChBRVMpIHN1cHBvcnRlZCAgYnkgQ1JZUDEgJiBUaW55QUVTIElQOgogICAgICAgICAoIyMpMTI4LWJpdCBkYXRhIGJsb2NrIHByb2Nlc3NpbmcKICAgICAgICAgKCMjKSBjaGFpbmluZyBtb2RlcyBzdXBwb3J0ZWQgOgogICAgICAgICAgICAgKCsrKykgIEVsZWN0cm9uaWMgQ29kZSBCb29rKEVDQikKICAgICAgICAgICAgICgrKyspICBDaXBoZXIgQmxvY2sgQ2hhaW5pbmcgKENCQykKICAgICAgICAgICAgICgrKyspICBDb3VudGVyIG1vZGUgKENUUikKICAgICAgICAgICAgICgrKyspICBHYWxvaXMvY291bnRlciBtb2RlIChHQ00vR01BQykKICAgICAgICAgICAgICgrKyspICBDb3VudGVyIHdpdGggQ2lwaGVyIEJsb2NrIENoYWluaW5nLU1lc3NhZ2UoQ0NNKQogICAgICAgICAoIyMpIGtleXMgbGVuZ3RoIFN1cHBvcnRlZCA6CiAgICAgICAgICAgICAoKysrKSBmb3IgQ1JZUDEgSVA6IDEyOC1iaXQsIDE5Mi1iaXQgYW5kIDI1Ni1iaXQuCiAgICAgICAgICAgICAoKysrKSBmb3IgVGlueUFFUyBJUDogIDEyOC1iaXQgYW5kIDI1Ni1iaXQKCiAgICBbLi5dICBUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIHRoZSBBRVMgR2Fsb2lzL2NvdW50ZXIgbW9kZSAoR0NNKSBzdXBwb3J0ZWQgYnkgYm90aCBDUllQMSBJUDoKICAgICAgKCMpICBBbGdvcml0aG0gc3VwcG9ydGVkIDoKICAgICAgICAgKCMjKSBHYWxvaXMvY291bnRlciBtb2RlIChHQ00pCiAgICAgICAgICgjIykgR2Fsb2lzIG1lc3NhZ2UgYXV0aGVudGljYXRpb24gY29kZSAoR01BQykgOmlzIGV4YWN0bHkgdGhlIHNhbWUgYXMKICAgICAgICAgICAgICBHQ00gYWxnb3JpdGhtIGNvbXBvc2VkIG9ubHkgYnkgYW4gaGVhZGVyLgogICAgICAoIykgIEZvdXIgcGhhc2VzIGFyZSBwZXJmb3JtZWQgaW4gR0NNIDoKICAgICAgICAgKCMjKSBJbml0IHBoYXNlOiBJUCBwcmVwYXJlcyB0aGUgR0NNIGhhc2ggc3Via2V5IChIKSBhbmQgZG8gdGhlIElWIHByb2Nlc3NpbmcKICAgICAgICAgKCMjKSBIZWFkZXIgcGhhc2U6IElQIHByb2Nlc3NlcyB0aGUgQWRkaXRpb25hbCBBdXRoZW50aWNhdGVkIERhdGEgKEFBRCksIHdpdGggaGFzaAogICAgICAgICAgY29tcHV0YXRpb24gb25seS4KICAgICAgICAgKCMjKSBQYXlsb2FkIHBoYXNlOiBJUCBwcm9jZXNzZXMgdGhlIHBsYWludGV4dCAoUCkgd2l0aCBoYXNoIGNvbXB1dGF0aW9uICsga2V5c3RyZWFtCiAgICAgICAgICBlbmNyeXB0aW9uICsgZGF0YSBYT1JpbmcuIEl0IHdvcmtzIGluIGEgc2ltaWxhciB3YXkgZm9yIGNpcGhlcnRleHQgKEMpLgogICAgICAgICAoIyMpIEZpbmFsIHBoYXNlOiBJUCBnZW5lcmF0ZXMgdGhlIGF1dGhlbnRpY2F0ZWQgdGFnIChUKSB1c2luZyB0aGUgbGFzdCBibG9jayBvZiBkYXRhLgogICAgICAoIykgIHN0cnVjdHVyZSBvZiBtZXNzYWdlIGNvbnN0cnVjdGlvbiBpbiBHQ00gaXMgZGVmaW5lZCBhcyBiZWxvdyAgOgogICAgICAgICAoIyMpIDE2IGJ5dGVzIEluaXRpYWwgQ291bnRlciBCbG9jayAoSUNCKWNvbXBvc2VkIG9mIElWIGFuZCBjb3VudGVyCiAgICAgICAgICgjIykgVGhlIGF1dGhlbnRpY2F0ZWQgaGVhZGVyIEEgKGFsc28ga25vd3MgYXMgQWRkaXRpb25hbCBBdXRoZW50aWNhdGlvbiBEYXRhIEFBRCkKICAgICAgICAgIHRoaXMgcGFydCBvZiB0aGUgbWVzc2FnZSBpcyBvbmx5IGF1dGhlbnRpY2F0ZWQsIG5vdCBlbmNyeXB0ZWQuCiAgICAgICAgICgjIykgVGhlIHBsYWludGV4dCBtZXNzYWdlIFAgaXMgYm90aCBhdXRoZW50aWNhdGVkIGFuZCBlbmNyeXB0ZWQgYXMgY2lwaGVydGV4dC4KICAgICAgICAgIEdDTSBzdGFuZGFyZCBzcGVjaWZpZXMgdGhhdCBjaXBoZXJ0ZXh0IGhhcyBzYW1lIGJpdCBsZW5ndGggYXMgdGhlIHBsYWludGV4dC4KICAgICAgICAgKCMjKSBUaGUgbGFzdCBibG9jayBpcyBjb21wb3NlZCBvZiB0aGUgbGVuZ3RoIG9mIEEgKG9uIDY0IGJpdHMpIGFuZCB0aGUgbGVuZ3RoIG9mIGNpcGhlcnRleHQKICAgICAgICAgIChvbiA2NCBiaXRzKQoKICAgIFsuLl0gIFRoaXMgc2VjdGlvbiBkZXNjcmliZSBUaGUgQUVTIENvdW50ZXIgd2l0aCBDaXBoZXIgQmxvY2sgQ2hhaW5pbmctTWVzc2FnZQogICAgICAgICAgQXV0aGVudGljYXRpb24gQ29kZSAoQ0NNKSBzdXBwb3J0ZWQgYnkgYm90aCBDUllQMSBJUDoKICAgICAgKCMpICBTcGVjaWZpYyBwYXJhbWV0ZXJzIGZvciBDQ00gIDoKCiAgICAgICAgICgjIykgQjAgYmxvY2sgIDogQWNjb3JkaW5nIHRvIE5JU1QgU3BlY2lhbCBQdWJsaWNhdGlvbiA4MDAtMzhDLAogICAgICAgICAgICBUaGUgZmlyc3QgYmxvY2sgQjAgaXMgZm9ybWF0dGVkIGFzIGZvbGxvd3MsIHdoZXJlIGwobSkgaXMgZW5jb2RlZCBpbgogICAgICAgICAgICBtb3N0LXNpZ25pZmljYW50LWJ5dGUgZmlyc3Qgb3JkZXIoc2VlIGJlbG93IHRhYmxlIDMpCgogICAgICAgICAgICAgICgrKyspICBROiBhIGJpdCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIG9jdGV0IGxlbmd0aCBvZiBQIChwbGFpbnRleHQpCiAgICAgICAgICAgICAgKCsrKykgIHEgVGhlIG9jdGV0IGxlbmd0aCBvZiB0aGUgYmluYXJ5IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBvY3RldCBsZW5ndGggb2YgdGhlIHBheWxvYWQKICAgICAgICAgICAgICAoKysrKSAgQSBub25jZSAoTiksIG4gVGhlIG9jdGV0IGxlbmd0aCBvZiB0aGUgd2hlcmUgbitxPTE1LgogICAgICAgICAgICAgICgrKyspICBGbGFnczogbW9zdCBzaWduaWZpY2FudCBvY3RldCBjb250YWluaW5nIGZvdXIgZmxhZ3MgZm9yIGNvbnRyb2wgaW5mb3JtYXRpb24sCiAgICAgICAgICAgICAgKCsrKykgIHQgVGhlIG9jdGV0IGxlbmd0aCBvZiB0aGUgTUFDLgogICAgICAgICAoIyMpIEIxIGJsb2NrIChoZWFkZXIpIDogYXNzb2NpYXRlZCBkYXRhIGxlbmd0aChhKSBjb25jYXRlbmF0ZWQgd2l0aCBBc3NvY2lhdGVkIERhdGEgKEEpCiAgICAgICAgICAgICAgdGhlIGFzc29jaWF0ZWQgZGF0YSBsZW5ndGggZXhwcmVzc2VkIGluIGJ5dGVzIChhKSBkZWZpbmVkIGFzIGJlbG93OgogICAgICAgICAgICAoKysrKSAgSWYgMCA8IGEgPCAyMTYtMjgsIHRoZW4gaXQgaXMgZW5jb2RlZCBhcyBbYV0xNiwgaS5lLiB0d28gb2N0ZXRzCiAgICAgICAgICAgICgrKyspICBJZiAyMTYtMjggPCBhIDwgMjMyLCB0aGVuIGl0IGlzIGVuY29kZWQgYXMgMHhmZiB8fCAweGZlIHx8IFthXTMyLCBpLmUuIHNpeCBvY3RldHMKICAgICAgICAgICAgKCsrKykgIElmIDIzMiA8IGEgPCAyNjQsIHRoZW4gaXQgaXMgZW5jb2RlZCBhcyAweGZmIHx8IDB4ZmYgfHwgW2FdNjQsIGkuZS4gdGVuIG9jdGV0cwogICAgICAgICAoIyMpIENUUnggYmxvY2sgIDogY29udHJvbCBibG9ja3MKICAgICAgICAgICAgKCsrKykgR2VuZXJhdGlvbiBvZiBDVFIxIGZyb20gZmlyc3QgYmxvY2sgQjAgaW5mb3JtYXRpb24gOgogICAgICAgICAgICAgIGVxdWFsIHRvIEIwIHdpdGggZmlyc3QgNSBiaXRzIHplcm9lZCBhbmQgbW9zdCBzaWduaWZpY2FudCBiaXRzIHN0b3Jpbmcgb2N0ZXQKICAgICAgICAgICAgICBsZW5ndGggb2YgUCBhbHNvIHplcm9lZCwgdGhlbiBpbmNyZW1lbnRlZCBieSBvbmUgKCBzZWUgYmVsb3cgVGFibGUgNCkKICAgICAgICAgICAgKCsrKykgR2VuZXJhdGlvbiBvZiBDVFIwOiBzYW1lIGFzIENUUjEgd2l0aCBiaXRbMF0gc2V0IHRvIHplcm8uCgogICAgICAoIykgIEZvdXIgcGhhc2VzIGFyZSBwZXJmb3JtZWQgaW4gQ0NNIGZvciBDUllQMSBJUDoKICAgICAgICAgKCMjKSBJbml0IHBoYXNlOiBJUCBwcmVwYXJlcyB0aGUgR0NNIGhhc2ggc3Via2V5IChIKSBhbmQgZG8gdGhlIElWIHByb2Nlc3NpbmcKICAgICAgICAgKCMjKSBIZWFkZXIgcGhhc2U6IElQIHByb2Nlc3NlcyB0aGUgQWRkaXRpb25hbCBBdXRoZW50aWNhdGVkIERhdGEgKEFBRCksIHdpdGggaGFzaAogICAgICAgICAgY29tcHV0YXRpb24gb25seS4KICAgICAgICAgKCMjKSBQYXlsb2FkIHBoYXNlOiBJUCBwcm9jZXNzZXMgdGhlIHBsYWludGV4dCAoUCkgd2l0aCBoYXNoIGNvbXB1dGF0aW9uICsga2V5c3RyZWFtCiAgICAgICAgICBlbmNyeXB0aW9uICsgZGF0YSBYT1JpbmcuIEl0IHdvcmtzIGluIGEgc2ltaWxhciB3YXkgZm9yIGNpcGhlcnRleHQgKEMpLgogICAgICAgICAoIyMpIEZpbmFsIHBoYXNlOiBJUCBnZW5lcmF0ZXMgdGhlIGF1dGhlbnRpY2F0ZWQgdGFnIChUKSB1c2luZyB0aGUgbGFzdCBibG9jayBvZiBkYXRhLgoKICAqKiogQ2FsbGJhY2sgcmVnaXN0cmF0aW9uICoqKgogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBUaGUgY29tcGlsYXRpb24gZGVmaW5lICBVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTIHdoZW4gc2V0IHRvIDEKICBhbGxvd3MgdGhlIHVzZXIgdG8gY29uZmlndXJlIGR5bmFtaWNhbGx5IHRoZSBkcml2ZXIgY2FsbGJhY2tzLgogIFVzZSBGdW5jdGlvbnMgQHJlZiBIQUxfQ1JZUF9SZWdpc3RlckNhbGxiYWNrKCkgb3IgSEFMX0NSWVBfUmVnaXN0ZXJYWFhDYWxsYmFjaygpCiAgdG8gcmVnaXN0ZXIgYW4gaW50ZXJydXB0IGNhbGxiYWNrLgoKICBGdW5jdGlvbiBAcmVmIEhBTF9DUllQX1JlZ2lzdGVyQ2FsbGJhY2soKSBhbGxvd3MgdG8gcmVnaXN0ZXIgZm9sbG93aW5nIGNhbGxiYWNrczoKICAgICgrKSBJbkNwbHRDYWxsYmFjayAgICAgOiAgSW5wdXQgRklGTyB0cmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2suCiAgICAoKykgT3V0Q3BsdENhbGxiYWNrICAgIDogT3V0cHV0IEZJRk8gdHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrLgogICAgKCspIEVycm9yQ2FsbGJhY2sgICAgICA6IGNhbGxiYWNrIGZvciBlcnJvciBkZXRlY3Rpb24uCiAgICAoKykgTXNwSW5pdENhbGxiYWNrICAgIDogQ1JZUCBNc3BJbml0LgogICAgKCspIE1zcERlSW5pdENhbGxiYWNrICA6IENSWVAgTXNwRGVJbml0LgogIFRoaXMgZnVuY3Rpb24gdGFrZXMgYXMgcGFyYW1ldGVycyB0aGUgSEFMIHBlcmlwaGVyYWwgaGFuZGxlLCB0aGUgQ2FsbGJhY2sgSUQKICBhbmQgYSBwb2ludGVyIHRvIHRoZSB1c2VyIGNhbGxiYWNrIGZ1bmN0aW9uLgoKICBVc2UgZnVuY3Rpb24gQHJlZiBIQUxfQ1JZUF9VblJlZ2lzdGVyQ2FsbGJhY2soKSB0byByZXNldCBhIGNhbGxiYWNrIHRvIHRoZSBkZWZhdWx0CiAgd2VhayBmdW5jdGlvbi4KICBAcmVmIEhBTF9DUllQX1VuUmVnaXN0ZXJDYWxsYmFjaygpIHRha2VzIGFzIHBhcmFtZXRlcnMgdGhlIEhBTCBwZXJpcGhlcmFsIGhhbmRsZSwKICBhbmQgdGhlIENhbGxiYWNrIElELgogIFRoaXMgZnVuY3Rpb24gYWxsb3dzIHRvIHJlc2V0IGZvbGxvd2luZyBjYWxsYmFja3M6CiAgICAoKykgSW5DcGx0Q2FsbGJhY2sgICAgIDogIElucHV0IEZJRk8gdHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrLgogICAgKCspIE91dENwbHRDYWxsYmFjayAgICA6IE91dHB1dCBGSUZPIHRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjay4KICAgICgrKSBFcnJvckNhbGxiYWNrICAgICAgOiBjYWxsYmFjayBmb3IgZXJyb3IgZGV0ZWN0aW9uLgogICAgKCspIE1zcEluaXRDYWxsYmFjayAgICA6IENSWVAgTXNwSW5pdC4KICAgICgrKSBNc3BEZUluaXRDYWxsYmFjayAgOiBDUllQIE1zcERlSW5pdC4KCiAgQnkgZGVmYXVsdCwgYWZ0ZXIgdGhlIEByZWYgSEFMX0NSWVBfSW5pdCgpIGFuZCB3aGVuIHRoZSBzdGF0ZSBpcyBIQUxfQ1JZUF9TVEFURV9SRVNFVAogIGFsbCBjYWxsYmFja3MgYXJlIHNldCB0byB0aGUgY29ycmVzcG9uZGluZyB3ZWFrIGZ1bmN0aW9ucyA6CiAgZXhhbXBsZXMgQHJlZiBIQUxfQ1JZUF9JbkNwbHRDYWxsYmFjaygpICwgQHJlZiBIQUxfQ1JZUF9PdXRDcGx0Q2FsbGJhY2soKS4KICBFeGNlcHRpb24gZG9uZSBmb3IgTXNwSW5pdCBhbmQgTXNwRGVJbml0IGZ1bmN0aW9ucyB0aGF0IGFyZQogIHJlc2V0IHRvIHRoZSBsZWdhY3kgd2VhayBmdW5jdGlvbiBpbiB0aGUgQHJlZiBIQUxfQ1JZUF9Jbml0KCkvIEByZWYgSEFMX0NSWVBfRGVJbml0KCkgb25seSB3aGVuCiAgdGhlc2UgY2FsbGJhY2tzIGFyZSBudWxsIChub3QgcmVnaXN0ZXJlZCBiZWZvcmVoYW5kKS4KICBpZiBub3QsIE1zcEluaXQgb3IgTXNwRGVJbml0IGFyZSBub3QgbnVsbCwgdGhlIEByZWYgSEFMX0NSWVBfSW5pdCgpIC8gQHJlZiBIQUxfQ1JZUF9EZUluaXQoKQogIGtlZXAgYW5kIHVzZSB0aGUgdXNlciBNc3BJbml0L01zcERlSW5pdCBmdW5jdGlvbnMgKHJlZ2lzdGVyZWQgYmVmb3JlaGFuZCkKCiAgQ2FsbGJhY2tzIGNhbiBiZSByZWdpc3RlcmVkL3VucmVnaXN0ZXJlZCBpbiBIQUxfQ1JZUF9TVEFURV9SRUFEWSBzdGF0ZSBvbmx5LgogIEV4Y2VwdGlvbiBkb25lIE1zcEluaXQvTXNwRGVJbml0IGNhbGxiYWNrcyB0aGF0IGNhbiBiZSByZWdpc3RlcmVkL3VucmVnaXN0ZXJlZAogIGluIEhBTF9DUllQX1NUQVRFX1JFQURZIG9yIEhBTF9DUllQX1NUQVRFX1JFU0VUIHN0YXRlLAogIHRodXMgcmVnaXN0ZXJlZCAodXNlcikgTXNwSW5pdC9EZUluaXQgY2FsbGJhY2tzIGNhbiBiZSB1c2VkIGR1cmluZyB0aGUgSW5pdC9EZUluaXQuCiAgSW4gdGhhdCBjYXNlIGZpcnN0IHJlZ2lzdGVyIHRoZSBNc3BJbml0L01zcERlSW5pdCB1c2VyIGNhbGxiYWNrcwogIHVzaW5nIEByZWYgSEFMX0NSWVBfUmVnaXN0ZXJDYWxsYmFjaygpIGJlZm9yZSBjYWxsaW5nIEByZWYgSEFMX0NSWVBfRGVJbml0KCkKICBvciBAcmVmIEhBTF9DUllQX0luaXQoKSBmdW5jdGlvbi4KCiAgV2hlbiBUaGUgY29tcGlsYXRpb24gZGVmaW5lIFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgaXMgc2V0IHRvIDAgb3IKICBub3QgZGVmaW5lZCwgdGhlIGNhbGxiYWNrIHJlZ2lzdHJhdGlvbiBmZWF0dXJlIGlzIG5vdCBhdmFpbGFibGUgYW5kIGFsbCBjYWxsYmFja3MKICBhcmUgc2V0IHRvIHRoZSBjb3JyZXNwb25kaW5nIHdlYWsgZnVuY3Rpb25zLgoKICBUYWJsZSAxLiBJbml0aWFsIENvdW50ZXIgQmxvY2sgKElDQikKICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwogICAgICAgICAgfCAgICAgICBJbml0aWFsaXphdGlvbiB2ZWN0b3IgKElWKSAgICAgIHwgIENvdW50ZXIgICAgICB8CiAgICAgICAgICB8LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLXwKICAgICAgICAgMTI3ICAgICAgICAgICAgICA5NSAgICAgICAgICAgICAgICA2MyAgICAgICAgICAgIDMxICAgICAgIDAKCgogICAgICAgICAgICAgIEJpdCBOdW1iZXIgICAgUmVnaXN0ZXIgICAgICAgICAgIENvbnRlbnRzCiAgICAgICAgICAgICAgLS0tLS0tLS0tLSAgIC0tLS0tLS0tLS0tLS0tLSAgICAgICAtLS0tLS0tLS0tLQogICAgICAgICAgICAgIDEyNyAuLi45NiAgICBDUllQX0lWMVJbMzE6MF0gICAgIElDQlsxMjc6OTZdCiAgICAgICAgICAgICAgOTUgIC4uLjY0ICAgIENSWVBfSVYxTFszMTowXSAgICAgQjBbOTU6NjRdCiAgICAgICAgICAgICAgNjMgLi4uIDMyICAgIENSWVBfSVYwUlszMTowXSAgICAgSUNCWzYzOjMyXQogICAgICAgICAgICAgIDMxIC4uLiAwICAgICBDUllQX0lWMExbMzE6MF0gICAgIElDQlszMTowXSwgd2hlcmUgMzItYml0IGNvdW50ZXI9IDB4MgoKICBUYWJsZSAyLiAgR0NNIGxhc3QgYmxvY2sgZGVmaW5pdGlvbgoKICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwogICAgICAgICAgfCAgQml0WzBdICAgfCAgQml0WzMyXSAgICAgICAgICAgfCAgQml0WzY0XSAgfCBCaXRbOTZdICAgICAgICAgICAgICB8CiAgICAgICAgICB8LS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKICAgICAgICAgIHwgICAweDAgICAgIHwgSGVhZGVyIGxlbmd0aFszMTowXXwgICAgIDB4MCAgIHwgUGF5bG9hZCBsZW5ndGhbMzE6MF0gfAogICAgICAgICAgfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CgogIFRhYmxlIDMuIEIwIGJsb2NrCiAgICAgICAgICAgICAgICBPY3RldCBOdW1iZXIgICBDb250ZW50cwogICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tICAgLS0tLS0tLS0tCiAgICAgICAgICAgICAgICAwICAgICAgICAgICAgICBGbGFncwogICAgICAgICAgICAgICAgMSAuLi4gMTUtcSAgICAgTm9uY2UgTgogICAgICAgICAgICAgICAgMTYtcSAuLi4gMTUgICAgUQoKICAgICAgICAgICAgdGhlIEZsYWdzIGZpZWxkIGlzIGZvcm1hdHRlZCBhcyBmb2xsb3dzOgoKICAgICAgICAgICAgICAgIEJpdCBOdW1iZXIgICBDb250ZW50cwogICAgICAgICAgICAgICAgLS0tLS0tLS0tLSAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgICAgIDcgICAgICAgICAgICBSZXNlcnZlZCAoYWx3YXlzIHplcm8pCiAgICAgICAgICAgICAgICA2ICAgICAgICAgICAgQWRhdGEKICAgICAgICAgICAgICAgIDUgLi4uIDMgICAgICAodC0yKS8yCiAgICAgICAgICAgICAgICAyIC4uLiAwICAgICAgW3EtMV0zCgogVGFibGUgNC4gQ1RSeCBibG9jawogICAgICAgICAgICAgICAgQml0IE51bWJlciAgICBSZWdpc3RlciAgICAgICAgICAgQ29udGVudHMKICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0gICAtLS0tLS0tLS0tLS0tLS0gICAgICAgLS0tLS0tLS0tLS0KICAgICAgICAgICAgICAgIDEyNyAuLi45NiAgICBDUllQX0lWMVJbMzE6MF0gICAgIEIwWzEyNzo5Nl0sIHdoZXJlIFEgbGVuZ3RoIGJpdHMgYXJlIHNldCB0byAwLCBleGNlcHQgZm9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXQgMCB0aGF0IGlzIHNldCB0byAxCiAgICAgICAgICAgICAgICA5NSAgLi4uNjQgICAgQ1JZUF9JVjFMWzMxOjBdICAgICBCMFs5NTo2NF0KICAgICAgICAgICAgICAgIDYzIC4uLiAzMiAgICBDUllQX0lWMFJbMzE6MF0gICAgIEIwWzYzOjMyXQogICAgICAgICAgICAgICAgMzEgLi4uIDAgICAgIENSWVBfSVYwTFszMTowXSAgICAgQjBbMzE6MF0sIHdoZXJlIGZsYWcgYml0cyBzZXQgdG8gMAoKICBAZW5kdmVyYmF0aW0KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIEBhdHRlbnRpb24KICAqCiAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljcy4gCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CiAgKgogICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCiAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIAogICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgogICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKi8gCgovKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwojaW5jbHVkZSAic3RtMzJmN3h4X2hhbC5oIgoKLyoqIEBhZGR0b2dyb3VwIFNUTTMyRjd4eF9IQUxfRHJpdmVyCiAgKiBAewogICovCiAgCiNpZiBkZWZpbmVkIChBRVMpICB8fCBkZWZpbmVkIChDUllQKQogIAovKiogQGRlZmdyb3VwIENSWVAgQ1JZUAogICogQGJyaWVmIENSWVAgSEFMIG1vZHVsZSBkcml2ZXIuCiAgKiBAewogICovCgoKI2lmZGVmIEhBTF9DUllQX01PRFVMRV9FTkFCTEVECgovKiBQcml2YXRlIHR5cGVkZWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwovKiBQcml2YXRlIGRlZmluZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwovKiogQGFkZHRvZ3JvdXAgQ1JZUF9Qcml2YXRlX0RlZmluZXMKICAqIEB7CiAgKi8KI2RlZmluZSBDUllQX1RJTUVPVVRfS0VZUFJFUEFSQVRJT04gICAgICA4MlUgICAgICAgICAvKlRoZSBsYXRlbmN5IG9mIGtleSBwcmVwYXJhdGlvbiBvcGVyYXRpb24gaXMgODIgY2xvY2sgY3ljbGVzLiovCiNkZWZpbmUgQ1JZUF9USU1FT1VUX0dDTUNDTUlOSVRQSEFTRSAgICAgMjk5VSAgICAgICAgLyogIFRoZSBsYXRlbmN5IG9mICBHQ00vQ0NNIGluaXQgcGhhc2UgdG8gcHJlcGFyZSBoYXNoIHN1YmtleSBpcyAyOTkgY2xvY2sgY3ljbGVzLiovCiNkZWZpbmUgQ1JZUF9USU1FT1VUX0dDTUNDTUhFQURFUlBIQVNFICAgMjkwVSAgICAgICAgLyogIFRoZSBsYXRlbmN5IG9mICBHQ00vQ0NNIGhlYWRlciBwaGFzZSBpcyAyOTAgY2xvY2sgY3ljbGVzLiovCgojZGVmaW5lICBDUllQX1BIQVNFX1JFQURZICAgICAgICAgICAgICAgIDB4MDAwMDAwMDFVIC8qITwgQ1JZUCBwZXJpcGhlcmFsIGlzIHJlYWR5IGZvciBpbml0aWFsaXphdGlvbi4gKi8KI2RlZmluZSAgQ1JZUF9QSEFTRV9QUk9DRVNTICAgICAgICAgICAgICAweDAwMDAwMDAyVSAvKiE8IENSWVAgcGVyaXBoZXJhbCBpcyBpbiBwcm9jZXNzaW5nIHBoYXNlICovCiAgICAKI2lmIGRlZmluZWQoQUVTKQojZGVmaW5lIENSWVBfT1BFUkFUSU5HTU9ERV9FTkNSWVBUICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAvKiE8IEVuY3J5cHRpb24gbW9kZShNb2RlIDEpICAqLwojZGVmaW5lIENSWVBfT1BFUkFUSU5HTU9ERV9LRVlERVJJVkFUSU9OICAgICAgICAgICAgIEFFU19DUl9NT0RFXzAgICAvKiE8IEtleSBkZXJpdmF0aW9uIG1vZGUgIG9ubHkgdXNlZCB3aGVuIHBlcmZvcm1pbmcgRUNCIGFuZCBDQkMgZGVjcnlwdGlvbnMgKE1vZGUgMikgKi8KI2RlZmluZSBDUllQX09QRVJBVElOR01PREVfREVDUllQVCAgICAgICAgICAgICAgICAgICBBRVNfQ1JfTU9ERV8xICAgLyohPCBEZWNyeXB0aW9uICAgIChNb2RlIDMpICAgICovCiNkZWZpbmUgQ1JZUF9PUEVSQVRJTkdNT0RFX0tFWURFUklWQVRJT05fREVDUllQVCAgICAgQUVTX0NSX01PREUgICAgIC8qITwgS2V5IGRlcml2YXRpb24gYW5kIGRlY3J5cHRpb24gb25seSB1c2VkIHdoZW4gcGVyZm9ybWluZyBFQ0IgYW5kIENCQyBkZWNyeXB0aW9ucyAoTW9kZSA0KSAqLwojZGVmaW5lIENSWVBfUEhBU0VfSU5JVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAvKiE8IEdDTS9HTUFDIChvciBDQ00pIGluaXQgcGhhc2UgKi8gCiNkZWZpbmUgQ1JZUF9QSEFTRV9IRUFERVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUVTX0NSX0dDTVBIXzAgICAgIC8qITwgR0NNL0dNQUMgb3IgQ0NNIGhlYWRlciBwaGFzZSAqLyAKI2RlZmluZSBDUllQX1BIQVNFX1BBWUxPQUQgICAgICAgICAgICAgICAgICAgICAgICAgICBBRVNfQ1JfR0NNUEhfMSAgICAgLyohPCBHQ00oL0NDTSkgcGF5bG9hZCBwaGFzZSAgICAgICovIAojZGVmaW5lIENSWVBfUEhBU0VfRklOQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFFU19DUl9HQ01QSCAgICAgICAvKiE8IEdDTS9HTUFDIG9yIENDTSAgZmluYWwgcGhhc2UgKi8gCiNlbHNlICAvKiBDUllQICovCiNkZWZpbmUgQ1JZUF9QSEFTRV9JTklUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgLyohPCBHQ00vR01BQyAob3IgQ0NNKSBpbml0IHBoYXNlICovCiNkZWZpbmUgQ1JZUF9QSEFTRV9IRUFERVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1JZUF9DUl9HQ01fQ0NNUEhfMCAgICAgLyohPCBHQ00vR01BQyBvciBDQ00gaGVhZGVyIHBoYXNlICovIAojZGVmaW5lIENSWVBfUEhBU0VfUEFZTE9BRCAgICAgICAgICAgICAgICAgICAgICAgICAgIENSWVBfQ1JfR0NNX0NDTVBIXzEgICAgIC8qITwgR0NNKC9DQ00pIHBheWxvYWQgcGhhc2UgICAgICAqLyAKI2RlZmluZSBDUllQX1BIQVNFX0ZJTkFMICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUllQX0NSX0dDTV9DQ01QSCAgICAgICAvKiE8IEdDTS9HTUFDIG9yIENDTSAgZmluYWwgcGhhc2UgKi8gCiNkZWZpbmUgQ1JZUF9PUEVSQVRJTkdNT0RFX0VOQ1JZUFQgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgLyohPCBFbmNyeXB0aW9uIG1vZGUgICAqLwojZGVmaW5lIENSWVBfT1BFUkFUSU5HTU9ERV9ERUNSWVBUICAgICAgICAgICAgICAgICAgIENSWVBfQ1JfQUxHT0RJUiAgICAgICAgIC8qITwgRGVjcnlwdGlvbiAgICAgICAgKi8KI2VuZGlmIC8qIEVuZCBDUllQIG9yICBBRVMgKi8gCgogLyogIENUUjEgaW5mb3JtYXRpb24gdG8gdXNlIGluIENDTSBhbGdvcml0aG0gKi8KI2RlZmluZSBDUllQX0NDTV9DVFIxXzAgICAgICAgICAgICAgICAgICAweDA3RkZGRkZGVSAgICAgICAgIAojZGVmaW5lIENSWVBfQ0NNX0NUUjFfMSAgICAgICAgICAgICAgICAgIDB4RkZGRkZGMDBVICAgICAgICAgCiNkZWZpbmUgQ1JZUF9DQ01fQ1RSMV8yICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMVUgICAgICAgICAKCgovKioKICAqIEB9CiAgKi8KCiAgCi8qIFByaXZhdGUgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi8qKiBAYWRkdG9ncm91cCBDUllQX1ByaXZhdGVfTWFjcm9zCiAgKiBAewogICovCgojaWYgZGVmaW5lZChDUllQKQoKI2RlZmluZSBDUllQX1NFVF9QSEFTRShfX0hBTkRMRV9fLCBfX1BIQVNFX18pICBkb3soX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUiAmPSAodWludDMyX3QpKH5DUllQX0NSX0dDTV9DQ01QSCk7XAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSIHw9ICh1aW50MzJfdCkoX19QSEFTRV9fKTtcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9d2hpbGUoMCkKCiNkZWZpbmUgSEFMX0NSWVBfRklGT19GTFVTSChfX0hBTkRMRV9fKSAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IgfD0gIENSWVBfQ1JfRkZMVVNIKSAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiNlbHNlIC8qQUVTKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKI2RlZmluZSBDUllQX1NFVF9QSEFTRShfX0hBTkRMRV9fLCBfX1BIQVNFX18pICBkb3soX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUiAmPSAodWludDMyX3QpKH5BRVNfQ1JfR0NNUEgpO1wKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUiB8PSAodWludDMyX3QpKF9fUEhBU0VfXyk7XAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfXdoaWxlKDApCiNlbmRpZiAvKiBFbmQgQUVTIG9yIENSWVAqLwoKCi8qKgogICogQH0KICAqLyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi8qIFByaXZhdGUgc3RydWN0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwovKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwovKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwovKiogQGFkZHRvZ3JvdXAgQ1JZUF9Qcml2YXRlX0Z1bmN0aW9uc19wcm90b3R5cGVzCiAgKiBAewogICovICAKCnN0YXRpYyB2b2lkIENSWVBfU2V0RE1BQ29uZmlnKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQzMl90IGlucHV0YWRkciwgdWludDE2X3QgU2l6ZSwgdWludDMyX3Qgb3V0cHV0YWRkcik7CnN0YXRpYyB2b2lkIENSWVBfRE1BSW5DcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKc3RhdGljIHZvaWQgQ1JZUF9ETUFPdXRDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKc3RhdGljIHZvaWQgQ1JZUF9ETUFFcnJvcihETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CnN0YXRpYyB2b2lkIENSWVBfU2V0S2V5KENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQzMl90IEtleVNpemUpOwpzdGF0aWMgdm9pZCBDUllQX0FFU19JVChDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwKTsKCnN0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBDUllQX0dDTUNDTV9TZXRIZWFkZXJQaGFzZShDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50MzJfdCBUaW1lb3V0KTsKc3RhdGljIHZvaWQgQ1JZUF9HQ01DQ01fU2V0UGF5bG9hZFBoYXNlX0lUKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApOwpzdGF0aWMgdm9pZCBDUllQX0dDTUNDTV9TZXRIZWFkZXJQaGFzZV9JVChDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwKTsKc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIENSWVBfR0NNQ0NNX1NldEhlYWRlclBoYXNlX0RNQShDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwKTsKc3RhdGljIHZvaWQgQ1JZUF9Xb3JrYXJvdW5kKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQzMl90IFRpbWVvdXQpOwpzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgQ1JZUF9BRVNHQ01fUHJvY2Vzc19ETUEoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCk7CnN0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBDUllQX0FFU0dDTV9Qcm9jZXNzX0lUIChDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwKTsKc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIENSWVBfQUVTR0NNX1Byb2Nlc3MoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgdWludDMyX3QgVGltZW91dCk7CnN0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBDUllQX0FFU0NDTV9Qcm9jZXNzKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQzMl90IFRpbWVvdXQpOwpzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgQ1JZUF9BRVNDQ01fUHJvY2Vzc19JVChDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwKTsKc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIENSWVBfQUVTQ0NNX1Byb2Nlc3NfRE1BKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApOwoKc3RhdGljIHZvaWQgQ1JZUF9BRVNfUHJvY2Vzc0RhdGEoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cHQsIHVpbnQzMl90IFRpbWVvdXQpOwpzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgQ1JZUF9BRVNfRW5jcnlwdChDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50MzJfdCBUaW1lb3V0KTsKc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIENSWVBfQUVTX0RlY3J5cHQoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgdWludDMyX3QgVGltZW91dCk7CnN0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBDUllQX0FFU19EZWNyeXB0X0lUKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApOwpzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgQ1JZUF9BRVNfRW5jcnlwdF9JVChDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwKTsKc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIENSWVBfQUVTX0RlY3J5cHRfRE1BKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApOwojaWYgZGVmaW5lZCAoQ1JZUCkKc3RhdGljIHZvaWQgQ1JZUF9UREVTX0lUKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApOwoKc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIENSWVBfV2FpdE9uSUZFTUZsYWcoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgdWludDMyX3QgVGltZW91dCk7CgpzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgQ1JZUF9XYWl0T25CVVNZRmxhZyhDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50MzJfdCBUaW1lb3V0KTsKc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIENSWVBfV2FpdE9uT0ZORUZsYWcoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgdWludDMyX3QgVGltZW91dCk7CnN0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBDUllQX1RERVNfUHJvY2VzcyhDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50MzJfdCBUaW1lb3V0KTsKI2Vsc2UgLypBRVMqLwpzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgQ1JZUF9XYWl0T25DQ0ZsYWcoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgdWludDMyX3QgVGltZW91dCk7CiNlbmRpZiAvKiBFbmQgQ1JZUCBvciBBRVMgKi8KCi8qKgogICogQH0KICAqLyAKCi8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKLyoqIEBkZWZncm91cCBDUllQX0V4cG9ydGVkX0Z1bmN0aW9ucyBDUllQIEV4cG9ydGVkIEZ1bmN0aW9ucwogICogQHsKICAqLwoKICAKLyoqIEBkZWZncm91cCBDUllQX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAKICogIEBicmllZiAgICBJbml0aWFsaXphdGlvbiBhbmQgQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMuIAogKgpAdmVyYmF0aW0gICAgCiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICMjIyMjIEluaXRpYWxpemF0aW9uLCBkZS1pbml0aWFsaXphdGlvbiBhbmQgU2V0IGFuZCBHZXQgY29uZmlndXJhdGlvbiBmdW5jdGlvbnMgIyMjIyMKICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICBbLi5dICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvOgogICAgICAoKykgSW5pdGlhbGl6ZSB0aGUgQ1JZUCAgCiAgICAgICgrKSBEZUluaXRpYWxpemUgdGhlIENSWVAgIAogICAgICAoKykgSW5pdGlhbGl6ZSB0aGUgQ1JZUCBNU1AKICAgICAgKCspIERlSW5pdGlhbGl6ZSB0aGUgQ1JZUCBNU1AgCiAgICAgICgrKSBjb25maWd1cmUgQ1JZUCAoSEFMX0NSWVBfU2V0Q29uZmlnKSB3aXRoIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycyBpbiB0aGUgQ1JZUF9Db25maWdUeXBlRGVmCiAgICAgICAgICBQYXJhbWV0ZXJzIHdoaWNoIGFyZSBjb25maWd1cmVkIGluIFRoaXMgc2VjdGlvbiBhcmUgOgogICAgICAgICAgKCspIEtleSBzaXplIAogICAgICAgICAgKCspIERhdGEgVHlwZSA6IDMyLDE2LCA4IG9yIDFiaXQKICAgICAgICAgICgrKSBBbGdvTW9kZSA6IAogICAgICAgICAgICAgIC0gZm9yIENSWVAxIElQIDogCiAgICAgICAgICAgICAgICAgRUNCIGFuZCBDQkMgaW4gREVTL1RERVMgU3RhbmRhcmQgCiAgICAgICAgICAgICAgICAgRUNCLENCQyxDVFIsR0NNL0dNQUMgYW5kIENDTSBpbiBBRVMgU3RhbmRhcmQuIAogICAgICAgICAgICAgIC0gZm9yIFRpbnlBRVMyIElQLCBvbmx5IEVDQixDQkMsQ1RSLEdDTS9HTUFDIGFuZCBDQ00gaW4gQUVTIFN0YW5kYXJkIGFyZSBzdXBwb3J0ZWQuCiAgICAgICgrKSBHZXQgQ1JZUCBjb25maWd1cmF0aW9uIChIQUxfQ1JZUF9HZXRDb25maWcpIGZyb20gdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzIGluIHRoZSBDUllQX0hhbmRsZVR5cGVEZWYKCgpAZW5kdmVyYmF0aW0KICAqIEB7CiAgKi8KCgovKioKICAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIENSWVAgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQKICAqICAgICAgICAgcGFyYW1ldGVycyBpbiB0aGUgQ1JZUF9Db25maWdUeXBlRGVmIGFuZCBjcmVhdGVzIHRoZSBhc3NvY2lhdGVkIGhhbmRsZS4KICAqIEBwYXJhbSAgaGNyeXA6IHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIENSWVAgbW9kdWxlCiAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAqLwpIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ1JZUF9Jbml0KENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApCnsgCiAgLyogQ2hlY2sgdGhlIENSWVAgaGFuZGxlIGFsbG9jYXRpb24gKi8KICBpZihoY3J5cCA9PSBOVUxMKQogIHsKICAgIHJldHVybiBIQUxfRVJST1I7CiAgfSAKICAKICAvKiBDaGVjayBwYXJhbWV0ZXJzICovCiAgYXNzZXJ0X3BhcmFtKElTX0NSWVBfS0VZU0laRShoY3J5cC0+SW5pdC5LZXlTaXplKSk7CiAgYXNzZXJ0X3BhcmFtKElTX0NSWVBfREFUQVRZUEUoaGNyeXAtPkluaXQuRGF0YVR5cGUpKTsKICBhc3NlcnRfcGFyYW0oSVNfQ1JZUF9BTEdPUklUSE0oaGNyeXAtPkluaXQuQWxnb3JpdGhtKSk7ICAKICAKICAjaWYgKFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKICBpZihoY3J5cC0+U3RhdGUgPT0gSEFMX0NSWVBfU1RBVEVfUkVTRVQpCiAgewogICAgLyogQWxsb2NhdGUgbG9jayByZXNvdXJjZSBhbmQgaW5pdGlhbGl6ZSBpdCAqLwogICAgaGNyeXAtPkxvY2sgPSBIQUxfVU5MT0NLRUQ7CiAgICAKICAgIGhjcnlwLT5JbkNwbHRDYWxsYmFjayAgPSBIQUxfQ1JZUF9JbkNwbHRDYWxsYmFjazsgIC8qIExlZ2FjeSB3ZWFrIEluQ3BsdENhbGxiYWNrICAgKi8KICAgIGhjcnlwLT5PdXRDcGx0Q2FsbGJhY2sgPSBIQUxfQ1JZUF9PdXRDcGx0Q2FsbGJhY2s7IC8qIExlZ2FjeSB3ZWFrIE91dENwbHRDYWxsYmFjayAgKi8KICAgIGhjcnlwLT5FcnJvckNhbGxiYWNrICAgPSBIQUxfQ1JZUF9FcnJvckNhbGxiYWNrOyAgIC8qIExlZ2FjeSB3ZWFrIEVycm9yQ2FsbGJhY2sgICAgKi8KICAgIAogICAgaWYoaGNyeXAtPk1zcEluaXRDYWxsYmFjayA9PSBOVUxMKQogICAgewogICAgICBoY3J5cC0+TXNwSW5pdENhbGxiYWNrID0gSEFMX0NSWVBfTXNwSW5pdDsgLyogTGVnYWN5IHdlYWsgTXNwSW5pdCAgKi8KICAgIH0KICAgIAogICAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlICovCiAgICBoY3J5cC0+TXNwSW5pdENhbGxiYWNrKGhjcnlwKTsgICAgCiAgfQojZWxzZQogIGlmKGhjcnlwLT5TdGF0ZSA9PSBIQUxfQ1JZUF9TVEFURV9SRVNFVCkKICB7CiAgICAvKiBBbGxvY2F0ZSBsb2NrIHJlc291cmNlIGFuZCBpbml0aWFsaXplIGl0ICovCiAgICBoY3J5cC0+TG9jayA9IEhBTF9VTkxPQ0tFRDsKICAgIAogICAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlICovCiAgICBIQUxfQ1JZUF9Nc3BJbml0KGhjcnlwKTsKICB9CiAjZW5kaWYgLyogKFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MpICovCiAgCiAgLyogU2V0IHRoZSBrZXkgc2l6ZShUaGlzIGJpdCBmaWVsZCBpcyBkb26SdCBjYXJlIGluIHRoZSBERVMgb3IgVERFUyBtb2RlcykgZGF0YSB0eXBlIGFuZCBBbGdvcml0aG0gKi8KI2lmIGRlZmluZWQgKENSWVApCiAgCiAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBDUllQX0NSX0RBVEFUWVBFfENSWVBfQ1JfS0VZU0laRXxDUllQX0NSX0FMR09NT0RFLCBoY3J5cC0+SW5pdC5EYXRhVHlwZSB8IGhjcnlwLT5Jbml0LktleVNpemUgfCBoY3J5cC0+SW5pdC5BbGdvcml0aG0pOwogIAojZWxzZSAvKkFFUyovCiAgCiAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfREFUQVRZUEV8QUVTX0NSX0tFWVNJWkV8QUVTX0NSX0NITU9ELCBoY3J5cC0+SW5pdC5EYXRhVHlwZSB8IGhjcnlwLT5Jbml0LktleVNpemUgfCBoY3J5cC0+SW5pdC5BbGdvcml0aG0pOwogIAojZW5kaWYgIC8qIEVuZCBBRVMgb3IgQ1JZUCovCiAgCiAgLyogUmVzZXQgRXJyb3IgQ29kZSBmaWVsZCAqLwogIGhjcnlwLT5FcnJvckNvZGUgPSBIQUxfQ1JZUF9FUlJPUl9OT05FOyAKICAKICAvKiBDaGFuZ2UgdGhlIENSWVAgc3RhdGUgKi8KICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsgIAogIAogIC8qIFNldCB0aGUgZGVmYXVsdCBDUllQIHBoYXNlICovCiAgaGNyeXAtPlBoYXNlID0gQ1JZUF9QSEFTRV9SRUFEWTsKICAKICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCiAgcmV0dXJuIEhBTF9PSzsKfQoKLyoqCiAgKiBAYnJpZWYgIERlLUluaXRpYWxpemVzIHRoZSBDUllQIHBlcmlwaGVyYWwuIAogICogQHBhcmFtICBoY3J5cDogcG9pbnRlciB0byBhIENSWVBfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucwogICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUKICAqIEByZXR2YWwgSEFMIHN0YXR1cwoqLwpIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ1JZUF9EZUluaXQoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCkKewogIC8qIENoZWNrIHRoZSBDUllQIGhhbmRsZSBhbGxvY2F0aW9uICovCiAgaWYoaGNyeXAgPT0gTlVMTCkKICB7CiAgICByZXR1cm4gSEFMX0VSUk9SOwogIH0KICAKICAvKiBTZXQgdGhlIGRlZmF1bHQgQ1JZUCBwaGFzZSAqLwogIGhjcnlwLT5QaGFzZSA9IENSWVBfUEhBU0VfUkVBRFk7CiAgCiAgLyogUmVzZXQgQ3J5cEluQ291bnQgYW5kIENyeXBPdXRDb3VudCAqLwogIGhjcnlwLT5DcnlwSW5Db3VudCA9IDA7CiAgaGNyeXAtPkNyeXBPdXRDb3VudCA9IDA7CiAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCA9MDsgCiAgCiAgLyogRGlzYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIGNsb2NrICovCiAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKICAKI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCiAgCiAgaWYoaGNyeXAtPk1zcERlSW5pdENhbGxiYWNrID09IE5VTEwpCiAgewogICAgaGNyeXAtPk1zcERlSW5pdENhbGxiYWNrID0gSEFMX0NSWVBfTXNwRGVJbml0OyAvKiBMZWdhY3kgd2VhayBNc3BEZUluaXQgICovCiAgfQogIC8qIERlSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlICovCiAgaGNyeXAtPk1zcERlSW5pdENhbGxiYWNrKGhjcnlwKTsKICAKI2Vsc2UKICAKICAvKiBEZUluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZTogQ0xPQ0ssIE5WSUMuKi8KICBIQUxfQ1JZUF9Nc3BEZUluaXQoaGNyeXApOwogIAojZW5kaWYgLyogVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyAqLwogIAogIC8qIENoYW5nZSB0aGUgQ1JZUCBzdGF0ZSAqLwogIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFU0VUOwogIAogIC8qIFJlbGVhc2UgTG9jayAqLwogIF9fSEFMX1VOTE9DSyhoY3J5cCk7CiAgCiAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLwogIHJldHVybiBIQUxfT0s7Cn0KICAgIAovKioKICAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBDUllQIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkCiAgKiAgICAgICAgIHBhcmFtZXRlcnMgaW4gdGhlIENSWVBfQ29uZmlnVHlwZURlZiAKICAqIEBwYXJhbSAgaGNyeXA6IHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlCiAgKiBAcGFyYW0gIHBDb25mOiBwb2ludGVyIHRvIGEgQ1JZUF9Db25maWdUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCiAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZQogICogQHJldHZhbCBIQUwgc3RhdHVzCiAgKi8KSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NSWVBfU2V0Q29uZmlnKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIENSWVBfQ29uZmlnVHlwZURlZiAqcENvbmYgKQp7IAogIC8qIENoZWNrIHRoZSBDUllQIGhhbmRsZSBhbGxvY2F0aW9uICovCiAgaWYoKGhjcnlwID09IE5VTEwpfHwgKHBDb25mID09IE5VTEwpICkKICB7CiAgICByZXR1cm4gSEFMX0VSUk9SOwogIH0KICAKICAvKiBDaGVjayBwYXJhbWV0ZXJzICovCiAgYXNzZXJ0X3BhcmFtKElTX0NSWVBfS0VZU0laRShwQ29uZi0+S2V5U2l6ZSkpOwogIGFzc2VydF9wYXJhbShJU19DUllQX0RBVEFUWVBFKHBDb25mLT5EYXRhVHlwZSkpOwogIGFzc2VydF9wYXJhbShJU19DUllQX0FMR09SSVRITShwQ29uZi0+QWxnb3JpdGhtKSk7CiAgCiAgaWYoaGNyeXAtPlN0YXRlID09IEhBTF9DUllQX1NUQVRFX1JFQURZKSAKICB7ICAKICAgIC8qIENoYW5nZSB0aGUgQ1JZUCBzdGF0ZSAqLwogICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfQlVTWTsKICAgIAogICAgLyogUHJvY2VzcyBsb2NrZWQgKi8KICAgIF9fSEFMX0xPQ0soaGNyeXApOyAgICAgCiAgICAKICAgIC8qIFNldCAgQ1JZUCBwYXJhbWV0ZXJzICAqLyAgICAKICAgIGhjcnlwLT5Jbml0LkRhdGFUeXBlICAgPSBwQ29uZi0+RGF0YVR5cGU7CiAgICBoY3J5cC0+SW5pdC5wS2V5ICAgICAgID0gcENvbmYtPnBLZXk7CiAgICBoY3J5cC0+SW5pdC5BbGdvcml0aG0gID0gcENvbmYtPkFsZ29yaXRobTsKICAgIGhjcnlwLT5Jbml0LktleVNpemUgICAgPSBwQ29uZi0+S2V5U2l6ZTsKICAgIGhjcnlwLT5Jbml0LnBJbml0VmVjdCAgPSBwQ29uZi0+cEluaXRWZWN0OwogICAgaGNyeXAtPkluaXQuSGVhZGVyICAgICA9IHBDb25mLT5IZWFkZXI7CiAgICBoY3J5cC0+SW5pdC5IZWFkZXJTaXplID0gcENvbmYtPkhlYWRlclNpemU7CiAgICBoY3J5cC0+SW5pdC5CMCAgICAgICAgID0gcENvbmYtPkIwOwogICAgaGNyeXAtPkluaXQuRGF0YVdpZHRoVW5pdCA9IHBDb25mLT5EYXRhV2lkdGhVbml0OwogICAgCiAgICAvKiBTZXQgdGhlIGtleSBzaXplKFRoaXMgYml0IGZpZWxkIGlzIGRvbpJ0IGNhcmUgaW4gdGhlIERFUyBvciBUREVTIG1vZGVzKSBkYXRhIHR5cGUsIEFsZ29Nb2RlIGFuZCBvcGVyYXRpbmcgbW9kZSovICAgIAojaWYgZGVmaW5lZCAoQ1JZUCkgCiAgICAKICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQ1JZUF9DUl9EQVRBVFlQRXxDUllQX0NSX0tFWVNJWkV8Q1JZUF9DUl9BTEdPTU9ERSwgaGNyeXAtPkluaXQuRGF0YVR5cGUgfCBoY3J5cC0+SW5pdC5LZXlTaXplIHwgaGNyeXAtPkluaXQuQWxnb3JpdGhtKTsKICAgIAojZWxzZSAvKkFFUyovCiAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIEFFU19DUl9EQVRBVFlQRXxBRVNfQ1JfS0VZU0laRXxBRVNfQ1JfQ0hNT0QsIGhjcnlwLT5Jbml0LkRhdGFUeXBlIHwgaGNyeXAtPkluaXQuS2V5U2l6ZSB8IGhjcnlwLT5Jbml0LkFsZ29yaXRobSk7CiAgICAKICAgIC8qY2xlYXIgZXJyb3IgZmxhZ3MqLwogICAgX19IQUxfQ1JZUF9DTEVBUl9GTEFHKGhjcnlwLENSWVBfRVJSX0NMRUFSKTsKICAgIAojZW5kaWYgIC8qIEVuZCBBRVMgb3IgQ1JZUCAqLyAKICAgIAogICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLwogICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKICAgIAogICAgLyogUmVzZXQgRXJyb3IgQ29kZSBmaWVsZCAqLwogICAgaGNyeXAtPkVycm9yQ29kZSA9IEhBTF9DUllQX0VSUk9SX05PTkU7IAogICAgCiAgICAvKiBDaGFuZ2UgdGhlIENSWVAgc3RhdGUgKi8KICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOyAgCiAgICAKICAgIC8qIFNldCB0aGUgZGVmYXVsdCBDUllQIHBoYXNlICovCiAgICBoY3J5cC0+UGhhc2UgPSBDUllQX1BIQVNFX1JFQURZOwogICAgCiAgICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCiAgICByZXR1cm4gSEFMX09LOwogIH0KICBlbHNlCiAgewogICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLwogICAgX19IQUxfVU5MT0NLKGhjcnlwKTsgICAKICAgIAogICAgLyogQnVzeSBlcnJvciBjb2RlIGZpZWxkICovCiAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX0JVU1k7IAogICAgcmV0dXJuIEhBTF9FUlJPUjsKICB9Cn0KCi8qKgogICogQGJyaWVmICBHZXQgQ1JZUCBDb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgaW4gYXNzb2NpYXRlZCBoYW5kbGUuCiAgKiBAcGFyYW0gIHBDb25mOiBwb2ludGVyIHRvIGEgQ1JZUF9Db25maWdUeXBlRGVmIHN0cnVjdHVyZQogICogQHBhcmFtICBoY3J5cDogcG9pbnRlciB0byBhIENSWVBfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucwogICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUKICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICovCkhBTF9TdGF0dXNUeXBlRGVmIEhBTF9DUllQX0dldENvbmZpZyhDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCBDUllQX0NvbmZpZ1R5cGVEZWYgKnBDb25mICkKeyAKICAvKiBDaGVjayB0aGUgQ1JZUCBoYW5kbGUgYWxsb2NhdGlvbiAqLwogIGlmKChoY3J5cCA9PSBOVUxMKXx8IChwQ29uZiA9PSBOVUxMKSApCiAgewogICAgcmV0dXJuIEhBTF9FUlJPUjsKICB9CiAgCiAgaWYoaGNyeXAtPlN0YXRlID09IEhBTF9DUllQX1NUQVRFX1JFQURZKSAKICB7ICAKICAgIC8qIENoYW5nZSB0aGUgQ1JZUCBzdGF0ZSAqLwogICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfQlVTWTsKICAgIAogICAgLyogUHJvY2VzcyBsb2NrZWQgKi8KICAgIF9fSEFMX0xPQ0soaGNyeXApOyAgCiAgICAKICAgIC8qIEdldCAgQ1JZUCBwYXJhbWV0ZXJzICAqLyAgICAgIAogICAgcENvbmYtPkRhdGFUeXBlICAgICAgICA9IGhjcnlwLT5Jbml0LkRhdGFUeXBlOwogICAgcENvbmYtPnBLZXkgICAgICAgICAgICA9IGhjcnlwLT5Jbml0LnBLZXk7CiAgICBwQ29uZi0+QWxnb3JpdGhtICAgICAgID0gaGNyeXAtPkluaXQuQWxnb3JpdGhtOwogICAgcENvbmYtPktleVNpemUgICAgICAgICA9IGhjcnlwLT5Jbml0LktleVNpemUgOwogICAgcENvbmYtPnBJbml0VmVjdCAgICAgICA9IGhjcnlwLT5Jbml0LnBJbml0VmVjdDsKICAgIHBDb25mLT5IZWFkZXIgICAgICAgICAgPSBoY3J5cC0+SW5pdC5IZWFkZXIgOwogICAgcENvbmYtPkhlYWRlclNpemUgICAgICA9IGhjcnlwLT5Jbml0LkhlYWRlclNpemU7CiAgICBwQ29uZi0+QjAgICAgICAgICAgICAgID0gaGNyeXAtPkluaXQuQjA7CiAgICBwQ29uZi0+RGF0YVdpZHRoVW5pdCAgICA9IGhjcnlwLT5Jbml0LkRhdGFXaWR0aFVuaXQ7CiAgICAKICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CiAgICAKICAgIC8qIENoYW5nZSB0aGUgQ1JZUCBzdGF0ZSAqLwogICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7ICAgCiAgICAKICAgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KICAgIHJldHVybiBIQUxfT0s7CiAgfQogIGVsc2UKICB7CiAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCiAgICBfX0hBTF9VTkxPQ0soaGNyeXApOyAgICAKICAgIAogICAgLyogQnVzeSBlcnJvciBjb2RlIGZpZWxkICovCiAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX0JVU1k7IAogICAgcmV0dXJuIEhBTF9FUlJPUjsKICB9Cn0KLyoqCiAgKiBAYnJpZWYgIEluaXRpYWxpemVzIHRoZSBDUllQIE1TUC4KICAqIEBwYXJhbSAgaGNyeXA6IHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIENSWVAgbW9kdWxlCiAgKiBAcmV0dmFsIE5vbmUKICAqLwpfX3dlYWsgdm9pZCBIQUxfQ1JZUF9Nc3BJbml0KENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApCnsKICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCiAgVU5VU0VEKGhjcnlwKTsKIAogIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIFNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKICAgICAgICAgICAgdGhlIEhBTF9DUllQX01zcEluaXQgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQogICAqLwp9CgovKioKICAqIEBicmllZiAgRGVJbml0aWFsaXplcyBDUllQIE1TUC4KICAqIEBwYXJhbSAgaGNyeXA6IHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIENSWVAgbW9kdWxlCiAgKiBAcmV0dmFsIE5vbmUKICAqLwpfX3dlYWsgdm9pZCBIQUxfQ1JZUF9Nc3BEZUluaXQoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCkKewogIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KICBVTlVTRUQoaGNyeXApOwogCiAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gU2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAogICAgICAgICAgICB0aGUgSEFMX0NSWVBfTXNwRGVJbml0IGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKICAgKi8KfQoKI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCi8qKgogICogQGJyaWVmICBSZWdpc3RlciBhIFVzZXIgQ1JZUCBDYWxsYmFjawogICogICAgICAgICBUbyBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIHdlYWsgcHJlZGVmaW5lZCBjYWxsYmFjawogICogQHBhcmFtIGhjcnlwIGNyeXAgaGFuZGxlCiAgKiBAcGFyYW0gQ2FsbGJhY2tJRCBJRCBvZiB0aGUgY2FsbGJhY2sgdG8gYmUgcmVnaXN0ZXJlZAogICogICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CiAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0NSWVBfSU5QVVRfQ09NUExFVEVfQ0JfSUQgSW5wdXQgRklGTyB0cmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2sgSUQKICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfQ1JZUF9PVVRQVVRfQ09NUExFVEVfQ0JfSUQgT3V0cHV0IEZJRk8gdHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrIElECiAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0NSWVBfRVJST1JfQ0JfSUQgRXJyb3IgY2FsbGJhY2sgSUQgCiAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0NSWVBfTVNQSU5JVF9DQl9JRCBNc3BJbml0IGNhbGxiYWNrIElECiAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0NSWVBfTVNQREVJTklUX0NCX0lEIE1zcERlSW5pdCBjYWxsYmFjayBJRAogICogQHBhcmFtIHBDYWxsYmFjayBwb2ludGVyIHRvIHRoZSBDYWxsYmFjayBmdW5jdGlvbgogICogQHJldHZhbCBzdGF0dXMKICAqLwpIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ1JZUF9SZWdpc3RlckNhbGxiYWNrKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIEhBTF9DUllQX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQsIHBDUllQX0NhbGxiYWNrVHlwZURlZiBwQ2FsbGJhY2spCnsKICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CiAgCiAgaWYocENhbGxiYWNrID09IE5VTEwpCiAgewogICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCiAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CiAgICAKICAgIHJldHVybiBIQUxfRVJST1I7CiAgfQogIC8qIFByb2Nlc3MgbG9ja2VkICovCiAgX19IQUxfTE9DSyhoY3J5cCk7CiAgCiAgaWYoaGNyeXAtPlN0YXRlID09IEhBTF9DUllQX1NUQVRFX1JFQURZKQogIHsKICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkKICAgIHsKICAgIGNhc2UgSEFMX0NSWVBfSU5QVVRfQ09NUExFVEVfQ0JfSUQgOgogICAgICBoY3J5cC0+SW5DcGx0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CiAgICAgIGJyZWFrOwogICAgICAKICAgIGNhc2UgSEFMX0NSWVBfT1VUUFVUX0NPTVBMRVRFX0NCX0lEIDoKICAgICAgaGNyeXAtPk91dENwbHRDYWxsYmFjayA9IHBDYWxsYmFjazsKICAgICAgYnJlYWs7CiAgICAgIAogICAgY2FzZSBIQUxfQ1JZUF9FUlJPUl9DQl9JRCA6CiAgICAgIGhjcnlwLT5FcnJvckNhbGxiYWNrID0gcENhbGxiYWNrOwogICAgICBicmVhazsKICAgICAgCiAgICBjYXNlIEhBTF9DUllQX01TUElOSVRfQ0JfSUQgOgogICAgICBoY3J5cC0+TXNwSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOwogICAgICBicmVhazsKICAgICAgCiAgICBjYXNlIEhBTF9DUllQX01TUERFSU5JVF9DQl9JRCA6CiAgICAgIGhjcnlwLT5Nc3BEZUluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKICAgICAgYnJlYWs7CiAgICAgIAogICAgZGVmYXVsdCA6CiAgICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLwogICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CiAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKICAgICAgYnJlYWs7CiAgICB9CiAgfQogIGVsc2UgaWYoaGNyeXAtPlN0YXRlID09IEhBTF9DUllQX1NUQVRFX1JFU0VUKQogIHsKICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkKICAgIHsKICAgIGNhc2UgSEFMX0NSWVBfTVNQSU5JVF9DQl9JRCA6CiAgICAgIGhjcnlwLT5Nc3BJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CiAgICAgIGJyZWFrOwogICAgICAKICAgIGNhc2UgSEFMX0NSWVBfTVNQREVJTklUX0NCX0lEIDoKICAgICAgaGNyeXAtPk1zcERlSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOwogICAgICBicmVhazsKICAgICAgCiAgICBkZWZhdWx0IDoKICAgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCiAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLwogICAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOwogICAgICBicmVhazsKICAgIH0KICB9CiAgZWxzZQogIHsKICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLwogICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9JTlZBTElEX0NBTExCQUNLOwogICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLwogICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKICB9CiAgCiAgLyogUmVsZWFzZSBMb2NrICovCiAgX19IQUxfVU5MT0NLKGhjcnlwKTsKICAKICByZXR1cm4gc3RhdHVzOwp9CgovKioKICAqIEBicmllZiAgVW5yZWdpc3RlciBhbiBDUllQIENhbGxiYWNrCiAgKiAgICAgICAgIENSWVAgY2FsbGJhY2sgaXMgcmVkaXJlY3RlZCB0byB0aGUgd2VhayBwcmVkZWZpbmVkIGNhbGxiYWNrCiAgKiBAcGFyYW0gaGNyeXAgY3J5cCBoYW5kbGUKICAqIEBwYXJhbSBDYWxsYmFja0lEIElEIG9mIHRoZSBjYWxsYmFjayB0byBiZSB1bnJlZ2lzdGVyZWQKICAqICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgogICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9DUllQX0lOUFVUX0NPTVBMRVRFX0NCX0lEIElucHV0IEZJRk8gdHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrIElECiAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0NSWVBfT1VUUFVUX0NPTVBMRVRFX0NCX0lEIE91dHB1dCBGSUZPIHRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjayBJRAogICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9DUllQX0VSUk9SX0NCX0lEIEVycm9yIGNhbGxiYWNrIElEIAogICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9DUllQX01TUElOSVRfQ0JfSUQgTXNwSW5pdCBjYWxsYmFjayBJRAogICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9DUllQX01TUERFSU5JVF9DQl9JRCBNc3BEZUluaXQgY2FsbGJhY2sgSUQKICAqIEByZXR2YWwgc3RhdHVzCiAgKi8KSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NSWVBfVW5SZWdpc3RlckNhbGxiYWNrKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIEhBTF9DUllQX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQpCnsKICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CiAgCiAgLyogUHJvY2VzcyBsb2NrZWQgKi8KICBfX0hBTF9MT0NLKGhjcnlwKTsKICAKICBpZihoY3J5cC0+U3RhdGUgPT0gSEFMX0NSWVBfU1RBVEVfUkVBRFkpCiAgewogICAgc3dpdGNoIChDYWxsYmFja0lEKQogICAgewogICAgY2FzZSBIQUxfQ1JZUF9JTlBVVF9DT01QTEVURV9DQl9JRCA6CiAgICAgIGhjcnlwLT5JbkNwbHRDYWxsYmFjayA9IEhBTF9DUllQX0luQ3BsdENhbGxiYWNrOyAgLyogTGVnYWN5IHdlYWsgIEluQ3BsdENhbGxiYWNrICAqLwogICAgICBicmVhazsKICAgICAgCiAgICBjYXNlIEhBTF9DUllQX09VVFBVVF9DT01QTEVURV9DQl9JRCA6CiAgICAgIGhjcnlwLT5PdXRDcGx0Q2FsbGJhY2sgPSBIQUxfQ1JZUF9PdXRDcGx0Q2FsbGJhY2s7ICAgICAgICAgLyogTGVnYWN5IHdlYWsgT3V0Q3BsdENhbGxiYWNrICAgICAgICovCiAgICAgIGJyZWFrOwogICAgICAKICAgIGNhc2UgSEFMX0NSWVBfRVJST1JfQ0JfSUQgOgogICAgICBoY3J5cC0+RXJyb3JDYWxsYmFjayA9IEhBTF9DUllQX0Vycm9yQ2FsbGJhY2s7ICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBFcnJvckNhbGxiYWNrICAgICAgICAqLwogICAgICBicmVhazsKICAgICAgCiAgICBjYXNlIEhBTF9DUllQX01TUElOSVRfQ0JfSUQgOgogICAgICBoY3J5cC0+TXNwSW5pdENhbGxiYWNrID0gSEFMX0NSWVBfTXNwSW5pdDsKICAgICAgYnJlYWs7CiAgICAgIAogICAgY2FzZSBIQUxfQ1JZUF9NU1BERUlOSVRfQ0JfSUQgOgogICAgICBoY3J5cC0+TXNwRGVJbml0Q2FsbGJhY2sgPSBIQUxfQ1JZUF9Nc3BEZUluaXQ7CiAgICAgIGJyZWFrOwogICAgICAKICAgIGRlZmF1bHQgOgogICAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9JTlZBTElEX0NBTExCQUNLOwogICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCiAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CiAgICAgIGJyZWFrOwogICAgfQogIH0KICBlbHNlIGlmKGhjcnlwLT5TdGF0ZSA9PSBIQUxfQ1JZUF9TVEFURV9SRVNFVCkKICB7CiAgICBzd2l0Y2ggKENhbGxiYWNrSUQpCiAgICB7CiAgICBjYXNlIEhBTF9DUllQX01TUElOSVRfQ0JfSUQgOgogICAgICBoY3J5cC0+TXNwSW5pdENhbGxiYWNrID0gSEFMX0NSWVBfTXNwSW5pdDsKICAgICAgYnJlYWs7CiAgICAgIAogICAgY2FzZSBIQUxfQ1JZUF9NU1BERUlOSVRfQ0JfSUQgOgogICAgICBoY3J5cC0+TXNwRGVJbml0Q2FsbGJhY2sgPSBIQUxfQ1JZUF9Nc3BEZUluaXQ7CiAgICAgIGJyZWFrOwogICAgICAKICAgIGRlZmF1bHQgOgogICAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9JTlZBTElEX0NBTExCQUNLOwogICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCiAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CiAgICAgIGJyZWFrOwogICAgfQogIH0KICBlbHNlCiAgewogICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCiAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CiAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCiAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOwogIH0KICAKICAvKiBSZWxlYXNlIExvY2sgKi8KICBfX0hBTF9VTkxPQ0soaGNyeXApOwogIAogIHJldHVybiBzdGF0dXM7Cn0KI2VuZGlmIC8qIFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KLyoqCiAgKiBAfQogICovCgovKiogQGRlZmdyb3VwIENSWVBfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMiAgRW5jcnlwdCBEZWNyeXB0IGZ1bmN0aW9ucyAKICogIEBicmllZiAgIHByb2Nlc3NpbmcgZnVuY3Rpb25zLiAKICoKQHZlcmJhdGltICAgCiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBFbmNyeXB0IERlY3J5cHQgIGZ1bmN0aW9ucyAjIyMjIwogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAgCiAgICBbLi5dICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgQVBJIGFsbG93aW5nIHRvIEVuY3J5cHQvRGVjcnlwdCBEYXRhIGZvbGxvd2luZyAKICAgICAgICAgIFN0YW5kYXJkIERFUy9UREVTIG9yIEFFUywgYW5kIEFsZ29yaXRobSBjb25maWd1cmVkIGJ5IHRoZSB1c2VyOgogICAgICAoKykgU3RhbmRhcmQgREVTL1RERVMgb25seSBzdXBwb3J0ZWQgYnkgQ1JZUDEgSVAsIGJlbG93IGxpc3Qgb2YgQWxnb3JpdGhtIHN1cHBvcnRlZCA6IAogICAgICAgICAgIC0gRWxlY3Ryb25pYyBDb2RlIEJvb2soRUNCKQogICAgICAgICAgIC0gQ2lwaGVyIEJsb2NrIENoYWluaW5nIChDQkMpCiAgICAgICgrKSBTdGFuZGFyZCBBRVMgIHN1cHBvcnRlZCBieSBDUllQMSBJUCAmIFRpbnlBRVMsIGxpc3Qgb2YgQWxnb3JpdGhtIHN1cHBvcnRlZDoKICAgICAgICAgICAtIEVsZWN0cm9uaWMgQ29kZSBCb29rKEVDQikKICAgICAgICAgICAtIENpcGhlciBCbG9jayBDaGFpbmluZyAoQ0JDKQogICAgICAgICAgIC0gQ291bnRlciBtb2RlIChDVFIpCiAgICAgICAgICAgLSBDaXBoZXIgQmxvY2sgQ2hhaW5pbmcgKENCQykKICAgICAgICAgICAtIENvdW50ZXIgbW9kZSAoQ1RSKQogICAgICAgICAgIC0gR2Fsb2lzL2NvdW50ZXIgbW9kZSAoR0NNKQogICAgICAgICAgIC0gQ291bnRlciB3aXRoIENpcGhlciBCbG9jayBDaGFpbmluZy1NZXNzYWdlKENDTSkgCiAgICBbLi5dICBUaHJlZSBwcm9jZXNzaW5nIGZ1bmN0aW9ucyBhcmUgYXZhaWxhYmxlOgogICAgICAoKykgUG9sbGluZyBtb2RlIDogSEFMX0NSWVBfRW5jcnlwdCAmIEhBTF9DUllQX0RlY3J5cHQKICAgICAgKCspIEludGVycnVwdCBtb2RlIDogSEFMX0NSWVBfRW5jcnlwdF9JVCAmIEhBTF9DUllQX0RlY3J5cHRfSVQKICAgICAgKCspIERNQSBtb2RlIDogSEFMX0NSWVBfRW5jcnlwdF9ETUEgJiBIQUxfQ1JZUF9EZWNyeXB0X0RNQQoKQGVuZHZlcmJhdGltCiAgKiBAewogICovCgoKLyoqCiAgKiBAYnJpZWYgIEVuY3J5cHRpb24gbW9kZS4KICAqIEBwYXJhbSAgaGNyeXA6IHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIENSWVAgbW9kdWxlCiAgKiBAcGFyYW0gIElucHV0OiBQb2ludGVyIHRvIHRoZSBpbnB1dCBidWZmZXIgKHBsYWludGV4dCkKICAqIEBwYXJhbSAgU2l6ZTogTGVuZ3RoIG9mIHRoZSBwbGFpbnRleHQgYnVmZmVyIGluIHdvcmQuCiAgKiBAcGFyYW0gIE91dHB1dDogUG9pbnRlciB0byB0aGUgb3V0cHV0IGJ1ZmZlcihjaXBoZXJ0ZXh0KQogICogQHBhcmFtICBUaW1lb3V0OiBTcGVjaWZ5IFRpbWVvdXQgdmFsdWUgIAogICogQHJldHZhbCBIQUwgc3RhdHVzCiAgKi8KSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NSWVBfRW5jcnlwdChDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50MzJfdCAqSW5wdXQsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90ICpPdXRwdXQsIHVpbnQzMl90IFRpbWVvdXQpCnsKICB1aW50MzJfdCBhbGdvOwogIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1czsKICAKICBpZihoY3J5cC0+U3RhdGUgPT0gSEFMX0NSWVBfU1RBVEVfUkVBRFkpCiAgeyAKICAgIC8qIENoYW5nZSBzdGF0ZSBCdXN5ICovCiAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9CVVNZOwogICAgCiAgICAvKiBQcm9jZXNzIGxvY2tlZCAqLwogICAgX19IQUxfTE9DSyhoY3J5cCk7CiAgICAKICAgIC8qICBSZXNldCBDcnlwSW5Db3VudCwgQ3J5cE91dENvdW50IGFuZCBJbml0aWFsaXplIHBDcnlwSW5CdWZmUHRyIGFuZCBwQ3J5cE91dEJ1ZmZQdHIgcGFyYW1ldGVycyovCiAgICBoY3J5cC0+Q3J5cEluQ291bnQgPSAwVTsKICAgIGhjcnlwLT5DcnlwT3V0Q291bnQgPSAwVTsKICAgIGhjcnlwLT5wQ3J5cEluQnVmZlB0ciA9IElucHV0OwogICAgaGNyeXAtPnBDcnlwT3V0QnVmZlB0ciA9IE91dHB1dDsKICAgIAogICAgLyogIENhbGN1bGF0ZSBTaXplIHBhcmFtZXRlciBpbiBCeXRlKi8KICAgIGlmIChoY3J5cC0+SW5pdC5EYXRhV2lkdGhVbml0ID09IENSWVBfREFUQVdJRFRIVU5JVF9XT1JEKQogICAgewogICAgICBoY3J5cC0+U2l6ZSA9IFNpemUgKiA0VTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgaGNyeXAtPlNpemUgPSBTaXplOwkKICAgIH0KICAgIAojaWYgZGVmaW5lZCAoQ1JZUCkgIAogICAgLyogU2V0IEVuY3J5cHRpb24gb3BlcmF0aW5nIG1vZGUqLyAgIAogICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBDUllQX0NSX0FMR09ESVIsIENSWVBfT1BFUkFUSU5HTU9ERV9FTkNSWVBUKTsgIAogICAgCiAgICAvKiBhbGdvIGdldCBhbGdvcml0aG0gc2VsZWN0ZWQgKi8gICAgIAogICAgYWxnbyA9IGhjcnlwLT5JbnN0YW5jZS0+Q1IgJiBDUllQX0NSX0FMR09NT0RFOwogICAgCiAgICBzd2l0Y2goYWxnbykKICAgIHsgICAgCiAgICBjYXNlIENSWVBfREVTX0VDQjoKICAgIGNhc2UgQ1JZUF9ERVNfQ0JDOgogICAgY2FzZSBDUllQX1RERVNfRUNCOgogICAgY2FzZSBDUllQX1RERVNfQ0JDOgogICAgICAKICAgICAgLypTZXQgS2V5ICovCiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SzFMUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wS2V5KTsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5LMVJSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBLZXkrMSk7CiAgICAgIGlmICgoaGNyeXAtPkluaXQuQWxnb3JpdGhtID09IENSWVBfVERFU19FQ0IpIHx8IChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9UREVTX0NCQykpCiAgICAgIHsKICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPksyTFIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEtleSsyKTsKICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPksyUlIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEtleSszKTsKICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkszTFIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEtleSs0KTsKICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkszUlIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEtleSs1KTsgIAogICAgICB9CiAgICAgIAogICAgICAvKlNldCBJbml0aWFsaXphdGlvbiBWZWN0b3IgKElWKSovICAgIAogICAgICBpZiAoKGhjcnlwLT5Jbml0LkFsZ29yaXRobSA9PSBDUllQX0RFU19DQkMpIHx8IChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9UREVTX0NCQykpCiAgICAgIHsKICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPklWMExSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCk7CiAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5JVjBSUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QrMSk7CiAgICAgIH0KICAgICAgCiAgICAgIC8qIEZsdXNoIEZJRk8gKi8KICAgICAgSEFMX0NSWVBfRklGT19GTFVTSChoY3J5cCk7CiAgICAgIAogICAgICAvKiBTZXQgdGhlIHBoYXNlICovCiAgICAgIGhjcnlwLT5QaGFzZSA9IENSWVBfUEhBU0VfUFJPQ0VTUzsKICAgICAgCiAgICAgIC8qIFN0YXRydCBERVMvVERFUyBlbmNyeXB0aW9uIHByb2Nlc3MgKi8gICAgIAogICAgICBzdGF0dXMgPSBDUllQX1RERVNfUHJvY2VzcyhoY3J5cCxUaW1lb3V0KTsgICAgIAogICAgICBicmVhazsKICAgICAgCiAgICBjYXNlIENSWVBfQUVTX0VDQjoKICAgIGNhc2UgQ1JZUF9BRVNfQ0JDOgogICAgY2FzZSBDUllQX0FFU19DVFI6CiAgICAgIAogICAgICAvKiBBRVMgZW5jcnlwdGlvbiAqLyAgICAgICAKICAgICAgc3RhdHVzID0gQ1JZUF9BRVNfRW5jcnlwdChoY3J5cCwgVGltZW91dCk7CiAgICAgIGJyZWFrOyAgIAogICAgICAKICAgIGNhc2UgQ1JZUF9BRVNfR0NNOgogICAgICAKICAgICAgLyogQUVTIEdDTSBlbmNyeXB0aW9uICovICAgICAgIAogICAgICBzdGF0dXMgPSBDUllQX0FFU0dDTV9Qcm9jZXNzKGhjcnlwLCBUaW1lb3V0KTsKICAgICAgCiAgICAgIGJyZWFrOwogICAgICAKICAgIGNhc2UgQ1JZUF9BRVNfQ0NNOgogICAgICAKICAgICAgLyogQUVTIENDTSBlbmNyeXB0aW9uICovICAKICAgICAgc3RhdHVzID0gQ1JZUF9BRVNDQ01fUHJvY2VzcyhoY3J5cCxUaW1lb3V0KTsgICAgIAogICAgICBicmVhazsKICAgICAgIAogICAgZGVmYXVsdDoKICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9OT1RfU1VQUE9SVEVEOwogICAgICByZXR1cm4gSEFMX0VSUk9SOwogICAgfSAgICAgIAogICAgCiNlbHNlIC8qQUVTKi8KICAgIAogICAgLyogU2V0IHRoZSBvcGVyYXRpbmcgbW9kZSovCiAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIEFFU19DUl9NT0RFLCBDUllQX09QRVJBVElOR01PREVfRU5DUllQVCk7IAogICAgCiAgICAvKiBhbGdvIGdldCBhbGdvcml0aG0gc2VsZWN0ZWQgKi8gIAogICAgYWxnbyA9IGhjcnlwLT5JbnN0YW5jZS0+Q1IgJiBBRVNfQ1JfQ0hNT0Q7ICAKICAgIAogICAgc3dpdGNoKGFsZ28pCiAgICB7ICAgIAogICAgICAKICAgIGNhc2UgQ1JZUF9BRVNfRUNCOgogICAgY2FzZSBDUllQX0FFU19DQkM6CiAgICBjYXNlIENSWVBfQUVTX0NUUjoKICAgICAgCiAgICAgIC8qIEFFUyBlbmNyeXB0aW9uICovICAgICAgICAKICAgICAgc3RhdHVzID0gQ1JZUF9BRVNfRW5jcnlwdChoY3J5cCwgVGltZW91dCk7ICAgICAKICAgICAgYnJlYWs7ICAgCiAgICAgIAogICAgY2FzZSBDUllQX0FFU19HQ01fR01BQzoKICAgICAgCiAgICAgIC8qIEFFUyBHQ00gZW5jcnlwdGlvbiAqLyAgCiAgICAgIHN0YXR1cyA9IENSWVBfQUVTR0NNX1Byb2Nlc3MgKGhjcnlwLFRpbWVvdXQpIDsgIAogICAgICBicmVhazsKICAgICAgCiAgICBjYXNlIENSWVBfQUVTX0NDTToKICAgICAgCiAgICAgIC8qIEFFUyBDQ00gZW5jcnlwdGlvbiAqLyAKICAgICAgc3RhdHVzID0gQ1JZUF9BRVNDQ01fUHJvY2VzcyhoY3J5cCxUaW1lb3V0KTsgICAKICAgICAgYnJlYWs7CiAgICAgIAogICAgZGVmYXVsdDoKICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9OT1RfU1VQUE9SVEVEOwogICAgICByZXR1cm4gSEFMX0VSUk9SOwogICAgfQojZW5kaWYgLyplbmQgQUVTIG9yIENSWVAgKi8gICAKICAgIAogICAgaWYgKHN0YXR1cyA9PSBIQUxfT0spCiAgICB7IAogICAgICAvKiBDaGFuZ2UgdGhlIENSWVAgcGVyaXBoZXJhbCBzdGF0ZSAqLwogICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKICAgICAgCiAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKICAgIH0gICAgCiAgfQogIGVsc2UKICB7CiAgICAvKiBCdXN5IGVycm9yIGNvZGUgZmllbGQgKi8KICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfQlVTWTsgCiAgICByZXR1cm4gSEFMX0VSUk9SOwogIH0gCiAgCiAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLwogIHJldHVybiBIQUxfT0s7ICAKfQoKLyoqCiAgKiBAYnJpZWYgIERlY3J5cHRpb24gbW9kZS4KICAqIEBwYXJhbSAgaGNyeXA6IHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIENSWVAgbW9kdWxlCiAgKiBAcGFyYW0gIElucHV0OiBQb2ludGVyIHRvIHRoZSBpbnB1dCBidWZmZXIgKGNpcGhlcnRleHQgKQogICogQHBhcmFtICBTaXplOiBMZW5ndGggb2YgdGhlIHBsYWludGV4dCBidWZmZXIgaW4gd29yZC4KICAqIEBwYXJhbSAgT3V0cHV0OiBQb2ludGVyIHRvIHRoZSBvdXRwdXQgYnVmZmVyKHBsYWludGV4dCkKICAqIEBwYXJhbSAgVGltZW91dDogU3BlY2lmeSBUaW1lb3V0IHZhbHVlICAKICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICovCkhBTF9TdGF0dXNUeXBlRGVmIEhBTF9DUllQX0RlY3J5cHQoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgdWludDMyX3QgKklucHV0LCB1aW50MTZfdCBTaXplLCB1aW50MzJfdCAqT3V0cHV0LCB1aW50MzJfdCBUaW1lb3V0KQp7CiAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzOwogIHVpbnQzMl90IGFsZ287IAogIAogIGlmKGhjcnlwLT5TdGF0ZSA9PSBIQUxfQ1JZUF9TVEFURV9SRUFEWSkKICB7CiAgICAvKiBDaGFuZ2Ugc3RhdGUgQnVzeSAqLwogICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfQlVTWTsKICAgIAogICAgLyogUHJvY2VzcyBsb2NrZWQgKi8KICAgIF9fSEFMX0xPQ0soaGNyeXApOyAKICAgIAogICAgLyogIFJlc2V0IENyeXBJbkNvdW50LCBDcnlwT3V0Q291bnQgYW5kIEluaXRpYWxpemUgcENyeXBJbkJ1ZmZQdHIgYW5kIHBDcnlwT3V0QnVmZlB0ciAgcGFyYW1ldGVycyovCiAgICBoY3J5cC0+Q3J5cEluQ291bnQgPSAwVTsKICAgIGhjcnlwLT5DcnlwT3V0Q291bnQgPSAwVTsKICAgIGhjcnlwLT5wQ3J5cEluQnVmZlB0ciA9IElucHV0OwogICAgaGNyeXAtPnBDcnlwT3V0QnVmZlB0ciA9IE91dHB1dDsKICAgIAogICAgLyogIENhbGN1bGF0ZSBTaXplIHBhcmFtZXRlciBpbiBCeXRlKi8KICAgIGlmIChoY3J5cC0+SW5pdC5EYXRhV2lkdGhVbml0ID09IENSWVBfREFUQVdJRFRIVU5JVF9XT1JEKQogICAgewogICAgICBoY3J5cC0+U2l6ZSA9IFNpemUgKiA0VTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgaGNyeXAtPlNpemUgPSBTaXplOwkKICAgIH0KICAgIAojaWYgZGVmaW5lZCAoQ1JZUCkKICAgIAogICAgLyogU2V0IERlY3J5cHRpb24gb3BlcmF0aW5nIG1vZGUqLwogICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBDUllQX0NSX0FMR09ESVIsIENSWVBfT1BFUkFUSU5HTU9ERV9ERUNSWVBUKTsKICAgIAogICAgLyogYWxnbyBnZXQgYWxnb3JpdGhtIHNlbGVjdGVkICovICAgCiAgICBhbGdvID0gaGNyeXAtPkluc3RhbmNlLT5DUiAmIENSWVBfQ1JfQUxHT01PREU7CiAgICAKICAgIHN3aXRjaChhbGdvKQogICAgeyAgICAKICAgIGNhc2UgQ1JZUF9ERVNfRUNCOgogICAgY2FzZSBDUllQX0RFU19DQkM6CiAgICBjYXNlIENSWVBfVERFU19FQ0I6CiAgICBjYXNlIENSWVBfVERFU19DQkM6CiAgICAgIAogICAgICAvKlNldCBLZXkgKi8KICAgICAgaGNyeXAtPkluc3RhbmNlLT5LMUxSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBLZXkpOwogICAgICBoY3J5cC0+SW5zdGFuY2UtPksxUlIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEtleSsxKTsKICAgICAgaWYgKChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9UREVTX0VDQikgfHwgKGhjcnlwLT5Jbml0LkFsZ29yaXRobSA9PSBDUllQX1RERVNfQ0JDKSkKICAgICAgewogICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SzJMUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wS2V5KzIpOwogICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SzJSUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wS2V5KzMpOwogICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SzNMUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wS2V5KzQpOwogICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SzNSUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wS2V5KzUpOyAgCiAgICAgIH0KICAgICAgCiAgICAgIC8qU2V0IEluaXRpYWxpemF0aW9uIFZlY3RvciAoSVYpKi8gICAKICAgICAgaWYgKChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9ERVNfQ0JDKSB8fCAoaGNyeXAtPkluaXQuQWxnb3JpdGhtID09IENSWVBfVERFU19DQkMpKQogICAgICB7CiAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5JVjBMUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QpOwogICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYwUlIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEluaXRWZWN0KzEpOwogICAgICB9CiAgICAgIAogICAgICAvKiBGbHVzaCBGSUZPICovCiAgICAgIEhBTF9DUllQX0ZJRk9fRkxVU0goaGNyeXApOwogICAgICAKICAgICAgLyogU2V0IHRoZSBwaGFzZSAqLwogICAgICBoY3J5cC0+UGhhc2UgPSBDUllQX1BIQVNFX1BST0NFU1M7CiAgICAgIAogICAgICAvKiBTdGFydCBERVMvVERFUyBkZWNyeXB0aW9uIHByb2Nlc3MgKi8gIAogICAgICBzdGF0dXMgPSBDUllQX1RERVNfUHJvY2VzcyhoY3J5cCwgVGltZW91dCk7CiAgICAgIAogICAgICBicmVhazsKICAgICAgCiAgICBjYXNlIENSWVBfQUVTX0VDQjoKICAgIGNhc2UgQ1JZUF9BRVNfQ0JDOgogICAgY2FzZSBDUllQX0FFU19DVFI6CiAgICAgIAogICAgICAvKiBBRVMgZGVjcnlwdGlvbiAqLyAgIAogICAgICBzdGF0dXMgPSBDUllQX0FFU19EZWNyeXB0KGhjcnlwLCBUaW1lb3V0KTsKICAgICAgYnJlYWs7ICAgCiAgICAgIAogICAgY2FzZSBDUllQX0FFU19HQ006CiAgICAgIAogICAgICAvKiBBRVMgR0NNIGRlY3J5cHRpb24gKi8gICAgICAgCiAgICAgIHN0YXR1cyA9IENSWVBfQUVTR0NNX1Byb2Nlc3MgKGhjcnlwLCBUaW1lb3V0KSA7ICAgCiAgICAgIGJyZWFrOwogICAgICAKICAgIGNhc2UgQ1JZUF9BRVNfQ0NNOgogICAgICAKICAgICAgLyogQUVTIENDTSBkZWNyeXB0aW9uICovIAogICAgICBzdGF0dXMgPSBDUllQX0FFU0NDTV9Qcm9jZXNzKGhjcnlwLCBUaW1lb3V0KTsgCiAgICAgIGJyZWFrOwogICAgICAgCiAgICBkZWZhdWx0OgogICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX05PVF9TVVBQT1JURUQ7CiAgICAgIHJldHVybiBIQUxfRVJST1I7CiAgICB9ICAgICAgCiAgICAKI2Vsc2UgLypBRVMqLwogICAgCiAgICAvKiBTZXQgRGVjcnlwdGlvbiBvcGVyYXRpbmcgbW9kZSovCiAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIEFFU19DUl9NT0RFLCBDUllQX09QRVJBVElOR01PREVfREVDUllQVCk7ICAgIAogICAgCiAgICAvKiBhbGdvIGdldCBhbGdvcml0aG0gc2VsZWN0ZWQgKi8gIAogICAgYWxnbyA9IGhjcnlwLT5JbnN0YW5jZS0+Q1IgJiBBRVNfQ1JfQ0hNT0Q7CiAgICAKICAgIHN3aXRjaChhbGdvKQogICAgeyAgICAKICAgICAgCiAgICBjYXNlIENSWVBfQUVTX0VDQjoKICAgIGNhc2UgQ1JZUF9BRVNfQ0JDOgogICAgY2FzZSBDUllQX0FFU19DVFI6CiAgICAgIAogICAgICAvKiBBRVMgZGVjcnlwdGlvbiAqLyAKICAgICAgc3RhdHVzID0gQ1JZUF9BRVNfRGVjcnlwdChoY3J5cCwgVGltZW91dCk7CiAgICAgIGJyZWFrOyAgIAogICAgICAKICAgIGNhc2UgQ1JZUF9BRVNfR0NNX0dNQUM6CiAgICAgIAogICAgICAvKiBBRVMgR0NNIGRlY3J5cHRpb24gKi8gICAKICAgICAgc3RhdHVzID0gQ1JZUF9BRVNHQ01fUHJvY2VzcyAoaGNyeXAsIFRpbWVvdXQpIDsgIAogICAgICBicmVhazsKICAgICAgCiAgICBjYXNlIENSWVBfQUVTX0NDTToKICAgICAgCiAgICAgIC8qIEFFUyBDQ00gZGVjcnlwdGlvbiAqLyAKICAgICAgc3RhdHVzID0gQ1JZUF9BRVNDQ01fUHJvY2VzcyhoY3J5cCwgVGltZW91dCk7ICAgIAogICAgICBicmVhazsKICAgICAgCiAgICBkZWZhdWx0OgogICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX05PVF9TVVBQT1JURUQ7CiAgICAgIHJldHVybiBIQUxfRVJST1I7CiAgICB9CiNlbmRpZiAvKiBFbmQgQUVTIG9yIENSWVAgKi8gCiAgICAKICAgIGlmIChzdGF0dXMgPT0gSEFMX09LKQogICAgeyAKICAgICAgLyogQ2hhbmdlIHRoZSBDUllQIHBlcmlwaGVyYWwgc3RhdGUgKi8KICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CiAgICAgIAogICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCiAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CiAgICB9ICAgIAogIH0KICBlbHNlCiAgewogICAgLyogQnVzeSBlcnJvciBjb2RlIGZpZWxkICovCiAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX0JVU1k7IAogICAgcmV0dXJuIEhBTF9FUlJPUjsKICB9CiAgCiAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLwogIHJldHVybiBIQUxfT0s7ICAKfQoKLyoqCiAgKiBAYnJpZWYgIEVuY3J5cHRpb24gaW4gaW50ZXJydXB0IG1vZGUuCiAgKiBAcGFyYW0gIGhjcnlwOiBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCiAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZQogICogQHBhcmFtICBJbnB1dDogUG9pbnRlciB0byB0aGUgaW5wdXQgYnVmZmVyIChwbGFpbnRleHQpCiAgKiBAcGFyYW0gIFNpemU6IExlbmd0aCBvZiB0aGUgcGxhaW50ZXh0IGJ1ZmZlciBpbiB3b3JkCiAgKiBAcGFyYW0gIE91dHB1dDogUG9pbnRlciB0byB0aGUgb3V0cHV0IGJ1ZmZlcihjaXBoZXJ0ZXh0KQogICogQHJldHZhbCBIQUwgc3RhdHVzCiAgKi8KSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NSWVBfRW5jcnlwdF9JVChDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50MzJfdCAqSW5wdXQsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90ICpPdXRwdXQpCnsKICB1aW50MzJfdCBhbGdvOyAKICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CiAgCiAgaWYoaGNyeXAtPlN0YXRlID09IEhBTF9DUllQX1NUQVRFX1JFQURZKQogIHsKICAgIC8qIENoYW5nZSBzdGF0ZSBCdXN5ICovCiAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9CVVNZOwogICAgCiAgICAvKiBQcm9jZXNzIGxvY2tlZCAqLwogICAgX19IQUxfTE9DSyhoY3J5cCk7CiAgICAKICAgIC8qICBSZXNldCBDcnlwSW5Db3VudCwgQ3J5cE91dENvdW50IGFuZCBJbml0aWFsaXplIHBDcnlwSW5CdWZmUHRyIGFuZCBwQ3J5cE91dEJ1ZmZQdHIgcGFyYW1ldGVycyovCiAgICBoY3J5cC0+Q3J5cEluQ291bnQgPSAwVTsKICAgIGhjcnlwLT5DcnlwT3V0Q291bnQgPSAwVTsKICAgIGhjcnlwLT5wQ3J5cEluQnVmZlB0ciA9IElucHV0OwogICAgaGNyeXAtPnBDcnlwT3V0QnVmZlB0ciA9IE91dHB1dDsgIAogICAgCiAgICAvKiAgQ2FsY3VsYXRlIFNpemUgcGFyYW1ldGVyIGluIEJ5dGUqLwogICAgaWYgKGhjcnlwLT5Jbml0LkRhdGFXaWR0aFVuaXQgPT0gQ1JZUF9EQVRBV0lEVEhVTklUX1dPUkQpCiAgICB7CiAgICAgIGhjcnlwLT5TaXplID0gU2l6ZSAqIDRVOwogICAgfQogICAgZWxzZQogICAgewogICAgICBoY3J5cC0+U2l6ZSA9IFNpemU7CQogICAgfQogICAgCiNpZiBkZWZpbmVkIChDUllQKQogICAgCiAgICAvKiBTZXQgZW5jcnlwdGlvbiBvcGVyYXRpbmcgbW9kZSovICAgCiAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIENSWVBfQ1JfQUxHT0RJUiwgQ1JZUF9PUEVSQVRJTkdNT0RFX0VOQ1JZUFQpOyAKICAgIAogICAgLyogYWxnbyBnZXQgYWxnb3JpdGhtIHNlbGVjdGVkICovICAKICAgIGFsZ28gPSAoaGNyeXAtPkluc3RhbmNlLT5DUiAmIENSWVBfQ1JfQUxHT01PREUpOwogICAgCiAgICBzd2l0Y2goYWxnbykKICAgIHsgICAgCiAgICBjYXNlIENSWVBfREVTX0VDQjoKICAgIGNhc2UgQ1JZUF9ERVNfQ0JDOgogICAgY2FzZSBDUllQX1RERVNfRUNCOgogICAgY2FzZSBDUllQX1RERVNfQ0JDOgogICAgICAKICAgICAgLypTZXQgS2V5ICovCiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SzFMUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wS2V5KTsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5LMVJSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBLZXkrMSk7CiAgICAgIGlmICgoaGNyeXAtPkluaXQuQWxnb3JpdGhtID09IENSWVBfVERFU19FQ0IpIHx8IChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9UREVTX0NCQykpCiAgICAgIHsKICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPksyTFIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEtleSsyKTsKICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPksyUlIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEtleSszKTsKICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkszTFIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEtleSs0KTsKICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkszUlIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEtleSs1KTsgIAogICAgICB9CiAgICAgIC8qIFNldCB0aGUgSW5pdGlhbGl6YXRpb24gVmVjdG9yKi8KICAgICAgaWYgKChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9ERVNfQ0JDKSB8fCAoaGNyeXAtPkluaXQuQWxnb3JpdGhtID09IENSWVBfVERFU19DQkMpKQogICAgICB7CiAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5JVjBMUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QpOwogICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYwUlIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEluaXRWZWN0KzEpOwogICAgICB9CiAgICAgIAogICAgICAvKiBGbHVzaCBGSUZPICovCiAgICAgIEhBTF9DUllQX0ZJRk9fRkxVU0goaGNyeXApOwogICAgICAKICAgICAgLyogU2V0IHRoZSBwaGFzZSAqLwogICAgICBoY3J5cC0+UGhhc2UgPSBDUllQX1BIQVNFX1BST0NFU1M7CiAgICAgIAogICAgICAvKiBFbmFibGUgaW50ZXJydXB0cyAqLwogICAgICBfX0hBTF9DUllQX0VOQUJMRV9JVChoY3J5cCwgQ1JZUF9JVF9JTkkgfCBDUllQX0lUX09VVEkpOwogICAgICAKICAgICAgLyogRW5hYmxlIENSWVAgdG8gc3RhcnQgREVTL1RERVMgcHJvY2VzcyovCiAgICAgIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsgICAgICAKICAgICAgYnJlYWs7CiAgICAgIAogICAgY2FzZSBDUllQX0FFU19FQ0I6CiAgICBjYXNlIENSWVBfQUVTX0NCQzoKICAgIGNhc2UgQ1JZUF9BRVNfQ1RSOgogICAgICAKICAgICAgc3RhdHVzID0gQ1JZUF9BRVNfRW5jcnlwdF9JVChoY3J5cCk7CiAgICAgIGJyZWFrOyAgIAogICAgICAKICAgIGNhc2UgQ1JZUF9BRVNfR0NNOgogICAgICAKICAgICAgc3RhdHVzID0gQ1JZUF9BRVNHQ01fUHJvY2Vzc19JVCAoaGNyeXApIDsgIAogICAgICBicmVhazsKICAgICAgCiAgICBjYXNlIENSWVBfQUVTX0NDTToKICAgICAgCiAgICAgIHN0YXR1cyA9IENSWVBfQUVTQ0NNX1Byb2Nlc3NfSVQoaGNyeXApOyAgCiAgICAgIGJyZWFrOwogICAgIAogICAgZGVmYXVsdDoKICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9OT1RfU1VQUE9SVEVEOwogICAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOyAgIAogICAgICBicmVhazsKICAgIH0KICAgIAojZWxzZSAvKiBBRVMgKi8KICAgIAogICAgLyogU2V0IGVuY3J5cHRpb24gb3BlcmF0aW5nIG1vZGUqLwogICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfTU9ERSwgQ1JZUF9PUEVSQVRJTkdNT0RFX0VOQ1JZUFQpOyAKICAgIAogICAgLyogYWxnbyBnZXQgYWxnb3JpdGhtIHNlbGVjdGVkICovICAKICAgIGFsZ28gPSBoY3J5cC0+SW5zdGFuY2UtPkNSICYgQUVTX0NSX0NITU9EOwogICAgCiAgICBzd2l0Y2goYWxnbykKICAgIHsgICAgICAgICAKICAgIGNhc2UgQ1JZUF9BRVNfRUNCOgogICAgY2FzZSBDUllQX0FFU19DQkM6CiAgICBjYXNlIENSWVBfQUVTX0NUUjoKICAgICAgCiAgICAgIC8qIEFFUyBlbmNyeXB0aW9uICovICAKICAgICAgc3RhdHVzID0gQ1JZUF9BRVNfRW5jcnlwdF9JVChoY3J5cCk7CiAgICAgIGJyZWFrOyAgIAogICAgICAKICAgIGNhc2UgQ1JZUF9BRVNfR0NNX0dNQUM6CiAgICAgIAogICAgICAvKiBBRVMgR0NNIGVuY3J5cHRpb24gKi8gIAogICAgICBzdGF0dXMgPSBDUllQX0FFU0dDTV9Qcm9jZXNzX0lUIChoY3J5cCkgOyAgCiAgICAgIGJyZWFrOwogICAgICAKICAgIGNhc2UgQ1JZUF9BRVNfQ0NNOgogICAgICAKICAgICAgLyogQUVTIENDTSBlbmNyeXB0aW9uICovICAKICAgICAgc3RhdHVzID0gQ1JZUF9BRVNDQ01fUHJvY2Vzc19JVChoY3J5cCk7IAogICAgICBicmVhazsKICAgICAgCiAgICBkZWZhdWx0OgogICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX05PVF9TVVBQT1JURUQ7CiAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CiAgICAgIGJyZWFrOwogICAgfQojZW5kaWYgLyplbmQgQUVTIG9yIENSWVAqLyAKICAgIAogIH0KICBlbHNlCiAgewogICAgLyogQnVzeSBlcnJvciBjb2RlIGZpZWxkICovCiAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX0JVU1k7IAogICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKICB9IAogIAogIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KICByZXR1cm4gc3RhdHVzOyAgCn0KCi8qKgogICogQGJyaWVmICBEZWNyeXB0aW9uIGluIGl0bnRlcnJ1cHQgbW9kZS4KICAqIEBwYXJhbSAgaGNyeXA6IHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIENSWVAgbW9kdWxlCiAgKiBAcGFyYW0gIElucHV0OiBQb2ludGVyIHRvIHRoZSBpbnB1dCBidWZmZXIgKGNpcGhlcnRleHQgKQogICogQHBhcmFtICBTaXplOiBMZW5ndGggb2YgdGhlIHBsYWludGV4dCBidWZmZXIgaW4gd29yZC4KICAqIEBwYXJhbSAgT3V0cHV0OiBQb2ludGVyIHRvIHRoZSBvdXRwdXQgYnVmZmVyKHBsYWludGV4dCkKICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICovCkhBTF9TdGF0dXNUeXBlRGVmIEhBTF9DUllQX0RlY3J5cHRfSVQoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgdWludDMyX3QgKklucHV0LCB1aW50MTZfdCBTaXplLCB1aW50MzJfdCAqT3V0cHV0KQp7CiAgdWludDMyX3QgYWxnbzsKICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CiAgCiAgaWYoaGNyeXAtPlN0YXRlID09IEhBTF9DUllQX1NUQVRFX1JFQURZKQogIHsgIAogICAgLyogQ2hhbmdlIHN0YXRlIEJ1c3kgKi8KICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX0JVU1k7CiAgICAKICAgIC8qIFByb2Nlc3MgbG9ja2VkICovCiAgICBfX0hBTF9MT0NLKGhjcnlwKTsgIAogICAgCiAgICAvKiAgUmVzZXQgQ3J5cEluQ291bnQsIENyeXBPdXRDb3VudCBhbmQgSW5pdGlhbGl6ZSBwQ3J5cEluQnVmZlB0ciBhbmQgcENyeXBPdXRCdWZmUHRyIHBhcmFtZXRlcnMqLwogICAgaGNyeXAtPkNyeXBJbkNvdW50ID0gMFU7CiAgICBoY3J5cC0+Q3J5cE91dENvdW50ID0gMFU7CiAgICBoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgPSBJbnB1dDsKICAgIGhjcnlwLT5wQ3J5cE91dEJ1ZmZQdHIgPSBPdXRwdXQ7CiAgICAKICAgIC8qICBDYWxjdWxhdGUgU2l6ZSBwYXJhbWV0ZXIgaW4gQnl0ZSovCiAgICBpZiAoaGNyeXAtPkluaXQuRGF0YVdpZHRoVW5pdCA9PSBDUllQX0RBVEFXSURUSFVOSVRfV09SRCkKICAgIHsKICAgICAgaGNyeXAtPlNpemUgPSBTaXplICogNFU7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgIGhjcnlwLT5TaXplID0gU2l6ZTsJCiAgICB9CiAgICAKI2lmIGRlZmluZWQgKENSWVApCiAgICAKICAgIC8qIFNldCBkZWNyeXB0aW9uIG9wZXJhdGluZyBtb2RlKi8KICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQ1JZUF9DUl9BTEdPRElSLENSWVBfT1BFUkFUSU5HTU9ERV9ERUNSWVBUKTsKICAgIAogICAgLyogYWxnbyBnZXQgYWxnb3JpdGhtIHNlbGVjdGVkICovICAgICAKICAgIGFsZ28gPSBoY3J5cC0+SW5zdGFuY2UtPkNSICYgQ1JZUF9DUl9BTEdPTU9ERTsKICAgIAogICAgc3dpdGNoKGFsZ28pCiAgICB7ICAgIAogICAgY2FzZSBDUllQX0RFU19FQ0I6CiAgICBjYXNlIENSWVBfREVTX0NCQzoKICAgIGNhc2UgQ1JZUF9UREVTX0VDQjoKICAgIGNhc2UgQ1JZUF9UREVTX0NCQzoKICAgICAgCiAgICAgIC8qU2V0IEtleSAqLwogICAgICBoY3J5cC0+SW5zdGFuY2UtPksxTFIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEtleSk7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SzFSUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wS2V5KzEpOwogICAgICBpZiAoKGhjcnlwLT5Jbml0LkFsZ29yaXRobSA9PSBDUllQX1RERVNfRUNCKSB8fCAoaGNyeXAtPkluaXQuQWxnb3JpdGhtID09IENSWVBfVERFU19DQkMpKQogICAgICB7CiAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5LMkxSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBLZXkrMik7CiAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5LMlJSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBLZXkrMyk7CiAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5LM0xSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBLZXkrNCk7CiAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5LM1JSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBLZXkrNSk7ICAKICAgICAgfQogICAgICAKICAgICAgLyogU2V0IHRoZSBJbml0aWFsaXphdGlvbiBWZWN0b3IqLwogICAgICBpZiAoKGhjcnlwLT5Jbml0LkFsZ29yaXRobSA9PSBDUllQX0RFU19DQkMpIHx8IChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9UREVTX0NCQykpCiAgICAgIHsKICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPklWMExSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCk7CiAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5JVjBSUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QrMSk7CiAgICAgIH0KICAgICAgLyogRmx1c2ggRklGTyAqLwogICAgICBIQUxfQ1JZUF9GSUZPX0ZMVVNIKGhjcnlwKTsKICAgICAgCiAgICAgIC8qIFNldCB0aGUgcGhhc2UgKi8KICAgICAgaGNyeXAtPlBoYXNlID0gQ1JZUF9QSEFTRV9QUk9DRVNTOwogICAgICAKICAgICAgLyogRW5hYmxlIGludGVycnVwdHMgKi8KICAgICAgX19IQUxfQ1JZUF9FTkFCTEVfSVQoaGNyeXAsIENSWVBfSVRfSU5JIHwgQ1JZUF9JVF9PVVRJKTsKICAgICAgCiAgICAgIC8qIEVuYWJsZSBDUllQIGFuZCBzdGFydCBERVMvVERFUyBwcm9jZXNzKi8KICAgICAgX19IQUxfQ1JZUF9FTkFCTEUoaGNyeXApOyAKICAgICAgCiAgICAgIGJyZWFrOwogICAgICAKICAgIGNhc2UgQ1JZUF9BRVNfRUNCOgogICAgY2FzZSBDUllQX0FFU19DQkM6CiAgICBjYXNlIENSWVBfQUVTX0NUUjoKICAgICAgCiAgICAgIC8qIEFFUyBkZWNyeXB0aW9uICovIAogICAgICBzdGF0dXMgPSBDUllQX0FFU19EZWNyeXB0X0lUKGhjcnlwKTsKICAgICAgYnJlYWs7ICAgCiAgICAgIAogICAgY2FzZSBDUllQX0FFU19HQ006CiAgICAgIAogICAgICAvKiBBRVMgR0NNIGRlY3J5cHRpb24gKi8gCiAgICAgIHN0YXR1cyA9IENSWVBfQUVTR0NNX1Byb2Nlc3NfSVQgKGhjcnlwKSA7CiAgICAgIGJyZWFrOwogICAgICAKICAgIGNhc2UgQ1JZUF9BRVNfQ0NNOgogICAgICAKICAgICAgLyogQUVTIENDTWRlY3J5cHRpb24gKi8gCiAgICAgIHN0YXR1cyA9IENSWVBfQUVTQ0NNX1Byb2Nlc3NfSVQoaGNyeXApOyAgCiAgICAgIGJyZWFrOwogICAgICAKICAgIGRlZmF1bHQ6CiAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfTk9UX1NVUFBPUlRFRDsKICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKICAgICAgYnJlYWs7IAogICAgfQogICAgCiNlbHNlIC8qQUVTKi8KICAgIAogICAgLyogU2V0IGRlY3J5cHRpb24gb3BlcmF0aW5nIG1vZGUqLwogICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfTU9ERSwgQ1JZUF9PUEVSQVRJTkdNT0RFX0RFQ1JZUFQpOyAKICAgIAogICAgLyogYWxnbyBnZXQgYWxnb3JpdGhtIHNlbGVjdGVkICovICAKICAgIGFsZ28gPSBoY3J5cC0+SW5zdGFuY2UtPkNSICYgQUVTX0NSX0NITU9EOwogICAgCiAgICBzd2l0Y2goYWxnbykKICAgIHsgICAgICAgIAogICAgY2FzZSBDUllQX0FFU19FQ0I6CiAgICBjYXNlIENSWVBfQUVTX0NCQzoKICAgIGNhc2UgQ1JZUF9BRVNfQ1RSOgogICAgICAKICAgICAgLyogQUVTIGRlY3J5cHRpb24gKi8gCiAgICAgIHN0YXR1cyA9IENSWVBfQUVTX0RlY3J5cHRfSVQoaGNyeXApOwogICAgICBicmVhazsgICAKICAgICAgCiAgICBjYXNlIENSWVBfQUVTX0dDTV9HTUFDOgogICAgICAKICAgICAgLyogQUVTIEdDTSBkZWNyeXB0aW9uICovIAogICAgICBzdGF0dXMgPSBDUllQX0FFU0dDTV9Qcm9jZXNzX0lUIChoY3J5cCkgOyAgICAKICAgICAgYnJlYWs7CiAgICAgIAogICAgY2FzZSBDUllQX0FFU19DQ006CiAgICAgIAogICAgICAvKiBBRVMgQ0NNIGRlY3J5cHRpb24gKi8gCiAgICAgIHN0YXR1cyA9IENSWVBfQUVTQ0NNX1Byb2Nlc3NfSVQoaGNyeXApOyAKICAgICAgYnJlYWs7CiAgICAgIAogICAgZGVmYXVsdDoKICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9OT1RfU1VQUE9SVEVEOwogICAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOwogICAgICBicmVhazsKICAgIH0KI2VuZGlmIC8qIEVuZCBBRVMgb3IgQ1JZUCAqLyAgCiAgICAKICB9CiAgZWxzZQogIHsKICAgIC8qIEJ1c3kgZXJyb3IgY29kZSBmaWVsZCAqLwogICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9CVVNZOyAKICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CiAgfSAKICAKICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCiAgcmV0dXJuIHN0YXR1czsgIAp9CgovKioKICAqIEBicmllZiAgRW5jcnlwdGlvbiBpbiBETUEgbW9kZS4KICAqIEBwYXJhbSAgaGNyeXA6IHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIENSWVAgbW9kdWxlCiAgKiBAcGFyYW0gIElucHV0OiBQb2ludGVyIHRvIHRoZSBpbnB1dCBidWZmZXIgKHBsYWludGV4dCkKICAqIEBwYXJhbSAgU2l6ZTogTGVuZ3RoIG9mIHRoZSBwbGFpbnRleHQgYnVmZmVyIGluIHdvcmQuCiAgKiBAcGFyYW0gIE91dHB1dDogUG9pbnRlciB0byB0aGUgb3V0cHV0IGJ1ZmZlcihjaXBoZXJ0ZXh0KQogICogQHJldHZhbCBIQUwgc3RhdHVzCiAgKi8KSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NSWVBfRW5jcnlwdF9ETUEoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgdWludDMyX3QgKklucHV0LCB1aW50MTZfdCBTaXplLCB1aW50MzJfdCAqT3V0cHV0KQp7CiAgdWludDMyX3QgYWxnbzsgCiAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOwogIAogIGlmKGhjcnlwLT5TdGF0ZSA9PSBIQUxfQ1JZUF9TVEFURV9SRUFEWSkKICB7CiAgICAvKiBDaGFuZ2Ugc3RhdGUgQnVzeSAqLwogICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfQlVTWTsKICAgIAogICAgLyogUHJvY2VzcyBsb2NrZWQgKi8KICAgIF9fSEFMX0xPQ0soaGNyeXApOwogICAgCiAgICAvKiAgUmVzZXQgQ3J5cEluQ291bnQsIENyeXBPdXRDb3VudCBhbmQgSW5pdGlhbGl6ZSBwQ3J5cEluQnVmZlB0ciBhbmQgcENyeXBPdXRCdWZmUHRyIHBhcmFtZXRlcnMqLwogICAgaGNyeXAtPkNyeXBJbkNvdW50ID0gMFU7CiAgICBoY3J5cC0+Q3J5cE91dENvdW50ID0gMFU7CiAgICBoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgPSBJbnB1dDsKICAgIGhjcnlwLT5wQ3J5cE91dEJ1ZmZQdHIgPSBPdXRwdXQ7CiAgICAKICAgIC8qICBDYWxjdWxhdGUgU2l6ZSBwYXJhbWV0ZXIgaW4gQnl0ZSovCiAgICBpZiAoaGNyeXAtPkluaXQuRGF0YVdpZHRoVW5pdCA9PSBDUllQX0RBVEFXSURUSFVOSVRfV09SRCkKICAgIHsKICAgICAgaGNyeXAtPlNpemUgPSBTaXplICogNFU7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgIGhjcnlwLT5TaXplID0gU2l6ZTsJCiAgICB9CiAgICAKI2lmIGRlZmluZWQgKENSWVApCiAgICAKICAgIC8qIFNldCBlbmNyeXB0aW9uIG9wZXJhdGluZyBtb2RlKi8gICAKICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQ1JZUF9DUl9BTEdPRElSLCBDUllQX09QRVJBVElOR01PREVfRU5DUllQVCk7IAogICAgCiAgICAvKiBhbGdvIGdldCBhbGdvcml0aG0gc2VsZWN0ZWQgKi8gIAogICAgYWxnbyA9IGhjcnlwLT5JbnN0YW5jZS0+Q1IgJiBDUllQX0NSX0FMR09NT0RFOwogICAgCiAgICBzd2l0Y2goYWxnbykKICAgIHsgICAgCiAgICBjYXNlIENSWVBfREVTX0VDQjoKICAgIGNhc2UgQ1JZUF9ERVNfQ0JDOgogICAgY2FzZSBDUllQX1RERVNfRUNCOgogICAgY2FzZSBDUllQX1RERVNfQ0JDOgogICAgICAKICAgICAgLypTZXQgS2V5ICovCiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SzFMUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wS2V5KTsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5LMVJSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBLZXkrMSk7CiAgICAgIGlmICgoaGNyeXAtPkluaXQuQWxnb3JpdGhtID09IENSWVBfVERFU19FQ0IpIHx8IChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9UREVTX0NCQykpCiAgICAgIHsKICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPksyTFIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEtleSsyKTsKICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPksyUlIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEtleSszKTsKICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkszTFIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEtleSs0KTsKICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkszUlIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEtleSs1KTsgIAogICAgICB9CiAgICAgIAogICAgICAvKiBTZXQgdGhlIEluaXRpYWxpemF0aW9uIFZlY3RvciovCiAgICAgIGlmICgoaGNyeXAtPkluaXQuQWxnb3JpdGhtID09IENSWVBfREVTX0NCQykgfHwgKGhjcnlwLT5Jbml0LkFsZ29yaXRobSA9PSBDUllQX1RERVNfQ0JDKSkKICAgICAgewogICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYwTFIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEluaXRWZWN0KTsKICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPklWMFJSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCsxKTsKICAgICAgfQogICAgICAKICAgICAgLyogRmx1c2ggRklGTyAqLwogICAgICBIQUxfQ1JZUF9GSUZPX0ZMVVNIKGhjcnlwKTsKICAgICAgCiAgICAgIC8qIFNldCB0aGUgcGhhc2UgKi8KICAgICAgaGNyeXAtPlBoYXNlID0gQ1JZUF9QSEFTRV9QUk9DRVNTOwogICAgICAKICAgICAgLyogU3RhcnQgRE1BIHByb2Nlc3MgdHJhbnNmZXIgZm9yIERFUy9UREVTICovIAogICAgICBDUllQX1NldERNQUNvbmZpZyhoY3J5cCwgKHVpbnQzMl90KSggaGNyeXAtPnBDcnlwSW5CdWZmUHRyKSwgKCh1aW50MTZfdCkoaGNyeXAtPlNpemUpLzRVKSwgKHVpbnQzMl90KShoY3J5cC0+cENyeXBPdXRCdWZmUHRyKSk7ICAgICAKICAgICAgYnJlYWs7CiAgICAgIAogICAgY2FzZSBDUllQX0FFU19FQ0I6CiAgICBjYXNlIENSWVBfQUVTX0NCQzoKICAgIGNhc2UgQ1JZUF9BRVNfQ1RSOgogICAgICAKICAgICAgLyogIFNldCB0aGUgS2V5Ki8KICAgICAgQ1JZUF9TZXRLZXkoaGNyeXAsIGhjcnlwLT5Jbml0LktleVNpemUpOwogICAgICAKICAgICAgLyogU2V0IHRoZSBJbml0aWFsaXphdGlvbiBWZWN0b3IgSVYgKi8KICAgICAgaWYgKGhjcnlwLT5Jbml0LkFsZ29yaXRobSAhPSBDUllQX0FFU19FQ0IpCiAgICAgIHsKICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPklWMExSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCk7CiAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5JVjBSUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QrMSk7CiAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5JVjFMUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QrMik7CiAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5JVjFSUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QrMyk7CiAgICAgIH0gICAgIAogICAgICAvKiBTZXQgdGhlIHBoYXNlICovCiAgICAgIGhjcnlwLT5QaGFzZSA9IENSWVBfUEhBU0VfUFJPQ0VTUzsgIAogICAgICAKICAgICAgLyogU3RhcnQgRE1BIHByb2Nlc3MgdHJhbnNmZXIgZm9yIEFFUyAqLyAKICAgICAgQ1JZUF9TZXRETUFDb25maWcoaGNyeXAsICh1aW50MzJfdCkoIGhjcnlwLT5wQ3J5cEluQnVmZlB0ciksICgodWludDE2X3QpKGhjcnlwLT5TaXplKS80VSksICh1aW50MzJfdCkoaGNyeXAtPnBDcnlwT3V0QnVmZlB0cikpOyAgICAgICAgICAgIAogICAgICBicmVhazsgICAKICAgICAgCiAgICBjYXNlIENSWVBfQUVTX0dDTTogICAgCiAgICAgIC8qIEFFUyBHQ00gZW5jcnlwdGlvbiAqLyAKICAgICAgc3RhdHVzID0gQ1JZUF9BRVNHQ01fUHJvY2Vzc19ETUEgKGhjcnlwKSA7ICAKICAgICAgYnJlYWs7CiAgICAgIAogICAgY2FzZSBDUllQX0FFU19DQ006ICAgICAgCiAgICAgIC8qIEFFUyBDQ00gZW5jcnlwdGlvbiAqLyAKICAgICAgc3RhdHVzID0gQ1JZUF9BRVNDQ01fUHJvY2Vzc19ETUEoaGNyeXApOyAgICAgICAKICAgICAgYnJlYWs7CiAgICAgIAogICAgZGVmYXVsdDoKICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9OT1RfU1VQUE9SVEVEOwogICAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOwogICAgICBicmVhazsKICAgIH0KICAgIAojZWxzZSAvKkFFUyovIAogICAgLyogU2V0IGVuY3J5cHRpb24gb3BlcmF0aW5nIG1vZGUqLwogICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfTU9ERSwgQ1JZUF9PUEVSQVRJTkdNT0RFX0VOQ1JZUFQpOyAKICAgIAogICAgLyogYWxnbyBnZXQgYWxnb3JpdGhtIHNlbGVjdGVkICovICAKICAgIGFsZ28gPSBoY3J5cC0+SW5zdGFuY2UtPkNSICYgQUVTX0NSX0NITU9EOwogICAgCiAgICBzd2l0Y2goYWxnbykKICAgIHsgICAgCiAgICAgIAogICAgY2FzZSBDUllQX0FFU19FQ0I6CiAgICBjYXNlIENSWVBfQUVTX0NCQzoKICAgIGNhc2UgQ1JZUF9BRVNfQ1RSOgogICAgICAKICAgICAgLyogIFNldCB0aGUgS2V5Ki8KICAgICAgQ1JZUF9TZXRLZXkoaGNyeXAsIGhjcnlwLT5Jbml0LktleVNpemUpOwogICAgICAKICAgICAgLyogU2V0IHRoZSBJbml0aWFsaXphdGlvbiBWZWN0b3IqLyAKICAgICAgaWYgKGhjcnlwLT5Jbml0LkFsZ29yaXRobSAhPSBDUllQX0FFU19FQ0IpCiAgICAgIHsgICAKICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjMgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEluaXRWZWN0KTsKICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEluaXRWZWN0KzEpOwogICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMSA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QrMik7CiAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5JVlIwID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCszKTsKICAgICAgfQogICAgICAKICAgICAgLyogU2V0IHRoZSBwaGFzZSAqLwogICAgICBoY3J5cC0+UGhhc2UgPSBDUllQX1BIQVNFX1BST0NFU1M7CiAgICAgIAogICAgICAvKiBTdGFydCBETUEgcHJvY2VzcyB0cmFuc2ZlciBmb3IgQUVTICovIAogICAgICBDUllQX1NldERNQUNvbmZpZyhoY3J5cCwgKHVpbnQzMl90KSggaGNyeXAtPnBDcnlwSW5CdWZmUHRyKSwgKGhjcnlwLT5TaXplLzRVKSwgKHVpbnQzMl90KShoY3J5cC0+cENyeXBPdXRCdWZmUHRyKSk7ICAgIAogICAgICBicmVhazsgICAKICAgICAgCiAgICBjYXNlIENSWVBfQUVTX0dDTV9HTUFDOiAgICAgCiAgICAgIC8qIEFFUyBHQ00gZW5jcnlwdGlvbiAqLyAKICAgICAgc3RhdHVzID0gQ1JZUF9BRVNHQ01fUHJvY2Vzc19ETUEgKGhjcnlwKSA7ICAgIAogICAgICBicmVhazsKICAgICAgCiAgICBjYXNlIENSWVBfQUVTX0NDTTogICAgICAKICAgICAgLyogQUVTIENDTSBlbmNyeXB0aW9uICovIAogICAgICBzdGF0dXMgPSBDUllQX0FFU0NDTV9Qcm9jZXNzX0RNQShoY3J5cCk7ICAgICAgCiAgICAgIGJyZWFrOwogICAgICAKICAgIGRlZmF1bHQ6CiAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfTk9UX1NVUFBPUlRFRDsKICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKICAgICAgYnJlYWs7CiAgICB9CiNlbmRpZiAvKiBFbmQgQUVTIG9yIENSWVAgKi8gIAogICAgCiAgfQogIGVsc2UKICB7CiAgICAvKiBCdXN5IGVycm9yIGNvZGUgZmllbGQgKi8KICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfQlVTWTsgCiAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOwogIH0gCiAgCiAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLwogIHJldHVybiBzdGF0dXM7ICAKfQoKLyoqCiAgKiBAYnJpZWYgIERlY3J5cHRpb24gaW4gRE1BIG1vZGUuCiAgKiBAcGFyYW0gIGhjcnlwOiBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCiAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZQogICogQHBhcmFtICBJbnB1dDogUG9pbnRlciB0byB0aGUgaW5wdXQgYnVmZmVyIChjaXBoZXJ0ZXh0ICkKICAqIEBwYXJhbSAgU2l6ZTogTGVuZ3RoIG9mIHRoZSBwbGFpbnRleHQgYnVmZmVyIGluIHdvcmQKICAqIEBwYXJhbSAgT3V0cHV0OiBQb2ludGVyIHRvIHRoZSBvdXRwdXQgYnVmZmVyKHBsYWludGV4dCkKICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICovCkhBTF9TdGF0dXNUeXBlRGVmIEhBTF9DUllQX0RlY3J5cHRfRE1BKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQzMl90ICpJbnB1dCwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgKk91dHB1dCkKewogIHVpbnQzMl90IGFsZ287IAogIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKICAgCiAgaWYoaGNyeXAtPlN0YXRlID09IEhBTF9DUllQX1NUQVRFX1JFQURZKQogIHsKICAgIAogICAgLyogQ2hhbmdlIHN0YXRlIEJ1c3kgKi8KICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX0JVU1k7CiAgICAKICAgIC8qIFByb2Nlc3MgbG9ja2VkICovCiAgICBfX0hBTF9MT0NLKGhjcnlwKTsgCiAgICAKICAgIC8qICBSZXNldCBDcnlwSW5Db3VudCwgQ3J5cE91dENvdW50IGFuZCBJbml0aWFsaXplIHBDcnlwSW5CdWZmUHRyLCBwQ3J5cE91dEJ1ZmZQdHIgYW5kIFNpemUgcGFyYW1ldGVycyovCiAgICBoY3J5cC0+Q3J5cEluQ291bnQgPSAwVTsKICAgIGhjcnlwLT5DcnlwT3V0Q291bnQgPSAwVTsKICAgIGhjcnlwLT5wQ3J5cEluQnVmZlB0ciA9IElucHV0OwogICAgaGNyeXAtPnBDcnlwT3V0QnVmZlB0ciA9IE91dHB1dDsKICAgIAogICAgLyogIENhbGN1bGF0ZSBTaXplIHBhcmFtZXRlciBpbiBCeXRlKi8KICAgIGlmIChoY3J5cC0+SW5pdC5EYXRhV2lkdGhVbml0ID09IENSWVBfREFUQVdJRFRIVU5JVF9XT1JEKQogICAgewogICAgICBoY3J5cC0+U2l6ZSA9IFNpemUgKiA0VTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgaGNyeXAtPlNpemUgPSBTaXplOwkKICAgIH0gICAgCiAgICAKI2lmIGRlZmluZWQgKENSWVApCiAgICAKICAgIC8qIFNldCBkZWNyeXB0aW9uIG9wZXJhdGluZyBtb2RlKi8KICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQ1JZUF9DUl9BTEdPRElSLCBDUllQX09QRVJBVElOR01PREVfREVDUllQVCk7CiAgICAKICAgIC8qIGFsZ28gZ2V0IGFsZ29yaXRobSBzZWxlY3RlZCAqLyAgIAogICAgYWxnbyA9IGhjcnlwLT5JbnN0YW5jZS0+Q1IgJiBDUllQX0NSX0FMR09NT0RFOwogICAgCiAgICBzd2l0Y2goYWxnbykKICAgIHsgICAgCiAgICBjYXNlIENSWVBfREVTX0VDQjoKICAgIGNhc2UgQ1JZUF9ERVNfQ0JDOgogICAgY2FzZSBDUllQX1RERVNfRUNCOgogICAgY2FzZSBDUllQX1RERVNfQ0JDOgogICAgICAKICAgICAgLypTZXQgS2V5ICovCiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SzFMUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wS2V5KTsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5LMVJSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBLZXkrMSk7CiAgICAgIGlmICgoaGNyeXAtPkluaXQuQWxnb3JpdGhtID09IENSWVBfVERFU19FQ0IpIHx8IChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9UREVTX0NCQykpCiAgICAgIHsKICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPksyTFIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEtleSsyKTsKICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPksyUlIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEtleSszKTsKICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkszTFIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEtleSs0KTsKICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkszUlIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEtleSs1KTsgIAogICAgICB9CiAgICAgIAogICAgICAvKiBTZXQgdGhlIEluaXRpYWxpemF0aW9uIFZlY3RvciovCiAgICAgIGlmICgoaGNyeXAtPkluaXQuQWxnb3JpdGhtID09IENSWVBfREVTX0NCQykgfHwgKGhjcnlwLT5Jbml0LkFsZ29yaXRobSA9PSBDUllQX1RERVNfQ0JDKSkKICAgICAgewogICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYwTFIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEluaXRWZWN0KTsKICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPklWMFJSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCsxKTsKICAgICAgfQogICAgICAKICAgICAgLyogRmx1c2ggRklGTyAqLwogICAgICBIQUxfQ1JZUF9GSUZPX0ZMVVNIKGhjcnlwKTsKICAgICAgCiAgICAgIC8qIFNldCB0aGUgcGhhc2UgKi8KICAgICAgaGNyeXAtPlBoYXNlID0gQ1JZUF9QSEFTRV9QUk9DRVNTOwogICAgICAKICAgICAgLyogU3RhcnQgRE1BIHByb2Nlc3MgdHJhbnNmZXIgZm9yIERFUy9UREVTICovIAogICAgICBDUllQX1NldERNQUNvbmZpZyhoY3J5cCwgKHVpbnQzMl90KSggaGNyeXAtPnBDcnlwSW5CdWZmUHRyKSwgKCh1aW50MTZfdCkoaGNyeXAtPlNpemUpLzRVKSwgKHVpbnQzMl90KShoY3J5cC0+cENyeXBPdXRCdWZmUHRyKSk7ICAgICAgCiAgICAgIGJyZWFrOwogICAgICAKICAgIGNhc2UgQ1JZUF9BRVNfRUNCOgogICAgY2FzZSBDUllQX0FFU19DQkM6CiAgICBjYXNlIENSWVBfQUVTX0NUUjoKICAgICAgCiAgICAgIC8qIEFFUyBkZWNyeXB0aW9uICovIAogICAgICBzdGF0dXMgPSBDUllQX0FFU19EZWNyeXB0X0RNQShoY3J5cCk7CiAgICAgIGJyZWFrOyAgIAogICAgICAKICAgIGNhc2UgQ1JZUF9BRVNfR0NNOiAgICAgCiAgICAgIC8qIEFFUyBHQ00gZGVjcnlwdGlvbiAqLyAKICAgICAgc3RhdHVzID0gQ1JZUF9BRVNHQ01fUHJvY2Vzc19ETUEgKGhjcnlwKSA7ICAgIAogICAgICBicmVhazsKICAgICAgCiAgICBjYXNlIENSWVBfQUVTX0NDTTogICAgICAKICAgICAgLyogQUVTIENDTSBkZWNyeXB0aW9uICovIAogICAgICBzdGF0dXMgPSBDUllQX0FFU0NDTV9Qcm9jZXNzX0RNQShoY3J5cCk7ICAgICAgIAogICAgICBicmVhazsKICAgICAgCiAgICBkZWZhdWx0OgogICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX05PVF9TVVBQT1JURUQ7CiAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CiAgICAgIGJyZWFrOwogICAgfQogICAgCiNlbHNlIC8qQUVTKi8KICAgIAogICAgLyogU2V0IGRlY3J5cHRpb24gb3BlcmF0aW5nIG1vZGUqLwogICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfTU9ERSwgQ1JZUF9PUEVSQVRJTkdNT0RFX0RFQ1JZUFQpOwogICAgCiAgICAvKiBhbGdvIGdldCBhbGdvcml0aG0gc2VsZWN0ZWQgKi8gIAogICAgYWxnbyA9IGhjcnlwLT5JbnN0YW5jZS0+Q1IgJiBBRVNfQ1JfQ0hNT0Q7CiAgICAKICAgIHN3aXRjaChhbGdvKQogICAgeyAgICAKICAgICAgCiAgICBjYXNlIENSWVBfQUVTX0VDQjoKICAgIGNhc2UgQ1JZUF9BRVNfQ0JDOgogICAgY2FzZSBDUllQX0FFU19DVFI6CiAgICAgIAogICAgICAvKiBBRVMgZGVjcnlwdGlvbiAqLyAKICAgICAgc3RhdHVzID0gQ1JZUF9BRVNfRGVjcnlwdF9ETUEoaGNyeXApOwogICAgICBicmVhazsgICAKICAgICAgCiAgICBjYXNlIENSWVBfQUVTX0dDTV9HTUFDOiAgICAgCiAgICAgIC8qIEFFUyBHQ00gZGVjcnlwdGlvbiAqLyAKICAgICAgc3RhdHVzID0gQ1JZUF9BRVNHQ01fUHJvY2Vzc19ETUEgKGhjcnlwKSA7ICAgICAgIAogICAgICBicmVhazsKICAgICAgCiAgICBjYXNlIENSWVBfQUVTX0NDTTogICAgIAogICAgICAvKiBBRVMgQ0NNIGRlY3J5cHRpb24gKi8gCiAgICAgIHN0YXR1cyA9IENSWVBfQUVTQ0NNX1Byb2Nlc3NfRE1BKGhjcnlwKTsgICAgICAgCiAgICAgIGJyZWFrOwogICAgICAKICAgIGRlZmF1bHQ6CiAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfTk9UX1NVUFBPUlRFRDsKICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKICAgICAgYnJlYWs7CiAgICB9CiNlbmRpZiAvKiBFbmQgQUVTIG9yIENSWVAgKi8gICAgICAgICAgIAogIH0KICBlbHNlCiAgewogICAgLyogQnVzeSBlcnJvciBjb2RlIGZpZWxkICovCiAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX0JVU1k7IAogICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKICB9CiAgCiAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLwogIHJldHVybiBzdGF0dXM7ICAKfQoKLyoqCiAgKiBAfQogICovCgovKiogQGRlZmdyb3VwIENSWVBfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMyBDUllQIElSUSBoYW5kbGVyIG1hbmFnZW1lbnQgIAogKiAgQGJyaWVmICAgQ1JZUCBJUlEgaGFuZGxlci4KICoKQHZlcmJhdGltICAgCiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgICAgICAgICAgICAjIyMjIyBDUllQIElSUSBoYW5kbGVyIG1hbmFnZW1lbnQgIyMjIyMKICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gIApbLi5dICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgQ1JZUCBJUlEgaGFuZGxlciBhbmQgY2FsbGJhY2sgZnVuY3Rpb25zLgogICAgICAoKykgSEFMX0NSWVBfSVJRSGFuZGxlciBDUllQIGludGVycnVwdCByZXF1ZXN0CiAgICAgICgrKSBIQUxfQ1JZUF9JbkNwbHRDYWxsYmFjayBpbnB1dCBkYXRhIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrCiAgICAgICgrKSBIQUxfQ1JZUF9PdXRDcGx0Q2FsbGJhY2sgb3V0cHV0IGRhdGEgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sKICAgICAgKCspIEhBTF9DUllQX0Vycm9yQ2FsbGJhY2sgIENSWVAgZXJyb3IgY2FsbGJhY2sKICAgICAgKCspIEhBTF9DUllQX0dldFN0YXRlIHJldHVybiB0aGUgQ1JZUCBzdGF0ZSAKICAgICAgKCspIEhBTF9DUllQX0dldEVycm9yIHJldHVybiB0aGUgQ1JZUCBlcnJvciBjb2RlCkBlbmR2ZXJiYXRpbQogICogQHsKICAqLwoKLyoqCiAgKiBAYnJpZWYgIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBjcnlwdG9ncmFwaGljIGludGVycnVwdCByZXF1ZXN0LgogICogQHBhcmFtICBoY3J5cDogcG9pbnRlciB0byBhIENSWVBfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucwogICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUKICAqIEByZXR2YWwgTm9uZQogICovCnZvaWQgSEFMX0NSWVBfSVJRSGFuZGxlcihDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwKQp7CiAgCiNpZiBkZWZpbmVkIChDUllQKQogIAogIGlmKChfX0hBTF9DUllQX0dFVF9JVChoY3J5cCwgQ1JZUF9JVF9JTkkpICE9IDB4MFUpIHx8IChfX0hBTF9DUllQX0dFVF9JVChoY3J5cCwgQ1JZUF9JVF9PVVRJKSAhPSAweDBVKSkKICB7CiAgICBpZiAoKGhjcnlwLT5Jbml0LkFsZ29yaXRobSA9PSBDUllQX0RFU19FQ0IpfHwgKGhjcnlwLT5Jbml0LkFsZ29yaXRobSA9PSBDUllQX0RFU19DQkMpIHx8IChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9UREVTX0VDQikgfHwgKGhjcnlwLT5Jbml0LkFsZ29yaXRobSA9PSBDUllQX1RERVNfQ0JDKSkKICAgIHsKICAgICAgQ1JZUF9UREVTX0lUKGhjcnlwKTsgLyogREVTIG9yIFRERVMqLwogICAgfQogICAgZWxzZSBpZigoaGNyeXAtPkluaXQuQWxnb3JpdGhtID09IENSWVBfQUVTX0VDQikgfHwgKGhjcnlwLT5Jbml0LkFsZ29yaXRobSA9PSBDUllQX0FFU19DQkMpIHx8IChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9BRVNfQ1RSKSkKICAgIHsKICAgICAgQ1JZUF9BRVNfSVQoaGNyeXApOyAvKkFFUyovCiAgICB9CiAgICAKICAgIGVsc2UgaWYoKGhjcnlwLT5Jbml0LkFsZ29yaXRobSA9PSBDUllQX0FFU19HQ00pIHx8KGhjcnlwLT5Jbml0LkFsZ29yaXRobSA9PSBDUllQX0NSX0FMR09NT0RFX0FFU19DQ00pICkKICAgIHsKICAgICAgLyogaWYgaGVhZGVyIHBoYXNlICovCiAgICAgIGlmICgoaGNyeXAtPkluc3RhbmNlLT5DUiAmIENSWVBfUEhBU0VfSEVBREVSKSA9PSBDUllQX1BIQVNFX0hFQURFUiApCiAgICAgIHsKICAgICAgICBDUllQX0dDTUNDTV9TZXRIZWFkZXJQaGFzZV9JVChoY3J5cCk7CiAgICAgIH0gICAgIAogICAgICBlbHNlICAvKiBpZiBwYXlsb2FkIHBoYXNlICovICAgICAgICAgCiAgICAgIHsKICAgICAgICBDUllQX0dDTUNDTV9TZXRQYXlsb2FkUGhhc2VfSVQoaGNyeXApOwogICAgICB9CiAgICB9CiAgICAKICAgIGVsc2UKICAgIHsKICAgICAgLyogTm90aGluZyB0byBkbyAqLwogICAgfQogIH0gCiAgCiNlbHNlIC8qQUVTKi8gCiAgaWYoKF9fSEFMX0NSWVBfR0VUX0ZMQUcoaGNyeXAsQ1JZUF9JVF9DQ0YpICE9IDB4MFUpICYmIChfX0hBTF9DUllQX0dFVF9JVF9TT1VSQ0UoaGNyeXAsQ1JZUF9JVF9DQ0ZJRSkgIT0gMHgwVSkpCiAgewogICAgCiAgICAvKiBDbGVhciBjb21wdXRhdGlvbiBjb21wbGV0ZSBmbGFnICovCiAgICBfX0hBTF9DUllQX0NMRUFSX0ZMQUcoaGNyeXAsQ1JZUF9DQ0ZfQ0xFQVIpOwogICAgCiAgICBpZihoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9BRVNfR0NNX0dNQUMpCiAgICB7CiAgICAgIAogICAgICAvKiBpZiBoZWFkZXIgcGhhc2UgKi8KICAgICAgaWYgKChoY3J5cC0+SW5zdGFuY2UtPkNSICYgQ1JZUF9QSEFTRV9IRUFERVIpID09IENSWVBfUEhBU0VfSEVBREVSICkKICAgICAgewogICAgICAgIENSWVBfR0NNQ0NNX1NldEhlYWRlclBoYXNlX0lUKGhjcnlwKTsKICAgICAgfSAgICAKICAgICAgZWxzZSAgLyogaWYgcGF5bG9hZCBwaGFzZSAqLyAgICAKICAgICAgewogICAgICAgIENSWVBfR0NNQ0NNX1NldFBheWxvYWRQaGFzZV9JVChoY3J5cCk7CiAgICAgIH0KICAgIH0KICAgIGVsc2UgaWYoaGNyeXAtPkluaXQuQWxnb3JpdGhtID09IENSWVBfQUVTX0NDTSkKICAgIHsKICAgICAgLyogaWYgaGVhZGVyIHBoYXNlICovCiAgICAgIGlmIChoY3J5cC0+SW5pdC5IZWFkZXJTaXplID49ICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50ICkKICAgICAgewogICAgICAgIENSWVBfR0NNQ0NNX1NldEhlYWRlclBoYXNlX0lUKGhjcnlwKTsKICAgICAgfSAgICAKICAgICAgZWxzZSAgIC8qIGlmIHBheWxvYWQgcGhhc2UgKi8gIAogICAgICB7CiAgICAgICAgQ1JZUF9HQ01DQ01fU2V0UGF5bG9hZFBoYXNlX0lUKGhjcnlwKTsKICAgICAgfQogICAgfSAgICAKICAgIGVsc2UgIC8qIEFFUyBBbGdvcml0aG0gRUNCLENCQyBvciBDVFIqLwogICAgewogICAgICBDUllQX0FFU19JVChoY3J5cCk7CiAgICB9CiAgfSAgICAKICAvKiBDaGVjayBpZiBlcnJvciBvY2N1cnJlZCAqLwogIGlmIChfX0hBTF9DUllQX0dFVF9JVF9TT1VSQ0UoaGNyeXAsQ1JZUF9JVF9FUlJJRSkgIT0gUkVTRVQpCiAgewogICAgLyogSWYgd3JpdGUgRXJyb3Igb2NjdXJyZWQgKi8KICAgIGlmIChfX0hBTF9DUllQX0dFVF9GTEFHKGhjcnlwLENSWVBfSVRfV1JFUlIpICE9IFJFU0VUKQogICAgewogICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1dSSVRFOwogICAgfQogICAgLyogSWYgcmVhZCBFcnJvciBvY2N1cnJlZCAqLwogICAgaWYgKF9fSEFMX0NSWVBfR0VUX0ZMQUcoaGNyeXAsQ1JZUF9JVF9SREVSUikgIT0gUkVTRVQpCiAgICB7CiAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfUkVBRDsKICAgIH0KICB9CiNlbmRpZiAvKiBFbmQgQUVTIG9yIENSWVAgKi8gICAgIAp9CgovKioKICAqIEBicmllZiAgUmV0dXJuIHRoZSBDUllQIGVycm9yIGNvZGUuCiAgKiBAcGFyYW0gIGhjcnlwIDogcG9pbnRlciB0byBhIENSWVBfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucwogICogICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgIENSWVAgSVAKICAqIEByZXR2YWwgQ1JZUCBlcnJvciBjb2RlCiAgKi8KdWludDMyX3QgSEFMX0NSWVBfR2V0RXJyb3IoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCkKewogIHJldHVybiBoY3J5cC0+RXJyb3JDb2RlOwp9CgovKioKICAqIEBicmllZiAgUmV0dXJucyB0aGUgQ1JZUCBzdGF0ZS4KICAqIEBwYXJhbSAgaGNyeXA6IHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIENSWVAgbW9kdWxlLgogICogQHJldHZhbCBIQUwgc3RhdGUKICAqLwpIQUxfQ1JZUF9TVEFURVR5cGVEZWYgSEFMX0NSWVBfR2V0U3RhdGUoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCkKewogIHJldHVybiBoY3J5cC0+U3RhdGU7Cn0KCi8qKgogICogQGJyaWVmICBJbnB1dCBGSUZPIHRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjay4KICAqIEBwYXJhbSAgaGNyeXA6IHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIENSWVAgbW9kdWxlLgogICogQHJldHZhbCBOb25lCiAgKi8KX193ZWFrIHZvaWQgSEFMX0NSWVBfSW5DcGx0Q2FsbGJhY2soQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCkKewogIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KICBVTlVTRUQoaGNyeXApOwogCiAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gU2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAogICAgICAgICAgICB0aGUgSEFMX0NSWVBfSW5DcGx0Q2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQogICAqLyAKfQoKLyoqCiAgKiBAYnJpZWYgIE91dHB1dCBGSUZPIHRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjay4KICAqIEBwYXJhbSAgaGNyeXA6IHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIENSWVAgbW9kdWxlLgogICogQHJldHZhbCBOb25lCiAgKi8KX193ZWFrIHZvaWQgSEFMX0NSWVBfT3V0Q3BsdENhbGxiYWNrKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApCnsKICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCiAgVU5VU0VEKGhjcnlwKTsKIAogIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIFNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKICAgICAgICAgICAgdGhlIEhBTF9DUllQX091dENwbHRDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCiAgICovCn0KCi8qKgogICogQGJyaWVmICBDUllQIGVycm9yIGNhbGxiYWNrLgogICogQHBhcmFtICBoY3J5cDogcG9pbnRlciB0byBhIENSWVBfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucwogICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUuCiAgKiBAcmV0dmFsIE5vbmUKICAqLwogX193ZWFrIHZvaWQgSEFMX0NSWVBfRXJyb3JDYWxsYmFjayhDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwKQp7CiAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLwogIFVOVVNFRChoY3J5cCk7CiAKICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBTaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCiAgICAgICAgICAgIHRoZSBIQUxfQ1JZUF9FcnJvckNhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKICAgKi8gCn0KLyoqCiAgKiBAfQogICovCgovKiBQcml2YXRlIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwovKiogQGFkZHRvZ3JvdXAgQ1JZUF9Qcml2YXRlX0Z1bmN0aW9ucwogICogQHsKICAqLwoKICNpZiBkZWZpbmVkIChDUllQKQoKLyoqCiAgKiBAYnJpZWYgIEVuY3J5cHRpb24gaW4gRUNCL0NCQyBBbGdvcml0aG0gd2l0aCBERVMvVERFUyBzdGFuZGFyZC4KICAqIEBwYXJhbSAgaGNyeXA6IHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIENSWVAgbW9kdWxlIAogICogQHBhcmFtICBUaW1lb3V0OiBzcGVjaWZ5IFRpbWVvdXQgdmFsdWUgCiAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAqLwpzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgQ1JZUF9UREVTX1Byb2Nlc3MoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgdWludDMyX3QgVGltZW91dCkKewogIHVpbnQzMl90IHRlbXA7ICAvKiBUZW1wb3JhcnkgQ3J5cE91dEJ1ZmYgKi8gIAogIHVpbnQxNl90IGluY291bnQ7IC8qIFRlbXBvcmFyeSBDcnlwSW5Db3VudCBWYWx1ZSAqLyAKICB1aW50MTZfdCBvdXRjb3VudDsgIC8qIFRlbXBvcmFyeSBDcnlwT3V0Q291bnQgVmFsdWUgKi8KICAKICAvKiBFbmFibGUgQ1JZUCAqLwogIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsKICAvKlRlbXBvcmFyeSBDcnlwT3V0Q291bnQgVmFsdWUqLwogIG91dGNvdW50ID0gaGNyeXAtPkNyeXBPdXRDb3VudDsKICAKICAvKlN0YXJ0IHByb2Nlc3NpbmcqLyAgCiAgd2hpbGUoKGhjcnlwLT5DcnlwSW5Db3VudCA8IChoY3J5cC0+U2l6ZS80VSkpICYmIChvdXRjb3VudCA8IChoY3J5cC0+U2l6ZS80VSkpKQogIHsgCiAgICAvKiBUZW1wb3JhcnkgQ3J5cEluQ291bnQgVmFsdWUgKi8gCiAgICBpbmNvdW50ID0gaGNyeXAtPkNyeXBJbkNvdW50OyAgICAgIAogICAgLyogV3JpdGUgcGxhaW4gZGF0YSBhbmQgZ2V0IGNpcGhlciBkYXRhICovCiAgICBpZigoKGhjcnlwLT5JbnN0YW5jZS0+U1IgJiBDUllQX0ZMQUdfSUZORiApICE9IDB4MFUpICYmIChpbmNvdW50IDwgKGhjcnlwLT5TaXplLzRVKSkpCiAgICB7CiAgICAgIC8qIFdyaXRlIHRoZSBpbnB1dCBibG9jayBpbiB0aGUgSU4gRklGTyAqLwogICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCApOwogICAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQgKTsKICAgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7ICAgICAgICAKICAgIH0gICAKICAgIAogICAgLyogV2FpdCBmb3IgT0ZORSBmbGFnIHRvIGJlIHJhaXNlZCAqLwogICAgaWYoQ1JZUF9XYWl0T25PRk5FRmxhZyhoY3J5cCwgVGltZW91dCkgIT0gSEFMX09LKSAgCiAgICB7IAogICAgICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgY2xvY2sgKi8KICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKICAgICAgCiAgICAgIC8qIENoYW5nZSBzdGF0ZSAmIGVycm9yQ29kZSovCiAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfVElNRU9VVDsKICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CiAgICAgIAogICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovICAgICAgICAgIAogICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOyAKI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpIAogICAgICAvKkNhbGwgcmVnaXN0ZXJlZCBlcnJvciBjYWxsYmFjayovCiAgICAgIGhjcnlwLT5FcnJvckNhbGxiYWNrKGhjcnlwKTsKI2Vsc2UKICAgICAgLypDYWxsIGxlZ2FjeSB3ZWFrIGVycm9yIGNhbGxiYWNrKi8KICAgICAgSEFMX0NSWVBfRXJyb3JDYWxsYmFjayhoY3J5cCk7CiNlbmRpZiAvKiBVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTICovIAogICAgfQogICAgCiAgICAvKlRlbXBvcmFyeSBDcnlwT3V0Q291bnQgVmFsdWUqLwogICAgb3V0Y291bnQgPSBoY3J5cC0+Q3J5cE91dENvdW50OwogICAgCiAgICBpZigoKGhjcnlwLT5JbnN0YW5jZS0+U1IgJiBDUllQX0ZMQUdfT0ZORSApICE9IDB4MFUpICYmIChvdXRjb3VudCA8IChoY3J5cC0+U2l6ZS80VSkpKQogICAgewogICAgICAvKiBSZWFkIHRoZSBvdXRwdXQgYmxvY2sgZnJvbSB0aGUgT3V0cHV0IEZJRk8gYW5kIHB1dCB0aGVtIGluIHRlbXBvcmFyeSBCdWZmZXIgdGhlbiBnZXQgQ3J5cE91dEJ1ZmYgZnJvbSB0ZW1wb3JhcnkgYnVmZmVyICAqLyAgICAKICAgICAgdGVtcCA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVDsKICAgICAgKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBPdXRCdWZmUHRyICsgKGhjcnlwLT5DcnlwT3V0Q291bnQpKSA9IHRlbXA7ICAgICAgCiAgICAgIGhjcnlwLT5DcnlwT3V0Q291bnQrKzsgIAogICAgICB0ZW1wID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUOyAgCiAgICAgICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwT3V0QnVmZlB0ciArIChoY3J5cC0+Q3J5cE91dENvdW50KSkgPSB0ZW1wOyAgICAgIAogICAgICBoY3J5cC0+Q3J5cE91dENvdW50Kys7ICAKICAgIH0KICAgIC8qVGVtcG9yYXJ5IENyeXBPdXRDb3VudCBWYWx1ZSovCiAgICBvdXRjb3VudCA9IGhjcnlwLT5DcnlwT3V0Q291bnQ7CiAgfQogIC8qIERpc2FibGUgQ1JZUCAqLwogIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7IAogIC8qIENoYW5nZSB0aGUgQ1JZUCBzdGF0ZSAqLwogIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOwogIAogIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KICByZXR1cm4gSEFMX09LOyAgCn0KCi8qKiAKICAqIEBicmllZiAgQ1JZUCBibG9jayBpbnB1dC9vdXRwdXQgZGF0YSBoYW5kbGluZyB1bmRlciBpbnRlcnJ1cHRpb24gd2l0aCBERVMvVERFUyBzdGFuZGFyZC4KICAqIEBub3RlICAgVGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCB1bmRlciBpbnRlcnJ1cHRpb24gb25seSwgb25jZQogICogICAgICAgICBpbnRlcnJ1cHRpb25zIGhhdmUgYmVlbiBlbmFibGVkIGJ5IENSWVBfRGVjcnlwdF9JVCgpIGFuZCBDUllQX0VuY3J5cHRfSVQoKS4KICAqIEBwYXJhbSAgaGNyeXA6IHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIENSWVAgbW9kdWxlLgogICogQHJldHZhbCBub25lCiAgKi8Kc3RhdGljIHZvaWQgQ1JZUF9UREVTX0lUKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApCnsKICB1aW50MzJfdCB0ZW1wOyAgLyogVGVtcG9yYXJ5IENyeXBPdXRCdWZmICovIAogIAogIGlmKGhjcnlwLT5TdGF0ZSA9PSBIQUxfQ1JZUF9TVEFURV9CVVNZKQogIHsgCiAgICBpZigoX19IQUxfQ1JZUF9HRVRfSVQoaGNyeXAsIENSWVBfSVRfSU5JKSAhPSAweDBVKSAmJiAoX19IQUxfQ1JZUF9HRVRfRkxBRyhoY3J5cCwgQ1JZUF9GTEFHX0lOUklTKSAhPSAweDBVKSkKICAgICAgCiAgICB7ICAgICAKICAgICAgLyogV3JpdGUgaW5wdXQgYmxvY2sgaW4gdGhlIElOIEZJRk8gKi8KICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCApOwogICAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCApOwogICAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKICAgICAgCiAgICAgIGlmKGhjcnlwLT5DcnlwSW5Db3VudCA9PSAgKCh1aW50MTZfdCkoaGNyeXAtPlNpemUpLzRVKSkKICAgICAgeyAgICAgCiAgICAgICAgLyogRGlzYWJsZSBpbnRlcnJ1cHRpb24gKi8KICAgICAgICBfX0hBTF9DUllQX0RJU0FCTEVfSVQoaGNyeXAsIENSWVBfSVRfSU5JKTsKICAgICAgICAvKiBDYWxsIHRoZSBpbnB1dCBkYXRhIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCiNpZiAoVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkgCiAgICAgICAgLypDYWxsIHJlZ2lzdGVyZWQgSW5wdXQgY29tcGxldGUgY2FsbGJhY2sqLwogICAgICAgIGhjcnlwLT5JbkNwbHRDYWxsYmFjayhoY3J5cCk7CiNlbHNlCiAgICAgICAgLypDYWxsIGxlZ2FjeSB3ZWFrIElucHV0IGNvbXBsZXRlIGNhbGxiYWNrKi8KICAgICAgICBIQUxfQ1JZUF9JbkNwbHRDYWxsYmFjayhoY3J5cCk7CiNlbmRpZiAvKiBVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTICovCiAgICAgIH0KICAgIH0KICAgIGlmKChfX0hBTF9DUllQX0dFVF9JVChoY3J5cCwgQ1JZUF9JVF9PVVRJKSAhPSAweDBVKSYmIChfX0hBTF9DUllQX0dFVF9GTEFHKGhjcnlwLCBDUllQX0ZMQUdfT1VUUklTKSAhPSAweDBVKSkKICAgIHsKICAgICAgLyogUmVhZCB0aGUgb3V0cHV0IGJsb2NrIGZyb20gdGhlIE91dHB1dCBGSUZPIGFuZCBwdXQgdGhlbSBpbiB0ZW1wb3JhcnkgQnVmZmVyIHRoZW4gZ2V0IENyeXBPdXRCdWZmIGZyb20gdGVtcG9yYXJ5IGJ1ZmZlciAgKi8gICAgCiAgICAgIHRlbXAgPSBoY3J5cC0+SW5zdGFuY2UtPkRPVVQ7CiAgICAgICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwT3V0QnVmZlB0ciArIChoY3J5cC0+Q3J5cE91dENvdW50KSkgPSB0ZW1wOyAgICAgIAogICAgICBoY3J5cC0+Q3J5cE91dENvdW50Kys7ICAKICAgICAgdGVtcCA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVDsgIAogICAgICAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cE91dEJ1ZmZQdHIgKyAoaGNyeXAtPkNyeXBPdXRDb3VudCkpID0gdGVtcDsgICAgICAKICAgICAgaGNyeXAtPkNyeXBPdXRDb3VudCsrOyAgICAgICAgICAgIAogICAgICBpZihoY3J5cC0+Q3J5cE91dENvdW50ID09ICAoKHVpbnQxNl90KShoY3J5cC0+U2l6ZSkvNFUpKQogICAgICB7CiAgICAgICAgLyogRGlzYWJsZSBpbnRlcnJ1cHRpb24gKi8KICAgICAgICBfX0hBTF9DUllQX0RJU0FCTEVfSVQoaGNyeXAsIENSWVBfSVRfT1VUSSk7CiAgICAgICAgCiAgICAgICAgLyogRGlzYWJsZSBDUllQICovCiAgICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKICAgICAgICAKICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCiAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsgICAKICAgICAgICAKICAgICAgICAvKiBDaGFuZ2UgdGhlIENSWVAgc3RhdGUgKi8KICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKICAgICAgICAvKiBDYWxsIG91dHB1dCB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLwojaWYgKFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkgCiAgICAgICAgLypDYWxsIHJlZ2lzdGVyZWQgT3V0cHV0IGNvbXBsZXRlIGNhbGxiYWNrKi8KICAgICAgICBoY3J5cC0+T3V0Q3BsdENhbGxiYWNrKGhjcnlwKTsKI2Vsc2UKICAgICAgICAvKkNhbGwgbGVnYWN5IHdlYWsgT3V0cHV0IGNvbXBsZXRlIGNhbGxiYWNrKi8KICAgICAgICBIQUxfQ1JZUF9PdXRDcGx0Q2FsbGJhY2soaGNyeXApOwojZW5kaWYgLyogVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyAqLyAgCiAgICAgIH0KICAgIH0gICAKICB9CiAgZWxzZQogIHsKICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7ICAgICAKICAgIC8qIEJ1c3kgZXJyb3IgY29kZSBmaWVsZCAqLwogICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9CVVNZOyAKI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpIAogICAgLypDYWxsIHJlZ2lzdGVyZWQgZXJyb3IgY2FsbGJhY2sqLwogICAgaGNyeXAtPkVycm9yQ2FsbGJhY2soaGNyeXApOwojZWxzZQogICAgLypDYWxsIGxlZ2FjeSB3ZWFrIGVycm9yIGNhbGxiYWNrKi8KICAgIEhBTF9DUllQX0Vycm9yQ2FsbGJhY2soaGNyeXApOwojZW5kaWYgLyogVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyAqLwogIH0KfQoKI2VuZGlmIC8qIENSWVAgKi8KCi8qKgogICogQGJyaWVmICBFbmNyeXB0aW9uIGluIEVDQi9DQkMgJiBDVFIgQWxnb3JpdGhtIHdpdGggQUVTIFN0YW5kYXJkCiAgKiBAcGFyYW0gIGhjcnlwOiBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSAKICAqIEBwYXJhbSAgVGltZW91dDogc3BlY2lmeSBUaW1lb3V0IHZhbHVlIAogICogQHJldHZhbCBIQUwgc3RhdHVzCiAgKi8Kc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIENSWVBfQUVTX0VuY3J5cHQoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgdWludDMyX3QgVGltZW91dCkKeyAgCiAgdWludDE2X3Qgb3V0Y291bnQ7ICAvKiBUZW1wb3JhcnkgQ3J5cE91dENvdW50IFZhbHVlICovCiAgCiAgLyogIFNldCB0aGUgS2V5Ki8KICBDUllQX1NldEtleShoY3J5cCwgaGNyeXAtPkluaXQuS2V5U2l6ZSk7CiAgCiAgaWYgKGhjcnlwLT5Jbml0LkFsZ29yaXRobSAhPSBDUllQX0FFU19FQ0IpCiAgewogICAgLyogU2V0IHRoZSBJbml0aWFsaXphdGlvbiBWZWN0b3IqLwojaWYgZGVmaW5lZCAoQUVTKSAgICAgICAKICAgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMyA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QpOwogICAgaGNyeXAtPkluc3RhbmNlLT5JVlIyID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCsxKTsKICAgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMSA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QrMik7CiAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjAgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEluaXRWZWN0KzMpOwojZWxzZSAvKiBDUllQICovCiAgICBoY3J5cC0+SW5zdGFuY2UtPklWMExSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCk7CiAgICBoY3J5cC0+SW5zdGFuY2UtPklWMFJSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCsxKTsKICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYxTFIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEluaXRWZWN0KzIpOwogICAgaGNyeXAtPkluc3RhbmNlLT5JVjFSUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QrMyk7CiNlbmRpZiAvKiBFbmQgQUVTIG9yIENSWVAgKi8KICB9CiAgCiAgLyogU2V0IHRoZSBwaGFzZSAqLwogIGhjcnlwLT5QaGFzZSA9IENSWVBfUEhBU0VfUFJPQ0VTUzsKICAKICAvKiBFbmFibGUgQ1JZUCAqLwogIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsKICAKICAvKlRlbXBvcmFyeSBDcnlwT3V0Q291bnQgVmFsdWUqLwogIG91dGNvdW50ID0gaGNyeXAtPkNyeXBPdXRDb3VudDsKICAKICB3aGlsZSgoaGNyeXAtPkNyeXBJbkNvdW50IDwgKGhjcnlwLT5TaXplLzRVKSkgJiYgKG91dGNvdW50IDwgKGhjcnlwLT5TaXplLzRVKSkpCiAgeyAgICAgIAogICAgLyogV3JpdGUgcGxhaW4gRGR0YSBhbmQgZ2V0IGNpcGhlciBkYXRhICovCiAgICBDUllQX0FFU19Qcm9jZXNzRGF0YShoY3J5cCxUaW1lb3V0KTsgCiAgICAvKlRlbXBvcmFyeSBDcnlwT3V0Q291bnQgVmFsdWUqLwogICAgb3V0Y291bnQgPSBoY3J5cC0+Q3J5cE91dENvdW50OyAgICAgCiAgfSAKICAKICAvKiBEaXNhYmxlIENSWVAgKi8KICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwogIAogIC8qIENoYW5nZSB0aGUgQ1JZUCBzdGF0ZSAqLwogIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOwogIAogIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KICByZXR1cm4gSEFMX09LOyAgIAp9CgovKioKICAqIEBicmllZiAgRW5jcnlwdGlvbiBpbiBFQ0IvQ0JDICYgQ1RSIG1vZGUgd2l0aCBBRVMgU3RhbmRhcmQgdXNpbmcgaW50ZXJydXB0IG1vZGUKICAqIEBwYXJhbSAgaGNyeXA6IHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIENSWVAgbW9kdWxlCiAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAqLwpzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgQ1JZUF9BRVNfRW5jcnlwdF9JVChDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwKQp7ICAgCiAgCiAgLyogIFNldCB0aGUgS2V5Ki8KICBDUllQX1NldEtleShoY3J5cCwgaGNyeXAtPkluaXQuS2V5U2l6ZSk7CiAgCiAgaWYgKGhjcnlwLT5Jbml0LkFsZ29yaXRobSAhPSBDUllQX0FFU19FQ0IpCiAgewogICAgLyogU2V0IHRoZSBJbml0aWFsaXphdGlvbiBWZWN0b3IqLwojaWYgZGVmaW5lZCAoQUVTKSAgCiAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjMgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEluaXRWZWN0KTsKICAgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QrMSk7CiAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjEgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEluaXRWZWN0KzIpOwogICAgaGNyeXAtPkluc3RhbmNlLT5JVlIwID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCszKTsKICAgIAojZWxzZSAvKiBDUllQICovCiAgICBoY3J5cC0+SW5zdGFuY2UtPklWMExSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCk7CiAgICBoY3J5cC0+SW5zdGFuY2UtPklWMFJSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCsxKTsKICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYxTFIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEluaXRWZWN0KzIpOwogICAgaGNyeXAtPkluc3RhbmNlLT5JVjFSUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QrMyk7CiNlbmRpZiAvKiBFbmQgQUVTIG9yIENSWVAgKi8KICB9CiAgLyogU2V0IHRoZSBwaGFzZSAqLwogIGhjcnlwLT5QaGFzZSA9IENSWVBfUEhBU0VfUFJPQ0VTUzsKICAKICBpZihoY3J5cC0+U2l6ZSAhPSAwVSkKICB7ICAgIAojaWYgZGVmaW5lZCAoQUVTKSAKICAgIAogICAgLyogRW5hYmxlIGNvbXB1dGF0aW9uIGNvbXBsZXRlIGZsYWcgYW5kIGVycm9yIGludGVycnVwdHMgKi8KICAgIF9fSEFMX0NSWVBfRU5BQkxFX0lUKGhjcnlwLENSWVBfSVRfQ0NGSUUgfCBDUllQX0lUX0VSUklFKTsKICAgIAogICAgLyogRW5hYmxlIENSWVAgKi8KICAgIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsKICAgIAogICAgLyogV3JpdGUgdGhlIGlucHV0IGJsb2NrIGluIHRoZSBJTiBGSUZPICovCiAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQgKTsKICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOwogICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50ICk7CiAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsgICAKICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCApOwogICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7CiAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQgKTsKICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOyAKICAgIAojZWxzZSAvKiBDUllQICovICAKICAgIAogICAgLyogRW5hYmxlIGludGVycnVwdHMgKi8KICAgIF9fSEFMX0NSWVBfRU5BQkxFX0lUKGhjcnlwLCBDUllQX0lUX0lOSSB8IENSWVBfSVRfT1VUSSk7CiAgICAKICAgIC8qIEVuYWJsZSBDUllQICovCiAgICBfX0hBTF9DUllQX0VOQUJMRShoY3J5cCk7IAogICAgCiNlbmRpZiAvKiAgRW5kIEFFUyBvciBDUllQICAqLyAgICAgIAogIH0KICBlbHNlCiAgeyAgCiAgICAvKiBDaGFuZ2UgdGhlIENSWVAgc3RhdGUgKi8KICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOwogICAgCiAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCiAgICBfX0hBTF9VTkxPQ0soaGNyeXApOyAgCiAgfSAgIAogIAogIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KICByZXR1cm4gSEFMX09LOwp9CgovKioKICAqIEBicmllZiAgRGVjcnlwdGlvbiBpbiBFQ0IvQ0JDICYgQ1RSIG1vZGUgd2l0aCBBRVMgU3RhbmRhcmQKICAqIEBwYXJhbSAgaGNyeXA6IHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIAogICogQHBhcmFtICBUaW1lb3V0OiBTcGVjaWZ5IFRpbWVvdXQgdmFsdWUgCiAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAqLwpzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgQ1JZUF9BRVNfRGVjcnlwdChDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50MzJfdCBUaW1lb3V0ICkKeyAgCiAgdWludDE2X3Qgb3V0Y291bnQ7ICAvKiBUZW1wb3JhcnkgQ3J5cE91dENvdW50IFZhbHVlICovCiAgCiAgLyogIEtleSBwcmVwYXJhdGlvbiBmb3IgRUNCL0NCQyAqLwogIGlmIChoY3J5cC0+SW5pdC5BbGdvcml0aG0gIT0gQ1JZUF9BRVNfQ1RSKSAKICB7CiNpZiBkZWZpbmVkIChBRVMpIAogICAgaWYgKGhjcnlwLT5BdXRvS2V5RGVyaXZhdGlvbiA9PSBESVNBQkxFKS8qTW9kZSAyIEtleSBwcmVwYXJhdGlvbiovCiAgICB7ICAgICAKICAgICAgLyogU2V0IGtleSBwcmVwYXJhdGlvbiBmb3IgZGVjcnlwdGlvbiBvcGVyYXRpbmcgbW9kZSovCiAgICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX01PREUsIENSWVBfT1BFUkFUSU5HTU9ERV9LRVlERVJJVkFUSU9OKTsKICAgICAgCiAgICAgIC8qICBTZXQgdGhlIEtleSovCiAgICAgIENSWVBfU2V0S2V5KGhjcnlwLCBoY3J5cC0+SW5pdC5LZXlTaXplKTsgCiAgICAgIAogICAgICAvKiBFbmFibGUgQ1JZUCAqLwogICAgICBfX0hBTF9DUllQX0VOQUJMRShoY3J5cCk7CiAgICAgIAogICAgICAvKiBXYWl0IGZvciBDQ0YgZmxhZyB0byBiZSByYWlzZWQgKi8KICAgICAgaWYoQ1JZUF9XYWl0T25DQ0ZsYWcoaGNyeXAsIFRpbWVvdXQpICE9IEhBTF9PSykgIAogICAgICB7IAogICAgICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLwogICAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CiAgICAgICAgCiAgICAgICAgLyogQ2hhbmdlIHN0YXRlICYgZXJyb3IgY29kZSovCiAgICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9USU1FT1VUOwogICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOyAgCiAgICAgICAgCiAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLyAgICAgICAgICAKICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOyAKICAgICAgICByZXR1cm4gSEFMX0VSUk9SOwogICAgICB9CiAgICAgIC8qIENsZWFyIENDRiBGbGFnICovCiAgICAgIF9fSEFMX0NSWVBfQ0xFQVJfRkxBRyhoY3J5cCwgQ1JZUF9DQ0ZfQ0xFQVIpOwogICAgICAKICAgICAgLyogUmV0dXJuIHRvIGRlY3J5cHRpb24gb3BlcmF0aW5nIG1vZGUoTW9kZSAzKSovICAgICAgCiAgICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX01PREUsIENSWVBfT1BFUkFUSU5HTU9ERV9ERUNSWVBUKTsKICAgIH0KICAgIGVsc2UgLypNb2RlIDQgOiBkZWNyeXB0aW9uICYgS2V5IHByZXBhcmF0aW9uKi8KICAgIHsKICAgICAgLyogIFNldCB0aGUgS2V5Ki8KICAgICAgQ1JZUF9TZXRLZXkoaGNyeXAsIGhjcnlwLT5Jbml0LktleVNpemUpOwogICAgICAKICAgICAgLyogU2V0IGRlY3J5cHRpb24gJiBLZXkgcHJlcGFyYXRpb24gb3BlcmF0aW5nIG1vZGUqLyAgICAgICAgICAgICAKICAgICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfTU9ERSwgQ1JZUF9PUEVSQVRJTkdNT0RFX0tFWURFUklWQVRJT05fREVDUllQVCk7ICAKICAgIH0gICAgIAojZWxzZSAvKiBDUllQICovCiAgICAvKiBjaGFuZ2UgQUxHT01PREUgdG8ga2V5IHByZXBhcmF0aW9uIGZvciBkZWNyeXB0aW9uKi8KICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQ1JZUF9DUl9BTEdPTU9ERSwgQ1JZUF9DUl9BTEdPTU9ERV9BRVNfS0VZICk7CiAgICAKICAgIC8qICBTZXQgdGhlIEtleSovCiAgICBDUllQX1NldEtleShoY3J5cCwgaGNyeXAtPkluaXQuS2V5U2l6ZSk7CiAgICAKICAgIC8qIEVuYWJsZSBDUllQICovCiAgICBfX0hBTF9DUllQX0VOQUJMRShoY3J5cCk7CiAgICAKICAgIC8qIFdhaXQgZm9yIEJVU1kgZmxhZyB0byBiZSByYWlzZWQgKi8KICAgIGlmKENSWVBfV2FpdE9uQlVTWUZsYWcoaGNyeXAsIFRpbWVvdXQpICE9IEhBTF9PSykgIAogICAgeyAKICAgICAgLyogRGlzYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIGNsb2NrICovCiAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CiAgICAgIAogICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9USU1FT1VUOwogICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKICAgICAgCiAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8gICAgICAgICAgCiAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7IAogICAgICByZXR1cm4gSEFMX0VSUk9SOwogICAgfSAgICAgICAKICAgIC8qIFR1cm4gYmFjayB0byBBTEdPTU9ERSBvZiB0aGUgY29uZmlndXJhdGlvbiAqLwogICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBDUllQX0NSX0FMR09NT0RFLCBoY3J5cC0+SW5pdC5BbGdvcml0aG0gKTsgIAogICAgCiNlbmRpZiAvKiBFbmQgQUVTIG9yIENSWVAgICovIAogIH0KICBlbHNlICAvKkFsZ29yaXRobSBDVFIgKi8KICB7ICAKICAgIC8qICBTZXQgdGhlIEtleSovCiAgICBDUllQX1NldEtleShoY3J5cCwgaGNyeXAtPkluaXQuS2V5U2l6ZSk7CiAgfSAKICAKICAvKiBTZXQgSVYgKi8gCiAgaWYgKGhjcnlwLT5Jbml0LkFsZ29yaXRobSAhPSBDUllQX0FFU19FQ0IpCiAgewogICAgLyogU2V0IHRoZSBJbml0aWFsaXphdGlvbiBWZWN0b3IqLwojaWYgZGVmaW5lZCAoQUVTKSAgICAgICAKICAgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMyA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QpOwogICAgaGNyeXAtPkluc3RhbmNlLT5JVlIyID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCsxKTsKICAgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMSA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QrMik7CiAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjAgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEluaXRWZWN0KzMpOwojZWxzZSAvKiBDUllQICovCiAgICBoY3J5cC0+SW5zdGFuY2UtPklWMExSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCk7CiAgICBoY3J5cC0+SW5zdGFuY2UtPklWMFJSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCsxKTsKICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYxTFIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEluaXRWZWN0KzIpOwogICAgaGNyeXAtPkluc3RhbmNlLT5JVjFSUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QrMyk7CiNlbmRpZiAvKiBFbmQgQUVTIG9yIENSWVAgKi8KICB9ICAgICAKICAvKiBTZXQgdGhlIHBoYXNlICovCiAgaGNyeXAtPlBoYXNlID0gQ1JZUF9QSEFTRV9QUk9DRVNTOwogIAogIC8qIEVuYWJsZSBDUllQICovCiAgX19IQUxfQ1JZUF9FTkFCTEUoaGNyeXApOwogIAogIC8qVGVtcG9yYXJ5IENyeXBPdXRDb3VudCBWYWx1ZSovICAKICBvdXRjb3VudCA9IGhjcnlwLT5DcnlwT3V0Q291bnQ7IAogIAogIHdoaWxlKChoY3J5cC0+Q3J5cEluQ291bnQgPCAoaGNyeXAtPlNpemUvNFUpKSAmJiAob3V0Y291bnQgPCAoaGNyeXAtPlNpemUvNFUpKSkKICB7ICAgICAgCiAgICAvKiBXcml0ZSBwbGFpbiBkYXRhIGFuZCBnZXQgY2lwaGVyIGRhdGEgKi8KICAgIENSWVBfQUVTX1Byb2Nlc3NEYXRhKGhjcnlwLFRpbWVvdXQpOwogICAgLypUZW1wb3JhcnkgQ3J5cE91dENvdW50IFZhbHVlKi8KICAgIG91dGNvdW50ID0gaGNyeXAtPkNyeXBPdXRDb3VudDsKICB9ICAKICAKICAvKiBEaXNhYmxlIENSWVAgKi8KICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwogIAogIC8qIENoYW5nZSB0aGUgQ1JZUCBzdGF0ZSAqLwogIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOwogIAogIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KICByZXR1cm4gSEFMX09LOyAgIAp9Ci8qKgogICogQGJyaWVmICBEZWNyeXB0aW9uIGluIEVDQi9DQkMgJiBDVFIgbW9kZSB3aXRoIEFFUyBTdGFuZGFyZCB1c2luZyBpbnRlcnJ1cHQgbW9kZQogICogQHBhcmFtICBoY3J5cDogcG9pbnRlciB0byBhIENSWVBfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucwogICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUKICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICovCnN0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBDUllQX0FFU19EZWNyeXB0X0lUKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApCnsKICBfX0lPIHVpbnQzMl90IGNvdW50ID0gMFU7CiAgCiAgLyogIEtleSBwcmVwYXJhdGlvbiBmb3IgRUNCL0NCQyAqLwogIGlmIChoY3J5cC0+SW5pdC5BbGdvcml0aG0gIT0gQ1JZUF9BRVNfQ1RSKSAKICB7CiNpZiBkZWZpbmVkIChBRVMpIAogICAgaWYgKGhjcnlwLT5BdXRvS2V5RGVyaXZhdGlvbiA9PSBESVNBQkxFKS8qTW9kZSAyIEtleSBwcmVwYXJhdGlvbiovCiAgICB7ICAgICAKICAgICAgLyogU2V0IGtleSBwcmVwYXJhdGlvbiBmb3IgZGVjcnlwdGlvbiBvcGVyYXRpbmcgbW9kZSovCiAgICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX01PREUsIENSWVBfT1BFUkFUSU5HTU9ERV9LRVlERVJJVkFUSU9OKTsKICAgICAgCiAgICAgIC8qICBTZXQgdGhlIEtleSovCiAgICAgIENSWVBfU2V0S2V5KGhjcnlwLCBoY3J5cC0+SW5pdC5LZXlTaXplKTsgCiAgICAgIAogICAgICAvKiBFbmFibGUgQ1JZUCAqLwogICAgICBfX0hBTF9DUllQX0VOQUJMRShoY3J5cCk7CiAgICAgIAogICAgICAvKiBXYWl0IGZvciBDQ0YgZmxhZyB0byBiZSByYWlzZWQgKi8KICAgICAgY291bnQgPSBDUllQX1RJTUVPVVRfS0VZUFJFUEFSQVRJT047CiAgICAgIGRvCiAgICAgIHsKICAgICAgICBjb3VudC0tIDsKICAgICAgICBpZihjb3VudCA9PSAwVSkKICAgICAgICB7CiAgICAgICAgICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgY2xvY2sgKi8KICAgICAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CiAgICAgICAgICAKICAgICAgICAgIC8qIENoYW5nZSBzdGF0ZSAqLwogICAgICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9USU1FT1VUOwogICAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7IAogICAgICAgICAgCiAgICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovICAgICAgICAgIAogICAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsgCiAgICAgICAgICByZXR1cm4gSEFMX0VSUk9SOwogICAgICAgIH0KICAgICAgfQogICAgICB3aGlsZShIQUxfSVNfQklUX0NMUihoY3J5cC0+SW5zdGFuY2UtPlNSLCBBRVNfU1JfQ0NGKSk7CiAgICAgIAogICAgICAvKiBDbGVhciBDQ0YgRmxhZyAqLwogICAgICBfX0hBTF9DUllQX0NMRUFSX0ZMQUcoaGNyeXAsIENSWVBfQ0NGX0NMRUFSKTsKICAgICAgCiAgICAgIC8qIFJldHVybiB0byBkZWNyeXB0aW9uIG9wZXJhdGluZyBtb2RlKE1vZGUgMykqLyAKICAgICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfTU9ERSwgQ1JZUF9PUEVSQVRJTkdNT0RFX0RFQ1JZUFQpOwogICAgfQogICAgZWxzZSAvKk1vZGUgNCA6IGRlY3J5cHRpb24gJiBrZXkgcHJlcGFyYXRpb24qLwogICAgewogICAgICAvKiAgU2V0IHRoZSBLZXkqLwogICAgICBDUllQX1NldEtleShoY3J5cCwgaGNyeXAtPkluaXQuS2V5U2l6ZSk7CiAgICAgIAogICAgICAvKiBTZXQgZGVjcnlwdGlvbiAmIGtleSBwcmVwYXJhdGlvbiBvcGVyYXRpbmcgbW9kZSovIAogICAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIEFFU19DUl9NT0RFLCBDUllQX09QRVJBVElOR01PREVfS0VZREVSSVZBVElPTl9ERUNSWVBUKTsgCiAgICB9ICAgICAgICAKI2Vsc2UgLyogQ1JZUCAqLwogICAgCiAgICAvKiBjaGFuZ2UgQUxHT01PREUgdG8ga2V5IHByZXBhcmF0aW9uIGZvciBkZWNyeXB0aW9uKi8KICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQ1JZUF9DUl9BTEdPTU9ERSwgQ1JZUF9DUl9BTEdPTU9ERV9BRVNfS0VZICk7CiAgICAKICAgIC8qICBTZXQgdGhlIEtleSovCiAgICBDUllQX1NldEtleShoY3J5cCwgaGNyeXAtPkluaXQuS2V5U2l6ZSk7CiAgICAKICAgIC8qIEVuYWJsZSBDUllQICovCiAgICBfX0hBTF9DUllQX0VOQUJMRShoY3J5cCk7CiAgICAKICAgIC8qIFdhaXQgZm9yIEJVU1kgZmxhZyB0byBiZSByYWlzZWQgKi8KICAgIGNvdW50ID0gQ1JZUF9USU1FT1VUX0tFWVBSRVBBUkFUSU9OOwogICAgZG8KICAgIHsKICAgICAgY291bnQtLSA7CiAgICAgIGlmKGNvdW50ID09IDBVKQogICAgICB7CiAgICAgICAgLyogQ2hhbmdlIHN0YXRlICovCiAgICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9USU1FT1VUOwogICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOwogICAgICAgIAogICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8gICAgICAgICAgCiAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKICAgICAgICByZXR1cm4gSEFMX0VSUk9SOwogICAgICB9CiAgICB9CiAgICB3aGlsZShIQUxfSVNfQklUX1NFVChoY3J5cC0+SW5zdGFuY2UtPlNSLCBDUllQX0ZMQUdfQlVTWSkpOyAgCiAgICAKICAgIC8qIFR1cm4gYmFjayB0byBBTEdPTU9ERSBvZiB0aGUgY29uZmlndXJhdGlvbiAqLwogICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBDUllQX0NSX0FMR09NT0RFLCBoY3J5cC0+SW5pdC5BbGdvcml0aG0gKTsgCiAgICAKI2VuZGlmIC8qIEVuZCBBRVMgb3IgQ1JZUCAqLyAgICAKICB9CiAgCiAgZWxzZSAgLypBbGdvcml0aG0gQ1RSICovCiAgeyAgCiAgICAvKiAgU2V0IHRoZSBLZXkqLwogICAgQ1JZUF9TZXRLZXkoaGNyeXAsIGhjcnlwLT5Jbml0LktleVNpemUpOwogIH0gICAgCiAgCiAgLyogU2V0IElWICovIAogIGlmIChoY3J5cC0+SW5pdC5BbGdvcml0aG0gIT0gQ1JZUF9BRVNfRUNCKQogIHsKICAgIC8qIFNldCB0aGUgSW5pdGlhbGl6YXRpb24gVmVjdG9yKi8KI2lmIGRlZmluZWQgKEFFUykgICAgICAgCiAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjMgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEluaXRWZWN0KTsKICAgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QrMSk7CiAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjEgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEluaXRWZWN0KzIpOwogICAgaGNyeXAtPkluc3RhbmNlLT5JVlIwID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCszKTsKI2Vsc2UgLyogQ1JZUCAqLwogICAgaGNyeXAtPkluc3RhbmNlLT5JVjBMUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QpOwogICAgaGNyeXAtPkluc3RhbmNlLT5JVjBSUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QrMSk7CiAgICBoY3J5cC0+SW5zdGFuY2UtPklWMUxSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCsyKTsKICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYxUlIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEluaXRWZWN0KzMpOwojZW5kaWYgLyogRW5kIEFFUyBvciBDUllQICovCiAgfSAgICAgCiAgLyogU2V0IHRoZSBwaGFzZSAqLwogIGhjcnlwLT5QaGFzZSA9IENSWVBfUEhBU0VfUFJPQ0VTUzsKICBpZihoY3J5cC0+U2l6ZSAhPSAwVSkKICB7IAogICAgCiNpZiBkZWZpbmVkIChBRVMpIAogICAgCiAgICAvKiBFbmFibGUgY29tcHV0YXRpb24gY29tcGxldGUgZmxhZyBhbmQgZXJyb3IgaW50ZXJydXB0cyAqLwogICAgX19IQUxfQ1JZUF9FTkFCTEVfSVQoaGNyeXAsQ1JZUF9JVF9DQ0ZJRSB8IENSWVBfSVRfRVJSSUUpOwogICAgCiAgICAvKiBFbmFibGUgQ1JZUCAqLwogICAgX19IQUxfQ1JZUF9FTkFCTEUoaGNyeXApOwogICAgCiAgICAvKiBXcml0ZSB0aGUgaW5wdXQgYmxvY2sgaW4gdGhlIElOIEZJRk8gKi8KICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCApOwogICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7CiAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQgKTsKICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOyAgIAogICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50ICk7CiAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCApOwogICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7ICAKICAgIAojZWxzZSAvKiBDUllQICovCiAgICAKICAgIC8qIEVuYWJsZSBpbnRlcnJ1cHRzICovCiAgICBfX0hBTF9DUllQX0VOQUJMRV9JVChoY3J5cCwgQ1JZUF9JVF9JTkkgfCBDUllQX0lUX09VVEkpOwogICAgCiAgICAvKiBFbmFibGUgQ1JZUCAqLwogICAgX19IQUxfQ1JZUF9FTkFCTEUoaGNyeXApOwogICAgCiNlbmRpZiAvKiBFbmQgQUVTIG9yIENSWVAgKi8gICAgICAgIAogIH0KICBlbHNlIAogIHsKICAgIC8qIFByb2Nlc3MgbG9ja2VkICovCiAgICBfX0hBTF9VTkxPQ0soaGNyeXApOwogICAgCiAgICAvKiBDaGFuZ2UgdGhlIENSWVAgc3RhdGUgKi8KICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOwogIH0gIAogIAogIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KICByZXR1cm4gSEFMX09LOwp9Ci8qKgogICogQGJyaWVmICBEZWNyeXB0aW9uIGluIEVDQi9DQkMgJiBDVFIgbW9kZSB3aXRoIEFFUyBTdGFuZGFyZCB1c2luZyBETUEgbW9kZQogICogQHBhcmFtICBoY3J5cDogcG9pbnRlciB0byBhIENSWVBfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucwogICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUKICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICovCnN0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBDUllQX0FFU19EZWNyeXB0X0RNQShDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwKQp7CiAgX19JTyB1aW50MzJfdCBjb3VudCA9IDBVOwogIAogIC8qICBLZXkgcHJlcGFyYXRpb24gZm9yIEVDQi9DQkMgKi8KICBpZiAoaGNyeXAtPkluaXQuQWxnb3JpdGhtICE9IENSWVBfQUVTX0NUUikgIAogIHsKI2lmIGRlZmluZWQgKEFFUykgCiAgICBpZiAoaGNyeXAtPkF1dG9LZXlEZXJpdmF0aW9uID09IERJU0FCTEUpLypNb2RlIDIga2V5IHByZXBhcmF0aW9uKi8KICAgIHsgICAgIAogICAgICAvKiBTZXQga2V5IHByZXBhcmF0aW9uIGZvciBkZWNyeXB0aW9uIG9wZXJhdGluZyBtb2RlKi8KICAgICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfTU9ERSwgQ1JZUF9PUEVSQVRJTkdNT0RFX0tFWURFUklWQVRJT04pOwogICAgICAKICAgICAgLyogIFNldCB0aGUgS2V5Ki8KICAgICAgQ1JZUF9TZXRLZXkoaGNyeXAsIGhjcnlwLT5Jbml0LktleVNpemUpOyAKICAgICAgCiAgICAgIC8qIEVuYWJsZSBDUllQICovCiAgICAgIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsKICAgICAgCiAgICAgIC8qIFdhaXQgZm9yIENDRiBmbGFnIHRvIGJlIHJhaXNlZCAqLwogICAgICBjb3VudCA9IENSWVBfVElNRU9VVF9LRVlQUkVQQVJBVElPTjsKICAgICAgZG8KICAgICAgewogICAgICAgIGNvdW50LS0gOwogICAgICAgIGlmKGNvdW50ID09IDBVKQogICAgICAgIHsKICAgICAgICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLwogICAgICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKICAgICAgICAgIAogICAgICAgICAgLyogQ2hhbmdlIHN0YXRlICovCiAgICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7CiAgICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsgCiAgICAgICAgICAKICAgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8gICAgICAgICAgCiAgICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOyAKICAgICAgICAgIHJldHVybiBIQUxfRVJST1I7CiAgICAgICAgfQogICAgICB9CiAgICAgIHdoaWxlKEhBTF9JU19CSVRfQ0xSKGhjcnlwLT5JbnN0YW5jZS0+U1IsIEFFU19TUl9DQ0YpKTsKICAgICAgCiAgICAgIC8qIENsZWFyIENDRiBGbGFnICovCiAgICAgIF9fSEFMX0NSWVBfQ0xFQVJfRkxBRyhoY3J5cCwgQ1JZUF9DQ0ZfQ0xFQVIpOwogICAgICAKICAgICAgLyogUmV0dXJuIHRvIGRlY3J5cHRpb24gb3BlcmF0aW5nIG1vZGUoTW9kZSAzKSovICAgICAgCiAgICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX01PREUsIENSWVBfT1BFUkFUSU5HTU9ERV9ERUNSWVBUKTsgICAKICAgIH0KICAgIGVsc2UgLypNb2RlIDQgOiBkZWNyeXB0aW9uICYga2V5IHByZXBhcmF0aW9uKi8KICAgIHsKICAgICAgLyogIFNldCB0aGUgS2V5Ki8KICAgICAgQ1JZUF9TZXRLZXkoaGNyeXAsIGhjcnlwLT5Jbml0LktleVNpemUpOwogICAgICAKICAgICAgLyogU2V0IGRlY3J5cHRpb24gJiBLZXkgcHJlcGFyYXRpb24gb3BlcmF0aW5nIG1vZGUqLyAKICAgICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfTU9ERSwgQ1JZUF9PUEVSQVRJTkdNT0RFX0tFWURFUklWQVRJT05fREVDUllQVCk7IAogICAgfSAgICAgCiNlbHNlIC8qIENSWVAgKi8gICAKICAgIC8qIGNoYW5nZSBBTEdPTU9ERSB0byBrZXkgcHJlcGFyYXRpb24gZm9yIGRlY3J5cHRpb24qLwogICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBDUllQX0NSX0FMR09NT0RFLCBDUllQX0NSX0FMR09NT0RFX0FFU19LRVkgKTsKICAgIAogICAgLyogIFNldCB0aGUgS2V5Ki8KICAgIENSWVBfU2V0S2V5KGhjcnlwLCBoY3J5cC0+SW5pdC5LZXlTaXplKTsKICAgIAogICAgLyogRW5hYmxlIENSWVAgKi8KICAgIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsKICAgIAogICAgLyogV2FpdCBmb3IgQlVTWSBmbGFnIHRvIGJlIHJhaXNlZCAqLwogICAgY291bnQgPSBDUllQX1RJTUVPVVRfS0VZUFJFUEFSQVRJT047CiAgICBkbwogICAgewogICAgICBjb3VudC0tIDsKICAgICAgaWYoY291bnQgPT0gMFUpCiAgICAgIHsKICAgICAgICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgY2xvY2sgKi8KICAgICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwogICAgICAgIAogICAgICAgIC8qIENoYW5nZSBzdGF0ZSAqLwogICAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfVElNRU9VVDsKICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsgIAogICAgICAgIAogICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8gICAgICAgICAgCiAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsgCiAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgICAgfQogICAgfQogICAgd2hpbGUoSEFMX0lTX0JJVF9TRVQoaGNyeXAtPkluc3RhbmNlLT5TUiwgQ1JZUF9GTEFHX0JVU1kpKTsKICAgIAogICAgLyogVHVybiBiYWNrIHRvIEFMR09NT0RFIG9mIHRoZSBjb25maWd1cmF0aW9uICovCiAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIENSWVBfQ1JfQUxHT01PREUsIGhjcnlwLT5Jbml0LkFsZ29yaXRobSApOyAKICAgIAojZW5kaWYgLyogRW5kIEFFUyBvciBDUllQICAqLyAKICB9CiAgZWxzZSAgLypBbGdvcml0aG0gQ1RSICovCiAgeyAgCiAgICAvKiAgU2V0IHRoZSBLZXkqLwogICAgQ1JZUF9TZXRLZXkoaGNyeXAsIGhjcnlwLT5Jbml0LktleVNpemUpOwogIH0gCiAgCiAgaWYgKGhjcnlwLT5Jbml0LkFsZ29yaXRobSAhPSBDUllQX0FFU19FQ0IpCiAgewogICAgLyogU2V0IHRoZSBJbml0aWFsaXphdGlvbiBWZWN0b3IqLwojaWYgZGVmaW5lZCAoQUVTKSAgICAgICAKICAgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMyA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QpOwogICAgaGNyeXAtPkluc3RhbmNlLT5JVlIyID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCsxKTsKICAgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMSA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QrMik7CiAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjAgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEluaXRWZWN0KzMpOwojZWxzZSAvKiBDUllQICovCiAgICBoY3J5cC0+SW5zdGFuY2UtPklWMExSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCk7CiAgICBoY3J5cC0+SW5zdGFuY2UtPklWMFJSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCsxKTsKICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYxTFIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEluaXRWZWN0KzIpOwogICAgaGNyeXAtPkluc3RhbmNlLT5JVjFSUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QrMyk7CiNlbmRpZiAvKiBFbmQgQUVTIG9yIENSWVAgICovCiAgfSAgICAgIAogIC8qIFNldCB0aGUgcGhhc2UgKi8KICBoY3J5cC0+UGhhc2UgPSBDUllQX1BIQVNFX1BST0NFU1M7CiAgCiAgaWYoaGNyeXAtPlNpemUgIT0gMFUpCiAgeyAgICAKICAgIC8qIFNldCB0aGUgaW5wdXQgYW5kIG91dHB1dCBhZGRyZXNzZXMgYW5kIHN0YXJ0IERNQSB0cmFuc2ZlciAqLyAKICAgIENSWVBfU2V0RE1BQ29uZmlnKGhjcnlwLCAodWludDMyX3QpKCBoY3J5cC0+cENyeXBJbkJ1ZmZQdHIpLCAoaGNyeXAtPlNpemUvNFUpLCAodWludDMyX3QpKGhjcnlwLT5wQ3J5cE91dEJ1ZmZQdHIpKTsgICAgCiAgfQogIGVsc2UgCiAgewogICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLwogICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKICAgIAogICAgLyogQ2hhbmdlIHRoZSBDUllQIHN0YXRlICovCiAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKICB9ICAgICAgIAogIAogIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KICByZXR1cm4gSEFMX09LOwp9CgoKLyoqCiAgKiBAYnJpZWYgIERNQSBDUllQIGlucHV0IGRhdGEgcHJvY2VzcyBjb21wbGV0ZSBjYWxsYmFjay4KICAqIEBwYXJhbSAgaGRtYTogRE1BIGhhbmRsZQogICogQHJldHZhbCBOb25lCiAgKi8Kc3RhdGljIHZvaWQgQ1JZUF9ETUFJbkNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpICAKewogIENSWVBfSGFuZGxlVHlwZURlZiogaGNyeXAgPSAoQ1JZUF9IYW5kbGVUeXBlRGVmKikoKERNQV9IYW5kbGVUeXBlRGVmKiloZG1hKS0+UGFyZW50OwogIAogIC8qIERpc2FibGUgdGhlIERNQSB0cmFuc2ZlciBmb3IgaW5wdXQgRklGTyByZXF1ZXN0IGJ5IHJlc2V0dGluZyB0aGUgRElFTiBiaXQKICBpbiB0aGUgRE1BQ1IgcmVnaXN0ZXIgKi8KI2lmIGRlZmluZWQgKENSWVApICAKICBoY3J5cC0+SW5zdGFuY2UtPkRNQUNSICY9ICh1aW50MzJfdCkofkNSWVBfRE1BQ1JfRElFTik7ICAKICAKI2Vsc2UgLyogQUVTICovCiAgQ0xFQVJfQklUKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIEFFU19DUl9ETUFJTkVOKTsKICAKICAvKiBUaW55QUVTMiwgTm8gb3V0cHV0IG9uIENDTSBBRVMsIHVubG9jayBzaG91bGQgYmUgZG9uZSB3aGVuIGlucHV0IGRhdGEgcHJvY2VzcyBjb21wbGV0ZSAqLwogIGlmKChoY3J5cC0+SW5pdC5BbGdvcml0aG0gJiBDUllQX0FFU19DQ00pID09IENSWVBfQUVTX0NDTSkKICB7ICAKICAgIC8qIENsZWFyIENDRiBmbGFnICovCiAgICBfX0hBTF9DUllQX0NMRUFSX0ZMQUcoaGNyeXAsQ1JZUF9DQ0ZfQ0xFQVIpOwogICAgCiAgICAvKiBDaGFuZ2UgdGhlIENSWVAgc3RhdGUgdG8gcmVhZHkgKi8KICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOwogICAgCiAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCiAgICBfX0hBTF9VTkxPQ0soaGNyeXApOwogIH0KI2VuZGlmIC8qIEVuZCBBRVMgb3IgQ1JZUCAqLyAKICAKICAvKiBDYWxsIGlucHV0IGRhdGEgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpIAogIC8qQ2FsbCByZWdpc3RlcmVkIElucHV0IGNvbXBsZXRlIGNhbGxiYWNrKi8KICBoY3J5cC0+SW5DcGx0Q2FsbGJhY2soaGNyeXApOwojZWxzZQogIC8qQ2FsbCBsZWdhY3kgd2VhayBJbnB1dCBjb21wbGV0ZSBjYWxsYmFjayovCiAgSEFMX0NSWVBfSW5DcGx0Q2FsbGJhY2soaGNyeXApOwojZW5kaWYgLyogVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyAqLyAKfQoKLyoqCiAgKiBAYnJpZWYgIERNQSBDUllQIG91dHB1dCBkYXRhIHByb2Nlc3MgY29tcGxldGUgY2FsbGJhY2suCiAgKiBAcGFyYW0gIGhkbWE6IERNQSBoYW5kbGUKICAqIEByZXR2YWwgTm9uZQogICovCnN0YXRpYyB2b2lkIENSWVBfRE1BT3V0Q3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKewogIENSWVBfSGFuZGxlVHlwZURlZiogaGNyeXAgPSAoQ1JZUF9IYW5kbGVUeXBlRGVmKikoKERNQV9IYW5kbGVUeXBlRGVmKiloZG1hKS0+UGFyZW50OwogIAogIC8qIERpc2FibGUgdGhlIERNQSB0cmFuc2ZlciBmb3Igb3V0cHV0IEZJRk8gcmVxdWVzdCBieSByZXNldHRpbmcKICB0aGUgRE9FTiBiaXQgaW4gdGhlIERNQUNSIHJlZ2lzdGVyICovCiAgCiNpZiBkZWZpbmVkIChDUllQKSAKCiAgaGNyeXAtPkluc3RhbmNlLT5ETUFDUiAmPSAodWludDMyX3QpKH5DUllQX0RNQUNSX0RPRU4pOwogIGlmKChoY3J5cC0+SW5pdC5BbGdvcml0aG0gJiBDUllQX0FFU19HQ00pICE9IENSWVBfQUVTX0dDTSkKICB7ICAKICAgIC8qIERpc2FibGUgQ1JZUCAgKG5vdCBhbGxvd2VkIGluICBHQ00pKi8KICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CiAgfQojZWxzZSAvKiBBRVMgKi8gCiAgCiAgQ0xFQVJfQklUKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIEFFU19DUl9ETUFPVVRFTik7CiAgCiAgLyogQ2xlYXIgQ0NGIGZsYWcgKi8KICBfX0hBTF9DUllQX0NMRUFSX0ZMQUcoaGNyeXAsQ1JZUF9DQ0ZfQ0xFQVIpOyAgCiAgCiAgaWYoKGhjcnlwLT5Jbml0LkFsZ29yaXRobSAmIENSWVBfQUVTX0dDTV9HTUFDKSAhPSBDUllQX0FFU19HQ01fR01BQykKICB7ICAKICAgIC8qIERpc2FibGUgQ1JZUCAobm90IGFsbG93ZWQgaW4gIEdDTSkqLyAKICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CiAgfSAKI2VuZGlmIC8qIEVuZCBBRVMgb3IgQ1JZUCAqLyAKICAKICAvKiBDaGFuZ2UgdGhlIENSWVAgc3RhdGUgdG8gcmVhZHkgKi8KICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKICAKICAvKiBQcm9jZXNzIHVubG9ja2VkICovCiAgX19IQUxfVU5MT0NLKGhjcnlwKTsgCiAgLyogQ2FsbCBvdXRwdXQgZGF0YSB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLwojaWYgKFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkgCiAgLypDYWxsIHJlZ2lzdGVyZWQgT3V0cHV0IGNvbXBsZXRlIGNhbGxiYWNrKi8KICBoY3J5cC0+T3V0Q3BsdENhbGxiYWNrKGhjcnlwKTsKI2Vsc2UKICAvKkNhbGwgbGVnYWN5IHdlYWsgT3V0cHV0IGNvbXBsZXRlIGNhbGxiYWNrKi8KICBIQUxfQ1JZUF9PdXRDcGx0Q2FsbGJhY2soaGNyeXApOwojZW5kaWYgLyogVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyAqLyAKfQoKLyoqCiAgKiBAYnJpZWYgIERNQSBDUllQIGNvbW11bmljYXRpb24gZXJyb3IgY2FsbGJhY2suIAogICogQHBhcmFtICBoZG1hOiBETUEgaGFuZGxlCiAgKiBAcmV0dmFsIE5vbmUKICAqLwpzdGF0aWMgdm9pZCBDUllQX0RNQUVycm9yKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQp7CiAgQ1JZUF9IYW5kbGVUeXBlRGVmKiBoY3J5cCA9IChDUllQX0hhbmRsZVR5cGVEZWYqKSgoRE1BX0hhbmRsZVR5cGVEZWYqKWhkbWEpLT5QYXJlbnQ7CiAgCiAgLyogQ2hhbmdlIHRoZSBDUllQIHBlcmlwaGVyYWwgc3RhdGUgKi8gCiAgaGNyeXAtPlN0YXRlPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKICAKICAvKiBETUEgZXJyb3IgY29kZSBmaWVsZCAqLwogIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfRE1BOyAKICAKI2lmIGRlZmluZWQgKEFFUykgCiAgCiAgLyogQ2xlYXIgQ0NGIGZsYWcgKi8KICBfX0hBTF9DUllQX0NMRUFSX0ZMQUcoaGNyeXAsQ1JZUF9DQ0ZfQ0xFQVIpOyAgCiAgCiNlbmRpZiAvKiBBRVMgKi8gICAKICAKICAvKiBDYWxsIGVycm9yIGNhbGxiYWNrICovCiNpZiAoVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKSAKICAvKkNhbGwgcmVnaXN0ZXJlZCBlcnJvciBjYWxsYmFjayovCiAgaGNyeXAtPkVycm9yQ2FsbGJhY2soaGNyeXApOwojZWxzZQogIC8qQ2FsbCBsZWdhY3kgd2VhayBlcnJvciBjYWxsYmFjayovCiAgSEFMX0NSWVBfRXJyb3JDYWxsYmFjayhoY3J5cCk7CiNlbmRpZiAvKiBVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTICovIAp9CgovKioKICAqIEBicmllZiAgU2V0IHRoZSBETUEgY29uZmlndXJhdGlvbiBhbmQgc3RhcnQgdGhlIERNQSB0cmFuc2ZlcgogICogQHBhcmFtICBoY3J5cDogcG9pbnRlciB0byBhIENSWVBfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucwogICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUKICAqIEBwYXJhbSAgaW5wdXRhZGRyOiBhZGRyZXNzIG9mIHRoZSBpbnB1dCBidWZmZXIKICAqIEBwYXJhbSAgU2l6ZTogc2l6ZSBvZiB0aGUgaW5wdXQgYnVmZmVyLCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuCiAgKiBAcGFyYW0gIG91dHB1dGFkZHI6IGFkZHJlc3Mgb2YgdGhlIG91dHB1dCBidWZmZXIKICAqIEByZXR2YWwgTm9uZQogICovCnN0YXRpYyB2b2lkIENSWVBfU2V0RE1BQ29uZmlnKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQzMl90IGlucHV0YWRkciwgdWludDE2X3QgU2l6ZSwgdWludDMyX3Qgb3V0cHV0YWRkcikKewogIC8qIFNldCB0aGUgQ1JZUCBETUEgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KICBoY3J5cC0+aGRtYWluLT5YZmVyQ3BsdENhbGxiYWNrID0gQ1JZUF9ETUFJbkNwbHQ7CiAgCiAgLyogU2V0IHRoZSBETUEgaW5wdXQgZXJyb3IgY2FsbGJhY2sgKi8KICBoY3J5cC0+aGRtYWluLT5YZmVyRXJyb3JDYWxsYmFjayA9IENSWVBfRE1BRXJyb3I7CiAgCiAgLyogU2V0IHRoZSBDUllQIERNQSB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLwogIGhjcnlwLT5oZG1hb3V0LT5YZmVyQ3BsdENhbGxiYWNrID0gQ1JZUF9ETUFPdXRDcGx0OwogIAogIC8qIFNldCB0aGUgRE1BIG91dHB1dCBlcnJvciBjYWxsYmFjayAqLwogIGhjcnlwLT5oZG1hb3V0LT5YZmVyRXJyb3JDYWxsYmFjayA9IENSWVBfRE1BRXJyb3I7CiAgCiNpZiBkZWZpbmVkIChDUllQKSAgIAogIAogIC8qIEVuYWJsZSBDUllQICovCiAgX19IQUxfQ1JZUF9FTkFCTEUoaGNyeXApOwogIAogIC8qIEVuYWJsZSB0aGUgaW5wdXQgRE1BIFN0cmVhbSAqLwogIGlmICggSEFMX0RNQV9TdGFydF9JVChoY3J5cC0+aGRtYWluLCBpbnB1dGFkZHIsICh1aW50MzJfdCkmaGNyeXAtPkluc3RhbmNlLT5ESU4sIFNpemUpIT1IQUxfT0spCiAgewogICAgLyogRE1BIGVycm9yIGNvZGUgZmllbGQgKi8KICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfRE1BOyAgCiAgICAKICAgIC8qIENhbGwgZXJyb3IgY2FsbGJhY2sgKi8KI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpIAogICAgLypDYWxsIHJlZ2lzdGVyZWQgZXJyb3IgY2FsbGJhY2sqLwogICAgaGNyeXAtPkVycm9yQ2FsbGJhY2soaGNyeXApOwojZWxzZQogICAgLypDYWxsIGxlZ2FjeSB3ZWFrIGVycm9yIGNhbGxiYWNrKi8KICAgIEhBTF9DUllQX0Vycm9yQ2FsbGJhY2soaGNyeXApOwojZW5kaWYgLyogVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyAqLyAKICB9ICAKICAvKiBFbmFibGUgdGhlIG91dHB1dCBETUEgU3RyZWFtICovCiAgaWYgKEhBTF9ETUFfU3RhcnRfSVQoaGNyeXAtPmhkbWFvdXQsICh1aW50MzJfdCkmaGNyeXAtPkluc3RhbmNlLT5ET1VULCBvdXRwdXRhZGRyLCBTaXplKSE9SEFMX09LKQogIHsKICAgIC8qIERNQSBlcnJvciBjb2RlIGZpZWxkICovCiAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX0RNQTsgIAogICAgCiAgICAvKiBDYWxsIGVycm9yIGNhbGxiYWNrICovCiNpZiAoVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKSAKICAgIC8qQ2FsbCByZWdpc3RlcmVkIGVycm9yIGNhbGxiYWNrKi8KICAgIGhjcnlwLT5FcnJvckNhbGxiYWNrKGhjcnlwKTsKI2Vsc2UKICAgIC8qQ2FsbCBsZWdhY3kgd2VhayBlcnJvciBjYWxsYmFjayovCiAgICBIQUxfQ1JZUF9FcnJvckNhbGxiYWNrKGhjcnlwKTsKI2VuZGlmIC8qIFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KICB9CiAgLyogRW5hYmxlIEluL091dCBETUEgcmVxdWVzdCAqLwogIGhjcnlwLT5JbnN0YW5jZS0+RE1BQ1IgPSBDUllQX0RNQUNSX0RPRU4gfCBDUllQX0RNQUNSX0RJRU47CiAgCiNlbHNlIC8qIEFFUyAqLwogIAogIGlmKCgoaGNyeXAtPkluaXQuQWxnb3JpdGhtICYgQ1JZUF9BRVNfR0NNX0dNQUMpICE9IENSWVBfQUVTX0dDTV9HTUFDKSAmJiAoKGhjcnlwLT5Jbml0LkFsZ29yaXRobSAmIENSWVBfQUVTX0NDTSkgIT0gQ1JZUF9BRVNfQ0NNKSkKICB7ICAKICAgIC8qIEVuYWJsZSBDUllQIChub3QgYWxsb3dlZCBpbiAgR0NNICYgQ0NNKSovIAogICAgX19IQUxfQ1JZUF9FTkFCTEUoaGNyeXApOwogIH0gCiAgCiAgLyogRW5hYmxlIHRoZSBETUEgaW5wdXQgc3RyZWFtICovCiAgaWYgKEhBTF9ETUFfU3RhcnRfSVQoaGNyeXAtPmhkbWFpbiwgaW5wdXRhZGRyLCAodWludDMyX3QpJmhjcnlwLT5JbnN0YW5jZS0+RElOUiwgU2l6ZSkhPUhBTF9PSykKICB7CiAgICAvKiBETUEgZXJyb3IgY29kZSBmaWVsZCAqLwogICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9ETUE7ICAKICAgIAogICAgLyogQ2FsbCBlcnJvciBjYWxsYmFjayAqLwojaWYgKFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkgCiAgICAvKkNhbGwgcmVnaXN0ZXJlZCBlcnJvciBjYWxsYmFjayovCiAgICBoY3J5cC0+RXJyb3JDYWxsYmFjayhoY3J5cCk7CiNlbHNlCiAgICAvKkNhbGwgbGVnYWN5IHdlYWsgZXJyb3IgY2FsbGJhY2sqLwogICAgSEFMX0NSWVBfRXJyb3JDYWxsYmFjayhoY3J5cCk7CiNlbmRpZiAvKiBVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTICovCiAgfSAgCiAgLyogRW5hYmxlIHRoZSBETUEgb3V0cHV0IHN0cmVhbSAqLwogIGlmIChIQUxfRE1BX1N0YXJ0X0lUKGhjcnlwLT5oZG1hb3V0LCAodWludDMyX3QpJmhjcnlwLT5JbnN0YW5jZS0+RE9VVFIsIG91dHB1dGFkZHIsIFNpemUpIT1IQUxfT0spCiAgewogICAgLyogRE1BIGVycm9yIGNvZGUgZmllbGQgKi8KICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfRE1BOyAgCiAgICAKICAgIC8qIENhbGwgZXJyb3IgY2FsbGJhY2sgKi8KI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpIAogICAgLypDYWxsIHJlZ2lzdGVyZWQgZXJyb3IgY2FsbGJhY2sqLwogICAgaGNyeXAtPkVycm9yQ2FsbGJhY2soaGNyeXApOwojZWxzZQogICAgLypDYWxsIGxlZ2FjeSB3ZWFrIGVycm9yIGNhbGxiYWNrKi8KICAgIEhBTF9DUllQX0Vycm9yQ2FsbGJhY2soaGNyeXApOwojZW5kaWYgLyogVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyAqLwogIH0gIAogLypBRVMydjEuMS4xIDogQ0NNIGF1dGhlbnRpY2F0aW9uIDogbm8gaW5pdCBwaGFzZSwgb25seSBoZWFkZXIgYW5kIGZpbmFsIHBoYXNlICovIAogIC8qIEVuYWJsZSBJbiBhbmQgT3V0IERNQSByZXF1ZXN0cyAqLwogIGlmKChoY3J5cC0+SW5pdC5BbGdvcml0aG0gJiBDUllQX0FFU19DQ00pID09IENSWVBfQUVTX0NDTSkKICB7IAogICAgLyogRW5hYmxlIG9ubHkgSW4gRE1BIHJlcXVlc3RzIGZvciBDQ00qLwogICAgU0VUX0JJVChoY3J5cC0+SW5zdGFuY2UtPkNSLCAoQUVTX0NSX0RNQUlORU4gKSk7CiAgfQogIGVsc2UKICB7CiAgICAvKiBFbmFibGUgSW4gYW5kIE91dCBETUEgcmVxdWVzdHMgKi8KICAgIFNFVF9CSVQoaGNyeXAtPkluc3RhbmNlLT5DUiwgKEFFU19DUl9ETUFJTkVOIHwgQUVTX0NSX0RNQU9VVEVOKSk7CiAgfSAgCiNlbmRpZiAvKiBFbmQgQUVTIG9yIENSWVAgKi8KfQoKLyoqCiAgKiBAYnJpZWYgIFByb2Nlc3MgRGF0YTogV3JpdGUgSW5wdXQgZGF0YSBpbiBwb2xsaW5nIG1vZGUgYW5kIHVzZWQgaW4gQUVTIGZ1bmN0aW9ucy4gCiAgKiBAcGFyYW0gIGhjcnlwOiBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCiAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZQogICogQHBhcmFtICBUaW1lb3V0OiBTcGVjaWZ5IFRpbWVvdXQgdmFsdWUgIAogICogQHJldHZhbCBOb25lCiAgKi8Kc3RhdGljIHZvaWQgQ1JZUF9BRVNfUHJvY2Vzc0RhdGEoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgdWludDMyX3QgVGltZW91dCkKewogIAogIHVpbnQzMl90IHRlbXA7ICAvKiBUZW1wb3JhcnkgQ3J5cE91dEJ1ZmYgKi8KI2lmIGRlZmluZWQgKENSWVApCiAgdWludDE2X3QgaW5jb3VudDsgIC8qIFRlbXBvcmFyeSBDcnlwSW5Db3VudCBWYWx1ZSAqLwogIHVpbnQxNl90IG91dGNvdW50OyAgLyogVGVtcG9yYXJ5IENyeXBPdXRDb3VudCBWYWx1ZSAqLwojZW5kaWYgCiAgCiNpZiBkZWZpbmVkIChDUllQKSAgCiAgIAogIC8qVGVtcG9yYXJ5IENyeXBPdXRDb3VudCBWYWx1ZSovCiAgaW5jb3VudCA9IGhjcnlwLT5DcnlwSW5Db3VudDsgCiAgCiAgaWYoKChoY3J5cC0+SW5zdGFuY2UtPlNSICYgQ1JZUF9GTEFHX0lGTkYgKSAhPSAweDBVKSAmJiAoaW5jb3VudCA8IChoY3J5cC0+U2l6ZS80VSkpKQogIHsKICAgIC8qIFdyaXRlIHRoZSBpbnB1dCBibG9jayBpbiB0aGUgSU4gRklGTyAqLwogICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQgKTsKICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOwogICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQgKTsKICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOyAgIAogICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQgKTsKICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOwogICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQgKTsKICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOyAgICAgIAogIH0KICAKICAvKiBXYWl0IGZvciBPRk5FIGZsYWcgdG8gYmUgcmFpc2VkICovCiAgaWYoQ1JZUF9XYWl0T25PRk5FRmxhZyhoY3J5cCwgVGltZW91dCkgIT0gSEFMX09LKSAgCiAgeyAKICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLwogICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKICAgIAogICAgLyogQ2hhbmdlIHN0YXRlICYgZXJyb3IgY29kZSovCiAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7CiAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKICAgIAogICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLyAgICAgICAgICAKICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7IAojaWYgKFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkgCiAgICAvKkNhbGwgcmVnaXN0ZXJlZCBlcnJvciBjYWxsYmFjayovCiAgICBoY3J5cC0+RXJyb3JDYWxsYmFjayhoY3J5cCk7CiNlbHNlCiAgICAvKkNhbGwgbGVnYWN5IHdlYWsgZXJyb3IgY2FsbGJhY2sqLwogICAgSEFMX0NSWVBfRXJyb3JDYWxsYmFjayhoY3J5cCk7CiNlbmRpZiAvKiBVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTICovIAogIH0gCiAgCiAgLypUZW1wb3JhcnkgQ3J5cE91dENvdW50IFZhbHVlKi8KICBvdXRjb3VudCA9IGhjcnlwLT5DcnlwT3V0Q291bnQ7CiAgCiAgaWYoKChoY3J5cC0+SW5zdGFuY2UtPlNSICYgQ1JZUF9GTEFHX09GTkUgKSAhPSAweDBVKSAmJiAob3V0Y291bnQgPCAoaGNyeXAtPlNpemUvNFUpKSkKICB7CiAgICAvKiBSZWFkIHRoZSBvdXRwdXQgYmxvY2sgZnJvbSB0aGUgT3V0cHV0IEZJRk8gYW5kIHB1dCB0aGVtIGluIHRlbXBvcmFyeSBidWZmZXIgdGhlbiBnZXQgQ3J5cE91dEJ1ZmYgZnJvbSB0ZW1wb3JhcnkgYnVmZmVyICAqLyAKICAgIHRlbXAgID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUOwogICAgKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBPdXRCdWZmUHRyICsgaGNyeXAtPkNyeXBPdXRDb3VudCkgPSB0ZW1wOyAgICAgIAogICAgaGNyeXAtPkNyeXBPdXRDb3VudCsrOwogICAgdGVtcCAgPSBoY3J5cC0+SW5zdGFuY2UtPkRPVVQ7ICAgIAogICAgKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBPdXRCdWZmUHRyICsgaGNyeXAtPkNyeXBPdXRDb3VudCkgPSB0ZW1wOwogICAgaGNyeXAtPkNyeXBPdXRDb3VudCsrOyAgICAKICAgIHRlbXAgID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUOyAgICAKICAgICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwT3V0QnVmZlB0ciArIGhjcnlwLT5DcnlwT3V0Q291bnQpID0gdGVtcDsgICAgICAKICAgIGhjcnlwLT5DcnlwT3V0Q291bnQrKzsKICAgIHRlbXAgID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUOyAgIAogICAgKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBPdXRCdWZmUHRyICsgaGNyeXAtPkNyeXBPdXRDb3VudCkgPSB0ZW1wOwogICAgaGNyeXAtPkNyeXBPdXRDb3VudCsrOyAKICB9IAogIAojZWxzZSAvKiBBRVMgKi8KICAKICAvKiBXcml0ZSB0aGUgaW5wdXQgYmxvY2sgaW4gdGhlIElOIEZJRk8gKi8KICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQgKTsKICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQgKTsKICBoY3J5cC0+Q3J5cEluQ291bnQrKzsgICAKICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQgKTsKICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQgKTsKICBoY3J5cC0+Q3J5cEluQ291bnQrKzsgICAgICAKICAKICAvKiBXYWl0IGZvciBDQ0YgZmxhZyB0byBiZSByYWlzZWQgKi8KICBpZihDUllQX1dhaXRPbkNDRmxhZyhoY3J5cCwgVGltZW91dCkgIT0gSEFMX09LKSAgCiAgeyAKICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLwogICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKICAgIAogICAgLyogQ2hhbmdlIHN0YXRlICovCiAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7CiAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsgIAogICAgCiAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovICAgICAgICAgIAogICAgX19IQUxfVU5MT0NLKGhjcnlwKTsgCiNpZiAoVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKSAKICAgIC8qQ2FsbCByZWdpc3RlcmVkIGVycm9yIGNhbGxiYWNrKi8KICAgIGhjcnlwLT5FcnJvckNhbGxiYWNrKGhjcnlwKTsKI2Vsc2UKICAgIC8qQ2FsbCBsZWdhY3kgd2VhayBlcnJvciBjYWxsYmFjayovCiAgICBIQUxfQ1JZUF9FcnJvckNhbGxiYWNrKGhjcnlwKTsKI2VuZGlmIC8qIFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8gCiAgfQogIAogIC8qIENsZWFyIENDRiBGbGFnICovCiAgX19IQUxfQ1JZUF9DTEVBUl9GTEFHKGhjcnlwLCBDUllQX0NDRl9DTEVBUik7CiAgCiAgLyogUmVhZCB0aGUgb3V0cHV0IGJsb2NrIGZyb20gdGhlIG91dHB1dCBGSUZPIGFuZCBwdXQgdGhlbSBpbiB0ZW1wb3JhcnkgYnVmZmVyIHRoZW4gZ2V0IENyeXBPdXRCdWZmIGZyb20gdGVtcG9yYXJ5IGJ1ZmZlciovIAogIHRlbXAgID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUUjsKICAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cE91dEJ1ZmZQdHIgKyAoaGNyeXAtPkNyeXBPdXRDb3VudCkpID10ZW1wOwogIGhjcnlwLT5DcnlwT3V0Q291bnQrKzsKICB0ZW1wICA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVFI7CiAgKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBPdXRCdWZmUHRyICsgaGNyeXAtPkNyeXBPdXRDb3VudCkgICA9dGVtcDsKICBoY3J5cC0+Q3J5cE91dENvdW50Kys7ICAgIAogIHRlbXAgID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUUjsKICAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cE91dEJ1ZmZQdHIgKyAoaGNyeXAtPkNyeXBPdXRDb3VudCkpID0gdGVtcDsgICAgICAKICBoY3J5cC0+Q3J5cE91dENvdW50Kys7CiAgdGVtcCAgPSBoY3J5cC0+SW5zdGFuY2UtPkRPVVRSOyAKICAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cE91dEJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cE91dENvdW50KSAgID0gdGVtcDsKICBoY3J5cC0+Q3J5cE91dENvdW50Kys7IAogIAojZW5kaWYgLyogRW5kIEFFUyBvciBDUllQICovCn0KCi8qKiAKICAqIEBicmllZiAgSGFuZGxlIENSWVAgYmxvY2sgaW5wdXQvb3V0cHV0IGRhdGEgaGFuZGxpbmcgdW5kZXIgaW50ZXJydXB0aW9uLgogICogQG5vdGUgICBUaGUgZnVuY3Rpb24gaXMgY2FsbGVkIHVuZGVyIGludGVycnVwdGlvbiBvbmx5LCBvbmNlCiAgKiAgICAgICAgIGludGVycnVwdGlvbnMgaGF2ZSBiZWVuIGVuYWJsZWQgYnkgSEFMX0NSWVBfRW5jcnlwdF9JVCBvciBIQUxfQ1JZUF9EZWNyeXB0X0lULgogICogQHBhcmFtICBoY3J5cDogcG9pbnRlciB0byBhIENSWVBfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucwogICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUuCiAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAqLwpzdGF0aWMgdm9pZCBDUllQX0FFU19JVChDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwKQp7CiAgdWludDMyX3QgdGVtcDsgIC8qIFRlbXBvcmFyeSBDcnlwT3V0QnVmZiAqLwojaWYgZGVmaW5lZCAoQ1JZUCkgCiAgdWludDE2X3QgaW5jb3VudDsgLyogVGVtcG9yYXJ5IENyeXBJbkNvdW50IFZhbHVlICovCiAgdWludDE2X3Qgb3V0Y291bnQ7ICAvKiBUZW1wb3JhcnkgQ3J5cE91dENvdW50IFZhbHVlICovCiNlbmRpZiAKICAKICBpZihoY3J5cC0+U3RhdGUgPT0gSEFMX0NSWVBfU1RBVEVfQlVTWSkKICB7IAojaWYgZGVmaW5lZCAoQ1JZUCkgCiAgIAogICAgLypUZW1wb3JhcnkgQ3J5cE91dENvdW50IFZhbHVlKi8KICAgIGluY291bnQgPSBoY3J5cC0+Q3J5cEluQ291bnQ7CiAgICBpZigoKGhjcnlwLT5JbnN0YW5jZS0+U1IgJiBDUllQX0ZMQUdfSUZORiApICE9IDB4MFUpICYmIChpbmNvdW50IDwgKGhjcnlwLT5TaXplLzRVKSkpCiAgICB7CiAgICAgIC8qIFdyaXRlIHRoZSBpbnB1dCBibG9jayBpbiB0aGUgSU4gRklGTyAqLwogICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCApOwogICAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQgKTsKICAgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7ICAgCiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50ICk7CiAgICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOwogICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCApOwogICAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsgICAgICAKICAgICAgaWYoaGNyeXAtPkNyeXBJbkNvdW50ID09ICAoKHVpbnQxNl90KShoY3J5cC0+U2l6ZSkvNFUpKQogICAgICB7ICAgICAKICAgICAgICAvKiBEaXNhYmxlIGludGVycnVwdHMgKi8KICAgICAgICBfX0hBTF9DUllQX0RJU0FCTEVfSVQoaGNyeXAsIENSWVBfSVRfSU5JKTsKICAgICAgICAKICAgICAgICAvKiBDYWxsIHRoZSBpbnB1dCBkYXRhIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCiNpZiAoVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKSAKICAgICAgICAvKkNhbGwgcmVnaXN0ZXJlZCBJbnB1dCBjb21wbGV0ZSBjYWxsYmFjayovCiAgICAgICAgaGNyeXAtPkluQ3BsdENhbGxiYWNrKGhjcnlwKTsKI2Vsc2UKICAgICAgICAvKkNhbGwgbGVnYWN5IHdlYWsgSW5wdXQgY29tcGxldGUgY2FsbGJhY2sqLwogICAgICAgIEhBTF9DUllQX0luQ3BsdENhbGxiYWNrKGhjcnlwKTsKI2VuZGlmIC8qIFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KICAgICAgfQogICAgfQogICAgLypUZW1wb3JhcnkgQ3J5cE91dENvdW50IFZhbHVlKi8KICAgIG91dGNvdW50ID0gaGNyeXAtPkNyeXBPdXRDb3VudDsKICAgIAogICAgaWYoKChoY3J5cC0+SW5zdGFuY2UtPlNSICYgQ1JZUF9GTEFHX09GTkUgKSAhPSAweDBVKSAmJiAob3V0Y291bnQgPCAoaGNyeXAtPlNpemUvNFUpKSkKICAgIHsKICAgICAgLyogUmVhZCB0aGUgb3V0cHV0IGJsb2NrIGZyb20gdGhlIG91dHB1dCBGSUZPIGFuZCBwdXQgdGhlbSBpbiB0ZW1wb3JhcnkgYnVmZmVyIHRoZW4gZ2V0IENyeXBPdXRCdWZmIGZyb20gdGVtcG9yYXJ5IGJ1ZmZlciAgKi8gCiAgICAgIHRlbXAgID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUOwogICAgICAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cE91dEJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cE91dENvdW50KSA9IHRlbXA7ICAgICAgCiAgICAgIGhjcnlwLT5DcnlwT3V0Q291bnQrKzsKICAgICAgdGVtcCAgPSBoY3J5cC0+SW5zdGFuY2UtPkRPVVQ7ICAgIAogICAgICAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cE91dEJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cE91dENvdW50KSA9IHRlbXA7CiAgICAgIGhjcnlwLT5DcnlwT3V0Q291bnQrKzsgICAgCiAgICAgIHRlbXAgID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUOyAgICAKICAgICAgKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBPdXRCdWZmUHRyICsgaGNyeXAtPkNyeXBPdXRDb3VudCkgPSB0ZW1wOyAgICAgIAogICAgICBoY3J5cC0+Q3J5cE91dENvdW50Kys7CiAgICAgIHRlbXAgID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUOyAgIAogICAgICAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cE91dEJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cE91dENvdW50KSA9IHRlbXA7CiAgICAgIGhjcnlwLT5DcnlwT3V0Q291bnQrKzsgCiAgICAgIGlmKGhjcnlwLT5DcnlwT3V0Q291bnQgPT0gICgodWludDE2X3QpKGhjcnlwLT5TaXplKS80VSkpCiAgICAgIHsKICAgICAgICAvKiBEaXNhYmxlIGludGVycnVwdHMgKi8KICAgICAgICBfX0hBTF9DUllQX0RJU0FCTEVfSVQoaGNyeXAsIENSWVBfSVRfT1VUSSk7CiAgICAgICAgCiAgICAgICAgLyogQ2hhbmdlIHRoZSBDUllQIHN0YXRlICovCiAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7ICAgICAgICAKICAgICAgICAKICAgICAgICAvKiBEaXNhYmxlIENSWVAgKi8KICAgICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwogICAgICAgIAogICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOwogICAgICAgIAogICAgICAvKiBDYWxsIE91dHB1dCB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLwojaWYgKFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkgCiAgICAgIC8qQ2FsbCByZWdpc3RlcmVkIE91dHB1dCBjb21wbGV0ZSBjYWxsYmFjayovCiAgICAgIGhjcnlwLT5PdXRDcGx0Q2FsbGJhY2soaGNyeXApOwojZWxzZQogICAgICAvKkNhbGwgbGVnYWN5IHdlYWsgT3V0cHV0IGNvbXBsZXRlIGNhbGxiYWNrKi8KICAgICAgSEFMX0NSWVBfT3V0Q3BsdENhbGxiYWNrKGhjcnlwKTsKI2VuZGlmIC8qIFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KICAgICAgfQogICAgfQogICAgCiNlbHNlIC8qQUVTKi8KICAgIAogICAgLyogUmVhZCB0aGUgb3V0cHV0IGJsb2NrIGZyb20gdGhlIG91dHB1dCBGSUZPIGFuZCBwdXQgdGhlbSBpbiB0ZW1wb3JhcnkgYnVmZmVyIHRoZW4gZ2V0IENyeXBPdXRCdWZmIGZyb20gdGVtcG9yYXJ5IGJ1ZmZlciovIAogICAgdGVtcCAgPSBoY3J5cC0+SW5zdGFuY2UtPkRPVVRSOwogICAgKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBPdXRCdWZmUHRyICsgKGhjcnlwLT5DcnlwT3V0Q291bnQpKSA9dGVtcDsKICAgIGhjcnlwLT5DcnlwT3V0Q291bnQrKzsKICAgIHRlbXAgID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUUjsKICAgICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwT3V0QnVmZlB0ciArIGhjcnlwLT5DcnlwT3V0Q291bnQpICAgPXRlbXA7CiAgICBoY3J5cC0+Q3J5cE91dENvdW50Kys7ICAgIAogICAgdGVtcCAgPSBoY3J5cC0+SW5zdGFuY2UtPkRPVVRSOwogICAgKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBPdXRCdWZmUHRyICsgKGhjcnlwLT5DcnlwT3V0Q291bnQpKSA9IHRlbXA7ICAgICAgCiAgICBoY3J5cC0+Q3J5cE91dENvdW50Kys7CiAgICB0ZW1wICA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVFI7IAogICAgKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBPdXRCdWZmUHRyICsgaGNyeXAtPkNyeXBPdXRDb3VudCkgICA9IHRlbXA7CiAgICBoY3J5cC0+Q3J5cE91dENvdW50Kys7IAogICAgCiAgICBpZihoY3J5cC0+Q3J5cE91dENvdW50ID09ICAoaGNyeXAtPlNpemUvNFUpKQogICAgewogICAgICAvKiBEaXNhYmxlIENvbXB1dGF0aW9uIENvbXBsZXRlIGZsYWcgYW5kIGVycm9ycyBpbnRlcnJ1cHRzICovCiAgICAgIF9fSEFMX0NSWVBfRElTQUJMRV9JVChoY3J5cCxDUllQX0lUX0NDRklFfENSWVBfSVRfRVJSSUUpOwogICAgICAKICAgICAgLyogQ2hhbmdlIHRoZSBDUllQIHN0YXRlICovCiAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOwogICAgICAKICAgICAgLyogRGlzYWJsZSBDUllQICovCiAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CiAgICAgIAogICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCiAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CiAgICAgIAogICAgICAvKiBDYWxsIE91dHB1dCB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLwojaWYgKFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkgCiAgICAgIC8qQ2FsbCByZWdpc3RlcmVkIE91dHB1dCBjb21wbGV0ZSBjYWxsYmFjayovCiAgICAgIGhjcnlwLT5PdXRDcGx0Q2FsbGJhY2soaGNyeXApOwojZWxzZQogICAgICAvKkNhbGwgbGVnYWN5IHdlYWsgT3V0cHV0IGNvbXBsZXRlIGNhbGxiYWNrKi8KICAgICAgSEFMX0NSWVBfT3V0Q3BsdENhbGxiYWNrKGhjcnlwKTsKI2VuZGlmIC8qIFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KICAgIH0KICAgIGVsc2UKICAgIHsgIAogICAgICAvKiBXcml0ZSB0aGUgaW5wdXQgYmxvY2sgaW4gdGhlIElOIEZJRk8gKi8KICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50ICk7CiAgICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOwogICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQgKTsKICAgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7ICAgCiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCApOwogICAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50ICk7CiAgICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOyAgICAgIAogICAgICAKICAgICAgaWYoaGNyeXAtPkNyeXBJbkNvdW50ID09ICAoaGNyeXAtPlNpemUvNFUpKSAKICAgICAgeyAgICAKICAgICAgICAvKiBDYWxsIElucHV0IHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCiNpZiAoVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkgCiAgICAgICAgLypDYWxsIHJlZ2lzdGVyZWQgSW5wdXQgY29tcGxldGUgY2FsbGJhY2sqLwogICAgICAgIGhjcnlwLT5JbkNwbHRDYWxsYmFjayhoY3J5cCk7CiNlbHNlCiAgICAgICAgLypDYWxsIGxlZ2FjeSB3ZWFrIElucHV0IGNvbXBsZXRlIGNhbGxiYWNrKi8KICAgICAgICBIQUxfQ1JZUF9JbkNwbHRDYWxsYmFjayhoY3J5cCk7CiNlbmRpZiAvKiBVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTICovCiAgICAgIH0gICAKICAgIH0gCiNlbmRpZiAvKiBFbmQgQUVTIG9yIENSWVAgICovCiAgIAogIH0gCiAgZWxzZQogIHsKICAgIC8qIEJ1c3kgZXJyb3IgY29kZSBmaWVsZCAqLwogICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9CVVNZOyAKI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpIAogICAgLypDYWxsIHJlZ2lzdGVyZWQgZXJyb3IgY2FsbGJhY2sqLwogICAgaGNyeXAtPkVycm9yQ2FsbGJhY2soaGNyeXApOwojZWxzZQogICAgLypDYWxsIGxlZ2FjeSB3ZWFrIGVycm9yIGNhbGxiYWNrKi8KICAgIEhBTF9DUllQX0Vycm9yQ2FsbGJhY2soaGNyeXApOwojZW5kaWYgLyogVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyAqLyAKICB9Cn0gCgovKioKICAqIEBicmllZiAgV3JpdGVzIEtleSBpbiBLZXkgcmVnaXN0ZXJzLiAKICAqIEBwYXJhbSAgaGNyeXA6IHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIENSWVAgbW9kdWxlCiAgKiBAcGFyYW0gIEtleVNpemU6IFNpemUgb2YgS2V5CiAgKiBAcmV0dmFsIE5vbmUKICAqLwpzdGF0aWMgdm9pZCBDUllQX1NldEtleShDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50MzJfdCBLZXlTaXplKQp7ICAKI2lmIGRlZmluZWQgKENSWVApCiAgCiAgc3dpdGNoKEtleVNpemUpCiAgewogIGNhc2UgQ1JZUF9LRVlTSVpFXzI1NkI6CiAgICBoY3J5cC0+SW5zdGFuY2UtPkswTFIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEtleSk7CiAgICBoY3J5cC0+SW5zdGFuY2UtPkswUlIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEtleSsxKTsKICAgIGhjcnlwLT5JbnN0YW5jZS0+SzFMUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wS2V5KzIpOwogICAgaGNyeXAtPkluc3RhbmNlLT5LMVJSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBLZXkrMyk7CiAgICBoY3J5cC0+SW5zdGFuY2UtPksyTFIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEtleSs0KTsKICAgIGhjcnlwLT5JbnN0YW5jZS0+SzJSUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wS2V5KzUpOwogICAgaGNyeXAtPkluc3RhbmNlLT5LM0xSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBLZXkrNik7CiAgICBoY3J5cC0+SW5zdGFuY2UtPkszUlIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEtleSs3KTsgCiAgICBicmVhazsKICBjYXNlIENSWVBfS0VZU0laRV8xOTJCOgogICAgaGNyeXAtPkluc3RhbmNlLT5LMUxSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBLZXkpOwogICAgaGNyeXAtPkluc3RhbmNlLT5LMVJSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBLZXkrMSk7CiAgICBoY3J5cC0+SW5zdGFuY2UtPksyTFIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEtleSsyKTsKICAgIGhjcnlwLT5JbnN0YW5jZS0+SzJSUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wS2V5KzMpOwogICAgaGNyeXAtPkluc3RhbmNlLT5LM0xSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBLZXkrNCk7CiAgICBoY3J5cC0+SW5zdGFuY2UtPkszUlIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEtleSs1KTsgCiAgICBicmVhazsKICBjYXNlIENSWVBfS0VZU0laRV8xMjhCOiAgICAgICAgIAogICAgaGNyeXAtPkluc3RhbmNlLT5LMkxSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBLZXkpOwogICAgaGNyeXAtPkluc3RhbmNlLT5LMlJSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBLZXkrMSk7CiAgICBoY3J5cC0+SW5zdGFuY2UtPkszTFIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEtleSsyKTsKICAgIGhjcnlwLT5JbnN0YW5jZS0+SzNSUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wS2V5KzMpOyAKICAgIAogICAgYnJlYWs7CiAgZGVmYXVsdDoKICAgIGJyZWFrOwogIH0KI2Vsc2UgLypBRVMqLwogIHN3aXRjaChLZXlTaXplKQogIHsKICBjYXNlIENSWVBfS0VZU0laRV8yNTZCOgogICAgaGNyeXAtPkluc3RhbmNlLT5LRVlSNyA9Kih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBLZXkpOyAgIAogICAgaGNyeXAtPkluc3RhbmNlLT5LRVlSNiA9Kih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBLZXkrMSk7CiAgICBoY3J5cC0+SW5zdGFuY2UtPktFWVI1ID0qKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEtleSsyKTsKICAgIGhjcnlwLT5JbnN0YW5jZS0+S0VZUjQgPSoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wS2V5KzMpOwogICAgaGNyeXAtPkluc3RhbmNlLT5LRVlSMyA9Kih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBLZXkrNCk7ICAgCiAgICBoY3J5cC0+SW5zdGFuY2UtPktFWVIyID0qKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEtleSs1KTsKICAgIGhjcnlwLT5JbnN0YW5jZS0+S0VZUjEgPSoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wS2V5KzYpOwogICAgaGNyeXAtPkluc3RhbmNlLT5LRVlSMCA9Kih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBLZXkrNyk7CiAgICBicmVhazsKICBjYXNlIENSWVBfS0VZU0laRV8xMjhCOiAgIAogICAgaGNyeXAtPkluc3RhbmNlLT5LRVlSMyA9Kih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBLZXkpOyAgIAogICAgaGNyeXAtPkluc3RhbmNlLT5LRVlSMiA9Kih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBLZXkrMSk7CiAgICBoY3J5cC0+SW5zdGFuY2UtPktFWVIxID0qKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEtleSsyKTsKICAgIGhjcnlwLT5JbnN0YW5jZS0+S0VZUjAgPSoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wS2V5KzMpOyAgIAogICAgCiAgICBicmVhazsKICBkZWZhdWx0OgogICAgYnJlYWs7CiAgfQojZW5kaWYgLyogRW5kIEFFUyBvciBDUllQICAqLwp9CgoKLyoqCiAgKiBAYnJpZWYgIEVuY3J5cHRpb24vRGVjcnlwdGlvbiBwcm9jZXNzIGluIEFFUyBHQ00gbW9kZSBhbmQgcHJlcGFyZSB0aGUgYXV0aGVudGljYXRpb24gVEFHIAogICogQHBhcmFtICBoY3J5cDogcG9pbnRlciB0byBhIENSWVBfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucwogICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUKICAqIEBwYXJhbSAgVGltZW91dDogVGltZW91dCBkdXJhdGlvbgogICogQHJldHZhbCBIQUwgc3RhdHVzCiAgKi8Kc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIENSWVBfQUVTR0NNX1Byb2Nlc3MoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgdWludDMyX3QgVGltZW91dCkKewogIHVpbnQzMl90IHRpY2tzdGFydDsKICB1aW50MzJfdCB3b3Jkc2l6ZSA9ICh1aW50MzJfdCkoaGNyeXAtPlNpemUpLzRVIDsKICB1aW50MTZfdCBvdXRjb3VudDsgIC8qIFRlbXBvcmFyeSBDcnlwT3V0Q291bnQgVmFsdWUgKi8KICAgIAogIC8qICBSZXNldCBDcnlwSGVhZGVyQ291bnQgKi8KICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50ID0gMFU7IAogIAogIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogSW5pdCBwaGFzZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogIAogIENSWVBfU0VUX1BIQVNFKGhjcnlwLENSWVBfUEhBU0VfSU5JVCk7CiAgCiAgLyogU2V0IHRoZSBrZXkgKi8KICBDUllQX1NldEtleShoY3J5cCwgaGNyeXAtPkluaXQuS2V5U2l6ZSk7CiAgCiNpZiBkZWZpbmVkKENSWVApICAKICAKICAvKiBTZXQgdGhlIGluaXRpYWxpemF0aW9uIHZlY3RvciBhbmQgdGhlIGNvdW50ZXIgOiBJbml0aWFsIENvdW50ZXIgQmxvY2sgKElDQikqLwogIGhjcnlwLT5JbnN0YW5jZS0+SVYwTFIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEluaXRWZWN0KTsKICBoY3J5cC0+SW5zdGFuY2UtPklWMFJSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCsxKTsKICBoY3J5cC0+SW5zdGFuY2UtPklWMUxSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCsyKTsKICBoY3J5cC0+SW5zdGFuY2UtPklWMVJSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCszKTsKICAKICAvKiBFbmFibGUgdGhlIENSWVAgcGVyaXBoZXJhbCAqLwogIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsKICAKICAvKiBHZXQgdGljayAqLwogIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CiAgCiAgLypXYWl0IGZvciB0aGUgQ1JZUEVOIGJpdCB0byBiZSBjbGVhcmVkKi8KICB3aGlsZSgoaGNyeXAtPkluc3RhbmNlLT5DUiAmIENSWVBfQ1JfQ1JZUEVOKSA9PSBDUllQX0NSX0NSWVBFTikKICB7CiAgICAvKiBDaGVjayBmb3IgdGhlIFRpbWVvdXQgKi8KICAgIGlmKFRpbWVvdXQgIT0gSEFMX01BWF9ERUxBWSkKICAgIHsKICAgICAgaWYoKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0ICkgPiBUaW1lb3V0KXx8KFRpbWVvdXQgPT0gMFUpKQogICAgICB7CiAgICAgICAgLyogRGlzYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIGNsb2NrICovCiAgICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKICAgICAgICAKICAgICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7CiAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7ICAKICAgICAgICAKICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovICAgICAgICAgIAogICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7IAogICAgICAgIHJldHVybiBIQUxfRVJST1I7CiAgICAgIH0KICAgIH0KICB9CiAgCiNlbHNlIC8qIEFFUyAqLwogIC8qIFdvcmthcm91bmQgMSA6IG9ubHkgQUVTLgogIERhdGF0eXBlIGNvbmZpZ3VyYXRpb24gbXVzdCBiZSAzMiBiaXRzIGR1cmluZyBJbml0IHBoYXNlLiBPbmx5LCBhZnRlciBJbml0LCBhbmQgYmVmb3JlIHJlCiAgZW5hYmxpbmcgdGhlIElQLCBkYXRhdHlwZSBkaWZmZXJlbnQgZnJvbSAzMiBiaXRzIGNhbiBiZSBjb25maWd1cmVkLiovCiAgLyogU2VsZWN0IERBVEFUWVBFIDMyICAqLwogIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX0RBVEFUWVBFLCBDUllQX0RBVEFUWVBFXzMyQik7ICAgCiAgCiAgLyogU2V0IHRoZSBpbml0aWFsaXphdGlvbiB2ZWN0b3IgYW5kIHRoZSBjb3VudGVyIDogSW5pdGlhbCBDb3VudGVyIEJsb2NrIChJQ0IpKi8KICBoY3J5cC0+SW5zdGFuY2UtPklWUjMgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEluaXRWZWN0KTsKICBoY3J5cC0+SW5zdGFuY2UtPklWUjIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEluaXRWZWN0KzEpOwogIGhjcnlwLT5JbnN0YW5jZS0+SVZSMSA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QrMik7CiAgaGNyeXAtPkluc3RhbmNlLT5JVlIwID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCszKTsKICAKICAvKiBFbmFibGUgdGhlIENSWVAgcGVyaXBoZXJhbCAqLwogIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsKICAKICAvKiBqdXN0IHdhaXQgZm9yIGhhc2ggY29tcHV0YXRpb24gKi8KICBpZihDUllQX1dhaXRPbkNDRmxhZyhoY3J5cCwgVGltZW91dCkgIT0gSEFMX09LKSAgCiAgeyAKICAgIC8qIENoYW5nZSBzdGF0ZSAqLwogICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9USU1FT1VUOwogICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7ICAgICAgICAgIAogICAgCiAgICAvKiBQcm9jZXNzIHVubG9ja2VkICYgcmV0dXJuIGVycm9yICovCiAgICBfX0hBTF9VTkxPQ0soaGNyeXApOyAgICAgICAgICAKICAgIHJldHVybiBIQUxfRVJST1I7CiAgfQogIC8qIENsZWFyIENDRiBmbGFnICovCiAgX19IQUxfQ1JZUF9DTEVBUl9GTEFHKGhjcnlwLCBDUllQX0NDRl9DTEVBUik7CiAgCiNlbmRpZiAvKiBFbmQgQUVTIG9yIENSWVAgICovICAKICAKICAvKioqKioqKioqKioqKioqKioqKioqKioqIEhlYWRlciBwaGFzZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogIAogIGlmKENSWVBfR0NNQ0NNX1NldEhlYWRlclBoYXNlKGhjcnlwLCAgVGltZW91dCkgIT0gSEFMX09LKQogIHsKICAgIHJldHVybiBIQUxfRVJST1I7CiAgfQogIAogIC8qKioqKioqKioqKioqKioqKioqKioqKioqUGF5bG9hZCBwaGFzZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovICAgCiAgCiAgLyogU2V0IHRoZSBwaGFzZSAqLwogIGhjcnlwLT5QaGFzZSA9IENSWVBfUEhBU0VfUFJPQ0VTUzsKICAKI2lmIGRlZmluZWQoQ1JZUCkgIAogIAogIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCAqLwogIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CiAgCiAgLyogU2VsZWN0IHBheWxvYWQgcGhhc2Ugb25jZSB0aGUgaGVhZGVyIHBoYXNlIGlzIHBlcmZvcm1lZCAqLwogIENSWVBfU0VUX1BIQVNFKGhjcnlwLCBDUllQX1BIQVNFX1BBWUxPQUQpOyAKICAKICAvKiBFbmFibGUgdGhlIENSWVAgcGVyaXBoZXJhbCAqLwogIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsKICAKI2Vsc2UgLyogQUVTICovCiAgCiAgLyogU2VsZWN0IHBheWxvYWQgcGhhc2Ugb25jZSB0aGUgaGVhZGVyIHBoYXNlIGlzIHBlcmZvcm1lZCAqLwogIENSWVBfU0VUX1BIQVNFKGhjcnlwLCBDUllQX1BIQVNFX1BBWUxPQUQpOwogIAojZW5kaWYgLyogRW5kIEFFUyBvciBDUllQICAqLyAKICAKICBpZiAoKGhjcnlwLT5TaXplICUgMTZVKSAhPSAwVSkgCiAgewogICAgLyogcmVjYWxjdWxhdGUgIHdvcmRzaXplICovIAogICAgd29yZHNpemUgPSAgKCh3b3Jkc2l6ZS80VSkqNFUpIDsgCiAgfQogIAogIC8qIEdldCB0aWNrICovCiAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKICAvKlRlbXBvcmFyeSBDcnlwT3V0Q291bnQgVmFsdWUqLwogIG91dGNvdW50ID0gaGNyeXAtPkNyeXBPdXRDb3VudDsKICAKICAvKiBXcml0ZSBpbnB1dCBkYXRhIGFuZCBnZXQgb3V0cHV0IERhdGEgKi8KICB3aGlsZSgoaGNyeXAtPkNyeXBJbkNvdW50IDwgd29yZHNpemUpICYmIChvdXRjb3VudCA8IHdvcmRzaXplKSkKICB7ICAgICAgCiAgICAvKiBXcml0ZSBwbGFpbiBkYXRhIGFuZCBnZXQgY2lwaGVyIGRhdGEgKi8KICAgIENSWVBfQUVTX1Byb2Nlc3NEYXRhKGhjcnlwLFRpbWVvdXQpOwogICAgCiAgICAvKlRlbXBvcmFyeSBDcnlwT3V0Q291bnQgVmFsdWUqLwogICAgb3V0Y291bnQgPSBoY3J5cC0+Q3J5cE91dENvdW50OyAKICAgIAogICAgLyogQ2hlY2sgZm9yIHRoZSBUaW1lb3V0ICovCiAgICBpZihUaW1lb3V0ICE9IEhBTF9NQVhfREVMQVkpCiAgICB7CiAgICAgIGlmKCgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCApID4gVGltZW91dCl8fChUaW1lb3V0ID09IDBVKSkKICAgICAgewogICAgICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLwogICAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CiAgICAgICAgCiAgICAgICAgLyogQ2hhbmdlIHN0YXRlICYgZXJyb3IgY29kZSAqLwogICAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfVElNRU9VVDsKICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKICAgICAgICAKICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovICAgICAgICAgIAogICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7IAogICAgICAgIHJldHVybiBIQUxfRVJST1I7CiAgICAgIH0KICAgIH0KICB9CiAgCiAgaWYgKChoY3J5cC0+U2l6ZSAlIDE2VSkgIT0gMFUpIAogIHsKICAgIC8qICBXb3JrYXJvdW5kIDIgOiAgQ1JZUDEgJiBBRVMgZ2VuZXJhdGVzIGNvcnJlY3QgVEFHIGZvciBHQ00gbW9kZSBvbmx5IHdoZW4gaW5wdXQgYmxvY2sgc2l6ZSBpcyBtdWx0aXBsZSBvZgogICAgMTI4IGJpdHMuIElmIGx0aGUgc2l6ZSBvZiB0aGUgbGFzdCBibG9jayBvZiBwYXlsb2FkIGlzIGluZmVyaW9yIHRvIDEyOCBiaXRzLCB3aGVuIEdDTSBlbmNyeXB0aW9uCiAgICBpcyBzZWxlY3RlZCwgdGhlbiB0aGUgVEFHIG1lc3NhZ2Ugd2lsbCBiZSB3cm9uZy4qLyAgIAogICAgQ1JZUF9Xb3JrYXJvdW5kKGhjcnlwLFRpbWVvdXQpOyAgIAogIH0KICAKICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCiAgcmV0dXJuIEhBTF9PSzsKfQoKLyoqCiAgKiBAYnJpZWYgIEVuY3J5cHRpb24vRGVjcnlwdGlvbiBwcm9jZXNzIGluIEFFUyBHQ00gbW9kZSBhbmQgcHJlcGFyZSB0aGUgYXV0aGVudGljYXRpb24gVEFHIGluIGludGVycnVwdCBtb2RlCiAgKiBAcGFyYW0gIGhjcnlwOiBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCiAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZQogICogQHJldHZhbCBIQUwgc3RhdHVzCiAgKi8Kc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIENSWVBfQUVTR0NNX1Byb2Nlc3NfSVQoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCkKewogIF9fSU8gdWludDMyX3QgY291bnQgPSAwVTsKI2lmIGRlZmluZWQoQUVTKSAKICB1aW50MzJfdCBsb29wY291bnRlcjsKICB1aW50MzJfdCBsYXN0d29yZHNpemU7IAogIHVpbnQzMl90IG5wYmxiOwojZW5kaWYgLyogQUVTICovIAogIAogIC8qICBSZXNldCBDcnlwSGVhZGVyQ291bnQgKi8KICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50ID0wVTsKICAKICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBJbml0IHBoYXNlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAKICBDUllQX1NFVF9QSEFTRShoY3J5cCxDUllQX1BIQVNFX0lOSVQpOwogIAogIC8qIFNldCB0aGUga2V5ICovCiAgQ1JZUF9TZXRLZXkoaGNyeXAsIGhjcnlwLT5Jbml0LktleVNpemUpOwogIAojaWYgZGVmaW5lZChDUllQKSAgICAgCiAgLyogU2V0IHRoZSBpbml0aWFsaXphdGlvbiB2ZWN0b3IgYW5kIHRoZSBjb3VudGVyIDogSW5pdGlhbCBDb3VudGVyIEJsb2NrIChJQ0IpKi8KICBoY3J5cC0+SW5zdGFuY2UtPklWMExSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCk7CiAgaGNyeXAtPkluc3RhbmNlLT5JVjBSUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QrMSk7CiAgaGNyeXAtPkluc3RhbmNlLT5JVjFMUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QrMik7CiAgaGNyeXAtPkluc3RhbmNlLT5JVjFSUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QrMyk7CiAgCiAgLyogRW5hYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgKi8KICBfX0hBTF9DUllQX0VOQUJMRShoY3J5cCk7CiAgCiAgLypXYWl0IGZvciB0aGUgQ1JZUEVOIGJpdCB0byBiZSBjbGVhcmVkKi8KICBjb3VudCA9IENSWVBfVElNRU9VVF9HQ01DQ01JTklUUEhBU0U7CiAgZG8KICB7CiAgICBjb3VudC0tIDsKICAgIGlmKGNvdW50ID09IDBVKQogICAgewogICAgICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgY2xvY2sgKi8KICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKICAgICAgCiAgICAgIC8qIENoYW5nZSBzdGF0ZSAqLwogICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7CiAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOyAKICAgICAgCiAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8gICAgICAgICAgCiAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7IAogICAgICByZXR1cm4gSEFMX0VSUk9SOwogICAgfQogIH0KICB3aGlsZSgoaGNyeXAtPkluc3RhbmNlLT5DUiAmIENSWVBfQ1JfQ1JZUEVOKSA9PSBDUllQX0NSX0NSWVBFTik7CiAgCiNlbHNlIC8qIEFFUyAqLwogIAogIC8qIFdvcmthcm91bmQgMSA6IG9ubHkgQUVTCiAgRGF0YXR5cGUgY29uZmlndXJhdGlvbiBtdXN0IGJlIDMyIGJpdHMgZHVyaW5nIElOSVQgcGhhc2UuIE9ubHksIGFmdGVyIElOSVQsIGFuZCBiZWZvcmUgcmUKICBlbmFibGluZyB0aGUgSVAsIGRhdGF0eXBlIGRpZmZlcmVudCBmcm9tIDMyIGJpdHMgY2FuIGJlIGNvbmZpZ3VyZWQuKi8KICAvKiBTZWxlY3QgREFUQVRZUEUgMzIgICovCiAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfREFUQVRZUEUsIENSWVBfREFUQVRZUEVfMzJCKTsgICAKICAKICAvKiBTZXQgdGhlIGluaXRpYWxpemF0aW9uIHZlY3RvciBhbmQgdGhlIGNvdW50ZXIgOiBJbml0aWFsIENvdW50ZXIgQmxvY2sgKElDQikqLwogIGhjcnlwLT5JbnN0YW5jZS0+SVZSMyA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QpOwogIGhjcnlwLT5JbnN0YW5jZS0+SVZSMiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QrMSk7CiAgaGNyeXAtPkluc3RhbmNlLT5JVlIxID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCsyKTsKICBoY3J5cC0+SW5zdGFuY2UtPklWUjAgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEluaXRWZWN0KzMpOyAgICAKICAKICAvKiBFbmFibGUgdGhlIENSWVAgcGVyaXBoZXJhbCAqLwogIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsKICAKICAvKiBqdXN0IHdhaXQgZm9yIGhhc2ggY29tcHV0YXRpb24gKi8KICBjb3VudCA9IENSWVBfVElNRU9VVF9HQ01DQ01JTklUUEhBU0U7CiAgZG8KICB7CiAgICBjb3VudC0tIDsKICAgIGlmKGNvdW50ID09IDBVKQogICAgewogICAgICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgY2xvY2sgKi8KICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKICAgICAgCiAgICAgIC8qIENoYW5nZSBzdGF0ZSAqLwogICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7CiAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOwogICAgICAKICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLyAgICAgICAgICAKICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsgCiAgICAgIHJldHVybiBIQUxfRVJST1I7CiAgICB9CiAgfQogIHdoaWxlKEhBTF9JU19CSVRfQ0xSKGhjcnlwLT5JbnN0YW5jZS0+U1IsIEFFU19TUl9DQ0YpKTsKICAKICAvKiBDbGVhciBDQ0YgZmxhZyAqLwogIF9fSEFMX0NSWVBfQ0xFQVJfRkxBRyhoY3J5cCwgQ1JZUF9DQ0ZfQ0xFQVIpOwogIAojZW5kaWYgLyogRW5kIEFFUyBvciBDUllQICovCiAgCiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIEhlYWRlciBwaGFzZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovICAgCiAgCiNpZiBkZWZpbmVkKENSWVApICAKICAKICAvKiBTZWxlY3QgaGVhZGVyIHBoYXNlICovCiAgQ1JZUF9TRVRfUEhBU0UoaGNyeXAsIENSWVBfUEhBU0VfSEVBREVSKTsgIAogIAogIC8qIEVuYWJsZSBpbnRlcnJ1cHRzICovCiAgX19IQUxfQ1JZUF9FTkFCTEVfSVQoaGNyeXAsIENSWVBfSVRfSU5JKTsKICAKICAvKiBFbmFibGUgQ1JZUCAqLwogIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsKICAKI2Vsc2UgLyogQUVTICovCiAgCiAgLyogV29ya2Fyb3VuZCAxOiBvbmx5IEFFUyAsIGJlZm9yZSByZS1lbmFibGluZyB0aGUgSVAsIGRhdGF0eXBlIGNhbiBiZSBjb25maWd1cmVkKi8KICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIEFFU19DUl9EQVRBVFlQRSwgaGNyeXAtPkluaXQuRGF0YVR5cGUpOyAKICAKICAvKiBTZWxlY3QgaGVhZGVyIHBoYXNlICovCiAgQ1JZUF9TRVRfUEhBU0UoaGNyeXAsIENSWVBfUEhBU0VfSEVBREVSKTsgCiAgCiAgLyogRW5hYmxlIGNvbXB1dGF0aW9uIGNvbXBsZXRlIGZsYWcgYW5kIGVycm9yIGludGVycnVwdHMgKi8KICBfX0hBTF9DUllQX0VOQUJMRV9JVChoY3J5cCxDUllQX0lUX0NDRklFIHwgQ1JZUF9JVF9FUlJJRSk7ICAgIAogIAogIC8qIEVuYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsICovCiAgX19IQUxfQ1JZUF9FTkFCTEUoaGNyeXApOwogIAogIGlmKGhjcnlwLT5Jbml0LkhlYWRlclNpemUgPT0gMFUpIC8qaGVhZGVyIHBoYXNlIGlzICBza2lwcGVkKi8KICB7CiAgICAvKiBTZXQgdGhlIHBoYXNlICovCiAgICBoY3J5cC0+UGhhc2UgPSBDUllQX1BIQVNFX1BST0NFU1M7CiAgICAKICAgIC8qIFNlbGVjdCBwYXlsb2FkIHBoYXNlIG9uY2UgdGhlIGhlYWRlciBwaGFzZSBpcyBwZXJmb3JtZWQgKi8KICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX0dDTVBILCBDUllQX1BIQVNFX1BBWUxPQUQpOwogICAgCiAgICAvKiBXcml0ZSB0aGUgcGF5bG9hZCBJbnB1dCBibG9jayBpbiB0aGUgSU4gRklGTyAqLyAKICAgIGlmKGhjcnlwLT5TaXplID09IDBVKQogICAgeyAgICAgCiAgICAgIC8qIERpc2FibGUgaW50ZXJydXB0cyAqLwogICAgICBfX0hBTF9DUllQX0RJU0FCTEVfSVQoaGNyeXAsIENSWVBfSVRfQ0NGSUV8IENSWVBfSVRfRVJSSUUpOwogICAgICAKICAgICAgLyogQ2hhbmdlIHRoZSBDUllQIHN0YXRlICovCiAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOwogICAgICAKICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLwogICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOwogICAgfSAgICAgICAgICAgIAogICAgZWxzZSBpZiAoaGNyeXAtPlNpemUgPj0gMTZVKQogICAgeyAgICAgICAKICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50ICk7CiAgICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOwogICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQgKTsKICAgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7ICAgCiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCApOwogICAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50ICk7CiAgICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOwogICAgICBpZihoY3J5cC0+Q3J5cEluQ291bnQgPT0gKCBoY3J5cC0+U2l6ZS80VSkpICAgCiAgICAgIHsgICAKICAgICAgICAvKiBDYWxsIElucHV0IHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCiNpZiAoVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKSAKICAgICAgICAvKkNhbGwgcmVnaXN0ZXJlZCBJbnB1dCBjb21wbGV0ZSBjYWxsYmFjayovCiAgICAgICAgaGNyeXAtPkluQ3BsdENhbGxiYWNrKGhjcnlwKTsKI2Vsc2UKICAgICAgICAvKkNhbGwgbGVnYWN5IHdlYWsgSW5wdXQgY29tcGxldGUgY2FsbGJhY2sqLwogICAgICAgIEhBTF9DUllQX0luQ3BsdENhbGxiYWNrKGhjcnlwKTsKI2VuZGlmIC8qIFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KICAgICAgfSAKICAgIH0KICAgIGVsc2UgLyogU2l6ZSA8IDE2Qnl0ZXMgIDogZmlyc3QgYmxvY2sgaXMgdGhlIGxhc3QgYmxvY2sqLwogICAgewogICAgICAvKiBXb3JrYXJvdW5kIG5vdCBpbXBsZW1lbnRlZCovICAKICAgICAgLyogU2l6ZSBzaG91bGQgYmUgJTQgIG90aGVyd2lzZSBUYWcgd2lsbCAgYmUgaW5jb3JyZWN0bHkgZ2VuZXJhdGVkIGZvciBHQ00gRW5jcnlwdGlvbjoKICAgICAgV29ya2Fyb3VuZCBpcyBpbXBsZW1lbnRlZCBpbiBwb2xsaW5nIG1vZGUsIHNvIGlmIGxhc3QgYmxvY2sgb2YgCiAgICAgIHBheWxvYWQgPDEyOGJpdCBkb24ndCB1c2UgQ1JZUF9FbmNyeXB0X0lUIG90aGVyd2lzZSBUQUcgaXMgaW5jb3JyZWN0bHkgZ2VuZXJhdGVkIGZvciBHQ00gRW5jcnlwdGlvbi4gKi8KICAgICAgCiAgICAgIC8qIENvbXB1dGUgdGhlIG51bWJlciBvZiBwYWRkaW5nIGJ5dGVzIGluIGxhc3QgYmxvY2sgb2YgcGF5bG9hZCAqLwogICAgICBucGJsYiA9IDE2VS0gKHVpbnQzMl90KShoY3J5cC0+U2l6ZSk7IAogICAgICAKICAgICAgLyogTnVtYmVyIG9mIHZhbGlkIHdvcmRzIChsYXN0d29yZHNpemUpIGluIGxhc3QgYmxvY2sgKi8KICAgICAgaWYgKChucGJsYiAlIDRVKSA9PTBVKSAKICAgICAgeyAKICAgICAgICBsYXN0d29yZHNpemUgPSAoMTZVLW5wYmxiKS80VTsJCQogICAgICB9CiAgICAgIGVsc2UgCiAgICAgIHsKICAgICAgICBsYXN0d29yZHNpemUgPSAoKDE2VS1ucGJsYikvNFUpICsxVTsKICAgICAgfQogICAgICAKICAgICAgLyogIGxhc3QgYmxvY2sgb3B0aW9uYWxseSBwYWQgdGhlIGRhdGEgd2l0aCB6ZXJvcyovCiAgICAgIGZvcihsb29wY291bnRlciA9IDBVOyBsb29wY291bnRlciA8IGxhc3R3b3Jkc2l6ZSA7IGxvb3Bjb3VudGVyKyspCiAgICAgIHsKICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCApOwogICAgICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOwogICAgICB9CiAgICAgIHdoaWxlKGxvb3Bjb3VudGVyIDwgNFUgKQogICAgICB7IAogICAgICAgIC8qIHBhZCB0aGUgZGF0YSB3aXRoIHplcm9zIHRvIGhhdmUgYSBjb21wbGV0ZSBibG9jayAqLyAgICAgCiAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gMHgwVTsgICAgICAgICAKICAgICAgICBsb29wY291bnRlcisrOwogICAgICB9CiAgICB9CiAgfQogIGVsc2UgaWYgKChoY3J5cC0+SW5pdC5IZWFkZXJTaXplKSA8IDRVKQogIHsKICAgIGZvcihsb29wY291bnRlciA9IDBVOyBsb29wY291bnRlciA8IGhjcnlwLT5Jbml0LkhlYWRlclNpemUgOyBsb29wY291bnRlcisrKQogICAgewogICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7ICAKICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsKICAgIH0KICAgIHdoaWxlKGxvb3Bjb3VudGVyIDwgNFUgKQogICAgeyAKICAgICAgLyogcGFkIHRoZSBkYXRhIHdpdGggemVyb3MgdG8gaGF2ZSBhIGNvbXBsZXRlIGJsb2NrICovICAgICAKICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gMHgwVTsgICAgICAgICAKICAgICAgbG9vcGNvdW50ZXIrKzsKICAgIH0KICAgIC8qIFNldCB0aGUgcGhhc2UgKi8KICAgIGhjcnlwLT5QaGFzZSA9IENSWVBfUEhBU0VfUFJPQ0VTUzsKICAgIAogICAgLyogU2VsZWN0IHBheWxvYWQgcGhhc2Ugb25jZSB0aGUgaGVhZGVyIHBoYXNlIGlzIHBlcmZvcm1lZCAqLwogICAgQ1JZUF9TRVRfUEhBU0UoaGNyeXAsIENSWVBfUEhBU0VfUEFZTE9BRCk7CiAgICAKICAgIC8qIENhbGwgSW5wdXQgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpIAogICAgLypDYWxsIHJlZ2lzdGVyZWQgSW5wdXQgY29tcGxldGUgY2FsbGJhY2sqLwogICAgaGNyeXAtPkluQ3BsdENhbGxiYWNrKGhjcnlwKTsKI2Vsc2UKICAgIC8qQ2FsbCBsZWdhY3kgd2VhayBJbnB1dCBjb21wbGV0ZSBjYWxsYmFjayovCiAgICBIQUxfQ1JZUF9JbkNwbHRDYWxsYmFjayhoY3J5cCk7CiNlbmRpZiAvKiBVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTICovICAKICB9IAogIGVsc2UgaWYgKChoY3J5cC0+SW5pdC5IZWFkZXJTaXplKSA+PSA0VSkKICB7ICAKICAgIC8qIFdyaXRlIHRoZSBpbnB1dCBibG9jayBpbiB0aGUgSU4gRklGTyAqLwogICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCApOwogICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrOwogICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCApOwogICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrOyAgIAogICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCApOwogICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrOwogICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCApOwogICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrOyAgCiAgfQogIGVsc2UKICB7CiAgICAvKiBOb3RoaW5nIHRvIGRvICovCiAgfSAgCiAgCiNlbmRpZiAvKiBFbmQgQUVTIG9yIENSWVAgKi8gICAgICAKICAKICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCiAgcmV0dXJuIEhBTF9PSzsKfQoKCi8qKgogICogQGJyaWVmICBFbmNyeXB0aW9uL0RlY3J5cHRpb24gcHJvY2VzcyBpbiBBRVMgR0NNIG1vZGUgYW5kIHByZXBhcmUgdGhlIGF1dGhlbnRpY2F0aW9uIFRBRyB1c2luZyBETUEKICAqIEBwYXJhbSAgaGNyeXA6IHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIENSWVAgbW9kdWxlCiAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAqLwpzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgQ1JZUF9BRVNHQ01fUHJvY2Vzc19ETUEoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCkKewogIF9fSU8gdWludDMyX3QgY291bnQgPSAwVTsKICB1aW50MzJfdCB3b3Jkc2l6ZTsKICAKICAvKiAgUmVzZXQgQ3J5cEhlYWRlckNvdW50ICovCiAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCA9IDBVOwogIAogIC8qKioqKioqKioqKioqKioqKioqKioqKioqKiogSW5pdCBwaGFzZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgCiAgQ1JZUF9TRVRfUEhBU0UoaGNyeXAsQ1JZUF9QSEFTRV9JTklUKTsKICAKICAvKiBTZXQgdGhlIGtleSAqLwogIENSWVBfU2V0S2V5KGhjcnlwLCBoY3J5cC0+SW5pdC5LZXlTaXplKTsKICAKI2lmIGRlZmluZWQoQ1JZUCkgICAgIAogIC8qIFNldCB0aGUgaW5pdGlhbGl6YXRpb24gdmVjdG9yIGFuZCB0aGUgY291bnRlciA6IEluaXRpYWwgQ291bnRlciBCbG9jayAoSUNCKSovCiAgaGNyeXAtPkluc3RhbmNlLT5JVjBMUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QpOwogIGhjcnlwLT5JbnN0YW5jZS0+SVYwUlIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEluaXRWZWN0KzEpOwogIGhjcnlwLT5JbnN0YW5jZS0+SVYxTFIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEluaXRWZWN0KzIpOwogIGhjcnlwLT5JbnN0YW5jZS0+SVYxUlIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEluaXRWZWN0KzMpOwogIAogIC8qIEVuYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsICovCiAgX19IQUxfQ1JZUF9FTkFCTEUoaGNyeXApOwogIAogIC8qV2FpdCBmb3IgdGhlIENSWVBFTiBiaXQgdG8gYmUgY2xlYXJlZCovCiAgY291bnQgPSBDUllQX1RJTUVPVVRfR0NNQ0NNSU5JVFBIQVNFOwogIGRvCiAgewogICAgY291bnQtLSA7CiAgICBpZihjb3VudCA9PSAwVSkKICAgIHsKICAgICAgLyogRGlzYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIGNsb2NrICovCiAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CiAgICAgIAogICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9USU1FT1VUOwogICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsgCiAgICAgIAogICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovICAgICAgICAgIAogICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOyAKICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgIH0KICB9CiAgd2hpbGUoKGhjcnlwLT5JbnN0YW5jZS0+Q1IgJiBDUllQX0NSX0NSWVBFTikgPT0gQ1JZUF9DUl9DUllQRU4pOwogIAojZWxzZSAvKiBBRVMgKi8KICAKICAvKldvcmthcm91bmQgMSA6IG9ubHkgQUVTCiAgRGF0YXR5cGUgY29uZmlndXJhdGlvbiBtdXN0IGJlIDMyIGJpdHMgZHVyaW5nIEluaXQgcGhhc2UuIE9ubHksIGFmdGVyIEluaXQsIGFuZCBiZWZvcmUgcmUKICBlbmFibGluZyB0aGUgSVAsIGRhdGF0eXBlIGRpZmZlcmVudCBmcm9tIDMyIGJpdHMgY2FuIGJlIGNvbmZpZ3VyZWQuKi8KICAvKiBTZWxlY3QgREFUQVRZUEUgMzIgICovCiAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfREFUQVRZUEUsIENSWVBfREFUQVRZUEVfMzJCKTsgICAKICAKICAvKiBTZXQgdGhlIGluaXRpYWxpemF0aW9uIHZlY3RvciBhbmQgdGhlIGNvdW50ZXIgOiBJbml0aWFsIENvdW50ZXIgQmxvY2sgKElDQikqLwogIGhjcnlwLT5JbnN0YW5jZS0+SVZSMyA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QpOwogIGhjcnlwLT5JbnN0YW5jZS0+SVZSMiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QrMSk7CiAgaGNyeXAtPkluc3RhbmNlLT5JVlIxID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCsyKTsKICBoY3J5cC0+SW5zdGFuY2UtPklWUjAgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEluaXRWZWN0KzMpOyAgCiAgCiAgLyogRW5hYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgKi8KICBfX0hBTF9DUllQX0VOQUJMRShoY3J5cCk7CiAgCiAgLyoganVzdCB3YWl0IGZvciBoYXNoIGNvbXB1dGF0aW9uICovCiAgY291bnQgPSBDUllQX1RJTUVPVVRfR0NNQ0NNSU5JVFBIQVNFOwogIGRvCiAgewogICAgY291bnQtLSA7CiAgICBpZihjb3VudCA9PSAwVSkKICAgIHsKICAgICAgLyogRGlzYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIGNsb2NrICovCiAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CiAgICAgIAogICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9USU1FT1VUOwogICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsgCiAgICAgIAogICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovICAgICAgICAgIAogICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOyAKICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgIH0KICB9CiAgd2hpbGUoSEFMX0lTX0JJVF9DTFIoaGNyeXAtPkluc3RhbmNlLT5TUiwgQUVTX1NSX0NDRikpOwogIAogIC8qIENsZWFyIENDRiBmbGFnICovCiAgX19IQUxfQ1JZUF9DTEVBUl9GTEFHKGhjcnlwLCBDUllQX0NDRl9DTEVBUik7CiAgCiNlbmRpZiAvKiBFbmQgQUVTIG9yIENSWVAgKi8KICAKICAvKioqKioqKioqKioqKioqKioqKioqKioqIEhlYWRlciBwaGFzZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogIAogIGlmKENSWVBfR0NNQ0NNX1NldEhlYWRlclBoYXNlX0RNQShoY3J5cCkgIT0gSEFMX09LKQogIHsKICAgIHJldHVybiBIQUxfRVJST1I7CiAgfQogIAogIC8qKioqKioqKioqKioqKioqKioqKioqKiogUGF5bG9hZCBwaGFzZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovICAgCiAgCiAgLyogU2V0IHRoZSBwaGFzZSAqLwogIGhjcnlwLT5QaGFzZSA9IENSWVBfUEhBU0VfUFJPQ0VTUzsgIAogIAojaWYgZGVmaW5lZChDUllQKQogIAogIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCAqLwogIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CiAgCiNlbmRpZiAvKiBDUllQICovIAogIAogIC8qIFNlbGVjdCBwYXlsb2FkIHBoYXNlIG9uY2UgdGhlIGhlYWRlciBwaGFzZSBpcyBwZXJmb3JtZWQgKi8KICBDUllQX1NFVF9QSEFTRShoY3J5cCwgQ1JZUF9QSEFTRV9QQVlMT0FEKTsKICAKICBpZihoY3J5cC0+U2l6ZSAhPSAwVSkKICB7IAogICAgLyogQ1JZUDEgSVAgViA8IDIuMi4xICBTaXplIHNob3VsZCBiZSAlNCAgb3RoZXJ3aXNlIFRhZyB3aWxsICBiZSBpbmNvcnJlY3RseSBnZW5lcmF0ZWQgZm9yIEdDTSBFbmNyeXB0aW9uOgogICAgV29ya2Fyb3VuZCBpcyBpbXBsZW1lbnRlZCBpbiBwb2xsaW5nIG1vZGUsIHNvIGlmIGxhc3QgYmxvY2sgb2YgCiAgICBwYXlsb2FkIDwxMjhiaXQgZG9uJ3QgdXNlIERNQSBtb2RlIG90aGVyd2lzZSBUQUcgaXMgaW5jb3JyZWN0bHkgZ2VuZXJhdGVkIC4gKi8KICAgIC8qIFNldCB0aGUgaW5wdXQgYW5kIG91dHB1dCBhZGRyZXNzZXMgYW5kIHN0YXJ0IERNQSB0cmFuc2ZlciAqLyAKICAgIGlmICgoaGNyeXAtPlNpemUgJSAxNlUpID09IDBVKSAKICAgIHsgIAogICAgICBDUllQX1NldERNQUNvbmZpZyhoY3J5cCwgKHVpbnQzMl90KSggaGNyeXAtPnBDcnlwSW5CdWZmUHRyKSwgKGhjcnlwLT5TaXplLzRVKSwgKHVpbnQzMl90KShoY3J5cC0+cENyeXBPdXRCdWZmUHRyKSk7ICAgIAogICAgfQogICAgZWxzZSAvKnRvIGNvbXB1dGUgbGFzdCB3b3JkPDEyOGJpdHMsIG90aGVyd2lzZSBpdCB3aWxsIG5vdCBiZSBlbmNyeXB0ZWQvZGVjcnlwdGVkICovCiAgICB7CiAgICAgIHdvcmRzaXplID0gKHVpbnQzMl90KShoY3J5cC0+U2l6ZSkrKDE2VS0oKHVpbnQzMl90KShoY3J5cC0+U2l6ZSklMTZVKSkgOwogICAgICAKICAgICAgLyogU2V0IHRoZSBpbnB1dCBhbmQgb3V0cHV0IGFkZHJlc3NlcyBhbmQgc3RhcnQgRE1BIHRyYW5zZmVyLCBwQ3J5cE91dEJ1ZmZQdHIgc2l6ZSBzaG91bGQgYmUgJTQgKi8gCiAgICAgIENSWVBfU2V0RE1BQ29uZmlnKGhjcnlwLCAodWludDMyX3QpKCBoY3J5cC0+cENyeXBJbkJ1ZmZQdHIpLCAoKHVpbnQxNl90KXdvcmRzaXplLzRVKSwgKHVpbnQzMl90KShoY3J5cC0+cENyeXBPdXRCdWZmUHRyKSk7CiAgICB9ICAgCiAgfQogIGVsc2UgCiAgewogICAgLyogUHJvY2VzcyB1bkxvY2tlZCAqLwogICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKICAgIAogICAgLyogQ2hhbmdlIHRoZSBDUllQIHN0YXRlIGFuZCBwaGFzZSAqLwogICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CiAgfSAKICAKICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCiAgcmV0dXJuIEhBTF9PSzsKfQoKCi8qKgogICogQGJyaWVmICBBRVMgQ0NNIGVuY3J5cHRpb24vZGVjcnlwdGlvbiBwcm9jZXNzaW5nIGluIHBvbGxpbmcgbW9kZSAKICAqICAgICAgICAgZm9yIFRpbnlBRVMgSVAsIG5vIGVuY3J5cHQvZGVjcnlwdCBwZXJmb3JtZWQsIG9ubHkgYXV0aGVudGljYXRpb24gcHJlcGFyYXRpb24uCiAgKiBAcGFyYW0gIGhjcnlwOiBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCiAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZQogICogQHBhcmFtICBUaW1lb3V0OiBUaW1lb3V0IGR1cmF0aW9uCiAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAqLwpzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgQ1JZUF9BRVNDQ01fUHJvY2VzcyhDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50MzJfdCBUaW1lb3V0KQp7CiAgdWludDMyX3QgdGlja3N0YXJ0OwogIHVpbnQzMl90IHdvcmRzaXplPSAodWludDMyX3QpKGhjcnlwLT5TaXplKS80VTsKICB1aW50MTZfdCBvdXRjb3VudDsgIC8qIFRlbXBvcmFyeSBDcnlwT3V0Q291bnQgVmFsdWUgKi8gIAojaWYgZGVmaW5lZChBRVMpIAogIHVpbnQzMl90IGxvb3Bjb3VudGVyOwogIHVpbnQzMl90IG5wYmxiOwogIHVpbnQzMl90IGxhc3R3b3Jkc2l6ZTsgCiNlbmRpZiAvKiBBRVMgKi8KICAKICAvKiAgUmVzZXQgQ3J5cEhlYWRlckNvdW50ICovCiAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCA9IDBVOyAgICAgCiAgCiNpZiBkZWZpbmVkKENSWVApIAogIAogIC8qKioqKioqKioqKioqKioqKioqKioqIEluaXQgcGhhc2UgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogIAogIENSWVBfU0VUX1BIQVNFKGhjcnlwLENSWVBfUEhBU0VfSU5JVCk7CiAgCiAgLyogU2V0IHRoZSBrZXkgKi8KICBDUllQX1NldEtleShoY3J5cCwgaGNyeXAtPkluaXQuS2V5U2l6ZSk7CiAgCiAgLyogU2V0IHRoZSBpbml0aWFsaXphdGlvbiB2ZWN0b3IgKElWKSB3aXRoIENUUjEgaW5mb3JtYXRpb24gKi8KICBoY3J5cC0+SW5zdGFuY2UtPklWMExSID0gKGhjcnlwLT5Jbml0LkIwWzBdKSAmIENSWVBfQ0NNX0NUUjFfMDsKICBoY3J5cC0+SW5zdGFuY2UtPklWMFJSID0gaGNyeXAtPkluaXQuQjBbMV07CiAgaGNyeXAtPkluc3RhbmNlLT5JVjFMUiA9IGhjcnlwLT5Jbml0LkIwWzJdOwogIGhjcnlwLT5JbnN0YW5jZS0+SVYxUlIgPSAoaGNyeXAtPkluaXQuQjBbM10gJiBDUllQX0NDTV9DVFIxXzEpfCAgQ1JZUF9DQ01fQ1RSMV8yOwogIAogIAogIC8qIEVuYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsICovCiAgX19IQUxfQ1JZUF9FTkFCTEUoaGNyeXApOwogIAogIC8qV3JpdGUgIEIwIHBhY2tldCBpbnRvIENSWVBfRElOIFJlZ2lzdGVyKi8KICBpZihoY3J5cC0+SW5pdC5EYXRhVHlwZSA9PSBDUllQX0RBVEFUWVBFXzhCKQogIHsKICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19SRVYoKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkIwKSk7CiAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUkVWKCAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuQjArMSkpOwogICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JFVigqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuQjArMikpOwogICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JFVigqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuQjArMykpOwogIH0KICBlbHNlIGlmKGhjcnlwLT5Jbml0LkRhdGFUeXBlID09IENSWVBfREFUQVRZUEVfMTZCKQogIHsKICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19ST1IoKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkIwKSwgMTYpOwogICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JPUiggKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkIwKzEpLCAxNik7CiAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUk9SKCoodWludDMyX3QqKShoY3J5cC0+SW5pdC5CMCsyKSwgMTYpOwogICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JPUigqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuQjArMyksIDE2KTsKICB9CiAgZWxzZSBpZihoY3J5cC0+SW5pdC5EYXRhVHlwZSA9PSBDUllQX0RBVEFUWVBFXzFCKQogIHsKICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19SQklUKCoodWludDMyX3QqKShoY3J5cC0+SW5pdC5CMCkpOwogICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JCSVQoICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5CMCsxKSk7CiAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUkJJVCgqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuQjArMikpOwogICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JCSVQoKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkIwKzMpKTsKICB9CiAgZWxzZQogIHsKICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkIwKTsKICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkIwKzEpOwogICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuQjArMik7CiAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5CMCszKTsKICB9CiAgLyogR2V0IHRpY2sgKi8KICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOwogIAogIC8qV2FpdCBmb3IgdGhlIENSWVBFTiBiaXQgdG8gYmUgY2xlYXJlZCovCiAgd2hpbGUoKGhjcnlwLT5JbnN0YW5jZS0+Q1IgJiBDUllQX0NSX0NSWVBFTikgPT0gQ1JZUF9DUl9DUllQRU4pCiAgewogICAgLyogQ2hlY2sgZm9yIHRoZSBUaW1lb3V0ICovCiAgICBpZihUaW1lb3V0ICE9IEhBTF9NQVhfREVMQVkpCiAgICB7CiAgICAgIGlmKCgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCApID4gVGltZW91dCl8fChUaW1lb3V0ID09IDBVKSkKICAgICAgewogICAgICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLwogICAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CiAgICAgICAgCiAgICAgICAgLyogQ2hhbmdlIHN0YXRlICovCiAgICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9USU1FT1VUOwogICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOyAgCiAgICAgICAgCiAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLyAgICAgICAgICAKICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOyAKICAgICAgICByZXR1cm4gSEFMX0VSUk9SOwogICAgICB9CiAgICB9CiAgfSAgCiNlbHNlIC8qIEFFUyAqLyAKICAvKkFFUzJ2MS4xLjEgOiBDQ00gYXV0aGVudGljYXRpb24gOiBubyBpbml0IHBoYXNlLCBvbmx5IGhlYWRlciBhbmQgZmluYWwgcGhhc2UgKi8gCiAgLyogU2VsZWN0IGhlYWRlciBwaGFzZSAqLwogIENSWVBfU0VUX1BIQVNFKGhjcnlwLCBDUllQX1BIQVNFX0hFQURFUik7IAogIAogIC8qIGNvbmZpZ3VyZWQgZW5jcnlwdGlvbiBtb2RlICovCiAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfTU9ERSwgQ1JZUF9PUEVSQVRJTkdNT0RFX0VOQ1JZUFQpOyAKICAKICAvKiBTZXQgdGhlIGtleSAqLwogIENSWVBfU2V0S2V5KGhjcnlwLCBoY3J5cC0+SW5pdC5LZXlTaXplKTsgICAgIAogIAogIC8qIFNldCB0aGUgaW5pdGlhbGl6YXRpb24gdmVjdG9yIHdpdGggemVybyB2YWx1ZXMqLyAKICBoY3J5cC0+SW5zdGFuY2UtPklWUjMgPSAwVTsKICBoY3J5cC0+SW5zdGFuY2UtPklWUjIgPSAwVTsKICBoY3J5cC0+SW5zdGFuY2UtPklWUjEgPSAwVTsKICBoY3J5cC0+SW5zdGFuY2UtPklWUjAgPSAwVTsKICAKICAvKiBFbmFibGUgdGhlIENSWVAgcGVyaXBoZXJhbCAqLwogIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsKICAKICAvKldyaXRlIHRoZSBCMCBwYWNrZXQgaW50byBDUllQX0RJTiovCiAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkIwKTsKICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuQjArMSk7CiAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkIwKzIpOwogIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5CMCszKTsgCiAgCiAgLyogIHdhaXQgdW50aWwgdGhlIGVuZCBvZiBjb21wdXRhdGlvbiAqLwogIGlmKENSWVBfV2FpdE9uQ0NGbGFnKGhjcnlwLCBUaW1lb3V0KSAhPSBIQUxfT0spICAKICB7IAogICAgLyogQ2hhbmdlIHN0YXRlICovCiAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7CiAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsgICAgICAgICAgCiAgICAKICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgJiByZXR1cm4gZXJyb3IgKi8KICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7ICAgICAgICAgIAogICAgcmV0dXJuIEhBTF9FUlJPUjsKICB9CiAgLyogQ2xlYXIgQ0NGIGZsYWcgKi8KICBfX0hBTF9DUllQX0NMRUFSX0ZMQUcoaGNyeXAsIENSWVBfQ0NGX0NMRUFSKTsKICAKICAvKiBTZXQgdGhlIHBoYXNlICovCiAgaGNyeXAtPlBoYXNlID0gQ1JZUF9QSEFTRV9QUk9DRVNTOwogIAogIC8qIEZyb20gdGhhdCBwb2ludCB0aGUgd2hvbGUgbWVzc2FnZSBtdXN0IGJlIHByb2Nlc3NlZCwgZmlyc3QgdGhlIEhlYWRlciB0aGVuIHRoZSBwYXlsb2FkLgogIEZpcnN0IHRoZSAgSGVhZGVyIGJsb2NrKEIxKSA6IGFzc29jaWF0ZWQgZGF0YSBsZW5ndGggZXhwcmVzc2VkIGluIGJ5dGVzIGNvbmNhdGVuYXRlZCB3aXRoIEFzc29jaWF0ZWQgRGF0YSAoQSkqLwogIAogIGlmIChoY3J5cC0+SW5pdC5IZWFkZXJTaXplICE9IDBVKQogIHsKICAgIGlmICgoaGNyeXAtPkluaXQuSGVhZGVyU2l6ZSAlNFUgKT09IDBVKQogICAgeyAgICAgCiAgICAgIC8qIEhlYWRlclNpemUgJTQsIG5vIHBhZGRpbmcgKi8gCiAgICAgIGZvcihsb29wY291bnRlciA9IDBVOyAobG9vcGNvdW50ZXIgPCBoY3J5cC0+SW5pdC5IZWFkZXJTaXplKTsgbG9vcGNvdW50ZXIrPTRVKQogICAgICB7ICAgICAgIAogICAgICAgIC8qIFdyaXRlIHRoZSBJbnB1dCBibG9jayBpbiB0aGUgRGF0YSBJbnB1dCByZWdpc3RlciAqLwogICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOyAgCiAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOwogICAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7ICAKICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOwogICAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7ICAKICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CiAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsgIAogICAgICAgIAogICAgICAgIGlmKENSWVBfV2FpdE9uQ0NGbGFnKGhjcnlwLCBUaW1lb3V0KSAhPSBIQUxfT0spICAKICAgICAgICB7IAogICAgICAgICAgLyogRGlzYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIGNsb2NrICovCiAgICAgICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwogICAgICAgICAgCiAgICAgICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KICAgICAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfVElNRU9VVDsKICAgICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOyAgCiAgICAgICAgICAKICAgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8gICAgICAgICAgCiAgICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOyAKICAgICAgICAgIHJldHVybiBIQUxfRVJST1I7CiAgICAgICAgfQogICAgICAgIC8qIENsZWFyIENDRiBGbGFnICovCiAgICAgICAgX19IQUxfQ1JZUF9DTEVBUl9GTEFHKGhjcnlwLCBDUllQX0NDRl9DTEVBUik7ICAgICAgICAgCiAgICAgIH0KICAgIH0KICAgIGVsc2UKICAgIHsgICAKICAgICAgLypXcml0ZSBIZWFkZXIgYmxvY2sgaW4gdGhlIElOIEZJRk8gd2l0aG91dCBsYXN0IGJsb2NrICovCiAgICAgIGZvcihsb29wY291bnRlciA9IDBVOyAobG9vcGNvdW50ZXIgPCAoKGhjcnlwLT5Jbml0LkhlYWRlclNpemUpLShoY3J5cC0+SW5pdC5IZWFkZXJTaXplICU0VSApKSk7IGxvb3Bjb3VudGVyKz00VSkKICAgICAgewogICAgICAgIC8qIFdyaXRlIHRoZSBpbnB1dCBibG9jayBpbiB0aGUgZGF0YSBpbnB1dCByZWdpc3RlciAqLwogICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOyAgCiAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOwogICAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7ICAKICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOwogICAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7ICAKICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CiAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsgCiAgICAgICAgCiAgICAgICAgaWYoQ1JZUF9XYWl0T25DQ0ZsYWcoaGNyeXAsIFRpbWVvdXQpICE9IEhBTF9PSykgIAogICAgICAgIHsgCiAgICAgICAgICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgY2xvY2sgKi8KICAgICAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CiAgICAgICAgICAKICAgICAgICAgIC8qIENoYW5nZSBzdGF0ZSAqLwogICAgICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9USU1FT1VUOwogICAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7IAogICAgICAgICAgCiAgICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovICAgICAgICAgIAogICAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsgCiAgICAgICAgICByZXR1cm4gSEFMX0VSUk9SOwogICAgICAgIH0KICAgICAgICAvKiBDbGVhciBDQ0YgRmxhZyAqLwogICAgICAgIF9fSEFMX0NSWVBfQ0xFQVJfRkxBRyhoY3J5cCwgQ1JZUF9DQ0ZfQ0xFQVIpOyAgICAKICAgICAgfQogICAgICAvKiAgTGFzdCBibG9jayBvcHRpb25hbGx5IHBhZCB0aGUgZGF0YSB3aXRoIHplcm9zKi8KICAgICAgZm9yKGxvb3Bjb3VudGVyID0gMFU7IChsb29wY291bnRlciA8IChoY3J5cC0+SW5pdC5IZWFkZXJTaXplICU0VSApKTsgbG9vcGNvdW50ZXIrKykKICAgICAgewogICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOyAgICAgICAKICAgICAgfQogICAgICB3aGlsZShsb29wY291bnRlciA8NFUgKQogICAgICB7IAogICAgICAgIC8qIFBhZCB0aGUgZGF0YSB3aXRoIHplcm9zIHRvIGhhdmUgYSBjb21wbGV0ZSBibG9jayAqLyAgICAgIAogICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9IDB4MFU7ICAgICAgICAgICAgICAKICAgICAgICBsb29wY291bnRlcisrOwogICAgICB9ICAgIAogICAgICAKICAgICAgaWYoQ1JZUF9XYWl0T25DQ0ZsYWcoaGNyeXAsIFRpbWVvdXQpICE9IEhBTF9PSykgIAogICAgICB7IAogICAgICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLwogICAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CiAgICAgICAgCiAgICAgICAgLyogQ2hhbmdlIHN0YXRlICovCiAgICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9USU1FT1VUOwogICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOwogICAgICAgIAogICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8gICAgICAgICAgCiAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsgCiAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgICAgfQogICAgICAvKiBDbGVhciBDQ0YgZmxhZyAqLwogICAgICBfX0hBTF9DUllQX0NMRUFSX0ZMQUcoaGNyeXAsIENSWVBfQ0NGX0NMRUFSKTsgIAogICAgfQogIH0KICAvKiBUaGVuIHRoZSBwYXlsb2FkOiBjbGVhcnRleHQgcGF5bG9hZCAobm90IHRoZSBjaXBoZXJ0ZXh0IHBheWxvYWQpLgogIFdyaXRlIGlucHV0IERhdGEsIG5vIG91dHB1dCBEYXRhIHRvIGdldCAqLwogIGlmIChoY3J5cC0+U2l6ZSAhPSAwVSkKICB7CiAgICBpZiAoKGhjcnlwLT5TaXplICUgMTZVKSAhPSAwVSkgCiAgICB7CiAgICAgIC8qIHJlY2FsY3VsYXRlICB3b3Jkc2l6ZSAqLyAKICAgICAgd29yZHNpemUgPSAgKCh3b3Jkc2l6ZS80VSkqNFUpIDsgCiAgICB9CiAgICAKICAgIC8qIEdldCB0aWNrICovCiAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOwogICAgLypUZW1wb3JhcnkgQ3J5cE91dENvdW50IFZhbHVlKi8KICAgIG91dGNvdW50ID0gaGNyeXAtPkNyeXBPdXRDb3VudDsKICAgIAogICAgd2hpbGUoKGhjcnlwLT5DcnlwSW5Db3VudCA8IHdvcmRzaXplKSAmJiAob3V0Y291bnQgPCB3b3Jkc2l6ZSkpCiAgICB7ICAgICAgCiAgICAgIC8qIFdyaXRlIHBsYWluIGRhdGEgYW5kIGdldCBjaXBoZXIgZGF0YSAqLwogICAgICBDUllQX0FFU19Qcm9jZXNzRGF0YShoY3J5cCxUaW1lb3V0KTsKICAgICAKICAgIC8qVGVtcG9yYXJ5IENyeXBPdXRDb3VudCBWYWx1ZSovCiAgICBvdXRjb3VudCA9IGhjcnlwLT5DcnlwT3V0Q291bnQ7IAogICAgCiAgICAgIC8qIENoZWNrIGZvciB0aGUgVGltZW91dCAqLwogICAgICBpZihUaW1lb3V0ICE9IEhBTF9NQVhfREVMQVkpCiAgICAgIHsKICAgICAgICBpZigoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQgKSA+IFRpbWVvdXQpfHwoVGltZW91dCA9PSAwVSkpCiAgICAgICAgewogICAgICAgICAgLyogRGlzYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIGNsb2NrICovCiAgICAgICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwogICAgICAgICAgCiAgICAgICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KICAgICAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfVElNRU9VVDsKICAgICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOyAgCiAgICAgICAgICAKICAgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8gICAgICAgICAgCiAgICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOyAKICAgICAgICAgIHJldHVybiBIQUxfRVJST1I7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICAKICAgIGlmICgoaGNyeXAtPlNpemUgJSAxNlUpICE9IDBVKSAgCiAgICB7IAogICAgICAvKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgcGFkZGluZyBieXRlcyBpbiBsYXN0IGJsb2NrIG9mIHBheWxvYWQgKi8KICAgICAgbnBibGIgPSAoKCgodWludDMyX3QpKGhjcnlwLT5TaXplKS8xNlUpKzFVKSoxNlUpLSAodWludDMyX3QpKGhjcnlwLT5TaXplKTsgCiAgICAgIAogICAgICAvKiBOdW1iZXIgb2YgdmFsaWQgd29yZHMgKGxhc3R3b3Jkc2l6ZSkgaW4gbGFzdCBibG9jayAqLwogICAgICBpZiAoKG5wYmxiJTRVKSA9PTBVKSAKICAgICAgeyAKICAgICAgICBsYXN0d29yZHNpemUgPSAoMTZVLW5wYmxiKS80VTsJCQogICAgICB9CiAgICAgIGVsc2UgCiAgICAgIHsKICAgICAgICBsYXN0d29yZHNpemUgPSAoKDE2VS1ucGJsYikvNFUpICsxVTsKICAgICAgfSAgIAogICAgICAvKiAgTGFzdCBibG9jayBvcHRpb25hbGx5IHBhZCB0aGUgZGF0YSB3aXRoIHplcm9zKi8gICAgCiAgICAgIGZvcihsb29wY291bnRlcj0wVTsgbG9vcGNvdW50ZXIgPCBsYXN0d29yZHNpemU7IGxvb3Bjb3VudGVyICsrKSAgICAgICAgCiAgICAgIHsKICAgICAgICAvKiBXcml0ZSB0aGUgbGFzdCBpbnB1dCBibG9jayBpbiB0aGUgSU4gRklGTyAqLwogICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCApOwogICAgICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOwogICAgICB9ICAgIAogICAgICB3aGlsZShsb29wY291bnRlciA8IDRVKQogICAgICB7CiAgICAgICAgLyogUGFkIHRoZSBkYXRhIHdpdGggemVyb3MgdG8gaGF2ZSBhIGNvbXBsZXRlIGJsb2NrICovCiAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9IDBVOwogICAgICAgIGxvb3Bjb3VudGVyKys7IAogICAgICB9ICAgCiAgICAgIC8qIFdhaXQgZm9yIENDRiBmbGFnIHRvIGJlIHJhaXNlZCAqLwogICAgICBpZihDUllQX1dhaXRPbkNDRmxhZyhoY3J5cCwgVGltZW91dCkgIT0gSEFMX09LKSAgCiAgICAgIHsgCiAgICAgICAgLyogRGlzYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIGNsb2NrICovCiAgICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKICAgICAgICAKICAgICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7CiAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7ICAKICAgICAgICAKICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovICAgICAgICAgIAogICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7IAogICAgICAgIHJldHVybiBIQUxfRVJST1I7ICAgICAgICAgCiAgICAgIH0gCiAgICAgIC8qIENsZWFyIENDRiBmbGFnICovCiAgICAgIF9fSEFMX0NSWVBfQ0xFQVJfRkxBRyhoY3J5cCwgQ1JZUF9DQ0ZfQ0xFQVIpOwogICAgICAKICAgIH0KICB9ICAgICAgIAojZW5kaWYgLyogRW5kIEFFUyBvciBDUllQICovCiAgCiNpZiBkZWZpbmVkKENSWVApICAKICAKICAvKioqKioqKioqKioqKioqKioqKioqKioqKiBIZWFkZXIgcGhhc2UgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAvKiBIZWFkZXIgYmxvY2soQjEpIDogYXNzb2NpYXRlZCBkYXRhIGxlbmd0aCBleHByZXNzZWQgaW4gYnl0ZXMgY29uY2F0ZW5hdGVkCiAgd2l0aCBBc3NvY2lhdGVkIERhdGEgKEEpKi8KICAKICBpZihDUllQX0dDTUNDTV9TZXRIZWFkZXJQaGFzZShoY3J5cCwgVGltZW91dCkgIT0gSEFMX09LKQogIHsKICAgIHJldHVybiBIQUxfRVJST1I7CiAgfSAgCiAgCiAgLyoqKioqKioqKioqKioqKioqKioqKiogUGF5bG9hZCBwaGFzZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovICAgCiAgCiAgLyogU2V0IHRoZSBwaGFzZSAqLwogIGhjcnlwLT5QaGFzZSA9IENSWVBfUEhBU0VfUFJPQ0VTUzsKICAKICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgKi8KICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwogIAogIC8qIFNlbGVjdCBwYXlsb2FkIHBoYXNlIG9uY2UgdGhlIGhlYWRlciBwaGFzZSBpcyBwZXJmb3JtZWQgKi8KICBDUllQX1NFVF9QSEFTRShoY3J5cCwgQ1JZUF9QSEFTRV9QQVlMT0FEKTsgCiAgCiAgLyogRW5hYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgKi8KICBfX0hBTF9DUllQX0VOQUJMRShoY3J5cCk7ICAKICAKICBpZiAoKGhjcnlwLT5TaXplICUgMTZVKSAhPSAwVSkgCiAgewogICAgLyogcmVjYWxjdWxhdGUgIHdvcmRzaXplICovIAogICAgd29yZHNpemUgPSAgKCh3b3Jkc2l6ZS80VSkqNFUpIDsgCiAgfQogIC8qIEdldCB0aWNrICovCiAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKICAvKlRlbXBvcmFyeSBDcnlwT3V0Q291bnQgVmFsdWUqLwogIG91dGNvdW50ID0gaGNyeXAtPkNyeXBPdXRDb3VudDsKICAKICAvKiBXcml0ZSBpbnB1dCBkYXRhIGFuZCBnZXQgb3V0cHV0IGRhdGEgKi8KICB3aGlsZSgoaGNyeXAtPkNyeXBJbkNvdW50IDwgd29yZHNpemUpICYmIChvdXRjb3VudCA8IHdvcmRzaXplKSkKICB7ICAgICAgCiAgICAvKiBXcml0ZSBwbGFpbiBkYXRhIGFuZCBnZXQgY2lwaGVyIGRhdGEgKi8KICAgIENSWVBfQUVTX1Byb2Nlc3NEYXRhKGhjcnlwLFRpbWVvdXQpOwogICAgCiAgICAvKiBDaGVjayBmb3IgdGhlIFRpbWVvdXQgKi8KICAgIGlmKFRpbWVvdXQgIT0gSEFMX01BWF9ERUxBWSkKICAgIHsKICAgICAgaWYoKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0ICkgPiBUaW1lb3V0KXx8KFRpbWVvdXQgPT0gMFUpKQogICAgICB7CiAgICAgICAgLyogRGlzYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIGNsb2NrICovCiAgICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKICAgICAgICAKICAgICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7CiAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7IAogICAgICAgIAogICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8gICAgICAgICAgCiAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsgCiAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgICAgfQogICAgfQogIH0KICAKICBpZiAoKGhjcnlwLT5TaXplICUgMTZVKSAhPSAwVSkgIAogIHsgIAogICAgLyogQ1JZUCBXb3JrYXJvdW5kIDogIENSWVAxIGdlbmVyYXRlcyBjb3JyZWN0IFRBRyAgZHVyaW5nIENDTSBkZWNyeXB0aW9uIG9ubHkgd2hlbiBjaXBoZXJ0ZXh0IGJsb2NrcyBzaXplIGlzIG11bHRpcGxlIG9mCiAgICAxMjggYml0cy4gSWYgbHRoZSBzaXplIG9mIHRoZSBsYXN0IGJsb2NrIG9mIHBheWxvYWQgaXMgaW5mZXJpb3IgdG8gMTI4IGJpdHMsIHdoZW4gQ0NNIGRlY3J5cHRpb24KICAgIGlzIHNlbGVjdGVkLCB0aGVuIHRoZSBUQUcgbWVzc2FnZSB3aWxsIGJlIHdyb25nLiovICAgCiAgICBDUllQX1dvcmthcm91bmQoaGNyeXAsVGltZW91dCk7CiAgfQojZW5kaWYgLyogQ1JZUCAqLwogIAogIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KICByZXR1cm4gSEFMX09LOwp9CgovKioKICAqIEBicmllZiAgQUVTIENDTSBlbmNyeXB0aW9uL2RlY3J5cHRpb24gcHJvY2VzcyBpbiBpbnRlcnJ1cHQgbW9kZSAKICAqICAgICAgICAgZm9yIFRpbnlBRVMgSVAsIG5vIGVuY3J5cHQvZGVjcnlwdCBwZXJmb3JtZWQsIG9ubHkgYXV0aGVudGljYXRpb24gcHJlcGFyYXRpb24uCiAgKiBAcGFyYW0gIGhjcnlwOiBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCiAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZQogICogQHJldHZhbCBIQUwgc3RhdHVzCiAgKi8Kc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIENSWVBfQUVTQ0NNX1Byb2Nlc3NfSVQoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCkKewojaWYgZGVmaW5lZChDUllQKQogIF9fSU8gdWludDMyX3QgY291bnQgPSAwVTsKI2VuZGlmIC8qIENSWVAgKi8KICAKICAvKiAgUmVzZXQgQ3J5cEhlYWRlckNvdW50ICovCiAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCA9IDBVOwogIAojaWYgZGVmaW5lZChDUllQKQogIAogIC8qKioqKioqKioqKiogSW5pdCBwaGFzZSAqKioqKioqKioqKiovCiAgCiAgQ1JZUF9TRVRfUEhBU0UoaGNyeXAsQ1JZUF9QSEFTRV9JTklUKTsKICAKICAvKiBTZXQgdGhlIGtleSAqLwogIENSWVBfU2V0S2V5KGhjcnlwLCBoY3J5cC0+SW5pdC5LZXlTaXplKTsKICAKICAvKiBTZXQgdGhlIGluaXRpYWxpemF0aW9uIHZlY3RvciAoSVYpIHdpdGggQ1RSMSBpbmZvcm1hdGlvbiAqLwogIGhjcnlwLT5JbnN0YW5jZS0+SVYwTFIgPSAoaGNyeXAtPkluaXQuQjBbMF0pICYgQ1JZUF9DQ01fQ1RSMV8wOwogIGhjcnlwLT5JbnN0YW5jZS0+SVYwUlIgPSBoY3J5cC0+SW5pdC5CMFsxXTsKICBoY3J5cC0+SW5zdGFuY2UtPklWMUxSID0gaGNyeXAtPkluaXQuQjBbMl07CiAgaGNyeXAtPkluc3RhbmNlLT5JVjFSUiA9IChoY3J5cC0+SW5pdC5CMFszXSAmIENSWVBfQ0NNX0NUUjFfMSl8ICBDUllQX0NDTV9DVFIxXzI7CiAgCiAgLyogRW5hYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgKi8KICBfX0hBTF9DUllQX0VOQUJMRShoY3J5cCk7CiAgCiAgLypXcml0ZSB0aGUgQjAgcGFja2V0IGludG8gQ1JZUF9ESU4gUmVnaXN0ZXIqLwogIGlmKGhjcnlwLT5Jbml0LkRhdGFUeXBlID09IENSWVBfREFUQVRZUEVfOEIpCiAgewogICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JFVigqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuQjApKTsKICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19SRVYoICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5CMCsxKSk7CiAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUkVWKCoodWludDMyX3QqKShoY3J5cC0+SW5pdC5CMCsyKSk7CiAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUkVWKCoodWludDMyX3QqKShoY3J5cC0+SW5pdC5CMCszKSk7CiAgfQogIGVsc2UgaWYoaGNyeXAtPkluaXQuRGF0YVR5cGUgPT0gQ1JZUF9EQVRBVFlQRV8xNkIpCiAgewogICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JPUigqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuQjApLCAxNik7CiAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUk9SKCAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuQjArMSksIDE2KTsKICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19ST1IoKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkIwKzIpLCAxNik7CiAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUk9SKCoodWludDMyX3QqKShoY3J5cC0+SW5pdC5CMCszKSwgMTYpOwogIH0KICBlbHNlIGlmKGhjcnlwLT5Jbml0LkRhdGFUeXBlID09IENSWVBfREFUQVRZUEVfMUIpCiAgewogICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JCSVQoKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkIwKSk7CiAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUkJJVCggKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkIwKzEpKTsKICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19SQklUKCoodWludDMyX3QqKShoY3J5cC0+SW5pdC5CMCsyKSk7CiAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUkJJVCgqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuQjArMykpOwogIH0KICBlbHNlCiAgewogICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuQjApOwogICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuQjArMSk7CiAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5CMCsyKTsKICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkIwKzMpOwogIH0KICAvKldhaXQgZm9yIHRoZSBDUllQRU4gYml0IHRvIGJlIGNsZWFyZWQqLwogIGNvdW50ID0gQ1JZUF9USU1FT1VUX0dDTUNDTUlOSVRQSEFTRTsKICBkbwogIHsKICAgIGNvdW50LS0gOwogICAgaWYoY291bnQgPT0gMFUpCiAgICB7CiAgICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLwogICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwogICAgICAKICAgICAgLyogQ2hhbmdlIHN0YXRlICovCiAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfVElNRU9VVDsKICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7ICAKICAgICAgCiAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8gICAgICAgICAgCiAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7IAogICAgICByZXR1cm4gSEFMX0VSUk9SOwogICAgfQogIH0KICB3aGlsZSgoaGNyeXAtPkluc3RhbmNlLT5DUiAmIENSWVBfQ1JfQ1JZUEVOKSA9PSBDUllQX0NSX0NSWVBFTik7CiAgCiAgLyogU2VsZWN0IGhlYWRlciBwaGFzZSAqLwogIENSWVBfU0VUX1BIQVNFKGhjcnlwLCBDUllQX1BIQVNFX0hFQURFUik7IAogIAogIC8qIEVuYWJsZSBpbnRlcnJ1cHRzICovCiAgX19IQUxfQ1JZUF9FTkFCTEVfSVQoaGNyeXAsIENSWVBfSVRfSU5JKTsKICAKICAvKiBFbmFibGUgQ1JZUCAqLwogIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsgCiAgCiNlbHNlIC8qIEFFUyAqLyAKICAKICAvKkFFUzJ2MS4xLjEgOiBDQ00gYXV0aGVudGljYXRpb24gOiBubyBpbml0IHBoYXNlLCBvbmx5IGhlYWRlciBhbmQgZmluYWwgcGhhc2UgKi8gCiAgLyogU2VsZWN0IGhlYWRlciBwaGFzZSAqLwogIENSWVBfU0VUX1BIQVNFKGhjcnlwLCBDUllQX1BIQVNFX0hFQURFUik7IAogIAogIC8qIGNvbmZpZ3VyZWQgbW9kZSBhbmQgZW5jcnlwdGlvbiBtb2RlICovCiAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfTU9ERSwgQ1JZUF9PUEVSQVRJTkdNT0RFX0VOQ1JZUFQpOyAKICAKICAvKiBTZXQgdGhlIGtleSAqLwogIENSWVBfU2V0S2V5KGhjcnlwLCBoY3J5cC0+SW5pdC5LZXlTaXplKTsgICAgIAogIAogIC8qIFNldCB0aGUgaW5pdGlhbGl6YXRpb24gdmVjdG9yIHdpdGggemVybyB2YWx1ZXMqLyAKICBoY3J5cC0+SW5zdGFuY2UtPklWUjMgPSAwVTsKICBoY3J5cC0+SW5zdGFuY2UtPklWUjIgPSAwVTsKICBoY3J5cC0+SW5zdGFuY2UtPklWUjEgPSAwVTsKICBoY3J5cC0+SW5zdGFuY2UtPklWUjAgPSAwVTsKICAKICAvKiBFbmFibGUgaW50ZXJydXB0cyAqLwogIF9fSEFMX0NSWVBfRU5BQkxFX0lUKGhjcnlwLENSWVBfSVRfQ0NGSUUgfCBDUllQX0lUX0VSUklFKTsgCiAgLyogRW5hYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgKi8KICBfX0hBTF9DUllQX0VOQUJMRShoY3J5cCk7CiAgCiAgLypXcml0ZSB0aGUgQjAgcGFja2V0IGludG8gQ1JZUF9ESU4qLwogIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5CMCk7CiAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkIwKzEpOwogIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5CMCsyKTsKICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuQjArMyk7IAogIAojZW5kaWYgLyogRW5kIEFFUyBvciBDUllQICovCiAgCiAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLwogIHJldHVybiBIQUxfT0s7ICAKfQovKioKICAqIEBicmllZiAgQUVTIENDTSBlbmNyeXB0aW9uL2RlY3J5cHRpb24gcHJvY2VzcyBpbiBETUEgbW9kZSAKICAqICAgICAgICAgZm9yIFRpbnlBRVMgSVAsIG5vIGVuY3J5cHQvZGVjcnlwdCBwZXJmb3JtZWQsIG9ubHkgYXV0aGVudGljYXRpb24gcHJlcGFyYXRpb24uCiAgKiBAcGFyYW0gIGhjcnlwOiBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCiAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZQogICogQHJldHZhbCBIQUwgc3RhdHVzCiAgKi8Kc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIENSWVBfQUVTQ0NNX1Byb2Nlc3NfRE1BKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApCnsgIAogIHVpbnQzMl90IHdvcmRzaXplOwogIF9fSU8gdWludDMyX3QgY291bnQgPSAwVTsKICAKICAvKiAgUmVzZXQgQ3J5cEhlYWRlckNvdW50ICovCiAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCA9IDBVOwogIAojaWYgZGVmaW5lZChDUllQKSAgCiAgCiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqIEluaXQgcGhhc2UgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgCiAgQ1JZUF9TRVRfUEhBU0UoaGNyeXAsQ1JZUF9QSEFTRV9JTklUKTsKICAKICAvKiBTZXQgdGhlIGtleSAqLwogIENSWVBfU2V0S2V5KGhjcnlwLCBoY3J5cC0+SW5pdC5LZXlTaXplKTsgIAogIAogIC8qIFNldCB0aGUgaW5pdGlhbGl6YXRpb24gdmVjdG9yIChJVikgd2l0aCBDVFIxIGluZm9ybWF0aW9uICovCiAgaGNyeXAtPkluc3RhbmNlLT5JVjBMUiA9IChoY3J5cC0+SW5pdC5CMFswXSkgJiBDUllQX0NDTV9DVFIxXzA7CiAgaGNyeXAtPkluc3RhbmNlLT5JVjBSUiA9IGhjcnlwLT5Jbml0LkIwWzFdOwogIGhjcnlwLT5JbnN0YW5jZS0+SVYxTFIgPSBoY3J5cC0+SW5pdC5CMFsyXTsKICBoY3J5cC0+SW5zdGFuY2UtPklWMVJSID0gKGhjcnlwLT5Jbml0LkIwWzNdICYgQ1JZUF9DQ01fQ1RSMV8xKXwgIENSWVBfQ0NNX0NUUjFfMjsKICAKICAvKiBFbmFibGUgdGhlIENSWVAgcGVyaXBoZXJhbCAqLwogIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsKICAKICAvKldyaXRlIHRoZSBCMCBwYWNrZXQgaW50byBDUllQX0RJTiBSZWdpc3RlciovCiAgaWYoaGNyeXAtPkluaXQuRGF0YVR5cGUgPT0gQ1JZUF9EQVRBVFlQRV84QikKICB7CiAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUkVWKCoodWludDMyX3QqKShoY3J5cC0+SW5pdC5CMCkpOwogICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JFViggKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkIwKzEpKTsKICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19SRVYoKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkIwKzIpKTsKICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19SRVYoKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkIwKzMpKTsKICB9CiAgZWxzZSBpZihoY3J5cC0+SW5pdC5EYXRhVHlwZSA9PSBDUllQX0RBVEFUWVBFXzE2QikKICB7CiAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUk9SKCoodWludDMyX3QqKShoY3J5cC0+SW5pdC5CMCksIDE2KTsKICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19ST1IoICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5CMCsxKSwgMTYpOwogICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JPUigqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuQjArMiksIDE2KTsKICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19ST1IoKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkIwKzMpLCAxNik7ICAgIAogIH0KICBlbHNlIGlmKGhjcnlwLT5Jbml0LkRhdGFUeXBlID09IENSWVBfREFUQVRZUEVfMUIpCiAgewogICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JCSVQoKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkIwKSk7CiAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUkJJVCggKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkIwKzEpKTsKICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19SQklUKCoodWludDMyX3QqKShoY3J5cC0+SW5pdC5CMCsyKSk7CiAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUkJJVCgqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuQjArMykpOwogIH0KICBlbHNlCiAgewogICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuQjApOwogICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuQjArMSk7CiAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5CMCsyKTsKICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkIwKzMpOwogIH0KICAKICAvKldhaXQgZm9yIHRoZSBDUllQRU4gYml0IHRvIGJlIGNsZWFyZWQqLwogIGNvdW50ID0gQ1JZUF9USU1FT1VUX0dDTUNDTUlOSVRQSEFTRTsKICBkbwogIHsKICAgIGNvdW50LS0gOwogICAgaWYoY291bnQgPT0gMFUpCiAgICB7CiAgICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLwogICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwogICAgICAKICAgICAgLyogQ2hhbmdlIHN0YXRlICovCiAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfVElNRU9VVDsKICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CiAgICAgIAogICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovICAgICAgICAgIAogICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOyAKICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgIH0KICB9CiAgd2hpbGUoKGhjcnlwLT5JbnN0YW5jZS0+Q1IgJiBDUllQX0NSX0NSWVBFTikgPT0gQ1JZUF9DUl9DUllQRU4pOwogIAojZWxzZSAvKiBBRVMgKi8gCiAgCiAgLypBRVMydjEuMS4xIDogQ0NNIGF1dGhlbnRpY2F0aW9uIDogbm8gaW5pdCBwaGFzZSwgb25seSBoZWFkZXIgYW5kIGZpbmFsIHBoYXNlICovIAogIC8qIFNlbGVjdCBoZWFkZXIgcGhhc2UgKi8KICBDUllQX1NFVF9QSEFTRShoY3J5cCwgQ1JZUF9QSEFTRV9IRUFERVIpOyAKICAKICAvKiBjb25maWd1cmVkIENDTSBjaGFpbmluZyBtb2RlIGFuZCBlbmNyeXB0aW9uIG1vZGUgKi8KICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIEFFU19DUl9NT0RFLCBDUllQX09QRVJBVElOR01PREVfRU5DUllQVCk7CiAgCiAgLyogU2V0IHRoZSBrZXkgKi8KICBDUllQX1NldEtleShoY3J5cCwgaGNyeXAtPkluaXQuS2V5U2l6ZSk7ICAgICAKICAKICAvKiBTZXQgdGhlIGluaXRpYWxpemF0aW9uIHZlY3RvciB3aXRoIHplcm8gdmFsdWVzKi8gCiAgaGNyeXAtPkluc3RhbmNlLT5JVlIzID0gMFU7CiAgaGNyeXAtPkluc3RhbmNlLT5JVlIyID0gMFU7CiAgaGNyeXAtPkluc3RhbmNlLT5JVlIxID0gMFU7CiAgaGNyeXAtPkluc3RhbmNlLT5JVlIwID0gMFU7CiAgCiAgLyogRW5hYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgKi8KICBfX0hBTF9DUllQX0VOQUJMRShoY3J5cCk7CiAgCiAgLypXcml0ZSB0aGUgQjAgcGFja2V0IGludG8gQ1JZUF9ESU4qLwogIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5CMCk7CiAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkIwKzEpOwogIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5CMCsyKTsKICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuQjArMyk7IAogIAogIC8qICB3YWl0IHVudGlsIHRoZSBlbmQgb2YgY29tcHV0YXRpb24gKi8KICBjb3VudCA9IENSWVBfVElNRU9VVF9HQ01DQ01JTklUUEhBU0U7CiAgZG8KICB7CiAgICBjb3VudC0tIDsKICAgIGlmKGNvdW50ID09IDBVKQp7CiAgLyogRGlzYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIGNsb2NrICovCiAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKICAKICAvKiBDaGFuZ2Ugc3RhdGUgKi8KICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7CiAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7ICAKICAKICAvKiBQcm9jZXNzIFVubG9ja2VkICovICAgICAgICAgIAogIF9fSEFMX1VOTE9DSyhoY3J5cCk7IAogIHJldHVybiBIQUxfRVJST1I7Cn0KICB9CiAgd2hpbGUoSEFMX0lTX0JJVF9DTFIoaGNyeXAtPkluc3RhbmNlLT5TUiwgQUVTX1NSX0NDRikpOwogIAogIC8qIENsZWFyIENDRiBmbGFnICovCiAgX19IQUxfQ1JZUF9DTEVBUl9GTEFHKGhjcnlwLCBDUllQX0NDRl9DTEVBUik7CiAgCiNlbmRpZiAvKiBBRVMgKi8KICAKICAvKioqKioqKioqKioqKioqKioqKioqIEhlYWRlciBwaGFzZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAKICBpZihDUllQX0dDTUNDTV9TZXRIZWFkZXJQaGFzZV9ETUEoaGNyeXApICE9IEhBTF9PSykKICB7CiAgICByZXR1cm4gSEFMX0VSUk9SOwogIH0KICAKICAvKioqKioqKioqKioqKioqKioqKiogUGF5bG9hZCBwaGFzZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gICAKICAKICAvKiBTZXQgdGhlIHBoYXNlICovCiAgaGNyeXAtPlBoYXNlID0gQ1JZUF9QSEFTRV9QUk9DRVNTOyAgCiAgCiNpZiBkZWZpbmVkKENSWVApICAKICAKICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgKi8KICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwogIAogIC8qIFNlbGVjdCBwYXlsb2FkIHBoYXNlIG9uY2UgdGhlIGhlYWRlciBwaGFzZSBpcyBwZXJmb3JtZWQgKi8KICBDUllQX1NFVF9QSEFTRShoY3J5cCwgQ1JZUF9QSEFTRV9QQVlMT0FEKTsKICAKI2VuZGlmIC8qIENSWVAgKi8gICAKICAKICBpZihoY3J5cC0+U2l6ZSAhPSAwVSkKICB7IAogICAgLyogU2l6ZSBzaG91bGQgYmUgJTQgIG90aGVyd2lzZSBUYWcgd2lsbCAgYmUgaW5jb3JyZWN0bHkgZ2VuZXJhdGVkIGZvciBHQ00gRW5jcnlwdGlvbiAmIENDTSBEZWNyeXB0aW9uCiAgICBXb3JrYXJvdW5kIGlzIGltcGxlbWVudGVkIGluIHBvbGxpbmcgbW9kZSwgc28gaWYgbGFzdCBibG9jayBvZiAKICAgIHBheWxvYWQgPDEyOGJpdCBkb24ndCB1c2UgSEFMX0NSWVBfQUVTR0NNX0RNQSBvdGhlcndpc2UgVEFHIGlzIGluY29ycmVjdGx5IGdlbmVyYXRlZCBmb3IgR0NNIEVuY3J5cHRpb24uICovCiAgICAvKiBTZXQgdGhlIGlucHV0IGFuZCBvdXRwdXQgYWRkcmVzc2VzIGFuZCBzdGFydCBETUEgdHJhbnNmZXIgKi8gCiAgICBpZiAoKGhjcnlwLT5TaXplICUgMTZVKSA9PSAwVSkgCiAgICB7ICAKICAgICAgQ1JZUF9TZXRETUFDb25maWcoaGNyeXAsICh1aW50MzJfdCkoIGhjcnlwLT5wQ3J5cEluQnVmZlB0ciksIGhjcnlwLT5TaXplLzRVLCAodWludDMyX3QpKGhjcnlwLT5wQ3J5cE91dEJ1ZmZQdHIpKTsgICAKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgd29yZHNpemUgPSAodWludDMyX3QpKGhjcnlwLT5TaXplKSsxNlUtKCh1aW50MzJfdCkoaGNyeXAtPlNpemUpICUxNlUpIDsgCiAgICAgIAogICAgICAvKiBTZXQgdGhlIGlucHV0IGFuZCBvdXRwdXQgYWRkcmVzc2VzIGFuZCBzdGFydCBETUEgdHJhbnNmZXIsIHBDcnlwT3V0QnVmZlB0ciBzaXplIHNob3VsZCBiZSAlNCovIAogICAgICBDUllQX1NldERNQUNvbmZpZyhoY3J5cCwgKHVpbnQzMl90KSggaGNyeXAtPnBDcnlwSW5CdWZmUHRyKSwgKHVpbnQxNl90KXdvcmRzaXplLzRVLCAodWludDMyX3QpKGhjcnlwLT5wQ3J5cE91dEJ1ZmZQdHIpKTsKICAgIH0gICAKICB9CiAgZWxzZSAvKlNpemUgPSAwKi8KICB7CiAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCiAgICBfX0hBTF9VTkxPQ0soaGNyeXApOwogICAgCiAgICAvKiBDaGFuZ2UgdGhlIENSWVAgc3RhdGUgYW5kIHBoYXNlICovCiAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKICB9ICAgICAgICAgCiAgCiAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLwogIHJldHVybiBIQUxfT0s7Cn0KCi8qKgogICogQGJyaWVmICBTZXRzIHRoZSBwYXlsb2FkIHBoYXNlIGluIGl0ZXJydXB0IG1vZGUKICAqIEBwYXJhbSAgaGNyeXA6IHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIENSWVAgbW9kdWxlICAKICAqIEByZXR2YWwgc3RhdGUKICAqLwpzdGF0aWMgdm9pZCBDUllQX0dDTUNDTV9TZXRQYXlsb2FkUGhhc2VfSVQoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCkKeyAgCiAgdWludDMyX3QgbG9vcGNvdW50ZXI7CiAgdWludDMyX3QgdGVtcDsgIC8qIFRlbXBvcmFyeSBDcnlwT3V0QnVmZiAqLwogIHVpbnQzMl90IGxhc3R3b3Jkc2l6ZTsgCiAgdWludDMyX3QgbnBibGI7CQogI2lmIGRlZmluZWQoQUVTKSAKICB1aW50MTZfdCBvdXRjb3VudDsgIC8qIFRlbXBvcmFyeSBDcnlwT3V0Q291bnQgVmFsdWUgKi8gCiNlbmRpZiAvKiBBRVMgKi8gCiAgCiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFBheWxvYWQgcGhhc2UgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAKI2lmIGRlZmluZWQoQ1JZUCkgIAogIGlmKGhjcnlwLT5TaXplID09IDBVKQogIHsgICAgIAogICAgLyogRGlzYWJsZSBpbnRlcnJ1cHRzICovCiAgICBfX0hBTF9DUllQX0RJU0FCTEVfSVQoaGNyeXAsIENSWVBfSVRfSU5JfCBDUllQX0lUX09VVEkpOwogICAgCiAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCiAgICBfX0hBTF9VTkxPQ0soaGNyeXApOwogICAgCiAgICAvKiBDaGFuZ2UgdGhlIENSWVAgc3RhdGUgKi8KICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOyAgICAgIAogIH0gICAgCiAgCiAgZWxzZSBpZiAoKChoY3J5cC0+U2l6ZS80VSkgLSAoaGNyeXAtPkNyeXBJbkNvdW50KSkgPj0gNFUpCiAgeyAKICAgIC8qIFdyaXRlIHRoZSBpbnB1dCBibG9jayBpbiB0aGUgSU4gRklGTyAqLwogICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQgKTsKICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOwogICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQgKTsKICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOyAgIAogICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQgKTsKICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOwogICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQgKTsKICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOyAKICAgIGlmKCgoaGNyeXAtPlNpemUvNFUpID09IGhjcnlwLT5DcnlwSW5Db3VudCkgJiYoKGhjcnlwLT5TaXplICUxNlUgKT09IDBVKSkKICAgIHsgICAgIAogICAgICAvKiBEaXNhYmxlIGludGVycnVwdHMgKi8KICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFX0lUKGhjcnlwLCBDUllQX0lUX0lOSSk7CiAgICAgIAogICAgICAvKiBDYWxsIHRoZSBpbnB1dCBkYXRhIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCiNpZiAoVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkgCiAgICAgIC8qQ2FsbCByZWdpc3RlcmVkIElucHV0IGNvbXBsZXRlIGNhbGxiYWNrKi8KICAgICAgaGNyeXAtPkluQ3BsdENhbGxiYWNrKGhjcnlwKTsKI2Vsc2UKICAgICAgLypDYWxsIGxlZ2FjeSB3ZWFrIElucHV0IGNvbXBsZXRlIGNhbGxiYWNrKi8KICAgICAgSEFMX0NSWVBfSW5DcGx0Q2FsbGJhY2soaGNyeXApOwojZW5kaWYgLyogVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyAqLwogICAgfSAgICAKICAgIGlmKGhjcnlwLT5DcnlwT3V0Q291bnQgPCAoaGNyeXAtPlNpemUvNFUpKSAgICAgICAgCiAgICB7CiAgICAgIC8qIFJlYWQgdGhlIG91dHB1dCBibG9jayBmcm9tIHRoZSBPdXRwdXQgRklGTyBhbmQgcHV0IHRoZW0gaW4gdGVtcG9yYXJ5IGJ1ZmZlciB0aGVuIGdldCBDcnlwT3V0QnVmZiBmcm9tIHRlbXBvcmFyeSBidWZmZXIgICovIAogICAgICB0ZW1wICA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVDsKICAgICAgKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBPdXRCdWZmUHRyICsgaGNyeXAtPkNyeXBPdXRDb3VudCkgPSB0ZW1wOyAgICAgIAogICAgICBoY3J5cC0+Q3J5cE91dENvdW50Kys7CiAgICAgIHRlbXAgID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUOyAgICAKICAgICAgKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBPdXRCdWZmUHRyICsgaGNyeXAtPkNyeXBPdXRDb3VudCkgPSB0ZW1wOwogICAgICBoY3J5cC0+Q3J5cE91dENvdW50Kys7ICAgIAogICAgICB0ZW1wICA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVDsgICAgCiAgICAgICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwT3V0QnVmZlB0ciArIGhjcnlwLT5DcnlwT3V0Q291bnQpID0gdGVtcDsgICAgICAKICAgICAgaGNyeXAtPkNyeXBPdXRDb3VudCsrOwogICAgICB0ZW1wICA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVDsgICAKICAgICAgKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBPdXRCdWZmUHRyICsgaGNyeXAtPkNyeXBPdXRDb3VudCkgPSB0ZW1wOwogICAgICBoY3J5cC0+Q3J5cE91dENvdW50Kys7CiAgICAgIGlmICgoKGhjcnlwLT5TaXplLzRVKSA9PSBoY3J5cC0+Q3J5cE91dENvdW50KSYmKChoY3J5cC0+U2l6ZSAlMTZVICk9PSAwVSkpCiAgICAgIHsgICAgIAogICAgICAgIC8qIERpc2FibGUgaW50ZXJydXB0cyAqLwogICAgICAgIF9fSEFMX0NSWVBfRElTQUJMRV9JVChoY3J5cCwgQ1JZUF9JVF9PVVRJKTsKICAgICAgICAKICAgICAgICAvKiBDaGFuZ2UgdGhlIENSWVAgc3RhdGUgKi8KICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKICAgICAgICAKICAgICAgICAvKiBEaXNhYmxlIENSWVAgKi8KICAgICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwogICAgICAgIAogICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOwogICAgICAgIAogICAgICAgIC8qIENhbGwgb3V0cHV0IHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCiNpZiAoVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKSAKICAgICAgICAvKkNhbGwgcmVnaXN0ZXJlZCBPdXRwdXQgY29tcGxldGUgY2FsbGJhY2sqLwogICAgICAgIGhjcnlwLT5PdXRDcGx0Q2FsbGJhY2soaGNyeXApOwojZWxzZQogICAgICAgIC8qQ2FsbCBsZWdhY3kgd2VhayBPdXRwdXQgY29tcGxldGUgY2FsbGJhY2sqLwogICAgICAgIEhBTF9DUllQX091dENwbHRDYWxsYmFjayhoY3J5cCk7CiNlbmRpZiAvKiBVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTICovICAKICAgICAgfSAgICAKICAgIH0gICAgICAKICB9ICAgCiAgZWxzZSBpZiAoKGhjcnlwLT5TaXplICUxNlUgKSE9IDBVKQogIHsgICAKICAgIC8qIFNpemUgc2hvdWxkIGJlICU0IGluIHdvcmQgYW5kICUxNiBpbiBieXRlICBvdGhlcndpc2UgVEFHIHdpbGwgIGJlIGluY29ycmVjdGx5IGdlbmVyYXRlZCBmb3IgR0NNIEVuY3J5cHRpb24gJiBDQ00gRGVjcnlwdGlvbgogICAgV29ya2Fyb3VuZCBpcyBpbXBsZW1lbnRlZCBpbiBwb2xsaW5nIG1vZGUsIHNvIGlmIGxhc3QgYmxvY2sgb2YgCiAgICBwYXlsb2FkIDwxMjhiaXQgZG9uJ3QgdXNlIENSWVBfQUVTR0NNX0VuY3J5cHRfSVQgb3RoZXJ3aXNlIFRBRyBpcyBpbmNvcnJlY3RseSBnZW5lcmF0ZWQuICovCiAgICAKICAgICAgIC8qIENvbXB1dGUgdGhlIG51bWJlciBvZiBwYWRkaW5nIGJ5dGVzIGluIGxhc3QgYmxvY2sgb2YgcGF5bG9hZCAqLwogICAgbnBibGIgPSAoKCgodWludDMyX3QpKGhjcnlwLT5TaXplKS8xNlUpKzFVKSoxNlUpLSAodWludDMyX3QpKGhjcnlwLT5TaXplKTsKICAgIAogICAgLyogTnVtYmVyIG9mIHZhbGlkIHdvcmRzIChsYXN0d29yZHNpemUpIGluIGxhc3QgYmxvY2sgKi8KICAgIGlmICgobnBibGIlNFUpID09MFUpIAogICAgeyAKICAgICAgbGFzdHdvcmRzaXplID0gKDE2VS1ucGJsYikvNFU7CQkKICAgIH0KICAgIGVsc2UgCiAgICB7CiAgICAgIGxhc3R3b3Jkc2l6ZSA9ICgoMTZVLW5wYmxiKS80VSkgKzFVOwogICAgfQkKICAgIAogICAgLyogIExhc3QgYmxvY2sgb3B0aW9uYWxseSBwYWQgdGhlIGRhdGEgd2l0aCB6ZXJvcyovCiAgICBmb3IobG9vcGNvdW50ZXIgPSAwVTsgbG9vcGNvdW50ZXIgPCBsYXN0d29yZHNpemU7IGxvb3Bjb3VudGVyKyspCiAgICB7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQgKTsKICAgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7CiAgICB9CiAgICB3aGlsZShsb29wY291bnRlciA8IDRVICkKICAgIHsgCiAgICAgIC8qIFBhZCB0aGUgZGF0YSB3aXRoIHplcm9zIHRvIGhhdmUgYSBjb21wbGV0ZSBibG9jayAqLyAgICAgCiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gMHgwVTsgICAgICAgICAKICAgICAgbG9vcGNvdW50ZXIrKzsKICAgIH0KICAgIF9fSEFMX0NSWVBfRElTQUJMRV9JVChoY3J5cCwgQ1JZUF9JVF9JTkkpOwogICAgCiAgICBpZigoaGNyeXAtPkluc3RhbmNlLT5TUiAmIENSWVBfRkxBR19PRk5FICkgIT0gMHgwVSkgCiAgICB7CiAgICAgIGZvcihsb29wY291bnRlciA9IDBVOyBsb29wY291bnRlciA8IDRVOyBsb29wY291bnRlcisrKSAgICAgICAgCiAgICAgIHsgIAogICAgICAgIC8qIFJlYWQgdGhlIG91dHB1dCBibG9jayBmcm9tIHRoZSBvdXRwdXQgRklGTyBhbmQgcHV0IHRoZW0gaW4gdGVtcG9yYXJ5IGJ1ZmZlciAqLwogICAgICAgIHRlbXA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVDsgCiAgICAgICAgCiAgICAgICAgLypnZXQgQ3J5cE91dEJ1ZmYgZnJvbSB0ZW1wb3JhcnkgYnVmZmVyICAqLwogICAgICAgICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwT3V0QnVmZlB0ciArIChoY3J5cC0+Q3J5cE91dENvdW50KSk9dGVtcDsgCiAgICAgICAgaGNyeXAtPkNyeXBPdXRDb3VudCsrOyAgIAogICAgICB9ICAgICAKICAgIH0gICAgICAgICAKICAgIGlmKGhjcnlwLT5DcnlwT3V0Q291bnQgPj0gIChoY3J5cC0+U2l6ZS80VSkpCiAgICB7ICAgICAgICAgICAgICAKICAgICAgLyogRGlzYWJsZSBpbnRlcnJ1cHRzICovCiAgICAgIF9fSEFMX0NSWVBfRElTQUJMRV9JVChoY3J5cCwgQ1JZUF9JVF9PVVRJfENSWVBfSVRfSU5JKTsKICAgICAgCiAgICAgIC8qIENoYW5nZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIHN0YXRlICovCiAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOwogICAgICAKICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLwogICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOwogICAgICAKICAgICAgLyogQ2FsbCBvdXRwdXQgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpIAogICAgICAvKkNhbGwgcmVnaXN0ZXJlZCBPdXRwdXQgY29tcGxldGUgY2FsbGJhY2sqLwogICAgICBoY3J5cC0+T3V0Q3BsdENhbGxiYWNrKGhjcnlwKTsKI2Vsc2UKICAgICAgLypDYWxsIGxlZ2FjeSB3ZWFrIE91dHB1dCBjb21wbGV0ZSBjYWxsYmFjayovCiAgICAgIEhBTF9DUllQX091dENwbHRDYWxsYmFjayhoY3J5cCk7CiNlbmRpZiAvKiBVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTICovICAKICAgIH0gICAKICB9CiAgZWxzZQogIHsKICAgIC8qIE5vdGhpbmcgdG8gZG8gKi8KICB9CiNlbHNlIC8qIEFFUyAqLwogIAogIC8qIFJlYWQgdGhlIG91dHB1dCBibG9jayBmcm9tIHRoZSBvdXRwdXQgRklGTyBhbmQgcHV0IHRoZW0gaW4gdGVtcG9yYXJ5IGJ1ZmZlciB0aGVuIGdldCBDcnlwT3V0QnVmZiBmcm9tIHRlbXBvcmFyeSBidWZmZXIqLyAKICB0ZW1wICA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVFI7CiAgKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBPdXRCdWZmUHRyICsgKGhjcnlwLT5DcnlwT3V0Q291bnQpKSA9dGVtcDsKICBoY3J5cC0+Q3J5cE91dENvdW50Kys7CiAgdGVtcCAgPSBoY3J5cC0+SW5zdGFuY2UtPkRPVVRSOwogICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwT3V0QnVmZlB0ciArIGhjcnlwLT5DcnlwT3V0Q291bnQpICAgPXRlbXA7CiAgaGNyeXAtPkNyeXBPdXRDb3VudCsrOyAgICAKICB0ZW1wICA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVFI7CiAgKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBPdXRCdWZmUHRyICsgKGhjcnlwLT5DcnlwT3V0Q291bnQpKSA9IHRlbXA7ICAgICAgCiAgaGNyeXAtPkNyeXBPdXRDb3VudCsrOwogIHRlbXAgID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUUjsgCiAgKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBPdXRCdWZmUHRyICsgaGNyeXAtPkNyeXBPdXRDb3VudCkgICA9IHRlbXA7CiAgaGNyeXAtPkNyeXBPdXRDb3VudCsrOyAKICAvKlRlbXBvcmFyeSBDcnlwT3V0Q291bnQgVmFsdWUqLwogIG91dGNvdW50ID0gaGNyeXAtPkNyeXBPdXRDb3VudDsKICAKICBpZigoaGNyeXAtPkNyeXBPdXRDb3VudCA+PSAgKGhjcnlwLT5TaXplLzRVKSkgJiYgKChvdXRjb3VudCo0VSkgPj0gIGhjcnlwLT5TaXplKSApCiAgewogICAgLyogRGlzYWJsZSBjb21wdXRhdGlvbiBjb21wbGV0ZSBmbGFnIGFuZCBlcnJvcnMgaW50ZXJydXB0cyAqLwogICAgX19IQUxfQ1JZUF9ESVNBQkxFX0lUKGhjcnlwLENSWVBfSVRfQ0NGSUV8Q1JZUF9JVF9FUlJJRSk7CiAgICAKICAgIC8qIENoYW5nZSB0aGUgQ1JZUCBzdGF0ZSAqLwogICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CiAgICAKICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CiAgICAKICAgICAgICAvKiBDYWxsIG91dHB1dCB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLwojaWYgKFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkgCiAgICAgICAgLypDYWxsIHJlZ2lzdGVyZWQgT3V0cHV0IGNvbXBsZXRlIGNhbGxiYWNrKi8KICAgICAgICBoY3J5cC0+T3V0Q3BsdENhbGxiYWNrKGhjcnlwKTsKI2Vsc2UKICAgICAgICAvKkNhbGwgbGVnYWN5IHdlYWsgT3V0cHV0IGNvbXBsZXRlIGNhbGxiYWNrKi8KICAgICAgICBIQUxfQ1JZUF9PdXRDcGx0Q2FsbGJhY2soaGNyeXApOwojZW5kaWYgLyogVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyAqLyAgCiAgfSAgIAogIAogIGVsc2UgaWYgKCgoaGNyeXAtPlNpemUvNFUpIC0gKGhjcnlwLT5DcnlwSW5Db3VudCkpID49IDRVKQogIHsgCiAgICAvKiBXcml0ZSB0aGUgaW5wdXQgYmxvY2sgaW4gdGhlIElOIEZJRk8gKi8KICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCApOwogICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7CiAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQgKTsKICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOyAgIAogICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50ICk7CiAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCApOwogICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7ICAKICAgIGlmKChoY3J5cC0+Q3J5cEluQ291bnQgPT0gIGhjcnlwLT5TaXplKSAmJiAoaGNyeXAtPkluaXQuQWxnb3JpdGhtID09IENSWVBfQUVTX0dDTV9HTUFDKSkKICAgIHsgCiAgICAgIC8qIENhbGwgSW5wdXQgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpIAogICAgICAvKkNhbGwgcmVnaXN0ZXJlZCBJbnB1dCBjb21wbGV0ZSBjYWxsYmFjayovCiAgICAgIGhjcnlwLT5JbkNwbHRDYWxsYmFjayhoY3J5cCk7CiNlbHNlCiAgICAgIC8qQ2FsbCBsZWdhY3kgd2VhayBJbnB1dCBjb21wbGV0ZSBjYWxsYmFjayovCiAgICAgIEhBTF9DUllQX0luQ3BsdENhbGxiYWNrKGhjcnlwKTsKI2VuZGlmIC8qIFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8gICAgICAKICAgIH0gCiAgfQogIGVsc2UgLyogTGFzdCBibG9jayBvZiBwYXlsb2FkIDwgMTI4Yml0Ki8KICB7ICAgIAogICAgLyogV29ya2Fyb3VuZCBub3QgaW1wbGVtZW50ZWQsIFNpemUgc2hvdWxkIGJlICU0ICBvdGhlcndpc2UgVGFnIHdpbGwgIGJlIGluY29ycmVjdGx5CiAgICBnZW5lcmF0ZWQgZm9yIEdDTSBFbmNyeXB0aW9uICYgQ0NNIERlY3J5cHRpb24uIFdvcmthcm91bmQgaXMgaW1wbGVtZW50ZWQgaW4gcG9sbGluZyBtb2RlLCBzbyBpZiBsYXN0IGJsb2NrIG9mIAogICAgcGF5bG9hZCA8MTI4Yml0IGRvbid0IHVzZSBDUllQX0VuY3J5cHRfSVQgb3RoZXJ3aXNlIFRBRyBpcyBpbmNvcnJlY3RseSBnZW5lcmF0ZWQgZm9yIEdDTSBFbmNyeXB0aW9uICYgQ0NNIERlY3J5cHRpb24uICovICAKICAgIAogICAgLyogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIHBhZGRpbmcgYnl0ZXMgaW4gbGFzdCBibG9jayBvZiBwYXlsb2FkICovCiAgICBucGJsYiA9ICgoKCh1aW50MzJfdCkoaGNyeXAtPlNpemUpLzE2VSkrMVUpKjE2VSkgLSAodWludDMyX3QpKGhjcnlwLT5TaXplKTsKIAogICAgICAgIC8qIE51bWJlciBvZiB2YWxpZCB3b3JkcyAobGFzdHdvcmRzaXplKSBpbiBsYXN0IGJsb2NrICovCiAgICBpZiAoKG5wYmxiJTRVKSA9PTBVKSAKICAgIHsgCiAgICAgIGxhc3R3b3Jkc2l6ZSA9ICgxNlUtbnBibGIpLzRVOwkJCiAgICB9CiAgICBlbHNlIAogICAgewogICAgICBsYXN0d29yZHNpemUgPSAoKDE2VS1ucGJsYikvNFUpICsxVTsKICAgIH0JCiAgICAKICAgIC8qICBMYXN0IGJsb2NrIG9wdGlvbmFsbHkgcGFkIHRoZSBkYXRhIHdpdGggemVyb3MqLwogICAgZm9yKGxvb3Bjb3VudGVyID0gMFU7IGxvb3Bjb3VudGVyIDwgbGFzdHdvcmRzaXplOyBsb29wY291bnRlcisrKQogICAgewogICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCApOwogICAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKICAgIH0KICAgIHdoaWxlKGxvb3Bjb3VudGVyIDwgNFUgKQogICAgeyAKICAgICAgLyogcGFkIHRoZSBkYXRhIHdpdGggemVyb3MgdG8gaGF2ZSBhIGNvbXBsZXRlIGJsb2NrICovICAgICAKICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gMHgwVTsgICAgICAgICAKICAgICAgbG9vcGNvdW50ZXIrKzsKICAgIH0KICB9IAojZW5kaWYgLyogQUVTICovIAoKfSAKCgovKioKICAqIEBicmllZiAgU2V0cyB0aGUgaGVhZGVyIHBoYXNlIGluIHBvbGxpbmcgbW9kZQogICogQHBhcmFtICBoY3J5cDogcG9pbnRlciB0byBhIENSWVBfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucwogICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUoSGVhZGVyICYgSGVhZGVyU2l6ZSkKICAqIEBwYXJhbSAgVGltZW91dDogVGltZW91dCB2YWx1ZSAgIAogICogQHJldHZhbCBzdGF0ZQogICovCnN0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBDUllQX0dDTUNDTV9TZXRIZWFkZXJQaGFzZShDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50MzJfdCBUaW1lb3V0KQp7CiAgdWludDMyX3QgbG9vcGNvdW50ZXI7CiAgCiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIEhlYWRlciBwaGFzZSBmb3IgR0NNL0dNQUMgb3IgQ0NNICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAKICBpZigoaGNyeXAtPkluaXQuSGVhZGVyU2l6ZSAhPSAwVSkpCiAgewogICAgCiNpZiBkZWZpbmVkKENSWVApICAKICAgIAogICAgLyogU2VsZWN0IGhlYWRlciBwaGFzZSAqLwogICAgQ1JZUF9TRVRfUEhBU0UoaGNyeXAsIENSWVBfUEhBU0VfSEVBREVSKTsgCiAgICAKICAgIC8qIEVuYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsICovCiAgICBfX0hBTF9DUllQX0VOQUJMRShoY3J5cCk7ICAgIAogICAgCiAgICBpZiAoKGhjcnlwLT5Jbml0LkhlYWRlclNpemUgJTRVICk9PSAwVSkKICAgIHsgCiAgICAgIC8qIEhlYWRlclNpemUgJTQsIG5vIHBhZGRpbmcgKi8gCiAgICAgIGZvcihsb29wY291bnRlciA9IDBVOyAobG9vcGNvdW50ZXIgPCBoY3J5cC0+SW5pdC5IZWFkZXJTaXplKTsgbG9vcGNvdW50ZXIrPTRVKQogICAgICB7ICAgICAgCiAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CiAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsKICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOwogICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOwogICAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7CiAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CiAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsKICAgICAgICAKICAgICAgICAvKiBXYWl0IGZvciBJRkVNIHRvIGJlIHJhaXNlZCAqLwogICAgICAgIGlmKENSWVBfV2FpdE9uSUZFTUZsYWcoaGNyeXAsIFRpbWVvdXQpICE9IEhBTF9PSykgIAogICAgICAgIHsgCiAgICAgICAgICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgY2xvY2sgKi8KICAgICAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CiAgICAgICAgICAKICAgICAgICAgIC8qIENoYW5nZSBzdGF0ZSAqLwogICAgICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9USU1FT1VUOwogICAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7IAogICAgICAgICAgCiAgICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovICAgICAgICAgIAogICAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsgCiAgICAgICAgICByZXR1cm4gSEFMX0VSUk9SOwogICAgICAgIH0gICAgICAgICAgCiAgICAgIH0KICAgIH0KICAgIGVsc2UKICAgIHsgICAKICAgICAgLypXcml0ZSBoZWFkZXIgYmxvY2sgaW4gdGhlIElOIEZJRk8gd2l0aG91dCBsYXN0IGJsb2NrICovCiAgICAgIGZvcihsb29wY291bnRlciA9IDBVOyAobG9vcGNvdW50ZXIgPCAoKGhjcnlwLT5Jbml0LkhlYWRlclNpemUpLShoY3J5cC0+SW5pdC5IZWFkZXJTaXplICU0VSApKSk7IGxvb3Bjb3VudGVyKz0gNFUpCiAgICAgIHsgICAgCiAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CiAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsKICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOwogICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOwogICAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7IAogICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOwogICAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7CiAgICAgICAgCiAgICAgICAgLyogV2FpdCBmb3IgSUZFTSB0byBiZSByYWlzZWQgKi8KICAgICAgICBpZihDUllQX1dhaXRPbklGRU1GbGFnKGhjcnlwLCBUaW1lb3V0KSAhPSBIQUxfT0spICAKICAgICAgICB7IAogICAgICAgICAgLyogRGlzYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIGNsb2NrICovCiAgICAgICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwogICAgICAgICAgCiAgICAgICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KICAgICAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfVElNRU9VVDsKICAgICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOyAKICAgICAgICAgIAogICAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLyAgICAgICAgICAKICAgICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7IAogICAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgICAgICB9CiAgICAgIH0KICAgICAgLyogIExhc3QgYmxvY2sgb3B0aW9uYWxseSBwYWQgdGhlIGRhdGEgd2l0aCB6ZXJvcyovCiAgICAgIGZvcihsb29wY291bnRlciA9IDBVOyAobG9vcGNvdW50ZXIgPCAoaGNyeXAtPkluaXQuSGVhZGVyU2l6ZSAlNFUgKSk7IGxvb3Bjb3VudGVyKyspCiAgICAgIHsKICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOyAgICAKICAgICAgfQogICAgICB3aGlsZShsb29wY291bnRlciA8NFUgKQogICAgICB7IAogICAgICAgIC8qIHBhZCB0aGUgZGF0YSB3aXRoIHplcm9zIHRvIGhhdmUgYSBjb21wbGV0ZSBibG9jayAqLyAgICAgCiAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAweDBVOyAgICAgICAgIAogICAgICAgIGxvb3Bjb3VudGVyKys7CiAgICAgIH0KICAgICAgLyogV2FpdCBmb3IgQ0NGIElGRU0gdG8gYmUgcmFpc2VkICovCiAgICAgIGlmKENSWVBfV2FpdE9uSUZFTUZsYWcoaGNyeXAsIFRpbWVvdXQpICE9IEhBTF9PSykgIAogICAgICB7IAogICAgICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLwogICAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CiAgICAgICAgCiAgICAgICAgLyogQ2hhbmdlIHN0YXRlICovCiAgICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9USU1FT1VUOwogICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOyAgCiAgICAgICAgCiAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLyAgICAgICAgICAKICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOyAKICAgICAgICByZXR1cm4gSEFMX0VSUk9SOwogICAgICB9ICAgICAgICAgIAogICAgfSAgICAgCiAgICAvKiBXYWl0IHVudGlsIHRoZSBjb21wbGV0ZSBtZXNzYWdlIGhhcyBiZWVuIHByb2Nlc3NlZCAqLwogICAgaWYoQ1JZUF9XYWl0T25CVVNZRmxhZyhoY3J5cCwgVGltZW91dCkgIT0gSEFMX09LKSAgCiAgICB7IAogICAgICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgY2xvY2sgKi8KICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKICAgICAgCiAgICAgIC8qIENoYW5nZSBzdGF0ZSAqLwogICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7CiAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOyAgCiAgICAgIAogICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICYgcmV0dXJuIGVycm9yICovCiAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7ICAgICAgICAgIAogICAgICByZXR1cm4gSEFMX0VSUk9SOwogICAgfQogICAgCiNlbHNlIC8qIEFFUyAqLyAKICAgIAogICAgaWYoaGNyeXAtPkluaXQuQWxnb3JpdGhtID09IENSWVBfQUVTX0dDTV9HTUFDKQogICAgewogICAgICAvKiBXb3JrYXJvdW5kIDEgOm9ubHkgQUVTIGJlZm9yZSByZS1lbmFibGluZyB0aGUgSVAsIGRhdGF0eXBlIGNhbiBiZSBjb25maWd1cmVkLiovCiAgICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX0RBVEFUWVBFLCBoY3J5cC0+SW5pdC5EYXRhVHlwZSk7IAogICAgICAKICAgICAgLyogU2VsZWN0IGhlYWRlciBwaGFzZSAqLwogICAgICBDUllQX1NFVF9QSEFTRShoY3J5cCwgQ1JZUF9QSEFTRV9IRUFERVIpOwogICAgICAKICAgICAgLyogRW5hYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgKi8KICAgICAgX19IQUxfQ1JZUF9FTkFCTEUoaGNyeXApOwogICAgICAKICAgIH0KICAgIGlmICgoaGNyeXAtPkluaXQuSGVhZGVyU2l6ZSAlNFUgKT09IDBVKQogICAgeyAgICAgCiAgICAgIC8qIEhlYWRlclNpemUgJTQsIG5vIHBhZGRpbmcgKi8gCiAgICAgIGZvcihsb29wY291bnRlciA9IDBVOyAobG9vcGNvdW50ZXIgPCBoY3J5cC0+SW5pdC5IZWFkZXJTaXplKTsgbG9vcGNvdW50ZXIrPSA0VSkKICAgICAgeyAgICAgICAKICAgICAgICAvKiBXcml0ZSB0aGUgaW5wdXQgYmxvY2sgaW4gdGhlIGRhdGEgaW5wdXQgcmVnaXN0ZXIgKi8KICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CiAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsgIAogICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOyAgCiAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOyAgCiAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOwogICAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7ICAKICAgICAgICAKICAgICAgICBpZihDUllQX1dhaXRPbkNDRmxhZyhoY3J5cCwgVGltZW91dCkgIT0gSEFMX09LKSAgCiAgICAgICAgeyAKICAgICAgICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLwogICAgICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKICAgICAgICAgIAogICAgICAgICAgLyogQ2hhbmdlIHN0YXRlICovCiAgICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7CiAgICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsgIAogICAgICAgICAgCiAgICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovICAgICAgICAgIAogICAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsgCiAgICAgICAgICByZXR1cm4gSEFMX0VSUk9SOwogICAgICAgIH0KICAgICAgICAvKiBDbGVhciBDQ0YgZmxhZyAqLwogICAgICAgIF9fSEFMX0NSWVBfQ0xFQVJfRkxBRyhoY3J5cCwgQ1JZUF9DQ0ZfQ0xFQVIpOyAgICAgICAgIAogICAgICB9CiAgICB9CiAgICBlbHNlCiAgICB7ICAgCiAgICAgIC8qV3JpdGUgaGVhZGVyIGJsb2NrIGluIHRoZSBJTiBGSUZPIHdpdGhvdXQgbGFzdCBibG9jayAqLwogICAgICBmb3IobG9vcGNvdW50ZXIgPSAwVTsgKGxvb3Bjb3VudGVyIDwgKChoY3J5cC0+SW5pdC5IZWFkZXJTaXplKS0oaGNyeXAtPkluaXQuSGVhZGVyU2l6ZSAlNFUgKSkpOyBsb29wY291bnRlcis9NFUpCiAgICAgIHsKICAgICAgICAvKiBXcml0ZSB0aGUgaW5wdXQgYmxvY2sgaW4gdGhlIGRhdGEgaW5wdXQgcmVnaXN0ZXIgKi8KICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CiAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsgIAogICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOyAgCiAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOyAgCiAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOwogICAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7IAogICAgICAgIAogICAgICAgIGlmKENSWVBfV2FpdE9uQ0NGbGFnKGhjcnlwLCBUaW1lb3V0KSAhPSBIQUxfT0spICAKICAgICAgICB7IAogICAgICAgICAgLyogRGlzYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIGNsb2NrICovCiAgICAgICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwogICAgICAgICAgCiAgICAgICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KICAgICAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfVElNRU9VVDsKICAgICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOwogICAgICAgICAgCiAgICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovICAgICAgICAgIAogICAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsgCiAgICAgICAgICByZXR1cm4gSEFMX0VSUk9SOwogICAgICAgIH0KICAgICAgICAvKiBDbGVhciBDQ0YgZmxhZyAqLwogICAgICAgIF9fSEFMX0NSWVBfQ0xFQVJfRkxBRyhoY3J5cCwgQ1JZUF9DQ0ZfQ0xFQVIpOyAgICAKICAgICAgfQogICAgICAvKiAgTGFzdCBibG9jayBvcHRpb25hbGx5IHBhZCB0aGUgZGF0YSB3aXRoIHplcm9zKi8KICAgICAgZm9yKGxvb3Bjb3VudGVyID0gMFU7IChsb29wY291bnRlciA8IChoY3J5cC0+SW5pdC5IZWFkZXJTaXplICU0VSApKTsgbG9vcGNvdW50ZXIrKykKICAgICAgewogICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOyAgICAgICAKICAgICAgfQogICAgICB3aGlsZShsb29wY291bnRlciA8IDRVICkKICAgICAgeyAKICAgICAgICAvKlBhZCB0aGUgZGF0YSB3aXRoIHplcm9zIHRvIGhhdmUgYSBjb21wbGV0ZSBibG9jayAqLyAgICAgIAogICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9IDB4MFU7ICAgICAgICAgICAgICAKICAgICAgICBsb29wY291bnRlcisrOwogICAgICB9ICAgIAogICAgICAKICAgICAgaWYoQ1JZUF9XYWl0T25DQ0ZsYWcoaGNyeXAsIFRpbWVvdXQpICE9IEhBTF9PSykgIAogICAgICB7IAogICAgICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLwogICAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CiAgICAgICAgCiAgICAgICAgLyogQ2hhbmdlIHN0YXRlICovCiAgICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9USU1FT1VUOwogICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOyAKICAgICAgICAKICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovICAgICAgICAgIAogICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7IAogICAgICAgIHJldHVybiBIQUxfRVJST1I7CiAgICAgIH0KICAgICAgLyogQ2xlYXIgQ0NGIGZsYWcgKi8KICAgICAgX19IQUxfQ1JZUF9DTEVBUl9GTEFHKGhjcnlwLCBDUllQX0NDRl9DTEVBUik7ICAKICAgIH0gICAgICAKI2VuZGlmIC8qIEVuZCBBRVMgb3IgQ1JZUCAqLyAKICB9CiAgZWxzZQogIHsKI2lmIGRlZmluZWQoQUVTKSAKICAgIGlmKGhjcnlwLT5Jbml0LkFsZ29yaXRobSA9PSBDUllQX0FFU19HQ01fR01BQykKICAgIHsgCiAgICAgIC8qV29ya2Fyb3VuZCAxOiBvbmx5IEFFUywgYmVmb3JlIHJlLWVuYWJsaW5nIHRoZSBJUCwgZGF0YXR5cGUgY2FuIGJlIGNvbmZpZ3VyZWQuKi8KICAgICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfREFUQVRZUEUsIGhjcnlwLT5Jbml0LkRhdGFUeXBlKTsgCiAgICAgIAogICAgICAvKiBTZWxlY3QgaGVhZGVyIHBoYXNlICovCiAgICAgIENSWVBfU0VUX1BIQVNFKGhjcnlwLCBDUllQX1BIQVNFX0hFQURFUik7IAogICAgICAKICAgICAgLyogRW5hYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgKi8KICAgICAgX19IQUxfQ1JZUF9FTkFCTEUoaGNyeXApOwogICAgfQojZW5kaWYgLyogQUVTICovICAgICAKICB9CiAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLwogIHJldHVybiBIQUxfT0s7Cn0KCi8qKgogICogQGJyaWVmICBTZXRzIHRoZSBoZWFkZXIgcGhhc2Ugd2hlbiB1c2luZyBETUEgaW4gcHJvY2VzcwogICogQHBhcmFtICBoY3J5cDogcG9pbnRlciB0byBhIENSWVBfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucwogICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUoSGVhZGVyICYgSGVhZGVyU2l6ZSkgIAogICogQHJldHZhbCBOb25lCiAgKi8Kc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIENSWVBfR0NNQ0NNX1NldEhlYWRlclBoYXNlX0RNQShDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwKQp7CiAgX19JTyB1aW50MzJfdCBjb3VudCAgPSAwVTsKICB1aW50MzJfdCBsb29wY291bnRlcjsKICAKICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogSGVhZGVyIHBoYXNlIGZvciBHQ00vR01BQyBvciBDQ00gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAgCiAgaWYoKGhjcnlwLT5Jbml0LkhlYWRlclNpemUgIT0gMFUpKQogIHsKICAgIAojaWYgZGVmaW5lZChDUllQKSAgCiAgICAKICAgIC8qIFNlbGVjdCBoZWFkZXIgcGhhc2UgKi8KICAgIENSWVBfU0VUX1BIQVNFKGhjcnlwLCBDUllQX1BIQVNFX0hFQURFUik7IAogICAgCiAgICAvKiBFbmFibGUgdGhlIENSWVAgcGVyaXBoZXJhbCAqLwogICAgX19IQUxfQ1JZUF9FTkFCTEUoaGNyeXApOyAgICAKICAgIAogICAgaWYgKChoY3J5cC0+SW5pdC5IZWFkZXJTaXplICU0VSApPT0gMFUpCiAgICB7IAogICAgICAvKiBIZWFkZXJTaXplICU0LCBubyBwYWRkaW5nICovIAogICAgICBmb3IobG9vcGNvdW50ZXIgPSAwVTsgKGxvb3Bjb3VudGVyIDwgaGNyeXAtPkluaXQuSGVhZGVyU2l6ZSk7IGxvb3Bjb3VudGVyKz00VSkKICAgICAgeyAgICAgIAogICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOwogICAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7CiAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CiAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsKICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOwogICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOwogICAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7CiAgICAgICAgCiAgICAgICAgLyogV2FpdCBmb3IgSUZFTSB0byBiZSByYWlzZWQgKi8KICAgICAgICBjb3VudCA9IENSWVBfVElNRU9VVF9HQ01DQ01IRUFERVJQSEFTRTsKICAgICAgICBkbwogICAgICAgIHsKICAgICAgICAgIGNvdW50LS0gOwogICAgICAgICAgaWYoY291bnQgPT0gMFUpCiAgICAgICAgICB7CiAgICAgICAgICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLwogICAgICAgICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwogICAgICAgICAgICAKICAgICAgICAgICAgLyogQ2hhbmdlIHN0YXRlICovCiAgICAgICAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfVElNRU9VVDsKICAgICAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CiAgICAgICAgICAgIAogICAgICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovICAgICAgICAgIAogICAgICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOyAKICAgICAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgd2hpbGUoSEFMX0lTX0JJVF9DTFIoaGNyeXAtPkluc3RhbmNlLT5TUiwgQ1JZUF9GTEFHX0lGRU0pKTsgICAgICAgIAogICAgICB9CiAgICB9CiAgICBlbHNlCiAgICB7ICAgCiAgICAgIC8qV3JpdGUgaGVhZGVyIGJsb2NrIGluIHRoZSBJTiBGSUZPIHdpdGhvdXQgbGFzdCBibG9jayAqLwogICAgICBmb3IobG9vcGNvdW50ZXIgPSAwVTsgKGxvb3Bjb3VudGVyIDwgKChoY3J5cC0+SW5pdC5IZWFkZXJTaXplKS0oaGNyeXAtPkluaXQuSGVhZGVyU2l6ZSAlNFUgKSkpOyBsb29wY291bnRlcis9NFUpCiAgICAgIHsgICAgCiAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CiAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsKICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOwogICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOwogICAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7IAogICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOwogICAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7CiAgICAgICAgCiAgICAgICAgLyogV2FpdCBmb3IgSUZFTSB0byBiZSByYWlzZWQgKi8KICAgICAgICBjb3VudCA9IENSWVBfVElNRU9VVF9HQ01DQ01IRUFERVJQSEFTRTsKICAgICAgICBkbwogICAgICAgIHsKICAgICAgICAgIGNvdW50LS0gOwogICAgICAgICAgaWYoY291bnQgPT0gMFUpCiAgICAgICAgICB7CiAgICAgICAgICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLwogICAgICAgICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwogICAgICAgICAgICAKICAgICAgICAgICAgLyogQ2hhbmdlIHN0YXRlICovCiAgICAgICAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfVElNRU9VVDsKICAgICAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7ICAKICAgICAgICAgICAgCiAgICAgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8gICAgICAgICAgCiAgICAgICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7IAogICAgICAgICAgICByZXR1cm4gSEFMX0VSUk9SOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB3aGlsZShIQUxfSVNfQklUX0NMUihoY3J5cC0+SW5zdGFuY2UtPlNSLCBDUllQX0ZMQUdfSUZFTSkpOyAKICAgICAgfQogICAgICAvKiAgTGFzdCBibG9jayBvcHRpb25hbGx5IHBhZCB0aGUgZGF0YSB3aXRoIHplcm9zKi8KICAgICAgZm9yKGxvb3Bjb3VudGVyID0gMFU7IChsb29wY291bnRlciA8IChoY3J5cC0+SW5pdC5IZWFkZXJTaXplICU0VSApKTsgbG9vcGNvdW50ZXIrKykKICAgICAgewogICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOwogICAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7ICAgIAogICAgICB9CiAgICAgIHdoaWxlKGxvb3Bjb3VudGVyIDwgNFUgKQogICAgICB7IAogICAgICAgIC8qIFBhZCB0aGUgZGF0YSB3aXRoIHplcm9zIHRvIGhhdmUgYSBjb21wbGV0ZSBibG9jayAqLyAgICAgCiAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAweDBVOyAgICAgICAgIAogICAgICAgIGxvb3Bjb3VudGVyKys7CiAgICAgIH0KICAgICAgLyogV2FpdCBmb3IgSUZFTSB0byBiZSByYWlzZWQgKi8KICAgICAgY291bnQgPSBDUllQX1RJTUVPVVRfR0NNQ0NNSEVBREVSUEhBU0U7CiAgICAgIGRvCiAgICAgIHsKICAgICAgICBjb3VudC0tIDsKICAgICAgICBpZihjb3VudCA9PSAwVSkKICAgICAgICB7CiAgICAgICAgICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgY2xvY2sgKi8KICAgICAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CiAgICAgICAgICAKICAgICAgICAgIC8qIENoYW5nZSBzdGF0ZSAqLwogICAgICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9USU1FT1VUOwogICAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7IAogICAgICAgICAgCiAgICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovICAgICAgICAgIAogICAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsgCiAgICAgICAgICByZXR1cm4gSEFMX0VSUk9SOwogICAgICAgIH0KICAgICAgfQogICAgICB3aGlsZShIQUxfSVNfQklUX0NMUihoY3J5cC0+SW5zdGFuY2UtPlNSLCBDUllQX0ZMQUdfSUZFTSkpOyAgICAgICAgIAogICAgfSAgICAgCiAgICAvKiBXYWl0IHVudGlsIHRoZSBjb21wbGV0ZSBtZXNzYWdlIGhhcyBiZWVuIHByb2Nlc3NlZCAqLwogICAgY291bnQgPSBDUllQX1RJTUVPVVRfR0NNQ0NNSEVBREVSUEhBU0U7CiAgICBkbwogICAgewogICAgICBjb3VudC0tIDsKICAgICAgaWYoY291bnQgPT0gMFUpCiAgICAgIHsKICAgICAgICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgY2xvY2sgKi8KICAgICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwogICAgICAgIAogICAgICAgIC8qIENoYW5nZSBzdGF0ZSAqLwogICAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfVElNRU9VVDsKICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsgCiAgICAgICAgCiAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLyAgICAgICAgICAKICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOyAKICAgICAgICByZXR1cm4gSEFMX0VSUk9SOwogICAgICB9CiAgICB9CiAgICB3aGlsZShIQUxfSVNfQklUX1NFVChoY3J5cC0+SW5zdGFuY2UtPlNSLCBDUllQX0ZMQUdfQlVTWSkpOyAgICAgCiAgICAKI2Vsc2UgLyogQUVTICovIAogICAgCiAgICBpZihoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9BRVNfR0NNX0dNQUMpCiAgICB7CiAgICAgIC8qIFdvcmthcm91bmQgMTogb25seSBBRVMsIGJlZm9yZSByZS1lbmFibGluZyB0aGUgSVAsIGRhdGF0eXBlIGNhbiBiZSBjb25maWd1cmVkLiovCiAgICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX0RBVEFUWVBFLCBoY3J5cC0+SW5pdC5EYXRhVHlwZSk7IAogICAgICAKICAgICAgLyogU2VsZWN0IGhlYWRlciBwaGFzZSAqLwogICAgICBDUllQX1NFVF9QSEFTRShoY3J5cCwgQ1JZUF9QSEFTRV9IRUFERVIpOyAKICAgICAgCiAgICAgIC8qIEVuYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsICovCiAgICAgIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsKICAgIH0KICAgIGlmICgoaGNyeXAtPkluaXQuSGVhZGVyU2l6ZSAlNFUgKT09IDBVKQogICAgeyAgICAgCiAgICAgIC8qIEhlYWRlclNpemUgJTQsIG5vIHBhZGRpbmcgKi8gCiAgICAgIGZvcihsb29wY291bnRlciA9IDBVOyAobG9vcGNvdW50ZXIgPCBoY3J5cC0+SW5pdC5IZWFkZXJTaXplKTsgbG9vcGNvdW50ZXIrPTRVKQogICAgICB7ICAgICAgIAogICAgICAgIC8qIFdyaXRlIHRoZSBpbnB1dCBibG9jayBpbiB0aGUgZGF0YSBpbnB1dCByZWdpc3RlciAqLwogICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOyAgCiAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOwogICAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7ICAKICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOwogICAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7ICAKICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CiAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsgIAogICAgICAgIAogICAgICAgIC8qV2FpdCBvbiBDQ0YgZmxhZyovIAogICAgICAgIGNvdW50ID0gQ1JZUF9USU1FT1VUX0dDTUNDTUhFQURFUlBIQVNFOwogICAgICAgIGRvCiAgICAgICAgewogICAgICAgICAgY291bnQtLSA7CiAgICAgICAgICBpZihjb3VudCA9PSAwVSkKICAgICAgICAgIHsKICAgICAgICAgICAgLyogRGlzYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIGNsb2NrICovCiAgICAgICAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CiAgICAgICAgICAgIAogICAgICAgICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KICAgICAgICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9USU1FT1VUOwogICAgICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsgCiAgICAgICAgICAgIAogICAgICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovICAgICAgICAgIAogICAgICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOyAKICAgICAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgd2hpbGUoSEFMX0lTX0JJVF9DTFIoaGNyeXAtPkluc3RhbmNlLT5TUiwgQUVTX1NSX0NDRikpOwogICAgICAgIAogICAgICAgIC8qIENsZWFyIENDRiBmbGFnICovCiAgICAgICAgX19IQUxfQ1JZUF9DTEVBUl9GTEFHKGhjcnlwLCBDUllQX0NDRl9DTEVBUik7ICAgICAgICAgCiAgICAgIH0KICAgIH0KICAgIGVsc2UKICAgIHsgICAKICAgICAgLypXcml0ZSBoZWFkZXIgYmxvY2sgaW4gdGhlIElOIEZJRk8gd2l0aG91dCBsYXN0IGJsb2NrICovCiAgICAgIGZvcihsb29wY291bnRlciA9IDBVOyAobG9vcGNvdW50ZXIgPCAoKGhjcnlwLT5Jbml0LkhlYWRlclNpemUpLShoY3J5cC0+SW5pdC5IZWFkZXJTaXplICU0VSApKSk7IGxvb3Bjb3VudGVyKz00VSkKICAgICAgewogICAgICAgIC8qIFdyaXRlIHRoZSBJbnB1dCBibG9jayBpbiB0aGUgRGF0YSBJbnB1dCByZWdpc3RlciAqLwogICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOyAgCiAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOwogICAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7ICAKICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOwogICAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7ICAKICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CiAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsgCiAgICAgICAgCiAgICAgICAgLypXYWl0IG9uIENDRiBmbGFnKi8gCiAgICAgICAgY291bnQgPSBDUllQX1RJTUVPVVRfR0NNQ0NNSEVBREVSUEhBU0U7CiAgICAgICAgZG8KICAgICAgICB7CiAgICAgICAgICBjb3VudC0tIDsKICAgICAgICAgIGlmKGNvdW50ID09IDBVKQogICAgICAgICAgewogICAgICAgICAgICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgY2xvY2sgKi8KICAgICAgICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIC8qIENoYW5nZSBzdGF0ZSAqLwogICAgICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7CiAgICAgICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOyAKICAgICAgICAgICAgCiAgICAgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8gICAgICAgICAgCiAgICAgICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7IAogICAgICAgICAgICByZXR1cm4gSEFMX0VSUk9SOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB3aGlsZShIQUxfSVNfQklUX0NMUihoY3J5cC0+SW5zdGFuY2UtPlNSLCBBRVNfU1JfQ0NGKSk7CiAgICAgICAgCiAgICAgICAgLyogQ2xlYXIgQ0NGIGZsYWcgKi8KICAgICAgICBfX0hBTF9DUllQX0NMRUFSX0ZMQUcoaGNyeXAsIENSWVBfQ0NGX0NMRUFSKTsgICAgCiAgICAgIH0KICAgICAgLyogIExhc3QgYmxvY2sgb3B0aW9uYWxseSBwYWQgdGhlIGRhdGEgd2l0aCB6ZXJvcyovCiAgICAgIGZvcihsb29wY291bnRlciA9IDBVOyAobG9vcGNvdW50ZXIgPCAoaGNyeXAtPkluaXQuSGVhZGVyU2l6ZSAlNFUgKSk7IGxvb3Bjb3VudGVyKyspCiAgICAgIHsKICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CiAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsgICAgICAgCiAgICAgIH0KICAgICAgd2hpbGUobG9vcGNvdW50ZXIgPDRVICkKICAgICAgeyAKICAgICAgICAvKiBQYWQgdGhlIGRhdGEgd2l0aCB6ZXJvcyB0byBoYXZlIGEgY29tcGxldGUgYmxvY2sgKi8gICAgICAKICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAweDBVOyAgICAgICAgICAgICAgCiAgICAgICAgbG9vcGNvdW50ZXIrKzsKICAgICAgfSAgICAKICAgICAgCiAgICAgIC8qV2FpdCBvbiBDQ0YgZmxhZyovIAogICAgICBjb3VudCA9IENSWVBfVElNRU9VVF9HQ01DQ01IRUFERVJQSEFTRTsKICAgICAgZG8KICAgICAgewogICAgICAgIGNvdW50LS0gOwogICAgICAgIGlmKGNvdW50ID09IDBVKQogICAgICAgIHsKICAgICAgICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLwogICAgICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKICAgICAgICAgIAogICAgICAgICAgLyogQ2hhbmdlIHN0YXRlICovCiAgICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7CiAgICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKICAgICAgICAgIAogICAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLyAgICAgICAgICAKICAgICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7IAogICAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgICAgICB9CiAgICAgIH0KICAgICAgd2hpbGUoSEFMX0lTX0JJVF9DTFIoaGNyeXAtPkluc3RhbmNlLT5TUiwgQUVTX1NSX0NDRikpOwogICAgICAKICAgICAgLyogQ2xlYXIgQ0NGIGZsYWcgKi8KICAgICAgX19IQUxfQ1JZUF9DTEVBUl9GTEFHKGhjcnlwLCBDUllQX0NDRl9DTEVBUik7ICAKICAgIH0gICAgICAKI2VuZGlmIC8qIEVuZCBBRVMgb3IgQ1JZUCAgKi8gCiAgfQogIGVsc2UKICB7CiNpZiBkZWZpbmVkKEFFUykgCiAgICBpZihoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9BRVNfR0NNX0dNQUMpCiAgICB7IAogICAgICAvKldvcmthcm91bmQgMTogb25seSBBRVMsIGJlZm9yZSByZS1lbmFibGluZyB0aGUgSVAsIGRhdGF0eXBlIGNhbiBiZSBjb25maWd1cmVkLiovCiAgICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX0RBVEFUWVBFLCBoY3J5cC0+SW5pdC5EYXRhVHlwZSk7IAogICAgICAKICAgICAgLyogU2VsZWN0IGhlYWRlciBwaGFzZSAqLwogICAgICBDUllQX1NFVF9QSEFTRShoY3J5cCwgQ1JZUF9QSEFTRV9IRUFERVIpOyAKICAgICAgCiAgICAgIC8qIEVuYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsICovCiAgICAgIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsKICAgIH0KI2VuZGlmIC8qIEFFUyAqLyAgICAgCiAgfQogIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KICByZXR1cm4gSEFMX09LOwp9CgovKioKICAqIEBicmllZiAgU2V0cyB0aGUgaGVhZGVyIHBoYXNlIGluIGludGVycnVwdCBtb2RlCiAgKiBAcGFyYW0gIGhjcnlwOiBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCiAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZShIZWFkZXIgJiBIZWFkZXJTaXplKQogICogQHJldHZhbCBOb25lCiAgKi8Kc3RhdGljIHZvaWQgQ1JZUF9HQ01DQ01fU2V0SGVhZGVyUGhhc2VfSVQoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCkKewogIHVpbnQzMl90IGxvb3Bjb3VudGVyOwojaWYgZGVmaW5lZChBRVMpIAogIHVpbnQzMl90IGxhc3R3b3Jkc2l6ZTsgCiAgdWludDMyX3QgbnBibGI7CQojZW5kaWYgCiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIEhlYWRlciBwaGFzZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgCiNpZiBkZWZpbmVkKENSWVApICAKICBpZihoY3J5cC0+SW5pdC5IZWFkZXJTaXplID09ICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KQogIHsgICAgIAogICAgLyogRGlzYWJsZSBpbnRlcnJ1cHRzICovCiAgICBfX0hBTF9DUllQX0RJU0FCTEVfSVQoaGNyeXAsIENSWVBfSVRfSU5JICk7CiAgICAKICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCAqLwogICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKICAgIAogICAgLyogU2V0IHRoZSBwaGFzZSAqLwogICAgaGNyeXAtPlBoYXNlID0gQ1JZUF9QSEFTRV9QUk9DRVNTOwogICAgCiAgICAvKiBTZWxlY3QgcGF5bG9hZCBwaGFzZSBvbmNlIHRoZSBoZWFkZXIgcGhhc2UgaXMgcGVyZm9ybWVkICovCiAgICBDUllQX1NFVF9QSEFTRShoY3J5cCwgQ1JZUF9QSEFTRV9QQVlMT0FEKTsgCiAgICAKICAgIC8qIEVuYWJsZSBJbnRlcnJ1cHRzICovCiAgICBfX0hBTF9DUllQX0VOQUJMRV9JVChoY3J5cCwgQ1JZUF9JVF9JTkkgfCBDUllQX0lUX09VVEkgKTsKICAgIAogICAgLyogRW5hYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgKi8KICAgIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsgIAogIH0gICAgCiAgZWxzZSBpZiAoKChoY3J5cC0+SW5pdC5IZWFkZXJTaXplKSAtIChoY3J5cC0+Q3J5cEhlYWRlckNvdW50KSkgPj0gNFUpCiAgICAKICB7IC8qIEhlYWRlclNpemUgJTQsIG5vIHBhZGRpbmcgKi8gICAgIAogICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCApOwogICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsgICAgICAgCiAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyAgOyAgICAgICAKICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOwogICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsKICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOwogICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsgICAgICAgICAgIAogIH0KICBlbHNlCiAgeyAgICAgIAogICAgLyogIExhc3QgYmxvY2sgb3B0aW9uYWxseSBwYWQgdGhlIGRhdGEgd2l0aCB6ZXJvcyovCiAgICBmb3IobG9vcGNvdW50ZXIgPSAwVTsgbG9vcGNvdW50ZXIgPCAoaGNyeXAtPkluaXQuSGVhZGVyU2l6ZSAlNFUgKTsgbG9vcGNvdW50ZXIrKykKICAgIHsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuSGVhZGVyKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsgICAgCiAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7CiAgICB9CiAgICB3aGlsZShsb29wY291bnRlciA8NFUgKQogICAgeyAKICAgICAgLyogUGFkIHRoZSBkYXRhIHdpdGggemVyb3MgdG8gaGF2ZSBhIGNvbXBsZXRlIGJsb2NrICovICAgICAKICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAweDBVOyAgICAgICAgIAogICAgICBsb29wY291bnRlcisrOwogICAgfSAgICAgICAgIAogIH0gICAgICAgICAgCiNlbHNlIC8qIEFFUyAqLyAgCiAgCiAgaWYoaGNyeXAtPkluaXQuSGVhZGVyU2l6ZSA9PSAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCkKICB7CiAgICAvKiBTZXQgdGhlIHBoYXNlICovCiAgICBoY3J5cC0+UGhhc2UgPSBDUllQX1BIQVNFX1BST0NFU1M7CiAgICAKICAgIC8qICBQYXlsb2FkIHBoYXNlIG5vdCBzdXBwb3J0ZWQgaW4gQ0NNIEFFUzIgICovCiAgICBpZihoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9BRVNfR0NNX0dNQUMpCiAgICB7CiAgICAgIC8qIFNlbGVjdCBwYXlsb2FkIHBoYXNlIG9uY2UgdGhlIGhlYWRlciBwaGFzZSBpcyBwZXJmb3JtZWQgKi8KICAgICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfR0NNUEgsIENSWVBfUEhBU0VfUEFZTE9BRCk7CiAgICB9ICAgIAogICAgaWYoaGNyeXAtPkluaXQuQWxnb3JpdGhtID09IENSWVBfQUVTX0NDTSkKICAgIHsKICAgICAgLyogSW5jcmVtZW50IENyeXBIZWFkZXJDb3VudCB0byBwYXNzIGluIENSWVBfR0NNQ0NNX1NldFBheWxvYWRQaGFzZV9JVCAqLwogICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50Kys7ICAgIAogICAgfSAgICAgICAgICAgIAogICAgLyogV3JpdGUgdGhlIHBheWxvYWQgSW5wdXQgYmxvY2sgaW4gdGhlIElOIEZJRk8gKi8gCiAgICBpZihoY3J5cC0+U2l6ZSA9PSAwVSkKICAgIHsgICAgIAogICAgICAvKiBEaXNhYmxlIGludGVycnVwdHMgKi8KICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFX0lUKGhjcnlwLCBDUllQX0lUX0NDRklFfCBDUllQX0lUX0VSUklFKTsKICAgICAgCiAgICAgIC8qIENoYW5nZSB0aGUgQ1JZUCBzdGF0ZSAqLwogICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKICAgICAgCiAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKICAgIH0gICAgICAgICAgICAKICAgIGVsc2UgaWYgKGhjcnlwLT5TaXplID49IDE2VSkKICAgIHsgICAgICAgCiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCApOwogICAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50ICk7CiAgICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOyAgIAogICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQgKTsKICAgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCApOwogICAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKICAgICAgCiAgICAgIGlmKChoY3J5cC0+Q3J5cEluQ291bnQgPT0gIChoY3J5cC0+U2l6ZS80VSkpICYmKChoY3J5cC0+U2l6ZSAlMTZVICk9PSAwVSkpICAgICAgIAogICAgICB7ICAgIAogICAgICAgIC8qIENhbGwgdGhlIGlucHV0IGRhdGEgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpIAogICAgICAgIC8qQ2FsbCByZWdpc3RlcmVkIElucHV0IGNvbXBsZXRlIGNhbGxiYWNrKi8KICAgICAgICBoY3J5cC0+SW5DcGx0Q2FsbGJhY2soaGNyeXApOwojZWxzZQogICAgICAgIC8qQ2FsbCBsZWdhY3kgd2VhayBJbnB1dCBjb21wbGV0ZSBjYWxsYmFjayovCiAgICAgICAgSEFMX0NSWVBfSW5DcGx0Q2FsbGJhY2soaGNyeXApOwojZW5kaWYgLyogVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyAqLwogICAgICB9IAogICAgfQogICAgZWxzZSAvKiBTaXplIDwgNCB3b3JkcyAgOiBmaXJzdCBibG9jayBpcyB0aGUgbGFzdCBibG9jayovCiAgICB7CiAgICAgIC8qIFdvcmthcm91bmQgbm90IGltcGxlbWVudGVkLCBTaXplIHNob3VsZCBiZSAlNCAgb3RoZXJ3aXNlIFRhZyB3aWxsICBiZSBpbmNvcnJlY3RseQogICAgICBnZW5lcmF0ZWQgZm9yIEdDTSBFbmNyeXB0aW9uLiBXb3JrYXJvdW5kIGlzIGltcGxlbWVudGVkIGluIHBvbGxpbmcgbW9kZSwgc28gaWYgbGFzdCBibG9jayBvZiAKICAgICAgcGF5bG9hZCA8MTI4Yml0IGRvbid0IHVzZSBDUllQX0VuY3J5cHRfSVQgb3RoZXJ3aXNlIFRBRyBpcyBpbmNvcnJlY3RseSBnZW5lcmF0ZWQgZm9yIEdDTSBFbmNyeXB0aW9uLiAqLwogICAgICAKICAgICAgLyogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIHBhZGRpbmcgYnl0ZXMgaW4gbGFzdCBibG9jayBvZiBwYXlsb2FkICovCiAgICAgIG5wYmxiID0gKCgoKHVpbnQzMl90KShoY3J5cC0+U2l6ZSkvMTZVKSsxVSkqMTZVKSAtICh1aW50MzJfdCkoaGNyeXAtPlNpemUpOwogICAgICAKICAgICAgLyogTnVtYmVyIG9mIHZhbGlkIHdvcmRzIChsYXN0d29yZHNpemUpIGluIGxhc3QgYmxvY2sgKi8KICAgICAgaWYgKChucGJsYiAlIDRVKSA9PTBVKSAKICAgICAgeyAKICAgICAgICBsYXN0d29yZHNpemUgPSAoMTZVLW5wYmxiKS80VTsJCQogICAgICB9CiAgICAgIGVsc2UgCiAgICAgIHsKICAgICAgICBsYXN0d29yZHNpemUgPSAoKDE2VS1ucGJsYikvNFUpICsxVTsKICAgICAgfQkKICAgICAgCiAgICAgIC8qICBMYXN0IGJsb2NrIG9wdGlvbmFsbHkgcGFkIHRoZSBkYXRhIHdpdGggemVyb3MqLwogICAgICBmb3IobG9vcGNvdW50ZXIgPSAwVTsgbG9vcGNvdW50ZXIgPCBsYXN0d29yZHNpemU7IGxvb3Bjb3VudGVyKyspCiAgICAgIHsKICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCApOwogICAgICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOwogICAgICB9CiAgICAgIHdoaWxlKGxvb3Bjb3VudGVyIDw0VSApCiAgICAgIHsgCiAgICAgICAgLyogUGFkIHRoZSBkYXRhIHdpdGggemVyb3MgdG8gaGF2ZSBhIGNvbXBsZXRlIGJsb2NrICovICAgICAKICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAweDBVOyAgICAgICAgIAogICAgICAgIGxvb3Bjb3VudGVyKys7CiAgICAgIH0KICAgIH0KICB9ICAKICBlbHNlIGlmICgoKGhjcnlwLT5Jbml0LkhlYWRlclNpemUpIC0gKGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpKSA+PSA0VSkKICB7IAogICAgLyogV3JpdGUgdGhlIGlucHV0IGJsb2NrIGluIHRoZSBJTiBGSUZPICovCiAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50ICk7CiAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50Kys7CiAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50ICk7CiAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50Kys7ICAgCiAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50ICk7CiAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50Kys7CiAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50ICk7CiAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50Kys7ICAgICAgICAgCiAgfQogIGVsc2UgLypIZWFkZXJTaXplIDwgNCBvciBIZWFkZXJTaXplID40ICYgSGVhZGVyU2l6ZSAlNCAhPSAwKi8KICB7IAogICAgLyogIExhc3QgYmxvY2sgb3B0aW9uYWxseSBwYWQgdGhlIGRhdGEgd2l0aCB6ZXJvcyovCiAgICBmb3IobG9vcGNvdW50ZXIgPSAwVTsgbG9vcGNvdW50ZXIgPCAoaGNyeXAtPkluaXQuSGVhZGVyU2l6ZSAlNFUgKTsgbG9vcGNvdW50ZXIrKykKICAgIHsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOyAgIAogICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOwogICAgfQogICAgd2hpbGUobG9vcGNvdW50ZXIgPDRVICkKICAgIHsgCiAgICAgIC8qIHBhZCB0aGUgZGF0YSB3aXRoIHplcm9zIHRvIGhhdmUgYSBjb21wbGV0ZSBibG9jayAqLyAgICAgCiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9IDB4MFU7ICAgICAgICAgCiAgICAgIGxvb3Bjb3VudGVyKys7CiAgICB9CiAgfSAgICAgIAojZW5kaWYgLyogRW5kIEFFUyBvciBDUllQICovIAp9ICAgICAgICAgICAKCgovKioKICAqIEBicmllZiAgV29ya2Fyb3VuZCB1c2VkIGZvciBHQ00vQ0NNIG1vZGUuIAogICogQHBhcmFtICBoY3J5cDogcG9pbnRlciB0byBhIENSWVBfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucwogICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUKICAqIEBwYXJhbSAgVGltZW91dDogc3BlY2lmeSBUaW1lb3V0IHZhbHVlIAogICogQHJldHZhbCBOb25lCiAgKi8Kc3RhdGljIHZvaWQgQ1JZUF9Xb3JrYXJvdW5kKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQzMl90IFRpbWVvdXQgKQp7CiAgdWludDMyX3QgbGFzdHdvcmRzaXplOwogIHVpbnQzMl90IG5wYmxiOwkgIAojaWYgZGVmaW5lZChDUllQKSAKICB1aW50MzJfdCAgaXYxdGVtcDsKICB1aW50MzJfdCAgdGVtcFs0XSA9IHswfTsKICB1aW50MzJfdCAgdGVtcDJbNF09IHswfTsKI2VuZGlmIC8qIENSWVAgKi8KICB1aW50MzJfdCBpbnRlcm1lZGlhdGVfZGF0YVs0XT17MH07CiAgdWludDMyX3QgaW5kZXg7CiAgCiAgLyogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIHBhZGRpbmcgYnl0ZXMgaW4gbGFzdCBibG9jayBvZiBwYXlsb2FkICovIAogIG5wYmxiID0gKCgoKHVpbnQzMl90KShoY3J5cC0+U2l6ZSkvMTZVKSsxVSkqMTZVKS0gKHVpbnQzMl90KShoY3J5cC0+U2l6ZSk7CiAgCiAgLyogTnVtYmVyIG9mIHZhbGlkIHdvcmRzIChsYXN0d29yZHNpemUpIGluIGxhc3QgYmxvY2sgKi8KICBpZiAoKG5wYmxiJTRVKSA9PTBVKSAKICB7IGxhc3R3b3Jkc2l6ZSA9ICgxNlUtbnBibGIpLzRVOwkJCiAgfQogIGVsc2UgCiAge2xhc3R3b3Jkc2l6ZSA9ICgoMTZVLW5wYmxiKS80VSkgKzFVOwogIH0KICAKI2lmIGRlZmluZWQoQ1JZUCkgICAgCQogIAogIC8qIFdvcmthcm91bmQgMiwgY2FzZSBHQ00gZW5jcnlwdGlvbiAqLwogIGlmIChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9BRVNfR0NNKQogIHsKICAgIGlmKChoY3J5cC0+SW5zdGFuY2UtPkNSICYgQ1JZUF9DUl9BTEdPRElSKSA9PSBDUllQX09QRVJBVElOR01PREVfRU5DUllQVCkKICAgIHsvKldvcmthcm91bmQgaW4gb3JkZXIgdG8gcHJvcGVybHkgY29tcHV0ZSBhdXRoZW50aWNhdGlvbiB0YWdzIHdoaWxlIGRvaW5nCiAgICAgIGEgR0NNIGVuY3J5cHRpb24gd2l0aCB0aGUgbGFzdCBibG9jayBvZiBwYXlsb2FkIHNpemUgaW5mZXJpb3IgdG8gMTI4IGJpdHMqLwogICAgICAvKiBEaXNhYmxlIENSWVAgdG8gc3RhcnQgdGhlIGZpbmFsIHBoYXNlICovCiAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CiAgICAgIAogICAgICAvKkxvYWQgQ1JZUF9JVjFSIHJlZ2lzdGVyIGNvbnRlbnQgaW4gYSB0ZW1wb3JhcnkgdmFyaWFibGUuIERlY3JlbWVudCB0aGUgdmFsdWUKICAgICAgYnkgMSBhbmQgcmVpbnNlcnQgdGhlIHJlc3VsdCBpbiBDUllQX0lWMVIgcmVnaXN0ZXIqLwogICAgICBoY3J5cC0+SW5zdGFuY2UtPklWMVJSID0gMHg1VTsKICAgICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBDUllQX0NSX0FMR09NT0RFLCBDUllQX0FFU19DVFIpOyAKICAgICAgCiAgICAgIC8qIEVuYWJsZSBDUllQIHRvIHN0YXJ0IHRoZSBmaW5hbCBwaGFzZSAqLwogICAgICBfX0hBTF9DUllQX0VOQUJMRShoY3J5cCk7CiAgICB9CiAgICAvKiAgTGFzdCBibG9jayBvcHRpb25hbGx5IHBhZCB0aGUgZGF0YSB3aXRoIHplcm9zKi8gICAgCiAgICBmb3IoaW5kZXg9MDsgaW5kZXggPCBsYXN0d29yZHNpemU7IGluZGV4ICsrKSAgICAgICAgCiAgICB7CiAgICAgIC8qIFdyaXRlIHRoZSBsYXN0IGlucHV0IGJsb2NrIGluIHRoZSBJTiBGSUZPICovCiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50ICk7CiAgICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOwogICAgfSAgICAKICAgIHdoaWxlKGluZGV4IDwgNFUpCiAgICB7CiAgICAgIC8qIFBhZCB0aGUgZGF0YSB3aXRoIHplcm9zIHRvIGhhdmUgYSBjb21wbGV0ZSBibG9jayAqLwogICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiAgPSAwVTsKICAgICAgaW5kZXgrKzsgCiAgICB9ICAgCiAgICAvKiBXYWl0IGZvciBPRk5FIGZsYWcgdG8gYmUgcmFpc2VkICovCiAgICBpZihDUllQX1dhaXRPbk9GTkVGbGFnKGhjcnlwLCBUaW1lb3V0KSAhPSBIQUxfT0spICAKICAgIHsgCiAgICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLwogICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwogICAgICAKICAgICAgLyogQ2hhbmdlIHN0YXRlICovCiAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfVElNRU9VVDsKICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7ICAKICAgICAgCiAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8gICAgICAgICAgCiAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7IAojaWYgKFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkgCiAgICAgIC8qQ2FsbCByZWdpc3RlcmVkIGVycm9yIGNhbGxiYWNrKi8KICAgICAgaGNyeXAtPkVycm9yQ2FsbGJhY2soaGNyeXApOwojZWxzZQogICAgICAvKkNhbGwgbGVnYWN5IHdlYWsgZXJyb3IgY2FsbGJhY2sqLwogICAgICBIQUxfQ1JZUF9FcnJvckNhbGxiYWNrKGhjcnlwKTsKI2VuZGlmIC8qIFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8gCiAgICB9ICAgIAogICAgaWYoKGhjcnlwLT5JbnN0YW5jZS0+U1IgJiBDUllQX0ZMQUdfT0ZORSApICE9IDB4MFUpCiAgICB7CiAgICAgIGZvcihpbmRleD0wVTsgaW5kZXg8IDRVO2luZGV4KyspICAgICAgICAKICAgICAgeyAKICAgICAgICAvKiBSZWFkIHRoZSBvdXRwdXQgYmxvY2sgZnJvbSB0aGUgb3V0cHV0IEZJRk8gKi8KICAgICAgICBpbnRlcm1lZGlhdGVfZGF0YVtpbmRleF0gPSBoY3J5cC0+SW5zdGFuY2UtPkRPVVQ7IAogICAgICAgIAogICAgICAgIC8qIEludGVybWVkaWF0ZSBkYXRhIGJ1ZmZlciB0byBiZSB1c2VkIGluIGZvciB0aGUgd29ya2Fyb3VuZCovCiAgICAgICAgKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBPdXRCdWZmUHRyICsgKGhjcnlwLT5DcnlwT3V0Q291bnQpKT1pbnRlcm1lZGlhdGVfZGF0YVtpbmRleF07CiAgICAgICAgaGNyeXAtPkNyeXBPdXRDb3VudCsrOyAgIAogICAgICB9ICAgICAKICAgIH0gIAogICAgCiAgICBpZigoaGNyeXAtPkluc3RhbmNlLT5DUiAmIENSWVBfQ1JfQUxHT0RJUikgPT0gQ1JZUF9PUEVSQVRJTkdNT0RFX0VOQ1JZUFQpCiAgICB7CiAgICAgIC8qd29ya2Fyb3VuZCBpbiBvcmRlciB0byBwcm9wZXJseSBjb21wdXRlIGF1dGhlbnRpY2F0aW9uIHRhZ3Mgd2hpbGUgZG9pbmcKICAgICAgYSBHQ00gZW5jcnlwdGlvbiB3aXRoIHRoZSBsYXN0IGJsb2NrIG9mIHBheWxvYWQgc2l6ZSBpbmZlcmlvciB0byAxMjggYml0cyovCiAgICAgIC8qIENoYW5nZSB0aGUgQUVTIG1vZGUgdG8gR0NNIG1vZGUgYW5kIFNlbGVjdCBGaW5hbCBwaGFzZSAqLwogICAgICAvKiBjb25maWd1cmVkICBDSE1PRCBHQ00gICAqLwogICAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIENSWVBfQ1JfQUxHT01PREUsIENSWVBfQUVTX0dDTSk7IAogICAgICAKICAgICAgLyogY29uZmlndXJlZCAgZmluYWwgcGhhc2UgICovCiAgICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQ1JZUF9DUl9HQ01fQ0NNUEgsIENSWVBfUEhBU0VfRklOQUwpOyAKICAgICAgCiAgICAgIGZvciAoaW5kZXg9MFU7IGluZGV4IDwgbGFzdHdvcmRzaXplOyBpbmRleCArKykKICAgICAgewogICAgICAgIC8qV3JpdGUgdGhlIGludGVybWVkaWF0ZV9kYXRhIGluIHRoZSBJTiBGSUZPICovCiAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU49aW50ZXJtZWRpYXRlX2RhdGFbaW5kZXhdOwogICAgICB9ICAgIAogICAgICB3aGlsZShpbmRleCA8IDRVKSAgICAgICAgICAKICAgICAgewogICAgICAgIC8qIFBhZCB0aGUgZGF0YSB3aXRoIHplcm9zIHRvIGhhdmUgYSBjb21wbGV0ZSBibG9jayAqLwogICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOICA9IDB4MFU7CiAgICAgICAgaW5kZXgrKzsgCiAgICAgIH0gICAgICAKICAgICAgLyogV2FpdCBmb3IgT0ZORSBmbGFnIHRvIGJlIHJhaXNlZCAqLwogICAgICBpZihDUllQX1dhaXRPbk9GTkVGbGFnKGhjcnlwLCBUaW1lb3V0KSAhPSBIQUxfT0spICAKICAgICAgeyAKICAgICAgICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgY2xvY2sgKi8KICAgICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwogICAgICAgIAogICAgICAgIC8qIENoYW5nZSBzdGF0ZSAqLwogICAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfVElNRU9VVDsKICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKICAgICAgICAKICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovICAgICAgICAgIAogICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7IAojaWYgKFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkgCiAgICAgIC8qQ2FsbCByZWdpc3RlcmVkIGVycm9yIGNhbGxiYWNrKi8KICAgICAgaGNyeXAtPkVycm9yQ2FsbGJhY2soaGNyeXApOwojZWxzZQogICAgICAvKkNhbGwgbGVnYWN5IHdlYWsgZXJyb3IgY2FsbGJhY2sqLwogICAgICBIQUxfQ1JZUF9FcnJvckNhbGxiYWNrKGhjcnlwKTsKI2VuZGlmIC8qIFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8gCiAgICAgIH0gCiAgICAgIAogICAgICBpZigoaGNyeXAtPkluc3RhbmNlLT5TUiAmIENSWVBfRkxBR19PRk5FICkgIT0gMHgwVSkgCiAgICAgIHsgIAogICAgICAgIGZvciggaW5kZXg9MFU7IGluZGV4PCA0VTtpbmRleCsrKQogICAgICAgIHsgCiAgICAgICAgICBpbnRlcm1lZGlhdGVfZGF0YVtpbmRleF09aGNyeXAtPkluc3RhbmNlLT5ET1VUOwogICAgICAgIH0gICAgCiAgICAgIH0KICAgIH0KICB9IC8qIEVuZCBvZiBHQ00gZW5jcnlwdGlvbiAqLwogIGVsc2V7ICAgIC8qIFdvcmthcm91bmQgMiwgY2FzZSBDQ00gZGVjcnlwdGlvbiwgaW4gb3JkZXIgdG8gcHJvcGVybHkgY29tcHV0ZQogICAgYXV0aGVudGljYXRpb24gdGFncyB3aGlsZSBkb2luZyBhIENDTSBkZWNyeXB0aW9uIHdpdGggdGhlIGxhc3QgYmxvY2sKICAgIG9mIHBheWxvYWQgc2l6ZSBpbmZlcmlvciB0byAxMjggYml0cyovCiAgICAKICAgIGlmKChoY3J5cC0+SW5zdGFuY2UtPkNSICYgQ1JZUF9DUl9BTEdPRElSKSA9PSBDUllQX09QRVJBVElOR01PREVfREVDUllQVCkgICAgICAKICAgIHsKICAgICAgaXYxdGVtcCA9IGhjcnlwLT5JbnN0YW5jZS0+Q1NHQ01DQ003UjsgCiAgICAgIAogICAgICAvKiBEaXNhYmxlIENSWVAgdG8gc3RhcnQgdGhlIGZpbmFsIHBoYXNlICovCiAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CiAgICAgIAogICAgICB0ZW1wWzBdPSAgaGNyeXAtPkluc3RhbmNlLT5DU0dDTUNDTTBSOwogICAgICB0ZW1wWzFdPSAgaGNyeXAtPkluc3RhbmNlLT5DU0dDTUNDTTFSOwogICAgICB0ZW1wWzJdPSAgaGNyeXAtPkluc3RhbmNlLT5DU0dDTUNDTTJSOwogICAgICB0ZW1wWzNdPSAgaGNyeXAtPkluc3RhbmNlLT5DU0dDTUNDTTNSOwogICAgICAKICAgICAgaGNyeXAtPkluc3RhbmNlLT5JVjFSUj0gaXYxdGVtcDsKICAgICAgCiAgICAgIC8qIENvbmZpZ3VyZWQgIENITU9EIENUUiAgICovCiAgICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQ1JZUF9DUl9BTEdPTU9ERSwgQ1JZUF9BRVNfQ1RSKTsgICAgCiAgICAgIAogICAgICAvKiBFbmFibGUgQ1JZUCB0byBzdGFydCB0aGUgZmluYWwgcGhhc2UgKi8KICAgICAgX19IQUxfQ1JZUF9FTkFCTEUoaGNyeXApOwogICAgfQogICAgLyogIExhc3QgYmxvY2sgb3B0aW9uYWxseSBwYWQgdGhlIGRhdGEgd2l0aCB6ZXJvcyovIAogICAgZm9yKGluZGV4PTA7IGluZGV4IDwgbGFzdHdvcmRzaXplOyBpbmRleCArKykgICAgICAgIAogICAgewogICAgICAvKiBXcml0ZSB0aGUgbGFzdCBJbnB1dCBibG9jayBpbiB0aGUgSU4gRklGTyAqLwogICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCApOwogICAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKICAgIH0gICAgCiAgICB3aGlsZShpbmRleCA8IDRVKQogICAgewogICAgICAvKiBQYWQgdGhlIGRhdGEgd2l0aCB6ZXJvcyB0byBoYXZlIGEgY29tcGxldGUgYmxvY2sgKi8KICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gID0gMFU7CiAgICAgIGluZGV4Kys7IAogICAgfQogICAgLyogV2FpdCBmb3IgT0ZORSBmbGFnIHRvIGJlIHJhaXNlZCAqLwogICAgaWYoQ1JZUF9XYWl0T25PRk5FRmxhZyhoY3J5cCwgVGltZW91dCkgIT0gSEFMX09LKSAgCiAgICB7IAogICAgICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgY2xvY2sgKi8KICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKICAgICAgCiAgICAgIC8qIENoYW5nZSBzdGF0ZSAqLwogICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7CiAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOyAKICAgICAgCiAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8gICAgICAgICAgCiAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7IAojaWYgKFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpIAogICAgICAvKkNhbGwgcmVnaXN0ZXJlZCBlcnJvciBjYWxsYmFjayovCiAgICAgIGhjcnlwLT5FcnJvckNhbGxiYWNrKGhjcnlwKTsKI2Vsc2UKICAgICAgLypDYWxsIGxlZ2FjeSB3ZWFrIGVycm9yIGNhbGxiYWNrKi8KICAgICAgSEFMX0NSWVBfRXJyb3JDYWxsYmFjayhoY3J5cCk7CiNlbmRpZiAvKiBVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTICovIAogICAgfSAgICAKICAgIAogICAgaWYoKGhjcnlwLT5JbnN0YW5jZS0+U1IgJiBDUllQX0ZMQUdfT0ZORSApICE9IDB4MFUpCiAgICB7CiAgICAgIGZvcihpbmRleD0wVTsgaW5kZXg8IDRVO2luZGV4KyspICAgICAgICAKICAgICAgeyAgCiAgICAgICAgLyogUmVhZCB0aGUgT3V0cHV0IGJsb2NrIGZyb20gdGhlIE91dHB1dCBGSUZPICovCiAgICAgICAgaW50ZXJtZWRpYXRlX2RhdGFbaW5kZXhdID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUOyAKICAgICAgICAKICAgICAgICAvKmludGVybWVkaWF0ZSBkYXRhIGJ1ZmZlciB0byBiZSB1c2VkIGluIGZvciB0aGUgd29ya2Fyb3VuZCovCiAgICAgICAgKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBPdXRCdWZmUHRyICsgKGhjcnlwLT5DcnlwT3V0Q291bnQpKT1pbnRlcm1lZGlhdGVfZGF0YVtpbmRleF07CiAgICAgICAgaGNyeXAtPkNyeXBPdXRDb3VudCsrOyAgIAogICAgICB9ICAgICAKICAgIH0gCiAgICAKICAgIGlmKChoY3J5cC0+SW5zdGFuY2UtPkNSICYgQ1JZUF9DUl9BTEdPRElSKSA9PSBDUllQX09QRVJBVElOR01PREVfREVDUllQVCkgICAgICAKICAgIHsgICAgIAogICAgICB0ZW1wMlswXT0gIGhjcnlwLT5JbnN0YW5jZS0+Q1NHQ01DQ00wUjsKICAgICAgdGVtcDJbMV09ICBoY3J5cC0+SW5zdGFuY2UtPkNTR0NNQ0NNMVI7CiAgICAgIHRlbXAyWzJdPSAgaGNyeXAtPkluc3RhbmNlLT5DU0dDTUNDTTJSOwogICAgICB0ZW1wMlszXT0gIGhjcnlwLT5JbnN0YW5jZS0+Q1NHQ01DQ00zUjsKICAgICAgCiAgICAgIC8qIGNvbmZpZ3VyZWQgIENITU9EIENDTSAgICovCiAgICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQ1JZUF9DUl9BTEdPTU9ERSwgQ1JZUF9BRVNfQ0NNKTsgCiAgICAgIAogICAgICAvKiBjb25maWd1cmVkICBIZWFkZXIgcGhhc2UgICovCiAgICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQ1JZUF9DUl9HQ01fQ0NNUEgsIENSWVBfUEhBU0VfSEVBREVSKTsgCiAgICAgIAogICAgICAvKnNldCB0byB6ZXJvIHRoZSBiaXRzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHBhZGRlZCBiaXRzKi8KICAgICAgZm9yKGluZGV4ID0gbGFzdHdvcmRzaXplOyBpbmRleDw0VTsgaW5kZXggKyspICAgICAgICAKICAgICAgewogICAgICAgIGludGVybWVkaWF0ZV9kYXRhW2luZGV4XSA9MFU7CiAgICAgIH0gICAgIAogICAgICBpZiAoKG5wYmxiICU0VSk9PTFVKQogICAgICB7CiAgICAgICAgaW50ZXJtZWRpYXRlX2RhdGFbbGFzdHdvcmRzaXplLTFVXSAmPSAweEZGRkZGRjAwVTsKICAgICAgfQogICAgICBpZiAoKG5wYmxiICU0VSk9PTJVKQogICAgICB7CiAgICAgICAgaW50ZXJtZWRpYXRlX2RhdGFbbGFzdHdvcmRzaXplLTFVXSAmPSAweEZGRkYwMDAwVTsKICAgICAgfQogICAgICBpZiAoKG5wYmxiICU0VSk9PTNVKQogICAgICB7CiAgICAgICAgaW50ZXJtZWRpYXRlX2RhdGFbbGFzdHdvcmRzaXplLTFVXSAmPSAweEZGMDAwMDAwVTsKICAgICAgfQogICAgICBmb3IoaW5kZXg9MFU7IGluZGV4IDwgNFUgOyBpbmRleCArKykgICAgICAgIAogICAgICB7ICAgICAgICAgICAgICAgCiAgICAgICAgaW50ZXJtZWRpYXRlX2RhdGFbaW5kZXhdIF49ICB0ZW1wW2luZGV4XTsKICAgICAgICBpbnRlcm1lZGlhdGVfZGF0YVtpbmRleF0gXj0gIHRlbXAyW2luZGV4XTsgCiAgICAgIH0KICAgICAgZm9yKGluZGV4ID0gMFU7IGluZGV4IDwgNFU7IGluZGV4ICsrKSAgICAgICAgCiAgICAgIHsKICAgICAgICAvKiBXcml0ZSB0aGUgbGFzdCBJbnB1dCBibG9jayBpbiB0aGUgSU4gRklGTyAqLwogICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOICA9IGludGVybWVkaWF0ZV9kYXRhW2luZGV4XSA7CiAgICAgIH0gCiAgICAgIAogICAgICAvKiBXYWl0IGZvciBCVVNZIGZsYWcgdG8gYmUgcmFpc2VkICovCiAgICAgIGlmKENSWVBfV2FpdE9uQlVTWUZsYWcoaGNyeXAsIFRpbWVvdXQpICE9IEhBTF9PSykgIAogICAgICB7IAogICAgICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLwogICAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CiAgICAgICAgCiAgICAgICAgLyogQ2hhbmdlIHN0YXRlICovCiAgICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9USU1FT1VUOwogICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOwogICAgICAgIAogICAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8gICAgICAgICAgCiAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsgICAgICAgCiNpZiAoVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkgCiAgICAgIC8qQ2FsbCByZWdpc3RlcmVkIGVycm9yIGNhbGxiYWNrKi8KICAgICAgaGNyeXAtPkVycm9yQ2FsbGJhY2soaGNyeXApOwojZWxzZQogICAgICAvKkNhbGwgbGVnYWN5IHdlYWsgZXJyb3IgY2FsbGJhY2sqLwogICAgICBIQUxfQ1JZUF9FcnJvckNhbGxiYWNrKGhjcnlwKTsKI2VuZGlmIC8qIFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8gCiAgICAgIH0KICAgIH0KICB9IC8qIEVuZCBvZiBDQ00gV0tBKi8gIAogIAogIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KICBfX0hBTF9VTkxPQ0soaGNyeXApOyAKICAKI2Vsc2UgLyogQUVTICovCiAgCiAgLypXb3JrYXJvdW5kIDI6IGNhc2UgR0NNIGVuY3J5cHRpb24sIGR1cmluZyBwYXlsb2FkIHBoYXNlIGFuZCBiZWZvcmUgaW5zZXJ0aW5nIAogIHRoZSBsYXN0IGJsb2NrIG9mIHBheWxhb2QsIHdoaWNoIHNpemUgaXMgaW5mZXJpb3IgdG8gIDEyOCBiaXRzICAqLyAgIAogIAogIGlmKChoY3J5cC0+SW5zdGFuY2UtPkNSICYgQUVTX0NSX01PREUpID09IENSWVBfT1BFUkFUSU5HTU9ERV9FTkNSWVBUKSAgICAKICB7CiAgICAvKiBjb25maWd1cmVkICBDSE1PRCBDVFIgICAqLwogICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfQ0hNT0QsIENSWVBfQUVTX0NUUik7ICAKICB9IAogIC8qICBsYXN0IGJsb2NrIG9wdGlvbmFsbHkgcGFkIHRoZSBkYXRhIHdpdGggemVyb3MqLyAgICAKICBmb3IoaW5kZXggPSAwVTsgaW5kZXggPCBsYXN0d29yZHNpemU7IGluZGV4ICsrKSAgICAgICAgCiAgewogICAgLyogV3JpdGUgdGhlIGxhc3QgSW5wdXQgYmxvY2sgaW4gdGhlIElOIEZJRk8gKi8KICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCApOwogICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7CiAgfSAgICAKICB3aGlsZShpbmRleCA8IDRVKQogIHsKICAgIC8qIHBhZCB0aGUgZGF0YSB3aXRoIHplcm9zIHRvIGhhdmUgYSBjb21wbGV0ZSBibG9jayAqLwogICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9IDBVOwogICAgaW5kZXgrKzsgCiAgfSAgIAogIC8qIFdhaXQgZm9yIENDRiBmbGFnIHRvIGJlIHJhaXNlZCAqLwogIGlmKENSWVBfV2FpdE9uQ0NGbGFnKGhjcnlwLCBUaW1lb3V0KSAhPSBIQUxfT0spICAKICB7IAogICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7ICAgICAgICAKICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CiNpZiAoVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkgCiAgICAgIC8qQ2FsbCByZWdpc3RlcmVkIGVycm9yIGNhbGxiYWNrKi8KICAgICAgaGNyeXAtPkVycm9yQ2FsbGJhY2soaGNyeXApOwojZWxzZQogICAgICAvKkNhbGwgbGVnYWN5IHdlYWsgZXJyb3IgY2FsbGJhY2sqLwogICAgICBIQUxfQ1JZUF9FcnJvckNhbGxiYWNrKGhjcnlwKTsKI2VuZGlmIC8qIFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8gCiAgfQogIAogIC8qIENsZWFyIENDRiBGbGFnICovCiAgX19IQUxfQ1JZUF9DTEVBUl9GTEFHKGhjcnlwLCBDUllQX0NDRl9DTEVBUik7CiAgCiAgZm9yKGluZGV4ID0gMFU7IGluZGV4PCA0VTtpbmRleCsrKSAgICAgICAgCiAgeyAgCiAgICAvKiBSZWFkIHRoZSBPdXRwdXQgYmxvY2sgZnJvbSB0aGUgT3V0cHV0IEZJRk8gKi8gIAogICAgaW50ZXJtZWRpYXRlX2RhdGFbaW5kZXhdID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUUjsgCiAgICAKICAgIC8qaW50ZXJtZWRpYXRlIGRhdGEgYnVmZmVyIHRvIGJlIHVzZWQgaW4gIHRoZSB3b3JrYXJvdW5kKi8KICAgICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwT3V0QnVmZlB0ciArIChoY3J5cC0+Q3J5cE91dENvdW50KSk9IGludGVybWVkaWF0ZV9kYXRhW2luZGV4XTsKICAgIGhjcnlwLT5DcnlwT3V0Q291bnQrKzsgCiAgfSAgCiAgCiAgaWYoKGhjcnlwLT5JbnN0YW5jZS0+Q1IgJiBBRVNfQ1JfTU9ERSkgPT0gQ1JZUF9PUEVSQVRJTkdNT0RFX0VOQ1JZUFQpIAogIHsgICAgCiAgICAvKiBjb25maWd1cmVkICBDSE1PRCBHQ00gICAqLwogICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfQ0hNT0QsIENSWVBfQUVTX0dDTV9HTUFDKTsKICAgIAogICAgLyogU2VsZWN0IGZpbmFsIHBoYXNlICovCiAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIEFFU19DUl9HQ01QSCwgQ1JZUF9QSEFTRV9GSU5BTCk7ICAgICAgIAogICAgCiAgICAvKldyaXRlIHRoZSBpbnRlcm1lZGlhdGVfZGF0YSBpbiB0aGUgSU4gRklGTyAqLyAgIAogICAgZm9yKGluZGV4ID0gMFU7IGluZGV4IDwgbGFzdHdvcmRzaXplOyBpbmRleCArKykgICAgICAgIAogICAgewogICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gaW50ZXJtZWRpYXRlX2RhdGFbaW5kZXhdOwogICAgfSAgICAKICAgIHdoaWxlKGluZGV4IDwgNFUpCiAgICB7CiAgICAgIC8qIHBhZCB0aGUgZGF0YSB3aXRoIHplcm9zIHRvIGhhdmUgYSBjb21wbGV0ZSBibG9jayAqLwogICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAwVTsKICAgICAgaW5kZXgrKzsgCiAgICB9CiAgICAvKiBXYWl0IGZvciBDQ0YgZmxhZyB0byBiZSByYWlzZWQgKi8KICAgIGlmKENSWVBfV2FpdE9uQ0NGbGFnKGhjcnlwLCBUaW1lb3V0KSAhPSBIQUxfT0spICAKICAgIHsgCiAgICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLwogICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwogICAgICAKICAgICAgLyogQ2hhbmdlIHN0YXRlICovCiAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfVElNRU9VVDsKICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7ICAKICAgICAgCiAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8gICAgICAgICAgCiAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7IAojaWYgKFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpIAogICAgICAvKkNhbGwgcmVnaXN0ZXJlZCBlcnJvciBjYWxsYmFjayovCiAgICAgIGhjcnlwLT5FcnJvckNhbGxiYWNrKGhjcnlwKTsKI2Vsc2UKICAgICAgLypDYWxsIGxlZ2FjeSB3ZWFrIGVycm9yIGNhbGxiYWNrKi8KICAgICAgSEFMX0NSWVBfRXJyb3JDYWxsYmFjayhoY3J5cCk7CiNlbmRpZiAvKiBVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTICovIAogICAgfSAgICAgIAogICAgLyogQ2xlYXIgQ0NGIEZsYWcgKi8KICAgIF9fSEFMX0NSWVBfQ0xFQVJfRkxBRyhoY3J5cCwgQ1JZUF9DQ0ZfQ0xFQVIpOwogICAgCiAgICBmb3IoIGluZGV4ID0gMFU7IGluZGV4PCA0VTtpbmRleCsrKQogICAgeyAKICAgICAgaW50ZXJtZWRpYXRlX2RhdGFbaW5kZXhdPWhjcnlwLT5JbnN0YW5jZS0+RE9VVFI7CiAgICB9CiAgfS8qRW5kIG9mIFdvcmthcm91bmQgMiovIAogIAojZW5kaWYgLyogRW5kIEFFUyBvciBDUllQICovICAgICAgCn0KCiNpZiBkZWZpbmVkIChDUllQKSAgCgovKioKICAqIEBicmllZiAgSGFuZGxlIENSWVAgaGFyZHdhcmUgYmxvY2sgVGltZW91dCB3aGVuIHdhaXRpbmcgZm9yIElGRU0gZmxhZyB0byBiZSByYWlzZWQuCiAgKiBAcGFyYW0gIGhjcnlwOiBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCiAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZS4gICAgICAKICAqIEBwYXJhbSAgVGltZW91dDogVGltZW91dCBkdXJhdGlvbi4KICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICovCnN0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBDUllQX1dhaXRPbklGRU1GbGFnKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQzMl90IFRpbWVvdXQpCnsKICB1aW50MzJfdCB0aWNrc3RhcnQ7CiAgCiAgLyogR2V0IHRpbWVvdXQgKi8KICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOwogIAogIHdoaWxlKEhBTF9JU19CSVRfQ0xSKGhjcnlwLT5JbnN0YW5jZS0+U1IsIENSWVBfRkxBR19JRkVNKSkKICB7CiAgICAvKiBDaGVjayBmb3IgdGhlIFRpbWVvdXQgKi8KICAgIGlmKFRpbWVvdXQgIT0gSEFMX01BWF9ERUxBWSkKICAgIHsKICAgICAgaWYoKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0ICkgPiBUaW1lb3V0KXx8KFRpbWVvdXQgPT0gMFUpKQogICAgICB7IAogICAgICAgIHJldHVybiBIQUxfRVJST1I7CiAgICAgIH0KICAgIH0KICB9ICAKICByZXR1cm4gSEFMX09LOyAKfQoKLyoqCiAgKiBAYnJpZWYgIEhhbmRsZSBDUllQIGhhcmR3YXJlIGJsb2NrIFRpbWVvdXQgd2hlbiB3YWl0aW5nIGZvciBCVVNZIGZsYWcgdG8gYmUgcmFpc2VkLgogICogQHBhcmFtICBoY3J5cDogcG9pbnRlciB0byBhIENSWVBfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucwogICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUuICAgICAgCiAgKiBAcGFyYW0gIFRpbWVvdXQ6IFRpbWVvdXQgZHVyYXRpb24uCiAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAqLwpzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgQ1JZUF9XYWl0T25CVVNZRmxhZyhDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50MzJfdCBUaW1lb3V0KQp7CiAgdWludDMyX3QgdGlja3N0YXJ0OwogIAogIC8qIEdldCB0aW1lb3V0ICovCiAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKICAKICB3aGlsZShIQUxfSVNfQklUX1NFVChoY3J5cC0+SW5zdGFuY2UtPlNSLCBDUllQX0ZMQUdfQlVTWSkpCiAgewogICAgLyogQ2hlY2sgZm9yIHRoZSBUaW1lb3V0ICovCiAgICBpZihUaW1lb3V0ICE9IEhBTF9NQVhfREVMQVkpCiAgICB7CiAgICAgIGlmKCgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCApID4gVGltZW91dCl8fChUaW1lb3V0ID09IDBVKSkKICAgICAgeyAgICAgIAogICAgICAgIHJldHVybiBIQUxfRVJST1I7CiAgICAgIH0KICAgIH0KICB9CiAgcmV0dXJuIEhBTF9PSzsgCn0KCgovKioKICAqIEBicmllZiAgSGFuZGxlIENSWVAgaGFyZHdhcmUgYmxvY2sgVGltZW91dCB3aGVuIHdhaXRpbmcgZm9yIE9GTkUgZmxhZyB0byBiZSByYWlzZWQuCiAgKiBAcGFyYW0gIGhjcnlwOiBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCiAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZS4gICAgICAKICAqIEBwYXJhbSAgVGltZW91dDogVGltZW91dCBkdXJhdGlvbi4KICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICovCnN0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBDUllQX1dhaXRPbk9GTkVGbGFnKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQzMl90IFRpbWVvdXQpCnsKICB1aW50MzJfdCB0aWNrc3RhcnQ7CiAgCiAgLyogR2V0IHRpbWVvdXQgKi8KICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOwogIAogIHdoaWxlKEhBTF9JU19CSVRfQ0xSKGhjcnlwLT5JbnN0YW5jZS0+U1IsIENSWVBfRkxBR19PRk5FKSkKICB7CiAgICAvKiBDaGVjayBmb3IgdGhlIFRpbWVvdXQgKi8KICAgIGlmKFRpbWVvdXQgIT0gSEFMX01BWF9ERUxBWSkKICAgIHsKICAgICAgaWYoKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0ICkgPiBUaW1lb3V0KXx8KFRpbWVvdXQgPT0gMFUpKQogICAgICB7ICAgICAgIAogICAgICAgIHJldHVybiBIQUxfRVJST1I7CiAgICAgIH0KICAgIH0KICB9CiAgcmV0dXJuIEhBTF9PSzsgCn0KCiNlbHNlIC8qIEFFUyAqLwoKLyoqCiAgKiBAYnJpZWYgIEhhbmRsZSBDUllQIGhhcmR3YXJlIGJsb2NrIFRpbWVvdXQgd2hlbiB3YWl0aW5nIGZvciBDQ0YgZmxhZyB0byBiZSByYWlzZWQuCiAgKiBAcGFyYW0gIGhjcnlwOiBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCiAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZS4gICAgICAKICAqIEBwYXJhbSAgVGltZW91dDogVGltZW91dCBkdXJhdGlvbi4KICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICovCnN0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBDUllQX1dhaXRPbkNDRmxhZyhDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50MzJfdCBUaW1lb3V0KQp7CiAgdWludDMyX3QgdGlja3N0YXJ0OwogIAogIC8qIEdldCB0aW1lb3V0ICovCiAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKICAKICB3aGlsZShIQUxfSVNfQklUX0NMUihoY3J5cC0+SW5zdGFuY2UtPlNSLCBBRVNfU1JfQ0NGKSkKICB7ICAgIAogICAgLyogQ2hlY2sgZm9yIHRoZSBUaW1lb3V0ICovCiAgICBpZihUaW1lb3V0ICE9IEhBTF9NQVhfREVMQVkpCiAgICB7CiAgICAgIGlmKCgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCApID4gVGltZW91dCl8fChUaW1lb3V0ID09IDBVKSApCiAgICAgIHsgICAgCiAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgICAgfQogICAgfQogIH0KICByZXR1cm4gSEFMX09LOyAKfQoKI2VuZGlmIC8qIEVuZCBBRVMgb3IgQ1JZUCAgKi8KCgovKioKICAqIEB9CiAgKi8gCiAgCgoKLyoqCiAgKiBAfQogICovCgovKioKICAqIEB9CiAgKi8KCiNlbmRpZiAvKiBIQUxfQ1JZUF9NT0RVTEVfRU5BQkxFRCAqLwoKCi8qKgogICogQH0KICAqLwojZW5kaWYgLyogVGlueUFFUyBvciBDUllQKi8KLyoqCiAgKiBAfQogICovCgovKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwo=