LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAogKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQogKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgogKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQogKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIAogKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKiAKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAogKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgogKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKICogdW5kZXIgdGhlIExpY2Vuc2UuCiAqIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCgojaWZuZGVmIF9QT09MRk1UX0hYWAojZGVmaW5lIF9QT09MRk1UX0hYWAoKI2luY2x1ZGUgPGxpbWl0cy5oPgojaW5jbHVkZSA8dG9vbHMvc29sYXIuaD4KI2luY2x1ZGUgPGVkaXRlbmcvZnJtZGlyLmh4eD4KCi8vIFBPT0xDT0xMLUlEczoKLy8gKy0tLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rCi8vICFVc2VyISAgICBCZXJlaWNoICAgICEgMCAhICAgICAgICAgICAgICAgT2Zmc2V0ICAgICAgICAgICAgICAgICAgIQovLyArLS0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSsKLy8KLy8JQmVyZWljaDoJCQkJCQkxIC0gVGV4dAovLwkJCQkJCQkJCTIgLSBMaXN0ZW4KLy8JCQkJCQkJCQkzIC0gU29uZGVyYmVyZWljaGUKLy8JCQkJCQkJCQk0IC0gVmVyemVpY2huaXNzZQovLwkJCQkJCQkJCTUgLSBLYXBpdGVsIC8gRG9rdW1lbnQKLy8JCQkJCQkJCQk2IC0gSFRNTC1Wb3JsYWdlbgoKLy8gQW5kZXJlIElEczoKLy8gKy0tLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rCi8vICFVc2VyISAgICBCZXJlaWNoICAgICEgMSAhICAgICAgICAgICBPZmZzZXQgICAgICAgICAgICAgICAgICAgICAgIQovLyArLS0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSsKLy8gQmVyZWljaDoJCQkJCQkJMCAtIFplaWNoZW52b3JsYWdlbgovLwkJCQkJCQkJCTEgLSBGcmFtZS1Wb3JsYWdlbgovLwkJCQkJCQkJCTIgLSBTZWl0ZW52b3JsYWdlbgovLwkJCQkJCQkJCTMgLSBBYnNhdHpmb3JtYXRlICg/KQovLwkJCQkJCQkJCTQgLSBHcmFmaWtmb3JtYXRlICg/KQoKLy8gRoFyIGFsbGUgSURzIGdpbHQ6Ci8vIEhlcmt1bmZ0OiAgICAgICAgICAgICAgICAgCQkwIC1Qb29sCi8vCQkJCQkJCQkJMSAtQmVudXR6ZXIKLy8gT2Zmc2V0OgkJCQkJCQlpbm5lcmhhbGIgZGVyIEdydXBwZQoKCi8vICEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhIQovLwovLyBBQ0hUVU5HOgluZXVlIElEJ3Mga29lbm5lbiBudXIgbm9jaCBhbSBFbmRlIGRlciBqZXdlaWxpZ2VuIEdydXBwZQovLwkJCXp1Z2VmdWVndCB3ZXJkZW4uIERpZXNlIElkJ3Mgd2VyZGVuIHZvbSBSZWFkZXIvV3JpdGVyIGdlLQovLwkJCWxlc2VuIHVuZCBnZXNjaHJpZWJlbi4gRGllc2Uga2VubmVuIG51ciBkZW4gT2Zmc2V0IHp1bSBTdGFydAovLwovLyAhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKCi8vIE1hc2tlIGZ1ZXIgRXJrZW5udW5nIHZvbiBDT0xMUE9PTC1JZHM6Cgpjb25zdCBzYWxfdUludDE2IFBPT0xHUlBfTk9DT0xMSUQJCT0gICgxIDw8IDEwKTsKCi8vIFBPTExDT0xMLUdydXBwZW46Cgpjb25zdCBzYWxfdUludDE2IFVTRVJfRk1UIAkJCQk9ICAoMSA8PCAxNSk7CmNvbnN0IHNhbF91SW50MTYgUE9PTF9GTVQgCQkJCT0gICgwIDw8IDE1KTsKCmNvbnN0IHNhbF91SW50MTYgQ09MTF9URVhUX0JJVFMJCQk9ICAoMSA8PCAxMSk7CmNvbnN0IHNhbF91SW50MTYgQ09MTF9MSVNUU19CSVRTCQk9ICAoMiA8PCAxMSk7CmNvbnN0IHNhbF91SW50MTYgQ09MTF9FWFRSQV9CSVRTCQk9ICAoMyA8PCAxMSk7CmNvbnN0IHNhbF91SW50MTYgQ09MTF9SRUdJU1RFUl9CSVRTCQk9ICAoNCA8PCAxMSk7CmNvbnN0IHNhbF91SW50MTYgQ09MTF9ET0NfQklUUyAJCQk9ICAoNSA8PCAxMSk7CmNvbnN0IHNhbF91SW50MTYgQ09MTF9IVE1MX0JJVFMgCQk9ICAoNiA8PCAxMSk7CmNvbnN0IHNhbF91SW50MTYgQ09MTF9HRVRfUkFOR0VfQklUUyAgICA9ICgxNSA8PCAxMSk7CgovLyBTb25zdGlnZSBHcnVwcGVuOgoKY29uc3Qgc2FsX3VJbnQxNiBQT09MR1JQX0NIQVJGTVQgICAgICAgID0gKDAgPDwgMTEpICsgUE9PTEdSUF9OT0NPTExJRDsKY29uc3Qgc2FsX3VJbnQxNiBQT09MR1JQX0ZSQU1FRk1UCQk9ICgxIDw8IDExKSArIFBPT0xHUlBfTk9DT0xMSUQ7CmNvbnN0IHNhbF91SW50MTYgUE9PTEdSUF9QQUdFREVTQwkJPSAoMiA8PCAxMSkgKyBQT09MR1JQX05PQ09MTElEOwpjb25zdCBzYWxfdUludDE2IFBPT0xHUlBfTlVNUlVMRQkJPSAoMyA8PCAxMSkgKyBQT09MR1JQX05PQ09MTElEOwovL2NvbnN0IHNhbF91SW50MTYgUE9PTEdSUF9HUkZGTVQJCQk9ICg0IDw8IDExKSArIFBPT0xHUlBfTk9DT0xMSUQ7IC8vID8KCi8vIGZ1ZXIgRXJrZW5udW5nIG9iIEJlbnV0emVyLVZvcmxhZ2Ugb2RlciBuaWNodDoKY29uc3Qgc2FsX3VJbnQxNiBQT09MX0lEVVNFUl9GTVQgPQoJCVVTSFJUX01BWCAmIH4oQ09MTF9HRVRfUkFOR0VfQklUUyArIFBPT0xHUlBfTk9DT0xMSUQpOwoKaW5saW5lIHNhbF9Cb29sIElzUG9vbFVzZXJGbXQoIHNhbF91SW50MTYgbklkICkKewoJcmV0dXJuIFBPT0xfSURVU0VSX0ZNVCA9PQoJCQkJKG5JZCAmIH4oQ09MTF9HRVRfUkFOR0VfQklUUyArIFBPT0xHUlBfTk9DT0xMSUQpKQoJCT8gc2FsX1RydWUgOiBzYWxfRmFsc2U7Cn0KCgovLyBJRC1zIGZ1ZXIgZGllIEJlcmVpY2hlCmVudW0gUkVTX1BPT0xGTVQKewpSRVNfUE9PTEZNVF9CRUdJTiA9IDEsCS8vIEhJRVIgR0VIVCdTIExPUyAhISEKUkVTX1BPT0xfQ0hSRk1UID0gUkVTX1BPT0xGTVRfQkVHSU4sClJFU19QT09MX0ZSTUZNVCwKUkVTX1BPT0xfVFhUQ09MTCwKUkVTX1BPT0xfUEFHRUZNVCwKClJFU19QT09MX1BBUkZNVCwJLy8gPz8/ClJFU19QT09MX0dSRkZNVCwgCS8vID8/PwpSRVNfUE9PTEZNVF9FTkQKfTsKCi8vIEJlcmVpY2hlIGZ1ZXIgZGllIElkJ3MgZGVyIGVpbnplbG5lbiBGb3JtYXRlCgovLyBkaWUgSWQncyBmdWVyIGRpZSBaZWljaGVuLVZvcmxhZ2VuCmVudW0gUkVTX1BPT0xfQ0hSRk1UX1RZUEUKewpSRVNfUE9PTENIUl9CRUdJTiA9IFBPT0xHUlBfQ0hBUkZNVCwKUkVTX1BPT0xDSFJfTk9STUFMX0JFR0lOID0gUE9PTEdSUF9DSEFSRk1ULAoKUkVTX1BPT0xDSFJfRk9PVE5PVEUgPSBSRVNfUE9PTENIUl9OT1JNQUxfQkVHSU4sCS8vIEZ1c3Nub3RlClJFU19QT09MQ0hSX1BBR0VOTywJCQkJCQkJCQkvLyBTZWl0ZW4vRmVsZApSRVNfUE9PTENIUl9MQUJFTCwJCQkJCQkJCQkvLyBCZXNjaHJpZnR1bmcKUkVTX1BPT0xDSFJfRFJPUENBUFMsCQkJCQkJCQkvLyBJbml0aWFsaWVuemVpY2hlbgpSRVNfUE9PTENIUl9OVU1fTEVWRUwsCQkJCQkJCQkvLyBOdW1tZXJpZXJ1bmdzemVpY2hlbgpSRVNfUE9PTENIUl9CVUxfTEVWRUwsCQkJCQkJCQkvLyBBdWZ6YWVobHVuZ3N6ZWljaGVuCgpSRVNfUE9PTENIUl9JTkVUX05PUk1BTCwJCQkJCQkJLy8gSW50ZXJuZXQgbm9ybWFsClJFU19QT09MQ0hSX0lORVRfVklTSVQsCQkJCQkJCQkvLyBJbnRlcm5ldCBiZXN1Y2h0ClJFU19QT09MQ0hSX0pVTVBFRElULAkJCQkJCQkJLy8gUGxhdHpoYWx0ZXIKUkVTX1BPT0xDSFJfVE9YSlVNUCwJCQkJCQkJCS8vIFNwcnVuZyBhdXMgVmVyemVpY2huaXMKUkVTX1BPT0xDSFJfRU5ETk9URSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVuZG5vdGUKUkVTX1BPT0xDSFJfTElORU5VTSwJCQkJCQkJCS8vIFplaWxlbm51bW1lcmllcnVuZwpSRVNfUE9PTENIUl9JRFhfTUFJTl9FTlRSWSwJCQkJCQkJLy8gbWFpbiBlbnRyeSBpbiBpbmRleGVzClJFU19QT09MQ0hSX0ZPT1ROT1RFX0FOQ0hPUiwJCQkJCQkvLyBGdXNzbm90ZW5hbmtlcgpSRVNfUE9PTENIUl9FTkROT1RFX0FOQ0hPUiwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRW5kbm90ZW5hbmtlcgpSRVNfUE9PTENIUl9SVUJZVEVYVCwgICAgICAgICAgICAgICAgICAgICAgICAgCQkvLyBSdWJ5dGV4dApSRVNfUE9PTENIUl9WRVJUX05VTSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVmVydGljYWwgbnVtYmVyaW5nIHN5bWJvbHMKClJFU19QT09MQ0hSX05PUk1BTF9FTkQsCgpSRVNfUE9PTENIUl9IVE1MX0JFR0lOID0gUkVTX1BPT0xDSFJfQkVHSU4gKyA1MCwJLy8gSFRNTC1Wb3JsYWdlbgpSRVNfUE9PTENIUl9IVE1MX0VNUEhBU0lTPSBSRVNfUE9PTENIUl9IVE1MX0JFR0lOLApSRVNfUE9PTENIUl9IVE1MX0NJVElBVElPTiwKUkVTX1BPT0xDSFJfSFRNTF9TVFJPTkcsClJFU19QT09MQ0hSX0hUTUxfQ09ERSwKUkVTX1BPT0xDSFJfSFRNTF9TQU1QTEUsClJFU19QT09MQ0hSX0hUTUxfS0VZQk9BUkQsClJFU19QT09MQ0hSX0hUTUxfVkFSSUFCTEUsClJFU19QT09MQ0hSX0hUTUxfREVGSU5TVEFOQ0UsClJFU19QT09MQ0hSX0hUTUxfVEVMRVRZUEUsClJFU19QT09MQ0hSX0hUTUxfRU5ELAoKUkVTX1BPT0xDSFJfRU5EID0gUkVTX1BPT0xDSFJfSFRNTF9FTkQKfTsKCgovLyBkaWUgSWQncyBmdWVyIGRpZSBSYWhtZW4tVm9ybGFnZW4KZW51bSBSRVNfUE9PTF9GUk1GTVRfVFlQRQp7ClJFU19QT09MRlJNX0JFR0lOID0gUE9PTEdSUF9GUkFNRUZNVCwKClJFU19QT09MRlJNX0ZSQU1FID0gUkVTX1BPT0xGUk1fQkVHSU4sCQkJCS8vIFJhaG1lbgpSRVNfUE9PTEZSTV9HUkFQSElDLAkJCQkJCQkJLy8gR3JhcGhpYwpSRVNfUE9PTEZSTV9PTEUsCQkJCQkJCQkJLy8gT0xFClJFU19QT09MRlJNX0ZPUk1FTCwJCQkJCQkJCQkvLyBGb3JtZWxuClJFU19QT09MRlJNX01BUkdJTkFMLAkJCQkJCQkJLy8gTWFyZ2luYWxlbgpSRVNfUE9PTEZSTV9XQVRFUlNJR04sCQkJCQkJCQkvLyBXYXNzZXJ6ZWljaGVuClJFU19QT09MRlJNX0xBQkVMLAkJCQkJCQkJCS8vIEV0aWtldHRlCgpSRVNfUE9PTEZSTV9FTkQKfTsKCi8vIGRpZSBJZCdzIGZ1ZXIgZGllIFNlaXRlbi1Wb3JsYWdlbgplbnVtIFJFU19QT09MX1BBR0VGTVRfVFlQRQp7ClJFU19QT09MUEFHRV9CRUdJTiA9IFBPT0xHUlBfUEFHRURFU0MsCgpSRVNfUE9PTFBBR0VfU1RBTkRBUkQgPSBSRVNfUE9PTFBBR0VfQkVHSU4sCQkJLy8gU3RhbmRhcmQtU2VpdGUKUkVTX1BPT0xQQUdFX0ZJUlNULAkJCQkJCQkJCS8vIEVyc3RlIFNlaXRlClJFU19QT09MUEFHRV9MRUZULAkJCQkJCQkJCS8vIExpbmtlIFNlaXRlClJFU19QT09MUEFHRV9SSUdIVCwJCQkJCQkJCQkvLyBSZWNodGUgU2VpdGUKUkVTX1BPT0xQQUdFX0pBS0VULAkJCQkJCQkJCS8vIFVtc2NobGFnClJFU19QT09MUEFHRV9SRUdJU1RFUiwJCQkJCQkJCS8vIFZlcnplaWNobmlzClJFU19QT09MUEFHRV9IVE1MLAkJCQkJCQkJCS8vIEhUTUwKUkVTX1BPT0xQQUdFX0ZPT1ROT1RFLAkJCQkJCQkJLy8gRnVzc25vdGUgYmVpIERva3VtZW50ZW5kZQpSRVNfUE9PTFBBR0VfRU5ETk9URSwJCQkJCQkJCS8vIEVuZG5vdGVuc3NlaXRlClJFU19QT09MUEFHRV9MQU5EU0NBUEUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBMYW5kc2NhcGUgUGFnZSBTdHlsZQoKUkVTX1BPT0xQQUdFX0VORAp9OwoKLy8gZGllIElkJ3MgZnVlciBkaWUgTnVtUnVsZS1Wb3JsYWdlbgplbnVtIFJFU19QT09MX05VTVJVTEVfVFlQRQp7ClJFU19QT09MTlVNUlVMRV9CRUdJTiA9IFBPT0xHUlBfTlVNUlVMRSwKUkVTX1BPT0xOVU1SVUxFX05VTTEgPSBSRVNfUE9PTE5VTVJVTEVfQkVHSU4sCQkvLyBOdW1SdWxlIE51bWVyaWVydW5nIDEKUkVTX1BPT0xOVU1SVUxFX05VTTIsCQkJCQkJCQkvLyBOdW1SdWxlIE51bWVyaWVydW5nIDIKUkVTX1BPT0xOVU1SVUxFX05VTTMsCQkJCQkJCQkvLyBOdW1SdWxlIE51bWVyaWVydW5nIDMKUkVTX1BPT0xOVU1SVUxFX05VTTQsCQkJCQkJCQkvLyBOdW1SdWxlIE51bWVyaWVydW5nIDQKUkVTX1BPT0xOVU1SVUxFX05VTTUsCQkJCQkJCQkvLyBOdW1SdWxlIE51bWVyaWVydW5nIDUKUkVTX1BPT0xOVU1SVUxFX0JVTDEsCQkJCQkJCQkvLyBOdW1SdWxlIEJ1bGxldHMgMQpSRVNfUE9PTE5VTVJVTEVfQlVMMiwJCQkJCQkJCS8vIE51bVJ1bGUgQnVsbGV0cyAyClJFU19QT09MTlVNUlVMRV9CVUwzLAkJCQkJCQkJLy8gTnVtUnVsZSBCdWxsZXRzIDMKUkVTX1BPT0xOVU1SVUxFX0JVTDQsCQkJCQkJCQkvLyBOdW1SdWxlIEJ1bGxldHMgNApSRVNfUE9PTE5VTVJVTEVfQlVMNSwJCQkJCQkJCS8vIE51bVJ1bGUgQnVsbGV0cyA1ClJFU19QT09MTlVNUlVMRV9FTkQKfTsKCi8vIGRpZSBJZCdzIGZ1ZXIgZGllIEFic2F0ei1Wb3JsYWdlbgplbnVtIFJFU19QT09MX0NPTExGTVRfVFlQRQp7Ci8vIEdydXBwZSBUZXh0ClJFU19QT09MQ09MTF9URVhUX0JFR0lOID0gQ09MTF9URVhUX0JJVFMsCgpSRVNfUE9PTENPTExfU1RBTkRBUkQgPSBSRVNfUE9PTENPTExfVEVYVF9CRUdJTiwgCQkvLyBTdGFuZGFyZApSRVNfUE9PTENPTExfVEVYVCwJCQkJCQkJCQkJLy8gVGV4dGtvZXJwZXIKUkVTX1BPT0xDT0xMX1RFWFRfSURFTlQsCQkJCQkJCQkvLyBUZXh0a29lcnBlciBFaW56dWcKUkVTX1BPT0xDT0xMX1RFWFRfTkVHSURFTlQsCQkJCQkJCQkvLyBUZXh0a29lcnBlciBuZWcuIEVpbnp1ZwpSRVNfUE9PTENPTExfVEVYVF9NT1ZFLAkJCQkJCQkJCS8vIFRleHRrb2VycGVyIEVpbnJ1ZWNrdW5nClJFU19QT09MQ09MTF9HUkVFVElORywJCQkJCQkJCQkvLyBHcnVzc2Zvcm1lbApSRVNfUE9PTENPTExfU0lHTkFUVVJFLAkJCQkJCQkJCS8vIFVudGVyc2NocmlmdApSRVNfUE9PTENPTExfQ09ORlJPTlRBVElPTiwJCQkJCQkJCS8vIEdlZ2VudWViZXJzdGVsbHVuZwpSRVNfUE9PTENPTExfTUFSR0lOQUwsCQkJCQkJCQkJLy8gTWFyZ2luYWxpZQoKCS8vIFVudGVyZ3J1cHBpZXJ1bmcgVWViZXJzY2hyaWZ0ZW4KUkVTX1BPT0xDT0xMX0hFQURMSU5FX0JBU0UsCQkJCQkJCQkvLyBCYXNpcy1VZWJlcnNjaHJpZnQKUkVTX1BPT0xDT0xMX0hFQURMSU5FMSwgCQkJCQkJCQkvLyBVZWJlcnNjaHJpZnQgMQpSRVNfUE9PTENPTExfSEVBRExJTkUyLAkJCQkJCQkJCS8vIFVlYmVyc2NocmlmdCAyClJFU19QT09MQ09MTF9IRUFETElORTMsCQkJCQkJCQkJLy8gVWViZXJzY2hyaWZ0IDMKUkVTX1BPT0xDT0xMX0hFQURMSU5FNCwJCQkJCQkJCQkvLyBVZWJlcnNjaHJpZnQgNApSRVNfUE9PTENPTExfSEVBRExJTkU1LAkJCQkJCQkJCS8vIFVlYmVyc2NocmlmdCA1ClJFU19QT09MQ09MTF9IRUFETElORTYsIAkJCQkJCQkJLy8gVWViZXJzY2hyaWZ0IDYKUkVTX1BPT0xDT0xMX0hFQURMSU5FNywJCQkJCQkJCQkvLyBVZWJlcnNjaHJpZnQgNwpSRVNfUE9PTENPTExfSEVBRExJTkU4LAkJCQkJCQkJCS8vIFVlYmVyc2NocmlmdCA4ClJFU19QT09MQ09MTF9IRUFETElORTksCQkJCQkJCQkJLy8gVWViZXJzY2hyaWZ0IDkKUkVTX1BPT0xDT0xMX0hFQURMSU5FMTAsCQkJCQkJCQkvLyBVZWJlcnNjaHJpZnQgMTAKClJFU19QT09MQ09MTF9URVhUX0VORCwKCgovLyBHcnVwcGUgTGlzdGVuClJFU19QT09MQ09MTF9MSVNUU19CRUdJTiA9IENPTExfTElTVFNfQklUUywKClJFU19QT09MQ09MTF9OVU1CVUxfQkFTRSA9IFJFU19QT09MQ09MTF9MSVNUU19CRUdJTiwgCS8vIEJhc2lzLUxpc3RlCgoJLy8gVW50ZXJncnVwcGUgTnVtbWVyaWVydW5nClJFU19QT09MQ09MTF9OVU1fTEVWRUwxUywJCQkJCQkJIAkvLyBTdGFydCBMZXZlbDEKUkVTX1BPT0xDT0xMX05VTV9MRVZFTDEsCQkJCQkJCQkvLyAxLiBMZXZlbApSRVNfUE9PTENPTExfTlVNX0xFVkVMMUUsCQkJCQkJCQkvLyBFbmRlIExldmVsMQpSRVNfUE9PTENPTExfTlVNX05PTlVNMSwJCQkJCQkJCS8vIGtlaW5lIE51bW1lcmllcnVuZwpSRVNfUE9PTENPTExfTlVNX0xFVkVMMlMsCQkJCQkJCQkvLyBTdGFydCAyLiBMZXZlbApSRVNfUE9PTENPTExfTlVNX0xFVkVMMiwJCQkJCQkJCS8vIDIuIExldmVsClJFU19QT09MQ09MTF9OVU1fTEVWRUwyRSwJCQkJCQkJCS8vIEVuZGUgMi4gTGV2ZWwKUkVTX1BPT0xDT0xMX05VTV9OT05VTTIsIAkJCQkJCQkJLy8ga2VpbmUgTnVtbWVyaWVydW5nClJFU19QT09MQ09MTF9OVU1fTEVWRUwzUywJCQkJCQkJCS8vIFN0YXJ0IDMuIExldmVsClJFU19QT09MQ09MTF9OVU1fTEVWRUwzLAkJCQkJCQkJLy8gMy4gTGV2ZWwKUkVTX1BPT0xDT0xMX05VTV9MRVZFTDNFLAkJCQkJCQkJLy8gRW5kZSAzLiBMZXZlbApSRVNfUE9PTENPTExfTlVNX05PTlVNMywgCQkJCQkJCQkvLyBrZWluZSBOdW1tZXJpZXJ1bmcKUkVTX1BPT0xDT0xMX05VTV9MRVZFTDRTLAkJCQkJCQkJLy8gU3RhcnQgNC4gTGV2ZWwKUkVTX1BPT0xDT0xMX05VTV9MRVZFTDQsCQkJCQkJCQkvLyA0LiBMZXZlbApSRVNfUE9PTENPTExfTlVNX0xFVkVMNEUsCQkJCQkJCQkvLyBFbmRlIDQuIExldmVsClJFU19QT09MQ09MTF9OVU1fTk9OVU00LCAJCQkJCQkJCS8vIGtlaW5lIE51bW1lcmllcnVuZwpSRVNfUE9PTENPTExfTlVNX0xFVkVMNVMsCQkJCQkJCQkvLyBTdGFydCA1LiBMZXZlbApSRVNfUE9PTENPTExfTlVNX0xFVkVMNSwJCQkJCQkJCS8vIDUuIExldmVsClJFU19QT09MQ09MTF9OVU1fTEVWRUw1RSwJCQkJCQkJCS8vIEVuZGUgNS4gTGV2ZWwKUkVTX1BPT0xDT0xMX05VTV9OT05VTTUsIAkJCQkJCQkJLy8ga2VpbmUgTnVtbWVyaWVydW5nCgoJLy8gVW50ZXJncnVwcGUgQXVmemFlaGx1bmcKUkVTX1BPT0xDT0xMX0JVTF9MRVZFTDFTLAkJCQkJCQkgCS8vIFN0YXJ0IExldmVsMQpSRVNfUE9PTENPTExfQlVMX0xFVkVMMSwJCQkJCQkJCS8vIDEuIExldmVsClJFU19QT09MQ09MTF9CVUxfTEVWRUwxRSwJCQkJCQkJCS8vIEVuZGUgTGV2ZWwxClJFU19QT09MQ09MTF9CVUxfTk9OVU0xLAkJCQkJCQkJLy8ga2VpbmUgTnVtbWVyaWVydW5nClJFU19QT09MQ09MTF9CVUxfTEVWRUwyUywJCQkJCQkJCS8vIFN0YXJ0IDIuIExldmVsClJFU19QT09MQ09MTF9CVUxfTEVWRUwyLAkJCQkJCQkJLy8gMi4gTGV2ZWwKUkVTX1BPT0xDT0xMX0JVTF9MRVZFTDJFLAkJCQkJCQkJLy8gRW5kZSAyLiBMZXZlbApSRVNfUE9PTENPTExfQlVMX05PTlVNMiwgCQkJCQkJCQkvLyBrZWluZSBOdW1tZXJpZXJ1bmcKUkVTX1BPT0xDT0xMX0JVTF9MRVZFTDNTLAkJCQkJCQkJLy8gU3RhcnQgMy4gTGV2ZWwKUkVTX1BPT0xDT0xMX0JVTF9MRVZFTDMsCQkJCQkJCQkvLyAzLiBMZXZlbApSRVNfUE9PTENPTExfQlVMX0xFVkVMM0UsCQkJCQkJCQkvLyBFbmRlIDMuIExldmVsClJFU19QT09MQ09MTF9CVUxfTk9OVU0zLCAJCQkJCQkJCS8vIGtlaW5lIE51bW1lcmllcnVuZwpSRVNfUE9PTENPTExfQlVMX0xFVkVMNFMsCQkJCQkJCQkvLyBTdGFydCA0LiBMZXZlbApSRVNfUE9PTENPTExfQlVMX0xFVkVMNCwJCQkJCQkJCS8vIDQuIExldmVsClJFU19QT09MQ09MTF9CVUxfTEVWRUw0RSwJCQkJCQkJCS8vIEVuZGUgNC4gTGV2ZWwKUkVTX1BPT0xDT0xMX0JVTF9OT05VTTQsIAkJCQkJCQkJLy8ga2VpbmUgTnVtbWVyaWVydW5nClJFU19QT09MQ09MTF9CVUxfTEVWRUw1UywJCQkJCQkJCS8vIFN0YXJ0IDUuIExldmVsClJFU19QT09MQ09MTF9CVUxfTEVWRUw1LAkJCQkJCQkJLy8gNS4gTGV2ZWwKUkVTX1BPT0xDT0xMX0JVTF9MRVZFTDVFLAkJCQkJCQkJLy8gRW5kZSA1LiBMZXZlbApSRVNfUE9PTENPTExfQlVMX05PTlVNNSwgCQkJCQkJCQkvLyBrZWluZSBOdW1tZXJpZXJ1bmcKClJFU19QT09MQ09MTF9MSVNUU19FTkQsCgoKLy8gU29uZGVyYmVyZWljaGUKUkVTX1BPT0xDT0xMX0VYVFJBX0JFR0lOID0gQ09MTF9FWFRSQV9CSVRTLAoKCS8vIFVudGVyZ3J1cHBlIEhlYWRlcgpSRVNfUE9PTENPTExfSEVBREVSID0gUkVTX1BPT0xDT0xMX0VYVFJBX0JFR0lOLAkgICAJCS8vIEhlYWRlciBMZWZ0JlJpZ2h0ClJFU19QT09MQ09MTF9IRUFERVJMLAkJCQkJCQkJCS8vIEhlYWRlciBMZWZ0ClJFU19QT09MQ09MTF9IRUFERVJSLAkJCQkJCQkJCS8vIEhlYWRlciBSaWdodAoKCS8vIFVudGVyZ3J1cHBlIEZvb3RlcgpSRVNfUE9PTENPTExfRk9PVEVSLAkJCQkJCQkJCS8vIEZvb3RlciBMZWZ0JlJpZ2h0ClJFU19QT09MQ09MTF9GT09URVJMLAkJCQkJCQkJCS8vIEZvb3RlciBMZWZ0ClJFU19QT09MQ09MTF9GT09URVJSLAkJCQkJCQkJCS8vIEZvb3RlciBSaWdodAoKCS8vIFVudGVyZ3J1cHBlIFRhYmVsbGUKUkVTX1BPT0xDT0xMX1RBQkxFLAkJCQkJCQkJCQkvLyBUYWJlbGxlICJJbmhhbHQiClJFU19QT09MQ09MTF9UQUJMRV9IRExOLAkJCQkJCQkJLy8gVGFiZWxsZW4tSGVhZGxpbmUKCgoJLy8gVW50ZXJncnVwcGUgQmVzY2hyaWZ0dW5nClJFU19QT09MQ09MTF9MQUJFTCwJCQkJCQkJCQkJLy8gQmVzY2hyaWZ0dW5nLUJhc2lzClJFU19QT09MQ09MTF9MQUJFTF9BQkIsCSAJCQkJCQkJCS8vIEJlc2NocmlmdHVuZy1BYmJpbGR1bmcKUkVTX1BPT0xDT0xMX0xBQkVMX1RBQkxFLAkJCQkJCQkJLy8gQmVzY2hyaWZ0dW5nLVRhYmVsbGUKUkVTX1BPT0xDT0xMX0xBQkVMX0ZSQU1FLAkJCQkJCQkJLy8gQmVzY2hyaWZ0dW5nLVJhaG1lbgoKCS8vIHNvbnN0aWdlcwpSRVNfUE9PTENPTExfRlJBTUUsCQkJCQkJCQkJCS8vIFJhaG1lbgpSRVNfUE9PTENPTExfRk9PVE5PVEUsCQkJCQkJCQkJLy8gRnVzc25vdGVuClJFU19QT09MQ09MTF9KQUtFVEFEUkVTUywJCQkJCQkJCS8vIFVtc2NobGFnQWRyZXNzZQpSRVNfUE9PTENPTExfU0VOREFEUkVTUywJCQkJCQkJCS8vIEFic2VuZGVyQWRyZXNzZQpSRVNfUE9PTENPTExfRU5ETk9URSwJCQkJCQkJCQkvLyBFbmRub3RlbgoKUkVTX1BPT0xDT0xMX0xBQkVMX0RSQVdJTkcsCQkJCQkJCQkvLyBCZXNjaHJpZnR1bmctWmVpY2hlbi1PYmpla3RlClJFU19QT09MQ09MTF9FWFRSQV9FTkQsCgoKLy8gR3J1cHBlIFZlcnplaWNobmlzc2UKUkVTX1BPT0xDT0xMX1JFR0lTVEVSX0JFR0lOID0gQ09MTF9SRUdJU1RFUl9CSVRTLAoKUkVTX1BPT0xDT0xMX1JFR0lTVEVSX0JBU0UgPSBSRVNfUE9PTENPTExfUkVHSVNURVJfQkVHSU4sCS8vIEJhc2lzLVZlcnplaWNobmlzCgoJLy8gVW50ZXJncnVwcGUgSW5kZXgtVmVyemVpY2huaXNzZQpSRVNfUE9PTENPTExfVE9YX0lEWEgsCQkJCQkJCQkJLy8gSGVhZGVyClJFU19QT09MQ09MTF9UT1hfSURYMSwJCQkJCQkJCQkvLyAxLiBFYmVuZQpSRVNfUE9PTENPTExfVE9YX0lEWDIsCQkJCQkJCQkJLy8gMi4gRWJlbmUKUkVTX1BPT0xDT0xMX1RPWF9JRFgzLAkJCQkJCQkJCS8vIDMuIEViZW5lClJFU19QT09MQ09MTF9UT1hfSURYQlJFQUssIAkJCQkJCQkJLy8gVHJlbm5lcgoKCS8vIFVudGVyZ3J1cHBlIEluaGFsdHMtVmVyemVpY2huaXNzZQpSRVNfUE9PTENPTExfVE9YX0NOVE5USCwJCQkJCQkJCS8vIEhlYWRlcgpSRVNfUE9PTENPTExfVE9YX0NOVE5UMSwJCQkJCQkJCS8vIDEuIEViZW5lClJFU19QT09MQ09MTF9UT1hfQ05UTlQyLAkJCQkJCQkJLy8gMi4gRWJlbmUKUkVTX1BPT0xDT0xMX1RPWF9DTlROVDMsCQkJCQkJCQkvLyAzLiBFYmVuZQpSRVNfUE9PTENPTExfVE9YX0NOVE5UNCwJCQkJCQkJCS8vIDQuIEViZW5lClJFU19QT09MQ09MTF9UT1hfQ05UTlQ1LAkJCQkJCQkJLy8gNS4gRWJlbmUKCgkvLyBVbnRlcmdydXBwZSBCZW51dHplci1WZXJ6ZWljaG5pc3NlOgpSRVNfUE9PTENPTExfVE9YX1VTRVJILAkJCQkJCQkJCS8vIEhlYWRlcgpSRVNfUE9PTENPTExfVE9YX1VTRVIxLAkJCQkJCQkJCS8vIDEuIEViZW5lClJFU19QT09MQ09MTF9UT1hfVVNFUjIsCQkJCQkJCQkJLy8gMi4gRWJlbmUKUkVTX1BPT0xDT0xMX1RPWF9VU0VSMywJCQkJCQkJCQkvLyAzLiBFYmVuZQpSRVNfUE9PTENPTExfVE9YX1VTRVI0LAkJCQkJCQkJCS8vIDQuIEViZW5lClJFU19QT09MQ09MTF9UT1hfVVNFUjUsCQkJCQkJCQkJLy8gNS4gRWJlbmUKCgpSRVNfUE9PTENPTExfVE9YX0NOVE5UNiwJCQkJCQkJCS8vIEluaGFsdCA2LiBFYmVuZQpSRVNfUE9PTENPTExfVE9YX0NOVE5UNywJCQkJCQkJCS8vIEluaGFsdCA3LiBFYmVuZQpSRVNfUE9PTENPTExfVE9YX0NOVE5UOCwJCQkJCQkJCS8vIEluaGFsdCA4LiBFYmVuZQpSRVNfUE9PTENPTExfVE9YX0NOVE5UOSwJCQkJCQkJCS8vIEluaGFsdCA5LiBFYmVuZQpSRVNfUE9PTENPTExfVE9YX0NOVE5UMTAsCQkJCQkJCQkvLyBJbmhhbHQgMTAuIEViZW5lCgovLyBpbGx1c3RyYXRpb25zIGluZGV4ClJFU19QT09MQ09MTF9UT1hfSUxMVVNILAkJCQkJCQkJCS8vIGlsbHVzdHJhdGlvbnMgaGVhZGVyClJFU19QT09MQ09MTF9UT1hfSUxMVVMxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlsbHVzdHJhdGlvbnMgYWxsIGxldmVscwoKLy8Jb2JqZWN0IGluZGV4ClJFU19QT09MQ09MTF9UT1hfT0JKRUNUSCwJCQkJCQkJCS8vIG9iamVjdHMgaGVhZGVyClJFU19QT09MQ09MTF9UT1hfT0JKRUNUMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9iamVjdHMgYWxsIGxldmVscwoKLy8JdGFibGVzIGluZGV4ClJFU19QT09MQ09MTF9UT1hfVEFCTEVTSCwJCQkJCQkJCS8vIHRhYmxlcyBoZWFkZXIKUkVTX1BPT0xDT0xMX1RPWF9UQUJMRVMxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGFibGVzIGFsbCBsZXZlbHMKCi8vCWluZGV4IG9mIGF1dGhvcml0aWVzClJFU19QT09MQ09MTF9UT1hfQVVUSE9SSVRJRVNILAkJCQkJCQkvLyBhdXRob3JpdGllcyBoZWFkZXIKUkVTX1BPT0xDT0xMX1RPWF9BVVRIT1JJVElFUzEsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXV0aG9yaXRpZXMgYWxsIGxldmVscwoKLy8gdXNlciBpbmRleCA2Li4xMApSRVNfUE9PTENPTExfVE9YX1VTRVI2LAkJCQkJCQkJCS8vIGxldmVsIDYKUkVTX1BPT0xDT0xMX1RPWF9VU0VSNywJCQkJCQkJCQkvLyBsZXZlbCA3ClJFU19QT09MQ09MTF9UT1hfVVNFUjgsCQkJCQkJCQkJLy8gbGV2ZWwgOApSRVNfUE9PTENPTExfVE9YX1VTRVI5LAkJCQkJCQkJCS8vIGxldmVsIDkKUkVTX1BPT0xDT0xMX1RPWF9VU0VSMTAsCQkJCQkJCQkvLyBsZXZlbCAxMAoKUkVTX1BPT0xDT0xMX1JFR0lTVEVSX0VORCwKCgovLyBHcnVwcGUgS2FwaXRlbC9Eb2t1bWVudApSRVNfUE9PTENPTExfRE9DX0JFR0lOID0gQ09MTF9ET0NfQklUUywKClJFU19QT09MQ09MTF9ET0NfVElURUwgPSBSRVNfUE9PTENPTExfRE9DX0JFR0lOLCAgIAkJLy8gRG9jLiBUaXRlbApSRVNfUE9PTENPTExfRE9DX1NVQlRJVEVMLAkJCQkJCSAgIAkJLy8gRG9jLiBVbnRlclRpdGVsCgpSRVNfUE9PTENPTExfRE9DX0VORCwKCi8vIEdydXBwZSBIVE1MLVZvcmxhZ2VuClJFU19QT09MQ09MTF9IVE1MX0JFR0lOID0gQ09MTF9IVE1MX0JJVFMsCgpSRVNfUE9PTENPTExfSFRNTF9CTE9DS1FVT1RFID0gUkVTX1BPT0xDT0xMX0hUTUxfQkVHSU4sClJFU19QT09MQ09MTF9IVE1MX1BSRSwKUkVTX1BPT0xDT0xMX0hUTUxfSFIsClJFU19QT09MQ09MTF9IVE1MX0RELApSRVNfUE9PTENPTExfSFRNTF9EVCwKClJFU19QT09MQ09MTF9IVE1MX0VORAoKLy8gRW5kZSBkZXIgVGV4dGZvcm1hdC1Wb3JsYWdlbiBTYW1tbHVuZwp9OwoKCgovLyBlcmZyYWdlIGRlbiBkZWZpbmllcnRlbiBQYXJlbnQgenUgZWluZXIgUE9PTC1JZAovLwlyZXR1cm50OiAJMAkJCS0+IFN0YW5kYXJkCi8vCQkJCVVTSFJUX01BWAktPiBrZWluIFBhcmVudAovLwkJCQlzb25zdCAJCS0+IGRlbiBQYXJlbnQKc2FsX3VJbnQxNiBHZXRQb29sUGFyZW50KCBzYWxfdUludDE2IG5JZCApOwoKU3Z4RnJhbWVEaXJlY3Rpb24gR2V0RGVmYXVsdEZyYW1lRGlyZWN0aW9uKHNhbF91TG9uZyBuTGFuZ3VhZ2UpOwoKaW5saW5lIHNhbF9Cb29sIElzQ29uZGl0aW9uYWxCeVBvb2xJZChzYWxfdUludDE2IG5JZCkKCXsKCQlyZXR1cm4gUkVTX1BPT0xDT0xMX1RFWFQgPT0gbklkOwoJfQovLyBkaWUgSWQncyBmdWVyIGRpZSBHcmFmaWstRm9ybWF0ZQovKmVudW0gUkVTX1BPT0xfR1JGRk1UX1RZUEUKewpSRVNfUE9PTEdSRl9CRUdJTiA9IFJFU19QT09MUEFSX0VORCwKUkVTX1BPT0xHUkZfMSA9IFJFU19QT09MR1JGX0JFR0lOLApSRVNfUE9PTEdSRl9FTkQKfTsKKi8KCiNlbmRpZgo=