LyogJE9wZW5CU0Q6IGNvbmYuaCx2IDEuMzAgMjAwNC8wNi8yNSAyMDoyNTozNCBoc2hvZXhlciBFeHAgJAkgKi8KLyogJEVPTTogY29uZi5oLHYgMS4xMyAyMDAwLzA5LzE4IDAwOjAxOjQ3IGhvIEV4cCAkCSAqLwoKLyoKICogQ29weXJpZ2h0IChjKSAxOTk4LCAxOTk5LCAyMDAxIE5pa2xhcyBIYWxscXZpc3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgogKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSOVrYW4gT2xzc29uLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KICoKICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwogKiBhcmUgbWV0OgogKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAogKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCiAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CiAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KICoKICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwogKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgogKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCiAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAogKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCiAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQogKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCiAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgogKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgogKi8KCi8qCiAqIFRoaXMgY29kZSB3YXMgd3JpdHRlbiB1bmRlciBmdW5kaW5nIGJ5IEVyaWNzc29uIFJhZGlvIFN5c3RlbXMuCiAqLwoKI2lmbmRlZiBfQ09ORkZJTEVfSF8KI2RlZmluZSBfQ09ORkZJTEVfSF8KCiNpbmNsdWRlIDxzeXMvcXVldWUuaD4KI2luY2x1ZGUgPGN0eXBlLmg+CgpzdHJ1Y3QgY29uZl9saXN0X25vZGUgewoJVEFJTFFfRU5UUlkoY29uZl9saXN0X25vZGUpIGxpbms7CgljaGFyCSpmaWVsZDsKfTsKCnN0cnVjdCBjb25mX2xpc3QgewoJc2l6ZV90CWNudDsKCVRBSUxRX0hFQUQoY29uZl9saXN0X2ZpZWxkc19oZWFkLCBjb25mX2xpc3Rfbm9kZSkgZmllbGRzOwp9OwoKZXh0ZXJuIGNoYXIgICAgKmNvbmZfcGF0aDsKCmV4dGVybiBpbnQgICAgICBjb25mX2JlZ2luKHZvaWQpOwpleHRlcm4gaW50ICAgICAgY29uZl9kZWNvZGVfYmFzZTY0KHVfaW50OF90ICosIHVfaW50MzJfdCAqLCB1X2NoYXIgKik7CmV4dGVybiBpbnQgICAgICBjb25mX2VuZChpbnQsIGludCk7CmV4dGVybiB2b2lkICAgICBjb25mX2ZyZWVfbGlzdChzdHJ1Y3QgY29uZl9saXN0ICopOwpleHRlcm4gc3RydWN0IHNvY2thZGRyICpjb25mX2dldF9hZGRyZXNzKGNoYXIgKiwgY2hhciAqKTsKZXh0ZXJuIHN0cnVjdCBjb25mX2xpc3QgKmNvbmZfZ2V0X2xpc3QoY2hhciAqLCBjaGFyICopOwpleHRlcm4gc3RydWN0IGNvbmZfbGlzdCAqY29uZl9nZXRfdGFnX2xpc3QoY2hhciAqLCBjaGFyICopOwpleHRlcm4gaW50ICAgICAgY29uZl9nZXRfbnVtKGNoYXIgKiwgY2hhciAqLCBpbnQpOwpleHRlcm4gY2hhciAgICAqY29uZl9nZXRfc3RyKGNoYXIgKiwgY2hhciAqKTsKZXh0ZXJuIGNoYXIgICAgKmNvbmZfZ2V0X3NlY3Rpb24oY2hhciAqLCBjaGFyICosIGNoYXIgKik7CmV4dGVybiB2b2lkICAgICBjb25mX2luaXQodm9pZCk7CmV4dGVybiBpbnQgICAgICBjb25mX21hdGNoX251bShjaGFyICosIGNoYXIgKiwgaW50KTsKZXh0ZXJuIHZvaWQgICAgIGNvbmZfcmVpbml0KHZvaWQpOwpleHRlcm4gaW50ICAgICAgY29uZl9yZW1vdmUoaW50LCBjaGFyICosIGNoYXIgKik7CmV4dGVybiBpbnQgICAgICBjb25mX3JlbW92ZV9zZWN0aW9uKGludCwgY2hhciAqKTsKZXh0ZXJuIHZvaWQgICAgIGNvbmZfcmVwb3J0KHZvaWQpOwoKLyoKICogQ29udmVydCBsZXR0ZXIgZnJvbSB1cHBlciBjYXNlIHRvIGxvd2VyIGNhc2UKICovCnN0YXRpYyBpbmxpbmUgdm9pZCB1cHBlcjJsb3dlcihjaGFyICpzdHIpCnsKCWNoYXIgYzsKCgl3aGlsZSAoKGMgPSB0b2xvd2VyKCpzdHIpKSkKCQkqc3RyKysgPSBjOwp9CgoKI2VuZGlmCQkJCS8qIF9DT05GRklMRV9IXyAqLwo=