ZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2FsZ29zL2kyYy1hbGdvLXBjYS5jIGIvZHJpdmVycy9pMmMvYWxnb3MvaTJjLWFsZ28tcGNhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNkOTEyYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaTJjL2FsZ29zL2kyYy1hbGdvLXBjYS5jCkBAIC0wLDAgKzEsMzk5IEBACisvKgorICogIGkyYy1hbGdvLXBjYS5jIGkyYyBkcml2ZXIgYWxnb3JpdGhtcyBmb3IgUENBOTU2NCBhZGFwdGVycyAgICAgICAgICAgICAgICAKKyAqICAgIENvcHlyaWdodCAoQykgMjAwNCBBcmNvbSBDb250cm9sIFN5c3RlbXMKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy1hbGdvLXBjYS5oPgorI2luY2x1ZGUgImkyYy1hbGdvLXBjYS5oIgorCisjZGVmaW5lIERSSVZFUiAiaTJjLWFsZ28tcGNhIgorCisjZGVmaW5lIERFQjEoZm10LCBhcmdzLi4uKSBkbyB7IGlmIChpMmNfZGVidWc+PTEpIHByaW50ayhmbXQsICMjIGFyZ3MpOyB9IHdoaWxlKDApCisjZGVmaW5lIERFQjIoZm10LCBhcmdzLi4uKSBkbyB7IGlmIChpMmNfZGVidWc+PTIpIHByaW50ayhmbXQsICMjIGFyZ3MpOyB9IHdoaWxlKDApCisjZGVmaW5lIERFQjMoZm10LCBhcmdzLi4uKSBkbyB7IGlmIChpMmNfZGVidWc+PTMpIHByaW50ayhmbXQsICMjIGFyZ3MpOyB9IHdoaWxlKDApCisKK3N0YXRpYyBpbnQgaTJjX2RlYnVnPTA7CisKKyNkZWZpbmUgcGNhX291dHcoYWRhcCwgcmVnLCB2YWwpIGFkYXAtPndyaXRlX2J5dGUoYWRhcCwgcmVnLCB2YWwpCisjZGVmaW5lIHBjYV9pbncoYWRhcCwgcmVnKSBhZGFwLT5yZWFkX2J5dGUoYWRhcCwgcmVnKQorCisjZGVmaW5lIHBjYV9zdGF0dXMoYWRhcCkgcGNhX2ludyhhZGFwLCBJMkNfUENBX1NUQSkKKyNkZWZpbmUgcGNhX2Nsb2NrKGFkYXApIGFkYXAtPmdldF9jbG9jayhhZGFwKQorI2RlZmluZSBwY2Ffb3duKGFkYXApIGFkYXAtPmdldF9vd24oYWRhcCkKKyNkZWZpbmUgcGNhX3NldF9jb24oYWRhcCwgdmFsKSBwY2Ffb3V0dyhhZGFwLCBJMkNfUENBX0NPTiwgdmFsKQorI2RlZmluZSBwY2FfZ2V0X2NvbihhZGFwKSBwY2FfaW53KGFkYXAsIEkyQ19QQ0FfQ09OKQorI2RlZmluZSBwY2Ffd2FpdChhZGFwKSBhZGFwLT53YWl0X2Zvcl9pbnRlcnJ1cHQoYWRhcCkKKworLyoKKyAqIEdlbmVyYXRlIGEgc3RhcnQgY29uZGl0aW9uIG9uIHRoZSBpMmMgYnVzLgorICoKKyAqIHJldHVybnMgYWZ0ZXIgdGhlIHN0YXJ0IGNvbmRpdGlvbiBoYXMgb2NjdXJlZAorICovCitzdGF0aWMgdm9pZCBwY2Ffc3RhcnQoc3RydWN0IGkyY19hbGdvX3BjYV9kYXRhICphZGFwKQoreworCWludCBzdGEgPSBwY2FfZ2V0X2NvbihhZGFwKTsKKwlERUIyKCI9PT0gU1RBUlRcbiIpOworCXN0YSB8PSBJMkNfUENBX0NPTl9TVEE7CisJc3RhICY9IH4oSTJDX1BDQV9DT05fU1RPfEkyQ19QQ0FfQ09OX1NJKTsKKwlwY2Ffc2V0X2NvbihhZGFwLCBzdGEpOworCXBjYV93YWl0KGFkYXApOworfQorCisvKgorICogR2VuZXJhdGUgYSByZXBlYXRlZCBzdGFydCBjb25kaXRpb24gb24gdGhlIGkyYyBidXMgCisgKgorICogcmV0dXJuIGFmdGVyIHRoZSByZXBlYXRlZCBzdGFydCBjb25kaXRpb24gaGFzIG9jY3VyZWQKKyAqLworc3RhdGljIHZvaWQgcGNhX3JlcGVhdGVkX3N0YXJ0KHN0cnVjdCBpMmNfYWxnb19wY2FfZGF0YSAqYWRhcCkKK3sKKwlpbnQgc3RhID0gcGNhX2dldF9jb24oYWRhcCk7CisJREVCMigiPT09IFJFUEVBVEVEIFNUQVJUXG4iKTsKKwlzdGEgfD0gSTJDX1BDQV9DT05fU1RBOworCXN0YSAmPSB+KEkyQ19QQ0FfQ09OX1NUT3xJMkNfUENBX0NPTl9TSSk7CisJcGNhX3NldF9jb24oYWRhcCwgc3RhKTsKKwlwY2Ffd2FpdChhZGFwKTsKK30KKworLyoKKyAqIEdlbmVyYXRlIGEgc3RvcCBjb25kaXRpb24gb24gdGhlIGkyYyBidXMKKyAqCisgKiByZXR1cm5zIGFmdGVyIHRoZSBzdG9wIGNvbmRpdGlvbiBoYXMgYmVlbiBnZW5lcmF0ZWQKKyAqCisgKiBTVE9QcyBkbyBub3QgZ2VuZXJhdGUgYW4gaW50ZXJydXB0IG9yIHNldCB0aGUgU0kgZmxhZywgc2luY2UgdGhlCisgKiBwYXJ0IHJldHVybnMgdGhlIHRoZSBpZGxlIHN0YXRlICgweGY4KS4gSGVuY2Ugd2UgZG9uJ3QgbmVlZCB0bworICogcGNhX3dhaXQgaGVyZS4KKyAqLworc3RhdGljIHZvaWQgcGNhX3N0b3Aoc3RydWN0IGkyY19hbGdvX3BjYV9kYXRhICphZGFwKQoreworCWludCBzdGEgPSBwY2FfZ2V0X2NvbihhZGFwKTsKKwlERUIyKCI9PT0gU1RPUFxuIik7CisJc3RhIHw9IEkyQ19QQ0FfQ09OX1NUTzsKKwlzdGEgJj0gfihJMkNfUENBX0NPTl9TVEF8STJDX1BDQV9DT05fU0kpOworCXBjYV9zZXRfY29uKGFkYXAsIHN0YSk7Cit9CisKKy8qCisgKiBTZW5kIHRoZSBzbGF2ZSBhZGRyZXNzIGFuZCBSL1cgYml0CisgKgorICogcmV0dXJucyBhZnRlciB0aGUgYWRkcmVzcyBoYXMgYmVlbiBzZW50CisgKi8KK3N0YXRpYyB2b2lkIHBjYV9hZGRyZXNzKHN0cnVjdCBpMmNfYWxnb19wY2FfZGF0YSAqYWRhcCwgCisJCQlzdHJ1Y3QgaTJjX21zZyAqbXNnKQoreworCWludCBzdGEgPSBwY2FfZ2V0X2NvbihhZGFwKTsKKwlpbnQgYWRkcjsKKworCWFkZHIgPSAoICgweDdmICYgbXNnLT5hZGRyKSA8PCAxICk7CisJaWYgKG1zZy0+ZmxhZ3MgJiBJMkNfTV9SRCApCisJCWFkZHIgfD0gMTsKKwlERUIyKCI9PT0gU0xBVkUgQUREUkVTUyAlIzA0eCslYz0lIzA0eFxuIiwgCisJICAgICBtc2ctPmFkZHIsIG1zZy0+ZmxhZ3MgJiBJMkNfTV9SRCA/ICdSJyA6ICdXJywgYWRkcik7CisJCisJcGNhX291dHcoYWRhcCwgSTJDX1BDQV9EQVQsIGFkZHIpOworCisJc3RhICY9IH4oSTJDX1BDQV9DT05fU1RPfEkyQ19QQ0FfQ09OX1NUQXxJMkNfUENBX0NPTl9TSSk7CisJcGNhX3NldF9jb24oYWRhcCwgc3RhKTsKKworCXBjYV93YWl0KGFkYXApOworfQorCisvKgorICogVHJhbnNtaXQgYSBieXRlLgorICoKKyAqIFJldHVybnMgYWZ0ZXIgdGhlIGJ5dGUgaGFzIGJlZW4gdHJhbnNtaXR0ZWQKKyAqLworc3RhdGljIHZvaWQgcGNhX3R4X2J5dGUoc3RydWN0IGkyY19hbGdvX3BjYV9kYXRhICphZGFwLCAKKwkJCV9fdTggYikKK3sKKwlpbnQgc3RhID0gcGNhX2dldF9jb24oYWRhcCk7CisJREVCMigiPT09IFdSSVRFICUjMDR4XG4iLCBiKTsKKwlwY2Ffb3V0dyhhZGFwLCBJMkNfUENBX0RBVCwgYik7CisKKwlzdGEgJj0gfihJMkNfUENBX0NPTl9TVE98STJDX1BDQV9DT05fU1RBfEkyQ19QQ0FfQ09OX1NJKTsKKwlwY2Ffc2V0X2NvbihhZGFwLCBzdGEpOworCisJcGNhX3dhaXQoYWRhcCk7Cit9CisKKy8qCisgKiBSZWNlaXZlIGEgYnl0ZQorICoKKyAqIHJldHVybnMgaW1tZWRpYXRlbHkuCisgKi8KK3N0YXRpYyB2b2lkIHBjYV9yeF9ieXRlKHN0cnVjdCBpMmNfYWxnb19wY2FfZGF0YSAqYWRhcCwgCisJCQlfX3U4ICpiLCBpbnQgYWNrKQoreworCSpiID0gcGNhX2ludyhhZGFwLCBJMkNfUENBX0RBVCk7CisJREVCMigiPT09IFJFQUQgJSMwNHggJXNcbiIsICpiLCBhY2sgPyAiQUNLIiA6ICJOQUNLIik7Cit9CisKKy8qIAorICogU2V0dXAgQUNLIG9yIE5BQ0sgZm9yIG5leHQgcmVjZWl2ZWQgYnl0ZSBhbmQgd2FpdCBmb3IgaXQgdG8gYXJyaXZlLgorICoKKyAqIFJldHVybnMgYWZ0ZXIgbmV4dCBieXRlIGhhcyBhcnJpdmVkLgorICovCitzdGF0aWMgdm9pZCBwY2FfcnhfYWNrKHN0cnVjdCBpMmNfYWxnb19wY2FfZGF0YSAqYWRhcCwgCisJCSAgICAgICBpbnQgYWNrKQoreworCWludCBzdGEgPSBwY2FfZ2V0X2NvbihhZGFwKTsKKworCXN0YSAmPSB+KEkyQ19QQ0FfQ09OX1NUT3xJMkNfUENBX0NPTl9TVEF8STJDX1BDQV9DT05fU0l8STJDX1BDQV9DT05fQUEpOworCisJaWYgKCBhY2sgKQorCQlzdGEgfD0gSTJDX1BDQV9DT05fQUE7CisKKwlwY2Ffc2V0X2NvbihhZGFwLCBzdGEpOworCXBjYV93YWl0KGFkYXApOworfQorCisvKiAKKyAqIFJlc2V0IHRoZSBpMmMgYnVzIC8gU0lPIAorICovCitzdGF0aWMgdm9pZCBwY2FfcmVzZXQoc3RydWN0IGkyY19hbGdvX3BjYV9kYXRhICphZGFwKQoreworCS8qIGFwcGFyZW50bHkgb25seSBhbiBleHRlcm5hbCByZXNldCB3aWxsIGRvIGl0LiBub3QgYSBsb3QgY2FuIGJlIGRvbmUgKi8KKwlwcmludGsoS0VSTl9FUlIgRFJJVkVSICI6IEhhdmVuJ3QgZmlndXJlZCBvdXQgaG93IHRvIGRvIGEgcmVzZXQgeWV0XG4iKTsKK30KKworc3RhdGljIGludCBwY2FfeGZlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyY19hZGFwLAorICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaTJjX21zZyAqbXNncywKKyAgICAgICAgICAgICAgICAgICAgaW50IG51bSkKK3sKKyAgICAgICAgc3RydWN0IGkyY19hbGdvX3BjYV9kYXRhICphZGFwID0gaTJjX2FkYXAtPmFsZ29fZGF0YTsKKyAgICAgICAgc3RydWN0IGkyY19tc2cgKm1zZyA9IE5VTEw7CisgICAgICAgIGludCBjdXJtc2c7CisJaW50IG51bWJ5dGVzID0gMDsKKwlpbnQgc3RhdGU7CisJaW50IHJldDsKKworCXN0YXRlID0gcGNhX3N0YXR1cyhhZGFwKTsKKwlpZiAoIHN0YXRlICE9IDB4RjggKSB7CisJCWRldl9kYmcoJmkyY19hZGFwLT5kZXYsICJidXMgaXMgbm90IGlkbGUuIHN0YXR1cyBpcyAlIzA0eFxuIiwgc3RhdGUgKTsKKwkJLyogRklYTUU6IHdoYXQgdG8gZG8uIEZvcmNlIHN0b3AgPyAqLworCQlyZXR1cm4gLUVSRU1PVEVJTzsKKwl9CisKKwlERUIxKCJ7e3sgWEZFUiAlZCBtZXNzYWdlc1xuIiwgbnVtKTsKKworCWlmIChpMmNfZGVidWc+PTIpIHsKKwkJZm9yIChjdXJtc2cgPSAwOyBjdXJtc2cgPCBudW07IGN1cm1zZysrKSB7CisJCQlpbnQgYWRkciwgaTsKKwkJCW1zZyA9ICZtc2dzW2N1cm1zZ107CisJCQkKKwkJCWFkZHIgPSAoMHg3ZiAmIG1zZy0+YWRkcikgOworCQkKKwkJCWlmIChtc2ctPmZsYWdzICYgSTJDX01fUkQgKQorCQkJCXByaW50ayhLRVJOX0lORk8gIiAgICBbJTAyZF0gUkQgJWQgYnl0ZXMgZnJvbSAlIzAyeCBbJSMwMngsIC4uLl1cbiIsIAorCQkJCSAgICAgICBjdXJtc2csIG1zZy0+bGVuLCBhZGRyLCAoYWRkcjw8MSkgfCAxKTsKKwkJCWVsc2UgeworCQkJCXByaW50ayhLRVJOX0lORk8gIiAgICBbJTAyZF0gV1IgJWQgYnl0ZXMgdG8gJSMwMnggWyUjMDJ4JXMiLCAKKwkJCQkgICAgICAgY3VybXNnLCBtc2ctPmxlbiwgYWRkciwgYWRkcjw8MSwKKwkJCQkgICAgICAgbXNnLT5sZW4gPT0gMCA/ICIiIDogIiwgIik7CisJCQkJZm9yKGk9MDsgaSA8IG1zZy0+bGVuOyBpKyspCisJCQkJCXByaW50aygiJSMwNHglcyIsIG1zZy0+YnVmW2ldLCBpID09IG1zZy0+bGVuIC0gMSA/ICIiIDogIiwgIik7CisJCQkJcHJpbnRrKCJdXG4iKTsKKwkJCX0KKwkJfQorCX0KKworCWN1cm1zZyA9IDA7CisJcmV0ID0gLUVSRU1PVEVJTzsKKwl3aGlsZSAoY3VybXNnIDwgbnVtKSB7CisJCXN0YXRlID0gcGNhX3N0YXR1cyhhZGFwKTsKKworCQlERUIzKCJTVEFURSBpcyAweCUwMnhcbiIsIHN0YXRlKTsKKwkJbXNnID0gJm1zZ3NbY3VybXNnXTsKKworCQlzd2l0Y2ggKHN0YXRlKSB7CisJCWNhc2UgMHhmODogLyogT24gcmVzZXQgb3Igc3RvcCB0aGUgYnVzIGlzIGlkbGUgKi8KKwkJCXBjYV9zdGFydChhZGFwKTsKKwkJCWJyZWFrOworCisJCWNhc2UgMHgwODogLyogQSBTVEFSVCBjb25kaXRpb24gaGFzIGJlZW4gdHJhbnNtaXR0ZWQgKi8KKwkJY2FzZSAweDEwOiAvKiBBIHJlcGVhdGVkIHN0YXJ0IGNvbmRpdGlvbiBoYXMgYmVlbiB0cmFuc21pdHRlZCAqLworCQkJcGNhX2FkZHJlc3MoYWRhcCwgbXNnKTsKKwkJCWJyZWFrOworCQkJCisJCWNhc2UgMHgxODogLyogU0xBK1cgaGFzIGJlZW4gdHJhbnNtaXR0ZWQ7IEFDSyBoYXMgYmVlbiByZWNlaXZlZCAqLworCQljYXNlIDB4Mjg6IC8qIERhdGEgYnl0ZSBpbiBJMkNEQVQgaGFzIGJlZW4gdHJhbnNtaXR0ZWQ7IEFDSyBoYXMgYmVlbiByZWNlaXZlZCAqLworCQkJaWYgKG51bWJ5dGVzIDwgbXNnLT5sZW4pIHsKKwkJCQlwY2FfdHhfYnl0ZShhZGFwLCBtc2ctPmJ1ZltudW1ieXRlc10pOworCQkJCW51bWJ5dGVzKys7CisJCQkJYnJlYWs7CisJCQl9CisJCQljdXJtc2crKzsgbnVtYnl0ZXMgPSAwOworCQkJaWYgKGN1cm1zZyA9PSBudW0pCisJCQkJcGNhX3N0b3AoYWRhcCk7CisJCQllbHNlCisJCQkJcGNhX3JlcGVhdGVkX3N0YXJ0KGFkYXApOworCQkJYnJlYWs7CisKKwkJY2FzZSAweDIwOiAvKiBTTEErVyBoYXMgYmVlbiB0cmFuc21pdHRlZDsgTk9UIEFDSyBoYXMgYmVlbiByZWNlaXZlZCAqLworCQkJREVCMigiTk9UIEFDSyByZWNlaXZlZCBhZnRlciBTTEErV1xuIik7CisJCQlwY2Ffc3RvcChhZGFwKTsKKwkJCWdvdG8gb3V0OworCisJCWNhc2UgMHg0MDogLyogU0xBK1IgaGFzIGJlZW4gdHJhbnNtaXR0ZWQ7IEFDSyBoYXMgYmVlbiByZWNlaXZlZCAqLworCQkJcGNhX3J4X2FjayhhZGFwLCBtc2ctPmxlbiA+IDEpOworCQkJYnJlYWs7CisKKwkJY2FzZSAweDUwOiAvKiBEYXRhIGJ5dGVzIGhhcyBiZWVuIHJlY2VpdmVkOyBBQ0sgaGFzIGJlZW4gcmV0dXJuZWQgKi8KKwkJCWlmIChudW1ieXRlcyA8IG1zZy0+bGVuKSB7CisJCQkJcGNhX3J4X2J5dGUoYWRhcCwgJm1zZy0+YnVmW251bWJ5dGVzXSwgMSk7CisJCQkJbnVtYnl0ZXMrKzsKKwkJCQlwY2FfcnhfYWNrKGFkYXAsIG51bWJ5dGVzIDwgbXNnLT5sZW4gLSAxKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWN1cm1zZysrOyBudW1ieXRlcyA9IDA7CisJCQlpZiAoY3VybXNnID09IG51bSkKKwkJCQlwY2Ffc3RvcChhZGFwKTsKKwkJCWVsc2UKKwkJCQlwY2FfcmVwZWF0ZWRfc3RhcnQoYWRhcCk7CisJCQlicmVhazsKKworCQljYXNlIDB4NDg6IC8qIFNMQStSIGhhcyBiZWVuIHRyYW5zbWl0dGVkOyBOT1QgQUNLIGhhcyBiZWVuIHJlY2VpdmVkICovCisJCQlERUIyKCJOT1QgQUNLIHJlY2VpdmVkIGFmdGVyIFNMQStSXG4iKTsKKwkJCXBjYV9zdG9wKGFkYXApOworCQkJZ290byBvdXQ7CisKKwkJY2FzZSAweDMwOiAvKiBEYXRhIGJ5dGUgaW4gSTJDREFUIGhhcyBiZWVuIHRyYW5zbWl0dGVkOyBOT1QgQUNLIGhhcyBiZWVuIHJlY2VpdmVkICovCisJCQlERUIyKCJOT1QgQUNLIHJlY2VpdmVkIGFmdGVyIGRhdGEgYnl0ZVxuIik7CisJCQlnb3RvIG91dDsKKworCQljYXNlIDB4Mzg6IC8qIEFyYml0cmF0aW9uIGxvc3QgZHVyaW5nIFNMQStXLCBTTEErUiBvciBkYXRhIGJ5dGVzICovCisJCQlERUIyKCJBcmJpdHJhdGlvbiBsb3N0XG4iKTsKKwkJCWdvdG8gb3V0OworCQkJCisJCWNhc2UgMHg1ODogLyogRGF0YSBieXRlIGhhcyBiZWVuIHJlY2VpdmVkOyBOT1QgQUNLIGhhcyBiZWVuIHJldHVybmVkICovCisJCQlpZiAoIG51bWJ5dGVzID09IG1zZy0+bGVuIC0gMSApIHsKKwkJCQlwY2FfcnhfYnl0ZShhZGFwLCAmbXNnLT5idWZbbnVtYnl0ZXNdLCAwKTsKKwkJCQljdXJtc2crKzsgbnVtYnl0ZXMgPSAwOworCQkJCWlmIChjdXJtc2cgPT0gbnVtKQorCQkJCQlwY2Ffc3RvcChhZGFwKTsKKwkJCQllbHNlCisJCQkJCXBjYV9yZXBlYXRlZF9zdGFydChhZGFwKTsKKwkJCX0gZWxzZSB7CisJCQkJREVCMigiTk9UIEFDSyBzZW50IGFmdGVyIGRhdGEgYnl0ZSByZWNlaXZlZC4gIgorCQkJCSAgICAgIk5vdCBmaW5hbCBieXRlLiBudW1ieXRlcyAlZC4gbGVuICVkXG4iLAorCQkJCSAgICAgbnVtYnl0ZXMsIG1zZy0+bGVuKTsKKwkJCQlwY2Ffc3RvcChhZGFwKTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIDB4NzA6IC8qIEJ1cyBlcnJvciAtIFNEQSBzdHVjayBsb3cgKi8KKwkJCURFQjIoIkJVUyBFUlJPUiAtIFNEQSBTdHVjayBsb3dcbiIpOworCQkJcGNhX3Jlc2V0KGFkYXApOworCQkJZ290byBvdXQ7CisJCWNhc2UgMHg5MDogLyogQnVzIGVycm9yIC0gU0NMIHN0dWNrIGxvdyAqLworCQkJREVCMigiQlVTIEVSUk9SIC0gU0NMIFN0dWNrIGxvd1xuIik7CisJCQlwY2FfcmVzZXQoYWRhcCk7CisJCQlnb3RvIG91dDsKKwkJY2FzZSAweDAwOiAvKiBCdXMgZXJyb3IgZHVyaW5nIG1hc3RlciBvciBzbGF2ZSBtb2RlIGR1ZSB0byBpbGxlZ2FsIFNUQVJUIG9yIFNUT1AgY29uZGl0aW9uICovCisJCQlERUIyKCJCVVMgRVJST1IgLSBJbGxlZ2FsIFNUQVJUIG9yIFNUT1BcbiIpOworCQkJcGNhX3Jlc2V0KGFkYXApOworCQkJZ290byBvdXQ7CisJCWRlZmF1bHQ6CisJCQlwcmludGsoS0VSTl9FUlIgRFJJVkVSICI6IHVuaGFuZGxlZCBTSU8gc3RhdGUgMHglMDJ4XG4iLCBzdGF0ZSk7CisJCQlicmVhazsKKwkJfQorCQkKKwl9CisKKwlyZXQgPSBjdXJtc2c7Cisgb3V0OgorCURFQjEoS0VSTl9DUklUICJ9fX0gdHJhbnNmZXJlZCAlZC8lZCBtZXNzYWdlcy4gIgorCSAgICAgInN0YXR1cyBpcyAlIzA0eC4gY29udHJvbCBpcyAlIzA0eFxuIiwgCisJICAgICBjdXJtc2csIG51bSwgcGNhX3N0YXR1cyhhZGFwKSwKKwkgICAgIHBjYV9nZXRfY29uKGFkYXApKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdTMyIHBjYV9mdW5jKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCkKK3sKKyAgICAgICAgcmV0dXJuIEkyQ19GVU5DX0kyQyB8IEkyQ19GVU5DX1NNQlVTX0VNVUw7Cit9CisKK3N0YXRpYyBpbnQgcGNhX2luaXQoc3RydWN0IGkyY19hbGdvX3BjYV9kYXRhICphZGFwKQoreworCXN0YXRpYyBpbnQgZnJlcXNbXSA9IHszMzAsMjg4LDIxNywxNDYsODgsNTksNDQsMzZ9OworCWludCBvd24sIGNsb2NrOworCisJb3duID0gcGNhX293bihhZGFwKTsKKwljbG9jayA9IHBjYV9jbG9jayhhZGFwKTsKKwlERUIxKEtFUk5fSU5GTyBEUklWRVIgIjogb3duIGFkZHJlc3MgaXMgJSMwNHhcbiIsIG93bik7CisJREVCMShLRVJOX0lORk8gRFJJVkVSICI6IGNsb2NrIGZyZXFldW5jeSBpcyAlZGtIelxuIiwgZnJlcXNbY2xvY2tdKTsKKworCXBjYV9vdXR3KGFkYXAsIEkyQ19QQ0FfQURSLCBvd24gPDwgMSk7CisKKwlwY2Ffc2V0X2NvbihhZGFwLCBJMkNfUENBX0NPTl9FTlNJTyB8IGNsb2NrKTsKKwl1ZGVsYXkoNTAwKTsgLyogNTAwILVzIGZvciBvc2NpbGF0b3IgdG8gc3RhYmlsaXNlICovCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBpMmNfYWxnb3JpdGhtIHBjYV9hbGdvID0geworCS5uYW1lCQk9ICJQQ0E5NTY0IGFsZ29yaXRobSIsCisJLmlkCQk9IEkyQ19BTEdPX1BDQSwKKwkubWFzdGVyX3hmZXIJPSBwY2FfeGZlciwKKwkuZnVuY3Rpb25hbGl0eQk9IHBjYV9mdW5jLAorfTsKKworLyogCisgKiByZWdpc3RlcmluZyBmdW5jdGlvbnMgdG8gbG9hZCBhbGdvcml0aG1zIGF0IHJ1bnRpbWUgCisgKi8KK2ludCBpMmNfcGNhX2FkZF9idXMoc3RydWN0IGkyY19hZGFwdGVyICphZGFwKQoreworCXN0cnVjdCBpMmNfYWxnb19wY2FfZGF0YSAqcGNhX2FkYXAgPSBhZGFwLT5hbGdvX2RhdGE7CisJaW50IHJ2YWw7CisKKwkvKiByZWdpc3RlciBuZXcgYWRhcHRlciB0byBpMmMgbW9kdWxlLi4uICovCisKKwlhZGFwLT5pZCB8PSBwY2FfYWxnby5pZDsKKwlhZGFwLT5hbGdvID0gJnBjYV9hbGdvOworCisJYWRhcC0+dGltZW91dCA9IDEwMDsJCS8qIGRlZmF1bHQgdmFsdWVzLCBzaG91bGQJKi8KKwlhZGFwLT5yZXRyaWVzID0gMzsJCS8qIGJlIHJlcGxhY2VkIGJ5IGRlZmluZXMJKi8KKworCXJ2YWwgPSBwY2FfaW5pdChwY2FfYWRhcCk7CisKKwlpZiAoIXJ2YWwpCisJCWkyY19hZGRfYWRhcHRlcihhZGFwKTsKKworCXJldHVybiBydmFsOworfQorCitpbnQgaTJjX3BjYV9kZWxfYnVzKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCkKK3sKKwlyZXR1cm4gaTJjX2RlbF9hZGFwdGVyKGFkYXApOworfQorCitFWFBPUlRfU1lNQk9MKGkyY19wY2FfYWRkX2J1cyk7CitFWFBPUlRfU1lNQk9MKGkyY19wY2FfZGVsX2J1cyk7CisKK01PRFVMRV9BVVRIT1IoIklhbiBDYW1wYmVsbCA8aWNhbXBiZWxsQGFyY29tLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiSTJDLUJ1cyBQQ0E5NTY0IGFsZ29yaXRobSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCittb2R1bGVfcGFyYW0oaTJjX2RlYnVnLCBpbnQsIDApOwo=