LyogJE9wZW5CU0Q6IGNvbmYuaCx2IDEuMzAgMjAwNC8wNi8yNSAyMDoyNTozNCBoc2hvZXhlciBFeHAgJAkgKi8KLyogJEVPTTogY29uZi5oLHYgMS4xMyAyMDAwLzA5LzE4IDAwOjAxOjQ3IGhvIEV4cCAkCSAqLwoKLyoKICogQ29weXJpZ2h0IChjKSAxOTk4LCAxOTk5LCAyMDAxIE5pa2xhcyBIYWxscXZpc3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgogKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSOVrYW4gT2xzc29uLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KICoKICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwogKiBhcmUgbWV0OgogKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAogKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCiAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CiAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KICoKICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwogKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgogKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCiAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAogKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCiAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQogKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCiAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgogKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgogKi8KCi8qCiAqIFRoaXMgY29kZSB3YXMgd3JpdHRlbiB1bmRlciBmdW5kaW5nIGJ5IEVyaWNzc29uIFJhZGlvIFN5c3RlbXMuCiAqLwoKI2lmbmRlZiBfQ09ORkZJTEVfSF8KI2RlZmluZSBfQ09ORkZJTEVfSF8KCiNpbmNsdWRlIDxzeXMvcXVldWUuaD4KI2luY2x1ZGUgPGN0eXBlLmg+CgpzdHJ1Y3QgY29uZl9saXN0X25vZGUgewoJVEFJTFFfRU5UUlkoY29uZl9saXN0X25vZGUpIGxpbms7CgljaGFyCSpmaWVsZDsKfTsKCnN0cnVjdCBjb25mX2xpc3QgewoJc2l6ZV90CWNudDsKCVRBSUxRX0hFQUQoY29uZl9saXN0X2ZpZWxkc19oZWFkLCBjb25mX2xpc3Rfbm9kZSkgZmllbGRzOwp9OwoKZXh0ZXJuIGNoYXIgICAgKmNvbmZfcGF0aDsKCmV4dGVybiBpbnQgICAgICBjb25mX2JlZ2luKHZvaWQpOwpleHRlcm4gaW50ICAgICAgY29uZl9kZWNvZGVfYmFzZTY0KHVfaW50OF90ICosIHVfaW50MzJfdCAqLCB1X2NoYXIgKik7CmV4dGVybiBpbnQgICAgICBjb25mX2VuZChpbnQsIGludCk7CmV4dGVybiB2b2lkICAgICBjb25mX2ZyZWVfbGlzdChzdHJ1Y3QgY29uZl9saXN0ICopOwpleHRlcm4gc3RydWN0IHNvY2thZGRyICpjb25mX2dldF9hZGRyZXNzKGNoYXIgKiwgY2hhciAqKTsKZXh0ZXJuIHN0cnVjdCBjb25mX2xpc3QgKmNvbmZfZ2V0X2xpc3QoY2hhciAqLCBjaGFyICopOwpleHRlcm4gc3RydWN0IGNvbmZfbGlzdCAqY29uZl9nZXRfdGFnX2xpc3QoY2hhciAqKTsKZXh0ZXJuIGludCAgICAgIGNvbmZfZ2V0X251bShjaGFyICosIGNoYXIgKiwgaW50KTsKZXh0ZXJuIGNoYXIgICAgKmNvbmZfZ2V0X3N0cihjaGFyICosIGNoYXIgKik7CmV4dGVybiBjaGFyICAgICpjb25mX2dldF9zZWN0aW9uKGNoYXIgKiwgY2hhciAqLCBjaGFyICopOwpleHRlcm4gdm9pZCAgICAgY29uZl9pbml0KHZvaWQpOwpleHRlcm4gaW50ICAgICAgY29uZl9tYXRjaF9udW0oY2hhciAqLCBjaGFyICosIGludCk7CmV4dGVybiB2b2lkICAgICBjb25mX3JlaW5pdCh2b2lkKTsKZXh0ZXJuIGludCAgICAgIGNvbmZfcmVtb3ZlKGludCwgY2hhciAqLCBjaGFyICopOwpleHRlcm4gaW50ICAgICAgY29uZl9yZW1vdmVfc2VjdGlvbihpbnQsIGNoYXIgKik7CmV4dGVybiB2b2lkICAgICBjb25mX3JlcG9ydCh2b2lkKTsKCi8qCiAqIENvbnZlcnQgbGV0dGVyIGZyb20gdXBwZXIgY2FzZSB0byBsb3dlciBjYXNlCiAqLwpzdGF0aWMgaW5saW5lIHZvaWQgdXBwZXIybG93ZXIoY2hhciAqc3RyKQp7CgljaGFyIGM7CgoJd2hpbGUgKChjID0gdG9sb3dlcigqc3RyKSkpCgkJKnN0cisrID0gYzsKfQoKCiNlbmRpZgkJCQkvKiBfQ09ORkZJTEVfSF8gKi8K