LyoKICogcHRocmVhZCBlbXVsYXRpb24gZm9yIHJlLWVudHJhbnQgbGliY3MKICoKICogV2UgY2FuJ3QgdXNlIHB0aHJlYWRzIGRpcmVjdGx5LCBzbyB3aHkgbm90IGxldCBsaWJjcwogKiB0aGF0IHdhbnQgcHRocmVhZHMgdXNlIFdpbmUncyBvd24gdGhyZWFkaW5nIGluc3RlYWQuLi4KICoKICogQ29weXJpZ2h0IDE5OTkgT3ZlIEvldmVuCiAqIENvcHlyaWdodCAyMDAzIEFsZXhhbmRyZSBKdWxsaWFyZAogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICovCgojaW5jbHVkZSAiY29uZmlnLmgiCiNpbmNsdWRlICJ3aW5lL3BvcnQuaCIKCiNpZm5kZWYgSEFWRV9OUFRMCgpzdHJ1Y3QgX3B0aHJlYWRfY2xlYW51cF9idWZmZXI7CgojaW5jbHVkZSA8YXNzZXJ0Lmg+CiNpbmNsdWRlIDxlcnJuby5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxzaWduYWwuaD4KI2luY2x1ZGUgPHNldGptcC5oPgojaWZkZWYgSEFWRV9VTklTVERfSAojIGluY2x1ZGUgPHVuaXN0ZC5oPgojZW5kaWYKI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpZmRlZiBIQVZFX1NZU19TT0NLRVRfSAojIGluY2x1ZGUgPHN5cy9zb2NrZXQuaD4KI2VuZGlmCiNpZmRlZiBIQVZFX1NZU19NTUFOX0gKI2luY2x1ZGUgPHN5cy9tbWFuLmg+CiNlbmRpZgojaWZkZWYgSEFWRV9ORVRJTkVUX0lOX0gKIyBpbmNsdWRlIDxuZXRpbmV0L2luLmg+CiNlbmRpZgojaWZkZWYgSEFWRV9SRVNPTFZfSAojIGluY2x1ZGUgPHJlc29sdi5oPgojZW5kaWYKI2lmZGVmIEhBVkVfVkFMR1JJTkRfTUVNQ0hFQ0tfSAojaW5jbHVkZSA8dmFsZ3JpbmQvbWVtY2hlY2suaD4KI2VuZGlmCgojaW5jbHVkZSAid2luZS9wdGhyZWFkLmgiCgojZGVmaW5lIFBfT1VUUFVUKHN0dWZmKSB3cml0ZSgyLHN0dWZmLHN0cmxlbihzdHVmZikpCgojZGVmaW5lIFBTVFIoc3RyKSBfX0FTTV9OQU1FKCNzdHIpCgpzdGF0aWMgc3RydWN0IHdpbmVfcHRocmVhZF9mdW5jdGlvbnMgZnVuY3M7CgovKiB0aHJlYWQgZGVzY3JpcHRvciAqLwoKI2RlZmluZSBGSVJTVF9LRVkgMAojZGVmaW5lIE1BWF9LRVlTIDE2IC8qIGxpYmM2IGRvZXNuJ3QgdXNlIHRoYXQgbWFueSwgYnV0Li4uICovCiNkZWZpbmUgTUFYX1RTRCAgMTYKCnN0cnVjdCBwdGhyZWFkX2Rlc2NyX3N0cnVjdAp7CiAgICBjaGFyICAgICAgICAgICAgICAgZHVtbXlbMjA0OF07CiAgICBpbnQgICAgICAgICAgICAgICAgdGhyZWFkX2Vycm5vOwogICAgaW50ICAgICAgICAgICAgICAgIHRocmVhZF9oX2Vycm5vOwogICAgaW50ICAgICAgICAgICAgICAgIGNhbmNlbF9zdGF0ZTsKICAgIGludCAgICAgICAgICAgICAgICBjYW5jZWxfdHlwZTsKICAgIHN0cnVjdCBfX3Jlc19zdGF0ZSByZXNfc3RhdGU7CiAgICBjb25zdCB2b2lkICAgICAgICAqa2V5X2RhdGFbTUFYX0tFWVNdOyAgLyogZm9yIG5vcm1hbCBwdGhyZWFkIGtleXMgKi8KICAgIGNvbnN0IHZvaWQgICAgICAgICp0c2RfZGF0YVtNQVhfVFNEXTsgICAvKiBmb3IgbGliYyBpbnRlcm5hbCB0c2QgdmFyaWFibGVzICovCn07Cgp0eXBlZGVmIHN0cnVjdCBwdGhyZWFkX2Rlc2NyX3N0cnVjdCAqcHRocmVhZF9kZXNjcjsKCnN0YXRpYyBzdHJ1Y3QgcHRocmVhZF9kZXNjcl9zdHJ1Y3QgaW5pdGlhbF9kZXNjcjsKCnB0aHJlYWRfZGVzY3IgX19wdGhyZWFkX3RocmVhZF9zZWxmKHZvaWQpCnsKICAgIHN0cnVjdCBwdGhyZWFkX2Rlc2NyX3N0cnVjdCAqZGVzY3I7CiAgICBpZiAoIWZ1bmNzLnB0cl9nZXRfdGhyZWFkX2RhdGEpIHJldHVybiAmaW5pdGlhbF9kZXNjcjsKICAgIGRlc2NyID0gZnVuY3MucHRyX2dldF90aHJlYWRfZGF0YSgpOwogICAgaWYgKCFkZXNjcikgcmV0dXJuICZpbml0aWFsX2Rlc2NyOwogICAgcmV0dXJuIGRlc2NyOwp9CgpzdGF0aWMgaW50ICgqbGliY191c2Vsb2NhbGUpKGludCBzZXQpOwpzdGF0aWMgaW50ICpsaWJjX211bHRpcGxlX3RocmVhZHM7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIF9fZXJybm9fbG9jYXRpb24vX19lcnJvci9fX2Vycm5vL19fX2Vycm5vL19fdGhyX2Vycm5vCiAqCiAqIEdldCB0aGUgcGVyLXRocmVhZCBlcnJubyBsb2NhdGlvbi4KICovCmludCAqX19lcnJub19sb2NhdGlvbih2b2lkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMaW51eCAqLwp7CiAgICBwdGhyZWFkX2Rlc2NyIGRlc2NyID0gX19wdGhyZWFkX3RocmVhZF9zZWxmKCk7CiAgICByZXR1cm4gJmRlc2NyLT50aHJlYWRfZXJybm87Cn0KaW50ICpfX2Vycm9yKHZvaWQpICAgICB7IHJldHVybiBfX2Vycm5vX2xvY2F0aW9uKCk7IH0gIC8qIEZyZWVCU0QgKi8KaW50ICpfX2Vycm5vKHZvaWQpICAgICB7IHJldHVybiBfX2Vycm5vX2xvY2F0aW9uKCk7IH0gIC8qIE5ldEJTRCAqLwppbnQgKl9fX2Vycm5vKHZvaWQpICAgIHsgcmV0dXJuIF9fZXJybm9fbG9jYXRpb24oKTsgfSAgLyogU29sYXJpcyAqLwppbnQgKl9fdGhyX2Vycm5vKHZvaWQpIHsgcmV0dXJuIF9fZXJybm9fbG9jYXRpb24oKTsgfSAgLyogVW5peFdhcmUgKi8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgX19oX2Vycm5vX2xvY2F0aW9uCiAqCiAqIEdldCB0aGUgcGVyLXRocmVhZCBoX2Vycm5vIGxvY2F0aW9uLgogKi8KaW50ICpfX2hfZXJybm9fbG9jYXRpb24odm9pZCkKewogICAgcHRocmVhZF9kZXNjciBkZXNjciA9IF9fcHRocmVhZF90aHJlYWRfc2VsZigpOwogICAgcmV0dXJuICZkZXNjci0+dGhyZWFkX2hfZXJybm87Cn0KCnN0cnVjdCBfX3Jlc19zdGF0ZSAqX19yZXNfc3RhdGUodm9pZCkKewogICAgcHRocmVhZF9kZXNjciBkZXNjciA9IF9fcHRocmVhZF90aHJlYWRfc2VsZigpOwogICAgcmV0dXJuICZkZXNjci0+cmVzX3N0YXRlOwp9CgpzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVqdW1wKCBjb25zdCBjaGFyICpzeW1ib2wsIHZvaWQgKmRlc3QgKQp7CiNpZiBkZWZpbmVkKF9fR0xJQkNfXykgJiYgZGVmaW5lZChfX2kzODZfXykKICAgIHVuc2lnbmVkIGNoYXIgKmFkZHIgPSBkbHN5bSggUlRMRF9ORVhULCBzeW1ib2wgKTsKCiAgICBpZiAoIWFkZHIpIHJldHVybjsKCiAgICAvKiB3cml0ZSBhIHJlbGF0aXZlIGp1bXAgYXQgdGhlIGZ1bmN0aW9uIGFkZHJlc3MgKi8KICAgIG1wcm90ZWN0KCh2b2lkKikoKHVuc2lnbmVkIGludClhZGRyICYgfihnZXRwYWdlc2l6ZSgpLTEpKSwgNSwgUFJPVF9SRUFEfFBST1RfRVhFQ3xQUk9UX1dSSVRFKTsKICAgIGFkZHJbMF0gPSAweGU5OwogICAgKihpbnQgKikoYWRkcisxKSA9ICh1bnNpZ25lZCBjaGFyICopZGVzdCAtIChhZGRyICsgNSk7CiAgICBtcHJvdGVjdCgodm9pZCopKCh1bnNpZ25lZCBpbnQpYWRkciAmIH4oZ2V0cGFnZXNpemUoKS0xKSksIDUsIFBST1RfUkVBRHxQUk9UX0VYRUMpOwoKIyBpZmRlZiBIQVZFX1ZBTEdSSU5EX01FTUNIRUNLX0gKICAgIFZBTEdSSU5EX0RJU0NBUkRfVFJBTlNMQVRJT05TKCBhZGRyLCA1ICk7CiMgZW5kaWYKI2VuZGlmICAvKiBfX0dMSUJDX18gJiYgX19pMzg2X18gKi8KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICB3aW5lX3B0aHJlYWRfaW5pdF9wcm9jZXNzCiAqCiAqIEluaXRpYWxpemF0aW9uIGZvciBhIG5ld2x5IGNyZWF0ZWQgcHJvY2Vzcy4KICovCnZvaWQgd2luZV9wdGhyZWFkX2luaXRfcHJvY2VzcyggY29uc3Qgc3RydWN0IHdpbmVfcHRocmVhZF9mdW5jdGlvbnMgKmZ1bmN0aW9ucyApCnsKICAgIG1lbWNweSggJmZ1bmNzLCBmdW5jdGlvbnMsIHNpemVvZihmdW5jcykgKTsKICAgIGZ1bmNzLnB0cl9zZXRfdGhyZWFkX2RhdGEoICZpbml0aWFsX2Rlc2NyICk7CiAgICBpbml0aWFsX2Rlc2NyLmNhbmNlbF9zdGF0ZSA9IFBUSFJFQURfQ0FOQ0VMX0VOQUJMRTsKICAgIGluaXRpYWxfZGVzY3IuY2FuY2VsX3R5cGUgID0gUFRIUkVBRF9DQU5DRUxfQVNZTkNIUk9OT1VTOwogICAgd3JpdGVqdW1wKCAiX19lcnJub19sb2NhdGlvbiIsIF9fZXJybm9fbG9jYXRpb24gKTsKICAgIHdyaXRlanVtcCggIl9faF9lcnJub19sb2NhdGlvbiIsIF9faF9lcnJub19sb2NhdGlvbiApOwogICAgd3JpdGVqdW1wKCAiX19yZXNfc3RhdGUiLCBfX3Jlc19zdGF0ZSApOwogICAgaWYgKGxpYmNfdXNlbG9jYWxlKSBsaWJjX3VzZWxvY2FsZSggLTEgLypMQ19HTE9CQUxfTE9DQUxFKi8gKTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgd2luZV9wdGhyZWFkX2luaXRfdGhyZWFkCiAqCiAqIEluaXRpYWxpemF0aW9uIGZvciBhIG5ld2x5IGNyZWF0ZWQgdGhyZWFkLgogKi8Kdm9pZCB3aW5lX3B0aHJlYWRfaW5pdF90aHJlYWQodm9pZCkKewogICAgaWYgKGZ1bmNzLnB0cl9zZXRfdGhyZWFkX2RhdGEpCiAgICB7CiAgICAgICAgc3RydWN0IHB0aHJlYWRfZGVzY3Jfc3RydWN0ICpkZXNjciA9IGNhbGxvYyggMSwgc2l6ZW9mKCpkZXNjcikgKTsKCiAgICAgICAgZnVuY3MucHRyX3NldF90aHJlYWRfZGF0YSggZGVzY3IgKTsKICAgICAgICBkZXNjci0+Y2FuY2VsX3N0YXRlID0gUFRIUkVBRF9DQU5DRUxfRU5BQkxFOwogICAgICAgIGRlc2NyLT5jYW5jZWxfdHlwZSAgPSBQVEhSRUFEX0NBTkNFTF9BU1lOQ0hST05PVVM7CiAgICAgICAgaWYgKGxpYmNfbXVsdGlwbGVfdGhyZWFkcykgKmxpYmNfbXVsdGlwbGVfdGhyZWFkcyA9IDE7CiAgICAgICAgaWYgKGxpYmNfdXNlbG9jYWxlKSBsaWJjX3VzZWxvY2FsZSggLTEgLypMQ19HTE9CQUxfTE9DQUxFKi8gKTsKICAgIH0KICAgIC8qIGVsc2UgaXQncyB0aGUgZmlyc3QgdGhyZWFkLCBpbml0IHdpbGwgYmUgZG9uZSBpbiB3aW5lX3B0aHJlYWRfaW5pdF9wcm9jZXNzICovCn0KCgovKiBDdXJyZW50bHkgdGhpcyBwcm9iYWJseSB3b3JrcyBvbmx5IGZvciBnbGliYzIsCiAqIHdoaWNoIGNoZWNrcyBmb3IgdGhlIHByZXNlbmNlIG9mIGRvdWJsZS11bmRlcnNjb3JlLXByZXBlbmRlZAogKiBwdGhyZWFkIHByaW1pdGl2ZXMsIGFuZCB1c2UgdGhlbSBpZiBhdmFpbGFibGUuCiAqIElmIHRoZXkgYXJlIG5vdCBhdmFpbGFibGUsIHRoZSBsaWJjIGRlZmF1bHRzIHRvCiAqIG5vbi10aHJlYWRzYWZlIG9wZXJhdGlvbiAobm90IGdvb2QpLiAqLwoKI2lmIGRlZmluZWQoX19HTElCQ19fKSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKQoKI2lmbmRlZiBfX1VTRV9VTklYOTgKI2RlZmluZSBfX1VTRV9VTklYOTgKI2VuZGlmCgojaW5jbHVkZSA8cHRocmVhZC5oPgoKLyogYWRhcHQgYXMgbmVjZXNzYXJ5IChhIGNvbnN0cnVjdCBsaWtlIHRoaXMgaXMgdXNlZCBpbiBnbGliYyBzb3VyY2VzKSAqLwojZGVmaW5lIHN0cm9uZ19hbGlhcyhvcmlnLCBhbGlhcykgXAogYXNtKCIuZ2xvYmwgIiBQU1RSKGFsaWFzKSAiXG4iIFwKICAgICAiXHQuc2V0ICIgUFNUUihhbGlhcykgIiwiIFBTVFIob3JpZykpCgpzdHJ1Y3QgZm9ya19ibG9jazsKCi8qIHB0aHJlYWQgZnVuY3Rpb25zIHJlZGlyZWN0aW9uICovCgpzdHJ1Y3QgcHRocmVhZF9mdW5jdGlvbnMKewogIHBpZF90ICgqcHRyX3B0aHJlYWRfZm9yaykgKHN0cnVjdCBmb3JrX2Jsb2NrICopOwogIGludCAoKnB0cl9wdGhyZWFkX2F0dHJfZGVzdHJveSkgKHB0aHJlYWRfYXR0cl90ICopOwogIGludCAoKnB0cl9fX3B0aHJlYWRfYXR0cl9pbml0XzJfMCkgKHB0aHJlYWRfYXR0cl90ICopOwogIGludCAoKnB0cl9fX3B0aHJlYWRfYXR0cl9pbml0XzJfMSkgKHB0aHJlYWRfYXR0cl90ICopOwogIGludCAoKnB0cl9wdGhyZWFkX2F0dHJfZ2V0ZGV0YWNoc3RhdGUpIChjb25zdCBwdGhyZWFkX2F0dHJfdCAqLCBpbnQgKik7CiAgaW50ICgqcHRyX3B0aHJlYWRfYXR0cl9zZXRkZXRhY2hzdGF0ZSkgKHB0aHJlYWRfYXR0cl90ICosIGludCk7CiAgaW50ICgqcHRyX3B0aHJlYWRfYXR0cl9nZXRpbmhlcml0c2NoZWQpIChjb25zdCBwdGhyZWFkX2F0dHJfdCAqLCBpbnQgKik7CiAgaW50ICgqcHRyX3B0aHJlYWRfYXR0cl9zZXRpbmhlcml0c2NoZWQpIChwdGhyZWFkX2F0dHJfdCAqLCBpbnQpOwogIGludCAoKnB0cl9wdGhyZWFkX2F0dHJfZ2V0c2NoZWRwYXJhbSkgKGNvbnN0IHB0aHJlYWRfYXR0cl90ICosIHN0cnVjdCBzY2hlZF9wYXJhbSAqKTsKICBpbnQgKCpwdHJfcHRocmVhZF9hdHRyX3NldHNjaGVkcGFyYW0pIChwdGhyZWFkX2F0dHJfdCAqLCBjb25zdCBzdHJ1Y3Qgc2NoZWRfcGFyYW0gKik7CiAgaW50ICgqcHRyX3B0aHJlYWRfYXR0cl9nZXRzY2hlZHBvbGljeSkgKGNvbnN0IHB0aHJlYWRfYXR0cl90ICosIGludCAqKTsKICBpbnQgKCpwdHJfcHRocmVhZF9hdHRyX3NldHNjaGVkcG9saWN5KSAocHRocmVhZF9hdHRyX3QgKiwgaW50KTsKICBpbnQgKCpwdHJfcHRocmVhZF9hdHRyX2dldHNjb3BlKSAoY29uc3QgcHRocmVhZF9hdHRyX3QgKiwgaW50ICopOwogIGludCAoKnB0cl9wdGhyZWFkX2F0dHJfc2V0c2NvcGUpIChwdGhyZWFkX2F0dHJfdCAqLCBpbnQpOwogIGludCAoKnB0cl9wdGhyZWFkX2NvbmRhdHRyX2Rlc3Ryb3kpIChwdGhyZWFkX2NvbmRhdHRyX3QgKik7CiAgaW50ICgqcHRyX3B0aHJlYWRfY29uZGF0dHJfaW5pdCkgKHB0aHJlYWRfY29uZGF0dHJfdCAqKTsKICBpbnQgKCpwdHJfX19wdGhyZWFkX2NvbmRfYnJvYWRjYXN0KSAocHRocmVhZF9jb25kX3QgKik7CiAgaW50ICgqcHRyX19fcHRocmVhZF9jb25kX2Rlc3Ryb3kpIChwdGhyZWFkX2NvbmRfdCAqKTsKICBpbnQgKCpwdHJfX19wdGhyZWFkX2NvbmRfaW5pdCkgKHB0aHJlYWRfY29uZF90ICosIGNvbnN0IHB0aHJlYWRfY29uZGF0dHJfdCAqKTsKICBpbnQgKCpwdHJfX19wdGhyZWFkX2NvbmRfc2lnbmFsKSAocHRocmVhZF9jb25kX3QgKik7CiAgaW50ICgqcHRyX19fcHRocmVhZF9jb25kX3dhaXQpIChwdGhyZWFkX2NvbmRfdCAqLCBwdGhyZWFkX211dGV4X3QgKik7CiAgaW50ICgqcHRyX3B0aHJlYWRfZXF1YWwpIChwdGhyZWFkX3QsIHB0aHJlYWRfdCk7CiAgdm9pZCAoKnB0cl9fX3B0aHJlYWRfZXhpdCkgKHZvaWQgKik7CiAgaW50ICgqcHRyX3B0aHJlYWRfZ2V0c2NoZWRwYXJhbSkgKHB0aHJlYWRfdCwgaW50ICosIHN0cnVjdCBzY2hlZF9wYXJhbSAqKTsKICBpbnQgKCpwdHJfcHRocmVhZF9zZXRzY2hlZHBhcmFtKSAocHRocmVhZF90LCBpbnQsIGNvbnN0IHN0cnVjdCBzY2hlZF9wYXJhbSAqKTsKICBpbnQgKCpwdHJfcHRocmVhZF9tdXRleF9kZXN0cm95KSAocHRocmVhZF9tdXRleF90ICopOwogIGludCAoKnB0cl9wdGhyZWFkX211dGV4X2luaXQpIChwdGhyZWFkX211dGV4X3QgKiwgY29uc3QgcHRocmVhZF9tdXRleGF0dHJfdCAqKTsKICBpbnQgKCpwdHJfcHRocmVhZF9tdXRleF9sb2NrKSAocHRocmVhZF9tdXRleF90ICopOwogIGludCAoKnB0cl9wdGhyZWFkX211dGV4X3RyeWxvY2spIChwdGhyZWFkX211dGV4X3QgKik7CiAgaW50ICgqcHRyX3B0aHJlYWRfbXV0ZXhfdW5sb2NrKSAocHRocmVhZF9tdXRleF90ICopOwogIHB0aHJlYWRfdCAoKnB0cl9wdGhyZWFkX3NlbGYpICh2b2lkKTsKICBpbnQgKCpwdHJfcHRocmVhZF9zZXRjYW5jZWxzdGF0ZSkgKGludCwgaW50ICopOwogIGludCAoKnB0cl9wdGhyZWFkX3NldGNhbmNlbHR5cGUpIChpbnQsIGludCAqKTsKICB2b2lkICgqcHRyX3B0aHJlYWRfZG9fZXhpdCkgKHZvaWQgKnJldHZhbCwgY2hhciAqY3VycmVudGZyYW1lKTsKICB2b2lkICgqcHRyX3B0aHJlYWRfY2xlYW51cF91cHRvKSAoam1wX2J1ZiB0YXJnZXQsIGNoYXIgKnRhcmdldGZyYW1lKTsKICBwdGhyZWFkX2Rlc2NyICgqcHRyX3B0aHJlYWRfdGhyZWFkX3NlbGYpICh2b2lkKTsKICBpbnQgKCpwdHJfcHRocmVhZF9pbnRlcm5hbF90c2Rfc2V0KSAoaW50IGtleSwgY29uc3Qgdm9pZCAqcG9pbnRlcik7CiAgdm9pZCAqICgqcHRyX3B0aHJlYWRfaW50ZXJuYWxfdHNkX2dldCkgKGludCBrZXkpOwogIHZvaWQgKiogX19hdHRyaWJ1dGVfXyAoKF9fY29uc3RfXykpICgqcHRyX3B0aHJlYWRfaW50ZXJuYWxfdHNkX2FkZHJlc3MpIChpbnQga2V5KTsKICBpbnQgKCpwdHJfcHRocmVhZF9zaWdhY3Rpb24pIChpbnQgc2lnLCBjb25zdCBzdHJ1Y3Qgc2lnYWN0aW9uICogYWN0LCBzdHJ1Y3Qgc2lnYWN0aW9uICpvYWN0KTsKICBpbnQgKCpwdHJfcHRocmVhZF9zaWd3YWl0KSAoY29uc3Qgc2lnc2V0X3QgKnNldCwgaW50ICpzaWcpOwogIGludCAoKnB0cl9wdGhyZWFkX3JhaXNlKSAoaW50IHNpZyk7CiAgaW50ICgqcHRyX19fcHRocmVhZF9jb25kX3RpbWVkd2FpdCkgKHB0aHJlYWRfY29uZF90ICosIHB0aHJlYWRfbXV0ZXhfdCAqLCBjb25zdCBzdHJ1Y3QgdGltZXNwZWMgKik7CiAgdm9pZCAoKnB0cl9fcHRocmVhZF9jbGVhbnVwX3B1c2gpIChzdHJ1Y3QgX3B0aHJlYWRfY2xlYW51cF9idWZmZXIgKiBidWZmZXIsIHZvaWQgKCpyb3V0aW5lKSh2b2lkICopLCB2b2lkICogYXJnKTsKICB2b2lkICgqcHRyX19wdGhyZWFkX2NsZWFudXBfcG9wKSAoc3RydWN0IF9wdGhyZWFkX2NsZWFudXBfYnVmZmVyICogYnVmZmVyLCBpbnQgZXhlY3V0ZSk7Cn07CgpzdGF0aWMgcGlkX3QgKCpsaWJjX2ZvcmspKHZvaWQpOwpzdGF0aWMgaW50ICgqbGliY19zaWdhY3Rpb24pKGludCBzaWdudW0sIGNvbnN0IHN0cnVjdCBzaWdhY3Rpb24gKmFjdCwgc3RydWN0IHNpZ2FjdGlvbiAqb2xkYWN0KTsKc3RhdGljIGludCAqKCpsaWJjX3B0aHJlYWRfaW5pdCkoIGNvbnN0IHN0cnVjdCBwdGhyZWFkX2Z1bmN0aW9ucyAqZnVuY3MgKTsKCnN0YXRpYyBzdHJ1Y3QgcHRocmVhZF9mdW5jdGlvbnMgbGliY19wdGhyZWFkX2Z1bmN0aW9uczsKCnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfdGhyZWFkX3NlbGYsIHB0aHJlYWRfdGhyZWFkX3NlbGYpOwoKLyogcmVkZWZpbmUgdGhpcyB0byBwcmV2ZW50IGxpYnB0aHJlYWQgZnJvbSBvdmVycmlkaW5nIG91ciBmdW5jdGlvbiBwb2ludGVycyAqLwppbnQgKl9fbGliY19wdGhyZWFkX2luaXQoIGNvbnN0IHN0cnVjdCBwdGhyZWFkX2Z1bmN0aW9ucyAqZnVuY3MgKQp7CiAgICByZXR1cm4gbGliY19tdWx0aXBsZV90aHJlYWRzOwp9Cgp0eXBlZGVmIHN0cnVjdCBfd2luZV9jbGVhbnVwIHsKICB2b2lkICgqcm91dGluZSkodm9pZCAqKTsKICB2b2lkICphcmc7Cn0gKndpbmVfY2xlYW51cDsKCmludCBwdGhyZWFkX2NyZWF0ZShwdGhyZWFkX3QqIHRocmVhZCwgY29uc3QgcHRocmVhZF9hdHRyX3QqIGF0dHIsIHZvaWQqCiAgICAgICAgKCpzdGFydF9yb3V0aW5lKSh2b2lkICopLCB2b2lkKiBhcmcpCnsKICAgIGFzc2VydCggZnVuY3MucHRyX3B0aHJlYWRfY3JlYXRlICk7CiAgICByZXR1cm4gZnVuY3MucHRyX3B0aHJlYWRfY3JlYXRlKCB0aHJlYWQsIGF0dHIsIHN0YXJ0X3JvdXRpbmUsIGFyZyApOwp9CgppbnQgcHRocmVhZF9jYW5jZWwocHRocmVhZF90IHRocmVhZCkKewogICAgYXNzZXJ0KCBmdW5jcy5wdHJfcHRocmVhZF9jYW5jZWwgKTsKICAgIHJldHVybiBmdW5jcy5wdHJfcHRocmVhZF9jYW5jZWwoIHRocmVhZCApOwp9CgppbnQgcHRocmVhZF9qb2luKHB0aHJlYWRfdCB0aHJlYWQsIHZvaWQgKip2YWx1ZV9wdHIpCnsKICAgIGFzc2VydCggZnVuY3MucHRyX3B0aHJlYWRfam9pbiApOwogICAgcmV0dXJuIGZ1bmNzLnB0cl9wdGhyZWFkX2pvaW4oIHRocmVhZCwgdmFsdWVfcHRyICk7Cn0KCmludCBwdGhyZWFkX2RldGFjaChwdGhyZWFkX3QgdGhyZWFkKQp7CiAgICBhc3NlcnQoIGZ1bmNzLnB0cl9wdGhyZWFkX2RldGFjaCApOwogICAgcmV0dXJuIGZ1bmNzLnB0cl9wdGhyZWFkX2RldGFjaCggdGhyZWFkICk7Cn0KCi8qIEZJWE1FOiB3ZSBoYXZlIG5vIGVxdWl2YWxlbnRzIGluIHdpbjMyIGZvciB0aGUgcG9saWN5cyAqLwovKiBzbyBqdXN0IGtlZXAgdGhpcyBhcyBhIHN0dWIgKi8KaW50IHB0aHJlYWRfYXR0cl9zZXRzY2hlZHBvbGljeShwdGhyZWFkX2F0dHJfdCAqYXR0ciwgaW50IHBvbGljeSkKewogIFBfT1VUUFVUKCJGSVhNRTpwdGhyZWFkX2F0dHJfc2V0c2NoZWRwb2xpY3lcbiIpOwogIHJldHVybiAwOwp9CgovKiBGSVhNRTogbm8gd2luMzIgZXF1aXZhbGVudCBmb3Igc2NvcGUgKi8KaW50IHB0aHJlYWRfYXR0cl9zZXRzY29wZShwdGhyZWFkX2F0dHJfdCAqYXR0ciwgaW50IHNjb3BlKQp7CiAgUF9PVVRQVVQoIkZJWE1FOnB0aHJlYWRfYXR0cl9zZXRzY29wZVxuIik7CiAgcmV0dXJuIDA7IC8qIHJldHVybiBzdWNjZXNzICovCn0KCi8qIEZJWE1FOiBubyB3aW4zMiBlcXVpdmFsZW50IGZvciBzY2hlZHVsZSBwYXJhbSAqLwppbnQgcHRocmVhZF9hdHRyX3NldHNjaGVkcGFyYW0ocHRocmVhZF9hdHRyX3QgKmF0dHIsCiAgICBjb25zdCBzdHJ1Y3Qgc2NoZWRfcGFyYW0gKnBhcmFtKQp7CiAgUF9PVVRQVVQoIkZJWE1FOnB0aHJlYWRfYXR0cl9zZXRzY2hlZHBhcmFtXG4iKTsKICByZXR1cm4gMDsgLyogcmV0dXJuIHN1Y2Nlc3MgKi8KfQoKLyogRklYTUUgKi8KaW50IHB0aHJlYWRfYXR0cl9zZXRzdGFjayhwdGhyZWFkX2F0dHJfdCAqYXR0ciwgdm9pZCAqYWRkciwgc2l6ZV90IHNpemUpCnsKICByZXR1cm4gMDsgLyogcmV0dXJuIHN1Y2Nlc3MgKi8KfQoKaW50IF9fcHRocmVhZF9vbmNlKHB0aHJlYWRfb25jZV90ICpvbmNlX2NvbnRyb2wsIHZvaWQgKCppbml0X3JvdXRpbmUpKHZvaWQpKQp7CiAgICBzdGF0aWMgcHRocmVhZF9vbmNlX3QgdGhlX29uY2UgPSBQVEhSRUFEX09OQ0VfSU5JVDsKICAgIGxvbmcgb25jZV9ub3c7CgogICAgbWVtY3B5KCZvbmNlX25vdywmdGhlX29uY2Usc2l6ZW9mKG9uY2Vfbm93KSk7CiAgICBpZiAoaW50ZXJsb2NrZWRfY21weGNoZygobG9uZyopb25jZV9jb250cm9sLCBvbmNlX25vdysxLCBvbmNlX25vdykgPT0gb25jZV9ub3cpCiAgICAgICAgKCppbml0X3JvdXRpbmUpKCk7CiAgICByZXR1cm4gMDsKfQpzdHJvbmdfYWxpYXMoX19wdGhyZWFkX29uY2UsIHB0aHJlYWRfb25jZSk7Cgp2b2lkIF9fcHRocmVhZF9raWxsX290aGVyX3RocmVhZHNfbnAodm9pZCkKewogICAgLyogd2UgZG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZyBoZXJlICovCn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9raWxsX290aGVyX3RocmVhZHNfbnAsIHB0aHJlYWRfa2lsbF9vdGhlcl90aHJlYWRzX25wKTsKCi8qKioqKiBhdGZvcmsgKioqKiovCgojZGVmaW5lIE1BWF9BVEZPUksgOCAgLyogbGliYyBkb2Vzbid0IG5lZWQgdGhhdCBtYW55IGFueXdheSAqLwoKc3RhdGljIHB0aHJlYWRfbXV0ZXhfdCBhdGZvcmtfbXV0ZXggPSBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSOwoKdHlwZWRlZiB2b2lkICgqYXRmb3JrX2hhbmRsZXIpKCk7CnN0YXRpYyBhdGZvcmtfaGFuZGxlciBhdGZvcmtfcHJlcGFyZVtNQVhfQVRGT1JLXTsKc3RhdGljIGF0Zm9ya19oYW5kbGVyIGF0Zm9ya19wYXJlbnRbTUFYX0FURk9SS107CnN0YXRpYyBhdGZvcmtfaGFuZGxlciBhdGZvcmtfY2hpbGRbTUFYX0FURk9SS107CnN0YXRpYyBpbnQgYXRmb3JrX2NvdW50OwoKaW50IF9fcHRocmVhZF9hdGZvcmsodm9pZCAoKnByZXBhcmUpKHZvaWQpLCB2b2lkICgqcGFyZW50KSh2b2lkKSwgdm9pZCAoKmNoaWxkKSh2b2lkKSkKewogICAgcHRocmVhZF9tdXRleF9sb2NrKCAmYXRmb3JrX211dGV4ICk7CiAgICBhc3NlcnQoIGF0Zm9ya19jb3VudCA8IE1BWF9BVEZPUksgKTsKICAgIGF0Zm9ya19wcmVwYXJlW2F0Zm9ya19jb3VudF0gPSBwcmVwYXJlOwogICAgYXRmb3JrX3BhcmVudFthdGZvcmtfY291bnRdID0gcGFyZW50OwogICAgYXRmb3JrX2NoaWxkW2F0Zm9ya19jb3VudF0gPSBjaGlsZDsKICAgIGF0Zm9ya19jb3VudCsrOwogICAgcHRocmVhZF9tdXRleF91bmxvY2soICZhdGZvcmtfbXV0ZXggKTsKICAgIHJldHVybiAwOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfYXRmb3JrLCBwdGhyZWFkX2F0Zm9yayk7CgpwaWRfdCBfX2Zvcmsodm9pZCkKewogICAgcGlkX3QgcGlkOwogICAgaW50IGk7CgogICAgaWYgKCFsaWJjX2ZvcmspCiAgICB7CiAgICAgICAgbGliY19mb3JrID0gZGxzeW0oIFJUTERfTkVYVCwgImZvcmsiICk7CiAgICAgICAgYXNzZXJ0KCBsaWJjX2ZvcmsgKTsKICAgIH0KICAgIHB0aHJlYWRfbXV0ZXhfbG9jayggJmF0Zm9ya19tdXRleCApOwogICAgLyogcHJlcGFyZSBoYW5kbGVycyBhcmUgY2FsbGVkIGluIHJldmVyc2UgaW5zZXJ0aW9uIG9yZGVyICovCiAgICBmb3IgKGkgPSBhdGZvcmtfY291bnQgLSAxOyBpID49IDA7IGktLSkgaWYgKGF0Zm9ya19wcmVwYXJlW2ldKSBhdGZvcmtfcHJlcGFyZVtpXSgpOwogICAgaWYgKCEocGlkID0gbGliY19mb3JrKCkpKQogICAgewogICAgICAgIHB0aHJlYWRfbXV0ZXhfaW5pdCggJmF0Zm9ya19tdXRleCwgTlVMTCApOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCBhdGZvcmtfY291bnQ7IGkrKykgaWYgKGF0Zm9ya19jaGlsZFtpXSkgYXRmb3JrX2NoaWxkW2ldKCk7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IGF0Zm9ya19jb3VudDsgaSsrKSBpZiAoYXRmb3JrX3BhcmVudFtpXSkgYXRmb3JrX3BhcmVudFtpXSgpOwogICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCAmYXRmb3JrX211dGV4ICk7CiAgICB9CiAgICByZXR1cm4gcGlkOwp9CnN0cm9uZ19hbGlhcyhfX2ZvcmssIGZvcmspOwoKLyoqKioqIE1VVEVYRVMgKioqKiovCgppbnQgX19wdGhyZWFkX211dGV4X2luaXQocHRocmVhZF9tdXRleF90ICptdXRleCwgY29uc3QgcHRocmVhZF9tdXRleGF0dHJfdCAqbXV0ZXhhdHRyKQp7CiAgICBpZiAoIWZ1bmNzLnB0cl9wdGhyZWFkX211dGV4X2luaXQpIHJldHVybiAwOwogICAgcmV0dXJuIGZ1bmNzLnB0cl9wdGhyZWFkX211dGV4X2luaXQoIG11dGV4LCBtdXRleGF0dHIgKTsKfQpzdHJvbmdfYWxpYXMoX19wdGhyZWFkX211dGV4X2luaXQsIHB0aHJlYWRfbXV0ZXhfaW5pdCk7CgppbnQgX19wdGhyZWFkX211dGV4X2xvY2socHRocmVhZF9tdXRleF90ICptdXRleCkKewogICAgaWYgKCFmdW5jcy5wdHJfcHRocmVhZF9tdXRleF9sb2NrKSByZXR1cm4gMDsKICAgIHJldHVybiBmdW5jcy5wdHJfcHRocmVhZF9tdXRleF9sb2NrKCBtdXRleCApOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfbXV0ZXhfbG9jaywgcHRocmVhZF9tdXRleF9sb2NrKTsKCmludCBfX3B0aHJlYWRfbXV0ZXhfdHJ5bG9jayhwdGhyZWFkX211dGV4X3QgKm11dGV4KQp7CiAgICBpZiAoIWZ1bmNzLnB0cl9wdGhyZWFkX211dGV4X3RyeWxvY2spIHJldHVybiAwOwogICAgcmV0dXJuIGZ1bmNzLnB0cl9wdGhyZWFkX211dGV4X3RyeWxvY2soIG11dGV4ICk7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9tdXRleF90cnlsb2NrLCBwdGhyZWFkX211dGV4X3RyeWxvY2spOwoKaW50IF9fcHRocmVhZF9tdXRleF91bmxvY2socHRocmVhZF9tdXRleF90ICptdXRleCkKewogICAgaWYgKCFmdW5jcy5wdHJfcHRocmVhZF9tdXRleF91bmxvY2spIHJldHVybiAwOwogICAgcmV0dXJuIGZ1bmNzLnB0cl9wdGhyZWFkX211dGV4X3VubG9jayggbXV0ZXggKTsKfQpzdHJvbmdfYWxpYXMoX19wdGhyZWFkX211dGV4X3VubG9jaywgcHRocmVhZF9tdXRleF91bmxvY2spOwoKaW50IF9fcHRocmVhZF9tdXRleF9kZXN0cm95KHB0aHJlYWRfbXV0ZXhfdCAqbXV0ZXgpCnsKICAgIGlmICghZnVuY3MucHRyX3B0aHJlYWRfbXV0ZXhfZGVzdHJveSkgcmV0dXJuIDA7CiAgICByZXR1cm4gZnVuY3MucHRyX3B0aHJlYWRfbXV0ZXhfZGVzdHJveSggbXV0ZXggKTsKfQpzdHJvbmdfYWxpYXMoX19wdGhyZWFkX211dGV4X2Rlc3Ryb3ksIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSk7CgoKLyoqKioqIE1VVEVYIEFUVFJJQlVURVMgKioqKiovCi8qIGp1c3QgZHVtbWllcywgc2luY2UgY3JpdGljYWwgc2VjdGlvbnMgYXJlIGFsd2F5cyByZWN1cnNpdmUgKi8KCmludCBfX3B0aHJlYWRfbXV0ZXhhdHRyX2luaXQocHRocmVhZF9tdXRleGF0dHJfdCAqYXR0cikKewogIHJldHVybiAwOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfbXV0ZXhhdHRyX2luaXQsIHB0aHJlYWRfbXV0ZXhhdHRyX2luaXQpOwoKaW50IF9fcHRocmVhZF9tdXRleGF0dHJfZGVzdHJveShwdGhyZWFkX211dGV4YXR0cl90ICphdHRyKQp7CiAgcmV0dXJuIDA7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9tdXRleGF0dHJfZGVzdHJveSwgcHRocmVhZF9tdXRleGF0dHJfZGVzdHJveSk7CgppbnQgX19wdGhyZWFkX211dGV4YXR0cl9zZXRraW5kX25wKHB0aHJlYWRfbXV0ZXhhdHRyX3QgKmF0dHIsIGludCBraW5kKQp7CiAgcmV0dXJuIDA7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9tdXRleGF0dHJfc2V0a2luZF9ucCwgcHRocmVhZF9tdXRleGF0dHJfc2V0a2luZF9ucCk7CgppbnQgX19wdGhyZWFkX211dGV4YXR0cl9nZXRraW5kX25wKHB0aHJlYWRfbXV0ZXhhdHRyX3QgKmF0dHIsIGludCAqa2luZCkKewogICpraW5kID0gUFRIUkVBRF9NVVRFWF9SRUNVUlNJVkU7CiAgcmV0dXJuIDA7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9tdXRleGF0dHJfZ2V0a2luZF9ucCwgcHRocmVhZF9tdXRleGF0dHJfZ2V0a2luZF9ucCk7CgppbnQgX19wdGhyZWFkX211dGV4YXR0cl9zZXR0eXBlKHB0aHJlYWRfbXV0ZXhhdHRyX3QgKmF0dHIsIGludCBraW5kKQp7CiAgcmV0dXJuIDA7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9tdXRleGF0dHJfc2V0dHlwZSwgcHRocmVhZF9tdXRleGF0dHJfc2V0dHlwZSk7CgppbnQgX19wdGhyZWFkX211dGV4YXR0cl9nZXR0eXBlKHB0aHJlYWRfbXV0ZXhhdHRyX3QgKmF0dHIsIGludCAqa2luZCkKewogICpraW5kID0gUFRIUkVBRF9NVVRFWF9SRUNVUlNJVkU7CiAgcmV0dXJuIDA7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9tdXRleGF0dHJfZ2V0dHlwZSwgcHRocmVhZF9tdXRleGF0dHJfZ2V0dHlwZSk7CgoKLyoqKioqIFRIUkVBRC1TUEVDSUZJQyBWQVJJQUJMRVMgKEtFWVMpICoqKioqLwoKaW50IF9fcHRocmVhZF9rZXlfY3JlYXRlKHB0aHJlYWRfa2V5X3QgKmtleSwgdm9pZCAoKmRlc3RyX2Z1bmN0aW9uKSh2b2lkICopKQp7CiAgICBzdGF0aWMgbG9uZyBrZXljbnQgPSBGSVJTVF9LRVk7CiAgICAqa2V5ID0gaW50ZXJsb2NrZWRfeGNoZ19hZGQoJmtleWNudCwgMSk7CiAgICByZXR1cm4gMDsKfQpzdHJvbmdfYWxpYXMoX19wdGhyZWFkX2tleV9jcmVhdGUsIHB0aHJlYWRfa2V5X2NyZWF0ZSk7CgppbnQgX19wdGhyZWFkX2tleV9kZWxldGUocHRocmVhZF9rZXlfdCBrZXkpCnsKICByZXR1cm4gMDsKfQpzdHJvbmdfYWxpYXMoX19wdGhyZWFkX2tleV9kZWxldGUsIHB0aHJlYWRfa2V5X2RlbGV0ZSk7CgppbnQgX19wdGhyZWFkX3NldHNwZWNpZmljKHB0aHJlYWRfa2V5X3Qga2V5LCBjb25zdCB2b2lkICpwb2ludGVyKQp7CiAgICBwdGhyZWFkX2Rlc2NyIGRlc2NyID0gX19wdGhyZWFkX3RocmVhZF9zZWxmKCk7CiAgICBkZXNjci0+a2V5X2RhdGFba2V5XSA9IHBvaW50ZXI7CiAgICByZXR1cm4gMDsKfQpzdHJvbmdfYWxpYXMoX19wdGhyZWFkX3NldHNwZWNpZmljLCBwdGhyZWFkX3NldHNwZWNpZmljKTsKCnZvaWQgKl9fcHRocmVhZF9nZXRzcGVjaWZpYyhwdGhyZWFkX2tleV90IGtleSkKewogICAgcHRocmVhZF9kZXNjciBkZXNjciA9IF9fcHRocmVhZF90aHJlYWRfc2VsZigpOwogICAgcmV0dXJuICh2b2lkICopZGVzY3ItPmtleV9kYXRhW2tleV07Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9nZXRzcGVjaWZpYywgcHRocmVhZF9nZXRzcGVjaWZpYyk7CgpzdGF0aWMgaW50IHB0aHJlYWRfaW50ZXJuYWxfdHNkX3NldCggaW50IGtleSwgY29uc3Qgdm9pZCAqcG9pbnRlciApCnsKICAgIHB0aHJlYWRfZGVzY3IgZGVzY3IgPSBfX3B0aHJlYWRfdGhyZWFkX3NlbGYoKTsKICAgIGRlc2NyLT50c2RfZGF0YVtrZXldID0gcG9pbnRlcjsKICAgIHJldHVybiAwOwp9CmludCAoKl9fbGliY19pbnRlcm5hbF90c2Rfc2V0KShpbnQsIGNvbnN0IHZvaWQgKikgPSBwdGhyZWFkX2ludGVybmFsX3RzZF9zZXQ7CgpzdGF0aWMgdm9pZCAqcHRocmVhZF9pbnRlcm5hbF90c2RfZ2V0KCBpbnQga2V5ICkKewogICAgcHRocmVhZF9kZXNjciBkZXNjciA9IF9fcHRocmVhZF90aHJlYWRfc2VsZigpOwogICAgcmV0dXJuICh2b2lkICopZGVzY3ItPnRzZF9kYXRhW2tleV07Cn0Kdm9pZCogKCpfX2xpYmNfaW50ZXJuYWxfdHNkX2dldCkoaW50KSA9IHB0aHJlYWRfaW50ZXJuYWxfdHNkX2dldDsKCnN0YXRpYyB2b2lkICoqIF9fYXR0cmlidXRlX18oKGNvbnN0KSkgcHRocmVhZF9pbnRlcm5hbF90c2RfYWRkcmVzcyggaW50IGtleSApCnsKICAgIHB0aHJlYWRfZGVzY3IgZGVzY3IgPSBfX3B0aHJlYWRfdGhyZWFkX3NlbGYoKTsKICAgIHJldHVybiAodm9pZCAqKikmZGVzY3ItPnRzZF9kYXRhW2tleV07Cn0Kdm9pZCoqICgqX19saWJjX2ludGVybmFsX3RzZF9hZGRyZXNzKShpbnQpID0gcHRocmVhZF9pbnRlcm5hbF90c2RfYWRkcmVzczsKCi8qKioqKiAiRVhDRVBUSU9OIiBGUkFNRVMgKioqKiovCi8qIG5vdCBpbXBsZW1lbnRlZCByaWdodCBub3cgKi8KCnZvaWQgX3B0aHJlYWRfY2xlYW51cF9wdXNoKHN0cnVjdCBfcHRocmVhZF9jbGVhbnVwX2J1ZmZlciAqYnVmZmVyLCB2b2lkICgqcm91dGluZSkodm9pZCAqKSwgdm9pZCAqYXJnKQp7CiAgKCh3aW5lX2NsZWFudXApYnVmZmVyKS0+cm91dGluZSA9IHJvdXRpbmU7CiAgKCh3aW5lX2NsZWFudXApYnVmZmVyKS0+YXJnID0gYXJnOwp9Cgp2b2lkIF9wdGhyZWFkX2NsZWFudXBfcG9wKHN0cnVjdCBfcHRocmVhZF9jbGVhbnVwX2J1ZmZlciAqYnVmZmVyLCBpbnQgZXhlY3V0ZSkKewogIGlmIChleGVjdXRlKSAoKigoKHdpbmVfY2xlYW51cClidWZmZXIpLT5yb3V0aW5lKSkoKCh3aW5lX2NsZWFudXApYnVmZmVyKS0+YXJnKTsKfQoKdm9pZCBfcHRocmVhZF9jbGVhbnVwX3B1c2hfZGVmZXIoc3RydWN0IF9wdGhyZWFkX2NsZWFudXBfYnVmZmVyICpidWZmZXIsIHZvaWQgKCpyb3V0aW5lKSh2b2lkICopLCB2b2lkICphcmcpCnsKICBfcHRocmVhZF9jbGVhbnVwX3B1c2goYnVmZmVyLCByb3V0aW5lLCBhcmcpOwp9Cgp2b2lkIF9wdGhyZWFkX2NsZWFudXBfcG9wX3Jlc3RvcmUoc3RydWN0IF9wdGhyZWFkX2NsZWFudXBfYnVmZmVyICpidWZmZXIsIGludCBleGVjdXRlKQp7CiAgX3B0aHJlYWRfY2xlYW51cF9wb3AoYnVmZmVyLCBleGVjdXRlKTsKfQoKdm9pZCBfX3B0aHJlYWRfY2xlYW51cF91cHRvKGptcF9idWYgdGFyZ2V0LCBjaGFyICpmcmFtZSkKewogICAgLyogRklYTUUgKi8KfQoKLyoqKioqIENPTkRJVElPTlMgKioqKiovCgppbnQgX19wdGhyZWFkX2NvbmRfaW5pdChwdGhyZWFkX2NvbmRfdCAqY29uZCwgY29uc3QgcHRocmVhZF9jb25kYXR0cl90ICpjb25kX2F0dHIpCnsKICAgIGlmICghZnVuY3MucHRyX3B0aHJlYWRfY29uZF9pbml0KSByZXR1cm4gMDsKICAgIHJldHVybiBmdW5jcy5wdHJfcHRocmVhZF9jb25kX2luaXQoY29uZCwgY29uZF9hdHRyKTsKfQpzdHJvbmdfYWxpYXMoX19wdGhyZWFkX2NvbmRfaW5pdCwgcHRocmVhZF9jb25kX2luaXQpOwoKaW50IF9fcHRocmVhZF9jb25kX2Rlc3Ryb3kocHRocmVhZF9jb25kX3QgKmNvbmQpCnsKICAgIGlmICghZnVuY3MucHRyX3B0aHJlYWRfY29uZF9kZXN0cm95KSByZXR1cm4gMDsKICAgIHJldHVybiBmdW5jcy5wdHJfcHRocmVhZF9jb25kX2Rlc3Ryb3koY29uZCk7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9jb25kX2Rlc3Ryb3ksIHB0aHJlYWRfY29uZF9kZXN0cm95KTsKCmludCBfX3B0aHJlYWRfY29uZF9zaWduYWwocHRocmVhZF9jb25kX3QgKmNvbmQpCnsKICAgIGlmICghZnVuY3MucHRyX3B0aHJlYWRfY29uZF9zaWduYWwpIHJldHVybiAwOwogICAgcmV0dXJuIGZ1bmNzLnB0cl9wdGhyZWFkX2NvbmRfc2lnbmFsKGNvbmQpOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfY29uZF9zaWduYWwsIHB0aHJlYWRfY29uZF9zaWduYWwpOwoKaW50IF9fcHRocmVhZF9jb25kX2Jyb2FkY2FzdChwdGhyZWFkX2NvbmRfdCAqY29uZCkKewogICAgaWYgKCFmdW5jcy5wdHJfcHRocmVhZF9jb25kX2Jyb2FkY2FzdCkgcmV0dXJuIDA7CiAgICByZXR1cm4gZnVuY3MucHRyX3B0aHJlYWRfY29uZF9icm9hZGNhc3QoY29uZCk7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9jb25kX2Jyb2FkY2FzdCwgcHRocmVhZF9jb25kX2Jyb2FkY2FzdCk7CgppbnQgX19wdGhyZWFkX2NvbmRfd2FpdChwdGhyZWFkX2NvbmRfdCAqY29uZCwgcHRocmVhZF9tdXRleF90ICptdXRleCkKewogICAgaWYgKCFmdW5jcy5wdHJfcHRocmVhZF9jb25kX3dhaXQpIHJldHVybiAwOwogICAgcmV0dXJuIGZ1bmNzLnB0cl9wdGhyZWFkX2NvbmRfd2FpdChjb25kLCBtdXRleCk7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9jb25kX3dhaXQsIHB0aHJlYWRfY29uZF93YWl0KTsKCmludCBfX3B0aHJlYWRfY29uZF90aW1lZHdhaXQocHRocmVhZF9jb25kX3QgKmNvbmQsIHB0aHJlYWRfbXV0ZXhfdCAqbXV0ZXgsIGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAqYWJzdGltZSkKewogICAgaWYgKCFmdW5jcy5wdHJfcHRocmVhZF9jb25kX3RpbWVkd2FpdCkgcmV0dXJuIDA7CiAgICByZXR1cm4gZnVuY3MucHRyX3B0aHJlYWRfY29uZF90aW1lZHdhaXQoY29uZCwgbXV0ZXgsIGFic3RpbWUpOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfY29uZF90aW1lZHdhaXQsIHB0aHJlYWRfY29uZF90aW1lZHdhaXQpOwoKLyoqKiogQ09ORElUSU9OIEFUVFJJQlVURVMgKioqKiovCi8qIG5vdCBpbXBsZW1lbnRlZCByaWdodCBub3cgKi8KCmludCBwdGhyZWFkX2NvbmRhdHRyX2luaXQocHRocmVhZF9jb25kYXR0cl90ICphdHRyKQp7CiAgcmV0dXJuIDA7Cn0KCmludCBwdGhyZWFkX2NvbmRhdHRyX2Rlc3Ryb3kocHRocmVhZF9jb25kYXR0cl90ICphdHRyKQp7CiAgcmV0dXJuIDA7Cn0KCi8qKioqKiBSRUFELVdSSVRFIExPQ0tTICoqKioqLwoKaW50IF9fcHRocmVhZF9yd2xvY2tfaW5pdChwdGhyZWFkX3J3bG9ja190ICpyd2xvY2ssIGNvbnN0IHB0aHJlYWRfcndsb2NrYXR0cl90ICpyd2xvY2tfYXR0cikKewogICAgYXNzZXJ0KCBmdW5jcy5wdHJfcHRocmVhZF9yd2xvY2tfaW5pdCApOwogICAgcmV0dXJuIGZ1bmNzLnB0cl9wdGhyZWFkX3J3bG9ja19pbml0KCByd2xvY2ssIHJ3bG9ja19hdHRyICk7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9yd2xvY2tfaW5pdCwgcHRocmVhZF9yd2xvY2tfaW5pdCk7CgppbnQgX19wdGhyZWFkX3J3bG9ja19kZXN0cm95KHB0aHJlYWRfcndsb2NrX3QgKnJ3bG9jaykKewogICAgYXNzZXJ0KCBmdW5jcy5wdHJfcHRocmVhZF9yd2xvY2tfZGVzdHJveSApOwogICAgcmV0dXJuIGZ1bmNzLnB0cl9wdGhyZWFkX3J3bG9ja19kZXN0cm95KCByd2xvY2sgKTsKfQpzdHJvbmdfYWxpYXMoX19wdGhyZWFkX3J3bG9ja19kZXN0cm95LCBwdGhyZWFkX3J3bG9ja19kZXN0cm95KTsKCmludCBfX3B0aHJlYWRfcndsb2NrX3JkbG9jayhwdGhyZWFkX3J3bG9ja190ICpyd2xvY2spCnsKICAgIGlmICghZnVuY3MucHRyX3B0aHJlYWRfcndsb2NrX3JkbG9jaykgcmV0dXJuIDA7CiAgICByZXR1cm4gZnVuY3MucHRyX3B0aHJlYWRfcndsb2NrX3JkbG9jayggcndsb2NrICk7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9yd2xvY2tfcmRsb2NrLCBwdGhyZWFkX3J3bG9ja19yZGxvY2spOwoKaW50IF9fcHRocmVhZF9yd2xvY2tfdHJ5cmRsb2NrKHB0aHJlYWRfcndsb2NrX3QgKnJ3bG9jaykKewogICAgYXNzZXJ0KCBmdW5jcy5wdHJfcHRocmVhZF9yd2xvY2tfdHJ5cmRsb2NrICk7CiAgICByZXR1cm4gZnVuY3MucHRyX3B0aHJlYWRfcndsb2NrX3RyeXJkbG9jayggcndsb2NrICk7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9yd2xvY2tfdHJ5cmRsb2NrLCBwdGhyZWFkX3J3bG9ja190cnlyZGxvY2spOwoKaW50IF9fcHRocmVhZF9yd2xvY2tfd3Jsb2NrKHB0aHJlYWRfcndsb2NrX3QgKnJ3bG9jaykKewogICAgYXNzZXJ0KCBmdW5jcy5wdHJfcHRocmVhZF9yd2xvY2tfd3Jsb2NrICk7CiAgICByZXR1cm4gZnVuY3MucHRyX3B0aHJlYWRfcndsb2NrX3dybG9jayggcndsb2NrICk7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9yd2xvY2tfd3Jsb2NrLCBwdGhyZWFkX3J3bG9ja193cmxvY2spOwoKaW50IF9fcHRocmVhZF9yd2xvY2tfdHJ5d3Jsb2NrKHB0aHJlYWRfcndsb2NrX3QgKnJ3bG9jaykKewogICAgYXNzZXJ0KCBmdW5jcy5wdHJfcHRocmVhZF9yd2xvY2tfdHJ5d3Jsb2NrICk7CiAgICByZXR1cm4gZnVuY3MucHRyX3B0aHJlYWRfcndsb2NrX3RyeXdybG9jayggcndsb2NrICk7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9yd2xvY2tfdHJ5d3Jsb2NrLCBwdGhyZWFkX3J3bG9ja190cnl3cmxvY2spOwoKaW50IF9fcHRocmVhZF9yd2xvY2tfdW5sb2NrKHB0aHJlYWRfcndsb2NrX3QgKnJ3bG9jaykKewogICAgaWYgKCFmdW5jcy5wdHJfcHRocmVhZF9yd2xvY2tfdW5sb2NrKSByZXR1cm4gMDsKICAgIHJldHVybiBmdW5jcy5wdHJfcHRocmVhZF9yd2xvY2tfdW5sb2NrKCByd2xvY2sgKTsKfQpzdHJvbmdfYWxpYXMoX19wdGhyZWFkX3J3bG9ja191bmxvY2ssIHB0aHJlYWRfcndsb2NrX3VubG9jayk7CgovKioqKiBSRUFELVdSSVRFIExPQ0sgQVRUUklCVVRFUyAqKioqKi8KLyogbm90IGltcGxlbWVudGVkIHJpZ2h0IG5vdyAqLwoKaW50IHB0aHJlYWRfcndsb2NrYXR0cl9pbml0KHB0aHJlYWRfcndsb2NrYXR0cl90ICphdHRyKQp7CiAgcmV0dXJuIDA7Cn0KCmludCBfX3B0aHJlYWRfcndsb2NrYXR0cl9kZXN0cm95KHB0aHJlYWRfcndsb2NrYXR0cl90ICphdHRyKQp7CiAgcmV0dXJuIDA7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9yd2xvY2thdHRyX2Rlc3Ryb3ksIHB0aHJlYWRfcndsb2NrYXR0cl9kZXN0cm95KTsKCmludCBwdGhyZWFkX3J3bG9ja2F0dHJfZ2V0a2luZF9ucChjb25zdCBwdGhyZWFkX3J3bG9ja2F0dHJfdCAqYXR0ciwgaW50ICpwcmVmKQp7CiAgKnByZWYgPSAwOwogIHJldHVybiAwOwp9CgppbnQgcHRocmVhZF9yd2xvY2thdHRyX3NldGtpbmRfbnAocHRocmVhZF9yd2xvY2thdHRyX3QgKmF0dHIsIGludCBwcmVmKQp7CiAgcmV0dXJuIDA7Cn0KCi8qKioqKiBNSVNDICoqKioqLwoKcHRocmVhZF90IHB0aHJlYWRfc2VsZih2b2lkKQp7CiAgICBhc3NlcnQoIGZ1bmNzLnB0cl9wdGhyZWFkX3NlbGYgKTsKICAgIHJldHVybiBmdW5jcy5wdHJfcHRocmVhZF9zZWxmKCk7Cn0KCmludCBwdGhyZWFkX2VxdWFsKHB0aHJlYWRfdCB0aHJlYWQxLCBwdGhyZWFkX3QgdGhyZWFkMikKewogICAgYXNzZXJ0KCBmdW5jcy5wdHJfcHRocmVhZF9lcXVhbCApOwogICAgcmV0dXJuIGZ1bmNzLnB0cl9wdGhyZWFkX2VxdWFsKCB0aHJlYWQxLCB0aHJlYWQyICk7Cn0KCnZvaWQgX19wdGhyZWFkX2RvX2V4aXQodm9pZCAqcmV0dmFsLCBjaGFyICpjdXJyZW50ZnJhbWUpCnsKICAgIGFzc2VydCggZnVuY3MucHRyX3B0aHJlYWRfZXhpdCApOwogICAgcmV0dXJuIGZ1bmNzLnB0cl9wdGhyZWFkX2V4aXQoIHJldHZhbCwgY3VycmVudGZyYW1lICk7Cn0KCnZvaWQgX19wdGhyZWFkX2V4aXQodm9pZCAqcmV0dmFsKQp7CiAgICBfX3B0aHJlYWRfZG9fZXhpdCggcmV0dmFsLCBOVUxMICk7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9leGl0LCBwdGhyZWFkX2V4aXQpOwoKaW50IHB0aHJlYWRfc2V0Y2FuY2Vsc3RhdGUoaW50IHN0YXRlLCBpbnQgKm9sZHN0YXRlKQp7CiAgICBwdGhyZWFkX2Rlc2NyIGRlc2NyID0gX19wdGhyZWFkX3RocmVhZF9zZWxmKCk7CiAgICBpZiAob2xkc3RhdGUpICpvbGRzdGF0ZSA9IGRlc2NyLT5jYW5jZWxfc3RhdGU7CiAgICBkZXNjci0+Y2FuY2VsX3N0YXRlID0gc3RhdGU7CiAgICByZXR1cm4gMDsKfQoKaW50IHB0aHJlYWRfc2V0Y2FuY2VsdHlwZShpbnQgdHlwZSwgaW50ICpvbGR0eXBlKQp7CiAgICBwdGhyZWFkX2Rlc2NyIGRlc2NyID0gX19wdGhyZWFkX3RocmVhZF9zZWxmKCk7CiAgICBpZiAob2xkdHlwZSkgKm9sZHR5cGUgPSBkZXNjci0+Y2FuY2VsX3R5cGU7CiAgICBkZXNjci0+Y2FuY2VsX3R5cGUgPSB0eXBlOwogICAgcmV0dXJuIDA7Cn0KCi8qKioqKiBBTlRJLU9WRVJSSURFUyAqKioqKi8KLyogcHRocmVhZHMgdHJpZXMgdG8gb3ZlcnJpZGUgdGhlc2UsIHBvaW50IHRoZW0gYmFjayB0byBsaWJjICovCgppbnQgc2lnYWN0aW9uKGludCBzaWdudW0sIGNvbnN0IHN0cnVjdCBzaWdhY3Rpb24gKmFjdCwgc3RydWN0IHNpZ2FjdGlvbiAqb2xkYWN0KQp7CiAgICBpZiAoIWxpYmNfc2lnYWN0aW9uKQogICAgewogICAgICAgIGxpYmNfc2lnYWN0aW9uID0gZGxzeW0oIFJUTERfTkVYVCwgInNpZ2FjdGlvbiIgKTsKICAgICAgICBhc3NlcnQoIGxpYmNfc2lnYWN0aW9uICk7CiAgICB9CiAgICByZXR1cm4gbGliY19zaWdhY3Rpb24oc2lnbnVtLCBhY3QsIG9sZGFjdCk7Cn0KCnZvaWQgX19wdGhyZWFkX2luaXRpYWxpemUodm9pZCkKewogICAgc3RhdGljIGludCBkb25lOwoKICAgIGlmICghZG9uZSkKICAgIHsKICAgICAgICBkb25lID0gMTsKICAgICAgICBsaWJjX2ZvcmsgPSBkbHN5bSggUlRMRF9ORVhULCAiZm9yayIgKTsKICAgICAgICBsaWJjX3NpZ2FjdGlvbiA9IGRsc3ltKCBSVExEX05FWFQsICJzaWdhY3Rpb24iICk7CiAgICAgICAgbGliY191c2Vsb2NhbGUgPSBkbHN5bSggUlRMRF9ORVhULCAidXNlbG9jYWxlIiApOwogICAgICAgIGxpYmNfcHRocmVhZF9pbml0ID0gZGxzeW0oIFJUTERfTkVYVCwgIl9fbGliY19wdGhyZWFkX2luaXQiICk7CiAgICAgICAgaWYgKGxpYmNfcHRocmVhZF9pbml0KSBsaWJjX211bHRpcGxlX3RocmVhZHMgPSBsaWJjX3B0aHJlYWRfaW5pdCggJmxpYmNfcHRocmVhZF9mdW5jdGlvbnMgKTsKICAgIH0KfQpERUNMX0dMT0JBTF9DT05TVFJVQ1RPUihpbml0KSB7IF9fcHRocmVhZF9pbml0aWFsaXplKCk7IH0KCnN0YXRpYyBzdHJ1Y3QgcHRocmVhZF9mdW5jdGlvbnMgbGliY19wdGhyZWFkX2Z1bmN0aW9ucyA9CnsKICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwdHJfcHRocmVhZF9mb3JrICovCiAgICBOVUxMLCAvKiBGSVhNRSAqLyAgICAgICAgICAgICAgLyogcHRyX3B0aHJlYWRfYXR0cl9kZXN0cm95ICovCiAgICBOVUxMLCAvKiBGSVhNRSAqLyAgICAgICAgICAgICAgLyogcHRyX19fcHRocmVhZF9hdHRyX2luaXRfMl8wICovCiAgICBOVUxMLCAvKiBGSVhNRSAqLyAgICAgICAgICAgICAgLyogcHRyX19fcHRocmVhZF9hdHRyX2luaXRfMl8xICovCiAgICBOVUxMLCAvKiBGSVhNRSAqLyAgICAgICAgICAgICAgLyogcHRyX3B0aHJlYWRfYXR0cl9nZXRkZXRhY2hzdGF0ZSAqLwogICAgTlVMTCwgLyogRklYTUUgKi8gICAgICAgICAgICAgIC8qIHB0cl9wdGhyZWFkX2F0dHJfc2V0ZGV0YWNoc3RhdGUgKi8KICAgIE5VTEwsIC8qIEZJWE1FICovICAgICAgICAgICAgICAvKiBwdHJfcHRocmVhZF9hdHRyX2dldGluaGVyaXRzY2hlZCAqLwogICAgTlVMTCwgLyogRklYTUUgKi8gICAgICAgICAgICAgIC8qIHB0cl9wdGhyZWFkX2F0dHJfc2V0aW5oZXJpdHNjaGVkICovCiAgICBOVUxMLCAvKiBGSVhNRSAqLyAgICAgICAgICAgICAgLyogcHRyX3B0aHJlYWRfYXR0cl9nZXRzY2hlZHBhcmFtICovCiAgICBwdGhyZWFkX2F0dHJfc2V0c2NoZWRwYXJhbSwgICAgLyogcHRyX3B0aHJlYWRfYXR0cl9zZXRzY2hlZHBhcmFtICovCiAgICBOVUxMLCAvKiBGSVhNRSAqLyAgICAgICAgICAgICAgLyogcHRyX3B0aHJlYWRfYXR0cl9nZXRzY2hlZHBvbGljeSkgKGNvbnN0IHB0aHJlYWRfYXR0cl90ICosIGludCAqKTsgKi8KICAgIE5VTEwsIC8qIEZJWE1FICovICAgICAgICAgICAgICAvKiBwdHJfcHRocmVhZF9hdHRyX3NldHNjaGVkcG9saWN5KSAocHRocmVhZF9hdHRyX3QgKiwgaW50KTsgKi8KICAgIE5VTEwsIC8qIEZJWE1FICovICAgICAgICAgICAgICAvKiBwdHJfcHRocmVhZF9hdHRyX2dldHNjb3BlKSAoY29uc3QgcHRocmVhZF9hdHRyX3QgKiwgaW50ICopOyAqLwogICAgTlVMTCwgLyogRklYTUUgKi8gICAgICAgICAgICAgIC8qIHB0cl9wdGhyZWFkX2F0dHJfc2V0c2NvcGUpIChwdGhyZWFkX2F0dHJfdCAqLCBpbnQpOyAqLwogICAgcHRocmVhZF9jb25kYXR0cl9kZXN0cm95LCAgICAgIC8qIHB0cl9wdGhyZWFkX2NvbmRhdHRyX2Rlc3Ryb3kgKi8KICAgIHB0aHJlYWRfY29uZGF0dHJfaW5pdCwgICAgICAgICAvKiBwdHJfcHRocmVhZF9jb25kYXR0cl9pbml0ICovCiAgICBfX3B0aHJlYWRfY29uZF9icm9hZGNhc3QsICAgICAgLyogcHRyX19fcHRocmVhZF9jb25kX2Jyb2FkY2FzdCAqLwogICAgX19wdGhyZWFkX2NvbmRfZGVzdHJveSwgICAgICAgIC8qIHB0cl9fX3B0aHJlYWRfY29uZF9kZXN0cm95ICovCiAgICBfX3B0aHJlYWRfY29uZF9pbml0LCAgICAgICAgICAgLyogcHRyX19fcHRocmVhZF9jb25kX2luaXQgKi8KICAgIF9fcHRocmVhZF9jb25kX3NpZ25hbCwgICAgICAgICAvKiBwdHJfX19wdGhyZWFkX2NvbmRfc2lnbmFsICovCiAgICBfX3B0aHJlYWRfY29uZF93YWl0LCAgICAgICAgICAgLyogcHRyX19fcHRocmVhZF9jb25kX3dhaXQgKi8KICAgIHB0aHJlYWRfZXF1YWwsICAgICAgICAgICAgICAgICAvKiBwdHJfcHRocmVhZF9lcXVhbCAqLwogICAgX19wdGhyZWFkX2V4aXQsICAgICAgICAgICAgICAgIC8qIHB0cl9fX3B0aHJlYWRfZXhpdCAqLwogICAgTlVMTCwgLyogRklYTUUgKi8gICAgICAgICAgICAgIC8qIHB0cl9wdGhyZWFkX2dldHNjaGVkcGFyYW0gKi8KICAgIE5VTEwsIC8qIEZJWE1FICovICAgICAgICAgICAgICAvKiBwdHJfcHRocmVhZF9zZXRzY2hlZHBhcmFtICovCiAgICBfX3B0aHJlYWRfbXV0ZXhfZGVzdHJveSwgICAgICAgLyogcHRyX3B0aHJlYWRfbXV0ZXhfZGVzdHJveSAqLwogICAgX19wdGhyZWFkX211dGV4X2luaXQsICAgICAgICAgIC8qIHB0cl9wdGhyZWFkX211dGV4X2luaXQgKi8KICAgIF9fcHRocmVhZF9tdXRleF9sb2NrLCAgICAgICAgICAvKiBwdHJfcHRocmVhZF9tdXRleF9sb2NrICovCiAgICBfX3B0aHJlYWRfbXV0ZXhfdHJ5bG9jaywgICAgICAgLyogcHRyX3B0aHJlYWRfbXV0ZXhfdHJ5bG9jayAqLwogICAgX19wdGhyZWFkX211dGV4X3VubG9jaywgICAgICAgIC8qIHB0cl9wdGhyZWFkX211dGV4X3VubG9jayAqLwogICAgcHRocmVhZF9zZWxmLCAgICAgICAgICAgICAgICAgIC8qIHB0cl9wdGhyZWFkX3NlbGYgKi8KICAgIHB0aHJlYWRfc2V0Y2FuY2Vsc3RhdGUsICAgICAgICAvKiBwdHJfcHRocmVhZF9zZXRjYW5jZWxzdGF0ZSAqLwogICAgcHRocmVhZF9zZXRjYW5jZWx0eXBlLCAgICAgICAgIC8qIHB0cl9wdGhyZWFkX3NldGNhbmNlbHR5cGUgKi8KICAgIF9fcHRocmVhZF9kb19leGl0LCAgICAgICAgICAgICAvKiBwdHJfcHRocmVhZF9kb19leGl0ICovCiAgICBfX3B0aHJlYWRfY2xlYW51cF91cHRvLCAgICAgICAgLyogcHRyX3B0aHJlYWRfY2xlYW51cF91cHRvICovCiAgICBfX3B0aHJlYWRfdGhyZWFkX3NlbGYsICAgICAgICAgLyogcHRyX3B0aHJlYWRfdGhyZWFkX3NlbGYgKi8KICAgIHB0aHJlYWRfaW50ZXJuYWxfdHNkX3NldCwgICAgICAvKiBwdHJfcHRocmVhZF9pbnRlcm5hbF90c2Rfc2V0ICovCiAgICBwdGhyZWFkX2ludGVybmFsX3RzZF9nZXQsICAgICAgLyogcHRyX3B0aHJlYWRfaW50ZXJuYWxfdHNkX2dldCAqLwogICAgcHRocmVhZF9pbnRlcm5hbF90c2RfYWRkcmVzcywgIC8qIHB0cl9wdGhyZWFkX2ludGVybmFsX3RzZF9hZGRyZXNzICovCiAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcHRyX3B0aHJlYWRfc2lnYWN0aW9uICovCiAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcHRyX3B0aHJlYWRfc2lnd2FpdCAqLwogICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHB0cl9wdGhyZWFkX3JhaXNlICovCiAgICBfX3B0aHJlYWRfY29uZF90aW1lZHdhaXQsICAgICAgLyogcHRyX19fcHRocmVhZF9jb25kX3RpbWVkd2FpdCAqLwogICAgX3B0aHJlYWRfY2xlYW51cF9wdXNoLCAgICAgICAgIC8qIHB0cl9fcHRocmVhZF9jbGVhbnVwX3B1c2ggKi8KICAgIF9wdGhyZWFkX2NsZWFudXBfcG9wICAgICAgICAgICAvKiBwdHJfX3B0aHJlYWRfY2xlYW51cF9wb3AgKi8KfTsKCiNlbmRpZiAvKiBfX0dMSUJDX18gfHwgX19GUkVFQlNEX18gKi8KCiNlbHNlICAvKiBIQVZFX05QVEwgKi8KCnZvaWQgd2luZV9wdGhyZWFkX2luaXRfcHJvY2VzcyggY29uc3Qgc3RydWN0IHdpbmVfcHRocmVhZF9mdW5jdGlvbnMgKmZ1bmN0aW9ucyApCnsKfQoKdm9pZCB3aW5lX3B0aHJlYWRfaW5pdF90aHJlYWQodm9pZCkKewp9CgojZW5kaWYgIC8qIEhBVkVfTlBUTCAqLwo=