LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CiAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KCiAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCgogIERlc2NyaXB0aW9uOiAgc291cmNlIGZpbGUgZm9yIEVwbC1LZXJuZWxzcGFjZS1FdmVudC1Nb2R1bAoKICBMaWNlbnNlOgoKICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCiAgICBhcmUgbWV0OgoKICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCgogICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCgogICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgoKICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCiAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUwogICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAogICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAogICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQogICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCgogICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKCiAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgogICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgogICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgogICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxFdmVudGsuYyx2ICQKCiAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAoKICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS45ICQgICREYXRlOiAyMDA4LzEwLzE3IDE1OjMyOjMyICQKCiAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCgogICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CiAgICAgICAgICAgICAgICAgICAgR0NDIFYzLjQKCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICBSZXZpc2lvbiBIaXN0b3J5OgoKICAyMDA2LzA2LzIwIGsudC46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uCgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKI2luY2x1ZGUgImtlcm5lbC9FcGxFdmVudGsuaCIKI2luY2x1ZGUgImtlcm5lbC9FcGxObXRrLmgiCiNpbmNsdWRlICJrZXJuZWwvRXBsRGxsay5oIgojaW5jbHVkZSAia2VybmVsL0VwbERsbGtDYWwuaCIKI2luY2x1ZGUgImtlcm5lbC9FcGxFcnJvckhhbmRsZXJrLmgiCiNpbmNsdWRlICJCZW5jaG1hcmsuaCIKCiNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1BET0spKSAhPSAwKQojaW5jbHVkZSAia2VybmVsL0VwbFBkb2suaCIKI2luY2x1ZGUgImtlcm5lbC9FcGxQZG9rQ2FsLmgiCiNlbmRpZgoKI2lmZGVmIEVQTF9OT19GSUZPCiNpbmNsdWRlICJ1c2VyL0VwbEV2ZW50dS5oIgojZWxzZQojaW5jbHVkZSAiU2hhcmVkQnVmZi5oIgojZW5kaWYKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgIEcgTCBPIEIgQSBMICAgRCBFIEYgSSBOIEkgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBjb25zdCBkZWZpbmVzCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgovLyBUcmFjZVBvaW50IHN1cHBvcnQgZm9yIHJlYWx0aW1lLWRlYnVnZ2luZwojaWZkZWYgX0RCR19UUkFDRV9QT0lOVFNfCnZvaWQgVGd0RGJnU2lnbmFsVHJhY2VQb2ludCh1OCBiVHJhY2VQb2ludE51bWJlcl9wKTsKdm9pZCBUZ3REYmdQb3N0VHJhY2VWYWx1ZSh1MzIgZHdUcmFjZVZhbHVlX3ApOwojZGVmaW5lIFRHVF9EQkdfU0lHTkFMX1RSQUNFX1BPSU5UKHApICAgVGd0RGJnU2lnbmFsVHJhY2VQb2ludChwKQojZGVmaW5lIFRHVF9EQkdfUE9TVF9UUkFDRV9WQUxVRSh2KSAgICAgVGd0RGJnUG9zdFRyYWNlVmFsdWUodikKI2Vsc2UKI2RlZmluZSBUR1RfREJHX1NJR05BTF9UUkFDRV9QT0lOVChwKQojZGVmaW5lIFRHVF9EQkdfUE9TVF9UUkFDRV9WQUxVRSh2KQojZW5kaWYKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIGxvY2FsIHR5cGVzCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgp0eXBlZGVmIHN0cnVjdCB7CiNpZm5kZWYgRVBMX05PX0ZJRk8KCXRTaGJJbnN0YW5jZSBtX3BTaGJLZXJuZWxUb1VzZXJJbnN0YW5jZTsKCXRTaGJJbnN0YW5jZSBtX3BTaGJVc2VyVG9LZXJuZWxJbnN0YW5jZTsKI2Vsc2UKCiNlbmRpZgoJdEVwbFN5bmNDYiBtX3BmbkNiU3luYzsKCXVuc2lnbmVkIGludCBtX3VpVXNlclRvS2VybmVsRnVsbENvdW50OwoKfSB0RXBsRXZlbnRrSW5zdGFuY2U7CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBtb2R1bCBnbG9iYWxlIHZhcnMKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3RhdGljIHRFcGxFdmVudGtJbnN0YW5jZSBFcGxFdmVudGtJbnN0YW5jZV9nOwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBsb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgovLyBjYWxsYmFjayBmdW5jdGlvbiBmb3IgaW5jb21pbmcgZXZlbnRzCiNpZm5kZWYgRVBMX05PX0ZJRk8Kc3RhdGljIHZvaWQgRXBsRXZlbnRrUnhTaWduYWxIYW5kbGVyQ2IodFNoYkluc3RhbmNlIHBTaGJSeEluc3RhbmNlX3AsCgkJCQkgICAgICAgdW5zaWduZWQgbG9uZyB1bERhdGFTaXplX3ApOwojZW5kaWYKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgIEMgTCBBIFMgUyAgPEVwbC1LZXJuZWxzcGFjZS1FdmVudD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8vCi8vIERlc2NyaXB0aW9uOgovLwovLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KLy8gICAgICAgICAgUCBVIEIgTCBJIEMgICBGIFUgTiBDIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vCi8vIEZ1bmN0aW9uOiAgICBFcGxFdmVudGtJbml0Ci8vCi8vIERlc2NyaXB0aW9uOiBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgZmlyc3QgaW5zdGFuY2UKLy8KLy8gUGFyYW1ldGVyczogIHBmbkNiU3luY19wID0gY2FsbGJhY2stZnVuY3Rpb24gZm9yIHN5bmMgZXZlbnQKLy8KLy8gUmV0dXJuczogICAgIHRFcEtlcm5lbCAgID0gZXJyb3Jjb2RlCi8vCi8vIFN0YXRlOgovLwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKdEVwbEtlcm5lbCBFcGxFdmVudGtJbml0KHRFcGxTeW5jQ2IgcGZuQ2JTeW5jX3ApCnsKCXRFcGxLZXJuZWwgUmV0OwoKCVJldCA9IEVwbEV2ZW50a0FkZEluc3RhbmNlKHBmbkNiU3luY19wKTsKCglyZXR1cm4gUmV0OwoKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8KLy8gRnVuY3Rpb246ICAgIEVwbEV2ZW50a0FkZEluc3RhbmNlCi8vCi8vIERlc2NyaXB0aW9uOiBmdW5jdGlvbiBhZGRzIG9uZSBtb3JlIGluc3RhbmNlCi8vCi8vIFBhcmFtZXRlcnM6ICBwZm5DYlN5bmNfcCA9IGNhbGxiYWNrLWZ1bmN0aW9uIGZvciBzeW5jIGV2ZW50Ci8vCi8vIFJldHVybnM6ICAgICB0RXBLZXJuZWwgICA9IGVycm9yY29kZQovLwovLyBTdGF0ZToKLy8KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCnRFcGxLZXJuZWwgRXBsRXZlbnRrQWRkSW5zdGFuY2UodEVwbFN5bmNDYiBwZm5DYlN5bmNfcCkKewoJdEVwbEtlcm5lbCBSZXQ7CiNpZm5kZWYgRVBMX05PX0ZJRk8KCXRTaGJFcnJvciBTaGJFcnJvcjsKCXVuc2lnbmVkIGludCBmU2hiTmV3Q3JlYXRlZDsKI2VuZGlmCgoJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CgoJLy8gaW5pdCBpbnN0YW5jZSBzdHJ1Y3R1cmUKCUVwbEV2ZW50a0luc3RhbmNlX2cubV91aVVzZXJUb0tlcm5lbEZ1bGxDb3VudCA9IDA7CgoJLy8gc2F2ZSBjYi1mdW5jdGlvbgoJRXBsRXZlbnRrSW5zdGFuY2VfZy5tX3BmbkNiU3luYyA9IHBmbkNiU3luY19wOwoKI2lmbmRlZiBFUExfTk9fRklGTwoJLy8gaW5pdCBzaGFyZWQgbG9vcCBidWZmZXIKCS8vIGtlcm5lbCAtPiB1c2VyCglTaGJFcnJvciA9IFNoYkNpckFsbG9jQnVmZmVyKEVQTF9FVkVOVF9TSVpFX1NIQl9LRVJORUxfVE9fVVNFUiwKCQkJCSAgICAgRVBMX0VWRU5UX05BTUVfU0hCX0tFUk5FTF9UT19VU0VSLAoJCQkJICAgICAmRXBsRXZlbnRrSW5zdGFuY2VfZy4KCQkJCSAgICAgbV9wU2hiS2VybmVsVG9Vc2VySW5zdGFuY2UsCgkJCQkgICAgICZmU2hiTmV3Q3JlYXRlZCk7CglpZiAoU2hiRXJyb3IgIT0ga1NoYk9rKSB7CgkJRVBMX0RCR0xWTF9FVkVOVEtfVFJBQ0UxCgkJICAgICgiRXBsRXZlbnRrQWRkSW5zdGFuY2UoKTogU2hiQ2lyQWxsb2NCdWZmZXIoSzJVKSAtPiAweCVYXG4iLAoJCSAgICAgU2hiRXJyb3IpOwoJCVJldCA9IGtFcGxOb1Jlc291cmNlOwoJCWdvdG8gRXhpdDsKCX0KCS8vIHVzZXIgLT4ga2VybmVsCglTaGJFcnJvciA9IFNoYkNpckFsbG9jQnVmZmVyKEVQTF9FVkVOVF9TSVpFX1NIQl9VU0VSX1RPX0tFUk5FTCwKCQkJCSAgICAgRVBMX0VWRU5UX05BTUVfU0hCX1VTRVJfVE9fS0VSTkVMLAoJCQkJICAgICAmRXBsRXZlbnRrSW5zdGFuY2VfZy4KCQkJCSAgICAgbV9wU2hiVXNlclRvS2VybmVsSW5zdGFuY2UsCgkJCQkgICAgICZmU2hiTmV3Q3JlYXRlZCk7CglpZiAoU2hiRXJyb3IgIT0ga1NoYk9rKSB7CgkJRVBMX0RCR0xWTF9FVkVOVEtfVFJBQ0UxCgkJICAgICgiRXBsRXZlbnRrQWRkSW5zdGFuY2UoKTogU2hiQ2lyQWxsb2NCdWZmZXIoVTJLKSAtPiAweCVYXG4iLAoJCSAgICAgU2hiRXJyb3IpOwoJCVJldCA9IGtFcGxOb1Jlc291cmNlOwoJCWdvdG8gRXhpdDsKCX0KCS8vIHJlZ2lzdGVyIGV2ZW50aGFuZGxlcgoJU2hiRXJyb3IgPQoJICAgIFNoYkNpclNldFNpZ25hbEhhbmRsZXJOZXdEYXRhKEVwbEV2ZW50a0luc3RhbmNlX2cuCgkJCQkJICBtX3BTaGJVc2VyVG9LZXJuZWxJbnN0YW5jZSwKCQkJCQkgIEVwbEV2ZW50a1J4U2lnbmFsSGFuZGxlckNiLAoJCQkJCSAga3NoYlByaW9yaXR5SGlnaCk7CglpZiAoU2hiRXJyb3IgIT0ga1NoYk9rKSB7CgkJRVBMX0RCR0xWTF9FVkVOVEtfVFJBQ0UxCgkJICAgICgiRXBsRXZlbnRrQWRkSW5zdGFuY2UoKTogU2hiQ2lyU2V0U2lnbmFsSGFuZGxlck5ld0RhdGEoVTJLKSAtPiAweCVYXG4iLAoJCSAgICAgU2hiRXJyb3IpOwoJCVJldCA9IGtFcGxOb1Jlc291cmNlOwoJCWdvdG8gRXhpdDsKCX0KCiAgICAgIEV4aXQ6CiNlbmRpZgoKCXJldHVybiBSZXQ7Cgp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLwovLyBGdW5jdGlvbjogICAgRXBsRXZlbnRrRGVsSW5zdGFuY2UKLy8KLy8gRGVzY3JpcHRpb246IGZ1bmN0aW9uIGRlbGV0ZXMgaW5zdGFuY2UgYW5kIGZyZWVzIHRoZSBidWZmZXJzCi8vCi8vIFBhcmFtZXRlcnM6ICB2b2lkCi8vCi8vIFJldHVybnM6ICAgICB0RXBLZXJuZWwgICA9IGVycm9yY29kZQovLwovLyBTdGF0ZToKLy8KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCnRFcGxLZXJuZWwgRXBsRXZlbnRrRGVsSW5zdGFuY2Uodm9pZCkKewoJdEVwbEtlcm5lbCBSZXQ7CiNpZm5kZWYgRVBMX05PX0ZJRk8KCXRTaGJFcnJvciBTaGJFcnJvcjsKI2VuZGlmCgoJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CgojaWZuZGVmIEVQTF9OT19GSUZPCgkvLyBzZXQgZXZlbnRoYW5kbGVyIHRvIE5VTEwKCVNoYkVycm9yID0KCSAgICBTaGJDaXJTZXRTaWduYWxIYW5kbGVyTmV3RGF0YShFcGxFdmVudGtJbnN0YW5jZV9nLgoJCQkJCSAgbV9wU2hiVXNlclRvS2VybmVsSW5zdGFuY2UsIE5VTEwsCgkJCQkJICBrU2hiUHJpb3JpdHlOb3JtYWwpOwoJaWYgKFNoYkVycm9yICE9IGtTaGJPaykgewoJCUVQTF9EQkdMVkxfRVZFTlRLX1RSQUNFMQoJCSAgICAoIkVwbEV2ZW50a0RlbEluc3RhbmNlKCk6IFNoYkNpclNldFNpZ25hbEhhbmRsZXJOZXdEYXRhKFUySykgLT4gMHglWFxuIiwKCQkgICAgIFNoYkVycm9yKTsKCQlSZXQgPSBrRXBsTm9SZXNvdXJjZTsKCX0KCS8vIGZyZWUgYnVmZmVyIFVzZXIgLT4gS2VybmVsCglTaGJFcnJvciA9CgkgICAgU2hiQ2lyUmVsZWFzZUJ1ZmZlcihFcGxFdmVudGtJbnN0YW5jZV9nLm1fcFNoYlVzZXJUb0tlcm5lbEluc3RhbmNlKTsKCWlmIChTaGJFcnJvciAhPSBrU2hiT2spIHsKCQlFUExfREJHTFZMX0VWRU5US19UUkFDRTEKCQkgICAgKCJFcGxFdmVudGtEZWxJbnN0YW5jZSgpOiBTaGJDaXJSZWxlYXNlQnVmZmVyKFUySykgLT4gMHglWFxuIiwKCQkgICAgIFNoYkVycm9yKTsKCQlSZXQgPSBrRXBsTm9SZXNvdXJjZTsKCX0gZWxzZSB7CgkJRXBsRXZlbnRrSW5zdGFuY2VfZy5tX3BTaGJVc2VyVG9LZXJuZWxJbnN0YW5jZSA9IE5VTEw7Cgl9CgoJLy8gZnJlZSBidWZmZXIgIEtlcm5lbCAtPiBVc2VyCglTaGJFcnJvciA9CgkgICAgU2hiQ2lyUmVsZWFzZUJ1ZmZlcihFcGxFdmVudGtJbnN0YW5jZV9nLm1fcFNoYktlcm5lbFRvVXNlckluc3RhbmNlKTsKCWlmIChTaGJFcnJvciAhPSBrU2hiT2spIHsKCQlFUExfREJHTFZMX0VWRU5US19UUkFDRTEKCQkgICAgKCJFcGxFdmVudGtEZWxJbnN0YW5jZSgpOiBTaGJDaXJSZWxlYXNlQnVmZmVyKEsyVSkgLT4gMHglWFxuIiwKCQkgICAgIFNoYkVycm9yKTsKCQlSZXQgPSBrRXBsTm9SZXNvdXJjZTsKCX0gZWxzZSB7CgkJRXBsRXZlbnRrSW5zdGFuY2VfZy5tX3BTaGJLZXJuZWxUb1VzZXJJbnN0YW5jZSA9IE5VTEw7Cgl9CiNlbmRpZgoKCXJldHVybiBSZXQ7Cgp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLwovLyBGdW5jdGlvbjogICAgRXBsRXZlbnRrUHJvY2VzcwovLwovLyBEZXNjcmlwdGlvbjogS2VybmVsdGhyZWFkIHRoYXQgZGlzcGF0Y2hlcyBldmVudHMgaW4ga2VybmVsIHBhcnQKLy8KLy8gUGFyYW1ldGVyczogIHBFdmVudF9wICAgID0gcG9pbnRlciB0byBldmVudC1zdHJ1Y3R1cmUgZnJvbSBidWZmZXIKLy8KLy8gUmV0dXJuczogICAgIHRFcEtlcm5lbCAgID0gZXJyb3Jjb2RlCi8vCi8vIFN0YXRlOgovLwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKdEVwbEtlcm5lbCBFcGxFdmVudGtQcm9jZXNzKHRFcGxFdmVudCAqcEV2ZW50X3ApCnsKCXRFcGxLZXJuZWwgUmV0OwoJdEVwbEV2ZW50U291cmNlIEV2ZW50U291cmNlOwoKCVJldCA9IGtFcGxTdWNjZXNzZnVsOwoKCS8vIGVycm9yIGhhbmRsaW5nIGlmIGV2ZW50IHF1ZXVlIGlzIGZ1bGwKCWlmIChFcGxFdmVudGtJbnN0YW5jZV9nLm1fdWlVc2VyVG9LZXJuZWxGdWxsQ291bnQgPiAwKSB7CS8vIFVzZXJUb0tlcm5lbCBldmVudCBxdWV1ZSBoYXMgcnVuIG91dCBvZiBzcGFjZSAtPiBrRXBsTm10RXZlbnRJbnRlcm5Db21FcnJvcgojaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVEspKSAhPSAwKQoJCXRFcGxFdmVudCBFdmVudDsKCQl0RXBsTm10RXZlbnQgTm10RXZlbnQ7CiNlbmRpZgojaWZuZGVmIEVQTF9OT19GSUZPCgkJdFNoYkVycm9yIFNoYkVycm9yOwojZW5kaWYKCgkJLy8gZGlyZWN0bHkgY2FsbCBOTVRrIHByb2Nlc3MgZnVuY3Rpb24sIGJlY2F1c2UgZXZlbnQgcXVldWUgaXMgZnVsbAojaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVEspKSAhPSAwKQoJCU5tdEV2ZW50ID0ga0VwbE5tdEV2ZW50SW50ZXJuQ29tRXJyb3I7CgkJRXZlbnQubV9FdmVudFNpbmsgPSBrRXBsRXZlbnRTaW5rTm10azsKCQlFdmVudC5tX05ldFRpbWUubV9kd05hbm9TZWMgPSAwOwoJCUV2ZW50Lm1fTmV0VGltZS5tX2R3U2VjID0gMDsKCQlFdmVudC5tX0V2ZW50VHlwZSA9IGtFcGxFdmVudFR5cGVObXRFdmVudDsKCQlFdmVudC5tX3BBcmcgPSAmTm10RXZlbnQ7CgkJRXZlbnQubV91aVNpemUgPSBzaXplb2YoTm10RXZlbnQpOwoJCVJldCA9IEVwbE5tdGtQcm9jZXNzKCZFdmVudCk7CiNlbmRpZgoKCQkvLyBOTVQgc3RhdGUgbWFjaGluZSBjaGFuZ2VkIHRvIHJlc2V0IChpLmUuIE5NVF9HU19SRVNFVF9DT01NVU5JQ0FUSU9OKQoJCS8vIG5vdywgaXQgaXMgc2FmZSB0byByZXNldCB0aGUgY291bnRlciBhbmQgZW1wdHkgdGhlIGV2ZW50IHF1ZXVlCiNpZm5kZWYgRVBMX05PX0ZJRk8KCQlTaGJFcnJvciA9CgkJICAgIFNoYkNpclJlc2V0QnVmZmVyKEVwbEV2ZW50a0luc3RhbmNlX2cuCgkJCQkgICAgICBtX3BTaGJVc2VyVG9LZXJuZWxJbnN0YW5jZSwgMTAwMCwgTlVMTCk7CiNlbmRpZgoKCQlFcGxFdmVudGtJbnN0YW5jZV9nLm1fdWlVc2VyVG9LZXJuZWxGdWxsQ291bnQgPSAwOwoJCVRHVF9EQkdfU0lHTkFMX1RSQUNFX1BPSU5UKDIyKTsKCgkJLy8gYWxzbyBkaXNjYXJkIHRoZSBjdXJyZW50IGV2ZW50IChpdCBkb2Vzbid0IG1hdHRlciBpZiB3ZSBsb3NlIGFub3RoZXIgZXZlbnQpCgkJZ290byBFeGl0OwoJfQoJLy8gY2hlY2sgbV9FdmVudFNpbmsKCXN3aXRjaCAocEV2ZW50X3AtPm1fRXZlbnRTaW5rKSB7CgljYXNlIGtFcGxFdmVudFNpbmtTeW5jOgoJCXsKCQkJaWYgKEVwbEV2ZW50a0luc3RhbmNlX2cubV9wZm5DYlN5bmMgIT0gTlVMTCkgewoJCQkJUmV0ID0gRXBsRXZlbnRrSW5zdGFuY2VfZy5tX3BmbkNiU3luYygpOwoJCQkJaWYgKFJldCA9PSBrRXBsU3VjY2Vzc2Z1bCkgewojaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9QRE9LKSkgIT0gMCkKCQkJCQkvLyBtYXJrIFRQRE9zIGFzIHZhbGlkCgkJCQkJUmV0ID0gRXBsUGRva0NhbFNldFRwZG9zVmFsaWQoVFJVRSk7CiNlbmRpZgoJCQkJfSBlbHNlIGlmICgoUmV0ICE9IGtFcGxSZWplY3QpCgkJCQkJICAgJiYgKFJldCAhPSBrRXBsU2h1dGRvd24pKSB7CgkJCQkJRXZlbnRTb3VyY2UgPSBrRXBsRXZlbnRTb3VyY2VTeW5jQ2I7CgoJCQkJCS8vIEVycm9yIGV2ZW50IGZvciBBUEkgbGF5ZXIKCQkJCQlFcGxFdmVudGtQb3N0RXJyb3IKCQkJCQkgICAgKGtFcGxFdmVudFNvdXJjZUV2ZW50aywgUmV0LAoJCQkJCSAgICAgc2l6ZW9mKEV2ZW50U291cmNlKSwgJkV2ZW50U291cmNlKTsKCQkJCX0KCQkJfQoJCQlicmVhazsKCQl9CgoJCS8vIE5NVC1LZXJuZWwtTW9kdWwKCWNhc2Uga0VwbEV2ZW50U2lua05tdGs6CgkJewojaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVEspKSAhPSAwKQoJCQlSZXQgPSBFcGxObXRrUHJvY2VzcyhwRXZlbnRfcCk7CgkJCWlmICgoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSAmJiAoUmV0ICE9IGtFcGxTaHV0ZG93bikpIHsKCQkJCUV2ZW50U291cmNlID0ga0VwbEV2ZW50U291cmNlTm10azsKCgkJCQkvLyBFcnJvciBldmVudCBmb3IgQVBJIGxheWVyCgkJCQlFcGxFdmVudGtQb3N0RXJyb3Ioa0VwbEV2ZW50U291cmNlRXZlbnRrLAoJCQkJCQkgICBSZXQsCgkJCQkJCSAgIHNpemVvZihFdmVudFNvdXJjZSksCgkJCQkJCSAgICZFdmVudFNvdXJjZSk7CgkJCX0KI2VuZGlmCiNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfRExMSykpICE9IDApCgkJCWlmICgocEV2ZW50X3AtPm1fRXZlbnRUeXBlID09IGtFcGxFdmVudFR5cGVObXRFdmVudCkKCQkJICAgICYmCgkJCSAgICAoKCooKHRFcGxObXRFdmVudCAqKSBwRXZlbnRfcC0+bV9wQXJnKSA9PQoJCQkgICAgICBrRXBsTm10RXZlbnREbGxDZVNvYSkKI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfTk1UX01OKSkgIT0gMCkKCQkJICAgICB8fCAoKigodEVwbE5tdEV2ZW50ICopIHBFdmVudF9wLT5tX3BBcmcpID09CgkJCQkga0VwbE5tdEV2ZW50RGxsTWVTb2FTZW50KQojZW5kaWYKCQkJICAgICkpIHsJLy8gZm9yd2FyZCBTb0EgZXZlbnQgdG8gZXJyb3IgaGFuZGxlcgoJCQkJUmV0ID0gRXBsRXJyb3JIYW5kbGVya1Byb2Nlc3MocEV2ZW50X3ApOwoJCQkJaWYgKChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpCgkJCQkgICAgJiYgKFJldCAhPSBrRXBsU2h1dGRvd24pKSB7CgkJCQkJRXZlbnRTb3VyY2UgPSBrRXBsRXZlbnRTb3VyY2VFcnJrOwoKCQkJCQkvLyBFcnJvciBldmVudCBmb3IgQVBJIGxheWVyCgkJCQkJRXBsRXZlbnRrUG9zdEVycm9yCgkJCQkJICAgIChrRXBsRXZlbnRTb3VyY2VFdmVudGssIFJldCwKCQkJCQkgICAgIHNpemVvZihFdmVudFNvdXJjZSksICZFdmVudFNvdXJjZSk7CgkJCQl9CiNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1BET0spKSAhPSAwKQoJCQkJLy8gZm9yd2FyZCBTb0EgZXZlbnQgdG8gUERPIG1vZHVsZQoJCQkJcEV2ZW50X3AtPm1fRXZlbnRUeXBlID0ga0VwbEV2ZW50VHlwZVBkb1NvYTsKCQkJCVJldCA9IEVwbFBkb2tQcm9jZXNzKHBFdmVudF9wKTsKCQkJCWlmICgoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKQoJCQkJICAgICYmIChSZXQgIT0ga0VwbFNodXRkb3duKSkgewoJCQkJCUV2ZW50U291cmNlID0ga0VwbEV2ZW50U291cmNlUGRvazsKCgkJCQkJLy8gRXJyb3IgZXZlbnQgZm9yIEFQSSBsYXllcgoJCQkJCUVwbEV2ZW50a1Bvc3RFcnJvcgoJCQkJCSAgICAoa0VwbEV2ZW50U291cmNlRXZlbnRrLCBSZXQsCgkJCQkJICAgICBzaXplb2YoRXZlbnRTb3VyY2UpLCAmRXZlbnRTb3VyY2UpOwoJCQkJfQojZW5kaWYKCgkJCX0KCQkJYnJlYWs7CiNlbmRpZgoJCX0KCgkJLy8gZXZlbnRzIGZvciBEbGxrIG1vZHVsZQoJY2FzZSBrRXBsRXZlbnRTaW5rRGxsazoKCQl7CiNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfRExMSykpICE9IDApCgkJCVJldCA9IEVwbERsbGtQcm9jZXNzKHBFdmVudF9wKTsKCQkJaWYgKChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpICYmIChSZXQgIT0ga0VwbFNodXRkb3duKSkgewoJCQkJRXZlbnRTb3VyY2UgPSBrRXBsRXZlbnRTb3VyY2VEbGxrOwoKCQkJCS8vIEVycm9yIGV2ZW50IGZvciBBUEkgbGF5ZXIKCQkJCUVwbEV2ZW50a1Bvc3RFcnJvcihrRXBsRXZlbnRTb3VyY2VFdmVudGssCgkJCQkJCSAgIFJldCwKCQkJCQkJICAgc2l6ZW9mKEV2ZW50U291cmNlKSwKCQkJCQkJICAgJkV2ZW50U291cmNlKTsKCQkJfQojZW5kaWYKCQkJYnJlYWs7CgkJfQoKCQkvLyBldmVudHMgZm9yIERsbGtDYWwgbW9kdWxlCgljYXNlIGtFcGxFdmVudFNpbmtEbGxrQ2FsOgoJCXsKI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9ETExLKSkgIT0gMCkKCQkJUmV0ID0gRXBsRGxsa0NhbFByb2Nlc3MocEV2ZW50X3ApOwoJCQlpZiAoKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgJiYgKFJldCAhPSBrRXBsU2h1dGRvd24pKSB7CgkJCQlFdmVudFNvdXJjZSA9IGtFcGxFdmVudFNvdXJjZURsbGs7CgoJCQkJLy8gRXJyb3IgZXZlbnQgZm9yIEFQSSBsYXllcgoJCQkJRXBsRXZlbnRrUG9zdEVycm9yKGtFcGxFdmVudFNvdXJjZUV2ZW50aywKCQkJCQkJICAgUmV0LAoJCQkJCQkgICBzaXplb2YoRXZlbnRTb3VyY2UpLAoJCQkJCQkgICAmRXZlbnRTb3VyY2UpOwoJCQl9CiNlbmRpZgoJCQlicmVhazsKCQl9CgoJCS8vCgljYXNlIGtFcGxFdmVudFNpbmtQZG9rOgoJCXsKCQkJLy8gUERPLU1vZHVsZQojaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9QRE9LKSkgIT0gMCkKCQkJUmV0ID0gRXBsUGRva1Byb2Nlc3MocEV2ZW50X3ApOwoJCQlpZiAoKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgJiYgKFJldCAhPSBrRXBsU2h1dGRvd24pKSB7CgkJCQlFdmVudFNvdXJjZSA9IGtFcGxFdmVudFNvdXJjZVBkb2s7CgoJCQkJLy8gRXJyb3IgZXZlbnQgZm9yIEFQSSBsYXllcgoJCQkJRXBsRXZlbnRrUG9zdEVycm9yKGtFcGxFdmVudFNvdXJjZUV2ZW50aywKCQkJCQkJICAgUmV0LAoJCQkJCQkgICBzaXplb2YoRXZlbnRTb3VyY2UpLAoJCQkJCQkgICAmRXZlbnRTb3VyY2UpOwoJCQl9CiNlbmRpZgoJCQlicmVhazsKCQl9CgoJCS8vIGV2ZW50cyBmb3IgRXJyb3IgaGFuZGxlciBtb2R1bGUKCWNhc2Uga0VwbEV2ZW50U2lua0Vycms6CgkJewoJCQkvLyBvbmx5IGNhbGwgZXJyb3IgaGFuZGxlciBpZiBETEwgaXMgcHJlc2VudAojaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX0RMTEspKSAhPSAwKQoJCQlSZXQgPSBFcGxFcnJvckhhbmRsZXJrUHJvY2VzcyhwRXZlbnRfcCk7CgkJCWlmICgoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSAmJiAoUmV0ICE9IGtFcGxTaHV0ZG93bikpIHsKCQkJCUV2ZW50U291cmNlID0ga0VwbEV2ZW50U291cmNlRXJyazsKCgkJCQkvLyBFcnJvciBldmVudCBmb3IgQVBJIGxheWVyCgkJCQlFcGxFdmVudGtQb3N0RXJyb3Ioa0VwbEV2ZW50U291cmNlRXZlbnRrLAoJCQkJCQkgICBSZXQsCgkJCQkJCSAgIHNpemVvZihFdmVudFNvdXJjZSksCgkJCQkJCSAgICZFdmVudFNvdXJjZSk7CgkJCX0KCQkJYnJlYWs7CiNlbmRpZgoJCX0KCgkJLy8gdW5rbm93biBzaW5rCglkZWZhdWx0OgoJCXsKCQkJUmV0ID0ga0VwbEV2ZW50VW5rbm93blNpbms7CgkJfQoKCX0JCQkvLyBlbmQgb2Ygc3dpdGNoKHBFdmVudF9wLT5tX0V2ZW50U2luaykKCiAgICAgIEV4aXQ6CglyZXR1cm4gUmV0OwoKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8KLy8gRnVuY3Rpb246ICAgIEVwbEV2ZW50a1Bvc3QKLy8KLy8gRGVzY3JpcHRpb246IHBvc3QgZXZlbnRzIGZyb20ga2VybmVsIHBhcnQKLy8KLy8gUGFyYW1ldGVyczogIHBFdmVudF9wICAgID0gcG9pbnRlciB0byBldmVudC1zdHJ1Y3R1cmUgZnJvbSBidWZmZXIKLy8KLy8gUmV0dXJuczogICAgIHRFcEtlcm5lbCAgID0gZXJyb3Jjb2RlCi8vCi8vIFN0YXRlOgovLwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKdEVwbEtlcm5lbCBFcGxFdmVudGtQb3N0KHRFcGxFdmVudCAqcEV2ZW50X3ApCnsKCXRFcGxLZXJuZWwgUmV0OwojaWZuZGVmIEVQTF9OT19GSUZPCgl0U2hiRXJyb3IgU2hiRXJyb3I7Cgl0U2hiQ2lyQ2h1bmsgU2hiQ2lyQ2h1bms7Cgl1bnNpZ25lZCBsb25nIHVsRGF0YVNpemU7Cgl1bnNpZ25lZCBpbnQgZkJ1ZmZlckNvbXBsZXRlZDsKI2VuZGlmCgoJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CgoJLy8gdGhlIGV2ZW50IG11c3QgYmUgcG9zdGVkIGJ5IHVzaW5nIHRoZSBhYkJ1ZmZlcgoJLy8gaXQgaXMgbmVlZGUgYmVjYXVzZSB0aGUgQXJndW1lbnQgbXVzdCBieSBjb3BpZWQKCS8vIHRvIHRoZSBidWZmZXIgdG9vIGFuZCBub3Qgb25seSB0aGUgcG9pbnRlcgoKI2lmbmRlZiBFUExfTk9fRklGTwoJLy8gMjAwNi8wOC8wMyBkLmsuOiBFdmVudCBhbmQgYXJndW1lbnQgYXJlIHBvc3RlZCBhcyBzZXBhcmF0ZSBjaHVua3MgdG8gdGhlIGV2ZW50IHF1ZXVlLgoJdWxEYXRhU2l6ZSA9CgkgICAgc2l6ZW9mKHRFcGxFdmVudCkgKwoJICAgICgocEV2ZW50X3AtPm1fcEFyZyAhPSBOVUxMKSA/IHBFdmVudF9wLT5tX3VpU2l6ZSA6IDApOwojZW5kaWYKCgkvLyBkZWNpZGUgaW4gd2hpY2ggYnVmZmVyIHRoZSBldmVudCBoYXZlIHRvIHdyaXRlCglzd2l0Y2ggKHBFdmVudF9wLT5tX0V2ZW50U2luaykgewoJCS8vIGtlcm5lbHNwYWNlIG1vZHVsZXMKCWNhc2Uga0VwbEV2ZW50U2lua1N5bmM6CgljYXNlIGtFcGxFdmVudFNpbmtObXRrOgoJY2FzZSBrRXBsRXZlbnRTaW5rRGxsazoKCWNhc2Uga0VwbEV2ZW50U2lua0RsbGtDYWw6CgljYXNlIGtFcGxFdmVudFNpbmtQZG9rOgoJY2FzZSBrRXBsRXZlbnRTaW5rRXJyazoKCQl7CiNpZm5kZWYgRVBMX05PX0ZJRk8KCQkJLy8gcG9zdCBtZXNzYWdlCgkJCUJFTkNITUFSS19NT0RfMjdfU0VUKDIpOwoJCQlTaGJFcnJvciA9CgkJCSAgICBTaGJDaXJBbGxvY0RhdGFCbG9jayhFcGxFdmVudGtJbnN0YW5jZV9nLgoJCQkJCQkgbV9wU2hiVXNlclRvS2VybmVsSW5zdGFuY2UsCgkJCQkJCSAmU2hiQ2lyQ2h1bmssIHVsRGF0YVNpemUpOwoJCQlzd2l0Y2ggKFNoYkVycm9yKSB7CgkJCWNhc2Uga1NoYk9rOgoJCQkJYnJlYWs7CgoJCQljYXNlIGtTaGJCdWZmZXJGdWxsOgoJCQkJewoJCQkJCUVwbEV2ZW50a0luc3RhbmNlX2cuCgkJCQkJICAgIG1fdWlVc2VyVG9LZXJuZWxGdWxsQ291bnQrKzsKCQkJCQlSZXQgPSBrRXBsRXZlbnRQb3N0RXJyb3I7CgkJCQkJZ290byBFeGl0OwoJCQkJfQoKCQkJZGVmYXVsdDoKCQkJCXsKCQkJCQlFUExfREJHTFZMX0VWRU5US19UUkFDRTEKCQkJCQkgICAgKCJFcGxFdmVudGtQb3N0KCk6IFNoYkNpckFsbG9jRGF0YUJsb2NrKFUySykgLT4gMHglWFxuIiwKCQkJCQkgICAgIFNoYkVycm9yKTsKCQkJCQlSZXQgPSBrRXBsRXZlbnRQb3N0RXJyb3I7CgkJCQkJZ290byBFeGl0OwoJCQkJfQoJCQl9CgkJCVNoYkVycm9yID0KCQkJICAgIFNoYkNpcldyaXRlRGF0YUNodW5rKEVwbEV2ZW50a0luc3RhbmNlX2cuCgkJCQkJCSBtX3BTaGJVc2VyVG9LZXJuZWxJbnN0YW5jZSwKCQkJCQkJICZTaGJDaXJDaHVuaywgcEV2ZW50X3AsCgkJCQkJCSBzaXplb2YodEVwbEV2ZW50KSwKCQkJCQkJICZmQnVmZmVyQ29tcGxldGVkKTsKCQkJaWYgKFNoYkVycm9yICE9IGtTaGJPaykgewoJCQkJRVBMX0RCR0xWTF9FVkVOVEtfVFJBQ0UxCgkJCQkgICAgKCJFcGxFdmVudGtQb3N0KCk6IFNoYkNpcldyaXRlRGF0YUNodW5rKFUySykgLT4gMHglWFxuIiwKCQkJCSAgICAgU2hiRXJyb3IpOwoJCQkJUmV0ID0ga0VwbEV2ZW50UG9zdEVycm9yOwoJCQkJZ290byBFeGl0OwoJCQl9CgkJCWlmIChmQnVmZmVyQ29tcGxldGVkID09IEZBTFNFKSB7CgkJCQlTaGJFcnJvciA9CgkJCQkgICAgU2hiQ2lyV3JpdGVEYXRhQ2h1bmsoRXBsRXZlbnRrSW5zdGFuY2VfZy4KCQkJCQkJCSBtX3BTaGJVc2VyVG9LZXJuZWxJbnN0YW5jZSwKCQkJCQkJCSAmU2hiQ2lyQ2h1bmssCgkJCQkJCQkgcEV2ZW50X3AtPm1fcEFyZywKCQkJCQkJCSAodW5zaWduZWQgbG9uZykKCQkJCQkJCSBwRXZlbnRfcC0+bV91aVNpemUsCgkJCQkJCQkgJmZCdWZmZXJDb21wbGV0ZWQpOwoJCQkJaWYgKChTaGJFcnJvciAhPSBrU2hiT2spCgkJCQkgICAgfHwgKGZCdWZmZXJDb21wbGV0ZWQgPT0gRkFMU0UpKSB7CgkJCQkJRVBMX0RCR0xWTF9FVkVOVEtfVFJBQ0UxCgkJCQkJICAgICgiRXBsRXZlbnRrUG9zdCgpOiBTaGJDaXJXcml0ZURhdGFDaHVuazIoVTJLKSAtPiAweCVYXG4iLAoJCQkJCSAgICAgU2hiRXJyb3IpOwoJCQkJCVJldCA9IGtFcGxFdmVudFBvc3RFcnJvcjsKCQkJCQlnb3RvIEV4aXQ7CgkJCQl9CgkJCX0KCQkJQkVOQ0hNQVJLX01PRF8yN19SRVNFVCgyKTsKCiNlbHNlCgkJCVJldCA9IEVwbEV2ZW50a1Byb2Nlc3MocEV2ZW50X3ApOwojZW5kaWYKCgkJCWJyZWFrOwoJCX0KCgkJLy8gdXNlcnNwYWNlIG1vZHVsZXMKCWNhc2Uga0VwbEV2ZW50U2lua05tdHU6CgljYXNlIGtFcGxFdmVudFNpbmtObXRNbnU6CgljYXNlIGtFcGxFdmVudFNpbmtTZG9Bc3lTZXE6CgljYXNlIGtFcGxFdmVudFNpbmtBcGk6CgljYXNlIGtFcGxFdmVudFNpbmtEbGx1Q2FsOgoJY2FzZSBrRXBsRXZlbnRTaW5rRXJydToKCQl7CiNpZm5kZWYgRVBMX05PX0ZJRk8KCQkJLy8gcG9zdCBtZXNzYWdlCi8vICAgICAgICAgICAgQkVOQ0hNQVJLX01PRF8yN19TRVQoMyk7ICAgIC8vIDc0ILVzIHVudGlsIHJlc2V0CgkJCVNoYkVycm9yID0KCQkJICAgIFNoYkNpckFsbG9jRGF0YUJsb2NrKEVwbEV2ZW50a0luc3RhbmNlX2cuCgkJCQkJCSBtX3BTaGJLZXJuZWxUb1VzZXJJbnN0YW5jZSwKCQkJCQkJICZTaGJDaXJDaHVuaywgdWxEYXRhU2l6ZSk7CgkJCWlmIChTaGJFcnJvciAhPSBrU2hiT2spIHsKCQkJCUVQTF9EQkdMVkxfRVZFTlRLX1RSQUNFMQoJCQkJICAgICgiRXBsRXZlbnRrUG9zdCgpOiBTaGJDaXJBbGxvY0RhdGFCbG9jayhLMlUpIC0+IDB4JVhcbiIsCgkJCQkgICAgIFNoYkVycm9yKTsKCQkJCVJldCA9IGtFcGxFdmVudFBvc3RFcnJvcjsKCQkJCWdvdG8gRXhpdDsKCQkJfQoJCQlTaGJFcnJvciA9CgkJCSAgICBTaGJDaXJXcml0ZURhdGFDaHVuayhFcGxFdmVudGtJbnN0YW5jZV9nLgoJCQkJCQkgbV9wU2hiS2VybmVsVG9Vc2VySW5zdGFuY2UsCgkJCQkJCSAmU2hiQ2lyQ2h1bmssIHBFdmVudF9wLAoJCQkJCQkgc2l6ZW9mKHRFcGxFdmVudCksCgkJCQkJCSAmZkJ1ZmZlckNvbXBsZXRlZCk7CgkJCWlmIChTaGJFcnJvciAhPSBrU2hiT2spIHsKCQkJCUVQTF9EQkdMVkxfRVZFTlRLX1RSQUNFMQoJCQkJICAgICgiRXBsRXZlbnRrUG9zdCgpOiBTaGJDaXJXcml0ZURhdGFDaHVuayhLMlUpIC0+IDB4JVhcbiIsCgkJCQkgICAgIFNoYkVycm9yKTsKCQkJCVJldCA9IGtFcGxFdmVudFBvc3RFcnJvcjsKCQkJCWdvdG8gRXhpdDsKCQkJfQoJCQlpZiAoZkJ1ZmZlckNvbXBsZXRlZCA9PSBGQUxTRSkgewoJCQkJU2hiRXJyb3IgPQoJCQkJICAgIFNoYkNpcldyaXRlRGF0YUNodW5rKEVwbEV2ZW50a0luc3RhbmNlX2cuCgkJCQkJCQkgbV9wU2hiS2VybmVsVG9Vc2VySW5zdGFuY2UsCgkJCQkJCQkgJlNoYkNpckNodW5rLAoJCQkJCQkJIHBFdmVudF9wLT5tX3BBcmcsCgkJCQkJCQkgKHVuc2lnbmVkIGxvbmcpCgkJCQkJCQkgcEV2ZW50X3AtPm1fdWlTaXplLAoJCQkJCQkJICZmQnVmZmVyQ29tcGxldGVkKTsKCQkJCWlmICgoU2hiRXJyb3IgIT0ga1NoYk9rKQoJCQkJICAgIHx8IChmQnVmZmVyQ29tcGxldGVkID09IEZBTFNFKSkgewoJCQkJCUVQTF9EQkdMVkxfRVZFTlRLX1RSQUNFMQoJCQkJCSAgICAoIkVwbEV2ZW50a1Bvc3QoKTogU2hiQ2lyV3JpdGVEYXRhQ2h1bmsyKEsyVSkgLT4gMHglWFxuIiwKCQkJCQkgICAgIFNoYkVycm9yKTsKCQkJCQlSZXQgPSBrRXBsRXZlbnRQb3N0RXJyb3I7CgkJCQkJZ290byBFeGl0OwoJCQkJfQoJCQl9Ci8vICAgICAgICAgICAgQkVOQ0hNQVJLX01PRF8yN19SRVNFVCgzKTsgIC8vIDgyILVzIHVudGlsIFNoYkNpckdldFJlYWREYXRhU2l6ZSgpIGluIEVwbEV2ZW50dQoKI2Vsc2UKCQkJUmV0ID0gRXBsRXZlbnR1UHJvY2VzcyhwRXZlbnRfcCk7CiNlbmRpZgoKCQkJYnJlYWs7CgkJfQoKCWRlZmF1bHQ6CgkJewoJCQlSZXQgPSBrRXBsRXZlbnRVbmtub3duU2luazsKCQl9CgoJfQkJCS8vIGVuZCBvZiBzd2l0Y2gocEV2ZW50X3AtPm1fRXZlbnRTaW5rKQoKI2lmbmRlZiBFUExfTk9fRklGTwogICAgICBFeGl0OgojZW5kaWYKCXJldHVybiBSZXQ7Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vCi8vIEZ1bmN0aW9uOiAgICBFcGxFdmVudGtQb3N0RXJyb3IKLy8KLy8gRGVzY3JpcHRpb246IHBvc3QgZXJyb3IgZXZlbnQgZnJvbSBrZXJuZWwgcGFydCB0byBBUEkgbGF5ZXIKLy8KLy8gUGFyYW1ldGVyczogIEV2ZW50U291cmNlX3AgICA9IHNvdXJjZS1tb2R1bGUgb2YgdGhlIGVycm9yIGV2ZW50Ci8vICAgICAgICAgICAgICBFcGxFcnJvcl9wICAgICAgPSBjb2RlIG9mIG9jY3VyZWQgZXJyb3IKLy8gICAgICAgICAgICAgIEFyZ1NpemVfcCAgICAgICA9IHNpemUgb2YgdGhlIGFyZ3VtZW50Ci8vICAgICAgICAgICAgICBwQXJnX3AgICAgICAgICAgPSBwb2ludGVyIHRvIHRoZSBhcmd1bWVudAovLwovLyBSZXR1cm5zOiAgICAgdEVwS2VybmVsICAgICAgID0gZXJyb3Jjb2RlCi8vCi8vIFN0YXRlOgovLwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKdEVwbEtlcm5lbCBFcGxFdmVudGtQb3N0RXJyb3IodEVwbEV2ZW50U291cmNlIEV2ZW50U291cmNlX3AsCgkJCSAgICAgIHRFcGxLZXJuZWwgRXBsRXJyb3JfcCwKCQkJICAgICAgdW5zaWduZWQgaW50IHVpQXJnU2l6ZV9wLCB2b2lkICpwQXJnX3ApCnsKCXRFcGxLZXJuZWwgUmV0OwoJdTggYWJCdWZmZXJbRVBMX01BWF9FVkVOVF9BUkdfU0laRV07Cgl0RXBsRXZlbnRFcnJvciAqcEV2ZW50RXJyb3IgPSAodEVwbEV2ZW50RXJyb3IgKikgYWJCdWZmZXI7Cgl0RXBsRXZlbnQgRXBsRXZlbnQ7CgoJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CgoJLy8gY3JlYXRlIGFyZ3VtZW50CglwRXZlbnRFcnJvci0+bV9FdmVudFNvdXJjZSA9IEV2ZW50U291cmNlX3A7CglwRXZlbnRFcnJvci0+bV9FcGxFcnJvciA9IEVwbEVycm9yX3A7CglFUExfTUVNQ1BZKCZwRXZlbnRFcnJvci0+bV9BcmcsIHBBcmdfcCwgdWlBcmdTaXplX3ApOwoKCS8vIGNyZWF0ZSBldmVudAoJRXBsRXZlbnQubV9FdmVudFR5cGUgPSBrRXBsRXZlbnRUeXBlRXJyb3I7CglFcGxFdmVudC5tX0V2ZW50U2luayA9IGtFcGxFdmVudFNpbmtBcGk7CglFUExfTUVNU0VUKCZFcGxFdmVudC5tX05ldFRpbWUsIDB4MDAsIHNpemVvZihFcGxFdmVudC5tX05ldFRpbWUpKTsKCUVwbEV2ZW50Lm1fdWlTaXplID0KCSAgICAoc2l6ZW9mKEV2ZW50U291cmNlX3ApICsgc2l6ZW9mKEVwbEVycm9yX3ApICsgdWlBcmdTaXplX3ApOwoJRXBsRXZlbnQubV9wQXJnID0gJmFiQnVmZmVyWzBdOwoKCS8vIHBvc3QgZXJyb3JldmVudAoJUmV0ID0gRXBsRXZlbnRrUG9zdCgmRXBsRXZlbnQpOwoKCXJldHVybiBSZXQ7Cn0KCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCi8vICAgICAgICAgIFAgUiBJIFYgQSBUIEUgICBGIFUgTiBDIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLwovLyBGdW5jdGlvbjogICAgRXBsRXZlbnRrUnhTaWduYWxIYW5kbGVyQ2IoKQovLwovLyBEZXNjcmlwdGlvbjogQ2FsbGJhY2stZnVuY3Rpb24gZm9yIGV2ZW50cyBmcm9tIHVzZXIgYW5kIGtlcm5lbCBwYXJ0Ci8vCi8vIFBhcmFtZXRlcnM6ICBwU2hiUnhJbnN0YW5jZV9wICAgID0gSW5zdGFuY2UtcG9pbnRlciBvZiBidWZmZXIKLy8gICAgICAgICAgICAgIHVsRGF0YVNpemVfcCAgICAgICAgPSBzaXplIG9mIGRhdGEKLy8KLy8gUmV0dXJuczogdm9pZAovLwovLyBTdGF0ZToKLy8KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiNpZm5kZWYgRVBMX05PX0ZJRk8Kc3RhdGljIHZvaWQgRXBsRXZlbnRrUnhTaWduYWxIYW5kbGVyQ2IodFNoYkluc3RhbmNlIHBTaGJSeEluc3RhbmNlX3AsCgkJCQkgICAgICAgdW5zaWduZWQgbG9uZyB1bERhdGFTaXplX3ApCnsKCXRFcGxFdmVudCAqcEVwbEV2ZW50OwoJdFNoYkVycm9yIFNoYkVycm9yOwovL3Vuc2lnbmVkIGxvbmcgICB1bEJsb2NrQ291bnQ7Ci8vdW5zaWduZWQgbG9uZyAgIHVsRGF0YVNpemU7Cgl1OCBhYkRhdGFCdWZmZXJbc2l6ZW9mKHRFcGxFdmVudCkgKyBFUExfTUFYX0VWRU5UX0FSR19TSVpFXTsKCS8vIGQuay46IGFiRGF0YUJ1ZmZlciBjb250YWlucyB0aGUgY29tcGxldGUgdEVwbEV2ZW50IHN0cnVjdHVyZQoJLy8gICAgICAgYW5kIGJlaGluZCB0aGlzIHRoZSBhcmd1bWVudAoKCVRHVF9EQkdfU0lHTkFMX1RSQUNFX1BPSU5UKDIwKTsKCglCRU5DSE1BUktfTU9EXzI3X1JFU0VUKDApOwoJLy8gY29weSBkYXRhIGZyb20gZXZlbnQgcXVldWUKCVNoYkVycm9yID0gU2hiQ2lyUmVhZERhdGFCbG9jayhwU2hiUnhJbnN0YW5jZV9wLAoJCQkJICAgICAgICZhYkRhdGFCdWZmZXJbMF0sCgkJCQkgICAgICAgc2l6ZW9mKGFiRGF0YUJ1ZmZlciksICZ1bERhdGFTaXplX3ApOwoJaWYgKFNoYkVycm9yICE9IGtTaGJPaykgewoJCS8vIGVycm9yIGdvdG8gZXhpdAoJCWdvdG8gRXhpdDsKCX0KCS8vIHJlc29sdmUgdGhlIHBvaW50ZXIgdG8gdGhlIGV2ZW50IHN0cnVjdHVyZQoJcEVwbEV2ZW50ID0gKHRFcGxFdmVudCAqKSBhYkRhdGFCdWZmZXI7CgkvLyBzZXQgRGF0YXNpemUKCXBFcGxFdmVudC0+bV91aVNpemUgPSAodWxEYXRhU2l6ZV9wIC0gc2l6ZW9mKHRFcGxFdmVudCkpOwoJaWYgKHBFcGxFdmVudC0+bV91aVNpemUgPiAwKSB7CgkJLy8gc2V0IHBvaW50ZXIgdG8gYXJndW1lbnQKCQlwRXBsRXZlbnQtPm1fcEFyZyA9ICZhYkRhdGFCdWZmZXJbc2l6ZW9mKHRFcGxFdmVudCldOwoJfSBlbHNlIHsKCQkvL3NldCBwb2ludGVyIHRvIE5VTEwKCQlwRXBsRXZlbnQtPm1fcEFyZyA9IE5VTEw7Cgl9CgoJQkVOQ0hNQVJLX01PRF8yN19TRVQoMCk7CgkvLyBjYWxsIHByb2Nlc3NmdW5jdGlvbgoJRXBsRXZlbnRrUHJvY2VzcyhwRXBsRXZlbnQpOwoKICAgICAgRXhpdDoKCXJldHVybjsKfQojZW5kaWYKCi8vIEVPRgo=