LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CiAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KCiAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCgogIERlc2NyaXB0aW9uOiAgc291cmNlIGZpbGUgZm9yIEVwbC1LZXJuZWxzcGFjZS1FdmVudC1Nb2R1bAoKICBMaWNlbnNlOgoKICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCiAgICBhcmUgbWV0OgoKICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCgogICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCgogICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTWVNURUMgZWxlY3Ryb25pYyBHbWJIIG5vciB0aGUgbmFtZXMgb2YgaXRzCiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KICAgICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9Ac3lzdGVjLWVsZWN0cm9uaWMuY29tLgoKICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKICAgICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCiAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUwogICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKICAgIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAogICAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKICAgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKICAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKICAgIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAogICAgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KICAgIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQogICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCgogICAgU2V2ZXJhYmlsaXR5IENsYXVzZToKCiAgICAgICAgSWYgYSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIG9yIGJlY29tZXMgaWxsZWdhbCwgaW52YWxpZCBvcgogICAgICAgIHVuZW5mb3JjZWFibGUgaW4gYW55IGp1cmlzZGljdGlvbiwgdGhhdCBzaGFsbCBub3QgYWZmZWN0OgogICAgICAgIDEuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiB0aGF0IGp1cmlzZGljdGlvbiBvZiBhbnkgb3RoZXIKICAgICAgICAgICBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlOyBvcgogICAgICAgIDIuIHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBpbiBvdGhlciBqdXJpc2RpY3Rpb25zIG9mIHRoYXQgb3IKICAgICAgICAgICBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZS4KCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgICAgICAgICAgICAgICRSQ1NmaWxlOiBFcGxFdmVudGsuYyx2ICQKCiAgICAgICAgICAgICAgICAkQXV0aG9yOiBELktydWVnZXIgJAoKICAgICAgICAgICAgICAgICRSZXZpc2lvbjogMS45ICQgICREYXRlOiAyMDA4LzEwLzE3IDE1OjMyOjMyICQKCiAgICAgICAgICAgICAgICAkU3RhdGU6IEV4cCAkCgogICAgICAgICAgICAgICAgQnVpbGQgRW52aXJvbm1lbnQ6CiAgICAgICAgICAgICAgICAgICAgR0NDIFYzLjQKCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICBSZXZpc2lvbiBIaXN0b3J5OgoKICAyMDA2LzA2LzIwIGsudC46ICAgc3RhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uCgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKI2luY2x1ZGUgImtlcm5lbC9FcGxFdmVudGsuaCIKI2luY2x1ZGUgImtlcm5lbC9FcGxObXRrLmgiCiNpbmNsdWRlICJrZXJuZWwvRXBsRGxsay5oIgojaW5jbHVkZSAia2VybmVsL0VwbERsbGtDYWwuaCIKI2luY2x1ZGUgImtlcm5lbC9FcGxFcnJvckhhbmRsZXJrLmgiCiNpbmNsdWRlICJCZW5jaG1hcmsuaCIKCiNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX1BET0spKSAhPSAwKQojaW5jbHVkZSAia2VybmVsL0VwbFBkb2suaCIKI2luY2x1ZGUgImtlcm5lbC9FcGxQZG9rQ2FsLmgiCiNlbmRpZgoKI2lmZGVmIEVQTF9OT19GSUZPCiNpbmNsdWRlICJ1c2VyL0VwbEV2ZW50dS5oIgojZWxzZQojaW5jbHVkZSAiU2hhcmVkQnVmZi5oIgojZW5kaWYKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgIEcgTCBPIEIgQSBMICAgRCBFIEYgSSBOIEkgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBjb25zdCBkZWZpbmVzCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgovLyBUcmFjZVBvaW50IHN1cHBvcnQgZm9yIHJlYWx0aW1lLWRlYnVnZ2luZwojaWZkZWYgX0RCR19UUkFDRV9QT0lOVFNfCnZvaWQgUFVCTElDIFRndERiZ1NpZ25hbFRyYWNlUG9pbnQoQllURSBiVHJhY2VQb2ludE51bWJlcl9wKTsKdm9pZCBQVUJMSUMgVGd0RGJnUG9zdFRyYWNlVmFsdWUoRFdPUkQgZHdUcmFjZVZhbHVlX3ApOwojZGVmaW5lIFRHVF9EQkdfU0lHTkFMX1RSQUNFX1BPSU5UKHApICAgVGd0RGJnU2lnbmFsVHJhY2VQb2ludChwKQojZGVmaW5lIFRHVF9EQkdfUE9TVF9UUkFDRV9WQUxVRSh2KSAgICAgVGd0RGJnUG9zdFRyYWNlVmFsdWUodikKI2Vsc2UKI2RlZmluZSBUR1RfREJHX1NJR05BTF9UUkFDRV9QT0lOVChwKQojZGVmaW5lIFRHVF9EQkdfUE9TVF9UUkFDRV9WQUxVRSh2KQojZW5kaWYKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIGxvY2FsIHR5cGVzCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgp0eXBlZGVmIHN0cnVjdCB7CiNpZm5kZWYgRVBMX05PX0ZJRk8KCXRTaGJJbnN0YW5jZSBtX3BTaGJLZXJuZWxUb1VzZXJJbnN0YW5jZTsKCXRTaGJJbnN0YW5jZSBtX3BTaGJVc2VyVG9LZXJuZWxJbnN0YW5jZTsKI2Vsc2UKCiNlbmRpZgoJdEVwbFN5bmNDYiBtX3BmbkNiU3luYzsKCXVuc2lnbmVkIGludCBtX3VpVXNlclRvS2VybmVsRnVsbENvdW50OwoKfSB0RXBsRXZlbnRrSW5zdGFuY2U7CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBtb2R1bCBnbG9iYWxlIHZhcnMKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3RhdGljIHRFcGxFdmVudGtJbnN0YW5jZSBFcGxFdmVudGtJbnN0YW5jZV9nOwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBsb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgovLyBjYWxsYmFjayBmdW5jdGlvbiBmb3IgaW5jb21pbmcgZXZlbnRzCiNpZm5kZWYgRVBMX05PX0ZJRk8Kc3RhdGljIHZvaWQgRXBsRXZlbnRrUnhTaWduYWxIYW5kbGVyQ2IodFNoYkluc3RhbmNlIHBTaGJSeEluc3RhbmNlX3AsCgkJCQkgICAgICAgdW5zaWduZWQgbG9uZyB1bERhdGFTaXplX3ApOwojZW5kaWYKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgIEMgTCBBIFMgUyAgPEVwbC1LZXJuZWxzcGFjZS1FdmVudD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8vCi8vIERlc2NyaXB0aW9uOgovLwovLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KLy8gICAgICAgICAgUCBVIEIgTCBJIEMgICBGIFUgTiBDIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vCi8vIEZ1bmN0aW9uOiAgICBFcGxFdmVudGtJbml0Ci8vCi8vIERlc2NyaXB0aW9uOiBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgZmlyc3QgaW5zdGFuY2UKLy8KLy8gUGFyYW1ldGVyczogIHBmbkNiU3luY19wID0gY2FsbGJhY2stZnVuY3Rpb24gZm9yIHN5bmMgZXZlbnQKLy8KLy8gUmV0dXJuczogICAgIHRFcEtlcm5lbCAgID0gZXJyb3Jjb2RlCi8vCi8vIFN0YXRlOgovLwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKdEVwbEtlcm5lbCBQVUJMSUMgRXBsRXZlbnRrSW5pdCh0RXBsU3luY0NiIHBmbkNiU3luY19wKQp7Cgl0RXBsS2VybmVsIFJldDsKCglSZXQgPSBFcGxFdmVudGtBZGRJbnN0YW5jZShwZm5DYlN5bmNfcCk7CgoJcmV0dXJuIFJldDsKCn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vCi8vIEZ1bmN0aW9uOiAgICBFcGxFdmVudGtBZGRJbnN0YW5jZQovLwovLyBEZXNjcmlwdGlvbjogZnVuY3Rpb24gYWRkcyBvbmUgbW9yZSBpbnN0YW5jZQovLwovLyBQYXJhbWV0ZXJzOiAgcGZuQ2JTeW5jX3AgPSBjYWxsYmFjay1mdW5jdGlvbiBmb3Igc3luYyBldmVudAovLwovLyBSZXR1cm5zOiAgICAgdEVwS2VybmVsICAgPSBlcnJvcmNvZGUKLy8KLy8gU3RhdGU6Ci8vCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgp0RXBsS2VybmVsIFBVQkxJQyBFcGxFdmVudGtBZGRJbnN0YW5jZSh0RXBsU3luY0NiIHBmbkNiU3luY19wKQp7Cgl0RXBsS2VybmVsIFJldDsKI2lmbmRlZiBFUExfTk9fRklGTwoJdFNoYkVycm9yIFNoYkVycm9yOwoJdW5zaWduZWQgaW50IGZTaGJOZXdDcmVhdGVkOwojZW5kaWYKCglSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKCgkvLyBpbml0IGluc3RhbmNlIHN0cnVjdHVyZQoJRXBsRXZlbnRrSW5zdGFuY2VfZy5tX3VpVXNlclRvS2VybmVsRnVsbENvdW50ID0gMDsKCgkvLyBzYXZlIGNiLWZ1bmN0aW9uCglFcGxFdmVudGtJbnN0YW5jZV9nLm1fcGZuQ2JTeW5jID0gcGZuQ2JTeW5jX3A7CgojaWZuZGVmIEVQTF9OT19GSUZPCgkvLyBpbml0IHNoYXJlZCBsb29wIGJ1ZmZlcgoJLy8ga2VybmVsIC0+IHVzZXIKCVNoYkVycm9yID0gU2hiQ2lyQWxsb2NCdWZmZXIoRVBMX0VWRU5UX1NJWkVfU0hCX0tFUk5FTF9UT19VU0VSLAoJCQkJICAgICBFUExfRVZFTlRfTkFNRV9TSEJfS0VSTkVMX1RPX1VTRVIsCgkJCQkgICAgICZFcGxFdmVudGtJbnN0YW5jZV9nLgoJCQkJICAgICBtX3BTaGJLZXJuZWxUb1VzZXJJbnN0YW5jZSwKCQkJCSAgICAgJmZTaGJOZXdDcmVhdGVkKTsKCWlmIChTaGJFcnJvciAhPSBrU2hiT2spIHsKCQlFUExfREJHTFZMX0VWRU5US19UUkFDRTEKCQkgICAgKCJFcGxFdmVudGtBZGRJbnN0YW5jZSgpOiBTaGJDaXJBbGxvY0J1ZmZlcihLMlUpIC0+IDB4JVhcbiIsCgkJICAgICBTaGJFcnJvcik7CgkJUmV0ID0ga0VwbE5vUmVzb3VyY2U7CgkJZ290byBFeGl0OwoJfQoJLy8gdXNlciAtPiBrZXJuZWwKCVNoYkVycm9yID0gU2hiQ2lyQWxsb2NCdWZmZXIoRVBMX0VWRU5UX1NJWkVfU0hCX1VTRVJfVE9fS0VSTkVMLAoJCQkJICAgICBFUExfRVZFTlRfTkFNRV9TSEJfVVNFUl9UT19LRVJORUwsCgkJCQkgICAgICZFcGxFdmVudGtJbnN0YW5jZV9nLgoJCQkJICAgICBtX3BTaGJVc2VyVG9LZXJuZWxJbnN0YW5jZSwKCQkJCSAgICAgJmZTaGJOZXdDcmVhdGVkKTsKCWlmIChTaGJFcnJvciAhPSBrU2hiT2spIHsKCQlFUExfREJHTFZMX0VWRU5US19UUkFDRTEKCQkgICAgKCJFcGxFdmVudGtBZGRJbnN0YW5jZSgpOiBTaGJDaXJBbGxvY0J1ZmZlcihVMkspIC0+IDB4JVhcbiIsCgkJICAgICBTaGJFcnJvcik7CgkJUmV0ID0ga0VwbE5vUmVzb3VyY2U7CgkJZ290byBFeGl0OwoJfQoJLy8gcmVnaXN0ZXIgZXZlbnRoYW5kbGVyCglTaGJFcnJvciA9CgkgICAgU2hiQ2lyU2V0U2lnbmFsSGFuZGxlck5ld0RhdGEoRXBsRXZlbnRrSW5zdGFuY2VfZy4KCQkJCQkgIG1fcFNoYlVzZXJUb0tlcm5lbEluc3RhbmNlLAoJCQkJCSAgRXBsRXZlbnRrUnhTaWduYWxIYW5kbGVyQ2IsCgkJCQkJICBrc2hiUHJpb3JpdHlIaWdoKTsKCWlmIChTaGJFcnJvciAhPSBrU2hiT2spIHsKCQlFUExfREJHTFZMX0VWRU5US19UUkFDRTEKCQkgICAgKCJFcGxFdmVudGtBZGRJbnN0YW5jZSgpOiBTaGJDaXJTZXRTaWduYWxIYW5kbGVyTmV3RGF0YShVMkspIC0+IDB4JVhcbiIsCgkJICAgICBTaGJFcnJvcik7CgkJUmV0ID0ga0VwbE5vUmVzb3VyY2U7CgkJZ290byBFeGl0OwoJfQoKICAgICAgRXhpdDoKI2VuZGlmCgoJcmV0dXJuIFJldDsKCn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vCi8vIEZ1bmN0aW9uOiAgICBFcGxFdmVudGtEZWxJbnN0YW5jZQovLwovLyBEZXNjcmlwdGlvbjogZnVuY3Rpb24gZGVsZXRlcyBpbnN0YW5jZSBhbmQgZnJlZXMgdGhlIGJ1ZmZlcnMKLy8KLy8gUGFyYW1ldGVyczogIHZvaWQKLy8KLy8gUmV0dXJuczogICAgIHRFcEtlcm5lbCAgID0gZXJyb3Jjb2RlCi8vCi8vIFN0YXRlOgovLwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKdEVwbEtlcm5lbCBQVUJMSUMgRXBsRXZlbnRrRGVsSW5zdGFuY2UoKQp7Cgl0RXBsS2VybmVsIFJldDsKI2lmbmRlZiBFUExfTk9fRklGTwoJdFNoYkVycm9yIFNoYkVycm9yOwojZW5kaWYKCglSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKCiNpZm5kZWYgRVBMX05PX0ZJRk8KCS8vIHNldCBldmVudGhhbmRsZXIgdG8gTlVMTAoJU2hiRXJyb3IgPQoJICAgIFNoYkNpclNldFNpZ25hbEhhbmRsZXJOZXdEYXRhKEVwbEV2ZW50a0luc3RhbmNlX2cuCgkJCQkJICBtX3BTaGJVc2VyVG9LZXJuZWxJbnN0YW5jZSwgTlVMTCwKCQkJCQkgIGtTaGJQcmlvcml0eU5vcm1hbCk7CglpZiAoU2hiRXJyb3IgIT0ga1NoYk9rKSB7CgkJRVBMX0RCR0xWTF9FVkVOVEtfVFJBQ0UxCgkJICAgICgiRXBsRXZlbnRrRGVsSW5zdGFuY2UoKTogU2hiQ2lyU2V0U2lnbmFsSGFuZGxlck5ld0RhdGEoVTJLKSAtPiAweCVYXG4iLAoJCSAgICAgU2hiRXJyb3IpOwoJCVJldCA9IGtFcGxOb1Jlc291cmNlOwoJfQoJLy8gZnJlZSBidWZmZXIgVXNlciAtPiBLZXJuZWwKCVNoYkVycm9yID0KCSAgICBTaGJDaXJSZWxlYXNlQnVmZmVyKEVwbEV2ZW50a0luc3RhbmNlX2cubV9wU2hiVXNlclRvS2VybmVsSW5zdGFuY2UpOwoJaWYgKFNoYkVycm9yICE9IGtTaGJPaykgewoJCUVQTF9EQkdMVkxfRVZFTlRLX1RSQUNFMQoJCSAgICAoIkVwbEV2ZW50a0RlbEluc3RhbmNlKCk6IFNoYkNpclJlbGVhc2VCdWZmZXIoVTJLKSAtPiAweCVYXG4iLAoJCSAgICAgU2hiRXJyb3IpOwoJCVJldCA9IGtFcGxOb1Jlc291cmNlOwoJfSBlbHNlIHsKCQlFcGxFdmVudGtJbnN0YW5jZV9nLm1fcFNoYlVzZXJUb0tlcm5lbEluc3RhbmNlID0gTlVMTDsKCX0KCgkvLyBmcmVlIGJ1ZmZlciAgS2VybmVsIC0+IFVzZXIKCVNoYkVycm9yID0KCSAgICBTaGJDaXJSZWxlYXNlQnVmZmVyKEVwbEV2ZW50a0luc3RhbmNlX2cubV9wU2hiS2VybmVsVG9Vc2VySW5zdGFuY2UpOwoJaWYgKFNoYkVycm9yICE9IGtTaGJPaykgewoJCUVQTF9EQkdMVkxfRVZFTlRLX1RSQUNFMQoJCSAgICAoIkVwbEV2ZW50a0RlbEluc3RhbmNlKCk6IFNoYkNpclJlbGVhc2VCdWZmZXIoSzJVKSAtPiAweCVYXG4iLAoJCSAgICAgU2hiRXJyb3IpOwoJCVJldCA9IGtFcGxOb1Jlc291cmNlOwoJfSBlbHNlIHsKCQlFcGxFdmVudGtJbnN0YW5jZV9nLm1fcFNoYktlcm5lbFRvVXNlckluc3RhbmNlID0gTlVMTDsKCX0KI2VuZGlmCgoJcmV0dXJuIFJldDsKCn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vCi8vIEZ1bmN0aW9uOiAgICBFcGxFdmVudGtQcm9jZXNzCi8vCi8vIERlc2NyaXB0aW9uOiBLZXJuZWx0aHJlYWQgdGhhdCBkaXNwYXRjaGVzIGV2ZW50cyBpbiBrZXJuZWwgcGFydAovLwovLyBQYXJhbWV0ZXJzOiAgcEV2ZW50X3AgICAgPSBwb2ludGVyIHRvIGV2ZW50LXN0cnVjdHVyZSBmcm9tIGJ1ZmZlcgovLwovLyBSZXR1cm5zOiAgICAgdEVwS2VybmVsICAgPSBlcnJvcmNvZGUKLy8KLy8gU3RhdGU6Ci8vCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgp0RXBsS2VybmVsIFBVQkxJQyBFcGxFdmVudGtQcm9jZXNzKHRFcGxFdmVudCAqIHBFdmVudF9wKQp7Cgl0RXBsS2VybmVsIFJldDsKCXRFcGxFdmVudFNvdXJjZSBFdmVudFNvdXJjZTsKCglSZXQgPSBrRXBsU3VjY2Vzc2Z1bDsKCgkvLyBlcnJvciBoYW5kbGluZyBpZiBldmVudCBxdWV1ZSBpcyBmdWxsCglpZiAoRXBsRXZlbnRrSW5zdGFuY2VfZy5tX3VpVXNlclRvS2VybmVsRnVsbENvdW50ID4gMCkgewkvLyBVc2VyVG9LZXJuZWwgZXZlbnQgcXVldWUgaGFzIHJ1biBvdXQgb2Ygc3BhY2UgLT4ga0VwbE5tdEV2ZW50SW50ZXJuQ29tRXJyb3IKI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRLKSkgIT0gMCkKCQl0RXBsRXZlbnQgRXZlbnQ7CgkJdEVwbE5tdEV2ZW50IE5tdEV2ZW50OwojZW5kaWYKI2lmbmRlZiBFUExfTk9fRklGTwoJCXRTaGJFcnJvciBTaGJFcnJvcjsKI2VuZGlmCgoJCS8vIGRpcmVjdGx5IGNhbGwgTk1UayBwcm9jZXNzIGZ1bmN0aW9uLCBiZWNhdXNlIGV2ZW50IHF1ZXVlIGlzIGZ1bGwKI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRLKSkgIT0gMCkKCQlObXRFdmVudCA9IGtFcGxObXRFdmVudEludGVybkNvbUVycm9yOwoJCUV2ZW50Lm1fRXZlbnRTaW5rID0ga0VwbEV2ZW50U2lua05tdGs7CgkJRXZlbnQubV9OZXRUaW1lLm1fZHdOYW5vU2VjID0gMDsKCQlFdmVudC5tX05ldFRpbWUubV9kd1NlYyA9IDA7CgkJRXZlbnQubV9FdmVudFR5cGUgPSBrRXBsRXZlbnRUeXBlTm10RXZlbnQ7CgkJRXZlbnQubV9wQXJnID0gJk5tdEV2ZW50OwoJCUV2ZW50Lm1fdWlTaXplID0gc2l6ZW9mKE5tdEV2ZW50KTsKCQlSZXQgPSBFcGxObXRrUHJvY2VzcygmRXZlbnQpOwojZW5kaWYKCgkJLy8gTk1UIHN0YXRlIG1hY2hpbmUgY2hhbmdlZCB0byByZXNldCAoaS5lLiBOTVRfR1NfUkVTRVRfQ09NTVVOSUNBVElPTikKCQkvLyBub3csIGl0IGlzIHNhZmUgdG8gcmVzZXQgdGhlIGNvdW50ZXIgYW5kIGVtcHR5IHRoZSBldmVudCBxdWV1ZQojaWZuZGVmIEVQTF9OT19GSUZPCgkJU2hiRXJyb3IgPQoJCSAgICBTaGJDaXJSZXNldEJ1ZmZlcihFcGxFdmVudGtJbnN0YW5jZV9nLgoJCQkJICAgICAgbV9wU2hiVXNlclRvS2VybmVsSW5zdGFuY2UsIDEwMDAsIE5VTEwpOwojZW5kaWYKCgkJRXBsRXZlbnRrSW5zdGFuY2VfZy5tX3VpVXNlclRvS2VybmVsRnVsbENvdW50ID0gMDsKCQlUR1RfREJHX1NJR05BTF9UUkFDRV9QT0lOVCgyMik7CgoJCS8vIGFsc28gZGlzY2FyZCB0aGUgY3VycmVudCBldmVudCAoaXQgZG9lc24ndCBtYXR0ZXIgaWYgd2UgbG9zZSBhbm90aGVyIGV2ZW50KQoJCWdvdG8gRXhpdDsKCX0KCS8vIGNoZWNrIG1fRXZlbnRTaW5rCglzd2l0Y2ggKHBFdmVudF9wLT5tX0V2ZW50U2luaykgewoJY2FzZSBrRXBsRXZlbnRTaW5rU3luYzoKCQl7CgkJCWlmIChFcGxFdmVudGtJbnN0YW5jZV9nLm1fcGZuQ2JTeW5jICE9IE5VTEwpIHsKCQkJCVJldCA9IEVwbEV2ZW50a0luc3RhbmNlX2cubV9wZm5DYlN5bmMoKTsKCQkJCWlmIChSZXQgPT0ga0VwbFN1Y2Nlc3NmdWwpIHsKI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfUERPSykpICE9IDApCgkJCQkJLy8gbWFyayBUUERPcyBhcyB2YWxpZAoJCQkJCVJldCA9IEVwbFBkb2tDYWxTZXRUcGRvc1ZhbGlkKFRSVUUpOwojZW5kaWYKCQkJCX0gZWxzZSBpZiAoKFJldCAhPSBrRXBsUmVqZWN0KQoJCQkJCSAgICYmIChSZXQgIT0ga0VwbFNodXRkb3duKSkgewoJCQkJCUV2ZW50U291cmNlID0ga0VwbEV2ZW50U291cmNlU3luY0NiOwoKCQkJCQkvLyBFcnJvciBldmVudCBmb3IgQVBJIGxheWVyCgkJCQkJRXBsRXZlbnRrUG9zdEVycm9yCgkJCQkJICAgIChrRXBsRXZlbnRTb3VyY2VFdmVudGssIFJldCwKCQkJCQkgICAgIHNpemVvZihFdmVudFNvdXJjZSksICZFdmVudFNvdXJjZSk7CgkJCQl9CgkJCX0KCQkJYnJlYWs7CgkJfQoKCQkvLyBOTVQtS2VybmVsLU1vZHVsCgljYXNlIGtFcGxFdmVudFNpbmtObXRrOgoJCXsKI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRLKSkgIT0gMCkKCQkJUmV0ID0gRXBsTm10a1Byb2Nlc3MocEV2ZW50X3ApOwoJCQlpZiAoKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgJiYgKFJldCAhPSBrRXBsU2h1dGRvd24pKSB7CgkJCQlFdmVudFNvdXJjZSA9IGtFcGxFdmVudFNvdXJjZU5tdGs7CgoJCQkJLy8gRXJyb3IgZXZlbnQgZm9yIEFQSSBsYXllcgoJCQkJRXBsRXZlbnRrUG9zdEVycm9yKGtFcGxFdmVudFNvdXJjZUV2ZW50aywKCQkJCQkJICAgUmV0LAoJCQkJCQkgICBzaXplb2YoRXZlbnRTb3VyY2UpLAoJCQkJCQkgICAmRXZlbnRTb3VyY2UpOwoJCQl9CiNlbmRpZgojaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX0RMTEspKSAhPSAwKQoJCQlpZiAoKHBFdmVudF9wLT5tX0V2ZW50VHlwZSA9PSBrRXBsRXZlbnRUeXBlTm10RXZlbnQpCgkJCSAgICAmJgoJCQkgICAgKCgqKCh0RXBsTm10RXZlbnQgKikgcEV2ZW50X3AtPm1fcEFyZykgPT0KCQkJICAgICAga0VwbE5tdEV2ZW50RGxsQ2VTb2EpCiNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVF9NTikpICE9IDApCgkJCSAgICAgfHwgKCooKHRFcGxObXRFdmVudCAqKSBwRXZlbnRfcC0+bV9wQXJnKSA9PQoJCQkJIGtFcGxObXRFdmVudERsbE1lU29hU2VudCkKI2VuZGlmCgkJCSAgICApKSB7CS8vIGZvcndhcmQgU29BIGV2ZW50IHRvIGVycm9yIGhhbmRsZXIKCQkJCVJldCA9IEVwbEVycm9ySGFuZGxlcmtQcm9jZXNzKHBFdmVudF9wKTsKCQkJCWlmICgoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKQoJCQkJICAgICYmIChSZXQgIT0ga0VwbFNodXRkb3duKSkgewoJCQkJCUV2ZW50U291cmNlID0ga0VwbEV2ZW50U291cmNlRXJyazsKCgkJCQkJLy8gRXJyb3IgZXZlbnQgZm9yIEFQSSBsYXllcgoJCQkJCUVwbEV2ZW50a1Bvc3RFcnJvcgoJCQkJCSAgICAoa0VwbEV2ZW50U291cmNlRXZlbnRrLCBSZXQsCgkJCQkJICAgICBzaXplb2YoRXZlbnRTb3VyY2UpLCAmRXZlbnRTb3VyY2UpOwoJCQkJfQojaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9QRE9LKSkgIT0gMCkKCQkJCS8vIGZvcndhcmQgU29BIGV2ZW50IHRvIFBETyBtb2R1bGUKCQkJCXBFdmVudF9wLT5tX0V2ZW50VHlwZSA9IGtFcGxFdmVudFR5cGVQZG9Tb2E7CgkJCQlSZXQgPSBFcGxQZG9rUHJvY2VzcyhwRXZlbnRfcCk7CgkJCQlpZiAoKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkKCQkJCSAgICAmJiAoUmV0ICE9IGtFcGxTaHV0ZG93bikpIHsKCQkJCQlFdmVudFNvdXJjZSA9IGtFcGxFdmVudFNvdXJjZVBkb2s7CgoJCQkJCS8vIEVycm9yIGV2ZW50IGZvciBBUEkgbGF5ZXIKCQkJCQlFcGxFdmVudGtQb3N0RXJyb3IKCQkJCQkgICAgKGtFcGxFdmVudFNvdXJjZUV2ZW50aywgUmV0LAoJCQkJCSAgICAgc2l6ZW9mKEV2ZW50U291cmNlKSwgJkV2ZW50U291cmNlKTsKCQkJCX0KI2VuZGlmCgoJCQl9CgkJCWJyZWFrOwojZW5kaWYKCQl9CgoJCS8vIGV2ZW50cyBmb3IgRGxsayBtb2R1bGUKCWNhc2Uga0VwbEV2ZW50U2lua0RsbGs6CgkJewojaWYoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX0RMTEspKSAhPSAwKQoJCQlSZXQgPSBFcGxEbGxrUHJvY2VzcyhwRXZlbnRfcCk7CgkJCWlmICgoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSAmJiAoUmV0ICE9IGtFcGxTaHV0ZG93bikpIHsKCQkJCUV2ZW50U291cmNlID0ga0VwbEV2ZW50U291cmNlRGxsazsKCgkJCQkvLyBFcnJvciBldmVudCBmb3IgQVBJIGxheWVyCgkJCQlFcGxFdmVudGtQb3N0RXJyb3Ioa0VwbEV2ZW50U291cmNlRXZlbnRrLAoJCQkJCQkgICBSZXQsCgkJCQkJCSAgIHNpemVvZihFdmVudFNvdXJjZSksCgkJCQkJCSAgICZFdmVudFNvdXJjZSk7CgkJCX0KI2VuZGlmCgkJCWJyZWFrOwoJCX0KCgkJLy8gZXZlbnRzIGZvciBEbGxrQ2FsIG1vZHVsZQoJY2FzZSBrRXBsRXZlbnRTaW5rRGxsa0NhbDoKCQl7CiNpZigoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfRExMSykpICE9IDApCgkJCVJldCA9IEVwbERsbGtDYWxQcm9jZXNzKHBFdmVudF9wKTsKCQkJaWYgKChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpICYmIChSZXQgIT0ga0VwbFNodXRkb3duKSkgewoJCQkJRXZlbnRTb3VyY2UgPSBrRXBsRXZlbnRTb3VyY2VEbGxrOwoKCQkJCS8vIEVycm9yIGV2ZW50IGZvciBBUEkgbGF5ZXIKCQkJCUVwbEV2ZW50a1Bvc3RFcnJvcihrRXBsRXZlbnRTb3VyY2VFdmVudGssCgkJCQkJCSAgIFJldCwKCQkJCQkJICAgc2l6ZW9mKEV2ZW50U291cmNlKSwKCQkJCQkJICAgJkV2ZW50U291cmNlKTsKCQkJfQojZW5kaWYKCQkJYnJlYWs7CgkJfQoKCQkvLwoJY2FzZSBrRXBsRXZlbnRTaW5rUGRvazoKCQl7CgkJCS8vIFBETy1Nb2R1bGUKI2lmICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfUERPSykpICE9IDApCgkJCVJldCA9IEVwbFBkb2tQcm9jZXNzKHBFdmVudF9wKTsKCQkJaWYgKChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpICYmIChSZXQgIT0ga0VwbFNodXRkb3duKSkgewoJCQkJRXZlbnRTb3VyY2UgPSBrRXBsRXZlbnRTb3VyY2VQZG9rOwoKCQkJCS8vIEVycm9yIGV2ZW50IGZvciBBUEkgbGF5ZXIKCQkJCUVwbEV2ZW50a1Bvc3RFcnJvcihrRXBsRXZlbnRTb3VyY2VFdmVudGssCgkJCQkJCSAgIFJldCwKCQkJCQkJICAgc2l6ZW9mKEV2ZW50U291cmNlKSwKCQkJCQkJICAgJkV2ZW50U291cmNlKTsKCQkJfQojZW5kaWYKCQkJYnJlYWs7CgkJfQoKCQkvLyBldmVudHMgZm9yIEVycm9yIGhhbmRsZXIgbW9kdWxlCgljYXNlIGtFcGxFdmVudFNpbmtFcnJrOgoJCXsKCQkJLy8gb25seSBjYWxsIGVycm9yIGhhbmRsZXIgaWYgRExMIGlzIHByZXNlbnQKI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9ETExLKSkgIT0gMCkKCQkJUmV0ID0gRXBsRXJyb3JIYW5kbGVya1Byb2Nlc3MocEV2ZW50X3ApOwoJCQlpZiAoKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgJiYgKFJldCAhPSBrRXBsU2h1dGRvd24pKSB7CgkJCQlFdmVudFNvdXJjZSA9IGtFcGxFdmVudFNvdXJjZUVycms7CgoJCQkJLy8gRXJyb3IgZXZlbnQgZm9yIEFQSSBsYXllcgoJCQkJRXBsRXZlbnRrUG9zdEVycm9yKGtFcGxFdmVudFNvdXJjZUV2ZW50aywKCQkJCQkJICAgUmV0LAoJCQkJCQkgICBzaXplb2YoRXZlbnRTb3VyY2UpLAoJCQkJCQkgICAmRXZlbnRTb3VyY2UpOwoJCQl9CgkJCWJyZWFrOwojZW5kaWYKCQl9CgoJCS8vIHVua25vd24gc2luawoJZGVmYXVsdDoKCQl7CgkJCVJldCA9IGtFcGxFdmVudFVua25vd25TaW5rOwoJCX0KCgl9CQkJLy8gZW5kIG9mIHN3aXRjaChwRXZlbnRfcC0+bV9FdmVudFNpbmspCgogICAgICBFeGl0OgoJcmV0dXJuIFJldDsKCn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vCi8vIEZ1bmN0aW9uOiAgICBFcGxFdmVudGtQb3N0Ci8vCi8vIERlc2NyaXB0aW9uOiBwb3N0IGV2ZW50cyBmcm9tIGtlcm5lbCBwYXJ0Ci8vCi8vIFBhcmFtZXRlcnM6ICBwRXZlbnRfcCAgICA9IHBvaW50ZXIgdG8gZXZlbnQtc3RydWN0dXJlIGZyb20gYnVmZmVyCi8vCi8vIFJldHVybnM6ICAgICB0RXBLZXJuZWwgICA9IGVycm9yY29kZQovLwovLyBTdGF0ZToKLy8KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCnRFcGxLZXJuZWwgUFVCTElDIEVwbEV2ZW50a1Bvc3QodEVwbEV2ZW50ICogcEV2ZW50X3ApCnsKCXRFcGxLZXJuZWwgUmV0OwojaWZuZGVmIEVQTF9OT19GSUZPCgl0U2hiRXJyb3IgU2hiRXJyb3I7Cgl0U2hiQ2lyQ2h1bmsgU2hiQ2lyQ2h1bms7Cgl1bnNpZ25lZCBsb25nIHVsRGF0YVNpemU7Cgl1bnNpZ25lZCBpbnQgZkJ1ZmZlckNvbXBsZXRlZDsKI2VuZGlmCgoJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CgoJLy8gdGhlIGV2ZW50IG11c3QgYmUgcG9zdGVkIGJ5IHVzaW5nIHRoZSBhYkJ1ZmZlcgoJLy8gaXQgaXMgbmVlZGUgYmVjYXVzZSB0aGUgQXJndW1lbnQgbXVzdCBieSBjb3BpZWQKCS8vIHRvIHRoZSBidWZmZXIgdG9vIGFuZCBub3Qgb25seSB0aGUgcG9pbnRlcgoKI2lmbmRlZiBFUExfTk9fRklGTwoJLy8gMjAwNi8wOC8wMyBkLmsuOiBFdmVudCBhbmQgYXJndW1lbnQgYXJlIHBvc3RlZCBhcyBzZXBhcmF0ZSBjaHVua3MgdG8gdGhlIGV2ZW50IHF1ZXVlLgoJdWxEYXRhU2l6ZSA9CgkgICAgc2l6ZW9mKHRFcGxFdmVudCkgKwoJICAgICgocEV2ZW50X3AtPm1fcEFyZyAhPSBOVUxMKSA/IHBFdmVudF9wLT5tX3VpU2l6ZSA6IDApOwojZW5kaWYKCgkvLyBkZWNpZGUgaW4gd2hpY2ggYnVmZmVyIHRoZSBldmVudCBoYXZlIHRvIHdyaXRlCglzd2l0Y2ggKHBFdmVudF9wLT5tX0V2ZW50U2luaykgewoJCS8vIGtlcm5lbHNwYWNlIG1vZHVsZXMKCWNhc2Uga0VwbEV2ZW50U2lua1N5bmM6CgljYXNlIGtFcGxFdmVudFNpbmtObXRrOgoJY2FzZSBrRXBsRXZlbnRTaW5rRGxsazoKCWNhc2Uga0VwbEV2ZW50U2lua0RsbGtDYWw6CgljYXNlIGtFcGxFdmVudFNpbmtQZG9rOgoJY2FzZSBrRXBsRXZlbnRTaW5rRXJyazoKCQl7CiNpZm5kZWYgRVBMX05PX0ZJRk8KCQkJLy8gcG9zdCBtZXNzYWdlCgkJCUJFTkNITUFSS19NT0RfMjdfU0VUKDIpOwoJCQlTaGJFcnJvciA9CgkJCSAgICBTaGJDaXJBbGxvY0RhdGFCbG9jayhFcGxFdmVudGtJbnN0YW5jZV9nLgoJCQkJCQkgbV9wU2hiVXNlclRvS2VybmVsSW5zdGFuY2UsCgkJCQkJCSAmU2hiQ2lyQ2h1bmssIHVsRGF0YVNpemUpOwoJCQlzd2l0Y2ggKFNoYkVycm9yKSB7CgkJCWNhc2Uga1NoYk9rOgoJCQkJYnJlYWs7CgoJCQljYXNlIGtTaGJCdWZmZXJGdWxsOgoJCQkJewoJCQkJCUVwbEV2ZW50a0luc3RhbmNlX2cuCgkJCQkJICAgIG1fdWlVc2VyVG9LZXJuZWxGdWxsQ291bnQrKzsKCQkJCQlSZXQgPSBrRXBsRXZlbnRQb3N0RXJyb3I7CgkJCQkJZ290byBFeGl0OwoJCQkJfQoKCQkJZGVmYXVsdDoKCQkJCXsKCQkJCQlFUExfREJHTFZMX0VWRU5US19UUkFDRTEKCQkJCQkgICAgKCJFcGxFdmVudGtQb3N0KCk6IFNoYkNpckFsbG9jRGF0YUJsb2NrKFUySykgLT4gMHglWFxuIiwKCQkJCQkgICAgIFNoYkVycm9yKTsKCQkJCQlSZXQgPSBrRXBsRXZlbnRQb3N0RXJyb3I7CgkJCQkJZ290byBFeGl0OwoJCQkJfQoJCQl9CgkJCVNoYkVycm9yID0KCQkJICAgIFNoYkNpcldyaXRlRGF0YUNodW5rKEVwbEV2ZW50a0luc3RhbmNlX2cuCgkJCQkJCSBtX3BTaGJVc2VyVG9LZXJuZWxJbnN0YW5jZSwKCQkJCQkJICZTaGJDaXJDaHVuaywgcEV2ZW50X3AsCgkJCQkJCSBzaXplb2YodEVwbEV2ZW50KSwKCQkJCQkJICZmQnVmZmVyQ29tcGxldGVkKTsKCQkJaWYgKFNoYkVycm9yICE9IGtTaGJPaykgewoJCQkJRVBMX0RCR0xWTF9FVkVOVEtfVFJBQ0UxCgkJCQkgICAgKCJFcGxFdmVudGtQb3N0KCk6IFNoYkNpcldyaXRlRGF0YUNodW5rKFUySykgLT4gMHglWFxuIiwKCQkJCSAgICAgU2hiRXJyb3IpOwoJCQkJUmV0ID0ga0VwbEV2ZW50UG9zdEVycm9yOwoJCQkJZ290byBFeGl0OwoJCQl9CgkJCWlmIChmQnVmZmVyQ29tcGxldGVkID09IEZBTFNFKSB7CgkJCQlTaGJFcnJvciA9CgkJCQkgICAgU2hiQ2lyV3JpdGVEYXRhQ2h1bmsoRXBsRXZlbnRrSW5zdGFuY2VfZy4KCQkJCQkJCSBtX3BTaGJVc2VyVG9LZXJuZWxJbnN0YW5jZSwKCQkJCQkJCSAmU2hiQ2lyQ2h1bmssCgkJCQkJCQkgcEV2ZW50X3AtPm1fcEFyZywKCQkJCQkJCSAodW5zaWduZWQgbG9uZykKCQkJCQkJCSBwRXZlbnRfcC0+bV91aVNpemUsCgkJCQkJCQkgJmZCdWZmZXJDb21wbGV0ZWQpOwoJCQkJaWYgKChTaGJFcnJvciAhPSBrU2hiT2spCgkJCQkgICAgfHwgKGZCdWZmZXJDb21wbGV0ZWQgPT0gRkFMU0UpKSB7CgkJCQkJRVBMX0RCR0xWTF9FVkVOVEtfVFJBQ0UxCgkJCQkJICAgICgiRXBsRXZlbnRrUG9zdCgpOiBTaGJDaXJXcml0ZURhdGFDaHVuazIoVTJLKSAtPiAweCVYXG4iLAoJCQkJCSAgICAgU2hiRXJyb3IpOwoJCQkJCVJldCA9IGtFcGxFdmVudFBvc3RFcnJvcjsKCQkJCQlnb3RvIEV4aXQ7CgkJCQl9CgkJCX0KCQkJQkVOQ0hNQVJLX01PRF8yN19SRVNFVCgyKTsKCiNlbHNlCgkJCVJldCA9IEVwbEV2ZW50a1Byb2Nlc3MocEV2ZW50X3ApOwojZW5kaWYKCgkJCWJyZWFrOwoJCX0KCgkJLy8gdXNlcnNwYWNlIG1vZHVsZXMKCWNhc2Uga0VwbEV2ZW50U2lua05tdHU6CgljYXNlIGtFcGxFdmVudFNpbmtObXRNbnU6CgljYXNlIGtFcGxFdmVudFNpbmtTZG9Bc3lTZXE6CgljYXNlIGtFcGxFdmVudFNpbmtBcGk6CgljYXNlIGtFcGxFdmVudFNpbmtEbGx1Q2FsOgoJY2FzZSBrRXBsRXZlbnRTaW5rRXJydToKCQl7CiNpZm5kZWYgRVBMX05PX0ZJRk8KCQkJLy8gcG9zdCBtZXNzYWdlCi8vICAgICAgICAgICAgQkVOQ0hNQVJLX01PRF8yN19TRVQoMyk7ICAgIC8vIDc0ILVzIHVudGlsIHJlc2V0CgkJCVNoYkVycm9yID0KCQkJICAgIFNoYkNpckFsbG9jRGF0YUJsb2NrKEVwbEV2ZW50a0luc3RhbmNlX2cuCgkJCQkJCSBtX3BTaGJLZXJuZWxUb1VzZXJJbnN0YW5jZSwKCQkJCQkJICZTaGJDaXJDaHVuaywgdWxEYXRhU2l6ZSk7CgkJCWlmIChTaGJFcnJvciAhPSBrU2hiT2spIHsKCQkJCUVQTF9EQkdMVkxfRVZFTlRLX1RSQUNFMQoJCQkJICAgICgiRXBsRXZlbnRrUG9zdCgpOiBTaGJDaXJBbGxvY0RhdGFCbG9jayhLMlUpIC0+IDB4JVhcbiIsCgkJCQkgICAgIFNoYkVycm9yKTsKCQkJCVJldCA9IGtFcGxFdmVudFBvc3RFcnJvcjsKCQkJCWdvdG8gRXhpdDsKCQkJfQoJCQlTaGJFcnJvciA9CgkJCSAgICBTaGJDaXJXcml0ZURhdGFDaHVuayhFcGxFdmVudGtJbnN0YW5jZV9nLgoJCQkJCQkgbV9wU2hiS2VybmVsVG9Vc2VySW5zdGFuY2UsCgkJCQkJCSAmU2hiQ2lyQ2h1bmssIHBFdmVudF9wLAoJCQkJCQkgc2l6ZW9mKHRFcGxFdmVudCksCgkJCQkJCSAmZkJ1ZmZlckNvbXBsZXRlZCk7CgkJCWlmIChTaGJFcnJvciAhPSBrU2hiT2spIHsKCQkJCUVQTF9EQkdMVkxfRVZFTlRLX1RSQUNFMQoJCQkJICAgICgiRXBsRXZlbnRrUG9zdCgpOiBTaGJDaXJXcml0ZURhdGFDaHVuayhLMlUpIC0+IDB4JVhcbiIsCgkJCQkgICAgIFNoYkVycm9yKTsKCQkJCVJldCA9IGtFcGxFdmVudFBvc3RFcnJvcjsKCQkJCWdvdG8gRXhpdDsKCQkJfQoJCQlpZiAoZkJ1ZmZlckNvbXBsZXRlZCA9PSBGQUxTRSkgewoJCQkJU2hiRXJyb3IgPQoJCQkJICAgIFNoYkNpcldyaXRlRGF0YUNodW5rKEVwbEV2ZW50a0luc3RhbmNlX2cuCgkJCQkJCQkgbV9wU2hiS2VybmVsVG9Vc2VySW5zdGFuY2UsCgkJCQkJCQkgJlNoYkNpckNodW5rLAoJCQkJCQkJIHBFdmVudF9wLT5tX3BBcmcsCgkJCQkJCQkgKHVuc2lnbmVkIGxvbmcpCgkJCQkJCQkgcEV2ZW50X3AtPm1fdWlTaXplLAoJCQkJCQkJICZmQnVmZmVyQ29tcGxldGVkKTsKCQkJCWlmICgoU2hiRXJyb3IgIT0ga1NoYk9rKQoJCQkJICAgIHx8IChmQnVmZmVyQ29tcGxldGVkID09IEZBTFNFKSkgewoJCQkJCUVQTF9EQkdMVkxfRVZFTlRLX1RSQUNFMQoJCQkJCSAgICAoIkVwbEV2ZW50a1Bvc3QoKTogU2hiQ2lyV3JpdGVEYXRhQ2h1bmsyKEsyVSkgLT4gMHglWFxuIiwKCQkJCQkgICAgIFNoYkVycm9yKTsKCQkJCQlSZXQgPSBrRXBsRXZlbnRQb3N0RXJyb3I7CgkJCQkJZ290byBFeGl0OwoJCQkJfQoJCQl9Ci8vICAgICAgICAgICAgQkVOQ0hNQVJLX01PRF8yN19SRVNFVCgzKTsgIC8vIDgyILVzIHVudGlsIFNoYkNpckdldFJlYWREYXRhU2l6ZSgpIGluIEVwbEV2ZW50dQoKI2Vsc2UKCQkJUmV0ID0gRXBsRXZlbnR1UHJvY2VzcyhwRXZlbnRfcCk7CiNlbmRpZgoKCQkJYnJlYWs7CgkJfQoKCWRlZmF1bHQ6CgkJewoJCQlSZXQgPSBrRXBsRXZlbnRVbmtub3duU2luazsKCQl9CgoJfQkJCS8vIGVuZCBvZiBzd2l0Y2gocEV2ZW50X3AtPm1fRXZlbnRTaW5rKQoKI2lmbmRlZiBFUExfTk9fRklGTwogICAgICBFeGl0OgojZW5kaWYKCXJldHVybiBSZXQ7Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vCi8vIEZ1bmN0aW9uOiAgICBFcGxFdmVudGtQb3N0RXJyb3IKLy8KLy8gRGVzY3JpcHRpb246IHBvc3QgZXJyb3IgZXZlbnQgZnJvbSBrZXJuZWwgcGFydCB0byBBUEkgbGF5ZXIKLy8KLy8gUGFyYW1ldGVyczogIEV2ZW50U291cmNlX3AgICA9IHNvdXJjZS1tb2R1bGUgb2YgdGhlIGVycm9yIGV2ZW50Ci8vICAgICAgICAgICAgICBFcGxFcnJvcl9wICAgICAgPSBjb2RlIG9mIG9jY3VyZWQgZXJyb3IKLy8gICAgICAgICAgICAgIEFyZ1NpemVfcCAgICAgICA9IHNpemUgb2YgdGhlIGFyZ3VtZW50Ci8vICAgICAgICAgICAgICBwQXJnX3AgICAgICAgICAgPSBwb2ludGVyIHRvIHRoZSBhcmd1bWVudAovLwovLyBSZXR1cm5zOiAgICAgdEVwS2VybmVsICAgICAgID0gZXJyb3Jjb2RlCi8vCi8vIFN0YXRlOgovLwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKdEVwbEtlcm5lbCBQVUJMSUMgRXBsRXZlbnRrUG9zdEVycm9yKHRFcGxFdmVudFNvdXJjZSBFdmVudFNvdXJjZV9wLAoJCQkJICAgICB0RXBsS2VybmVsIEVwbEVycm9yX3AsCgkJCQkgICAgIHVuc2lnbmVkIGludCB1aUFyZ1NpemVfcCwgdm9pZCAqcEFyZ19wKQp7Cgl0RXBsS2VybmVsIFJldDsKCUJZVEUgYWJCdWZmZXJbRVBMX01BWF9FVkVOVF9BUkdfU0laRV07Cgl0RXBsRXZlbnRFcnJvciAqcEV2ZW50RXJyb3IgPSAodEVwbEV2ZW50RXJyb3IgKikgYWJCdWZmZXI7Cgl0RXBsRXZlbnQgRXBsRXZlbnQ7CgoJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CgoJLy8gY3JlYXRlIGFyZ3VtZW50CglwRXZlbnRFcnJvci0+bV9FdmVudFNvdXJjZSA9IEV2ZW50U291cmNlX3A7CglwRXZlbnRFcnJvci0+bV9FcGxFcnJvciA9IEVwbEVycm9yX3A7CglFUExfTUVNQ1BZKCZwRXZlbnRFcnJvci0+bV9BcmcsIHBBcmdfcCwgdWlBcmdTaXplX3ApOwoKCS8vIGNyZWF0ZSBldmVudAoJRXBsRXZlbnQubV9FdmVudFR5cGUgPSBrRXBsRXZlbnRUeXBlRXJyb3I7CglFcGxFdmVudC5tX0V2ZW50U2luayA9IGtFcGxFdmVudFNpbmtBcGk7CglFUExfTUVNU0VUKCZFcGxFdmVudC5tX05ldFRpbWUsIDB4MDAsIHNpemVvZihFcGxFdmVudC5tX05ldFRpbWUpKTsKCUVwbEV2ZW50Lm1fdWlTaXplID0KCSAgICAoc2l6ZW9mKEV2ZW50U291cmNlX3ApICsgc2l6ZW9mKEVwbEVycm9yX3ApICsgdWlBcmdTaXplX3ApOwoJRXBsRXZlbnQubV9wQXJnID0gJmFiQnVmZmVyWzBdOwoKCS8vIHBvc3QgZXJyb3JldmVudAoJUmV0ID0gRXBsRXZlbnRrUG9zdCgmRXBsRXZlbnQpOwoKCXJldHVybiBSZXQ7Cn0KCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCi8vICAgICAgICAgIFAgUiBJIFYgQSBUIEUgICBGIFUgTiBDIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLwovLyBGdW5jdGlvbjogICAgRXBsRXZlbnRrUnhTaWduYWxIYW5kbGVyQ2IoKQovLwovLyBEZXNjcmlwdGlvbjogQ2FsbGJhY2stZnVuY3Rpb24gZm9yIGV2ZW50cyBmcm9tIHVzZXIgYW5kIGtlcm5lbCBwYXJ0Ci8vCi8vIFBhcmFtZXRlcnM6ICBwU2hiUnhJbnN0YW5jZV9wICAgID0gSW5zdGFuY2UtcG9pbnRlciBvZiBidWZmZXIKLy8gICAgICAgICAgICAgIHVsRGF0YVNpemVfcCAgICAgICAgPSBzaXplIG9mIGRhdGEKLy8KLy8gUmV0dXJuczogdm9pZAovLwovLyBTdGF0ZToKLy8KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiNpZm5kZWYgRVBMX05PX0ZJRk8Kc3RhdGljIHZvaWQgRXBsRXZlbnRrUnhTaWduYWxIYW5kbGVyQ2IodFNoYkluc3RhbmNlIHBTaGJSeEluc3RhbmNlX3AsCgkJCQkgICAgICAgdW5zaWduZWQgbG9uZyB1bERhdGFTaXplX3ApCnsKCXRFcGxFdmVudCAqcEVwbEV2ZW50OwoJdFNoYkVycm9yIFNoYkVycm9yOwovL3Vuc2lnbmVkIGxvbmcgICB1bEJsb2NrQ291bnQ7Ci8vdW5zaWduZWQgbG9uZyAgIHVsRGF0YVNpemU7CglCWVRFIGFiRGF0YUJ1ZmZlcltzaXplb2YodEVwbEV2ZW50KSArIEVQTF9NQVhfRVZFTlRfQVJHX1NJWkVdOwoJLy8gZC5rLjogYWJEYXRhQnVmZmVyIGNvbnRhaW5zIHRoZSBjb21wbGV0ZSB0RXBsRXZlbnQgc3RydWN0dXJlCgkvLyAgICAgICBhbmQgYmVoaW5kIHRoaXMgdGhlIGFyZ3VtZW50CgoJVEdUX0RCR19TSUdOQUxfVFJBQ0VfUE9JTlQoMjApOwoKCUJFTkNITUFSS19NT0RfMjdfUkVTRVQoMCk7CgkvLyBjb3B5IGRhdGEgZnJvbSBldmVudCBxdWV1ZQoJU2hiRXJyb3IgPSBTaGJDaXJSZWFkRGF0YUJsb2NrKHBTaGJSeEluc3RhbmNlX3AsCgkJCQkgICAgICAgJmFiRGF0YUJ1ZmZlclswXSwKCQkJCSAgICAgICBzaXplb2YoYWJEYXRhQnVmZmVyKSwgJnVsRGF0YVNpemVfcCk7CglpZiAoU2hiRXJyb3IgIT0ga1NoYk9rKSB7CgkJLy8gZXJyb3IgZ290byBleGl0CgkJZ290byBFeGl0OwoJfQoJLy8gcmVzb2x2ZSB0aGUgcG9pbnRlciB0byB0aGUgZXZlbnQgc3RydWN0dXJlCglwRXBsRXZlbnQgPSAodEVwbEV2ZW50ICopIGFiRGF0YUJ1ZmZlcjsKCS8vIHNldCBEYXRhc2l6ZQoJcEVwbEV2ZW50LT5tX3VpU2l6ZSA9ICh1bERhdGFTaXplX3AgLSBzaXplb2YodEVwbEV2ZW50KSk7CglpZiAocEVwbEV2ZW50LT5tX3VpU2l6ZSA+IDApIHsKCQkvLyBzZXQgcG9pbnRlciB0byBhcmd1bWVudAoJCXBFcGxFdmVudC0+bV9wQXJnID0gJmFiRGF0YUJ1ZmZlcltzaXplb2YodEVwbEV2ZW50KV07Cgl9IGVsc2UgewoJCS8vc2V0IHBvaW50ZXIgdG8gTlVMTAoJCXBFcGxFdmVudC0+bV9wQXJnID0gTlVMTDsKCX0KCglCRU5DSE1BUktfTU9EXzI3X1NFVCgwKTsKCS8vIGNhbGwgcHJvY2Vzc2Z1bmN0aW9uCglFcGxFdmVudGtQcm9jZXNzKHBFcGxFdmVudCk7CgogICAgICBFeGl0OgoJcmV0dXJuOwp9CiNlbmRpZgoKLy8gRU9GCg==