ZGlmZiAtLWdpdCBhL2c0MDEzMDIvcHJvamVjdC9nNDAxMzAyLnV2b3B0IGIvZzQwMTMwMi9wcm9qZWN0L2c0MDEzMDIudXZvcHQKaW5kZXggMTU2NTc5YS4uYzkxMjE2OCAxMDA2NDQKLS0tIGEvZzQwMTMwMi9wcm9qZWN0L2c0MDEzMDIudXZvcHQKKysrIGIvZzQwMTMwMi9wcm9qZWN0L2c0MDEzMDIudXZvcHQKQEAgLTE3MSw5ICsxNzEsMjQgQEAKICAgICAgICAgPEJwPgogICAgICAgICAgIDxOdW1iZXI+MDwvTnVtYmVyPgogICAgICAgICAgIDxUeXBlPjA8L1R5cGU+CisgICAgICAgICAgPExpbmVOdW1iZXI+MTMyPC9MaW5lTnVtYmVyPgorICAgICAgICAgIDxFbmFibGVkRmxhZz4xPC9FbmFibGVkRmxhZz4KKyAgICAgICAgICA8QWRkcmVzcz4xMzQyOTIyNjY8L0FkZHJlc3M+CisgICAgICAgICAgPEJ5dGVPYmplY3Q+MDwvQnl0ZU9iamVjdD4KKyAgICAgICAgICA8TWFueU9iamVjdHM+MDwvTWFueU9iamVjdHM+CisgICAgICAgICAgPFNpemVPZk9iamVjdD4wPC9TaXplT2ZPYmplY3Q+CisgICAgICAgICAgPEJyZWFrQnlBY2Nlc3M+MDwvQnJlYWtCeUFjY2Vzcz4KKyAgICAgICAgICA8QnJlYWtJZlJDb3VudD4xPC9CcmVha0lmUkNvdW50PgorICAgICAgICAgIDxGaWxlbmFtZT5EOlxzaHV3ZWlcY29kZXdhcmVob3VzZVx3YXRlcl9nNDAxXHN1cHdpc2RvbVxzcF9jYXJkLmM8L0ZpbGVuYW1lPgorICAgICAgICAgIDxFeGVjQ29tbWFuZD48L0V4ZWNDb21tYW5kPgorICAgICAgICAgIDxFeHByZXNzaW9uPjwvRXhwcmVzc2lvbj4KKyAgICAgICAgPC9CcD4KKyAgICAgICAgPEJwPgorICAgICAgICAgIDxOdW1iZXI+MTwvTnVtYmVyPgorICAgICAgICAgIDxUeXBlPjA8L1R5cGU+CiAgICAgICAgICAgPExpbmVOdW1iZXI+Mjk2PC9MaW5lTnVtYmVyPgogICAgICAgICAgIDxFbmFibGVkRmxhZz4wPC9FbmFibGVkRmxhZz4KLSAgICAgICAgICA8QWRkcmVzcz4xMzQyOTYxNzI8L0FkZHJlc3M+CisgICAgICAgICAgPEFkZHJlc3M+MTM0Mjk2MzYwPC9BZGRyZXNzPgogICAgICAgICAgIDxCeXRlT2JqZWN0PjA8L0J5dGVPYmplY3Q+CiAgICAgICAgICAgPE1hbnlPYmplY3RzPjA8L01hbnlPYmplY3RzPgogICAgICAgICAgIDxTaXplT2ZPYmplY3Q+MDwvU2l6ZU9mT2JqZWN0PgpAQCAtMTg0LDI2ICsxOTksMTEgQEAKICAgICAgICAgICA8RXhwcmVzc2lvbj5cXEc0MDEzMDJfZmxvd1wuLi8uLi9zdXB3aXNkb20vc3BfZGF0YS5jXDI5NjwvRXhwcmVzc2lvbj4KICAgICAgICAgPC9CcD4KICAgICAgICAgPEJwPgotICAgICAgICAgIDxOdW1iZXI+MTwvTnVtYmVyPgotICAgICAgICAgIDxUeXBlPjA8L1R5cGU+Ci0gICAgICAgICAgPExpbmVOdW1iZXI+NjIzPC9MaW5lTnVtYmVyPgotICAgICAgICAgIDxFbmFibGVkRmxhZz4wPC9FbmFibGVkRmxhZz4KLSAgICAgICAgICA8QWRkcmVzcz4xMzQyOTUxMzI8L0FkZHJlc3M+Ci0gICAgICAgICAgPEJ5dGVPYmplY3Q+MDwvQnl0ZU9iamVjdD4KLSAgICAgICAgICA8TWFueU9iamVjdHM+MDwvTWFueU9iamVjdHM+Ci0gICAgICAgICAgPFNpemVPZk9iamVjdD4wPC9TaXplT2ZPYmplY3Q+Ci0gICAgICAgICAgPEJyZWFrQnlBY2Nlc3M+MDwvQnJlYWtCeUFjY2Vzcz4KLSAgICAgICAgICA8QnJlYWtJZlJDb3VudD4xPC9CcmVha0lmUkNvdW50PgotICAgICAgICAgIDxGaWxlbmFtZT48L0ZpbGVuYW1lPgotICAgICAgICAgIDxFeGVjQ29tbWFuZD48L0V4ZWNDb21tYW5kPgotICAgICAgICAgIDxFeHByZXNzaW9uPlxcRzQwMTMwMl9mbG93XC4uLy4uL3N1cHdpc2RvbS9zcF9jb25zdW1lLmNcNjIzPC9FeHByZXNzaW9uPgotICAgICAgICA8L0JwPgotICAgICAgICA8QnA+CiAgICAgICAgICAgPE51bWJlcj4yPC9OdW1iZXI+CiAgICAgICAgICAgPFR5cGU+MDwvVHlwZT4KICAgICAgICAgICA8TGluZU51bWJlcj4yMDY8L0xpbmVOdW1iZXI+CiAgICAgICAgICAgPEVuYWJsZWRGbGFnPjE8L0VuYWJsZWRGbGFnPgotICAgICAgICAgIDxBZGRyZXNzPjEzNDI5MTU5ODwvQWRkcmVzcz4KKyAgICAgICAgICA8QWRkcmVzcz4xMzQyOTE2NjY8L0FkZHJlc3M+CiAgICAgICAgICAgPEJ5dGVPYmplY3Q+MDwvQnl0ZU9iamVjdD4KICAgICAgICAgICA8TWFueU9iamVjdHM+MDwvTWFueU9iamVjdHM+CiAgICAgICAgICAgPFNpemVPZk9iamVjdD4wPC9TaXplT2ZPYmplY3Q+CkBAIC03MzMsOCArNzMzLDggQEAKICAgICAgIDxGb2N1cz4wPC9Gb2N1cz4KICAgICAgIDxDb2x1bW5OdW1iZXI+MDwvQ29sdW1uTnVtYmVyPgogICAgICAgPHR2RXhwT3B0RGxnPjA8L3R2RXhwT3B0RGxnPgotICAgICAgPFRvcExpbmU+MjU8L1RvcExpbmU+Ci0gICAgICA8Q3VycmVudExpbmU+MjU8L0N1cnJlbnRMaW5lPgorICAgICAgPFRvcExpbmU+MTIyPC9Ub3BMaW5lPgorICAgICAgPEN1cnJlbnRMaW5lPjEzMjwvQ3VycmVudExpbmU+CiAgICAgICA8YkRhdmUyPjA8L2JEYXZlMj4KICAgICAgIDxQYXRoV2l0aEZpbGVOYW1lPi4uXC4uXHN1cHdpc2RvbVxzcF9jYXJkLmM8L1BhdGhXaXRoRmlsZU5hbWU+CiAgICAgICA8RmlsZW5hbWVXaXRob3V0UGF0aD5zcF9jYXJkLmM8L0ZpbGVuYW1lV2l0aG91dFBhdGg+CkBAIC03NDcsOCArNzQ3LDggQEAKICAgICAgIDxGb2N1cz4wPC9Gb2N1cz4KICAgICAgIDxDb2x1bW5OdW1iZXI+MDwvQ29sdW1uTnVtYmVyPgogICAgICAgPHR2RXhwT3B0RGxnPjA8L3R2RXhwT3B0RGxnPgotICAgICAgPFRvcExpbmU+MTk2PC9Ub3BMaW5lPgotICAgICAgPEN1cnJlbnRMaW5lPjIwODwvQ3VycmVudExpbmU+CisgICAgICA8VG9wTGluZT41NTg8L1RvcExpbmU+CisgICAgICA8Q3VycmVudExpbmU+NTY1PC9DdXJyZW50TGluZT4KICAgICAgIDxiRGF2ZTI+MDwvYkRhdmUyPgogICAgICAgPFBhdGhXaXRoRmlsZU5hbWU+Li5cLi5cc3Vwd2lzZG9tXHNwX2NvbW11bmljYXRlLmM8L1BhdGhXaXRoRmlsZU5hbWU+CiAgICAgICA8RmlsZW5hbWVXaXRob3V0UGF0aD5zcF9jb21tdW5pY2F0ZS5jPC9GaWxlbmFtZVdpdGhvdXRQYXRoPgpAQCAtNzYxLDggKzc2MSw4IEBACiAgICAgICA8Rm9jdXM+MDwvRm9jdXM+CiAgICAgICA8Q29sdW1uTnVtYmVyPjA8L0NvbHVtbk51bWJlcj4KICAgICAgIDx0dkV4cE9wdERsZz4wPC90dkV4cE9wdERsZz4KLSAgICAgIDxUb3BMaW5lPjU1MTwvVG9wTGluZT4KLSAgICAgIDxDdXJyZW50TGluZT41NTg8L0N1cnJlbnRMaW5lPgorICAgICAgPFRvcExpbmU+Mzk0PC9Ub3BMaW5lPgorICAgICAgPEN1cnJlbnRMaW5lPjQwMTwvQ3VycmVudExpbmU+CiAgICAgICA8YkRhdmUyPjA8L2JEYXZlMj4KICAgICAgIDxQYXRoV2l0aEZpbGVOYW1lPi4uXC4uXHN1cHdpc2RvbVxzcF9jb25zdW1lLmM8L1BhdGhXaXRoRmlsZU5hbWU+CiAgICAgICA8RmlsZW5hbWVXaXRob3V0UGF0aD5zcF9jb25zdW1lLmM8L0ZpbGVuYW1lV2l0aG91dFBhdGg+CkBAIC03NzUsOCArNzc1LDggQEAKICAgICAgIDxGb2N1cz4wPC9Gb2N1cz4KICAgICAgIDxDb2x1bW5OdW1iZXI+MDwvQ29sdW1uTnVtYmVyPgogICAgICAgPHR2RXhwT3B0RGxnPjA8L3R2RXhwT3B0RGxnPgotICAgICAgPFRvcExpbmU+MjA4PC9Ub3BMaW5lPgotICAgICAgPEN1cnJlbnRMaW5lPjIxNTwvQ3VycmVudExpbmU+CisgICAgICA8VG9wTGluZT42NzwvVG9wTGluZT4KKyAgICAgIDxDdXJyZW50TGluZT44NjwvQ3VycmVudExpbmU+CiAgICAgICA8YkRhdmUyPjA8L2JEYXZlMj4KICAgICAgIDxQYXRoV2l0aEZpbGVOYW1lPi4uXC4uXHN1cHdpc2RvbVxzcF9kYXRhLmM8L1BhdGhXaXRoRmlsZU5hbWU+CiAgICAgICA8RmlsZW5hbWVXaXRob3V0UGF0aD5zcF9kYXRhLmM8L0ZpbGVuYW1lV2l0aG91dFBhdGg+CkBAIC0xMjA5LDggKzEyMDksOCBAQAogICAgICAgPEZvY3VzPjA8L0ZvY3VzPgogICAgICAgPENvbHVtbk51bWJlcj4wPC9Db2x1bW5OdW1iZXI+CiAgICAgICA8dHZFeHBPcHREbGc+MDwvdHZFeHBPcHREbGc+Ci0gICAgICA8VG9wTGluZT4wPC9Ub3BMaW5lPgotICAgICAgPEN1cnJlbnRMaW5lPjA8L0N1cnJlbnRMaW5lPgorICAgICAgPFRvcExpbmU+NzYyPC9Ub3BMaW5lPgorICAgICAgPEN1cnJlbnRMaW5lPjc2NzwvQ3VycmVudExpbmU+CiAgICAgICA8YkRhdmUyPjA8L2JEYXZlMj4KICAgICAgIDxQYXRoV2l0aEZpbGVOYW1lPi4uXC4uXHN0X2Z3X2xpYlxzcmNcc3RtMzJmMTB4X3NwaS5jPC9QYXRoV2l0aEZpbGVOYW1lPgogICAgICAgPEZpbGVuYW1lV2l0aG91dFBhdGg+c3RtMzJmMTB4X3NwaS5jPC9GaWxlbmFtZVdpdGhvdXRQYXRoPgpkaWZmIC0tZ2l0IGEvZzQwMTMwMi9wcm9qZWN0L2c0MDEzMDIudXZwcm9qIGIvZzQwMTMwMi9wcm9qZWN0L2c0MDEzMDIudXZwcm9qCmluZGV4IGViMDgzYTYuLjE4MWM4MWMgMTAwNjQ0Ci0tLSBhL2c0MDEzMDIvcHJvamVjdC9nNDAxMzAyLnV2cHJvagorKysgYi9nNDAxMzAyL3Byb2plY3QvZzQwMTMwMi51dnByb2oKQEAgLTYzLDcgKzYzLDcgQEAKICAgICAgICAgICAgIDxVc2VyUHJvZzJEb3MxNk1vZGU+MDwvVXNlclByb2cyRG9zMTZNb2RlPgogICAgICAgICAgIDwvQmVmb3JlQ29tcGlsZT4KICAgICAgICAgICA8QmVmb3JlTWFrZT4KLSAgICAgICAgICAgIDxSdW5Vc2VyUHJvZzE+MTwvUnVuVXNlclByb2cxPgorICAgICAgICAgICAgPFJ1blVzZXJQcm9nMT4wPC9SdW5Vc2VyUHJvZzE+CiAgICAgICAgICAgICA8UnVuVXNlclByb2cyPjA8L1J1blVzZXJQcm9nMj4KICAgICAgICAgICAgIDxVc2VyUHJvZzFOYW1lPmNtZCAvYyBnaXR2ZXIuYmF0PC9Vc2VyUHJvZzFOYW1lPgogICAgICAgICAgICAgPFVzZXJQcm9nMk5hbWU+PC9Vc2VyUHJvZzJOYW1lPgpkaWZmIC0tZ2l0IGEvbGNkL1NUNzU2NVIuYyBiL2xjZC9TVDc1NjVSLmMKaW5kZXggOWI5MTYxMC4uMTBlYWJlNSAxMDA2NDQKLS0tIGEvbGNkL1NUNzU2NVIuYworKysgYi9sY2QvU1Q3NTY1Ui5jCkBAIC0xMjEsNyArMTIxLDcgQEAKIAogCiAjZGVmaW5lIEdMQ0RfSU5JVF9OSERfQzEyODY0V0NfRlNXX0ZCV18zVjNfTQotdWludDhfdCBjb250cmFzdCA9IDM3OwordWludDhfdCBjb250cmFzdCA9IDMzOwogdm9pZCBnbGNkX1NUNzU2NVJfaW5pdCh2b2lkKSB7CiAJCiAjaWYgZGVmaW5lZChHTENEX0lOSVRfTkhEX0MxMjgzMkExWl9GU1dfRkJXXzNWMykKZGlmZiAtLWdpdCBhL21zZ3BhY2svY3dwYWNrLmMgYi9tc2dwYWNrL2N3cGFjay5jCmluZGV4IDQ5NmI0YjMuLjc3NGNlYjcgMTAwNjQ0Ci0tLSBhL21zZ3BhY2svY3dwYWNrLmMKKysrIGIvbXNncGFjay9jd3BhY2suYwpAQCAtMSwxOCArMSwxOCBAQAogLyogICAgICBDV1BhY2sgLSBjd3BhY2suYyAgICovCiAvKgogIFRoZSBNSVQgTGljZW5zZSAoTUlUKQotIAorCiAgQ29weXJpZ2h0IChjKSAyMDE3IENsYWVzIFdpaGxib3JnCi0gCisKICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMKICBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlCiAgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LAogIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0CiAgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotIAorCiAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvcgogIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KLSAKKwogIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORwogIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAogIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sCkBAIC0zMSwzOSArMzEsNDAgQEAKIAogI2lmZGVmIEZPUkNFX05PX0xJQlJBUlkKIAotc3RhdGljIHZvaWQJKm1lbWNweSh2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IG4pCitzdGF0aWMgdm9pZCoJbWVtY3B5KHZvaWQqIGRzdCwgY29uc3Qgdm9pZCogc3JjLCBzaXplX3QgbikKIHsKLSAgICB1bnNpZ25lZCBpbnQgaTsKLSAgICB1aW50OF90ICpkPSh1aW50OF90Kilkc3QsICpzPSh1aW50OF90KilzcmM7Ci0gICAgZm9yIChpPTA7IGk8bjsgaSsrKQotICAgIHsKLSAgICAgICAgKmQrKyA9ICpzKys7Ci0gICAgfQotICAgIHJldHVybiBkc3Q7CisgIHVuc2lnbmVkIGludCBpOworICB1aW50OF90KiBkOworICB1aW50OF90KiBzOworICBkPSh1aW50OF90Kilkc3Q7CisgIHM9KHVpbnQ4X3QqKXNyYzsKKyAgZm9yKGk9MDsgaTxuOyBpKyspCisgIHsKKyAgICAqZCsrID0gKnMrKzsKKyAgfQorICByZXR1cm4gZHN0OwogfQogCiAjZW5kaWYKIAotCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqICAgQiBZIFQgRSAgIE8gUiBEIEUgUiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIAogc3RhdGljIGludCB0ZXN0X2J5dGVfb3JkZXIodm9pZCkKIHsKICNpZmRlZiBDT01QSUxFX0ZPUl9CSUdfRU5ESUFOCi0gICAgY29uc3QgY2hhciAqZW5kaWFubmVzcyA9ICIxMjM0IjsKLSAgICBpZiAoKih1aW50MzJfdCopZW5kaWFubmVzcyAhPSAweDMxMzIzMzM0VUwpCi0gICAgICAgIHJldHVybiBDV1BfUkNfV1JPTkdfQllURV9PUkRFUjsKKyAgY29uc3QgY2hhciogZW5kaWFubmVzcyA9ICIxMjM0IjsKKyAgaWYoKih1aW50MzJfdCopZW5kaWFubmVzcyAhPSAweDMxMzIzMzM0VUwpCisgICAgcmV0dXJuIENXUF9SQ19XUk9OR19CWVRFX09SREVSOwogI2Vsc2UKIAogI2lmZGVmIENPTVBJTEVfRk9SX0xJVFRMRV9FTkRJQU4KLSAgICBjb25zdCBjaGFyICplbmRpYW5uZXNzID0gIjEyMzQiOwotICAgIGlmICgqKHVpbnQzMl90KillbmRpYW5uZXNzICE9IDB4MzQzMzMyMzFVTCkKLSAgICAgICAgcmV0dXJuIENXUF9SQ19XUk9OR19CWVRFX09SREVSOworICBjb25zdCBjaGFyKiBlbmRpYW5uZXNzID0gIjEyMzQiOworICBpZigqKHVpbnQzMl90KillbmRpYW5uZXNzICE9IDB4MzQzMzMyMzFVTCkKKyAgICByZXR1cm4gQ1dQX1JDX1dST05HX0JZVEVfT1JERVI7CiAjZW5kaWYKICNlbmRpZgotICAgIHJldHVybiBDV1BfUkNfT0s7CisgIHJldHVybiBDV1BfUkNfT0s7CiB9CiAKIApAQCAtNzEsMjAgKzcyLDIxIEBACiAKIAogCi1pbnQgY3dfcGFja19jb250ZXh0X2luaXQgKGN3X3BhY2tfY29udGV4dCogcGFja19jb250ZXh0LCB2b2lkKiBkYXRhLCB1bnNpZ25lZCBsb25nIGxlbmd0aCwgcGFja19vdmVyZmxvd19oYW5kbGVyIGhwbykKK2ludCBjd19wYWNrX2NvbnRleHRfaW5pdChjd19wYWNrX2NvbnRleHQqIHBhY2tfY29udGV4dCwgdm9pZCogZGF0YSwgdW5zaWduZWQgbG9uZyBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgcGFja19vdmVyZmxvd19oYW5kbGVyIGhwbykKIHsKLSAgICBwYWNrX2NvbnRleHQtPnN0YXJ0ID0gcGFja19jb250ZXh0LT5jdXJyZW50ID0gKHVpbnQ4X3QqKWRhdGE7Ci0gICAgcGFja19jb250ZXh0LT5lbmQgPSBwYWNrX2NvbnRleHQtPnN0YXJ0ICsgbGVuZ3RoOwotICAgIHBhY2tfY29udGV4dC0+YmVfY29tcGF0aWJsZSA9IGZhbHNlOwotICAgIHBhY2tfY29udGV4dC0+ZXJyX25vID0gMDsKLSAgICBwYWNrX2NvbnRleHQtPmhhbmRsZV9wYWNrX292ZXJmbG93ID0gaHBvOwotICAgIHBhY2tfY29udGV4dC0+cmV0dXJuX2NvZGUgPSB0ZXN0X2J5dGVfb3JkZXIoKTsKLSAgICByZXR1cm4gcGFja19jb250ZXh0LT5yZXR1cm5fY29kZTsKKyAgcGFja19jb250ZXh0LT5zdGFydCA9IHBhY2tfY29udGV4dC0+Y3VycmVudCA9ICh1aW50OF90KilkYXRhOworICBwYWNrX2NvbnRleHQtPmVuZCA9IHBhY2tfY29udGV4dC0+c3RhcnQgKyBsZW5ndGg7CisgIHBhY2tfY29udGV4dC0+YmVfY29tcGF0aWJsZSA9IGZhbHNlOworICBwYWNrX2NvbnRleHQtPmVycl9ubyA9IDA7CisgIHBhY2tfY29udGV4dC0+aGFuZGxlX3BhY2tfb3ZlcmZsb3cgPSBocG87CisgIHBhY2tfY29udGV4dC0+cmV0dXJuX2NvZGUgPSB0ZXN0X2J5dGVfb3JkZXIoKTsKKyAgcmV0dXJuIHBhY2tfY29udGV4dC0+cmV0dXJuX2NvZGU7CiB9CiAKLXZvaWQgY3dfcGFja19zZXRfY29tcGF0aWJpbGl0eSAoY3dfcGFja19jb250ZXh0KiBwYWNrX2NvbnRleHQsIGJvb2wgYmVfY29tcGF0aWJsZSkKK3ZvaWQgY3dfcGFja19zZXRfY29tcGF0aWJpbGl0eShjd19wYWNrX2NvbnRleHQqIHBhY2tfY29udGV4dCwgYm9vbCBiZV9jb21wYXRpYmxlKQogewotICAgIHBhY2tfY29udGV4dC0+YmVfY29tcGF0aWJsZSA9IGJlX2NvbXBhdGlibGU7CisgIHBhY2tfY29udGV4dC0+YmVfY29tcGF0aWJsZSA9IGJlX2NvbXBhdGlibGU7CiB9CiAKIApAQCAtOTQsMzE0ICs5NiwzNTIgQEAKIAogdm9pZCBjd19wYWNrX3Vuc2lnbmVkKGN3X3BhY2tfY29udGV4dCogcGFja19jb250ZXh0LCB1aW50NjRfdCBpKQogewotICAgIGlmIChwYWNrX2NvbnRleHQtPnJldHVybl9jb2RlKQotICAgICAgICByZXR1cm47Ci0gICAgCi0gICAgaWYgKGkgPCAxMjgpCi0gICAgICAgIHRyeU1vdmUwKGkpOworICBpbnQgcmM7CisgIHVpbnQ4X3QqIHA7CisgIHVpbnQ4X3QqIG55cDsKIAotICAgIGlmIChpIDwgMjU2KQotICAgICAgICB0cnlNb3ZlMSgweGNjLCBpKTsKKyAgaWYocGFja19jb250ZXh0LT5yZXR1cm5fY29kZSkKKyAgICByZXR1cm47CiAKLSAgICBpZiAoaSA8IDB4MTAwMDBMKQotICAgIHsKLSAgICAgICAgdHJ5TW92ZTIoMHhjZCwgaSk7Ci0gICAgfQotICAgIGlmIChpIDwgMHgxMDAwMDAwMDBMTCkKLSAgICAgICAgdHJ5TW92ZTQoMHhjZSwgaSk7CisgIGlmKGkgPCAxMjgpCisgICAgdHJ5TW92ZTAoaSk7CiAKLSAgICB0cnlNb3ZlOCgweGNmLGkpOworICBpZihpIDwgMjU2KQorICAgIHRyeU1vdmUxKDB4Y2MsIGkpOworCisgIGlmKGkgPCAweDEwMDAwTCkKKyAgeworICAgIHRyeU1vdmUyKDB4Y2QsIGkpOworICB9CisgIGlmKGkgPCAweDEwMDAwMDAwMExMKQorICAgIHRyeU1vdmU0KDB4Y2UsIGkpOworCisgIHRyeU1vdmU4KDB4Y2YsaSk7CiB9CiAKIAogdm9pZCBjd19wYWNrX3NpZ25lZChjd19wYWNrX2NvbnRleHQqIHBhY2tfY29udGV4dCwgaW50NjRfdCBpKQogewotICAgIGlmIChwYWNrX2NvbnRleHQtPnJldHVybl9jb2RlKQotICAgICAgICByZXR1cm47Ci0gICAgCi0gICAgaWYgKGkgPjEyNykKLSAgICB7Ci0gICAgICAgIGlmIChpIDwgMjU2KQotICAgICAgICAgICAgdHJ5TW92ZTEoMHhjYywgaSk7Ci0gICAgICAgIAotICAgICAgICBpZiAoaSA8IDB4MTAwMDBMKQotICAgICAgICAgICAgdHJ5TW92ZTIoMHhjZCwgaSk7Ci0gICAgICAgIAotICAgICAgICBpZiAoaSA8IDB4MTAwMDAwMDAwTEwpCi0gICAgICAgICAgICB0cnlNb3ZlNCgweGNlLCBpKTsKLSAgICAgICAgCi0gICAgICAgIHRyeU1vdmU4KDB4Y2YsaSk7Ci0gICAgfQotICAgIAotICAgIGlmIChpID49IC0zMikKLSAgICAgICAgdHJ5TW92ZTAoaSk7CisgIGludCByYzsKKyAgdWludDhfdCogcDsKKyAgdWludDhfdCogbnlwOworICBpZihwYWNrX2NvbnRleHQtPnJldHVybl9jb2RlKQorICAgIHJldHVybjsKIAotICAgIGlmIChpID49IC0xMjgpCi0gICAgICAgIHRyeU1vdmUxKDB4ZDAsIGkpOwotICAgIAotICAgIGlmIChpID49IC0zMjc2OCkKLSAgICAgICAgdHJ5TW92ZTIoMHhkMSxpKTsKKyAgaWYoaSA+MTI3KQorICB7CisgICAgaWYoaSA8IDI1NikKKyAgICAgIHRyeU1vdmUxKDB4Y2MsIGkpOwogCi0gICAgaWYgKGkgPj0gKGludDY0X3QpMHhmZmZmZmZmZjgwMDAwMDAwTEwpCi0gICAgICAgIHRyeU1vdmU0KDB4ZDIsaSk7CisgICAgaWYoaSA8IDB4MTAwMDBMKQorICAgICAgdHJ5TW92ZTIoMHhjZCwgaSk7CiAKLSAgICB0cnlNb3ZlOCgweGQzLGkpOworICAgIGlmKGkgPCAweDEwMDAwMDAwMExMKQorICAgICAgdHJ5TW92ZTQoMHhjZSwgaSk7CisKKyAgICB0cnlNb3ZlOCgweGNmLGkpOworICB9CisKKyAgaWYoaSA+PSAtMzIpCisgICAgdHJ5TW92ZTAoaSk7CisKKyAgaWYoaSA+PSAtMTI4KQorICAgIHRyeU1vdmUxKDB4ZDAsIGkpOworCisgIGlmKGkgPj0gLTMyNzY4KQorICAgIHRyeU1vdmUyKDB4ZDEsaSk7CisKKyAgaWYoaSA+PSAoaW50NjRfdCkweGZmZmZmZmZmODAwMDAwMDBMTCkKKyAgICB0cnlNb3ZlNCgweGQyLGkpOworCisgIHRyeU1vdmU4KDB4ZDMsaSk7CiB9CiAKIAogdm9pZCBjd19wYWNrX2Zsb2F0KGN3X3BhY2tfY29udGV4dCogcGFja19jb250ZXh0LCBmbG9hdCBmKQogewotICAgIGlmIChwYWNrX2NvbnRleHQtPnJldHVybl9jb2RlKQotICAgICAgICByZXR1cm47Ci0gICAgCi0gICAgdWludDMyX3QgdG1wID0gKigodWludDMyX3QqKSZmKTsKLSAgICB0cnlNb3ZlNCgweGNhLHRtcCk7CisgIHVpbnQzMl90IHRtcDsKKyAgaW50IHJjOworICB1aW50OF90KiBwOworICB1aW50OF90KiBueXA7CisgIGlmKHBhY2tfY29udGV4dC0+cmV0dXJuX2NvZGUpCisgICAgcmV0dXJuOworCisgIHRtcCA9ICooKHVpbnQzMl90KikmZik7CisgIHRyeU1vdmU0KDB4Y2EsdG1wKTsKIH0KIAogCiB2b2lkIGN3X3BhY2tfZG91YmxlKGN3X3BhY2tfY29udGV4dCogcGFja19jb250ZXh0LCBkb3VibGUgZCkKIHsKLSAgICBpZiAocGFja19jb250ZXh0LT5yZXR1cm5fY29kZSkKLSAgICAgICAgcmV0dXJuOwotICAgIAotICAgIHVpbnQ2NF90IHRtcCA9ICooKHVpbnQ2NF90KikmZCk7Ci0gICAgdHJ5TW92ZTgoMHhjYix0bXApOworICB1aW50NjRfdCB0bXA7CisgIGludCByYzsKKyAgdWludDhfdCogcDsKKyAgdWludDhfdCogbnlwOworICBpZihwYWNrX2NvbnRleHQtPnJldHVybl9jb2RlKQorICAgIHJldHVybjsKKworICB0bXAgPSAqKCh1aW50NjRfdCopJmQpOworICB0cnlNb3ZlOCgweGNiLHRtcCk7CiB9CiAKIAotdm9pZCBjd19wYWNrX3JlYWwgKGN3X3BhY2tfY29udGV4dCogcGFja19jb250ZXh0LCBkb3VibGUgZCkKK3ZvaWQgY3dfcGFja19yZWFsKGN3X3BhY2tfY29udGV4dCogcGFja19jb250ZXh0LCBkb3VibGUgZCkKIHsKLSAgICBmbG9hdCBmID0gKGZsb2F0KWQ7Ci0gICAgZG91YmxlIGRmID0gZjsKLSAgICBpZiAoZGYgPT0gZCkKLSAgICAgICAgY3dfcGFja19mbG9hdCAocGFja19jb250ZXh0LCBmKTsKLSAgICBlbHNlCi0gICAgICAgIGN3X3BhY2tfZG91YmxlIChwYWNrX2NvbnRleHQsIGQpOworICBmbG9hdCBmID0gKGZsb2F0KWQ7CisgIGRvdWJsZSBkZiA9IGY7CisgIGlmKGRmID09IGQpCisgICAgY3dfcGFja19mbG9hdChwYWNrX2NvbnRleHQsIGYpOworICBlbHNlCisgICAgY3dfcGFja19kb3VibGUocGFja19jb250ZXh0LCBkKTsKIH0KIAogCiB2b2lkIGN3X3BhY2tfbmlsKGN3X3BhY2tfY29udGV4dCogcGFja19jb250ZXh0KQogewotICAgIGlmIChwYWNrX2NvbnRleHQtPnJldHVybl9jb2RlKQotICAgICAgICByZXR1cm47Ci0gICAgCi0gICAgdHJ5TW92ZTAoMHhjMCk7CisgIGludCByYzsKKyAgdWludDhfdCogcDsKKyAgdWludDhfdCogbnlwOworICBpZihwYWNrX2NvbnRleHQtPnJldHVybl9jb2RlKQorICAgIHJldHVybjsKKworICB0cnlNb3ZlMCgweGMwKTsKIH0KIAogCi12b2lkIGN3X3BhY2tfdHJ1ZSAoY3dfcGFja19jb250ZXh0KiBwYWNrX2NvbnRleHQpCit2b2lkIGN3X3BhY2tfdHJ1ZShjd19wYWNrX2NvbnRleHQqIHBhY2tfY29udGV4dCkKIHsKLSAgICBpZiAocGFja19jb250ZXh0LT5yZXR1cm5fY29kZSkKLSAgICAgICAgcmV0dXJuOwotICAgIAotICAgIHRyeU1vdmUwKDB4YzMpOworICBpbnQgcmM7CisgIHVpbnQ4X3QqIHA7CisgIHVpbnQ4X3QqIG55cDsKKyAgaWYocGFja19jb250ZXh0LT5yZXR1cm5fY29kZSkKKyAgICByZXR1cm47CisKKyAgdHJ5TW92ZTAoMHhjMyk7CiB9CiAKIAotdm9pZCBjd19wYWNrX2ZhbHNlIChjd19wYWNrX2NvbnRleHQqIHBhY2tfY29udGV4dCkKK3ZvaWQgY3dfcGFja19mYWxzZShjd19wYWNrX2NvbnRleHQqIHBhY2tfY29udGV4dCkKIHsKLSAgICBpZiAocGFja19jb250ZXh0LT5yZXR1cm5fY29kZSkKLSAgICAgICAgcmV0dXJuOwotICAgIAotICAgIHRyeU1vdmUwKDB4YzIpOworICBpbnQgcmM7CisgIHVpbnQ4X3QqIHA7CisgIHVpbnQ4X3QqIG55cDsKKyAgaWYocGFja19jb250ZXh0LT5yZXR1cm5fY29kZSkKKyAgICByZXR1cm47CisKKyAgdHJ5TW92ZTAoMHhjMik7CiB9CiAKIAogdm9pZCBjd19wYWNrX2Jvb2xlYW4oY3dfcGFja19jb250ZXh0KiBwYWNrX2NvbnRleHQsIGJvb2wgYikKIHsKLSAgICBpZiAocGFja19jb250ZXh0LT5yZXR1cm5fY29kZSkKLSAgICAgICAgcmV0dXJuOwotICAgIAotICAgIHRyeU1vdmUwKGI/IDB4YzM6IDB4YzIpOworICBpbnQgcmM7CisgIHVpbnQ4X3QqIHA7CisgIHVpbnQ4X3QqIG55cDsKKyAgaWYocGFja19jb250ZXh0LT5yZXR1cm5fY29kZSkKKyAgICByZXR1cm47CisgIHRyeU1vdmUwKGI/IDB4YzM6IDB4YzIpOwogfQogCiAKIHZvaWQgY3dfcGFja19hcnJheV9zaXplKGN3X3BhY2tfY29udGV4dCogcGFja19jb250ZXh0LCB1aW50MzJfdCBuKQogewotICAgIGlmIChwYWNrX2NvbnRleHQtPnJldHVybl9jb2RlKQotICAgICAgICByZXR1cm47Ci0gICAgCi0gICAgaWYgKG4gPCAxNikKLSAgICAgICAgdHJ5TW92ZTAoMHg5MCB8IG4pOworICBpbnQgcmM7CisgIHVpbnQ4X3QqIHA7CisgIHVpbnQ4X3QqIG55cDsKKyAgaWYocGFja19jb250ZXh0LT5yZXR1cm5fY29kZSkKKyAgICByZXR1cm47CiAKLSAgICBpZiAobiA8IDY1NTM2KQotICAgICAgICB0cnlNb3ZlMigweGRjLCBuKTsKKyAgaWYobiA8IDE2KQorICAgIHRyeU1vdmUwKDB4OTAgfCBuKTsKIAotICAgIHRyeU1vdmU0KDB4ZGQsIG4pOworICBpZihuIDwgNjU1MzYpCisgICAgdHJ5TW92ZTIoMHhkYywgbik7CisKKyAgdHJ5TW92ZTQoMHhkZCwgbik7CiB9CiAKIAogdm9pZCBjd19wYWNrX21hcF9zaXplKGN3X3BhY2tfY29udGV4dCogcGFja19jb250ZXh0LCB1aW50MzJfdCBuKQogewotICAgIGlmIChwYWNrX2NvbnRleHQtPnJldHVybl9jb2RlKQotICAgICAgICByZXR1cm47Ci0gICAgCi0gICAgaWYgKG4gPCAxNikKLSAgICAgICAgdHJ5TW92ZTAoMHg4MCB8IG4pOworICBpbnQgcmM7CisgIHVpbnQ4X3QqIHA7CisgIHVpbnQ4X3QqIG55cDsKIAotICAgIGlmIChuIDwgNjU1MzYpCi0gICAgICAgIHRyeU1vdmUyKDB4ZGUsIG4pOworICBpZihwYWNrX2NvbnRleHQtPnJldHVybl9jb2RlKQorICAgIHJldHVybjsKIAotICAgIHRyeU1vdmU0KDB4ZGYsIG4pOworICBpZihuIDwgMTYpCisgICAgdHJ5TW92ZTAoMHg4MCB8IG4pOworCisgIGlmKG4gPCA2NTUzNikKKyAgICB0cnlNb3ZlMigweGRlLCBuKTsKKworICB0cnlNb3ZlNCgweGRmLCBuKTsKIH0KIAogCiB2b2lkIGN3X3BhY2tfc3RyKGN3X3BhY2tfY29udGV4dCogcGFja19jb250ZXh0LCBjb25zdCBjaGFyKiB2LCB1aW50MzJfdCBsKQogewotICAgIGlmIChwYWNrX2NvbnRleHQtPnJldHVybl9jb2RlKQotICAgICAgICByZXR1cm47Ci0gICAgCi0gICAgdWludDhfdCAqcDsKLSAgICAKLSAgICBpZiAobCA8IDMyKSAgICAgICAgICAgICAvLyBGaXhzdHIKLSAgICB7Ci0gICAgICAgIGN3X3BhY2tfcmVzZXJ2ZV9zcGFjZShsKzEpOwotICAgICAgICAqcCA9ICh1aW50OF90KSgweGEwICsgbCk7Ci0gICAgICAgIG1lbWNweShwKzEsdixsKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAobCA8IDI1NiAmJiAhcGFja19jb250ZXh0LT5iZV9jb21wYXRpYmxlKSAgICAgICAvLyBTdHIgOAotICAgIHsKLSAgICAgICAgY3dfcGFja19yZXNlcnZlX3NwYWNlKGwrMik7Ci0gICAgICAgICpwKysgPSAodWludDhfdCkoMHhkOSk7Ci0gICAgICAgICpwID0gKHVpbnQ4X3QpKGwpOwotICAgICAgICBtZW1jcHkocCsxLHYsbCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKGwgPCA2NTUzNikgICAgIC8vIFN0ciAxNgotICAgIHsKLSAgICAgICAgY3dfcGFja19yZXNlcnZlX3NwYWNlKGwrMykKLSAgICAgICAgKnArKyA9ICh1aW50OF90KTB4ZGE7Ci0gICAgICAgIGN3X3N0b3JlMTYobCk7Ci0gICAgICAgIG1lbWNweShwKzIsdixsKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAvLyBTdHIgMzIKLSAgICBjd19wYWNrX3Jlc2VydmVfc3BhY2UobCs1KQotICAgICpwKysgPSAodWludDhfdCkweGRiOwotICAgIGN3X3N0b3JlMzIobCk7Ci0gICAgbWVtY3B5KHArNCx2LGwpOworICBpbnQgcmM7CisgIHVpbnQ4X3QqIHA7CisgIHVpbnQ4X3QqIG55cDsKKyAgaWYocGFja19jb250ZXh0LT5yZXR1cm5fY29kZSkKICAgICByZXR1cm47CisKKyAgaWYobCA8IDMyKSAgICAgICAgICAgICAgLy8gRml4c3RyCisgIHsKKyAgICBjd19wYWNrX3Jlc2VydmVfc3BhY2UobCsxKTsKKyAgICAqcCA9ICh1aW50OF90KSgweGEwICsgbCk7CisgICAgbWVtY3B5KHArMSx2LGwpOworICAgIHJldHVybjsKKyAgfQorICBpZihsIDwgMjU2ICYmICFwYWNrX2NvbnRleHQtPmJlX2NvbXBhdGlibGUpICAgICAgICAvLyBTdHIgOAorICB7CisgICAgY3dfcGFja19yZXNlcnZlX3NwYWNlKGwrMik7CisgICAgKnArKyA9ICh1aW50OF90KSgweGQ5KTsKKyAgICAqcCA9ICh1aW50OF90KShsKTsKKyAgICBtZW1jcHkocCsxLHYsbCk7CisgICAgcmV0dXJuOworICB9CisgIGlmKGwgPCA2NTUzNikgICAgICAvLyBTdHIgMTYKKyAgeworICAgIGN3X3BhY2tfcmVzZXJ2ZV9zcGFjZShsKzMpCisgICAgKnArKyA9ICh1aW50OF90KTB4ZGE7CisgICAgY3dfc3RvcmUxNihsKTsKKyAgICBtZW1jcHkocCsyLHYsbCk7CisgICAgcmV0dXJuOworICB9CisgIC8vIFN0ciAzMgorICBjd19wYWNrX3Jlc2VydmVfc3BhY2UobCs1KQorICAqcCsrID0gKHVpbnQ4X3QpMHhkYjsKKyAgY3dfc3RvcmUzMihsKTsKKyAgbWVtY3B5KHArNCx2LGwpOworICByZXR1cm47CiB9CiAKIAogdm9pZCBjd19wYWNrX2Jpbihjd19wYWNrX2NvbnRleHQqIHBhY2tfY29udGV4dCwgY29uc3Qgdm9pZCogdiwgdWludDMyX3QgbCkKIHsKLSAgICBpZiAocGFja19jb250ZXh0LT5yZXR1cm5fY29kZSkKLSAgICAgICAgcmV0dXJuOwotICAgIAotICAgIGlmIChwYWNrX2NvbnRleHQtPmJlX2NvbXBhdGlibGUpCi0gICAgewotICAgICAgICBjd19wYWNrX3N0ciggcGFja19jb250ZXh0LCB2LCBsKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAKLSAgICB1aW50OF90ICpwOwotICAgIAotICAgIGlmIChsIDwgMjU2KSAgICAgICAgICAgIC8vIEJpbiA4Ci0gICAgewotICAgICAgICBjd19wYWNrX3Jlc2VydmVfc3BhY2UobCsyKTsKLSAgICAgICAgKnArKyA9ICh1aW50OF90KSgweGM0KTsKLSAgICAgICAgKnAgPSAodWludDhfdCkobCk7Ci0gICAgICAgIG1lbWNweShwKzEsdixsKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAobCA8IDY1NTM2KSAgICAgLy8gQmluIDE2Ci0gICAgewotICAgICAgICBjd19wYWNrX3Jlc2VydmVfc3BhY2UobCszKQotICAgICAgICAqcCsrID0gKHVpbnQ4X3QpMHhjNTsKLSAgICAgICAgY3dfc3RvcmUxNihsKTsKLSAgICAgICAgbWVtY3B5KHArMix2LGwpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIC8vIEJpbiAzMgotICAgIGN3X3BhY2tfcmVzZXJ2ZV9zcGFjZShsKzUpCi0gICAgKnArKyA9ICh1aW50OF90KTB4YzY7Ci0gICAgY3dfc3RvcmUzMihsKTsKLSAgICBtZW1jcHkocCs0LHYsbCk7CisgIGludCByYzsKKyAgdWludDhfdCogcDsKKyAgdWludDhfdCogbnlwOworICBpZihwYWNrX2NvbnRleHQtPnJldHVybl9jb2RlKQogICAgIHJldHVybjsKKworICBpZihwYWNrX2NvbnRleHQtPmJlX2NvbXBhdGlibGUpCisgIHsKKyAgICBjd19wYWNrX3N0cihwYWNrX2NvbnRleHQsIHYsIGwpOworICAgIHJldHVybjsKKyAgfQorICBpZihsIDwgMjU2KSAgICAgICAgICAgICAvLyBCaW4gOAorICB7CisgICAgY3dfcGFja19yZXNlcnZlX3NwYWNlKGwrMik7CisgICAgKnArKyA9ICh1aW50OF90KSgweGM0KTsKKyAgICAqcCA9ICh1aW50OF90KShsKTsKKyAgICBtZW1jcHkocCsxLHYsbCk7CisgICAgcmV0dXJuOworICB9CisgIGlmKGwgPCA2NTUzNikgICAgICAvLyBCaW4gMTYKKyAgeworICAgIGN3X3BhY2tfcmVzZXJ2ZV9zcGFjZShsKzMpCisgICAgKnArKyA9ICh1aW50OF90KTB4YzU7CisgICAgY3dfc3RvcmUxNihsKTsKKyAgICBtZW1jcHkocCsyLHYsbCk7CisgICAgcmV0dXJuOworICB9CisgIC8vIEJpbiAzMgorICBjd19wYWNrX3Jlc2VydmVfc3BhY2UobCs1KQorICAqcCsrID0gKHVpbnQ4X3QpMHhjNjsKKyAgY3dfc3RvcmUzMihsKTsKKyAgbWVtY3B5KHArNCx2LGwpOworICByZXR1cm47CiB9CiAKIAotdm9pZCBjd19wYWNrX2V4dCAoY3dfcGFja19jb250ZXh0KiBwYWNrX2NvbnRleHQsIGludDhfdCB0eXBlLCBjb25zdCB2b2lkKiB2LCB1aW50MzJfdCBsKQordm9pZCBjd19wYWNrX2V4dChjd19wYWNrX2NvbnRleHQqIHBhY2tfY29udGV4dCwgaW50OF90IHR5cGUsIGNvbnN0IHZvaWQqIHYsIHVpbnQzMl90IGwpCiB7Ci0gICAgaWYgKHBhY2tfY29udGV4dC0+cmV0dXJuX2NvZGUpCi0gICAgICAgIHJldHVybjsKLSAgICAKLSAgICBpZiAocGFja19jb250ZXh0LT5iZV9jb21wYXRpYmxlKQotICAgICAgICBQQUNLX0VSUk9SKENXUF9SQ19JTExFR0FMX0NBTEwpOwotICAgIAotICAgIHVpbnQ4X3QgKnA7Ci0gICAgCi0gICAgc3dpdGNoIChsKQotICAgIHsKLSAgICAgICAgY2FzZSAxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRml4ZXh0IDEKLSAgICAgICAgICAgIGN3X3BhY2tfcmVzZXJ2ZV9zcGFjZSgzKTsKLSAgICAgICAgICAgICpwKysgPSAodWludDhfdCkweGQ0OwotICAgICAgICAgICAgKnArKyA9ICh1aW50OF90KXR5cGU7Ci0gICAgICAgICAgICAqcCsrID0gKih1aW50OF90Kil2OwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBjYXNlIDI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGaXhleHQgMgotICAgICAgICAgICAgY3dfcGFja19yZXNlcnZlX3NwYWNlKDQpOwotICAgICAgICAgICAgKnArKyA9ICh1aW50OF90KTB4ZDU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRml4ZXh0IDQKLSAgICAgICAgICAgIGN3X3BhY2tfcmVzZXJ2ZV9zcGFjZSg2KTsKLSAgICAgICAgICAgICpwKysgPSAodWludDhfdCkweGQ2OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgODogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpeGV4dCA4Ci0gICAgICAgICAgICBjd19wYWNrX3Jlc2VydmVfc3BhY2UoMTApOwotICAgICAgICAgICAgKnArKyA9ICh1aW50OF90KTB4ZDc7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxNjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRml4ZXh0MTYKLSAgICAgICAgICAgIGN3X3BhY2tfcmVzZXJ2ZV9zcGFjZSgxOCk7Ci0gICAgICAgICAgICAqcCsrID0gKHVpbnQ4X3QpMHhkODsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgaWYgKGwgPCAyNTYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFeHQgOAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGN3X3BhY2tfcmVzZXJ2ZV9zcGFjZShsKzMpOwotICAgICAgICAgICAgICAgICpwKysgPSAodWludDhfdCkweGM3OwotICAgICAgICAgICAgICAgICpwKysgPSAodWludDhfdCkobCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChsIDwgNjU1MzYpICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEV4dCAxNgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGN3X3BhY2tfcmVzZXJ2ZV9zcGFjZShsKzQpCi0gICAgICAgICAgICAgICAgKnArKyA9ICh1aW50OF90KTB4Yzg7Ci0gICAgICAgICAgICAgICAgY3dfc3RvcmUxNihsKTsKLSAgICAgICAgICAgICAgICBwICs9IDI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEV4dCAzMgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGN3X3BhY2tfcmVzZXJ2ZV9zcGFjZShsKzYpCi0gICAgICAgICAgICAgICAgKnArKyA9ICh1aW50OF90KTB4Yzk7Ci0gICAgICAgICAgICAgICAgY3dfc3RvcmUzMihsKTsKLSAgICAgICAgICAgICAgICBwICs9IDQ7Ci0gICAgICAgICAgICB9Ci0gICAgfQorICBpbnQgcmM7CisgIHVpbnQ4X3QqIHA7CisgIHVpbnQ4X3QqIG55cDsKKyAgaWYocGFja19jb250ZXh0LT5yZXR1cm5fY29kZSkKKyAgICByZXR1cm47CisKKyAgaWYocGFja19jb250ZXh0LT5iZV9jb21wYXRpYmxlKQorICAgIFBBQ0tfRVJST1IoQ1dQX1JDX0lMTEVHQUxfQ0FMTCk7CisKKyAgc3dpdGNoKGwpCisgIHsKKyAgY2FzZSAxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRml4ZXh0IDEKKyAgICBjd19wYWNrX3Jlc2VydmVfc3BhY2UoMyk7CisgICAgKnArKyA9ICh1aW50OF90KTB4ZDQ7CiAgICAgKnArKyA9ICh1aW50OF90KXR5cGU7Ci0gICAgbWVtY3B5KHAsdixsKTsKKyAgICAqcCsrID0gKih1aW50OF90Kil2OworICAgIHJldHVybjsKKyAgY2FzZSAyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRml4ZXh0IDIKKyAgICBjd19wYWNrX3Jlc2VydmVfc3BhY2UoNCk7CisgICAgKnArKyA9ICh1aW50OF90KTB4ZDU7CisgICAgYnJlYWs7CisgIGNhc2UgNDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpeGV4dCA0CisgICAgY3dfcGFja19yZXNlcnZlX3NwYWNlKDYpOworICAgICpwKysgPSAodWludDhfdCkweGQ2OworICAgIGJyZWFrOworICBjYXNlIDg6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGaXhleHQgOAorICAgIGN3X3BhY2tfcmVzZXJ2ZV9zcGFjZSgxMCk7CisgICAgKnArKyA9ICh1aW50OF90KTB4ZDc7CisgICAgYnJlYWs7CisgIGNhc2UgMTY6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpeGV4dDE2CisgICAgY3dfcGFja19yZXNlcnZlX3NwYWNlKDE4KTsKKyAgICAqcCsrID0gKHVpbnQ4X3QpMHhkODsKKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBpZihsIDwgMjU2KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEV4dCA4CisgICAgeworICAgICAgY3dfcGFja19yZXNlcnZlX3NwYWNlKGwrMyk7CisgICAgICAqcCsrID0gKHVpbnQ4X3QpMHhjNzsKKyAgICAgICpwKysgPSAodWludDhfdCkobCk7CisgICAgfQorICAgIGVsc2UgaWYobCA8IDY1NTM2KSAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRXh0IDE2CisgICAgeworICAgICAgY3dfcGFja19yZXNlcnZlX3NwYWNlKGwrNCkKKyAgICAgICpwKysgPSAodWludDhfdCkweGM4OworICAgICAgY3dfc3RvcmUxNihsKTsKKyAgICAgIHAgKz0gMjsKKyAgICB9CisgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFeHQgMzIKKyAgICB7CisgICAgICBjd19wYWNrX3Jlc2VydmVfc3BhY2UobCs2KQorICAgICAgKnArKyA9ICh1aW50OF90KTB4Yzk7CisgICAgICBjd19zdG9yZTMyKGwpOworICAgICAgcCArPSA0OworICAgIH0KKyAgfQorICAqcCsrID0gKHVpbnQ4X3QpdHlwZTsKKyAgbWVtY3B5KHAsdixsKTsKIH0KIAogCi12b2lkIGN3X3BhY2tfaW5zZXJ0IChjd19wYWNrX2NvbnRleHQqIHBhY2tfY29udGV4dCwgY29uc3Qgdm9pZCogdiwgdWludDMyX3QgbCkKK3ZvaWQgY3dfcGFja19pbnNlcnQoY3dfcGFja19jb250ZXh0KiBwYWNrX2NvbnRleHQsIGNvbnN0IHZvaWQqIHYsIHVpbnQzMl90IGwpCiB7Ci0gICAgdWludDhfdCAqcDsKLSAgICBjd19wYWNrX3Jlc2VydmVfc3BhY2UobCk7Ci0gICAgbWVtY3B5KHAsdixsKTsKKyAgaW50IHJjOworICB1aW50OF90KiBwOworICB1aW50OF90KiBueXA7CisgIGN3X3BhY2tfcmVzZXJ2ZV9zcGFjZShsKTsKKyAgbWVtY3B5KHAsdixsKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICBVIE4gUCBBIEMgSyAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIAotaW50IGN3X3VucGFja19jb250ZXh0X2luaXQgKGN3X3VucGFja19jb250ZXh0KiB1bnBhY2tfY29udGV4dCwgdm9pZCogZGF0YSwgdW5zaWduZWQgbG9uZyBsZW5ndGgsIHVucGFja191bmRlcmZsb3dfaGFuZGxlciBodXUpCitpbnQgY3dfdW5wYWNrX2NvbnRleHRfaW5pdChjd191bnBhY2tfY29udGV4dCogdW5wYWNrX2NvbnRleHQsIHZvaWQqIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGxlbmd0aCwgdW5wYWNrX3VuZGVyZmxvd19oYW5kbGVyIGh1dSkKIHsKLSAgICB1bnBhY2tfY29udGV4dC0+c3RhcnQgPSB1bnBhY2tfY29udGV4dC0+Y3VycmVudCA9ICh1aW50OF90KilkYXRhOwotICAgIHVucGFja19jb250ZXh0LT5lbmQgPSB1bnBhY2tfY29udGV4dC0+c3RhcnQgKyBsZW5ndGg7Ci0gICAgdW5wYWNrX2NvbnRleHQtPnJldHVybl9jb2RlID0gdGVzdF9ieXRlX29yZGVyKCk7Ci0gICAgdW5wYWNrX2NvbnRleHQtPmVycl9ubyA9IDA7Ci0gICAgdW5wYWNrX2NvbnRleHQtPmhhbmRsZV91bnBhY2tfdW5kZXJmbG93ID0gaHV1OwotICAgIHJldHVybiB1bnBhY2tfY29udGV4dC0+cmV0dXJuX2NvZGU7CisgIHVucGFja19jb250ZXh0LT5zdGFydCA9IHVucGFja19jb250ZXh0LT5jdXJyZW50ID0gKHVpbnQ4X3QqKWRhdGE7CisgIHVucGFja19jb250ZXh0LT5lbmQgPSB1bnBhY2tfY29udGV4dC0+c3RhcnQgKyBsZW5ndGg7CisgIHVucGFja19jb250ZXh0LT5yZXR1cm5fY29kZSA9IHRlc3RfYnl0ZV9vcmRlcigpOworICB1bnBhY2tfY29udGV4dC0+ZXJyX25vID0gMDsKKyAgdW5wYWNrX2NvbnRleHQtPmhhbmRsZV91bnBhY2tfdW5kZXJmbG93ID0gaHV1OworICByZXR1cm4gdW5wYWNrX2NvbnRleHQtPnJldHVybl9jb2RlOwogfQogCiAKQEAgLTQwOSwyNjQgKzQ0OSwyNzQgQEAKIAogCiAKLXZvaWQgY3dfdW5wYWNrX25leHQgKGN3X3VucGFja19jb250ZXh0KiB1bnBhY2tfY29udGV4dCkKK3ZvaWQgY3dfdW5wYWNrX25leHQoY3dfdW5wYWNrX2NvbnRleHQqIHVucGFja19jb250ZXh0KQogewotICAgIGlmICh1bnBhY2tfY29udGV4dC0+cmV0dXJuX2NvZGUpCi0gICAgICAgIHJldHVybjsKKyAgdWludDY0X3QgICAgdG1wdTY0OworICB1aW50MzJfdCAgICB0bXB1MzI7CisgIHVpbnQxNl90ICAgIHRtcHUxNjsKKyAgdWludDhfdCogICAgcDsKKyAgdWludDhfdCBjOworICB1aW50OF90KiBueXA7CisgIGludCByYzsKIAotICAgIHVpbnQ2NF90ICAgIHRtcHU2NDsKLSAgICB1aW50MzJfdCAgICB0bXB1MzI7Ci0gICAgdWludDE2X3QgICAgdG1wdTE2OwotICAgIHVpbnQ4X3QqICAgIHA7Ci0gICAgCisgIGlmKHVucGFja19jb250ZXh0LT5yZXR1cm5fY29kZSkKKyAgICByZXR1cm47CisKICNkZWZpbmUgYnVmZmVyX2VuZF9yZXR1cm5fY29kZSAgQ1dQX1JDX0VORF9PRl9JTlBVVDsKLSAgICBjd191bnBhY2tfYXNzZXJ0X3NwYWNlKDEpOwotICAgIHVpbnQ4X3QgYyA9ICpwOworICBjd191bnBhY2tfYXNzZXJ0X3NwYWNlKDEpOworICBjID0gKnA7CiAjdW5kZWYgYnVmZmVyX2VuZF9yZXR1cm5fY29kZQogI2RlZmluZSBidWZmZXJfZW5kX3JldHVybl9jb2RlICBDV1BfUkNfQlVGRkVSX1VOREVSRkxPVzsKLSAgICBzd2l0Y2ggKGMpCi0gICAgewotICAgICAgICBjYXNlIDB4MDA6IGNhc2UgMHgwMTogY2FzZSAweDAyOiBjYXNlIDB4MDM6IGNhc2UgMHgwNDogY2FzZSAweDA1OiBjYXNlIDB4MDY6IGNhc2UgMHgwNzoKLSAgICAgICAgY2FzZSAweDA4OiBjYXNlIDB4MDk6IGNhc2UgMHgwYTogY2FzZSAweDBiOiBjYXNlIDB4MGM6IGNhc2UgMHgwZDogY2FzZSAweDBlOiBjYXNlIDB4MGY6Ci0gICAgICAgIGNhc2UgMHgxMDogY2FzZSAweDExOiBjYXNlIDB4MTI6IGNhc2UgMHgxMzogY2FzZSAweDE0OiBjYXNlIDB4MTU6IGNhc2UgMHgxNjogY2FzZSAweDE3OgotICAgICAgICBjYXNlIDB4MTg6IGNhc2UgMHgxOTogY2FzZSAweDFhOiBjYXNlIDB4MWI6IGNhc2UgMHgxYzogY2FzZSAweDFkOiBjYXNlIDB4MWU6IGNhc2UgMHgxZjoKLSAgICAgICAgY2FzZSAweDIwOiBjYXNlIDB4MjE6IGNhc2UgMHgyMjogY2FzZSAweDIzOiBjYXNlIDB4MjQ6IGNhc2UgMHgyNTogY2FzZSAweDI2OiBjYXNlIDB4Mjc6Ci0gICAgICAgIGNhc2UgMHgyODogY2FzZSAweDI5OiBjYXNlIDB4MmE6IGNhc2UgMHgyYjogY2FzZSAweDJjOiBjYXNlIDB4MmQ6IGNhc2UgMHgyZTogY2FzZSAweDJmOgotICAgICAgICBjYXNlIDB4MzA6IGNhc2UgMHgzMTogY2FzZSAweDMyOiBjYXNlIDB4MzM6IGNhc2UgMHgzNDogY2FzZSAweDM1OiBjYXNlIDB4MzY6IGNhc2UgMHgzNzoKLSAgICAgICAgY2FzZSAweDM4OiBjYXNlIDB4Mzk6IGNhc2UgMHgzYTogY2FzZSAweDNiOiBjYXNlIDB4M2M6IGNhc2UgMHgzZDogY2FzZSAweDNlOiBjYXNlIDB4M2Y6Ci0gICAgICAgIGNhc2UgMHg0MDogY2FzZSAweDQxOiBjYXNlIDB4NDI6IGNhc2UgMHg0MzogY2FzZSAweDQ0OiBjYXNlIDB4NDU6IGNhc2UgMHg0NjogY2FzZSAweDQ3OgotICAgICAgICBjYXNlIDB4NDg6IGNhc2UgMHg0OTogY2FzZSAweDRhOiBjYXNlIDB4NGI6IGNhc2UgMHg0YzogY2FzZSAweDRkOiBjYXNlIDB4NGU6IGNhc2UgMHg0ZjoKLSAgICAgICAgY2FzZSAweDUwOiBjYXNlIDB4NTE6IGNhc2UgMHg1MjogY2FzZSAweDUzOiBjYXNlIDB4NTQ6IGNhc2UgMHg1NTogY2FzZSAweDU2OiBjYXNlIDB4NTc6Ci0gICAgICAgIGNhc2UgMHg1ODogY2FzZSAweDU5OiBjYXNlIDB4NWE6IGNhc2UgMHg1YjogY2FzZSAweDVjOiBjYXNlIDB4NWQ6IGNhc2UgMHg1ZTogY2FzZSAweDVmOgotICAgICAgICBjYXNlIDB4NjA6IGNhc2UgMHg2MTogY2FzZSAweDYyOiBjYXNlIDB4NjM6IGNhc2UgMHg2NDogY2FzZSAweDY1OiBjYXNlIDB4NjY6IGNhc2UgMHg2NzoKLSAgICAgICAgY2FzZSAweDY4OiBjYXNlIDB4Njk6IGNhc2UgMHg2YTogY2FzZSAweDZiOiBjYXNlIDB4NmM6IGNhc2UgMHg2ZDogY2FzZSAweDZlOiBjYXNlIDB4NmY6Ci0gICAgICAgIGNhc2UgMHg3MDogY2FzZSAweDcxOiBjYXNlIDB4NzI6IGNhc2UgMHg3MzogY2FzZSAweDc0OiBjYXNlIDB4NzU6IGNhc2UgMHg3NjogY2FzZSAweDc3OgotICAgICAgICBjYXNlIDB4Nzg6IGNhc2UgMHg3OTogY2FzZSAweDdhOiBjYXNlIDB4N2I6IGNhc2UgMHg3YzogY2FzZSAweDdkOiBjYXNlIDB4N2U6IGNhc2UgMHg3ZjoKLSAgICAgICAgICAgICAgICAgICAgZ2V0RERJdGVtKENXUF9JVEVNX1BPU0lUSVZFX0lOVEVHRVIsIGk2NCwgYyk7ICAgICAgIHJldHVybjsgIC8vIHBvc2l0aXZlIGZpeG51bQotICAgICAgICBjYXNlIDB4ODA6IGNhc2UgMHg4MTogY2FzZSAweDgyOiBjYXNlIDB4ODM6IGNhc2UgMHg4NDogY2FzZSAweDg1OiBjYXNlIDB4ODY6IGNhc2UgMHg4NzoKLSAgICAgICAgY2FzZSAweDg4OiBjYXNlIDB4ODk6IGNhc2UgMHg4YTogY2FzZSAweDhiOiBjYXNlIDB4OGM6IGNhc2UgMHg4ZDogY2FzZSAweDhlOiBjYXNlIDB4OGY6Ci0gICAgICAgICAgICAgICAgICAgIGdldERESXRlbShDV1BfSVRFTV9NQVAsIG1hcC5zaXplLCBjICYgMHgwZik7ICAgICAgICByZXR1cm47ICAvLyBmaXhtYXAKLSAgICAgICAgY2FzZSAweDkwOiBjYXNlIDB4OTE6IGNhc2UgMHg5MjogY2FzZSAweDkzOiBjYXNlIDB4OTQ6IGNhc2UgMHg5NTogY2FzZSAweDk2OiBjYXNlIDB4OTc6Ci0gICAgICAgIGNhc2UgMHg5ODogY2FzZSAweDk5OiBjYXNlIDB4OWE6IGNhc2UgMHg5YjogY2FzZSAweDljOiBjYXNlIDB4OWQ6IGNhc2UgMHg5ZTogY2FzZSAweDlmOgotICAgICAgICAgICAgICAgICAgICBnZXREREl0ZW0oQ1dQX0lURU1fQVJSQVksIGFycmF5LnNpemUsIGMgJiAweDBmKTsgICAgcmV0dXJuOyAgLy8gZml4YXJyYXkKLSAgICAgICAgY2FzZSAweGEwOiBjYXNlIDB4YTE6IGNhc2UgMHhhMjogY2FzZSAweGEzOiBjYXNlIDB4YTQ6IGNhc2UgMHhhNTogY2FzZSAweGE2OiBjYXNlIDB4YTc6Ci0gICAgICAgIGNhc2UgMHhhODogY2FzZSAweGE5OiBjYXNlIDB4YWE6IGNhc2UgMHhhYjogY2FzZSAweGFjOiBjYXNlIDB4YWQ6IGNhc2UgMHhhZTogY2FzZSAweGFmOgotICAgICAgICBjYXNlIDB4YjA6IGNhc2UgMHhiMTogY2FzZSAweGIyOiBjYXNlIDB4YjM6IGNhc2UgMHhiNDogY2FzZSAweGI1OiBjYXNlIDB4YjY6IGNhc2UgMHhiNzoKLSAgICAgICAgY2FzZSAweGI4OiBjYXNlIDB4Yjk6IGNhc2UgMHhiYTogY2FzZSAweGJiOiBjYXNlIDB4YmM6IGNhc2UgMHhiZDogY2FzZSAweGJlOiBjYXNlIDB4YmY6Ci0gICAgICAgICAgICAgICAgICAgIGdldERESXRlbShDV1BfSVRFTV9TVFIsIHN0ci5sZW5ndGgsIGMgJiAweDFmKTsgICAgICAgICAgICAgIC8vIGZpeHJhdwotICAgICAgICAgICAgICAgICAgICBjd191bnBhY2tfYXNzZXJ0X2Jsb2Ioc3RyKTsKLSAgICAgICAgY2FzZSAweGMwOiAgdW5wYWNrX2NvbnRleHQtPml0ZW0udHlwZSA9IENXUF9JVEVNX05JTDsgICAgICAgICAgIHJldHVybjsgIC8vIG5pbAotICAgICAgICBjYXNlIDB4YzI6ICBnZXREREl0ZW0oQ1dQX0lURU1fQk9PTEVBTiwgYm9vbGVhbiwgZmFsc2UpOyAgICAgICAgcmV0dXJuOyAgLy8gZmFsc2UKLSAgICAgICAgY2FzZSAweGMzOiAgZ2V0RERJdGVtKENXUF9JVEVNX0JPT0xFQU4sIGJvb2xlYW4sIHRydWUpOyAgICAgICAgIHJldHVybjsgIC8vIHRydWUKLSAgICAgICAgY2FzZSAweGM0OiAgZ2V0RERJdGVtMShDV1BfSVRFTV9CSU4sIGJpbi5sZW5ndGgsIHVpbnQ4X3QpOyAgICAgICAgICAgICAgLy8gYmluIDgKLSAgICAgICAgICAgICAgICAgICAgY3dfdW5wYWNrX2Fzc2VydF9ibG9iKGJpbik7Ci0gICAgICAgIGNhc2UgMHhjNTogIGdldERESXRlbTIoQ1dQX0lURU1fQklOLCBiaW4ubGVuZ3RoLCB1aW50MTZfdCk7ICAgICAgICAgICAgIC8vIGJpbiAxNgotICAgICAgICAgICAgICAgICAgICBjd191bnBhY2tfYXNzZXJ0X2Jsb2IoYmluKTsKLSAgICAgICAgY2FzZSAweGM2OiAgZ2V0RERJdGVtNChDV1BfSVRFTV9CSU4sIGJpbi5sZW5ndGgsIHVpbnQzMl90KTsgICAgICAgICAgICAgLy8gYmluIDMyCi0gICAgICAgICAgICAgICAgICAgIGN3X3VucGFja19hc3NlcnRfYmxvYihiaW4pOwotICAgICAgICBjYXNlIDB4Yzc6ICBnZXREREl0ZW0xKENXUF9JVEVNX0VYVCwgZXh0Lmxlbmd0aCwgdWludDhfdCk7ICAgICAgICAgICAgICAvLyBleHQgOAotICAgICAgICAgICAgICAgICAgICBjd191bnBhY2tfYXNzZXJ0X3NwYWNlKDEpOwotICAgICAgICAgICAgICAgICAgICB1bnBhY2tfY29udGV4dC0+aXRlbS50eXBlID0gKihpbnQ4X3QqKXA7Ci0gICAgICAgICAgICAgICAgICAgIGN3X3VucGFja19hc3NlcnRfYmxvYihleHQpOwotICAgICAgICBjYXNlIDB4Yzg6ICBnZXREREl0ZW0yKENXUF9JVEVNX0VYVCwgZXh0Lmxlbmd0aCwgdWludDE2X3QpOyAgICAgICAgICAgICAvLyBleHQgMTYKLSAgICAgICAgICAgICAgICAgICAgY3dfdW5wYWNrX2Fzc2VydF9zcGFjZSgxKTsKLSAgICAgICAgICAgICAgICAgICAgdW5wYWNrX2NvbnRleHQtPml0ZW0udHlwZSA9ICooaW50OF90KilwOwotICAgICAgICAgICAgICAgICAgICBjd191bnBhY2tfYXNzZXJ0X2Jsb2IoZXh0KTsKLSAgICAgICAgY2FzZSAweGM5OiAgZ2V0RERJdGVtNChDV1BfSVRFTV9FWFQsIGV4dC5sZW5ndGgsIHVpbnQzMl90KTsgICAgICAgICAgICAgLy8gZXh0IDMyCi0gICAgICAgICAgICAgICAgICAgIGN3X3VucGFja19hc3NlcnRfc3BhY2UoMSk7Ci0gICAgICAgICAgICAgICAgICAgIHVucGFja19jb250ZXh0LT5pdGVtLnR5cGUgPSAqKGludDhfdCopcDsKLSAgICAgICAgICAgICAgICAgICAgY3dfdW5wYWNrX2Fzc2VydF9ibG9iKGV4dCk7Ci0gICAgICAgIGNhc2UgMHhjYTogIHVucGFja19jb250ZXh0LT5pdGVtLnR5cGUgPSBDV1BfSVRFTV9GTE9BVDsgICAgICAgICAgICAgICAgIC8vIGZsb2F0Ci0gICAgICAgICAgICAgICAgICAgIGN3X3VucGFja19hc3NlcnRfc3BhY2UoNCk7Ci0gICAgICAgICAgICAgICAgICAgIGN3X2xvYWQzMihwKTsKLSAgICAgICAgICAgICAgICAgICAgdW5wYWNrX2NvbnRleHQtPml0ZW0uYXMucmVhbCA9ICooZmxvYXQqKSZ0bXB1MzI7ICAgICByZXR1cm47Ci0gICAgICAgIGNhc2UgMHhjYjogIGdldERESXRlbTgoQ1dQX0lURU1fRE9VQkxFKTsgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOyAgLy8gZG91YmxlCi0gICAgICAgIGNhc2UgMHhjYzogIGdldERESXRlbTEoQ1dQX0lURU1fUE9TSVRJVkVfSU5URUdFUiwgdTY0LCB1aW50OF90KTsgcmV0dXJuOyAgLy8gdW5zaWduZWQgaW50ICA4Ci0gICAgICAgIGNhc2UgMHhjZDogIGdldERESXRlbTIoQ1dQX0lURU1fUE9TSVRJVkVfSU5URUdFUiwgdTY0LCB1aW50MTZfdCk7IHJldHVybjsgLy8gdW5zaWduZWQgaW50IDE2Ci0gICAgICAgIGNhc2UgMHhjZTogIGdldERESXRlbTQoQ1dQX0lURU1fUE9TSVRJVkVfSU5URUdFUiwgdTY0LCB1aW50MzJfdCk7IHJldHVybjsgLy8gdW5zaWduZWQgaW50IDMyCi0gICAgICAgIGNhc2UgMHhjZjogIGdldERESXRlbTgoQ1dQX0lURU1fUE9TSVRJVkVfSU5URUdFUik7ICAgICAgICAgICAgICAgcmV0dXJuOyAgLy8gdW5zaWduZWQgaW50IDY0Ci0gICAgICAgIGNhc2UgMHhkMDogIGdldERESXRlbTEoQ1dQX0lURU1fTkVHQVRJVkVfSU5URUdFUiwgaTY0LCBpbnQ4X3QpOyAgICAgICAgICAvLyBzaWduZWQgaW50ICA4Ci0gICAgICAgICAgICAgICAgICAgIGlmICh1bnBhY2tfY29udGV4dC0+aXRlbS5hcy5pNjQgPj0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHVucGFja19jb250ZXh0LT5pdGVtLnR5cGUgPSBDV1BfSVRFTV9QT1NJVElWRV9JTlRFR0VSOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGNhc2UgMHhkMTogIGdldERESXRlbTIoQ1dQX0lURU1fTkVHQVRJVkVfSU5URUdFUiwgaTY0LCBpbnQxNl90KTsgICAgICAgIC8vIHNpZ25lZCBpbnQgMTYKLSAgICAgICAgICAgICAgICAgICAgaWYgKHVucGFja19jb250ZXh0LT5pdGVtLmFzLmk2NCA+PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgdW5wYWNrX2NvbnRleHQtPml0ZW0udHlwZSA9IENXUF9JVEVNX1BPU0lUSVZFX0lOVEVHRVI7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgY2FzZSAweGQyOiAgZ2V0RERJdGVtNChDV1BfSVRFTV9ORUdBVElWRV9JTlRFR0VSLCBpNjQsIGludDMyX3QpOyAgICAgICAgLy8gc2lnbmVkIGludCAzMgotICAgICAgICAgICAgICAgICAgICBpZiAodW5wYWNrX2NvbnRleHQtPml0ZW0uYXMuaTY0ID49IDApCi0gICAgICAgICAgICAgICAgICAgICAgICB1bnBhY2tfY29udGV4dC0+aXRlbS50eXBlID0gQ1dQX0lURU1fUE9TSVRJVkVfSU5URUdFUjsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBjYXNlIDB4ZDM6ICBnZXREREl0ZW04KENXUF9JVEVNX05FR0FUSVZFX0lOVEVHRVIpOwkJCQkJCS8vIHNpZ25lZCBpbnQgNjQKLSAgICAgICAgICAgICAgICAgICAgaWYgKHVucGFja19jb250ZXh0LT5pdGVtLmFzLmk2NCA+PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgdW5wYWNrX2NvbnRleHQtPml0ZW0udHlwZSA9IENXUF9JVEVNX1BPU0lUSVZFX0lOVEVHRVI7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgY2FzZSAweGQ0OiAgZ2V0RERJdGVtRml4KDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZml4ZXh0IDEKLSAgICAgICAgY2FzZSAweGQ1OiAgZ2V0RERJdGVtRml4KDIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZml4ZXh0IDIKLSAgICAgICAgY2FzZSAweGQ2OiAgZ2V0RERJdGVtRml4KDQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZml4ZXh0IDQKLSAgICAgICAgY2FzZSAweGQ3OiAgZ2V0RERJdGVtRml4KDgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZml4ZXh0IDgKLSAgICAgICAgY2FzZSAweGQ4OiAgZ2V0RERJdGVtRml4KDE2KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZml4ZXh0IDE2Ci0gICAgICAgIGNhc2UgMHhkOTogIGdldERESXRlbTEoQ1dQX0lURU1fU1RSLCBzdHIubGVuZ3RoLCB1aW50OF90KTsgICAgICAgICAgICAgIC8vIHN0ciA4Ci0gICAgICAgICAgICAgICAgICAgIGN3X3VucGFja19hc3NlcnRfYmxvYihzdHIpOwotICAgICAgICBjYXNlIDB4ZGE6ICBnZXREREl0ZW0yKENXUF9JVEVNX1NUUiwgc3RyLmxlbmd0aCwgdWludDE2X3QpOyAgICAgICAgICAgICAvLyBzdHIgMTYKLSAgICAgICAgICAgICAgICAgICAgY3dfdW5wYWNrX2Fzc2VydF9ibG9iKHN0cik7Ci0gICAgICAgIGNhc2UgMHhkYjogIGdldERESXRlbTQoQ1dQX0lURU1fU1RSLCBzdHIubGVuZ3RoLCB1aW50MzJfdCk7ICAgICAgICAgICAgIC8vIHN0ciAzMgotICAgICAgICAgICAgICAgICAgICBjd191bnBhY2tfYXNzZXJ0X2Jsb2Ioc3RyKTsKLSAgICAgICAgY2FzZSAweGRjOiAgZ2V0RERJdGVtMihDV1BfSVRFTV9BUlJBWSwgYXJyYXkuc2l6ZSwgdWludDE2X3QpOyAgIHJldHVybjsgIC8vIGFycmF5IDE2Ci0gICAgICAgIGNhc2UgMHhkZDogIGdldERESXRlbTQoQ1dQX0lURU1fQVJSQVksIGFycmF5LnNpemUsIHVpbnQzMl90KTsgICByZXR1cm47ICAvLyBhcnJheSAzMgotICAgICAgICBjYXNlIDB4ZGU6ICBnZXREREl0ZW0yKENXUF9JVEVNX01BUCwgbWFwLnNpemUsIHVpbnQxNl90KTsgICAgICAgcmV0dXJuOyAgLy8gbWFwIDE2Ci0gICAgICAgIGNhc2UgMHhkZjogIGdldERESXRlbTQoQ1dQX0lURU1fTUFQLCBtYXAuc2l6ZSwgdWludDMyX3QpOyAgICAgICByZXR1cm47ICAvLyBtYXAgMzIKLSAgICAgICAgY2FzZSAweGUwOiBjYXNlIDB4ZTE6IGNhc2UgMHhlMjogY2FzZSAweGUzOiBjYXNlIDB4ZTQ6IGNhc2UgMHhlNTogY2FzZSAweGU2OiBjYXNlIDB4ZTc6Ci0gICAgICAgIGNhc2UgMHhlODogY2FzZSAweGU5OiBjYXNlIDB4ZWE6IGNhc2UgMHhlYjogY2FzZSAweGVjOiBjYXNlIDB4ZWQ6IGNhc2UgMHhlZTogY2FzZSAweGVmOgotICAgICAgICBjYXNlIDB4ZjA6IGNhc2UgMHhmMTogY2FzZSAweGYyOiBjYXNlIDB4ZjM6IGNhc2UgMHhmNDogY2FzZSAweGY1OiBjYXNlIDB4ZjY6IGNhc2UgMHhmNzoKLSAgICAgICAgY2FzZSAweGY4OiBjYXNlIDB4Zjk6IGNhc2UgMHhmYTogY2FzZSAweGZiOiBjYXNlIDB4ZmM6IGNhc2UgMHhmZDogY2FzZSAweGZlOiBjYXNlIDB4ZmY6Ci0gICAgICAgICAgICAgICAgICAgIGdldERESXRlbShDV1BfSVRFTV9ORUdBVElWRV9JTlRFR0VSLCBpNjQsIChpbnQ4X3QpYyk7IHJldHVybjsgICAgLy8gbmVnYXRpdmUgZml4bnVtCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIFVOUEFDS19FUlJPUihDV1BfUkNfTUFMRk9STUVEX0lOUFVUKQotICAgIH0KKyAgc3dpdGNoKGMpCisgIHsKKyAgY2FzZSAweDAwOiBjYXNlIDB4MDE6IGNhc2UgMHgwMjogY2FzZSAweDAzOiBjYXNlIDB4MDQ6IGNhc2UgMHgwNTogY2FzZSAweDA2OiBjYXNlIDB4MDc6CisgIGNhc2UgMHgwODogY2FzZSAweDA5OiBjYXNlIDB4MGE6IGNhc2UgMHgwYjogY2FzZSAweDBjOiBjYXNlIDB4MGQ6IGNhc2UgMHgwZTogY2FzZSAweDBmOgorICBjYXNlIDB4MTA6IGNhc2UgMHgxMTogY2FzZSAweDEyOiBjYXNlIDB4MTM6IGNhc2UgMHgxNDogY2FzZSAweDE1OiBjYXNlIDB4MTY6IGNhc2UgMHgxNzoKKyAgY2FzZSAweDE4OiBjYXNlIDB4MTk6IGNhc2UgMHgxYTogY2FzZSAweDFiOiBjYXNlIDB4MWM6IGNhc2UgMHgxZDogY2FzZSAweDFlOiBjYXNlIDB4MWY6CisgIGNhc2UgMHgyMDogY2FzZSAweDIxOiBjYXNlIDB4MjI6IGNhc2UgMHgyMzogY2FzZSAweDI0OiBjYXNlIDB4MjU6IGNhc2UgMHgyNjogY2FzZSAweDI3OgorICBjYXNlIDB4Mjg6IGNhc2UgMHgyOTogY2FzZSAweDJhOiBjYXNlIDB4MmI6IGNhc2UgMHgyYzogY2FzZSAweDJkOiBjYXNlIDB4MmU6IGNhc2UgMHgyZjoKKyAgY2FzZSAweDMwOiBjYXNlIDB4MzE6IGNhc2UgMHgzMjogY2FzZSAweDMzOiBjYXNlIDB4MzQ6IGNhc2UgMHgzNTogY2FzZSAweDM2OiBjYXNlIDB4Mzc6CisgIGNhc2UgMHgzODogY2FzZSAweDM5OiBjYXNlIDB4M2E6IGNhc2UgMHgzYjogY2FzZSAweDNjOiBjYXNlIDB4M2Q6IGNhc2UgMHgzZTogY2FzZSAweDNmOgorICBjYXNlIDB4NDA6IGNhc2UgMHg0MTogY2FzZSAweDQyOiBjYXNlIDB4NDM6IGNhc2UgMHg0NDogY2FzZSAweDQ1OiBjYXNlIDB4NDY6IGNhc2UgMHg0NzoKKyAgY2FzZSAweDQ4OiBjYXNlIDB4NDk6IGNhc2UgMHg0YTogY2FzZSAweDRiOiBjYXNlIDB4NGM6IGNhc2UgMHg0ZDogY2FzZSAweDRlOiBjYXNlIDB4NGY6CisgIGNhc2UgMHg1MDogY2FzZSAweDUxOiBjYXNlIDB4NTI6IGNhc2UgMHg1MzogY2FzZSAweDU0OiBjYXNlIDB4NTU6IGNhc2UgMHg1NjogY2FzZSAweDU3OgorICBjYXNlIDB4NTg6IGNhc2UgMHg1OTogY2FzZSAweDVhOiBjYXNlIDB4NWI6IGNhc2UgMHg1YzogY2FzZSAweDVkOiBjYXNlIDB4NWU6IGNhc2UgMHg1ZjoKKyAgY2FzZSAweDYwOiBjYXNlIDB4NjE6IGNhc2UgMHg2MjogY2FzZSAweDYzOiBjYXNlIDB4NjQ6IGNhc2UgMHg2NTogY2FzZSAweDY2OiBjYXNlIDB4Njc6CisgIGNhc2UgMHg2ODogY2FzZSAweDY5OiBjYXNlIDB4NmE6IGNhc2UgMHg2YjogY2FzZSAweDZjOiBjYXNlIDB4NmQ6IGNhc2UgMHg2ZTogY2FzZSAweDZmOgorICBjYXNlIDB4NzA6IGNhc2UgMHg3MTogY2FzZSAweDcyOiBjYXNlIDB4NzM6IGNhc2UgMHg3NDogY2FzZSAweDc1OiBjYXNlIDB4NzY6IGNhc2UgMHg3NzoKKyAgY2FzZSAweDc4OiBjYXNlIDB4Nzk6IGNhc2UgMHg3YTogY2FzZSAweDdiOiBjYXNlIDB4N2M6IGNhc2UgMHg3ZDogY2FzZSAweDdlOiBjYXNlIDB4N2Y6CisgICAgZ2V0RERJdGVtKENXUF9JVEVNX1BPU0lUSVZFX0lOVEVHRVIsIGk2NCwgYyk7ICAgICAgIHJldHVybjsgIC8vIHBvc2l0aXZlIGZpeG51bQorICBjYXNlIDB4ODA6IGNhc2UgMHg4MTogY2FzZSAweDgyOiBjYXNlIDB4ODM6IGNhc2UgMHg4NDogY2FzZSAweDg1OiBjYXNlIDB4ODY6IGNhc2UgMHg4NzoKKyAgY2FzZSAweDg4OiBjYXNlIDB4ODk6IGNhc2UgMHg4YTogY2FzZSAweDhiOiBjYXNlIDB4OGM6IGNhc2UgMHg4ZDogY2FzZSAweDhlOiBjYXNlIDB4OGY6CisgICAgZ2V0RERJdGVtKENXUF9JVEVNX01BUCwgbWFwLnNpemUsIGMgJiAweDBmKTsgICAgICAgIHJldHVybjsgIC8vIGZpeG1hcAorICBjYXNlIDB4OTA6IGNhc2UgMHg5MTogY2FzZSAweDkyOiBjYXNlIDB4OTM6IGNhc2UgMHg5NDogY2FzZSAweDk1OiBjYXNlIDB4OTY6IGNhc2UgMHg5NzoKKyAgY2FzZSAweDk4OiBjYXNlIDB4OTk6IGNhc2UgMHg5YTogY2FzZSAweDliOiBjYXNlIDB4OWM6IGNhc2UgMHg5ZDogY2FzZSAweDllOiBjYXNlIDB4OWY6CisgICAgZ2V0RERJdGVtKENXUF9JVEVNX0FSUkFZLCBhcnJheS5zaXplLCBjICYgMHgwZik7ICAgIHJldHVybjsgIC8vIGZpeGFycmF5CisgIGNhc2UgMHhhMDogY2FzZSAweGExOiBjYXNlIDB4YTI6IGNhc2UgMHhhMzogY2FzZSAweGE0OiBjYXNlIDB4YTU6IGNhc2UgMHhhNjogY2FzZSAweGE3OgorICBjYXNlIDB4YTg6IGNhc2UgMHhhOTogY2FzZSAweGFhOiBjYXNlIDB4YWI6IGNhc2UgMHhhYzogY2FzZSAweGFkOiBjYXNlIDB4YWU6IGNhc2UgMHhhZjoKKyAgY2FzZSAweGIwOiBjYXNlIDB4YjE6IGNhc2UgMHhiMjogY2FzZSAweGIzOiBjYXNlIDB4YjQ6IGNhc2UgMHhiNTogY2FzZSAweGI2OiBjYXNlIDB4Yjc6CisgIGNhc2UgMHhiODogY2FzZSAweGI5OiBjYXNlIDB4YmE6IGNhc2UgMHhiYjogY2FzZSAweGJjOiBjYXNlIDB4YmQ6IGNhc2UgMHhiZTogY2FzZSAweGJmOgorICAgIGdldERESXRlbShDV1BfSVRFTV9TVFIsIHN0ci5sZW5ndGgsIGMgJiAweDFmKTsgICAgICAgICAgICAgIC8vIGZpeHJhdworICAgIGN3X3VucGFja19hc3NlcnRfYmxvYihzdHIpOworICBjYXNlIDB4YzA6ICB1bnBhY2tfY29udGV4dC0+aXRlbS50eXBlID0gQ1dQX0lURU1fTklMOyAgICAgICAgICAgcmV0dXJuOyAgLy8gbmlsCisgIGNhc2UgMHhjMjogIGdldERESXRlbShDV1BfSVRFTV9CT09MRUFOLCBib29sZWFuLCBmYWxzZSk7ICAgICAgICByZXR1cm47ICAvLyBmYWxzZQorICBjYXNlIDB4YzM6ICBnZXREREl0ZW0oQ1dQX0lURU1fQk9PTEVBTiwgYm9vbGVhbiwgdHJ1ZSk7ICAgICAgICAgcmV0dXJuOyAgLy8gdHJ1ZQorICBjYXNlIDB4YzQ6ICBnZXREREl0ZW0xKENXUF9JVEVNX0JJTiwgYmluLmxlbmd0aCwgdWludDhfdCk7ICAgICAgICAgICAgICAvLyBiaW4gOAorICAgIGN3X3VucGFja19hc3NlcnRfYmxvYihiaW4pOworICBjYXNlIDB4YzU6ICBnZXREREl0ZW0yKENXUF9JVEVNX0JJTiwgYmluLmxlbmd0aCwgdWludDE2X3QpOyAgICAgICAgICAgICAvLyBiaW4gMTYKKyAgICBjd191bnBhY2tfYXNzZXJ0X2Jsb2IoYmluKTsKKyAgY2FzZSAweGM2OiAgZ2V0RERJdGVtNChDV1BfSVRFTV9CSU4sIGJpbi5sZW5ndGgsIHVpbnQzMl90KTsgICAgICAgICAgICAgLy8gYmluIDMyCisgICAgY3dfdW5wYWNrX2Fzc2VydF9ibG9iKGJpbik7CisgIGNhc2UgMHhjNzogIGdldERESXRlbTEoQ1dQX0lURU1fRVhULCBleHQubGVuZ3RoLCB1aW50OF90KTsgICAgICAgICAgICAgIC8vIGV4dCA4CisgICAgY3dfdW5wYWNrX2Fzc2VydF9zcGFjZSgxKTsKKyAgICB1bnBhY2tfY29udGV4dC0+aXRlbS50eXBlID0gKihpbnQ4X3QqKXA7CisgICAgY3dfdW5wYWNrX2Fzc2VydF9ibG9iKGV4dCk7CisgIGNhc2UgMHhjODogIGdldERESXRlbTIoQ1dQX0lURU1fRVhULCBleHQubGVuZ3RoLCB1aW50MTZfdCk7ICAgICAgICAgICAgIC8vIGV4dCAxNgorICAgIGN3X3VucGFja19hc3NlcnRfc3BhY2UoMSk7CisgICAgdW5wYWNrX2NvbnRleHQtPml0ZW0udHlwZSA9ICooaW50OF90KilwOworICAgIGN3X3VucGFja19hc3NlcnRfYmxvYihleHQpOworICBjYXNlIDB4Yzk6ICBnZXREREl0ZW00KENXUF9JVEVNX0VYVCwgZXh0Lmxlbmd0aCwgdWludDMyX3QpOyAgICAgICAgICAgICAvLyBleHQgMzIKKyAgICBjd191bnBhY2tfYXNzZXJ0X3NwYWNlKDEpOworICAgIHVucGFja19jb250ZXh0LT5pdGVtLnR5cGUgPSAqKGludDhfdCopcDsKKyAgICBjd191bnBhY2tfYXNzZXJ0X2Jsb2IoZXh0KTsKKyAgY2FzZSAweGNhOiAgdW5wYWNrX2NvbnRleHQtPml0ZW0udHlwZSA9IENXUF9JVEVNX0ZMT0FUOyAgICAgICAgICAgICAgICAgLy8gZmxvYXQKKyAgICBjd191bnBhY2tfYXNzZXJ0X3NwYWNlKDQpOworICAgIGN3X2xvYWQzMihwKTsKKyAgICB1bnBhY2tfY29udGV4dC0+aXRlbS5hcy5yZWFsID0gKihmbG9hdCopJnRtcHUzMjsgICAgIHJldHVybjsKKyAgY2FzZSAweGNiOiAgZ2V0RERJdGVtOChDV1BfSVRFTV9ET1VCTEUpOyAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47ICAvLyBkb3VibGUKKyAgY2FzZSAweGNjOiAgZ2V0RERJdGVtMShDV1BfSVRFTV9QT1NJVElWRV9JTlRFR0VSLCB1NjQsIHVpbnQ4X3QpOworICAgIHJldHVybjsgIC8vIHVuc2lnbmVkIGludCAgOAorICBjYXNlIDB4Y2Q6ICBnZXREREl0ZW0yKENXUF9JVEVNX1BPU0lUSVZFX0lOVEVHRVIsIHU2NCwgdWludDE2X3QpOworICAgIHJldHVybjsgLy8gdW5zaWduZWQgaW50IDE2CisgIGNhc2UgMHhjZTogIGdldERESXRlbTQoQ1dQX0lURU1fUE9TSVRJVkVfSU5URUdFUiwgdTY0LCB1aW50MzJfdCk7CisgICAgcmV0dXJuOyAvLyB1bnNpZ25lZCBpbnQgMzIKKyAgY2FzZSAweGNmOiAgZ2V0RERJdGVtOChDV1BfSVRFTV9QT1NJVElWRV9JTlRFR0VSKTsKKyAgICByZXR1cm47ICAvLyB1bnNpZ25lZCBpbnQgNjQKKyAgY2FzZSAweGQwOiAgZ2V0RERJdGVtMShDV1BfSVRFTV9ORUdBVElWRV9JTlRFR0VSLCBpNjQsIGludDhfdCk7ICAgICAgICAgIC8vIHNpZ25lZCBpbnQgIDgKKyAgICBpZih1bnBhY2tfY29udGV4dC0+aXRlbS5hcy5pNjQgPj0gMCkKKyAgICAgIHVucGFja19jb250ZXh0LT5pdGVtLnR5cGUgPSBDV1BfSVRFTV9QT1NJVElWRV9JTlRFR0VSOworICAgIHJldHVybjsKKyAgY2FzZSAweGQxOiAgZ2V0RERJdGVtMihDV1BfSVRFTV9ORUdBVElWRV9JTlRFR0VSLCBpNjQsIGludDE2X3QpOyAgICAgICAgLy8gc2lnbmVkIGludCAxNgorICAgIGlmKHVucGFja19jb250ZXh0LT5pdGVtLmFzLmk2NCA+PSAwKQorICAgICAgdW5wYWNrX2NvbnRleHQtPml0ZW0udHlwZSA9IENXUF9JVEVNX1BPU0lUSVZFX0lOVEVHRVI7CisgICAgcmV0dXJuOworICBjYXNlIDB4ZDI6ICBnZXREREl0ZW00KENXUF9JVEVNX05FR0FUSVZFX0lOVEVHRVIsIGk2NCwgaW50MzJfdCk7ICAgICAgICAvLyBzaWduZWQgaW50IDMyCisgICAgaWYodW5wYWNrX2NvbnRleHQtPml0ZW0uYXMuaTY0ID49IDApCisgICAgICB1bnBhY2tfY29udGV4dC0+aXRlbS50eXBlID0gQ1dQX0lURU1fUE9TSVRJVkVfSU5URUdFUjsKKyAgICByZXR1cm47CisgIGNhc2UgMHhkMzogIGdldERESXRlbTgoQ1dQX0lURU1fTkVHQVRJVkVfSU5URUdFUik7CQkJCQkJLy8gc2lnbmVkIGludCA2NAorICAgIGlmKHVucGFja19jb250ZXh0LT5pdGVtLmFzLmk2NCA+PSAwKQorICAgICAgdW5wYWNrX2NvbnRleHQtPml0ZW0udHlwZSA9IENXUF9JVEVNX1BPU0lUSVZFX0lOVEVHRVI7CisgICAgcmV0dXJuOworICBjYXNlIDB4ZDQ6ICBnZXREREl0ZW1GaXgoMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaXhleHQgMQorICBjYXNlIDB4ZDU6ICBnZXREREl0ZW1GaXgoMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaXhleHQgMgorICBjYXNlIDB4ZDY6ICBnZXREREl0ZW1GaXgoNCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaXhleHQgNAorICBjYXNlIDB4ZDc6ICBnZXREREl0ZW1GaXgoOCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaXhleHQgOAorICBjYXNlIDB4ZDg6ICBnZXREREl0ZW1GaXgoMTYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaXhleHQgMTYKKyAgY2FzZSAweGQ5OiAgZ2V0RERJdGVtMShDV1BfSVRFTV9TVFIsIHN0ci5sZW5ndGgsIHVpbnQ4X3QpOyAgICAgICAgICAgICAgLy8gc3RyIDgKKyAgICBjd191bnBhY2tfYXNzZXJ0X2Jsb2Ioc3RyKTsKKyAgY2FzZSAweGRhOiAgZ2V0RERJdGVtMihDV1BfSVRFTV9TVFIsIHN0ci5sZW5ndGgsIHVpbnQxNl90KTsgICAgICAgICAgICAgLy8gc3RyIDE2CisgICAgY3dfdW5wYWNrX2Fzc2VydF9ibG9iKHN0cik7CisgIGNhc2UgMHhkYjogIGdldERESXRlbTQoQ1dQX0lURU1fU1RSLCBzdHIubGVuZ3RoLCB1aW50MzJfdCk7ICAgICAgICAgICAgIC8vIHN0ciAzMgorICAgIGN3X3VucGFja19hc3NlcnRfYmxvYihzdHIpOworICBjYXNlIDB4ZGM6ICBnZXREREl0ZW0yKENXUF9JVEVNX0FSUkFZLCBhcnJheS5zaXplLCB1aW50MTZfdCk7ICAgcmV0dXJuOyAgLy8gYXJyYXkgMTYKKyAgY2FzZSAweGRkOiAgZ2V0RERJdGVtNChDV1BfSVRFTV9BUlJBWSwgYXJyYXkuc2l6ZSwgdWludDMyX3QpOyAgIHJldHVybjsgIC8vIGFycmF5IDMyCisgIGNhc2UgMHhkZTogIGdldERESXRlbTIoQ1dQX0lURU1fTUFQLCBtYXAuc2l6ZSwgdWludDE2X3QpOyAgICAgICByZXR1cm47ICAvLyBtYXAgMTYKKyAgY2FzZSAweGRmOiAgZ2V0RERJdGVtNChDV1BfSVRFTV9NQVAsIG1hcC5zaXplLCB1aW50MzJfdCk7ICAgICAgIHJldHVybjsgIC8vIG1hcCAzMgorICBjYXNlIDB4ZTA6IGNhc2UgMHhlMTogY2FzZSAweGUyOiBjYXNlIDB4ZTM6IGNhc2UgMHhlNDogY2FzZSAweGU1OiBjYXNlIDB4ZTY6IGNhc2UgMHhlNzoKKyAgY2FzZSAweGU4OiBjYXNlIDB4ZTk6IGNhc2UgMHhlYTogY2FzZSAweGViOiBjYXNlIDB4ZWM6IGNhc2UgMHhlZDogY2FzZSAweGVlOiBjYXNlIDB4ZWY6CisgIGNhc2UgMHhmMDogY2FzZSAweGYxOiBjYXNlIDB4ZjI6IGNhc2UgMHhmMzogY2FzZSAweGY0OiBjYXNlIDB4ZjU6IGNhc2UgMHhmNjogY2FzZSAweGY3OgorICBjYXNlIDB4Zjg6IGNhc2UgMHhmOTogY2FzZSAweGZhOiBjYXNlIDB4ZmI6IGNhc2UgMHhmYzogY2FzZSAweGZkOiBjYXNlIDB4ZmU6IGNhc2UgMHhmZjoKKyAgICBnZXREREl0ZW0oQ1dQX0lURU1fTkVHQVRJVkVfSU5URUdFUiwgaTY0LCAoaW50OF90KWMpOyByZXR1cm47ICAgIC8vIG5lZ2F0aXZlIGZpeG51bQorICBkZWZhdWx0OgorICAgIFVOUEFDS19FUlJPUihDV1BfUkNfTUFMRk9STUVEX0lOUFVUKQorICB9CiB9CiAKICNkZWZpbmUgY3dfc2tpcF9ieXRlcyhuKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGN3X3VucGFja19hc3NlcnRfc3BhY2UoKG4pKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBicmVhazsKKyAgY3dfdW5wYWNrX2Fzc2VydF9zcGFjZSgobikpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBicmVhazsKIAotdm9pZCBjd19za2lwX2l0ZW1zIChjd191bnBhY2tfY29udGV4dCogdW5wYWNrX2NvbnRleHQsIGxvbmcgaXRlbV9jb3VudCkKK3ZvaWQgY3dfc2tpcF9pdGVtcyhjd191bnBhY2tfY29udGV4dCogdW5wYWNrX2NvbnRleHQsIGxvbmcgaXRlbV9jb3VudCkKIHsKLSAgICBpZiAodW5wYWNrX2NvbnRleHQtPnJldHVybl9jb2RlKQotICAgICAgICByZXR1cm47Ci0gICAgCi0gICAgdWludDMyX3QgICAgdG1wdTMyOwotICAgIHVpbnQxNl90ICAgIHRtcHUxNjsKLSAgICB1aW50OF90KiAgICBwOwotICAgIAotICAgIHdoaWxlIChpdGVtX2NvdW50LS0gPiAwKQotICAgIHsKKyAgdWludDMyX3QgICAgdG1wdTMyOworICB1aW50MTZfdCAgICB0bXB1MTY7CisgIHVpbnQ4X3QqICAgIHA7CisgIHVpbnQ4X3QgYzsKKyAgdWludDhfdCogbnlwOworICBpbnQgcmM7CisKKyAgaWYodW5wYWNrX2NvbnRleHQtPnJldHVybl9jb2RlKQorICAgIHJldHVybjsKKworICB3aGlsZShpdGVtX2NvdW50LS0gPiAwKQorICB7CiAjdW5kZWYgYnVmZmVyX2VuZF9yZXR1cm5fY29kZQogI2RlZmluZSBidWZmZXJfZW5kX3JldHVybl9jb2RlICBDV1BfUkNfRU5EX09GX0lOUFVUOwotICAgICAgICBjd191bnBhY2tfYXNzZXJ0X3NwYWNlKDEpOwotICAgICAgICB1aW50OF90IGMgPSAqcDsKKyAgICBjd191bnBhY2tfYXNzZXJ0X3NwYWNlKDEpOworICAgIGMgPSAqcDsKIAogI3VuZGVmIGJ1ZmZlcl9lbmRfcmV0dXJuX2NvZGUKICNkZWZpbmUgYnVmZmVyX2VuZF9yZXR1cm5fY29kZSAgQ1dQX1JDX0JVRkZFUl9VTkRFUkZMT1c7Ci0gICAgICAgIHN3aXRjaCAoYykKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSAweDAwOiBjYXNlIDB4MDE6IGNhc2UgMHgwMjogY2FzZSAweDAzOiBjYXNlIDB4MDQ6IGNhc2UgMHgwNTogY2FzZSAweDA2OiBjYXNlIDB4MDc6Ci0gICAgICAgICAgICBjYXNlIDB4MDg6IGNhc2UgMHgwOTogY2FzZSAweDBhOiBjYXNlIDB4MGI6IGNhc2UgMHgwYzogY2FzZSAweDBkOiBjYXNlIDB4MGU6IGNhc2UgMHgwZjoKLSAgICAgICAgICAgIGNhc2UgMHgxMDogY2FzZSAweDExOiBjYXNlIDB4MTI6IGNhc2UgMHgxMzogY2FzZSAweDE0OiBjYXNlIDB4MTU6IGNhc2UgMHgxNjogY2FzZSAweDE3OgotICAgICAgICAgICAgY2FzZSAweDE4OiBjYXNlIDB4MTk6IGNhc2UgMHgxYTogY2FzZSAweDFiOiBjYXNlIDB4MWM6IGNhc2UgMHgxZDogY2FzZSAweDFlOiBjYXNlIDB4MWY6Ci0gICAgICAgICAgICBjYXNlIDB4MjA6IGNhc2UgMHgyMTogY2FzZSAweDIyOiBjYXNlIDB4MjM6IGNhc2UgMHgyNDogY2FzZSAweDI1OiBjYXNlIDB4MjY6IGNhc2UgMHgyNzoKLSAgICAgICAgICAgIGNhc2UgMHgyODogY2FzZSAweDI5OiBjYXNlIDB4MmE6IGNhc2UgMHgyYjogY2FzZSAweDJjOiBjYXNlIDB4MmQ6IGNhc2UgMHgyZTogY2FzZSAweDJmOgotICAgICAgICAgICAgY2FzZSAweDMwOiBjYXNlIDB4MzE6IGNhc2UgMHgzMjogY2FzZSAweDMzOiBjYXNlIDB4MzQ6IGNhc2UgMHgzNTogY2FzZSAweDM2OiBjYXNlIDB4Mzc6Ci0gICAgICAgICAgICBjYXNlIDB4Mzg6IGNhc2UgMHgzOTogY2FzZSAweDNhOiBjYXNlIDB4M2I6IGNhc2UgMHgzYzogY2FzZSAweDNkOiBjYXNlIDB4M2U6IGNhc2UgMHgzZjoKLSAgICAgICAgICAgIGNhc2UgMHg0MDogY2FzZSAweDQxOiBjYXNlIDB4NDI6IGNhc2UgMHg0MzogY2FzZSAweDQ0OiBjYXNlIDB4NDU6IGNhc2UgMHg0NjogY2FzZSAweDQ3OgotICAgICAgICAgICAgY2FzZSAweDQ4OiBjYXNlIDB4NDk6IGNhc2UgMHg0YTogY2FzZSAweDRiOiBjYXNlIDB4NGM6IGNhc2UgMHg0ZDogY2FzZSAweDRlOiBjYXNlIDB4NGY6Ci0gICAgICAgICAgICBjYXNlIDB4NTA6IGNhc2UgMHg1MTogY2FzZSAweDUyOiBjYXNlIDB4NTM6IGNhc2UgMHg1NDogY2FzZSAweDU1OiBjYXNlIDB4NTY6IGNhc2UgMHg1NzoKLSAgICAgICAgICAgIGNhc2UgMHg1ODogY2FzZSAweDU5OiBjYXNlIDB4NWE6IGNhc2UgMHg1YjogY2FzZSAweDVjOiBjYXNlIDB4NWQ6IGNhc2UgMHg1ZTogY2FzZSAweDVmOgotICAgICAgICAgICAgY2FzZSAweDYwOiBjYXNlIDB4NjE6IGNhc2UgMHg2MjogY2FzZSAweDYzOiBjYXNlIDB4NjQ6IGNhc2UgMHg2NTogY2FzZSAweDY2OiBjYXNlIDB4Njc6Ci0gICAgICAgICAgICBjYXNlIDB4Njg6IGNhc2UgMHg2OTogY2FzZSAweDZhOiBjYXNlIDB4NmI6IGNhc2UgMHg2YzogY2FzZSAweDZkOiBjYXNlIDB4NmU6IGNhc2UgMHg2ZjoKLSAgICAgICAgICAgIGNhc2UgMHg3MDogY2FzZSAweDcxOiBjYXNlIDB4NzI6IGNhc2UgMHg3MzogY2FzZSAweDc0OiBjYXNlIDB4NzU6IGNhc2UgMHg3NjogY2FzZSAweDc3OgotICAgICAgICAgICAgY2FzZSAweDc4OiBjYXNlIDB4Nzk6IGNhc2UgMHg3YTogY2FzZSAweDdiOiBjYXNlIDB4N2M6IGNhc2UgMHg3ZDogY2FzZSAweDdlOiBjYXNlIDB4N2Y6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdW5zaWduZWQgZml4aW50Ci0gICAgICAgICAgICBjYXNlIDB4ZTA6IGNhc2UgMHhlMTogY2FzZSAweGUyOiBjYXNlIDB4ZTM6IGNhc2UgMHhlNDogY2FzZSAweGU1OiBjYXNlIDB4ZTY6IGNhc2UgMHhlNzoKLSAgICAgICAgICAgIGNhc2UgMHhlODogY2FzZSAweGU5OiBjYXNlIDB4ZWE6IGNhc2UgMHhlYjogY2FzZSAweGVjOiBjYXNlIDB4ZWQ6IGNhc2UgMHhlZTogY2FzZSAweGVmOgotICAgICAgICAgICAgY2FzZSAweGYwOiBjYXNlIDB4ZjE6IGNhc2UgMHhmMjogY2FzZSAweGYzOiBjYXNlIDB4ZjQ6IGNhc2UgMHhmNTogY2FzZSAweGY2OiBjYXNlIDB4Zjc6Ci0gICAgICAgICAgICBjYXNlIDB4Zjg6IGNhc2UgMHhmOTogY2FzZSAweGZhOiBjYXNlIDB4ZmI6IGNhc2UgMHhmYzogY2FzZSAweGZkOiBjYXNlIDB4ZmU6IGNhc2UgMHhmZjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzaWduZWQgZml4aW50Ci0gICAgICAgICAgICBjYXNlIDB4YzA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmlsCi0gICAgICAgICAgICBjYXNlIDB4YzI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmFsc2UKLSAgICAgICAgICAgIGNhc2UgMHhjMzogIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cnVlCi0gICAgICAgICAgICBjYXNlIDB4Y2M6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdW5zaWduZWQgaW50ICA4Ci0gICAgICAgICAgICBjYXNlIDB4ZDA6CWN3X3NraXBfYnl0ZXMoMSk7ICAgICAgICAgICAgICAgICAgICAgICAvLyBzaWduZWQgaW50ICA4Ci0gICAgICAgICAgICBjYXNlIDB4Y2Q6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdW5zaWduZWQgaW50IDE2Ci0gICAgICAgICAgICBjYXNlIDB4ZDE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2lnbmVkIGludCAxNgotICAgICAgICAgICAgY2FzZSAweGQ0OiAgY3dfc2tpcF9ieXRlcygyKTsgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpeGV4dCAxCi0gICAgICAgICAgICBjYXNlIDB4ZDU6ICBjd19za2lwX2J5dGVzKDMpOyAgICAgICAgICAgICAgICAgICAgICAgLy8gZml4ZXh0IDIKLSAgICAgICAgICAgIGNhc2UgMHhjYTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmbG9hdAotICAgICAgICAgICAgY2FzZSAweGNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVuc2lnbmVkIGludCAzMgotICAgICAgICAgICAgY2FzZSAweGQyOiAgY3dfc2tpcF9ieXRlcyg0KTsgICAgICAgICAgICAgICAgICAgICAgIC8vIHNpZ25lZCBpbnQgMzIKLSAgICAgICAgICAgIGNhc2UgMHhkNjogIGN3X3NraXBfYnl0ZXMoNSk7ICAgICAgICAgICAgICAgICAgICAgICAvLyBmaXhleHQgNAotICAgICAgICAgICAgY2FzZSAweGNiOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvdWJsZQotICAgICAgICAgICAgY2FzZSAweGNmOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVuc2lnbmVkIGludCA2NAotICAgICAgICAgICAgY2FzZSAweGQzOiAgY3dfc2tpcF9ieXRlcyg4KTsgICAgICAgICAgICAgICAgICAgICAgIC8vIHNpZ25lZCBpbnQgNjQKLSAgICAgICAgICAgIGNhc2UgMHhkNzogIGN3X3NraXBfYnl0ZXMoOSk7ICAgICAgICAgICAgICAgICAgICAgICAvLyBmaXhleHQgOAotICAgICAgICAgICAgY2FzZSAweGQ4OiAgY3dfc2tpcF9ieXRlcygxNyk7ICAgICAgICAgICAgICAgICAgICAgIC8vIGZpeGV4dCAxNgotICAgICAgICAgICAgY2FzZSAweGEwOiBjYXNlIDB4YTE6IGNhc2UgMHhhMjogY2FzZSAweGEzOiBjYXNlIDB4YTQ6IGNhc2UgMHhhNTogY2FzZSAweGE2OiBjYXNlIDB4YTc6Ci0gICAgICAgICAgICBjYXNlIDB4YTg6IGNhc2UgMHhhOTogY2FzZSAweGFhOiBjYXNlIDB4YWI6IGNhc2UgMHhhYzogY2FzZSAweGFkOiBjYXNlIDB4YWU6IGNhc2UgMHhhZjoKLSAgICAgICAgICAgIGNhc2UgMHhiMDogY2FzZSAweGIxOiBjYXNlIDB4YjI6IGNhc2UgMHhiMzogY2FzZSAweGI0OiBjYXNlIDB4YjU6IGNhc2UgMHhiNjogY2FzZSAweGI3OgotICAgICAgICAgICAgY2FzZSAweGI4OiBjYXNlIDB4Yjk6IGNhc2UgMHhiYTogY2FzZSAweGJiOiBjYXNlIDB4YmM6IGNhc2UgMHhiZDogY2FzZSAweGJlOiBjYXNlIDB4YmY6Ci0gICAgICAgICAgICAgICAgY3dfc2tpcF9ieXRlcyhjICYgMHgxZik7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gZml4c3RyCi0gICAgICAgICAgICBjYXNlIDB4ZDk6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RyIDgKLSAgICAgICAgICAgIGNhc2UgMHhjNDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiaW4gOAotICAgICAgICAgICAgICAgIGN3X3VucGFja19hc3NlcnRfc3BhY2UoMSk7Ci0gICAgICAgICAgICAgICAgdG1wdTMyID0gKnA7Ci0gICAgICAgICAgICAgICAgY3dfc2tpcF9ieXRlcyh0bXB1MzIpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgY2FzZSAweGRhOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0ciAxNgotICAgICAgICAgICAgY2FzZSAweGM1OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJpbiAxNgotICAgICAgICAgICAgICAgIGN3X3VucGFja19hc3NlcnRfc3BhY2UoMik7Ci0gICAgICAgICAgICAgICAgY3dfbG9hZDE2KHApOwotICAgICAgICAgICAgICAgIGN3X3NraXBfYnl0ZXModG1wdTE2KTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIGNhc2UgMHhkYjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdHIgMzIKLSAgICAgICAgICAgIGNhc2UgMHhjNjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiaW4gMzIKLSAgICAgICAgICAgICAgICBjd191bnBhY2tfYXNzZXJ0X3NwYWNlKDQpOwotICAgICAgICAgICAgICAgIGN3X2xvYWQzMihwKTsKLSAgICAgICAgICAgICAgICBjd19za2lwX2J5dGVzKHRtcHUzMik7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICBjYXNlIDB4ODA6IGNhc2UgMHg4MTogY2FzZSAweDgyOiBjYXNlIDB4ODM6IGNhc2UgMHg4NDogY2FzZSAweDg1OiBjYXNlIDB4ODY6IGNhc2UgMHg4NzoKLSAgICAgICAgICAgIGNhc2UgMHg4ODogY2FzZSAweDg5OiBjYXNlIDB4OGE6IGNhc2UgMHg4YjogY2FzZSAweDhjOiBjYXNlIDB4OGQ6IGNhc2UgMHg4ZTogY2FzZSAweDhmOgotICAgICAgICAgICAgICAgIGl0ZW1fY291bnQgKz0gMiooYyAmIDE1KTsgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpeE1hcAotICAgICAgICAgICAgICAgIGJyZWFrOworICAgIHN3aXRjaChjKQorICAgIHsKKyAgICBjYXNlIDB4MDA6IGNhc2UgMHgwMTogY2FzZSAweDAyOiBjYXNlIDB4MDM6IGNhc2UgMHgwNDogY2FzZSAweDA1OiBjYXNlIDB4MDY6IGNhc2UgMHgwNzoKKyAgICBjYXNlIDB4MDg6IGNhc2UgMHgwOTogY2FzZSAweDBhOiBjYXNlIDB4MGI6IGNhc2UgMHgwYzogY2FzZSAweDBkOiBjYXNlIDB4MGU6IGNhc2UgMHgwZjoKKyAgICBjYXNlIDB4MTA6IGNhc2UgMHgxMTogY2FzZSAweDEyOiBjYXNlIDB4MTM6IGNhc2UgMHgxNDogY2FzZSAweDE1OiBjYXNlIDB4MTY6IGNhc2UgMHgxNzoKKyAgICBjYXNlIDB4MTg6IGNhc2UgMHgxOTogY2FzZSAweDFhOiBjYXNlIDB4MWI6IGNhc2UgMHgxYzogY2FzZSAweDFkOiBjYXNlIDB4MWU6IGNhc2UgMHgxZjoKKyAgICBjYXNlIDB4MjA6IGNhc2UgMHgyMTogY2FzZSAweDIyOiBjYXNlIDB4MjM6IGNhc2UgMHgyNDogY2FzZSAweDI1OiBjYXNlIDB4MjY6IGNhc2UgMHgyNzoKKyAgICBjYXNlIDB4Mjg6IGNhc2UgMHgyOTogY2FzZSAweDJhOiBjYXNlIDB4MmI6IGNhc2UgMHgyYzogY2FzZSAweDJkOiBjYXNlIDB4MmU6IGNhc2UgMHgyZjoKKyAgICBjYXNlIDB4MzA6IGNhc2UgMHgzMTogY2FzZSAweDMyOiBjYXNlIDB4MzM6IGNhc2UgMHgzNDogY2FzZSAweDM1OiBjYXNlIDB4MzY6IGNhc2UgMHgzNzoKKyAgICBjYXNlIDB4Mzg6IGNhc2UgMHgzOTogY2FzZSAweDNhOiBjYXNlIDB4M2I6IGNhc2UgMHgzYzogY2FzZSAweDNkOiBjYXNlIDB4M2U6IGNhc2UgMHgzZjoKKyAgICBjYXNlIDB4NDA6IGNhc2UgMHg0MTogY2FzZSAweDQyOiBjYXNlIDB4NDM6IGNhc2UgMHg0NDogY2FzZSAweDQ1OiBjYXNlIDB4NDY6IGNhc2UgMHg0NzoKKyAgICBjYXNlIDB4NDg6IGNhc2UgMHg0OTogY2FzZSAweDRhOiBjYXNlIDB4NGI6IGNhc2UgMHg0YzogY2FzZSAweDRkOiBjYXNlIDB4NGU6IGNhc2UgMHg0ZjoKKyAgICBjYXNlIDB4NTA6IGNhc2UgMHg1MTogY2FzZSAweDUyOiBjYXNlIDB4NTM6IGNhc2UgMHg1NDogY2FzZSAweDU1OiBjYXNlIDB4NTY6IGNhc2UgMHg1NzoKKyAgICBjYXNlIDB4NTg6IGNhc2UgMHg1OTogY2FzZSAweDVhOiBjYXNlIDB4NWI6IGNhc2UgMHg1YzogY2FzZSAweDVkOiBjYXNlIDB4NWU6IGNhc2UgMHg1ZjoKKyAgICBjYXNlIDB4NjA6IGNhc2UgMHg2MTogY2FzZSAweDYyOiBjYXNlIDB4NjM6IGNhc2UgMHg2NDogY2FzZSAweDY1OiBjYXNlIDB4NjY6IGNhc2UgMHg2NzoKKyAgICBjYXNlIDB4Njg6IGNhc2UgMHg2OTogY2FzZSAweDZhOiBjYXNlIDB4NmI6IGNhc2UgMHg2YzogY2FzZSAweDZkOiBjYXNlIDB4NmU6IGNhc2UgMHg2ZjoKKyAgICBjYXNlIDB4NzA6IGNhc2UgMHg3MTogY2FzZSAweDcyOiBjYXNlIDB4NzM6IGNhc2UgMHg3NDogY2FzZSAweDc1OiBjYXNlIDB4NzY6IGNhc2UgMHg3NzoKKyAgICBjYXNlIDB4Nzg6IGNhc2UgMHg3OTogY2FzZSAweDdhOiBjYXNlIDB4N2I6IGNhc2UgMHg3YzogY2FzZSAweDdkOiBjYXNlIDB4N2U6IGNhc2UgMHg3ZjoKKyAgICAvLyB1bnNpZ25lZCBmaXhpbnQKKyAgICBjYXNlIDB4ZTA6IGNhc2UgMHhlMTogY2FzZSAweGUyOiBjYXNlIDB4ZTM6IGNhc2UgMHhlNDogY2FzZSAweGU1OiBjYXNlIDB4ZTY6IGNhc2UgMHhlNzoKKyAgICBjYXNlIDB4ZTg6IGNhc2UgMHhlOTogY2FzZSAweGVhOiBjYXNlIDB4ZWI6IGNhc2UgMHhlYzogY2FzZSAweGVkOiBjYXNlIDB4ZWU6IGNhc2UgMHhlZjoKKyAgICBjYXNlIDB4ZjA6IGNhc2UgMHhmMTogY2FzZSAweGYyOiBjYXNlIDB4ZjM6IGNhc2UgMHhmNDogY2FzZSAweGY1OiBjYXNlIDB4ZjY6IGNhc2UgMHhmNzoKKyAgICBjYXNlIDB4Zjg6IGNhc2UgMHhmOTogY2FzZSAweGZhOiBjYXNlIDB4ZmI6IGNhc2UgMHhmYzogY2FzZSAweGZkOiBjYXNlIDB4ZmU6IGNhc2UgMHhmZjoKKyAgICAvLyBzaWduZWQgZml4aW50CisgICAgY2FzZSAweGMwOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5pbAorICAgIGNhc2UgMHhjMjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmYWxzZQorICAgIGNhc2UgMHhjMzogIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cnVlCisgICAgY2FzZSAweGNjOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVuc2lnbmVkIGludCAgOAorICAgIGNhc2UgMHhkMDoJY3dfc2tpcF9ieXRlcygxKTsgICAgICAgICAgICAgICAgICAgICAgIC8vIHNpZ25lZCBpbnQgIDgKKyAgICBjYXNlIDB4Y2Q6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdW5zaWduZWQgaW50IDE2CisgICAgY2FzZSAweGQxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNpZ25lZCBpbnQgMTYKKyAgICBjYXNlIDB4ZDQ6ICBjd19za2lwX2J5dGVzKDIpOyAgICAgICAgICAgICAgICAgICAgICAgLy8gZml4ZXh0IDEKKyAgICBjYXNlIDB4ZDU6ICBjd19za2lwX2J5dGVzKDMpOyAgICAgICAgICAgICAgICAgICAgICAgLy8gZml4ZXh0IDIKKyAgICBjYXNlIDB4Y2E6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmxvYXQKKyAgICBjYXNlIDB4Y2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdW5zaWduZWQgaW50IDMyCisgICAgY2FzZSAweGQyOiAgY3dfc2tpcF9ieXRlcyg0KTsgICAgICAgICAgICAgICAgICAgICAgIC8vIHNpZ25lZCBpbnQgMzIKKyAgICBjYXNlIDB4ZDY6ICBjd19za2lwX2J5dGVzKDUpOyAgICAgICAgICAgICAgICAgICAgICAgLy8gZml4ZXh0IDQKKyAgICBjYXNlIDB4Y2I6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG91YmxlCisgICAgY2FzZSAweGNmOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVuc2lnbmVkIGludCA2NAorICAgIGNhc2UgMHhkMzogIGN3X3NraXBfYnl0ZXMoOCk7ICAgICAgICAgICAgICAgICAgICAgICAvLyBzaWduZWQgaW50IDY0CisgICAgY2FzZSAweGQ3OiAgY3dfc2tpcF9ieXRlcyg5KTsgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpeGV4dCA4CisgICAgY2FzZSAweGQ4OiAgY3dfc2tpcF9ieXRlcygxNyk7ICAgICAgICAgICAgICAgICAgICAgIC8vIGZpeGV4dCAxNgorICAgIGNhc2UgMHhhMDogY2FzZSAweGExOiBjYXNlIDB4YTI6IGNhc2UgMHhhMzogY2FzZSAweGE0OiBjYXNlIDB4YTU6IGNhc2UgMHhhNjogY2FzZSAweGE3OgorICAgIGNhc2UgMHhhODogY2FzZSAweGE5OiBjYXNlIDB4YWE6IGNhc2UgMHhhYjogY2FzZSAweGFjOiBjYXNlIDB4YWQ6IGNhc2UgMHhhZTogY2FzZSAweGFmOgorICAgIGNhc2UgMHhiMDogY2FzZSAweGIxOiBjYXNlIDB4YjI6IGNhc2UgMHhiMzogY2FzZSAweGI0OiBjYXNlIDB4YjU6IGNhc2UgMHhiNjogY2FzZSAweGI3OgorICAgIGNhc2UgMHhiODogY2FzZSAweGI5OiBjYXNlIDB4YmE6IGNhc2UgMHhiYjogY2FzZSAweGJjOiBjYXNlIDB4YmQ6IGNhc2UgMHhiZTogY2FzZSAweGJmOgorICAgICAgY3dfc2tpcF9ieXRlcyhjICYgMHgxZik7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gZml4c3RyCisgICAgY2FzZSAweGQ5OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0ciA4CisgICAgY2FzZSAweGM0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJpbiA4CisgICAgICBjd191bnBhY2tfYXNzZXJ0X3NwYWNlKDEpOworICAgICAgdG1wdTMyID0gKnA7CisgICAgICBjd19za2lwX2J5dGVzKHRtcHUzMik7CiAKLSAgICAgICAgICAgIGNhc2UgMHg5MDogY2FzZSAweDkxOiBjYXNlIDB4OTI6IGNhc2UgMHg5MzogY2FzZSAweDk0OiBjYXNlIDB4OTU6IGNhc2UgMHg5NjogY2FzZSAweDk3OgotICAgICAgICAgICAgY2FzZSAweDk4OiBjYXNlIDB4OTk6IGNhc2UgMHg5YTogY2FzZSAweDliOiBjYXNlIDB4OWM6IGNhc2UgMHg5ZDogY2FzZSAweDllOiBjYXNlIDB4OWY6Ci0gICAgICAgICAgICAgICAgaXRlbV9jb3VudCArPSBjICYgMTU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRml4QXJyYXkKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIGNhc2UgMHhkYzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhcnJheSAxNgotICAgICAgICAgICAgICAgIGN3X3VucGFja19hc3NlcnRfc3BhY2UoMik7Ci0gICAgICAgICAgICAgICAgY3dfbG9hZDE2KHApOwotICAgICAgICAgICAgICAgIGl0ZW1fY291bnQgKz0gdG1wdTE2OwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgY2FzZSAweGRlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1hcCAxNgotICAgICAgICAgICAgICAgIGN3X3VucGFja19hc3NlcnRfc3BhY2UoMik7Ci0gICAgICAgICAgICAgICAgY3dfbG9hZDE2KHApOwotICAgICAgICAgICAgICAgIGl0ZW1fY291bnQgKz0gMip0bXB1MTY7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICBjYXNlIDB4ZGQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXJyYXkgMzIKLSAgICAgICAgICAgICAgICBjd191bnBhY2tfYXNzZXJ0X3NwYWNlKDQpOwotICAgICAgICAgICAgICAgIGN3X2xvYWQzMihwKTsKLSAgICAgICAgICAgICAgICBpdGVtX2NvdW50ICs9IHRtcHUzMjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIGNhc2UgMHhkZjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXAgMzIKLSAgICAgICAgICAgICAgICBjd191bnBhY2tfYXNzZXJ0X3NwYWNlKDQpOwotICAgICAgICAgICAgICAgIGN3X2xvYWQzMihwKTsKLSAgICAgICAgICAgICAgICBpdGVtX2NvdW50ICs9IDIqdG1wdTMyOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgY2FzZSAweGM3OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4dCA4Ci0gICAgICAgICAgICAgICAgY3dfdW5wYWNrX2Fzc2VydF9zcGFjZSgxKTsKLSAgICAgICAgICAgICAgICB0bXB1MzIgPSAqcDsKLSAgICAgICAgICAgICAgICBjd19za2lwX2J5dGVzKHRtcHUzMiArMSk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICBjYXNlIDB4Yzg6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXh0IDE2Ci0gICAgICAgICAgICAgICAgY3dfdW5wYWNrX2Fzc2VydF9zcGFjZSgyKTsKLSAgICAgICAgICAgICAgICBjd19sb2FkMTYocCk7Ci0gICAgICAgICAgICAgICAgY3dfc2tpcF9ieXRlcyh0bXB1MTYgKzEpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgY2FzZSAweGM5OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4dCAzMgotICAgICAgICAgICAgICAgIGN3X3VucGFja19hc3NlcnRfc3BhY2UoNCk7Ci0gICAgICAgICAgICAgICAgY3dfbG9hZDMyKHApOwotICAgICAgICAgICAgICAgIGN3X3NraXBfYnl0ZXModG1wdTMyICsxKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbGxlZ2FsCi0gICAgICAgICAgICAgICAgVU5QQUNLX0VSUk9SKENXUF9SQ19NQUxGT1JNRURfSU5QVVQpCi0gICAgICAgIH0KKyAgICBjYXNlIDB4ZGE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RyIDE2CisgICAgY2FzZSAweGM1OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJpbiAxNgorICAgICAgY3dfdW5wYWNrX2Fzc2VydF9zcGFjZSgyKTsKKyAgICAgIGN3X2xvYWQxNihwKTsKKyAgICAgIGN3X3NraXBfYnl0ZXModG1wdTE2KTsKKworICAgIGNhc2UgMHhkYjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdHIgMzIKKyAgICBjYXNlIDB4YzY6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmluIDMyCisgICAgICBjd191bnBhY2tfYXNzZXJ0X3NwYWNlKDQpOworICAgICAgY3dfbG9hZDMyKHApOworICAgICAgY3dfc2tpcF9ieXRlcyh0bXB1MzIpOworCisgICAgY2FzZSAweDgwOiBjYXNlIDB4ODE6IGNhc2UgMHg4MjogY2FzZSAweDgzOiBjYXNlIDB4ODQ6IGNhc2UgMHg4NTogY2FzZSAweDg2OiBjYXNlIDB4ODc6CisgICAgY2FzZSAweDg4OiBjYXNlIDB4ODk6IGNhc2UgMHg4YTogY2FzZSAweDhiOiBjYXNlIDB4OGM6IGNhc2UgMHg4ZDogY2FzZSAweDhlOiBjYXNlIDB4OGY6CisgICAgICBpdGVtX2NvdW50ICs9IDIqKGMgJiAxNSk7ICAgICAgICAgICAgICAgICAgICAgICAvLyBGaXhNYXAKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAweDkwOiBjYXNlIDB4OTE6IGNhc2UgMHg5MjogY2FzZSAweDkzOiBjYXNlIDB4OTQ6IGNhc2UgMHg5NTogY2FzZSAweDk2OiBjYXNlIDB4OTc6CisgICAgY2FzZSAweDk4OiBjYXNlIDB4OTk6IGNhc2UgMHg5YTogY2FzZSAweDliOiBjYXNlIDB4OWM6IGNhc2UgMHg5ZDogY2FzZSAweDllOiBjYXNlIDB4OWY6CisgICAgICBpdGVtX2NvdW50ICs9IGMgJiAxNTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGaXhBcnJheQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDB4ZGM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXJyYXkgMTYKKyAgICAgIGN3X3VucGFja19hc3NlcnRfc3BhY2UoMik7CisgICAgICBjd19sb2FkMTYocCk7CisgICAgICBpdGVtX2NvdW50ICs9IHRtcHUxNjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAweGRlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1hcCAxNgorICAgICAgY3dfdW5wYWNrX2Fzc2VydF9zcGFjZSgyKTsKKyAgICAgIGN3X2xvYWQxNihwKTsKKyAgICAgIGl0ZW1fY291bnQgKz0gMip0bXB1MTY7CisgICAgICBicmVhazsKKworICAgIGNhc2UgMHhkZDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhcnJheSAzMgorICAgICAgY3dfdW5wYWNrX2Fzc2VydF9zcGFjZSg0KTsKKyAgICAgIGN3X2xvYWQzMihwKTsKKyAgICAgIGl0ZW1fY291bnQgKz0gdG1wdTMyOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDB4ZGY6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWFwIDMyCisgICAgICBjd191bnBhY2tfYXNzZXJ0X3NwYWNlKDQpOworICAgICAgY3dfbG9hZDMyKHApOworICAgICAgaXRlbV9jb3VudCArPSAyKnRtcHUzMjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAweGM3OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4dCA4CisgICAgICBjd191bnBhY2tfYXNzZXJ0X3NwYWNlKDEpOworICAgICAgdG1wdTMyID0gKnA7CisgICAgICBjd19za2lwX2J5dGVzKHRtcHUzMiArMSk7CisKKyAgICBjYXNlIDB4Yzg6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXh0IDE2CisgICAgICBjd191bnBhY2tfYXNzZXJ0X3NwYWNlKDIpOworICAgICAgY3dfbG9hZDE2KHApOworICAgICAgY3dfc2tpcF9ieXRlcyh0bXB1MTYgKzEpOworCisgICAgY2FzZSAweGM5OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4dCAzMgorICAgICAgY3dfdW5wYWNrX2Fzc2VydF9zcGFjZSg0KTsKKyAgICAgIGN3X2xvYWQzMihwKTsKKyAgICAgIGN3X3NraXBfYnl0ZXModG1wdTMyICsxKTsKKworICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbGxlZ2FsCisgICAgICBVTlBBQ0tfRVJST1IoQ1dQX1JDX01BTEZPUk1FRF9JTlBVVCkKICAgICB9Ci0gICAgcmV0dXJuOworICB9CisgIHJldHVybjsKIH0KIAogLyogZW5kIGN3cGFjay5jICovCmRpZmYgLS1naXQgYS9tc2dwYWNrL2N3cGFjay5oIGIvbXNncGFjay9jd3BhY2suaAppbmRleCBjMjk3ZDU2Li42ZTkwZGVhIDEwMDY0NAotLS0gYS9tc2dwYWNrL2N3cGFjay5oCisrKyBiL21zZ3BhY2svY3dwYWNrLmgKQEAgLTEsMTggKzEsMTggQEAKIC8qICAgICAgQ1dQYWNrIC0gY3dwYWNrLmggICAqLwogLyoKICBUaGUgTUlUIExpY2Vuc2UgKE1JVCkKLSAKKwogIENvcHlyaWdodCAoYykgMjAxNyBDbGFlcyBXaWhsYm9yZwotIAorCiAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZiB0aGlzCiAgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZQogIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwKICBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdAogIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLSAKKwogIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3IKICBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCi0gCisKICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcKICBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLApAQCAtNTQsMzkgKzU0LDQyIEBACiAKIHR5cGVkZWYgaW50ICgqcGFja19vdmVyZmxvd19oYW5kbGVyKShzdHJ1Y3QgY3dfcGFja19jb250ZXh0KiwgdW5zaWduZWQgbG9uZyk7CiAKLXR5cGVkZWYgc3RydWN0IGN3X3BhY2tfY29udGV4dCB7Ci0gICAgdWludDhfdCogICAgICAgICAgICAgICAgc3RhcnQ7Ci0gICAgdWludDhfdCogICAgICAgICAgICAgICAgY3VycmVudDsKLSAgICB1aW50OF90KiAgICAgICAgICAgICAgICBlbmQ7Ci0gICAgYm9vbCAgICAgICAgICAgICAgICAgICAgYmVfY29tcGF0aWJsZTsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICByZXR1cm5fY29kZTsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICBlcnJfbm87ICAgICAgICAgIC8qIGhhbmRsZXJzIGNhbiBzYXZlIGVycm9yIGhlcmUgKi8KLSAgICBwYWNrX292ZXJmbG93X2hhbmRsZXIgICBoYW5kbGVfcGFja19vdmVyZmxvdzsKK3R5cGVkZWYgc3RydWN0IGN3X3BhY2tfY29udGV4dAoreworICB1aW50OF90KiAgICAgICAgICAgICAgICBzdGFydDsKKyAgdWludDhfdCogICAgICAgICAgICAgICAgY3VycmVudDsKKyAgdWludDhfdCogICAgICAgICAgICAgICAgZW5kOworICBib29sICAgICAgICAgICAgICAgICAgICBiZV9jb21wYXRpYmxlOworICBpbnQgICAgICAgICAgICAgICAgICAgICByZXR1cm5fY29kZTsKKyAgaW50ICAgICAgICAgICAgICAgICAgICAgZXJyX25vOyAgICAgICAgICAvKiBoYW5kbGVycyBjYW4gc2F2ZSBlcnJvciBoZXJlICovCisgIHBhY2tfb3ZlcmZsb3dfaGFuZGxlciAgIGhhbmRsZV9wYWNrX292ZXJmbG93OwogfSBjd19wYWNrX2NvbnRleHQ7CiAKIAotaW50IGN3X3BhY2tfY29udGV4dF9pbml0IChjd19wYWNrX2NvbnRleHQqIHBhY2tfY29udGV4dCwgdm9pZCogZGF0YSwgdW5zaWduZWQgbG9uZyBsZW5ndGgsIHBhY2tfb3ZlcmZsb3dfaGFuZGxlciBocG8pOwotdm9pZCBjd19wYWNrX3NldF9jb21wYXRpYmlsaXR5IChjd19wYWNrX2NvbnRleHQqIHBhY2tfY29udGV4dCwgYm9vbCBiZV9jb21wYXRpYmxlKTsKK2ludCBjd19wYWNrX2NvbnRleHRfaW5pdChjd19wYWNrX2NvbnRleHQqIHBhY2tfY29udGV4dCwgdm9pZCogZGF0YSwgdW5zaWduZWQgbG9uZyBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgcGFja19vdmVyZmxvd19oYW5kbGVyIGhwbyk7Cit2b2lkIGN3X3BhY2tfc2V0X2NvbXBhdGliaWxpdHkoY3dfcGFja19jb250ZXh0KiBwYWNrX2NvbnRleHQsIGJvb2wgYmVfY29tcGF0aWJsZSk7CiAKLXZvaWQgY3dfcGFja19uaWwgKGN3X3BhY2tfY29udGV4dCogcGFja19jb250ZXh0KTsKLXZvaWQgY3dfcGFja190cnVlIChjd19wYWNrX2NvbnRleHQqIHBhY2tfY29udGV4dCk7Ci12b2lkIGN3X3BhY2tfZmFsc2UgKGN3X3BhY2tfY29udGV4dCogcGFja19jb250ZXh0KTsKLXZvaWQgY3dfcGFja19ib29sZWFuIChjd19wYWNrX2NvbnRleHQqIHBhY2tfY29udGV4dCwgYm9vbCBiKTsKK3ZvaWQgY3dfcGFja19uaWwoY3dfcGFja19jb250ZXh0KiBwYWNrX2NvbnRleHQpOwordm9pZCBjd19wYWNrX3RydWUoY3dfcGFja19jb250ZXh0KiBwYWNrX2NvbnRleHQpOwordm9pZCBjd19wYWNrX2ZhbHNlKGN3X3BhY2tfY29udGV4dCogcGFja19jb250ZXh0KTsKK3ZvaWQgY3dfcGFja19ib29sZWFuKGN3X3BhY2tfY29udGV4dCogcGFja19jb250ZXh0LCBib29sIGIpOwogCi12b2lkIGN3X3BhY2tfc2lnbmVkIChjd19wYWNrX2NvbnRleHQqIHBhY2tfY29udGV4dCwgaW50NjRfdCBpKTsKLXZvaWQgY3dfcGFja191bnNpZ25lZCAoY3dfcGFja19jb250ZXh0KiBwYWNrX2NvbnRleHQsIHVpbnQ2NF90IGkpOwordm9pZCBjd19wYWNrX3NpZ25lZChjd19wYWNrX2NvbnRleHQqIHBhY2tfY29udGV4dCwgaW50NjRfdCBpKTsKK3ZvaWQgY3dfcGFja191bnNpZ25lZChjd19wYWNrX2NvbnRleHQqIHBhY2tfY29udGV4dCwgdWludDY0X3QgaSk7CiAKLXZvaWQgY3dfcGFja19mbG9hdCAoY3dfcGFja19jb250ZXh0KiBwYWNrX2NvbnRleHQsIGZsb2F0IGYpOwotdm9pZCBjd19wYWNrX2RvdWJsZSAoY3dfcGFja19jb250ZXh0KiBwYWNrX2NvbnRleHQsIGRvdWJsZSBkKTsKLXZvaWQgY3dfcGFja19yZWFsIChjd19wYWNrX2NvbnRleHQqIHBhY2tfY29udGV4dCwgZG91YmxlIGQpOyAgIC8qIFBhY2sgYXMgZmxvYXQgaWYgcHJlY2lzaW9uIGlzbid0IGRlc3Ryb3llZCAqLwordm9pZCBjd19wYWNrX2Zsb2F0KGN3X3BhY2tfY29udGV4dCogcGFja19jb250ZXh0LCBmbG9hdCBmKTsKK3ZvaWQgY3dfcGFja19kb3VibGUoY3dfcGFja19jb250ZXh0KiBwYWNrX2NvbnRleHQsIGRvdWJsZSBkKTsKK3ZvaWQgY3dfcGFja19yZWFsKGN3X3BhY2tfY29udGV4dCogcGFja19jb250ZXh0LAorICAgICAgICAgICAgICAgICAgZG91YmxlIGQpOyAgICAvKiBQYWNrIGFzIGZsb2F0IGlmIHByZWNpc2lvbiBpc24ndCBkZXN0cm95ZWQgKi8KIAotdm9pZCBjd19wYWNrX2FycmF5X3NpemUgKGN3X3BhY2tfY29udGV4dCogcGFja19jb250ZXh0LCB1aW50MzJfdCBuKTsKLXZvaWQgY3dfcGFja19tYXBfc2l6ZSAoY3dfcGFja19jb250ZXh0KiBwYWNrX2NvbnRleHQsIHVpbnQzMl90IG4pOwotdm9pZCBjd19wYWNrX3N0ciAoY3dfcGFja19jb250ZXh0KiBwYWNrX2NvbnRleHQsIGNvbnN0IGNoYXIqIHYsIHVpbnQzMl90IGwpOwotdm9pZCBjd19wYWNrX2JpbiAoY3dfcGFja19jb250ZXh0KiBwYWNrX2NvbnRleHQsIGNvbnN0IHZvaWQqIHYsIHVpbnQzMl90IGwpOwotdm9pZCBjd19wYWNrX2V4dCAoY3dfcGFja19jb250ZXh0KiBwYWNrX2NvbnRleHQsIGludDhfdCB0eXBlLCBjb25zdCB2b2lkKiB2LCB1aW50MzJfdCBsKTsKK3ZvaWQgY3dfcGFja19hcnJheV9zaXplKGN3X3BhY2tfY29udGV4dCogcGFja19jb250ZXh0LCB1aW50MzJfdCBuKTsKK3ZvaWQgY3dfcGFja19tYXBfc2l6ZShjd19wYWNrX2NvbnRleHQqIHBhY2tfY29udGV4dCwgdWludDMyX3Qgbik7Cit2b2lkIGN3X3BhY2tfc3RyKGN3X3BhY2tfY29udGV4dCogcGFja19jb250ZXh0LCBjb25zdCBjaGFyKiB2LCB1aW50MzJfdCBsKTsKK3ZvaWQgY3dfcGFja19iaW4oY3dfcGFja19jb250ZXh0KiBwYWNrX2NvbnRleHQsIGNvbnN0IHZvaWQqIHYsIHVpbnQzMl90IGwpOwordm9pZCBjd19wYWNrX2V4dChjd19wYWNrX2NvbnRleHQqIHBhY2tfY29udGV4dCwgaW50OF90IHR5cGUsIGNvbnN0IHZvaWQqIHYsIHVpbnQzMl90IGwpOwogCi12b2lkIGN3X3BhY2tfaW5zZXJ0IChjd19wYWNrX2NvbnRleHQqIHBhY2tfY29udGV4dCwgY29uc3Qgdm9pZCogdiwgdWludDMyX3QgbCk7Cit2b2lkIGN3X3BhY2tfaW5zZXJ0KGN3X3BhY2tfY29udGV4dCogcGFja19jb250ZXh0LCBjb25zdCB2b2lkKiB2LCB1aW50MzJfdCBsKTsKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICBVIE4gUCBBIEMgSyAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtOTQsNzMgKzk3LDc4IEBACiAKIHR5cGVkZWYgZW51bQogewotICAgIENXUF9JVEVNX01JTl9SRVNFUlZFRF9FWFQgICAgICAgPSAtMTI4LAotICAgIENXUF9JVEVNX01BWF9SRVNFUlZFRF9FWFQgICAgICAgPSAtMSwKLSAgICBDV1BfSVRFTV9NSU5fVVNFUl9FWFQgICAgICAgICAgID0gMCwKLSAgICBDV1BfSVRFTV9NQVhfVVNFUl9FWFQgICAgICAgICAgID0gMTI3LAotICAgIENXUF9JVEVNX05JTCAgICAgICAgICAgICAgICAgICAgPSAzMDAsCi0gICAgQ1dQX0lURU1fQk9PTEVBTiAgICAgICAgICAgICAgICA9IDMwMSwKLSAgICBDV1BfSVRFTV9QT1NJVElWRV9JTlRFR0VSICAgICAgID0gMzAyLAotICAgIENXUF9JVEVNX05FR0FUSVZFX0lOVEVHRVIgICAgICAgPSAzMDMsCi0gICAgQ1dQX0lURU1fRkxPQVQgICAgICAgICAgICAgICAgICA9IDMwNCwKLSAgICBDV1BfSVRFTV9ET1VCTEUgICAgICAgICAgICAgICAgID0gMzA1LAotICAgIENXUF9JVEVNX1NUUiAgICAgICAgICAgICAgICAgICAgPSAzMDYsCi0gICAgQ1dQX0lURU1fQklOICAgICAgICAgICAgICAgICAgICA9IDMwNywKLSAgICBDV1BfSVRFTV9BUlJBWSAgICAgICAgICAgICAgICAgID0gMzA4LAotICAgIENXUF9JVEVNX01BUCAgICAgICAgICAgICAgICAgICAgPSAzMDksCi0gICAgQ1dQX0lURU1fRVhUICAgICAgICAgICAgICAgICAgICA9IDMxMCwKLSAgICBDV1BfTk9UX0FOX0lURU0gICAgICAgICAgICAgICAgID0gOTk5LAorICBDV1BfSVRFTV9NSU5fUkVTRVJWRURfRVhUICAgICAgID0gLTEyOCwKKyAgQ1dQX0lURU1fTUFYX1JFU0VSVkVEX0VYVCAgICAgICA9IC0xLAorICBDV1BfSVRFTV9NSU5fVVNFUl9FWFQgICAgICAgICAgID0gMCwKKyAgQ1dQX0lURU1fTUFYX1VTRVJfRVhUICAgICAgICAgICA9IDEyNywKKyAgQ1dQX0lURU1fTklMICAgICAgICAgICAgICAgICAgICA9IDMwMCwKKyAgQ1dQX0lURU1fQk9PTEVBTiAgICAgICAgICAgICAgICA9IDMwMSwKKyAgQ1dQX0lURU1fUE9TSVRJVkVfSU5URUdFUiAgICAgICA9IDMwMiwKKyAgQ1dQX0lURU1fTkVHQVRJVkVfSU5URUdFUiAgICAgICA9IDMwMywKKyAgQ1dQX0lURU1fRkxPQVQgICAgICAgICAgICAgICAgICA9IDMwNCwKKyAgQ1dQX0lURU1fRE9VQkxFICAgICAgICAgICAgICAgICA9IDMwNSwKKyAgQ1dQX0lURU1fU1RSICAgICAgICAgICAgICAgICAgICA9IDMwNiwKKyAgQ1dQX0lURU1fQklOICAgICAgICAgICAgICAgICAgICA9IDMwNywKKyAgQ1dQX0lURU1fQVJSQVkgICAgICAgICAgICAgICAgICA9IDMwOCwKKyAgQ1dQX0lURU1fTUFQICAgICAgICAgICAgICAgICAgICA9IDMwOSwKKyAgQ1dQX0lURU1fRVhUICAgICAgICAgICAgICAgICAgICA9IDMxMCwKKyAgQ1dQX05PVF9BTl9JVEVNICAgICAgICAgICAgICAgICA9IDk5OSwKIH0gY3dwYWNrX2l0ZW1fdHlwZXM7CiAKIAotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGNvbnN0IHZvaWQqICAgICBzdGFydDsKLSAgICB1aW50MzJfdCAgICAgICAgbGVuZ3RoOwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgY29uc3Qgdm9pZCogICAgIHN0YXJ0OworICB1aW50MzJfdCAgICAgICAgbGVuZ3RoOwogfSBjd3BhY2tfYmxvYjsKIAogCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgdWludDMyX3QgICAgc2l6ZTsKK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90ICAgIHNpemU7CiB9IGN3cGFja19jb250YWluZXI7CiAKIAotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGN3cGFja19pdGVtX3R5cGVzICAgdHlwZTsKLSAgICB1bmlvbgotICAgIHsKLSAgICAgICAgYm9vbCAgICAgICAgICAgIGJvb2xlYW47Ci0gICAgICAgIHVpbnQ2NF90ICAgICAgICB1NjQ7Ci0gICAgICAgIGludDY0X3QgICAgICAgICBpNjQ7Ci0gICAgICAgIGZsb2F0ICAgICAgICAgICByZWFsOwotICAgICAgICBkb3VibGUgICAgICAgICAgbG9uZ19yZWFsOwotICAgICAgICBjd3BhY2tfY29udGFpbmVyIGFycmF5OwotICAgICAgICBjd3BhY2tfY29udGFpbmVyIG1hcDsKLSAgICAgICAgY3dwYWNrX2Jsb2IgICAgIHN0cjsKLSAgICAgICAgY3dwYWNrX2Jsb2IgICAgIGJpbjsKLSAgICAgICAgY3dwYWNrX2Jsb2IgICAgIGV4dDsKLSAgICB9IGFzOwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgY3dwYWNrX2l0ZW1fdHlwZXMgICB0eXBlOworICB1bmlvbgorICB7CisgICAgYm9vbCAgICAgICAgICAgIGJvb2xlYW47CisgICAgdWludDY0X3QgICAgICAgIHU2NDsKKyAgICBpbnQ2NF90ICAgICAgICAgaTY0OworICAgIGZsb2F0ICAgICAgICAgICByZWFsOworICAgIGRvdWJsZSAgICAgICAgICBsb25nX3JlYWw7CisgICAgY3dwYWNrX2NvbnRhaW5lciBhcnJheTsKKyAgICBjd3BhY2tfY29udGFpbmVyIG1hcDsKKyAgICBjd3BhY2tfYmxvYiAgICAgc3RyOworICAgIGN3cGFja19ibG9iICAgICBiaW47CisgICAgY3dwYWNrX2Jsb2IgICAgIGV4dDsKKyAgfSBhczsKIH0gY3dwYWNrX2l0ZW07CiAKIHN0cnVjdCBjd191bnBhY2tfY29udGV4dDsKIAogdHlwZWRlZiBpbnQgKCp1bnBhY2tfdW5kZXJmbG93X2hhbmRsZXIpKHN0cnVjdCBjd191bnBhY2tfY29udGV4dCosIHVuc2lnbmVkIGxvbmcpOwogCi10eXBlZGVmIHN0cnVjdCBjd191bnBhY2tfY29udGV4dCB7Ci0gICAgY3dwYWNrX2l0ZW0gICAgICAgICAgICAgICAgIGl0ZW07Ci0gICAgdWludDhfdCogICAgICAgICAgICAgICAgICAgIHN0YXJ0OwotICAgIHVpbnQ4X3QqICAgICAgICAgICAgICAgICAgICBjdXJyZW50OwotICAgIHVpbnQ4X3QqICAgICAgICAgICAgICAgICAgICBlbmQ7ICAgICAgICAgICAgIC8qIGxvZ2ljYWwgZW5kIG9mIGJ1ZmZlciAqLwotICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5fY29kZTsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgZXJyX25vOyAgICAgICAgICAvKiBoYW5kbGVycyBjYW4gc2F2ZSBlcnJvciBoZXJlICovCi0gICAgdW5wYWNrX3VuZGVyZmxvd19oYW5kbGVyICAgIGhhbmRsZV91bnBhY2tfdW5kZXJmbG93OwordHlwZWRlZiBzdHJ1Y3QgY3dfdW5wYWNrX2NvbnRleHQKK3sKKyAgY3dwYWNrX2l0ZW0gICAgICAgICAgICAgICAgIGl0ZW07CisgIHVpbnQ4X3QqICAgICAgICAgICAgICAgICAgICBzdGFydDsKKyAgdWludDhfdCogICAgICAgICAgICAgICAgICAgIGN1cnJlbnQ7CisgIHVpbnQ4X3QqICAgICAgICAgICAgICAgICAgICBlbmQ7ICAgICAgICAgICAgIC8qIGxvZ2ljYWwgZW5kIG9mIGJ1ZmZlciAqLworICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuX2NvZGU7CisgIGludCAgICAgICAgICAgICAgICAgICAgICAgICBlcnJfbm87ICAgICAgICAgIC8qIGhhbmRsZXJzIGNhbiBzYXZlIGVycm9yIGhlcmUgKi8KKyAgdW5wYWNrX3VuZGVyZmxvd19oYW5kbGVyICAgIGhhbmRsZV91bnBhY2tfdW5kZXJmbG93OwogfSBjd191bnBhY2tfY29udGV4dDsKIAogCiAKLWludCBjd191bnBhY2tfY29udGV4dF9pbml0IChjd191bnBhY2tfY29udGV4dCogdW5wYWNrX2NvbnRleHQsIHZvaWQqIGRhdGEsIHVuc2lnbmVkIGxvbmcgbGVuZ3RoLCB1bnBhY2tfdW5kZXJmbG93X2hhbmRsZXIgaHV1KTsKK2ludCBjd191bnBhY2tfY29udGV4dF9pbml0KGN3X3VucGFja19jb250ZXh0KiB1bnBhY2tfY29udGV4dCwgdm9pZCogZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgbGVuZ3RoLCB1bnBhY2tfdW5kZXJmbG93X2hhbmRsZXIgaHV1KTsKIAotdm9pZCBjd191bnBhY2tfbmV4dCAoY3dfdW5wYWNrX2NvbnRleHQqIHVucGFja19jb250ZXh0KTsKLXZvaWQgY3dfc2tpcF9pdGVtcyAoY3dfdW5wYWNrX2NvbnRleHQqIHVucGFja19jb250ZXh0LCBsb25nIGl0ZW1fY291bnQpOwordm9pZCBjd191bnBhY2tfbmV4dChjd191bnBhY2tfY29udGV4dCogdW5wYWNrX2NvbnRleHQpOwordm9pZCBjd19za2lwX2l0ZW1zKGN3X3VucGFja19jb250ZXh0KiB1bnBhY2tfY29udGV4dCwgbG9uZyBpdGVtX2NvdW50KTsKIAogCiAjZW5kaWYgIC8qIENXUGFja19IX18gKi8KZGlmZiAtLWdpdCBhL21zZ3BhY2svY3dwYWNrX2RlZmluZXMuaCBiL21zZ3BhY2svY3dwYWNrX2RlZmluZXMuaAppbmRleCBiMmYyOWY2Li40ZjRhYjU3IDEwMDY0NAotLS0gYS9tc2dwYWNrL2N3cGFja19kZWZpbmVzLmgKKysrIGIvbXNncGFjay9jd3BhY2tfZGVmaW5lcy5oCkBAIC0xLDE4ICsxLDE4IEBACiAvKiAgICAgIENXUGFjayAtIGN3cGFja19kZWZpbmVzLmggICAqLwogLyoKICBUaGUgTUlUIExpY2Vuc2UgKE1JVCkKLSAKKwogIENvcHlyaWdodCAoYykgMjAxNyBDbGFlcyBXaWhsYm9yZwotIAorCiAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZiB0aGlzCiAgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZQogIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwKICBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdAogIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLSAKKwogIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3IKICBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCi0gCisKICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcKICBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLApAQCAtMzQsNyArMzQsNyBAQAogICovCiAKIC8qICNkZWZpbmUgRk9SQ0VfQUxJR05NRU5UICovCi0gCisKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKiogICBDICAgUyBZIFMgVCBFIE0gICBMIEkgQiBSIEEgUiBZICAgKioqKioqKioqKioqKioqKi8KIApAQCAtNTAsNyArNTAsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKiogICBCIFkgVCBFICAgTyBSIEQgRSBSICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIFRoZSBwYWNrL3VucGFjayByb3V0aW5lcyBhcmUgd3JpdHRlbiBpbiB0aHJlZSB2ZXJzaW9uczogZm9yIGJpZyBlbmRpYW4sIGZvciAKKyAqIFRoZSBwYWNrL3VucGFjayByb3V0aW5lcyBhcmUgd3JpdHRlbiBpbiB0aHJlZSB2ZXJzaW9uczogZm9yIGJpZyBlbmRpYW4sIGZvcgogICogbGl0dGxlIGVuZGlhbiBhbmQgaW5zZW5zaXRpdmUgdG8gYnl0ZSBvcmRlci4gQXMgeW91IGNhbiBnZXQgc29tZSBzcGVlZCBnYWluCiAgKiBpZiB0aGUgYnl0ZSBvcmRlciBpcyBrbm93biwgd2UgdHJ5IHRoYXQgd2hlbiB3ZSBjYW4gY2VydGFpbmx5IGRldGVjdCBpdC4KICAqIERlZmluZSBDT01QSUxFX0ZPUl9CSUdfRU5ESUFOIG9yIENPTVBJTEVfRk9SX0xJVFRMRV9FTkRJQU4gaWYgeW91IGtub3cuCkBAIC05NiwxMCArOTYsMTAgQEAKIAogCiAjZGVmaW5lIFBBQ0tfRVJST1IoZXJyb3JfY29kZSkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBwYWNrX2NvbnRleHQtPnJldHVybl9jb2RlID0gZXJyb3JfY29kZTsgICAgICAgICAgICAgXAogICAgIHJldHVybjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19CisgIH0KIAogCiAKQEAgLTExNCwxMTQgKzExNCwxMDkgQEAKICNpZmRlZiBDT01QSUxFX0ZPUl9MSVRUTEVfRU5ESUFOCiAKICNkZWZpbmUgY3dfc3RvcmUxNihkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAqKHVpbnQxNl90KilwID0gKHVpbnQxNl90KSgoKChkKSA+PiA4KSAmIDB4MGZmKSB8IChkKSA8PCA4KQorICAqKHVpbnQxNl90KilwID0gKHVpbnQxNl90KSgoKChkKSA+PiA4KSAmIDB4MGZmKSB8IChkKSA8PCA4KQogCiAjZGVmaW5lIGN3X3N0b3JlMzIoeCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKih1aW50MzJfdCopcCA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICgodWludDMyX3QpKCgoKHVpbnQzMl90KSh4KSkgPj4gMjQpIHwgICAgICAgICAgICAgICBcCi0gICAgICAgICgoKHVpbnQzMl90KSh4KSAmIDB4MDBmZjAwMDApID4+ICA4KSB8ICAgICAgICAgICAgICBcCi0gICAgICAgICgoKHVpbnQzMl90KSh4KSAmIDB4MDAwMGZmMDApIDw8ICA4KSB8ICAgICAgICAgICAgICBcCi0gICAgICAgICgoKHVpbnQzMl90KSh4KSkgPDwgMjQpKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICoodWludDMyX3QqKXAgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKCh1aW50MzJfdCkoKCgodWludDMyX3QpKHgpKSA+PiAyNCkgfCAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICgoKHVpbnQzMl90KSh4KSAmIDB4MDBmZjAwMDApID4+ICA4KSB8ICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAoKCh1aW50MzJfdCkoeCkgJiAweDAwMDBmZjAwKSA8PCAgOCkgfCAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgKCgodWludDMyX3QpKHgpKSA8PCAyNCkpKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIAogI2RlZmluZSBjd19zdG9yZTY0KHgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICoodWludDY0X3QqKXAgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAoKHVpbnQ2NF90KSggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAoKCgoKHVpbnQ2NF90KSh4KSkgPj4gNDApIHwgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAoKCh1aW50NjRfdCkoeCkpIDw8IDI0KSkgJiAweDAwMDBmZjAwMDAwMGZmMDBVTEwpIHwgXAotICAgICAgICAoKCgoKHVpbnQ2NF90KSh4KSkgPj4gMjQpIHwgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAoKCh1aW50NjRfdCkoeCkpIDw8IDQwKSkgJiAweDAwZmYwMDAwMDBmZjAwMDBVTEwpIHwgXAotICAgICAgICAoKCh1aW50NjRfdCkoeCkgJiAweDAwMDAwMGZmMDAwMDAwMDBVTEwpID4+ICA4KSB8ICAgXAotICAgICAgICAoKCh1aW50NjRfdCkoeCkgJiAweDAwMDAwMDAwZmYwMDAwMDBVTEwpIDw8ICA4KSB8ICAgXAotICAgICAgICAoKCh1aW50NjRfdCkoeCkpID4+IDU2KSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAoKCh1aW50NjRfdCkoeCkpIDw8IDU2KSkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAqKHVpbnQ2NF90KilwID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICgodWludDY0X3QpKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKCgoKCh1aW50NjRfdCkoeCkpID4+IDQwKSB8ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICgoKHVpbnQ2NF90KSh4KSkgPDwgMjQpKSAmIDB4MDAwMGZmMDAwMDAwZmYwMFVMTCkgfCBcCisgICAgICAgICAgKCgoKCh1aW50NjRfdCkoeCkpID4+IDI0KSB8ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICgoKHVpbnQ2NF90KSh4KSkgPDwgNDApKSAmIDB4MDBmZjAwMDAwMGZmMDAwMFVMTCkgfCBcCisgICAgICAgICAgKCgodWludDY0X3QpKHgpICYgMHgwMDAwMDBmZjAwMDAwMDAwVUxMKSA+PiAgOCkgfCAgIFwKKyAgICAgICAgICAoKCh1aW50NjRfdCkoeCkgJiAweDAwMDAwMDAwZmYwMDAwMDBVTEwpIDw8ICA4KSB8ICAgXAorICAgICAgICAgICgoKHVpbnQ2NF90KSh4KSkgPj4gNTYpIHwgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKCgodWludDY0X3QpKHgpKSA8PCA1NikpKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIAogI2Vsc2UgICAvKiBCeXRlIG9yZGVyIHVuZGV0ZXJtaW5lZCAqLwogCiAjZGVmaW5lIGN3X3N0b3JlMTYoZCkgICAgICAgICAgIFwKLSAgICAqcCA9ICh1aW50OF90KShkID4+IDgpOyAgICAgXAotICAgIHBbMV0gPSAodWludDhfdClkOworICAqcCA9ICh1aW50OF90KShkID4+IDgpOyAgICAgXAorICBwWzFdID0gKHVpbnQ4X3QpZDsKIAogI2RlZmluZSBjd19zdG9yZTMyKGQpICAgICAgICAgICBcCi0gICAgKnAgPSAodWludDhfdCkoZCA+PiAyNCk7ICAgIFwKLSAgICBwWzFdID0gKHVpbnQ4X3QpKGQgPj4gMTYpOyAgXAotICAgIHBbMl0gPSAodWludDhfdCkoZCA+PiA4KTsgICBcCi0gICAgcFszXSA9ICh1aW50OF90KWQ7CisgICpwID0gKHVpbnQ4X3QpKGQgPj4gMjQpOyAgICBcCisgIHBbMV0gPSAodWludDhfdCkoZCA+PiAxNik7ICBcCisgIHBbMl0gPSAodWludDhfdCkoZCA+PiA4KTsgICBcCisgIHBbM10gPSAodWludDhfdClkOwogCiAjZGVmaW5lIGN3X3N0b3JlNjQoeikgICAgICAgICAgIFwKLSAgICAqcCA9ICh1aW50OF90KSh6ID4+IDU2KTsgICAgXAotICAgIHBbMV0gPSAodWludDhfdCkoeiA+PiA0OCk7ICBcCi0gICAgcFsyXSA9ICh1aW50OF90KSh6ID4+IDQwKTsgIFwKLSAgICBwWzNdID0gKHVpbnQ4X3QpKHogPj4gMzIpOyAgXAotICAgIHBbNF0gPSAodWludDhfdCkoeiA+PiAyNCk7ICBcCi0gICAgcFs1XSA9ICh1aW50OF90KSh6ID4+IDE2KTsgIFwKLSAgICBwWzZdID0gKHVpbnQ4X3QpKHogPj4gOCk7ICAgXAotICAgIHBbN10gPSAodWludDhfdCl6OworICAqcCA9ICh1aW50OF90KSh6ID4+IDU2KTsgICAgXAorICBwWzFdID0gKHVpbnQ4X3QpKHogPj4gNDgpOyAgXAorICBwWzJdID0gKHVpbnQ4X3QpKHogPj4gNDApOyAgXAorICBwWzNdID0gKHVpbnQ4X3QpKHogPj4gMzIpOyAgXAorICBwWzRdID0gKHVpbnQ4X3QpKHogPj4gMjQpOyAgXAorICBwWzVdID0gKHVpbnQ4X3QpKHogPj4gMTYpOyAgXAorICBwWzZdID0gKHVpbnQ4X3QpKHogPj4gOCk7ICAgXAorICBwWzddID0gKHVpbnQ4X3QpejsKICNlbmRpZgogI2VuZGlmCiAKIAogCiAjZGVmaW5lIGN3X3BhY2tfcmVzZXJ2ZV9zcGFjZShtb3JlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBwID0gcGFja19jb250ZXh0LT5jdXJyZW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHVpbnQ4X3QqIG55cCA9IHAgKyBtb3JlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbnlwID0gcCArIG1vcmU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBpZiAobnlwID4gcGFja19jb250ZXh0LT5lbmQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGlmICghcGFja19jb250ZXh0LT5oYW5kbGVfcGFja19vdmVyZmxvdykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIFBBQ0tfRVJST1IoQ1dQX1JDX0JVRkZFUl9PVkVSRkxPVykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBpbnQgcmMgPSBwYWNrX2NvbnRleHQtPmhhbmRsZV9wYWNrX292ZXJmbG93IChwYWNrX2NvbnRleHQsICh1bnNpZ25lZCBsb25nKShtb3JlKSk7ICBcCi0gICAgICAgIGlmIChyYykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIFBBQ0tfRVJST1IocmMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgaWYgKCFwYWNrX2NvbnRleHQtPmhhbmRsZV9wYWNrX292ZXJmbG93KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBQQUNLX0VSUk9SKENXUF9SQ19CVUZGRVJfT1ZFUkZMT1cpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmMgPSBwYWNrX2NvbnRleHQtPmhhbmRsZV9wYWNrX292ZXJmbG93IChwYWNrX2NvbnRleHQsICh1bnNpZ25lZCBsb25nKShtb3JlKSk7ICBcCisgICAgICBpZiAocmMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFBBQ0tfRVJST1IocmMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBwID0gcGFja19jb250ZXh0LT5jdXJyZW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIG55cCA9IHAgKyBtb3JlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIG55cCA9IHAgKyBtb3JlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIHBhY2tfY29udGV4dC0+Y3VycmVudCA9IG55cDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19CisgIH0KIAogCiAjZGVmaW5lIHRyeU1vdmUwKHQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHVpbnQ4X3QgKnA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIGN3X3BhY2tfcmVzZXJ2ZV9zcGFjZSgxKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgKnAgPSAodWludDhfdCkodCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICByZXR1cm47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfQorICB9CiAKICNkZWZpbmUgdHJ5TW92ZTEodCxkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdWludDhfdCAqcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQlcCiAgICAgY3dfcGFja19yZXNlcnZlX3NwYWNlKDIpICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAqcCsrID0gKHVpbnQ4X3QpdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICpwID0gKHVpbnQ4X3QpZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgcmV0dXJuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KKyAgfQogCiAjZGVmaW5lIHRyeU1vdmUyKHQsZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHVpbnQ4X3QgKnA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJXAogICAgIGN3X3BhY2tfcmVzZXJ2ZV9zcGFjZSgzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgKnArKyA9ICh1aW50OF90KXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBjd19zdG9yZTE2KGQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIHJldHVybjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19CisgIH0KIAogI2RlZmluZSB0cnlNb3ZlNCh0LGQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB1aW50OF90ICpwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQlcCiAgICAgY3dfcGFja19yZXNlcnZlX3NwYWNlKDUpICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAqcCsrID0gKHVpbnQ4X3QpdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIGN3X3N0b3JlMzIoZCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgcmV0dXJuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KKyAgfQogCiAjZGVmaW5lIHRyeU1vdmU4KHQsZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHVpbnQ4X3QgKnA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJXAogICAgIGN3X3BhY2tfcmVzZXJ2ZV9zcGFjZSg5KSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgKnArKyA9ICh1aW50OF90KXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBjd19zdG9yZTY0KGQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIHJldHVybjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19CisgIH0KIAogCiAKQEAgLTIzMSwxMSArMjI2LDExIEBACiAKIAogI2RlZmluZSBVTlBBQ0tfRVJST1IoZXJyb3JfY29kZSkgICAgICAgICAgICAgICAgICAgICAgICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgdW5wYWNrX2NvbnRleHQtPml0ZW0udHlwZSA9IENXUF9OT1RfQU5fSVRFTTsgICAgICAgIFwKICAgICB1bnBhY2tfY29udGV4dC0+cmV0dXJuX2NvZGUgPSBlcnJvcl9jb2RlOyAgICAgICAgICAgXAogICAgIHJldHVybjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19CisgIH0KIAogCiAKQEAgLTI1MCw0NyArMjQ1LDQ3IEBACiAjaWZkZWYgQ09NUElMRV9GT1JfTElUVExFX0VORElBTgogCiAjZGVmaW5lIGN3X2xvYWQxNihwdHIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHRtcHUxNiA9ICoodWludDE2X3QqKXB0cjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB0bXB1MTYgPSAodWludDE2X3QpKCh0bXB1MTY8PDgpIHwgKHRtcHUxNj4+OCkpCisgIHRtcHUxNiA9ICoodWludDE2X3QqKXB0cjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdG1wdTE2ID0gKHVpbnQxNl90KSgodG1wdTE2PDw4KSB8ICh0bXB1MTY+PjgpKQogCiAjZGVmaW5lIGN3X2xvYWQzMihwdHIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHRtcHUzMiA9ICoodWludDMyX3QqKXB0cjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB0bXB1MzIgPSAodG1wdTMyPDwyNCkgfCAoKHRtcHUzMiAmIDB4ZmYwMCk8PDgpIHwgICAgICAgICAgICBcCi0gICAgICAgICAgICAoKHRtcHUzMiAmIDB4ZmYwMDAwKT4+OCkgfCAodG1wdTMyPj4yNCkKKyAgdG1wdTMyID0gKih1aW50MzJfdCopcHRyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0bXB1MzIgPSAodG1wdTMyPDwyNCkgfCAoKHRtcHUzMiAmIDB4ZmYwMCk8PDgpIHwgICAgICAgICAgICBcCisgICAgICAgICAgICgodG1wdTMyICYgMHhmZjAwMDApPj44KSB8ICh0bXB1MzI+PjI0KQogCiAjZGVmaW5lIGN3X2xvYWQ2NChwdHIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHRtcHU2NCA9ICooKHVpbnQ2NF90KilwdHIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB0bXB1NjQgPSAgICAgICAgICAgICAgICAgICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICgoKHRtcHU2NCA+PiA0MCkgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAodG1wdTY0IDw8IDI0KSkgJiAweDAwMDBmZjAwMDAwMGZmMDBVTEwpIHwgICAgICAgICAgICAgIFwKLSAgICAgICAgKCgodG1wdTY0ID4+IDI0KSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICh0bXB1NjQgPDwgNDApKSAmIDB4MDBmZjAwMDAwMGZmMDAwMFVMTCkgfCAgICAgICAgICAgICAgXAotICAgICAgICAoKHRtcHU2NCAmIDB4MDAwMDAwZmYwMDAwMDAwMFVMTCkgPj4gIDgpIHwgICAgICAgICAgICAgIFwKLSAgICAgICAgKCh0bXB1NjQgJiAweDAwMDAwMDAwZmYwMDAwMDBVTEwpIDw8ICA4KSB8ICAgICAgICAgICAgICBcCi0gICAgICAgICh0bXB1NjQgPj4gNTYpIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAodG1wdTY0IDw8IDU2KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgdG1wdTY0ID0gKigodWludDY0X3QqKXB0cik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0bXB1NjQgPSAgICAgICAgICAgICAgICAgICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHRtcHU2NCA+PiA0MCkgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0bXB1NjQgPDwgMjQpKSAmIDB4MDAwMGZmMDAwMDAwZmYwMFVMTCkgfCAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCh0bXB1NjQgPj4gMjQpIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodG1wdTY0IDw8IDQwKSkgJiAweDAwZmYwMDAwMDBmZjAwMDBVTEwpIHwgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh0bXB1NjQgJiAweDAwMDAwMGZmMDAwMDAwMDBVTEwpID4+ICA4KSB8ICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodG1wdTY0ICYgMHgwMDAwMDAwMGZmMDAwMDAwVUxMKSA8PCAgOCkgfCAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodG1wdTY0ID4+IDU2KSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRtcHU2NCA8PCA1NikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAKICNlbHNlIC8qIEJ5dGUgb3JkZXIgdW5kZXRlcm1pbmVkICovCiAKICNkZWZpbmUgY3dfbG9hZDE2KHB0cikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdG1wdTE2ID0gKHVpbnQxNl90KSgoKnB0cisrKSA8PCA4KTsgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHRtcHUxNiB8PSAodWludDE2X3QpKCpwdHIrKykKKyAgdG1wdTE2ID0gKHVpbnQxNl90KSgoKnB0cisrKSA8PCA4KTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0bXB1MTYgfD0gKHVpbnQxNl90KSgqcHRyKyspCiAKICNkZWZpbmUgY3dfbG9hZDMyKHB0cikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdG1wdTMyID0gKHVpbnQzMl90KSgqcHRyKysgPDwgMjQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHRtcHUzMiB8PSAodWludDMyX3QpKCpwdHIrKyA8PCAxNik7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB0bXB1MzIgfD0gKHVpbnQzMl90KSgqcHRyKysgPDwgOCk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdG1wdTMyIHw9ICh1aW50MzJfdCkoKnB0cisrKQorICB0bXB1MzIgPSAodWludDMyX3QpKCpwdHIrKyA8PCAyNCk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRtcHUzMiB8PSAodWludDMyX3QpKCpwdHIrKyA8PCAxNik7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdG1wdTMyIHw9ICh1aW50MzJfdCkoKnB0cisrIDw8IDgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0bXB1MzIgfD0gKHVpbnQzMl90KSgqcHRyKyspCiAKICNkZWZpbmUgY3dfbG9hZDY0KHB0cikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdG1wdTY0ID0gKCh1aW50NjRfdCkqcHRyKyspIDw8IDU2OyAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHRtcHU2NCB8PSAoKHVpbnQ2NF90KSpwdHIrKykgPDwgNDg7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB0bXB1NjQgfD0gKCh1aW50NjRfdCkqcHRyKyspIDw8IDQwOyAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdG1wdTY0IHw9ICgodWludDY0X3QpKnB0cisrKSA8PCAzMjsgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHRtcHU2NCB8PSAoKHVpbnQ2NF90KSpwdHIrKykgPDwgMjQ7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB0bXB1NjQgfD0gKCh1aW50NjRfdCkqcHRyKyspIDw8IDE2OyAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdG1wdTY0IHw9ICgodWludDY0X3QpKnB0cisrKSA8PCA4OyAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHRtcHU2NCB8PSAodWludDY0X3QpKnB0cisrCisgIHRtcHU2NCA9ICgodWludDY0X3QpKnB0cisrKSA8PCA1NjsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdG1wdTY0IHw9ICgodWludDY0X3QpKnB0cisrKSA8PCA0ODsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0bXB1NjQgfD0gKCh1aW50NjRfdCkqcHRyKyspIDw8IDQwOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRtcHU2NCB8PSAoKHVpbnQ2NF90KSpwdHIrKykgPDwgMzI7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdG1wdTY0IHw9ICgodWludDY0X3QpKnB0cisrKSA8PCAyNDsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0bXB1NjQgfD0gKCh1aW50NjRfdCkqcHRyKyspIDw8IDE2OyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRtcHU2NCB8PSAoKHVpbnQ2NF90KSpwdHIrKykgPDwgODsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdG1wdTY0IHw9ICh1aW50NjRfdCkqcHRyKysKIAogI2VuZGlmCiAjZW5kaWYKQEAgLTI5OCw2NiArMjkzLDY2IEBACiAKIAogI2RlZmluZSBjd191bnBhY2tfYXNzZXJ0X3NwYWNlKG1vcmUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgcCA9IHVucGFja19jb250ZXh0LT5jdXJyZW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHVpbnQ4X3QqIG55cCA9IHAgKyBtb3JlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBueXAgPSBwICsgbW9yZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgaWYgKG55cCA+IHVucGFja19jb250ZXh0LT5lbmQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgaWYgKCF1bnBhY2tfY29udGV4dC0+aGFuZGxlX3VucGFja191bmRlcmZsb3cpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBVTlBBQ0tfRVJST1IoYnVmZmVyX2VuZF9yZXR1cm5fY29kZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBpbnQgcmMgPSB1bnBhY2tfY29udGV4dC0+aGFuZGxlX3VucGFja191bmRlcmZsb3cgKHVucGFja19jb250ZXh0LCAodW5zaWduZWQgbG9uZykobW9yZSkpOyAgIFwKLSAgICAgICAgaWYgKHJjICE9IENXUF9SQ19PSykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgaWYgKHJjICE9IENXUF9SQ19FTkRfT0ZfSU5QVVQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICBVTlBBQ0tfRVJST1IocmMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgIFVOUEFDS19FUlJPUihidWZmZXJfZW5kX3JldHVybl9jb2RlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHAgPSB1bnBhY2tfY29udGV4dC0+Y3VycmVudDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBueXAgPSBwICsgbW9yZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGlmICghdW5wYWNrX2NvbnRleHQtPmhhbmRsZV91bnBhY2tfdW5kZXJmbG93KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBVTlBBQ0tfRVJST1IoYnVmZmVyX2VuZF9yZXR1cm5fY29kZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByYyA9IHVucGFja19jb250ZXh0LT5oYW5kbGVfdW5wYWNrX3VuZGVyZmxvdyAodW5wYWNrX2NvbnRleHQsICh1bnNpZ25lZCBsb25nKShtb3JlKSk7ICAgXAorICAgICAgaWYgKHJjICE9IENXUF9SQ19PSykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKHJjICE9IENXUF9SQ19FTkRfT0ZfSU5QVVQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBVTlBBQ0tfRVJST1IocmMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIFVOUEFDS19FUlJPUihidWZmZXJfZW5kX3JldHVybl9jb2RlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHAgPSB1bnBhY2tfY29udGV4dC0+Y3VycmVudDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgbnlwID0gcCArIG1vcmU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIHVucGFja19jb250ZXh0LT5jdXJyZW50ID0gbnlwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KKyAgfQogCiAKICNkZWZpbmUgY3dfdW5wYWNrX2Fzc2VydF9ibG9iKGJsb2IpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY3dfdW5wYWNrX2Fzc2VydF9zcGFjZSh1bnBhY2tfY29udGV4dC0+aXRlbS5hcy5ibG9iLmxlbmd0aCk7ICAgICAgICAgICAgXAotICAgIHVucGFja19jb250ZXh0LT5pdGVtLmFzLmJsb2Iuc3RhcnQgPSBwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICByZXR1cm47CisgIGN3X3VucGFja19hc3NlcnRfc3BhY2UodW5wYWNrX2NvbnRleHQtPml0ZW0uYXMuYmxvYi5sZW5ndGgpOyAgICAgICAgICAgIFwKKyAgdW5wYWNrX2NvbnRleHQtPml0ZW0uYXMuYmxvYi5zdGFydCA9IHA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICByZXR1cm47CiAKIAogI2RlZmluZSBnZXREREl0ZW0odHlwLHZhcix2YWwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB1bnBhY2tfY29udGV4dC0+aXRlbS50eXBlID0gdHlwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdW5wYWNrX2NvbnRleHQtPml0ZW0uYXMudmFyID0gdmFsOworICB1bnBhY2tfY29udGV4dC0+aXRlbS50eXBlID0gdHlwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHVucGFja19jb250ZXh0LT5pdGVtLmFzLnZhciA9IHZhbDsKIAogI2RlZmluZSBnZXREREl0ZW0xKHR5cCx2YXIsY2FzdCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB1bnBhY2tfY29udGV4dC0+aXRlbS50eXBlID0gdHlwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY3dfdW5wYWNrX2Fzc2VydF9zcGFjZSgxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHVucGFja19jb250ZXh0LT5pdGVtLmFzLnZhciA9IChjYXN0KSpwOworICB1bnBhY2tfY29udGV4dC0+aXRlbS50eXBlID0gdHlwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGN3X3VucGFja19hc3NlcnRfc3BhY2UoMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdW5wYWNrX2NvbnRleHQtPml0ZW0uYXMudmFyID0gKGNhc3QpKnA7CiAKICNkZWZpbmUgZ2V0RERJdGVtMih0eXAsdmFyLGNhc3QpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdW5wYWNrX2NvbnRleHQtPml0ZW0udHlwZSA9IHR5cDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGN3X3VucGFja19hc3NlcnRfc3BhY2UoMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjd19sb2FkMTYocCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdW5wYWNrX2NvbnRleHQtPml0ZW0uYXMudmFyID0gKGNhc3QpdG1wdTE2OworICB1bnBhY2tfY29udGV4dC0+aXRlbS50eXBlID0gdHlwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGN3X3VucGFja19hc3NlcnRfc3BhY2UoMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY3dfbG9hZDE2KHApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB1bnBhY2tfY29udGV4dC0+aXRlbS5hcy52YXIgPSAoY2FzdCl0bXB1MTY7CiAKICNkZWZpbmUgZ2V0RERJdGVtNCh0eXAsdmFyLGNhc3QpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdW5wYWNrX2NvbnRleHQtPml0ZW0udHlwZSA9IHR5cDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGN3X3VucGFja19hc3NlcnRfc3BhY2UoNCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjd19sb2FkMzIocCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdW5wYWNrX2NvbnRleHQtPml0ZW0uYXMudmFyID0gKGNhc3QpdG1wdTMyOworICB1bnBhY2tfY29udGV4dC0+aXRlbS50eXBlID0gdHlwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGN3X3VucGFja19hc3NlcnRfc3BhY2UoNCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY3dfbG9hZDMyKHApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB1bnBhY2tfY29udGV4dC0+aXRlbS5hcy52YXIgPSAoY2FzdCl0bXB1MzI7CiAKICNkZWZpbmUgZ2V0RERJdGVtOCh0eXApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdW5wYWNrX2NvbnRleHQtPml0ZW0udHlwZSA9IHR5cDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGN3X3VucGFja19hc3NlcnRfc3BhY2UoOCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjd19sb2FkNjQocCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdW5wYWNrX2NvbnRleHQtPml0ZW0uYXMudTY0ID0gdG1wdTY0OworICB1bnBhY2tfY29udGV4dC0+aXRlbS50eXBlID0gdHlwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGN3X3VucGFja19hc3NlcnRfc3BhY2UoOCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY3dfbG9hZDY0KHApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB1bnBhY2tfY29udGV4dC0+aXRlbS5hcy51NjQgPSB0bXB1NjQ7CiAKICNkZWZpbmUgZ2V0RERJdGVtRml4KGxlbikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY3dfdW5wYWNrX2Fzc2VydF9zcGFjZSgxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHVucGFja19jb250ZXh0LT5pdGVtLnR5cGUgPSAqKGludDhfdCopcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB1bnBhY2tfY29udGV4dC0+aXRlbS5hcy5leHQubGVuZ3RoID0gbGVuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY3dfdW5wYWNrX2Fzc2VydF9ibG9iKGV4dCk7CisgIGN3X3VucGFja19hc3NlcnRfc3BhY2UoMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdW5wYWNrX2NvbnRleHQtPml0ZW0udHlwZSA9ICooaW50OF90KilwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB1bnBhY2tfY29udGV4dC0+aXRlbS5hcy5leHQubGVuZ3RoID0gbGVuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGN3X3VucGFja19hc3NlcnRfYmxvYihleHQpOwogCiAKIApkaWZmIC0tZ2l0IGEvc3Vwd2lzZG9tL3NwX2NhcmQuYyBiL3N1cHdpc2RvbS9zcF9jYXJkLmMKaW5kZXggNWM2Nzk2YS4uODFiYWJjYiAxMDA2NDQKLS0tIGEvc3Vwd2lzZG9tL3NwX2NhcmQuYworKysgYi9zdXB3aXNkb20vc3BfY2FyZC5jCkBAIC01MiwxMyArNTIsMTMgQEAKICAgICAgIGlmKCFjYXJkX2NwdV9tb2RlKCkpCiAgICAgICB7CiAgICAgICAgIERlbGF5X21zKDIwMCk7Ci0JCWlmKHNwX3NlbGVjdF9zZmkoIlx4M2ZceDAwIikgPT0gMCkKKyAgICAgICAgaWYoc3Bfc2VsZWN0X3NmaSgiXHgzZlx4MDAiKSA9PSAwKQogICAgICAgICB7CiAgICAgICAgICAgc3Bfc2VsZWN0X2FkZigpOwotICAgICAgICAgIGNhcmRwY2QtPmNhcmRwaHlpZFswXSA9IHNuclszXTsKLSAgICAgICAgICBjYXJkcGNkLT5jYXJkcGh5aWRbMV0gPSBzbnJbMl07Ci0gICAgICAgICAgY2FyZHBjZC0+Y2FyZHBoeWlkWzJdID0gc25yWzFdOwotICAgICAgICAgIGNhcmRwY2QtPmNhcmRwaHlpZFszXSA9IHNuclswXTsKKyAgICAgICAgICBjYXJkcGNkLT5jYXJkcGh5aWRbMF0gPSBzbnJbMF07CisgICAgICAgICAgY2FyZHBjZC0+Y2FyZHBoeWlkWzFdID0gc25yWzFdOworICAgICAgICAgIGNhcmRwY2QtPmNhcmRwaHlpZFsyXSA9IHNuclsyXTsKKyAgICAgICAgICBjYXJkcGNkLT5jYXJkcGh5aWRbM10gPSBzbnJbM107CiAgICAgICAgICAgY2FyZHBjZC0+Y2FyZHR5cGUgPSBUQUdfVFlQRV9DUFU7CiAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgIH0KQEAgLTY3LDcgKzY3LDcgQEAKICAgICBlbHNlCiAgICAgewogICAgICAgY2FyZHBjZC0+Y2FyZHR5cGUgPSBUQUdfVFlQRV9VTktPTldOOwotCSAgcmV0dXJuIDE7CisgICAgICByZXR1cm4gMTsKICAgICB9CiAgIH0KICAgcmV0dXJuIDE7CkBAIC03OCwxMSArNzgsNTcgQEAKICAgcmV0dXJuIGNhcmRfY3B1X2V4aXN0KCk7CiB9CiAKK3N0YXRpYyB1aW50MTYgc3Bfc2VsZWN0X2FkZjE1KCkKK3sKKyAgdWludDE2IHJldCA9IDA7CisgIHVpbnQ4KiB0ZW1wX2J1ZmYgPSBOVUxMOworICB1aW50OCBidWZmX2xlbiA9IDA7CisgIHVpbnQ4IGNtZF9idWZmW10gPSB7Ilx4MDBceEE0XHgwMFx4MDBceDAyXHgzRlx4MDAifTsKKyAgcmV0ID0gY2FyZF9jcHVfZXhjaGFuZ2UoY21kX2J1ZmYsIHNpemVvZihjbWRfYnVmZiktMSwgMCwgJnRlbXBfYnVmZiwgJmJ1ZmZfbGVuKTsKKyAgaWYocmV0ICE9IFJFVENPREVfT0spCisgIHsKKyAgICByZXR1cm4gcmV0OworICB9CisgIHJldHVybiAwOworfQorCitzdGF0aWMgdWludDE2IHNwX3JlYWRfYmluYXJ5X2ZpbGUodWludDggb3V0W10pCit7CisgIHVpbnQxNiByZXQgPSAwOworICB1aW50OCogdGVtcF9idWZmID0gTlVMTDsKKyAgdWludDggYnVmZl9sZW4gPSAwOworICB1aW50OCBjbWRfYnVmZls1XSA9IHsiXHgwMFx4QjBceDk1XHgwMFx4NDcifTsKKyAgcmV0ID0gY2FyZF9jcHVfZXhjaGFuZ2UoY21kX2J1ZmYsIHNpemVvZihjbWRfYnVmZiksIDAsICZ0ZW1wX2J1ZmYsICZidWZmX2xlbik7CisgIGlmKHJldCAhPSBSRVRDT0RFX09LKQorICB7CisgICAgcmV0dXJuIHJldDsKKyAgfQorICBNRU1DUFkob3V0LCB0ZW1wX2J1ZmYsIGJ1ZmZfbGVuKTsKKyAgcmV0dXJuIDA7Cit9CiBzdGF0aWMgdWludDE2IHNwX2NwdV9yZWFkKHNwX2NhcmRfdCogY2FyZCkKIHsKICAgdWludDE2IHJldCA9IDA7CisgIHVpbnQ4IGJ1ZmZbNzJdOworICB1aW50OCBvZmZzZXQgPSAwOworICBNRU1DTEVBUihidWZmLCBzaXplb2YoYnVmZikpOworICByZXQgPSBzcF9zZWxlY3RfYWRmMTUoKTsKKyAgaWYocmV0KQorICB7CisgICAgcmV0dXJuIHJldDsKKworICB9CisgIHJldCA9IHNwX3JlYWRfYmluYXJ5X2ZpbGUoYnVmZik7CisgIGlmKHJldCkKKyAgeworICAgIHJldHVybiByZXQ7CisgIH0KICAgTUVNQ0xFQVIoY2FyZC0+Y2l0aXplbl9jYXJkbm8sIHNpemVvZihjYXJkLT5jaXRpemVuX2NhcmRubykpOwotICBNRU1DUFkoY2FyZC0+ZXhwaXJlZGF0ZSwgIlx4MjBceDIyXHgwOFx4MDIiLCA0KTsKKyAgb2Zmc2V0ICs9IDMxOworICBNRU1DUFkoY2FyZC0+Y2l0aXplbl9jYXJkbm8sIGJ1ZmYrb2Zmc2V0LCBzaXplb2YoY2FyZC0+Y2l0aXplbl9jYXJkbm8pKTsKKyAgb2Zmc2V0ICs9IDEyOworICBvZmZzZXQgKz0gMTg7CisgIE1FTUNQWShjYXJkLT5leHBpcmVkYXRlLCBidWZmK29mZnNldCwgNCk7CiAgIHJldHVybiByZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL3N1cHdpc2RvbS9zcF9jb21tdW5pY2F0ZS5jIGIvc3Vwd2lzZG9tL3NwX2NvbW11bmljYXRlLmMKaW5kZXggN2UzYWM2OS4uYzg2NjkwYSAxMDA2NDQKLS0tIGEvc3Vwd2lzZG9tL3NwX2NvbW11bmljYXRlLmMKKysrIGIvc3Vwd2lzZG9tL3NwX2NvbW11bmljYXRlLmMKQEAgLTUsNiArNSw3IEBACiAjaW5jbHVkZSAic3BfZGF0YS5oIgogI2luY2x1ZGUgInNwX21zZ3BhY2suaCIKICNpbmNsdWRlICJzcF9kaXNwbGF5LmgiCisjaW5jbHVkZSAic3BfdXBncmFkZS5oIgogI2luY2x1ZGUgIi4uL3N5c19ody9kcnZfdXNhcnQuaCIKIAogc3RhdGljIHZvaWQgc3BfdXNhcnRfc2VuZChzcF9wb3NfdCogcG9zLCBzcF9wcm90b2NvbF9yZXF1ZXN0X3QqIHJlcSkKQEAgLTc5LDEzICs4MCwyMSBAQAogICB3aGlsZShzaXplLS0gPiAwKQogICB7CiAgICAgc3BfdW5wYWNrX3ZhbHVlKCZ1bnBhY2ssJmZpZWxkKTsKLSAgICBpZihJU19LRVkoUEtfSU5UX1dBVEVSTElNSVQsZmllbGQua2V5KSkKKyAgICBpZihJU19LRVkoUEtfSU5UX1BFUk1JVCwgZmllbGQua2V5KSkKKyAgICB7CisgICAgICBjYXJkLT5wZXJtaXQgPSBmaWVsZC52YWwuaW50dmFsOworICAgIH0KKyAgICBlbHNlIGlmKElTX0tFWShQS19TVFJfTElNSVRNU0csIGZpZWxkLmtleSkpCisgICAgeworICAgICAgTUVNQ1BZKGNhcmQtPmxpbWl0bXNnLCBmaWVsZC52YWwuc3RydmFsLCBmaWVsZC5zdHJsZW4pOworICAgIH0KKyAgICBlbHNlIGlmKElTX0tFWShQS19JTlRfV0FURVJMSU1JVCxmaWVsZC5rZXkpKQogICAgIHsKICAgICAgIGNhcmQtPndhdGVybGltaXQgPSBmaWVsZC52YWwuaW50dmFsOwogICAgIH0KLSAgICBlbHNlIGlmKElTX0tFWShQS19CSU5fQklMTE5PLGZpZWxkLmtleSkpCisgICAgZWxzZSBpZihJU19LRVkoUEtfSU5UX0NPQklMTE5PLGZpZWxkLmtleSkpCiAgICAgewotICAgICAgTUVNQ1BZKGNhcmQtPmJpbGxubywgZmllbGQudmFsLmJpbnZhbCwgZmllbGQuc3RybGVuKTsKKyAgICAgIGNhcmQtPmNvYmlsbG5vID0gZmllbGQudmFsLmludHZhbDsKICAgICB9CiAgICAgZWxzZSBpZihJU19LRVkoUEtfSU5UX0ZFRUFNT1VOVCxmaWVsZC5rZXkpKQogICAgIHsKQEAgLTEyMCw3ICsxMjksNyBAQAogICBjd19wYWNrX21hcF9zaXplKCZwYWNrLDQpOwogCiAgIHNwX3BhY2tfcHV0X2JpbigmcGFjaywgUEtfQklOX0NBUkRQSFlJRCwgY2FyZC0+Y2FyZHBoeWlkLCA0KTsKLSAgc3BfcGFja19wdXRfYmluKCZwYWNrLCBQS19CSU5fQ0lUSVpFTl9DQVJETk8sIGNhcmQtPmNpdGl6ZW5fY2FyZG5vLCAxMik7CisgIHNwX3BhY2tfcHV0X2JpbigmcGFjaywgUEtfQklOX0NJVElaRU5fQ0FSRE5PLCBjYXJkLT5jaXRpemVuX2NhcmRubys4LCA0KTsKICAgc3BfcGFja19wdXRfYmluKCZwYWNrLCBQS19CSU5fREVWUEhZSUQsIHBvcy0+ZGV2cGh5aWQsIDQpOwogICBzcF9wYWNrX3B1dF9iaW4oJnBhY2ssIFBLX0JJTl9ERVZUSU1FLCBjdGltZSwgNik7CiAKQEAgLTIxNCw5ICsyMjMsOSBAQAogICAgIHsKICAgICAgIE1FTUNQWShjYXJkLT5xcmNvZGUucXJjb2RlX3VybCwgZmllbGQudmFsLnN0cnZhbCwgZmllbGQuc3RybGVuKTsKICAgICB9Ci0gICAgZWxzZSBpZihJU19LRVkoUEtfQklOX0JJTExOTywgZmllbGQua2V5KSkKKyAgICBlbHNlIGlmKElTX0tFWShQS19JTlRfQ09CSUxMTk8sIGZpZWxkLmtleSkpCiAgICAgewotICAgICAgTUVNQ1BZKGNhcmQtPmJpbGxubywgZmllbGQudmFsLmJpbnZhbCwgZmllbGQuc3RybGVuKTsKKyAgICAgIGNhcmQtPmNvYmlsbG5vID0gZmllbGQudmFsLmludHZhbDsKICAgICB9CiAgICAgZWxzZSBpZihJU19LRVkoUEtfSU5UX1ZBSUxEVElNRSwgZmllbGQua2V5KSkKICAgICB7CkBAIC0yNjksOSArMjc4LDEzIEBACiAgIHdoaWxlKHNpemUtLSA+IDApCiAgIHsKICAgICBzcF91bnBhY2tfdmFsdWUoJnVucGFjaywmZmllbGQpOwotICAgIGlmKElTX0tFWShQS19CSU5fQklMTE5PLCBmaWVsZC5rZXkpKQorICAgIGlmKElTX0tFWShQS19JTlRfUEVSTUlULCBmaWVsZC5rZXkpKQogICAgIHsKLSAgICAgIE1FTUNQWShjYXJkLT5iaWxsbm8sIGZpZWxkLnZhbC5iaW52YWwsIGZpZWxkLnN0cmxlbik7CisgICAgICBjYXJkLT5wZXJtaXQgPSBmaWVsZC52YWwuaW50dmFsOworICAgIH0KKyAgICBlbHNlIGlmKElTX0tFWShQS19JTlRfQ09CSUxMTk8sIGZpZWxkLmtleSkpCisgICAgeworICAgICAgY2FyZC0+Y29iaWxsbm8gPSBmaWVsZC52YWwuaW50dmFsOwogICAgIH0KICAgICBlbHNlIGlmKElTX0tFWShQS19JTlRfQVVUSFNUQVRVUywgZmllbGQua2V5KSkKICAgICB7CkBAIC0yOTMsNiArMzA2LDEwIEBACiAgICAgewogICAgICAgY2FyZC0+ZmVlcGFyYS5mZWVfdW5pdCA9IGZpZWxkLnZhbC5pbnR2YWw7CiAgICAgfQorICAgIGVsc2UgaWYoSVNfS0VZKFBLX0lOVF9XQVRFUkxJTUlULCBmaWVsZC5rZXkpKQorICAgIHsKKyAgICAgIGNhcmQtPndhdGVybGltaXQgPSBmaWVsZC52YWwuaW50dmFsOworICAgIH0KICAgfQogICByZXR1cm4gcmVzcC5yZXRjb2RlOwogfQpAQCAtMzA5LDcgKzMyNiw3IEBACiAgIGN3X3BhY2tfbWFwX3NpemUoJnBhY2ssIDIpOwogCiAgIHNwX3BhY2tfcHV0X2JpbigmcGFjaywgUEtfQklOX0RFVlBIWUlELCBwb3MtPmRldnBoeWlkLCA0KTsKLSAgc3BfcGFja19wdXRfYmluKCZwYWNrLCBQS19CSU5fQklMTE5PLCBjYXJkLT5iaWxsbm8sIHNpemVvZihjYXJkLT5iaWxsbm8pKTsKKyAgc3BfcGFja19wdXRfaW50KCZwYWNrLCBQS19JTlRfQ09CSUxMTk8sIGNhcmQtPmNvYmlsbG5vKTsKIAogICByZXEuZGF0YWxlbiArPSBzcF9wYWNrX2xlbmd0aCgmcGFjayk7CiAgIHNwX3VzYXJ0X3NlbmQocG9zLCAmcmVxKTsKQEAgLTMxNywxNCArMzM0LDE0IEBACiB9CiAKIC8vwffLrsnPtKsKLXN0YXRpYyB1aW50OCB0cmFuc2R0bF9hY2NvdW50X2JpbExub1sxMF07CitzdGF0aWMgdWludDMyIHRyYW5zZHRsX2FjY291bnRfY29iaWxMbm8gPSAwOwogc3RhdGljIHVpbnQxNiBzcF9hc3luY191cGxvYWRfdHJhbnNkdGwoc3BfcG9zX3QqIHBvcywgc3BfdHJhbnNkdGxfdCogdHJhbnNkdGwpCiB7CiAgIHVpbnQ4IGNyY1syXTsKICAgY3dfcGFja19jb250ZXh0IHBhY2s7CiAgIHNwX3Byb3RvY29sX3JlcXVlc3RfdCByZXE7CiAKLSAgTUVNQ1BZKHRyYW5zZHRsX2FjY291bnRfYmlsTG5vLCB0cmFuc2R0bC0+YmlsbG5vLCBzaXplb2YodHJhbnNkdGwtPmJpbGxubykpOworICB0cmFuc2R0bF9hY2NvdW50X2NvYmlsTG5vID0gdHJhbnNkdGwtPmNvYmlsbG5vOwogICBzcF9wcm90b2NvbF9yZXFfaW5pdCgmcmVxLCBTUF9DTURfVFJBTlNEVExfQUNDT1VOVCk7CiAgIHNwX3BhY2tfaW5pdCgmcGFjayxyZXEuZGF0YSxzaXplb2YocmVxLmRhdGEpKTsKICAgY3dfcGFja19tYXBfc2l6ZSgmcGFjaywxMCk7CkBAIC0zMzIsNyArMzQ5LDcgQEAKICAgc3BfcGFja19wdXRfYmluKCZwYWNrLCBQS19CSU5fREVWUEhZSUQsIHRyYW5zZHRsLT5kZXZwaHlpZCw0KTsKICAgc3BfcGFja19wdXRfYmluKCZwYWNrLCBQS19CSU5fVFJBTlNEQVRFLCB0cmFuc2R0bC0+dHJhbnNkYXRlLDMpOwogICBzcF9wYWNrX3B1dF9iaW4oJnBhY2ssIFBLX0JJTl9UUkFOU1RJTUUsIHRyYW5zZHRsLT50cmFuc3RpbWUsMyk7Ci0gIHNwX3BhY2tfcHV0X2JpbigmcGFjaywgUEtfQklOX0JJTExOTywgdHJhbnNkdGwtPmJpbGxubywgc2l6ZW9mKHRyYW5zZHRsLT5iaWxsbm8pKTsKKyAgc3BfcGFja19wdXRfaW50KCZwYWNrLCBQS19JTlRfQ09CSUxMTk8sIHRyYW5zZHRsLT5jb2JpbGxubyk7CiAgIHNwX3BhY2tfcHV0X2JpbigmcGFjaywgUEtfQklOX0NBUkRQSFlJRCwgdHJhbnNkdGwtPmNhcmRwaHlpZCwKICAgICAgICAgICAgICAgICAgIHNpemVvZih0cmFuc2R0bC0+Y2FyZHBoeWlkKSk7CiAgIHNwX3BhY2tfcHV0X2ludCgmcGFjaywgUEtfSU5UX1RSQU5TV0FZLCB0cmFuc2R0bC0+dHJhbnN3YXkpOwpAQCAtMzYxLDEwICszNzgsOSBAQAogICAgIHdoaWxlKHNpemUtLSA+IDApCiAgICAgewogICAgICAgc3BfdW5wYWNrX3ZhbHVlKCZ1bnBhY2ssJmZpZWxkKTsKLSAgICAgIGlmKElTX0tFWShQS19CSU5fQklMTE5PLGZpZWxkLmtleSkpCisgICAgICBpZihJU19LRVkoUEtfSU5UX0NPQklMTE5PLGZpZWxkLmtleSkpCiAgICAgICB7Ci0gICAgICAgIGlmKE1FTUNNUChmaWVsZC52YWwuYmludmFsLCB0cmFuc2R0bF9hY2NvdW50X2JpbExubywKLSAgICAgICAgICAgICAgICAgIHNpemVvZih0cmFuc2R0bF9hY2NvdW50X2JpbExubykpID09IDApCisgICAgICAgIGlmKGZpZWxkLnZhbC5pbnR2YWwgPT0gdHJhbnNkdGxfYWNjb3VudF9jb2JpbExubykKICAgICAgICAgewogICAgICAgICAgIHBvcy0+dW5jb25maXJtX3RyYW5zZHRsLnRyYW5zYWRkcis9IHNpemVvZihzcF90cmFuc2R0bF90KTsKICAgICAgICAgICBpZihBRERSX1RSQU5TRFRMX0VORCA8PSBwb3MtPnVuY29uZmlybV90cmFuc2R0bC50cmFuc2FkZHIpCkBAIC00MzAsNiArNDQ2LDEzIEBACiAgICAgICAgIGxvZ2luX2ZsYWcgPSAyOwogICAgICAgfQogICAgIH0KKyAgICBlbHNlIGlmKElTX0tFWShQS19TVFJfVVBHUkFERSwgZmllbGQua2V5KSkKKyAgICB7CisgICAgICBpZihNRU1DTVAoInRydWUiLGZpZWxkLnZhbC5zdHJ2YWwsNCkgPT0gMCkKKyAgICAgIHsKKyAgICAgICAgc3BfbWFudWFsX3VwZ3JhZGUocG9zKTsKKyAgICAgIH0KKyAgICB9CiAgIH0KICAgc3Bfc2F2ZV9oZWFydGJlYXRfaW5mbyhwb3MsIGxvZ2luX2ZsYWcpOwogICByZXR1cm4gcmVzcC0+cmV0Y29kZTsKQEAgLTU1MSwxNyArNTc0LDE2IEBACiAgIGlmKHRpY2tlciAtIHBvcy0+bGFzdF9jb21tX3N0YXR1cy5zZW5kdGltZSA+IENPTU1fV0FJVF9USU1FKQogICB7CiAgICAgaWYocG9zLT5kZXZsb2dpbi5sYXN0X2xvZ2luX3RpY2tlciA9PSAwIHx8IHBvcy0+ZGV2bG9naW4ubG9naW5fZmxhZyA9PSAwCi0gICAgICAgIHx8ICh0aWNrZXIgLSBwb3MtPmRldmxvZ2luLmxhc3RfbG9naW5fdGlja2VyKSA+IERFTEFZX1RJTUU2MHMqNjAqMjQpCisgICAgICAgIHx8IHRpY2tlciAtIHBvcy0+ZGV2bG9naW4ubGFzdF9sb2dpbl90aWNrZXIgPiBERUxBWV9USU1FNjBzKjMwKQogICAgIHsKLSAgICAgIHBvcy0+ZGV2bG9naW4ubGFzdF9sb2dpbl90aWNrZXIgPSB0aWNrZXI7Ci0gICAgICBzcF9hc3luY19lcXVpcG1lbnRfbG9naW4ocG9zKTsKKyAgICAgICAgcG9zLT5kZXZsb2dpbi5sYXN0X2xvZ2luX3RpY2tlciA9IHRpY2tlcjsKKyAgICAgICAgc3BfYXN5bmNfZXF1aXBtZW50X2xvZ2luKHBvcyk7CiAgICAgfQotICAgIGVsc2UgaWYodGlja2VyIDwgcG9zLT5oZWFydGJlYXQubGFzdF9oZWFydGJlYXRfdGlja2VyCi0gICAgICAgICAgICB8fCBwb3MtPmhlYXJ0YmVhdC5sYXN0X2hlYXJ0YmVhdF90aWNrZXIgPT0gMAotICAgICAgICAgICAgfHwgKHRpY2tlciAtIHBvcy0+aGVhcnRiZWF0Lmxhc3RfaGVhcnRiZWF0X3RpY2tlcikgPiBERUxBWV9USU1FNjBzKjIpCisgICAgaWYocG9zLT5oZWFydGJlYXQubGFzdF9oZWFydGJlYXRfdGlja2VyID09IDAKKyAgICAgICAgfHwgdGlja2VyIC0gcG9zLT5oZWFydGJlYXQubGFzdF9oZWFydGJlYXRfdGlja2VyID4gREVMQVlfVElNRTYwcykKICAgICB7Ci0gICAgICBwb3MtPmhlYXJ0YmVhdC5sYXN0X2hlYXJ0YmVhdF90aWNrZXIgPSB0aWNrZXI7Ci0gICAgICBzcF9hc3luY19oZWFydGJlYXQocG9zKTsKKyAgICAgICAgcG9zLT5oZWFydGJlYXQubGFzdF9oZWFydGJlYXRfdGlja2VyID0gdGlja2VyOworICAgICAgICBzcF9hc3luY19oZWFydGJlYXQocG9zKTsKICAgICB9CiAgICAgZWxzZQogICAgIHsKZGlmZiAtLWdpdCBhL3N1cHdpc2RvbS9zcF9jb21tdW5pY2F0ZS5oIGIvc3Vwd2lzZG9tL3NwX2NvbW11bmljYXRlLmgKaW5kZXggYjhkYWY3Ny4uMzI1OGVmZiAxMDA2NDQKLS0tIGEvc3Vwd2lzZG9tL3NwX2NvbW11bmljYXRlLmgKKysrIGIvc3Vwd2lzZG9tL3NwX2NvbW11bmljYXRlLmgKQEAgLTY0LDcgKzY0LDcgQEAKICNkZWZpbmUgUEtfSU5UX1dBVEVSU1RBVFVTICAJCSIxIgogI2RlZmluZSBQS19JTlRfV0FURVJNVUNIICAJCQkiMiIKIAotI2RlZmluZSBQS19CSU5fQklMTE5PIAkJCQkiMyIKKyNkZWZpbmUgUEtfSU5UX0NPQklMTE5PIAkJCSIzIgogI2RlZmluZSBQS19JTlRfVFJBTlNXQVkgCQkJIjQiCiAjZGVmaW5lIFBLX0lOVF9VTlRSQU5TQ09OU1QgCQkiNSIKICNkZWZpbmUgUEtfQklOX0RFVklDRUtFWSAJCQkiNiIKQEAgLTc5LDYgKzc5LDggQEAKICNkZWZpbmUgUEtfSU5UX0FVVEhTVEFUVVMJCQkiMTUiCiAjZGVmaW5lIFBLX0lOVF9QQVlTVEFUVVMJCQkiMTYiCiAjZGVmaW5lIFBLX0lOVF9GRUVTVEFSVAkJCQkiMTciCisjZGVmaW5lIFBLX0lOVF9QRVJNSVQJCQkJIjE4IgorI2RlZmluZSBQS19TVFJfTElNSVRNU0cJCQkJIjE5IgogCiAjZGVmaW5lIFNQX0NNRF9VUEdSQURFIDB4MjAgICAgICAgICAJLy/U2s/fyf28tgogI2RlZmluZSBTUF9DTURfVFJBTlNEVExfQUNDT1VOVCAweDIyICAgIC8vvMfVy8H3y64KZGlmZiAtLWdpdCBhL3N1cHdpc2RvbS9zcF9jb25maWcuaCBiL3N1cHdpc2RvbS9zcF9jb25maWcuaAppbmRleCA4MWY0MTQwLi45NDhlODZhIDEwMDY0NAotLS0gYS9zdXB3aXNkb20vc3BfY29uZmlnLmgKKysrIGIvc3Vwd2lzZG9tL3NwX2NvbmZpZy5oCkBAIC0xMDEsMTQgKzEwMSwxNCBAQAogICB1aW50OCBkZXZwaHlpZFs0XTsJLy/J6LG4seC6xQogICB1aW50OCB0cmFuc2RhdGVbM107CS8vWVlERE1NuPHKvcjVxtoKICAgdWludDggdHJhbnN0aW1lWzNdOwotICB1aW50OCBiaWxsbm9bMTBdOwkJLy+9u9LXtqm1pbHgusUKKyAgdWludDMyIGNvYmlsbG5vOwkJLy+9u9LXtqm1pbHgusUKICAgdWludDggY2FyZHBoeWlkWzRdOwkvL7+ozu/A7WlkCiAgIHVpbnQ4IHRyYW5zd2F5OwkJLy+9u9LXt73KvaOsMC2z9cq8o6wxLcuiv6ijrDItyajC6wogICB1aW50OCBhbW91bnQ7CQkJLy/KtbzK1qe4tr3wtu4KICAgdWludDggcGFpZEFtb3VudDsJCS8v0tHWp7i2vfC27qOstbHKx8/Iv9u30cSjyr3PwqOsvMfCvNLR1qe4trXEvfC27gogICB1aW50OCBmbG93c2Vuc29yczsJLy/KtbzKyrnTw7zGwb+jqLWlzrujurDZusHJ/aOpCiAgIHVpbnQ4IHRyYW5zdGF0dXM7CQkvL8H3y67XtMyso6wwLbP1yryjrDEts8m5pqOsMi3Kp7DcCi0gIHVpbnQ4IHJldmVyc2VbMV07CQkvL9W8zru3+worICB1aW50OCByZXZlcnNlWzddOwkJLy/VvM67t/sKICAgdWludDggY3JjWzJdOyAJCS8vbGVuPTMyCiB9IHNwX3RyYW5zZHRsX3Q7CiAKQEAgLTIwMSw3ICsyMDEsNyBAQAogICB1aW50OCBsaW5rX3N0YXQ7CQkJLy8wLS3BtMK3uaTX99bQo6wxLS0twbTCt7/J08MKICAgdWludDggbG9hZF9wYXJhX3N0YXR1czsJLy8wLS3V/bOjo6whMC0ttO3O8wogICB1aW50OCBkZXZpY2VubzsKLSAgdWludDggbG9jYWxfZGV2aWNlbm87CQkKKyAgdWludDggbG9jYWxfZGV2aWNlbm87CiAgIHVpbnQ4IGRldnBoeWlkWzRdOwogCiAgIHNwX2NhcmRzdGF0ZV90IGNhcmRTdGF0ZTsKQEAgLTIzMyw3ICsyMzMsOSBAQAogICB1aW50OCBleHBpcmVkYXRlWzRdOwogCiAgIHVpbnQ4IHdhdGVybGltaXQ7CQkvL7WltM6z9suuyc/P3qOoMTAwbWyjqQotICB1aW50OCBiaWxsbm9bMTBdOwkJLy+9u9LXtqm1pbHgusUsQkNEwusKKyAgdWludDMyIGNvYmlsbG5vOwkJLy+9u9LXtqm1pbHgusUsQkNEwusKKyAgdWludDgJcGVybWl0OwkJCS8vyse38dTK0O3P+7fRo6wwLdTK0O2jrDEtsrvUytDtCisgIHVpbnQ4IGxpbWl0bXNnWzQ1XTsJCS8vz97Wxs/7t9HQxc+iCiAgIHNwX3FyY29kZV90IHFyY29kZTsJLy+2/s6swusKICAgc3BfZmVlcGFyYV90IGZlZXBhcmE7CiB9IHNwX2NhcmRfdDsKZGlmZiAtLWdpdCBhL3N1cHdpc2RvbS9zcF9jb25zdGFudC5oIGIvc3Vwd2lzZG9tL3NwX2NvbnN0YW50LmgKaW5kZXggMzA4MWZjMC4uYTdkZDk1YiAxMDA2NDQKLS0tIGEvc3Vwd2lzZG9tL3NwX2NvbnN0YW50LmgKKysrIGIvc3Vwd2lzZG9tL3NwX2NvbnN0YW50LmgKQEAgLTU0LDUgKzU0LDcgQEAKICNkZWZpbmUgU1RBVFVTX0tFRVBPUEVOCQkJCQkxCS8vs6O/qr+oCiAjZGVmaW5lIFNUQVRVU19DTE9TRUQJCQkJCTAJLy/Ioc/7s6O/qr+oCiAKKyNkZWZpbmUgUkNfTElNSVRfQ09OU1VNUFRJT04JCQk3MAkvL8/e1sbP+7fRCisKICNlbmRpZgogCmRpZmYgLS1naXQgYS9zdXB3aXNkb20vc3BfY29uc3VtZS5jIGIvc3Vwd2lzZG9tL3NwX2NvbnN1bWUuYwppbmRleCA1ODdlMmE0Li43MzdiMjVhIDEwMDY0NAotLS0gYS9zdXB3aXNkb20vc3BfY29uc3VtZS5jCisrKyBiL3N1cHdpc2RvbS9zcF9jb25zdW1lLmMKQEAgLTMyLDggKzMyLDggQEAKICAgICBwb3MtPnB1cmNoYXNlLnVzZWRfbnVtID0gMDsKICAgICByZXR1cm4gMDsKICAgfQotICAvL3VzZWRjb3VudCA9IHNwX2Zsb3dzZW5zb3JfZ2V0X2NvdW50KCkvcG9zLT5zeXNjb25mLmZsb3dzZW5zb3JfdWludDsKLSAgdXNlZGNvdW50ID0gY291bnQvcG9zLT5zeXNjb25mLmZsb3dzZW5zb3JfdW5pdDsKKyAgdXNlZGNvdW50ID0gc3BfZmxvd3NlbnNvcl9nZXRfY291bnQoKS9wb3MtPnN5c2NvbmYuZmxvd3NlbnNvcl91bml0OworICAvL3VzZWRjb3VudCA9IGNvdW50L3Bvcy0+c3lzY29uZi5mbG93c2Vuc29yX3VuaXQ7CiAgIGNvdW50Kys7CiAgIGlmKHVzZWRjb3VudCA8IHBvcy0+cHVyY2hhc2UucGFpZF9udW0pCiAgIHsKQEAgLTI0MCwxMiArMjQwLDYgQEAKICAgICByZXQgPSBSQ19DQVJEX0lOVkFMSUQ7CiAgICAgcmV0dXJuIHJldDsKICAgfQotICByZXQgPSBzcF9jYXJkX2F1dGhlbnRpY2F0aW9uKHBvcywgY2FyZCk7Ci0gIGlmKHJldCkKLSAgewotICAgIHJldCA9IFJDX0NBUkRfQVVUSEVOVElDQVRJT047Ci0gICAgcmV0dXJuIHJldDsKLSAgfQogICBpZihwb3MtPmxvYWRfcGFyYV9zdGF0dXMpCiAgIHsKICAgICByZXR1cm4gcG9zLT5sb2FkX3BhcmFfc3RhdHVzOwpAQCAtMjY2LDYgKzI2MCwxMiBAQAogICB7CiAgICAgcmV0dXJuIHJldDsKICAgfQorICByZXQgPSBzcF9jYXJkX2F1dGhlbnRpY2F0aW9uKHBvcywgY2FyZCk7CisgIGlmKHJldCkKKyAgeworICAgIHJldCA9IFJDX0NBUkRfQVVUSEVOVElDQVRJT047CisgICAgcmV0dXJuIHJldDsKKyAgfQogICByZXQgPSBzcF9wcmVwYXJlX2JlaGFsZl90cmFuc2R0bChwb3MsIGNhcmQsICZyZWNvcmQpOwogICBpZihyZXQpCiAgIHsKQEAgLTI4NiwyNSArMjg2LDEwIEBACiAgIHJldHVybiAwOwogfQogCi1zdGF0aWMgdWludDE2IGRvX3dvcmtfY2hlY2soY29uc3Qgc3BfcG9zX3QqIHBvcykKLXsKLSAgLy/F0LbPz/u30b3wtu7I57n7tPPT2jIwu/LV38Gs0PjP+7fRs6y5/TLQocqxo6zU8s2j1rmz9suuCi0gIGlmKHBvcy0+cHVyY2hhc2UudXNlZF9udW0gPj0gMTAwMCB8fCBwb3MtPnB1cmNoYXNlLnBhaWRfc3VtID49IDEwMDApCi0gIHsKLSAgICByZXR1cm4gUkNfQ0FSRF9USU1FT1VUOwotICB9Ci0gIHJldHVybiAwOwotfQotCiBzdGF0aWMgdWludDE2IGRvX3dvcmsoc3BfcG9zX3QqIHBvcywgc3BfY2FyZF90KiBjYXJkKQogewogICB1aW50MTYgcmV0ID0gMDsKICAgc3BfdmFsdmVfb24oKTsKLSAgcmV0ID0gZG9fd29ya19jaGVjayhwb3MpOwotICBpZihyZXQpCi0gIHsKLSAgICByZXR1cm4gcmV0OwotICB9CiAgIC8vvMbL48/7t9G98LbuCiAgIHJldCA9IHNwX2NhbGNfcGF5YW10X2J5X2Zsb3dzZW5zb3IocG9zLCBjYXJkKTsKICAgaWYocmV0KQpAQCAtNDY4LDcgKzQ1Myw3IEBACiAgICAgY2FyZFdvcmtTdGF0ZS0+Y3VycmVudF9zdGF0ZSA9IENBUkRXT1JLU1RBVFVTX1NUT1BQRUQ7CiAgICAgYnJlYWs7CiAgIGNhc2UgQ0FSRFdPUktTVEFUVVNfU1RPUFBFRDoKLSAgICBjYXJkV29ya1N0YXRlLT5jdXJyZW50X3N0YXRlID0gQ0FSRFdPUktTVEFUVVNfTk9ORTsKKyAgICBkaXNwX2hpbnRfaW5mbyhwb3MsICLH67DOv6giLCBERUxBWV9USU1FMnMpOwogICAgIGJyZWFrOwogICBjYXNlIENBUkRXT1JLU1RBVFVTX0ZFRUNBUkRfV09SS0lORzoKICAgICBpZihNRU1DTVAocG9zLT5jYXJkU3RhdGUuc25yLCBjYXJkLT5jYXJkcGh5aWQsIDQpICE9IDApCkBAIC00NzYsMTEgKzQ2MSw5IEBACiAgICAgICBjYXJkV29ya1N0YXRlLT5jdXJyZW50X3N0YXRlID0gQ0FSRFdPUktTVEFUVVNfTk9ORTsKICAgICAgIGJyZWFrOwogICAgIH0KLSAgICAvL3Nob3dfbWVudV9vcHRpb25zKCk7CiAgICAgYnJlYWs7CiAgIGNhc2UgQ0FSRFdPUktTVEFUVVNfRVJST1I6CiAgICAgZG9fZXJyb3IocG9zLCBjYXJkV29ya1N0YXRlLT5lcnJjb2RlKTsKLSAgICBjYXJkV29ya1N0YXRlLT5jdXJyZW50X3N0YXRlID0gQ0FSRFdPUktTVEFUVVNfTk9ORTsKICAgICBicmVhazsKICAgZGVmYXVsdDoKICAgICBEZWxheV9tcyhERUxBWV9USU1FMjAwbXMpOwpAQCAtNTkwLDMwICs1NzMsMzEgQEAKICAgdWludDgga2V5Y29kZSA9IFNQX0tFWV9OT05FOwogICBrZXljb2RlID0gc3BfZ2V0X2tleSgpOwogICAvL9Tav6jP+7fR1N3No8fpv/bPwrC0yM7S4rz8zqq94cr4tbHHsM/7t9HXtMysCi0gIGlmKGtleWNvZGUgPj0gU1BfS0VZXzAgJiYga2V5Y29kZSA8PSBTUF9LRVlfRU5URVIgJiYgcG9zLT5jYXJkU3RhdGUuY3VyX3N0YXRlID09IFNUQVRFX05PTkUKKyAgaWYoa2V5Y29kZSA+PSBTUF9LRVlfMCAmJiBrZXljb2RlIDw9IFNQX0tFWV9FTlRFUgorICAgICAgJiYgcG9zLT5jYXJkU3RhdGUuY3VyX3N0YXRlID09IFNUQVRFX05PTkUKICAgICAgICYmIGNhcmRXb3JrU3RhdGUtPmN1cnJlbnRfc3RhdGUgPT0gQ0FSRFdPUktTVEFUVVNfUEFVU0UgJiYgcG9zLT5wYXltb2RlID09IFBBWU1PREVfQ0FSRCkKICAgewotICAJY2FyZFdvcmtTdGF0ZS0+Y3VycmVudF9zdGF0ZSA9IENBUkRXT1JLU1RBVFVTX1NUT1BQSU5HOwotCXJldHVybjsKKyAgICBjYXJkV29ya1N0YXRlLT5jdXJyZW50X3N0YXRlID0gQ0FSRFdPUktTVEFUVVNfU1RPUFBJTkc7CisgICAgcmV0dXJuOwogICB9CiAgIC8vz/u30cSjyr2z9cq8u6/XtMysz8KwtMi3yM+8/NGh1PG2/s6swuvP+7fRCiAgIGlmKChrZXljb2RlID09IFNQX0tFWV9FTlRFUikgJiYgKHBvcy0+cGF5bW9kZSA9PSBQQVlNT0RFX0lOSVQpKQogICB7CiAgICAgY2FyZFdvcmtTdGF0ZS0+Y3VycmVudF9zdGF0ZSA9IENBUkRXT1JLU1RBVFVTX05PTkU7CiAgICAgcG9zLT5wYXltb2RlID0gUEFZTU9ERV9RUkNPREU7Ci0JcmV0dXJuOworICAgIHJldHVybjsKICAgfQogICAvL7b+zqzC68Sjyr3PwrC0yKHP+7z8zqrNo9a5uaTX9wogICBpZigocG9zLT5wYXltb2RlID09IFBBWU1PREVfUVJDT0RFKSAmJiAoa2V5Y29kZSA9PSBTUF9LRVlfQ0xFQVIpKQogICB7CiAgICAgY2FyZFdvcmtTdGF0ZS0+Y3VycmVudF9zdGF0ZSA9IENBUkRXT1JLU1RBVFVTX1NUT1BQSU5HOwotCXJldHVybjsKKyAgICByZXR1cm47CiAgIH0KICAgLy+wtDC8/L34yOvJ6LG4stnX973nw+YKICAgaWYoa2V5Y29kZSA9PSBTUF9LRVlfMCAmJiAocG9zLT5wYXltb2RlID09IFBBWU1PREVfSU5JVCkpCiAgIHsKICAgICBjYXJkV29ya1N0YXRlLT5jdXJyZW50X3N0YXRlID0gQ0FSRFdPUktTVEFUVVNfU0VUX0RFVjsKLQlyZXR1cm47CisgICAgcmV0dXJuOwogICB9CiB9CiAKQEAgLTY1NiwxOSArNjQwLDI3IEBACiAgICAgYnJlYWs7CiAgIGNhc2UgQ0FSRFdPUktTVEFUVVNfUkVBRFk6CiAgICAgQ0FSRC5xcmNvZGUubm93dGltZSA9IHNwX2dldF90aWNrZXIoKTsKLSAgICBpZigoQ0FSRC5xcmNvZGUubm93dGltZSAtIENBUkQucXJjb2RlLnN0YXJ0dGltZSkgPiBDQVJELnFyY29kZS52YWxpZHRpbWUpCisgICAgaWYoKENBUkQucXJjb2RlLm5vd3RpbWUgLSBDQVJELnFyY29kZS5zdGFydHRpbWUpIDwgQ0FSRC5xcmNvZGUudmFsaWR0aW1lKkRFTEFZX1RJTUUxcykKICAgICB7CiAgICAgICBzaG93X2hvbWUocG9zKTsKICAgICAgIHNob3dfaG9tZV9xcmNvZGUoQ0FSRC5xcmNvZGUucXJjb2RlX3VybCk7Ci0gICAgICBpZihDQVJELnFyY29kZS5ub3d0aW1lIC0gdGljayA+IERFTEFZX1RJTUUzcykKKyAgICAgIGlmKENBUkQucXJjb2RlLm5vd3RpbWUgLSB0aWNrID4gREVMQVlfVElNRTJzKQogICAgICAgewogICAgICAgICB0aWNrID0gQ0FSRC5xcmNvZGUubm93dGltZTsKICAgICAgICAgcmV0ID0gc3BfcXJjb2RlX3F1ZXJ5KHBvcywgJkNBUkQpOwogICAgICAgICBpZighcmV0ICYmIENBUkQucXJjb2RlLmF1dGhzdGF0dXMpCiAgICAgICAgIHsKLSAgICAgICAgICBkb19zdGFydChwb3MpOwotICAgICAgICAgIGNhcmRXb3JrU3RhdGUtPmxhc3Rfc3RhdGUgPSBjYXJkV29ya1N0YXRlLT5jdXJyZW50X3N0YXRlOwotICAgICAgICAgIGNhcmRXb3JrU3RhdGUtPmN1cnJlbnRfc3RhdGUgPSBDQVJEV09SS1NUQVRVU19XT1JLSU5HOworICAgICAgICAgIGlmKENBUkQucGVybWl0KQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhcmRXb3JrU3RhdGUtPmVycmNvZGUgPSBSQ19MSU1JVF9DT05TVU1QVElPTjsKKyAgICAgICAgICAgIGNhcmRXb3JrU3RhdGUtPmN1cnJlbnRfc3RhdGUgPSBDQVJEV09SS1NUQVRVU19FUlJPUjsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGRvX3N0YXJ0KHBvcyk7CisgICAgICAgICAgICBjYXJkV29ya1N0YXRlLT5sYXN0X3N0YXRlID0gY2FyZFdvcmtTdGF0ZS0+Y3VycmVudF9zdGF0ZTsKKyAgICAgICAgICAgIGNhcmRXb3JrU3RhdGUtPmN1cnJlbnRfc3RhdGUgPSBDQVJEV09SS1NUQVRVU19XT1JLSU5HOworICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgfQogICAgIH0KQEAgLTY5MSw2ICs2ODMsMTEgQEAKICAgICAgIGNhcmRXb3JrU3RhdGUtPmN1cnJlbnRfc3RhdGUgPSBDQVJEV09SS1NUQVRVU19FUlJPUjsKICAgICAgIGJyZWFrOwogICAgIH0KKyAgICBpZihwb3MtPnB1cmNoYXNlLnBhaWRfbnVtID4gQ0FSRC53YXRlcmxpbWl0KQorICAgIHsKKyAgICAgIGRpc3BfaGludF9pbmZvKHBvcywgItLRtO+1pbTOs/bLrsnPz94iLCBERUxBWV9USU1FMnMpOworICAgICAgY2FyZFdvcmtTdGF0ZS0+Y3VycmVudF9zdGF0ZSA9IENBUkRXT1JLU1RBVFVTX1NUT1BQSU5HOworICAgIH0KICAgICBjYXJkV29ya1N0YXRlLT5sYXN0X3N0YXRlID0gY2FyZFdvcmtTdGF0ZS0+Y3VycmVudF9zdGF0ZTsKICAgICBjYXJkV29ya1N0YXRlLT5wYXVzZV90aWNrID0gc3BfZ2V0X3RpY2tlcigpOwogICAgIGJyZWFrOwpkaWZmIC0tZ2l0IGEvc3Vwd2lzZG9tL3NwX2RhdGEuYyBiL3N1cHdpc2RvbS9zcF9kYXRhLmMKaW5kZXggMDIwYjQ3Ni4uYTZiYWQ0NSAxMDA2NDQKLS0tIGEvc3Vwd2lzZG9tL3NwX2RhdGEuYworKysgYi9zdXB3aXNkb20vc3BfZGF0YS5jCkBAIC00LDggKzQsOCBAQAogI2luY2x1ZGUgInNwX2NvbnN0YW50LmgiCiAjaW5jbHVkZSAic3BfZGlzcGxheS5oIgogCi0jZGVmaW5lIHJlY29yZF9iZWhhbGZfbGVuIDI1Ci0jZGVmaW5lIHJlY29yZF9iZWxvd19sZW4gNworI2RlZmluZSByZWNvcmRfYmVoYWxmX2xlbiAxOQorI2RlZmluZSByZWNvcmRfYmVsb3dfbGVuIDEzCiAKIC8v0a27t7zHwrzDv9K7scrB98uuvMfCvLXEtdjWtwogc3RhdGljIHVpbnQxNiBzcF93cml0ZV9sYXN0X3JlY29yZChzcF9wb3NfdCogcG9zKQpAQCAtODMsNyArODMsNyBAQAogICBtZW1jcHkocmVjb3JkLT5kZXZwaHlpZCwgcG9zLT5kZXZwaHlpZCwgc2l6ZW9mKHBvcy0+ZGV2cGh5aWQpKTsKICAgbWVtY3B5KHJlY29yZC0+dHJhbnNkYXRlLCBjdGltZSwgMyk7CiAgIG1lbWNweShyZWNvcmQtPnRyYW5zdGltZSwgY3RpbWUrMywgMyk7Ci0gIG1lbWNweShyZWNvcmQtPmJpbGxubywgY2FyZC0+YmlsbG5vLCBzaXplb2YoY2FyZC0+YmlsbG5vKSk7CisgIHJlY29yZC0+Y29iaWxsbm8gPSBjYXJkLT5jb2JpbGxubzsKICAgbWVtY3B5KHJlY29yZC0+Y2FyZHBoeWlkLCBjYXJkLT5jYXJkcGh5aWQsIHNpemVvZihjYXJkLT5jYXJkcGh5aWQpKTsKICAgaWYocG9zLT5wYXltb2RlID09IFBBWU1PREVfUVJDT0RFKQogICB7CmRpZmYgLS1naXQgYS9zdXB3aXNkb20vc3BfZGlzcGxheS5jIGIvc3Vwd2lzZG9tL3NwX2Rpc3BsYXkuYwppbmRleCBmYjA0MTdjLi44NjBhNDUxIDEwMDY0NAotLS0gYS9zdXB3aXNkb20vc3BfZGlzcGxheS5jCisrKyBiL3N1cHdpc2RvbS9zcF9kaXNwbGF5LmMKQEAgLTEwMSwxNSArMTAxLDYgQEAKICAgewogICAgIE1FTUNQWShsYXN0X2N0aW1lLGN0aW1lLDYpOwogICAgIGRpc3BfaGludF9pbmZvX3R3byhwb3MsIkaw5rG+IixQUk9fVkVSU0lPTiwwKTsKLQkvKgotICAgIGlmKHBvcy0+c3lzY29uZi5yZWdpc3Rlcl9mbGFnKQotICAgIHsKLSAgICAgIGlmKHBvcy0+ZHluYW1pYy53c19jbGllbnRfc3RhdCkKLSAgICAgIHsKLSAgICAgICAgc2hvd19ob21lX3FyY29kZShwb3MtPmR5bmFtaWMucXJjb2RlX3VybCk7Ci0gICAgICB9Ci0gICAgfQotCSovCiAgIH0KIH0KIApAQCAtMTcxLDEyMCArMTYyLDEyNCBAQAogICBzd2l0Y2goZXJyY29kZSkKICAgewogICBjYXNlIFJDX1BTQU1fRVJSOgotICAgIHNwcmludGYobXNnLCIlcyIsICJTQU24tM67yqew3CIpOworICAgIHNwcmludGYobXNnLCAiJXMiLCAiU0FNuLTOu8qnsNwiKTsKICAgICBicmVhazsKICAgY2FzZSBSQ19DQVJEX0xPR0lOOgotICAgIHNwcmludGYobXNnLCIlcyIsICLR6dakw9jUv8qnsNwiKTsKKyAgICBzcHJpbnRmKG1zZywgIiVzIiwgItHp1qTD2NS/yqew3CIpOwogICAgIGJyZWFrOwogICBjYXNlIFJDX0NBUkRfUkVBRDoKLSAgICBzcHJpbnRmKG1zZywiJXMiLCAitsG/qMqnsNwiKTsKKyAgICBzcHJpbnRmKG1zZywgIiVzIiwgIrbBv6jKp7DcIik7CiAgICAgYnJlYWs7CiAgIGNhc2UgUkNfQ0FSRF9XUklURToKLSAgICBzcHJpbnRmKG1zZywiJXMiLCAi0LS/qMqnsNwiKTsKKyAgICBzcHJpbnRmKG1zZywgIiVzIiwgItC0v6jKp7DcIik7CiAgICAgYnJlYWs7CiAgIGNhc2UgUkNfRkxBU0hfRVJSOgotICAgIHNwcmludGYobXNnLCIlcyIsICJGTEFTSNLss6MiKTsKKyAgICBzcHJpbnRmKG1zZywgIiVzIiwgIkZMQVNI0uyzoyIpOwogICAgIGJyZWFrOwogICBjYXNlIFJDX0hBUkRXQVJFX0VSUjoKLSAgICBzcHJpbnRmKG1zZywiJXMiLCAiucy8/tLss6MiKTsKKyAgICBzcHJpbnRmKG1zZywgIiVzIiwgIrnMvP7S7LOjIik7CiAgICAgYnJlYWs7CiAgIGNhc2UgUkNfRkxBU0hfTk9fUklHSFQ6Ci0gICAgc3ByaW50Zihtc2csIiVzIiwgIkZMQVNIz97WxiIpOworICAgIHNwcmludGYobXNnLCAiJXMiLCAiRkxBU0jP3tbGIik7CiAgICAgYnJlYWs7CiAgIGNhc2UgUkNfQ0FSRF9OT1JJR0hUOgotICAgIHNwcmludGYobXNnLCIlcyIsICK/qM7eyKjP3iIpOworICAgIHNwcmludGYobXNnLCAiJXMiLCAiv6jO3sioz94iKTsKICAgICBicmVhazsKICAgY2FzZSBSQ19DQVJEX0VYUElSRUQ6Ci0gICAgc3ByaW50Zihtc2csIiVzIiwgIr+o0tG5/cbaIik7CisgICAgc3ByaW50Zihtc2csICIlcyIsICK/qNLRuf3G2iIpOwogICAgIGJyZWFrOwogICBjYXNlIFJDX0NBUkRfTE9TVDoKLSAgICBzcHJpbnRmKG1zZywiJXMiLCAiv6jS0cv4tqgiKTsKKyAgICBzcHJpbnRmKG1zZywgIiVzIiwgIr+o0tHL+LaoIik7CiAgICAgYnJlYWs7CiAgIGNhc2UgUkNfQ0FSRE5PX0VYQ0VQVDoKLSAgICBzcHJpbnRmKG1zZywiJXMiLCAiv6jS7LOjIik7CisgICAgc3ByaW50Zihtc2csICIlcyIsICK/qNLss6MiKTsKICAgICBicmVhazsKICAgY2FzZSBSQ19DQVJEX1RJTUVPVVQ6Ci0gICAgc3ByaW50Zihtc2csIiVzIiwgIsq508PMq77DIik7CisgICAgc3ByaW50Zihtc2csICIlcyIsICLKudPDzKu+wyIpOwogICAgIGJyZWFrOwogICBjYXNlIFJDX0NBUkRCQUxfRVhDRVBUOgotICAgIHNwcmludGYobXNnLCIlcyIsICLT4Lbu0uyzoyIpOworICAgIHNwcmludGYobXNnLCAiJXMiLCAi0+C27tLss6MiKTsKICAgICBicmVhazsKICAgY2FzZSBSQ19DQVJEQkFMX0xBQ0s6Ci0gICAgc3ByaW50Zihtc2csIiVzIiwgIsfrwaq7+s/7t9EiKTsKKyAgICBzcHJpbnRmKG1zZywgIiVzIiwgIsfrwaq7+s/7t9EiKTsKICAgICBicmVhazsKICAgY2FzZSBSQ19ERVZQSFlJRF9OT1RTRVQ6Ci0gICAgc3ByaW50Zihtc2csIiVzIiwgIs60yejWw7v6usUiKTsKKyAgICBzcHJpbnRmKG1zZywgIiVzIiwgIs60yejWw7v6usUiKTsKICAgICBicmVhazsKICAgY2FzZSBSQ19GRUVSQVRFX05PVFNFVDoKLSAgICBzcHJpbnRmKG1zZywiJXMiLCAizrTJ6NbDt9HCyiIpOworICAgIHNwcmludGYobXNnLCAiJXMiLCAizrTJ6NbDt9HCyiIpOwogICAgIGJyZWFrOwogICBjYXNlIFJDX0RFVl9PRkZMSU5FX0VSUk9SOgotICAgIHNwcmludGYobXNnLCIlcyIsICLJ6LG4zdG7+syrvsMiKTsKKyAgICBzcHJpbnRmKG1zZywgIiVzIiwgIsnosbjN0bv6zKu+wyIpOwogICAgIGJyZWFrOwogICBjYXNlIFJDX1RSQU5TRFRMX0ZVTEw6Ci0gICAgc3ByaW50Zihtc2csIiVzIiwgIsH3y67S0cL6Iik7CisgICAgc3ByaW50Zihtc2csICIlcyIsICLB98uu0tHC+iIpOwogICAgIGJyZWFrOwogICBjYXNlIFJDX0ZJTEUwOV9DUkNfRVJSOgotICAgIHNwcmludGYobXNnLCIlcyIsICIwOUNSQ7TtzvMiKTsKKyAgICBzcHJpbnRmKG1zZywgIiVzIiwgIjA5Q1JDtO3O8yIpOwogICAgIGJyZWFrOwogICBjYXNlIFJDX0ZJTEUxMF9DUkNfRVJSOgotICAgIHNwcmludGYobXNnLCIlcyIsICIxMENSQ7TtzvMiKTsKKyAgICBzcHJpbnRmKG1zZywgIiVzIiwgIjEwQ1JDtO3O8yIpOwogICAgIGJyZWFrOwogICBjYXNlIFJDX0NBUkRfSU5WQUxJRDoKLSAgICBzcHJpbnRmKG1zZywiJXMiLCAizt7Qp7+oIik7CisgICAgc3ByaW50Zihtc2csICIlcyIsICLO3tCnv6giKTsKICAgICBicmVhazsKICAgY2FzZSBSQ19GRUVOVU1fRVJST1I6Ci0gICAgc3ByaW50Zihtc2csIiVzIiwgIrfRwsq49sr9tO3O8yIpOworICAgIHNwcmludGYobXNnLCAiJXMiLCAit9HCyrj2yv207c7zIik7CiAgICAgYnJlYWs7CiAgIGNhc2UgUkNfTk9UU1VQUE9SVDoKLSAgICBzcHJpbnRmKG1zZywiJXMiLCAisrvWp7PWIik7CisgICAgc3ByaW50Zihtc2csICIlcyIsICKyu9ans9YiKTsKICAgICBicmVhazsKICAgY2FzZSBSQ19OT1RfU0FNRV9DQVJEOgotICAgIHNwcmludGYobXNnLCIlcyIsICKyu82sv6giKTsKKyAgICBzcHJpbnRmKG1zZywgIiVzIiwgIrK7zay/qCIpOwogICAgIGJyZWFrOwogICBjYXNlIFJDX01PREVfTk9UX1NVUFBPUlQ6Ci0gICAgc3ByaW50Zihtc2csIiVzIiwgIsSjyr2yu9ans9YiKTsKKyAgICBzcHJpbnRmKG1zZywgIiVzIiwgIsSjyr2yu9ans9YiKTsKICAgICBicmVhazsKICAgY2FzZSBSQ19VUERQUk9HX0VSUjoKLSAgICBzcHJpbnRmKG1zZywiJXMiLCAiyf28tsqnsNwiKTsKKyAgICBzcHJpbnRmKG1zZywgIiVzIiwgIsn9vLbKp7DcIik7CiAgICAgYnJlYWs7CiAgIGNhc2UgUkNfQ09ORlBBUkFfQ1JDX0VSUjoKLSAgICBzcHJpbnRmKG1zZywiJXMiLCAixeTWw0NSQ7TtzvMiKTsKKyAgICBzcHJpbnRmKG1zZywgIiVzIiwgIsXk1sNDUkO07c7zIik7CiAgICAgYnJlYWs7CiAgIGNhc2UgUkNfVFJBTlNEVExfTk9fRVJSOgotICAgIHNwcmludGYobXNnLCIlcyIsICLB98uuusXS7LOjIik7CisgICAgc3ByaW50Zihtc2csICIlcyIsICLB98uuusXS7LOjIik7CiAgICAgYnJlYWs7CiAgIGNhc2UgUkNfREVWSUNFTk9fT1VUOgotICAgIHNwcmludGYobXNnLCIlcyIsICK7+rrFuf208yIpOworICAgIHNwcmludGYobXNnLCAiJXMiLCAiu/q6xbn9tPMiKTsKICAgICBicmVhazsKICAgY2FzZSBSQ19RUkNPREVfRkFJTFVSRToKLSAgCXNwcmludGYobXNnLCIlcyIsICK2/s6swuu78cihyqew3CIpOwotCWJyZWFrOworICAgIHNwcmludGYobXNnLCAiJXMiLCAitv7OrMLru/HIocqnsNwiKTsKKyAgICBicmVhazsKICAgY2FzZSBSQ19RUkNPREVfVElNRU9VVDoKLSAgCXNwcmludGYobXNnLCIlcyIsICK2/s6swuuzrMqxIik7Ci0JYnJlYWs7CisgICAgc3ByaW50Zihtc2csICIlcyIsICK2/s6swuuzrMqxIik7CisgICAgYnJlYWs7CiAgIGNhc2UgUkNfUVJDT0RFX1FVRVJZX0ZBSUw6Ci0gIAlzcHJpbnRmKG1zZywiJXMiLCAitv7OrMLryM/WpMqnsNwiKTsKLQlicmVhazsKKyAgICBzcHJpbnRmKG1zZywgIiVzIiwgIrb+zqzC68jP1qTKp7DcIik7CisgICAgYnJlYWs7CiAgIGNhc2UgUkNfREVWX05PVF9MT0dJTjoKLSAgCXNwcmludGYobXNnLCIlcyIsICLJ6LG4zrTHqbW9Iik7Ci0JYnJlYWs7CisgICAgc3ByaW50Zihtc2csICIlcyIsICLJ6LG4zrTHqbW9Iik7CisgICAgYnJlYWs7CiAgIGNhc2UgUkNfREVWX0ZBVUxUOgotICAJc3ByaW50Zihtc2csIiVzIiwgIsnosbjSycvGucrVzyIpOwotCWJyZWFrOworICAgIHNwcmludGYobXNnLCAiJXMiLCAiyeixuNLJy8a5ytXPIik7CisgICAgYnJlYWs7CiAgIGNhc2UgUkNfREVWX05PU0VUX0ZMT1dTRU5TT1JfVU5JVDoKLSAgCXNwcmludGYobXNnLCIlcyIsICLB98G/vMbL47WlzrvOtMno1sMiKTsKLQlicmVhazsKKyAgICBzcHJpbnRmKG1zZywgIiVzIiwgIsH3wb+8xsvjtaXOu860yejWwyIpOworICAgIGJyZWFrOwogICBjYXNlIFJDX0NBUkRfQVVUSEVOVElDQVRJT046Ci0gIAlzcHJpbnRmKG1zZywiJXMiLCAiv6jIz9akyqew3CIpOwotCWJyZWFrOworICAgIHNwcmludGYobXNnLCAiJXMiLCAiv6jIz9akyqew3CIpOworICAgIGJyZWFrOworICBjYXNlIFJDX0xJTUlUX0NPTlNVTVBUSU9OOgorICAgIHNwcmludGYobXNnLCAiJXMiLCAiuMPTw7unsbvP3tbGz/u30SIpOworICAgIGJyZWFrOwogICBkZWZhdWx0OgogICAgIHNwcmludGYobXNnLCK07c7zwus9MHglMDR4IixlcnJjb2RlKTsKICAgfQogICBkaXNwX2hpbnRfaW5mb190d28ocG9zLGhpbnQsbXNnLERFTEFZX1RJTUUzcyk7CiB9CiAKLXZvaWQgZGlzcF9oaW50X2luZm9fdGhyZWUoc3BfcG9zX3QqIHBvcyxjb25zdCBjaGFyKiBtc2cxLGNvbnN0IGNoYXIqIG1zZzIsY29uc3QgY2hhciogbXNnMyx1aW50MzIgbXMpCit2b2lkIGRpc3BfaGludF9pbmZvX3RocmVlKHNwX3Bvc190KiBwb3MsY29uc3QgY2hhciogbXNnMSxjb25zdCBjaGFyKiBtc2cyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBtc2czLHVpbnQzMiBtcykKIHsKICAgc2hvd190aXRsZSgpOwogICBzaG93X2JvdHRvbShwb3MpOwo=