[Disclaimer: These are the versions of these routines from 23 Feb 1998, and are here for historical reasons; there are more recent versions. There are probably some links at http://www.cyclic.com/~kingdon/free-vms.html Here are some implemetations of VMS time routines (SYS$BINTIM, LIB$CVT_VECTIM, &c). Except for the SYS$GETTIM issues mentioned below, they should be fairly portable. I've glanced at the code but haven't tried it yet. I'd like to highlight the design decision to always keep time values in the 64 bit VMS format in little-endian storage. I'm not really sure which choice is best. There is a comment in vmstime.c about 16 bit words in SYS$NUMTIM. Unless I miscalculated, even if one specifies a delta time all the way back to the base date (17 Nov 1858), this doesn't kick in until the year 2042. While I am here I'll mention the 10,000 day issues for delta times. The new rules are that SYS$ASCTIM, SYS$BINTIM, and F$CVTIME still have 10,000 day limits and SYS$NUMTIM and the affected LIB$ routines no longer do (source: "OpenVMS Delta-Time Limit Q&A", May 1997, which used to be somewhere on http://www.openvms.digital.com/ (perhaps still is, somewhere)). -kingdon, Feb 1998] Return-Path: From: Paul Nankervis To: Subject: Re: Portable SYS$ASCTIM Date: Mon, 9 Feb 1998 02:02:41 -0500 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="Boundary=_0.0_=5030200023881031" --Boundary=_0.0_=5030200023881031 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: quoted-printable Jim, OK, here 'tis. The files attached are descrip.h, vmstime.h and vmstime= .c. These were written by me out of hours at home in my idle time... :-) Naturally there is NO warranty! I have no problem distributing this as public domain for the good of VMS users everywhere, although I would prefer that my name is maintained in the source... I have noticed a problem with the implementation of sys$gettim. It uses= the C library routine time() to find the current time and some systems do not handle this particularly well. On a VAX/VMS 7.0 system I have tried it on time() incorrectly (I believe) returns -1. Other VAX system= s, or by using GCC instead of DEC C, seem to work OK. Also I have noticed that the OS2 GCC version returns a time shifted by ten hours (our local= time offset). Sigh! If you have requests for bug fixes or enhancements please let me know and I will attempt to provide them. I wrote these routines as part of a= package which is coming together rather nicely to read ODS2 disk volumes (I can already manage volume sets pretty well!). However I did not know what time routines might be useful to other people so did not implement things that could have been easily added.... If you have comments or do not receive the files properly please let me know!!!! (This is the first time I have sent file attachments from Lotus Notes to the internet!) Goodluck! Paul Nankervis - DESCRIP.H - VMSTIME.H - VMSTIME.C = --Boundary=_0.0_=5030200023881031 Content-Type: application/octet-stream; name=DESCRIP.H Content-Transfer-Encoding: base64 LyoNCiAgICAgIERFU0NSSVAuSCB2MS4wDQoNCiovDQojaWZuZGVmIERTQyRLX0RUWVBFX1QNCiNk ZWZpbmUgRFNDJEtfRFRZUEVfVCAwDQojZGVmaW5lIERTQyRLX0NMQVNTX1MgMA0KDQpzdHJ1Y3Qg ZHNjJGRlc2NyaXB0b3Igew0KCXVuc2lnbmVkIHNob3J0IGRzYyR3X2xlbmd0aDsNCgl1bnNpZ25l ZCBjaGFyICBkc2Mkd190eXBlOw0KCXVuc2lnbmVkIGNoYXIgZHNjJHdfY2xhc3M7DQoJY2hhciAq ZHNjJGFfcG9pbnRlcjsNCn07DQoNCiNkZWZpbmUgJERFU0NSSVBUT1Ioc3RyaW5nLG5hbWUpIHN0 cnVjdCBkc2MkZGVzY3JpcHRvciBuYW1lID0ge3NpemVvZihzcmluZyktMSwwLDAsc3RyaW5nfTsN CiNlbmRpZho= --Boundary=_0.0_=5030200023881031 Content-Type: application/octet-stream; name=VMSTIME.H Content-Transfer-Encoding: base64 LyoNCg0KICAgICAgIFZNU1RJTUUuSCAgdjEuMQ0KDQogICAgICAgQXV0aG9yOiBQYXVsIE5hbmtl cnZpcw0KDQogICAgICAgUGxlYXNlIHNlbmQgYnVnIHJlcG9ydHMgdG8gUGF1bE5hbmtAYXUxLmli bS5jb20NCg0KKi8NCg0KI2luY2x1ZGUgPHN0ZGlvLmg+DQojaW5jbHVkZSA8bWVtb3J5Lmg+DQoj aW5jbHVkZSAiZGVzY3JpcC5oIg0KDQojaWZuZGVmIFNTJF9OT1JNQUwNCiNkZWZpbmUgU1MkX05P Uk1BTCAxDQojZGVmaW5lIFNTJF9JVlRJTUUgMzg4DQojZGVmaW5lIExJQiRfT05FREVMVElNIDE0 MTAwMjANCiNlbmRpZg0KDQpzdHJ1Y3QgVElNRSB7DQogICAgdW5zaWduZWQgY2hhciB0aW1lWzhd Ow0KfTsNCg0KI2RlZmluZSBsaWIkYWRkX3RpbWVzICAgICAgIGxpYl9hZGRfdGltZXMNCiNkZWZp bmUgbGliJGFkZHggICAgICAgICAgICBsaWJfYWRkeA0KI2RlZmluZSBsaWIkY3Z0X3ZlY3RpbSAg ICAgIGxpYl9jdnRfdmVjdGltDQojZGVmaW5lIGxpYiRkYXkgICAgICAgICAgICAgbGliX2RheQ0K I2RlZmluZSBsaWIkZGF5X29mX3dlZWsgICAgIGxpYl9kYXlfb2Zfd2Vlaw0KI2RlZmluZSBsaWIk bXVsdF9kZWx0YV90aW1lIGxpYl9tdWx0X2RlbHRhX3RpbWUNCiNkZWZpbmUgbGliJHN1Yl90aW1l cyAgICAgICBsaWJfc3ViX3RpbWVzDQojZGVmaW5lIGxpYiRzdWJ4ICAgICAgICAgICAgbGliX3N1 YngNCiNkZWZpbmUgc3lzJGFzY3RpbSAgICAgICAgICBzeXNfYXNjdGltDQojZGVmaW5lIHN5cyRi aW50aW0gICAgICAgICAgc3lzX2JpbnRpbQ0KI2RlZmluZSBzeXMkZ2V0dGltICAgICAgICAgIHN5 c19nZXR0aW0NCiNkZWZpbmUgc3lzJG51bXRpbSAgICAgICAgICBzeXNfbnVtdGltDQoNCg0KdW5z aWduZWQgc3lzX2dldHRpbShzdHJ1Y3QgVElNRSAqdGltYWRyKTsNCnVuc2lnbmVkIGxpYl9jdnRf dmVjdGltKHVuc2lnbmVkIHNob3J0IHRpbWJ1Zls3XSxzdHJ1Y3QgVElNRSAqdGltYWRyKTsNCnVu c2lnbmVkIGxpYl9kYXkoaW50ICpkYXlzLHN0cnVjdCBUSU1FICp0aW1hZHIsaW50ICpkYXlfdGlt ZSk7DQp1bnNpZ25lZCBzeXNfbnVtdGltKHVuc2lnbmVkIHNob3J0IHRpbWJ1Zls3XSxzdHJ1Y3Qg VElNRSAqdGltYWRyKTsNCnVuc2lnbmVkIHN5c19iaW50aW0oc3RydWN0IGRzYyRkZXNjcmlwdG9y ICp0aW1idWYsc3RydWN0IFRJTUUgKnRpbWFkcik7DQp1bnNpZ25lZCBzeXNfYXNjdGltKHVuc2ln bmVkIHNob3J0ICp0aW1sZW4sc3RydWN0IGRzYyRkZXNjcmlwdG9yICp0aW1idWYsDQogICAgICAg ICAgICAgICAgICAgIHN0cnVjdCBUSU1FICp0aW1hZHIsdW5zaWduZWQgY3Z0ZmxnKTsNCnVuc2ln bmVkIGxpYl9kYXlfb2Zfd2VlayhzdHJ1Y3QgVElNRSAqdGltYWRyLHVuc2lnbmVkICp3ZWVrZGF5 KTsNCnVuc2lnbmVkIGxpYl9hZGR4KHZvaWQgKmFkZGFudCx2b2lkICphZGRlZSx2b2lkICpyZXN1 bHQsaW50ICpsZW5hZGQpOw0KdW5zaWduZWQgbGliX3N1Yngodm9pZCAqc3ViYW50LHZvaWQgKnN1 YmVlLHZvaWQgKnJlc3VsdCxpbnQgKmxlbmFkZCk7DQp1bnNpZ25lZCBsaWJfYWRkX3RpbWVzKHN0 cnVjdCBUSU1FICp0aW1lMSxzdHJ1Y3QgVElNRSAqdGltZTIsDQogICAgICAgICAgICAgICAgICAg ICAgIHN0cnVjdCBUSU1FICpyZXN1bHQpOw0KdW5zaWduZWQgbGliX3N1Yl90aW1lcyhzdHJ1Y3Qg VElNRSAqdGltZTEsc3RydWN0IFRJTUUgKnRpbWUyLA0KICAgICAgICAgICAgICAgICAgICAgICBz dHJ1Y3QgVElNRSAqcmVzdWx0KTsNCnVuc2lnbmVkIGxpYl9tdWx0X2RlbHRhX3RpbWUoaW50ICpt dWx0aXBsZSxzdHJ1Y3QgVElNRSAqdGltYWRyKTsNCho= --Boundary=_0.0_=5030200023881031 Content-Type: application/octet-stream; name=VMSTIME.C Content-Transfer-Encoding: base64 LyoNCg0KICAgICAgIFZNU1RJTUUuQyAgdjEuMQ0KDQogICAgICAgQXV0aG9yOiBQYXVsIE5hbmtl cnZpcw0KDQogICAgICAgUGxlYXNlIHNlbmQgYnVnIHJlcG9ydHMgb3IgcmVxdWVzdHMgZm9yIGVu aGFuY2VtZW50DQogICAgICAgb3IgaW1wcm92ZW1lbnQgdmlhIGVtYWlsIHRvOiAgICAgUGF1bE5h bmtAYXUxLmlibS5jb20NCg0KDQogICAgICAgVGhpcyBtb2R1bGUgY29udGFpbnMgdmVyc2lvbnMg b2YgdGhlIFZNUyB0aW1lIHJvdXRpbmVzDQogICAgICAgc3lzJG51bXRpbSgpLCBzeXMkYXNjdGlt KCkgYW5kIGZyaWVuZHMuLi4gVGhleSBhcmUNCiAgICAgICBpbnRlbmRlZCB0byBiZSBjb21wYXRp YmxlIHdpdGggdGhlIHJvdXRpbmVzIG9mIHRoZSBzYW1lDQogICAgICAgbmFtZSBvbiBhIFZNUyBz eXN0ZW0gKHNvIGRlc2NyaXB0b3JzIGZlYXR1cmUgcmVndWxhcmx5ISkNCg0KICAgICAgIFRoaXMg Y29kZSByZWxpZXMgb24gYmVpbmcgYWJsZSB0byBtYW5pcGx1YXRlIGRheSBudW1iZXJzDQogICAg ICAgYW5kIHRpbWVzIHVzaW5nIDMyIGJpdCBhcml0aG1ldGljIHRvIGNyYWNrIGEgVk1TIHF1YWR3 b3JkDQogICAgICAgYnl0ZSBieSBieXRlLiBJZiB5b3VyIEMgY29tcGlsZXIgZG9lc24ndCBoYXZl IDMyIGJpdCBpbnQNCiAgICAgICBmaWVsZHMgZ2l2ZSB1cCBub3chIE9uIGEgNjQgYml0IHN5c3Rl bXMgdGhpcyBjb2RlIGNvdWxkDQogICAgICAgYmUgbW9kaWZpZWQgdG8gZG8gNjQgYml0IG9wZXJh dGlvbnMgZGlyZWN0bHkuLi4uDQoNCiAgICAgICBPbmUgYWR2YW50YWdlIG9mIGRvaW5nIGFyaWht ZXRpYyBieXRlIGJ5IGJ5dGUgaXMgdGhhdA0KICAgICAgIHRoZSBjb2RlIGRvZXMgbm90IGRlcGVu ZCBvbiB3aGF0ICdlbmRpYW4nIHRoZSB0YXJnZXQNCiAgICAgICBtYWNoaW5lIGlzIC0gaXQgd2ls bCBhbHdheXMgdHJlYXQgYnl0ZXMgaW4gdGhlIHNhbWUgb3JkZXIhDQogICAgICAgKEhvcGVmdWxs eSBWTVMgdGltZSBieXRlcyB3aWxsIGFsd2F5cyBiZSBpbiB0aGUgc2FtZSBvcmRlciEpDQoNCiAg ICAgICBBIGNvdXBsZSBvZiBzdHVwaWQgcXVlc3Rpb25zIHRvIGdvIG9uIHdpdGg6LQ0KICAgICAg ICAgICBvIE9LLCBJIGdpdmUgdXAhIFdoYXQgaXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhIHpl cm8NCiAgICAgICAgICAgICBkYXRlIGFuZCBhIHplcm8gZGVsdGEgdGltZT8NCiAgICAgICAgICAg byBBbnlvbmUgbm90aWNlIHRoYXQgdGhlIHVzZSBvZiAxNiBiaXQgd29yZHMgaW4NCiAgICAgICAg ICAgICBzeXMkbnVtdGltIHJlc3RyaWN0cyBkZWx0YSB0aW1lcyB0byA2NTUzNSBkYXlzPw0KDQog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXVsIE5hbmtlcnZpcw0KDQoq Lw0KDQojaW5jbHVkZSAidm1zdGltZS5oIiAgICAgICAgICAgIC8qIE91ciBoZWFkZXIgZmlsZSEg Ki8NCiNpbmNsdWRlIDx0aW1lLmg+ICAgICAgICAgICAgICAgLyogQyBoZWFkZXIgZm9yICRHRVRU SU0gdG8gZmluZCB0aW1lICovDQoNCiNkZWZpbmUgVElNRUJBU0UgMTAwMDAwICAgICAgICAgLyog MTAgbWlsbGlzZWNvbmQgdW5pdHMgaW4gcXVhZHdvcmQgKi8NCiNkZWZpbmUgVElNRVNJWkUgODY0 MDAwMCAgICAgICAgLyogRmFjdG9yIGJldHdlZW4gZGF0ZXMgJiB0aW1lcyAqLw0KDQojZGVmaW5l IFFVQURfQ0VOVFVSWV9EQVlTIDE0NjA5Nw0KLyogICAoNDAwKjM2NSkgKyAoNDAwLzQpIC0gKDQw MC8xMDApICsgKDQwMC80MDApICAgKi8NCiNkZWZpbmUgQ0VOVFVSWV9EQVlTICAgIDM2NTI0DQov KiAgICgxMDAqMzY1KSArICgxMDAvNCkgLSAoMTAwLzEwMCkgICAgKi8NCiNkZWZpbmUgUVVBRF9Z RUFSX0RBWVMgIDE0NjENCi8qICAgKDQqMzY1KSArICg0LzQpICAgICovDQojZGVmaW5lIFlFQVJf REFZUyAgICAgICAzNjUNCi8qICAgMzY1ICAgICAgICAqLw0KI2RlZmluZSBPRkZTRVRfREFZUyAg ICAgOTQxODcNCi8qICAgKCgxODU4XzE2MDEpKjM2NSkgKyAoKDE4NThfMTYwMSkvNCkgLSAoKDE4 NThfMTYwMSkvMTAwKQ0KICAgKyAoKDE4NThfMTYwMSkvNDAwKSArIDMyMA0KICAgICAgICBPRkZT RVQgRlJPTSAxLzEvMTYwMSBUTyAxNy8xMS8xODU4ICAqLw0KI2RlZmluZSBCQVNFX1lFQVIgICAg ICAgMTYwMQ0KDQoNCg0KLyogY29tYmluZV9kYXRlX3RpbWUoKSBpcyBhbiBpbnRlcm5hbCByb3V0 aW5lIHRvIHB1dCBkYXRlIGFuZCB0aW1lIGludG8gYQ0KICAgcXVhZHdvcmQgLSBiYXNpY2FsbHkg dGhlIG9wcG9zaXRlIG9mIGxpYl9kYXkoKSAuLi4uICovDQoNCnVuc2lnbmVkIGNvbWJpbmVfZGF0 ZV90aW1lKGludCBkYXlzLHN0cnVjdCBUSU1FICp0aW1hZHIsaW50IGRheV90aW1lKQ0Kew0KICAg IGlmIChkYXlfdGltZSA+PSBUSU1FU0laRSkgew0KICAgICAgICByZXR1cm4gU1MkX0lWVElNRTsN CiAgICB9IGVsc2Ugew0KDQogICAgICAgIC8qIFB1dCBkYXlzIGludG8gcXVhZCB0aW1idWYuLi4g Ki8NCg0KICAgICAgICByZWdpc3RlciB1bnNpZ25lZCBjb3VudCx0aW1lOw0KICAgICAgICByZWdp c3RlciB1bnNpZ25lZCBjaGFyICpwdHI7DQogICAgICAgIGNvdW50ID0gODsNCiAgICAgICAgcHRy ID0gdGltYWRyLT50aW1lOw0KICAgICAgICB0aW1lID0gZGF5czsNCiAgICAgICAgZG8gew0KICAg ICAgICAgICAgKnB0cisrID0gdGltZTsNCiAgICAgICAgICAgIHRpbWUgPSAodGltZSA+PiA4KTsN CiAgICAgICAgfSB3aGlsZSAoLS1jb3VudCA+IDApOw0KDQogICAgICAgIC8qIEZhY3RvciBpbiB0 aGUgdGltZS4uLiAqLw0KDQogICAgICAgIGNvdW50ID0gODsNCiAgICAgICAgcHRyID0gdGltYWRy LT50aW1lOw0KICAgICAgICB0aW1lID0gZGF5X3RpbWU7DQogICAgICAgIGRvIHsNCiAgICAgICAg ICAgIHRpbWUgKz0gKnB0ciAqIFRJTUVTSVpFOw0KICAgICAgICAgICAgKnB0cisrID0gdGltZTsN CiAgICAgICAgICAgIHRpbWUgPSAodGltZSA+PiA4KTsNCiAgICAgICAgfSB3aGlsZSAoLS1jb3Vu dCA+IDApOw0KDQogICAgICAgIC8qIEZhY3RvciBieSB0aW1lIGJhc2UuLi4gKi8NCg0KICAgICAg ICBjb3VudCA9IDg7DQogICAgICAgIHB0ciA9IHRpbWFkci0+dGltZTsNCiAgICAgICAgdGltZSA9 IDA7DQogICAgICAgIGRvIHsNCiAgICAgICAgICAgIHRpbWUgKz0gKnB0ciAqIFRJTUVCQVNFOw0K ICAgICAgICAgICAgKnB0cisrID0gdGltZTsNCiAgICAgICAgICAgIHRpbWUgPSAodGltZSA+PiA4 KTsNCiAgICAgICAgfSB3aGlsZSAoLS1jb3VudCA+IDApOw0KDQogICAgICAgIHJldHVybiBTUyRf Tk9STUFMOw0KICAgIH0NCn0NCg0KDQoNCi8qIHN5c19nZXR0aW0oKSBpbXBsZW1lbnRlZCBoZXJl IGJ5IGdldHRpbmcgVU5JWCB0aW1lIGluIHNlY29uZHMgc2luY2UNCiAgIDEtSmFuLTE5NzAgdXNp bmcgdGltZSgpIGFuZCBtdW5naW5nIGludG8gYSBxdWFkd29yZC4uLiBTb21lIHJ1biB0aW1lDQog ICBzeXN0ZW1zIGRvbid0IHNlZW0gdG8gZG8gdGhpcyBwcm9wZXJseSEhISBOb3RlIHRoYXQgdGlt ZSgpIGhhcyBhDQogICByZXNvbHV0aW9uIG9mIG9ubHkgb25lIHNlY29uZC4gKi8NCg0KdW5zaWdu ZWQgc3lzX2dldHRpbShzdHJ1Y3QgVElNRSAqdGltYWRyKQ0Kew0KICAgIHRpbWVfdCBjdXJ0aW0g PSB0aW1lKE5VTEwpOw0KICAgIHJldHVybiBjb21iaW5lX2RhdGVfdGltZSg0MDU4NyArIGN1cnRp bSAvIDg2NDAwLHRpbWFkciwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGN1cnRpbSAl IDg2NDAwKSAqIDEwMCk7DQp9DQoNCg0KLyogbGliX2N2dF92ZWN0aW0oKSB0YWtlcyBpbmRpdmlk dWFsIHRpbWUgZmllbGRzIGluIHNldmVuIHdvcmQgYnVmZmVyIGFuZA0KICAgbXVuZ2VzIGludG8g YSBxdWFkd29yZC4uLiAqLw0KDQp1bnNpZ25lZCBzaG9ydCBtb250aF9lbmRbXSA9IHswLDMxLDU5 LDkwLDEyMCwxNTEsMTgxLDIxMiwyNDMsMjczLDMwNCwzMzQsMzY1fTsNCg0KdW5zaWduZWQgbGli X2N2dF92ZWN0aW0odW5zaWduZWQgc2hvcnQgdGltYnVmWzddLHN0cnVjdCBUSU1FICp0aW1hZHIp DQp7DQogICAgaW50IGRlbHRhID0gMDsNCiAgICByZWdpc3RlciB1bnNpZ25lZCBzdHMsZGF5cyxk YXlfdGltZTsNCiAgICBzdHMgPSBTUyRfTk9STUFMOw0KDQogICAgLyogbGliX2N2dF92ZWN0aW0g cGFja3MgdGhlIHNldmVuIGRhdGUvdGltZSBjb21wb25lbnRzIGludG8gYSBxdWFkd29yZC4uLiAq Lw0KDQogICAgaWYgKHRpbWJ1ZlswXSA9PSAwICYmIHRpbWJ1ZlsxXSA9PSAwKSB7DQogICAgICAg IGRlbHRhID0gMTsNCiAgICAgICAgZGF5cyA9IHRpbWJ1ZlsyXTsNCiAgICB9IGVsc2Ugew0KICAg ICAgICByZWdpc3RlciBsZWFwID0gMCx5ZWFyID0gdGltYnVmWzBdLG1vbnRoID0gdGltYnVmWzFd Ow0KICAgICAgICBpZiAobW9udGggPj0gMikgew0KICAgICAgICAgICAgaWYgKCh5ZWFyICUgNCkg PT0gMCkgew0KICAgICAgICAgICAgICAgIGlmICgoeWVhciAlIDEwMCkgPT0gMCkgew0KICAgICAg ICAgICAgICAgICAgICBpZiAoKHllYXIgJSA0MDApID09IDApIHsNCiAgICAgICAgICAgICAgICAg ICAgICAgIGxlYXAgPSAxOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAg fSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgbGVhcCA9IDE7DQogICAgICAgICAgICAgICAg fQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGRheXMgPSB0aW1idWZbMl07DQog ICAgICAgIGlmICh5ZWFyID49IDE4NTggJiYgeWVhciA8PSA5OTk5ICYmIG1vbnRoID49IDEgJiYN CiAgICAgICAgICAgIG1vbnRoIDw9IDEyICYmIGRheXMgPj0gMSkgew0KICAgICAgICAgICAgZGF5 cyArPSBtb250aF9lbmRbbW9udGggLSAxXTsNCiAgICAgICAgICAgIGlmIChtb250aCA+IDIpIGRh eXMgKz0gbGVhcDsNCiAgICAgICAgICAgIGlmIChkYXlzIDw9IG1vbnRoX2VuZFttb250aF0gKyBs ZWFwKSB7DQogICAgICAgICAgICAgICAgeWVhciAtPSBCQVNFX1lFQVI7DQogICAgICAgICAgICAg ICAgZGF5cyArPSB5ZWFyICogMzY1ICsgeWVhciAvIDQgLSB5ZWFyIC8gMTAwICsgeWVhciAvIDQw MA0KICAgICAgICAgICAgICAgICAgICAgLSBPRkZTRVRfREFZUyAtIDE7DQogICAgICAgICAgICB9 IGVsc2Ugew0KICAgICAgICAgICAgICAgIHN0cyA9IFNTJF9JVlRJTUU7DQogICAgICAgICAgICB9 DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBzdHMgPSBTUyRfSVZUSU1FOw0KICAgICAg ICB9DQogICAgfQ0KICAgIGlmICh0aW1idWZbM10gPiAyMyB8fCB0aW1idWZbNF0gPiA1OSB8fA0K ICAgICAgICB0aW1idWZbNV0gPiA1OSB8fCB0aW1idWZbNl0gPiA5OSkgew0KICAgICAgICBzdHMg PSBTUyRfSVZUSU1FOw0KICAgIH0NCiAgICBpZiAoc3RzICYgMSkgew0KICAgICAgICBkYXlfdGlt ZSA9IHRpbWJ1ZlszXSAqIDM2MDAwMCArIHRpbWJ1Zls0XSAqIDYwMDAgKw0KICAgICAgICAgICAg dGltYnVmWzVdICogMTAwICsgdGltYnVmWzZdOw0KICAgICAgICBzdHMgPSBjb21iaW5lX2RhdGVf dGltZShkYXlzLHRpbWFkcixkYXlfdGltZSk7DQogICAgICAgIGlmIChkZWx0YSkgew0KDQogICAg ICAgICAgICAvKiBXZSBoYXZlIHRvIDIncyBjb21wbGVtZW50IGRlbHRhIHRpbWVzIC0gc2lnaCEh ICovDQoNCiAgICAgICAgICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGNvdW50LHRpbWU7DQogICAgICAg ICAgICByZWdpc3RlciB1bnNpZ25lZCBjaGFyICpwdHI7DQogICAgICAgICAgICBjb3VudCA9IDg7 DQogICAgICAgICAgICBwdHIgPSB0aW1hZHItPnRpbWU7DQogICAgICAgICAgICB0aW1lID0gMTsN CiAgICAgICAgICAgIGRvIHsNCiAgICAgICAgICAgICAgICB0aW1lID0gdGltZSArICgofipwdHIp ICYgMHhGRik7DQogICAgICAgICAgICAgICAgKnB0cisrID0gdGltZTsNCiAgICAgICAgICAgICAg ICB0aW1lID0gKHRpbWUgPj4gOCk7DQogICAgICAgICAgICB9IHdoaWxlICgtLWNvdW50ID4gMCk7 DQogICAgICAgIH0NCiAgICB9DQogICAgcmV0dXJuIHN0czsNCn0NCg0KDQovKiBsaWJfZGF5KCkg aXMgYSByb3V0aW5lIHRvIGNyYWNrIHF1YWR3b3JkIGludG8gZGF5IG51bWJlciBhbmQgdGltZSAq Lw0KDQp1bnNpZ25lZCBsaWJfZGF5KGludCAqZGF5cyxzdHJ1Y3QgVElNRSAqdGltYWRyLGludCAq ZGF5X3RpbWUpDQp7DQogICAgcmVnaXN0ZXIgdW5zaWduZWQgZGF0ZSx0aW1lLGNvdW50Ow0KICAg IHJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgKmRzdHB0ciwqc3JjcHRyOw0KICAgIHN0cnVjdCBUSU1F IHdya3RpbTsNCiAgICBpbnQgZGVsdGE7DQoNCiAgICAvKiBJZiBubyB0aW1lIHNwZWNpZmllZCBn ZXQgY3VycmVudCB1c2luZyBnZXR0aW0oKSAqLw0KDQogICAgaWYgKHRpbWFkciA9PSBOVUxMKSB7 DQogICAgICAgIHJlZ2lzdGVyIHVuc2lnbmVkIHN0czsNCiAgICAgICAgc3RzID0gc3lzX2dldHRp bSgmd3JrdGltKTsNCiAgICAgICAgaWYgKChzdHMgJiAxKSA9PSAwKSB7DQogICAgICAgICAgICBy ZXR1cm4gc3RzOw0KICAgICAgICB9DQogICAgICAgIGRlbHRhID0gMDsNCiAgICAgICAgc3JjcHRy ID0gd3JrdGltLnRpbWUgKyA3Ow0KICAgIH0gZWxzZSB7DQoNCiAgICAgICAgLyogQ2hlY2sgc3Bl Y2lmaWVkIHRpbWUgZm9yIGRlbHRhLi4uICovDQoNCiAgICAgICAgc3JjcHRyID0gdGltYWRyLT50 aW1lICsgNzsNCiAgICAgICAgaWYgKChkZWx0YSA9ICgqc3JjcHRyICYgMHg4MCkpKSB7DQoNCiAg ICAgICAgICAgIC8qIFdlIGhhdmUgdG8gMidzIGNvbXBsZW1lbnQgZGVsdGEgdGltZXMgLSBzaWdo ISEgKi8NCg0KICAgICAgICAgICAgY291bnQgPSA4Ow0KICAgICAgICAgICAgc3JjcHRyID0gdGlt YWRyLT50aW1lOw0KICAgICAgICAgICAgZHN0cHRyID0gd3JrdGltLnRpbWU7DQogICAgICAgICAg ICB0aW1lID0gMTsNCiAgICAgICAgICAgIGRvIHsNCiAgICAgICAgICAgICAgICB0aW1lID0gdGlt ZSArICgofipzcmNwdHIrKykgJiAweEZGKTsNCiAgICAgICAgICAgICAgICAqZHN0cHRyKysgPSB0 aW1lOw0KICAgICAgICAgICAgICAgIHRpbWUgPSAodGltZSA+PiA4KTsNCiAgICAgICAgICAgIH0g d2hpbGUgKC0tY291bnQgPiAwKTsNCiAgICAgICAgICAgIHNyY3B0ciA9IHdya3RpbS50aW1lICsg NzsNCiAgICAgICAgfQ0KICAgIH0NCg0KDQogICAgLyogVGhyb3cgYXdheSB0aGUgdW5yZXF1aXJl ZCB0aW1lIHByZWNpc2lvbiAqLw0KDQogICAgY291bnQgPSA4Ow0KICAgIGRzdHB0ciA9IHdya3Rp bS50aW1lICsgNzsNCiAgICB0aW1lID0gMDsNCiAgICBkbyB7DQogICAgICAgIHRpbWUgPSAodGlt ZSA8PCA4KSB8ICpzcmNwdHItLTsNCiAgICAgICAgKmRzdHB0ci0tID0gdGltZSAvIFRJTUVCQVNF Ow0KICAgICAgICB0aW1lICU9IFRJTUVCQVNFOw0KICAgIH0gd2hpbGUgKC0tY291bnQgPiAwKTsN Cg0KDQogICAgLyogU2VwZXJhdGUgdGhlIGRhdGUgYW5kIHRpbWUgKi8NCg0KICAgIGRhdGUgPSB0 aW1lID0gMDsNCiAgICBzcmNwdHIgPSB3cmt0aW0udGltZSArIDc7DQogICAgY291bnQgPSA4Ow0K ICAgIGRvIHsNCiAgICAgICAgdGltZSA9ICh0aW1lIDw8IDgpIHwgKnNyY3B0ci0tOw0KICAgICAg ICBkYXRlID0gKGRhdGUgPDwgOCkgfCAodGltZSAvIFRJTUVTSVpFKTsNCiAgICAgICAgdGltZSAl PSBUSU1FU0laRTsNCiAgICB9IHdoaWxlICgtLWNvdW50ID4gMCk7DQoNCiAgICAvKiBSZXR1cm4g cmVzdWx0cy4uLiAqLw0KDQogICAgaWYgKGRlbHRhKSB7DQogICAgICAgICpkYXlzID0gLShpbnQp IGRhdGU7DQogICAgICAgIGlmIChkYXlfdGltZSAhPSBOVUxMKSAqZGF5X3RpbWUgPSAtKGludCkg dGltZTsNCiAgICB9IGVsc2Ugew0KICAgICAgICAqZGF5cyA9IGRhdGU7DQogICAgICAgIGlmIChk YXlfdGltZSAhPSBOVUxMKSAqZGF5X3RpbWUgPSB0aW1lOw0KICAgIH0NCg0KICAgIHJldHVybiBT UyRfTk9STUFMOw0KfQ0KDQoNCg0KLyogc3lzX251bXRpbSgpIHRha2VzIHF1YWR3b3JkIGFuZCBi cmVha3MgaXQgaW50byBhIHNldmVuIHdvcmQgdGltZSBidWZmZXIgKi8NCg0KdW5zaWduZWQgY2hh ciBtb250aF9kYXlzW10gPSB7MzEsMjksMzEsMzAsMzEsMzAsMzEsMzEsMzAsMzEsMzAsMzF9Ow0K DQp1bnNpZ25lZCBzeXNfbnVtdGltKHVuc2lnbmVkIHNob3J0IHRpbWJ1Zls3XSxzdHJ1Y3QgVElN RSAqdGltYWRyKQ0Kew0KICAgIHJlZ2lzdGVyIGRhdGUsdGltZTsNCg0KICAgIC8qIFVzZSBsaWJf ZGF5IHRvIGNyYWNrIHRpbWUgaW50byBkYXRlL3RpbWUuLi4gKi8NCg0KICAgIHsNCiAgICAgICAg aW50IGRheXMsZGF5X3RpbWU7DQogICAgICAgIHJlZ2lzdGVyIHVuc2lnbmVkIHN0czsNCiAgICAg ICAgc3RzID0gbGliX2RheSgmZGF5cyx0aW1hZHIsJmRheV90aW1lKTsNCiAgICAgICAgaWYgKChz dHMgJiAxKSA9PSAwKSB7DQogICAgICAgICAgICByZXR1cm4gc3RzOw0KICAgICAgICB9DQogICAg ICAgIGRhdGUgPSBkYXlzOw0KICAgICAgICB0aW1lID0gZGF5X3RpbWU7DQogICAgfQ0KDQogICAg LyogRGVsdGEgb3IgZGF0ZS4uLiAqLw0KDQogICAgaWYgKGRhdGUgPCAwIHx8IHRpbWUgPCAwKSB7 DQogICAgICAgIHRpbWJ1ZlsyXSA9IC1kYXRlOyAgICAgIC8qIERheXMgKi8NCiAgICAgICAgdGlt YnVmWzFdID0gMDsgICAgICAgICAgLyogTW9udGggKi8NCiAgICAgICAgdGltYnVmWzBdID0gMDsg ICAgICAgICAgLyogWWVhciAqLw0KICAgICAgICB0aW1lID0gLXRpbWU7DQoNCiAgICB9IGVsc2Ug ew0KDQogICAgICAgIC8qIERhdGUuLi4gKi8NCg0KICAgICAgICByZWdpc3RlciB5ZWFyLG1vbnRo Ow0KICAgICAgICBkYXRlICs9IE9GRlNFVF9EQVlTOw0KICAgICAgICB5ZWFyID0gQkFTRV9ZRUFS ICsgKGRhdGUgLyBRVUFEX0NFTlRVUllfREFZUykgKiA0MDA7DQogICAgICAgIGRhdGUgJT0gUVVB RF9DRU5UVVJZX0RBWVM7DQoNCiAgICAgICAgLyogS2x1ZGdlIGNlbnR1cnkgZGl2aXNpb24gLSBs YXN0IGNlbnR1cnkgaW4gcXVhZCBpcyBsb25nZXIhISAqLw0KDQogICAgICAgIGlmICgobW9udGgg PSBkYXRlIC8gQ0VOVFVSWV9EQVlTKSA9PSA0KSBtb250aCA9IDM7DQogICAgICAgIGRhdGUgLT0g bW9udGggKiBDRU5UVVJZX0RBWVM7DQogICAgICAgIHllYXIgKz0gbW9udGggKiAxMDA7DQoNCiAg ICAgICAgLyogVXNlIHRoZSBzYW1lIHRlY2huaXF1ZSB0byBmaW5kIG91dCB0aGUgcXVhZCB5ZWFy IGFuZCB5ZWFyIC0NCiAgICAgICAgICAgbGFzdCB5ZWFyIGluIHF1YWQgaXMgbG9uZ2VyISEgKi8N Cg0KICAgICAgICB5ZWFyICs9IChkYXRlIC8gUVVBRF9ZRUFSX0RBWVMpICogNDsNCiAgICAgICAg ZGF0ZSAlPSBRVUFEX1lFQVJfREFZUzsNCg0KICAgICAgICBpZiAoKG1vbnRoID0gZGF0ZSAvIFlF QVJfREFZUykgPT0gNCkgbW9udGggPSAzOw0KICAgICAgICBkYXRlIC09IG1vbnRoICogWUVBUl9E QVlTOw0KICAgICAgICB5ZWFyICs9IG1vbnRoOw0KDQogICAgICAgIC8qIEFkanVzdCBmb3IgeWVh cnMgd2hpY2ggaGF2ZSBubyBGZWIgMjl0aCAqLw0KDQogICAgICAgIGlmIChkYXRlKysgPiA1OCkg ew0KICAgICAgICAgICAgaWYgKG1vbnRoICE9IDMpIHsNCiAgICAgICAgICAgICAgICBkYXRlKys7 DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIGlmICgoeWVhciAlIDEwMCkg PT0gMCAmJiAoeWVhciAlIDQwMCkgIT0gMCkgZGF0ZSsrOw0KICAgICAgICAgICAgfQ0KICAgICAg ICB9DQogICAgICAgIC8qIEZpZ3VyZSBvdXQgd2hhdCBtb250aCBpdCBpcy4uLiAqLw0KDQogICAg ICAgIHsNCiAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKm10aHB0ciA9IG1vbnRoX2RheXM7DQog ICAgICAgICAgICBtb250aCA9IDE7DQogICAgICAgICAgICB3aGlsZSAoZGF0ZSA+ICptdGhwdHIp IHsNCiAgICAgICAgICAgICAgICBkYXRlIC09ICptdGhwdHIrKzsNCiAgICAgICAgICAgICAgICBt b250aCsrOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgLyogUmV0dXJuIGRh dGUgcmVzdWx0cy4uLiAqLw0KDQogICAgICAgIHRpbWJ1ZlsyXSA9IGRhdGU7ICAgICAgIC8qIERh eXMgKi8NCiAgICAgICAgdGltYnVmWzFdID0gbW9udGg7ICAgICAgLyogTW9udGggKi8NCiAgICAg ICAgdGltYnVmWzBdID0geWVhcjsgICAgICAgLyogWWVhciAqLw0KICAgIH0NCg0KICAgIC8qIFJl dHVybiB0aW1lLi4uICovDQoNCiAgICB0aW1idWZbNl0gPSB0aW1lICUgMTAwOyAgICAgLyogSHVu ZHJlZHRocyAqLw0KICAgIHRpbWUgLz0gMTAwOw0KICAgIHRpbWJ1Zls1XSA9IHRpbWUgJSA2MDsg ICAgICAvKiBTZWNvbmRzICovDQogICAgdGltZSAvPSA2MDsNCiAgICB0aW1idWZbNF0gPSB0aW1l ICUgNjA7ICAgICAgLyogTWludXRlcyAqLw0KICAgIHRpbWJ1ZlszXSA9IHRpbWUgLyA2MDsgICAg ICAvKiBIb3VycyAqLw0KDQogICAgcmV0dXJuIFNTJF9OT1JNQUw7DQp9DQoNCg0KDQovKiBzeXNf YmludGltKCkgdGFrZXMgYXNjaWkgdGltZSBhbmQgY29udmVydCBpdCB0byBhIHF1YWR3b3JkICov DQoNCmNoYXIgbW9udGhfbmFtZXNbXSA9ICItSkFOLUZFQi1NQVItQVBSLU1BWS1KVU4tSlVMLUFV Ry1TRVAtT0NULU5PVi1ERUMtIjsNCmNoYXIgdGltZV9zZXBbXSA9ICI6Oi4iOw0KDQp1bnNpZ25l ZCBzeXNfYmludGltKHN0cnVjdCBkc2MkZGVzY3JpcHRvciAqdGltYnVmLHN0cnVjdCBUSU1FICp0 aW1hZHIpDQp7DQogICAgcmVnaXN0ZXIgbGVuZ3RoID0gdGltYnVmLT5kc2Mkd19sZW5ndGg7DQog ICAgcmVnaXN0ZXIgY2hhciAqY2hycHRyID0gdGltYnVmLT5kc2MkYV9wb2ludGVyOw0KICAgIHVu c2lnbmVkIHNob3J0IHdya3RpbVs3XTsNCiAgICBpbnQgbnVtLHRmOw0KDQoNCiAgICAvKiBTa2lw IGxlYWRpbmcgc3BhY2VzLi4uICovDQoNCiAgICB3aGlsZSAobGVuZ3RoID4gMCAmJiAqY2hycHRy ID09ICcgJykgew0KICAgICAgICBsZW5ndGgtLTsNCiAgICAgICAgY2hycHRyKys7DQogICAgfQ0K DQogICAgLyogR2V0IHRoZSBkYXkgbnVtYmVyLi4uICovDQoNCiAgICBudW0gPSAtMTsNCiAgICBp ZiAobGVuZ3RoID4gMCAmJiAqY2hycHRyID49ICcwJyAmJiAqY2hycHRyIDw9ICc5Jykgew0KICAg ICAgICBudW0gPSAwOw0KICAgICAgICBkbyB7DQogICAgICAgICAgICBudW0gPSBudW0gKiAxMCAr ICgqY2hycHRyKysgLSAnMCcpOw0KICAgICAgICB9IHdoaWxlICgtLWxlbmd0aCA+IDAgJiYgKmNo cnB0ciA+PSAnMCcgJiYgKmNocnB0ciA8PSAnOScpOw0KICAgIH0NCiAgICAvKiBDaGVjayBmb3Ig bW9udGggc2VwYXJhdG9yICItIiAtIGlmIG5vbmUgZGVsdGEgdGltZS4uLiAqLw0KDQogICAgaWYg KGxlbmd0aCA+IDAgJiYgKmNocnB0ciA9PSAnLScpIHsNCiAgICAgICAgY2hycHRyKys7DQoNCiAg ICAgICAgLyogR2V0IGN1cnJlbnQgdGltZSBmb3IgZGVmYXVsdHMuLi4gKi8NCg0KICAgICAgICBz eXNfbnVtdGltKHdya3RpbSxOVUxMKTsNCiAgICAgICAgaWYgKG51bSA+PSAwKSB3cmt0aW1bMl0g PSBudW07DQogICAgICAgIG51bSA9IDA7DQogICAgICAgIGlmICgtLWxlbmd0aCA+PSAzICYmICpj aHJwdHIgIT0gJy0nKSB7DQogICAgICAgICAgICBjaGFyICptbiA9IG1vbnRoX25hbWVzICsgMTsN CiAgICAgICAgICAgIG51bSA9IDE7DQogICAgICAgICAgICB3aGlsZSAobnVtIDw9IDEyKSB7DQog ICAgICAgICAgICAgICAgaWYgKG1lbWNtcChjaHJwdHIsbW4sMykgPT0gMCkgYnJlYWs7DQogICAg ICAgICAgICAgICAgbW4gKz0gNDsNCiAgICAgICAgICAgICAgICBudW0rKzsNCiAgICAgICAgICAg IH0NCiAgICAgICAgICAgIGNocnB0ciArPSAzOw0KICAgICAgICAgICAgbGVuZ3RoIC09IDM7DQog ICAgICAgICAgICB3cmt0aW1bMV0gPSBudW07DQogICAgICAgIH0NCiAgICAgICAgLyogTm93IGxv b2sgZm9yIHllYXIuLi4gKi8NCg0KICAgICAgICBpZiAobGVuZ3RoID4gMCAmJiAqY2hycHRyID09 ICctJykgew0KICAgICAgICAgICAgbGVuZ3RoLS07DQogICAgICAgICAgICBjaHJwdHIrKzsNCiAg ICAgICAgICAgIGlmIChsZW5ndGggPiAwICYmICpjaHJwdHIgPj0gJzAnICYmICpjaHJwdHIgPD0g JzknKSB7DQogICAgICAgICAgICAgICAgbnVtID0gMDsNCiAgICAgICAgICAgICAgICBkbyB7DQog ICAgICAgICAgICAgICAgICAgIG51bSA9IG51bSAqIDEwICsgKCpjaHJwdHIrKyAtICcwJyk7DQog ICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1sZW5ndGggPiAwICYmICpjaHJwdHIgPj0gJzAnICYm ICpjaHJwdHIgPD0gJzknKTsNCiAgICAgICAgICAgICAgICB3cmt0aW1bMF0gPSBudW07DQogICAg ICAgICAgICB9DQogICAgICAgIH0NCiAgICB9IGVsc2Ugew0KDQogICAgICAgIC8qIERlbHRhIHRp bWUgdGhlbi4uLiAqLw0KDQogICAgICAgIHdya3RpbVswXSA9IHdya3RpbVsxXSA9IDA7DQogICAg ICAgIHdya3RpbVsyXSA9IG51bTsNCiAgICAgICAgd3JrdGltWzNdID0gd3JrdGltWzRdID0gd3Jr dGltWzVdID0gd3JrdGltWzZdID0gMDsNCiAgICB9DQoNCiAgICAvKiBTa2lwIGFueSBzcGFjZXMg YmV0d2VlbiBkYXRlIGFuZCB0aW1lLi4uICovDQoNCiAgICB3aGlsZSAobGVuZ3RoID4gMCAmJiAq Y2hycHRyID09ICcgJykgew0KICAgICAgICBsZW5ndGgtLTsNCiAgICAgICAgY2hycHRyKys7DQog ICAgfQ0KDQogICAgLyogTm93IHdyYXAgdXAgdGltZSBmaWVsZHMuLi4gKi8NCg0KICAgIGZvciAo dGYgPSAwOyB0ZiA8IDM7IHRmKyspIHsNCiAgICAgICAgaWYgKGxlbmd0aCA+IDAgJiYgKmNocnB0 ciA+PSAnMCcgJiYgKmNocnB0ciA8PSAnOScpIHsNCiAgICAgICAgICAgIG51bSA9IDA7DQogICAg ICAgICAgICBkbyB7DQogICAgICAgICAgICAgICAgbnVtID0gbnVtICogMTAgKyAoKmNocnB0cisr IC0gJzAnKTsNCiAgICAgICAgICAgIH0gd2hpbGUgKC0tbGVuZ3RoID4gMCAmJiAqY2hycHRyID49 ICcwJyAmJiAqY2hycHRyIDw9ICc5Jyk7DQogICAgICAgICAgICB3cmt0aW1bMyArIHRmXSA9IG51 bTsNCiAgICAgICAgICAgIGlmIChudW0gPiA1OSkgd3JrdGltWzFdID0gMTM7DQogICAgICAgIH0N CiAgICAgICAgaWYgKGxlbmd0aCA+IDAgJiYgKmNocnB0ciA9PSB0aW1lX3NlcFt0Zl0pIHsNCiAg ICAgICAgICAgIGxlbmd0aC0tOw0KICAgICAgICAgICAgY2hycHRyKys7DQogICAgICAgIH0gZWxz ZSB7DQogICAgICAgICAgICBicmVhazsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIC8qIEh1bmRy ZWR0aHMgb2Ygc2Vjb25kcyBuZWVkIHNwZWNpYWwgaGFuZGxpbmcuLi4gKi8NCg0KICAgIGlmIChs ZW5ndGggPiAwICYmICpjaHJwdHIgPj0gJzAnICYmICpjaHJwdHIgPD0gJzknKSB7DQogICAgICAg IHRmID0gMTA7DQogICAgICAgIG51bSA9IDA7DQogICAgICAgIGRvIHsNCiAgICAgICAgICAgIG51 bSA9IG51bSArIHRmICogKCpjaHJwdHIrKyAtICcwJyk7DQogICAgICAgICAgICB0ZiA9IHRmIC8g MTA7DQogICAgICAgIH0gd2hpbGUgKC0tbGVuZ3RoID4gMCAmJiAqY2hycHRyID49ICcwJyAmJiAq Y2hycHRyIDw9ICc5Jyk7DQogICAgICAgIHdya3RpbVs2XSA9IG51bTsNCiAgICB9DQogICAgLyog Tm93IHNraXAgYW55IHRyYWlsaW5nIHNwYWNlcy4uLiAqLw0KDQogICAgd2hpbGUgKGxlbmd0aCA+ IDAgJiYgKmNocnB0ciA9PSAnICcpIHsNCiAgICAgICAgbGVuZ3RoLS07DQogICAgICAgIGNocnB0 cisrOw0KICAgIH0NCg0KICAgIC8qIElmIGFueXRoaW5nIGxlZnQgdGhlbiB3ZSBoYXZlIGEgcHJv YmxlbS4uLiAqLw0KDQogICAgaWYgKGxlbmd0aCA9PSAwKSB7DQogICAgICAgIHJldHVybiBsaWJf Y3Z0X3ZlY3RpbSh3cmt0aW0sdGltYWRyKTsNCiAgICB9IGVsc2Ugew0KICAgICAgICByZXR1cm4g U1MkX0lWVElNRTsNCiAgICB9DQp9DQoNCg0KLyogc3lzX2FzY3RpbSgpIGNvbnZlcnRzIHF1YWR3 b3JkIHRvIGFzY2lpLi4uICovDQoNCnVuc2lnbmVkIHN5c19hc2N0aW0odW5zaWduZWQgc2hvcnQg KnRpbWxlbixzdHJ1Y3QgZHNjJGRlc2NyaXB0b3IgKnRpbWJ1ZiwNCiAgICAgICAgICAgICAgICAg ICAgc3RydWN0IFRJTUUgKnRpbWFkcix1bnNpZ25lZCBjdnRmbGcpDQp7DQogICAgcmVnaXN0ZXIg Y291bnQsdGltdmFsOw0KICAgIHVuc2lnbmVkIHNob3J0IHdya3RpbVs3XTsNCiAgICByZWdpc3Rl ciBsZW5ndGggPSB0aW1idWYtPmRzYyR3X2xlbmd0aDsNCiAgICByZWdpc3RlciBjaGFyICpjaHJw dHIgPSB0aW1idWYtPmRzYyRhX3BvaW50ZXI7DQoNCiAgICAvKiBGaXJzdCB1c2Ugc3lzX251bXRp bSB0byBnZXQgdGhlIGRhdGUvdGltZSBmaWVsZHMuLi4gKi8NCg0KICAgIHsNCiAgICAgICAgcmVn aXN0ZXIgdW5zaWduZWQgc3RzOw0KICAgICAgICBzdHMgPSBzeXNfbnVtdGltKHdya3RpbSx0aW1h ZHIpOw0KICAgICAgICBpZiAoKHN0cyAmIDEpID09IDApIHsNCiAgICAgICAgICAgIHJldHVybiBz dHM7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICAvKiBTZWUgaWYgd2Ugd2FudCBkZWx0YSBkYXlz IG9yIGRhdGUuLi4gKi8NCg0KICAgIGlmIChjdnRmbGcgPT0gMCkgew0KDQogICAgICAgIC8qIENo ZWNrIGlmIGRhdGUgb3IgZGVsdGEgdGltZS4uLiAqLw0KDQogICAgICAgIGlmICgqd3JrdGltKSB7 DQoNCiAgICAgICAgICAgIC8qIFB1dCBpbiBkYXlzIGFuZCBtb250aC4uLiAqLw0KDQogICAgICAg ICAgICBpZiAobGVuZ3RoID4gMCkgew0KICAgICAgICAgICAgICAgIGlmICgodGltdmFsID0gd3Jr dGltWzJdKSAvIDEwID09IDApIHsNCiAgICAgICAgICAgICAgICAgICAgKmNocnB0cisrID0gJyAn Ow0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICpjaHJwdHIr KyA9ICcwJyArIHRpbXZhbCAvIDEwOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAg ICBsZW5ndGgtLTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChsZW5ndGggPiAwKSB7 DQogICAgICAgICAgICAgICAgKmNocnB0cisrID0gJzAnICsgKHRpbXZhbCAlIDEwKTsNCiAgICAg ICAgICAgICAgICBsZW5ndGgtLTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmICgoY291 bnQgPSBsZW5ndGgpID4gNSkgY291bnQgPSA1Ow0KICAgICAgICAgICAgbWVtY3B5KGNocnB0cixt b250aF9uYW1lcyArICh3cmt0aW1bMV0gKiA0IC0gNCksY291bnQpOw0KICAgICAgICAgICAgbGVu Z3RoIC09IGNvdW50Ow0KICAgICAgICAgICAgY2hycHRyICs9IGNvdW50Ow0KICAgICAgICAgICAg dGltdmFsID0gKndya3RpbTsNCiAgICAgICAgfSBlbHNlIHsNCg0KICAgICAgICAgICAgLyogR2V0 IGRlbHRhIGRheXMuLi4gKi8NCg0KICAgICAgICAgICAgdGltdmFsID0gd3JrdGltWzJdOw0KICAg ICAgICB9DQoNCiAgICAgICAgLyogQ29tbW9uIGNvZGUgZm9yIHllYXIgbnVtYmVyIGFuZCBkZWx0 YSBkYXlzISEgKi8NCg0KICAgICAgICBjb3VudCA9IDEwMDAwOw0KICAgICAgICBpZiAodGltdmFs IDwgY291bnQpIHsNCiAgICAgICAgICAgIGNvdW50ID0gMTAwMDsNCiAgICAgICAgICAgIHdoaWxl IChsZW5ndGggPiAwICYmIHRpbXZhbCA8IGNvdW50ICYmIGNvdW50ID4gMSkgew0KICAgICAgICAg ICAgICAgIGxlbmd0aC0tOw0KICAgICAgICAgICAgICAgICpjaHJwdHIrKyA9ICcgJzsNCiAgICAg ICAgICAgICAgICBjb3VudCAvPSAxMDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAg ICB3aGlsZSAobGVuZ3RoID4gMCAmJiBjb3VudCA+IDApIHsNCiAgICAgICAgICAgIGxlbmd0aC0t Ow0KICAgICAgICAgICAgKmNocnB0cisrID0gJzAnICsgKHRpbXZhbCAvIGNvdW50KTsNCiAgICAg ICAgICAgIHRpbXZhbCA9IHRpbXZhbCAlIGNvdW50Ow0KICAgICAgICAgICAgY291bnQgLz0gMTA7 DQogICAgICAgIH0NCg0KICAgICAgICAvKiBTcGFjZSBiZXR3ZWVuIGRhdGUgYW5kIHRpbWUuLi4g Ki8NCg0KICAgICAgICBpZiAobGVuZ3RoID4gMCkgew0KICAgICAgICAgICAgKmNocnB0cisrID0g JyAnOw0KICAgICAgICAgICAgbGVuZ3RoLS07DQogICAgICAgIH0NCiAgICB9DQogICAgLyogRG8g dGltZS4uLiA6LSkgKi8NCg0KICAgIGNvdW50ID0gMzsNCiAgICBkbyB7DQogICAgICAgIHRpbXZh bCA9IHdya3RpbVtjb3VudF07DQogICAgICAgIGlmIChsZW5ndGggPj0gMSkgKmNocnB0cisrID0g JzAnICsgKHRpbXZhbCAvIDEwKTsNCiAgICAgICAgaWYgKGxlbmd0aCA+PSAyKSB7DQogICAgICAg ICAgICAqY2hycHRyKysgPSAnMCcgKyAodGltdmFsICUgMTApOw0KICAgICAgICAgICAgbGVuZ3Ro IC09IDI7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBsZW5ndGggPSAwOw0KICAgICAg ICB9DQogICAgICAgIGlmIChjb3VudCA8IDYgJiYgbGVuZ3RoID4gMCkgew0KICAgICAgICAgICAg bGVuZ3RoLS07DQogICAgICAgICAgICBpZiAoY291bnQgPT0gNSkgew0KICAgICAgICAgICAgICAg ICpjaHJwdHIrKyA9ICcuJzsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAg KmNocnB0cisrID0gJzonOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSB3aGlsZSAo Kytjb3VudCA8IDcpOw0KDQogICAgLyogV2UndmUgZG9uZSBpdCAtIHRpbWUgdG8gcmV0dXJuIGxl bmd0aC4uLiAqLw0KDQogICAgaWYgKHRpbWxlbiAhPSBOVUxMKSAqdGltbGVuID0gdGltYnVmLT5k c2Mkd19sZW5ndGggLSBsZW5ndGg7DQogICAgcmV0dXJuIFNTJF9OT1JNQUw7DQp9DQoNCg0KLyog bGliX2RheV9vZl93ZWVrKCkgY29tcHV0ZXMgZGF5IG9mIHdlZWsgZnJvbSBxdWFkd29yZC4uLiAq Lw0KDQp1bnNpZ25lZCBsaWJfZGF5X29mX3dlZWsoc3RydWN0IFRJTUUgKnRpbWFkcix1bnNpZ25l ZCAqd2Vla2RheSkNCnsNCiAgICBpbnQgZGF5czsNCiAgICByZWdpc3RlciB1bnNpZ25lZCBzdHM7 DQoNCiAgICAvKiBVc2UgbGliX2RheSB0byBjcmFjayBxdWFkd29yZC4uLiAqLw0KDQogICAgc3Rz ID0gbGliX2RheSgmZGF5cyx0aW1hZHIsTlVMTCk7DQogICAgaWYgKHN0cyAmIDEpIHsNCiAgICAg ICAgKndlZWtkYXkgPSAoKGRheXMgKyAyKSAlIDcpICsgMTsNCiAgICB9DQogICAgcmV0dXJuIHN0 czsNCn0NCg0KDQovKiBhZGR4ICYgc3VieCBDT1VMRCB1c2UgMzIgYml0IGFyaXRobWV0aWMgdG8g ZG8gYSB3b3JkIGF0IGEgdGltZS4gQnV0DQogICB0aGlzIG9ubHkgd29ya3Mgb24gaGFyZHdhcmUg d2hpY2ggaGFzIHRoZSBzYW1lIGVuZGlhbiBhcyB0aGUgVkFYIQ0KICAgKEludGVsIHdvcmtzIGZp bmUhISA6LSkgKSBTbyB0aGlzIHZlcnNpb24gd29ya3MgYnl0ZSBieSBieXRlIHdoaWNoDQogICBz aG91bGQgd29yayBvbiBWTVMgZGF0ZXMgcmVnYXJkbGVzcyBvZiBzeXN0ZW0gZW5kaWFuIC0gYnV0 IHRoZXkNCiAgIHdpbGwgTk9UIHBlcmZvcm0gYXJpdGhtZXRpYyBjb3JyZWN0bHkgZm9yIG5hdGl2 ZSBkYXRhIHR5cGVzIG9uDQogICBzeXN0ZW1zIHdpdGggb3Bwb3NpdGUgZW5kaWFuISEhICovDQoN CnVuc2lnbmVkIGxpYl9hZGR4KHZvaWQgKmFkZGFudCx2b2lkICphZGRlZSx2b2lkICpyZXN1bHQs aW50ICpsZW5hZGQpDQp7DQogICAgcmVnaXN0ZXIgY291bnQ7DQogICAgcmVnaXN0ZXIgdW5zaWdu ZWQgY2FycnkgPSAwOw0KICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgKmFudCA9ICh1bnNpZ25l ZCBjaGFyICopIGFkZGFudDsNCiAgICByZWdpc3RlciB1bnNpZ25lZCBjaGFyICplZSA9ICh1bnNp Z25lZCBjaGFyICopIGFkZGVlOw0KICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgKnJlcyA9ICh1 bnNpZ25lZCBjaGFyICopIHJlc3VsdDsNCiAgICBpZiAobGVuYWRkID09IE5VTEwpIHsNCiAgICAg ICAgY291bnQgPSA4Ow0KICAgIH0gZWxzZSB7DQogICAgICAgIGNvdW50ID0gKmxlbmFkZCAqIDQ7 DQogICAgfQ0KDQogICAgd2hpbGUgKGNvdW50LS0gPiAwKSB7DQogICAgICAgIGNhcnJ5ID0gKmFu dCsrICsgKGNhcnJ5ICsgKmVlKyspOw0KICAgICAgICAqcmVzKysgPSBjYXJyeTsNCiAgICAgICAg Y2FycnkgPSBjYXJyeSA+PiA4Ow0KICAgIH0NCiAgICByZXR1cm4gU1MkX05PUk1BTDsNCn0NCg0K DQp1bnNpZ25lZCBsaWJfc3VieCh2b2lkICpzdWJhbnQsdm9pZCAqc3ViZWUsdm9pZCAqcmVzdWx0 LGludCAqbGVuYWRkKQ0Kew0KICAgIHJlZ2lzdGVyIGNvdW50Ow0KICAgIHJlZ2lzdGVyIHVuc2ln bmVkIGNhcnJ5ID0gMDsNCiAgICByZWdpc3RlciB1bnNpZ25lZCBjaGFyICphbnQgPSAodW5zaWdu ZWQgY2hhciAqKSBzdWJhbnQ7DQogICAgcmVnaXN0ZXIgdW5zaWduZWQgY2hhciAqZWUgPSAodW5z aWduZWQgY2hhciAqKSBzdWJlZTsNCiAgICByZWdpc3RlciB1bnNpZ25lZCBjaGFyICpyZXMgPSAo dW5zaWduZWQgY2hhciAqKSByZXN1bHQ7DQogICAgaWYgKGxlbmFkZCA9PSBOVUxMKSB7DQogICAg ICAgIGNvdW50ID0gODsNCiAgICB9IGVsc2Ugew0KICAgICAgICBjb3VudCA9ICpsZW5hZGQgKiA0 Ow0KICAgIH0NCg0KICAgIHdoaWxlIChjb3VudC0tID4gMCkgew0KICAgICAgICBjYXJyeSA9ICph bnQrKyAtIChjYXJyeSArICplZSsrKTsNCiAgICAgICAgKnJlcysrID0gY2Fycnk7DQogICAgICAg IGNhcnJ5ID0gKGNhcnJ5ID4+IDgpICYgMTsNCg0KICAgIH0NCiAgICByZXR1cm4gU1MkX05PUk1B TDsNCn0NCg0KDQoNCnVuc2lnbmVkIGxpYl9hZGRfdGltZXMoc3RydWN0IFRJTUUgKnRpbWUxLHN0 cnVjdCBUSU1FICp0aW1lMiwNCiAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IFRJTUUgKnJl c3VsdCkNCnsNCiAgICBpZiAodGltZTEtPnRpbWVbN10gJiAweDgwKSB7DQogICAgICAgIGlmICh0 aW1lMi0+dGltZVs3XSAmIDB4ODApIHsNCiAgICAgICAgICAgIHJldHVybiBsaWJfYWRkeCh0aW1l MSx0aW1lMixyZXN1bHQsTlVMTCk7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICByZXR1 cm4gbGliX3N1YngodGltZTIsdGltZTEscmVzdWx0LE5VTEwpOw0KICAgICAgICB9DQogICAgfSBl bHNlIHsNCiAgICAgICAgaWYgKHRpbWUyLT50aW1lWzddICYgMHg4MCkgew0KICAgICAgICAgICAg cmV0dXJuIGxpYl9zdWJ4KHRpbWUxLHRpbWUyLHJlc3VsdCxOVUxMKTsNCiAgICAgICAgfSBlbHNl IHsNCiAgICAgICAgICAgIHJldHVybiBMSUIkX09ORURFTFRJTTsNCiAgICAgICAgfQ0KICAgIH0N Cn0NCg0KDQoNCnVuc2lnbmVkIGxpYl9zdWJfdGltZXMoc3RydWN0IFRJTUUgKnRpbWUxLHN0cnVj dCBUSU1FICp0aW1lMiwNCiAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IFRJTUUgKnJlc3Vs dCkNCnsNCiAgICBpZiAoKHRpbWUxLT50aW1lWzddICYgMHg4MCkgIT0gKHRpbWUyLT50aW1lWzdd ICYgMHg4MCkpIHsNCiAgICAgICAgcmV0dXJuIGxpYl9hZGR4KHRpbWUxLHRpbWUyLHJlc3VsdCxO VUxMKTsNCiAgICB9IGVsc2Ugew0KICAgICAgICByZWdpc3RlciBjbXAsY291bnQgPSA3Ow0KICAg ICAgICBkbyB7DQogICAgICAgICAgICBpZiAoKGNtcCA9ICh0aW1lMS0+dGltZVtjb3VudF0gLSB0 aW1lMi0+dGltZVtjb3VudF0pKSkgYnJlYWs7DQogICAgICAgIH0gd2hpbGUgKC0tY291bnQgPj0g MCk7DQogICAgICAgIGlmIChjbXAgPCAwKSB7DQogICAgICAgICAgICByZXR1cm4gbGliX3N1Yngo dGltZTEsdGltZTIscmVzdWx0LE5VTEwpOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAg cmV0dXJuIGxpYl9zdWJ4KHRpbWUyLHRpbWUxLHJlc3VsdCxOVUxMKTsNCiAgICAgICAgfQ0KICAg IH0NCn0NCg0KDQoNCnVuc2lnbmVkIGxpYl9tdWx0X2RlbHRhX3RpbWUoaW50ICptdWx0aXBsZSxz dHJ1Y3QgVElNRSAqdGltYWRyKQ0Kew0KICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGNvdW50ID0gOCxj YXJyeSA9IDA7DQogICAgcmVnaXN0ZXIgZmFjdG9yID0gKm11bHRpcGxlOw0KICAgIHJlZ2lzdGVy IHVuc2lnbmVkIGNoYXIgKnB0ciA9IHRpbWFkci0+dGltZTsNCg0KICAgIC8qIENoZWNrIGZvciBk ZWx0YSB0aW1lLi4uICovDQoNCiAgICBpZiAodGltYWRyLT50aW1lWzddICYgMHg4MCkgew0KDQog ICAgICAgIC8qIFVzZSBhYnNvbHV0ZSBmYWN0b3IuLi4gKi8NCg0KICAgICAgICBpZiAoZmFjdG9y IDwgMCkgZmFjdG9yID0gLWZhY3RvcjsNCg0KICAgICAgICAvKiBNdWx0aXBseSBkZWx0YSB0aW1l Li4uICovDQoNCiAgICAgICAgZG8gew0KICAgICAgICAgICAgY2FycnkgKz0gKnB0ciAqIGZhY3Rv cjsNCiAgICAgICAgICAgICpwdHIrKyA9IGNhcnJ5Ow0KICAgICAgICAgICAgY2FycnkgPSAoY2Fy cnkgPj4gOCk7DQogICAgICAgIH0gd2hpbGUgKC0tY291bnQgPiAwKTsNCg0KICAgICAgICByZXR1 cm4gU1MkX05PUk1BTDsNCiAgICB9IGVsc2Ugew0KICAgICAgICByZXR1cm4gU1MkX0lWVElNRTsN CiAgICB9DQp9DQo= --Boundary=_0.0_=5030200023881031--