LyoKICogV1BBIFN1cHBsaWNhbnQgLSBkcml2ZXIgaW50ZXJhY3Rpb24gd2l0aCBUSSBzdGF0aW9uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCiAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgQlNECiAqIGxpY2Vuc2UuCiAqCiAqLwoKLyogQ29weXJpZ2h0IKkgVGV4YXMgSW5zdHJ1bWVudHMgSW5jb3Jwb3JhdGVkIChPY3QgMjAwNSkKICogVEhJUyBDT0RFL1BST0dSQU0gSVMgUFJPVklERUQgIkFTIElTIiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCAKICogRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVERUQgQlVUIE5PVCBMSU1JVEVEIFRPICwgVEhFIElNUExJRUQKICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAKICogVGhpcyBwcm9ncmFtIGhhcyBiZWVuIG1vZGlmaWVkIGZyb20gaXRzIG9yaWdpbmFsIG9wZXJhdGlvbiBieSBUZXhhcyAKICogSW5zdHJ1bWVudHMgSW5jb3Jwb3JhdGVkLiBUaGVzZSBjaGFuZ2VzIGFyZSBjb3ZlcmVkIHVuZGVyIHZlcnNpb24gMiAKICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBkYXRlZCBKdW5lIDE5OTEuCiAqCiAqIENvcHlyaWdodCCpIEdvb2dsZSBJbmMgKEZlYiAyMDA4KQoqLwovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwojaW5jbHVkZSAiaW5jbHVkZXMuaCIKI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgojaW5jbHVkZSA8bmV0L3JvdXRlLmg+CiNpbmNsdWRlIDxuZXQvaWYuaD4KI2luY2x1ZGUgPGZjbnRsLmg+CiNpbmNsdWRlIDxuZXRwYWNrZXQvcGFja2V0Lmg+CiNpbmNsdWRlIDxzdGRkZWYuaD4KI2luY2x1ZGUgImNvbW1vbi5oIgojaW5jbHVkZSAiZHJpdmVyLmgiCiNpbmNsdWRlICJlbG9vcC5oIgojaW5jbHVkZSAid3BhLmgiCiNpbmNsdWRlICJ3cGFfc3VwcGxpY2FudC5oIgojaW5jbHVkZSAiY29uZmlnLmgiCiNpbmNsdWRlICJ3cGFfc3VwcGxpY2FudF9pLmgiCiNpbmNsdWRlICJ3cGFfaS5oIgojaW5jbHVkZSAibDJfcGFja2V0LmgiCiNpbmNsdWRlICJ3cGFfY3RybC5oIgovKi0tLS0tIFNUQV9ESyBmaWxlcyAtLS0tLSovCiNpbmNsdWRlICJ3c3BWZXIuaCIKI2luY2x1ZGUgImRyaXZlcl90aS5oIgojaW5jbHVkZSAic2Nhbm1lcmdlLmgiCiNpbmNsdWRlICJzY2FuTW5nclR5cGVzLmgiCiNpZmRlZiBBTkRST0lECiNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgojZW5kaWYKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KI2RlZmluZSBUSV9EUklWRVJfTVNHX1BPUlQgICAgICAgOTAwMAojZGVmaW5lIFJYX1NFTEZfRklMVEVSICAgICAgICAgICAwCiNkZWZpbmUgUlhfQlJPQURDQVNUX0ZJTFRFUiAgICAgIDEKI2RlZmluZSBSWF9JUFY0X01VTFRJQ0FTVF9GSUxURVIgMgojZGVmaW5lIFJYX0lQVjZfTVVMVElDQVNUX0ZJTFRFUiAzCiNkZWZpbmUgVEkyV1BBX1NUQVRVUyhzKSAgICAgICAgICgoKHMpICE9IE9LKSA/IC0xIDogMCkKI2RlZmluZSBUSV9DSEVDS19EUklWRVIoZixyKSAgICAgXAogICAgaWYoICEoZikgKSB7IFwKICAgICAgICB3cGFfcHJpbnRmKE1TR19FUlJPUiwiVEk6IERyaXZlciBub3QgaW5pdGlhbGl6ZWQgeWV0Li4uYWJvcnRpbmcuLi4iKTsgXAogICAgICAgIHJldHVybiggciApOyBcCiAgICB9Ci8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi8qIExvY2sgZmlsZSBwb2ludGVyIC0gdXNlZCB0byBhY2Nlc3MgcGlkLWxvY2stZmlsZSB0byBwcmV2ZW50IHR3byBpbnN0YW5jZXMgb2Ygd3BhX3N1cHBsaWNhbnQgKi8KI2lmZGVmIENPTkZJR19USV9MT0NLRklMRQpzdGF0aWMgaW50IGxmcDsKI2VuZGlmCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClJvdXRpbmUgTmFtZTogY2hlY2tfYW5kX2dldF9idWlsZF9jaGFubmVscwpSb3V0aW5lIERlc2NyaXB0aW9uOiBnZXQgbnVtYmVyIG9mIGFsbG93ZWQgY2hhbm5lbHMgYWNjb3JkaW5nIHRvIGEgYnVpbGQgdmFyLgpBcmd1bWVudHM6IE5vbmUKUmV0dXJuIFZhbHVlOiBOdW1iZXIgb2YgY2hhbm5lbHMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpzdGF0aWMgaW50IGNoZWNrX2FuZF9nZXRfYnVpbGRfY2hhbm5lbHMoIHZvaWQgKQp7CiNpZmRlZiBBTkRST0lECiAgICBjaGFyIHByb3Bfc3RhdHVzW1BST1BFUlRZX1ZBTFVFX01BWF07CiAgICBjaGFyICpwcm9wX25hbWUgPSAicm8ud2lmaS5jaGFubmVscyI7CiAgICBpbnQgaSwgZGVmYXVsdF9jaGFubmVscyA9IE5VTUJFUl9TQ0FOX0NIQU5ORUxTX0ZDQzsKCiAgICBpZiggcHJvcGVydHlfZ2V0KHByb3BfbmFtZSwgcHJvcF9zdGF0dXMsIE5VTEwpICkgewogICAgICAgIGkgPSBhdG9pKHByb3Bfc3RhdHVzKTsKICAgICAgICBpZiggaSAhPSAwICkKICAgICAgICAgICAgZGVmYXVsdF9jaGFubmVscyA9IGk7CiAgICB9CiAgICByZXR1cm4oIGRlZmF1bHRfY2hhbm5lbHMgKTsKI2Vsc2UKICAgIHJldHVybiggTlVNQkVSX1NDQU5fQ0hBTk5FTFNfRkNDICk7CiNlbmRpZgp9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClJvdXRpbmUgTmFtZTogd3BhX2RyaXZlcl90aXN0YV9ldmVudF9yZWNlaXZlClJvdXRpbmUgRGVzY3JpcHRpb246IGRyaXZlciBldmVudHMgY2FsbGJhY2ssIGNhbGxlZCBmcm9tIGRyaXZlciBJUEMKQXJndW1lbnRzOgogICBwcml2IC0gcG9pbnRlciB0byBwcml2YXRlIGRhdGEgc3RydWN0dXJlCiAgIHBEYXRhIC0gcG9pbnRlciB0byBldmVudCBpbmZvcm1hdGlvbgpSZXR1cm4gVmFsdWU6Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8Kdm9pZCB3cGFfZHJpdmVyX3Rpc3RhX2V2ZW50X3JlY2VpdmUoIElQQ19FVl9EQVRBICpwRGF0YSApCnsKICAgIHN0cnVjdCB3cGFfZHJpdmVyX3RpX2RhdGEgKm15U3VwcGw7CiAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gZWNob3NlcnZlcjsKICAgIGludCByZXMsIG1zZ19zaXplOwoKICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCJ3cGFfZHJpdmVyX3Rpc3RhX2V2ZW50X3JlY2VpdmUgY2FsbGVkOiAlZCIsCiAgICAgICAgICAgICAgIHBEYXRhLT51QnVmZmVyU2l6ZSk7CgogICAgbXlTdXBwbCA9IHBEYXRhLT5FdlBhcmFtcy5oVXNlclBhcmFtOwogICAgbXNnX3NpemUgPSAoaW50KShwRGF0YS0+dUJ1ZmZlclNpemUgKyBvZmZzZXRvZihJUENfRVZfREFUQSwgdUJ1ZmZlcikpOwoKICAgIG9zX21lbXNldCggJmVjaG9zZXJ2ZXIsIDAsIHNpemVvZihlY2hvc2VydmVyKSApOyAgICAgLyogQ2xlYXIgc3RydWN0ICovCiAgICBlY2hvc2VydmVyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOyAgICAgICAgICAgICAgICAgICAgIC8qIEludGVybmV0L0lQICovCiAgICBlY2hvc2VydmVyLnNpbl9hZGRyLnNfYWRkciA9IGluZXRfYWRkcigiMTI3LjAuMC4xIik7IC8qIElQIGFkZHJlc3MgKi8KICAgIGVjaG9zZXJ2ZXIuc2luX3BvcnQgPSBodG9ucyhUSV9EUklWRVJfTVNHX1BPUlQpOyAgICAgLyogc2VydmVyIHBvcnQgKi8KCiAgICByZXMgPSBzZW5kdG8obXlTdXBwbC0+ZHJpdmVyRXZlbnRzU29ja2V0LCBwRGF0YSwgbXNnX3NpemUsIDAsIChzdHJ1Y3Qgc29ja2FkZHIgKikmZWNob3NlcnZlciwgc2l6ZW9mKGVjaG9zZXJ2ZXIpKTsKICAgIGVjaG9zZXJ2ZXIuc2luX3BvcnQgPSBodG9ucyhUSV9EUklWRVJfTVNHX1BPUlQgKyAxKTsKICAgIHJlcyA9IHNlbmR0byhteVN1cHBsLT5kcml2ZXJFdmVudHNTb2NrZXQsIHBEYXRhLCBtc2dfc2l6ZSwgMCwgKHN0cnVjdCBzb2NrYWRkciAqKSZlY2hvc2VydmVyLCBzaXplb2YoZWNob3NlcnZlcikpOwp9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClJvdXRpbmUgTmFtZTogd3BhX2RyaXZlcl90aXN0YV9yZWdpc3Rlcl9ldmVudHMKUm91dGluZSBEZXNjcmlwdGlvbjogcmVnaXN0ZXIgdG8gZHJpdmVyIGV2ZW50cwpBcmd1bWVudHM6CiAgIGN0eCAtIHBvaW50ZXIgdG8gcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZQpSZXR1cm4gVmFsdWU6IE5vbmUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwp2b2lkIHdwYV9kcml2ZXJfdGlzdGFfcmVnaXN0ZXJfZXZlbnRzKCB2b2lkICpjdHggKQp7CiAgICBzdHJ1Y3Qgd3BhX2RyaXZlcl90aV9kYXRhICpteURydiA9IChzdHJ1Y3Qgd3BhX2RyaXZlcl90aV9kYXRhICopY3R4OwogICAgSVBDX0VWRU5UX1BBUkFNUyBwRXZlbnQ7CiAgICBpbnQgaTsKCiAgICBvc19tZW1zZXQoIG15RHJ2LT5oRXZlbnRzLCAwLCBzaXplb2YoVUxPTkcpICogSVBDX0VWRU5UX01BWCApOwogICAgZm9yKGk9SVBDX0VWRU5UX0FTU09DSUFURUQ7KCBpIDwgSVBDX0VWRU5UX01BWCApO2krKykgewogICAgICAgIC8qIFJlZ2lzdGVyIHRvIHJlY2VpdmUgZHJpdmVyIGV2ZW50cyAqLwogICAgICAgIHBFdmVudC51RXZlbnRUeXBlICAgICAgID0gaTsKICAgICAgICBwRXZlbnQudURlbGl2ZXJ5VHlwZSAgICA9IERFTElWRVJZX1BVU0g7CiAgICAgICAgcEV2ZW50LmhVc2VyUGFyYW0gICAgICAgPSAoVElfSEFORExFKW15RHJ2OwogICAgICAgIHBFdmVudC5wZkV2ZW50Q2FsbGJhY2sgID0gKFRJX0VWRU5UX0NBTExCQUNLKXdwYV9kcml2ZXJfdGlzdGFfZXZlbnRfcmVjZWl2ZTsKICAgICAgICBUSV9SZWdpc3RlckV2ZW50KCBteURydi0+aERyaXZlciwgJnBFdmVudCApOwogICAgICAgIG15RHJ2LT5oRXZlbnRzW2ldID0gcEV2ZW50LnVFdmVudElEOwogICAgfQp9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClJvdXRpbmUgTmFtZTogd3BhX2RyaXZlcl90aXN0YV91bnJlZ2lzdGVyX2V2ZW50cwpSb3V0aW5lIERlc2NyaXB0aW9uOiB1bnJlZ2lzdGVyIGRyaXZlciBldmVudHMKQXJndW1lbnRzOgogICBjdHggLSBwb2ludGVyIHRvIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUKUmV0dXJuIFZhbHVlOiBOb25lCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8Kdm9pZCB3cGFfZHJpdmVyX3Rpc3RhX3VucmVnaXN0ZXJfZXZlbnRzKCB2b2lkICpjdHggKQp7CiAgICBzdHJ1Y3Qgd3BhX2RyaXZlcl90aV9kYXRhICpteURydiA9IChzdHJ1Y3Qgd3BhX2RyaXZlcl90aV9kYXRhICopY3R4OwogICAgSVBDX0VWRU5UX1BBUkFNUyBwRXZlbnQ7CiAgICBpbnQgaWR4OwoKICAgIGZvcihpZHg9MDsoIGlkeCA8IElQQ19FVkVOVF9NQVggKTtpZHgrKykgewogICAgICAgIGlmKCBteURydi0+aEV2ZW50c1tpZHhdICkgewogICAgICAgICAgICBwRXZlbnQudUV2ZW50VHlwZSA9IGlkeDsKICAgICAgICAgICAgcEV2ZW50LnVFdmVudElEID0gbXlEcnYtPmhFdmVudHNbaWR4XTsKICAgICAgICAgICAgVElfVW5SZWdpc3RlckV2ZW50KCBteURydi0+aERyaXZlciwgJnBFdmVudCApOwogICAgICAgIH0KICAgIH0KfQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpSb3V0aW5lIE5hbWU6IHdwYV9kcml2ZXJfdGlzdGFfZ2V0X2Jzc2lkClJvdXRpbmUgRGVzY3JpcHRpb246IGdldCBjdXJyZW50IEJTU0lEIGZyb20gZHJpdmVyCkFyZ3VtZW50czoKICAgcHJpdiAtIHBvaW50ZXIgdG8gcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZQogICBic3NpZCAtIHBvaW50ZXIgdG8gaG9sZCBic3NpZApSZXR1cm4gVmFsdWU6IDAgb24gc3VjY2VzcywgLTEgb24gZmFpbHVyZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCnN0YXRpYyBpbnQgd3BhX2RyaXZlcl90aXN0YV9nZXRfYnNzaWQoIHZvaWQgKnByaXYsIHU4ICpic3NpZCApCnsKICAgIHN0cnVjdCB3cGFfZHJpdmVyX3RpX2RhdGEgKm15RHJ2ID0gKHN0cnVjdCB3cGFfZHJpdmVyX3RpX2RhdGEgKilwcml2OwogICAgT1NfODAyXzExX01BQ19BRERSRVNTIHRpQVBNYWNBZGRyOwogICAgVElfU1RBVFVTIHJldFZhbHVlOwoKICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCAid3BhX2RyaXZlcl90aXN0YV9nZXRfYnNzaWQgY2FsbGVkIik7CgogICAgLyogSWYgZHJpdmVyIGlzIG5vdCBpbml0aWFsaXplZCB5ZXQgLSB3ZSBjYW5ub3QgYWNjZXNzIGl0IHNvIHJldHVybiAqLwogICAgVElfQ0hFQ0tfRFJJVkVSKCBteURydi0+ZHJpdmVyX2lzX2xvYWRlZCwgLTEgKTsKCiAgICAvKiBHZXQgTUFDIGFkZHJlc3Mgb2YgY3VycmVudCBBUCAqLwogICAgaWYoIFRJX0dldEJTU0lEKCBteURydi0+aERyaXZlciwgJnRpQVBNYWNBZGRyICkgIT0gVElfUkVTVUxUX09LICkKICAgICAgICByZXR1cm4oIC0xICk7CgogICAgLyogQ29weSBCU1NJRCBpbnRvIGNhbGxlciBwb2ludGVyIHByb3ZpZGVkIGluIHJvdXRpbmUgcGFyYW1ldGVycyAqLwogICAgb3NfbWVtY3B5KCAodm9pZCAqKWJzc2lkLCAodm9pZCAqKSZ0aUFQTWFjQWRkciwgTUFDX0FERFJfTEVOICk7CiAgICB3cGFfaGV4ZHVtcChNU0dfREVCVUcsICJnZXRfYnNzaWQ6IiwgYnNzaWQsIE1BQ19BRERSX0xFTik7CiAgICByZXR1cm4oIDAgKTsKfQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpSb3V0aW5lIE5hbWU6IHdwYV9kcml2ZXJfdGlzdGFfZ2V0X3NzaWQKUm91dGluZSBEZXNjcmlwdGlvbjogZ2V0IGN1cnJlbnQgU1NJRApBcmd1bWVudHM6CiAgIHByaXYgLSBwb2ludGVyIHRvIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUKICAgc3NpZCAtIHBvaW50ZXIgdG8gaG9sZCBjdXJyZW50IGJzc2lkClJldHVybiBWYWx1ZTogTGVuZ3RoIG9mIFNTSUQgc3RyaW5nCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8Kc3RhdGljIGludCB3cGFfZHJpdmVyX3Rpc3RhX2dldF9zc2lkKCB2b2lkICpwcml2LCB1OCAqc3NpZCApCnsKICAgIHN0cnVjdCB3cGFfZHJpdmVyX3RpX2RhdGEgKm15RHJ2ID0gKHN0cnVjdCB3cGFfZHJpdmVyX3RpX2RhdGEgKilwcml2OwogICAgT1NfODAyXzExX1NTSUQgbXlzc2lkOwoKICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCJ3cGFfZHJpdmVyX3Rpc3RhX2dldF9zc2lkIGNhbGxlZCIpOwoKICAgIC8qIElmIGRyaXZlciBpcyBub3QgaW5pdGlhbGl6ZWQgeWV0IC0gd2UgY2Fubm90IGFjY2VzcyBpdCBzbyByZXR1cm4gKi8KICAgIFRJX0NIRUNLX0RSSVZFUiggbXlEcnYtPmRyaXZlcl9pc19sb2FkZWQsIC0xICk7CgogICAgLyogR2V0IGN1cnJlbnQgU1NJRCBmcm9tIGRyaXZlciAqLwogICAgaWYoIFRJX0dldEN1cnJlbnRTU0lEKG15RHJ2LT5oRHJpdmVyLCAmbXlzc2lkKSAhPSBUSV9SRVNVTFRfT0sgKQogICAgICAgIHJldHVybiggLTEgKTsKCiAgICAvKiBDb3B5IHRvIHVzZXIgc3VwcGxpZWQgcG9pbnRlciAqLwogICAgb3NfbWVtY3B5KCAodm9pZCAqKXNzaWQsICh2b2lkICopJm15c3NpZC5Tc2lkLCBteXNzaWQuU3NpZExlbmd0aCApOwoKICAgIC8qIFJldHVybiBsZW5ndGggb2YgU1NJRCAqLwogICAgcmV0dXJuKCBteXNzaWQuU3NpZExlbmd0aCApOwp9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClJvdXRpbmUgTmFtZTogd3BhX2RyaXZlcl90aXN0YV9zZXRfc3NpZApSb3V0aW5lIERlc2NyaXB0aW9uOiBzZXRzIGN1cnJlbnQgU1NJRCAoQXNzb2NpYXRlcykKQXJndW1lbnRzOgogICBwcml2IC0gcG9pbnRlciB0byBwcml2YXRlIGRhdGEgc3RydWN0dXJlCiAgIHNzaWQgLSBwb2ludGVyIHRvIHNzaWQKICAgc3NpZF9sZW4gLSBsZW5ndGggb2Ygc3NpZApSZXR1cm4gVmFsdWU6IDAgb24gc3VjY2VzcywgLTEgb24gZmFpbHVyZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCnN0YXRpYyBpbnQgd3BhX2RyaXZlcl90aXN0YV9zZXRfc3NpZCggdm9pZCAqcHJpdiwgY29uc3QgdTggKnNzaWQsIHNpemVfdCBzc2lkX2xlbiApCnsKICAgIHN0cnVjdCB3cGFfZHJpdmVyX3RpX2RhdGEgKm15RHJ2ID0gKHN0cnVjdCB3cGFfZHJpdmVyX3RpX2RhdGEgKilwcml2OwogICAgY2hhciBzc2lkQnVmW01BWF9TU0lEX0xFTl07CiAgICBpbnQgcmV0OwoKICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCJ3cGFfZHJpdmVyX3Rpc3RhX3NldF9zc2lkIGNhbGxlZDogJXMiLCBzc2lkKTsKCiAgICAvKiBJZiBkcml2ZXIgaXMgbm90IGluaXRpYWxpemVkIHlldCAtIHdlIGNhbm5vdCBhY2Nlc3MgaXQgc28gcmV0dXJuICovCiAgICBUSV9DSEVDS19EUklWRVIoIG15RHJ2LT5kcml2ZXJfaXNfbG9hZGVkLCAtMSApOwoKICAgIC8qIENvcHkgdXNlciBzdXBwbGllZCBTU0lEIGludG8gbG9jYWwgYnVmZmVyICovCiAgICBvc19tZW1zZXQoIHNzaWRCdWYsIDAsIE1BWF9TU0lEX0xFTiApOwogICAgb3NfbWVtY3B5KCBzc2lkQnVmLCBzc2lkLCBzc2lkX2xlbiApOwoKICAgIC8qIFNldCBsb2NhbCBTU0lEIGJ1ZmZlciB0byBkcml2ZXIgLSB0cmlnZ2VyaW5nIGNvbm5lY3Rpb24gcHJvY2VzcyBpbiBkcml2ZXIgKi8KICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCJBc3NvY2lhdGU6IFNTSUQgPSAlcyIsIHNzaWRCdWYpOyAvKiBEbTogKi8KI2lmZGVmIFNUQV9ES19WRVJfNV8wXzBfOTQKICAgIHJldCA9IChpbnQpVElfU2V0U1NJRCggbXlEcnYtPmhEcml2ZXIsIChjaGFyICopc3NpZEJ1ZiApOwojZWxzZQogICAgcmV0ID0gKGludClUSV9TZXRTU0lEKCBteURydi0+aERyaXZlciwgKHU4ICopc3NpZEJ1ZiApOwojZW5kaWYKICAgIHJldHVybiggVEkyV1BBX1NUQVRVUyhyZXQpICk7Cn0KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KUm91dGluZSBOYW1lOiB3cGFfZHJpdmVyX3Rpc3RhX3NldF93cGEKUm91dGluZSBEZXNjcmlwdGlvbjogZW5hYmxlL2Rpc2FibGUgV1BBIHN1cHBvcnQgaW4gZHJpdmVyIC0gbm90IGltcGxlbWVudGVkIHNpbmNlIG5vdCBzdXBwb3J0ZWQgaW4gZHJpdmVyLiBhbHNvIG9ic2VsZXRlIGZvciB3cGEtc3VwcGwgY29yZQpBcmd1bWVudHM6CiAgIHByaXYgLSBwb2ludGVyIHRvIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUKICAgZW5hYmxlZCAtIGVuYWJsZS9kaXNhYmxlIGZsYWcKUmV0dXJuIFZhbHVlOiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGZhaWx1cmUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpzdGF0aWMgaW50IHdwYV9kcml2ZXJfdGlzdGFfc2V0X3dwYSh2b2lkICpwcml2LCBpbnQgZW5hYmxlZCkKewogICAgc3RydWN0IHdwYV9kcml2ZXJfdGlfZGF0YSAqbXlEcnYgPSAoc3RydWN0IHdwYV9kcml2ZXJfdGlfZGF0YSAqKXByaXY7CgogICAgd3BhX3ByaW50ZihNU0dfREVCVUcsIndwYV9kcml2ZXJfdGlzdGFfc2V0X3dwYSBjYWxsZWQ6ICVkIixlbmFibGVkKTsKICAgIHJldHVybiggMCApOwp9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClJvdXRpbmUgTmFtZTogd3BhX2RyaXZlcl90aXN0YV9zZXRfcHJvdG8KUm91dGluZSBEZXNjcmlwdGlvbjogc2V0IGF1dGhlbnRpY2F0aW9uIHByb3RvY29sIChXUEEvV1BBMihSU04pKQpBcmd1bWVudHM6CiAgIHByaXYgLSBwb2ludGVyIHRvIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUKICAgcHJvdG8gLSBhdXRoZW50aWNhdGlvbiBzdWl0ZQpSZXR1cm4gVmFsdWU6IDAgb24gc3VjY2VzcywgLTEgb24gZmFpbHVyZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCnN0YXRpYyBpbnQgd3BhX2RyaXZlcl90aXN0YV9zZXRfcHJvdG8oIHZvaWQgKnByaXYsIGludCBwcm90byApCnsKICAgc3RydWN0IHdwYV9kcml2ZXJfdGlfZGF0YSAqbXlEcnYgPSAoc3RydWN0IHdwYV9kcml2ZXJfdGlfZGF0YSAqKXByaXY7CgogICB3cGFfcHJpbnRmKE1TR19ERUJVRywid3BhX2RyaXZlcl90aXN0YV9zZXRfcHJvdG8gY2FsbGVkOiAlZCIsIHByb3RvKTsKICAgbXlEcnYtPnByb3RvID0gcHJvdG87CgogICByZXR1cm4oIDAgKTsKfQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpSb3V0aW5lIE5hbWU6IHdwYV9kcml2ZXJfdGlzdGFfc2V0X3dwYV9vcHRpb25zClJvdXRpbmUgRGVzY3JpcHRpb246IHNldCB3cGFfb3B0aW9ucwpBcmd1bWVudHM6CiAgIHByaXYgLSBwb2ludGVyIHRvIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUKICAgd3BhX29wdGlvbnMgLSBXUEEgb3B0aW9ucyAoMCAtIGRpc2FibGUsIDMgLSBlbmFibGUpClJldHVybiBWYWx1ZTogMCBvbiBzdWNjZXNzLCAtMSBvbiBmYWlsdXJlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8Kc3RhdGljIGludCB3cGFfZHJpdmVyX3Rpc3RhX3NldF93cGFfb3B0aW9ucyggdm9pZCAqcHJpdiwgaW50IGtleV9tZ210X3N1aXRlICkKewogICAgc3RydWN0IHdwYV9kcml2ZXJfdGlfZGF0YSAqbXlEcnYgPSAoc3RydWN0IHdwYV9kcml2ZXJfdGlfZGF0YSAqKXByaXY7CiAgICBVSU5UMzIgd3BhX29wdCA9IFdQQV9PUFRJT05TX0RJU0FCTEU7CiAgICBpbnQgcmV0OwoKICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCJ3cGFfZHJpdmVyX3Rpc3RhX3NldF93cGFfb3B0aW9ucyBjYWxsZWQ6ICVkIiwga2V5X21nbXRfc3VpdGUpOwogICAgLyogSWYgZHJpdmVyIGlzIG5vdCBpbml0aWFsaXplZCB5ZXQgLSB3ZSBjYW5ub3QgYWNjZXNzIGl0IHNvIHJldHVybiAqLwogICAgVElfQ0hFQ0tfRFJJVkVSKCBteURydi0+ZHJpdmVyX2lzX2xvYWRlZCwgLTEgKTsKCiAgICBteURydi0+a2V5X21nbXQgPSBrZXlfbWdtdF9zdWl0ZTsKCiAgICBzd2l0Y2goIGtleV9tZ210X3N1aXRlICkgewogICAgICAgIGNhc2UgS0VZX01HTVRfODAyXzFYOiAgICAgICAgICAvKiBEbTogRUFQICovCiAgICAgICAgICAgIHdwYV9vcHQgPSBXUEFfT1BUSU9OU19FTkFCTEU7IC8qIHdwYV9hdXRoID0gMTsgKi8KICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgS0VZX01HTVRfUFNLOiAgICAgICAgICAgICAvKiBEbTogUFNLICovCiAgICAgICAgICAgIHdwYV9vcHQgPSBXUEFfT1BUSU9OU19FTkFCTEU7IC8qIHdwYV9hdXRoID0gMjsgKi8KICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgS0VZX01HTVRfODAyXzFYX05PX1dQQTogICAvKiBEbTogPz8/ICovCiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIEtFWV9NR01UX1dQQV9OT05FOiAgICAgICAgLyogRG06ID8/PyAqLwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBLRVlfTUdNVF9OT05FOgogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHdwYV9vcHQgPSBXUEFfT1BUSU9OU19ESVNBQkxFOyAvKiB3cGFfYXV0aCA9IDI1NTsgKi8KICAgICAgICAgICAgYnJlYWs7CiAgICB9CgogICAgLyogU2V0IFdQQSBPcHRpb25zICovCiAgICByZXQgPSBUSV9TZXRXcGFPcHRpb25zKCBteURydi0+aERyaXZlciwgd3BhX29wdCApOwogICAgcmV0dXJuKCBUSTJXUEFfU1RBVFVTKHJldCkgKTsKfQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpSb3V0aW5lIE5hbWU6IHdwYV9kcml2ZXJfdGlzdGFfc2V0X2VuY3J5cHRpb24KUm91dGluZSBEZXNjcmlwdGlvbjogc2V0IGF1dGhlbnRpY2F0aW9uIHByb3RvY29sIChXUEEvV1BBMihSU04pKQpBcmd1bWVudHM6CiAgIHByaXYgLSBwb2ludGVyIHRvIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUKICAgcHJvdG8gLSBhdXRoZW50aWNhdGlvbiBzdWl0ZQpSZXR1cm4gVmFsdWU6IDAgb24gc3VjY2VzcywgLTEgb24gZmFpbHVyZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCnN0YXRpYyBpbnQgd3BhX2RyaXZlcl90aXN0YV9zZXRfZW5jcnlwdGlvbiggdm9pZCAqcHJpdiwgaW50IGVuY3J5cHRpb24gKQp7CiAgICBzdHJ1Y3Qgd3BhX2RyaXZlcl90aV9kYXRhICpteURydiA9IChzdHJ1Y3Qgd3BhX2RyaXZlcl90aV9kYXRhICopcHJpdjsKICAgIGludCByZXQgPSAtMTsKICAgIE9TXzgwMl8xMV9FTkNSWVBUSU9OX1RZUEVTIHdwYV9jaXBoZXIgPSBPU19FTkNSWVBUSU9OX1RZUEVfTk9ORTsKCiAgICB3cGFfcHJpbnRmKE1TR19ERUJVRywid3BhX2RyaXZlcl90aXN0YV9zZXRfZW5jcnlwdGlvbiBjYWxsZWQ6ICVkIixlbmNyeXB0aW9uKTsKICAgIC8qIElmIGRyaXZlciBpcyBub3QgaW5pdGlhbGl6ZWQgeWV0IC0gd2UgY2Fubm90IGFjY2VzcyBpdCBzbyByZXR1cm4gKi8KICAgIFRJX0NIRUNLX0RSSVZFUiggbXlEcnYtPmRyaXZlcl9pc19sb2FkZWQsIC0xICk7CgogICAgbXlEcnYtPmVuY3J5cHRpb24gPSBlbmNyeXB0aW9uOwogICAgc3dpdGNoKCBlbmNyeXB0aW9uICkgewogICAgICAgIGNhc2UgQ0lQSEVSX1dFUDQwOgogICAgICAgIGNhc2UgQ0lQSEVSX1dFUDEwNDoKICAgICAgICAgICAgd3BhX3ByaW50ZihNU0dfREVCVUcsICJlbmNyeXB0aW9uOiBPU19FTkNSWVBUSU9OX1RZUEVfV0VQIik7CiAgICAgICAgICAgIHdwYV9jaXBoZXIgPSBPU19FTkNSWVBUSU9OX1RZUEVfV0VQOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBDSVBIRVJfVEtJUDoKICAgICAgICAgICAgd3BhX3ByaW50ZihNU0dfREVCVUcsICJlbmNyeXB0aW9uOiBPU19FTkNSWVBUSU9OX1RZUEVfVEtJUCIpOwogICAgICAgICAgICB3cGFfY2lwaGVyID0gT1NfRU5DUllQVElPTl9UWVBFX1RLSVA7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIENJUEhFUl9DQ01QOgogICAgICAgICAgICB3cGFfcHJpbnRmKE1TR19ERUJVRywgImVuY3J5cHRpb246IE9TX0VOQ1JZUFRJT05fVFlQRV9BRVMiKTsKICAgICAgICAgICAgd3BhX2NpcGhlciA9IE9TX0VOQ1JZUFRJT05fVFlQRV9BRVM7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIENJUEhFUl9OT05FOgogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCAiZW5jcnlwdGlvbjogT1NfRU5DUllQVElPTl9UWVBFX05PTkUiKTsKICAgICAgICAgICAgd3BhX2NpcGhlciA9IE9TX0VOQ1JZUFRJT05fVFlQRV9OT05FOwogICAgICAgICAgICBicmVhazsKICAgIH0KICAgIHJldCA9IFRJX1NldEVuY3J5cHRpb25UeXBlKCBteURydi0+aERyaXZlciwgd3BhX2NpcGhlciApOwogICAgcmV0dXJuKCBUSTJXUEFfU1RBVFVTKHJldCkgKTsKfQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwp2b2lkIHdwYV9kcml2ZXJfdGlzdGFfcHJpbnRfYXV0aF9tb2RlKCBPU184MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERSBteUF1dGggKQp7CiAgICBjaGFyICptb2RlX25hbWUgPSBOVUxMOwoKICAgIHN3aXRjaCggbXlBdXRoICkgewogICAgICAgIGNhc2Ugb3M4MDJfMTFBdXRoTW9kZU9wZW46CiAgICAgICAgICAgIG1vZGVfbmFtZSA9ICJvczgwMl8xMUF1dGhNb2RlT3BlbiI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2Ugb3M4MDJfMTFBdXRoTW9kZVNoYXJlZDoKICAgICAgICAgICAgbW9kZV9uYW1lID0gIm9zODAyXzExQXV0aE1vZGVTaGFyZWQiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIG9zODAyXzExQXV0aE1vZGVBdXRvU3dpdGNoOgogICAgICAgICAgICBtb2RlX25hbWUgPSAib3M4MDJfMTFBdXRoTW9kZUF1dG9Td2l0Y2giOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIG9zODAyXzExQXV0aE1vZGVXUEE6CiAgICAgICAgICAgIG1vZGVfbmFtZSA9ICJvczgwMl8xMUF1dGhNb2RlV1BBIjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBvczgwMl8xMUF1dGhNb2RlV1BBUFNLOgogICAgICAgICAgICBtb2RlX25hbWUgPSAib3M4MDJfMTFBdXRoTW9kZVdQQVBTSyI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2Ugb3M4MDJfMTFBdXRoTW9kZVdQQU5vbmU6CiAgICAgICAgICAgIG1vZGVfbmFtZSA9ICJvczgwMl8xMUF1dGhNb2RlV1BBTm9uZSI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2Ugb3M4MDJfMTFBdXRoTW9kZVdQQTI6CiAgICAgICAgICAgIG1vZGVfbmFtZSA9ICJvczgwMl8xMUF1dGhNb2RlV1BBMiI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2Ugb3M4MDJfMTFBdXRoTW9kZVdQQTJQU0s6CiAgICAgICAgICAgIG1vZGVfbmFtZSA9ICJvczgwMl8xMUF1dGhNb2RlV1BBMlBTSyI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2Ugb3M4MDJfMTFBdXRoTW9kZU1heDoKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBtb2RlX25hbWUgPSAiVW5rbm93biI7CiAgICAgICAgICAgIGJyZWFrOwogICAgfQogICAgd3BhX3ByaW50ZihNU0dfREVCVUcsICJTZWxlY3RlZCBBdXRoTW9kZTogJXMiLCBtb2RlX25hbWUpOwp9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClJvdXRpbmUgTmFtZTogd3BhX2RyaXZlcl90aXN0YV9zZXRfYXV0aF9tb2RlClJvdXRpbmUgRGVzY3JpcHRpb246CkFyZ3VtZW50czoKICAgcHJpdiAtIHBvaW50ZXIgdG8gcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZQpSZXR1cm4gVmFsdWU6IDAgb24gc3VjY2VzcywgLTEgb24gZmFpbHVyZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCnN0YXRpYyBpbnQgd3BhX2RyaXZlcl90aXN0YV9zZXRfYXV0aF9tb2RlKCB2b2lkICpwcml2ICkKewogICAgc3RydWN0IHdwYV9kcml2ZXJfdGlfZGF0YSAqbXlEcnYgPSAoc3RydWN0IHdwYV9kcml2ZXJfdGlfZGF0YSAqKXByaXY7CiAgICBPU184MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERSBteUF1dGggPSBvczgwMl8xMUF1dGhNb2RlQXV0b1N3aXRjaDsKICAgIGludCByZXQ7CgogICAgd3BhX3ByaW50ZihNU0dfREVCVUcsIndwYV9kcml2ZXJfdGlzdGFfc2V0X2F1dGhfbW9kZSBjYWxsZWQiKTsKCiAgICAvKiBJZiBkcml2ZXIgaXMgbm90IGluaXRpYWxpemVkIHlldCAtIHdlIGNhbm5vdCBhY2Nlc3MgaXQgc28gcmV0dXJuICovCiAgICBUSV9DSEVDS19EUklWRVIoIG15RHJ2LT5kcml2ZXJfaXNfbG9hZGVkLCAtMSApOwoKICAgIHdwYV9kcml2ZXJfdGlzdGFfc2V0X3Byb3RvKCBwcml2LCAoKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqKW15RHJ2LT5oV3BhU3VwcGxpY2FudCktPndwYS0+cHJvdG8gKTsKICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCAicHJvdG86ICVkIiwgbXlEcnYtPnByb3RvKTsgLyogc2hvdWxkIGJlIHNldCBCRUZPUkUgKi8KICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCAiYXV0aF9hbGc6ICVkIixteURydi0+YXV0aF9hbGcpOwoKICAgIGlmKCAobXlEcnYtPmF1dGhfYWxnID09IEFVVEhfQUxHX09QRU5fU1lTVEVNKSB8fAogICAgICAgIChteURydi0+YXV0aF9hbGcgPT0gQVVUSF9BTEdfTEVBUCkgKSB7CiAgICAgICAgc3dpdGNoKCBteURydi0+a2V5X21nbXQgKSB7CiAgICAgICAgICAgIGNhc2UgS0VZX01HTVRfODAyXzFYOgogICAgICAgICAgICAgICAgaWYoIG15RHJ2LT5wcm90byAmIFdQQV9QUk9UT19XUEEgKSB7CiAgICAgICAgICAgICAgICAgICAgbXlBdXRoID0gb3M4MDJfMTFBdXRoTW9kZVdQQTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYoIG15RHJ2LT5wcm90byAmIFdQQV9QUk9UT19SU04gKSB7CiAgICAgICAgICAgICAgICAgICAgbXlBdXRoID0gb3M4MDJfMTFBdXRoTW9kZVdQQTI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSBLRVlfTUdNVF9QU0s6CiAgICAgICAgICAgICAgICBpZiggbXlEcnYtPnByb3RvICYgV1BBX1BST1RPX1dQQSApIHsKICAgICAgICAgICAgICAgICAgICBteUF1dGggPSBvczgwMl8xMUF1dGhNb2RlV1BBUFNLOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiggbXlEcnYtPnByb3RvICYgV1BBX1BST1RPX1JTTiApIHsKICAgICAgICAgICAgICAgICAgICBteUF1dGggPSBvczgwMl8xMUF1dGhNb2RlV1BBMlBTSzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIEtFWV9NR01UXzgwMl8xWF9OT19XUEE6CiAgICAgICAgICAgIGNhc2UgS0VZX01HTVRfV1BBX05PTkU6CiAgICAgICAgICAgICAgICBteUF1dGggPSBvczgwMl8xMUF1dGhNb2RlV1BBTm9uZTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIEtFWV9NR01UX05PTkU6CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICBteUF1dGggPSBvczgwMl8xMUF1dGhNb2RlT3BlbjsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgaWYoIG15RHJ2LT5hdXRoX2FsZyA9PSBBVVRIX0FMR19TSEFSRURfS0VZICkgewogICAgICAgIG15QXV0aCA9IG9zODAyXzExQXV0aE1vZGVTaGFyZWQ7CiAgICB9CiAgICBpZiggbXlEcnYtPmF1dGhfYWxnID09IEFVVEhfQUxHX0xFQVAgKSB7CiAgICAgICAgVElfU2V0RUFQVHlwZSggbXlEcnYtPmhEcml2ZXIsIE9TX0VBUF9UWVBFX0xFQVAgKTsKICAgICAgICBUSV9TZXRFQVBUeXBlRHJpdmVyKCBteURydi0+aERyaXZlciwgT1NfRUFQX1RZUEVfTEVBUCApOwogICAgfQogICAgd3BhX2RyaXZlcl90aXN0YV9wcmludF9hdXRoX21vZGUoIG15QXV0aCApOwogICAgcmV0ID0gVElfU2V0QXV0aGVudGljYXRpb25Nb2RlKCBteURydi0+aERyaXZlciwgbXlBdXRoICk7CiAgICByZXR1cm4oIFRJMldQQV9TVEFUVVMocmV0KSApOwp9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClJvdXRpbmUgTmFtZTogd3BhX2RyaXZlcl90aXN0YV9kZWxfa2V5ClJvdXRpbmUgRGVzY3JpcHRpb246IHJlbW92ZSBrZXkgZnJvbSBkcml2ZXIKQXJndW1lbnRzOgogICBwcml2IC0gcG9pbnRlciB0byBwcml2YXRlIGRhdGEgc3RydWN0dXJlCiAgIGtleV9pZHggLSBrZXkgaW5kZXgKICAgYWRkciAtIGtleSBhZGRyZXNzICh1bmljYXN0L2Jyb2FkY2FzdCkKUmV0dXJuIFZhbHVlOiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGZhaWx1cmUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpzdGF0aWMgaW50IHdwYV9kcml2ZXJfdGlzdGFfZGVsX2tleSh2b2lkICpwcml2LCBpbnQga2V5X2lkeCwKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICphZGRyKQp7CiAgICBzdHJ1Y3Qgd3BhX2RyaXZlcl90aV9kYXRhICpteURydiA9IChzdHJ1Y3Qgd3BhX2RyaXZlcl90aV9kYXRhICopcHJpdjsKICAgIE9TXzgwMl8xMV9SRU1PVkVfS0VZIG15S2V5OwogICAgaW50IHJldDsKCiAgICB3cGFfcHJpbnRmKE1TR19ERUJVRywid3BhX2RyaXZlcl90aXN0YV9kZWxfa2V5IGNhbGxlZCIpOwogICAgd3BhX3ByaW50ZihNU0dfREVCVUcsImtleV9pZHggPSAlZCwgYWRkciA9ICIgVElNQUNTVFIsIGtleV9pZHgsIE1BQzJTVFIoYWRkcikpOwoKICAgIC8qIElmIGRyaXZlciBpcyBub3QgaW5pdGlhbGl6ZWQgeWV0IC0gd2UgY2Fubm90IGFjY2VzcyBpdCBzbyByZXR1cm4gKi8KICAgIFRJX0NIRUNLX0RSSVZFUiggbXlEcnYtPmRyaXZlcl9pc19sb2FkZWQsIC0xICk7CgogICAgLyogY29weSBwYXJhbWV0ZXJzIChNQUMgb2Yga2V5IHRvIHJlbW92ZSwgZXRjKSB0byBsb2NhbCBzdHJ1Y3R1cmUgKi8KICAgIG15S2V5Lkxlbmd0aCA9IHNpemVvZihPU184MDJfMTFfUkVNT1ZFX0tFWSk7CiAgICBvc19tZW1jcHkoJm15S2V5LkJTU0lELGFkZHIsTUFDX0FERFJfTEVOKTsKICAgIG15S2V5LktleUluZGV4ID0ga2V5X2lkeDsKCiAgICAvKiBDYWxsIFV0aWxpdHkgYWRhcHRlciB0byByZW1vdmUgdGhlIGtleSAqLwogICAgcmV0ID0gVElfUmVtb3ZlS2V5KCBteURydi0+aERyaXZlciwgJm15S2V5ICk7CiAgICByZXR1cm4oIFRJMldQQV9TVEFUVVMocmV0KSApOwp9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClJvdXRpbmUgTmFtZTogd3BhX2RyaXZlcl90aXN0YV9zZXRfa2V5ClJvdXRpbmUgRGVzY3JpcHRpb246IHNldCBrZXkgaW4gZHJpdmVyCkFyZ3VtZW50czoKICAgcHJpdiAtIHBvaW50ZXIgdG8gcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZQogICBhbGcgLSB0eXBlIG9mIGtleQogICBhZGRyIC0ga2V5IGFkZHJlc3MgKHVuaWNhc3QvYnJvYWRjYXN0KQogICBrZXlfaWR4IC0ga2V5IGluZGV4CiAgIHNldF90eCAtIHVzZSBrZXkgZm9yIGltbWlkaWF0ZSB0eAogICBzZXEgLSBzZXF1ZW5jZSBjb3VudGVyIChmb3IgcmVwbGF5IGRldGVjdGlvbikKICAgc2VxX2xlbiAtIHNlcXVlbmNlIGNvdW50ZXIgYnVmZmVyIGxlbgogICBrZXkgLSBrZXkgY29udGVudAogICBrZXlfbGVuIC0gbGVuZ3RoIG9mIGtleSAoMzIgZm9yIFRLSVAsIDE2IGZvciBBRVMpClJldHVybiBWYWx1ZTogMCBvbiBzdWNjZXNzLCAtMSBvbiBmYWlsdXJlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8Kc3RhdGljIGludCB3cGFfZHJpdmVyX3Rpc3RhX3NldF9rZXkodm9pZCAqcHJpdiwgd3BhX2FsZyBhbGcsCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYWRkciwgaW50IGtleV9pZHgsIGludCBzZXRfdHgsCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdTggKnNlcSwgc2l6ZV90IHNlcV9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdTggKmtleSwgc2l6ZV90IGtleV9sZW4pCnsKICAgIHN0cnVjdCB3cGFfZHJpdmVyX3RpX2RhdGEgKm15RHJ2ID0gKHN0cnVjdCB3cGFfZHJpdmVyX3RpX2RhdGEgKilwcml2OwogICAgT1NfODAyXzExX0tFWSBteUtleTsKICAgIE9TXzgwMl8xMV9XRVAgbXlXZXBLZXk7CiAgICBVSU5UOCB0ZW1wW1RLSVBfS0VZX0xFTkdUSF07CiAgICBpbnQgcmV0ID0gLTE7CgogICAgd3BhX3ByaW50ZihNU0dfREVCVUcsIndwYV9kcml2ZXJfdGlzdGFfc2V0X2tleSBjYWxsZWQiKTsKICAgIC8qIElmIGRyaXZlciBpcyBub3QgaW5pdGlhbGl6ZWQgeWV0IC0gd2UgY2Fubm90IGFjY2VzcyBpdCBzbyByZXR1cm4gKi8KICAgIFRJX0NIRUNLX0RSSVZFUiggbXlEcnYtPmRyaXZlcl9pc19sb2FkZWQsIC0xICk7CgogICAgd3BhX3ByaW50ZihNU0dfREVCVUcsICJhZGRfa2V5IChhZGRyKTogIiBNQUNTVFIsIE1BQzJTVFIoYWRkcikpOwogICAgd3BhX3ByaW50ZihNU0dfREVCVUcsICJhZGRfa2V5IChrZXlfaWR4KTogJWQiLCBrZXlfaWR4KTsKICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCAiYWRkX2tleSAoYWxnKTogJWQiLCBhbGcpOwogICAgd3BhX3ByaW50ZihNU0dfREVCVUcsICJhZGRfa2V5IChzZXRfdHgpOiAlZCIsIHNldF90eCk7CiAgICB3cGFfaGV4ZHVtcChNU0dfREVCVUcsICJhZGRfa2V5IChzZXEpOiIsIHNlcSwgc2VxX2xlbik7CiAgICB3cGFfaGV4ZHVtcChNU0dfREVCVUcsICJhZGRfa2V5IChrZXkpOiIsIGtleSwga2V5X2xlbik7CgogICAgc3dpdGNoKCBrZXlfbGVuICkgewogICAgICAgIGNhc2UgVEtJUF9LRVlfTEVOR1RIOiAgICAgICAgICAvKiAzMiAqLwogICAgICAgIGNhc2UgQUVTX0tFWV9MRU5HVEg6ICAgICAgICAgICAvKiAxNiAqLwogICAgICAgICAgICAvKiBTZXQga2V5IGluZGV4ICovCiAgICAgICAgICAgIG15S2V5LktleUluZGV4ID0ga2V5X2lkeDsKICAgICAgICAgICAgLyogU2V0IGtleSBsZW5ndGggYW5kIGNvbnRlbnQgKi8KICAgICAgICAgICAgbXlLZXkuS2V5TGVuZ3RoID0ga2V5X2xlbjsKICAgICAgICAgICAgLyogU2V0IHN0cnVjdHVyZSBzaXplICovCiAgICAgICAgICAgIG15S2V5Lkxlbmd0aCA9IHNpemVvZihPU184MDJfMTFfS0VZKTsKICAgICAgICAgICAgLyogc2V0IGtleSBNQUMgYWRkcmVzcyAtIEZGOkZGOkZGOkZGOkZGOkZGIGZvciBicm9hZGNhc3QsIG90aGVyIGZvciB1bmljYXN0ICovCiAgICAgICAgICAgIG9zX21lbWNweSggJm15S2V5LkJTU0lELCBhZGRyLCBNQUNfQUREUl9MRU4gKTsKCiAgICAgICAgICAgIGlmKCBzZXFfbGVuICkgewogICAgICAgICAgICAgICAgLyogU2V0IGtleSBSU0MgKi8KICAgICAgICAgICAgICAgIG9zX21lbWNweSggJm15S2V5LktleVJTQywgc2VxLCBzZXFfbGVuICk7CiAgICAgICAgICAgICAgICBteUtleS5LZXlJbmRleCB8PSBUSVdMQU5fS0VZX0ZMQUdTX1NFVF9LRVlfUlNDOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiggc2V0X3R4ICkgewogICAgICAgICAgICAgICAgbXlLZXkuS2V5SW5kZXggfD0gVElXTEFOX0tFWV9GTEFHU19UUkFOU01JVDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYoIG15S2V5LkJTU0lEWzBdICE9IDB4RkYgKSB7CiAgICAgICAgICAgICAgICBteUtleS5LZXlJbmRleCB8PSBUSVdMQU5fS0VZX0ZMQUdTX1BBSVJXSVNFOwogICAgICAgICAgICB9CgogICAgICAgICAgICBvc19tZW1jcHkoICZ0ZW1wLCBrZXksIEFFU19LRVlfTEVOR1RIICk7CiAgICAgICAgICAgIGlmKCBrZXlfbGVuID09IFRLSVBfS0VZX0xFTkdUSCApIHsKICAgICAgICAgICAgICAgIC8qIG5lZWQgdG8gc3dpdGNoIFJYIGFuZCBUWCBNSUMgc2V0IHdpdGgga2V5ICh0byBtYXRjaCBkcml2ZXIgQVBJKSAqLwogICAgICAgICAgICAgICAgb3NfbWVtY3B5KCAoVUlOVDgqKSgoKFVJTlQ4KikmdGVtcCkrMjQpLCAoVUlOVDgqKSgoKFVJTlQ4KilrZXkpKzE2KSwgOCApOwogICAgICAgICAgICAgICAgb3NfbWVtY3B5KCAoVUlOVDgqKSgoKFVJTlQ4KikmdGVtcCkrMTYpLCAoVUlOVDgqKSgoKFVJTlQ4KilrZXkpKzI0KSwgOCApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG9zX21lbWNweSggJm15S2V5LktleU1hdGVyaWFsLCAmdGVtcCwga2V5X2xlbiApOwogICAgICAgICAgICByZXQgPSBUSV9BZGRLZXkoIG15RHJ2LT5oRHJpdmVyLCAmbXlLZXkgKTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgV0VQX0tFWV9MRU5HVEhfNDA6ICAgICAgICAvKiA1ICovCiAgICAgICAgY2FzZSBXRVBfS0VZX0xFTkdUSF8xMDQ6ICAgICAgIC8qIDEzICovCiAgICAgICAgICAgIGlmKCBrZXlfbGVuICE9IDAgKSB7CiAgICAgICAgICAgICAgICAvKiBTZXQga2V5IGluZGV4ICovCiAgICAgICAgICAgICAgICBteVdlcEtleS5LZXlJbmRleCA9IGtleV9pZHg7CiAgICAgICAgICAgICAgICAvKiBTZXQga2V5IGxlbmd0aCBhbmQgY29udGVudCAqLwogICAgICAgICAgICAgICAgbXlXZXBLZXkuS2V5TGVuZ3RoID0ga2V5X2xlbjsKICAgICAgICAgICAgICAgIC8qIFNldCBzdHJ1Y3R1cmUgc2l6ZSAqLwogICAgICAgICAgICAgICAgbXlXZXBLZXkuTGVuZ3RoID0gc2l6ZW9mKE9TXzgwMl8xMV9XRVApOwoKICAgICAgICAgICAgICAgIGlmKCBzZXRfdHggKSB7CiAgICAgICAgICAgICAgICAgICAgbXlXZXBLZXkuS2V5SW5kZXggfD0gVElXTEFOX0tFWV9GTEFHU19UUkFOU01JVDsKICAgICAgICAgICAgICAgICAgICB3cGFfcHJpbnRmKE1TR19ERUJVRywgInNldHRpbmcgdGhpcyBrZXkgdG8gYmUgdGhlIGluZGV4OiAweCV4IiwgbXlXZXBLZXkuS2V5SW5kZXgpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIG9zX21lbWNweSggJm15V2VwS2V5LktleU1hdGVyaWFsLCBrZXksIGtleV9sZW4gKTsKICAgICAgICAgICAgICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCAiQWRkaW5nIFdFUCBrZXkgaW5kZXg6IDB4JXgiLCBrZXlfaWR4KTsKICAgICAgICAgICAgICAgIHJldCA9IFRJX0FkZFdFUEtleSggbXlEcnYtPmhEcml2ZXIsICZteVdlcEtleSApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgd3BhX3ByaW50ZihNU0dfREVCVUcsICJSZW1vdmluZyBXRVAga2V5IGluZGV4OiAweCV4Iiwga2V5X2lkeCk7CiAgICAgICAgICAgICAgICByZXQgPSBUSV9SZW1vdmVXRVBLZXkoIG15RHJ2LT5oRHJpdmVyLCBrZXlfaWR4ICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHdwYV9wcmludGYoTVNHX0VSUk9SLCJTZXRfa2V5OiBXcm9uZyBLZXlcbiIpOwogICAgICAgICAgICBicmVhazsKICAgIH0KICAgIHJldHVybiggVEkyV1BBX1NUQVRVUyhyZXQpICk7Cn0KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KUm91dGluZSBOYW1lOiB3cGFfZHJpdmVyX3Rpc3RhX3NldF9jb3VudGVybWVhc3VyZXMKUm91dGluZSBEZXNjcmlwdGlvbjogc3RhcnQvc3RvcCBjb3VudGVybWVhc3VyZXMgKGRyb3AgcGFja2V0cyBkdWUgdG8gcmVwbGF5IGF0dGFjayBkZXRlY3Rpb24pCkFyZ3VtZW50czoKICAgcHJpdiAtIHBvaW50ZXIgdG8gcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZQogICBlbmFibGVkIC0gZW5hYmxlL2Rpc2FibGUgZmxhZwpSZXR1cm4gVmFsdWU6IDAgb24gc3VjY2VzcywgLTEgb24gZmFpbHVyZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCnN0YXRpYyBpbnQgd3BhX2RyaXZlcl90aXN0YV9zZXRfY291bnRlcm1lYXN1cmVzKHZvaWQgKnByaXYsIGludCBlbmFibGVkKQp7CiAgICBzdHJ1Y3Qgd3BhX2RyaXZlcl90aV9kYXRhICpteURydiA9IChzdHJ1Y3Qgd3BhX2RyaXZlcl90aV9kYXRhICopcHJpdjsKCiAgICB3cGFfcHJpbnRmKE1TR19ERUJVRywid3BhX2RyaXZlcl90aXN0YV9zZXRfY291bnRlcm1lYXN1cmVzIGNhbGxlZDogJWQiLCBlbmFibGVkKTsKICAgIHJldHVybiggMCApOwp9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClJvdXRpbmUgTmFtZTogd3BhX2RyaXZlcl90aXN0YV9zZXRfZHJvcF91bmVuY3J5cHRlZApSb3V0aW5lIERlc2NyaXB0aW9uOiBlbmFibGUvZGlzYWJsZSBFQVBPTC1vbmx5IHR4IGJ5IGRyaXZlcgpBcmd1bWVudHM6CiAgIHByaXYgLSBwb2ludGVyIHRvIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUKICAgZW5hYmxlZCAtIGVuYWJsZS9kaXNhYmxlIGZsYWcKUmV0dXJuIFZhbHVlOiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGZhaWx1cmUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpzdGF0aWMgaW50IHdwYV9kcml2ZXJfdGlzdGFfc2V0X2Ryb3BfdW5lbmNyeXB0ZWQodm9pZCAqcHJpdiwgaW50IGVuYWJsZWQpCnsKICAgIHN0cnVjdCB3cGFfZHJpdmVyX3RpX2RhdGEgKm15RHJ2ID0gKHN0cnVjdCB3cGFfZHJpdmVyX3RpX2RhdGEgKilwcml2OwoKICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCJUSTogd3BhX2RyaXZlcl90aXN0YV9zZXRfZHJvcF91bmVuY3J5cHRlZCBjYWxsZWQ6ICVkIC0gbm90IGltcGxlbWVudGVkIiwgZW5hYmxlZCk7CiAgICByZXR1cm4oIDAgKTsKfQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpSb3V0aW5lIE5hbWU6IHdwYV9kcml2ZXJfdGlzdGFfZGVhdXRoZW50aWNhdGUKUm91dGluZSBEZXNjcmlwdGlvbjogc2VuZCBkZWF1dGhlbnRpY2F0aW9uIHBhY2tldApBcmd1bWVudHM6CiAgIHByaXYgLSBwb2ludGVyIHRvIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUKICAgYWRkciAtIGFkZHJlc3MgdG8gc2VuZCBkZWF1dGggcGFja2V0IHRvCiAgIHJlYXNvbl9jb2RlIC0gcmVhc29uIGNvZGUgc3VwcGxpZWQgaW4gZGVhdXRoIHBhY2tldApSZXR1cm4gVmFsdWU6IDAgb24gc3VjY2VzcywgLTEgb24gZmFpbHVyZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCnN0YXRpYyBpbnQgd3BhX2RyaXZlcl90aXN0YV9kZWF1dGhlbnRpY2F0ZSh2b2lkICpwcml2LCBjb25zdCBVSU5UOCAqYWRkciwgaW50IHJlYXNvbl9jb2RlKQp7CiAgICBzdHJ1Y3Qgd3BhX2RyaXZlcl90aV9kYXRhICpteURydiA9IChzdHJ1Y3Qgd3BhX2RyaXZlcl90aV9kYXRhICopcHJpdjsKICAgIGludCByZXQ7CgogICAgd3BhX3ByaW50ZihNU0dfREVCVUcsIndwYV9kcml2ZXJfdGlzdGFfZGVhdXRoZW50aWNhdGUgY2FsbGVkIik7CiAgICAvKiBJZiBkcml2ZXIgaXMgbm90IGluaXRpYWxpemVkIHlldCAtIHdlIGNhbm5vdCBhY2Nlc3MgaXQgc28gcmV0dXJuICovCiAgICBUSV9DSEVDS19EUklWRVIoIG15RHJ2LT5kcml2ZXJfaXNfbG9hZGVkLCAtMSApOwoKICAgIC8qIEJsb2NrIGFueSBwZW5kaW5nIGRpc2Fzc29jIGV2ZW50IHVudGlsIHN1Y2Nlc3NmdWxseSBjb25uZWN0ZWQgKi8KICAgIGlmKCBteURydi0+YmxvY2tfZGlzYXNzb2NfZXZlbnRzID09IE5PX0JMT0NLICkKICAgICAgICBteURydi0+YmxvY2tfZGlzYXNzb2NfZXZlbnRzID0gTk9fQkxPQ0tfRElTQVNTT0NfSU5fUFJPR1JFU1M7CgogICAgcmV0ID0gVElfRGlzYXNzb2NpYXRlKCBteURydi0+aERyaXZlciApOwogICAgcmV0dXJuKCBUSTJXUEFfU1RBVFVTKHJldCkgKTsKfQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpSb3V0aW5lIE5hbWU6IHdwYV9kcml2ZXJfdGlzdGFfZGlzYXNzb2NpYXRlClJvdXRpbmUgRGVzY3JpcHRpb246IGRpc2Fzc29jaWF0ZSBmcm9tIEFQCkFyZ3VtZW50czoKICAgcHJpdiAtIHBvaW50ZXIgdG8gcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZQogICBhZGRyIC0gYWRkcmVzcyB0byBzZW5kIGRlYXV0aCBwYWNrZXQgdG8KICAgcmVhc29uX2NvZGUgLSByZWFzb24gY29kZSBzdXBwbGllZCBpbiBkZWF1dGggcGFja2V0ClJldHVybiBWYWx1ZTogMCBvbiBzdWNjZXNzLCAtMSBvbiBmYWlsdXJlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8Kc3RhdGljIGludCB3cGFfZHJpdmVyX3Rpc3RhX2Rpc2Fzc29jaWF0ZSh2b2lkICpwcml2LCBjb25zdCBVSU5UOCAqYWRkciwgaW50IHJlYXNvbl9jb2RlKQp7CiAgICBzdHJ1Y3Qgd3BhX2RyaXZlcl90aV9kYXRhICpteURydiA9IChzdHJ1Y3Qgd3BhX2RyaXZlcl90aV9kYXRhICopcHJpdjsKICAgIGludCByZXQ7CgogICAgd3BhX3ByaW50ZihNU0dfREVCVUcsIlRJOiB3cGFfZHJpdmVyX3Rpc3RhX2Rpc2Fzc29jaWF0ZSBjYWxsZWQiKTsKICAgIC8qIElmIGRyaXZlciBpcyBub3QgaW5pdGlhbGl6ZWQgeWV0IC0gd2UgY2Fubm90IGFjY2VzcyBpdCBzbyByZXR1cm4gKi8KICAgIFRJX0NIRUNLX0RSSVZFUiggbXlEcnYtPmRyaXZlcl9pc19sb2FkZWQsIC0xICk7CgogICAgLyogQmxvY2sgYW55IHBlbmRpbmcgZGlzYXNzb2MgZXZlbnQgdW50aWwgc3VjY2Vzc2Z1bGx5IGNvbm5lY3RlZCAqLwogICAgaWYoIG15RHJ2LT5ibG9ja19kaXNhc3NvY19ldmVudHMgPT0gTk9fQkxPQ0sgKQogICAgICAgIG15RHJ2LT5ibG9ja19kaXNhc3NvY19ldmVudHMgPSBOT19CTE9DS19ESVNBU1NPQ19JTl9QUk9HUkVTUzsKCiAgICByZXQgPSBUSV9EaXNhc3NvY2lhdGUoIG15RHJ2LT5oRHJpdmVyICk7CiAgICByZXR1cm4oIFRJMldQQV9TVEFUVVMocmV0KSApOwp9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClJvdXRpbmUgTmFtZTogd3BhX2RyaXZlcl90aXN0YV9hc3NvY2lhdGUKUm91dGluZSBEZXNjcmlwdGlvbjogYXNzb2NpYXRlIHdpdGggQVAKQXJndW1lbnRzOgogICBwcml2IC0gcG9pbnRlciB0byBwcml2YXRlIGRhdGEgc3RydWN0dXJlCiAgIHBhcmFtcyAtIHN0cnVjdCB3cGFfZHJpdmVyX2Fzc29jaWF0ZV9wYXJhbXMgKHNzaWQsIGJzc2lkLCBldGMpClJldHVybiBWYWx1ZTogMCBvbiBzdWNjZXNzLCAtMSBvbiBmYWlsdXJlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8Kc3RhdGljIGludCB3cGFfZHJpdmVyX3Rpc3RhX2Fzc29jaWF0ZSh2b2lkICpwcml2LCBzdHJ1Y3Qgd3BhX2RyaXZlcl9hc3NvY2lhdGVfcGFyYW1zICpwYXJhbXMpCnsKICAgIHN0cnVjdCB3cGFfZHJpdmVyX3RpX2RhdGEgKm15RHJ2ID0gKHN0cnVjdCB3cGFfZHJpdmVyX3RpX2RhdGEgKilwcml2OwogICAgT1NfODAyXzExX01BQ19BRERSRVNTIGJzc2lkID0geyAweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiB9OwogICAgaW50IHdwYV9vcHQsIHdwYV9jaXBoZXIsIHJldDsKCiAgICB3cGFfcHJpbnRmKE1TR19ERUJVRywiVEk6IHdwYV9kcml2ZXJfdGlzdGFfYXNzb2NpYXRlIGNhbGxlZCIpOwogICAgLyogSWYgZHJpdmVyIGlzIG5vdCBpbml0aWFsaXplZCB5ZXQgLSB3ZSBjYW5ub3QgYWNjZXNzIGl0IHNvIHJldHVybiAqLwogICAgVElfQ0hFQ0tfRFJJVkVSKCBteURydi0+ZHJpdmVyX2lzX2xvYWRlZCwgLTEgKTsKCiAgICBpZiggbXlEcnYtPmJsb2NrX2Rpc2Fzc29jX2V2ZW50cyA9PSBOT19CTE9DS19ESVNBU1NPQ19JTl9QUk9HUkVTUyApCiAgICAgICAgbXlEcnYtPmJsb2NrX2Rpc2Fzc29jX2V2ZW50cyA9IEJMT0NLX0RJU0FTU09DOwoKICAgIGlmKCBwYXJhbXMtPmJzc2lkICkgewogICAgICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCAiVEk6IEJTU0lEPSIgTUFDU1RSLCBNQUMyU1RSKHBhcmFtcy0+YnNzaWQpKTsKICAgICAgICAvKiBpZiB0aGVyZSBpcyBic3NpZCAtPiBzZXQgaXQgKi8KICAgICAgICBpZiggb3NfbWVtY21wKCBwYXJhbXMtPmJzc2lkLCAiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIiwgRVRIX0FMRU4gKSAhPSAwICkgewogICAgICAgICAgICBvc19tZW1jcHkoICZic3NpZCwgcGFyYW1zLT5ic3NpZCwgRVRIX0FMRU4gKTsKICAgICAgICAgICAgVElfU2V0QlNTSUQoIG15RHJ2LT5oRHJpdmVyLCAmYnNzaWQgKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAvKiBlbHNlIHNldCBpdCB0byB7MHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZn0gKi8KICAgICAgICBUSV9TZXRCU1NJRCggbXlEcnYtPmhEcml2ZXIsICZic3NpZCApOwogICAgfQoKICAgIC8qIFNldCBkcml2ZXIgbmV0d29yayBtb2RlIChBZGhvYy9JbmZyYXN0cnVjdHVyZSkgYWNjb3JkaW5nIHRvIHN1cHBsaWVkIHBhcmFtZXRlcnMgKi8KICAgIGlmKCBwYXJhbXMtPm1vZGUgPT0gSUVFRTgwMjExX01PREVfSU5GUkEgKSB7CiAgICAgICAgd3BhX3ByaW50ZihNU0dfREVCVUcsIlRJOiBzZXR0aW5nIG9zODAyXzExSW5mcmFzdHJ1Y3R1cmUgbW9kZS4uLiIpOwogICAgICAgIFRJX1NldEJTU1R5cGUoIG15RHJ2LT5oRHJpdmVyLCBvczgwMl8xMUluZnJhc3RydWN0dXJlICk7CiAgICB9CiAgICBlbHNlIGlmKCBwYXJhbXMtPm1vZGUgPT0gSUVFRTgwMjExX01PREVfSUJTUyApIHsKICAgICAgICB3cGFfcHJpbnRmKE1TR19ERUJVRywiVEk6IHNldHRpbmcgb3M4MDJfMTFJQlNTIG1vZGUuLi4iKTsKICAgICAgICBUSV9TZXRCU1NUeXBlKCBteURydi0+aERyaXZlciwgb3M4MDJfMTFJQlNTICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICB3cGFfcHJpbnRmKE1TR19FUlJPUiwiVEk6IEFzc29jaWF0ZTogaW52YWxpZCBtb2RlIHNwZWNpZmllZC4uLiIpOwogICAgfQoKICAgIHdwYV9kcml2ZXJfdGlzdGFfc2V0X3dwYV9vcHRpb25zKCBwcml2LCBwYXJhbXMtPmtleV9tZ210X3N1aXRlICk7CiAgICB3cGFfZHJpdmVyX3Rpc3RhX3NldF9hdXRoX21vZGUoIHByaXYgKTsKICAgIHdwYV9kcml2ZXJfdGlzdGFfc2V0X2VuY3J5cHRpb24oIHByaXYsIHBhcmFtcy0+cGFpcndpc2Vfc3VpdGUgKTsKCiAgICAvKiBBbmQgdHJpZ2dlciBjb25uZWN0aW9uL2Fzc29jaWF0aW9uIHByb2Nlc3MgaW4gZHJpdmVyIGJ5IHNldHRpbmcgU1NJRCAqLwogICAgcmV0ID0gd3BhX2RyaXZlcl90aXN0YV9zZXRfc3NpZCggcHJpdiwgcGFyYW1zLT5zc2lkLCBwYXJhbXMtPnNzaWRfbGVuKTsKICAgIHJldHVybiggcmV0ICk7Cn0KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KUm91dGluZSBOYW1lOiB0aV9pbml0X3NjYW5fcGFyYW1zClJvdXRpbmUgRGVzY3JpcHRpb246IGludCBzY2FuIHBhcmFtZXRlcnMgYmVmb3JlIHNjYW4gY29tbWFuZApBcmd1bWVudHM6CiAgIHBTY2FuUGFyYW1zIC0gcG9pbnRlciB0byBzY2FuIHBhcmFtdGVycyBzdHJ1Y3R1cmUKICAgcFNjYW5Qb2xpY3kgLSBwb2ludGVyIHRvIHNjYW4gcG9saWN5IHN0cnVjdHVyZQogICBzY2FuVHlwZSAgICAtIHNjYW4gdHlwZQogICBub09mQ2hhbiAgICAtIG51bWJlciBvZiBhbGxvd2VkIGNoYW5uZWxzClJldHVybiBWYWx1ZTogTm9uZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCnN0YXRpYyB2b2lkIHRpX2luaXRfc2Nhbl9wYXJhbXMoIHNjYW5fUGFyYW1zX3QgKnBTY2FuUGFyYW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FuX1BvbGljeV90ICpwU2NhblBvbGljeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNjYW5fdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHdwYV9kcml2ZXJfdGlfZGF0YSAqbXlEcnYgKQp7CiAgICBVSU5UMzIgc2Nhbk1heER3ZWxsVGltZSA9IFNNRV9TQ0FOX0JHX01BWF9EV0VMTF9USU1FX0RFRjsKICAgIFVJTlQzMiBzY2FuTWluRHdlbGxUaW1lID0gU01FX1NDQU5fQkdfTUlOX0RXRUxMX1RJTUVfREVGOwogICAgVUlOVDMyIGNoYW5NYXhEd2VsbFRpbWUgPSBTTUVfU0NBTl9CR19NSU5fRFdFTExfVElNRV9ERUY7CiAgICBVSU5UMzIgY2hhbk1pbkR3ZWxsVGltZSA9IFNNRV9TQ0FOX0JHX01JTl9EV0VMTF9USU1FX0RFRiAvIDI7CiAgICBpbnQgc2NhblR5cGUgPSBzY2FuX3R5cGU7CiAgICBpbnQgbm9PZkNoYW4gPSBteURydi0+c2Nhbl9jaGFubmVsczsKICAgIGludCBidENvZXhTY2FuID0gbXlEcnYtPmJ0Y29leF9zY2FuOwogICAgaW50IGksIGo7CiAgICBVSU5UOCB0aWQgPSAwLCBwcm9iZU51bSA9IDM7CgogICAgaWYoIG5vT2ZDaGFuID4gTUFYX05VTUJFUl9PRl9DSEFOTkVMU19QRVJfU0NBTiApCiAgICAgICAgbm9PZkNoYW4gPSBNQVhfTlVNQkVSX09GX0NIQU5ORUxTX1BFUl9TQ0FOOwogICAgLyogaW5pdCBhcHBsaWNhdGlvbiBzY2FuIGRlZmF1bHQgcGFyYW1zICovCiAgICBwU2NhblBhcmFtcy0+ZGVzaXJlZFNzaWQubGVuID0gMDsKICAgIHBTY2FuUGFyYW1zLT5iYW5kID0gUkFESU9fQkFORF8yXzRfR0haOwogICAgaWYoIGJ0Q29leFNjYW4gKSB7IC8qIENoYW5naW5nIHNjYW4gcGFyYW1ldGVyZXMgdG8gY29leGlzdCB3aXRoIEJUIEEyRFAgKi8KICAgICAgICBpZiggc2NhblR5cGUgPT0gU0NBTl9UWVBFX05PUk1BTF9QQVNTSVZFICkKICAgICAgICAgICAgc2NhblR5cGUgPSBTQ0FOX1RZUEVfVFJJR0dFUkVEX1BBU1NJVkU7CiAgICAgICAgZWxzZSBpZiggc2NhblR5cGUgPT0gU0NBTl9UWVBFX05PUk1BTF9BQ1RJVkUgKQogICAgICAgICAgICBzY2FuVHlwZSA9IFNDQU5fVFlQRV9UUklHR0VSRURfQUNUSVZFOwogICAgICAgIHByb2JlTnVtID0gMTsKICAgICAgICB0aWQgPSAweEZGOwogICAgICAgIHNjYW5NYXhEd2VsbFRpbWUgLz0gNjsKICAgICAgICBzY2FuTWluRHdlbGxUaW1lIC89IDY7CiAgICAgICAgY2hhbk1heER3ZWxsVGltZSAvPSA2OwogICAgICAgIGNoYW5NaW5Ed2VsbFRpbWUgLz0gNjsKICAgIH0KICAgIHBTY2FuUGFyYW1zLT5zY2FuVHlwZSA9IHNjYW5UeXBlOwogICAgcFNjYW5QYXJhbXMtPnByb2JlUmVxTnVtYmVyID0gcHJvYmVOdW07CiAgICBwU2NhblBhcmFtcy0+VGlkID0gdGlkOwogICAgcFNjYW5QYXJhbXMtPnByb2JlUmVxdWVzdFJhdGUgPSBEUlZfUkFURV9NQVNLXzJfQkFSS0VSOwogICAgcFNjYW5QYXJhbXMtPm51bU9mQ2hhbm5lbHMgPSAoVUlOVDgpbm9PZkNoYW47CiAgICBmb3IoaT0wOyggaSA8IG5vT2ZDaGFuICk7aSsrKSB7CiAgICAgICAgZm9yKGo9MDsoIGogPCBNQUNfQUREUl9MRU4gKTtqKyspIHsKICAgICAgICAgICAgcFNjYW5QYXJhbXMtPmNoYW5uZWxFbnRyeVsgaSBdLm5vcm1hbENoYW5uZWxFbnRyeS5ic3NJZC5hZGRyWyBqIF0gPSAweGZmOwogICAgICAgIH0KICAgICAgICBwU2NhblBhcmFtcy0+Y2hhbm5lbEVudHJ5WyBpIF0ubm9ybWFsQ2hhbm5lbEVudHJ5LmVhcmx5VGVybWluYXRpb25FdmVudCA9IFNDQU5fRVRfQ09ORF9ESVNBQkxFOwogICAgICAgIHBTY2FuUGFyYW1zLT5jaGFubmVsRW50cnlbIGkgXS5ub3JtYWxDaGFubmVsRW50cnkuRVRNYXhOdW1PZkFQZnJhbWVzID0gMDsKICAgICAgICBwU2NhblBhcmFtcy0+Y2hhbm5lbEVudHJ5WyBpIF0ubm9ybWFsQ2hhbm5lbEVudHJ5Lm1heENoYW5uZWxEd2VsbFRpbWUgPSBzY2FuTWF4RHdlbGxUaW1lOwogICAgICAgIHBTY2FuUGFyYW1zLT5jaGFubmVsRW50cnlbIGkgXS5ub3JtYWxDaGFubmVsRW50cnkubWluQ2hhbm5lbER3ZWxsVGltZSA9IHNjYW5NaW5Ed2VsbFRpbWU7CiNpZmRlZiBTVEFfREtfVkVSXzVfMF8wXzk0CiAgICAgICAgcFNjYW5QYXJhbXMtPmNoYW5uZWxFbnRyeVsgaSBdLm5vcm1hbENoYW5uZWxFbnRyeS50eFBvd2VyTGV2ZWwgPSAxOwojZWxzZQogICAgICAgIHBTY2FuUGFyYW1zLT5jaGFubmVsRW50cnlbIGkgXS5ub3JtYWxDaGFubmVsRW50cnkudHhQb3dlckRibSA9IE1BWF9UWF9QT1dFUjsKI2VuZGlmCiAgICAgICAgcFNjYW5QYXJhbXMtPmNoYW5uZWxFbnRyeVsgaSBdLm5vcm1hbENoYW5uZWxFbnRyeS5jaGFubmVsID0gaSArIDE7CiAgICB9CgogICAgLyogaW5pdCBkZWZhdWx0IHNjYW4gcG9saWN5ICovCiAgICBwU2NhblBvbGljeS0+bm9ybWFsU2NhbkludGVydmFsID0gMTAwMDA7CiAgICBwU2NhblBvbGljeS0+ZGV0ZXJpb3JhdGluZ1NjYW5JbnRlcnZhbCA9IDUwMDA7CiAgICBwU2NhblBvbGljeS0+bWF4VHJhY2tGYWlsdXJlcyA9IDM7CiAgICBwU2NhblBvbGljeS0+QlNTTGlzdFNpemUgPSA0OwogICAgcFNjYW5Qb2xpY3ktPkJTU051bWJlclRvU3RhcnREaXNjb3ZlcnkgPSAxOwogICAgcFNjYW5Qb2xpY3ktPm51bU9mQmFuZHMgPSAxOwogICAgcFNjYW5Qb2xpY3ktPmJhbmRTY2FuUG9saWN5WyAwIF0uYmFuZCA9IFJBRElPX0JBTkRfMl80X0dIWjsKICAgIHBTY2FuUG9saWN5LT5iYW5kU2NhblBvbGljeVsgMCBdLnJ4UlNTSVRocmVzaG9sZCA9IC04MDsKICAgIHBTY2FuUG9saWN5LT5iYW5kU2NhblBvbGljeVsgMCBdLm51bU9mQ2hhbm5sZXMgPSAoVUlOVDgpbm9PZkNoYW47CiAgICBwU2NhblBvbGljeS0+YmFuZFNjYW5Qb2xpY3lbIDAgXS5udW1PZkNoYW5ubGVzRm9yRGlzY292ZXJ5ID0gMzsKICAgIGZvcihpPTA7KCBpIDwgbm9PZkNoYW4gKTtpKyspIHsKICAgICAgICBwU2NhblBvbGljeS0+YmFuZFNjYW5Qb2xpY3lbIDAgXS5jaGFubmVsTGlzdFsgaSBdID0gaSArIDE7CiAgICB9CiAgICBwU2NhblBvbGljeS0+YmFuZFNjYW5Qb2xpY3lbIDAgXS50cmFja2luZ01ldGhvZC5zY2FuVHlwZSA9IFNDQU5fVFlQRV9OT19TQ0FOOwogICAgcFNjYW5Qb2xpY3ktPmJhbmRTY2FuUG9saWN5WyAwIF0udHJhY2tpbmdNZXRob2QubWV0aG9kLmJhc2ljTWV0aG9kUGFyYW1zLmVhcmx5VGVybWluYXRpb25FdmVudCA9IFNDQU5fRVRfQ09ORF9ESVNBQkxFOwogICAgcFNjYW5Qb2xpY3ktPmJhbmRTY2FuUG9saWN5WyAwIF0udHJhY2tpbmdNZXRob2QubWV0aG9kLmJhc2ljTWV0aG9kUGFyYW1zLkVUTWF4TnVtYmVyT2ZBcEZyYW1lcyA9IDA7CiAgICBwU2NhblBvbGljeS0+YmFuZFNjYW5Qb2xpY3lbIDAgXS50cmFja2luZ01ldGhvZC5tZXRob2QuYmFzaWNNZXRob2RQYXJhbXMubWF4Q2hhbm5lbER3ZWxsVGltZSA9IGNoYW5NYXhEd2VsbFRpbWU7CiAgICBwU2NhblBvbGljeS0+YmFuZFNjYW5Qb2xpY3lbIDAgXS50cmFja2luZ01ldGhvZC5tZXRob2QuYmFzaWNNZXRob2RQYXJhbXMubWluQ2hhbm5lbER3ZWxsVGltZSA9IGNoYW5NaW5Ed2VsbFRpbWU7CiAgICBwU2NhblBvbGljeS0+YmFuZFNjYW5Qb2xpY3lbIDAgXS50cmFja2luZ01ldGhvZC5tZXRob2QuYmFzaWNNZXRob2RQYXJhbXMucHJvYlJlcVBhcmFtcy5iaXRyYXRlID0gRFJWX1JBVEVfTUFTS18xX0JBUktFUjsKICAgIHBTY2FuUG9saWN5LT5iYW5kU2NhblBvbGljeVsgMCBdLnRyYWNraW5nTWV0aG9kLm1ldGhvZC5iYXNpY01ldGhvZFBhcmFtcy5wcm9iUmVxUGFyYW1zLm51bU9mUHJvYmVSZXFzID0gcFNjYW5QYXJhbXMtPnByb2JlUmVxTnVtYmVyOwojaWZkZWYgU1RBX0RLX1ZFUl81XzBfMF85NAogICAgcFNjYW5Qb2xpY3ktPmJhbmRTY2FuUG9saWN5WyAwIF0udHJhY2tpbmdNZXRob2QubWV0aG9kLmJhc2ljTWV0aG9kUGFyYW1zLnByb2JSZXFQYXJhbXMudHhMZXZlbCA9IDE7CiNlbHNlCiAgICBwU2NhblBvbGljeS0+YmFuZFNjYW5Qb2xpY3lbIDAgXS50cmFja2luZ01ldGhvZC5tZXRob2QuYmFzaWNNZXRob2RQYXJhbXMucHJvYlJlcVBhcmFtcy50eFBvd2VyRGJtID0gTUFYX1RYX1BPV0VSOwojZW5kaWYKICAgIHBTY2FuUG9saWN5LT5iYW5kU2NhblBvbGljeVsgMCBdLmRpc2NvdmVyeU1ldGhvZC5zY2FuVHlwZSA9IFNDQU5fVFlQRV9OT19TQ0FOOwogICAgcFNjYW5Qb2xpY3ktPmJhbmRTY2FuUG9saWN5WyAwIF0uZGlzY292ZXJ5TWV0aG9kLm1ldGhvZC5iYXNpY01ldGhvZFBhcmFtcy5lYXJseVRlcm1pbmF0aW9uRXZlbnQgPSBTQ0FOX0VUX0NPTkRfRElTQUJMRTsKICAgIHBTY2FuUG9saWN5LT5iYW5kU2NhblBvbGljeVsgMCBdLmRpc2NvdmVyeU1ldGhvZC5tZXRob2QuYmFzaWNNZXRob2RQYXJhbXMuRVRNYXhOdW1iZXJPZkFwRnJhbWVzID0gMDsKICAgIHBTY2FuUG9saWN5LT5iYW5kU2NhblBvbGljeVsgMCBdLmRpc2NvdmVyeU1ldGhvZC5tZXRob2QuYmFzaWNNZXRob2RQYXJhbXMubWF4Q2hhbm5lbER3ZWxsVGltZSA9IGNoYW5NYXhEd2VsbFRpbWU7CiAgICBwU2NhblBvbGljeS0+YmFuZFNjYW5Qb2xpY3lbIDAgXS5kaXNjb3ZlcnlNZXRob2QubWV0aG9kLmJhc2ljTWV0aG9kUGFyYW1zLm1pbkNoYW5uZWxEd2VsbFRpbWUgPSBjaGFuTWluRHdlbGxUaW1lOwogICAgcFNjYW5Qb2xpY3ktPmJhbmRTY2FuUG9saWN5WyAwIF0uZGlzY292ZXJ5TWV0aG9kLm1ldGhvZC5iYXNpY01ldGhvZFBhcmFtcy5wcm9iUmVxUGFyYW1zLmJpdHJhdGUgPSBEUlZfUkFURV9NQVNLXzJfQkFSS0VSOwogICAgcFNjYW5Qb2xpY3ktPmJhbmRTY2FuUG9saWN5WyAwIF0uZGlzY292ZXJ5TWV0aG9kLm1ldGhvZC5iYXNpY01ldGhvZFBhcmFtcy5wcm9iUmVxUGFyYW1zLm51bU9mUHJvYmVSZXFzID0gcFNjYW5QYXJhbXMtPnByb2JlUmVxTnVtYmVyOwojaWZkZWYgU1RBX0RLX1ZFUl81XzBfMF85NAogICAgcFNjYW5Qb2xpY3ktPmJhbmRTY2FuUG9saWN5WyAwIF0uZGlzY292ZXJ5TWV0aG9kLm1ldGhvZC5iYXNpY01ldGhvZFBhcmFtcy5wcm9iUmVxUGFyYW1zLnR4TGV2ZWwgPSAxOwojZWxzZQogICAgcFNjYW5Qb2xpY3ktPmJhbmRTY2FuUG9saWN5WyAwIF0uZGlzY292ZXJ5TWV0aG9kLm1ldGhvZC5iYXNpY01ldGhvZFBhcmFtcy5wcm9iUmVxUGFyYW1zLnR4UG93ZXJEYm0gPSBNQVhfVFhfUE9XRVI7CiNlbmRpZgogICAgcFNjYW5Qb2xpY3ktPmJhbmRTY2FuUG9saWN5WyAwIF0uaW1tZWRpYXRlU2Nhbk1ldGhvZC5zY2FuVHlwZSA9IGJ0Q29leFNjYW4gPyBTQ0FOX1RZUEVfVFJJR0dFUkVEX0FDVElWRSA6IFNDQU5fVFlQRV9OT1JNQUxfQUNUSVZFOwogICAgcFNjYW5Qb2xpY3ktPmJhbmRTY2FuUG9saWN5WyAwIF0uaW1tZWRpYXRlU2Nhbk1ldGhvZC5tZXRob2QuYmFzaWNNZXRob2RQYXJhbXMuZWFybHlUZXJtaW5hdGlvbkV2ZW50ID0gU0NBTl9FVF9DT05EX0RJU0FCTEU7CiAgICBwU2NhblBvbGljeS0+YmFuZFNjYW5Qb2xpY3lbIDAgXS5pbW1lZGlhdGVTY2FuTWV0aG9kLm1ldGhvZC5iYXNpY01ldGhvZFBhcmFtcy5FVE1heE51bWJlck9mQXBGcmFtZXMgPSAwOwogICAgcFNjYW5Qb2xpY3ktPmJhbmRTY2FuUG9saWN5WyAwIF0uaW1tZWRpYXRlU2Nhbk1ldGhvZC5tZXRob2QuYmFzaWNNZXRob2RQYXJhbXMubWF4Q2hhbm5lbER3ZWxsVGltZSA9IGNoYW5NYXhEd2VsbFRpbWU7CiAgICBwU2NhblBvbGljeS0+YmFuZFNjYW5Qb2xpY3lbIDAgXS5pbW1lZGlhdGVTY2FuTWV0aG9kLm1ldGhvZC5iYXNpY01ldGhvZFBhcmFtcy5taW5DaGFubmVsRHdlbGxUaW1lID0gY2hhbk1pbkR3ZWxsVGltZTsKICAgIHBTY2FuUG9saWN5LT5iYW5kU2NhblBvbGljeVsgMCBdLmltbWVkaWF0ZVNjYW5NZXRob2QubWV0aG9kLmJhc2ljTWV0aG9kUGFyYW1zLnByb2JSZXFQYXJhbXMuYml0cmF0ZSA9IERSVl9SQVRFX01BU0tfNV81X0NDSzsKICAgIHBTY2FuUG9saWN5LT5iYW5kU2NhblBvbGljeVsgMCBdLmltbWVkaWF0ZVNjYW5NZXRob2QubWV0aG9kLmJhc2ljTWV0aG9kUGFyYW1zLnByb2JSZXFQYXJhbXMubnVtT2ZQcm9iZVJlcXMgPSBwU2NhblBhcmFtcy0+cHJvYmVSZXFOdW1iZXI7CiNpZmRlZiBTVEFfREtfVkVSXzVfMF8wXzk0CiAgICBwU2NhblBvbGljeS0+YmFuZFNjYW5Qb2xpY3lbIDAgXS5pbW1lZGlhdGVTY2FuTWV0aG9kLm1ldGhvZC5iYXNpY01ldGhvZFBhcmFtcy5wcm9iUmVxUGFyYW1zLnR4TGV2ZWwgPSAxOwojZWxzZQogICAgcFNjYW5Qb2xpY3ktPmJhbmRTY2FuUG9saWN5WyAwIF0uaW1tZWRpYXRlU2Nhbk1ldGhvZC5tZXRob2QuYmFzaWNNZXRob2RQYXJhbXMucHJvYlJlcVBhcmFtcy50eFBvd2VyRGJtID0gTUFYX1RYX1BPV0VSOwojZW5kaWYKfQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpSb3V0aW5lIE5hbWU6IHdwYV9kcml2ZXJfdGlzdGFfc2NhbgpSb3V0aW5lIERlc2NyaXB0aW9uOiByZXF1ZXN0IHNjYW4gZnJvbSBkcml2ZXIKQXJndW1lbnRzOgogICBwcml2IC0gcG9pbnRlciB0byBwcml2YXRlIGRhdGEgc3RydWN0dXJlCiAgIHNzaWQgLSBzc2lkIGJ1ZmZlcgogICBzc2lkX2xlbiAtIGxlbmd0aCBvZiBzc2lkClJldHVybiBWYWx1ZTogMCBvbiBzdWNjZXNzLCAtMSBvbiBmYWlsdXJlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8Kc3RhdGljIGludCB3cGFfZHJpdmVyX3Rpc3RhX3NjYW4oIHZvaWQgKnByaXYsIGNvbnN0IFVJTlQ4ICpzc2lkLCBzaXplX3Qgc3NpZF9sZW4gKQp7CiAgICBzdHJ1Y3Qgd3BhX2RyaXZlcl90aV9kYXRhICpteURydiA9IChzdHJ1Y3Qgd3BhX2RyaXZlcl90aV9kYXRhICopcHJpdjsKICAgIHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MgPSAoc3RydWN0IHdwYV9zdXBwbGljYW50ICopKG15RHJ2LT5oV3BhU3VwcGxpY2FudCk7CiAgICBzdHJ1Y3Qgd3BhX3NzaWQgKmlzc2lkOwogICAgc2Nhbl9QYXJhbXNfdCBzY2FuUGFyYW1zOwogICAgc2Nhbl9Qb2xpY3lfdCBzY2FuUG9saWN5OwogICAgaW50IHNjYW5fdHlwZSwgcmV0LCBzY2FuX3Byb2JlX2ZsYWcgPSAwOwoKICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCJ3cGFfZHJpdmVyX3Rpc3RhX3NjYW4gY2FsbGVkIik7CiAgICAvKiBJZiBkcml2ZXIgaXMgbm90IGluaXRpYWxpemVkIHlldCAtIHdlIGNhbm5vdCBhY2Nlc3MgaXQgc28gcmV0dXJuICovCiAgICBUSV9DSEVDS19EUklWRVIoIG15RHJ2LT5kcml2ZXJfaXNfbG9hZGVkLCAtMSApOwoKICAgIHNjYW5fdHlwZSA9IG15RHJ2LT5zY2FuX3R5cGU7CiAgICBpZiAod3BhX3MtPnByZXZfc2Nhbl9zc2lkICE9IEJST0FEQ0FTVF9TU0lEX1NDQU4pIHsKICAgICAgICBpZiAod3BhX3MtPnByZXZfc2Nhbl9zc2lkLT5zY2FuX3NzaWQpIHsKICAgICAgICAgICAgc2Nhbl90eXBlID0gU0NBTl9UWVBFX05PUk1BTF9BQ1RJVkU7CiAgICAgICAgICAgIHNjYW5fcHJvYmVfZmxhZyA9IDE7CiAgICAgICAgfQogICAgfQoKICAgIHRpX2luaXRfc2Nhbl9wYXJhbXMoICZzY2FuUGFyYW1zLCAmc2NhblBvbGljeSwgc2Nhbl90eXBlLCBteURydiApOwoKICAgIG15RHJ2LT5mb3JjZV9tZXJnZV9mbGFnID0gMDsgLyogU2V0IG1lcmdlIGZsYWcgKi8KCiAgICBpZiAoKHNjYW5fcHJvYmVfZmxhZyAmJiBzc2lkKSAmJgogICAgICAgIChzc2lkX2xlbiA+IDAgJiYgc3NpZF9sZW4gPD0gc2l6ZW9mKHNjYW5QYXJhbXMuZGVzaXJlZFNzaWQuc3NpZFN0cmluZykpKSB7CiAgICAgICAgb3NfbWVtY3B5KHNjYW5QYXJhbXMuZGVzaXJlZFNzaWQuc3NpZFN0cmluZywgc3NpZCwgc3NpZF9sZW4pOwoJaWYgKHNzaWRfbGVuIDwgc2l6ZW9mKHNjYW5QYXJhbXMuZGVzaXJlZFNzaWQuc3NpZFN0cmluZykpCiAgICAgICAgICAgIHNjYW5QYXJhbXMuZGVzaXJlZFNzaWQuc3NpZFN0cmluZ1tzc2lkX2xlbl0gPSAnXDAnOwogICAgICAgIHNjYW5QYXJhbXMuZGVzaXJlZFNzaWQubGVuID0gc3NpZF9sZW47CiAgICAgICAgbXlEcnYtPmZvcmNlX21lcmdlX2ZsYWcgPSAxOwogICAgfQogICAgVElfU2V0U2NhblBvbGljeSggbXlEcnYtPmhEcml2ZXIsIChVSU5UOCAqKSZzY2FuUG9saWN5LCBzaXplb2Yoc2Nhbl9Qb2xpY3lfdCkgKTsKICAgIG15RHJ2LT5sYXN0X3NjYW4gPSBzY2FuX3R5cGU7IC8qIFJlbWVtYmVyIHNjYW4gdHlwZSBmb3IgbGFzdCBzY2FuICovCiAgICByZXQgPSBUSV9TdGFydFNjYW4oIG15RHJ2LT5oRHJpdmVyLCAoc2Nhbl9QYXJhbXNfdCAqKSZzY2FuUGFyYW1zICk7CiAgICByZXR1cm4oIFRJMldQQV9TVEFUVVMocmV0KSApOwp9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClJvdXRpbmUgTmFtZTogd3BhX2RyaXZlcl90aXN0YV9zZXRfYXV0aF9hbGcKUm91dGluZSBEZXNjcmlwdGlvbjogc2V0IGF1dGhlbnRpY2F0aW9uIGluIGRyaXZlcgpBcmd1bWVudHM6CiAgIHByaXYgLSBwb2ludGVyIHRvIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUKICAgYXV0aF9hbGcgLSBPcGVuL1NoYXJlZC9MRUFQClJldHVybiBWYWx1ZTogMCBvbiBzdWNjZXNzLCAtMSBvbiBmYWlsdXJlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8Kc3RhdGljIGludCB3cGFfZHJpdmVyX3Rpc3RhX3NldF9hdXRoX2FsZyggdm9pZCAqcHJpdiwgaW50IGF1dGhfYWxnICkKewogICAgc3RydWN0IHdwYV9kcml2ZXJfdGlfZGF0YSAqbXlEcnYgPSAoc3RydWN0IHdwYV9kcml2ZXJfdGlfZGF0YSAqKXByaXY7CgogICAgd3BhX3ByaW50ZihNU0dfREVCVUcsIndwYV9kcml2ZXJfdGlzdGFfc2V0X2F1dGhfYWxnIGNhbGxlZDogJWQiLCBhdXRoX2FsZyk7CiAgICAvKiBJZiBkcml2ZXIgaXMgbm90IGluaXRpYWxpemVkIHlldCAtIHdlIGNhbm5vdCBhY2Nlc3MgaXQgc28gcmV0dXJuICovCiAgICBUSV9DSEVDS19EUklWRVIoIG15RHJ2LT5kcml2ZXJfaXNfbG9hZGVkLCAtMSApOwogICAgbXlEcnYtPmF1dGhfYWxnID0gYXV0aF9hbGc7CiAgICByZXR1cm4oIDAgKTsKfQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpSb3V0aW5lIE5hbWU6IHdwYV9kcml2ZXJfdGlzdGFfZ2V0X2Jzc2lkX2luZm8KUm91dGluZSBEZXNjcmlwdGlvbjogcmV0cmlldmUgYnNzaWQgZnVsbCBpbmZvCkFyZ3VtZW50czoKICAgaERyaXZlciAtIHBvaW50ZXIgdG8gZHJpdmVyIHN0cnVjdHVyZQpSZXR1cm4gVmFsdWU6IHBvaW50ZXIgdG8gQlNTSUQgc3RydWN0dXJlIG9yIE5VTEwKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpzdGF0aWMgT1NfODAyXzExX0JTU0lEX0VYICp3cGFfZHJpdmVyX3Rpc3RhX2dldF9ic3NpZF9pbmZvKCBUSV9IQU5ETEUgaERyaXZlciApCnsKICAgIE9TXzgwMl8xMV9CU1NJRF9MSVNUX0VYICpic3NpZF9saXN0OwogICAgT1NfODAyXzExX0JTU0lEX0VYICpwQnNzaWQsICpuQnNzaWQgPSBOVUxMOwogICAgaW50IGksIG51bWJlcl9pdGVtcywgcmVzOwogICAgT1NfODAyXzExX01BQ19BRERSRVNTIGJzc2lkOwogICAgT1NfODAyXzExX1NTSUQgc3NpZDsKCiAgICBpZiggVElfR2V0QlNTSURMaXN0KCBoRHJpdmVyLCAmYnNzaWRfbGlzdCApIHx8ICFic3NpZF9saXN0ICkKICAgICAgICByZXR1cm4oIG5Cc3NpZCApOwoKICAgIGlmKCBUSV9HZXRCU1NJRCggaERyaXZlciwgJmJzc2lkICkgIT0gVElfUkVTVUxUX09LICkKICAgICAgICByZXR1cm4oIG5Cc3NpZCApOwoKICAgIGlmKCBUSV9HZXRDdXJyZW50U1NJRCggaERyaXZlciwgJnNzaWQgKSAhPSBUSV9SRVNVTFRfT0sgKQogICAgICAgIHJldHVybiggbkJzc2lkICk7CgogICAgcEJzc2lkID0gJmJzc2lkX2xpc3QtPkJzc2lkWzBdOwogICAgbnVtYmVyX2l0ZW1zID0gKGludCkoYnNzaWRfbGlzdC0+TnVtYmVyT2ZJdGVtcyk7CiAgICBmb3IoaT0wOyggaSA8IG51bWJlcl9pdGVtcyApO2krKykgewogICAgICAgIGlmKCAhb3NfbWVtY21wKCh2b2lkICopJmJzc2lkLCBwQnNzaWQtPk1hY0FkZHJlc3MsIE1BQ19BRERSX0xFTikgJiYKICAgICAgICAgICAgIW9zX21lbWNtcChzc2lkLlNzaWQsIHBCc3NpZC0+U3NpZC5Tc2lkLCBwQnNzaWQtPlNzaWQuU3NpZExlbmd0aCkgKSB7CiAgICAgICAgICAgIG5Cc3NpZCA9IChPU184MDJfMTFfQlNTSURfRVggKilvc19tYWxsb2MoIHBCc3NpZC0+TGVuZ3RoICk7CiAgICAgICAgICAgIGlmKCBuQnNzaWQgIT0gTlVMTCApCiAgICAgICAgICAgICAgICBvc19tZW1jcHkoIG5Cc3NpZCwgcEJzc2lkLCBwQnNzaWQtPkxlbmd0aCApOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgcEJzc2lkID0gKE9TXzgwMl8xMV9CU1NJRF9FWCAqKSgoKGNoYXIgKilwQnNzaWQpICsgcEJzc2lkLT5MZW5ndGgpOwogICAgfQogICAgb3NfZnJlZSggYnNzaWRfbGlzdCApOwogICAgcmV0dXJuKCBuQnNzaWQgKTsKfQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpDb21wYXJlIGZ1bmN0aW9uIGZvciBzb3J0aW5nIHNjYW4gcmVzdWx0cy4gUmV0dXJuID4wIGlmIEBiIGlzIGNvbnNpZGVyZWQgYmV0dGVyLgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCnN0YXRpYyBpbnQgd3BhX2RyaXZlcl90aXN0YV9zY2FuX3Jlc3VsdF9jb21wYXJlKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpCnsKICAgIGNvbnN0IHN0cnVjdCB3cGFfc2Nhbl9yZXN1bHQgKndhID0gYTsKICAgIGNvbnN0IHN0cnVjdCB3cGFfc2Nhbl9yZXN1bHQgKndiID0gYjsKCiAgICByZXR1cm4oIHdiLT5sZXZlbCAtIHdhLT5sZXZlbCApOwp9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClJvdXRpbmUgTmFtZTogd3BhX2RyaXZlcl90aXN0YV9nZXRfc2Nhbl9yZXN1bHRzClJvdXRpbmUgRGVzY3JpcHRpb246IHJldHJpZXZlIGRyaXZlciBzY2FuIHJlc3VsdHMKQXJndW1lbnRzOgogICBwcml2IC0gcG9pbnRlciB0byBwcml2YXRlIGRhdGEgc3RydWN0dXJlCiAgIHJlc3VsdHMgLSBwb2ludGVyIHRvIGJ1ZmZlcgogICBtYXhfc2l6ZSAtIG1heGltdW0gc2l6ZSBvZiByZXN1bHRzIGJ1ZmZlcgpSZXR1cm4gVmFsdWU6IG51bWJlciBvZiBTU0lEIG9uIHN1Y2Nlc3MsIC0xIG9uIGZhaWx1cmUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpzdGF0aWMgaW50IHdwYV9kcml2ZXJfdGlzdGFfZ2V0X3NjYW5fcmVzdWx0cyggdm9pZCAqcHJpdiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB3cGFfc2Nhbl9yZXN1bHQgKnJlc3VsdHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbWF4X3NpemUgKQp7CiAgICBzdHJ1Y3Qgd3BhX2RyaXZlcl90aV9kYXRhICpteURydiA9IChzdHJ1Y3Qgd3BhX2RyaXZlcl90aV9kYXRhICopcHJpdjsKICAgIE9TXzgwMl8xMV9CU1NJRF9MSVNUX0VYICpic3NpZF9saXN0OwogICAgT1NfODAyXzExX0JTU0lEX0VYICpwQnNzaWQ7CiAgICBPU184MDJfMTFfRklYRURfSUVzICpwRml4ZWRJZXM7CiAgICBPU184MDJfMTFfVkFSSUFCTEVfSUVzICpwVmFySWVzOwogICAgdW5zaWduZWQgaW50IG51bWJlcl9pdGVtcywgaSwgaW5kZXg7CgogICAgd3BhX3ByaW50ZihNU0dfREVCVUcsIndwYV9kcml2ZXJfdGlzdGFfZ2V0X3NjYW5fcmVzdWx0cyBjYWxsZWQiKTsKICAgIC8qIElmIGRyaXZlciBpcyBub3QgaW5pdGlhbGl6ZWQgeWV0IC0gd2UgY2Fubm90IGFjY2VzcyBpdCBzbyByZXR1cm4gKi8KICAgIFRJX0NIRUNLX0RSSVZFUiggbXlEcnYtPmRyaXZlcl9pc19sb2FkZWQsIC0xICk7CgogICAgaWYoIFRJX0dldEJTU0lETGlzdChteURydi0+aERyaXZlciwgJmJzc2lkX2xpc3QpIHx8ICFic3NpZF9saXN0ICkKICAgICAgICByZXR1cm4oIC0xICk7CgogICAgcEJzc2lkID0gJmJzc2lkX2xpc3QtPkJzc2lkWzBdOwogICAgbnVtYmVyX2l0ZW1zID0gKGludCkoYnNzaWRfbGlzdC0+TnVtYmVyT2ZJdGVtcyk7CgogICAgd3BhX3ByaW50ZihNU0dfTVNHRFVNUCwgIlJlY2VpdmVkICVkIGJ5dGVzIG9mIHNjYW4gcmVzdWx0cyAoJWQgQlNTZXMpIiwKICAgICAgICAgICBudW1iZXJfaXRlbXMgKiBzaXplb2YoT1NfODAyXzExX0JTU0lEX0VYKSwgbnVtYmVyX2l0ZW1zKTsKCiAgICBvc19tZW1zZXQoIHJlc3VsdHMsIDAsIG1heF9zaXplICogc2l6ZW9mKHN0cnVjdCB3cGFfc2Nhbl9yZXN1bHQpICk7CiAgICBudW1iZXJfaXRlbXMgPSBNSU4oIG51bWJlcl9pdGVtcywgbWF4X3NpemUgKTsKCiAgICBmb3IoaW5kZXg9MDsgaW5kZXggPCBudW1iZXJfaXRlbXM7IGluZGV4KyspIHsKICAgICAgICBvc19tZW1jcHkoIHJlc3VsdHNbaW5kZXhdLmJzc2lkLCAmcEJzc2lkLT5NYWNBZGRyZXNzLCBFVEhfQUxFTiApOwogICAgICAgIG9zX21lbWNweSggcmVzdWx0c1tpbmRleF0uc3NpZCwgcEJzc2lkLT5Tc2lkLlNzaWQsIHBCc3NpZC0+U3NpZC5Tc2lkTGVuZ3RoICk7CiAgICAgICAgcmVzdWx0c1tpbmRleF0uc3NpZF9sZW4gPSBwQnNzaWQtPlNzaWQuU3NpZExlbmd0aDsKI2lmZGVmIFNUQV9ES19WRVJfNV8wXzBfOTQKICAgICAgICByZXN1bHRzW2luZGV4XS5mcmVxID0gcEJzc2lkLT5Db25maWd1cmF0aW9uLmNoYW5uZWwgLyAxMDAwOwogICAgICAgIHJlc3VsdHNbaW5kZXhdLmNhcHMgPSBwQnNzaWQtPkNhcGFiaWxpdGllczsKI2Vsc2UKICAgICAgICByZXN1bHRzW2luZGV4XS5mcmVxID0gcEJzc2lkLT5Db25maWd1cmF0aW9uLlVuaW9uLmNoYW5uZWwgLyAxMDAwOwogICAgICAgIHJlc3VsdHNbaW5kZXhdLmNhcHMgPSBwQnNzaWQtPlVuaW9uLkNhcGFiaWxpdGllczsKI2VuZGlmCiAgICAgICAgcmVzdWx0c1tpbmRleF0ubGV2ZWwgPSBwQnNzaWQtPlJzc2k7CiAgICAgICAgcmVzdWx0c1tpbmRleF0ubWF4cmF0ZSA9IDA7IC8qIEluIHVuaXRzIG9mIDAuNSBNYi9zICovCiAgICAgICAgZm9yIChpID0gMDsgaSA8IHNpemVvZihwQnNzaWQtPlN1cHBvcnRlZFJhdGVzKTsgaSsrKSB7CiAgICAgICAgICAgIGlmIChwQnNzaWQtPlN1cHBvcnRlZFJhdGVzW2ldID4gKHVuc2lnbmVkKXJlc3VsdHNbaW5kZXhdLm1heHJhdGUpIHsKICAgICAgICAgICAgICAgIHJlc3VsdHNbaW5kZXhdLm1heHJhdGUgPSBwQnNzaWQtPlN1cHBvcnRlZFJhdGVzW2ldOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCJUSTogTmV0OiAlcyBDYXA6IDB4JTA0eCBQcml2OiAweCV4IE5ldFR5cGU6IDB4JXggSW5mcmFNb2RlOiAweCV4IElFTGVuOiAlZCIsCiNpZmRlZiBTVEFfREtfVkVSXzVfMF8wXzk0CiAgICAgICAgICAgICAgICAgICBwQnNzaWQtPlNzaWQuU3NpZCwgcEJzc2lkLT5DYXBhYmlsaXRpZXMsIHBCc3NpZC0+UHJpdmFjeSwgcEJzc2lkLT5OZXR3b3JrVHlwZUluVXNlLAojZWxzZQogICAgICAgICAgICAgICAgICAgcEJzc2lkLT5Tc2lkLlNzaWQsIHBCc3NpZC0+VW5pb24uQ2FwYWJpbGl0aWVzLCBwQnNzaWQtPlByaXZhY3ksIHBCc3NpZC0+TmV0d29ya1R5cGVJblVzZSwKI2VuZGlmCiAgICAgICAgICAgICAgICAgICBwQnNzaWQtPkluZnJhc3RydWN0dXJlTW9kZSwgcEJzc2lkLT5JRUxlbmd0aCApOwoKICAgICAgICAvKiBGaXhlZCBJRXMgZnJvbSBzaXRlIGVudHJ5IC0gc2FtZSBDYXBhYmlsaXRpZXMgKi8KICAgICAgICBwRml4ZWRJZXMgPSAoT1NfODAyXzExX0ZJWEVEX0lFcyAqKSZwQnNzaWQtPklFc1swXTsKICAgICAgICB3cGFfcHJpbnRmKE1TR19ERUJVRywiVEk6IEZpeGVkIElFczogQmVhY29uOiAweCV4IENhcDogMHgleCIsIHBGaXhlZEllcy0+QmVhY29uSW50ZXJ2YWwsIHBGaXhlZEllcy0+Q2FwYWJpbGl0aWVzKTsKICAgICAgICBmb3IoaT1zaXplb2YoT1NfODAyXzExX0ZJWEVEX0lFcyk7IGkgPCBwQnNzaWQtPklFTGVuZ3RoOykgewogICAgICAgICAgICBwVmFySWVzID0gKE9TXzgwMl8xMV9WQVJJQUJMRV9JRXMgKikmcEJzc2lkLT5JRXNbaV07CiAgICAgICAgICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCJUSTogVmFyaWFibGUgSUVzOiBJRDogMHgleCBMZW46ICVkIiwgcFZhckllcy0+RWxlbWVudElELCBwVmFySWVzLT5MZW5ndGgpOwogICAgICAgICAgICB3cGFfaGV4ZHVtcChNU0dfREVCVUcsIlRJOiBvdWk6IiwgcFZhckllcy0+ZGF0YSwgcFZhckllcy0+TGVuZ3RoKTsKICAgICAgICAgICAgc3dpdGNoKCBwVmFySWVzLT5FbGVtZW50SUQgKSB7CiAgICAgICAgICAgICAgICBjYXNlIEdFTkVSSUNfSU5GT19FTEVNOiAvKiAweGRkICovCiAgICAgICAgICAgICAgICAgICAgaWYoIChwVmFySWVzLT5MZW5ndGggPiAzKSAmJiAob3NfbWVtY21wKHBWYXJJZXMtPmRhdGEsIFdQQV9PVUksIDQpID09IDApICkgewogICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzW2luZGV4XS53cGFfaWVfbGVuID0gTUlOKChwVmFySWVzLT5MZW5ndGggKyAyKSwgU1NJRF9NQVhfV1BBX0lFX0xFTik7CiAgICAgICAgICAgICAgICAgICAgICAgIG9zX21lbWNweSggcmVzdWx0c1tpbmRleF0ud3BhX2llLCBwVmFySWVzLCByZXN1bHRzW2luZGV4XS53cGFfaWVfbGVuICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgIGNhc2UgUlNOX0lORk9fRUxFTTogICAgIC8qIDB4MzAgKi8KICAgICAgICAgICAgICAgICAgICByZXN1bHRzW2luZGV4XS5yc25faWVfbGVuID0gTUlOKChwVmFySWVzLT5MZW5ndGggKyAyKSwgU1NJRF9NQVhfV1BBX0lFX0xFTik7CiAgICAgICAgICAgICAgICAgICAgb3NfbWVtY3B5KCByZXN1bHRzW2luZGV4XS5yc25faWUsIHBWYXJJZXMsIHJlc3VsdHNbaW5kZXhdLnJzbl9pZV9sZW4gKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBpICs9IChwVmFySWVzLT5MZW5ndGggKyAoMiAqIHNpemVvZih0aVVJTlQ4KSkpOwogICAgICAgIH0KICAgICAgICBwQnNzaWQgPSAoT1NfODAyXzExX0JTU0lEX0VYICopKCgodTggKilwQnNzaWQpICsgcEJzc2lkLT5MZW5ndGgpOwogICAgfQogICAgLyogTWVyZ2UgbmV3IHJlc3VsdHMgd2l0aCBwcmV2aW91cyAqLwogICAgbnVtYmVyX2l0ZW1zID0gc2Nhbl9tZXJnZSggbXlEcnYsIHJlc3VsdHMsIG15RHJ2LT5mb3JjZV9tZXJnZV9mbGFnLCBudW1iZXJfaXRlbXMsIG1heF9zaXplICk7CgogICAgcXNvcnQoIHJlc3VsdHMsIG51bWJlcl9pdGVtcywgc2l6ZW9mKHN0cnVjdCB3cGFfc2Nhbl9yZXN1bHQpLAogICAgICAgICAgIHdwYV9kcml2ZXJfdGlzdGFfc2Nhbl9yZXN1bHRfY29tcGFyZSApOwoKICAgIG9zX2ZyZWUoIGJzc2lkX2xpc3QgKTsKICAgIHJldHVybiggbnVtYmVyX2l0ZW1zICk7Cn0KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KUm91dGluZSBOYW1lOiB3cGFfZHJpdmVyX3Rpc3RhX2dldF9zY2FuX3Jlc3VsdHMKUm91dGluZSBEZXNjcmlwdGlvbjogcmV0cmlldmUgZHJpdmVyIHNjYW4gcmVzdWx0cwpBcmd1bWVudHM6CiAgIHNvY2sgLSBzb2NrZXQKICAgcHJpdiAtIHBvaW50ZXIgdG8gcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZQogICBzb2NrX2N0eCAtIHBvaW50ZXIgdG8gb3RoZXIgcHJpdmF0ZSBkYXRhClJldHVybiBWYWx1ZTogTm9uZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCnN0YXRpYyB2b2lkIHdwYV9kcml2ZXJfdGlzdGFfcmVjZWl2ZV9kcml2ZXJfZXZlbnQoIGludCBzb2NrLCB2b2lkICpwcml2LCB2b2lkICpzb2NrX2N0eCApCnsKICAgIElQQ19FVl9EQVRBIG15QnVmOwogICAgVUlOVDggKmJ1ZjsKICAgIFVJTlQzMiAqYnVmTG9uZzsKICAgIHVuaW9uIHdwYV9ldmVudF9kYXRhIG15RXZlbnREYXRhOwogICAgc3RydWN0IHdwYV9kcml2ZXJfdGlfZGF0YSAqbXlTdXBwbDsKICAgIE9TXzgwMl8xMV9BU1NPQ0lBVElPTl9JTkZPUk1BVElPTiAqcEluZm8gPSBOVUxMOwogICAgT1NfODAyXzExX0FVVEhFTlRJQ0FUSU9OX1JFUVVFU1QgKnBNZWRpYVNwZWNpZmljQnVmOwogICAgT1NfODAyXzExX0JTU0lEX0VYICpwU2VsZWN0ZWRCc3NpZEluZm8gPSBOVUxMOwogICAgT1NfODAyXzExX05FVFdPUktfTU9ERSBteUJzc1R5cGU7CiAgICBJUENfRVZfREFUQSAqcERhdGEgPSAmbXlCdWY7CiAgICBpbnQgcmVzOwojaWZuZGVmIFNUQV9ES19WRVJfNV8wXzBfOTQKICAgIGJ0Q29leFN0YXR1c190ICpidENvZXhTdGF0dXM7CiNlbmRpZgoKICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCJ3cGFfZHJpdmVyX3Rpc3RhX3JlY2VpdmVfZHJpdmVyX2V2ZW50Li4uIik7CgogICAgcmVzID0gcmVjdiggc29jaywgJm15QnVmLCBzaXplb2YobXlCdWYpLCAwICk7CiAgICBpZiggcmVzIDwgMCApIHsKICAgICAgICB3cGFfcHJpbnRmKE1TR19FUlJPUiwibDJfcGFja2V0X3JlY2VpdmUgLSByZWN2ZnJvbSIpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBteVN1cHBsID0gcERhdGEtPkV2UGFyYW1zLmhVc2VyUGFyYW07CgogICAgc3dpdGNoKCAoKElQQ19FVkVOVF9QQVJBTVMqKXBEYXRhKS0+dUV2ZW50VHlwZSApIHsKICAgICAgICBjYXNlIElQQ19FVkVOVF9BU1NPQ0lBVEVEOgogICAgICAgICAgICAvKiBBc3NvY2lhdGVkIGV2ZW50IGlzIGNhbGxlZCBhZnRlciBzdWNjZXNzZnVsbCBBU1NPQ19SU1AgcGFja2V0IGlzIHJlY2VpdmVkICovCiAgICAgICAgICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCJ3cGFfc3VwcGxpY2FudCAtIEFzc29jaWF0ZWQiKTsKCiAgICAgICAgICAgIFRJX0dldEJTU1R5cGUoIG15U3VwcGwtPmhEcml2ZXIsICZteUJzc1R5cGUgKTsKICAgICAgICAgICAgd3BhX3ByaW50ZihNU0dfREVCVUcsIm15QnNzVHlwZSA9ICVkIixteUJzc1R5cGUpOwoKICAgICAgICAgICAgaWYoIG15QnNzVHlwZSA9PSBvczgwMl8xMUluZnJhc3RydWN0dXJlICkgewogICAgICAgICAgICAgICAgLyogR2V0IEFTU09DX1JFUSBhbmQgQVNTT0NfUlNQIElFICovCiAgICAgICAgICAgICAgICByZXMgPSBUSV9HZXRBc3NvY2lhdGlvbkluZm8oIG15U3VwcGwtPmhEcml2ZXIsICZwSW5mbyApOwogICAgICAgICAgICAgICAgYnVmID0gKFVJTlQ4ICopcEluZm87CgogICAgICAgICAgICAgICAgaWYoIGJ1ZiAhPSBOVUxMICkgewogICAgICAgICAgICAgICAgICAgIG15RXZlbnREYXRhLmFzc29jX2luZm8ucmVxX2llcyA9IGJ1ZiArIHBJbmZvLT5PZmZzZXRSZXF1ZXN0SUVzOwogICAgICAgICAgICAgICAgICAgIG15RXZlbnREYXRhLmFzc29jX2luZm8ucmVxX2llc19sZW4gPSBwSW5mby0+UmVxdWVzdElFTGVuZ3RoOwogICAgICAgICAgICAgICAgICAgIG15RXZlbnREYXRhLmFzc29jX2luZm8ucmVzcF9pZXMgPSBidWYgKyBwSW5mby0+T2Zmc2V0UmVzcG9uc2VJRXM7CiAgICAgICAgICAgICAgICAgICAgbXlFdmVudERhdGEuYXNzb2NfaW5mby5yZXNwX2llc19sZW4gPSBwSW5mby0+UmVzcG9uc2VJRUxlbmd0aDsKICAgICAgICAgICAgICAgICAgICBteUV2ZW50RGF0YS5hc3NvY19pbmZvLmJlYWNvbl9pZXMgPSBOVUxMOwogICAgICAgICAgICAgICAgICAgIG15RXZlbnREYXRhLmFzc29jX2luZm8uYmVhY29uX2llc19sZW4gPSAwOwoKICAgICAgICAgICAgICAgICAgICAvKiBHZXQgQVAgQmVhY29uIElFcyAtIGVzcGVjaWFsbHkgV1BBL1JTTiBJRSAqLwogICAgICAgICAgICAgICAgICAgIHBTZWxlY3RlZEJzc2lkSW5mbyA9IHdwYV9kcml2ZXJfdGlzdGFfZ2V0X2Jzc2lkX2luZm8oIG15U3VwcGwtPmhEcml2ZXIgKTsKICAgICAgICAgICAgICAgICAgICBpZiggcFNlbGVjdGVkQnNzaWRJbmZvICkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiggcFNlbGVjdGVkQnNzaWRJbmZvLT5JRUxlbmd0aCAmJiBwU2VsZWN0ZWRCc3NpZEluZm8tPklFcyApIHsgLyogRG06IEZpeGVkIElFcyAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbXlFdmVudERhdGEuYXNzb2NfaW5mby5iZWFjb25faWVzID0gKFVJTlQ4ICopcFNlbGVjdGVkQnNzaWRJbmZvLT5JRXMgKyBzaXplb2YoT1NfODAyXzExX0ZJWEVEX0lFcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBteUV2ZW50RGF0YS5hc3NvY19pbmZvLmJlYWNvbl9pZXNfbGVuID0gcFNlbGVjdGVkQnNzaWRJbmZvLT5JRUxlbmd0aCAtIHNpemVvZihPU184MDJfMTFfRklYRURfSUVzKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB3cGFfcHJpbnRmKE1TR19ERUJVRywibXlFdmVudERhdGEuYXNzb2NfaW5mby5yZXFfaWVzID0gMHgleCIsKHVuc2lnbmVkKW15RXZlbnREYXRhLmFzc29jX2luZm8ucmVxX2llcyk7CiAgICAgICAgICAgICAgICAgICAgd3BhX3ByaW50ZihNU0dfREVCVUcsIm15RXZlbnREYXRhLmFzc29jX2luZm8ucmVxX2llc19sZW4gPSAlZCIsbXlFdmVudERhdGEuYXNzb2NfaW5mby5yZXFfaWVzX2xlbik7CiAgICAgICAgICAgICAgICAgICAgd3BhX3ByaW50ZihNU0dfREVCVUcsIm15RXZlbnREYXRhLmFzc29jX2luZm8ucmVzcF9pZXMgPSAweCV4IiwodW5zaWduZWQpbXlFdmVudERhdGEuYXNzb2NfaW5mby5yZXNwX2llcyk7CiAgICAgICAgICAgICAgICAgICAgd3BhX3ByaW50ZihNU0dfREVCVUcsIm15RXZlbnREYXRhLmFzc29jX2luZm8ucmVzcF9pZXNfbGVuID0gJWQiLG15RXZlbnREYXRhLmFzc29jX2luZm8ucmVzcF9pZXNfbGVuKTsKICAgICAgICAgICAgICAgICAgICB3cGFfcHJpbnRmKE1TR19ERUJVRywibXlFdmVudERhdGEuYXNzb2NfaW5mby5iZWFjb25faWVzID0gMHgleCIsKHVuc2lnbmVkKW15RXZlbnREYXRhLmFzc29jX2luZm8uYmVhY29uX2llcyk7CiAgICAgICAgICAgICAgICAgICAgd3BhX3ByaW50ZihNU0dfREVCVUcsIm15RXZlbnREYXRhLmFzc29jX2luZm8uYmVhY29uX2llc19sZW4gPSAlZCIsbXlFdmVudERhdGEuYXNzb2NfaW5mby5iZWFjb25faWVzX2xlbik7CiAgICAgICAgICAgICAgICAgICAgd3BhX2hleGR1bXAoTVNHX0RFQlVHLCAiV1BBOiBiZWFjb25faWVzIiwgbXlFdmVudERhdGEuYXNzb2NfaW5mby5iZWFjb25faWVzLCBteUV2ZW50RGF0YS5hc3NvY19pbmZvLmJlYWNvbl9pZXNfbGVuKTsKCiAgICAgICAgICAgICAgICAgICAgLyogRmlyc3Qgd2Ugbm90aWZ5IHdwYV9zdXBwbGljYW50IGFuZCBnaXZlIGl0IGFsbCB0aGUgYWJvdmUgSUVzICovCiAgICAgICAgICAgICAgICAgICAgd3BhX3N1cHBsaWNhbnRfZXZlbnQoIG15U3VwcGwtPmhXcGFTdXBwbGljYW50LCBFVkVOVF9BU1NPQ0lORk8sICZteUV2ZW50RGF0YSApOwoKICAgICAgICAgICAgICAgICAgICAvKiBTaW5jZSBib3RoIEFTU09DX1JFUS9SU1AgYW5kIGJlYWNvbiBJRXMgYXJlIGFsbG9jYXRlZCBkeW5hbWljYWxseSBieSB0aGUgVXRpbGl0eSBBZGFwdGVyIC0gd2UgbmVlZCB0byBmcmVlIHRoZSBidWZmZXJzICovCiAgICAgICAgICAgICAgICAgICAgb3NfZnJlZSggcEluZm8gKTsKICAgICAgICAgICAgICAgICAgICBpZiggcFNlbGVjdGVkQnNzaWRJbmZvICkgewogICAgICAgICAgICAgICAgICAgICAgICBvc19mcmVlKCBwU2VsZWN0ZWRCc3NpZEluZm8gKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBteUV2ZW50RGF0YS5hc3NvY19pbmZvLnJlcV9pZXMgPSBOVUxMOwogICAgICAgICAgICAgICAgbXlFdmVudERhdGEuYXNzb2NfaW5mby5yZXFfaWVzX2xlbiA9IDA7CiAgICAgICAgICAgICAgICBteUV2ZW50RGF0YS5hc3NvY19pbmZvLnJlc3BfaWVzID0gTlVMTDsKICAgICAgICAgICAgICAgIG15RXZlbnREYXRhLmFzc29jX2luZm8ucmVzcF9pZXNfbGVuID0gMDsKICAgICAgICAgICAgICAgIG15RXZlbnREYXRhLmFzc29jX2luZm8uYmVhY29uX2llcyA9IE5VTEw7CiAgICAgICAgICAgICAgICBteUV2ZW50RGF0YS5hc3NvY19pbmZvLmJlYWNvbl9pZXNfbGVuID0gMDsKICAgICAgICAgICAgICAgIHdwYV9zdXBwbGljYW50X2V2ZW50KCBteVN1cHBsLT5oV3BhU3VwcGxpY2FudCwgRVZFTlRfQVNTT0NJTkZPLCAmbXlFdmVudERhdGEgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKiBXZSBub3cgY2FuIG5vdGlmeSB3cGFfc3VwcGxpY2FudCBvZiB0aGUgYXNzb2NpYXRpb24gZXZlbnQgc28gaXQgY291bGQgc3RhcnQga2V5IG5lZ290aWF0aW9uIChpZiBuZWVkZWQpICovCiAgICAgICAgICAgIHdwYV9zdXBwbGljYW50X2V2ZW50KCBteVN1cHBsLT5oV3BhU3VwcGxpY2FudCwgRVZFTlRfQVNTT0MsIE5VTEwgKTsKICAgICAgICAgICAgLyogQWxsb3cgRGlzYXNzb2NpYXRpb24gKi8KICAgICAgICAgICAgbXlTdXBwbC0+YmxvY2tfZGlzYXNzb2NfZXZlbnRzID0gTk9fQkxPQ0s7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIElQQ19FVkVOVF9ESVNBU1NPQ0lBVEVEOgogICAgICAgICAgICBpZiggbXlTdXBwbC0+YmxvY2tfZGlzYXNzb2NfZXZlbnRzICE9IEJMT0NLX0RJU0FTU09DICkgewogICAgICAgICAgICAgICB3cGFfcHJpbnRmKE1TR19ERUJVRywid3BhX3N1cHBsaWNhbnQgLSBEaXNhc3NvY2lhdGVkIik7CiAgICAgICAgICAgICAgIHdwYV9zdXBwbGljYW50X2V2ZW50KCBteVN1cHBsLT5oV3BhU3VwcGxpY2FudCwgRVZFTlRfRElTQVNTT0MsIE5VTEwgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgd3BhX3ByaW50ZihNU0dfSU5GTywid3BhX3N1cHBsaWNhbnQgLSBEaXNhc3NvY2lhdGVkIChibG9ja2VkKSIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIElQQ19FVkVOVF9TQ0FOX0NPTVBMRVRFOgogICAgICAgICAgICB3cGFfcHJpbnRmKE1TR19ERUJVRywid3BhX3N1cHBsaWNhbnQgLSBJUENfRVZFTlRfU0NBTl9DT01QTEVURSIpOwogICAgICAgICAgICB3cGFfc3VwcGxpY2FudF9ldmVudCggbXlTdXBwbC0+aFdwYVN1cHBsaWNhbnQsIEVWRU5UX1NDQU5fUkVTVUxUUywgTlVMTCApOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBJUENfRVZFTlRfQVVUSF9TVUNDOgogICAgICAgICAgICB3cGFfcHJpbnRmKE1TR19JTkZPLCJ3cGFfc3VwcGxpY2FudCAtIElQQ19FVkVOVF9BVVRIX1NVQ0MiKTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgSVBDX0VWRU5UX0VBUE9MOgogICAgICAgICAgICB3cGFfcHJpbnRmKE1TR19ERUJVRywid3BhX3N1cHBsaWNhbnQgLSBFQVBPTCIpOwogICAgICAgICAgICBidWYgPSBwRGF0YS0+dUJ1ZmZlcjsKICAgICAgICAgICAgd3BhX3N1cHBsaWNhbnRfcnhfZWFwb2woIG15U3VwcGwtPmhXcGFTdXBwbGljYW50LCAoVUlOVDggKikoYnVmICsgTUFDX0FERFJfTEVOKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChVSU5UOCAqKShidWYgKyBFVEhFUk5FVF9IRFJfTEVOKSwgKHBEYXRhLT51QnVmZmVyU2l6ZSAtIEVUSEVSTkVUX0hEUl9MRU4pICk7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIElQQ19FVkVOVF9NRURJQV9TUEVDSUZJQzoKICAgICAgICAgICAgd3BhX3ByaW50ZihNU0dfREVCVUcsIndwYV9zdXBwbGljYW50IC0gTWVkaWFfU3BlY2lmaWMiKTsKICAgICAgICAgICAgYnVmTG9uZyA9IChVSU5UMzIgKilwRGF0YS0+dUJ1ZmZlcjsKICAgICAgICAgICAgLyogQ2hlY2sgZm9yIEF1dGhlbnRpY2F0aW9uIHR5cGUgbWVzc2FnZXMgZnJvbSBkcml2ZXIgKi8KICAgICAgICAgICAgaWYoICgqYnVmTG9uZykgPT0gb3M4MDJfMTFTdGF0dXNUeXBlX0F1dGhlbnRpY2F0aW9uICkgewogICAgICAgICAgICAgICAgcE1lZGlhU3BlY2lmaWNCdWYgPSAoT1NfODAyXzExX0FVVEhFTlRJQ0FUSU9OX1JFUVVFU1QgKikoYnVmTG9uZyArIDEpOwogICAgICAgICAgICAgICAgd3BhX3ByaW50ZihNU0dfREVCVUcsIndwYV9zdXBwbGljYW50IC0gTWVkaWFfU3BlY2lmaWMgLSBBdXRoZW50aWNhdGlvbiBtZXNzYWdlIGRldGVjdGVkOiAldSIsIHBNZWRpYVNwZWNpZmljQnVmLT5GbGFncyk7CiAgICAgICAgICAgICAgICAvKiBDaGVjayBmb3IgTUlDIGZhaWx1cmUgZXZlbnQgKi8KICAgICAgICAgICAgICAgIGlmKCAocE1lZGlhU3BlY2lmaWNCdWYtPkZsYWdzID09IE9TXzgwMl8xMV9SRVFVRVNUX1BBSVJXSVNFX0VSUk9SKSB8fCAocE1lZGlhU3BlY2lmaWNCdWYtPkZsYWdzID09IE9TXzgwMl8xMV9SRVFVRVNUX0dST1VQX0VSUk9SKSkgewogICAgICAgICAgICAgICAgICAgIC8qIE5vdGlmeSB3cGFfc3VwcGxpY2FudCBvZiBNSUMgZmFpbHVyZSAqLwogICAgICAgICAgICAgICAgICAgIG15RXZlbnREYXRhLm1pY2hhZWxfbWljX2ZhaWx1cmUudW5pY2FzdCA9IDE7CiAgICAgICAgICAgICAgICAgICAgd3BhX3N1cHBsaWNhbnRfZXZlbnQoIG15U3VwcGwtPmhXcGFTdXBwbGljYW50LCBFVkVOVF9NSUNIQUVMX01JQ19GQUlMVVJFLCAmbXlFdmVudERhdGEgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8qIE9TXzgwMl8xMV9SRVFVRVNUX1JFQVVUSCAtIGlzIGhhbmRsZWQgYXV0b21hdGljYWxseSAqLwogICAgICAgICAgICAgICAgLyogT1NfODAyXzExX1JFUVVFU1RfS0VZVVBEQVRFIC0gbm8gZXZlbnQgb2YgdGhpcyB0eXBlICovCiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgSVBDX0VWRU5UX0xJTktfU1BFRUQ6CiAgICAgICAgICAgIGJ1ZkxvbmcgPSAoVUlOVDMyICopcERhdGEtPnVCdWZmZXI7CiAgICAgICAgICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCJ3cGFfc3VwcGxpY2FudCAtIExpbmsgU3BlZWQgPSAldSBNQi9zIiwgKCgqYnVmTG9uZykgLyAyKSk7CiAgICAgICAgICAgIC8qIHdwYV9tc2cobXlTdXBwbC0+aFdwYVN1cHBsaWNhbnQsIE1TR19JTkZPLCBXUEFfRVZFTlRfTElOS19TUEVFRCAiJXUgTUIvcyIsICgoKmJ1ZkxvbmcpIC8gMikpOyAqLwogICAgICAgICAgICBteVN1cHBsLT5saW5rX3NwZWVkID0gKHVuc2lnbmVkKSgoKmJ1ZkxvbmcpIC8gMik7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIElQQ19FVkVOVF9XUEEyX1BSRUFVVEhFTlRJQ0FUSU9OOgogICAgICAgICAgICB3cGFfcHJpbnRmKE1TR19ERUJVRywid3BhX3N1cHBsaWNhbnQgLSBXUEEyX1BSRUFVVEhFTlRJQ0FUSU9OIik7CiAgICAgICAgICAgIGJ1ZkxvbmcgPSAoVUlOVDMyICopcERhdGEtPnVCdWZmZXI7CiAgICAgICAgICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCJQcmVhdXRoIFN0YXR1cyBDb2RlID0gJXUiLCpidWZMb25nKTsKICAgICAgICAgICAgLyogRG06IHdwYV9zdXBwbGljYW50X2V2ZW50KCBteVN1cHBsLT5oV3BhU3VwcGxpY2FudCwgRVZFTlRfUE1LSURfQ0FORElEQVRFLCAmZGF0YSk7ICovCiAgICAgICAgICAgIGJyZWFrOwoKI2lmbmRlZiBTVEFfREtfVkVSXzVfMF8wXzk0CiAgICAgICAgY2FzZSBJUENfRVZFTlRfQlRfQ09FWF9NT0RFOgogICAgICAgICAgICBidENvZXhTdGF0dXMgPSAoYnRDb2V4U3RhdHVzX3QgKilwRGF0YS0+dUJ1ZmZlcjsKICAgICAgICAgICAgaWYoIChidENvZXhTdGF0dXMgIT0gTlVMTCkgJiYgYnRDb2V4U3RhdHVzLT5zdGF0ZSApIHsKICAgICAgICAgICAgICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCJ3cGFfc3VwcGxpY2FudCAtIEJUX0NPRVhfTU9ERSAoU0cgaXMgT04sIG1pblR4UmF0ZSA9ICVkKVxuIiwgYnRDb2V4U3RhdHVzLT5taW5UeFJhdGUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgd3BhX3ByaW50ZihNU0dfREVCVUcsIndwYV9zdXBwbGljYW50IC0gQlRfQ09FWF9NT0RFIChTRyBpcyBPRkYpXG4iKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKI2VuZGlmCiAgICAgICAgY2FzZSBJUENfRVZFTlRfTE9XX1NOUjoKICAgICAgICBjYXNlIElQQ19FVkVOVF9MT1dfUlNTSToKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHdwYV9wcmludGYoTVNHX0VSUk9SLCJ3cGFfc3VwcGxpY2FudCAtIFVuaGFuZGxlZCBkcml2ZXIgZXZlbnQ6ICVkIiwgKChJUENfRVZFTlRfUEFSQU1TKilwRGF0YSktPnVFdmVudFR5cGUpOwogICAgICAgICAgICBicmVhazsKICAgIH0KfQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpSb3V0aW5lIE5hbWU6IHdwYV9kcml2ZXJfdGlzdGFfaW5pdApSb3V0aW5lIERlc2NyaXB0aW9uOiBpbml0IGRyaXZlciBpbnRlcmZhY2UKQXJndW1lbnRzOgogICBwcml2IC0gcG9pbnRlciB0byBwcml2YXRlIGRhdGEgc3RydWN0dXJlCiAgIGlmbmFtZSAtIHJldHVybiBpbnRlcmZhY2UgbmFtZQpSZXR1cm4gVmFsdWU6IHBvaW50ZXIgdG8gZHJpdmVyIHN0cnVjdHVyZSAodG8gYmUgc3VwcGxpZWQgbGF0ZXIgYnkgc3VwcGxpY2FudCB0byB3cmFwcGVycykKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpzdGF0aWMgdm9pZCAqd3BhX2RyaXZlcl90aXN0YV9pbml0KCB2b2lkICpwcml2LCBjb25zdCBjaGFyICppZm5hbWUgKQp7CiAgICBzdHJ1Y3Qgd3BhX2RyaXZlcl90aV9kYXRhICpteURydjsKICAgIGludCBzdGF0dXM7CiAgICBVSU5UMzIgZHJpdmVyU3RhdHVzLHJlczsKICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBlY2hvc2VydmVyOwogICAgT1NfODAyXzExX01BQ19BRERSRVNTIG15TWFjOwojaWZkZWYgQ09ORklHX1RJX0xPQ0tGSUxFCiAgICBjaGFyIHN0clsxMF07CiNlbmRpZgoKICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCJJbml0aWFsaXppbmcgU1RBLURLICVzIGludGVyZmFjZS4uLiIsU1dfVkVSU0lPTl9TVFIpOwojaWZkZWYgQ09ORklHX1RJX0xPQ0tGSUxFCiAgICAvKiBUcnkgdG8gb3BlbiB0aGUgbG9jayBmaWxlICovCiAgICBsZnAgPSBvcGVuKCIuLy53cGFfc3VwcGxpY2FudF9sb2NrZmlsZS5waWQiLCAoT19SRFdSIHwgT19DUkVBVCB8IE9fRVhDTCksIDA2NDApOwogICAgaWYoIGxmcCA8IDAgKSB7CiAgICAgICAgd3BhX3ByaW50ZihNU0dfRVJST1IsIkNhbm5vdCBvcGVuIHBpZC1maWxlLi4uQWJvcnRpbmcuLi5cbiIpOwogICAgICAgIHJldHVybiggTlVMTCApOwogICAgfQogICAgLyogVHJ5IHRvIGdldCBhIGZpbGUgbG9jayBvbiB0aGUgcGlkLWZpbGUuIElmIGFub3RoZXIgaW5zdGFuY2UgaXMgcnVubmluZyBhbmQgYWxyZWFkeSBoYXMgYSBsb2NrIC0gd2Ugd2lsbCBmYWlsICovCiNpZm5kZWYgQU5EUk9JRCAvKiBEbTogISEhIGxvY2tmIGlzIG5vdCBpbXBsZW1lbnRlZCBpbiBBbmRyb2lkICovCiAgICBpZiggbG9ja2YobGZwLEZfVExPQ0ssMCkgPCAwICkgewogICAgICAgIHdwYV9wcmludGYoTVNHX0VSUk9SLCJBbm90aGVyIGluc3RhbmNlIG9mIHdwYV9zdXBwbGljYW50IGlzIHJ1bm5pbmcuLi5BYm9ydGluZy4uLlxuIik7CiAgICAgICAgcmV0dXJuKCBOVUxMICk7CiAgICB9CiNlbmRpZgogICAgLyogSWYgd2UgZ290IGhlcmUgLSBpdCBtZWFucyB0aGF0IG5vIG90aGVyIGluc3RhbmNlIGlzIHJ1bm5pbmcgLSB3cml0ZSBwcm9jZXNzIGlkIHRvIHBpZF9maWxlICovCiAgICBzcHJpbnRmKHN0ciwgIiVkXG4iLCBnZXRwaWQoKSk7CiAgICB3cml0ZShsZnAsc3RyLG9zX3N0cmxlbihzdHIpKTsgLyogcmVjb3JkIHBpZCB0byBsb2NrZmlsZSAqLwojZW5kaWYKCiAgICAvKiBBbGxvY2F0ZSBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZSB0byBtYW5hZ2UgZHJpdmVyICovCiAgICBteURydiA9IG9zX21hbGxvYyggc2l6ZW9mKHN0cnVjdCB3cGFfZHJpdmVyX3RpX2RhdGEpICk7CgogICAgLyogSWYgZmFpbGVkIHRvIGFsbG9jYXRlICovCiAgICBpZiggbXlEcnYgPT0gTlVMTCApIHsKICAgICAgICB3cGFfcHJpbnRmKE1TR19FUlJPUiwiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgY29udHJvbCBzdHJ1Y3R1cmUuLi5BYm9ydGluZy4uLiIpOwogICAgICAgIGdvdG8gbGFiZWxfaW5pdF9lcnJvcl9maWxlOwogICAgfQoKICAgIC8qIFplcm8gbWVtb3J5ICovCiAgICBvc19tZW1zZXQoIG15RHJ2LCAwLCBzaXplb2Yoc3RydWN0IHdwYV9kcml2ZXJfdGlfZGF0YSkgKTsKCiAgICAvKiBJbml0aWFsaXplIFV0aWxpdHkgQWRhcHRlciBtb2R1bGUgKi8KICAgIG15RHJ2LT5oRHJpdmVyID0gVElfQWRhcHRlckluaXQoIFRJV0xBTl9EUlZfTkFNRSApOwoKICAgIC8qIElmIGNvdWxkbid0IGluaXRpYWxpemUgLSByZXR1cm4gTlVMTCB0byBpbmRpY2F0ZSBlcnJvciAqLwogICAgaWYoIG15RHJ2LT5oRHJpdmVyID09IDAgKSB7CiAgICAgICAgd3BhX3ByaW50ZihNU0dfRVJST1IsIkVycm9yOiBmYWlsZWQgdG8gaW5pdGlhbGl6ZSBVdGlsaXR5IEFkYXB0ZXIgaW50ZXJmYWNlLi4uIik7CiAgICAgICAgZ290byBsYWJlbF9pbml0X2Vycm9yX2ZyZWU7CiAgICB9CgogICAgLyogR2V0IFdMQU4gaW50ZXJmYWNlIG1hYyBhZGRyZXNzIHRocm91Z2ggVXRpbGl0eSBBZGFwdGVyICovCiAgICByZXMgPSBUSV9HZXRDdXJyZW50QWRkcmVzcyggbXlEcnYtPmhEcml2ZXIsICZteU1hYyApOwoKICAgIGlmKCByZXMgPT0gKFVJTlQzMiktMSApIHsKICAgICAgICB3cGFfcHJpbnRmKE1TR19FUlJPUiwiRXJyb3I6IGZhaWxlZCB0byBpbml0aWFsaXplIFV0aWxpdHkgQWRhcHRlciBpbnRlcmZhY2UuLi4iKTsKICAgICAgICBnb3RvIGxhYmVsX2luaXRfZXJyb3JfZnJlZTsKICAgIH0KCiAgICBvc19tZW1jcHkoICZteURydi0+b3duX2FkZHIsICZteU1hYywgTUFDX0FERFJfTEVOICk7CgogICAgd3BhX2RyaXZlcl90aXN0YV9yZWdpc3Rlcl9ldmVudHMoIG15RHJ2ICk7CgogICAgLyogQmxvY2sgZGlzYXNzb2MgZXZlbnRzIHVudGlsIGNvbm5lY3RlZCAqLwogICAgaWYoIG15RHJ2LT5ibG9ja19kaXNhc3NvY19ldmVudHMgPT0gTk9fQkxPQ0sgKQogICAgICAgIG15RHJ2LT5ibG9ja19kaXNhc3NvY19ldmVudHMgPSBOT19CTE9DS19ESVNBU1NPQ19JTl9QUk9HUkVTUzsKCiAgICAvKiBTdG9yZSB3cGFfc3VwcGxpY2FudCBjb250ZXh0ICovCiAgICBteURydi0+aFdwYVN1cHBsaWNhbnQgPSBwcml2OwoKICAgIG15RHJ2LT5kcml2ZXJFdmVudHNTb2NrZXQgPSBzb2NrZXQoIFBGX0lORVQsIFNPQ0tfREdSQU0sIElQUFJPVE9fVURQICk7CgogICAgaWYoIG15RHJ2LT5kcml2ZXJFdmVudHNTb2NrZXQgPCAwICkgewogICAgICAgIHdwYV9wcmludGYoTVNHX0VSUk9SLCJFcnJvcjogZmFpbGVkIHRvIGNyZWF0ZSBkcml2ZXIgZXZlbnRzIHNvY2tldC4uLiAoJXMpIiwgc3RyZXJyb3IoZXJybm8pKTsKICAgICAgICBnb3RvIGxhYmVsX2luaXRfZXJyb3JfZnJlZTsKICAgIH0KCiAgICBvc19tZW1zZXQoICZlY2hvc2VydmVyLCAwLCBzaXplb2YoZWNob3NlcnZlcikgKTsgIC8qIENsZWFyIHN0cnVjdCAqLwogICAgZWNob3NlcnZlci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsgICAgICAgICAgICAgICAgICAvKiBJbnRlcm5ldC9JUCAqLwogICAgaW5ldF9hdG9uKCIxMjcuMC4wLjEiLCAmZWNob3NlcnZlci5zaW5fYWRkcik7ICAgICAvKiBiaW5kIHRvIGxvb3BiYWNrIE9OTFkgKi8KICAgIGVjaG9zZXJ2ZXIuc2luX3BvcnQgPSBodG9ucyhUSV9EUklWRVJfTVNHX1BPUlQpOyAgLyogc2VydmVyIHBvcnQgKi8KCiAgICBpZiggYmluZChteURydi0+ZHJpdmVyRXZlbnRzU29ja2V0LCAoc3RydWN0IHNvY2thZGRyICopICZlY2hvc2VydmVyLCBzaXplb2YoZWNob3NlcnZlcikpIDwgMCApIHsKICAgICAgICB3cGFfcHJpbnRmKE1TR19FUlJPUiwiRXJyb3I6IGZhaWxlZCB0byBjcmVhdGUgZHJpdmVyIGV2ZW50cyBzb2NrZXQuLi4gKCVzKSIsIHN0cmVycm9yKGVycm5vKSk7CiAgICAgICAgY2xvc2UobXlEcnYtPmRyaXZlckV2ZW50c1NvY2tldCk7CiAgICAgICAgZ290byBsYWJlbF9pbml0X2Vycm9yX2ZyZWU7CiAgICB9CgogICAgc3RhdHVzID0gZWxvb3BfcmVnaXN0ZXJfcmVhZF9zb2NrKCBteURydi0+ZHJpdmVyRXZlbnRzU29ja2V0LCB3cGFfZHJpdmVyX3Rpc3RhX3JlY2VpdmVfZHJpdmVyX2V2ZW50LCBwcml2LCBteURydiApOwoKICAgIGlmKCBzdGF0dXMgIT0gMCApIHsKICAgICAgICB3cGFfcHJpbnRmKE1TR19FUlJPUiwiRXJyb3I6IGZhaWxlZCB0byByZWdpc3RlciBzb2NrZXQgaGFuZGxlci4uLiIpOwogICAgfQoKICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCJkcml2ZXIgZXZlbnRzIHNvY2tldCBpcyAweCV4Li4uIixteURydi0+ZHJpdmVyRXZlbnRzU29ja2V0KTsKCiAgICAvKiBTaWduYWwgdGhhdCBkcml2ZXIgaXMgbm90IHN0b3BwZWQgKi8KICAgIG15RHJ2LT5kcml2ZXJfaXNfbG9hZGVkID0gVFJVRTsKCiAgICAvKiBTZXQgZGVmYXVsdCBzY2FuIHR5cGUgKi8KICAgIG15RHJ2LT5zY2FuX3R5cGUgPSBTQ0FOX1RZUEVfTk9STUFMX0FDVElWRTsKICAgIG15RHJ2LT5mb3JjZV9tZXJnZV9mbGFnID0gMDsKICAgIHNjYW5faW5pdCggbXlEcnYgKTsKCiAgICAvKiBTZXQgZGVmYXVsdCBhbW91bnQgb2YgY2hhbm5lbHMgKi8KICAgIG15RHJ2LT5zY2FuX2NoYW5uZWxzID0gY2hlY2tfYW5kX2dldF9idWlsZF9jaGFubmVscygpOwoKICAgIC8qIExpbmsgU3BlZWQgd2lsbCBiZSBzZXQgYnkgdGhlIG1lc3NhZ2UgZnJvbSB0aGUgZHJpdmVyICovCiAgICBteURydi0+bGlua19zcGVlZCA9IDA7CgogICAgLyogQnRDb2V4IG1vZGUgaXMgcmVhZCBmcm9tIHRpd2xhbi5pbmkgZmlsZSAqLwogICAgbXlEcnYtPmJ0Y29leF9tb2RlID0gMTsgLyogU0dfRElTQUJMRSAqLwogICAgbXlEcnYtPmJ0Y29leF9zY2FuID0gRkFMU0U7CgogICAgLyogUlRTIFRocmVzaG9sZCBpcyByZWFkIGZyb20gdGl3bGFuLmluaSBmaWxlICovCiAgICBteURydi0+cnRzX3RocmVzaG9sZCA9IEhBTF9DVFJMX1JUU19USFJFU0hPTERfTUFYOwoKICAgIC8qIFJldHVybiBwb2ludGVyIHRvIG91ciBkcml2ZXIgc3RydWN0dXJlICovCiAgICByZXR1cm4oIG15RHJ2ICk7CgpsYWJlbF9pbml0X2Vycm9yX2ZyZWU6CiAgICBvc19mcmVlKCBteURydiApOwpsYWJlbF9pbml0X2Vycm9yX2ZpbGU6CiNpZmRlZiBDT05GSUdfVElfTE9DS0ZJTEUKICAgIC8qIENsb3NlIGFuZCBkZWxldGUgdGhlIHBpZC1sb2NrLWZpbGUgKi8KICAgIGNsb3NlKGxmcCk7CiAgICB1bmxpbmsoIi4vd3BhX3N1cHBsaWNhbnRfbG9ja2ZpbGUucGlkIik7CiNlbmRpZgogICAgcmV0dXJuKCBOVUxMICk7Cn0KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KUm91dGluZSBOYW1lOiB3cGFfZHJpdmVyX3Rpc3RhX3VubG9hZApSb3V0aW5lIERlc2NyaXB0aW9uOiB1bmxvYWQgZHJpdmVyCkFyZ3VtZW50czoKICAgcHJpdiAtIHBvaW50ZXIgdG8gcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZQpSZXR1cm4gVmFsdWU6IE5vbmUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpzdGF0aWMgdm9pZCB3cGFfZHJpdmVyX3Rpc3RhX3VubG9hZCggdm9pZCAqcHJpdiApCnsKICAgIHN0cnVjdCB3cGFfZHJpdmVyX3RpX2RhdGEgKm15RHJ2ID0gKHN0cnVjdCB3cGFfZHJpdmVyX3RpX2RhdGEgKilwcml2OwoKICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCJ3cGFfZHJpdmVyX3Rpc3RhX3VubG9hZCBjYWxsZWQiKTsKICAgIC8qIFVucmVnaXN0ZXIgZHJpdmVyIGV2ZW50cyAqLwogICAgd3BhX2RyaXZlcl90aXN0YV91bnJlZ2lzdGVyX2V2ZW50cyggcHJpdiApOwogICAgLyogQ2xvc2UgY29ubmVjdGlvbiBzb2NrZXQgKi8KICAgIGNsb3NlKG15RHJ2LT5kcml2ZXJFdmVudHNTb2NrZXQpOwogICAgLyogVW5sb2FkIFV0aWxpdHkgQWRhcHRlciAqLwogICAgVElfQWRhcHRlckRlaW5pdCggbXlEcnYtPmhEcml2ZXIgKTsKICAgIC8qIEZyZWUgYWxsIGFsbG9jYXRlZCBtZW1vcnkgKi8KICAgIHNjYW5fZXhpdCggbXlEcnYgKTsKICAgIG9zX2ZyZWUoIG15RHJ2ICk7CiNpZmRlZiBDT05GSUdfVElfTE9DS0ZJTEUKICAgIC8qIENsb3NlIGFuZCBkZWxldGUgdGhlIHBpZC1sb2NrLWZpbGUgKi8KICAgIGNsb3NlKGxmcCk7CiAgICB1bmxpbmsoIi4vd3BhX3N1cHBsaWNhbnRfbG9ja2ZpbGUucGlkIik7CiNlbmRpZgogICAgd3BhX3ByaW50ZihNU0dfREVCVUcsIlNUQS1ESyAlcyBpbnRlcmZhY2UgRGVpbml0aWFsaXplZC4uLmJ5ZSEiLCBTV19WRVJTSU9OX1NUUik7Cn0KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KUm91dGluZSBOYW1lOiB3cGFfZHJpdmVyX3Rpc3RhX2dldF9tYWNfYWRkcgpSb3V0aW5lIERlc2NyaXB0aW9uOiByZXR1cm4gV0xBTiBNQUMgYWRkcmVzcwpBcmd1bWVudHM6CiAgIHByaXYgLSBwb2ludGVyIHRvIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUKUmV0dXJuIFZhbHVlOiBwb2ludGVyIHRvIEJTU0lECi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KY29uc3QgdTggKndwYV9kcml2ZXJfdGlzdGFfZ2V0X21hY19hZGRyKCB2b2lkICpwcml2ICkKewogICAgc3RydWN0IHdwYV9kcml2ZXJfdGlfZGF0YSAqbXlEcnYgPSAoc3RydWN0IHdwYV9kcml2ZXJfdGlfZGF0YSAqKXByaXY7CgogICAgd3BhX3ByaW50ZihNU0dfREVCVUcsIndwYV9kcml2ZXJfdGlzdGFfZ2V0X21hY19hZGRyIGNhbGxlZCIpOwogICAgLyogSWYgZHJpdmVyIGlzIG5vdCBpbml0aWFsaXplZCB5ZXQgLSB3ZSBjYW5ub3QgYWNjZXNzIGl0IHNvIHJldHVybiAqLwogICAgVElfQ0hFQ0tfRFJJVkVSKCBteURydi0+ZHJpdmVyX2lzX2xvYWRlZCwgTlVMTCApOwogICAgcmV0dXJuKCAoY29uc3QgdTggKikmbXlEcnYtPm93bl9hZGRyICk7Cn0KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KUm91dGluZSBOYW1lOiB3cGFfZHJpdmVyX3Rpc3RhX3NlbmRfZWFwb2wKUm91dGluZSBEZXNjcmlwdGlvbjogdHJhbnNtaXQgRUFQT0wKQXJndW1lbnRzOgogICBwcml2IC0gcG9pbnRlciB0byBwcml2YXRlIGRhdGEgc3RydWN0dXJlCiAgIGRhdGEgLSBwb2ludGVyIHRvIEVBUE9MIGRhdGEKICAgZGF0YV9sZW4gLSBsZW5ndGggb2YgRUFQT0wgZGF0YQpSZXR1cm4gVmFsdWU6IE5vbmUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpzdGF0aWMgaW50IHRpX3NlbmRfZWFwb2woIHZvaWQgKnByaXYsIGNvbnN0IHU4ICpkZXN0LCB1MTYgcHJvdG8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdTggKmRhdGEsIHNpemVfdCBkYXRhX2xlbiApCnsKICAgIHN0cnVjdCB3cGFfZHJpdmVyX3RpX2RhdGEgKm15RHJ2ID0gKHN0cnVjdCB3cGFfZHJpdmVyX3RpX2RhdGEgKilwcml2OwogICAgdTgqIERhdGFXaXRoSGVhZGVyID0gTlVMTDsKICAgIHUxNiBwcm90b05ldHdvcms7CiAgICBpbnQgcmV0ID0gMDsKCiAgICB3cGFfcHJpbnRmKE1TR19ERUJVRywiVEkgc2VuZF9lYXBvbCBjYWxsZWQiKTsKI2lmZGVmIElFRUU4MDIxWF9FQVBPTAogICAgRGF0YVdpdGhIZWFkZXIgPSBvc19tYWxsb2MoZGF0YV9sZW4gKyBFVEhFUk5FVF9IRFJfTEVOKTsgLyogMTQgYnl0ZXMgKi8KICAgIGlmKCBEYXRhV2l0aEhlYWRlciA9PSBOVUxMICkgewogICAgICAgIHdwYV9wcmludGYoTVNHX0VSUk9SLCJUSSBzZW5kX2VhcG9sIGZhaWxlZCB0byBhbGxvYyBmdWxsIGJ1ZmZlciIpOwogICAgICAgIHJldHVybiggLTEgKTsKICAgIH0KCiAgICBvc19tZW1jcHkoRGF0YVdpdGhIZWFkZXIsIGRlc3QsIE1BQ19BRERSX0xFTik7IC8qIDYgYnl0ZXMgKi8KICAgIG9zX21lbWNweShEYXRhV2l0aEhlYWRlcitNQUNfQUREUl9MRU4sIG15RHJ2LT5vd25fYWRkciwgTUFDX0FERFJfTEVOKTsKICAgIHByb3RvTmV0d29yayA9IGh0b25zKHByb3RvKTsKICAgIG9zX21lbWNweShEYXRhV2l0aEhlYWRlcisoTUFDX0FERFJfTEVOPDwxKSwgJnByb3RvTmV0d29yaywgc2l6ZW9mKHUxNikpOyAvKiAyIGJ5dGVzICovCgogICAgb3NfbWVtY3B5KERhdGFXaXRoSGVhZGVyK0VUSEVSTkVUX0hEUl9MRU4sIGRhdGEsIGRhdGFfbGVuKTsKICAgIGRhdGFfbGVuICs9IEVUSEVSTkVUX0hEUl9MRU47CgogICAgd3BhX2hleGR1bXAoTVNHX0RFQlVHLCAiV1BBOiBGVUxMIFRYIEVBUE9MLUtleSIsIERhdGFXaXRoSGVhZGVyLCBkYXRhX2xlbik7CgogICAgLyogVHJhbnNtaXQgRUFQT0wgcGFja2V0ICovCiAgICByZXQgPSBUSV9TZW5kX0VBUE9MX1BhY2tldCggbXlEcnYtPmhEcml2ZXIsICh2b2lkICopRGF0YVdpdGhIZWFkZXIsIGRhdGFfbGVuICk7CiAgICBvc19mcmVlKERhdGFXaXRoSGVhZGVyKTsKI2VuZGlmCiAgICByZXR1cm4oIFRJMldQQV9TVEFUVVMocmV0KSApOwp9CgojaWZuZGVmIFNUQV9ES19WRVJfNV8wXzBfOTQKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpSb3V0aW5lIE5hbWU6IHByZXBhcmVfZmlsdGVyX3N0cnVjdApSb3V0aW5lIERlc2NyaXB0aW9uOiBmaWxscyByeCBkYXRhIGZpbHRlciBzdHJ1Y3R1cmUgYWNjb3JkaW5nIHRvIHBhcmFtZXRlciB0eXBlCkFyZ3VtZW50czoKICAgcHJpdiAtIHBvaW50ZXIgdG8gcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZQogICB0eXBlIC0gdHlwZSBvZiBtYWMgYWRkcmVzcwogICBkZnJlcV9wdHIgLSBwb2ludGVyIHRvIFRJV0xBTl9EQVRBX0ZJTFRFUl9SRVFVRVNUIHN0cnVjdHVyZQpSZXR1cm4gVmFsdWU6IDAgLSBzdWNjZXNzLCAtMSAtIGVycm9yCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8Kc3RhdGljIGludCBwcmVwYXJlX2ZpbHRlcl9zdHJ1Y3QoIHZvaWQgKnByaXYsIGludCB0eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElXTEFOX0RBVEFfRklMVEVSX1JFUVVFU1QgKmRmcmVxX3B0ciApCnsKICAgIHU4ICptYWNhZGRyID0gTlVMTDsKICAgIHNpemVfdCBsZW4gPSAwOwogICAgdTggbWFzayA9IDA7CiAgICBpbnQgcmV0ID0gLTE7CgogICAgd3BhX3ByaW50ZihNU0dfRVJST1IsICIlczogdHlwZT0lZCIsIF9fZnVuY19fLCB0eXBlKTsKICAgIHN3aXRjaCAodHlwZSApIHsKICAgICAgY2FzZSBSWF9TRUxGX0ZJTFRFUjoKICAgICAgICBtYWNhZGRyID0gKHU4ICopd3BhX2RyaXZlcl90aXN0YV9nZXRfbWFjX2FkZHIocHJpdik7CiAgICAgICAgbGVuID0gTUFDX0FERFJfTEVOOwogICAgICAgIG1hc2sgPSAweDNGOyAvKiA2IGJ5dGVzICovCiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgUlhfQlJPQURDQVNUX0ZJTFRFUjoKICAgICAgICBtYWNhZGRyID0gKHU4ICopIlx4RkZceEZGXHhGRlx4RkZceEZGXHhGRiI7CiAgICAgICAgbGVuID0gTUFDX0FERFJfTEVOOwogICAgICAgIG1hc2sgPSAweDNGOyAvKiA2IGJ5dGVzICovCiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgUlhfSVBWNF9NVUxUSUNBU1RfRklMVEVSOgogICAgICAgIG1hY2FkZHIgPSAodTggKikiXHgwMVx4MDBceDVFIjsKICAgICAgICBsZW4gPSAzOwogICAgICAgIG1hc2sgPSAweDc7IC8qIDMgYnl0ZXMgKi8KICAgICAgICBicmVhazsKICAgICAgY2FzZSBSWF9JUFY2X01VTFRJQ0FTVF9GSUxURVI6CiAgICAgICAgbWFjYWRkciA9ICh1OCAqKSJceDMzXHgzMyI7CiAgICAgICAgbGVuID0gMjsKICAgICAgICBtYXNrID0gMHgzOyAvKiAyIGJ5dGVzICovCiAgICAgICAgYnJlYWs7CiAgICB9CiAgICBpZiAobGVuICYmIG1hY2FkZHIpIHsKICAgICAgICBkZnJlcV9wdHItPk9mZnNldCA9IDA7CiAgICAgICAgZGZyZXFfcHRyLT5NYXNrTGVuZ3RoID0gMTsKICAgICAgICBkZnJlcV9wdHItPk1hc2tbMF0gPSBtYXNrOwogICAgICAgIGRmcmVxX3B0ci0+UGF0dGVybkxlbmd0aCA9IGxlbjsKICAgICAgICBvc19tZW1jcHkoIGRmcmVxX3B0ci0+UGF0dGVybiwgbWFjYWRkciwgbGVuICk7CiAgICAgICAgcmV0ID0gMDsKICAgIH0KICAgIHJldHVybiggcmV0ICk7Cn0KI2VuZGlmCgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClJvdXRpbmUgTmFtZTogd3BhX2RyaXZlcl90aXN0YV9kcml2ZXJfY21kClJvdXRpbmUgRGVzY3JpcHRpb246IGV4ZWN1dGVzIGRyaXZlci1zcGVjaWZpYyBjb21tYW5kcwpBcmd1bWVudHM6CiAgIHByaXYgLSBwb2ludGVyIHRvIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUKICAgY21kIC0gY29tbWFuZAogICBidWYgLSByZXR1cm4gYnVmZmVyCiAgIGJ1Zl9sZW4gLSBidWZmZXIgbGVuZ3RoClJldHVybiBWYWx1ZTogYWN0dWFsIGJ1ZmZlciBsZW5ndGggLSBzdWNjZXNzLCAtMSAtIGZhaWx1cmUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwppbnQgd3BhX2RyaXZlcl90aXN0YV9kcml2ZXJfY21kKCB2b2lkICpwcml2LCBjaGFyICpjbWQsIGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zl9sZW4gKQp7CiAgICBzdHJ1Y3Qgd3BhX2RyaXZlcl90aV9kYXRhICpteURydiA9IChzdHJ1Y3Qgd3BhX2RyaXZlcl90aV9kYXRhICopcHJpdjsKICAgIGludCByZXQgPSAtMSwgcHJldl9ldmVudHM7CgogICAgd3BhX3ByaW50ZihNU0dfREVCVUcsICIlcyAlcyIsIF9fZnVuY19fLCBjbWQpOwoKICAgIGlmKCBvc19zdHJjYXNlY21wKGNtZCwgInN0YXJ0IikgPT0gMCApIHsKICAgICAgICB3cGFfcHJpbnRmKE1TR19ERUJVRywiU3RhcnQgY29tbWFuZCIpOwogICAgICAgIHByZXZfZXZlbnRzID0gbXlEcnYtPmJsb2NrX2Rpc2Fzc29jX2V2ZW50czsKICAgICAgICBteURydi0+YmxvY2tfZGlzYXNzb2NfZXZlbnRzID0gbXlEcnYtPmJsb2NrX2Rpc2Fzc29jX3ByZXY7CiAgICAgICAgcmV0ID0gVElfU3RhcnQoIG15RHJ2LT5oRHJpdmVyICk7CiAgICAgICAgaWYoIHJldCA9PSBPSyApIHsKICAgICAgICAgICAgLyogU2lnbmFsIHRoYXQgZHJpdmVyIGlzIG5vdCBsb2FkZWQgeWV0ICovCiAgICAgICAgICAgIG15RHJ2LT5kcml2ZXJfaXNfbG9hZGVkID0gVFJVRTsKICAgICAgICAgICAgd3BhX21zZyhteURydi0+aFdwYVN1cHBsaWNhbnQsIE1TR19JTkZPLCBXUEFfRVZFTlRfRFJJVkVSX1NUQVRFICJTVEFSVEVEIik7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICAgICAgbXlEcnYtPmJsb2NrX2Rpc2Fzc29jX2V2ZW50cyA9IHByZXZfZXZlbnRzOwogICAgICAgIHJldHVybiggVEkyV1BBX1NUQVRVUyhyZXQpICk7CiAgICB9CgogICAgLyogSWYgZHJpdmVyIGlzIG5vdCBpbml0aWFsaXplZCB5ZXQgLSB3ZSBjYW5ub3QgYWNjZXNzIGl0IHNvIHJldHVybiAqLwogICAgVElfQ0hFQ0tfRFJJVkVSKCBteURydi0+ZHJpdmVyX2lzX2xvYWRlZCwgLTEgKTsKCiAgICBpZiggb3Nfc3RyY2FzZWNtcChjbWQsICJzdG9wIikgPT0gMCApIHsKICAgICAgICB3cGFfcHJpbnRmKE1TR19ERUJVRywiU3RvcCBjb21tYW5kIik7CiAgICAgICAgbXlEcnYtPmJsb2NrX2Rpc2Fzc29jX3ByZXYgPSBteURydi0+YmxvY2tfZGlzYXNzb2NfZXZlbnRzOwogICAgICAgIG15RHJ2LT5ibG9ja19kaXNhc3NvY19ldmVudHMgPSBCTE9DS19ESVNBU1NPQzsgLyogQmxvY2sgbWVzc2FnZSAqLwogICAgICAgIHJldCA9IFRJX1N0b3AoIG15RHJ2LT5oRHJpdmVyICk7CiAgICAgICAgaWYoIHJldCA9PSBPSyApIHsKICAgICAgICAgICAgLyogU2lnbmFsIHRoYXQgZHJpdmVyIGlzIG5vdCBsb2FkZWQgeWV0ICovCiAgICAgICAgICAgIG15RHJ2LT5kcml2ZXJfaXNfbG9hZGVkID0gRkFMU0U7CiAgICAgICAgICAgIHdwYV9tc2cobXlEcnYtPmhXcGFTdXBwbGljYW50LCBNU0dfSU5GTywgV1BBX0VWRU5UX0RSSVZFUl9TVEFURSAiU1RPUFBFRCIpOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgICAgIG15RHJ2LT5ibG9ja19kaXNhc3NvY19ldmVudHMgPSBteURydi0+YmxvY2tfZGlzYXNzb2NfcHJldjsKICAgIH0KICAgIGVsc2UgaWYoIG9zX3N0cmNhc2VjbXAoY21kLCAibWFjYWRkciIpID09IDAgKSB7CiAgICAgICAgdTggKm1hY2FkZHIgPSAodTggKil3cGFfZHJpdmVyX3Rpc3RhX2dldF9tYWNfYWRkcihwcml2KTsKICAgICAgICB3cGFfcHJpbnRmKE1TR19ERUJVRywiTWFjYWRkciBjb21tYW5kIik7CiAgICAgICAgd3BhX3ByaW50ZihNU0dfREVCVUcsICIgICBNYWNhZGRyID0gIiBNQUNTVFIsIE1BQzJTVFIobWFjYWRkcikpOwogICAgICAgIHJldCA9IHNucHJpbnRmKGJ1ZiwgYnVmX2xlbiwgIk1hY2FkZHIgPSAiIE1BQ1NUUiAiXG4iLCBNQUMyU1RSKG1hY2FkZHIpKTsKICAgICAgICBpZiAocmV0IDwgKGludClidWZfbGVuKSB7CiAgICAgICAgICAgIHJldHVybiggcmV0ICk7CiAgICAgICAgfQogICAgfQogICAgZWxzZSBpZiggb3Nfc3RyY2FzZWNtcChjbWQsICJzY2FuLXBhc3NpdmUiKSA9PSAwICkgewogICAgICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCJTY2FuIFBhc3NpdmUgY29tbWFuZCIpOwogICAgICAgIG15RHJ2LT5zY2FuX3R5cGUgPSBTQ0FOX1RZUEVfTk9STUFMX1BBU1NJVkU7CiAgICAgICAgcmV0ID0gMDsKICAgIH0KICAgIGVsc2UgaWYoIG9zX3N0cmNhc2VjbXAoY21kLCAic2Nhbi1hY3RpdmUiKSA9PSAwICkgewogICAgICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCJTY2FuIEFjdGl2ZSBjb21tYW5kIik7CiAgICAgICAgbXlEcnYtPnNjYW5fdHlwZSA9IFNDQU5fVFlQRV9OT1JNQUxfQUNUSVZFOwogICAgICAgIHJldCA9IDA7CiAgICB9CiAgICBlbHNlIGlmKCBvc19zdHJjYXNlY21wKGNtZCwgInNjYW4tbW9kZSIpID09IDAgKSB7CiAgICAgICAgd3BhX3ByaW50ZihNU0dfREVCVUcsIlNjYW4gTW9kZSBjb21tYW5kIik7CiAgICAgICAgcmV0ID0gc25wcmludGYoYnVmLCBidWZfbGVuLCAiU2Nhbk1vZGUgPSAldVxuIiwgbXlEcnYtPnNjYW5fdHlwZSk7CiAgICAgICAgaWYgKHJldCA8IChpbnQpYnVmX2xlbikgewogICAgICAgICAgICByZXR1cm4oIHJldCApOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgaWYoIG9zX3N0cmNhc2VjbXAoY21kLCAibGlua3NwZWVkIikgPT0gMCApIHsKICAgICAgICB3cGFfcHJpbnRmKE1TR19ERUJVRywiTGluayBTcGVlZCBjb21tYW5kIik7CiAgICAgICAgcmV0ID0gc25wcmludGYoYnVmLCBidWZfbGVuLCAiTGlua1NwZWVkICV1XG4iLCBteURydi0+bGlua19zcGVlZCk7CiAgICAgICAgaWYgKHJldCA8IChpbnQpYnVmX2xlbikgewogICAgICAgICAgICByZXR1cm4oIHJldCApOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgaWYoIG9zX3N0cm5jYXNlY21wKGNtZCwgInNjYW4tY2hhbm5lbHMiLCAxMykgPT0gMCApIHsKICAgICAgICBpbnQgbm9PZkNoYW47CiAgICAgICAgY2hhciAqY3AgPSBjbWQgKyAxMzsKICAgICAgICBjaGFyICplbmRwOwoKICAgICAgICBpZiAoKmNwICE9ICdcMCcpIHsKICAgICAgICAgICAgbm9PZkNoYW4gPSBzdHJ0b2woY3AsICZlbmRwLCAwKTsKICAgICAgICAgICAgaWYgKGVuZHAgIT0gY3ApIHsKICAgICAgICAgICAgICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCJTY2FuIENoYW5uZWxzIGNvbW1hbmQgPSAlZCIsIG5vT2ZDaGFuKTsKICAgICAgICAgICAgICAgIGlmKCAobm9PZkNoYW4gPiAwKSAmJiAobm9PZkNoYW4gPD0gTUFYX05VTUJFUl9PRl9DSEFOTkVMU19QRVJfU0NBTikgKSB7CiAgICAgICAgICAgICAgICAgICAgbXlEcnYtPnNjYW5fY2hhbm5lbHMgPSBub09mQ2hhbjsKICAgICAgICAgICAgICAgICAgICByZXQgPSAwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0ID0gc25wcmludGYoYnVmLCBidWZfbGVuLCAiU2Nhbi1DaGFubmVscyA9ICVkXG4iLCBteURydi0+c2Nhbl9jaGFubmVscyk7CiAgICAgICAgICAgIGlmIChyZXQgPCAoaW50KWJ1Zl9sZW4pIHsKICAgICAgICAgICAgICAgIHJldHVybiggcmV0ICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBlbHNlIGlmKCBvc19zdHJjYXNlY21wKGNtZCwgInJzc2ktYXBwcm94IikgPT0gMCApIHsKICAgICAgICBzdHJ1Y3Qgd3BhX3NjYW5fcmVzdWx0ICpjdXJfcmVzOwogICAgICAgIHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MgPSAoc3RydWN0IHdwYV9zdXBwbGljYW50ICopKG15RHJ2LT5oV3BhU3VwcGxpY2FudCk7CiAgICAgICAgaW50IHJzc2ksIGxlbjsKCiAgICAgICAgd3BhX3ByaW50ZihNU0dfREVCVUcsInJzc2ktYXBwcm94IGNvbW1hbmQiKTsKCiAgICAgICAgaWYoICF3cGFfcyApCiAgICAgICAgICAgIHJldHVybiggcmV0ICk7CiAgICAgICAgY3VyX3JlcyA9IHNjYW5fZ2V0X2J5X2Jzc2lkKCBteURydiwgd3BhX3MtPmJzc2lkICk7CiAgICAgICAgaWYoIGN1cl9yZXMgKSB7CiAgICAgICAgICAgIGxlbiA9IChpbnQpKGN1cl9yZXMtPnNzaWRfbGVuKTsKICAgICAgICAgICAgcnNzaSA9IGN1cl9yZXMtPmxldmVsOwogICAgICAgICAgICBpZiggKGxlbiA+IDApICYmIChsZW4gPD0gTUFYX1NTSURfTEVOKSAmJiAobGVuIDwgKGludClidWZfbGVuKSkgewogICAgICAgICAgICAgICAgb3NfbWVtY3B5KCAodm9pZCAqKWJ1ZiwgKHZvaWQgKikoY3VyX3Jlcy0+c3NpZCksIGxlbiApOwogICAgICAgICAgICAgICAgcmV0ID0gbGVuOwogICAgICAgICAgICAgICAgcmV0ICs9IHNucHJpbnRmKCZidWZbcmV0XSwgYnVmX2xlbi1sZW4sICIgcnNzaSAlZFxuIiwgcnNzaSk7CiAgICAgICAgICAgICAgICBpZiAocmV0IDwgKGludClidWZfbGVuKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuKCByZXQgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGVsc2UgaWYoIG9zX3N0cmNhc2VjbXAoY21kLCAicnNzaSIpID09IDAgKSB7CiNpZiAxCiAgICAgICAgdTggc3NpZFtNQVhfU1NJRF9MRU5dOwogICAgICAgIHN0cnVjdCB3cGFfc2Nhbl9yZXN1bHQgKmN1cl9yZXM7CiAgICAgICAgc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcyA9IChzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKikobXlEcnYtPmhXcGFTdXBwbGljYW50KTsKICAgICAgICBpbnQgcnNzaSwgbGVuOwoKICAgICAgICB3cGFfcHJpbnRmKE1TR19ERUJVRywicnNzaSBjb21tYW5kIik7CgogICAgICAgIHJldCA9IFRJX0dldFJTU0koIG15RHJ2LT5oRHJpdmVyLCAmcnNzaSApOwogICAgICAgIGlmKCByZXQgPT0gT0sgKSB7CiAgICAgICAgICAgIGxlbiA9IHdwYV9kcml2ZXJfdGlzdGFfZ2V0X3NzaWQoIHByaXYsICh1OCAqKXNzaWQgKTsKICAgICAgICAgICAgaWYoIChsZW4gPiAwKSAmJiAobGVuIDw9IE1BWF9TU0lEX0xFTikgJiYgKGxlbiA8IChpbnQpYnVmX2xlbikpIHsKICAgICAgICAgICAgICAgIG9zX21lbWNweSggKHZvaWQgKilidWYsICh2b2lkICopc3NpZCwgbGVuICk7CiAgICAgICAgICAgICAgICByZXQgPSBsZW47CiAgICAgICAgICAgICAgICByZXQgKz0gc25wcmludGYoJmJ1ZltyZXRdLCBidWZfbGVuLWxlbiwgIiByc3NpICVkXG4iLCByc3NpKTsKICAgICAgICAgICAgICAgIGlmKCAhd3BhX3MgKQogICAgICAgICAgICAgICAgICAgIHJldHVybiggcmV0ICk7CiAgICAgICAgICAgICAgICBjdXJfcmVzID0gc2Nhbl9nZXRfYnlfYnNzaWQoIG15RHJ2LCB3cGFfcy0+YnNzaWQgKTsKICAgICAgICAgICAgICAgIGlmKCBjdXJfcmVzICkKICAgICAgICAgICAgICAgICAgICBjdXJfcmVzLT5sZXZlbCA9IHJzc2k7CiAgICAgICAgICAgICAgICByZXR1cm4oIHJldCApOwogICAgICAgICAgICB9CiAgICAgICAgfQojZWxzZQogICAgICAgIE9TXzgwMl8xMV9CU1NJRF9FWCBic3NpZEluZm87CgogICAgICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCJyc3NpIGNvbW1hbmQiKTsKCiAgICAgICAgcmV0ID0gVElfR2V0U2VsZWN0ZWRCU1NJREluZm8oIG15RHJ2LT5oRHJpdmVyLCAoT1NfODAyXzExX0JTU0lEX0VYICopJmJzc2lkSW5mbyApOwogICAgICAgIGlmKCByZXQgPT0gT0sgKSB7CiAgICAgICAgICAgIGlmKCBic3NpZEluZm8uU3NpZC5Tc2lkTGVuZ3RoICE9IDAgJiYgYnNzaWRJbmZvLlNzaWQuU3NpZExlbmd0aCA8IGJ1Zl9sZW4pIHsKICAgICAgICAgICAgICAgIG9zX21lbWNweSggKHZvaWQgKilidWYsICh2b2lkICopKGJzc2lkSW5mby5Tc2lkLlNzaWQpLCBic3NpZEluZm8uU3NpZC5Tc2lkTGVuZ3RoICk7CiAgICAgICAgICAgICAgICByZXQgPSBic3NpZEluZm8uU3NpZC5Tc2lkTGVuZ3RoOwogICAgICAgICAgICAgICAgcmV0ICs9IHNucHJpbnRmKCZidWZbcmV0XSwgYnVmX2xlbi1yZXQsICIgcnNzaSAlZFxuIiwgYnNzaWRJbmZvLlJzc2kpOwogICAgICAgICAgICAgICAgaWYgKHJldCA8IChpbnQpYnVmX2xlbikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiggcmV0ICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0ID0gLTE7CiAgICAgICAgfQojZW5kaWYKICAgIH0KICAgIGVsc2UgaWYoIG9zX3N0cm5jYXNlY21wKGNtZCwgInBvd2VybW9kZSIsIDkpID09IDAgKSB7CiAgICAgICAgdTMyIHJ0c1RocmVzaG9sZCA9IG15RHJ2LT5ydHNfdGhyZXNob2xkOwogICAgICAgIHUzMiBtb2RlOwogICAgICAgIGNoYXIgKmNwID0gY21kICsgOTsKICAgICAgICBjaGFyICplbmRwOwoKICAgICAgICBpZiAoKmNwICE9ICdcMCcpIHsKICAgICAgICAgICAgbW9kZSA9ICh1MzIpc3RydG9sKGNwLCAmZW5kcCwgMCk7CiAgICAgICAgICAgIGlmIChlbmRwICE9IGNwKSB7CiAgICAgICAgICAgICAgICB3cGFfcHJpbnRmKE1TR19ERUJVRywiUG93ZXIgTW9kZSBjb21tYW5kID0gJXUiLCBtb2RlKTsKICAgICAgICAgICAgICAgIGlmKCBtb2RlIDw9IE9TX1BPV0VSX01PREVfTE9OR19ET1pFICkKICAgICAgICAgICAgICAgICAgICByZXQgPSBUSV9Db25maWdQb3dlck1hbmFnZW1lbnQoIG15RHJ2LT5oRHJpdmVyLCBtb2RlICk7CiAgICAgICAgICAgICAgICBpZiggbW9kZSA9PSBPU19QT1dFUl9NT0RFX0FDVElWRSApCiAgICAgICAgICAgICAgICAgICAgcnRzVGhyZXNob2xkID0gMDsKICAgICAgICAgICAgICAgIGlmKCBUSV9TZXRSVFNUaHJlc2hvbGQoIG15RHJ2LT5oRHJpdmVyLCBydHNUaHJlc2hvbGQgKSAhPSBPSyApCiAgICAgICAgICAgICAgICAgICAgd3BhX3ByaW50ZihNU0dfREVCVUcsIlNldCBSVFMgdGhyZXNob2xkID0gJXUgZmFpbGVkIiwgcnRzVGhyZXNob2xkKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGVsc2UgaWYoIG9zX3N0cm5jYXNlY21wKGNtZCwgImdldHBvd2VyIiwgOCkgPT0gMCApIHsKICAgICAgICB1MzIgbW9kZTsKCiAgICAgICAgcmV0ID0gVElfR2V0UG93ZXJNb2RlKCBteURydi0+aERyaXZlciwgKE9TXzgwMl8xMV9QT1dFUl9QUk9GSUxFICopJm1vZGUpOwogICAgICAgIGlmKCByZXQgPT0gT0sgKSB7CiAgICAgICAgICAgIHJldCA9IHNucHJpbnRmKGJ1ZiwgYnVmX2xlbiwgInBvd2VybW9kZSA9ICV1XG4iLCBtb2RlKTsKICAgICAgICAgICAgaWYgKHJldCA8IChpbnQpYnVmX2xlbikgewogICAgICAgICAgICAgICAgcmV0dXJuKCByZXQgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGVsc2UgaWYoIG9zX3N0cm5jYXNlY21wKGNtZCwgImdldC1ydHMtdGhyZXNob2xkIiwgMTcpID09IDAgKSB7CiAgICAgICAgdGlVSU5UMzIgcnRzVGhyZXNob2xkID0gMDsKCiAgICAgICAgcmV0ID0gVElfR2V0UlRTVGhyZXNob2xkKCBteURydi0+aERyaXZlciwgJnJ0c1RocmVzaG9sZCApOwogICAgICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCJHZXQgUlRTIFRocmVzaG9sZCBjb21tYW5kID0gJWQiLCBydHNUaHJlc2hvbGQpOwogICAgICAgIGlmKCByZXQgPT0gT0sgKSB7CiAgICAgICAgICAgIHJldCA9IHNucHJpbnRmKGJ1ZiwgYnVmX2xlbiwgInJ0cy10aHJlc2hvbGQgPSAldVxuIiwgcnRzVGhyZXNob2xkKTsKICAgICAgICAgICAgaWYgKHJldCA8IChpbnQpYnVmX2xlbikgewogICAgICAgICAgICAgICAgcmV0dXJuKCByZXQgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGVsc2UgaWYoIG9zX3N0cm5jYXNlY21wKGNtZCwgInNldC1ydHMtdGhyZXNob2xkIiwgMTcpID09IDAgKSB7CiAgICAgICAgdGlVSU5UMzIgcnRzVGhyZXNob2xkID0gMDsKICAgICAgICBjaGFyICpjcCA9IGNtZCArIDE3OwogICAgICAgIGNoYXIgKmVuZHA7CgogICAgICAgIGlmICgqY3AgIT0gJ1wwJykgewogICAgICAgICAgICBydHNUaHJlc2hvbGQgPSAodGlVSU5UMzIpc3RydG9sKGNwLCAmZW5kcCwgMCk7CiAgICAgICAgICAgIGlmIChlbmRwICE9IGNwKSB7CiAgICAgICAgICAgICAgICB3cGFfcHJpbnRmKE1TR19ERUJVRywiUlRTIFRocmVzaG9sZCBjb21tYW5kID0gJWQiLCBydHNUaHJlc2hvbGQpOwogICAgICAgICAgICAgICAgaWYoIHJ0c1RocmVzaG9sZCA8PSBIQUxfQ1RSTF9SVFNfVEhSRVNIT0xEX01BWCApIHsKICAgICAgICAgICAgICAgICAgICByZXQgPSBUSV9TZXRSVFNUaHJlc2hvbGQoIG15RHJ2LT5oRHJpdmVyLCBydHNUaHJlc2hvbGQgKTsKICAgICAgICAgICAgICAgICAgICBpZiggcmV0ID09IE9LICkgewogICAgICAgICAgICAgICAgICAgICAgICBteURydi0+cnRzX3RocmVzaG9sZCA9IHJ0c1RocmVzaG9sZDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBlbHNlIGlmKCBvc19zdHJjYXNlY21wKGNtZCwgImJ0Y29leHNjYW4tc3RhcnQiKSA9PSAwICkgewogICAgICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCJCVCBDb2V4IFNjYW4gU3RhcnQgY29tbWFuZCIpOwogICAgICAgIG15RHJ2LT5idGNvZXhfc2NhbiA9IFRSVUU7CiAgICAgICAgcmV0ID0gMDsKICAgIH0KICAgIGVsc2UgaWYoIG9zX3N0cmNhc2VjbXAoY21kLCAiYnRjb2V4c2Nhbi1zdG9wIikgPT0gMCApIHsKICAgICAgICB3cGFfcHJpbnRmKE1TR19ERUJVRywiQlQgQ29leCBTY2FuIFN0b3AgY29tbWFuZCIpOwogICAgICAgIG15RHJ2LT5idGNvZXhfc2NhbiA9IEZBTFNFOwogICAgICAgIHJldCA9IDA7CiAgICB9CiNpZm5kZWYgU1RBX0RLX1ZFUl81XzBfMF85NAogICAgZWxzZSBpZiggb3Nfc3RyY2FzZWNtcChjbWQsICJyeGZpbHRlci1zdGFydCIpID09IDAgKSB7CiAgICAgICAgd3BhX3ByaW50ZihNU0dfREVCVUcsIlJ4IERhdGEgRmlsdGVyIFN0YXJ0IGNvbW1hbmQiKTsKICAgICAgICByZXQgPSBUSV9FbmFibGVEaXNhYmxlUnhEYXRhRmlsdGVycyggbXlEcnYtPmhEcml2ZXIsIFRSVUUgKTsKICAgIH0KICAgIGVsc2UgaWYoIG9zX3N0cmNhc2VjbXAoY21kLCAicnhmaWx0ZXItc3RvcCIpID09IDAgKSB7CiAgICAgICAgd3BhX3ByaW50ZihNU0dfREVCVUcsIlJ4IERhdGEgRmlsdGVyIFN0b3AgY29tbWFuZCIpOwogICAgICAgIHJldCA9IFRJX0VuYWJsZURpc2FibGVSeERhdGFGaWx0ZXJzKCBteURydi0+aERyaXZlciwgRkFMU0UgKTsKICAgIH0KICAgIGVsc2UgaWYoIG9zX3N0cmNhc2VjbXAoY21kLCAicnhmaWx0ZXItc3RhdGlzdGljcyIpID09IDAgKSB7CiAgICAgICAgVElXTEFOX0RBVEFfRklMVEVSX1NUQVRJU1RJQ1Mgc3RhdHM7CiAgICAgICAgaW50IGxlbiwgaTsKCiAgICAgICAgd3BhX3ByaW50ZihNU0dfREVCVUcsIlJ4IERhdGEgRmlsdGVyIFN0YXRpc3RpY3MgY29tbWFuZCIpOwogICAgICAgIHJldCA9IFRJX0dldFJ4RGF0YUZpbHRlcnNTdGF0aXN0aWNzKCBteURydi0+aERyaXZlciwgJnN0YXRzICk7CiAgICAgICAgaWYoIHJldCA9PSBPSyApIHsKICAgICAgICAgICAgcmV0ID0gc25wcmludGYoYnVmLCBidWZfbGVuLCAiUnhGaWx0ZXJTdGF0OiAldSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRzLlVubWF0Y2hlZFBhY2tldHNDb3VudCk7CiAgICAgICAgICAgIGZvcihpPTA7KCBpIDwgTUFYX05VTV9EQVRBX0ZJTFRFUlMgKTtpKyspIHsKICAgICAgICAgICAgICAgIHJldCArPSBzbnByaW50ZigmYnVmW3JldF0sIGJ1Zl9sZW4tcmV0LCAiICV1IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHMuTWF0Y2hlZFBhY2tldHNDb3VudFtpXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0ICs9IHNucHJpbnRmKCZidWZbcmV0XSwgYnVmX2xlbi1yZXQsICJcbiIpOwogICAgICAgICAgICBpZiAocmV0IDwgKGludClidWZfbGVuKSB7CiAgICAgICAgICAgICAgICByZXR1cm4oIHJldCApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZWxzZSBpZiggb3Nfc3RybmNhc2VjbXAoY21kLCAicnhmaWx0ZXItYWRkIiwgMTIpID09IDAgKSB7CiAgICAgICAgVElXTEFOX0RBVEFfRklMVEVSX1JFUVVFU1QgZGZyZXE7CiAgICAgICAgY2hhciAqY3AgPSBjbWQgKyAxMjsKICAgICAgICBjaGFyICplbmRwOwogICAgICAgIGludCB0eXBlOwoKICAgICAgICBpZiAoKmNwICE9ICdcMCcpIHsKICAgICAgICAgICAgdHlwZSA9IChpbnQpc3RydG9sKGNwLCAmZW5kcCwgMCk7CiAgICAgICAgICAgIGlmIChlbmRwICE9IGNwKSB7CiAgICAgICAgICAgICAgICB3cGFfcHJpbnRmKE1TR19ERUJVRywiUnggRGF0YSBGaWx0ZXIgQWRkIFslZF0gY29tbWFuZCIsIHR5cGUpOwogICAgICAgICAgICAgICAgcmV0ID0gcHJlcGFyZV9maWx0ZXJfc3RydWN0KCBwcml2LCB0eXBlLCAmZGZyZXEgKTsKICAgICAgICAgICAgICAgIGlmKCByZXQgPT0gMCApIHsKICAgICAgICAgICAgICAgICAgICByZXQgPSBUSV9BZGRSeERhdGFGaWx0ZXIoIG15RHJ2LT5oRHJpdmVyLCAmZGZyZXEgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGVsc2UgaWYoIG9zX3N0cm5jYXNlY21wKGNtZCwgInJ4ZmlsdGVyLXJlbW92ZSIsMTUpID09IDAgKSB7CiAgICAgICAgd3BhX3ByaW50ZihNU0dfREVCVUcsIlJ4IERhdGEgRmlsdGVyIFJlbW92ZSBjb21tYW5kIik7CiAgICAgICAgVElXTEFOX0RBVEFfRklMVEVSX1JFUVVFU1QgZGZyZXE7CiAgICAgICAgY2hhciAqY3AgPSBjbWQgKyAxNTsKICAgICAgICBjaGFyICplbmRwOwogICAgICAgIGludCB0eXBlOwoKICAgICAgICBpZiAoKmNwICE9ICdcMCcpIHsKICAgICAgICAgICAgdHlwZSA9IChpbnQpc3RydG9sKGNwLCAmZW5kcCwgMCk7CiAgICAgICAgICAgIGlmIChlbmRwICE9IGNwKSB7CiAgICAgICAgICAgICAgICB3cGFfcHJpbnRmKE1TR19ERUJVRywiUnggRGF0YSBGaWx0ZXIgUmVtb3ZlIFslZF0gY29tbWFuZCIsIHR5cGUpOwogICAgICAgICAgICAgICAgcmV0ID0gcHJlcGFyZV9maWx0ZXJfc3RydWN0KCBwcml2LCB0eXBlLCAmZGZyZXEgKTsKICAgICAgICAgICAgICAgIGlmKCByZXQgPT0gMCApIHsKICAgICAgICAgICAgICAgICAgICByZXQgPSBUSV9SZW1vdmVSeERhdGFGaWx0ZXIoIG15RHJ2LT5oRHJpdmVyLCAmZGZyZXEgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGVsc2UgaWYoIG9zX3N0cmNhc2VjbXAoY21kLCAic25yIikgPT0gMCApIHsKICAgICAgICB1MzIgc25yOwoKICAgICAgICByZXQgPSBUSV9HZXRTTlIoIG15RHJ2LT5oRHJpdmVyLCAmc25yICk7CiAgICAgICAgaWYoIHJldCA9PSBPSyApIHsKICAgICAgICAgICAgcmV0ID0gc25wcmludGYoYnVmLCBidWZfbGVuLCAic25yID0gJXVcbiIsIHNucik7CiAgICAgICAgICAgIGlmIChyZXQgPCAoaW50KWJ1Zl9sZW4pIHsKICAgICAgICAgICAgICAgIHJldHVybiggcmV0ICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBlbHNlIGlmKCBvc19zdHJuY2FzZWNtcChjbWQsICJidGNvZXhtb2RlIiwgMTApID09IDAgKSB7CiAgICAgICAgdTMyIG1vZGU7CiAgICAgICAgY2hhciAqY3AgPSBjbWQgKyAxMDsKICAgICAgICBjaGFyICplbmRwOwoKICAgICAgICBpZiAoKmNwICE9ICdcMCcpIHsKICAgICAgICAgICAgbW9kZSA9ICh1MzIpc3RydG9sKGNwLCAmZW5kcCwgMCk7CiAgICAgICAgICAgIGlmIChlbmRwICE9IGNwKSB7CiAgICAgICAgICAgICAgICB3cGFfcHJpbnRmKE1TR19ERUJVRywiQnRDb2V4IE1vZGUgY29tbWFuZCA9ICV1IiwgbW9kZSk7CiAgICAgICAgICAgICAgICByZXQgPSBUSV9TZXRCdENvZUVuYWJsZSggbXlEcnYtPmhEcml2ZXIsIG1vZGUgKTsKICAgICAgICAgICAgICAgIGlmKCByZXQgPT0gT0sgKSB7CiAgICAgICAgICAgICAgICAgICAgbXlEcnYtPmJ0Y29leF9tb2RlID0gbW9kZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGVsc2UgaWYoIG9zX3N0cmNhc2VjbXAoY21kLCAiYnRjb2V4c3RhdCIpID09IDAgKSB7CiAgICAgICAgdTMyIHN0YXR1cyA9IG15RHJ2LT5idGNvZXhfbW9kZTsKCiAgICAgICAgd3BhX3ByaW50ZihNU0dfREVCVUcsIkJ0Q29leCBTdGF0dXMiKTsKICAgICAgICByZXQgPSBUSV9TZXRCdENvZUdldFN0YXR1cyggbXlEcnYtPmhEcml2ZXIsICh0aVVJTlQzMiAqKSZzdGF0dXMgKTsKICAgICAgICBpZiggcmV0ID09IE9LICkgewogICAgICAgICAgICByZXQgPSBzbnByaW50ZihidWYsIGJ1Zl9sZW4sICJidGNvZXhzdGF0dXMgPSAweCV4XG4iLCBzdGF0dXMpOwogICAgICAgICAgICBpZiAocmV0IDwgKGludClidWZfbGVuKSB7CiAgICAgICAgICAgICAgICByZXR1cm4oIHJldCApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQojZW5kaWYKICAgIGVsc2UgewogICAgICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCJVbnN1cHBvcnRlZCBjb21tYW5kIik7CiAgICB9CiAgICByZXR1cm4oIFRJMldQQV9TVEFUVVMocmV0KSApOwp9CgovKiBGaWxsIGRyaXZlcl9vcHMgc3RydWN0dXJlIHRvIHByb3ZpZGUgd3BhX3N1cHBsaWNhbnQgY29yZSB3aXRoIHdyYXBwZXIgcm91dGluZXMgKi8Kc3RydWN0IHdwYV9kcml2ZXJfb3BzIHdwYV9kcml2ZXJfY3VzdG9tX29wcyA9IHsKICAgIC5uYW1lICAgICAgICAgICA9IFRJV0xBTl9EUlZfTkFNRSwKICAgIC5kZXNjICAgICAgICAgICA9ICJUSSBTdGF0aW9uIERyaXZlciIsCiAgICAuaW5pdCAgICAgICAgICAgPSB3cGFfZHJpdmVyX3Rpc3RhX2luaXQsCiAgICAuZGVpbml0ICAgICAgICAgPSB3cGFfZHJpdmVyX3Rpc3RhX3VubG9hZCwKICAgIC5nZXRfYnNzaWQgICAgICA9IHdwYV9kcml2ZXJfdGlzdGFfZ2V0X2Jzc2lkLAogICAgLmdldF9zc2lkICAgICAgID0gd3BhX2RyaXZlcl90aXN0YV9nZXRfc3NpZCwKICAgIC5zZXRfd3BhICAgICAgICA9IHdwYV9kcml2ZXJfdGlzdGFfc2V0X3dwYSwKICAgIC5zZXRfa2V5ICAgICAgICA9IHdwYV9kcml2ZXJfdGlzdGFfc2V0X2tleSwKICAgIC5zZXRfcGFyYW0gICAgICA9IE5VTEwsCiAgICAuc2V0X2NvdW50ZXJtZWFzdXJlcyAgICA9IHdwYV9kcml2ZXJfdGlzdGFfc2V0X2NvdW50ZXJtZWFzdXJlcywKICAgIC5zZXRfZHJvcF91bmVuY3J5cHRlZCAgID0gd3BhX2RyaXZlcl90aXN0YV9zZXRfZHJvcF91bmVuY3J5cHRlZCwKICAgIC5zY2FuICAgICAgICAgICAgICAgICAgID0gd3BhX2RyaXZlcl90aXN0YV9zY2FuLAogICAgLmdldF9zY2FuX3Jlc3VsdHMgICAgICAgPSB3cGFfZHJpdmVyX3Rpc3RhX2dldF9zY2FuX3Jlc3VsdHMsCiAgICAuZGVhdXRoZW50aWNhdGUgPSB3cGFfZHJpdmVyX3Rpc3RhX2RlYXV0aGVudGljYXRlLAogICAgLmRpc2Fzc29jaWF0ZSAgID0gd3BhX2RyaXZlcl90aXN0YV9kaXNhc3NvY2lhdGUsCiAgICAuYXNzb2NpYXRlICAgICAgPSB3cGFfZHJpdmVyX3Rpc3RhX2Fzc29jaWF0ZSwKICAgIC5zZXRfYXV0aF9hbGcgICA9IHdwYV9kcml2ZXJfdGlzdGFfc2V0X2F1dGhfYWxnLAogICAgLmdldF9tYWNfYWRkciAgID0gd3BhX2RyaXZlcl90aXN0YV9nZXRfbWFjX2FkZHIsCiAgICAuc2VuZF9lYXBvbCAgICAgPSB0aV9zZW5kX2VhcG9sLAogICAgLmFkZF9wbWtpZCAgICAgID0gTlVMTCwKICAgIC5yZW1vdmVfcG1raWQgICA9IE5VTEwsCiAgICAuZmx1c2hfcG1raWQgICAgPSBOVUxMLAogICAgLmdldF9jYXBhICAgICAgID0gTlVMTCwKICAgIC5wb2xsICAgICAgICAgICA9IE5VTEwsCiAgICAuZ2V0X2lmbmFtZSAgICAgPSBOVUxMLCAvKiBOb3QgbmVzZXNzYXJ5ICovCiAgICAuc2V0X29wZXJzdGF0ZSAgPSBOVUxMLAojaWZkZWYgQ09ORklHX0NMSUVOVF9NTE1FCiAgICAuZ2V0X2h3X21vZGVzICAgPSBOVUxMLAogICAgLnNldF9jaGFubmVsICAgID0gTlVMTCwKICAgIC5zZXRfc3NpZCAgICAgICA9IHdwYV9kcml2ZXJfdGlzdGFfc2V0X3NzaWQsCiAgICAuc2V0X2Jzc2lkICAgICAgPSBOVUxMLAogICAgLnNlbmRfbWxtZSAgICAgID0gTlVMTCwKICAgIC5tbG1lX2FkZF9zdGEgICA9IE5VTEwsCiAgICAubWxtZV9yZW1vdmVfc3RhICAgID0gTlVMTCwKICAgIC5tbG1lX3NldHByb3RlY3Rpb24gPSBOVUxMLAojZW5kaWYgLyogQ09ORklHX0NMSUVOVF9NTE1FICovCiAgICAuZHJpdmVyX2NtZCAgICAgPSB3cGFfZHJpdmVyX3Rpc3RhX2RyaXZlcl9jbWQKfTsK