LyoKICogUUVNVSBKQVpaIExFRCBlbXVsYXRvci4KICoKICogQ29weXJpZ2h0IChjKSAyMDA3IEhlcnbpIFBvdXNzaW5lYXUKICoKICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQogKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAogKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCiAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCiAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAqCiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCiAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgogKgogKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgogKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwKICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgogKiBUSEUgU09GVFdBUkUuCiAqLwoKI2luY2x1ZGUgImh3LmgiCiNpbmNsdWRlICJtaXBzLmgiCiNpbmNsdWRlICJjb25zb2xlLmgiCiNpbmNsdWRlICJwaXhlbF9vcHMuaCIKCi8vI2RlZmluZSBERUJVR19MRUQKCiNpZmRlZiBERUJVR19MRUQKI2RlZmluZSBEUFJJTlRGKGZtdCwgLi4uKSBcCmRvIHsgcHJpbnRmKCJqYXp6IGxlZDogIiBmbXQgLCAjIyBfX1ZBX0FSR1NfXyk7IH0gd2hpbGUgKDApCiNlbHNlCiNkZWZpbmUgRFBSSU5URihmbXQsIC4uLikgZG8ge30gd2hpbGUgKDApCiNlbmRpZgojZGVmaW5lIEJBREYoZm10LCAuLi4pIFwKZG8geyBmcHJpbnRmKHN0ZGVyciwgImphenogbGVkIEVSUk9SOiAiIGZtdCAsICMjIF9fVkFfQVJHU19fKTt9IHdoaWxlICgwKQoKdHlwZWRlZiBlbnVtIHsKICAgIFJFRFJBV19OT05FID0gMCwgUkVEUkFXX1NFR01FTlRTID0gMSwgUkVEUkFXX0JBQ0tHUk9VTkQgPSAyLAp9IHNjcmVlbl9zdGF0ZV90OwoKdHlwZWRlZiBzdHJ1Y3QgTGVkU3RhdGUgewogICAgdWludDhfdCBzZWdtZW50czsKICAgIERpc3BsYXlTdGF0ZSAqZHM7CiAgICBzY3JlZW5fc3RhdGVfdCBzdGF0ZTsKfSBMZWRTdGF0ZTsKCnN0YXRpYyB1aW50MzJfdCBsZWRfcmVhZGIodm9pZCAqb3BhcXVlLCB0YXJnZXRfcGh5c19hZGRyX3QgYWRkcikKewogICAgTGVkU3RhdGUgKnMgPSBvcGFxdWU7CiAgICB1aW50MzJfdCB2YWw7CgogICAgc3dpdGNoIChhZGRyKSB7CiAgICAgICAgY2FzZSAwOgogICAgICAgICAgICB2YWwgPSBzLT5zZWdtZW50czsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgQkFERigiaW52YWxpZCByZWFkIGF0IFsiIFRBUkdFVF9GTVRfcGx4ICJdXG4iLCBhZGRyKTsKICAgICAgICAgICAgdmFsID0gMDsKICAgIH0KCiAgICBEUFJJTlRGKCJyZWFkIGFkZHI9IiBUQVJHRVRfRk1UX3BseCAiIHZhbD0weCUwMnhcbiIsIGFkZHIsIHZhbCk7CgogICAgcmV0dXJuIHZhbDsKfQoKc3RhdGljIHVpbnQzMl90IGxlZF9yZWFkdyh2b2lkICpvcGFxdWUsIHRhcmdldF9waHlzX2FkZHJfdCBhZGRyKQp7CiAgICB1aW50MzJfdCB2OwojaWZkZWYgVEFSR0VUX1dPUkRTX0JJR0VORElBTgogICAgdiA9IGxlZF9yZWFkYihvcGFxdWUsIGFkZHIpIDw8IDg7CiAgICB2IHw9IGxlZF9yZWFkYihvcGFxdWUsIGFkZHIgKyAxKTsKI2Vsc2UKICAgIHYgPSBsZWRfcmVhZGIob3BhcXVlLCBhZGRyKTsKICAgIHYgfD0gbGVkX3JlYWRiKG9wYXF1ZSwgYWRkciArIDEpIDw8IDg7CiNlbmRpZgogICAgcmV0dXJuIHY7Cn0KCnN0YXRpYyB1aW50MzJfdCBsZWRfcmVhZGwodm9pZCAqb3BhcXVlLCB0YXJnZXRfcGh5c19hZGRyX3QgYWRkcikKewogICAgdWludDMyX3QgdjsKI2lmZGVmIFRBUkdFVF9XT1JEU19CSUdFTkRJQU4KICAgIHYgPSBsZWRfcmVhZGIob3BhcXVlLCBhZGRyKSA8PCAyNDsKICAgIHYgfD0gbGVkX3JlYWRiKG9wYXF1ZSwgYWRkciArIDEpIDw8IDE2OwogICAgdiB8PSBsZWRfcmVhZGIob3BhcXVlLCBhZGRyICsgMikgPDwgODsKICAgIHYgfD0gbGVkX3JlYWRiKG9wYXF1ZSwgYWRkciArIDMpOwojZWxzZQogICAgdiA9IGxlZF9yZWFkYihvcGFxdWUsIGFkZHIpOwogICAgdiB8PSBsZWRfcmVhZGIob3BhcXVlLCBhZGRyICsgMSkgPDwgODsKICAgIHYgfD0gbGVkX3JlYWRiKG9wYXF1ZSwgYWRkciArIDIpIDw8IDE2OwogICAgdiB8PSBsZWRfcmVhZGIob3BhcXVlLCBhZGRyICsgMykgPDwgMjQ7CiNlbmRpZgogICAgcmV0dXJuIHY7Cn0KCnN0YXRpYyB2b2lkIGxlZF93cml0ZWIodm9pZCAqb3BhcXVlLCB0YXJnZXRfcGh5c19hZGRyX3QgYWRkciwgdWludDMyX3QgdmFsKQp7CiAgICBMZWRTdGF0ZSAqcyA9IG9wYXF1ZTsKCiAgICBEUFJJTlRGKCJ3cml0ZSBhZGRyPSIgVEFSR0VUX0ZNVF9wbHggIiB2YWw9MHglMDJ4XG4iLCBhZGRyLCB2YWwpOwoKICAgIHN3aXRjaCAoYWRkcikgewogICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgcy0+c2VnbWVudHMgPSB2YWw7CiAgICAgICAgICAgIHMtPnN0YXRlIHw9IFJFRFJBV19TRUdNRU5UUzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgQkFERigiaW52YWxpZCB3cml0ZSBvZiAweCUwOHggYXQgWyIgVEFSR0VUX0ZNVF9wbHggIl1cbiIsIHZhbCwgYWRkcik7CiAgICAgICAgICAgIGJyZWFrOwogICAgfQp9CgpzdGF0aWMgdm9pZCBsZWRfd3JpdGV3KHZvaWQgKm9wYXF1ZSwgdGFyZ2V0X3BoeXNfYWRkcl90IGFkZHIsIHVpbnQzMl90IHZhbCkKewojaWZkZWYgVEFSR0VUX1dPUkRTX0JJR0VORElBTgogICAgbGVkX3dyaXRlYihvcGFxdWUsIGFkZHIsICh2YWwgPj4gOCkgJiAweGZmKTsKICAgIGxlZF93cml0ZWIob3BhcXVlLCBhZGRyICsgMSwgdmFsICYgMHhmZik7CiNlbHNlCiAgICBsZWRfd3JpdGViKG9wYXF1ZSwgYWRkciwgdmFsICYgMHhmZik7CiAgICBsZWRfd3JpdGViKG9wYXF1ZSwgYWRkciArIDEsICh2YWwgPj4gOCkgJiAweGZmKTsKI2VuZGlmCn0KCnN0YXRpYyB2b2lkIGxlZF93cml0ZWwodm9pZCAqb3BhcXVlLCB0YXJnZXRfcGh5c19hZGRyX3QgYWRkciwgdWludDMyX3QgdmFsKQp7CiNpZmRlZiBUQVJHRVRfV09SRFNfQklHRU5ESUFOCiAgICBsZWRfd3JpdGViKG9wYXF1ZSwgYWRkciwgKHZhbCA+PiAyNCkgJiAweGZmKTsKICAgIGxlZF93cml0ZWIob3BhcXVlLCBhZGRyICsgMSwgKHZhbCA+PiAxNikgJiAweGZmKTsKICAgIGxlZF93cml0ZWIob3BhcXVlLCBhZGRyICsgMiwgKHZhbCA+PiA4KSAmIDB4ZmYpOwogICAgbGVkX3dyaXRlYihvcGFxdWUsIGFkZHIgKyAzLCB2YWwgJiAweGZmKTsKI2Vsc2UKICAgIGxlZF93cml0ZWIob3BhcXVlLCBhZGRyLCB2YWwgJiAweGZmKTsKICAgIGxlZF93cml0ZWIob3BhcXVlLCBhZGRyICsgMSwgKHZhbCA+PiA4KSAmIDB4ZmYpOwogICAgbGVkX3dyaXRlYihvcGFxdWUsIGFkZHIgKyAyLCAodmFsID4+IDE2KSAmIDB4ZmYpOwogICAgbGVkX3dyaXRlYihvcGFxdWUsIGFkZHIgKyAzLCAodmFsID4+IDI0KSAmIDB4ZmYpOwojZW5kaWYKfQoKc3RhdGljIENQVVJlYWRNZW1vcnlGdW5jICogY29uc3QgbGVkX3JlYWRbM10gPSB7CiAgICBsZWRfcmVhZGIsCiAgICBsZWRfcmVhZHcsCiAgICBsZWRfcmVhZGwsCn07CgpzdGF0aWMgQ1BVV3JpdGVNZW1vcnlGdW5jICogY29uc3QgbGVkX3dyaXRlWzNdID0gewogICAgbGVkX3dyaXRlYiwKICAgIGxlZF93cml0ZXcsCiAgICBsZWRfd3JpdGVsLAp9OwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiBqYXp6X2xlZCBkaXNwbGF5ICovCgpzdGF0aWMgdm9pZCBkcmF3X2hvcml6b250YWxfbGluZShEaXNwbGF5U3RhdGUgKmRzLCBpbnQgcG9zeSwgaW50IHBvc3gxLCBpbnQgcG9zeDIsIHVpbnQzMl90IGNvbG9yKQp7CiAgICB1aW50OF90ICpkOwogICAgaW50IHgsIGJwcDsKCiAgICBicHAgPSAoZHNfZ2V0X2JpdHNfcGVyX3BpeGVsKGRzKSArIDcpID4+IDM7CiAgICBkID0gZHNfZ2V0X2RhdGEoZHMpICsgZHNfZ2V0X2xpbmVzaXplKGRzKSAqIHBvc3kgKyBicHAgKiBwb3N4MTsKICAgIHN3aXRjaChicHApIHsKICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgIGZvciAoeCA9IHBvc3gxOyB4IDw9IHBvc3gyOyB4KyspIHsKICAgICAgICAgICAgICAgICooKHVpbnQ4X3QgKilkKSA9IGNvbG9yOwogICAgICAgICAgICAgICAgZCsrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgZm9yICh4ID0gcG9zeDE7IHggPD0gcG9zeDI7IHgrKykgewogICAgICAgICAgICAgICAgKigodWludDE2X3QgKilkKSA9IGNvbG9yOwogICAgICAgICAgICAgICAgZCArPSAyOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgZm9yICh4ID0gcG9zeDE7IHggPD0gcG9zeDI7IHgrKykgewogICAgICAgICAgICAgICAgKigodWludDMyX3QgKilkKSA9IGNvbG9yOwogICAgICAgICAgICAgICAgZCArPSA0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgfQp9CgpzdGF0aWMgdm9pZCBkcmF3X3ZlcnRpY2FsX2xpbmUoRGlzcGxheVN0YXRlICpkcywgaW50IHBvc3gsIGludCBwb3N5MSwgaW50IHBvc3kyLCB1aW50MzJfdCBjb2xvcikKewogICAgdWludDhfdCAqZDsKICAgIGludCB5LCBicHA7CgogICAgYnBwID0gKGRzX2dldF9iaXRzX3Blcl9waXhlbChkcykgKyA3KSA+PiAzOwogICAgZCA9IGRzX2dldF9kYXRhKGRzKSArIGRzX2dldF9saW5lc2l6ZShkcykgKiBwb3N5MSArIGJwcCAqIHBvc3g7CiAgICBzd2l0Y2goYnBwKSB7CiAgICAgICAgY2FzZSAxOgogICAgICAgICAgICBmb3IgKHkgPSBwb3N5MTsgeSA8PSBwb3N5MjsgeSsrKSB7CiAgICAgICAgICAgICAgICAqKCh1aW50OF90ICopZCkgPSBjb2xvcjsKICAgICAgICAgICAgICAgIGQgKz0gZHNfZ2V0X2xpbmVzaXplKGRzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgIGZvciAoeSA9IHBvc3kxOyB5IDw9IHBvc3kyOyB5KyspIHsKICAgICAgICAgICAgICAgICooKHVpbnQxNl90ICopZCkgPSBjb2xvcjsKICAgICAgICAgICAgICAgIGQgKz0gZHNfZ2V0X2xpbmVzaXplKGRzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgIGZvciAoeSA9IHBvc3kxOyB5IDw9IHBvc3kyOyB5KyspIHsKICAgICAgICAgICAgICAgICooKHVpbnQzMl90ICopZCkgPSBjb2xvcjsKICAgICAgICAgICAgICAgIGQgKz0gZHNfZ2V0X2xpbmVzaXplKGRzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgIH0KfQoKc3RhdGljIHZvaWQgamF6el9sZWRfdXBkYXRlX2Rpc3BsYXkodm9pZCAqb3BhcXVlKQp7CiAgICBMZWRTdGF0ZSAqcyA9IG9wYXF1ZTsKICAgIERpc3BsYXlTdGF0ZSAqZHMgPSBzLT5kczsKICAgIHVpbnQ4X3QgKmQxOwogICAgdWludDMyX3QgY29sb3Jfc2VnbWVudCwgY29sb3JfbGVkOwogICAgaW50IHksIGJwcDsKCiAgICBpZiAocy0+c3RhdGUgJiBSRURSQVdfQkFDS0dST1VORCkgewogICAgICAgIC8qIGNsZWFyIHNjcmVlbiAqLwogICAgICAgIGJwcCA9IChkc19nZXRfYml0c19wZXJfcGl4ZWwoZHMpICsgNykgPj4gMzsKICAgICAgICBkMSA9IGRzX2dldF9kYXRhKGRzKTsKICAgICAgICBmb3IgKHkgPSAwOyB5IDwgZHNfZ2V0X2hlaWdodChkcyk7IHkrKykgewogICAgICAgICAgICBtZW1zZXQoZDEsIDB4MDAsIGRzX2dldF93aWR0aChkcykgKiBicHApOwogICAgICAgICAgICBkMSArPSBkc19nZXRfbGluZXNpemUoZHMpOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAocy0+c3RhdGUgJiBSRURSQVdfU0VHTUVOVFMpIHsKICAgICAgICAvKiBzZXQgY29sb3JzIGFjY29yZGluZyB0byBicHAgKi8KICAgICAgICBzd2l0Y2ggKGRzX2dldF9iaXRzX3Blcl9waXhlbChkcykpIHsKICAgICAgICAgICAgY2FzZSA4OgogICAgICAgICAgICAgICAgY29sb3Jfc2VnbWVudCA9IHJnYl90b19waXhlbDgoMHhhYSwgMHhhYSwgMHhhYSk7CiAgICAgICAgICAgICAgICBjb2xvcl9sZWQgPSByZ2JfdG9fcGl4ZWw4KDB4MDAsIDB4ZmYsIDB4MDApOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgMTU6CiAgICAgICAgICAgICAgICBjb2xvcl9zZWdtZW50ID0gcmdiX3RvX3BpeGVsMTUoMHhhYSwgMHhhYSwgMHhhYSk7CiAgICAgICAgICAgICAgICBjb2xvcl9sZWQgPSByZ2JfdG9fcGl4ZWwxNSgweDAwLCAweGZmLCAweDAwKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIDE2OgogICAgICAgICAgICAgICAgY29sb3Jfc2VnbWVudCA9IHJnYl90b19waXhlbDE2KDB4YWEsIDB4YWEsIDB4YWEpOwogICAgICAgICAgICAgICAgY29sb3JfbGVkID0gcmdiX3RvX3BpeGVsMTYoMHgwMCwgMHhmZiwgMHgwMCk7CiAgICAgICAgICAgIGNhc2UgMjQ6CiAgICAgICAgICAgICAgICBjb2xvcl9zZWdtZW50ID0gcmdiX3RvX3BpeGVsMjQoMHhhYSwgMHhhYSwgMHhhYSk7CiAgICAgICAgICAgICAgICBjb2xvcl9sZWQgPSByZ2JfdG9fcGl4ZWwyNCgweDAwLCAweGZmLCAweDAwKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIDMyOgogICAgICAgICAgICAgICAgY29sb3Jfc2VnbWVudCA9IHJnYl90b19waXhlbDMyKDB4YWEsIDB4YWEsIDB4YWEpOwogICAgICAgICAgICAgICAgY29sb3JfbGVkID0gcmdiX3RvX3BpeGVsMzIoMHgwMCwgMHhmZiwgMHgwMCk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIC8qIGRpc3BsYXkgc2VnbWVudHMgKi8KICAgICAgICBkcmF3X2hvcml6b250YWxfbGluZShkcywgNDAsIDEwLCA0MCwgKHMtPnNlZ21lbnRzICYgMHgwMikgPyBjb2xvcl9zZWdtZW50IDogMCk7CiAgICAgICAgZHJhd192ZXJ0aWNhbF9saW5lKGRzLCAxMCwgMTAsIDQwLCAocy0+c2VnbWVudHMgJiAweDA0KSA/IGNvbG9yX3NlZ21lbnQgOiAwKTsKICAgICAgICBkcmF3X3ZlcnRpY2FsX2xpbmUoZHMsIDEwLCA0MCwgNzAsIChzLT5zZWdtZW50cyAmIDB4MDgpID8gY29sb3Jfc2VnbWVudCA6IDApOwogICAgICAgIGRyYXdfaG9yaXpvbnRhbF9saW5lKGRzLCA3MCwgMTAsIDQwLCAocy0+c2VnbWVudHMgJiAweDEwKSA/IGNvbG9yX3NlZ21lbnQgOiAwKTsKICAgICAgICBkcmF3X3ZlcnRpY2FsX2xpbmUoZHMsIDQwLCA0MCwgNzAsIChzLT5zZWdtZW50cyAmIDB4MjApID8gY29sb3Jfc2VnbWVudCA6IDApOwogICAgICAgIGRyYXdfdmVydGljYWxfbGluZShkcywgNDAsIDEwLCA0MCwgKHMtPnNlZ21lbnRzICYgMHg0MCkgPyBjb2xvcl9zZWdtZW50IDogMCk7CiAgICAgICAgZHJhd19ob3Jpem9udGFsX2xpbmUoZHMsIDEwLCAxMCwgNDAsIChzLT5zZWdtZW50cyAmIDB4ODApID8gY29sb3Jfc2VnbWVudCA6IDApOwoKICAgICAgICAvKiBkaXNwbGF5IGxlZCAqLwogICAgICAgIGlmICghKHMtPnNlZ21lbnRzICYgMHgwMSkpCiAgICAgICAgICAgIGNvbG9yX2xlZCA9IDA7IC8qIGJsYWNrICovCiAgICAgICAgZHJhd19ob3Jpem9udGFsX2xpbmUoZHMsIDY4LCA1MCwgNTAsIGNvbG9yX2xlZCk7CiAgICAgICAgZHJhd19ob3Jpem9udGFsX2xpbmUoZHMsIDY5LCA0OSwgNTEsIGNvbG9yX2xlZCk7CiAgICAgICAgZHJhd19ob3Jpem9udGFsX2xpbmUoZHMsIDcwLCA0OCwgNTIsIGNvbG9yX2xlZCk7CiAgICAgICAgZHJhd19ob3Jpem9udGFsX2xpbmUoZHMsIDcxLCA0OSwgNTEsIGNvbG9yX2xlZCk7CiAgICAgICAgZHJhd19ob3Jpem9udGFsX2xpbmUoZHMsIDcyLCA1MCwgNTAsIGNvbG9yX2xlZCk7CiAgICB9CgogICAgcy0+c3RhdGUgPSBSRURSQVdfTk9ORTsKICAgIGRweV91cGRhdGUoZHMsIDAsIDAsIGRzX2dldF93aWR0aChkcyksIGRzX2dldF9oZWlnaHQoZHMpKTsKfQoKc3RhdGljIHZvaWQgamF6el9sZWRfaW52YWxpZGF0ZV9kaXNwbGF5KHZvaWQgKm9wYXF1ZSkKewogICAgTGVkU3RhdGUgKnMgPSBvcGFxdWU7CiAgICBzLT5zdGF0ZSB8PSBSRURSQVdfU0VHTUVOVFMgfCBSRURSQVdfQkFDS0dST1VORDsKfQoKc3RhdGljIHZvaWQgamF6el9sZWRfc2NyZWVuX2R1bXAodm9pZCAqb3BhcXVlLCBjb25zdCBjaGFyICpmaWxlbmFtZSkKewogICAgcHJpbnRmKCJqYXp6X2xlZF9zY3JlZW5fZHVtcCgpIG5vdCBpbXBsZW1lbnRlZFxuIik7Cn0KCnN0YXRpYyB2b2lkIGphenpfbGVkX3RleHRfdXBkYXRlKHZvaWQgKm9wYXF1ZSwgY29uc29sZV9jaF90ICpjaGFyZGF0YSkKewogICAgTGVkU3RhdGUgKnMgPSBvcGFxdWU7CiAgICBjaGFyIGJ1ZlsyXTsKCiAgICBkcHlfY3Vyc29yKHMtPmRzLCAtMSwgLTEpOwogICAgcWVtdV9jb25zb2xlX3Jlc2l6ZShzLT5kcywgMiwgMSk7CgogICAgLyogVE9ETzogZHJhdyB0aGUgc2VnbWVudHMgKi8KICAgIHNucHJpbnRmKGJ1ZiwgMiwgIiUwMmhoeFxuIiwgcy0+c2VnbWVudHMpOwogICAgY29uc29sZV93cml0ZV9jaChjaGFyZGF0YSsrLCAweDAwMjAwMTAwIHwgYnVmWzBdKTsKICAgIGNvbnNvbGVfd3JpdGVfY2goY2hhcmRhdGErKywgMHgwMDIwMDEwMCB8IGJ1ZlsxXSk7CgogICAgZHB5X3VwZGF0ZShzLT5kcywgMCwgMCwgMiwgMSk7Cn0KCnZvaWQgamF6el9sZWRfaW5pdCh0YXJnZXRfcGh5c19hZGRyX3QgYmFzZSkKewogICAgTGVkU3RhdGUgKnM7CiAgICBpbnQgaW87CgogICAgcyA9IHFlbXVfbWFsbG9jeihzaXplb2YoTGVkU3RhdGUpKTsKCiAgICBzLT5zdGF0ZSA9IFJFRFJBV19TRUdNRU5UUyB8IFJFRFJBV19CQUNLR1JPVU5EOwoKICAgIGlvID0gY3B1X3JlZ2lzdGVyX2lvX21lbW9yeShsZWRfcmVhZCwgbGVkX3dyaXRlLCBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFVklDRV9OQVRJVkVfRU5ESUFOKTsKICAgIGNwdV9yZWdpc3Rlcl9waHlzaWNhbF9tZW1vcnkoYmFzZSwgMSwgaW8pOwoKICAgIHMtPmRzID0gZ3JhcGhpY19jb25zb2xlX2luaXQoamF6el9sZWRfdXBkYXRlX2Rpc3BsYXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphenpfbGVkX2ludmFsaWRhdGVfZGlzcGxheSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF6el9sZWRfc2NyZWVuX2R1bXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphenpfbGVkX3RleHRfdXBkYXRlLCBzKTsKICAgIHFlbXVfY29uc29sZV9yZXNpemUocy0+ZHMsIDYwLCA4MCk7Cn0K