LyoKICogRnVuY3Rpb25zIHRvIGFjY2VzcyB0aGUgVFNDMjAwMCBjb250cm9sbGVyIG9uIFRSQUIgYm9hcmQgKHVzZWQgZm9yIHNjYW5uaW5nCiAqIHRoZXJtbyBzZW5zb3JzKQogKgogKiBDb3B5cmlnaHQgKEMpIDIwMDMgTWFydGluIEtyYXVzZSwgVFEtU3lzdGVtcyBHbWJILCBtYXJ0aW4ua3JhdXNlQHRxcy5kZQogKgogKiBDb3B5cmlnaHQgKEMpIDIwMDIgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgV29sZmdhbmcgRGVuaywgd2RAZGVueC5kZQogKgogKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwogKiBwcm9qZWN0LgogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCiAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAogKiBNQSAwMjExMS0xMzA3IFVTQQogKi8KCiNpbmNsdWRlIDxjb21tb24uaD4KI2luY2x1ZGUgPHMzYzI0MDAuaD4KI2luY2x1ZGUgPGFzbS9pby5oPgojaW5jbHVkZSA8ZGl2NjQuaD4KI2luY2x1ZGUgInRzYzIwMDAuaCIKCiNpbmNsdWRlICJQdDEwMDBfdGVtcF9kYXRhLmgiCgovKiBoZWxwZXIgZnVuY3Rpb24gKi8KI2RlZmluZSBhYnModmFsdWUpICgoKHZhbHVlKSA8IDApID8gKCh2YWx1ZSkqLTEpIDogKHZhbHVlKSkKCi8qCiAqIE1heGltYWwgYWxsb3dlZCBkZXZpYXRpb24gYmV0d2VlbiB0d28gaW1tZWRpYXRlIG1lYXNzdXJtZW50cyBvZiBhbiBhbmFsb2cKICogdGhlcm1vIGNoYW5uZWwuIDEgRElHSVQgPSAwLjAyNzYgsEMuIFRoaXMgaXMgdXNlZCB0byBmaWx0ZXIgc3BvcmFkaWMKICogImp1bXBzIiBpbiBtZWFzdXJtZW50LgogKi8KI2RlZmluZSBNQVhfREVWSUFUSU9OCTE4CS8qIHVuaXQ6IERJR0lUcyBvZiBhZGM7IDE4IERJR0lUID0gMC41ILBDICovCgp2b2lkIHRzYzIwMDBfc3BpX2luaXQodm9pZCkKewoJc3RydWN0IHMzYzI0eDBfZ3BpbyAqIGNvbnN0IGdwaW8gPSBzM2MyNHgwX2dldF9iYXNlX2dwaW8oKTsKCXN0cnVjdCBzM2MyNHgwX3NwaSAqIGNvbnN0IHNwaSA9IHMzYzI0eDBfZ2V0X2Jhc2Vfc3BpKCk7CglpbnQgaTsKCgkvKiBDb25maWd1cmUgSS9PIHBvcnRzLiAqLwoJZ3Bpby0+UERDT04gPSAoZ3Bpby0+UERDT04gJiAweEYzRkZGRikgfCAweDA0MDAwMDsKCWdwaW8tPlBHQ09OID0gKGdwaW8tPlBHQ09OICYgMHgwRjNGRkYpIHwgMHgwMDgwMDA7CglncGlvLT5QR0NPTiA9IChncGlvLT5QR0NPTiAmIDB4MENGRkZGKSB8IDB4MDIwMDAwOwoJZ3Bpby0+UEdDT04gPSAoZ3Bpby0+UEdDT04gJiAweDAzRkZGRikgfCAweDA4MDAwMDsKCglDTFJfQ1NfVE9VQ0goKTsKCglzcGktPmNoWzBdLlNQUFJFID0gMHgxRjsgLyogQmF1ZC1yYXRlIGNhLiA1MTRrSHogKi8KCXNwaS0+Y2hbMF0uU1BQSU4gPSAweDAxOyAvKiBTUEktTU9TSSBob2xkcyBMZXZlbCBhZnRlciBsYXN0IGJpdCAqLwoJc3BpLT5jaFswXS5TUENPTiA9IDB4MUE7IC8qIFBvbGxpbmcsIFByZXNjYWxlciwgTWFzdGVyLCBDUE9MPTAsCgkJCQkgICAgQ1BIQT0xICovCgoJLyogRHVtbXkgYnl0ZSBlbnN1cmVzIGNsb2NrIHRvIGJlIGxvdy4gKi8KCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKSB7CgkJc3BpLT5jaFswXS5TUFREQVQgPSAweEZGOwoJfQoJc3BpX3dhaXRfdHJhbnNtaXRfZG9uZSgpOwp9CgoKdm9pZCBzcGlfd2FpdF90cmFuc21pdF9kb25lKHZvaWQpCnsKCXN0cnVjdCBzM2MyNHgwX3NwaSAqIGNvbnN0IHNwaSA9IHMzYzI0eDBfZ2V0X2Jhc2Vfc3BpKCk7CgoJd2hpbGUgKCEoc3BpLT5jaFswXS5TUFNUQSAmIDB4MDEpKTsgLyogd2FpdCB1bnRpbCB0cmFuc2ZlciBpcyBkb25lICovCn0KCgp2b2lkIHRzYzIwMDBfd3JpdGUodW5zaWduZWQgc2hvcnQgcmVnLCB1bnNpZ25lZCBzaG9ydCBkYXRhKQp7CglzdHJ1Y3QgczNjMjR4MF9zcGkgKiBjb25zdCBzcGkgPSBzM2MyNHgwX2dldF9iYXNlX3NwaSgpOwoJdW5zaWduZWQgaW50IGNvbW1hbmQ7CgoJU0VUX0NTX1RPVUNIKCk7Cgljb21tYW5kID0gcmVnOwoJc3BpLT5jaFswXS5TUFREQVQgPSAoY29tbWFuZCAmIDB4RkYwMCkgPj4gODsKCXNwaV93YWl0X3RyYW5zbWl0X2RvbmUoKTsKCXNwaS0+Y2hbMF0uU1BUREFUID0gKGNvbW1hbmQgJiAweDAwRkYpOwoJc3BpX3dhaXRfdHJhbnNtaXRfZG9uZSgpOwoJc3BpLT5jaFswXS5TUFREQVQgPSAoZGF0YSAmIDB4RkYwMCkgPj4gODsKCXNwaV93YWl0X3RyYW5zbWl0X2RvbmUoKTsKCXNwaS0+Y2hbMF0uU1BUREFUID0gKGRhdGEgJiAweDAwRkYpOwoJc3BpX3dhaXRfdHJhbnNtaXRfZG9uZSgpOwoKCUNMUl9DU19UT1VDSCgpOwp9CgoKdW5zaWduZWQgc2hvcnQgdHNjMjAwMF9yZWFkICh1bnNpZ25lZCBzaG9ydCByZWcpCnsKCXVuc2lnbmVkIHNob3J0IGNvbW1hbmQsIGRhdGE7CglzdHJ1Y3QgczNjMjR4MF9zcGkgKiBjb25zdCBzcGkgPSBzM2MyNHgwX2dldF9iYXNlX3NwaSgpOwoKCVNFVF9DU19UT1VDSCgpOwoJY29tbWFuZCA9IDB4ODAwMCB8IHJlZzsKCglzcGktPmNoWzBdLlNQVERBVCA9IChjb21tYW5kICYgMHhGRjAwKSA+PiA4OwoJc3BpX3dhaXRfdHJhbnNtaXRfZG9uZSgpOwoJc3BpLT5jaFswXS5TUFREQVQgPSAoY29tbWFuZCAmIDB4MDBGRik7CglzcGlfd2FpdF90cmFuc21pdF9kb25lKCk7CgoJc3BpLT5jaFswXS5TUFREQVQgPSAweEZGOwoJc3BpX3dhaXRfdHJhbnNtaXRfZG9uZSgpOwoJZGF0YSA9IHNwaS0+Y2hbMF0uU1BSREFUOwoJc3BpLT5jaFswXS5TUFREQVQgPSAweEZGOwoJc3BpX3dhaXRfdHJhbnNtaXRfZG9uZSgpOwoKCUNMUl9DU19UT1VDSCgpOwoJcmV0dXJuIChzcGktPmNoWzBdLlNQUkRBVCAmIDB4MEZGKSB8IChkYXRhIDw8IDgpOwp9CgoKdm9pZCB0c2MyMDAwX3NldF9tdXggKHVuc2lnbmVkIGludCBjaGFubmVsKQp7CglzdHJ1Y3QgczNjMjR4MF9ncGlvICogY29uc3QgZ3BpbyA9IHMzYzI0eDBfZ2V0X2Jhc2VfZ3BpbygpOwoKCUNMUl9NVVgxX0VOQUJMRTsgQ0xSX01VWDJfRU5BQkxFOwoJQ0xSX01VWDNfRU5BQkxFOyBDTFJfTVVYNF9FTkFCTEU7Cglzd2l0Y2ggKGNoYW5uZWwpIHsKCWNhc2UgMDoKCQlDTFJfTVVYMDsgQ0xSX01VWDE7CgkJU0VUX01VWDFfRU5BQkxFOwoJCWJyZWFrOwoJY2FzZSAxOgoJCVNFVF9NVVgwOyBDTFJfTVVYMTsKCQlTRVRfTVVYMV9FTkFCTEU7CgkJYnJlYWs7CgljYXNlIDI6CgkJQ0xSX01VWDA7IFNFVF9NVVgxOwoJCVNFVF9NVVgxX0VOQUJMRTsKCQlicmVhazsKCWNhc2UgMzoKCQlTRVRfTVVYMDsgU0VUX01VWDE7CgkJU0VUX01VWDFfRU5BQkxFOwoJCWJyZWFrOwoJY2FzZSA0OgoJCUNMUl9NVVgwOyBDTFJfTVVYMTsKCQlTRVRfTVVYMl9FTkFCTEU7CgkJYnJlYWs7CgljYXNlIDU6CgkJU0VUX01VWDA7IENMUl9NVVgxOwoJCVNFVF9NVVgyX0VOQUJMRTsKCQlicmVhazsKCWNhc2UgNjoKCQlDTFJfTVVYMDsgU0VUX01VWDE7CgkJU0VUX01VWDJfRU5BQkxFOwoJCWJyZWFrOwoJY2FzZSA3OgoJCVNFVF9NVVgwOyBTRVRfTVVYMTsKCQlTRVRfTVVYMl9FTkFCTEU7CgkJYnJlYWs7CgljYXNlIDg6CgkJQ0xSX01VWDA7IENMUl9NVVgxOwoJCVNFVF9NVVgzX0VOQUJMRTsKCQlicmVhazsKCWNhc2UgOToKCQlTRVRfTVVYMDsgQ0xSX01VWDE7CgkJU0VUX01VWDNfRU5BQkxFOwoJCWJyZWFrOwoJY2FzZSAxMDoKCQlDTFJfTVVYMDsgU0VUX01VWDE7CgkJU0VUX01VWDNfRU5BQkxFOwoJCWJyZWFrOwoJY2FzZSAxMToKCQlTRVRfTVVYMDsgU0VUX01VWDE7CgkJU0VUX01VWDNfRU5BQkxFOwoJCWJyZWFrOwoJY2FzZSAxMjoKCQlDTFJfTVVYMDsgQ0xSX01VWDE7CgkJU0VUX01VWDRfRU5BQkxFOwoJCWJyZWFrOwoJY2FzZSAxMzoKCQlTRVRfTVVYMDsgQ0xSX01VWDE7CgkJU0VUX01VWDRfRU5BQkxFOwoJCWJyZWFrOwoJY2FzZSAxNDoKCQlDTFJfTVVYMDsgU0VUX01VWDE7CgkJU0VUX01VWDRfRU5BQkxFOwoJCWJyZWFrOwoJY2FzZSAxNToKCQlTRVRfTVVYMDsgU0VUX01VWDE7CgkJU0VUX01VWDRfRU5BQkxFOwoJCWJyZWFrOwoJZGVmYXVsdDoKCQlDTFJfTVVYMDsgQ0xSX01VWDE7Cgl9Cn0KCgp2b2lkIHRzYzIwMDBfc2V0X3JhbmdlICh1bnNpZ25lZCBpbnQgcmFuZ2UpCnsKCXN0cnVjdCBzM2MyNHgwX2dwaW8gKiBjb25zdCBncGlvID0gczNjMjR4MF9nZXRfYmFzZV9ncGlvKCk7CgoJc3dpdGNoIChyYW5nZSkgewoJY2FzZSAxOgoJCUNMUl9TRUxfVEVNUF9WXzA7IFNFVF9TRUxfVEVNUF9WXzE7CgkJQ0xSX1NFTF9URU1QX1ZfMjsgQ0xSX1NFTF9URU1QX1ZfMzsKCQlicmVhazsKCWNhc2UgMjoKCQlDTFJfU0VMX1RFTVBfVl8wOyBDTFJfU0VMX1RFTVBfVl8xOwoJCUNMUl9TRUxfVEVNUF9WXzI7IFNFVF9TRUxfVEVNUF9WXzM7CgkJYnJlYWs7CgljYXNlIDM6CgkJU0VUX1NFTF9URU1QX1ZfMDsgQ0xSX1NFTF9URU1QX1ZfMTsKCQlTRVRfU0VMX1RFTVBfVl8yOyBDTFJfU0VMX1RFTVBfVl8zOwoJCWJyZWFrOwoJfQp9CgoKdTE2IHRzYzIwMDBfcmVhZF9jaGFubmVsICh1bnNpZ25lZCBpbnQgY2hhbm5lbCkKewoJdTE2IHJlczsKCgl0c2MyMDAwX3NldF9tdXgoY2hhbm5lbCk7Cgl1ZGVsYXkoMjAgKiBUU0MyMDAwX0RFTEFZX0JBU0UpOwoKCXRzYzIwMDBfd3JpdGUoVFNDMjAwMF9SRUdfQURDLCAweDIwMzYpOwoJYWRjX3dhaXRfY29udmVyc2lvbl9kb25lICgpOwoJcmVzID0gdHNjMjAwMF9yZWFkKFRTQzIwMDBfUkVHX0FVWDEpOwoJcmV0dXJuIHJlczsKfQoKCnMzMiB0c2MyMDAwX2NvbnRhY3RfdGVtcCAodm9pZCkKewoJbG9uZyBhZGNfcHQxMDAwLCBvZmZzZXQ7Cglsb25nIHVfcHQxMDAwOwoJbG9uZyBjb250YWN0X3RlbXA7Cglsb25nIHRlbXAxLCB0ZW1wMjsKCgl0c2MyMDAwX3JlZ19pbml0ICgpOwoJdHNjMjAwMF9zZXRfcmFuZ2UgKDMpOwoKCS8qCgkgKiBCZWNhdXNlIG9mIHNwb3JhZGljICJqdW1wcyIgaW4gdGhlIG1lYXN1cmVkIGFkYyB2YWx1ZXMgZXZlcnkKCSAqIGNoYW5uZWwgaXMgcmVhZCB0d28gdGltZXMuIElmIHRoZXJlIGlzIGEgc2lnbmlmaWNhbnQgZGlmZmVyZW5jZQoJICogYmV0d2VlbiB0aGUgdHdvIG1lYXN1cmVtZW50cywgdGhlbiBwcmludCBhbiBlcnJvciBhbmQgZG8gYSB0aGlyZAoJICogbWVhc3VyZW1lbnQsIGJlY2F1c2UgaXQgaXMgdmVyeSB1bmxpa2VseSB0aGF0IGEgc3VjY2Vzc2l2ZSB0aGlyZAoJICogbWVhc3VyZW1lbnQgZ29lcyBhbHNvIHdyb25nLgoJICovCgl0ZW1wMSA9IHRzYzIwMDBfcmVhZF9jaGFubmVsICgxNCk7Cgl0ZW1wMiA9IHRzYzIwMDBfcmVhZF9jaGFubmVsICgxNCk7CglpZiAoYWJzKHRlbXAyIC0gdGVtcDEpIDwgTUFYX0RFVklBVElPTikKCQlhZGNfcHQxMDAwID0gdGVtcDI7CgllbHNlIHsKCQlwcmludGYgKCIlczogcmVhZCBhZGMgdmFsdWUgKGNoYW5uZWwgMTQpIGV4Y2VlZGVkIG1heCBhbGxvd2VkICIKCQkJImRldmlhdGlvbjogJWQgKiAwLjAyNzYgsENcbiIsCgkJCV9fRlVOQ1RJT05fXywgTUFYX0RFVklBVElPTik7CgkJcHJpbnRmICgiYWRjIHZhbHVlIDE6ICVsZCBESUdJVHNcbmFkYyB2YWx1ZSAyOiAlbGQgRElHSVRzXG4iLAoJCQl0ZW1wMSwgdGVtcDIpOwoJCWFkY19wdDEwMDAgPSB0c2MyMDAwX3JlYWRfY2hhbm5lbCAoMTQpOwoJCXByaW50ZiAoInVzZSAodGhpcmQgcmVhZCkgYWRjIHZhbHVlOiBhZGNfcHQxMDAwID0gIgoJCQkiJWxkIERJR0lUc1xuIiwJYWRjX3B0MTAwMCk7Cgl9CglkZWJ1ZyAoInJlYWQgY2hhbm5lbCAxNCAocHQxMDAwIGFkYyB2YWx1ZSk6ICVsZFxuIiwgYWRjX3B0MTAwMCk7CgoJdGVtcDEgPSB0c2MyMDAwX3JlYWRfY2hhbm5lbCAoMTUpOwoJdGVtcDIgPSB0c2MyMDAwX3JlYWRfY2hhbm5lbCAoMTUpOwoJaWYgKGFicyh0ZW1wMiAtIHRlbXAxKSA8IE1BWF9ERVZJQVRJT04pCgkJb2Zmc2V0ID0gdGVtcDI7CgllbHNlIHsKCQlwcmludGYgKCIlczogcmVhZCBhZGMgdmFsdWUgKGNoYW5uZWwgMTUpIGV4Y2VlZGVkIG1heCBhbGxvd2VkICIKCQkJImRldmlhdGlvbjogJWQgKiAwLjAyNzYgsENcbiIsCgkJCV9fRlVOQ1RJT05fXywgTUFYX0RFVklBVElPTik7CgkJcHJpbnRmICgiYWRjIHZhbHVlIDE6ICVsZCBESUdJVHNcbmFkYyB2YWx1ZSAyOiAlbGQgRElHSVRzXG4iLAoJCQl0ZW1wMSwgdGVtcDIpOwoJCW9mZnNldCA9IHRzYzIwMDBfcmVhZF9jaGFubmVsICgxNSk7CgkJcHJpbnRmICgidXNlICh0aGlyZCByZWFkKSBhZGMgdmFsdWU6IG9mZnNldCA9ICVsZCBESUdJVHNcbiIsCgkJCW9mZnNldCk7Cgl9CglkZWJ1ZyAoInJlYWQgY2hhbm5lbCAxNSAob2Zmc2V0KTogJWxkXG4iLCBvZmZzZXQpOwoKCS8qCgkgKiBGb3JtdWxhIGZvciBjYWxjdWxhdGluZyB2b2x0YWdlIGRyb3Agb24gUFQxMDAwIHJlc2lzdG9yOiB1X3B0MTAwMCA9CgkgKiB4X3JhbmdlMyAqIChhZGNfcmF3IC0gb2Zmc2V0KSAvIDEwLiBGb3JtdWxhIHRvIGNhbGN1bGF0ZSB4X3JhbmdlMzoKCSAqIHhfcmFuZ2UzID0gKDI1MDAgKiAoMTAwMDAwMCArIGVycl92cmVmICsgZXJyX2FtcDMpKSAvICg0MDk1KjYpLiBUaGUKCSAqIGVycm9yIGNvcnJlY3Rpb24gVmFsdWVzIGVycl92cmVmIGFuZCBlcnJfYW1wMyBhcmUgYXNzdW1lZCBhcyAwIGluCgkgKiB1LWJvb3QsIGJlY2F1c2UgdGhpcyBjb3VsZCBjYXVzZSBvbmx5IGEgdmVyeSBzbWFsbCBlcnJvciAoPCAxJSkuCgkgKi8KCXVfcHQxMDAwID0gKDEwMTc1MCAqIChhZGNfcHQxMDAwIC0gb2Zmc2V0KSkgLyAxMDsKCWRlYnVnICgidV9wdDEwMDA6ICVsZFxuIiwgdV9wdDEwMDApOwoKCWlmICh0c2MyMDAwX2ludGVycG9sYXRlKHVfcHQxMDAwLCBQdDEwMDBfdGVtcF90YWJsZSwKCQkJCSZjb250YWN0X3RlbXApID09IC0xKSB7CgkJcHJpbnRmICgiJXM6IGVycm9yIGludGVycG9sYXRpbmcgUFQxMDAwIHZsYXVlXG4iLAoJCQkgX19GVU5DVElPTl9fKTsKCQlyZXR1cm4gKC0xMDAwKTsKCX0KCWRlYnVnICgiY29udGFjdF90ZW1wOiAlbGRcbiIsIGNvbnRhY3RfdGVtcCk7CgoJcmV0dXJuIGNvbnRhY3RfdGVtcDsKfQoKCnZvaWQgdHNjMjAwMF9yZWdfaW5pdCAodm9pZCkKewoJc3RydWN0IHMzYzI0eDBfZ3BpbyAqIGNvbnN0IGdwaW8gPSBzM2MyNHgwX2dldF9iYXNlX2dwaW8oKTsKCgl0c2MyMDAwX3dyaXRlKFRTQzIwMDBfUkVHX0FEQywgMHgyMDM2KTsKCXRzYzIwMDBfd3JpdGUoVFNDMjAwMF9SRUdfUkVGLCAweDAwMTEpOwoJdHNjMjAwMF93cml0ZShUU0MyMDAwX1JFR19EQUNDVEwsIDB4MDAwMCk7CgoJQ09OX01VWDA7CglDT05fTVVYMTsKCglDT05fTVVYMV9FTkFCTEU7CglDT05fTVVYMl9FTkFCTEU7CglDT05fTVVYM19FTkFCTEU7CglDT05fTVVYNF9FTkFCTEU7CgoJQ09OX1NFTF9URU1QX1ZfMDsKCUNPTl9TRUxfVEVNUF9WXzE7CglDT05fU0VMX1RFTVBfVl8yOwoJQ09OX1NFTF9URU1QX1ZfMzsKCgl0c2MyMDAwX3NldF9tdXgoMCk7Cgl0c2MyMDAwX3NldF9yYW5nZSgwKTsKfQoKCmludCB0c2MyMDAwX2ludGVycG9sYXRlKGxvbmcgdmFsdWUsIGxvbmcgZGF0YVtdWzJdLCBsb25nICpyZXN1bHQpCnsKCWludCBpOwoJdW5zaWduZWQgbG9uZyBsb25nIHZhbDsKCgkvKiB0aGUgZGF0YSBpcyBzb3J0ZWQgYW5kIHRoZSBmaXJzdCBlbGVtZW50IGlzIHVwcGVyCgkgKiBsaW1pdCBzbyB3ZSBjYW4gZWFzaWx5IGNoZWNrIGZvciBvdXQtb2YtYmFuZCB2YWx1ZXMKCSAqLwoJaWYgKGRhdGFbMF1bMF0gPCB2YWx1ZSB8fCBkYXRhWzFdWzBdID4gdmFsdWUpCgkJcmV0dXJuIC0xOwoKCWkgPSAxOwoJd2hpbGUgKGRhdGFbaV1bMF0gPCB2YWx1ZSkKCQlpKys7CgoJLyogVG8gcHJldmVudCBvdmVyZmxvdyB3ZSBoYXZlIHRvIHN0b3JlIHRoZSBpbnRlcm1lZGlhdGUKCSAgIHJlc3VsdCBpbiAnbG9uZyBsb25nJy4KCSovCgoJdmFsID0gKCh1bnNpZ25lZCBsb25nIGxvbmcpKGRhdGFbaV1bMV0gLSBkYXRhW2ktMV1bMV0pCgkJICAgKiAodW5zaWduZWQgbG9uZyBsb25nKSh2YWx1ZSAtIGRhdGFbaS0xXVswXSkpOwoJZG9fZGl2KHZhbCwgKGRhdGFbaV1bMF0gLSBkYXRhW2ktMV1bMF0pKTsKCSpyZXN1bHQgPSBkYXRhW2ktMV1bMV0gKyB2YWw7CgoJcmV0dXJuIDA7Cn0KCgp2b2lkIGFkY193YWl0X2NvbnZlcnNpb25fZG9uZSh2b2lkKQp7Cgl3aGlsZSAoISh0c2MyMDAwX3JlYWQoVFNDMjAwMF9SRUdfQURDKSAmICgxIDw8IDE0KSkpOwp9Cg==